Skip to content

Migration from Litestream

Walrust and Litestream solve the same problem (SQLite WAL replication to S3) but their backups are not interchangeable. This guide helps you migrate from Litestream to walrust.

Both tools use:

  • WAL-based replication - same underlying mechanism
  • S3 storage layout - similar directory structure
  • GFS retention - same retention policy model
  • LTX-derived format - same origin, but walrust’s checksums break Litestream compatibility
FeatureLitestreamWalrust
Memory (1 DB)36 MB19 MB
Memory (100 DBs)160 MB20 MB
LanguageGoRust
Config formatYAMLTOML
MetricsPrometheusPrometheus

Both tools support: WAL-based continuous replication, S3-compatible storage (AWS, Tigris, R2, MinIO), point-in-time recovery, GFS retention, multiple databases per process, checksum verification, Prometheus metrics.

Litestream only: SFTP and Azure Blob storage backends.

Walrust only: Python API, read replicas with polling, disk cache for upload queue, webhook notifications, circuit breaker, structured exit codes (0-6).

Terminal window
# Rust
cargo install walrust
# Python (optional)
pip install walrust

Verify installation:

Terminal window
walrust --version
Terminal window
# systemd
sudo systemctl stop litestream
# Docker
docker stop litestream

Litestream uses YAML, walrust uses TOML.

Litestream config (litestream.yml):

dbs:
- path: /data/app.db
replicas:
- name: s3
type: s3
bucket: my-backups
path: app.db
endpoint: https://fly.storage.tigris.dev
retention:
hourly: 24
daily: 7
weekly: 12
monthly: 12
snapshot-interval: 1h
sync-interval: 1s

Walrust config (walrust.toml):

[s3]
bucket = "s3://my-backups"
endpoint = "https://fly.storage.tigris.dev"
[sync]
snapshot_interval = 3600 # 1 hour in seconds
wal_sync_interval = 1 # 1 second
[retention]
hourly = 24
daily = 7
weekly = 12
monthly = 12
[[databases]]
path = "/data/app.db"
prefix = "app.db" # Matches Litestream's path

Both tools use standard AWS environment variables:

Terminal window
export AWS_ACCESS_KEY_ID=your-key
export AWS_SECRET_ACCESS_KEY=your-secret
export AWS_ENDPOINT_URL_S3=https://fly.storage.tigris.dev # for Tigris

Since walrust backups are not compatible with Litestream, start fresh:

Terminal window
walrust snapshot /data/app.db \
--bucket my-backups \
--endpoint https://fly.storage.tigris.dev

This creates a new walrust-format snapshot. Your old Litestream backups remain in S3 if you need to roll back.

Terminal window
# CLI
walrust watch /data/app.db \
--bucket my-backups \
--endpoint https://fly.storage.tigris.dev
# Or with config file
walrust watch --config walrust.toml

Old (Litestream):

[Service]
ExecStart=/usr/local/bin/litestream replicate

New (Walrust):

[Service]
ExecStart=/usr/local/bin/walrust watch \
/data/app.db \
--bucket my-backups \
--endpoint https://fly.storage.tigris.dev

Reload and restart:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart walrust
sudo systemctl status walrust

Watch logs:

Terminal window
# systemd
sudo journalctl -u walrust -f
# Docker
docker logs -f walrust
# Direct
export RUST_LOG=walrust=info
walrust watch /data/app.db --bucket my-backups

Check that snapshots are being uploaded:

Terminal window
walrust list --bucket my-backups --endpoint https://fly.storage.tigris.dev
LitestreamWalrustNotes
addr (metrics)--metrics-portDefault: 16767
log-levelRUST_LOG envUse RUST_LOG=walrust=info
LitestreamWalrustNotes
bucket[s3].bucketAdd s3:// prefix in walrust
endpoint[s3].endpointSame format
path[[databases]].prefixS3 prefix for database
snapshot-interval[sync].snapshot_intervalSeconds in walrust
sync-interval[sync].wal_sync_intervalSeconds in walrust
retention[retention]Same structure
validation-interval[sync].validation_intervalSeconds in walrust
LitestreamWalrustNotes
dbs[].path[[databases]].pathSame
Per-DB snapshot interval[[databases]].snapshot_intervalOverride global
Per-DB retention[[databases]].retentionOverride global
Litestream CommandWalrust Equivalent
litestream replicatewalrust watch
litestream snapshots <db>walrust list --bucket <bucket>
litestream restore <db> <path>walrust restore <db> -o <path> --bucket <bucket>
litestream restore -timestamp <time>walrust restore --point-in-time <time>
litestream databaseswalrust list --bucket <bucket>
litestream versionwalrust --version
litestream generations(Not implemented)
litestream wal(Not implemented)

Litestream:

dbs:
- path: /data/app.db
- path: /data/users.db
- path: /data/analytics.db

Walrust:

[[databases]]
path = "/data/app.db"
[[databases]]
path = "/data/users.db"
[[databases]]
path = "/data/analytics.db"

Or use wildcards:

[[databases]]
path = "/data/*.db"

Litestream:

dbs:
- path: /data/critical.db
replicas:
- name: s3
snapshot-interval: 5m # More frequent
retention:
hourly: 48
- path: /data/logs.db
replicas:
- name: s3
snapshot-interval: 1h # Less frequent

Walrust:

[[databases]]
path = "/data/critical.db"
snapshot_interval = 300 # 5 minutes
retention = { hourly = 48, daily = 7, weekly = 12, monthly = 12 }
[[databases]]
path = "/data/logs.db"
snapshot_interval = 3600 # 1 hour (inherits global retention)

Litestream:

services:
litestream:
image: litestream/litestream
command: replicate
volumes:
- app-data:/data
- ./litestream.yml:/etc/litestream.yml

Walrust:

services:
walrust:
image: walrust
command: watch /data/app.db --bucket my-backups
volumes:
- app-data:/data:ro
environment:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_ENDPOINT_URL_S3: https://fly.storage.tigris.dev

If you need to roll back to Litestream:

  1. Stop walrust:
Terminal window
sudo systemctl stop walrust
  1. Restart Litestream:
Terminal window
sudo systemctl start litestream
  1. Your existing Litestream backups are still in S3 — Litestream will continue from the last TXID

Note: Walrust backups cannot be restored by Litestream, so rolling back means losing any backups taken while using walrust.