Before you start
Quick deploy (dashboard, ~5 minutes)
Create a new Web Service
Point at the Comis Docker Hub image
Configure the service
Add environment variables
Add a persistent disk
Set the health check
{"status":"ok",...}
on this endpoint as soon as the gateway is up.Deploy
Verify the deployment
Render gives your service a public URL likehttps://comis-XXXX.onrender.com.
Find it on the service’s dashboard page (top of the screen, next to the green
“Live” badge).
Run these from any terminal — they need no Docker or Comis CLI locally:
Open the dashboard
In your browser, go to:/app/ and prompts for your gateway token. Paste the same
COMIS_GATEWAY_TOKEN you set in the env vars. From here you can:
- Add agents, configure their model and policies
- Connect channels (Telegram, Discord, Slack, etc.) — paste each bot token
- Watch live logs, traces, and memory contents
- Edit configuration through the UI (writes to
/home/comis/.comis/config.yamlon the persistent disk)
Reproducible deploys with render.yaml
If you’d rather declare the deployment in code (so you can recreate it from
scratch, version it, or share it with teammates), drop this render.yaml at
the root of any GitHub repo and link Render to it. Render watches the file
and applies changes automatically.
Using Render Secret Files for config
If you have an existingconfig.yaml (e.g. from a local install) and want to
seed it on Render rather than configure through the dashboard:
Open Render dashboard for your service
Add a Secret File
Patch the config for the container
dataDir: line at the top. Local configs from the
install wizard usually have dataDir: /Users/yourname/.comis (a host
absolute path that doesn’t exist inside the container). The image already
sets COMIS_DATA_DIR=/home/comis/.comis and the persistent disk mounts
there — drop the line and the daemon does the right thing.2. Set gateway.host: 0.0.0.0 (a typical install has 127.0.0.1,
which means “loopback only” — Render’s load balancer can’t reach it).Example before / after:Redeploy
Updating to a new Comis version
If you pinned a version tag (recommended), updating is a 30-second job:Find the latest version
Update the image URL
comisai/comis:1.0.53-slim to the new version → Save Changes.(Or, if you used render.yaml, edit the file in your repo and push — Render
picks up the change.)Render redeploys automatically
latest-slim instead, click Manual Deploy → Deploy latest commit.
Custom domain
Render gives every service a*.onrender.com URL with HTTPS for free. To use
your own domain:
Add the domain in Render
comis.example.com). Render shows you a CNAME
target.Set the DNS record
comis.example.com → the Render-provided target. Wait for DNS to
propagate (usually a few minutes).Render provisions TLS
Cost
Common issues
The service won't start (immediate restart loop)
The service won't start (immediate restart loop)
-
FATAL: Bootstrap failed: Config validation failed: gateway.tokens.0.secret: Too smallYou provided aCOMIS_GATEWAY_TOKENshorter than 32 characters. Generate a fresh one withopenssl rand -hex 32(which produces 64 hex chars, well over the 32-char minimum) and update the env var in Render. -
FATAL: EACCES: permission denied, mkdir '/Users/...'Yourconfig.yamlhas adataDir:line pointing at a host absolute path from a local machine. Remove that line — see Patch the config for the container. - Health check timing out Render’s default health check timeout is 30s, and Comis’s first boot can take 10–25s while it initializes the SQLite databases on the newly-attached disk. If it consistently times out, bump the health-check timeout in service settings.
`/v1/chat/completions` returns 502 Bad Gateway
`/v1/chat/completions` returns 502 Bad Gateway
127.0.0.1 (loopback inside the
container) instead of 0.0.0.0 (all interfaces).Fix: Verify both of these are set:- Env var
COMIS_GATEWAY_HOST=0.0.0.0(Settings → Environment) - Your
config.yaml(if you uploaded one) hasgateway.host: 0.0.0.0— not127.0.0.1. Config-file value wins over env var.
The agent loses memory after every redeploy
The agent loses memory after every redeploy
- There is a disk attached
- Mount Path is exactly
/home/comis/.comis(this is the path the daemon reads — anything else gets ignored)
Can the agent use the `exec` skill on Render?
Can the agent use the `exec` skill on Render?
"Exec sandbox provider detected" provider=bwrap at startup, with no
Exec sandbox DISABLED warning.This is the major difference from Docker Desktop on macOS, where the
linuxkit kernel forces the daemon into auto-disabled-sandbox mode. On
Render, agent-issued shell commands run in a per-command sandbox that
excludes /home/comis/.comis from its mount set — prompt-injected exec
cannot read your .env, secrets.db, or config tokens.Logs aren't showing anything I expect
Logs aren't showing anything I expect
"level":50 to see only ERROR-level lines.For richer log analysis (cost summaries, cache hit rates, request
timings), download the logs and run them through jq:durationMs, tokensIn, tokensOut,
cacheHitRate, costUsd per LLM call.My Telegram bot isn't responding
My Telegram bot isn't responding
TELEGRAM_BOT_TOKENenv var not set — the daemon logs"Channel telegram disabled"at startup if the token is missing or invalid. Add the var, redeploy.config.yamldoesn’t havechannels.telegram.enabled: true— even if the token is set, the channel must be enabled in config.- Telegram bot username collision / wrong token — easy to mix up
tokens between bots if you have several. Test by hitting
https://api.telegram.org/bot<YOUR_TOKEN>/getMe— that endpoint returns the bot’s identity, so you can confirm the token belongs to the bot you expect. allowFromfiltering — your config may havechannels.telegram.allowFromset to a Telegram user ID that doesn’t include the sender. The daemon logs the rejected sender at DEBUG level — search the logs fornot in allowFrom.
How do I `exec` into the running container for debugging?
How do I `exec` into the running container for debugging?
comis
user. From there you can:How do I rotate the gateway token?
How do I rotate the gateway token?
- Generate a new one:
openssl rand -hex 32 - Render → service → Environment → update
COMIS_GATEWAY_TOKENwith the new value - Click Save Changes — Render auto-restarts the container
- Update any clients (the dashboard prompt, your scripts, etc.) to use the new token
gateway.tokens is an array in config.yaml),
use the new one in clients, then remove the old entry.