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-tokensk-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 ユーザーと同じように動きます。