security
guide
security · privacy · self-hosted

AliasVault —
Passwörter & E-Mail-Aliase selbst hosten

AliasVault ist ein self-hosted Passwort-Manager der gleichzeitig E-Mail-Aliase generiert — für jeden Dienst eine eigene Wegwerf-Adresse, keine echte E-Mail preisgegeben. Läuft auf Server3 hinter Nginx, erreichbar als Android-App und im Browser unter aliasvault.local. Der Vault wird lokal gecacht und ist auch offline verfügbar.

AliasVault Docker Nginx Reverse Proxy mkcert HTTPS ✓ E-Mail-Aliase ✓ Offline-Cache ⚠ Master-Passwort sicher aufbewahren
01 Architektur 02 Deployment 03 Ersteinrichtung 04 Nginx 05 Android App 06 Updates 07 Fallstricke
01 — Architektur

Traffic-Fluss & Komponenten

AliasVault läuft als Docker-Container auf Server3 und ist intern nur über HTTP erreichbar. HTTPS-Terminierung übernimmt Nginx auf Server1 — das klassische Reverse-Proxy-Muster des Homelabs. Die Android-App verbindet sich über die gleiche HTTPS-URL wie der Browser.

Browser / Android App
    │  HTTPS 443
    ▼
Pi-hole DNS
    aliasvault.local → 203.0.113.10  (FortiGate WAN)
    │
    ▼
FortiGate  VIP-HTTPS → 10.0.1.71:443  (Server1)
    │
    ▼
Nginx auf Server1
    server_name aliasvault.local
    proxy_pass → 10.0.1.83:8300
    TRUSTED_PROXIES: 10.0.1.71
    │  HTTP intern
    ▼
AliasVault auf Server3  Port 8300
    Daten: /opt/aliasvault/{database,logs,secrets,certificates}
ParameterWertNotiz
Docker Imageghcr.io/aliasvault/aliasvault:latestGitHub Container Registry
HostServer3 (10.0.1.83)Always-on
Port intern8300 → 80Nginx proxy_pass auf :8300
Port-Binding10.0.1.83:8300:80Nicht 127.0.0.1 — Nginx muss drauf!
HTTPSNginx + mkcertFORCE_HTTPS_REDIRECT: false
Trusted Proxy10.0.1.71Nur Server1 (Nginx)
02 — Deployment

Docker Compose auf Server3

/opt/aliasvault/docker-compose.yml Server3
services:
  aliasvault:
    image: ghcr.io/aliasvault/aliasvault:latest
    container_name: aliasvault
    restart: unless-stopped
    ports:
      # Auf Server-IP binden — Nginx auf Server1 muss drauf zugreifen!
      - "10.0.1.83:8300:80"
    volumes:
      - ./database:/database
      - ./logs:/logs
      - ./secrets:/secrets
      - ./certificates:/certificates
    environment:
      # Muss dem externen Hostnamen entsprechen den der Browser sieht
      HOSTNAME: "aliasvault.local"

      # HTTPS wird von Nginx übernommen — kein interner Redirect
      FORCE_HTTPS_REDIRECT: "false"

      # Nur Server1 (Nginx) als vertrauenswürdiger Proxy
      TRUSTED_PROXIES: "10.0.1.71"

      # Öffentliche Registrierung: erst true für eigenen Account, danach false
      PUBLIC_REGISTRATION_ENABLED: "false"

      IP_LOGGING_ENABLED: "true"

      # Kein externer Mail-Support → leer lassen
      SUPPORT_EMAIL: ""
      PRIVATE_EMAIL_DOMAINS: ""
      SMTP_TLS_ENABLED: "false"
bashServer3 — starten
mkdir -p /opt/aliasvault
cd /opt/aliasvault
# docker-compose.yml anlegen (siehe oben)
docker compose up -d
docker compose logs -f
03 — Ersteinrichtung

Admin einrichten & Account anlegen

1
Admin-Passwort setzen
Falls das Admin-Panel unter /admin "Admin User Not Configured" zeigt:
bashServer3
docker compose exec -it aliasvault /bin/bash
aliasvault reset-admin-password
exit
docker compose restart
2
Eigenen Account registrieren
Registrierung ist standardmäßig deaktiviert. Einmalig aufmachen, Account anlegen, sofort wieder schließen.
docker-compose.ymlTemporär ändern
# 1. Auf true setzen
PUBLIC_REGISTRATION_ENABLED: "true"

# 2. Neu starten
docker compose down && docker compose up -d

# 3. Browser: https://aliasvault.local → Account registrieren
#    Master-Passwort sicher wählen und SICHER aufbewahren!

# 4. Sofort wieder auf false setzen + neu starten
PUBLIC_REGISTRATION_ENABLED: "false"
docker compose down && docker compose up -d
3
Admin-Panel prüfen
Unter https://aliasvault.local/admin einloggen und prüfen ob der angelegte Account sichtbar ist. Registrierung ist nun geschlossen.
Master-Passwort verloren = Vault verloren

AliasVault verschlüsselt den gesamten Vault mit dem Master-Passwort. Es gibt keine Wiederherstellungsmöglichkeit ohne das Master-Passwort — kein Reset, kein Support, keine Hintertür. Das Passwort sicher und offline aufbewahren, z.B. auf Papier in einem physisch gesicherten Ort.

04 — Nginx

Reverse Proxy Konfiguration

