Troubleshooting

Common installation and runtime issues, in roughly the order people hit them.

Install

docker compose v2 not found

You have legacy docker-compose (Python) but not the v2 plugin. Upgrade Docker Desktop (macOS/Windows) or install the docker-compose-plugin package (Linux). Verify with:

docker compose version

port 80 / 443 is in use

Something else is binding Caddy's ports. Either stop that service (sudo ss -lnpt | grep :80) or set CADDY_HTTP_PORT / CADDY_HTTPS_PORT in .env and rerun docker compose up -d.

less than 4 GB RAM detected

Logto, Bitcart and Postgres together comfortably need 3–4 GB. On smaller VPS, expect random OOM kills. Upgrade the instance or accept the warning.

Installer exited halfway

Re-run it. The script is idempotent: it skips clone if the dir exists, skips .env write if a .env is present, and docker compose up -d is safe to call repeatedly.

Runtime

A service is unhealthy in docker compose ps

docker compose logs <service> --tail 200

Common causes:

Glue /healthz returns 503

The glue can't reach Postgres or Redis. Verify both report healthy and that DATABASE_URL and REDIS_URL in .env use the docker service names (postgres, redis), not localhost.

Webhook signature mismatch

Bitcart and the glue must share the same GLUE_WEBHOOK_SECRET. The installer renders it once into .env; rotating it requires updating Bitcart's webhook config too.

Caddy can't get a certificate

Let's Encrypt needs your domain to resolve to the host's public IP and ports 80/443 open from the public internet. For local dev, set CADDY_TLS_MODE=internal (already done by docker-compose.dev.yml) and trust Caddy's local CA in your browser.

Entitlement stuck in pending

Open the order in the dashboard and click Retry. If it keeps failing:

Resets

Full reset (destroys all data, leaves volumes):

docker compose down

Nuclear reset (destroys data too — only for dev):

docker compose down -v