Stack : Next.js (frontend) + FastAPI (backend) + Celery worker + PostgreSQL + MinIO + Traefik + Collabora. Tourne en dev sur le PC 192.168.1.32:9443 (HTTPS auto-signé). Accès de travail = https://localhost:9443.
NEXT_PUBLIC_API_BASE est inliné au build du frontend (Dockerfile.dev). Le volume nommé frontend_next persiste le build → changer l'API base nécessite un rebuild (scripts/rebuild-frontend-dev.ps1, npm run build:clean), un simple restart ne suffit pas.Host(localhost)||Host(127.0.0.1) (frontend, /api, collabora, minio). L'override docker-compose.public.yml ajoute les routers Host(${PUBLIC_DOMAIN}) + grave l'API sur le domaine public. Ne jamais builder le dev avec -f docker-compose.public.yml.app_url (champ licence) existe déjà dans le code (modèle core.py, schémas routers_licence.py, UI /admin/licence, migration 20260601_120000) → sert aux liens absolus (emails/rapports), ne change pas l'API base.aatools.aadw.luRelais temporaire : Caddy VPS → tunnel 10.8.0.2:19443 (socat QNAP aatools-proxy) → PC. Mis de côté (404 attendu en dev car Traefik ne route que localhost). À reprendre au déploiement prod.
Décidé : AATools 100 % sur le QNAP, VPS = passthrough TCP/SNI pur (« rien sur le VPS sauf le lien »). Justif : upload maison 1 Gb symétrique → latence non-sujet.
aatools.aadw.lu en DNS-01 OVH.mode tcp :443 split SNI → aatools.aadw.lu forward brut vers 10.8.0.2:443 (TLS bout-en-bout) ; autres SNI → Caddy en loopback 127.0.0.1:8443.NEXT_PUBLIC_API_BASE=/api (relatif) → une origine, zéro CORS.