docs(deployment): add 2026-02-14 progress and update platform domains
Some checks failed
CI / pytest (push) Successful in 34m7s
CI / dependency-scanning (push) Successful in 26s
CI / audit (push) Successful in 7s
CI / ruff (push) Successful in 9s
CI / architecture (push) Successful in 11s
CI / docs (push) Failing after 36s
CI / deploy (push) Failing after 3s

Updates hetzner-server-setup.md with:
- Wizamart → Orion rename completion
- Production DB rebuild with orion_db/orion_user
- Platform domains: wizard.lu, oms.lu, rewardflow.lu
- .dockerignore and env_file additions
- CapacitySnapshot fix
- loyaltyplus.lu → rewardflow.lu throughout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-14 20:07:23 +01:00
parent 688896d856
commit 62e418c473

View File

@@ -54,9 +54,26 @@ Complete step-by-step guide for deploying Orion on a Hetzner Cloud VPS.
**Deferred (not urgent, do when all platforms ready):** **Deferred (not urgent, do when all platforms ready):**
- [ ] DNS A + AAAA records for platform domains (`oms.lu`, `loyaltyplus.lu`) - [ ] DNS A + AAAA records for platform domains (`oms.lu`, `rewardflow.lu`)
- [ ] Uncomment platform domains in Caddyfile after DNS propagation - [ ] Uncomment platform domains in Caddyfile after DNS propagation
- [ ] Update `platforms` table `domain` column to match production domains
!!! success "Progress — 2026-02-14"
**Completed:**
- **Wizamart → Orion rename** — 1,086 occurrences replaced across 184 files (database identifiers, email addresses, domains, config, templates, docs, seed data)
- Template renamed: `homepage-wizamart.html``homepage-orion.html`
- **Production DB rebuilt from scratch** with Orion naming (`orion_db`, `orion_user`)
- Platform domains configured in seed data: wizard.lu (main), oms.lu, rewardflow.lu (loyalty)
- Docker volume explicitly named `orion_postgres_data`
- `.dockerignore` added — prevents `.env` from being baked into Docker images
- `env_file: .env` added to `docker-compose.yml` — containers load host env vars properly
- `CapacitySnapshot` model import fixed (moved from billing to monitoring in `alembic/env.py`)
- All services verified healthy at `https://api.wizard.lu/health`
**Next steps:**
- [ ] Step 17: Backups — verify Hetzner backup scope, add PostgreSQL pg_dump
- [ ] Step 18: Monitoring & observability — Prometheus, Grafana, uptime checks, alerting
## Installed Software Versions ## Installed Software Versions
@@ -386,7 +403,7 @@ docker compose --profile full exec -e PYTHONPATH=/app api python scripts/seed/se
| Data | Count | | Data | Count |
|---|---| |---|---|
| Admin users | 1 (`admin@orion.lu`) | | Admin users | 1 (`admin@wizard.lu`) |
| Platforms | 3 (OMS, Main, Loyalty+) | | Platforms | 3 (OMS, Main, Loyalty+) |
| Admin settings | 15 | | Admin settings | 15 |
| Subscription tiers | 4 (Essential, Professional, Business, Enterprise) | | Subscription tiers | 4 (Essential, Professional, Business, Enterprise) |
@@ -417,7 +434,7 @@ Before setting up Caddy, point your domain's DNS to the server.
| A | `@` | `91.99.65.229` | 300 | | A | `@` | `91.99.65.229` | 300 |
| A | `www` | `91.99.65.229` | 300 | | A | `www` | `91.99.65.229` | 300 |
### loyaltyplus.lu (Loyalty+ Platform) — TODO ### rewardflow.lu (Loyalty+ Platform) — TODO
| Type | Name | Value | TTL | | Type | Name | Value | TTL |
|---|---|---|---| |---|---|---|---|
@@ -442,7 +459,7 @@ It should match the value in the Hetzner Cloud Console (Networking tab). Then cr
| AAAA | `git` | `2a01:4f8:1c1a:b39c::1` | 300 | | AAAA | `git` | `2a01:4f8:1c1a:b39c::1` | 300 |
| AAAA | `flower` | `2a01:4f8:1c1a:b39c::1` | 300 | | AAAA | `flower` | `2a01:4f8:1c1a:b39c::1` | 300 |
Repeat for `oms.lu` and `loyaltyplus.lu`. Repeat for `oms.lu` and `rewardflow.lu`.
!!! tip "DNS propagation" !!! tip "DNS propagation"
Set TTL to 300 (5 minutes) initially. DNS changes can take up to 24 hours to propagate globally, but usually complete within 30 minutes. Verify with: `dig api.wizard.lu +short` Set TTL to 300 (5 minutes) initially. DNS changes can take up to 24 hours to propagate globally, but usually complete within 30 minutes. Verify with: `dig api.wizard.lu +short`
@@ -484,14 +501,14 @@ www.wizard.lu {
# redir https://oms.lu{uri} permanent # redir https://oms.lu{uri} permanent
# } # }
# ─── Platform 3: Loyalty+ (loyaltyplus.lu) ────────────────── # ─── Platform 3: Loyalty+ (rewardflow.lu) ──────────────────
# Uncomment after DNS is configured for loyaltyplus.lu # Uncomment after DNS is configured for rewardflow.lu
# loyaltyplus.lu { # rewardflow.lu {
# reverse_proxy localhost:8001 # reverse_proxy localhost:8001
# } # }
# #
# www.loyaltyplus.lu { # www.rewardflow.lu {
# redir https://loyaltyplus.lu{uri} permanent # redir https://rewardflow.lu{uri} permanent
# } # }
# ─── Services ─────────────────────────────────────────────── # ─── Services ───────────────────────────────────────────────
@@ -509,7 +526,7 @@ flower.wizard.lu {
``` ```
!!! info "How multi-platform routing works" !!! info "How multi-platform routing works"
All platform domains (`wizard.lu`, `oms.lu`, `loyaltyplus.lu`) point to the **same FastAPI backend** on port 8001. The `PlatformContextMiddleware` reads the `Host` header to detect which platform the request is for. Caddy preserves the Host header by default, so no extra configuration is needed. All platform domains (`wizard.lu`, `oms.lu`, `rewardflow.lu`) point to the **same FastAPI backend** on port 8001. The `PlatformContextMiddleware` reads the `Host` header to detect which platform the request is for. Caddy preserves the Host header by default, so no extra configuration is needed.
The `domain` column in the `platforms` database table must match: The `domain` column in the `platforms` database table must match:
@@ -517,7 +534,7 @@ flower.wizard.lu {
|---|---|---| |---|---|---|
| Main | `main` | `wizard.lu` | | Main | `main` | `wizard.lu` |
| OMS | `oms` | `oms.lu` | | OMS | `oms` | `oms.lu` |
| Loyalty+ | `loyalty` | `loyaltyplus.lu` | | Loyalty+ | `loyalty` | `rewardflow.lu` |
Start Caddy: Start Caddy:
@@ -574,7 +591,7 @@ When stores start using subdomains like `acme.oms.lu`, add wildcard blocks:
reverse_proxy localhost:8001 reverse_proxy localhost:8001
} }
*.loyaltyplus.lu { *.rewardflow.lu {
reverse_proxy localhost:8001 reverse_proxy localhost:8001
} }
@@ -777,7 +794,7 @@ sudo systemctl status gitea-runner
| Orion API | 8000 | 8001 | `api.wizard.lu` | | Orion API | 8000 | 8001 | `api.wizard.lu` |
| Main Platform | 8000 | 8001 | `wizard.lu` | | Main Platform | 8000 | 8001 | `wizard.lu` |
| OMS Platform | 8000 | 8001 | `oms.lu` (TODO) | | OMS Platform | 8000 | 8001 | `oms.lu` (TODO) |
| Loyalty+ Platform | 8000 | 8001 | `loyaltyplus.lu` (TODO) | | Loyalty+ Platform | 8000 | 8001 | `rewardflow.lu` (TODO) |
| PostgreSQL | 5432 | 5432 | (internal only) | | PostgreSQL | 5432 | 5432 | (internal only) |
| Redis | 6379 | 6380 | (internal only) | | Redis | 6379 | 6380 | (internal only) |
| Flower | 5555 | 5555 | `flower.wizard.lu` | | Flower | 5555 | 5555 | `flower.wizard.lu` |
@@ -914,7 +931,7 @@ After Caddy is configured:
| Gitea | `https://git.wizard.lu` | | Gitea | `https://git.wizard.lu` |
| Flower | `https://flower.wizard.lu` | | Flower | `https://flower.wizard.lu` |
| OMS Platform | `https://oms.lu` (after DNS) | | OMS Platform | `https://oms.lu` (after DNS) |
| Loyalty+ Platform | `https://loyaltyplus.lu` (after DNS) | | Loyalty+ Platform | `https://rewardflow.lu` (after DNS) |
Direct IP access (temporary, until firewall rules are removed): Direct IP access (temporary, until firewall rules are removed):