diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index eea99a1fb0..bd983a0d9d 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -523,6 +523,8 @@ services: restart: unless-stopped networks: - appwrite + volumes: + - appwrite-uploads:/storage/uploads:rw depends_on: - redis environment: @@ -542,6 +544,27 @@ services: - _APP_LOGGING_CONFIG - _APP_SMS_FROM - _APP_SMS_PROVIDER + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET appwrite-worker-migrations: image: /: diff --git a/app/worker.php b/app/worker.php index 6f912a84fd..f313bab614 100644 --- a/app/worker.php +++ b/app/worker.php @@ -32,7 +32,6 @@ use Utopia\Queue\Connection; use Utopia\Queue\Message; use Utopia\Queue\Server; use Utopia\Registry\Registry; -use Utopia\Storage\Device\Local; use Utopia\System\System; Authorization::disable(); @@ -217,9 +216,6 @@ Server::setResource('deviceForCache', function (Document $project) { return getDevice(APP_STORAGE_CACHE . '/app-' . $project->getId()); }, ['project']); -Server::setResource('deviceForLocalFiles', function (Document $project) { - return new Local(APP_STORAGE_UPLOADS . '/app-' . $project->getId()); -}, ['project']); $pools = $register->get('pools'); $platform = new Appwrite(); diff --git a/docker-compose.yml b/docker-compose.yml index 19a3b75602..3d3409716a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -569,6 +569,7 @@ services: networks: - appwrite volumes: + - appwrite-uploads:/storage/uploads:rw - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: @@ -591,6 +592,27 @@ services: - _APP_SMS_FROM - _APP_SMS_PROVIDER - _APP_SMS_PROJECTS_DENY_LIST + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET appwrite-worker-migrations: entrypoint: worker-migrations diff --git a/src/Appwrite/Platform/Workers/Messaging.php b/src/Appwrite/Platform/Workers/Messaging.php index c270018430..9e6a0892d1 100644 --- a/src/Appwrite/Platform/Workers/Messaging.php +++ b/src/Appwrite/Platform/Workers/Messaging.php @@ -35,6 +35,7 @@ use Utopia\Messaging\Messages\SMS; use Utopia\Platform\Action; use Utopia\Queue\Message; use Utopia\Storage\Device; +use Utopia\Storage\Device\Local; use Utopia\Storage\Storage; use Utopia\System\System; @@ -42,6 +43,8 @@ use function Swoole\Coroutine\batch; class Messaging extends Action { + private ?Local $localDevice = null; + public static function getName(): string { return 'messaging'; @@ -58,9 +61,8 @@ class Messaging extends Action ->inject('log') ->inject('dbForProject') ->inject('deviceForFiles') - ->inject('deviceForLocalFiles') ->inject('queueForUsage') - ->callback(fn (Message $message, Log $log, Database $dbForProject, Device $deviceForFiles, Device $deviceForLocalFiles, Usage $queueForUsage) => $this->action($message, $log, $dbForProject, $deviceForFiles, $deviceForLocalFiles, $queueForUsage)); + ->callback(fn (Message $message, Log $log, Database $dbForProject, Device $deviceForFiles, Usage $queueForUsage) => $this->action($message, $log, $dbForProject, $deviceForFiles, $queueForUsage)); } /** @@ -68,7 +70,6 @@ class Messaging extends Action * @param Log $log * @param Database $dbForProject * @param Device $deviceForFiles - * @param Device $deviceForLocalFiles * @param Usage $queueForUsage * @return void * @throws \Exception @@ -78,7 +79,6 @@ class Messaging extends Action Log $log, Database $dbForProject, Device $deviceForFiles, - Device $deviceForLocalFiles, Usage $queueForUsage ): void { Runtime::setHookFlags(SWOOLE_HOOK_ALL ^ SWOOLE_HOOK_TCP); @@ -101,7 +101,7 @@ class Messaging extends Action case MESSAGE_SEND_TYPE_EXTERNAL: $message = $dbForProject->getDocument('messages', $payload['messageId']); - $this->sendExternalMessage($dbForProject, $message, $deviceForFiles, $deviceForLocalFiles, ); + $this->sendExternalMessage($dbForProject, $message, $deviceForFiles, $project); break; default: throw new \Exception('Unknown message type: ' . $type); @@ -112,7 +112,7 @@ class Messaging extends Action Database $dbForProject, Document $message, Device $deviceForFiles, - Device $deviceForLocalFiles, + Document $project, ): void { $topicIds = $message->getAttribute('topics', []); $targetIds = $message->getAttribute('targets', []); @@ -218,8 +218,8 @@ class Messaging extends Action /** * @var array $results */ - $results = batch(\array_map(function ($providerId) use ($identifiers, &$providers, $default, $message, $dbForProject, $deviceForFiles, $deviceForLocalFiles) { - return function () use ($providerId, $identifiers, &$providers, $default, $message, $dbForProject, $deviceForFiles, $deviceForLocalFiles) { + $results = batch(\array_map(function ($providerId) use ($identifiers, &$providers, $default, $message, $dbForProject, $deviceForFiles, $project) { + return function () use ($providerId, $identifiers, &$providers, $default, $message, $dbForProject, $deviceForFiles, $project) { if (\array_key_exists($providerId, $providers)) { $provider = $providers[$providerId]; } else { @@ -246,8 +246,8 @@ class Messaging extends Action $adapter->getMaxMessagesPerRequest() ); - return batch(\array_map(function ($batch) use ($message, $provider, $adapter, $dbForProject, $deviceForFiles, $deviceForLocalFiles) { - return function () use ($batch, $message, $provider, $adapter, $dbForProject, $deviceForFiles, $deviceForLocalFiles) { + return batch(\array_map(function ($batch) use ($message, $provider, $adapter, $dbForProject, $deviceForFiles, $project) { + return function () use ($batch, $message, $provider, $adapter, $dbForProject, $deviceForFiles, $project) { $deliveredTotal = 0; $deliveryErrors = []; $messageData = clone $message; @@ -256,7 +256,7 @@ class Messaging extends Action $data = match ($provider->getAttribute('type')) { MESSAGE_TYPE_SMS => $this->buildSmsMessage($messageData, $provider), MESSAGE_TYPE_PUSH => $this->buildPushMessage($messageData), - MESSAGE_TYPE_EMAIL => $this->buildEmailMessage($dbForProject, $messageData, $provider, $deviceForFiles, $deviceForLocalFiles), + MESSAGE_TYPE_EMAIL => $this->buildEmailMessage($dbForProject, $messageData, $provider, $deviceForFiles, $project), default => throw new \Exception('Provider with the requested ID is of the incorrect type') }; @@ -354,8 +354,8 @@ class Messaging extends Action $path = $file->getAttribute('path', ''); - if ($deviceForLocalFiles->exists($path)) { - $deviceForLocalFiles->delete($path); + if ($this->getLocalDevice($project)->exists($path)) { + $this->getLocalDevice($project)->delete($path); } } } @@ -517,7 +517,7 @@ class Messaging extends Action Document $message, Document $provider, Device $deviceForFiles, - Device $deviceForLocalFiles, + Document $project, ): Email { $fromName = $provider['options']['fromName'] ?? null; $fromEmail = $provider['options']['fromEmail'] ?? null; @@ -579,7 +579,7 @@ class Messaging extends Action } if ($deviceForFiles->getType() !== Storage::DEVICE_LOCAL) { - $deviceForFiles->transfer($path, $path, $deviceForLocalFiles); + $deviceForFiles->transfer($path, $path, $this->getLocalDevice($project)); } $attachment = new Attachment( @@ -651,4 +651,13 @@ class Messaging extends Action $badge ); } + + private function getLocalDevice($project): Local + { + if($this->localDevice === null) { + $this->localDevice = new Local(APP_STORAGE_UPLOADS . '/app-' . $project->getId()); + } + + return $this->localDevice; + } }