#!/bin/bash set -euo pipefail # --- Settings --- # Container Name CONTAINER_NAME="vaultwarden" # Host path mapped to /data inside the container BACKUP_SOURCE_DIR="/home/mbuz/docker/vaultwarden" # Destination for backups BACKUP_DEST_DIR="/mnt/media/vault_backups" # Retention Policy: Delete backups older than N days RETENTION_DAYS=30 # Syslog Tag LOG_TAG="vaultwarden-backup" # --- End of Settings --- # Logging helpers log_info() { logger -t "$LOG_TAG" -p user.info "$1"; } log_error() { logger -t "$LOG_TAG" -p user.error "$1"; } log_info "Starting Vaultwarden backup..." # 1. Mount Check if [ ! -d "$BACKUP_DEST_DIR" ]; then log_info "Destination directory not found. Attempting to mount..." sudo mount -a || true sleep 2 if [ ! -d "$BACKUP_DEST_DIR" ]; then log_error "ERROR: Destination '$BACKUP_DEST_DIR' unavailable after mount attempt." exit 1 fi fi # 2. Backup Execution # We assume the container has 'sqlite3' installed. If not, this will fail safely. # Format: db_backup_YYYYMMDD_HHMMSS.sqlite3 TIMESTAMP=$(date +%Y%m%d_%H%M%S) FILENAME="db_backup_${TIMESTAMP}.sqlite3" log_info "Creating backup: $FILENAME" # We execute sqlite3 inside the container to safely backup the DB to the /data volume (mapped to host) if ! docker exec "$CONTAINER_NAME" command -v sqlite3 &>/dev/null; then log_error "ERROR: 'sqlite3' command not found inside '$CONTAINER_NAME'. Please install it or check image." exit 1 fi docker exec "$CONTAINER_NAME" sqlite3 /data/db.sqlite3 ".backup '/data/$FILENAME'" # 3. Verify and Move HOST_FILE_PATH="$BACKUP_SOURCE_DIR/$FILENAME" if [ -f "$HOST_FILE_PATH" ]; then mv "$HOST_FILE_PATH" "$BACKUP_DEST_DIR/" log_info "SUCCESS: Backup moved to $BACKUP_DEST_DIR/$FILENAME" else log_error "ERROR: Backup file '$HOST_FILE_PATH' not found on host." exit 1 fi # 4. Cleanup / Rotation log_info "Cleaning up backups older than $RETENTION_DAYS days..." find "$BACKUP_DEST_DIR" -name "db_backup_*.sqlite3" -type f -mtime +$RETENTION_DAYS -delete log_info "Backup process completed." exit 0