コンテンツにスキップ

Dockerインストールガイド

対応バージョン:v1.8.23+ 最終更新:2026-04-22

本ガイドはDocker ComposeでDuDuClawサーバーをデプロイする一連の流れをカバーします—— port設定、三大CLI(Claude / Codex / Gemini)の認証方式から、 データ永続化、channel webhook、自動更新までを扱います。

ローカルで試すだけなら、まず docs/deployment-guide.md §1 のネイティブインストール手順を参照してください。ネイティブインストールの方が起動が速く、デバッグも簡単です。 Dockerはサーバーデプロイ、実行環境の分離、統一環境が必要なチームに向いています。


DuDuClawのDockerイメージは container/Dockerfile.server で構築され、3段階ビルドを採用しています。

Stage 内容
1. frontend-builder node:22-slim + React/TSフロントエンドのビルド
2. rust-builder rust:slim + duduclaw リリースバイナリのコンパイル
3. production python:3.12-slim + 三大AI CLI + Docker CLI + 実行環境

最終イメージには以下が組み込まれています。

  • duduclaw メインプログラム(Rust製、dashboard込み)
  • @anthropic-ai/claude-code@openai/codex@google/gemini-clinpm i -g でインストール)
  • docker.io CLI(ホストのDocker daemonを呼び出してagent sandboxを作成するために使用)
  • (任意)Python 3.12:高度なローカル推論(MLX / LLMLingua-2、mlx_lm / llmlingua が必要)にのみ必要。Skillのセキュリティスキャンとchannel返信はすでにRustネイティブ実装で、Pythonには依存しません

項目 バージョン 備考
Docker Engine ≥ 24.0 Linuxはネイティブ版を直接インストール推奨。macOS / WindowsはDocker DesktopまたはColimaを使用
Docker Compose v2.20+ 最近のDockerには標準搭載。コマンドは docker compose で、旧来の docker-compose ではない
Git 任意 ソースコードのclone用
ディスク容量 ≥ 4 GB ビルド中は一時的に約3 GB使用。完成イメージは約1.2 GB
Port 18789 デフォルトのgateway port、変更可能

channel webhook(LINE、WhatsApp、Feishu、Generic Webhook)で外部からのメッセージを受信するには、 公開HTTPS URL が別途必要です。最も手軽な選択肢は Tailscale Funnel または Cloudflare Tunnelです。


ターミナルウィンドウ
# 1. ソースコードをclone
git clone https://github.com/zhixuli0406/DuDuClaw.git
cd DuDuClaw
# 2. .envを作成(必要に応じて記入)
cp .env.example .env
$EDITOR .env
# 3. 起動
docker compose up -d
# 4. 起動ログを確認
docker compose logs -f duduclaw
# 5. 動作確認
curl http://localhost:18789/health
# {"status":"ok","version":"1.8.23", ...}
# 6. Dashboardを開く
open http://localhost:18789

初回起動時、server-entrypoint.sh~/.duduclaw/config.toml が存在しないことを検出し、自動的に duduclaw onboard --yes を実行して基本設定ファイルを生成します(API keyとchannel tokenは暗号化して保存されます)。


docker-compose.yml は定義済みの変数のみを読み込み、未定義の変数は空文字列として渡されます (すべて ${VAR:-} 構文を使用しているため)。以下のリストは用途別に分類しています。

4.1 Runtime認証(いずれか1つ以上を設定)

Section titled “4.1 Runtime認証(いずれか1つ以上を設定)”
変数 用途 備考
CLAUDE_CODE_OAUTH_TOKEN Claude Codeの長期有効token claude setup-token で生成、推奨。ブラウザのないコンテナ環境に適している
ANTHROPIC_API_KEY Claude APIキー Fallback、従量課金
OPENAI_API_KEY Codex / OpenAI-compat APIキー Fallback。ChatGPT Plus/Pro OAuthはvolume経由
GEMINI_API_KEY Gemini APIキー Fallback。Google OAuthはvolume経由

最低いずれか1組が利用可能である必要があります。DuDuClawは agent.toml [runtime][model] api_mode に基づいてどれを使うか決定します。詳細は §6 三大CLIの認証設定を参照してください。

