Zum Inhalt

Web-UI

Übersicht

Die "Web-UI" ist eine Webanwendung, die Ihnen hilft, Ihre BunkerWeb-Instanz über eine benutzerfreundliche Oberfläche zu verwalten, anstatt sich ausschließlich auf die Befehlszeile zu verlassen.

Hier ist eine Liste der von der Web-UI angebotenen Funktionen:

  • Einen umfassenden Überblick über blockierte Angriffe erhalten
  • Ihre BunkerWeb-Instanz starten, stoppen, neu starten und neu laden
  • Einstellungen für Ihre Webanwendungen hinzufügen, bearbeiten und löschen
  • Benutzerdefinierte Konfigurationen für NGINX und ModSecurity hinzufügen, bearbeiten und löschen
  • Externe Plugins installieren und deinstallieren
  • Zwischengespeicherte Dateien erkunden
  • Die Ausführung von Jobs überwachen und bei Bedarf neu starten
  • Protokolle anzeigen und nach Mustern suchen

Voraussetzungen

Da die Web-UI eine Webanwendung ist, besteht die empfohlene Architektur darin, BunkerWeb als Reverse-Proxy davor zu betreiben. Das empfohlene Installationsverfahren ist die Verwendung des Einrichtungsassistenten, der Sie Schritt für Schritt führt, wie im Schnellstart-Leitfaden beschrieben.

Sicherheitsaspekte

Die Sicherheit der Web-UI ist äußerst wichtig. Wenn eine unbefugte Person Zugriff auf die Anwendung erhält, kann sie nicht nur Ihre Konfigurationen bearbeiten, sondern möglicherweise auch Code im Kontext von BunkerWeb ausführen (z. B. über eine benutzerdefinierte Konfiguration mit LUA-Code). Wir empfehlen dringend, dass Sie minimale Sicherheits-Best Practices befolgen, wie z. B.:

  • Wählen Sie ein starkes Passwort für die Anmeldung (mindestens 8 Zeichen, einschließlich 1 Kleinbuchstabe, 1 Großbuchstabe, 1 Ziffer und 1 Sonderzeichen)
  • Platzieren Sie die Web-UI unter einer "schwer zu erratenden" URI
  • Aktivieren Sie die Zwei-Faktor-Authentifizierung (2FA)
  • Stellen Sie die Web-UI nicht ohne zusätzliche Einschränkungen im Internet zur Verfügung
  • Wenden Sie die im Abschnitt Erweiterte Nutzungen der Dokumentation aufgeführten Best Practices je nach Ihrem Anwendungsfall an

Upgrade auf PRO

Kostenlose Testversion von BunkerWeb PRO

Möchten Sie BunkerWeb PRO einen Monat lang schnell testen? Verwenden Sie den Code freetrial bei Ihrer Bestellung im BunkerWeb-Panel oder klicken Sie hier, um den Promo-Code direkt anzuwenden (wird an der Kasse wirksam).

Sobald Sie Ihren PRO-Lizenzschlüssel vom BunkerWeb-Panel haben, können Sie ihn auf der PRO-Seite der Web-UI einfügen.

PRO-Upgrade

Upgrade auf PRO über die Web-UI

Upgrade-Zeit

Die PRO-Version wird im Hintergrund vom Scheduler heruntergeladen, es kann einige Zeit dauern, bis das Upgrade abgeschlossen ist.

Wenn Ihre BunkerWeb-Instanz auf die PRO-Version aktualisiert wurde, sehen Sie Ihr Lizenzablaufdatum und die maximale Anzahl der Dienste, die Sie schützen können.

PRO-Upgrade

PRO-Lizenzinformationen

Zugriff auf Protokolle

Ab Version 1.6 hat sich die Methode zum Zugriff auf Protokolle geändert. Dieses Update betrifft insbesondere containerbasierte Integrationen: Die Web-UI liest die Protokolldateien nun aus dem Verzeichnis /var/log/bunkerweb.

Um die Protokolle über die Web-UI zugänglich zu halten, empfehlen wir die Verwendung eines Syslog-Servers wie syslog-ng, um die Protokolle zu lesen und die entsprechenden Dateien im Verzeichnis /var/log/bunkerweb zu erstellen.

Verwendung eines lokalen Ordners für Protokolle

Die Web-UI läuft als unprivilegierter Benutzer mit UID 101 und GID 101 im Container aus Sicherheitsgründen: Im Falle einer ausgenutzten Schwachstelle hat der Angreifer keine vollen Root-Rechte (UID/GID 0).

Es gibt jedoch einen Nachteil: Wenn Sie einen lokalen Ordner für Protokolle verwenden, müssen Sie die richtigen Berechtigungen festlegen, damit der unprivilegierte Benutzer die Protokolldateien lesen kann. Zum Beispiel:

mkdir bw-logs && \
chown root:101 bw-logs && \
chmod 770 bw-logs

Alternativ, wenn der Ordner bereits existiert:

chown -R root:101 bw-logs && \
chmod -R 770 bw-logs

Wenn Sie Docker im rootless-Modus oder podman verwenden, werden UIDs und GIDs im Container auf andere auf dem Host abgebildet. Sie müssen zuerst Ihre anfängliche subuid und subgid überprüfen:

grep ^$(whoami): /etc/subuid && \
grep ^$(whoami): /etc/subgid

Wenn Sie beispielsweise einen Wert von 100000 haben, ist die abgebildete UID/GID 100100 (100000 + 100):

mkdir bw-logs && \
sudo chgrp 100100 bw-logs && \
chmod 770 bw-logs

Oder wenn der Ordner bereits existiert:

sudo chgrp -R 100100 bw-logs && \
sudo chmod -R 770 bw-logs

Compose-Vorlagen

Um die Protokolle bei der Docker-Integration korrekt in das Verzeichnis /var/log/bunkerweb weiterzuleiten, müssen Sie die Protokolle mit syslog-ng in eine Datei streamen. Hier ist ein Beispiel, wie das geht:

x-bw-env: &bw-env
  # Wir verankern die Umgebungsvariablen, um Duplikate zu vermeiden
  API_WHITELIST_IP: "127.0.0.0/24 10.20.30.0/24"
  # Optionaler API-Token bei der Sicherung des API-Zugriffs
  API_TOKEN: ""

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp" # QUIC
    environment:
      <<: *bw-env
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-services
    logging:
      driver: syslog
      options:
        tag: "bunkerweb" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *bw-env
      BUNKERWEB_INSTANCES: "bunkerweb" # Stellen Sie sicher, dass Sie den richtigen Instanznamen festlegen
      SERVER_NAME: "www.example.com"
      MULTISITE: "yes"
      DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
      SERVE_FILES: "no"
      DISABLE_DEFAULT_SERVER: "yes"
      USE_CLIENT_CACHE: "yes"
      USE_GZIP: "yes"
      www.example.com_USE_TEMPLATE: "ui"
      www.example.com_USE_REVERSE_PROXY: "yes"
      www.example.com_REVERSE_PROXY_URL: "/changeme" # Ändern Sie dies in eine schwer zu erratende URI
      www.example.com_REVERSE_PROXY_HOST: "http://bw-ui:7000"
    volumes:
      - bw-storage:/data # Dies wird verwendet, um den Cache und andere Daten wie die Backups zu persistieren
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-db
    logging:
      driver: syslog
      options:
        tag: "bw-scheduler" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-ui:
    image: bunkerity/bunkerweb-ui:1.6.5
    environment:
      DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
      ADMIN_USERNAME: "changeme"
      ADMIN_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für den Admin-Benutzer festzulegen
      TOTP_ENCRYPTION_KEYS: "mysecret" # Denken Sie daran, einen stärkeren geheimen Schlüssel festzulegen (siehe Abschnitt Voraussetzungen)
    volumes:
      - bw-logs:/var/log/bunkerweb # Dies ist das Volume, das zum Speichern der Protokolle verwendet wird
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-db
    logging:
      driver: syslog
      options:
        tag: "bw-ui" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-db:
    image: mariadb:11
    # Wir setzen die maximal zulässige Paketgröße, um Probleme mit großen Abfragen zu vermeiden
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-data:/var/lib/mysql
    restart: "unless-stopped"
    networks:
      - bw-db

  bw-syslog:
    image: balabit/syslog-ng:4.9.0
    cap_add:
      - NET_BIND_SERVICE  # An niedrige Ports binden
      - NET_BROADCAST  # Broadcasts senden
      - NET_RAW  # Raw-Sockets verwenden
      - DAC_READ_SEARCH  # Dateien unter Umgehung von Berechtigungen lesen
      - DAC_OVERRIDE  # Dateiberechtigungen überschreiben
      - CHOWN  # Eigentümer ändern
      - SYSLOG  # In Systemprotokolle schreiben
    volumes:
      - bw-logs:/var/log/bunkerweb # Dies ist das Volume, das zum Speichern der Protokolle verwendet wird
      - ./syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf # Dies ist die syslog-ng-Konfigurationsdatei
    networks:
      bw-universe:
        ipv4_address: 10.20.30.254 # Stellen Sie sicher, dass Sie die richtige IP-Adresse festlegen

volumes:
  bw-data:
  bw-storage:
  bw-logs:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-db:
    name: bw-db

Um die Protokolle bei der Autoconf-Integration korrekt in das Verzeichnis /var/log/bunkerweb weiterzuleiten, müssen Sie die Protokolle mit syslog-ng in eine Datei streamen. Hier ist ein Beispiel, wie das geht:

