Refactor Vaultwarden installation script
Updated Vaultwarden installation script for NAS setup. Improved error handling, Docker checks, and ensured proper sourcing.
This commit is contained in:
@@ -1,65 +1,97 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
# Vaultwarden installation and configuration script (2025-enhanced)
|
# lib/vaultwarden.sh
|
||||||
|
#
|
||||||
|
# Korrigierte Vaultwarden-Installationsbibliothek für das NAS-Setup-Skript.
|
||||||
|
# Änderungen:
|
||||||
|
# - Kein Top-Level-Aufruf von install_vaultwarden beim Sourcen (verhindert sofortiges exit).
|
||||||
|
# - Fehler führen zu `return`-Codes statt `exit`, damit der Aufrufer (setup.sh) entscheiden kann.
|
||||||
|
# - Prüft, ob Docker vorhanden ist; gibt passenden Rückgabewert bei Fehlen zurück.
|
||||||
|
# - Vorsichtiger Umgang mit existierenden Containern/Verzeichnissen.
|
||||||
|
#
|
||||||
|
# Diese Datei ist dafür gedacht, mit `source` in setup.sh geladen zu werden.
|
||||||
|
|
||||||
install_vaultwarden() {
|
install_vaultwarden() {
|
||||||
|
# Erwartet: log_info, log_error, log_success Funktionen sind verfügbar (aus lib/logging.sh)
|
||||||
|
# Erwartet: VAULTWARDEN_DATA_DIR gesetzt (aus config/defaults.sh)
|
||||||
|
local container_name="vaultwarden"
|
||||||
|
local image="vaultwarden/server:latest"
|
||||||
|
local host_port="${VAULTWARDEN_PORT:-8080}"
|
||||||
|
local data_dir="${VAULTWARDEN_DATA_DIR:-/opt/vaultwarden}"
|
||||||
|
|
||||||
log_info "Installing Vaultwarden..."
|
log_info "Installing Vaultwarden..."
|
||||||
|
|
||||||
# Docker muss installiert sein
|
# Prüfen: Docker vorhanden?
|
||||||
if ! command -v docker &>/dev/null; then
|
if ! command -v docker >/dev/null 2>&1; then
|
||||||
log_error "Docker ist nicht installiert. Bitte Docker zuerst installieren."
|
log_error "Docker ist nicht installiert."
|
||||||
exit 1
|
log_error "Bitte Docker zuerst installieren oder im Setup erlauben, Docker zu installieren."
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Erstelle Verzeichnis für Vaultwarden
|
# Sicherstellen, dass das Datenverzeichnis vorhanden ist
|
||||||
local vault_dir="${VAULTWARDEN_DATA_DIR:-/opt/vaultwarden}"
|
if ! mkdir -p "${data_dir}" >/dev/null 2>&1; then
|
||||||
sudo mkdir -p "$vault_dir"
|
log_error "Konnte Datenverzeichnis '${data_dir}' nicht anlegen."
|
||||||
sudo chown "$USER:$USER" "$vault_dir"
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
# Erstelle docker-compose.yml
|
# Prüfen, ob ein Container mit dem gewünschten Namen bereits existiert
|
||||||
cat <<EOF | sudo tee "$vault_dir/docker-compose.yml" > /dev/null
|
if docker ps -a --format '{{.Names}}' | grep -xq "${container_name}"; then
|
||||||
version: '3.8'
|
log_info "Ein Container mit Namen '${container_name}' existiert bereits."
|
||||||
services:
|
# Wenn der Container gestoppt ist, starten wir ihn; wenn er läuft, nichts tun.
|
||||||
vaultwarden:
|
if docker ps --format '{{.Names}}' | grep -xq "${container_name}"; then
|
||||||
image: vaultwarden/server:latest
|
log_info "Container '${container_name}' läuft bereits. Überspringe Erstellung."
|
||||||
container_name: vaultwarden
|
log_success "Vaultwarden ist (vermutlich) bereits installiert und läuft."
|
||||||
restart: unless-stopped
|
return 0
|
||||||
volumes:
|
else
|
||||||
- ./vw-data:/data
|
log_info "Starte vorhandenen Container '${container_name}'..."
|
||||||
ports:
|
if docker start "${container_name}" >/dev/null 2>&1; then
|
||||||
- "8080:80" # HTTP on 8080
|
log_success "Container '${container_name}' erfolgreich gestartet."
|
||||||
environment:
|
return 0
|
||||||
- WEBSOCKET_ENABLED=true
|
else
|
||||||
- SIGNUPS_ALLOWED=false # Disable signups by default for security
|
log_error "Fehler beim Starten des Containers '${container_name}'."
|
||||||
- ADMIN_TOKEN= # Set admin token later
|
return 3
|
||||||
EOF
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
cd "$vault_dir"
|
# Pull the image first (optional, improves reliability)
|
||||||
|
log_info "Lade Vaultwarden-Image '${image}' herunter..."
|
||||||
|
if ! docker pull "${image}"; then
|
||||||
|
log_error "Fehler beim Herunterladen des Images '${image}'."
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
|
||||||
# Pull the latest image
|
# Start the container (grundlegendes Beispiel)
|
||||||
handle_error sudo docker pull vaultwarden/server:latest
|
# Anpassungen möglich: Ports, Umgebungsvariablen (z.B. ADMIN_TOKEN), Volumes, Netzwerke.
|
||||||
|
log_info "Erstelle und starte Container '${container_name}' (Port ${host_port})..."
|
||||||
|
if docker run -d \
|
||||||
|
--name "${container_name}" \
|
||||||
|
--restart unless-stopped \
|
||||||
|
-v "${data_dir}:/data" \
|
||||||
|
-p "${host_port}:80" \
|
||||||
|
"${image}" >/dev/null 2>&1; then
|
||||||
|
|
||||||
# Start Vaultwarden
|
log_success "Vaultwarden-Container '${container_name}' erfolgreich erstellt und gestartet."
|
||||||
handle_error sudo docker-compose up -d
|
log_info "Vaultwarden erreichbar auf Port ${host_port} (http)."
|
||||||
|
return 0
|
||||||
# Warte kurz und prüfe Status
|
|
||||||
sleep 5
|
|
||||||
if sudo docker ps | grep -q vaultwarden; then
|
|
||||||
log_success "Vaultwarden wurde erfolgreich installiert und läuft auf Port 8080."
|
|
||||||
log_info "Um Admin-Zugang zu aktivieren, setze ADMIN_TOKEN in der docker-compose.yml und starte neu."
|
|
||||||
log_info "Web-Interface: http://$(hostname -I | awk '{print $1}'):8080"
|
|
||||||
else
|
else
|
||||||
log_error "Vaultwarden-Container konnte nicht gestartet werden."
|
log_error "Fehler beim Erstellen/Starten des Vaultwarden-Containers."
|
||||||
return 1
|
return 5
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Logging functions if not available
|
# Optional: Helfer, der prüft ob Vaultwarden bereits installiert ist (Exit-Code 0 = installiert)
|
||||||
if ! command -v log_info &>/dev/null; then
|
is_vaultwarden_installed() {
|
||||||
log_info() { echo "[INFO] $1"; }
|
if command -v docker >/dev/null 2>&1 && docker ps -a --format '{{.Names}}' | grep -xq '^vaultwarden$'; then
|
||||||
log_success() { echo "[SUCCESS] $1"; }
|
return 0
|
||||||
log_error() { echo "[ERROR] $1" >&2; }
|
fi
|
||||||
fi
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# Main execution
|
# Nur ausführen, wenn diese Datei direkt ausgeführt wird (nicht beim `source` in setup.sh).
|
||||||
install_vaultwarden
|
# Das erlaubt unabhängiges Testen, ohne dass Sourcing das Haupt-Skript beendet.
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
# Falls direkt ausgeführt: versuchen wir die Funktion und geben das Ergebnis als Exit-Code zurück.
|
||||||
|
install_vaultwarden "$@"
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user