変数 Channel
LINE_CHANNEL_TOKEN / LINE_CHANNEL_SECRET LINE Messaging API
TELEGRAM_BOT_TOKEN Telegram Bot
DISCORD_BOT_TOKEN Discord Bot
SLACK_BOT_TOKEN / SLACK_APP_TOKEN Slack Socket Mode
WHATSAPP_ACCESS_TOKEN など WhatsApp Cloud API(.env.example を参照)
FEISHU_APP_ID / FEISHU_APP_SECRET Feishu

実際に使用するchannelの分だけ記入すれば十分です。未記入の変数に対応するchannelは起動しません。

docker-compose.yml は現状 LINE_* / TELEGRAM_* / DISCORD_* の3グループのみをデフォルトで注入します。他のchannelを環境変数経由で渡すには、compose ファイルの environment: ブロックに自分で追加するか、起動後に Dashboard → Channels → Add から ホット追加する方法があります(推奨。gatewayの再起動が不要で、tokenも即座に暗号化されてconfigに書き込まれます)。

変数 デフォルト 説明
DUDUCLAW_BIND 0.0.0.0 Gatewayのlistenアドレス。コンテナ内では必ず 0.0.0.0 でなければ外部からアクセスできません
DUDUCLAW_ALLOWED_ORIGINS (空) Dashboard WebSocket/CORSの追加許可 Origin、カンマ区切り。tailnetやリバースプロキシ経由でdashboardを開き、WSが403になる場合に設定します(§13 トラブルシューティングを参照)。config.tomlの [gateway] allowed_origins とマージされます

Portはenv varではなくcompose ファイル内で設定します。詳細は§5 Port設定の詳細を参照してください。

変数 用途
TS_AUTHKEY Tailscale Funnelの起動時に自動でtailnetに参加させる(--profile tailscale と併用)

docker-compose.yml

services:
duduclaw:
ports:
- "18789:18789" # HOST:CONTAINER
environment:
- DUDUCLAW_BIND=0.0.0.0
  • コンテナ内部:gatewayは常に 0.0.0.0:18789 にbindされます。これは意図的な設計で、 コンテナ自体が隔離されたネットワーク空間であるため、localhostにbindすると外部からアクセスできなくなります。
  • ホスト18789:18789 によりホストの18789番portがコンテナの18789番portへ転送されます。

最もよくあるケースは18789が既に使用中、または複数インスタンスが必要な場合です。左側の数字だけを変更します。

ports:
- "28789:18789" # 外部からは28789でアクセス

その後、dashboardとwebhook URLも新しいportに変更する必要があります。

ターミナルウィンドウ
curl http://localhost:28789/health

右側の 18789(コンテナ内部port)は変更しないでください。変更する場合は ~/.duduclaw/config.toml[gateway] port も同期して変更する必要があり、 entrypointは --yes で自動生成しているため、メンテナンスコストが上がります。

5.3 ローカルのみにbind(LANへの露出を避ける)

Section titled “5.3 ローカルのみにbind(LANへの露出を避ける)”

デフォルトの ports: "18789:18789"0.0.0.0 にbindされるため、同一ネットワーク内の他のマシンからも接続できます。 ローカル専用にしたい場合(リバースプロキシと組み合わせる場合など):

ports:
- "127.0.0.1:18789:18789"

5.4 同一マシンでの複数インスタンス

Section titled “5.4 同一マシンでの複数インスタンス”

同じマシンで2つのDuDuClawを動かす場合:

ターミナルウィンドウ
# ディレクトリA — 本番
cd /srv/duduclaw-prod
# ports: "18789:18789"
docker compose up -d
# ディレクトリB — ステージング
cd /srv/duduclaw-staging
# ports: "28789:18789"
# container_nameも変更し、衝突を避ける
docker compose up -d

container_name(デフォルト duduclaw-server)も忘れずに変更し、名前の衝突を避けてください。


3つのruntimeにはそれぞれ2種類の認証経路があります。OAuth(追加費用なし、サブスクリプションプランを使用) と APIキー(従量課金のfallback)です。実務上は「まずOAuthを設定し、 保険としてAPIキーも1つ用意しておく」ことをお勧めします。