/opt/docker/nginx/conf.d/aliasvault.local.conf Server1
server {
    listen 443 ssl;
    server_name aliasvault.local;

    ssl_certificate     /etc/nginx/certs/homelab.pem;
    ssl_certificate_key /etc/nginx/certs/homelab-key.pem;

    location / {
        proxy_pass         http://10.0.1.83:8300;
        proxy_http_version 1.1;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;

        # WebSocket — wird von AliasVault genutzt
        proxy_set_header   Upgrade    $http_upgrade;
        proxy_set_header   Connection "upgrade";

        # Vault-Import erlauben
        client_max_body_size 20M;
    }
}

# HTTP-Redirect wird global von 00-redirect.conf übernommen
bashServer1 — Nginx neu laden
docker exec nginx nginx -t && docker exec nginx nginx -s reload
Pi-hole DNS-Eintrag

aliasvault.local → 203.0.113.10 — wie alle lokalen Domains auf die FortiGate WAN-IP, nicht auf Server3 direkt.

05 — Android App

App einrichten & CA installieren

Die AliasVault Android-App (ab v0.23) unterstützt explizit selbstsignierte CA-Zertifikate. Die mkcert Root-CA muss auf dem Gerät installiert sein, damit die App die HTTPS-Verbindung zu aliasvault.local akzeptiert. Der Vault wird lokal gecacht — auch ohne Heimnetz-Verbindung nutzbar.

Schritt 1 — CA exportieren
Auf Server1 ausführen:

cp $(mkcert -CAROOT)/rootCA.pem ~/homelab-ca.pem

Datei per USB, ADB oder lokaler Webserver auf das Android-Gerät übertragen.
Schritt 2 — CA installieren
Einstellungen
→ Sicherheit
→ Datenschutz & Sicherheit
→ Mehr Sicherheit
→ Verschlüsselung & Anmeldedaten
CA-Zertifikat installieren
→ Datei auswählen
Schritt 3 — App konfigurieren
AliasVault App installieren

Server-URL eingeben:
https://aliasvault.local

Mit Benutzername + Master-Passwort einloggen.

Vault wird lokal gecacht → offline verfügbar
CA nach Zertifikat-Neugenerierung neu installieren

Wird das mkcert-Zertifikat neu generiert (neue Domain hinzugefügt), muss die CA auf Android neu installiert werden. Die alte Version wird nicht automatisch aktualisiert. Symptom: App meldet Zertifikatsfehler obwohl die URL stimmt.

Sync-Verhalten

Der Vault wird beim App-Start synchronisiert wenn das Heimnetz erreichbar ist. Ist kein Zugriff auf aliasvault.local möglich (unterwegs, kein VPN), arbeitet die App mit dem lokalen Cache weiter — alle Passwörter und Aliase bleiben lesbar, neue Einträge werden beim nächsten Sync übertragen.

06 — Updates

AliasVault aktuell halten

bashServer3 — Update-Prozess
cd /opt/aliasvault
docker compose pull
docker compose down
docker compose up -d
docker compose logs -f

# Daten liegen in bind-mounts → bleiben beim Update erhalten
# /opt/aliasvault/{database,logs,secrets,certificates}
Backup vor dem Update

Die Daten liegen in Bind-Mounts unter /opt/aliasvault/ — ein einfaches tar -czf aliasvault-backup-$(date +%Y%m%d).tar.gz /opt/aliasvault/database /opt/aliasvault/secrets reicht als Backup vor einem Update.

07 — Fallstricke

Was schiefgehen kann

App meldet Zertifikatsfehler obwohl HTTPS korrekt eingerichtet ist
Die mkcert Root-CA ist auf dem Android-Gerät nicht installiert oder wurde nach einer Neugenerierung des Zertifikats nicht aktualisiert. CA-Datei erneut übertragen und unter Einstellungen → Sicherheit → CA-Zertifikat installieren neu installieren.
Nginx kann AliasVault nicht erreichen — 502 Bad Gateway
Port-Binding in Docker ist auf 127.0.0.1:8300:80 statt auf die Server-IP gesetzt. Nginx auf Server1 kann localhost von Server3 nicht erreichen. In der docker-compose.yml auf 10.0.1.83:8300:80 ändern und Container neu starten.
"Admin User Not Configured" im Admin-Panel
Beim ersten Start wurde noch kein Admin-Passwort gesetzt. Im Container ausführen: docker compose exec -it aliasvault /bin/bash, dann aliasvault reset-admin-password, danach docker compose restart.
Registrierung schlägt fehl — "Registration disabled"
PUBLIC_REGISTRATION_ENABLED ist auf "false" gesetzt. Für die Erstregistrierung temporär auf "true" setzen, Container neu starten, Account anlegen, sofort wieder auf "false" und erneut neu starten.
WebSocket-Verbindung bricht ab — Live-Updates funktionieren nicht
Nginx-Config fehlen die WebSocket-Header. Sicherstellen dass proxy_set_header Upgrade $http_upgrade und proxy_set_header Connection "upgrade" im Location-Block stehen. Nginx neu laden: docker exec nginx nginx -s reload.
HOSTNAME falsch gesetzt — Login schlägt fehl oder Redirects stimmen nicht
Die HOSTNAME-Umgebungsvariable muss exakt dem Hostnamen entsprechen den der Browser in der URL-Zeile sieht — also aliasvault.local, nicht die Server-IP oder eine andere Schreibweise. Nach Änderung Container neu starten.