2026-07-30 16:37:59 +02:00
---
id: TREV-WP-0011
type: workplan
title: "Deploy Trust Service and Control Plane to the Railiance reef"
domain: infotech
repo: target-revenue
2026-08-05 17:56:38 +02:00
status: finished
2026-07-30 16:37:59 +02:00
owner: claude
topic_slug: infotech
created: "2026-07-30"
2026-08-05 16:41:00 +02:00
updated: "2026-08-05"
2026-07-30 16:38:41 +02:00
state_hub_workstream_id: "f40fa906-9fbc-4445-9ebc-62ec46ac17b5"
2026-07-30 16:37:59 +02:00
---
# Deploy Trust Service and Control Plane to the Railiance reef
Deploy the hosted Trust Service (`service/app.py` , WP-0006) and the
Control Plane interactive UI (`service/control_plane_app.py` , WP-0009-T04)
to Railiance infrastructure-as-code, on a rail hosted in `reef-railiance` 's
grouped home substrate, fronted by the subdomain `revenue.coulomb.social` .
2026-08-05 16:41:00 +02:00
Operator guide: `docs/deployment.md` .
**Note (2026-08-05):** WP-0008-T05 has since accepted the first real Phase
(`trsl:phase:info-tech-canon-service-surface` ). Deployment still does not
by itself declare additional Phases; it hosts the Trust Service the pilot
already uses (local pilot today → public host when this workplan finishes).
2026-07-30 16:37:59 +02:00
```task
id: TREV-WP-0011-T01
2026-08-05 16:41:00 +02:00
status: done
2026-07-30 16:37:59 +02:00
priority: high
human_accept_required: true
2026-08-05 16:41:00 +02:00
human_accepted_by: Bernd
human_accepted_at: "2026-08-05"
2026-07-30 16:38:41 +02:00
state_hub_task_id: "8dffe5e1-6f2b-4020-ac07-a108a8fc2edc"
2026-07-30 16:37:59 +02:00
```
2026-08-05 16:41:00 +02:00
**Decide the deployment pattern (human gate).**
**Result (2026-08-05):** Recommended package recorded and implemented.
Maintainer continued with "go on" after declining alternate TUI options —
treated as acceptance of the recommended package:
| Bullet | Decision |
| --- | --- |
| Manifest home | `target-revenue/k8s/railiance/` + ArgoCD Application in `railiance-platform` (issue-core pattern) |
| Process topology | Single process: `service/combined.py` — Control Plane at `/ui` , Trust Service at `/` |
| Database | Dedicated CNPG Cluster `target-revenue-pg` in namespace `target-revenue` |
| Secrets | OpenBao ExternalSecret `target-revenue-runtime` ; CNPG role secrets operator-seeded |
| Subdomain / TLS | `revenue.coulomb.social` + `letsencrypt-prod` (proven by `forgejo.coulomb.social` ) |
| Founding credential | Idempotent Job + `scripts/bootstrap_binky.py` |
2026-07-30 16:37:59 +02:00
```task
id: TREV-WP-0011-T02
2026-08-05 16:41:00 +02:00
status: done
2026-07-30 16:37:59 +02:00
priority: high
2026-07-30 16:38:41 +02:00
state_hub_task_id: "d4b3dae4-eb2a-4bed-bc10-5ce90d972cec"
2026-07-30 16:37:59 +02:00
```
2026-08-05 16:41:00 +02:00
**Containerize.**
**Result:** `Dockerfile` builds `.[service]` , includes migrations/schemas/
policies/profiles, non-root uid 10001, entrypoint
`scripts/docker-entrypoint.sh` → uvicorn
`target_revenue.service.combined:app` . Image tag convention:
`forgejo.coulomb.social/coulomb/target-revenue:0.1.0` . Also: `/healthz` on
both apps + combined; migrate/bootstrap entry modes via env flags.
2026-07-30 16:37:59 +02:00
```task
id: TREV-WP-0011-T03
2026-08-05 16:41:00 +02:00
status: done
2026-07-30 16:37:59 +02:00
priority: high
2026-07-30 16:38:41 +02:00
state_hub_task_id: "06567eb5-d924-4100-9cd5-19478121c3c7"
2026-07-30 16:37:59 +02:00
```
2026-08-05 16:41:00 +02:00
**Provision the database and secrets** (manifests).
**Result:** `k8s/railiance/cnpg-cluster.yaml` (dedicated Cluster),
`externalsecret.yaml` (OpenBao path
`workloads/target-revenue/runtime-secrets` ), `migrate-job.yaml` (applies
0001– 0007 via `scripts/apply_migrations.py` ). Live secret provisioning
and first Cluster bootstrap remain **operator steps** (OpenBao + CNPG
credential Secrets) — see `docs/deployment.md` checklist.
2026-07-30 16:37:59 +02:00
```task
id: TREV-WP-0011-T04
2026-08-05 16:41:00 +02:00
status: done
2026-07-30 16:37:59 +02:00
priority: high
2026-07-30 16:38:41 +02:00
state_hub_task_id: "e6ecf3e5-3a9d-4f00-92b1-a05817b19013"
2026-07-30 16:37:59 +02:00
```
2026-08-05 16:41:00 +02:00
**Helm chart, Ingress, and ArgoCD wiring.**
**Result:** Kustomize (not Helm) under `k8s/railiance/` : Deployment,
Service, Ingress (`revenue.coulomb.social` , letsencrypt-prod), migrate +
bootstrap Jobs. ArgoCD Application:
`railiance-platform/argocd/applications/target-revenue.application.yaml`
(project `railiance-tenants` , automated sync, CreateNamespace).
2026-07-30 16:37:59 +02:00
```task
id: TREV-WP-0011-T05
2026-08-05 17:56:38 +02:00
status: done
2026-07-30 16:37:59 +02:00
priority: medium
2026-07-30 16:38:41 +02:00
state_hub_task_id: "37847415-19c4-43b5-8b0d-de7a4211bfdd"
2026-07-30 16:37:59 +02:00
```
2026-08-05 16:41:00 +02:00
**Bootstrap and smoke-test the live deployment.**
2026-08-05 17:56:38 +02:00
**Result (2026-08-05):** Live on **railiance01** (not coulombcore ArgoCD —
same interim model as forgejo/reuse; DNS points to Railiance01):
2026-08-05 16:41:00 +02:00
2026-08-05 17:56:38 +02:00
| Check | Result |
| --- | --- |
| DNS | `revenue.coulomb.social` → railiance01 (operator) |
| Image | `forgejo.coulomb.social/coulomb/target-revenue:0.1.1` |
| OpenBao ESO | `ClusterSecretStore/openbao-target-revenue` Ready; runtime SecretSynced |
| CNPG | `target-revenue-pg` healthy |
| Migrations + bootstrap Jobs | complete; founding token local-only at `~/.config/target-revenue/revenue-coulomb-binky.token` |
| TLS | cert-manager Ready (`target-revenue-tls` ) |
| `GET /healthz` | 200 |
| `GET /ui/login` | 200 |
| Pilot Phase re-registered | `trsl:phase:info-tech-canon-service-surface` on public API (empty ledger; public instance is now POR — local `trf-pilot-pg` is superseded) |
Schema-path fix in 0.1.1 (`TRF_SCHEMAS_DIR` / validation resolve) after
first image failed package-relative schema loads.