Noodara
Operate

Troubleshooting

The complete exit code table and the commands to diagnose a failed install.

Every failure the installer can produce has its own exit code and its own actionable message. This is the complete table, taken directly from the script:

Exit codeReasonWhat to do
10Not running as rootRe-run the installer with sudo.
11A required command is missingInstall the named command (curl, openssl, ss, ip, awk or grep) and re-run.
12Unsupported operating systemNoodara requires Ubuntu 22.04 or 24.04.
13Unsupported architectureNoodara requires amd64 or arm64.
14Insufficient RAMFree up memory, add RAM, or set NOODARA_SKIP_RESOURCE_CHECK=1 to override deliberately.
15Insufficient free diskFree up disk space, or set NOODARA_SKIP_RESOURCE_CHECK=1 to override deliberately.
16The panel port is already in useSet NOODARA_PORT=<other> and re-run.
17Docker was installed via snapRemove it (sudo snap remove docker) and re-run — Noodara does not support a snap-installed Docker.
20Docker Engine installation failedRead the apt output printed above the error and fix the underlying issue, or install Docker manually.
21The Compose plugin is still missing after installationInstall docker-compose-plugin manually and re-run.
22Docker is installed but its daemon is not respondingStart it (sudo systemctl start docker) and re-run. Nothing is touched — the installer never removes or reinstalls an existing Docker.
30Writing .env (or a value in it) failedThe message names the exact variable or file operation that failed; fix it and re-run.
40Could not resolve which version to installSet NOODARA_VERSION=<tag> explicitly and re-run.
41Could not resolve a public URLSet NOODARA_PUBLIC_URL=<url> explicitly and re-run.
50Pulling images failedCheck network connectivity and the resolved image tags, then re-run.
51docker compose up failedRead Compose's own error and the service state printed above. Data and secrets are untouched.
52Database migrations failedRead the migrate service's log tail printed above. Data and secrets are untouched.
53A service did not become healthy in timeRead the named service's log tail printed above. Data and secrets are untouched; see Rollback if this happened during an upgrade.

Reading logs:

docker compose -f /opt/noodara/docker-compose.yml logs <service>

Checking health:

docker compose -f /opt/noodara/docker-compose.yml ps
docker compose -f /opt/noodara/docker-compose.yml exec -T api node -e "fetch('http://127.0.0.1:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" && echo healthy
curl -I http://127.0.0.1:<port>/login

The ps HEALTH column reflects each service's own Compose healthcheck:. The middle command re-runs the api container's own healthcheck by hand, from inside the container against its /health route directly (the same call docker-compose.yml's api healthcheck itself makes) — only web publishes a port on the host, and web only proxies /api/* to api (see What gets installed), so /health is never reachable from outside the container. The last command confirms the panel itself is answering on the port you published.

Running the operator CLI inside the running api container:

docker compose -f /opt/noodara/docker-compose.yml exec api node dist/cli/index.js admin reset
docker compose -f /opt/noodara/docker-compose.yml exec api node dist/cli/index.js secrets rotate

admin reset issues a one-time recovery token for the existing admin account. secrets rotate re-encrypts every stored credential under a newly rotated master key.