コンテナ内の3つのOAuth状態ディレクトリには、それぞれ独立したnamed volumeがあります。

パス Volume CLI
/home/duduclaw/.claude duduclaw-claude Claude Code
/home/duduclaw/.codex duduclaw-codex Codex
/home/duduclaw/.gemini duduclaw-gemini Gemini

つまり、一度ログインすればコンテナを再構築してもログインし直す必要はありません

Claude Codeは自動化シナリオ向けに、ブラウザのコールバックを必要としない長期有効tokenを提供しており、 コンテナ / CI / headless serverに適しています。

ターミナルウィンドウ
# ブラウザのある自分のマシンで実行する(コンテナ内ではない)
npm install -g @anthropic-ai/claude-code
claude setup-token
# 画面の指示に従いブラウザでOAuthを完了する
# 最後に CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-... が表示される

生成されたtokenを .env に書き込みます。

.env
CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-xxxxxxxx...

そして:

ターミナルウィンドウ
docker compose up -d

DuDuClawは起動時に環境変数を読み込み、claude CLIがこのtokenを認識して自動的にログインします。コンテナ内で何か操作する必要はありません。Tokenの有効期限は30日で、 期限の7日前からDuDuClawがdashboardに警告を表示します。

方法B:コンテナ内でのインタラクティブログイン

Section titled “方法B:コンテナ内でのインタラクティブログイン”

Pro / Team / Maxのサブスクリプションがあり、そのquotaを使いたい場合:

ターミナルウィンドウ
# コンテナに入る
docker compose exec duduclaw bash
# コンテナ内で実行
claude auth login
# URLが表示されるので、ローカルのブラウザで開いて認可を完了する
# 状態は /home/duduclaw/.claude/ に書き込まれる(duduclaw-claude volume)
# 確認
claude auth status
exit

volumeに保存されているため、コンテナを再起動しても状態は保持されます。

.env

ターミナルウィンドウ
ANTHROPIC_API_KEY=sk-ant-...

この経路は従量課金で、サブスクリプションを使い切ったりアカウントがrate-limitされたりした場合の保険として適しています。 DuDuClawのAccountRotatorが複数アカウント間で自動的にローテーションします。詳細は features/07-account-rotation.mdを参照してください。

ターミナルウィンドウ
docker compose exec duduclaw bash
codex login
# ChatGPTアカウントのパスワードを入力するか、ブラウザの案内に従う
# 状態は /home/duduclaw/.codex/ に書き込まれる(duduclaw-codex volume)
exit

この方法はChatGPTのサブスクリプションquotaを使用し、追加のAPI費用は発生しません。

.env

ターミナルウィンドウ
OPENAI_API_KEY=sk-proj-...

従量課金(OpenAI APIの料金体系)です。

ターミナルウィンドウ
docker compose exec duduclaw bash
gemini auth
# 画面の指示に従いローカルのブラウザでGoogleログインを完了する
# 状態は /home/duduclaw/.gemini/ に書き込まれる(duduclaw-gemini volume)
exit

GoogleはGemini CLIに対して現在無料枠を提供しており、日常利用に適しています。

.env

ターミナルウィンドウ
GEMINI_API_KEY=AIza...

Google AI Studioの料金体系で課金されます。

各agentは自身の agent.toml で使用するruntimeを指定できます。

~/.duduclaw/agents/my-agent/agent.toml
[runtime]
preferred = "claude" # メインruntime:claude / codex / gemini / openai-compat
fallback = "gemini" # Claudeが利用不可の際に自動切り替え

完全な例とfailover戦略については features/13-multi-runtime.mdを参照してください。

指定がない場合、RuntimeRegistry は起動時にPATHをスキャンし、最初に見つかった利用可能なruntimeを選択します。

6.5 3つのCLIがすべて認識されているか確認

Section titled “6.5 3つのCLIがすべて認識されているか確認”
ターミナルウィンドウ
docker compose exec duduclaw bash
# 3つともバージョンが表示されるはず
claude --version
codex --version
gemini --version
# Claudeのログイン状態
claude auth status

