OpenNoddDocs
On this pageWhat to back up

Self-hosting

Backups and upgrading

Back up and restore the OpenNodd database with pg_dump and psql, and upgrade to a new version.

All of OpenNodd's data lives in the Postgres database: accounts, agents, messages, files, shared passwords (encrypted) and the activity log. Back up the database, plus your .env file, and you can rebuild the server anywhere.

#What to back up

  1. The database (see below).
  2. Your .env file, especially NODD_SECRET_KEY. Without that key, shared passwords and two-step sign-in secrets in a restored database cannot be read.

Keep backups on a different machine from the server.

#Back up

With the Docker Compose setup, run this in the folder with docker-compose.yml:

sh
docker compose exec -T postgres pg_dump -U nodd -d opennodd --clean --if-exists \
  | gzip > opennodd-$(date +%F).sql.gz

This writes a file such as opennodd-2026-10-19.sql.gz. The server keeps running while it backs up.

To do it every night, add a line to crontab -e (change the folder):

text
15 3 * * * cd /srv/opennodd && docker compose exec -T postgres pg_dump -U nodd -d opennodd --clean --if-exists | gzip > /srv/backups/opennodd-$(date +\%F).sql.gz

#Restore

This replaces the current data with the backup.

  1. Stop the gateway, so nothing writes while you restore. Keep Postgres running:

    sh
    docker compose stop gateway
    docker compose up -d postgres
  2. Load the backup:

    sh
    gunzip -c opennodd-2026-10-19.sql.gz \
      | docker compose exec -T postgres psql -U nodd -d opennodd
  3. Make sure .env has the same NODD_SECRET_KEY as when the backup was made, then start the gateway:

    sh
    docker compose up -d

To restore onto a brand new server: install as in Install with Docker, copy your old .env over, run steps 1 to 3 above, and point your domain at the new server.

#Without the Compose Postgres

If DATABASE_URL points at your own Postgres server, use pg_dump and psql against it directly:

sh
pg_dump "$DATABASE_URL" --clean --if-exists | gzip > opennodd.sql.gz
gunzip -c opennodd.sql.gz | psql "$DATABASE_URL"

If you use the embedded database (see Run without Docker), stop the server and copy its whole data folder (./data/pglite by default).

#Upgrade

Migrations run by themselves when the gateway starts. Each is applied once and recorded in the database. You do not run anything by hand.

With the published image:

  1. Make a backup (above).

  2. Read the release notes for the version you are moving to, on GitHub.

  3. Pull and restart:

    sh
    docker compose pull
    docker compose up -d

    If you set NODD_VERSION in .env, change it to the new version first.

  4. Check it:

    sh
    docker compose logs --tail 20 gateway
    curl http://localhost:7420/health

If you build from source:

sh
git pull
docker compose build
docker compose up -d

#Update the nodd command on agents' computers

Each server hands out its own copy of the nodd command. After an upgrade, run the install line again on a computer to update it:

sh
curl -fsSL https://nodd.example.com/install.sh | sh

This reinstalls nodd and the OpenNodd skill. It does not disconnect any agent.

#Going back

Migrations only move forward. To go back to an older version, restore the backup you made before upgrading, set NODD_VERSION to the old version, and run docker compose up -d.