L10b Betrieb & Aufräumen: Deploy – craftvia-worker, CI-Testjob, DEPLOY.md, Certvia-Doku archiviert

- docker-compose.coolify(.prebuilt).yml: Service craftvia-worker (Target worker, Chromium,
  shm_size 1gb, gleiche Härtung), Craftvia-Variablen für app und worker.
- Dockerfile: worker-Stage mit HOME=/home/app (Chromium-Profil für non-root); lokaler
  docker build der Targets runner und worker erfolgreich, PDF-Erzeugung im Image geprüft.
- .env.example/.env.prod.example/.env.coolify.example: alle Craftvia-Variablen inkl. RLS,
  KI-Provider, PDF_CHROMIUM_PATH, OFFLINE_MAX_DAYS, API_RATE_LIMIT_*, AI_GENERATION_RETENTION_DAYS,
  AI_MONTHLY_TOKEN_LIMIT.
- CI (.github, .gitea): Job gate mit Postgres (pgvector) und Redis als Service: migrate deploy,
  seed, Passwort für craftvia_app, tsc, lint, build, npm run test.
- docs/craftvia/DEPLOY.md (aus den Certvia-Deploy-Docs abgeleitet): Architektur, Domains, Secrets,
  Worker, Migrationen, RLS-Aktivierung, Backup/Restore, KI, Rate Limits, Aufbewahrung, Smoke,
  Update/Rollback. build-and-push-images.sh baut craftvia-worker.
- Certvia-/ISMS-Dokumente aus docs/ nach docs/_certvia-archiv/ (mit README); Verweise in README.md
  und Skript-Kommentaren angepasst.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 18:19:19 +02:00
co-authored by Claude Opus 5
parent 21d6dc016a
commit cadaedc6cc
38 changed files with 902 additions and 76 deletions
+59 -7
View File
@@ -13,8 +13,50 @@ on:
branches: ["main", "dev", "dev-*"]
jobs:
build-and-check:
# Vollständiges Qualitäts-Gate (= `npm run gate`) gegen echte Infrastruktur:
# Postgres 16 mit pgvector + Redis als Service-Container. Garage/S3 wird bewusst
# weggelassen: der Storage-Adapter fällt ohne S3_* auf den Stub zurück, S3-abhängige
# Prüfungen (test-garage-storage, Byte-Abruf in test-einsatz-sync/test-berichte-pdf)
# überspringen sich. Ohne SMTP_HOST überspringt test-mail den echten Versand, ohne
# ANTHROPIC_API_KEY/TRANSCRIPTION_API_KEY die Live-KI-Tests. test-berichte-pdf
# überspringt sich, wenn im Runner-Image kein Chromium/Chrome startbar ist.
gate:
runs-on: ubuntu-latest
timeout-minutes: 60
services:
postgres:
image: pgvector/pgvector:0.8.0-pg16
env:
POSTGRES_USER: craftvia
POSTGRES_PASSWORD: craftvia
POSTGRES_DB: craftvia
options: >-
--health-cmd "pg_isready -U craftvia"
--health-interval 5s
--health-timeout 5s
--health-retries 20
redis:
image: redis:7.4.2-alpine
options: >-
--health-cmd "redis-cli ping"
--health-interval 5s
--health-timeout 5s
--health-retries 20
# Nur CI-Dummywerte (keine echten Secrets). Gitea act_runner führt den Job in einem
# Container im selben Netz wie die Services aus → Hostnamen = Service-Namen
# (postgres/redis), NICHT localhost. Läuft der Runner im Host-Modus
# (Label ubuntu-latest:host), Hosts auf localhost umstellen und ports: ergänzen.
env:
DATABASE_URL: "postgresql://craftvia:craftvia@postgres:5432/craftvia?schema=public"
# RLS-Test (scripts/test-rls-enforcement.ts): RLS_ENFORCED bleibt aus, der Test schaltet
# selbst scharf. RLS_TEST_REQUIRED=true macht aus dem Skip einen harten Fehler.
RLS_DATABASE_URL: "postgresql://craftvia_app:craftvia_app_ci@postgres:5432/craftvia?schema=public"
RLS_TEST_REQUIRED: "true"
REDIS_URL: "redis://redis:6379"
AUTH_SECRET: "ci-dummy-auth-secret-0000000000000000"
AUTH_URL: "http://localhost:3000"
APP_BASE_URL: "http://localhost:3000"
PASSWORD_PEPPER: "0000000000000000000000000000000000000000000000000000000000000abc"
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -34,11 +76,20 @@ jobs:
run: npm ci --include=optional --no-audit --no-fund
- name: Prisma Client generieren
# Platzhalter-URL nur fürs Laden von prisma.config.ts — keine echte DB-Verbindung.
env:
DATABASE_URL: "postgresql://build:build@localhost:5432/build?schema=public"
run: npx prisma generate
- name: Migrationen anwenden
run: npx prisma migrate deploy
- name: Demo-Seed
run: npx prisma db seed
# Die Baseline-Migration legt craftvia_app NOLOGIN an; das Passwort ist ein Betriebs-
# Secret und wird nie migriert. Für den RLS-Test hier ein CI-Dummy-Passwort setzen
# (über die Prisma-Config-Datasource, damit kein psql-Client im Runner nötig ist).
- name: RLS-Rolle craftvia_app mit LOGIN versehen
run: echo "ALTER ROLE craftvia_app WITH LOGIN PASSWORD 'craftvia_app_ci';" | npx prisma db execute --stdin
- name: Typprüfung (tsc --noEmit)
run: npx tsc --noEmit
@@ -46,10 +97,11 @@ jobs:
run: npm run lint
- name: Build
env:
DATABASE_URL: "postgresql://build:build@localhost:5432/build?schema=public"
run: npm run build
- name: Tests (scripts/test-*.ts)
run: npm run test
audit:
runs-on: ubuntu-latest
steps:
@@ -103,7 +155,7 @@ jobs:
# Lockfile die @swc/helpers-Inkonsistenz trägt (siehe Dockerfile / Folgeänderung
# der Dependency-Lane), bricht der Schritt mit ESBOMPROBLEMS ab — daher
# continue-on-error. Alternative ohne npm-Baum-Validierung: Syft gegen das
# gebaute Image (siehe docs/DEPLOY-PROD-CONTABO.md, Abschnitt SBOM).
# gebaute Image (siehe docs/_certvia-archiv/DEPLOY-PROD-CONTABO.md, Abschnitt SBOM).
- name: SBOM erzeugen (CycloneDX)
continue-on-error: true
run: npm sbom --sbom-format cyclonedx --omit dev > sbom.cyclonedx.json