Zum Hauptinhalt springen

Deployment

AISCouncil wird als statische Dateien auf Cloudflare Pages deployt, mit API-Logik, die auf Cloudflare Workers läuft. Ein einheitliches Deploy-Skript handhabt alle Ziele.

Deployment-Ziele

ZielURLTypBefehl
Appaiscouncil.netCF Pages (statisch)scripts/deploy.sh pages
Stagingaiscouncil.netCF Pages (statisch)scripts/deploy.sh pages-staging
API-Workerapi.aiscouncil.netCF Workerscripts/deploy.sh worker
Auth-Workerauth.aiscouncil.netCF Workerscripts/deploy.sh worker-auth
App Storestore.aiscouncil.netCF Pages (statisch)scripts/deploy.sh store
AlleAlles obenAllescripts/deploy.sh all

Umgebungsvariablen

Exportieren Sie diese in ~/.bashrc (niemals committen):

export CF_ACCOUNT_ID_AISCOUNCIL="ihre-cloudflare-account-id"
export CF_PAGES_TOKEN_AISCOUNCIL="ihr-pages-api-token"
export CF_WORKER_TOKEN_AISCOUNCIL="ihr-worker-api-token"

Optionale Overrides:

export CF_PAGES_PROJECT_AISCOUNCIL="aiscouncil"              # Standard
export CF_PAGES_PROJECT_AISCOUNCIL_STAGING="aiscouncil-staging" # Standard
Warnung

Diese Tokens gewähren Deploy-Zugriff auf Ihr Cloudflare-Konto. Committen Sie sie niemals in das Repository. Das Deploy-Skript wird mit einem Fehler beenden, wenn erforderliche Variablen fehlen.

Pages-Deployment (Produktion)

Schritt-für-Schritt

  1. Assemblieren Sie die App aus dem Quellcode:
./build.sh
  1. Deployen zur Produktion:
scripts/deploy.sh pages

Dieser Befehl:

  • Erstellt ein sauberes _deploy/-Verzeichnis
  • Kopiert statische Dateien via rsync, ausgenommen Entwicklungs-Artefakte
  • Minifiziert index.html mit html-minifier-terser (~40% Größenreduktion)
  • Deployt zu Cloudflare Pages mit --branch=main
  • Bereinigt _deploy/
Info

Produktions-Deploys verwenden immer --branch=main. Dies ist erforderlich, damit CF Pages auf der Produktions-Domain (aiscouncil.net) bereitstellt.

Was deployt wird

Der rsync-Schritt schließt alles aus, was kein Browser-Facing-Asset ist:

Ausgeschlossene Verzeichnisse: src/, tools/, kernel/, serve/, worker/, worker-auth/, doc.aiscouncil.net/, node_modules/, .git/, .github/, .carl/, .claude/, modules/, scripts/, core-types/, bridge/, i18n/, dist/, build/

Ausgeschlossene Dateitypen: *.py, *.zig, *.zon, *.md, *.sh, *.css, .env*

Ausgeschlossene Konfigurationsdateien: package.json, package-lock.json, vitest.config.*, tsconfig.json, .cfignore, .gitignore

Was bleibt, sind die Produktions-Assets: index.html, sw.js, Icons, manifest.webmanifest, registry/-JSON-Dateien, sdk/, ads.json, sitemap.xml und alle Mini-Programm- oder App-Verzeichnisse.

Minifizierung

Produktions-Deploys leiten index.html durch html-minifier-terser mit diesen Optionen:

  • Whitespace kollabieren
  • Kommentare entfernen
  • Redundante Attribute entfernen
  • Boolesche Attribute kollabieren
  • Inline-CSS minifizieren
  • Inline-JavaScript minifizieren

Typische Größenreduktion ist ~40% (z.B. 980 KB auf ~580 KB).

Staging-Deployment

Deployen Sie in die Staging-Umgebung ohne Minifizierung:

scripts/deploy.sh pages-staging

Staging wird von aiscouncil.net bereitgestellt. Die App erkennt ihre Domain zur Laufzeit automatisch und passt API-URLs, Cookie-Domains und Cross-Origin-Referenzen entsprechend an.

Staging zu Produktion promoten

Nach der Validierung auf Staging, promoten Sie denselben Build zur Produktion:

scripts/deploy.sh promote

Dies deployt den aktuellen Code zum Produktions-Pages-Projekt mit aktivierter Minifizierung. Der App-Code ist identisch – nur die Domain ändert sich.

Worker-Deployment

API-Worker

scripts/deploy.sh worker

