From 62e418c473f89323beb57c0735485922e0e60807 Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Sat, 14 Feb 2026 20:07:23 +0100 Subject: [PATCH] docs(deployment): add 2026-02-14 progress and update platform domains MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/deployment/hetzner-server-setup.md | 47 +++++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/docs/deployment/hetzner-server-setup.md b/docs/deployment/hetzner-server-setup.md index 8d2769c8..5b35cf61 100644 --- a/docs/deployment/hetzner-server-setup.md +++ b/docs/deployment/hetzner-server-setup.md @@ -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):** - - [ ] 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 - - [ ] 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 @@ -386,7 +403,7 @@ docker compose --profile full exec -e PYTHONPATH=/app api python scripts/seed/se | Data | Count | |---|---| -| Admin users | 1 (`admin@orion.lu`) | +| Admin users | 1 (`admin@wizard.lu`) | | Platforms | 3 (OMS, Main, Loyalty+) | | Admin settings | 15 | | 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 | `www` | `91.99.65.229` | 300 | -### loyaltyplus.lu (Loyalty+ Platform) — TODO +### rewardflow.lu (Loyalty+ Platform) — TODO | 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 | `flower` | `2a01:4f8:1c1a:b39c::1` | 300 | -Repeat for `oms.lu` and `loyaltyplus.lu`. +Repeat for `oms.lu` and `rewardflow.lu`. !!! 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` @@ -484,14 +501,14 @@ www.wizard.lu { # redir https://oms.lu{uri} permanent # } -# ─── Platform 3: Loyalty+ (loyaltyplus.lu) ────────────────── -# Uncomment after DNS is configured for loyaltyplus.lu -# loyaltyplus.lu { +# ─── Platform 3: Loyalty+ (rewardflow.lu) ────────────────── +# Uncomment after DNS is configured for rewardflow.lu +# rewardflow.lu { # reverse_proxy localhost:8001 # } # -# www.loyaltyplus.lu { -# redir https://loyaltyplus.lu{uri} permanent +# www.rewardflow.lu { +# redir https://rewardflow.lu{uri} permanent # } # ─── Services ─────────────────────────────────────────────── @@ -509,7 +526,7 @@ flower.wizard.lu { ``` !!! 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: @@ -517,7 +534,7 @@ flower.wizard.lu { |---|---|---| | Main | `main` | `wizard.lu` | | OMS | `oms` | `oms.lu` | - | Loyalty+ | `loyalty` | `loyaltyplus.lu` | + | Loyalty+ | `loyalty` | `rewardflow.lu` | Start Caddy: @@ -574,7 +591,7 @@ When stores start using subdomains like `acme.oms.lu`, add wildcard blocks: reverse_proxy localhost:8001 } -*.loyaltyplus.lu { +*.rewardflow.lu { reverse_proxy localhost:8001 } @@ -777,7 +794,7 @@ sudo systemctl status gitea-runner | Orion API | 8000 | 8001 | `api.wizard.lu` | | Main Platform | 8000 | 8001 | `wizard.lu` | | 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) | | Redis | 6379 | 6380 | (internal only) | | Flower | 5555 | 5555 | `flower.wizard.lu` | @@ -914,7 +931,7 @@ After Caddy is configured: | Gitea | `https://git.wizard.lu` | | Flower | `https://flower.wizard.lu` | | 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):