How to keep your Datalumo instance current and your data safe.
Updating changes the app, admin UI, widget, and CLI. It does not touch your data or config. These stay put:
| Kept |
Where |
| Your content (SQLite or Postgres) |
The data volume |
| Config |
datalumo.config.json |
| Secrets |
.env |
| Admin key |
/app/data/admin-key |
The installer is also your updater. From your install directory:
cd ~/datalumo
./install.sh --update
It pulls the latest image, recreates the app, checks its health, and rolls back to the previous image automatically if the new one is unhealthy. Your database, Redis, and Caddy keep running.
This is not zero-downtime. The app is briefly unreachable while the new container starts, usually a few seconds. If a bad image has to be caught and rolled back, expect about a minute.
Off by default. To run updates nightly:
./install.sh --enable-auto-update # disable with --disable-auto-update
Set a custom schedule in .env before enabling:
DATALUMO_AUTO_UPDATE_CRON="0 3 * * 0" # Sundays at 03:00
Update logs go to ~/datalumo/logs/update.log.
By default you track latest. For deliberate upgrades, pin a specific image in .env:
DATALUMO_IMAGE=registry.datalumo.app/datalumo:v0.2.0
There's no separate migrate step. Each time the app starts it applies any pending database migrations. Migrations are forward-only, so back up before a major upgrade and pin versions so a rollback is predictable.
dl backup writes a consistent single-file snapshot while the server runs. Don't copy the live .db file by hand; it can tear.
docker compose exec datalumo dl backup --out /app/data/backups
Copy them off the server:
docker compose cp datalumo:/app/data/backups ./local-backups
dl backup detects Postgres and prints the command to run. Use pg_dump, or your managed Postgres backups:
docker compose exec -T postgres pg_dump -U datalumo datalumo > datalumo-$(date +%Y%m%d).sql
datalumo.config.json, if it isn't in git.
.env and any other secrets.
- The admin key (
/app/data/admin-key), or note it in your secrets store.
Redis only holds rate-limit counters, so there's nothing to back up there.
For a portable copy of an index, or to move it to another database, export its items as JSONL:
docker compose exec datalumo dl export docs --file /app/data/docs.jsonl
Re-import anywhere with dl ingest docs --file docs.jsonl. Importing re-embeds the content, so it works across embedding models and across SQLite and Postgres.
- SQLite: stop the app, replace
datalumo.db with your backup (renamed), start again.
- Postgres: restore into a database, point
DATALUMO_DATABASE_URL at it, start again.
Run dl doctor after any restore.
A nightly SQLite snapshot via cron:
0 3 * * * cd ~/datalumo && docker compose exec -T datalumo dl backup --out /app/data/backups
Ship the backups off the box with rsync, S3, or your own tooling.