diff --git a/vaultwarden-backup.sh b/vaultwarden-backup.sh index 70e83ac..6e90f78 100644 --- a/vaultwarden-backup.sh +++ b/vaultwarden-backup.sh @@ -36,35 +36,36 @@ if [ ! -d "$BACKUP_DEST_DIR" ]; then 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 +# FALLBACK METHOD: Since 'sqlite3' is missing in the container, we simply copy the DB file. +# Note: This is *technically* not transaction-safe if writes happen exactly during copy, +# but for a personal vault, it's usually acceptable (WAL mode helps). +# Ideally, install sqlite3 in container or use vaultwarden/server:alpine which might have it. -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" +if [ -f "$BACKUP_SOURCE_DIR/db.sqlite3" ]; then + cp "$BACKUP_SOURCE_DIR/db.sqlite3" "$BACKUP_DEST_DIR/$FILENAME" + + # Also copy the WAL and SHM files if they exist (crucial for WAL mode integrity) + if [ -f "$BACKUP_SOURCE_DIR/db.sqlite3-wal" ]; then + cp "$BACKUP_SOURCE_DIR/db.sqlite3-wal" "$BACKUP_DEST_DIR/db_backup_${TIMESTAMP}.sqlite3-wal" + fi + if [ -f "$BACKUP_SOURCE_DIR/db.sqlite3-shm" ]; then + cp "$BACKUP_SOURCE_DIR/db.sqlite3-shm" "$BACKUP_DEST_DIR/db_backup_${TIMESTAMP}.sqlite3-shm" + fi + + log_info "SUCCESS: Backup created at $BACKUP_DEST_DIR/$FILENAME" else - log_error "ERROR: Backup file '$HOST_FILE_PATH' not found on host." + log_error "ERROR: Source DB file '$BACKUP_SOURCE_DIR/db.sqlite3' not found." exit 1 fi -# 4. Cleanup / Rotation +# 3. 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 +find "$BACKUP_DEST_DIR" -name "db_backup_*.sqlite3*" -type f -mtime +$RETENTION_DAYS -delete log_info "Backup process completed." exit 0 \ No newline at end of file