Updates and backups

How to keep your Datalumo instance current and your data safe.

What's kept when you update

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

Updating

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.

Automatic updates

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.

Pinning a version

By default you track latest. For deliberate upgrades, pin a specific image in .env:

DATALUMO_IMAGE=registry.datalumo.app/datalumo:v0.2.0

Migrations

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.

Backups

SQLite (default)

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

Postgres

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

Also save

  • 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.

Export your content

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.

Restore

  • 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.

Scheduled backups

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.

See also