Dies führt npx wrangler deploy im worker/-Verzeichnis aus, unter Verwendung der Account-ID und des Worker-Tokens aus Ihrer Umgebung.

Auth-Worker

scripts/deploy.sh worker-auth

Derselbe Prozess für das worker-auth/-Verzeichnis.

Worker-Secrets

Worker erfordern Secrets, die separat von Code-Deploys gesetzt werden. Verwenden Sie wrangler secret put aus dem Worker-Verzeichnis:

cd worker
npx wrangler secret put JWT_SECRET
npx wrangler secret put STRIPE_SECRET_KEY
npx wrangler secret put STRIPE_WEBHOOK_SECRET
npx wrangler secret put WEBHOOK_PATH_SECRET
cd worker-auth
npx wrangler secret put JWT_SECRET
npx wrangler secret put GOOGLE_CLIENT_SECRET
npx wrangler secret put APPLE_CLIENT_SECRET
npx wrangler secret put GITHUB_CLIENT_SECRET
Tipp

Secrets persistieren über Deploys hinweg. Sie müssen sie nur einmal setzen, oder beim Rotieren von Credentials.

Worker-Konfiguration

Jeder Worker hat eine wrangler.toml, die definiert:

  • Worker-Name und -Routen
  • KV-Namespace-Bindings
  • Umgebungsvariablen-Referenzen
  • Kompatibilitätseinstellungen

Service Worker Cache

Der clientseitige Service Worker (sw.js) verwendet einen versionierten Cache:

const CACHE = "ais-v1.0.0";

Wann die Cache-Version erhöht werden sollte:

  • Breaking Changes am App-Shell (HTML-Struktur, kritisches CSS)
  • Änderungen an vorgecachten Assets (Icons, Manifest)
  • Major-Version-Releases

Das Erhöhen der Version bewirkt, dass der Service Worker:

  1. Einen neuen Cache mit dem neuen Namen erstellt
  2. Alle gelisteten Assets precacht
  3. Bei der Aktivierung alle alten Caches löscht
Warnung

Wenn Sie vergessen, die Cache-Version nach Breaking Changes zu erhöhen, sehen Benutzer veralteten Inhalt, bis sie manuell ihren Browser-Cache leeren oder der alte Service Worker abläuft.

Alles deployen

Deployen Sie die Pages-App, API-Worker und Auth-Worker nacheinander:

scripts/deploy.sh all

Post-Deploy-Verifizierung

Nach dem Deployen, verifizieren Sie, dass die App korrekt bereitgestellt wird:

# Produktion prüfen
curl -s https://aiscouncil.net/ | head -5

# API-Health prüfen
curl -s https://api.aiscouncil.net/health

# Auth-Health prüfen
curl -s https://auth.aiscouncil.net/health
Info

Cloudflare Pages invalidiert seinen CDN-Cache beim Deploy automatisch, aber die Propagation kann global 1-2 Minuten dauern. Wenn Sie veralteten Inhalt sehen, warten Sie kurz und versuchen Sie es erneut.

Domain-Architektur

Die App verwendet Domain-Erkennung zur Laufzeit, um sowohl Produktion als auch Staging zu unterstützen:

DomainKonstanteProduktionStaging
AppAIS.DOMAINaiscouncil.netaiscouncil.net
MarketingAIS.WWWwww.aiscouncil.netwww.aiscouncil.net
APIAPI_BASEhttps://api.aiscouncil.net/v1https://api.aiscouncil.net/v1
AuthAUTH_BASEhttps://auth.aiscouncil.net/v1https://auth.aiscouncil.net/v1
DocsAIS.DOC_BASEhttps://doc.aiscouncil.nethttps://doc.aiscouncil.net
StoreAIS.STORE_URLhttps://store.aiscouncil.nethttps://store.aiscouncil.net

API-Basis-URLs können auch über localStorage für lokale Entwicklung überschrieben werden:

localStorage.setItem("ais-api-base", "http://localhost:8787/v1");
localStorage.setItem("ais-auth-base", "http://localhost:8788/v1");

Lokale Entwicklung

Für lokale Entwicklung ohne Deployen:

  1. App builden: ./build.sh
  2. index.html mit einem beliebigen statischen Dateiserver bereitstellen (z.B. python3 -m http.server 8080)
  3. Worker lokal mit Wrangler ausführen:
cd worker && npx wrangler dev
cd worker-auth && npx wrangler dev --port 8788
  1. API-Basis-URLs in der Browser-Konsole überschreiben:
localStorage.setItem("ais-api-base", "http://localhost:8787/v1");
localStorage.setItem("ais-auth-base", "http://localhost:8788/v1");
location.reload();