Skip to main content

Running it

The rule that overrides every other

Do not install Kastell inside the perimeter it must rescue

Same hypervisor, same Active Directory domain, same backup, same identity provider: the day that perimeter falls, Kastell falls with it.

A separate host, separate DNS, a separate alerting path. It is the one operating constraint that is not negotiable.

Backups

No backup mechanism is built into the product. The root console says so rather than showing a reassuring state with nothing behind it.

Three volumes to back up: the database, the object store, the recordings.

docker compose -f docker/compose.yaml --env-file .env exec -T postgres \
pg_dump -U kastell --format=custom kastell > kastell-$(date +%F).dump
A restore never tested is a hypothesis

Test it quarterly. A restored database must pass the root console's integrity check — otherwise the backup was not one.

Monitoring

GET /api/etat

A public probe, no account needed, deliberately poor: it says whether the service works, never who is using it.

Host the status page elsewhere

A status page served by the service it monitors says nothing on the day that service goes down. This probe is what a page hosted elsewhere queries.

GET /api/administration/metriques

The same figures in Prometheus format, root-only: an instance's volumetry says how many crises are open in it.

The root console also offers a diagnostic that actually queries every component — database, storage, media, antivirus, real-time — with its latency. The antivirus probe presents the EICAR test file and requires the verdict "infected": a scanner that answers "clean" to everything is more dangerous than no scanner, because it reassures.

Upgrading

git pull
KASTELL_REVISION=$(git rev-parse HEAD) \
docker compose -f docker/compose.yaml --env-file .env up -d --build
docker compose -f docker/compose.yaml --env-file .env logs app | head -30

Migrations run at startup. The application only declares itself ready once migration has succeeded.

The root account

It administers the instance and does not read crisis content. Crossing from one register to the other exists — an operator must be able to help a customer whose incident log is unreadable after a restore — but it is a break-glass act: justified, capped at eight hours, traced, and visible to the organisation concerned.

A single root locks you out

Grant the right to a second account as soon as you can. A root who loses their phone locks the operator out, and the product refuses to remove the last one.

If you modify Kastell

The AGPL, in its section 13, says that running a modified version over a network counts as distribution: your remote users are entitled to that version's source.

KASTELL_SOURCE_URL=https://git.example.org/our-kastell

An internal repository your users can reach is enough; it need not be public. See Licence.

What is on you, and the product will not do

  • Keeping the preparedness dossier current. The indicator measures it; nobody will fill it in for you.
  • Printing the paper export. It is what remains when everything is encrypted.
  • Getting everyone to open the tool at least once. A tool discovered on the day of the crisis does not get used.