Files
vaultwarden/BACKUP.md
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

3.9 KiB

Vaultwarden Backup and Restore

What Gets Backed Up

Critical (Required for restore):

  • PostgreSQL Database - All vault data (passwords, notes, attachments metadata, etc.)
  • rsa_key.pem - RSA private key (required to decrypt existing vault data)
  • .env file - Database credentials and SMTP configuration

Important:

  • config.json - Vaultwarden admin settings

Excluded (regenerated automatically):

  • icon_cache/ - Website favicons
  • tmp/ - Temporary files

Backup Location

All backups are stored in: /srv/backups/vaultwarden/

Each backup includes:

  • vaultwarden_db_YYYYMMDD_HHMMSS.dump - PostgreSQL database (compressed)
  • vaultwarden_data_YYYYMMDD_HHMMSS.tar.gz - Data directory (config + RSA key)
  • vaultwarden_env_YYYYMMDD_HHMMSS.env - Environment variables

Manual Backup

Run the backup script manually:

/srv/backups/scripts/backup-vaultwarden.sh

Automated Backups

Set up daily automated backups using cron:

# Create log directory
sudo mkdir -p /var/log/vaultwarden
sudo chown pkartch:pkartch /var/log/vaultwarden

# Edit crontab
crontab -e

# Add this line for daily backups at 2:00 AM
0 2 * * * /srv/backups/scripts/backup-vaultwarden.sh >> /var/log/vaultwarden/backup.log 2>&1

Alternative schedules:

# Every 6 hours
0 */6 * * * /srv/backups/scripts/backup-vaultwarden.sh >> /var/log/vaultwarden/backup.log 2>&1

# Twice daily (2 AM and 2 PM)
0 2,14 * * * /srv/backups/scripts/backup-vaultwarden.sh >> /var/log/vaultwarden/backup.log 2>&1

# Weekly on Sunday at 3 AM
0 3 * * 0 /srv/backups/scripts/backup-vaultwarden.sh >> /var/log/vaultwarden/backup.log 2>&1

Restore from Backup

  1. List available backups:
/srv/backups/scripts/restore-vaultwarden.sh
  1. Restore a specific backup:
/srv/backups/scripts/restore-vaultwarden.sh 20251210_050042

Warning: Restore will:

  • Stop the Vaultwarden container
  • Replace the PostgreSQL database
  • Replace data directory files
  • Restart the container

Retention Policy

  • Backups older than 30 days are automatically deleted
  • To change retention, edit RETENTION_DAYS in backup-vaultwarden.sh

Off-Site Backup Recommendations

The backup directory is stored locally. For disaster recovery, consider:

  1. Sync to another server:
# Using rsync
rsync -avz /srv/backups/vaultwarden/ user@backup-server:/backups/vaultwarden/
  1. Upload to cloud storage (S3, Backblaze B2, etc.):
# Using rclone (example)
rclone sync /srv/backups/vaultwarden/ remote:vaultwarden-backups/
  1. Add to existing backup solution (e.g., Restic, Borg, Duplicati)

Testing Restores

Test your backups regularly:

# Test restore on a different machine or use a test database
PGDATABASE="vaultwarden_test" ./restore-vaultwarden.sh 20251210_050042

Backup Verification

Check backup integrity:

# List backup contents
docker run --rm -v /srv/backups/vaultwarden:/backup postgres:18-alpine \
  pg_restore --list /backup/vaultwarden_db_20251210_050042.dump | head -20

# Verify data archive
tar -tzf /srv/backups/vaultwarden/vaultwarden_data_20251210_050042.tar.gz

Troubleshooting

Backup fails with "Permission denied"

  • Ensure the backup directory is writable by your user
  • Check Docker has access to mount the backup directory

Restore fails with version mismatch

  • Update the PostgreSQL Docker image version in restore script to match your database

Large backup sizes

  • Database size grows with number of users and vault items
  • Consider increasing retention period if backups are large
  • Attachments are stored in the database (not as files)

Security Notes

  • Backup files contain sensitive data (encrypted vault data + encryption keys)
  • Protect backup directory with appropriate file permissions
  • Encrypt backups before uploading to cloud storage
  • Store .env file separately as it contains database credentials
  • Backups are stored outside the git repository in /srv/backups/vaultwarden/