x-ui-env: &bw-ui-env
  # Wir verankern die Umgebungsvariablen, um Duplikate zu vermeiden
  AUTOCONF_MODE: "yes"
  DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp" # QUIC
    environment:
      AUTOCONF_MODE: "yes"
      API_WHITELIST_IP: "127.0.0.0/24 10.20.30.0/24"
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-services
    logging:
      driver: syslog
      options:
        tag: "bunkerweb" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *bw-ui-env
      BUNKERWEB_INSTANCES: "" # Wir müssen die BunkerWeb-Instanz hier nicht angeben, da sie automatisch vom Autoconf-Dienst erkannt werden
      SERVER_NAME: "" # Der Servername wird mit Dienst-Labels gefüllt
      MULTISITE: "yes" # Obligatorische Einstellung für Autoconf / UI
      API_WHITELIST_IP: "127.0.0.0/24 10.20.30.0/24"
    volumes:
      - bw-storage:/data # Dies wird verwendet, um den Cache und andere Daten wie die Backups zu persistieren
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-db
    logging:
      driver: syslog
      options:
        tag: "bw-scheduler" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-autoconf:
    image: bunkerity/bunkerweb-autoconf:1.6.5
    depends_on:
      - bunkerweb
      - bw-docker
    environment:
      <<: *bw-ui-env
      DOCKER_HOST: "tcp://bw-docker:2375" # Dies ist die Adresse des Docker-Sockets
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-docker
      - bw-db
    logging:
      driver: syslog
      options:
        tag: "bw-autoconf" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-ui:
    image: bunkerity/bunkerweb-ui:1.6.5
    environment:
      <<: *bw-ui-env
      ADMIN_USERNAME: "changeme"
      ADMIN_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für den Admin-Benutzer festzulegen
      TOTP_ENCRYPTION_KEYS: "mysecret" # Denken Sie daran, einen stärkeren geheimen Schlüssel festzulegen (siehe Abschnitt Voraussetzungen)
    volumes:
      - bw-logs:/var/log/bunkerweb
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-db
    labels:
      - "bunkerweb.SERVER_NAME=www.example.com"
      - "bunkerweb.USE_TEMPLATE=ui"
      - "bunkerweb.USE_REVERSE_PROXY=yes"
      - "bunkerweb.REVERSE_PROXY_URL=/changeme" # Ändern Sie dies in eine schwer zu erratende URI
      - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000"
    logging:
      driver: syslog
      options:
        tag: "bw-ui" # Dies ist das Tag, das von syslog-ng verwendet wird, um die Protokolldatei zu erstellen
        syslog-address: "udp://10.20.30.254:514" # Dies ist die Adresse des syslog-ng-Containers

  bw-db:
    image: mariadb:11
    # Wir setzen die maximal zulässige Paketgröße, um Probleme mit großen Abfragen zu vermeiden
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-data:/var/lib/mysql
    restart: "unless-stopped"
    networks:
      - bw-db

  bw-docker:
    image: tecnativa/docker-socket-proxy:nightly
    environment:
      CONTAINERS: "1"
      LOG_LEVEL: "warning"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: "unless-stopped"
    networks:
      - bw-docker

  bw-syslog:
    image: balabit/syslog-ng:4.9.0
    cap_add:
      - NET_BIND_SERVICE  # An niedrige Ports binden
      - NET_BROADCAST  # Broadcasts senden
      - NET_RAW  # Raw-Sockets verwenden
      - DAC_READ_SEARCH  # Dateien unter Umgehung von Berechtigungen lesen
      - DAC_OVERRIDE  # Dateiberechtigungen überschreiben
      - CHOWN  # Eigentümer ändern
      - SYSLOG  # In Systemprotokolle schreiben
    volumes:
      - bw-logs:/var/log/bunkerweb # Dies ist das Volume, das zum Speichern der Protokolle verwendet wird
      - ./syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf # Dies ist die syslog-ng-Konfigurationsdatei
    networks:
      bw-universe:
        ipv4_address: 10.20.30.254 # Stellen Sie sicher, dass Sie die richtige IP-Adresse festlegen

volumes:
  bw-data:
  bw-storage:
  bw-logs:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-db:
    name: bw-db
  bw-docker:
    name: bw-docker

Syslog-ng-Konfiguration

Hier ist ein Beispiel für eine syslog-ng.conf-Datei, die Sie verwenden können, um die Protokolle in eine Datei weiterzuleiten:

@version: 4.8

# Quellkonfiguration zum Empfang von Protokollen von Docker-Containern
source s_net {
  udp(
    ip("0.0.0.0")
  );
};

# Vorlage zum Formatieren von Protokollnachrichten
template t_imp {
  template("$MSG\n");
  template_escape(no);
};

# Zielkonfiguration zum Schreiben von Protokollen in dynamisch benannte Dateien
destination d_dyna_file {
  file(
    "/var/log/bunkerweb/${PROGRAM}.log"
    template(t_imp)
    owner("101")
    group("101")
    dir_owner("root")
    dir_group("101")
    perm(0440)
    dir_perm(0770)
    create_dirs(yes)
  );
};

# Protokollpfad zum Weiterleiten von Protokollen an dynamisch benannte Dateien
log {
  source(s_net);
  destination(d_dyna_file);
};

Kontoverwaltung

Sie können auf die Kontoverwaltungsseite zugreifen, indem Sie auf das Profilbild in der oberen rechten Ecke klicken:

Übersicht

Zugriff auf die Kontoseite von der oberen rechten Ecke

Benutzername / Passwort

Passwort/Benutzername verloren

Falls Sie Ihre UI-Anmeldeinformationen vergessen haben, können Sie sie von der CLI aus zurücksetzen, indem Sie den in der Fehlerbehebungssektion beschriebenen Schritten folgen.

