Docs Self-hosting When something is wrong
When something is wrong
Start with the first lines of the log, docker compose logs worker. Measured, on the path of
Run Fruitback yourself:
[fruitback] listening on 0.0.0.0:8080 · store postgres · origins http://localhost:5500 · trusted proxy hops 0
[fruitback] who reads a site is chosen site by site, in the console: members only, or everyone. FRUITBACK_READ does not apply to a worker with accounts.
[fruitback] better-auth is ready, under /console/auth
The first line names the store, the origins and the hop count the worker actually runs with. A worker
that is refused logs [fruitback] misconfigured, missing: … — /health will report 503 instead. On
docker stop it logs SIGTERM received, draining, and exits within 10 seconds.
/health checks the configuration, and nothing else. It does not open the database, does not call
a tracker, and is not rate-limited. So read a page too, with the id of a site:
curl -H 'Origin: <the site>' 'http://localhost:8080/feedback?url=<the page, encoded>&client=<site_…>'.
| You see | /health |
A read | Cause |
|---|---|---|---|
Compose starts nothing: required variable FRUITBACK_POSTGRES_PASSWORD is missing a value |
n/a | n/a | The password is not in .env (measured). The same for ALLOWED_ORIGINS. |
docker compose up --wait ends with container … is unhealthy |
503 {"ok":false,"error":"misconfigured","missing":[…]} |
500 |
Each entry of missing names a variable and what to do. Fix every one: they are all listed at once (measured). |
The entry names FRUITBACK_DATABASE_URL and « Upgrading » |
503 |
500 |
No database: an .env of before 0.3.0, or a docker run with no address. See Upgrading. |
An entry names a variable of before, FRUITBACK_CLIENTS for example |
503 |
500 |
A variable an instance of before set. Its sentence says what replaces it. See Upgrading. |
| Nothing is planted, the widget keeps the note | 200 |
502 store-unavailable |
The database does not answer, or a tracker refuses its key. The log says which (measured with the database stopped). |
| No link in the log at step 4 | 200 |
n/a | FRUITBACK_FIRST_ADMIN is empty, or a workspace has an owner already. Use admin-link. |
| Pins do not appear, the browser shows a CORS error | 200 |
403 origin-not-allowed or origin-not-allowed-for-client |
The page is on no site of the console, or on another site than the one its script names (measured). |
A read answers 400 client-required or 400 unknown-client |
200 |
400 |
The read names no site, or a site this worker does not have. The script of the console names it (measured). |
| A visitor sees no pin, and a note they send is kept | 200 |
401 identity-required |
The site is read by « Members of … ». Choose « Everyone who visits » in the console, if every visitor may read the notes. |
Docker says healthy, nothing answers from outside |
unreachable | unreachable | HOST is not 0.0.0.0, or PORT is not the published port. |
Every caller gets 429 at once |
200 |
429 rate-limited |
Callers share one bucket: see Check it. |
The other answers the worker gives:
| Code | error |
Means |
|---|---|---|
400 |
invalid-body, invalid-json, invalid-note, invalid-url, missing-url |
The request is wrong. |
401 |
identity-required, invalid-identity |
The read needs a session, or the token did not verify. |
403 |
origin-not-allowed, origin-not-allowed-for-client |
The calling site is not allowed. |
404, 405 |
not-found, method-not-allowed |
No such route. |
413 |
payload-too-large |
The body is over the limit. |
429 |
rate-limited |
The address used up its requests for the minute. |
500 |
misconfigured |
The configuration is refused; /health says why. |
502 |
store-unavailable |
The store did not answer. The widget keeps the note. |
503 |
limiter-unavailable |
The rate limiter’s state did not answer. |