Common Errors
Below are the problems encountered most often. The format is the same: symptom â cause â fix. Start with the logs â almost always the cause is visible there:
docker compose logs --tail=100 xpanel
docker compose ps
The full set of diagnostic commands is in Useful Commands.
A quick cheat sheet: what you see â what to look at.
| Symptom in the log or interface | Likely cause |
|---|---|
Reverse proxy and HTTPS are required | no X-Forwarded-* headers from the proxy |
â METRICS_USER / â METRICS_PASS | metrics variables are not set |
| Node does not connect | NODE_PORT is closed or SECRET_KEY is incomplete |
address already in use | the port is taken by another process |
certbot fails | DNS, port 80, or a foreign server_name |
xpanel-db in the unhealthy state | .env, the volume, or the PostgreSQL version |
| 502 Bad Gateway from nginx | the panel is not listening on 127.0.0.1:3000 |
| Sign-in stopped working | APP_SECRET was changed |
"Reverse proxy and HTTPS are required"â
Symptom. The panel does not open, and the xpanel log shows the line
Reverse proxy and HTTPS are required.
Cause. The request reached the panel without the X-Forwarded-For and
X-Forwarded-Proto: https headers. The panel code has middleware that drops the
connection in this case.
Fix. Make sure the nginx config in front of the panel has both lines:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Open the panel over https://, not http://. If TLS terminates earlier
(on a CDN or load balancer), do not replace X-Forwarded-Proto with the value
http. Ready-made configs are in Reverse Proxy.
METRICS_USER and METRICS_PASS are not setâ
Symptom. The xpanel container restarts, and the log shows â METRICS_USER
or â METRICS_PASS.
Cause. The metrics variables are required: without them the panel does not start.
Fix. Add them to /opt/xlada/.env and restart the stack:
METRICS_USER=xpanel
METRICS_PASS=<strong password>
docker compose up -d
Node does not appear in the panelâ
Symptom. The node is created but stays disconnected in the panel.
Cause. Usually one of three: NODE_PORT is unreachable from the panel
server, SECRET_KEY was not copied in full, or the node container did not start.
Fix. Check in order:
docker logs -f xpanel-nodeâ with a wrong key, the node prints the cause itself.- From the panel server:
nc -vz <node ip> 2222. - Make sure the key is pasted in full, without line breaks.
- Open port
2222in the firewall only for the panel IP.
See Node Installation for details.
Each node has its own SECRET_KEY and its own certificate. A shared key for
several servers is not supported â you must not move it from one node to
another.
Port conflictâ
Symptom. The container does not start with address already in use, or Xray
on the node does not listen on the given port.
Cause. The port is taken by another process: 3000, 3001, 3010 on the
panel server, or an inbound port on the node.
Fix. Find the owner of the port and free it:
ss -tlnp | grep -E ':(3000|3001|3010|2222)\b'
If changing the port is easier than freeing it, edit APP_PORT or
METRICS_PORT in .env and remember to update proxy_pass in nginx. On the
node, check that the container runs with --network host: port forwarding breaks
real client IP detection.
Certificate is not issuedâ
Symptom. certbot --nginx -d panel.example.com fails.
Cause. The domain does not point to this server, port 80 is closed, or the
domain is already served by another virtual host.
Fix.
dig +short panel.example.com # must return the panel server IP
ss -tlnp | grep ':80'
certbot certificates # what is already issued
certbot renew --dry-run # test auto-renewal
Check server_name in the nginx config, then run
nginx -t && systemctl reload nginx. Make sure the auto-renewal timer is active:
systemctl list-timers | grep certbot.
Database does not come upâ
Symptom. xpanel waits for the database and crashes, xpanel-db is in the
unhealthy state or keeps restarting.
Cause. Most often a wrong DATABASE_URL, a POSTGRES_PASSWORD mismatch with
an existing volume, or an incompatible PostgreSQL major version on an old data
directory.
Fix.
docker compose ps
docker compose logs --tail=100 xpanel-db
docker exec xpanel-db pg_isready -U xpanel -d xpanel
Check POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, and DATABASE_URL.
Do not rename volumes and services: on the next start, compose will create new
empty ones. The PostgreSQL data directory is incompatible between major versions,
so moving to a new version is done only through a dump and restore â see
Migrating from Remnawave.
502 Bad Gateway from nginxâ
Symptom. nginx returns 502 on https://panel.example.com.
Cause. There is nobody behind proxy_pass: the panel container is not
running, did not complete migrations, or listens on a different port.
Fix.
docker compose ps
curl -sI http://127.0.0.1:3000
docker compose logs --tail=100 xpanel
Wait for the XLADA Backend v1.1.7 and
Nest application successfully started lines in the log. If APP_PORT was
changed, fix proxy_pass http://127.0.0.1:<port> and reload nginx.
Sign-in does not work after changing APP_SECRETâ
Symptom. The administrator password no longer works, TOTP codes are not accepted, and active sessions are reset.
Cause. APP_SECRET was changed after the first start. Password hashes, JWT,
and TOTP secret encryption depend on it. The same effect comes from the
change_me value left in .env.
Fix. Restore the previous APP_SECRET value from a .env backup and run
docker compose up -d. If the original is lost, the only way in is a reset
through the database. Generate the secret in advance (openssl rand -hex 32) and
keep it in a secrets manager â see Panel Security.