Sentō ships with a Dockerfile that gives you full VPS parity in a container: non-root sento user, @reboot cron for persistence within the container, Guardian running alongside Claude Code.
Prerequisites
- Docker 24+
- A Claude Code OAuth token — since Docker runs non-interactively, the browser auth flow can't work. Generate a token on your local machine first:
npm install -g @anthropic-ai/claude-code && claude setup-token. It starts withsk-ant-oat01-…. - A bot token for your chosen channel
Build the image
git clone https://github.com/sentoagent/sento
cd sento
docker build -t sento .
The image runs as a non-root sento user (Claude Code refuses --dangerously-skip-permissions as root) and keeps npm globals under ~/.npm-global.
Run with env vars
docker run -d \
--name sento-agent \
-e CLAUDE_CODE_OAUTH_TOKEN="sk-ant-oat01-..." \
-e DISCORD_BOT_TOKEN="your-bot-token" \
-e AGENT_NAME="kai" \
-e CHANNEL="discord" \
-v sento-data:/home/sento/workspace \
sento
Volume mount the workspace so CLAUDE.md, memory, and credentials survive container restarts.
Docker Compose (multi-agent)
For more than one agent, use Compose:
version: "3.9"
services:
kai:
image: sento
environment:
- CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_TOKEN}
- DISCORD_BOT_TOKEN=${KAI_DISCORD_TOKEN}
- AGENT_NAME=kai
- CHANNEL=discord
volumes:
- kai-data:/home/sento/workspace
mira:
image: sento
environment:
- CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_TOKEN}
- TELEGRAM_BOT_TOKEN=${MIRA_TG_TOKEN}
- AGENT_NAME=mira
- CHANNEL=telegram
volumes:
- mira-data:/home/sento/workspace
volumes:
kai-data:
mira-data:
Checking health
docker exec -it sento-agent sento status
docker exec -it sento-agent sento logs -n 40
Or shell in and treat it like a VPS:
docker exec -it sento-agent bash
Why Docker parity matters
Every feature that works on a VPS works in Docker: Guardian, cron @reboot, tmux, the full CLI, agent-to-agent pairing. There's no "lite mode." The container runs the same way a Linux user does.