Troubleshooting

Something not working? Start with the Health Check, then check common issues below.

💡
Run sudo ./conduit-deploy.shHealth Check first. It checks everything automatically and tells you what's wrong.

Can't connect from my phone / app

  • Check all 3 containers are running: cd /opt/conduit && sudo docker compose ps
  • Test HTTPS: open https://matrix.example.com/_matrix/client/versions in a browser
  • Make sure you entered the right homeserver in your app:
    • Delegation mode: enter example.com (not matrix.example.com!)
    • Subdomain mode: enter chat.example.com
  • Common setup mistake: During install, the "domain" field means your root domain (e.g. example.com). Don't enter the full subdomain there — the script adds the subdomain for you. Otherwise you'll end up with matrix.matrix.example.com!
  • DNS might need 10–30 minutes to propagate

HTTPS certificate error

Caddy gets Let's Encrypt certificates automatically. If it fails:

# Check Caddy logs for errors
cd /opt/conduit && sudo docker compose logs caddy --tail 50
  • DNS not ready — wait, then restart: sudo docker compose restart caddy
  • Port 80 blocked — Let's Encrypt needs port 80 for verification
  • Rate limited — too many requests; wait an hour and retry

HTTPS failed (HTTP 000000) / Docker has no internet

If Health Check shows HTTPS failed (HTTP 000000), Docker containers likely can't reach the internet — so Caddy can't get TLS certificates.

# Check if network interface is bound to firewalld
sudo firewall-cmd --zone=public --list-interfaces
# If empty — that's the problem! Fix:
sudo firewall-cmd --zone=public --add-interface=$(ip route show default | awk '{print $5}') --permanent

# Check masquerade (Docker needs this for NAT)
sudo firewall-cmd --query-masquerade
# If "no":
sudo firewall-cmd --permanent --add-masquerade

# Apply changes
sudo firewall-cmd --reload

# Test Docker internet access
docker run --rm alpine wget -qO- --timeout=5 http://ifconfig.me/ip

# If it works — restart Caddy to get certificates
sudo docker restart caddy

The latest version of the installer detects and fixes this automatically. Update: cd ~/conduit-deploy && git pull

Voice / video calls don't work

# Check TURN ports are open
sudo firewall-cmd --list-ports | grep -E "3478|5349"

# Check Coturn is running
cd /opt/conduit && sudo docker compose logs coturn --tail 20

# Check TLS certs are synced
ls -la /opt/conduit/certs/

If turn.crt is missing, restart to trigger cert sync: sudo docker compose restart

Federation doesn't work

  • Check port 8448 is open: sudo firewall-cmd --list-ports | grep 8448
  • Test federation: visit https://federationtester.matrix.org
  • Verify .well-known delegation (Clean Username mode): curl -s https://example.com/.well-known/matrix/server

Health Check says "reboot required"

A kernel or security update was installed. Your server is still running fine — nothing is broken. Reboot when it's convenient:

sudo reboot

Services restart automatically after reboot. The server never reboots on its own.

Forgot registration token

sudo grep REGISTRATION_TOKEN /opt/conduit/.env

Your token is stored in .env and CREDENTIALS.txt (if not deleted). The token is only needed if you enable self-registration via the Admin Room.

Registration token doesn't work

Registration is closed by default for security. The token is only used if you enable self-registration via the Admin Room:

@conduit:example.com allow-registration true

For normal account creation, use the Admin Room instead. See the Admin Room guide.

Admin Room not showing up

  1. Log out and log back in to your Matrix client
  2. Force refresh (Element Web: Ctrl+Shift+R or Cmd+Shift+R)
  3. Check that your account was created during installation
  4. Check server logs: sudo docker logs conduit

Viewing logs

# All services (live)
cd /opt/conduit && sudo docker compose logs -f

# Single service
sudo docker compose logs -f conduit
sudo docker compose logs -f caddy
sudo docker compose logs -f coturn

SSH drops during script operations

If your SSH disconnects while using the script, it's usually an idle timeout — not the script itself.

Fix it by adding this to your local ~/.ssh/config:

Host *
    ServerAliveInterval 15
    ServerAliveCountMax 10

Or connect with: ssh -o ServerAliveInterval=15 user@your-server