Analytodon ist Open Source unter GPL-3.0. Sie können Ihre eigene Instanz betreiben und behalten die volle Kontrolle über Ihre Daten und Infrastruktur.
Analytodon besteht aus folgenden Komponenten:
Ein Reverse Proxy (Caddy, nginx oder Traefik) wird in der Produktion benötigt – nur das Frontend muss öffentlich erreichbar sein.
Analytodon benötigt drei kryptografische Secrets. Generieren Sie diese
direkt in eine .env-Datei, bevor Sie fortfahren – so
gelangen die Werte nicht in Ihre Zwischenablage oder Terminal-Historie:
# AES-256 Encryption Key (64-stellig, hex) – schützt OAuth-Tokens
echo "ENCRYPTION_KEY=$(openssl rand -hex 32)" >> .env
# JWT Secret – signiert Access-Tokens
echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env
# Session Secret – Frontend-Session-Cookies
echo "SESSION_SECRET=$(openssl rand -base64 48)" >> .env
ENCRYPTION_KEY verschlüsselt
gespeicherte Mastodon-OAuth-Tokens. Er kann nach der Ersteinrichtung
nicht mehr geändert werden, ohne den Zugriff auf alle verbundenen
Mastodon-Konten zu verlieren. Bewahren Sie ihn sicher auf. Der gleiche
Schlüssel muss sowohl vom Backend als auch vom CLI-Service verwendet
werden.
Erstellen Sie eine docker-compose.yml mit folgender
Konfiguration:
services:
backend:
image: ghcr.io/blazer82/analytodon-backend:latest
environment:
- JWT_SECRET=${JWT_SECRET}
- JWT_EXPIRES_IN=1h
- JWT_REFRESH_TOKEN_EXPIRES_IN=7d
- DB_CLIENT_URL=mongodb://mongo:27017/analytodon
- MASTODON_APP_NAME=Analytodon
- FRONTEND_URL=https://ihre-domain.de
- MARKETING_URL=https://ihre-domain.de
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
depends_on:
- mongo
restart: unless-stopped
frontend:
image: ghcr.io/blazer82/analytodon-frontend:latest
ports:
- "127.0.0.1:3002:3002"
environment:
- API_URL=http://backend:3000
- SESSION_SECRET=${SESSION_SECRET}
- MARKETING_URL=https://ihre-domain.de
depends_on:
- backend
restart: unless-stopped
cli:
image: ghcr.io/blazer82/analytodon-cli:latest
environment:
- MONGODB_URI=mongodb://mongo:27017
- MONGODB_DATABASE=analytodon
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- APP_URL=https://ihre-domain.de
depends_on:
- mongo
restart: unless-stopped
mongo:
image: mongo:8
volumes:
- mongo-data:/data/db
restart: unless-stopped
volumes:
mongo-data:
Die Compose-Datei liest diese Secrets aus der zuvor erzeugten
.env-Datei (siehe Abschnitt „Umgebungsdatei“ weiter unten).
Der Schritt „Secrets generieren“ hat Ihre drei Secrets bereits in eine
.env-Datei geschrieben. Belassen Sie sie im selben
Verzeichnis wie Ihre docker-compose.yml – Docker Compose
liest die Variablen automatisch daraus und setzt sie für die
${...}-Platzhalter in der Compose-Datei ein. Die Datei
sieht so aus:
# Generierte Secrets (siehe Secrets generieren)
ENCRYPTION_KEY=ihr-64-stelliger-hex-schluessel
JWT_SECRET=ihr-jwt-secret
SESSION_SECRET=ihr-session-secret
Für E-Mail-Berichte und weitere Konfigurationsoptionen lesen Sie die Umgebungsvariablen-Referenz weiter unten.
Nur das Frontend (Port 3002) muss öffentlich erreichbar sein. Backend und CLI kommunizieren intern über das Docker-Netzwerk.
Beispiel-Konfiguration für Caddy:
ihre-domain.de {
reverse_proxy localhost:3002
}
Bei Verwendung von nginx oder Traefik leiten Sie den gesamten Traffic an Port 3002 weiter.
Starten Sie alle Dienste:
docker compose up -d
Öffnen Sie https://ihre-domain.de in Ihrem Browser. Sie
sollten die Analytodon-Anmeldeseite sehen. Registrieren Sie Ihr erstes
Konto und verbinden Sie es mit Ihrer Mastodon-Instanz.
Die folgenden Tabellen listen die wichtigsten Konfigurationsoptionen für jeden Dienst auf.
| Variable | Beschreibung | Erforderlich |
|---|---|---|
JWT_SECRET |
Secret zum Signieren von Access-Tokens | Ja |
JWT_EXPIRES_IN |
Gültigkeitsdauer des Access-Tokens (Standard: 1h) | Nein |
JWT_REFRESH_TOKEN_EXPIRES_IN |
Gültigkeitsdauer des Refresh-Tokens (Standard: 7d) | Nein |
DB_CLIENT_URL |
MongoDB-Verbindungszeichenfolge | Ja |
MASTODON_APP_NAME |
Name bei der OAuth-Autorisierung (Standard: Analytodon) | Nein |
FRONTEND_URL |
Öffentliche URL des Frontends | Ja |
MARKETING_URL |
URL der Marketing-Website | Nein |
ENCRYPTION_KEY |
64-stelliger Hex-Schlüssel für OAuth-Token-Verschlüsselung | Ja |
EMAIL_HOST |
SMTP-Server-Hostname | Nein |
EMAIL_PORT |
SMTP-Server-Port | Nein |
EMAIL_USER |
SMTP-Benutzername | Nein |
EMAIL_PASS |
SMTP-Passwort | Nein |
EMAIL_SECURE |
TLS für SMTP verwenden (true/false) | Nein |
EMAIL_FROM_NAME |
Absendername für E-Mails | Nein |
EMAIL_FROM_ADDRESS |
Absenderadresse für E-Mails | Nein |
EMAIL_API_KEY |
API-Schlüssel für E-Mail-Dienst | Nein |
DISABLE_NEW_REGISTRATIONS |
Neue Registrierungen blockieren (Standard: false) | Nein |
DISABLE_EMAIL_VERIFICATION |
Neue Registrierungen automatisch verifizieren – sinnvoll beim Betrieb ohne SMTP (Standard: false) | Nein |
EMAIL_HOST leer und setzen Sie
DISABLE_EMAIL_VERIFICATION auf true – E-Mails
werden dann protokolliert statt versendet, und neue Registrierungen
werden automatisch verifiziert, sodass sie nicht auf dem
Verifizierungsbildschirm hängen bleiben. EMAIL_USER/EMAIL_PASS
werden nur verwendet, wenn beide gesetzt sind – Relays, die nicht
authentifizierte Absender akzeptieren, funktionieren auch ohne sie.
| Variable | Beschreibung | Erforderlich |
|---|---|---|
API_URL |
Interne Backend-URL (z.B. http://backend:3000) | Ja |
SESSION_SECRET |
Secret für Session-Cookies | Ja |
MARKETING_URL |
URL der Marketing-Website | Nein |
SUPPORT_EMAIL |
Kontakt-E-Mail für Support | Nein |
DISABLE_NEW_REGISTRATIONS |
Neue Registrierungen blockieren (Standard: false) | Nein |
| Variable | Beschreibung | Erforderlich |
|---|---|---|
MONGODB_URI |
MongoDB-Verbindungszeichenfolge | Ja |
MONGODB_DATABASE |
Datenbankname | Ja |
ENCRYPTION_KEY |
Muss mit dem Schlüssel des Backends übereinstimmen | Ja |
APP_URL |
Öffentliche URL der Anwendung | Ja |
EMAIL_API_KEY |
API-Schlüssel für E-Mail-Dienst | Nein |
LOG_LEVEL |
Protokollierungsstufe (Standard: info) | Nein |
Die vollständige und aktuellste Liste der Umgebungsvariablen finden Sie in der README im GitHub-Repository.