docker/dev-gateway/README.md
This directory contains the Caddy reverse proxy configuration for the Ghost development environment.
The Caddy reverse proxy container:
Caddy uses environment variables (set in compose.dev.yaml) to configure proxy targets:
GHOST_BACKEND - Ghost container hostname (e.g., ghost-dev:2368)ADMIN_DEV_SERVER - React admin dev server (e.g., host.docker.internal:5174)ADMIN_LIVE_RELOAD_SERVER - Ember live reload WebSocket (e.g., host.docker.internal:4200)PORTAL_DEV_SERVER - Portal dev server (e.g., host.docker.internal:4175)COMMENTS_DEV_SERVER - Comments UI (e.g., host.docker.internal:7173)SIGNUP_DEV_SERVER - Signup form (e.g., host.docker.internal:6174)SEARCH_DEV_SERVER - Sodo search (e.g., host.docker.internal:4178)ANNOUNCEMENT_DEV_SERVER - Announcement bar (e.g., host.docker.internal:4177)LEXICAL_DEV_SERVER - Optional: Local Koenig Lexical editor dev server (e.g., host.docker.internal:4173)
EDITOR_URL=/ghost/assets/koenig-lexical/ when starting admin dev serverACTIVITYPUB_PROXY_TARGET - Optional: ActivityPub service (e.g., host.docker.internal:8080)
Note: AdminX React apps (admin-x-settings, activitypub, posts, stats) are served through the admin dev server so they don't need separate proxy entries.
Ghost is configured via environment variables in compose.dev.yaml to load public app assets from /ghost/assets/* (e.g., portal__url: /ghost/assets/portal/portal.min.js). This uses the same path structure as built admin assets.
The Caddyfile defines these routing rules:
| Path Pattern | Target | Purpose |
|---|---|---|
/ember-cli-live-reload.js | Admin live reload (port 4200) | Ember hot-reload script and WebSocket |
/ghost/api/* | Ghost backend | Ghost API (bypasses admin dev server) |
/.ghost/activitypub/* | ActivityPub server (port 8080) | Optional: ActivityPub API (requires AP project running) |
/.well-known/webfinger | ActivityPub server (port 8080) | Optional: WebFinger for federation |
/.well-known/nodeinfo | ActivityPub server (port 8080) | Optional: NodeInfo for federation |
/ghost/assets/koenig-lexical/* | Lexical dev server (port 4173) | Optional: Koenig Lexical editor (falls back to Ghost if not running) |
/ghost/assets/portal/* | Portal dev server (port 4175) | Membership UI |
/ghost/assets/comments-ui/* | Comments dev server (port 7173) | Comments widget |
/ghost/assets/signup-form/* | Signup dev server (port 6174) | Signup form widget |
/ghost/assets/sodo-search/* | Search dev server (port 4178) | Search widget (JS + CSS) |
/ghost/assets/announcement-bar/* | Announcement dev server (port 4177) | Announcement widget |
/ghost/assets/* | Admin dev server (port 5174) | Other admin assets — rewritten to /__admin-dev__/assets/* |
/__admin-dev__/* | Admin dev server (port 5174) | Vite internals (HMR, modules, refresh runtime, dev-only assets) |
/ghost, /ghost/ | Admin dev server (port 5174) | Admin HTML entry — rewritten to /__admin-dev__/ |
/ghost/* (deep links) | Ghost backend | Express middleware redirects deep links to /ghost/#/<path> |
| Everything else | Ghost backend | Main Ghost application |
Note: All port numbers listed are the host ports where dev servers run by default.