# Synology NAS で Docker デプロイする手順

## 前提条件

- Synology NAS に **Container Manager**（旧 Docker パッケージ）がインストール済み
- SSH アクセスが有効（コントロールパネル → ターミナル と SNMP → SSH サービスを有効化）
- Git がインストール済み（パッケージセンター → Git Server）

## 1. NAS にプロジェクトを配置

SSH で NAS にログインし、クローンします。
プライベートリポジトリのため、GitHub の Personal Access Token（PAT）が必要です。

### PAT の発行

1. GitHub → **Settings** → **Developer settings** → **Personal access tokens** → **Tokens (classic)**
2. **Generate new token (classic)** → スコープ `repo` にチェック → トークンをコピー

### クローン

```bash
cd /volume1/docker
git clone https://<ユーザー名>:<PAT>@github.com/koheso/match_12.git
cd match_12
```

## 2. 環境変数の設定

```bash
cp .env.example .env
nano .env
```

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

```ini
# 本番環境設定
APP_ENV=production
APP_DEBUG=false
APP_URL=http://<NASのIPアドレス>:8080

# ポート（デフォルト: 8080）
APP_PORT=8080

# MySQL 設定（docker-compose.yml と連動）
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=match_12
DB_USERNAME=match_12
DB_PASSWORD=secret
DB_ROOT_PASSWORD=rootsecret

# Laravel Reverb（WebSocket）
BROADCAST_CONNECTION=reverb
REVERB_APP_ID=match12
REVERB_APP_KEY=match12-key
REVERB_APP_SECRET=match12-secret
REVERB_HOST=localhost
REVERB_PORT=8085
REVERB_SCHEME=http
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="${REVERB_HOST}"
VITE_REVERB_PORT="${REVERB_PORT}"
VITE_REVERB_SCHEME="${REVERB_SCHEME}"

# 必要に応じて外部 API キーを設定
ANTHROPIC_API_KEY=
TWITTER_CONSUMER_KEY=
# ... 他の API キー
```

`nano` の操作: **Ctrl + O** → Enter で保存、**Ctrl + X** で終了

## 3. ビルドと起動

### SSH の場合

```bash
cd /volume1/docker/match_12
sudo docker compose up -d --build
```

### Container Manager（GUI）の場合

1. **Container Manager** を開く
2. **プロジェクト** → **作成**
3. プロジェクト名: `match_12`
4. パス: `/volume1/docker/match_12` を選択
5. Web ポータル設定 → チェックせずに **次へ**
6. 完了（自動でビルド・起動されます）

### APP_KEY の生成（初回のみ）

```bash
sudo docker exec match_12 php artisan key:generate
```

## 4. アクセス

ブラウザで `http://<NASのIPアドレス>:8080` にアクセスしてください。

## コンテナ構成

| コンテナ | 役割 | ポート |
|----------|------|--------|
| `match_12` | アプリ（PHP + Nginx + Queue + Cron + Reverb） | 8080（Web）、8085（WebSocket） |
| `match_12_mysql` | MySQL 8.0 データベース | 3306 |

## 起動時に自動実行される処理

1. `composer install` – PHP パッケージインストール
2. MySQL 接続待ち
3. `php artisan migrate` – データベースマイグレーション
4. `npm ci` + `npm run build` – フロントエンドビルド
5. キャッシュ最適化（config / route / view）
6. Supervisor 開始（PHP-FPM / Nginx / Cron / Queue Worker / Reverb）

## Supervisor で管理されるプロセス

| プロセス | 説明 |
|----------|------|
| php-fpm | PHP アプリケーションサーバー |
| nginx | Web サーバー |
| cron | Laravel スケジューラ（毎分実行） |
| queue-worker | キューワーカー（2プロセス） |
| reverb | WebSocket サーバー |

## スケジュールタスク（cron）

| タスク | スケジュール |
|--------|------------|
| `twitter:post-scheduled` | 毎分 |
| `bot:watchdog` | 毎分 |
| `suumo:auto-crawl` | 毎時 |
| `shopping:aggregate-item-daily-log` | 毎日 01:00 |
| `note:generate-and-draft` | 毎日 09:00（要 ENV 設定） |

## 運用コマンド

```bash
# 停止
sudo docker compose down

# 再起動
sudo docker compose restart

# ログ確認
sudo docker compose logs -f app

# artisan コマンド実行
sudo docker exec match_12 php artisan <コマンド>

# キャッシュクリア
sudo docker exec match_12 php artisan cache:clear
sudo docker exec match_12 php artisan config:clear

# composer / npm 実行
sudo docker exec match_12 composer install
sudo docker exec match_12 npm install
sudo docker exec match_12 npm run build
```

## Container Manager での再構築手順

コードを更新した場合（`git pull` 後）:

1. **プロジェクト** → **match_12** を選択
2. **操作** → **停止**
3. **操作** → **構築**（停止後にクリック可能になる）

## MySQL Workbench からの接続

| 項目 | 値 |
|------|------|
| Hostname | NAS の IP アドレス |
| Port | `3306` |
| Username | `match_12` |
| Password | `secret`（.env の DB_PASSWORD） |
| Root Password | `rootsecret`（.env の DB_ROOT_PASSWORD） |

## データの永続化

| ボリューム | マウント先 | 内容 |
|------------|------------|------|
| `mysql_data` | `/var/lib/mysql` | MySQL データベース |
| `storage_data` | `/var/www/html/storage` | アップロードファイル、ログ等 |

## ポート変更

`.env` ファイルで変更可能です:

```ini
APP_PORT=3000       # Web ポート
REVERB_PORT=8085    # WebSocket ポート
DB_PORT=3306        # MySQL ポート
```

変更後: Container Manager で **停止** → **構築**

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

### コンテナが起動しない

```bash
sudo docker compose logs app
```

### パーミッションエラー

```bash
sudo docker exec match_12 chown -R www-data:www-data storage bootstrap/cache
sudo docker exec match_12 chmod -R 775 storage bootstrap/cache
```

### マイグレーションエラー

```bash
sudo docker exec match_12 php artisan migrate:status
sudo docker exec match_12 php artisan migrate --force
```

### キャッシュなしで再ビルド

```bash
sudo docker compose down
sudo docker compose build --no-cache app
sudo docker compose up -d
```

### ディスク容量不足

```bash
sudo docker system prune -a
```