Sie können Ihren Benutzernamen oder Ihr Passwort aktualisieren, indem Sie die entsprechenden Formulare im Tab Sicherheit ausfüllen. Aus Sicherheitsgründen müssen Sie Ihr aktuelles Passwort eingeben, auch wenn Sie angemeldet sind.

Bitte beachten Sie, dass Sie nach der Aktualisierung Ihres Benutzernamens oder Passworts von der Web-UI abgemeldet werden, um sich erneut anzumelden.

Übersicht

Benutzername-/Passwort-Formular

Zwei-Faktor-Authentifizierung

Obligatorische Verschlüsselungsschlüssel

Wenn Sie 2FA aktivieren, müssen Sie mindestens einen Verschlüsselungsschlüssel angeben. Dieser Schlüssel wird verwendet, um Ihre TOTP-Geheimnisse zu verschlüsseln.

Die empfohlene Methode zur Generierung eines gültigen Schlüssels ist die Verwendung des passlib-Pakets:

python3 -c "from passlib import totp; print(totp.generate_secret())"

Setzen Sie den generierten Schlüssel in der Umgebungsvariable TOTP_ENCRYPTION_KEYS der Web-UI. Sie können auch mehrere durch Leerzeichen getrennte Schlüssel oder ein Wörterbuch festlegen (aus Gründen der Abwärtskompatibilität).

Geheimschlüssel verloren

Falls Sie Ihren Geheimschlüssel verlieren, stehen zwei Optionen zur Verfügung:

Sie können Ihre Anmeldesicherheit durch Hinzufügen einer Zwei-Faktor-Authentifizierung (2FA) zu Ihrem Konto erhöhen. Dadurch wird zusätzlich zu Ihrem Passwort ein zusätzlicher Code benötigt.

Die Web-UI verwendet zeitbasiertes Einmalkennwort (TOTP) als 2FA-Implementierung: Mit einem geheimen Schlüssel generiert der Algorithmus Einmalkennwörter, die nur für einen kurzen Zeitraum gültig sind.

Jeder TOTP-Client wie Google Authenticator, Authy, FreeOTP usw. kann verwendet werden, um den geheimen Schlüssel zu speichern und die Codes zu generieren. Bitte beachten Sie, dass Sie den geheimen Schlüssel nach der Aktivierung von TOTP nicht mehr von der Web-UI abrufen können.

Die folgenden Schritte sind erforderlich, um die TOTP-Funktion in der Web-UI zu aktivieren:

  • Kopieren Sie den geheimen Schlüssel oder verwenden Sie den QR-Code in Ihrer Authentifizierungs-App
  • Geben Sie den aktuellen TOTP-Code in das 2FA-Eingabefeld ein
  • Geben Sie Ihr aktuelles Passwort ein

Aktualisierung des Geheimschlüssels

Ein neuer geheimer Schlüssel wird jedes Mal generiert, wenn Sie die Seite besuchen oder das Formular absenden. Falls etwas schiefgeht (z. B. abgelaufener TOTP-Code), müssen Sie den neuen geheimen Schlüssel in Ihre Authentifizierungs-App kopieren, bis 2FA erfolgreich aktiviert ist.

Wiederherstellungscodes

Wenn Sie 2FA aktivieren, erhalten Sie 5 Wiederherstellungscodes. Diese Codes können verwendet werden, um Ihr Konto wiederherzustellen, falls Sie Ihren TOTP-Geheimschlüssel verloren haben. Jeder Code kann nur einmal verwendet werden. Diese Codes werden nur einmal angezeigt, also stellen Sie sicher, dass Sie sie an einem sicheren Ort aufbewahren.

Wenn Sie Ihre Wiederherstellungscodes verlieren, können Sie sie über den TOTP-Abschnitt der Kontoverwaltungsseite aktualisieren. Bitte beachten Sie, dass die alten Wiederherstellungscodes ungültig werden.

Sie können 2FA im Tab Sicherheit aktivieren oder deaktivieren und auch die Wiederherstellungscodes aktualisieren:

Übersicht

Formulare zum Aktivieren/Deaktivieren/Aktualisieren von TOTP-Wiederherstellungscodes

Nach einer erfolgreichen Kombination aus Login und Passwort werden Sie aufgefordert, Ihren TOTP-Code einzugeben:

Übersicht

2FA auf der Anmeldeseite

Aktuelle Sitzungen

Im Tab Sitzung können Sie aktuelle Sitzungen auflisten und widerrufen:

Übersicht

Sitzungen verwalten

Erweiterte Installation

Die Web-UI kann auch ohne den Einrichtungsassistenten bereitgestellt und konfiguriert werden: Die Konfiguration erfolgt über Umgebungsvariablen, die direkt zu den Containern oder bei einer Linux-Integration in die Datei /etc/bunkerweb/ui.env hinzugefügt werden können.

Spezifische Umgebungsvariablen der Web-UI