docker-compose.yml は4つのnamed volumeを宣言しています。

Volume 内容 バックアップの推奨度
duduclaw-data メインデータ:config、agents、memory SQLite、logs、bus_queue.jsonl 最重要。毎日バックアップ推奨
duduclaw-claude Claude CLI OAuth状態 中程度。失っても claude auth login をやり直せばよい
duduclaw-codex Codex OAuth状態 中程度
duduclaw-gemini Gemini OAuth状態 中程度

さらにホスト側からマウントするパスがあります。

パス 用途 必要性
/var/run/docker.sock コンテナがホストのDocker daemonを呼び出しagent sandboxを作成するために使用 必須。container sandboxによる隔離実行に使用
ターミナルウィンドウ
# メインデータをtar.gzにバックアップ
docker run --rm \
-v duduclaw_duduclaw-data:/source:ro \
-v $(pwd):/backup \
alpine tar czf /backup/duduclaw-data-$(date +%F).tar.gz -C /source .

バックアップをターゲットマシンに配置し、同名のvolumeに復元します。

ターミナルウィンドウ
docker volume create duduclaw_duduclaw-data
docker run --rm \
-v duduclaw_duduclaw-data:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/duduclaw-data-2026-04-22.tar.gz -C /target

7.3 ホストディレクトリで置き換える(上級者向け)

Section titled “7.3 ホストディレクトリで置き換える(上級者向け)”

データを直接ブラウズしたい場合は、named volumeをbind mountに置き換えられます。

volumes:
- ./data/duduclaw:/home/duduclaw/.duduclaw
- ./data/claude:/home/duduclaw/.claude
- ./data/codex:/home/duduclaw/.codex
- ./data/gemini:/home/duduclaw/.gemini
- /var/run/docker.sock:/var/run/docker.sock

ホスト側ディレクトリのownerはUID 1000でなければならない点に注意してください(コンテナ内の duduclaw ユーザー)。

ターミナルウィンドウ
mkdir -p data/{duduclaw,claude,codex,gemini}
sudo chown -R 1000:1000 data/

パス 用途 HTTP 200の条件
/health 完全な状態(JSON) 常に200と構造化された内容を返す
/health/ready Readiness probe agentsがすべてロード済み
/health/live Liveness probe processがまだ生きている

Composeはデフォルトで /health をhealthcheckに使用します(30秒ごと、3回連続失敗でunhealthyと判定)。

ターミナルウィンドウ
# Containerの状態
docker compose ps
# リアルタイムlog
docker compose logs -f duduclaw
# 直近100行
docker compose logs --tail=100 duduclaw
# Healthcheckの履歴
docker inspect duduclaw-server --format '{{json .State.Health}}' | jq

Gatewayは GET /metrics エンドポイントを提供しています。指標一覧は docs/deployment-guide.md §8を参照してください。


docker-compose.yml にはWatchtowerサービスが組み込まれており、1時間ごとにイメージの更新を確認します。

注意:現在のcomposeファイルの WATCHTOWER_SCOPE=duduclaw 設定は 対応するlabelを持つコンテナのみを更新対象としますが、duduclaw サービス自体には そのlabelが設定されていません。自動更新を有効にするには、services.duduclaw に以下を追加してください。

labels:
- "com.centurylinklabs.watchtower.scope=duduclaw"

または WATCHTOWER_SCOPE を削除してください(すべてのコンテナが更新対象になり、範囲が広がります)。

自動更新を望まない場合は、watchtowerサービスのブロックをそのまま削除してください。


10. Channel Webhookには公開HTTPSが必要

Section titled “10. Channel Webhookには公開HTTPSが必要”

LINE / WhatsApp / Feishu / Generic Webhookはいずれもインターネットからアクセス可能なHTTPS URL がなければメッセージを受信できません。DuDuClawが家庭用ネットワークやグローバルIPのないサーバーで動作している場合、 よく使われる方法は以下の通りです。

