Part of #4325.
Context
The new host needs the same base runtime the current deployment already documents — Docker + Compose, the repo checked out at a known ref, .env populated from .env.selfhost.example/.env.example, and the profiles this deployment actually uses activated (postgres, qdrant, visual-review, rees, observability, tailscale — see docker-compose.yml's profile list). This issue is the base environment only; data migration, secrets, and GPU wiring are separate sub-issues.
Requirements
- Docker + Compose installed, matching the versions the current host runs (or newer within the same major line).
- Repo cloned at a pinned commit/tag (not a moving
main checkout) so the two hosts run identical code during the parallel-run window.
.env populated with every NON-secret operational setting matching the current deployment (concurrency knobs, retention windows, feature flags) — secrets themselves are explicitly out of scope here.
- Firewall: only the ports this deployment's compose file actually needs to expose publicly are open (the app's own HTTP port and, if used, the
caddy profile's 80/443) — every in-network-only service (Postgres, Redis, Qdrant, browserless, REES) stays unreachable from outside the host's Docker network, matching the current deployment's posture.
- Host clock: at least two independent NTP sources configured (see
docker-compose.yml's own "HOST CLOCK" comment on why a single source is insufficient — GitHub App JWT auth fails silently once drift exceeds the 60s skew tolerance).
Deliverables
Expected outcome
A running-but-empty instance of the full stack on the new host, healthy per scripts/selfhost-post-update-check.sh, with no data, no secrets, and no live traffic yet — ready for the sub-issues that populate it.
Effort
M
Part of #4325.
Context
The new host needs the same base runtime the current deployment already documents — Docker + Compose, the repo checked out at a known ref,
.envpopulated from.env.selfhost.example/.env.example, and the profiles this deployment actually uses activated (postgres,qdrant,visual-review,rees,observability,tailscale— seedocker-compose.yml's profile list). This issue is the base environment only; data migration, secrets, and GPU wiring are separate sub-issues.Requirements
maincheckout) so the two hosts run identical code during the parallel-run window..envpopulated with every NON-secret operational setting matching the current deployment (concurrency knobs, retention windows, feature flags) — secrets themselves are explicitly out of scope here.caddyprofile's 80/443) — every in-network-only service (Postgres, Redis, Qdrant, browserless, REES) stays unreachable from outside the host's Docker network, matching the current deployment's posture.docker-compose.yml's own "HOST CLOCK" comment on why a single source is insufficient — GitHub App JWT auth fails silently once drift exceeds the 60s skew tolerance).Deliverables
docker compose version).envpopulated with non-secret settings; diffed against the current host's.env(secrets redacted) to confirm parityExpected outcome
A running-but-empty instance of the full stack on the new host, healthy per
scripts/selfhost-post-update-check.sh, with no data, no secrets, and no live traffic yet — ready for the sub-issues that populate it.Effort
M