|
1 | | -# Subactor deployment through `semcod/redeploy` |
| 1 | +# Subactor deployment docs moved |
2 | 2 |
|
3 | | -HOME: `semcod` (`redeploy`, toolkit). |
4 | | -Runtime facts and authority: **ADOPT** from Subactor |
5 | | -(`platform/config/deployment-bindings`, `www-sub-actor/docs/deployment.md`, |
6 | | -knowledge entries). Host fitness: **ADOPT** `wellmanifest/policy-dsl` |
7 | | -(`subactor.host/production-server/v1`, `subactor.host/rpi5/v1`). |
| 3 | +**SSOT is `subactor/deployment` (HOME=`subactor`), not this repository.** |
8 | 4 |
|
9 | | -This document answers: **how Subactor is deployed today**, and **how operators |
10 | | -drive that topology with `redeploy`** (detect → plan → apply / fleet). |
| 5 | +- https://github.com/subactor/deployment |
| 6 | +- Topology / procedures / fleet wrappers: that repo’s `docs/` and `redeploy/` |
11 | 7 |
|
12 | | -> Status observed: **2026-08-15**. Live public `*.subactor.com` and current |
13 | | -> `sub.actor` publish path are **Plesk**. Full Docker VPS + Traefik for |
14 | | -> Platform/`control.sub.actor` is the **documented target** in |
15 | | -> `www-sub-actor/docs/deployment.md`, not yet the live Founder Control host. |
16 | | -
|
17 | | ---- |
18 | | - |
19 | | -## 1. Topology (as-is vs target) |
20 | | - |
21 | | -```text |
22 | | - ┌─────────────────────────────────────┐ |
23 | | - │ Plesk 217.160.250.222 (edge) │ |
24 | | - Internet ──────────────►│ DNS / TLS / mail / static / PHP │ |
25 | | - │ Node Toolkit (founder origin) │ |
26 | | - └──────────────┬──────────────────────┘ |
27 | | - │ |
28 | | - ┌─────────────────────────────┼─────────────────────────────┐ |
29 | | - │ │ │ |
30 | | - *.subactor.com founder.subactor.com sub.actor |
31 | | - static / PHP sites Node proxy → :19081 Plesk httpdocs |
32 | | - (SFTP plesk:// sync) SSH -R from Lenovo (binding: |
33 | | - → Caddy :18081 → Control deployment:sub-actor:production) |
34 | | -
|
35 | | -TARGET (policy-aligned Docker VPS — FORBID Compose inside Plesk): |
36 | | -
|
37 | | - Internet ──► Docker VPS (Traefik ACME DNS-01) |
38 | | - ├─ https://sub.actor / *.sub.actor (portal image sha-*) |
39 | | - └─ https://control.sub.actor (Platform Control router) |
40 | | - Plesk remains DNS/TLS/mail/WWW edge only |
41 | | -``` |
42 | | - |
43 | | -### Domain map (SSOT) |
44 | | - |
45 | | -Source of truth: `subactor/platform/config/deployment-bindings/registry.v1.json` |
46 | | -and `public-pages.json`. Provider for listed sites today: **`plesk`**. |
47 | | - |
48 | | -| Domain | Role today | Deploy mechanism | |
49 | | -| --- | --- | --- | |
50 | | -| `subactor.com` | Marketing / main site | Plesk SFTP sync | |
51 | | -| `www.subactor.com`, `docs.subactor.com`, `docs-stage.subactor.com` | Docs / www | Plesk SFTP | |
52 | | -| `logo.subactor.com`, `status.subactor.com`, `contracts.subactor.com`, … | Brand / status | Plesk SFTP | |
53 | | -| `identity.subactor.com`, `chat.subactor.com` | Surface placeholders | Plesk SFTP | |
54 | | -| `auth.subactor.com` | Auth **bootstrap** static site (not full IdP yet) | Plesk SFTP; project `projekty/auth-subactor-com` | |
55 | | -| `founder.subactor.com` | Public Founder Control origin | Plesk Node `plesk-origin` + SSH reverse tunnel | |
56 | | -| `sub.actor` | SaaS portal publish | Plesk webspace `sub.actor/httpdocs` (live); Docker Traefik path documented | |
57 | | -| `control.sub.actor` | Authenticated Control | Documented on Docker VPS; live Founder still via `founder.subactor.com` | |
58 | | -| `*.sub.actor` tenants | Tenant vhosts | Documented Traefik wildcard; live depends on portal stack | |
59 | | - |
60 | | -`control.subactor.com` is **not** in the bindings registry. |
61 | | - |
62 | | ---- |
63 | | - |
64 | | -## 2. Current procedures (canonical scripts) |
65 | | - |
66 | | -### A. Static / PHP public pages (`*.subactor.com`, often `sub.actor`) |
67 | | - |
68 | | -1. Exact deployment binding + plan hash (Digital Twin / Control). |
69 | | -2. `plesk://host/site/command/sync` (SFTP) — credentials from Vault scopes, not |
70 | | - in Git. |
71 | | -3. HTTP/hash read-back on the bound URL. |
72 | | -4. Entry points: Planfile tickets, `platform/scripts/deploy-public-pages.mjs`, |
73 | | - project reconciliation. |
74 | | - |
75 | | -**redeploy role:** inventory in `examples/subactor/fleet.yaml`; verify steps in |
76 | | -`01-plesk-edge-verify` (curl EQL). Publish mutate stays Subactor `plesk://` |
77 | | -(authority + binding), not a free-form rsync from redeploy. |
78 | | - |
79 | | -### B. Founder public Control (`founder.subactor.com`) |
80 | | - |
81 | | -1. Publish `projekty/founder-subactor-com/plesk-origin/{app.js,package.json}` to |
82 | | - Plesk docroot `founder.subactor.com/`. |
83 | | -2. Keep `founder-plesk-tunnel.service` on Lenovo |
84 | | - (`platform/scripts/founder-plesk-tunnel.sh`) → `prototypowanie.pl:19081`. |
85 | | -3. Doctor: `platform/scripts/founder-public-origin-doctor.sh`. |
86 | | -4. EQL: `/` → 401 Basic; `/founder/form` → 200; `/__origin_health` → 200. |
87 | | - |
88 | | -**redeploy role:** `02-founder-origin-verify` migration (health probes only). |
89 | | - |
90 | | -### C. Platform Compose (lab / future VPS) |
91 | | - |
92 | | -```bash |
93 | | -cd /opt/subactor/src/platform # or sibling checkout |
94 | | -./scripts/deploy-stack.sh deploy |
95 | | -``` |
96 | | - |
97 | | -Posture from host `.env` (`SUBACTOR_DEPLOYMENT_TOPOLOGY`, |
98 | | -`CONTROL_DEPLOYMENT_POSTURE`). Never `compose down -v` in deploy procedures. |
99 | | - |
100 | | -### D. Documented full portal + Platform (Docker VPS target) |
101 | | - |
102 | | -From `www-sub-actor/docs/deployment.md`: |
103 | | - |
104 | | -1. Host fit per Policy DSL (16 GiB min / 32 GiB recommended). |
105 | | -2. `capture-platform-lock.sh` → `sync-platform.sh` (exact SHAs). |
106 | | -3. Secrets on host only; GHCR image `ghcr.io/subactor/www-sub-actor:sha-*`. |
107 | | -4. `deploy-all.sh docker <PORTAL_IMAGE>` → Platform then portal. |
108 | | -5. Health: `https://sub.actor/readyz`, tenant resolve smoke. |
109 | | -6. GitHub Environments `staging` / `production` + `release.sh` over SSH. |
110 | | - |
111 | | -**redeploy role:** `03-docker-vps-platform` migration wraps the same SSH command |
112 | | -surface for detect/plan/apply and fleet targeting. |
113 | | - |
114 | | -### E. auth.subactor.com |
115 | | - |
116 | | -Static bootstrap only. Full SSO/OIDC federation is **not** the current runtime. |
117 | | -Do not treat `auth.subactor.com` as the production IdP until a binding + provider |
118 | | -say so. |
119 | | - |
120 | | ---- |
121 | | - |
122 | | -## 3. Using `redeploy` for Subactor |
123 | | - |
124 | | -Install: `pipx install redeploy` (see root README). |
| 8 | +This toolkit (`semcod/redeploy`) remains generic: `detect` → `plan` → `apply` / |
| 9 | +`fleet`. Subactor operators **ADOPT** it from `subactor/deployment`; they do not |
| 10 | +treat `examples/subactor/` here as source of truth. |
125 | 11 |
|
126 | 12 | ```bash |
127 | | -cd examples/subactor |
128 | | - |
129 | | -# Fleet inventory (roles / tags — no secrets) |
130 | | -redeploy fleet --file fleet.yaml |
131 | | - |
132 | | -# Plan only (no SSH) |
133 | | -redeploy run 03-docker-vps-platform/migration.yaml --plan-only |
134 | | - |
135 | | -# Dry-run against a configured host (set SUBACTOR_VPS_SSH in env / edit host) |
136 | | -redeploy run 03-docker-vps-platform/migration.yaml --dry-run |
137 | | - |
138 | | -# Verify-only edge probes (read-only) |
139 | | -redeploy run 01-plesk-edge-verify/migration.yaml --plan-only |
140 | | -redeploy run 02-founder-origin-verify/migration.yaml --plan-only |
141 | | -``` |
142 | | - |
143 | | -### Safety rules (fail closed) |
144 | | - |
145 | | -| Rule | Why | |
146 | | -| --- | --- | |
147 | | -| No Compose stack inside Plesk | Policy `FORBID RUN_COMPOSE_STACK_INSIDE_PLESK` | |
148 | | -| No Control port 8181 on public host | Policy `FORBID BIND_CONTROL_PORT_8181_PUBLIC` | |
149 | | -| No mutable `main` multi-repo deploy | Use `components.lock` / `sha-*` images | |
150 | | -| No secrets in `migration.yaml` / Git | Host files + Vault; placeholders only here | |
151 | | -| `redeploy apply` ≠ production authority | Subactor grant / binding still required for mutate | |
152 | | -| Validator merge ≠ production apply | Separate POA / Planfile / SSH release | |
153 | | - |
154 | | ---- |
155 | | - |
156 | | -## 4. Example package layout |
157 | | - |
158 | | -```text |
159 | | -examples/subactor/ |
160 | | -├── README.md |
161 | | -├── fleet.yaml # roles: plesk-edge, founder-origin, docker-vps, rpi5-edge |
162 | | -├── 01-plesk-edge-verify/ |
163 | | -│ ├── migration.yaml # curl EQL for public pages |
164 | | -│ └── redeploy.yaml |
165 | | -├── 02-founder-origin-verify/ |
166 | | -│ ├── migration.yaml # founder EQL + tunnel hint |
167 | | -│ └── redeploy.yaml |
168 | | -└── 03-docker-vps-platform/ |
169 | | - ├── migration.yaml # deploy-all.sh / release surface |
170 | | - └── redeploy.yaml |
| 13 | +git clone git@github.com:subactor/deployment.git |
| 14 | +cd deployment |
| 15 | +redeploy fleet --file redeploy/fleet.yaml |
| 16 | +redeploy run redeploy/03-docker-vps-platform/migration.yaml --plan-only |
171 | 17 | ``` |
172 | | - |
173 | | -Hosts in examples use placeholders: |
174 | | - |
175 | | -- `deploy@SUBACTOR_VPS_IP` — Docker production VPS |
176 | | -- `operator@LENOVO_LAB` — tunnel / Control lab host |
177 | | -- Plesk verify steps run from the operator machine (no Plesk root required) |
178 | | - |
179 | | -Replace placeholders before `--dry-run` / apply. Prefer environment-specific |
180 | | -copies outside Git for real IPs. |
181 | | - |
182 | | ---- |
183 | | - |
184 | | -## 5. Cross-links (do not duplicate SSOT) |
185 | | - |
186 | | -| Concern | Canonical location | |
187 | | -| --- | --- | |
188 | | -| Host MUST/SHOULD tables | `wellmanifest/policy-dsl` + `www-sub-actor/docs/deployment.md` §1 | |
189 | | -| Portal/PayPal/ACME/GitHub release | `www-sub-actor/docs/deployment.md` | |
190 | | -| Domain → docroot bindings | `subactor/platform/config/deployment-bindings/registry.v1.json` | |
191 | | -| Founder origin ops | `subactor/projekty/founder-subactor-com/README.md` | |
192 | | -| Auth bootstrap | `subactor/projekty/auth-subactor-com/README.md` | |
193 | | -| redeploy CLI mechanics | `semcod/redeploy/README.md`, `docs/fleet.md` | |
194 | | - |
195 | | -When this document disagrees with Subactor registries or live knowledge, **Subactor |
196 | | -SSOT wins**; update this file in the same change set. |
197 | | - |
198 | | ---- |
199 | | - |
200 | | -## 6. Suggested operator sequence (target VPS cutover) |
201 | | - |
202 | | -1. `redeploy run 01-plesk-edge-verify/... --plan-only` — baseline public EQL. |
203 | | -2. Qualify VPS with Policy DSL production-server profile. |
204 | | -3. Bootstrap Docker host (`www-sub-actor/scripts/host-bootstrap.sh`). |
205 | | -4. Pin sources (`capture-platform-lock` / `sync-platform`). |
206 | | -5. `redeploy run 03-docker-vps-platform/... --dry-run` then apply under grant. |
207 | | -6. Point `sub.actor` / `*.sub.actor` A/AAAA at VPS; keep Plesk for `*.subactor.com` |
208 | | - edge until intentionally migrated. |
209 | | -7. Move Founder public URL to `https://control.sub.actor/founder` only after |
210 | | - Control is healthy on Traefik; keep tunnel as rollback until EQL green. |
211 | | -8. Re-run verify migrations; backup Postgres / `acme-data` / secrets. |
0 commit comments