Master overview (PHASE4_PRODUCTION_INFRASTRUCTURE.md) plus five detail docs (PRODUCTION_DEPLOYMENT, PRODUCTION_NETWORK_SECURITY, BACKUP_DR, OBSERVABILITY, CAPACITY_PLANNING), a master PRODUCTION_VALIDATION_CHECKLIST, and 12 runbooks (first deployment, normal deploy, rollback, Postgres restore, VM rebuild for both hosts, Docker TLS rotation, TLS renewal, owner recovery, stuck Lab cleanup, failed migration, backup failure, disk failure, Lab Host resource pressure). PRODUCTION_NETWORK_SECURITY.md prominently documents the one genuine architectural gap this phase surfaced: the Gateway's existing env.internal_ip mechanism for reaching a Lab container assumes Gateway and Lab share a Docker daemon, which breaks once Labs run on a genuinely separate rn-lab-host-01 VM. The network-policy half is built (a firewall allowance for Gateway->Lab-Host on a published port range); the application half (Provisioner/Gateway address handling) is an explicit, reviewed, NOT-YET-BUILT follow-up flagged there rather than silently decided. Updated LAB_ARCHITECTURE.md, ENGINEERING_SOP.md, README.md, and platform/README.md with Phase 4 pointers, consistent with how every prior phase updated these. Status: PHASE 4 BUILD COMPLETE / PRODUCTION DEPLOYMENT PENDING HARDWARE.
20 lines
1.1 KiB
Markdown
20 lines
1.1 KiB
Markdown
# Runbook: Public TLS Certificate Renewal
|
|
|
|
If using Caddy's built-in Let's Encrypt (the default in `infra/docker/platform/Caddyfile.j2`):
|
|
**nothing to do** — Caddy renews automatically well before expiry, as long as port 80 stays
|
|
reachable for the ACME HTTP-01 challenge (`infra/firewall/rn-platform-01.rules` already allows
|
|
it). `infra/scripts/production-smoke-test.sh` checks the live expiry date on every run as an
|
|
early warning if auto-renewal ever silently breaks.
|
|
|
|
If using Cloudflare origin certs instead (see `docs/PRODUCTION_NETWORK_SECURITY.md` §8 for
|
|
that decision): Cloudflare-issued origin certs are typically 15-year validity — this is a
|
|
once-per-network-topology-change concern, not a recurring one. Re-issue from the Cloudflare
|
|
dashboard (SSL/TLS -> Origin Server) and redeploy the cert/key via the `platform` Ansible role
|
|
if it ever needs replacing (domain change, suspected compromise).
|
|
|
|
**Manual check:**
|
|
```bash
|
|
echo | openssl s_client -connect academy.example.com:443 -servername academy.example.com 2>/dev/null \
|
|
| openssl x509 -noout -enddate
|
|
```
|