# OpenClaw（自律型 AI）を Synology NAS にセットアップする手順

> docker-compose.yml: [openclaw/docker-compose.yml](openclaw/docker-compose.yml)

## 概要

OpenClaw（旧 Moltbot / Clawdbot）は自律型 AI エージェントです。
Docker で 2 つのコンテナ（Gateway + CLI）が起動し、Web GUI から操作できます。

## 前提条件

- Synology NAS に **Container Manager** がインストール済み
- SSH アクセスが有効（コントロールパネル → ターミナル と SNMP → SSH サービスを有効化）
- LLM の API キー（Anthropic Claude 推奨）

## 1. リポジトリをクローン

```bash
cd /volume1/docker
git clone https://github.com/openclaw/openclaw.git
cd openclaw
```

## 2. docker-compose.yml を編集

Synology の Container Manager は BuildKit 非対応のため、公式イメージを使用します。
SSH で以下を実行してください:

```bash
sudo sed -i 's|image: ${OPENCLAW_IMAGE:-openclaw:local}|image: ghcr.io/openclaw/openclaw:latest|g' /volume1/docker/openclaw/docker-compose.yml
```

> **注意**: セットアップスクリプト（`./scripts/docker/setup.sh`）はローカルビルドを行うため、
> Synology NAS では BuildKit エラーが発生します。上記の方法で公式イメージを使用してください。

## 3. 環境変数の設定

```bash
vim /volume1/docker/openclaw/.env
```

以下の項目を設定してください:

```ini
# LLM API キー（いずれか 1 つ以上）
ANTHROPIC_API_KEY=sk-ant-xxxx...
# OPENAI_API_KEY=sk-xxxx...
# GEMINI_API_KEY=xxxx...

# Gateway 認証トークン（Web GUI アクセスに使用）
OPENCLAW_GATEWAY_TOKEN=任意の文字列を設定

# ディレクトリ設定（Synology 向けに /volume1 配下を指定）
OPENCLAW_CONFIG_DIR=/volume1/docker/openclaw/config
OPENCLAW_WORKSPACE_DIR=/volume1/docker/openclaw/workspace

# ネットワーク設定
OPENCLAW_GATEWAY_PORT=18789
OPENCLAW_BRIDGE_PORT=18790
OPENCLAW_GATEWAY_BIND=lan

# タイムゾーン
OPENCLAW_TZ=Asia/Tokyo
```

`vi` の操作: `i` で編集モード → 入力 → `Esc` → `:wq` で保存

## 4. ディレクトリの作成と権限設定

```bash
sudo mkdir -p /volume1/docker/openclaw/config /volume1/docker/openclaw/workspace
sudo chown -R 1000:1000 /volume1/docker/openclaw/config /volume1/docker/openclaw/workspace
```

> コンテナ内の `node` ユーザー（UID=1000）が書き込めるよう、所有者を変更します。

## 5. 設定ファイルの作成

### openclaw.json（Gateway 設定）

```bash
cat > /volume1/docker/openclaw/config/openclaw.json << 'EOF'
{
  "gateway": {
    "mode": "local",
    "trustedProxies": ["172.16.0.0/12", "192.168.0.0/16"],
    "controlUi": {
      "allowedOrigins": ["http://192.168.11.200:18789", "https://192.168.11.200:18791"],
      "dangerouslyAllowHostHeaderOriginFallback": true
    }
  },
  "agents": {
    "defaults": {
      "model": "anthropic/claude-sonnet-4-20250514"
    }
  }
}
EOF
```

> - `trustedProxies`: リバースプロキシ経由の接続をローカルとして扱うために必要
> - `allowedOrigins`: NAS の実際の IP アドレスに合わせて変更してください
> - `agents.defaults.model`: 使用するモデルを指定（API キーでアクセス可能なモデルを設定）

### auth-profiles.json（API キー認証設定）

```bash
sudo mkdir -p /volume1/docker/openclaw/config/agents/main/agent
sudo tee /volume1/docker/openclaw/config/agents/main/agent/auth-profiles.json << 'EOF'
{
  "version": 1,
  "profiles": {
    "anthropic:api": {
      "provider": "anthropic",
      "type": "api_key",
      "key": "sk-ant-xxxx..."
    }
  },
  "order": {
    "anthropic": ["anthropic:api"]
  }
}
EOF
sudo chown -R 1000:1000 /volume1/docker/openclaw/config/agents
```

> `key` には実際の API キーを設定してください。

## 6. 起動

### SSH の場合

```bash
cd /volume1/docker/openclaw
sudo docker compose pull
sudo docker compose up -d
```

### Container Manager（GUI）の場合

1. **Container Manager** → **プロジェクト** → **作成**
2. プロジェクト名: `openclaw`
3. パス: `/volume1/docker/openclaw`
4. Web ポータル設定 → チェックせずに **次へ**
5. 完了（自動でイメージのダウンロードと起動が行われます）