Die Web-UI verwendet die folgenden Umgebungsvariablen:

  • OVERRIDE_ADMIN_CREDS: auf yes setzen, um die Überschreibung zu aktivieren, auch wenn die Admin-Anmeldeinformationen bereits festgelegt sind (Standard ist no).
  • ADMIN_USERNAME: Benutzername für den Zugriff auf die Web-UI.
  • ADMIN_PASSWORD: Passwort für den Zugriff auf die Web-UI.
  • FLASK_SECRET: ein geheimer Schlüssel, der zum Verschlüsseln des Sitzungs-Cookies verwendet wird (wenn nicht festgelegt, wird ein zufälliger Schlüssel generiert).
  • TOTP_ENCRYPTION_KEYS (oder TOTP_SECRETS): eine Liste von TOTP-Verschlüsselungsschlüsseln, die durch Leerzeichen getrennt sind, oder ein Wörterbuch (z. B. {"1": "meingeheimschlüssel"} oder meingeheimschlüssel oder meingeheimschlüssel meingeheimschlüssel1). Wir empfehlen dringend, diese Variable zu setzen, wenn Sie 2FA verwenden möchten, da sie zur Verschlüsselung der TOTP-Geheimschlüssel verwendet wird (wenn nicht festgelegt, wird eine zufällige Anzahl von Geheimschlüsseln generiert). Weitere Informationen finden Sie in der passlib-Dokumentation.
  • UI_LISTEN_ADDR (bevorzugt): die Adresse, an der die Web-UI lauschen wird (Standard ist 0.0.0.0 in Docker-Images und 127.0.0.1 bei Linux-Installationen). Fällt auf LISTEN_ADDR zurück, wenn nicht gesetzt.
  • UI_LISTEN_PORT (bevorzugt): der Port, an dem die Web-UI lauschen wird (Standard ist 7000). Fällt auf LISTEN_PORT zurück, wenn nicht gesetzt.
  • MAX_WORKERS: die Anzahl der von der Web-UI verwendeten Worker (Standard ist die Anzahl der CPUs).
  • MAX_THREADS: die Anzahl der von der Web-UI verwendeten Threads (Standard ist MAX_WORKERS * 2).
  • FORWARDED_ALLOW_IPS: eine Liste von IP-Adressen oder Netzwerken, die im X-Forwarded-For-Header verwendet werden dürfen (Standard ist * in Docker-Images und 127.0.0.1 bei Linux-Installationen).
  • CHECK_PRIVATE_IP: auf yes setzen, um Benutzer nicht zu trennen, deren IP-Adresse sich während einer Sitzung ändert, wenn sie sich in einem privaten Netzwerk befinden (Standard ist yes). (Nicht-private IP-Adressen werden immer überprüft).
  • ENABLE_HEALTHCHECK: auf yes setzen, um den /healthcheck-Endpunkt zu aktivieren, der eine einfache JSON-Antwort mit Statusinformationen zurückgibt (Standard ist no).

Die Web-UI verwendet diese Variablen, um Sie zu authentifizieren und die 2FA-Funktion zu handhaben.

Empfohlene Geheimnisse generieren

Um ein gültiges ADMIN_PASSWORD zu generieren, empfehlen wir die Verwendung eines Passwort-Managers oder eines Passwort-Generators.

Sie können ein gültiges FLASK_SECRET mit dem folgenden Befehl generieren:

python3 -c "import secrets; print(secrets.token_hex(64))"

Sie können gültige, durch Leerzeichen getrennte TOTP_ENCRYPTION_KEYS mit dem folgenden Befehl generieren (Sie benötigen das passlib-Paket):

python3 -c "from passlib import totp; print(totp.generate_secret())"

Die Installation der Web-UI über die Linux-Integration ist ziemlich unkompliziert, da sie mit BunkerWeb installiert wird.

Die Web-UI wird als systemd-Dienst namens bunkerweb-ui geliefert. Bitte stellen Sie sicher, dass er aktiviert ist:

sudo systemctl enable bunkerweb-ui && \
sudo systemctl status bunkerweb-ui

Eine dedizierte Umgebungsdatei unter /etc/bunkerweb/ui.env wird zur Konfiguration der Web-UI verwendet:

ADMIN_USERNAME=changeme
ADMIN_PASSWORD=changeme
TOTP_ENCRYPTION_KEYS=mysecret

Ersetzen Sie die changeme-Daten durch Ihre eigenen Werte.

Denken Sie daran, einen stärkeren geheimen Schlüssel für TOTP_ENCRYPTION_KEYS festzulegen.

Jedes Mal, wenn Sie die Datei /etc/bunkerweb/ui.env bearbeiten, müssen Sie den Dienst neu starten:

systemctl restart bunkerweb-ui

Der Zugriff auf die Web-UI über BunkerWeb ist eine klassische Reverse-Proxy-Einrichtung. Bitte beachten Sie, dass die Web-UI auf Port 7000 und nur auf der Loopback-Schnittstelle lauscht.

Hier ist die /etc/bunkerweb/variables.env-Vorlage, die Sie verwenden können:

HTTP_PORT=80
HTTPS_PORT=443
DNS_RESOLVERS=9.9.9.9 8.8.8.8 8.8.4.4
API_LISTEN_IP=127.0.0.1
SERVER_NAME=www.example.com
MULTISITE=yes
www.example.com_USE_TEMPLATE=ui
www.example.com_USE_REVERSE_PROXY=yes
www.example.com_REVERSE_PROXY_URL=/changeme
www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000

