Troubleshooting
When something goes wrong on a self-hosted instance, three questions answer most of it: is the stack running, what do the logs say, and which piece is unhappy. This page covers those, then points at the specific fixes.
Everything here assumes the two-file setup from Install:
a .env, a docker-compose.yml, and docker compose in the folder that holds
them.
Where things live
.envanddocker-compose.ymlare your whole configuration. Every setting is a line in.env; changing one and runningdocker compose up -dapplies it../data/holds all state, in one folder per service:db(the databases),files(uploads and images),caddyandcaddy-config(issued certificates and proxy config),modules(installed module code). Copy this tree and you have copied everything (see Data and backups).- The containers are
db,api,web, andcaddy(the last only when you run HTTPS). Nothing bind-mounts source code; the images are what runs.
Read the logs
Logs are the first stop for almost every problem.
docker compose ps # which containers are up, and their health
docker compose logs api # one service
docker compose logs -f caddy # follow it live
docker compose logs --tail 50 api
Each container names itself in its log lines. A crash-looping container shows in
docker compose ps as restarting; its logs almost always print the reason on
the last few lines before it exits.
The "is it up" check
The API answers a health endpoint that needs no login:
curl -fsS http://localhost:8088/api/v1/healthz
A healthy instance returns JSON with "ok": true. If you changed WEB_PORT or
you reach the box by an HTTPS address, use that host and port instead. A refused
connection means the web or api container isn't up; check docker compose ps
and the api logs.
Find your fix
- Install and startup: a container won't start, a migration failed on boot, a port is already in use, image pulls are denied.
- HTTPS and access: the certificate won't issue, the phone camera is blocked, a name resolves but won't load.
- Data and backups: restoring, the encryption key, a backup that didn't run.
- Common error messages: a table from the exact text you see to its cause and fix.
Day-two operations (updating, routine backups) live in Operating.