Everything needed for one ~10-minute Charles window on ultix-streaming
and ultix-offstage, with zero root/systemd on the target accounts:
- deploy/accounts.tsv: the fleet authority (account, host, vertical,
Redmine project, quota group, ports). Port scheme events=4100+index,
serve=8090+index with a global 0-8 index so per-account daemons on
one host never collide; loop state is per-account under ~/.mopac.
- deploy/install-account.sh <account>: idempotent installer run AS the
target user; renders harness.toml from deploy/harness.toml.in, writes
a 0600 env-secrets template, refuses to overwrite existing config or
secrets (re-run = the upgrade path), generates mopac-start/stop.
- deploy/runbook.md: exact Charles sequence (build, stage, install,
secrets bootstrap, verify, start via nohup or cron @reboot, rollback)
with the account-port table, per-host time estimates and assumptions.
- Makefile: release target (digest-pinned docker builder, CGO off,
linux/amd64 static, stripped) plus check/deploy-test entrypoints.
- deploy/tests.sh: 13 packaging tests (TSV scheme, template substitution
for all 9 accounts, idempotence, refuse-to-overwrite, binary lookup,
rendered config loads via a dry-run); README deploy section.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
1.6 KiB
1.6 KiB
| 1 | # MOPAC multi-account fleet — SPEC-20260829-charles-brief.md, Redmine 494. | |||||||
|---|---|---|---|---|---|---|---|---|
| 2 | # Tab-separated; lines starting with '#' are comments. This file is the | |||||||
| 3 | # authority for deploy/install-account.sh and the account-port table in | |||||||
| 4 | # deploy/runbook.md — edit here, never in generated configs. | |||||||
| 5 | # | |||||||
| 6 | # Port scheme (collision-free across BOTH hosts, index is global 0-8): | |||||||
| 7 | # events_port = 4100 + index (`harness events` webhook receiver) | |||||||
| 8 | # serve_port = 8090 + index (`harness serve` OWUI front door) | |||||||
| 9 | # | |||||||
| 10 | # quota_account groups instances sharing one z.ai coding plan (two Max | |||||||
| 11 | # plans assumed: one per host — one-line edit per row when the real | |||||||
| 12 | # key-to-host grouping is confirmed). | |||||||
| 13 | # | |||||||
| 14 | # redmine_project is the Redmine project identifier used in the generated | |||||||
| 15 | # scope_query (project=<id>&status_id=released&limit=25). The projects must | |||||||
| 16 | # exist with these identifiers (runbook bootstrap step 0), or edit this | |||||||
| 17 | # column to the real identifiers and re-render. | |||||||
| 18 | # | |||||||
| 19 | # account | host | index | vertical | redmine_project | quota_account | events_port | serve_port |
| 20 | reachableceo | ultix-streaming | 0 | rceo | mopac-rceo | zai-max-1 | 4100 | 8090 |
| 21 | TSGBOD | ultix-streaming | 1 | bod | mopac-bod | zai-max-1 | 4101 | 8091 |
| 22 | TSGCOO | ultix-streaming | 2 | coo | mopac-coo | zai-max-1 | 4102 | 8092 |
| 23 | TSGCTO | ultix-streaming | 3 | cto | mopac-cto | zai-max-1 | 4103 | 8093 |
| 24 | TSGCCO | ultix-streaming | 4 | cco | mopac-cco | zai-max-1 | 4104 | 8094 |
| 25 | reachableceo-offstage | ultix-offstage | 5 | rceo-offstage | mopac-rceo-offstage | zai-max-2 | 4105 | 8095 |
| 26 | COSRCEO-Personal | ultix-offstage | 6 | cos-rceo-personal | mopac-cos-rceo-personal | zai-max-2 | 4106 | 8096 |
| 27 | COSRCEO-Biz | ultix-offstage | 7 | cos-rceo-biz | mopac-cos-rceo-biz | zai-max-2 | 4107 | 8097 |
| 28 | COSWFO | ultix-offstage | 8 | cos-wfo | mopac-cos-wfo | zai-max-2 | 4108 | 8098 |