Environment Topology — Staging-Only (2026-07-03)
Decision record from the post-Plan-D "production cutover" brainstorm. The cutover
ask dissolved on inspection: chatbot-neo.val.id has no DNS record, the legacy
ahu-chatbot-dev container is dead, and the staging vhost was already repointed
to the monorepo stack during Plan B. What remained was to fix the topology
decision in writing and clear the debris.
Decisions
- One deployed environment: staging. The Server 2 stack
(efran@192.168.83.20, deploy dir/home/efran/ahu-ai-staging/chatbot, compose
projectsahu-shared/ahu-public/ahu-internal/ahu-workers) is
staging, fronted by the edge box at 103.30.246.154:
| Surface | Domain | Backend |
|---|---|---|
| Public (Tanya) | x056.ahu-demo.chatbot-neo.val.id |
Server 2 :3500 |
| Staff (console) | x056.ahu-demo.chatbot-neo-staff.val.id |
Server 2 :3510 |
-
No deployed dev environment, no dev domains. Earlier drafts considered
dev.-prefixed domains backed by a local stack; rejected to keep the edge
box lean. If work is worth deploying, it ships to staging directly. -
No standing dev servers on the edge box. The development loop is:
edit →pnpm typecheck+ suites →./infra/deploy/build-and-ship.sh+
./infra/deploy/deploy-staging.sh→ verify against the staging URLs.
The local dev-server recipe (Plan D completion notes, port 3501) is
break-glass debugging only, not part of the workflow. -
Production is deferred until the project officially starts. The future
mapping is 1:1 —chatbot-neo.val.idandchatbot-neo-staff.val.idvia
Hermes-driven DNS (not user-flippable) — and gets its own spec then,
including where the prod stack lives.
Housekeeping scope
- Remove the dead legacy container
ahu-chatbot-devand its
ahu-chat-interfaceimage from the edge box. - Rewrite the stale CLAUDE.md Deployment and Backend topology
sections (they still describecompose.dev.yaml, port:8120, an external
orchestrator, and pre-split paths). - Delete pre-split debris from the repo: root
compose.yaml(superseded by
infra/compose.*.yaml;infra/legacy-compose.dev.yamlpreserves the old
dev compose), the 12 orphaned rootscripts/test-*.ts(they import the
deleted rootsrc/; suites migrated topackages/streamsand the app
test dirs), and internal-web's brokensmokepackage script. The
still-functional HTTP tools inscripts/(smoke.ts,test-anon-*.sh,
*-data-dash.py) stay. Touch up the README passage that links
compose.yaml.
Success criteria
docker ps -aon the edge box shows noahu-chatbot-dev; the
ahu-chat-interfaceimage is gone.- CLAUDE.md describes only the real deploy loop and post-split topology.
- The deleted files are gone from
main; remaining suites still pass
(pnpm --dir apps/internal-web test,pnpm --dir apps/public-web test,
pnpm --dir packages/streams test). - This spec is committed as the standing answer to "what's our prod story?".
Out of scope
- Production launch (own spec when the project starts).
- SSO Kemenkumham (login-route swap, per Plan D design).
- Public DB replica flip (blocked: no replica exists).