Vergessen Sie nicht, den bunkerweb-Dienst neu zu laden:

systemctl reload bunkerweb

Die Web-UI kann über einen dedizierten Container bereitgestellt werden, der auf Docker Hub verfügbar ist:

docker pull bunkerity/bunkerweb-ui

Alternativ können Sie es auch selbst erstellen:

git clone https://github.com/bunkerity/bunkerweb.git && \
cd bunkerweb && \
docker build -t my-bunkerweb-ui -f src/ui/Dockerfile .

Der Zugriff auf die Web-UI über BunkerWeb ist eine klassische Reverse-Proxy-Einrichtung. Wir empfehlen Ihnen, BunkerWeb und die Web-UI über ein dediziertes Netzwerk (wie bw-universe, das auch vom Scheduler verwendet wird) zu verbinden, damit es aus offensichtlichen Sicherheitsgründen nicht im selben Netzwerk wie Ihre Webdienste liegt. Bitte beachten Sie, dass der Web-UI-Container auf Port 7000 lauscht.

Datenbank-Backend

Wenn Sie ein anderes Datenbank-Backend als MariaDB wünschen, lesen Sie bitte die docker-compose-Dateien im Ordner misc/integrations des Repositorys.

Hier ist die docker-compose-Vorlage, die Sie verwenden können (vergessen Sie nicht, die changeme-Daten zu bearbeiten):

x-ui-env: &ui-env
  # Wir verankern die Umgebungsvariablen, um Duplikate zu vermeiden
  DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp" # Für QUIC / HTTP3-Unterstützung
    environment:
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24" # Stellen Sie sicher, dass Sie den richtigen IP-Bereich festlegen, damit der Scheduler die Konfiguration an die Instanz senden kann
      API_TOKEN: "" # Spiegeln Sie API_TOKEN, wenn Sie es verwenden
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *ui-env
      BUNKERWEB_INSTANCES: "bunkerweb" # Stellen Sie sicher, dass Sie den richtigen Instanznamen festlegen
      SERVER_NAME: "www.example.com"
      MULTISITE: "yes"
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24" # Wir spiegeln die API_WHITELIST_IP vom bunkerweb-Dienst
      API_TOKEN: "" # Spiegeln Sie API_TOKEN, wenn Sie es verwenden
      SERVE_FILES: "no"
      DISABLE_DEFAULT_SERVER: "yes"
      USE_CLIENT_CACHE: "yes"
      USE_GZIP: "yes"
      www.example.com_USE_TEMPLATE: "ui"
      www.example.com_USE_REVERSE_PROXY: "yes"
      www.example.com_REVERSE_PROXY_URL: "/changeme" # Denken Sie daran, eine stärkere URI festzulegen
      www.example.com_REVERSE_PROXY_HOST: "http://bw-ui:7000" # Der Web-UI-Container lauscht standardmäßig auf Port 7000
    volumes:
      - bw-storage:/data # Dies wird verwendet, um den Cache und andere Daten wie die Backups zu persistieren
    networks:
      - bw-universe
      - bw-db

  bw-ui:
    image: bunkerity/bunkerweb-ui:1.6.5
    environment:
      <<: *ui-env
      ADMIN_USERNAME: "changeme"
      ADMIN_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für den changeme-Benutzer festzulegen
      TOTP_ENCRYPTION_KEYS: "mysecret" # Denken Sie daran, einen stärkeren geheimen Schlüssel festzulegen (siehe Abschnitt Voraussetzungen)
    networks:
      - bw-universe
      - bw-db

  bw-db:
    image: mariadb:11
    # Wir setzen die maximal zulässige Paketgröße, um Probleme mit großen Abfragen zu vermeiden
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-data:/var/lib/mysql
    networks:
      - bw-db

volumes:
  bw-data:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-db:
    name: bw-db

Die Web-UI kann über einen dedizierten Container bereitgestellt werden, der auf Docker Hub verfügbar ist:

docker pull bunkerity/bunkerweb-ui

Alternativ können Sie es auch selbst erstellen:

git clone https://github.com/bunkerity/bunkerweb.git && \
cd bunkerweb && \
docker build -t my-bunkerweb-ui -f src/ui/Dockerfile .

Umgebungsvariablen

Bitte lesen Sie den Abschnitt Voraussetzungen, um alle Umgebungsvariablen zu sehen, die Sie zur Anpassung der Web-UI festlegen können.

Der Zugriff auf die Web-UI über BunkerWeb ist eine klassische Reverse-Proxy-Einrichtung. Wir empfehlen Ihnen, BunkerWeb und die Web-UI über ein dediziertes Netzwerk (wie bw-universe, das auch vom Scheduler und Autoconf verwendet wird) zu verbinden, damit es aus offensichtlichen Sicherheitsgründen nicht im selben Netzwerk wie Ihre Webdienste liegt. Bitte beachten Sie, dass der Web-UI-Container auf Port 7000 lauscht.

Datenbank-Backend

Wenn Sie ein anderes Datenbank-Backend als MariaDB wünschen, lesen Sie bitte die docker-compose-Dateien im Ordner misc/integrations des Repositorys.

