Docker Compose
Passbox, PostgreSQL und Caddy mit automatischem HTTPS.
PostgreSQL
Getrennte Rollen, Row-Level Security, verschlüsselte Sicherungen.
MIT-Lizenz
Alle Funktionen, kostenlos, für beliebig viele Mitglieder.
Schnellstart
Klonen Sie das Repository, tragen Sie die Einstellungen ein und starten Sie alles mit Docker Compose:
$ git clone https://github.com/passboxnet/passbox$ cd passbox/deploy/compose$ cp .env.example .env # then fill in every value$ docker compose up -dSetzen Sie vor dem ersten Start in .env die Werte PASSBOX_DOMAIN, ACME_EMAIL, die vier Datenbank-Passwörter (openssl rand -hex 32) und den öffentlichen Sicherungsschlüssel BACKUP_AGE_RECIPIENT. Caddy besorgt dann das Zertifikat, der Dienst migrate richtet die Datenbank ein, und der Tresor ist unter Ihrer Domain erreichbar. Legen Sie zuerst Ihr Konto an; es wird Instanz-Administrator.
services: postgres: image: docker.io/library/postgres:17.10-bookworm volumes: - postgres-data:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d:ro networks: [backend] # One-shot: applies database migrations, then exits. migrate: image: ${PASSBOX_IMAGE:-ghcr.io/passboxnet/server:latest} command: ["migrate"] depends_on: postgres: condition: service_healthy networks: [backend] passbox: image: ${PASSBOX_IMAGE:-ghcr.io/passboxnet/server:latest} environment: PASSBOX_DATABASE_URL: postgres://passbox_app:…@postgres:5432/passbox PASSBOX_MIGRATION_DATABASE_URL: postgres://passbox_migrator:…@postgres:5432/passbox PASSBOX_WORKER_DATABASE_URL: postgres://passbox_worker:…@postgres:5432/passbox PASSBOX_PUBLIC_URL: https://${PASSBOX_DOMAIN:?set in .env} depends_on: migrate: condition: service_completed_successfully networks: [backend, frontend] caddy: image: docker.io/library/caddy:2.11.6-alpine ports: - "80:80" - "443:443" - "443:443/udp" networks: [frontend] # Encrypted backups: pg_dump of the database and a tar of the attachment # blobs, encrypted with age to BACKUP_AGE_RECIPIENT. backup: build: ./backup environment: BACKUP_AGE_RECIPIENT: ${BACKUP_AGE_RECIPIENT:?set in .env} networks: [backend]networks: # No route to the internet: only Passbox, migrations and backups reach the # database. backend: internal: true frontend: {}Sichern Sie ab dem ersten Tag
Voraussetzungen
- Ein Linux-Rechner mit Docker Engine 24 oder neuer und Compose v2 (amd64 oder arm64)
- 1 vCPU und 2 GB Arbeitsspeicher für einige hundert Nutzer
- Ein Domainname, dessen DNS-Einträge auf den Rechner zeigen, mit erreichbaren Ports 80 und 443
- Optional: ein SMTP-Server für Einladungen und Sicherheitshinweise
HTTPS
Browser erlauben die Kryptografie- und Zwischenablage-Funktionen, die Passbox braucht, nur über HTTPS (oder localhost). In der Docker-Compose-Installation besorgt und erneuert Caddy das Zertifikat automatisch. Wenn Sie das Image allein betreiben, setzen Sie einen eigenen Reverse Proxy mit TLS davor. Der Server sendet selbst strenge Sicherheits-Header und begrenzt Anmeldeversuche.
Verwaltung
Das erste Konto auf einem neuen Server wird dessen Instanz-Administrator. Legen Sie Ihr Konto direkt nach dem Start an. Konten in PASSBOX_ADMIN_EMAILS sind ebenfalls Administratoren. Die Verwaltung finden Administratoren in der Seitenleiste des Web-Tresors.
- Server benennen, Hilfeadresse und Sprache der E-Mails festlegen
- Festlegen, wer ein Konto erstellen darf, und stärkere Master-Passwörter verlangen
- Personen einladen, Konten mit letzter Aktivität sehen, Konten deaktivieren
- Das Verwaltungsprotokoll lesen, geschützt durch eine Hash-Kette
| Modus | Wer ein Konto erstellen darf |
|---|---|
open | Alle, die den Server erreichen (Standard) |
invite_only | Nur Personen mit Einladung |
domains | E-Mail-Adressen der erlaubten Domains, dazu eingeladene Personen |
Passbox verschickt Einladungen und Sicherheitshinweise, etwa zu Anmeldungen von neuen Geräten und Wiederherstellungsanfragen, auf Deutsch oder Englisch. Setzen Sie PASSBOX_SMTP_URL, PASSBOX_MAIL_FROM und PASSBOX_PUBLIC_URL; ohne sie werden E-Mails ins Log geschrieben. E-Mails laufen über eine Warteschlange in der Datenbank und werden erneut versucht.
PASSBOX_SMTP_URL='smtps://passbox%40example.com:app-password@smtp.example.com:465'PASSBOX_MAIL_FROM='Passbox <passbox@example.com>'PASSBOX_PUBLIC_URL='https://passbox.example.com'Konfiguration
Jede Option lässt sich als Kommandozeilen-Flag oder Umgebungsvariable setzen. In der Docker-Compose-Installation füllt .env die Datenbank-URLs und die häufigsten Optionen; weitere ergänzen Sie im Abschnitt environment des Dienstes passbox.
| Variable | Standard | Beschreibung |
|---|---|---|
PASSBOX_BIND | 0.0.0.0:8080 | Adresse und Port, auf denen der Server lauscht |
PASSBOX_DATABASE_URL | erforderlich | PostgreSQL-URL für die API; für ihre Rolle gilt Row-Level Security |
PASSBOX_MIGRATION_DATABASE_URL | PASSBOX_DATABASE_URL | PostgreSQL-URL der Rolle, der das Schema gehört und die Migrationen ausführt |
PASSBOX_WORKER_DATABASE_URL | PASSBOX_DATABASE_URL | PostgreSQL-URL der Rolle für Hintergrundaufgaben wie die E-Mail-Warteschlange |
PASSBOX_WEB_DIR | nicht gesetzt | Verzeichnis mit dem gebauten Web-Tresor; das Image setzt es |
PASSBOX_PUBLIC_URL | nicht gesetzt | Adresse, unter der Nutzer Passbox öffnen, für Links in E-Mails |
PASSBOX_SMTP_URL | nicht gesetzt | SMTP-Server für ausgehende E-Mails |
PASSBOX_MAIL_FROM | nicht gesetzt | Absender der E-Mails, nötig mit SMTP-Server |
PASSBOX_ADMIN_EMAILS | nicht gesetzt | Kommagetrennte E-Mail-Adressen, die immer Instanz-Administratoren sind |
PASSBOX_TRUST_PROXY | false | Client-IP aus X-Forwarded-For übernehmen. Nur hinter einem Reverse Proxy aktivieren, der den Header setzt; IPs dienen der Ratenbegrenzung und erscheinen im Aktivitätsprotokoll |
PASSBOX_LOG_FORMAT | pretty | pretty oder json |
RUST_LOG | info | Log-Level, zum Beispiel debug |
Datenbank
Passbox speichert alles in PostgreSQL. Beim ersten Start legt der Dienst postgres die Datenbank und drei Rollen an, jede mit eigenem Passwort aus .env:
| Rolle | Wofür |
|---|---|
passbox_migrator | Besitzt das Schema; der Dienst migrate führt damit die Migrationen aus |
passbox_app | Die API; für sie gilt Row-Level Security |
passbox_worker | Hintergrundaufgaben wie die E-Mail-Warteschlange, mit engen Rechten |
Die Datenbank liegt in einem internen Netz ohne Internetzugang und ist auf dem Rechner nicht veröffentlicht. Um stattdessen einen eigenen PostgreSQL-Server zu nutzen, setzen Sie PASSBOX_DATABASE_URL und am besten auch die beiden anderen URLs; ohne sie gilt PASSBOX_DATABASE_URL.
PASSBOX_DATABASE_URL=postgres://passbox_app:…@db.example.com/passbox?sslmode=verify-fullPASSBOX_MIGRATION_DATABASE_URL=postgres://passbox_migrator:…@db.example.com/passbox?sslmode=verify-fullPASSBOX_WORKER_DATABASE_URL=postgres://passbox_worker:…@db.example.com/passbox?sslmode=verify-fullDatensicherung
Der Dienst backup erstellt alle 24 Stunden eine Sicherung und bewahrt sie 14 Tage auf (BACKUP_INTERVAL_HOURS, BACKUP_KEEP_DAYS). Alles wird mit age für Ihren öffentlichen Schlüssel verschlüsselt; der private Schlüssel bleibt offline.
- Datenbank: ein
pg_dumpim Custom-Format, einschließlich der Server-Geheimnisse. - Anhänge: ein Archiv der Anhangdateien, die die Clients bereits verschlüsselt haben.
- Außer Haus: Kopieren Sie das Verzeichnis
backupsan einen anderen Ort, etwa mit rsync oder restic. Eine Sicherung auf Abruf:docker compose run --rm backup once.
Zum Wiederherstellen stoppen Sie Passbox und starten den Dienst restore mit dem privaten Schlüssel und dem Zeitpunkt der Sicherung. Er ersetzt Datenbank und Anhänge; docker compose up -d startet danach alles wieder und migriert eine ältere Sicherung.
$ docker compose stop passbox backup$ BACKUP_AGE_KEY_FILE=/path/to/passbox-backup-key.txt \$ docker compose --profile restore run --rm restore 20261025T030000Z$ docker compose up -dServer-Geheimnisse aufbewahren
server_secrets verloren, werden alle Anmeldungen ungültig. Nutzer können sich nicht mehr anmelden, obwohl ihre Daten intakt bleiben. Die Sicherungen enthalten sie; testen Sie die Wiederherstellung von Zeit zu Zeit.Aktualisieren
Erstellen Sie eine Sicherung, holen Sie dann die neuen Images und starten Sie neu. Der Dienst migrate führt die Datenbank-Migrationen aus, bevor Passbox startet. Migrationen werden nicht zurückgenommen; um zurückzugehen, stellen Sie die Sicherung wieder her. Für den Produktivbetrieb legen Sie in PASSBOX_IMAGE eine Version fest.
$ docker compose pull && docker compose up -d