Files
vaultwarden/restore-vaultwarden.sh
Paul Kartchner 2154ca1ce0 Add Vaultwarden backup system and fix HTTP header validation
- Added BACKUP.md with comprehensive backup/restore documentation
- Created backup-vaultwarden.sh for automated PostgreSQL and data backups
- Created restore-vaultwarden.sh for safe backup restoration
- Fixed HTTP response validation by configuring Vaultwarden-specific headers
- Set X-XSS-Protection: 0 (as required by Vaultwarden)
- Set X-Frame-Options: SAMEORIGIN for API calls
- Removed conflicting secure-headers@file middleware
- Added custom vaultwarden-headers middleware
- Updated .gitignore to exclude backups/ directory

Backup system:
- Backs up to /srv/backups/vaultwarden/ (configurable)
- Logs to /var/log/vaultwarden/backup.log
- 30-day retention policy
- Includes PostgreSQL database, RSA key, config, and .env

Note: Backup scripts should be moved to /srv/backups/scripts/ for production use

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-10 16:14:34 +00:00

88 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
# Vaultwarden Restore Script
# Restores PostgreSQL database and critical data files from backup
set -e
# Check if backup timestamp provided
if [ -z "$1" ]; then
echo "Usage: $0 YYYYMMDD_HHMMSS"
echo ""
echo "Available backups:"
ls -1 /srv/backups/vaultwarden/vaultwarden_db_*.dump 2>/dev/null | \
sed 's/.*vaultwarden_db_\(.*\)\.dump/ \1/' | sort -r
exit 1
fi
TIMESTAMP=$1
BACKUP_DIR="/srv/backups/vaultwarden"
PGHOST="postgresql.pkartchner.com"
PGPORT="5432"
PGUSER="vaultwarden"
PGDATABASE="vaultwarden"
PGPASSWORD="lXleSC6e5mL1ZZs8qwG+NWhNh478ipGptRXsEMZRs28="
# Verify backup files exist
DB_BACKUP="$BACKUP_DIR/vaultwarden_db_$TIMESTAMP.dump"
DATA_BACKUP="$BACKUP_DIR/vaultwarden_data_$TIMESTAMP.tar.gz"
if [ ! -f "$DB_BACKUP" ]; then
echo "Error: Database backup not found: $DB_BACKUP"
exit 1
fi
if [ ! -f "$DATA_BACKUP" ]; then
echo "Error: Data backup not found: $DATA_BACKUP"
exit 1
fi
echo "=== Vaultwarden Restore Started: $(date) ==="
echo "WARNING: This will replace your current Vaultwarden data!"
echo "Database backup: $DB_BACKUP"
echo "Data backup: $DATA_BACKUP"
echo ""
read -p "Are you sure you want to continue? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
echo "Restore cancelled"
exit 0
fi
# Stop Vaultwarden container
echo ""
echo "Stopping Vaultwarden container..."
cd /srv/docker-compose/vaultwarden
docker compose stop vaultwarden
echo "✓ Container stopped"
# Restore database
echo ""
echo "Restoring PostgreSQL database..."
docker run --rm \
-e PGPASSWORD="$PGPASSWORD" \
-v "$BACKUP_DIR:/backup" \
postgres:18-alpine \
pg_restore -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDATABASE" \
--clean --if-exists -v "/backup/vaultwarden_db_$TIMESTAMP.dump" 2>&1 | \
grep -E "(restoring|processing|creating|finished)" || true
echo "✓ Database restored"
# Restore data directory
echo ""
echo "Restoring data directory..."
tar -xzf "$DATA_BACKUP" -C /srv/docker-compose/vaultwarden
echo "✓ Data directory restored"
# Start Vaultwarden container
echo ""
echo "Starting Vaultwarden container..."
docker compose start vaultwarden
sleep 3
docker compose ps vaultwarden
echo "✓ Container started"
echo ""
echo "=== Vaultwarden Restore Completed: $(date) ==="
echo "Please verify your Vaultwarden instance is working correctly."