2022-07-07 05:19:05 +08:00
< script >
import { slide } from "svelte/transition";
import ApiClient from "@/utils/ApiClient";
import CommonHelper from "@/utils/CommonHelper";
2022-07-19 00:44:10 +08:00
import { pageTitle } from "@/stores/app";
2022-07-07 05:19:05 +08:00
import { setErrors } from "@/stores/errors";
import { addSuccessToast } from "@/stores/toasts";
2022-08-09 21:16:09 +08:00
import tooltip from "@/actions/tooltip";
import PageWrapper from "@/components/base/PageWrapper.svelte";
2022-07-07 05:19:05 +08:00
import Field from "@/components/base/Field.svelte";
import RedactedPasswordInput from "@/components/base/RedactedPasswordInput.svelte";
import SettingsSidebar from "@/components/settings/SettingsSidebar.svelte";
2022-07-19 00:44:10 +08:00
$pageTitle = "Files storage";
2022-07-07 05:19:05 +08:00
let s3 = {} ;
let isLoading = false;
let isSaving = false;
let initialHash = "";
2022-07-12 03:23:22 +08:00
let initialEnabled = false;
2022-07-07 05:19:05 +08:00
$: hasChanges = initialHash != JSON.stringify(s3);
loadSettings();
async function loadSettings() {
isLoading = true;
try {
2022-08-02 22:00:14 +08:00
const settings = (await ApiClient.settings.getAll()) || {} ;
2022-07-07 05:19:05 +08:00
init(settings);
} catch (err) {
ApiClient.errorResponseHandler(err);
}
isLoading = false;
}
async function save() {
if (isSaving || !hasChanges) {
return;
}
isSaving = true;
try {
2022-08-02 22:00:14 +08:00
const settings = await ApiClient.settings.update(CommonHelper.filterRedactedProps({ s3 } ));
2022-07-07 05:19:05 +08:00
init(settings);
setErrors({} );
addSuccessToast("Successfully saved Files storage settings.");
} catch (err) {
ApiClient.errorResponseHandler(err);
}
isSaving = false;
}
function init(settings = {} ) {
s3 = settings?.s3 || {} ;
2022-07-12 03:23:22 +08:00
initialEnabled = s3.enabled;
2022-07-07 05:19:05 +08:00
initialHash = JSON.stringify(s3);
}
< / script >
< SettingsSidebar / >
2022-08-09 21:16:09 +08:00
< PageWrapper >
2022-07-07 05:19:05 +08:00
< header class = "page-header" >
< nav class = "breadcrumbs" >
< div class = "breadcrumb-item" > Settings< / div >
2022-07-19 00:44:10 +08:00
< div class = "breadcrumb-item" > { $pageTitle } </ div >
2022-07-07 05:19:05 +08:00
< / nav >
< / header >
< div class = "wrapper" >
2022-07-12 03:23:22 +08:00
< form class = "panel" autocomplete = "off" on:submit | preventDefault = {() => save ()} >
2022-07-07 05:19:05 +08:00
< div class = "content txt-xl m-b-base" >
< p > By default PocketBase uses the local file system to store uploaded files.< / p >
< p >
If you have limited disk space, you could optionally connect to a S3 compatible storage.
< / p >
< / div >
{ #if isLoading }
< div class = "loader" / >
{ : else }
< Field class = "form-field form-field-toggle" let:uniqueId >
< input type = "checkbox" id = { uniqueId } required bind:checked = { s3 . enabled } / >
< label for = { uniqueId } > Use S3 storage </ label >
< / Field >
2022-07-12 03:23:22 +08:00
{ #if initialEnabled != s3 . enabled }
2022-07-16 15:38:47 +08:00
< div transition:slide | local = {{ duration : 150 }} >
2022-07-12 03:23:22 +08:00
< div class = "alert alert-warning m-0" >
< div class = "icon" >
< i class = "ri-error-warning-line" / >
< / div >
< div class = "content" >
If you have existing uploaded files, you'll have to migrate them manually from
the
< strong > { initialEnabled ? "S3 storage" : "local file system" } </ strong >
to the
< strong > { s3 . enabled ? "S3 storage" : "local file system" } </ strong > .
< br / >
There are numerous command line tools that can help you, such as:
< a
href="https://github.com/rclone/rclone"
target="_blank"
rel="noopener"
class="txt-bold"
>
rclone
< / a > ,
< a
href="https://github.com/peak/s5cmd"
target="_blank"
rel="noopener"
class="txt-bold"
>
s5cmd
< / a > , etc.
< / div >
< / div >
< div class = "clearfix m-t-base" / >
< / div >
{ /if }
2022-07-07 05:19:05 +08:00
{ #if s3 . enabled }
< div class = "grid" transition:slide | local = {{ duration : 150 }} >
< div class = "col-lg-12" >
< Field class = "form-field required" name = "s3.endpoint" let:uniqueId >
< label for = { uniqueId } > Endpoint</label >
< input type = "text" id = { uniqueId } required bind:value = { s3 . endpoint } / >
< / Field >
< / div >
< div class = "col-lg-6" >
< Field class = "form-field required" name = "s3.bucket" let:uniqueId >
< label for = { uniqueId } > Bucket</label >
< input type = "text" id = { uniqueId } required bind:value = { s3 . bucket } / >
< / Field >
< / div >
< div class = "col-lg-6" >
< Field class = "form-field required" name = "s3.region" let:uniqueId >
< label for = { uniqueId } > Region</label >
< input type = "text" id = { uniqueId } required bind:value = { s3 . region } / >
< / Field >
< / div >
< div class = "col-lg-6" >
< Field class = "form-field required" name = "s3.accessKey" let:uniqueId >
< label for = { uniqueId } > Access key </ label >
< input type = "text" id = { uniqueId } required bind:value = { s3 . accessKey } / >
< / Field >
< / div >
< div class = "col-lg-6" >
< Field class = "form-field required" name = "s3.secret" let:uniqueId >
< label for = { uniqueId } > Secret</label >
< RedactedPasswordInput id = { uniqueId } required bind:value = { s3 . secret } / >
< / Field >
< / div >
2022-07-19 15:45:38 +08:00
< div class = "col-lg-12" >
< Field class = "form-field" name = "s3.forcePathStyle" let:uniqueId >
< input type = "checkbox" id = { uniqueId } bind:checked= { s3 . forcePathStyle } />
< label for = { uniqueId } >
< span class = "txt" > Force path-style addressing< / span >
< i
class="ri-information-line link-hint"
use:tooltip={{
text: 'Forces the request to use path-style addressing, eg. "https://s3.amazonaws.com/BUCKET/KEY" instead of the default "https://BUCKET.s3.amazonaws.com/KEY".',
position: "top",
}}
/>
< / label >
< / Field >
< / div >
2022-07-07 05:19:05 +08:00
<!-- margin helper -->
< div class = "col-lg-12" / >
< / div >
{ /if }
< div class = "flex" >
< div class = "flex-fill" / >
< button
type="submit"
class="btn btn-expanded"
class:btn-loading={ isSaving }
disabled={ ! hasChanges || isSaving }
on:click={() => save ()}
>
< span class = "txt" > Save changes< / span >
< / button >
< / div >
{ /if }
< / form >
< / div >
2022-08-09 21:16:09 +08:00
< / PageWrapper >