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
| Ziel | URL | Typ | Befehl |
|---|---|---|---|
| App | aiscouncil.net | CF Pages (statisch) | scripts/deploy.sh pages |
| Staging | aiscouncil.net | CF Pages (statisch) | scripts/deploy.sh pages-staging |
| API-Worker | api.aiscouncil.net | CF Worker | scripts/deploy.sh worker |
| Auth-Worker | auth.aiscouncil.net | CF Worker | scripts/deploy.sh worker-auth |
| App Store | store.aiscouncil.net | CF Pages (statisch) | scripts/deploy.sh store |
| Alle | Alles oben | Alle | scripts/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
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
- Assemblieren Sie die App aus dem Quellcode:
./build.sh
- Deployen zur Produktion:
scripts/deploy.sh pages
Dieser Befehl:
- Erstellt ein sauberes
_deploy/-Verzeichnis - Kopiert statische Dateien via
rsync, ausgenommen Entwicklungs-Artefakte - Minifiziert
index.htmlmithtml-minifier-terser(~40% Größenreduktion) - Deployt zu Cloudflare Pages mit
--branch=main - Bereinigt
_deploy/
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
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:
- Einen neuen Cache mit dem neuen Namen erstellt
- Alle gelisteten Assets precacht
- Bei der Aktivierung alle alten Caches löscht
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
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:
| Domain | Konstante | Produktion | Staging |
|---|---|---|---|
| App | AIS.DOMAIN | aiscouncil.net | aiscouncil.net |
| Marketing | AIS.WWW | www.aiscouncil.net | www.aiscouncil.net |
| API | API_BASE | https://api.aiscouncil.net/v1 | https://api.aiscouncil.net/v1 |
| Auth | AUTH_BASE | https://auth.aiscouncil.net/v1 | https://auth.aiscouncil.net/v1 |
| Docs | AIS.DOC_BASE | https://doc.aiscouncil.net | https://doc.aiscouncil.net |
| Store | AIS.STORE_URL | https://store.aiscouncil.net | https://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:
- App builden:
./build.sh index.htmlmit einem beliebigen statischen Dateiserver bereitstellen (z.B.python3 -m http.server 8080)- Worker lokal mit Wrangler ausführen:
cd worker && npx wrangler dev
cd worker-auth && npx wrangler dev --port 8788
- 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();