Operations
Upgrades, backups, air-gapped installs and licensing — the things you do after it is running.
Upgrading
Back up /data first, point at the new tag, and bring it up. Migrations run on boot.
# edit .env: VITRINKA_VERSION=vX.Y.Z
docker compose up -d- No hard stops — every release migrates from every prior release, so you can skip versions.
- You never edit shipped files — release notes may add optional
.envkeys; nothing you are given is meant to be modified. - Server before clients — deploy the server before shipping clients that call new endpoints.
Backups
/data — the vitrinka-data volume — holds the SQLite databases and, unless you use S3, the blobs. Back it up on your normal schedule and before every upgrade.
docker compose stop vitrinka
docker compose run --rm --no-deps --entrypoint sh -v "$PWD:/backup" vitrinka \
-c 'cd /data && tar czf /backup/vitrinka-data-$(date +%F).tgz .'
docker compose start vitrinkaRun it through compose, as above. A bare docker run -v vitrinka-data:… mounts a different, unrelated global volume rather than the project-scoped one the app actually uses — and you would back up nothing.
Your licence is not in /data
It lives in the bundle's ./license/ directory, mounted read-only into the container. Back up /data for your data and keep the bundle directory for your licence — they are two separate things to preserve.
Air-gapped installs
The bundle ships an image.tar, a LOAD-AIRGAP.md and the CLI binaries. Load the image into your internal registry or straight into Docker, point VITRINKA_IMAGE at it, and set AIR_GAP=1 to disable every outbound call — breach checks and update pings included.
shasum -a 256 -c SHA256SUMS # verify the bundle firstThe CLI, without a registry
The bundle carries the CLI too — six static binaries, one per platform, plus cli/latest.json. Workstations need it to capture sets and drive the work queue, and npm install -g assumes a registry your estate may not have.
Point $VITRINKA_RELEASE_FEED at your own internal mirror and vitrinka update keeps working offline. The bundle's cli/README.md carries the install instructions and the PowerShell path.
Licensing
Drop your vendor-signed license.json into ./license/. Compose mounts it read-only at /run/license, which is where the server looks.
- Without a licence — vitrinka runs in an unrestricted evaluation posture.
- An expired licence — enters a grace period with a banner before any restriction.
Never a hard shutdown, and never data loss.