From dc8a85538f2f35c3548791d98cfdfafc37f564ba Mon Sep 17 00:00:00 2001 From: Timo Date: Tue, 16 Apr 2024 17:24:56 +0200 Subject: [PATCH] Support S3 compatible storage services (#56) * add s3compat filesystem driver * add s3compat ui modal * fix code style --- .../V1/Admin/Settings/DiskController.php | 14 + config/filesystems.php | 10 + lang/de.json | 6 + lang/en.json | 6 + .../modal-components/FileDiskModal.vue | 42 ++- .../modal-components/disks/S3CompatDisk.vue | 325 ++++++++++++++++++ resources/scripts/admin/stores/disk.js | 11 + .../admin/views/settings/FileDiskSetting.vue | 6 +- 8 files changed, 398 insertions(+), 22 deletions(-) create mode 100644 resources/scripts/admin/components/modal-components/disks/S3CompatDisk.vue diff --git a/app/Http/Controllers/V1/Admin/Settings/DiskController.php b/app/Http/Controllers/V1/Admin/Settings/DiskController.php index 92dae885..15bb2e75 100644 --- a/app/Http/Controllers/V1/Admin/Settings/DiskController.php +++ b/app/Http/Controllers/V1/Admin/Settings/DiskController.php @@ -94,6 +94,16 @@ class DiskController extends Controller break; + case 's3compat': + $diskData = [ + 'endpoint' => '', + 'key' => '', + 'secret' => '', + 'region' => '', + 'bucket' => '', + 'root' => '', + ]; + case 'doSpaces': $diskData = [ 'key' => '', @@ -160,6 +170,10 @@ class DiskController extends Controller 'name' => 'Amazon S3', 'value' => 's3', ], + [ + 'name' => 'S3 Compatible Storage', + 'value' => 's3compat', + ], [ 'name' => 'Digital Ocean Spaces', 'value' => 'doSpaces', diff --git a/config/filesystems.php b/config/filesystems.php index f265b6fb..ededf290 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -64,6 +64,16 @@ return [ 'root' => env('AWS_ROOT'), ], + 's3compat' => [ + 'driver' => 's3', + 'endpoint' => env('S3_COMPAT_ENDPOINT'), + 'use_path_style_endpoint' => true, + 'key' => env('S3_COMPAT_KEY'), + 'secret' => env('S3_COMPAT_SECRET'), + 'region' => env('S3_COMPAT_REGION'), + 'bucket' => env('S3_COMPAT_BUCKET'), + ], + 'media' => [ 'driver' => 'local', 'root' => public_path('media'), diff --git a/lang/de.json b/lang/de.json index f3d221fd..d5105593 100644 --- a/lang/de.json +++ b/lang/de.json @@ -1267,6 +1267,12 @@ "aws_region": "AWS-Region", "aws_bucket": "AWS Bucket", "aws_root": "AWS-Pfad", + "s3_endpoint": "S3 Endpunkt", + "s3_key": "S3 Schlüssel", + "s3_secret": "S3 Geheimnis", + "s3_region": "S3 Region", + "s3_bucket": "S3 Bucket", + "s3_root": "S3 Pfad", "do_spaces_type": "Do Spaces-Typ", "do_spaces_key": "Do Spaces Key", "do_spaces_secret": "Do Spaces Secret", diff --git a/lang/en.json b/lang/en.json index bf465b0f..a1c372b9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1267,6 +1267,12 @@ "aws_region": "AWS Region", "aws_bucket": "AWS Bucket", "aws_root": "AWS Root", + "s3_endpoint": "S3 Endpoint", + "s3_key": "S3 Key", + "s3_secret": "S3 Secret", + "s3_region": "S3 Region", + "s3_bucket": "S3 Bucket", + "s3_root": "S3 Root", "do_spaces_type": "Do Spaces type", "do_spaces_key": "Do Spaces key", "do_spaces_secret": "Do Spaces Secret", diff --git a/resources/scripts/admin/components/modal-components/FileDiskModal.vue b/resources/scripts/admin/components/modal-components/FileDiskModal.vue index 82274250..32ba9247 100644 --- a/resources/scripts/admin/components/modal-components/FileDiskModal.vue +++ b/resources/scripts/admin/components/modal-components/FileDiskModal.vue @@ -21,13 +21,7 @@ > + + diff --git a/resources/scripts/admin/stores/disk.js b/resources/scripts/admin/stores/disk.js index 769197df..a0f26d28 100644 --- a/resources/scripts/admin/stores/disk.js +++ b/resources/scripts/admin/stores/disk.js @@ -51,6 +51,17 @@ export const useDiskStore = (useWindow = false) => { bucket: '', root: '', }, + + s3CompatDiskConfigData: { + name: '', + selected_driver: 's3compat', + key: '', + secret: '', + region: '', + bucket: '', + root: '', + endpoint: '', + }, }), getters: { diff --git a/resources/scripts/admin/views/settings/FileDiskSetting.vue b/resources/scripts/admin/views/settings/FileDiskSetting.vue index 3fb1bdec..304878ad 100644 --- a/resources/scripts/admin/views/settings/FileDiskSetting.vue +++ b/resources/scripts/admin/views/settings/FileDiskSetting.vue @@ -93,7 +93,7 @@ import FileDiskModal from '@/scripts/admin/components/modal-components/FileDiskM const utils = inject('utils') -const modelStore = useModalStore() +const modalStore = useModalStore() const diskStore = useDiskStore() const companyStore = useCompanyStore() const dialogStore = useDialogStore() @@ -189,7 +189,7 @@ function isNotSystemDisk(disk) { } function openCreateDiskModal() { - modelStore.openModal({ + modalStore.openModal({ title: t('settings.disk.new_disk'), componentName: 'FileDiskModal', variant: 'lg', @@ -198,7 +198,7 @@ function openCreateDiskModal() { } function openEditDiskModal(data) { - modelStore.openModal({ + modalStore.openModal({ title: t('settings.disk.edit_file_disk'), componentName: 'FileDiskModal', variant: 'lg',