Hier ist die docker-compose-Vorlage, die Sie verwenden können (vergessen Sie nicht, die changeme-Daten zu bearbeiten):

x-ui-env: &ui-env
  # Wir verankern die Umgebungsvariablen, um Duplikate zu vermeiden
  AUTOCONF_MODE: "yes"
  DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp" # Für QUIC / HTTP3-Unterstützung
    labels:
      - "bunkerweb.INSTANCE=yes" # Wir setzen das Instanz-Label, damit die Autoconf die Instanz erkennen kann
    environment:
      AUTOCONF_MODE: "yes"
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *ui-env
      BUNKERWEB_INSTANCES: ""
      SERVER_NAME: ""
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
      MULTISITE: "yes"
    volumes:
      - bw-storage:/data # Dies wird verwendet, um den Cache und andere Daten wie die Backups zu persistieren
    networks:
      - bw-universe
      - bw-db

  bw-autoconf:
    image: bunkerity/bunkerweb-autoconf:1.6.5
    depends_on:
      - bw-docker
    environment:
      <<: *ui-env
      DOCKER_HOST: "tcp://bw-docker:2375"
    networks:
      - bw-universe
      - bw-docker
      - bw-db

  bw-docker:
    image: tecnativa/docker-socket-proxy:nightly
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      CONTAINERS: "1"
      LOG_LEVEL: "warning"
    networks:
      - bw-docker

  bw-db:
    image: mariadb:11
    # Wir setzen die maximal zulässige Paketgröße, um Probleme mit großen Abfragen zu vermeiden
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-data:/var/lib/mysql
    networks:
      - bw-db

  bw-ui:
    image: bunkerity/bunkerweb-ui:1.6.5
    environment:
      <<: *ui-env
      ADMIN_USERNAME: "changeme"
      ADMIN_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für den changeme-Benutzer festzulegen
      TOTP_ENCRYPTION_KEYS: "mysecret" # Denken Sie daran, einen stärkeren geheimen Schlüssel festzulegen (siehe Abschnitt Voraussetzungen)
    labels:
      - "bunkerweb.SERVER_NAME=www.example.com"
      - "bunkerweb.USE_TEMPLATE=ui"
      - "bunkerweb.USE_REVERSE_PROXY=yes"
      - "bunkerweb.REVERSE_PROXY_URL=/changeme"
      - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000"
    networks:
      - bw-universe
      - bw-db

volumes:
  bw-data:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-docker:
    name: bw-docker
  bw-db:
    name: bw-db

Die Web-UI kann über einen dedizierten Container bereitgestellt werden, der auf Docker Hub verfügbar ist, und Sie können ihn als Standard-Deployment bereitstellen.

Der Zugriff auf die Web-UI über BunkerWeb ist eine klassische Reverse-Proxy-Einrichtung. Die Netzwerksegmentierung zwischen der Web-UI und den Webdiensten wird in dieser Dokumentation nicht behandelt. Bitte beachten Sie, dass der Web-UI-Container auf Port 7000 lauscht.

Datenbank-Backend

Wenn Sie ein anderes Datenbank-Backend als MariaDB wünschen, lesen Sie bitte die YAML-Dateien im Ordner misc/integrations des Repositorys.

Hier ist der entsprechende Teil Ihrer values.yaml-Datei, den Sie verwenden können:

settings:
  # Verwenden Sie ein vorhandenes Secret namens bunkerweb, das die folgenden Werte enthält:
  # - admin-username
  # - admin-password
  # - flask-secret
  # - totp-secrets
  existingSecret: "secret-bunkerweb"
ui:
  wizard: false
  ingress:
    enabled: true
    serverName: "www.example.com"
    serverPath: "/admin"
  overrideAdminCreds: "yes"

Veraltet

Die Swarm-Integration ist veraltet und wird in einer zukünftigen Version entfernt. Bitte erwägen Sie stattdessen die Verwendung der Kubernetes-Integration.

Weitere Informationen finden Sie in der Swarm-Integrationsdokumentation.

Die Web-UI kann über einen dedizierten Container bereitgestellt werden, der auf Docker Hub verfügbar ist:

docker pull bunkerity/bunkerweb-ui

Alternativ können Sie es auch selbst erstellen:

git clone https://github.com/bunkerity/bunkerweb.git && \
cd bunkerweb && \
docker build -t my-bunkerweb-ui -f src/ui/Dockerfile .

Der Zugriff auf die Web-UI über BunkerWeb ist eine klassische Reverse-Proxy-Einrichtung. Wir empfehlen Ihnen, BunkerWeb und die Web-UI über ein dediziertes Netzwerk (wie bw-universe, das auch vom Scheduler und Autoconf verwendet wird) zu verbinden, damit es aus offensichtlichen Sicherheitsgründen nicht im selben Netzwerk wie Ihre Webdienste liegt. Bitte beachten Sie, dass der Web-UI-Container auf Port 7000 lauscht.

Datenbank-Backend

Wenn Sie ein anderes Datenbank-Backend als MariaDB wünschen, lesen Sie bitte die Stack-Dateien im Ordner misc/integrations des Repositorys.

