Skip to content

Migration from Litestream

Walrust and Litestream solve the same problem using the same LTX file format. This guide helps you migrate from Litestream to walrust.

Consider walrust if:

  • Memory-constrained environments - walrust uses 19 MB vs Litestream’s 36 MB (47% reduction)
  • Multi-database setups - walrust uses 20 MB for 100 databases vs Litestream’s 160 MB (88% reduction)
  • Simpler configuration - TOML-based configuration

Stay with Litestream if:

  • You need its mature ecosystem and community
  • You need SFTP or Azure Blob storage backends

Both tools use the same:

  • LTX file format - walrust can read Litestream backups
  • WAL-based replication - same underlying mechanism
  • S3 storage layout - similar directory structure
  • GFS retention - same retention policy model
FeatureLitestreamWalrust
Memory (1 DB)36 MB19 MB
Memory (100 DBs)160 MB20 MB
LanguageGoRust
Config formatYAMLTOML
MetricsPrometheusPrometheus
  • ✅ WAL-based continuous replication
  • ✅ S3-compatible storage (AWS, Tigris, R2, MinIO)
  • ✅ Point-in-time recovery (PITR)
  • ✅ GFS retention policy
  • ✅ Multiple databases per process
  • ✅ Checksum verification (SHA256)
  • ✅ Prometheus metrics
  • ❌ SFTP/Azure Blob storage backends
  • ✅ Python API (pip install walrust)
  • ✅ Read replicas with polling (walrust replicate)
  • ✅ Disk cache for upload queue (optional)
  • ✅ Webhook notifications for failures
  • ✅ Circuit breaker for S3 failures
  • ✅ 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

Before switching, test that walrust can read your Litestream backups:

Terminal window
walrust restore app.db \
--bucket my-backups \
-o /tmp/test.db \
--endpoint https://fly.storage.tigris.dev

If this works, walrust is compatible with your existing backups.

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 backups are unchanged - Litestream will continue from the last TXID

Both tools use the same LTX format, so they’re fully interchangeable.

Based on benchmarks (100KB databases, syncing to Tigris S3):

MetricLitestreamWalrustReduction
Memory (1 DB)36 MB19 MB47%
Memory (10 DBs)55 MB19 MB65%
Memory (100 DBs)160 MB20 MB88%
CPU (idle)<1%<1%-
CPU (active)2-5%2-5%-
Sync latency (P95)~1s~1s-

See Benchmark Results for methodology and detailed data.

Litestream resources:

Walrust resources:

After migrating:

  1. Test your backups - Run periodic test restores
  2. Set up monitoring - Use Prometheus metrics endpoint
  3. Enable validation - Configure validation_interval to verify backups
  4. Optimize retention - Adjust retention policy based on your needs