diff --git a/deployment/config/nginx-smoke/default.conf b/deployment/config/nginx-smoke/default.conf
index 05b8d662e..2fa28305a 100644
--- a/deployment/config/nginx-smoke/default.conf
+++ b/deployment/config/nginx-smoke/default.conf
@@ -1,22 +1,34 @@
##
-## nginx-smoke — Stub gateway for deployment smoke tests in CI.
-## Serves placeholder 200 responses for all web app paths so smoke tests
-## can verify routing plumbing without requiring custom-built app images.
-## Real admin tool containers (phpMyAdmin, Mongo Express, RedisInsight)
-## run alongside this stub on their own ports.
+## nginx-smoke — Gateway for deployment smoke tests in CI.
+##
+## Real apps (workflowui, pastebin) are proxied to playwright's webServer
+## processes running on the host (reached via host.docker.internal).
+## Remaining apps (codegen, emailclient, etc.) return stub 200 responses
+## since they are not started as dev servers in CI.
##
server {
listen 80;
server_name localhost;
- # Portal — must contain "MetaBuilder" for the portal smoke test
- location = / {
- add_header Content-Type text/html;
- return 200 '
MetaBuilder Portal
';
+ # ── Real apps — proxied to playwright webServer processes on host ─────
+
+ location /workflowui {
+ proxy_pass http://host.docker.internal:3000;
+ proxy_set_header Host localhost;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_read_timeout 120s;
}
- # DBAL API stubs
+ location /pastebin {
+ proxy_pass http://host.docker.internal:3001;
+ proxy_set_header Host localhost;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_read_timeout 120s;
+ }
+
+ # ── DBAL API stubs ────────────────────────────────────────────────────
+
location = /api/health {
add_header Content-Type application/json;
return 200 '{"status":"ok"}';
@@ -27,12 +39,21 @@ server {
return 200 '{"version":"smoke-stub"}';
}
- # Postgres dashboard — redirect (smoke test checks < 500, redirects are fine)
+ # ── Portal — must contain "MetaBuilder" ───────────────────────────────
+
+ location = / {
+ add_header Content-Type text/html;
+ return 200 'MetaBuilder Portal
';
+ }
+
+ # ── Postgres redirect ─────────────────────────────────────────────────
+
location = /postgres {
return 307 /postgres/dashboard;
}
- # All other paths — return minimal HTML with non-empty body
+ # ── Remaining apps — stub (codegen, emailclient, diagrams, etc.) ──────
+
location / {
add_header Content-Type text/html;
return 200 'MetaBuilder App';
diff --git a/deployment/docker-compose.smoke.yml b/deployment/docker-compose.smoke.yml
index 32d8095b4..f088e8c79 100644
--- a/deployment/docker-compose.smoke.yml
+++ b/deployment/docker-compose.smoke.yml
@@ -22,6 +22,11 @@ services:
- "80:80"
volumes:
- ./config/nginx-smoke/default.conf:/etc/nginx/conf.d/default.conf:ro
+ # host.docker.internal lets nginx proxy to playwright's webServer processes
+ # running on the host (workflowui :3000, pastebin :3001).
+ # On Linux (GitHub Actions) this requires the host-gateway extra_host.
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1/"]
interval: 5s
diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts
index 195e02569..1c9367331 100644
--- a/e2e/playwright.config.ts
+++ b/e2e/playwright.config.ts
@@ -26,19 +26,35 @@ export default defineConfig({
screenshot: 'only-on-failure',
},
- /* Start workflowui dev server automatically when not running against Docker stack */
- webServer: process.env.PLAYWRIGHT_BASE_URL ? undefined : {
- command: 'npm run dev -w workflowui',
- url: 'http://localhost:3000/workflowui/',
- reuseExistingServer: !process.env.CI,
- timeout: 120_000,
- env: {
- NODE_ENV: 'development',
- NEXT_PUBLIC_API_URL: 'http://localhost:8080',
- NEXTAUTH_SECRET: 'test-secret',
- NEXTAUTH_URL: 'http://localhost:3000',
+ /* Start dev servers automatically when not running against a live Docker stack */
+ webServer: process.env.PLAYWRIGHT_BASE_URL ? undefined : [
+ {
+ command: 'npm run dev -w workflowui',
+ url: 'http://localhost:3000/workflowui/',
+ reuseExistingServer: !process.env.CI,
+ timeout: 120_000,
+ env: {
+ NODE_ENV: 'development',
+ NEXT_PUBLIC_API_URL: 'http://localhost:8080',
+ NEXTAUTH_SECRET: 'test-secret',
+ NEXTAUTH_URL: 'http://localhost:3000',
+ },
},
- },
+ {
+ command: 'PORT=3001 npm run dev -w codesnippet',
+ url: 'http://localhost:3001/pastebin/',
+ reuseExistingServer: !process.env.CI,
+ timeout: 120_000,
+ env: {
+ NODE_ENV: 'development',
+ PORT: '3001',
+ NEXT_PUBLIC_DBAL_API_URL: 'http://localhost:8080',
+ NEXT_PUBLIC_FLASK_BACKEND_URL: 'http://localhost:5000',
+ NEXTAUTH_SECRET: 'test-secret',
+ NEXTAUTH_URL: 'http://localhost:3001',
+ },
+ },
+ ],
projects: [
{