Quick stack health check
Run these commands first to get a fast overview of the entire stack:unhealthy or not found, jump to that service’s section below.
General diagnostic commands
These commands apply to any service in the stack:UnrealIRCd (IRC server)
Container:atl-irc-server · Ports: 6697 (TLS), 8000 (WebSocket), 8600 (RPC)
Diagnostic commands
Common issues
1. Container exits immediately on startup
The most common cause is a configuration syntax error.error or fatal in the output. Fix the config template in apps/unrealircd/config/, then regenerate and restart:
2. TLS certificate errors
Clients report certificate warnings or TLS handshake failures.just init generates self-signed certificates. If certs are missing or expired, re-run just init. For production, see SSL/TLS.
3. Port already in use
Another process is binding to 6697, 8000, or 8600..env:
just dev
4. Unsubstituted environment variables in config
The generated config contains literal${VARIABLE} strings instead of values.
.env exists and contains all required variables, then regenerate:
5. Cannot connect from external clients
The server is running but clients outside localhost cannot reach it.ATL_CHAT_IP=0.0.0.0 in .env and restart. Ensure your firewall allows the relevant ports.
6. ObsidianIRC / Firefox: “Can’t establish connection” to wss://127.0.0.1:8000
In dev, ObsidianIRC connects to the IRC WebSocket over TLS with a self-signed certificate. Firefox blocks WebSocket connections to untrusted certs without prompting. Add a certificate exception first: visithttps://127.0.0.1:8000/ → Advanced → Accept the Risk and Continue, then reload ObsidianIRC at http://localhost:8090.
Atheme (IRC services)
Container:atl-irc-services · Shares network with atl-irc-server (port 8081 for HTTP API)
Diagnostic commands
Common issues
1. Atheme won’t start — waiting for UnrealIRCd
Atheme depends onatl-irc-server being healthy before it starts.
2. Atheme starts but immediately exits
Usually a config syntax error or missing database directory.data/atheme/data/ exists and is writable. Re-run just init if directories are missing.
3. NickServ/ChanServ not responding
Atheme is running but service bots do not respond to commands.4. Database corruption
Atheme refuses to loadservices.db on startup.
.bak files in data/atheme/data/. Restore from the most recent backup:
5. Permission denied on data directory
Prosody (XMPP server)
Container:atl-xmpp-server · Ports: 5222 (C2S), 5280 (HTTP/BOSH), 5281 (HTTPS via nginx)
Diagnostic commands
Common issues
1. Prosody fails to start
data/certs/ contains valid certificates for your XMPP domain. Re-run just init for dev certs. Check for config errors in apps/prosody/config/prosody.cfg.lua.
2. XMPP clients cannot authenticate
Users get “authentication failed” errors.3. BOSH/WebSocket endpoint not responding
Web clients cannot connect viahttp://localhost:5280/http-bind.
bosh and websocket modules are enabled in the Prosody config. Check that port 5280 is mapped correctly in .env.
4. HTTPS proxy (nginx) returning 502
The nginx sidecar at port 5281 returns a bad gateway error.atl-xmpp-server:5280. Ensure Prosody is running and healthy before checking nginx. Restart both if needed:
5. Certificate mismatch for XMPP domain
Clients report the certificate does not match the expected domain.XMPP_DOMAIN in .env matches the domain in your TLS certificate. For dev, re-run just init to regenerate certs matching the configured domain.
Bridge (Discord↔IRC↔XMPP)
Container:atl-bridge · No exposed ports (connects outbound to IRC, XMPP, and Discord)
Diagnostic commands
Common issues
1. Bridge won’t start — waiting for dependencies
The bridge depends on bothatl-irc-server and atl-xmpp-server being healthy.
2. Discord connection fails
BRIDGE_DISCORD_TOKEN is set correctly in .env. The token must be a valid Discord bot token with the required intents enabled.
3. IRC connection refused
The bridge cannot connect to UnrealIRCd.BRIDGE_IRC_NICK and BRIDGE_IRC_OPER_PASSWORD are set in .env and match the UnrealIRCd oper block configuration.
4. XMPP component connection fails
.env match the Prosody component configuration:
BRIDGE_XMPP_COMPONENT_JIDBRIDGE_XMPP_COMPONENT_SECRETBRIDGE_XMPP_COMPONENT_SERVERBRIDGE_XMPP_COMPONENT_PORT
5. Messages not relaying between protocols
The bridge is running but messages do not appear on the other side.apps/bridge/config.yaml are correct. Ensure the bridge bot has the necessary permissions in each channel (IRC oper, Discord channel access, XMPP MUC membership).
The Lounge (web IRC client)
Container:atl-thelounge · Port: 9000
Diagnostic commands
Common issues
1. Cannot access the web interface
Browser shows connection refused athttp://localhost:9000.
data/thelounge/ directory does not exist or has wrong permissions.
2. Login page appears but no users exist
The Lounge runs in private mode — you must create a user account first.3. Cannot connect to IRC server from The Lounge
You can log in but The Lounge cannot reach UnrealIRCd.atl-irc-server (the container hostname).
4. Plugin installation fails
The janitor or giphy plugins fail to install on startup.data/thelounge/ volume. Failures are non-fatal — The Lounge still starts without the plugins.
5. Chat history missing after restart
The Lounge stores history indata/thelounge/. If the volume mount is misconfigured, data is lost on restart.
data/thelounge/ is bind-mounted to /var/opt/thelounge in the container. Check that the directory was not accidentally deleted. See Backups for restore procedures.
WebPanel (UnrealIRCd admin)
Container:atl-irc-webpanel · Port: 8080
Diagnostic commands
Common issues
1. WebPanel returns 502 or blank page
2. Cannot log in to WebPanel
Authentication fails even with correct credentials. Resolution: WebPanel authenticates against UnrealIRCd’s RPC interface. Verify the RPC credentials in.env match the UnrealIRCd configuration. Check that the RPC user block is configured in apps/unrealircd/config/.
3. WebPanel shows stale data
The panel displays outdated server information. Resolution: WebPanel queries UnrealIRCd’s RPC in real time. If data appears stale, the RPC connection may have dropped. Restart the WebPanel:4. Port conflict on 8080
Another service (commonly a local web server or proxy) is using port 8080..env:
just dev
5. WebPanel data directory permission errors
Cross-service issues
These problems affect multiple services or the stack as a whole.Docker Compose fails to start
.env exists. The CLOUDFLARE_DNS_API_TOKEN warning is safe to ignore in dev.
All services unhealthy after host reboot
After a host reboot, Docker may not be running.Network connectivity between containers
Services cannot reach each other over the Docker network.Data directory missing or empty
Services fail becausedata/ subdirectories do not exist.
Config regeneration after .env changes
After editing.env, services still use old values.
Resolution: regenerate configs from templates and restart:
Recovery quick reference
| Scenario | Command |
|---|---|
| Restart a single service | docker compose restart <container-name> |
| Restart the full stack | just down && just dev |
| Regenerate configs | scripts/prepare-config.sh |
| Recreate data directories | just init |
| Rebuild all containers | just build |
| Reset to clean state | just down && rm -rf data/ && just init && just dev |
| View real-time logs | docker compose logs --follow <container-name> |
| Check all container health | just status |
Warning: Resetting to clean state (rm -rf data/) destroys all persistent data including user registrations, chat history, and certificates. Back up first — see Backups.
Related pages
- IRC Troubleshooting — in-depth IRC-specific diagnostics
- Monitoring — health checks, metrics, and alerting
- Backups — backup and restore procedures
- SSL/TLS — certificate management and renewal
- Deployment — production deployment runbook
- Environment Variables — complete variable reference