方法 適したシーン コスト ガイド
Tailscale Funnel 家庭 / 開発 / 一時的な利用 無料 §11
Cloudflare Tunnel 長期的な本番運用 無料(独自ドメインが必要) deployment-guide §4
ngrok クイックデモ 無料版はURLが変わる deployment-guide §3
リバースプロキシ(Caddy / Nginx) 独自のグローバルIP+ドメイン 自前でメンテナンスが必要 deployment-guide §5

11. Tailscale Funnel(公開HTTPSをWebhookに提供)

Section titled “11. Tailscale Funnel(公開HTTPSをWebhookに提供)”

Composeには既にTailscaleサービスが同梱されていますが、デフォルトでは tailscale profile配下にあり自動起動しません。

ターミナルウィンドウ
# 1. Tailscale admin consoleでauth keyを生成する
# https://login.tailscale.com/admin/settings/keys
# "Reusable" + "Ephemeral" にチェックすることを推奨
# 2. .envに書き込む
echo "TS_AUTHKEY=tskey-auth-xxxxxxx" >> .env
# 3. tailscale profileを起動
docker compose --profile tailscale up -d
# 4. Tailscale admin consoleでこのマシンのFunnelを有効化
# Machines → duduclaw → Enable Funnel
# 5. https URLを取得
docker compose exec tailscale tailscale funnel status
# https://duduclaw.your-tailnet.ts.net/ ← これがwebhookのprefixになる

LINE webhook URLには https://duduclaw.your-tailnet.ts.net/webhook/line を設定します。

Tailscaleコンテナは現在 image: tailscale/tailscale:latest を使用しています。 本番環境では特定のdigestにpinすることを推奨します(composeファイルに既にTODOとして記載済みです)。


ターミナルウィンドウ
# 起動 / 停止 / 再起動
docker compose up -d
docker compose down # container停止+削除(volumeは削除されない)
docker compose restart duduclaw
# イメージの再ビルド(コードやDockerfileの変更後)
docker compose build --no-cache duduclaw
docker compose up -d
# コンテナshellに入る
docker compose exec duduclaw bash
# 単発コマンドの実行
docker compose exec duduclaw duduclaw agent list
docker compose exec duduclaw duduclaw cost summary
# Log
docker compose logs -f duduclaw
docker compose logs --since 1h duduclaw
# クリーンアップ
docker compose down -v # ⚠️ volumeも一緒に削除される。データは全て失われる
docker system prune -af # ⚠️ 未使用のimage / containerをすべて削除する

Containerは起動しているが curl localhost:18789/health がConnection refusedを返す

Section titled “Containerは起動しているが curl localhost:18789/health がConnection refusedを返す”

原因:Gatewayがコンテナ内部のlocalhostにbindされており、ホストから到達できません。 確認方法

ターミナルウィンドウ
docker compose exec duduclaw env | grep DUDUCLAW_BIND
# DUDUCLAW_BIND=0.0.0.0 になっているはず

もし空文字列であれば、composeファイルの environment: ブロックに追加してください。

docker compose upCompiling duduclaw-gateway で止まる

Section titled “docker compose up が Compiling duduclaw-gateway で止まる”

Rustのコンパイルは CPU/RAM を多く消費し、一般的なノートPCでの初回ビルドは10〜20分ほどかかります。 以降の変更はincremental cacheが効くため、通常1〜2分程度です。

メモリが不足している(4 GB未満)とOOM killedになる可能性があります。以下を検討してください。

  • pre-buildイメージが提供されていればそれを使用する
  • またはホスト側で事前に cargo build --release を実行してバイナリを作り、Dockerfileを書き換えて 直接COPYする(上級者向け)

Claude CLIが “not logged in” と表示される

Section titled “Claude CLIが “not logged in” と表示される”

確認の順序

ターミナルウィンドウ
# 1. Env varが渡っているか
docker compose exec duduclaw env | grep -E "CLAUDE_CODE_OAUTH_TOKEN|ANTHROPIC_API_KEY"
# 2. Volumeが正しくマウントされているか
docker compose exec duduclaw ls -la ~/.claude/
# 3. CLI自体には何が見えているか
docker compose exec duduclaw claude auth status

