From e12ce2136b60dda7e31852d625a7dbfede719853 Mon Sep 17 00:00:00 2001 From: Andy Boutte Date: Mon, 28 Sep 2026 12:50:17 -0500 Subject: [PATCH] fix(ui): listen on 8080 to match the UI image's own port MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The UI image serves on 8080 and its baked-in healthcheck probes http://127.0.0.1:8080/. devkit mounts its own default.conf over the image's server block, and that conf listened on 80 — so nginx bound 80, the SPA served correctly, and the healthcheck got connection refused. The container has sat permanently (unhealthy) for every UI tag published since the image moved to 8080, including the UI_TAG in .env.example. Nothing gates on duplo-ui's health, so serving was never affected. The cost is a status that misreports, and a conf mount that masks the port the image actually uses — so exercising a UI tag in devkit says nothing about how that image behaves where the port matters. - nginx/default.conf: listen 8080 - docker-compose.yml: map ${UI_PORT:-4200} to 8080 localhost:${UI_PORT} is unchanged from the user's side. Co-Authored-By: Claude Opus 5 (1M context) --- docker-compose.yml | 2 +- nginx/default.conf | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b3e32fd..1959051 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -141,7 +141,7 @@ services: image: quay.io/duplocloud/duplo-ai-helpdesk-ui:${UI_TAG} restart: unless-stopped ports: - - "${UI_PORT:-4200}:80" + - "${UI_PORT:-4200}:8080" volumes: # Published image serves the SPA only; this conf proxies API prefixes to the studio (same-origin, no CORS). - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro diff --git a/nginx/default.conf b/nginx/default.conf index 9202532..e2ce12a 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -1,9 +1,11 @@ # Dev-kit nginx config for the UI image. The published image serves the SPA only (no API proxy), # and the app calls the API same-origin (apiUrl "/"). Here we proxy the API path prefixes to the # studio container so the browser stays same-origin — no CORS needed. Mounted over -# /etc/nginx/conf.d/default.conf by docker-compose. +# /etc/nginx/conf.d/default.conf by docker-compose. Listen on 8080, the port the image itself serves on: +# its baked-in healthcheck probes 127.0.0.1:8080, so a conf that listens elsewhere serves fine but reports +# the container permanently (unhealthy). server { - listen 80; + listen 8080; server_name _; root /usr/share/nginx/html; index index.html;