Hier ist die Stack-Vorlage, die Sie verwenden können (vergessen Sie nicht, die changeme-Daten zu bearbeiten):

x-ui-env: &ui-env
  # Wir verankern die Umgebungsvariablen, um Duplikate zu vermeiden
  SWARM_MODE: "yes"
  DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - published: 80
        target: 8080
        mode: host
        protocol: tcp
      - published: 443
        target: 8443
        mode: host
        protocol: tcp
      - published: 443
        target: 8443
        mode: host
        protocol: udp # Für QUIC / HTTP3-Unterstützung
    environment:
      SWARM_MODE: "yes"
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
    networks:
      - bw-universe
      - bw-services
    deploy:
      mode: global
      placement:
        constraints:
          - "node.role == worker"
      labels:
        - "bunkerweb.INSTANCE=yes"

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *ui-env
      BUNKERWEB_INSTANCES: ""
      SERVER_NAME: ""
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
      MULTISITE: "yes"
      USE_REDIS: "yes"
      REDIS_HOST: "bw-redis"
    volumes:
      - bw-storage:/data # Dies wird verwendet, um den Cache und andere Daten wie die Backups zu persistieren
    networks:
      - bw-universe
      - bw-db

  bw-autoconf:
    image: bunkerity/bunkerweb-autoconf:1.6.5
    environment:
      <<: *ui-env
      DOCKER_HOST: "tcp://bw-docker:2375"
    networks:
      - bw-universe
      - bw-docker
      - bw-db

  bw-docker:
    image: tecnativa/docker-socket-proxy:nightly
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      CONFIGS: "1"
      CONTAINERS: "1"
      SERVICES: "1"
      SWARM: "1"
      TASKS: "1"
      LOG_LEVEL: "warning"
    networks:
      - bw-docker
    deploy:
      placement:
        constraints:
          - "node.role == manager"

  bw-db:
    image: mariadb:11
    # Wir setzen die maximal zulässige Paketgröße, um Probleme mit großen Abfragen zu vermeiden
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-data:/var/lib/mysql
    networks:
      - bw-db

  bw-redis:
    image: redis:7-alpine
    networks:
      - bw-universe

  bw-ui:
    image: bunkerity/bunkerweb-ui:1.6.5
    environment:
      <<: *ui-env
      ADMIN_USERNAME: "changeme"
      ADMIN_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für den changeme-Benutzer festzulegen
      TOTP_ENCRYPTION_KEYS: "mysecret" # Denken Sie daran, einen stärkeren geheimen Schlüssel festzulegen (siehe Abschnitt Voraussetzungen)
    networks:
      - bw-universe
      - bw-db
    deploy:
      labels:
        - "bunkerweb.SERVER_NAME=www.example.com"
        - "bunkerweb.USE_TEMPLATE=ui"
        - "bunkerweb.USE_REVERSE_PROXY=yes"
        - "bunkerweb.REVERSE_PROXY_URL=/changeme"
        - "bunkerweb.REVERSE_PROXY_HOST=http://bw-ui:7000"

volumes:
  bw-data:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    driver: overlay
    attachable: true
    ipam:
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
    driver: overlay
    attachable: true
  bw-docker:
    name: bw-docker
    driver: overlay
    attachable: true
  bw-db:
    name: bw-db
    driver: overlay
    attachable: true

Sprachunterstützung & Lokalisierung

Die BunkerWeb-Benutzeroberfläche unterstützt mehrere Sprachen. Die Übersetzungen werden im Verzeichnis src/ui/app/static/locales verwaltet. Derzeit sind die folgenden Sprachen verfügbar:

  • Englisch (en)
  • Französisch (fr)
  • Arabisch (ar)
  • Bengali (bn)
  • Spanisch (es)
  • Hindi (hi)
  • Portugiesisch (pt)
  • Russisch (ru)
  • Urdu (ur)
  • Chinesisch (zh)
  • Deutsch (de)
  • Italienisch (it)

Weitere Informationen zur Herkunft und zum Überprüfungsstatus der Übersetzungen finden Sie in der locales/README.md.

Beitragen von Übersetzungen

Wir freuen uns über Beiträge zur Verbesserung oder zum Hinzufügen neuer Lokalisierungsdateien!

Wie man eine Übersetzung beisteuert:

  1. Bearbeiten Sie die Datei src/ui/app/lang_config.py, um Ihre Sprache hinzuzufügen (Code, Name, Flagge, englischer Name).
  2. Kopieren Sie en.json als Vorlage in src/ui/app/static/locales/ und benennen Sie es in Ihren Sprachcode um (z. B. de.json für Deutsch).
  3. Übersetzen Sie die Werte in Ihrer neuen Datei.
  4. Aktualisieren Sie die Tabelle in locales/README.md, um Ihre Sprache hinzuzufügen und anzugeben, wer sie erstellt/überprüft hat.
  5. Senden Sie einen Pull-Request.

Für Aktualisierungen bearbeiten Sie die entsprechende Datei und aktualisieren Sie die Herkunftstabelle nach Bedarf.

Weitere Richtlinien finden Sie in der locales/README.md.