diff --git a/bin/quickstart.sh b/bin/quickstart.sh --- a/bin/quickstart.sh +++ b/bin/quickstart.sh @@ -24,6 +24,7 @@ docker volume rm kolab_mariadb || : docker volume rm kolab_imap || : docker volume rm kolab_ldap || : +docker volume rm kolab_minio || : # We can't use the following artisan commands because it will just block if redis is unavailable: # src/artisan octane:stop >/dev/null 2>&1 || : @@ -34,7 +35,7 @@ bin/regen-certs docker-compose build coturn ldap kolab mariadb meet pdns proxy redis haproxy roundcube -docker-compose up -d coturn ldap kolab mariadb meet pdns redis roundcube +docker-compose up -d coturn ldap kolab mariadb meet pdns redis roundcube minio # Workaround until we have docker-compose --wait (https://github.com/docker/compose/pull/8777) function wait_for_container { diff --git a/config.demo/src/.env b/config.demo/src/.env --- a/config.demo/src/.env +++ b/config.demo/src/.env @@ -194,3 +194,7 @@ PASSPORT_PROXY_OAUTH_CLIENT_ID=942edef5-3dbd-4a14-8e3e-d5d59b727bee PASSPORT_PROXY_OAUTH_CLIENT_SECRET=L6L0n56ecvjjK0cJMjeeV1pPAeffUBO0YSSH63wf +MINIO_USER=minio +MINIO_PASSWORD=W3lcom32@ph3lia +MINIO_BUCKET=kolab +FILESYSTEM_DISK=minio diff --git a/config.prod/src/.env b/config.prod/src/.env --- a/config.prod/src/.env +++ b/config.prod/src/.env @@ -151,3 +151,8 @@ OPENEXCHANGERATES_API_KEY={{ openexchangerates_api_key }} FIREBASE_API_KEY={{ firebase_api_key }} + +MINIO_USER=minio +MINIO_PASSWORD=W3lcom32@ph3lia +MINIO_BUCKET=kolab +FILESYSTEM_DISK=minio diff --git a/docker-compose.yml b/docker-compose.yml --- a/docker-compose.yml +++ b/docker-compose.yml @@ -337,6 +337,29 @@ - ./meet/server:/src/meet/:ro - ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.cert:/etc/pki/tls/certs/meet.${APP_WEBSITE_DOMAIN}.cert - ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.key:/etc/pki/tls/private/meet.${APP_WEBSITE_DOMAIN}.key + minio: + container_name: kolab-minio + restart: on-failure + healthcheck: + interval: 10s + test: "curl -f http://127.0.0.1:9000/minio/health/live || exit 1" + timeout: 5s + retries: 30 + start_period: 5m + environment: + - MINIO_ROOT_USER=${MINIO_USER} + - MINIO_ROOT_PASSWORD=${MINIO_PASSWORD} + image: minio/minio + networks: + kolab: + ipv4_address: 172.18.0.14 + ports: + - "9000:9000" + - "9001:9001" + entrypoint: sh + command: -c 'mkdir -p /data/${MINIO_BUCKET} && minio server /data --console-address ":9001"' + volumes: + - minio:/data networks: kolab: driver: bridge @@ -347,3 +370,4 @@ mariadb: imap: ldap: + minio: diff --git a/src/app/Backends/Storage.php b/src/app/Backends/Storage.php --- a/src/app/Backends/Storage.php +++ b/src/app/Backends/Storage.php @@ -25,7 +25,7 @@ */ public static function fileDelete(Item $file): void { - $disk = LaravelStorage::disk('files'); + $disk = LaravelStorage::disk(\config('filesystems.default')); $path = $file->path . '/' . $file->id; @@ -45,7 +45,7 @@ */ public static function fileChunkDelete(Chunk $chunk): void { - $disk = LaravelStorage::disk('files'); + $disk = LaravelStorage::disk(\config('filesystems.default')); $path = self::chunkLocation($chunk->chunk_id, $chunk->item); @@ -79,7 +79,7 @@ $response->setCallback(function () use ($file) { $file->chunks()->orderBy('sequence')->get()->each(function ($chunk) use ($file) { - $disk = LaravelStorage::disk('files'); + $disk = LaravelStorage::disk(\config('filesystems.default')); $path = Storage::chunkLocation($chunk->chunk_id, $file); $stream = $disk->readStream($path); @@ -108,7 +108,7 @@ return self::fileInputResumable($stream, $params, $file); } - $disk = LaravelStorage::disk('files'); + $disk = LaravelStorage::disk(\config('filesystems.default')); $chunkId = \App\Utils::uuidStr(); @@ -197,8 +197,8 @@ throw new \Exception("Invalid 'from' parameter for resumable file upload."); } - $disk = LaravelStorage::disk('files'); + $disk = LaravelStorage::disk(\config('filesystems.default')); $chunkId = \App\Utils::uuidStr(); $path = self::chunkLocation($chunkId, $file); @@ -266,7 +266,7 @@ */ protected static function mimetype(string $path): string { - $disk = LaravelStorage::disk('files'); + $disk = LaravelStorage::disk(\config('filesystems.default')); $mimetype = $disk->mimeType($path); diff --git a/src/composer.json b/src/composer.json --- a/src/composer.json +++ b/src/composer.json @@ -26,6 +26,7 @@ "laravel/octane": "^1.2", "laravel/passport": "^11.3", "laravel/tinker": "^2.7", + "league/flysystem-aws-s3-v3": "^3.0", "mlocati/spf-lib": "^3.1", "mollie/laravel-mollie": "^2.19", "pear/crypt_gpg": "^1.6.6", diff --git a/src/config/filesystems.php b/src/config/filesystems.php --- a/src/config/filesystems.php +++ b/src/config/filesystems.php @@ -52,6 +52,16 @@ 'visibility' => 'public', ], + 'minio' => [ + 'driver' => 's3', + 'key' => env('MINIO_USER'), + 'secret' => env('MINIO_PASSWORD'), + 'region' => 'local', + 'bucket' => env('MINIO_BUCKET'), + 'endpoint' => 'http://minio:9000', + 'use_path_style_endpoint' => true, + ], + 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'),