よくある間違いは、.env を編集した後に docker compose up -d で container を再起動するのを忘れることです。 env varは起動時にのみ注入されるため、ホット変更は反映されません。

ステップ3はトークンが実際に機能していることを証明しません。 claude auth statusCLAUDE_CODE_OAUTH_TOKEN 環境変数が存在しさえすれば loggedIn: true を報告します——そのトークンが依然として認証できるかは 一切チェックしません。失効または組織で無効化されたトークンも、良好な トークンと同じようにこのチェックを通過します。認証情報が実際に機能して いるか確認するには、ダッシュボードのAccountsページでそのアカウントの 認証情報ステータスバッジを確認するか(未確認/認証情報が破損/トークン 無効/組織で無効化——ヘルシーなアカウントは何も表示しません)、 container内で実際にプローブを実行してください:

ターミナルウィンドウ
docker compose exec duduclaw claude -p "reply ok" --model haiku --max-turns 1 --output-format json

JSON出力の is_error / api_error_status フィールドを確認します。

Dashboardには接続できるがagentが「まず claude auth status を実行してください」と返信する

Section titled “Dashboardには接続できるがagentが「まず claude auth status を実行してください」と返信する”

これはv1.8.x以前のバージョンの残存メッセージです。v1.8.22以降は FailureReason で分類されたzh-TWメッセージに変更されています。まだ表示される場合は:

ターミナルウィンドウ
docker compose exec duduclaw duduclaw --version
# 1.8.22以上であることを確認。そうでなければ最新のmainをpullして再buildする

Dashboardがくるくる回り続ける、WebSocket 403

Section titled “Dashboardがくるくる回り続ける、WebSocket 403”

症状:tailnet(*.ts.net)またはリバースプロキシのドメイン経由でdashboardを開くとHTTPページ自体は正常に読み込まれるが、 リアルタイムデータがくるくる回り続ける。ブラウザDevToolsのNetworkパネルでは /ws のアップグレードが403を返している。

原因:WebSocketの Origin allowlistはデフォルトでloopbackのみを含んでおり、外部ドメインが含まれていません。allowlistに 追加すれば解決します。

ターミナルウィンドウ
# composeのenvironment:、または.env
DUDUCLAW_ALLOWED_ORIGINS=duduclaw.your-tailnet.ts.net,duduclaw.yourdomain.com

または ~/.duduclaw/config.toml に記述します。

[gateway]
allowed_origins = ["duduclaw.your-tailnet.ts.net"]

再起動後、起動ログに有効になった追加originsが出力されます。詳細は deployment-guide §5 WebSocket Origin 許可リストを参照してください。

Channel webhookがagentをトリガーしない

Section titled “Channel webhookがagentをトリガーしない”
  • LINE / WhatsApp / FeishuはHTTPSが必要です。§10の設定を確認してください
  • Dashboard → Channelsで該当channelの接続状態インジケーターを確認してください
  • logを確認する:docker compose logs -f duduclaw | grep -i webhook

Container sandboxがsub-agentを起動できない

Section titled “Container sandboxがsub-agentを起動できない”

DuDuClawは docker.sock を通じてホストのDocker daemonを呼び出し、agent tasksを実行する隔離コンテナを作成します。失敗する場合:

ターミナルウィンドウ
# コンテナ内からsocketが使えるかテストする
docker compose exec duduclaw docker ps
# ホスト上のcontainer一覧が見えるはず

Permission deniedになる場合、多くはSELinux / AppArmorがブロックしています。Linuxでは以下を試してください。

volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
group_add:
- "${DOCKER_GID:-999}" # ホストのdocker group GIDに合わせる

コンテナ再構築後にOAuth状態が消える

Section titled “コンテナ再構築後にOAuth状態が消える”

volumeが実際に存在するか確認してください。

ターミナルウィンドウ
docker volume ls | grep duduclaw
# duduclaw_duduclaw-data
# duduclaw_duduclaw-claude
# duduclaw_duduclaw-codex
# duduclaw_duduclaw-gemini

もしどれかが欠けていれば、composeファイルが変更されたか、過去に docker compose down -v が実行されたことを意味します。 claude auth login / codex login / gemini auth を再度実行してください。