Troubleshooting
#The container exits at boot
Read the log: the server says why before it stops.
- An environment variable is invalid. The message names it. The usual one is
AUTH_SECRET must be at least 32 characters: generate one withopenssl rand -base64 32. set AUTH_SECRETfrom Compose itself: the.envnext tocompose.prod.yamlis missing or doesn't define it.- The database can't be migrated. Either the volume isn't writable by uid 1000, or the database was migrated by a build whose migrations this one doesn't have, unchanged. The message names the database and the migration's date; see Backups and upgrades.
#Every form fails: "Cross-site POST form submissions are forbidden"
Pages render, but signing in, saving or adding anything answers 403. The origin the browser sends doesn't match the one the server works out.
- Plain HTTP with no proxy: set
ORIGINto the exact URL you type, scheme and port included, likehttp://192.168.1.10:3000. - Behind a proxy: make it send
X-Forwarded-ProtoandX-Forwarded-Host, or setORIGINto the public URL.
See Configuration.
#I lost the setup code
Restart the container and it prints a new one, or use Code expired? Print a
new one on the setup screen, at most once a minute. A code lasts 15 minutes
and five wrong tries. Look for Setup code in the log.
#The setup screen sends me to sign-in
An account already exists, so setup is closed for good. If you never made one, someone else reached the instance first: stop it, delete the volume, and start again behind access control until the admin account is yours.
#Sign-ups won't turn on
They need email, to send the verification code. Set up SMTP in Admin, Email first; see Email.
#Invites and codes never arrive
Check Admin, Overview: a failed email is a failed job, with the SMTP server's error. Send yourself a test from Admin, Email. Meanwhile, an invite link can always be copied from Admin, Invites and sent by hand.
#Passkeys aren't offered
Browsers only expose passkeys in a secure context: HTTPS, or localhost. Serve
the instance over HTTPS. The same goes for installing it on a phone.
#Single sign-on fails after the provider
The redirect URI registered with the provider must match the one on Admin,
Sign-in methods exactly. It is built from ORIGIN when set; behind a proxy
without it, check the proxy forwards the public host. A brand new person also
needs sign-ups open, or an invite first. See
Sign-in and single sign-on.
#Everyone was signed out and email stopped working
AUTH_SECRET changed. Sessions signed with the old one are void, and the
secrets encrypted with it (SMTP password, single sign-on client secrets,
authenticator apps) can't be read. Put the old value back if you have it;
otherwise enter the SMTP password and client secrets again, and have people set
up their authenticator app again.
#Repeating expenses didn't appear
The worker adds them at boot and daily just after midnight UTC, and the server
log shows Added repeating expenses with a count each time. If it never shows,
look for the worker restarting in a loop. A paused rule adds nothing until
resumed; see Repeating expenses.
#Scan a receipt is missing, or a PDF won't read
The button only shows when an admin turned receipt reading on, and only when adding an expense. Admin, Receipts says whether Tesseract and its languages are installed, and whether PDFs can be read, which needs Poppler. See Receipt reading.
#Reading the logs
docker compose -f compose.prod.yaml logs -f opencountSet LOG_LEVEL=debug for more. An error page shows an Error ID; the same id
is on the log line with the real error. See
Logs, traces and errors.
This guide lives in the project repo: edit it there, and this page follows within a day.