Deployment (Server)
Production-Stack: Runtime-Images, Traefik HTTPS, PgBouncer mTLS. Kein docker-compose.dev.yml. Lokal entwickeln: Setup.
Einmalig
- Projektordner auf dem Server ablegen.
.envaus.env.examplemit starken Passwörtern.- QGIS-Soll:
LINETRA_PG_HOST= öffentlicher Hostname (SAN des Server-Zerts),LINETRA_PG_PORT=5432,LINETRA_PG_SSLMODE=verify-full. OptionalPGBOUNCER_TLS_HOSTgleich setzen. - Traefik:
docker-compose.override.ymlhängt HTTP(S) (frontend-prod,marketing-prod,backend,editor-updates) ans Netztraefik. Kein TCP-Entrypointlinetra-pg, kein Host-Publish von Postgres. - PKI + Start:
./scripts/pki/init-ca.sh # interne CA + PgBouncer-Serverzertifikat
./scripts/pki/issue-client-cert.sh edit # optional CLI-Cert; Kollegen: Settings → Nutzer → QGIS-Cert-ZIP
./scripts/deploy_server.sh # compose mtls+production + App-Rollen
deploy_server.sh startet Compose mit Profilen mtls und production (up -d, ohne Dev-Override) und legt die App-Rollen an. Schema von Null: Alembic — kein Dump-Restore.
docker compose exec backend uv run --no-dev alembic upgrade head
./scripts/alembic_upgrade_all.sh
Rollen später nachziehen: ./scripts/create_app_roles.sh.
Auf dem NAS-Traefik (/var/deploy/core auf diesem Host): Entrypoint linetra-pg und Publish 10.13.13.1:3401 entfernen, sonst bleibt :3401 auf wg0 offen. WireGuard-Service nicht abschalten (andere NAS-Dienste).
Web-CMS (Produktion)
Rebuild (denselben Befehl erneut):
docker compose \
-f docker-compose.yml -f docker-compose.override.yml \
-f docker-compose.pgbouncer.yml \
--profile mtls --profile production up -d --build
docker compose exec backend uv run --no-dev alembic upgrade head
./scripts/alembic_upgrade_all.sh
- App-Host:
https://linetra-web.nasarek.dev(Traefik →frontend-prod). Legacylinetra.nasarek.dev/linetra-app.nasarek.devleiten dorthin um. - Marketing-Host:
https://linetra-org.nasarek.dev(Traefik →marketing-prod, HTTP Basic Auth ausMARKETING_BASIC_AUTH_USERSbis Go-Live). - API is same-origin via Next.js rewrite
/api→backend:8000. - Set
SESSION_SECRET,COOKIE_SECURE=true,CORS_ORIGINS=https://linetra-web.nasarek.dev,https://linetra-org.nasarek.dev,NEXT_PUBLIC_APP_URL=https://linetra-web.nasarek.dev,NEXT_PUBLIC_MARKETING_URL=https://linetra-org.nasarek.dev. - Basic Auth für Org:
htpasswd -nbB preview 'secret' | sed 's/\$/$$/g'→MARKETING_BASIC_AUTH_USERSin.env.
Netzwerk
| Weg | Live? | Auth | Port |
|---|---|---|---|
FastAPI → postgres:5432 |
ja | App-User / Session, nur Compose-Netz | unpublished |
| QGIS → PgBouncer | ja | mTLS, sslmode=verify-full, CN = {slug}_edit / {slug}_read |
${PGBOUNCER_PORT:-5432} |
Traefik TCP :3401 / wg0 |
Ist, abgeschaltet | — | zu (auch auf WireGuard) |
- TLS steckt in PgBouncer. Kein Traefik-TLS auf diesem TCP-Port (libpq SSLRequest ≠ TLS ClientHello → stiller Fehlschlag). Passthrough nur, falls Traefik doch in der Kette bleibt — Standard ist Direct-Publish.
- Superuser
postgresnicht über den Proxy. - WireGuard: Hülle für andere Dienste, nicht nötig für QGIS oder die Apps.
- Lokal: Compose darf
localhost:3401weiter mappen — nicht das Server-Soll.
Abnahme: ./scripts/pki/verify-mtls.sh (mit Zertifikat Login, ohne Zertifikat Abweisung). Von außen ss/curl: 3401 geschlossen auf public und wg0.
Details: Datenbankzugang, ADR-0002, ADR-0003.
Kollegen onboarden
Nur Linetra Editor (GIS über die API): Konto im Dashboard (Settings → Nutzer, Rolle editor oder admin). Kein Client-Zertifikat. Anleitung: Linetra Editor nutzen.
QGIS direkt an die Live-DB:
- Zertifikatspaket: Einstellungen → Nutzer → QGIS-Cert-ZIP (nach
./scripts/pki/init-ca.sh). Alternativ CLI./scripts/pki/issue-client-cert.sh edit <gerätename>pluspgbouncer/certs/ca.crt. - QGIS-Werte: Host =
LINETRA_PG_HOST, Port5432, DBlinetra_<slug>, User{slug}_edit(gleich CN), SSL verify-full, Zertifikat + Schlüssel + CA. Nach API-Login liefert/auth/medasselbe Profil. Erstmalige Datenübernahme: Mandanten-Migration. - Optional: Projektdatei
qgis/linetra_stammdaten.qgz. - WireGuard nur, wenn andere NAS-Dienste das verlangen — nicht für diese Verbindung.
Siehe Benutzerhandbuch: QGIS-Verbindung.
Editor-Desktop aktualisieren
Signierte Bundles und latest.json liegen unter https://linetra-web.nasarek.dev/editor-updates/ (nginx-Service editor-updates, Dateien in editor-updates/files/; Legacy-Host bleibt während der Umstellung erreichbar). Ablauf: Editor-Updates, ADR-0018.