make doctor in the Condor directory — it covers most of what follows and names the fix directly. On the API host, hummingbot-api ships its own make doctor: it checks the containers, which ports are on a public interface, the broker’s credentials, Tailscale’s tailnet and serve status, and whether the API answers an authenticated request.
Connection issues
This is where most problems land: Condor showing Offline, Cannot reach server, Connection timeout, or Auth Error somewhere in the UI. Work through this section first. Condor talks to the Hummingbot API over HTTP using the host, port, username, and password stored for each server (see/servers in Telegram or condor/config.yml). Status checks call http://{host}:{port} and list accounts — a failure to connect surfaces as Offline, a failure to authenticate as Auth Error.
- Is the API stack up? On the machine where Docker runs the API:
docker compose ps(from thehummingbot-apirepo directory). You want the API container healthy and port 8000 (default) listening. - Smoke test from the Condor host:
You should get 200. If this fails, Condor will show offline until the API is reachable — everything below is about getting this curl to succeed.
- Wrong host for your layout
- API and Condor on the same machine:
hostis usuallylocalhostor127.0.0.1. - API on a different host or VPS: use
hummingbot-api(MagicDNS) when Tailscale is enabled — not a public IP and notlocalhost(localhost would point at the Condor machine itself). - Docker Desktop / WSL: If Condor runs in one environment and the API in another,
localhostmay not cross namespaces; use the host gateway IP (host.docker.internalon Mac/Windows) or publish ports and use the reachable address from Condor’s network namespace.
- API and Condor on the same machine:
- Credentials: Auth Error means HTTP 401 — username/password in
/serversmust match the API’s HTTP basic auth (the deploy flow syncsconfig.ymlwithhummingbot-api/.envwhen both are installed together; if you changed one side, align the other or re-save in/servers). The setup wizard requires real credentials and no longer seedsconfig.ymlwith a default pair, so an entry with a blank or placeholder password means it was never filled in —make doctorflags that case by name.
Tailscale-specific problems
Prefer Tailscale over opening port 8000 on a public firewall — see Secure Remote Access with Tailscale. If you must use a public IP instead, allow inbound 8000 only from the Condor host.Other issues
Won’t start
Exits at boot with TELEGRAM_TOKEN is not set
Exits at boot with TELEGRAM_TOKEN is not set
make setup and either re-enter the bot token, or choose Local mode if you do not want a bot at all. make doctor reports the same thing before you try to start.Exits at boot with ADMIN_USER_ID is not a valid user id, or Local mode says you're not approved
Exits at boot with ADMIN_USER_ID is not a valid user id, or Local mode says you're not approved
ADMIN_USER_ID in .env must be a positive integer, and in Local mode that id must also exist as an approved user in config.yml.- Not a valid user id: something non-numeric ended up in
ADMIN_USER_ID— fix it in.envor runmake setupagain. - “Local mode logs in as user N … but that user is not an approved user in config.yml”: the id in
.envand the idconfig.ymlexpects have drifted apart, usually after editing one file by hand. Re-runmake setupso both are written together, rather than editing either file in isolation.
hummingbot-api exits with CONFIG_PASSWORD does not match the stored password verification file
hummingbot-api exits with CONFIG_PASSWORD does not match the stored password verification file
CONFIG_PASSWORD encrypts every exchange credential the API holds, and it’s fixed the first time the API ever starts — a verification file is written then, and every later boot checks the current .env value against it.Editing CONFIG_PASSWORD in .env after that first run doesn’t rotate anything; it just fails this check. Restore the original password, or if it’s genuinely lost, delete bots/credentials/ and re-add every exchange API key — there’s no way to recover the old encrypted credentials without the original password.Workspace or API fails to start: address already in use
Workspace or API fails to start: address already in use
lsof -i :8088 for the Workspace, :8000 for the API).To move the Workspace instead, change the port in WEB_URL in Condor’s .env. WEB_URL sets the port Condor listens on and wins over WEB_PORT, so changing only WEB_PORT does nothing when WEB_URL is set. A WEB_URL with no port makes Condor listen on 80 (http://) or 443 (https://), which often collides with a web server. The API’s port 8000 is fixed in hummingbot-api’s docker-compose.yml; API_BIND changes the address, not the port.Telegram and servers
Bot not responding in Telegram
Bot not responding in Telegram
- Confirm the process is running
- Quick Start / deploy:
tmux attach -t condorand look for tracebacks or exit messages. - Manual install: Check the terminal where
make runis running.
- Quick Start / deploy:
- Check
condor/.envon the machine that runs Condor:TELEGRAM_TOKENmust match @BotFather, andADMIN_USER_IDmust be your numeric Telegram user id (from @userinfobot). - Access still pending: New users must be approved. An admin approves you with
/adminin Telegram or Settings → Admin in the Workspace. - Another bot’s token: If the log shows a warning that
TELEGRAM_TOKEN is set in the environment Condor was started from and overrides .env, Condor is running as a different bot. This often happens inside a tmux server started from another project. Unset it (unset TELEGRAM_TOKEN, ortmux set-environment -gu TELEGRAM_TOKEN) and restart. See Environment overrides. - Deploy installer hint: If admins never see “Condor is online and ready.”, attach to tmux (above) and fix errors shown there; the installer also reminds you to verify
.envwhen that message is missing.
No servers configured / Server not found / No servers available
No servers configured / Server not found / No servers available
/serversshows No servers configured until at least one entry exists incondor/config.ymlunderservers:(and users need access to a server — admins own new entries; others must be shared).- Server not found in the UI usually means the configured server name does not exist anymore (typo after edit, or deleted entry) — open
/servers, pick a valid server, or add one again. - No servers available (errors when running commands) often means your user has no server shared with them — ask an owner admin to share a server with your Telegram user id.
- After Manual install, you must add the real API URL (and auth) via
/serversifconfig.ymlwas not pre-filled.
Local mode: Workspace is not reachable from another device
Local mode: Workspace is not reachable from another device
127.0.0.1 and is reachable only from the machine running Condor.Tailscale does not change this: Local mode stays on 127.0.0.1 even with Tailscale on. Don’t set WEB_HOST=0.0.0.0 to work around it. Instead:- SSH tunnel —
ssh -L 8088:localhost:8088 you@host, then openhttp://localhost:8088locally. - Switch to Telegram mode — re-run
make setup./webthen issues time-limited login links. With Tailscale on, the Workspace is reachable athttp://<tailnet-ip>:8088from your tailnet.
Docker, updates, and data
Docker or installer problems (API did not start)
Docker or installer problems (API did not start)
- Docker daemon: The deploy script checks that Docker is running before bringing up the API. On Linux:
docker info. On Mac/Windows: open Docker Desktop and wait until it is fully started. - Compose: You need either
docker compose(plugin) or legacydocker-compose(the installer checks this). - API-only recovery: If Quick Start skipped or failed the API step, use the Hummingbot API only tab command, or from
hummingbot-api:make setup,docker compose pull,make deploy(see hummingbot-api README). - Sibling layout: Condor’s setup wizard expects
hummingbot-apinext tocondor(../hummingbot-apifrom the Condor directory) when both are installed by the same flow — keep that layout unless you know how to pointconfig.ymlat a custom URL. - API errors mentioning
DockerService/'DockerService' object has no attribute 'client': Docker (or its daemon) wasn’t running when thehummingbot-apicontainer itself started, so it never connected. Start Docker, then restart or redeploy thehummingbot-apicontainer so it reconnects — restarting Docker alone isn’t enough once the API is already up.
After an update, make run or make restart fails in the frontend build
After an update, make run or make restart fails in the frontend build
make run and make restart rebuild the Workspace before starting. They reinstall the frontend packages with npm ci first whenever frontend/package-lock.json is newer than what is installed, so a pull that adds a dependency is picked up on its own.If the build still fails, the error is printed before Condor starts. Read it in the terminal where you ran the command. To retry the install by hand:Preferences or agent conversations reset unexpectedly
Preferences or agent conversations reset unexpectedly
- Preferences and server settings:
config.yml. - Agent conversations:
.condor/users/<user-id>/conversations/. - Telegram session state:
data/condor_bot_data.pickle, with a.bakcopy.
1) that switches to Telegram starts with an empty history under your Telegram id. The old conversations are still under .condor/users/1/. See Add Telegram to a Local install.If the pickle file is unreadable, Condor recovers from .bak. If both are unreadable, it starts with empty Telegram session state and logs the error Both pickle and backup are corrupt/unreadable. Starting with empty state. This doesn’t affect conversations or config.yml. If it happens repeatedly, check for a full disk or anything killing Condor mid-write.Secure the message broker
Condor and Hummingbot API reach bot instances through an EMQX broker. Older Hummingbot API installs ran this broker with no authentication and published its port on every interface — if you installed before the fix, or haven’t redeployed since, treat it as exposed untilmake emqx-audit says otherwise.
See Broker Security in the Hummingbot API docs for the full issue and the fix (make deploy, make emqx-auth-reset, then make doctor / make emqx-audit to verify).
A few things worth knowing beyond that fix:
- Rotating
BROKER_PASSWORDlater needsmake emqx-auth-resettoo, not justmake deploy— EMQX only imports the bootstrap file for accounts that don’t already exist, so a broker that’s already running keeps the old password until its data volume is reset. - Restarting a bot instance doesn’t refresh its broker credentials — only (re)creating one writes the current password into its
conf_client.yml. After any broker credential change, recreate existing instances rather than just restarting them. - Bring the stack up with
make deploy, not a baredocker compose up— the plain compose command skips the step that creates the broker’s credential file, so the broker comes up “healthy” with zero accounts and rejects everyone, including the API itself. - Default credentials aren’t a hard failure —
hummingbot-apiboots fine on out-of-the-boxUSERNAME/PASSWORD/CONFIG_PASSWORDvalues and only logs a warning. Change them before this instance touches real funds.
Recovery toolkit
The commands worth reaching for before reading anything above. All are safe to run at any time; none of them trade.make doctor is clean and something is still wrong, that is worth reporting — it means a real gap in what the check covers.
