diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml
index 8d0ae55394..ef4d4a1fe4 100644
--- a/app/views/install/compose.phtml
+++ b/app/views/install/compose.phtml
@@ -993,7 +993,7 @@ $hostPath = rtrim($this->getParam('hostPath', ''), '/');
<<: *x-logging
restart: unless-stopped
stop_signal: SIGINT
- image: openruntimes/executor:0.7.22
+ image: openruntimes/executor:0.11.4
networks:
- appwrite
- runtimes
diff --git a/tests/unit/Platform/Modules/Installer/ComposeTemplateTest.php b/tests/unit/Platform/Modules/Installer/ComposeTemplateTest.php
new file mode 100644
index 0000000000..d2588835ff
--- /dev/null
+++ b/tests/unit/Platform/Modules/Installer/ComposeTemplateTest.php
@@ -0,0 +1,67 @@
+readRepoFile('/docker-compose.yml');
+ $renderedCompose = $this->renderInstallerCompose();
+
+ $this->assertStringContainsString("appwrite-worker-executions:\n", $canonicalCompose);
+ $this->assertStringContainsString("appwrite-worker-executions:\n", $renderedCompose);
+ $this->assertStringContainsString("entrypoint: worker-executions\n", $renderedCompose);
+ }
+
+ public function testRenderedInstallerComposeUsesCanonicalExecutorImage(): void
+ {
+ $canonicalExecutorImage = $this->extractExecutorImage($this->readRepoFile('/docker-compose.yml'));
+ $renderedCompose = $this->renderInstallerCompose();
+
+ $this->assertStringContainsString("image: {$canonicalExecutorImage}\n", $renderedCompose);
+ }
+
+ private function renderInstallerCompose(): string
+ {
+ $view = new View($this->repoPath('/app/views/install/compose.phtml'));
+
+ $view
+ ->setParam('httpPort', '80')
+ ->setParam('httpsPort', '443')
+ ->setParam('version', '1.9.0')
+ ->setParam('organization', 'appwrite')
+ ->setParam('image', 'appwrite')
+ ->setParam('database', 'mariadb')
+ ->setParam('hostPath', '')
+ ->setParam('enableAssistant', false);
+
+ return $view->render(false);
+ }
+
+ private function extractExecutorImage(string $compose): string
+ {
+ $matched = preg_match('/^\s*image:\s*(openruntimes\/executor:[^\s]+)\s*$/m', $compose, $matches);
+
+ $this->assertSame(1, $matched, 'Failed to find the canonical openruntimes executor image.');
+
+ return $matches[1];
+ }
+
+ private function readRepoFile(string $path): string
+ {
+ $contents = file_get_contents($this->repoPath($path));
+
+ $this->assertIsString($contents, "Failed to read {$path}.");
+
+ return $contents;
+ }
+
+ private function repoPath(string $path): string
+ {
+ return dirname(__DIR__, 5) . $path;
+ }
+}