Self-Hosting
AISCouncil ist eine einzelne, in sich geschlossene HTML-Datei. Sie können sie auf jedem statischen Dateiserver hosten, von einem USB-Stick ausführen oder sogar direkt aus Ihrem Dateisystem öffnen. Kein Backend, keine Datenbank, keine Laufzeit – nur eine Datei.
Die einfachste Methode
Laden Sie index.html herunter und öffnen Sie sie in einem Browser:
# Das war's. Datei öffnen.
open index.html # macOS
xdg-open index.html # Linux
start index.html # Windows
Die App funktioniert sofort über das file://-Protokoll. Alle Funktionen, die kein HTTPS erfordern (alles außer PWA-Installation und Zwischenablage-API), funktionieren normal.
Für das volle Erlebnis einschließlich PWA-Installation und Zwischenablagezugriff stellen Sie die Datei über HTTPS mit einem beliebigen statischen Dateiserver bereit.
Statischer Dateiserver
Auf einen beliebigen Webserver hochladen. Keine serverseitige Konfiguration nötig.
Python (schnelles lokales Testen)
python3 -m http.server 8000
# Öffne http://localhost:8000
Caddy (HTTPS mit automatischen Zertifikaten)
caddy file-server --root /path/to/aiscouncil --listen :8080
Nginx
server {
listen 443 ssl;
server_name aiscouncil.example.com;
ssl_certificate /etc/ssl/certs/example.com.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;
root /var/www/aiscouncil;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
Cloud-Hosting
Die App funktioniert auf jeder statischen Hosting-Plattform ohne Konfiguration:
| Plattform | Deploy-Methode |
|---|---|
| Cloudflare Pages | Git-Repo verbinden oder Drag-and-Drop |
| Netlify | Git-Repo verbinden oder Drag-and-Drop |
| Vercel | Git-Repo verbinden oder vercel deploy |
| GitHub Pages | Auf gh-pages-Branch pushen |
| AWS S3 + CloudFront | Dateien auf S3 hochladen, über CloudFront bereitstellen |
| Firebase Hosting | firebase deploy |
Empfohlene Dateien zum Deployen
Während nur index.html strikt erforderlich ist, ermöglicht das Deployen dieser zusätzlichen Dateien PWA-Funktionen:
your-server/
index.html # Die vollständige Anwendung (erforderlich)
sw.js # Service Worker für Offline-Unterstützung
manifest.webmanifest # PWA-Manifest (Name, Icons, Theme)
icon.svg # Vektor-Icon
icon-192.png # Android-Home-Screen-Icon
icon-512.png # Splash-Screen / Maskable-Icon
favicon.ico # Browser-Tab-Icon
Optionale Ergänzungen:
s/
index.html # Web-Editor (falls Sie auch den Editor möchten)
registry/
models.json # Lokale Modell-Registry (für Offline-Modelldaten)
ads.json # Werbekonfiguration (nur bei Nutzung des Free-Tier-Werbungssystems)
Docker-Deployment
Ein minimales Docker-Deployment mit Nginx:
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
COPY sw.js /usr/share/nginx/html/
COPY manifest.webmanifest /usr/share/nginx/html/
COPY icon.svg /usr/share/nginx/html/
COPY icon-192.png /usr/share/nginx/html/
COPY icon-512.png /usr/share/nginx/html/
COPY favicon.ico /usr/share/nginx/html/
EXPOSE 80
Build und Ausführung:
docker build -t aiscouncil .
docker run -d -p 8080:80 aiscouncil
# Öffne http://localhost:8080
Für HTTPS mit Docker verwenden Sie einen Reverse Proxy wie Traefik oder Caddy vor dem Nginx-Container.
Was lokal läuft
Alles. Die HTML-Datei enthält alles CSS, JavaScript und Modul-Code inline. Wenn ein Benutzer die Seite öffnet:
- Wird die UI vollständig clientseitig gerendert
- Werden API-Schlüssel im Browser des Benutzers gespeichert (
localStorage) - Werden Chat-Verlauf und Bot-Konfigs im Browser des Benutzers gespeichert (IndexedDB)
- Gehen LLM-API-Aufrufe direkt vom Browser zum Anbieter (Anthropic, OpenAI, xAI, etc.)
- Über Ihren Server gehen keine Daten
Ihr Server stellt eine statische Datei bereit. Das ist seine einzige Aufgabe.
Gast-Modus
Wenn auf einer benutzerdefinierten Domain gehostet (nicht aiscouncil.net), arbeitet die App im Gast-Modus:
- Keine Google-Anmeldung erforderlich – das Login-Gate wird übersprungen
- Alle Funktionen funktionieren ohne Authentifizierung
- Benutzer gelangen direkt zur Chat-Oberfläche
- Einstellungen, Speicher und alle Funktionen sind voll funktionsfähig
Der Gast-Modus wird automatisch aktiviert, wenn die App erkennt, dass sie auf localhost, einer .pages.dev-Domain oder einer anderen Domain als aiscouncil.net läuft. Keine Konfiguration nötig.
Benutzerdefinierte API-Base
Standardmäßig sendet die App Auth-, Billing- und Usage-Tracking-Anfragen an https://api.aiscouncil.net/v1. Für selbst gehostete Deployments können Sie dies überschreiben:
localStorage.setItem("ais-api-base", "https://your-api.example.com/v1");
Dies ist optional. Wenn Sie die verwalteten Billing/Auth-Funktionen nicht nutzen, funktioniert die App ohne jegliche API-Base – alle LLM-Aufrufe gehen direkt vom Browser zum Anbieter.
Lokaler Proxy (aiscouncil-serve)
Wenn Sie API-Schlüssel im Browser nicht anzeigen möchten (z.B. in einer gemeinsamen Büroumgebung), können Sie den aiscouncil-serve lokalen Proxy ausführen:
ANTHROPIC_API_KEY=sk-ant-... \
OPENAI_API_KEY=sk-... \
XAI_API_KEY=xai-... \
./aiscouncil-serve --port 8741
Der Proxy leitet Anfragen nach Modell-Präfix an den korrekten Anbieter weiter:
| Modell-Präfix | Anbieter | Auth |
|---|---|---|
claude-* | Anthropic | x-api-key-Header |
gpt-*, o1*, o3* | OpenAI | Bearer-Token |
grok-* | xAI | Bearer-Token |
meta-llama/, deepseek/, qwen/, mistralai/, google/ | OpenRouter | Bearer-Token |
| Alles andere | Ollama (localhost) | Keine |
Der Proxy unterstützt auch den X-Provider-Header, um einen bestimmten Anbieter unabhängig vom Modell-Präfix zu erzwingen.
Aus dem Quellcode builden:
cd serve
../tools/zig/zig build -Doptimize=ReleaseSmall
# Binary unter: zig-out/bin/aiscouncil-serve (~2,3 MB)
Offline-Deployment
Für Air-gapped-Umgebungen:
- Deployen Sie die Dateien auf einen internen Webserver
- Beim ersten Besuch cacht der Service Worker alles
- Nach dem Caching funktioniert die App ohne jeglichen Netzwerkzugriff
- Benutzer können mit Ollama oder jedem lokalen LLM im selben Netzwerk chatten
Laden Sie die Modell-Registry vor, indem Sie registry/models.json neben index.html platzieren. Die App prüft auf eine lokale Kopie, bevor sie versucht, von GitHub zu fetchen.
CORS-Überlegungen
Bei Verwendung lokaler Inferenz-Server (Ollama, vLLM, etc.) erzwingt der Browser CORS (Cross-Origin Resource Sharing). Ihr Inferenz-Server muss Anfragen von Ihrer Hosting-Origin zulassen.
Ollama:
# Vor dem Starten von Ollama setzen
OLLAMA_ORIGINS=* ollama serve
vLLM:
vllm serve model-name --allowed-origins '*'
Allgemein (jeder Server hinter Nginx):
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Allow-Methods' 'POST, OPTIONS' always;
Die Verwendung von * für Access-Control-Allow-Origin ist für lokale Entwicklung in Ordnung, sollte aber in Produktions-Deployments auf Ihre spezifische Origin beschränkt werden.
Aus dem Quellcode builden
Um die App zu modifizieren und neu zu builden:
# Repository klonen
git clone https://github.com/nicholasgasior/aiscouncil.net.git
cd aiscouncil.net
# Quelldateien in src/ bearbeiten (NICHT direkt index.html)
# Die App ist in ~35 Quelldateien aufgeteilt, die konkateniert werden
# Single-File-Output builden
./build.sh
# Verify build matches
./build.sh --check
Der Build-Prozess konkateniert alle src/-Dateien in der Reihenfolge in eine einzelne index.html. Kein Bundler, kein Transpiler, kein npm – nur Shell-Konkatenation.
Web-Editor
Um auch den Web-Editor zu hosten, fügen Sie das s/-Verzeichnis hinzu:
your-server/
index.html # Bot-Plattform
s/
index.html # Web-Editor (aiscouncil.net/s/)
Der Editor verwendet denselben Kompressions-Codec, aber mit Versions-Präfix A statt B. Es ist eine separate, in sich geschlossene HTML-Datei mit eigenem Funktionsumfang (WYSIWYG-Editierung, Multi-Format-Unterstützung, Kompressionsalgorithmen).
Daten-Portabilität
Benutzer können alle ihre Daten über Einstellungen > Datenschutz > Alle Daten exportieren exportieren. Der Export ist eine JSON-Datei mit allen Bot-Profilen, Chat-Verläufen und Einstellungen. API-Schlüssel sind von Exporten ausgeschlossen. Der Export kann in jede andere AISCouncil-Instanz importiert werden.
Das bedeutet, dass Benutzer nie an ein bestimmtes Deployment gebunden sind. Sie können jederzeit zwischen selbst gehosteten Instanzen, der offiziellen Seite oder jedem anderen Host wechseln.