# Synology NAS + Docker で Laravel (match_12) を動かす

> docker-compose.yml: [docker-compose.yml](/docker-compose.yml)（リポジトリルート）

## 構成

```
[ブラウザ]
    ↓ https://koh-devvv.com
[DSM リバースプロキシ（SSL終端）]
    ↓ http://localhost:8080
[Docker: Nginx + PHP-FPM + Laravel]  ← 1コンテナ（Supervisor管理）
    ↓
[Docker: MySQL]
```

- ソースコードはバインドマウント（`.:/var/www/html`）で `git pull` のみで即反映（再ビルド不要）
- vendor はコンテナ内のものを優先する named volume でホスト側に上書きされない

---

## ディレクトリ構成

```
/volume1/docker/match_12/          ← git clone 先（プロジェクトルート）
├── docker-compose.yml
├── Dockerfile
├── docker/
│   ├── nginx.conf
│   ├── php.ini
│   ├── supervisord.conf
│   └── entrypoint.sh
├── .env
├── app/
├── public/
│   └── storage -> ../storage/app/public  ← 相対パスのシンボリックリンク
├── storage/
│   └── app/public/voicevox/              ← 音声ファイル等
└── ...
```

---

## 初回デプロイ手順

```bash
# NASにSSH接続
ssh ユーザー名@NASのIP

# プロジェクトをclone
cd /volume1/docker
git clone git@github.com:koheso/match_12.git match_12
cd match_12

# .env を設定
cp .env.example .env
vi .env
# APP_URL=http://NASのIP:8080
# DB_HOST=match_12_mysql
# DB_DATABASE, DB_USERNAME, DB_PASSWORD を設定

# ビルド＆起動
docker compose up -d --build

# 初期化
docker exec match_12 php artisan key:generate
docker exec match_12 php artisan migrate --force
docker exec match_12 php artisan config:cache
docker exec match_12 php artisan route:cache

# ストレージのシンボリックリンク（相対パスで作成）
cd /volume1/docker/match_12/public
ln -s ../storage/app/public storage
```

> **注意**: `php artisan storage:link` はコンテナ内の絶対パスでリンクを作るため、ホスト側からアクセスできません。必ず上記の相対パスで手動作成してください。

---

## コード更新（通常のデプロイ）

ソースコードはバインドマウントされているため、`git pull` だけでコンテナに即反映されます。コンテナの再ビルド・再起動は不要です。

```bash
cd /volume1/docker/match_12
git pull origin main
docker exec match_12 composer install --no-dev --optimize-autoloader
docker exec match_12 npm run build
docker exec match_12 php artisan migrate --force
docker exec match_12 php artisan view:clear
docker exec match_12 php artisan config:cache
docker exec match_12 php artisan route:cache
```

---

## GitHub Actions 自動デプロイ

main ブランチへの push で Tailscale 経由で NAS に自動デプロイされます。

### 必要な GitHub Secrets

| シークレット名 | 内容 |
|---|---|
| `TAILSCALE_OAUTH_CLIENT_ID` | Tailscale OAuth クライアントID |
| `TAILSCALE_OAUTH_SECRET` | Tailscale OAuth シークレット |
| `NAS_TAILSCALE_IP` | NAS の Tailscale IP |
| `NAS_USER` | SSH ユーザー名 |
| `NAS_SSH_KEY` | SSH 秘密鍵 |

---

## .env 設定（NAS用の主要項目）

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=http://NASのIP:8080

DB_CONNECTION=mysql
DB_HOST=match_12_mysql
DB_PORT=3306
DB_DATABASE=match_12
DB_USERNAME=match_12
DB_PASSWORD=secret

VOICEVOX_URL=http://VOICEVOXホスト:50021
ANTHROPIC_API_KEY=sk-ant-xxxxx
```

> `.env` を変更した後は `docker exec match_12 php artisan config:clear` を実行してください。

---

## DSMリバースプロキシ設定（SSL終端）

`コントロールパネル` → `ログインポータル` → `詳細` → `リバースプロキシ` → 作成

| 項目 | 設定値 |
|---|---|
| ソースプロトコル | HTTPS |
| ソースホスト名 | koh-devvv.com |
| ソースポート | 443 |
| 送信先プロトコル | HTTP |
| 送信先ホスト名 | localhost |
| 送信先ポート | 8080 |

証明書は `コントロールパネル` → `セキュリティ` → `証明書` でLet's Encryptを取得・割り当て。

---

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

```bash
# ログ確認
docker logs match_12
docker exec match_12 tail -50 storage/logs/laravel.log

# コンテナ内に入る
docker exec -it match_12 bash

# パーミッション修正
docker exec match_12 chmod -R 775 storage bootstrap/cache
docker exec match_12 chown -R www-data:www-data storage bootstrap/cache

# キャッシュ全クリア
docker exec match_12 php artisan config:clear
docker exec match_12 php artisan route:clear
docker exec match_12 php artisan view:clear
docker exec match_12 php artisan cache:clear
```

### よくある問題

| 症状 | 原因と対処 |
|---|---|
| メニューが表示されない | `view:clear` + `route:cache` を実行 |
| .env 変更が反映されない | `config:clear` を実行（`config:cache` 後は .env を直接読まない） |
| storage の音声/画像が404 | `public/storage` シンボリックリンクを相対パスで確認 |
| PSR-4 autoload エラー | ディレクトリ名の大文字小文字を確認（Linux は区別する） |
| ヘルスチェックが500 | `route:clear` してからアクセス、ログで原因確認 |
