Zum Inhalt springen
NeuPassbox ist da: im Web, auf dem Desktop, auf iPhone, Android und Ihrem eigenen Server.Passbox ist da · Alle Apps ansehen

Selbst hosten

Passbox selbst hosten

Passbox ist ein Rust-Programm, das API und Web-Tresor ausliefert. Die Docker-Compose-Installation betreibt es mit PostgreSQL, Caddy für automatisches HTTPS und verschlüsselten nächtlichen Sicherungen. Es steht unter der MIT-Lizenz: Sie können es kostenlos für sich, Ihre Familie oder Ihr ganzes Unternehmen betreiben, mit allen Funktionen.

  • 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:

terminal
$ git clone https://github.com/passboxnet/passbox$ cd passbox/deploy/compose$ cp .env.example .env    # then fill in every value$ docker compose up -d

Setzen 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.

deploy/compose/docker-compose.yml
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

Setzen Sie BACKUP_AGE_RECIPIENT vor dem ersten Start und bewahren Sie den passenden privaten Schlüssel offline auf. Ohne ihn lässt sich keine Sicherung wiederherstellen.

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
ModusWer ein Konto erstellen darf
openAlle, die den Server erreichen (Standard)
invite_onlyNur Personen mit Einladung
domainsE-Mail-Adressen der erlaubten Domains, dazu eingeladene Personen

E-Mail

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.

VariableStandardBeschreibung
PASSBOX_BIND0.0.0.0:8080Adresse und Port, auf denen der Server lauscht
PASSBOX_DATABASE_URLerforderlichPostgreSQL-URL für die API; für ihre Rolle gilt Row-Level Security
PASSBOX_MIGRATION_DATABASE_URLPASSBOX_DATABASE_URLPostgreSQL-URL der Rolle, der das Schema gehört und die Migrationen ausführt
PASSBOX_WORKER_DATABASE_URLPASSBOX_DATABASE_URLPostgreSQL-URL der Rolle für Hintergrundaufgaben wie die E-Mail-Warteschlange
PASSBOX_WEB_DIRnicht gesetztVerzeichnis mit dem gebauten Web-Tresor; das Image setzt es
PASSBOX_PUBLIC_URLnicht gesetztAdresse, unter der Nutzer Passbox öffnen, für Links in E-Mails
PASSBOX_SMTP_URLnicht gesetztSMTP-Server für ausgehende E-Mails
PASSBOX_MAIL_FROMnicht gesetztAbsender der E-Mails, nötig mit SMTP-Server
PASSBOX_ADMIN_EMAILSnicht gesetztKommagetrennte E-Mail-Adressen, die immer Instanz-Administratoren sind
PASSBOX_TRUST_PROXYfalseClient-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_FORMATprettypretty oder json
RUST_LOGinfoLog-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:

RolleWofür
passbox_migratorBesitzt das Schema; der Dienst migrate führt damit die Migrationen aus
passbox_appDie API; für sie gilt Row-Level Security
passbox_workerHintergrundaufgaben 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-full

Datensicherung

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_dump im 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 backups an 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 -d

Server-Geheimnisse aufbewahren

Geht die Tabelle 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