Skip to content

Deployment (Server)

Production-Stack: Runtime-Images, Traefik HTTPS, PgBouncer mTLS. Kein docker-compose.dev.yml. Lokal entwickeln: Setup.

Einmalig

  1. Projektordner auf dem Server ablegen.
  2. .env aus .env.example mit starken Passwörtern.
  3. QGIS-Soll: LINETRA_PG_HOST = öffentlicher Hostname (SAN des Server-Zerts), LINETRA_PG_PORT=5432, LINETRA_PG_SSLMODE=verify-full. Optional PGBOUNCER_TLS_HOST gleich setzen.
  4. Traefik: docker-compose.override.yml hängt HTTP(S) (frontend-prod, marketing-prod, backend, editor-updates) ans Netz traefik. Kein TCP-Entrypoint linetra-pg, kein Host-Publish von Postgres.
  5. 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). Legacy linetra.nasarek.dev / linetra-app.nasarek.dev leiten dorthin um.
  • Marketing-Host: https://linetra-org.nasarek.dev (Traefik → marketing-prod, HTTP Basic Auth aus MARKETING_BASIC_AUTH_USERS bis Go-Live).
  • API is same-origin via Next.js rewrite /apibackend: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_USERS in .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 postgres nicht über den Proxy.
  • WireGuard: Hülle für andere Dienste, nicht nötig für QGIS oder die Apps.
  • Lokal: Compose darf localhost:3401 weiter 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:

  1. Zertifikatspaket: Einstellungen → Nutzer → QGIS-Cert-ZIP (nach ./scripts/pki/init-ca.sh). Alternativ CLI ./scripts/pki/issue-client-cert.sh edit <gerätename> plus pgbouncer/certs/ca.crt.
  2. QGIS-Werte: Host = LINETRA_PG_HOST, Port 5432, DB linetra_<slug>, User {slug}_edit (gleich CN), SSL verify-full, Zertifikat + Schlüssel + CA. Nach API-Login liefert /auth/me dasselbe Profil. Erstmalige Datenübernahme: Mandanten-Migration.
  3. Optional: Projektdatei qgis/linetra_stammdaten.qgz.
  4. 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.