# KiroCrew gateway — compose example. # # docker compose up -d # docker compose exec kirocrew kiro-cli login # one-time agent login # docker compose exec kirocrew kirocrew token --ttl 2h # mint a dashboard link # # Then open the printed link at http://localhost:5476/?token=... # Full guide: docs/guides/docker.md services: kirocrew: image: ghcr.io/kirodotdev/kirocrew:stable container_name: kirocrew restart: unless-stopped ports: # Loopback-published by default: only this machine can reach the # dashboard. Changing to "5476:5476" exposes the TCP port on all host # interfaces, but that alone is not enough for LAN browsers: every # request still requires a dashboard token, AND the browser's Origin/ # Host must be allowed — set dashboard.url in config.json (or # KIROCREW_CORS_ORIGINS) to the address you browse from, ideally a # TLS reverse proxy. See docs/guides/docker.md "Networking and security". - "127.0.0.1:5476:5476" volumes: # One named volume persists everything: gateway state (~/.kiro/crew), # kiro-cli credentials, agents, skills. Named volume (not bind mount) # so ownership matches the image's non-root user on first use. - kirocrew-home:/home/kirocrew environment: # Channel credentials load from the environment. Put them in an .env # file next to this compose file (compose reads it automatically) — # never commit real values. Every advertised channel is mapped here; # unset ones are passed through empty and ignored by the gateway. # On start the entrypoint moves these into the data home's .env # (mode 600) and scrubs them from the gateway's environment, so they # never reside in a long-lived /proc//environ. SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN:-} SLACK_APP_TOKEN: ${SLACK_APP_TOKEN:-} KIROCREW_OWNER_ID: ${KIROCREW_OWNER_ID:-} DISCORD_BOT_TOKEN: ${DISCORD_BOT_TOKEN:-} TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-} WECOM_BOT_ID: ${WECOM_BOT_ID:-} WECOM_SECRET: ${WECOM_SECRET:-} WEBEX_BOT_TOKEN: ${WEBEX_BOT_TOKEN:-} # Sandbox consent: if this runtime blocks user namespaces (no inner # sandbox), agent command execution stays disabled unless you # explicitly accept container-as-only-boundary by setting this to 1. # Alternative: use the custom seccomp profile to enable the inner # sandbox (adds unconditional unshare/clone/mount allows to the Docker # default; see docs/guides/docker.md "Sandbox troubleshooting"): # security_opt: # - seccomp:./docker/seccomp/kirocrew-seccomp.json KIROCREW_ALLOW_UNSANDBOXED: ${KIROCREW_ALLOW_UNSANDBOXED:-} # The image's HEALTHCHECK covers liveness; this block is only needed if # you override the port. # healthcheck: # test: ["CMD", "curl", "-fsS", "http://127.0.0.1:5476/api/health"] volumes: kirocrew-home: