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 with sk-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.