Sentō にはコンテナ内で VPS と完全に同等の動作を提供する Dockerfile が付属しています:非 root の sento ユーザー、コンテナ内永続化のための @reboot cron、Claude Code と一緒に動く Guardian。
前提条件
- Docker 24+
- Claude Code OAuth トークン — Docker は非対話的に実行されるため、ブラウザ認証フローが使えません。まずローカルマシンでトークンを生成してください:
npm install -g @anthropic-ai/claude-code && claude setup-token。sk-ant-oat01-…で始まります。 - 選んだチャンネルの bot トークン
イメージをビルド
git clone https://github.com/sentoagent/sento
cd sento
docker build -t sento .
イメージは非 root の sento ユーザーで動きます(Claude Code は root で --dangerously-skip-permissions を拒否)。npm のグローバルは ~/.npm-global 以下に置かれます。
環境変数で起動
docker run -d \
--name sento-agent \
-e CLAUDE_CODE_OAUTH_TOKEN="sk-ant-oat01-..." \
-e DISCORD_BOT_TOKEN="あなたのbotトークン" \
-e AGENT_NAME="kai" \
-e CHANNEL="discord" \
-v sento-data:/home/sento/workspace \
sento
ワークスペースを volume にマウントすると、CLAUDE.md、メモリ、認証情報がコンテナ再起動を越えて残ります。
Docker Compose(マルチエージェント)
複数エージェントには 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:
健康状態の確認
docker exec -it sento-agent sento status
docker exec -it sento-agent sento logs -n 40
または shell に入って VPS のように扱う:
docker exec -it sento-agent bash
なぜ Docker の同等性が重要か
VPS で動く機能はすべて Docker でも動きます:Guardian、cron @reboot、tmux、完全な CLI、エージェント間ペアリング。「ライトモード」はありません。コンテナは Linux ユーザーと同じように動きます。