#!/usr/bin/env bash set -euo pipefail BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DATA_DIR="${BASE_DIR}/vw-data" ENV_FILE="${BASE_DIR}/.env" BACKUP_DIR="${BASE_DIR}/.backup" KEEP_LAST=7 COMPOSE_CMD="docker compose" TIMESTAMP="$(date +'%Y%m%d-%H%M%S')" BACKUP_FILE="${BACKUP_DIR}/vaultwarden-backup-${TIMESTAMP}.tar.gz" echo "======================================================" echo ">>> Vaultwarden BACKUP START" echo ">>> Time: $(date)" echo ">>> Directory: ${BASE_DIR}" echo "======================================================" # 1. STOP container echo ">>> Stopping Vaultwarden (docker compose down)..." ${COMPOSE_CMD} down # Create backup dir if missing mkdir -p "${BACKUP_DIR}" # Sanity checks if [[ ! -d "${DATA_DIR}" ]]; then echo "ERROR: Data directory not found: ${DATA_DIR}" exit 1 fi if [[ ! -f "${ENV_FILE}" ]]; then echo "ERROR: .env file not found: ${ENV_FILE}" exit 1 fi # 2. CREATE BACKUP TAR.GZ echo ">>> Creating backup: ${BACKUP_FILE}" tar -czf "${BACKUP_FILE}" \ -C "${BASE_DIR}" \ .env \ vw-data echo ">>> Backup successfully created." # 3. CLEAN OLD BACKUPS echo ">>> Cleaning old backups (keep last ${KEEP_LAST})..." ls -1t "${BACKUP_DIR}"/vaultwarden-backup-*.tar.gz 2>/dev/null | tail -n +$((KEEP_LAST+1)) | xargs -r rm -f echo ">>> Current backups:" ls -1 "${BACKUP_DIR}" # 4. START container again echo ">>> Starting Vaultwarden (docker compose up -d)..." ${COMPOSE_CMD} up -d echo "======================================================" echo ">>> BACKUP FINISHED OK" echo ">>> Vaultwarden is running again." echo "======================================================"