## 7. HTTPS リバースプロキシの設定

HTTP アクセスではブラウザのセキュアコンテキスト制限により接続できないため、DSM のリバースプロキシで HTTPS 化します。

1. **コントロールパネル** → **ログインポータル** → **詳細** → **リバースプロキシ**
2. **作成** をクリック
3. 「リバース プロキシ規則」画面で以下を設定:

| 項目 | 値 |
|------|-----|
| プロキシ名を反転 | `openclaw` |
| **Target** | |
| プロトコル | HTTPS |
| ホスト名 | `*` |
| ポート | `18791` |
| **送り先** | |
| プロトコル | HTTP |
| ホスト名 | `localhost` |
| ポート | `18789` |

4. **保存**
5. 保存した `openclaw` のルールを再度**編集**
6. **カスタム ヘッダー** タブを開く
7. **作成** → **WebSocket** を選択して追加（`Upgrade` と `Connection` ヘッダーが自動追加される）
8. **保存**

> 自己署名証明書のため、初回アクセス時にブラウザで証明書の警告が出ますが「続行」で問題ありません。

## 8. Web GUI にアクセス

ブラウザで以下にアクセスします:

```
https://<NASのIPアドレス>:18791?token=<OPENCLAW_GATEWAY_TOKEN>
```

例: `https://192.168.11.200:18791?token=suifd@asdbikasdasd4156a74sdhasd`

### 初回デバイスペアリング

初めてブラウザから Connect すると「pairing required」と表示されます。SSH で承認してください:

```bash
cd /volume1/docker/openclaw

# 保留中のペアリングリクエストを確認
sudo docker compose run --rm openclaw-cli devices list

# 表示された Request ID を指定して承認
sudo docker compose run --rm openclaw-cli devices approve <Request ID>
```

承認後、ブラウザで再度 Connect すると接続できます。

## コンテナ構成

| コンテナ | 役割 | ポート |
|----------|------|--------|
| `openclaw-gateway` | Gateway デーモン + Web GUI | 18789 |
| `openclaw-cli` | CLI（コマンド実行用） | - |

> CLI コンテナはコマンド実行後に自動終了します。`docker compose exec` ではなく `docker compose run --rm` を使用してください。

## 運用コマンド

```bash
cd /volume1/docker/openclaw

# ログ確認
sudo docker compose logs -f

# 停止
sudo docker compose down

# 再起動
sudo docker compose restart

# デバイス一覧
sudo docker compose run --rm openclaw-cli devices list

# トークン付き URL の確認
sudo docker compose run --rm openclaw-cli dashboard --no-open
```

## アップデート

```bash
cd /volume1/docker/openclaw
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d
```

Container Manager の場合: **プロジェクト** → **openclaw** → **操作** → **停止** → **構築**

## トラブルシューティング

### Bind mount failed エラー

```
Bind mount failed: '/root/.openclaw/workspace' does not exist
```

`.env` の `OPENCLAW_CONFIG_DIR` と `OPENCLAW_WORKSPACE_DIR` が `/volume1/docker/openclaw` 配下を指しているか確認してください（手順 3 参照）。

### permission denied エラー

ディレクトリの所有者がコンテナ内ユーザーと一致していない可能性があります:

```bash
sudo chown -R 1000:1000 /volume1/docker/openclaw/config /volume1/docker/openclaw/workspace
```

コマンド実行時は `sudo` を付けてください。

### BuildKit エラー（ビルド時）

```
the --mount option requires BuildKit
```

Synology の Docker は BuildKit 非対応です。ローカルビルドではなく、公式イメージを使用してください（手順 2 を参照）。

### No API key found エラー

`auth-profiles.json` が正しいフォーマットで作成されているか確認してください（手順 5 参照）。
ポイント:

- `profiles` キーの下にプロファイルを配置する
- フィールド名は `apiKey` ではなく `key`
- `order` セクションでプロバイダーとプロファイルの対応を指定する

### LLM error api_error

API キーが有効か、指定モデルへのアクセス権があるか確認してください:

```bash
# API キーのテスト
curl -s https://api.anthropic.com/v1/messages \
  -H "x-api-key: <YOUR_API_KEY>" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-4-20250514","max_tokens":10,"messages":[{"role":"user","content":"hi"}]}'
```

モデルを変更する場合は `openclaw.json` の `agents.defaults.model` を編集してください。

### Web GUI にアクセスできない

1. コンテナが起動しているか確認:
   ```bash
   sudo docker compose ps
   ```
2. ポート 18789 / 18791 が他のサービスと競合していないか確認
3. NAS のファイアウォールでポートが許可されているか確認
4. リバースプロキシの WebSocket ヘッダー設定を確認（手順 7 参照）
