Register abc_fe / abc_be / abc_worker for beta-only deploy.
Sync runner checkout / sync (push) Successful in 6s

Closes #26. GIS Benefits Coach gets beta host_apps (8017/8018/8085) and catalog entries; prod ports stay reserved.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-04 16:21:23 -05:00
co-authored by Cursor
parent 95fbae8db4
commit aac815314d
8 changed files with 70 additions and 3 deletions
+33 -1
View File
@@ -217,6 +217,9 @@ After Docker install, re-SSH so the `docker` group membership takes effect.
| `monica_site` | django (docker) | all webservers | beta + prod | active/active behind NPM; no bundled Postgres (like `scha`); dj-queue **worker singleton on adama** only (`compose --profile worker`); Ollama social drafting via `10.0.0.128:11434` | | `monica_site` | django (docker) | all webservers | beta + prod | active/active behind NPM; no bundled Postgres (like `scha`); dj-queue **worker singleton on adama** only (`compose --profile worker`); Ollama social drafting via `10.0.0.128:11434` |
| `url_shortening_service` | django (docker) | all webservers | beta + prod | active/active behind NPM; no bundled Postgres; **no worker**. Two public hosts, same container: short domain (`GET /`, `GET /<code>` 302) and API host (`/api/links/`, Bearer required). | | `url_shortening_service` | django (docker) | all webservers | beta + prod | active/active behind NPM; no bundled Postgres; **no worker**. Two public hosts, same container: short domain (`GET /`, `GET /<code>` 302) and API host (`/api/links/`, Bearer required). |
| `college_craft` | django (docker) | all webservers | beta + prod | active/active behind NPM; no bundled Postgres (like `scha` / `monica_site`); dj-queue **worker singleton on adama** only (`compose --profile worker`); Ollama social drafting via `10.0.0.128:11434`; Nominatim `http://10.0.0.128:8089`; prod `SITE_UNDER_CONSTRUCTION=true` until launch | | `college_craft` | django (docker) | all webservers | beta + prod | active/active behind NPM; no bundled Postgres (like `scha` / `monica_site`); dj-queue **worker singleton on adama** only (`compose --profile worker`); Ollama social drafting via `10.0.0.128:11434`; Nominatim `http://10.0.0.128:8089`; prod `SITE_UNDER_CONSTRUCTION=true` until launch |
| `abc_be` | django (docker) | all webservers | **beta only** | AI Benefits Coach API; no bundled Postgres; Ollama `http://10.0.0.128:11434`; shares DB `abc_be_beta` with `abc_worker` |
| `abc_worker` | django-type compose (FastAPI) | all webservers | **beta only** | same Postgres as `abc_be`; `migrate_cmd: true`; WS on host port 8018 |
| `abc_fe` | node-static (Vite) | all webservers | **beta only** | built to `/var/www/<env>.abc.aimloperations/html`; no prod `host_apps` row |
Django apps use a **shared external Postgres** (via `DATABASE_URL` in each host's Django apps use a **shared external Postgres** (via `DATABASE_URL` in each host's
env file) so active/active replicas share one database. Beta and prod never share env file) so active/active replicas share one database. Beta and prod never share
@@ -246,8 +249,11 @@ future beta replica.
| monica_site | 8014 | 8004 | all webservers | | monica_site | 8014 | 8004 | all webservers |
| url_shortening_service | 8015 | 8005 | all webservers | | url_shortening_service | 8015 | 8005 | all webservers |
| college_craft | 8016 | 8006 | all webservers | | college_craft | 8016 | 8006 | all webservers |
| abc_be | **8017** | 8007 (*not deployed*) | all webservers |
| abc_worker | **8018** | 8008 (*not deployed*) | all webservers |
| dta_webapp (nginx) | 8081 | 8080 | all webservers | | dta_webapp (nginx) | 8081 | 8080 | all webservers |
| chat_web_app (nginx) | 8083 | 8082 | all webservers | | chat_web_app (nginx) | 8083 | 8082 | all webservers |
| abc_fe (nginx) | **8085** | 8084 (*not deployed*) | all webservers |
| SearxNG (LAN only) | — | **8088** | ai-server-4080 only (`searxng_stack`); not an NPM upstream | | SearxNG (LAN only) | — | **8088** | ai-server-4080 only (`searxng_stack`); not an NPM upstream |
Host-local services on ai-server-4080 (not balanced by NPM): Host-local services on ai-server-4080 (not balanced by NPM):
@@ -314,6 +320,9 @@ point each domain at the backend(s):
| url_shortening_service (short) | `aiml.pw` and/or `cidinn.li` (pick when DNS is ready); `short-beta.aimloperations.com` (beta). Proxy `/` + `/[a-z0-9]{4,8}` only — 404 `/api/`, `/admin/`, `/debug/` | `adama:8005` / `8015` + same on roslin / starbuck / apollo / ai-server-4080 | | url_shortening_service (short) | `aiml.pw` and/or `cidinn.li` (pick when DNS is ready); `short-beta.aimloperations.com` (beta). Proxy `/` + `/[a-z0-9]{4,8}` only — 404 `/api/`, `/admin/`, `/debug/` | `adama:8005` / `8015` + same on roslin / starbuck / apollo / ai-server-4080 |
| url_shortening_service (API) | `shortener.aimloperations.com`; `shortener-beta.aimloperations.com` (beta). Proxy `/api/` only — 404 `/admin/` | same ports as short host (one container) | | url_shortening_service (API) | `shortener.aimloperations.com`; `shortener-beta.aimloperations.com` (beta). Proxy `/api/` only — 404 `/admin/` | same ports as short host (one container) |
| college_craft | `collegecraft.com` (+ www); `college-craft-preview.aimloperations.com` (beta) | `adama:8006` / `8016` + same on roslin / starbuck / apollo / ai-server-4080 | | college_craft | `collegecraft.com` (+ www); `college-craft-preview.aimloperations.com` (beta) | `adama:8006` / `8016` + same on roslin / starbuck / apollo / ai-server-4080 |
| abc_fe | `beta.abc.aimloperations.com` (beta only) | `adama:8085` + same on roslin / starbuck / apollo / ai-server-4080 |
| abc_be | `beta.abc.be.aimloperations.com` (beta only) | `adama:8017` + same on roslin / starbuck / apollo / ai-server-4080 |
| abc_worker | `beta.abc.worker.aimloperations.com` (beta only; HTTP + WebSocket upgrade) | `adama:8018` + same on roslin / starbuck / apollo / ai-server-4080 |
### Required changes IN each app repo (owned separately) ### Required changes IN each app repo (owned separately)
@@ -352,6 +361,8 @@ do not).
| url_shortening_service | beta | `url_shortener_beta` | `postgres://westfarn:<pw>@10.0.0.230:5432/url_shortener_beta` | | url_shortening_service | beta | `url_shortener_beta` | `postgres://westfarn:<pw>@10.0.0.230:5432/url_shortener_beta` |
| college_craft | prod | `college_craft` | `postgres://westfarn:<pw>@10.0.0.230:5432/college_craft` | | college_craft | prod | `college_craft` | `postgres://westfarn:<pw>@10.0.0.230:5432/college_craft` |
| college_craft | beta | `college_craft_beta` | `postgres://westfarn:<pw>@10.0.0.230:5432/college_craft_beta` | | college_craft | beta | `college_craft_beta` | `postgres://westfarn:<pw>@10.0.0.230:5432/college_craft_beta` |
| abc_be | beta | `abc_be_beta` | `postgres://westfarn:<pw>@10.0.0.230:5432/abc_be_beta` |
| abc_worker | beta | *(same `abc_be_beta`)* | worker uses `DB_*` pointing at `abc_be_beta` — do **not** create a second DB |
Server prereqs on 10.0.0.230: create each DB + grant `westfarn`; Server prereqs on 10.0.0.230: create each DB + grant `westfarn`;
`listen_addresses` covers LAN; `pg_hba.conf` allows `10.0.0.0/24`; firewall opens `listen_addresses` covers LAN; `pg_hba.conf` allows `10.0.0.0/24`; firewall opens
@@ -379,6 +390,26 @@ App-repo companion (`college_craft`, not this repo): deploy workflows still call
`--app client_site` (template leftover). They must become `--app college_craft` `--app client_site` (template leftover). They must become `--app college_craft`
before CI deploy will hit this catalog entry. Default branch is `master` (not `main`). before CI deploy will hit this catalog entry. Default branch is `master` (not `main`).
`abc_be` / `abc_worker` / `abc_fe` (GIS org, not this repo) — **beta only** ([#26](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/26)):
Control-node secrets (never git, mode `600`):
```text
~/Documents/secrets/abc_be/abc_be_beta.env
~/Documents/secrets/abc_worker/abc_worker_beta.env
```
Templates: `GIS/abc_be` `.env.beta.example`, `GIS/abc_worker` `.env.beta.example`.
`abc_fe` has no secret file — public `VITE_*` URLs live in committed `.env.beta`.
Create Postgres DB `abc_be_beta` and grant `westfarn` before first deploy.
NPM: `beta.abc.aimloperations.com` → `:8085`, `beta.abc.be.aimloperations.com` → `:8017`,
`beta.abc.worker.aimloperations.com` → `:8018` (enable WebSocket). No prod ABC
`host_apps` rows; ports 8007 / 8008 / 8084 reserved.
Companion workflows: [abc_be#22](https://git.aimloperations.com/GIS/abc_be/issues/22),
[abc_worker#27](https://git.aimloperations.com/GIS/abc_worker/issues/27),
[abc_fe#27](https://git.aimloperations.com/GIS/abc_fe/issues/27).
### One-time host bootstrap (per target) ### One-time host bootstrap (per target)
- [x] Gitea SSH key: the `gitea-key` role (in `site.yml`) generates a key per - [x] Gitea SSH key: the `gitea-key` role (in `site.yml`) generates a key per
@@ -455,7 +486,8 @@ Store vault password for CI in a file readable only by the Act runner (e.g. `~/.
| 10e | Auto-start `monica_site` dj-queue worker on adama (`compose_profiles`) | Done ([#17](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/17)) | | 10e | Auto-start `monica_site` dj-queue worker on adama (`compose_profiles`) | Done ([#17](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/17)) |
| 10f | Add starbuck + apollo as app hosts (same workloads as roslin) | Done ([#20](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/20)) | | 10f | Add starbuck + apollo as app hosts (same workloads as roslin) | Done ([#20](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/20)) |
| 10g | Register + deploy `url_shortening_service` (django, ports 8005/8015) | Done ([#22](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/22)) | | 10g | Register + deploy `url_shortening_service` (django, ports 8005/8015) | Done ([#22](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/22)) |
| 10h | Register + deploy `college_craft` (django, ports 8006/8016) | This PR ([#24](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/24)) | | 10h | Register + deploy `college_craft` (django, ports 8006/8016) | Done ([#24](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/24)) |
| 10i | Register + deploy ABC beta (`abc_be` 8017, `abc_worker` 8018, `abc_fe` 8085) | This PR ([#26](https://git.aimloperations.com/ai_ml_operations/server-infra/issues/26)) |
| 11 | Gitea container registry (optional) | Future | | 11 | Gitea container registry (optional) | Future |
## Open Decisions ## Open Decisions
+20
View File
@@ -129,6 +129,26 @@ app_catalog:
migrate_cmd: "uv run python manage.py migrate --noinput" migrate_cmd: "uv run python manage.py migrate --noinput"
# dj-queue worker = compose profile `worker` (singleton). Deploy starts it # dj-queue worker = compose profile `worker` (singleton). Deploy starts it
# via host_apps.compose_profiles on adama only (see host_vars/adama.yml). # via host_apps.compose_profiles on adama only (see host_vars/adama.yml).
abc_be:
type: django
repo: "{{ git_base_url }}/GIS/abc_be.git"
default_branch: master
compose_file: docker-compose.prod.yml
web_service: web
migrate_cmd: "uv run python manage.py migrate --noinput"
abc_worker:
type: django
repo: "{{ git_base_url }}/GIS/abc_worker.git"
default_branch: master
compose_file: docker-compose.prod.yml
web_service: web
# FastAPI — no Django migrations. `true` keeps the django deploy path happy.
migrate_cmd: "true"
abc_fe:
type: node-static
repo: "{{ git_base_url }}/GIS/abc_fe.git"
default_branch: master
webroot_pattern: "/var/www/{env}.abc.aimloperations/html"
# Deploy filter vars. CI passes these; manual runs may leave them undefined # Deploy filter vars. CI passes these; manual runs may leave them undefined
# to (re)deploy every app listed in the host's host_apps. # to (re)deploy every app listed in the host's host_apps.
+3
View File
@@ -24,3 +24,6 @@ host_apps:
- { name: url_shortening_service, env: beta, port: 8015 } - { name: url_shortening_service, env: beta, port: 8015 }
- { name: college_craft, env: prod, port: 8006, compose_profiles: [worker] } - { name: college_craft, env: prod, port: 8006, compose_profiles: [worker] }
- { name: college_craft, env: beta, port: 8016, compose_profiles: [worker] } - { name: college_craft, env: beta, port: 8016, compose_profiles: [worker] }
- { name: abc_be, env: beta, port: 8017 }
- { name: abc_worker, env: beta, port: 8018 }
- { name: abc_fe, env: beta, port: 8085 }
+4 -1
View File
@@ -40,4 +40,7 @@ host_apps:
- { name: url_shortening_service, env: prod, port: 8005 } - { name: url_shortening_service, env: prod, port: 8005 }
- { name: url_shortening_service, env: beta, port: 8015 } - { name: url_shortening_service, env: beta, port: 8015 }
- { name: college_craft, env: prod, port: 8006 } - { name: college_craft, env: prod, port: 8006 }
- { name: college_craft, env: beta, port: 8016 } - { name: college_craft, env: beta, port: 8016 }
- { name: abc_be, env: beta, port: 8017 }
- { name: abc_worker, env: beta, port: 8018 }
- { name: abc_fe, env: beta, port: 8085 }
+3
View File
@@ -20,3 +20,6 @@ host_apps:
- { name: url_shortening_service, env: beta, port: 8015 } - { name: url_shortening_service, env: beta, port: 8015 }
- { name: college_craft, env: prod, port: 8006 } - { name: college_craft, env: prod, port: 8006 }
- { name: college_craft, env: beta, port: 8016 } - { name: college_craft, env: beta, port: 8016 }
- { name: abc_be, env: beta, port: 8017 }
- { name: abc_worker, env: beta, port: 8018 }
- { name: abc_fe, env: beta, port: 8085 }
+3
View File
@@ -20,3 +20,6 @@ host_apps:
- { name: url_shortening_service, env: beta, port: 8015 } - { name: url_shortening_service, env: beta, port: 8015 }
- { name: college_craft, env: prod, port: 8006 } - { name: college_craft, env: prod, port: 8006 }
- { name: college_craft, env: beta, port: 8016 } - { name: college_craft, env: beta, port: 8016 }
- { name: abc_be, env: beta, port: 8017 }
- { name: abc_worker, env: beta, port: 8018 }
- { name: abc_fe, env: beta, port: 8085 }
+3
View File
@@ -20,3 +20,6 @@ host_apps:
- { name: url_shortening_service, env: beta, port: 8015 } - { name: url_shortening_service, env: beta, port: 8015 }
- { name: college_craft, env: prod, port: 8006 } - { name: college_craft, env: prod, port: 8006 }
- { name: college_craft, env: beta, port: 8016 } - { name: college_craft, env: beta, port: 8016 }
- { name: abc_be, env: beta, port: 8017 }
- { name: abc_worker, env: beta, port: 8018 }
- { name: abc_fe, env: beta, port: 8085 }
+1 -1
View File
@@ -17,7 +17,7 @@ Deploy applications with deploy-apps.yml.
HOST Optional. Limit to one host: adama, roslin, starbuck, apollo, or ai-server-4080. HOST Optional. Limit to one host: adama, roslin, starbuck, apollo, or ai-server-4080.
Options: Options:
--app NAME App to deploy (company_site, dta_service, dta_webapp, scha, chat_web_app, chat_backend, monica_site, url_shortening_service, college_craft) --app NAME App to deploy (company_site, dta_service, dta_webapp, scha, chat_web_app, chat_backend, monica_site, url_shortening_service, college_craft, abc_be, abc_worker, abc_fe)
--env ENV Environment: beta or prod --env ENV Environment: beta or prod
--ref REF Git ref/sha to deploy (default: master) --ref REF Git ref/sha to deploy (default: master)
--check Dry run --check Dry run