Skip to content

Backup & restore

Back up the configuration, database, and media together. The database contains recording details and user access; the media files contain the recordings themselves.

What to save Contents
Configuration server/.env, your config.toml, and any Compose overrides. Keep the existing SESSION_SECRET.
Database Schedules, recording details, download progress, accounts, invitations, sessions, and dashboard system settings.
Storage Recordings, previews, and the .replayvod-storage identity file at the storage root.

Store a separate copy of your media even when you use S3. A bucket used as the primary recording store is not itself a backup.

Stop the recorder before copying the database. If SQLite’s -wal and -shm files remain beside it, keep them with the copy.

The supplied Compose file stores data in a Docker volume at /app/data, rather than a data/ directory on the host. To copy it from the SQLite container, run these commands from the ReplayVOD install directory:

Terminal window
mkdir -p backup/data
docker compose --env-file server/.env --profile sqlite stop replayvod-sqlite
docker compose --env-file server/.env --profile sqlite cp replayvod-sqlite:/app/data/. ./backup/data/
docker compose --env-file server/.env --profile sqlite start replayvod-sqlite

This copies the entire data directory, including local recordings. Copy backup/ to your backup destination and save the configuration files too.

For a source install or custom bind mount, stop the server and copy the directory containing SQLITE_PATH with your usual backup tool.

For the supplied PostgreSQL Compose profile, stop the recorder while taking the database and media backup:

Terminal window
docker compose --env-file server/.env --profile postgres stop replayvod-postgres
docker compose --env-file server/.env --profile postgres exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB"' > replayvod.sql

Back up the media and configuration before starting replayvod-postgres again. For an external PostgreSQL server, use pg_dump with that server’s connection settings.

For local storage, copy the whole storage directory, including .replayvod-storage. The default Compose volume is mounted at /app/data; source installs default to ./data.

For S3, back up or replicate the bucket’s objects, including the identity marker. Keep that backup separate from automatic deletions in the primary bucket.

Finished recordings don’t change, so incremental backups usually need to copy only new recordings. Keep the database backup from the same backup run so recording details match the saved files.

  1. Install the same ReplayVOD version used for the backup. Keep the recorder stopped while restoring.
  2. Restore server/.env, config.toml, and any Compose overrides. Preserve the original SESSION_SECRET.
  3. Restore the SQLite files or import the PostgreSQL dump into an empty database.
  4. Restore the media and .replayvod-storage marker to their configured locations. For Docker, restore them into the volume mounted at /app/data.
  5. Start ReplayVOD, sign in, and play an existing recording.

The database and storage marker must belong to the same installation. If the dashboard reports a mismatch, check that you restored the matching database and storage. See Storage is not attached.

The EventSub signing secret is stored in the database and returns with that backup. ReplayVOD checks its Twitch subscriptions again after startup.