# Tailscale + GitHub Actions デプロイ設定ガイド

## 概要

GitHub Actions から Tailscale 経由で Synology NAS に SSH 接続し、自動デプロイを行う構成。

## 必要な設定

### 1. Tailscale ACL（Access Controls）

#### タグの作成
- **Access Controls** → **Tags** タブ → **Create tag**
- Tag name: `ci`
- Tag owner: 管理者アカウント

#### アクセスルールの作成
- **Access Controls** → **General access rules** → **Add rule**
- Source: `All users and devices`
- Destination: `All users and devices`
- Port and protocol: `All ports and protocols`

### 2. Tailscale OAuth クライアント

**Settings** → **OAuth clients**（Trust credentials）で作成。

#### 必要なスコープ

| カテゴリ | 項目 | Read | Write |
|---------|------|------|-------|
| Devices | Core | ✅ | ✅ |
| Devices | Tags | `tag:ci` | |
| Keys | Auth Keys | ✅ | ✅ |

> **重要**: Auth Keys の Read/Write 権限が必須。これがないと GitHub Action が auth key を生成できず、403 エラーになる。

### 3. GitHub Secrets

リポジトリの **Settings** → **Secrets and variables** → **Actions** に以下を設定：

| Secret 名 | 値 |
|-----------|---|
| `TAILSCALE_OAUTH_CLIENT_ID` | OAuth クライアントの Client ID |
| `TAILSCALE_OAUTH_SECRET` | OAuth クライアントの Secret |
| `NAS_TAILSCALE_IP` | NAS の Tailscale IP（100.x.x.x） |
| `NAS_USER` | NAS の SSH ユーザー名 |
| `NAS_SSH_KEY` | NAS への SSH 秘密鍵 |

## ワークフロー（deploy-nas.yml）

```yaml
name: Deploy to NAS

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Tailscale 接続
        uses: tailscale/github-action@v3
        with:
          oauth-client-id: ${{ secrets.TAILSCALE_OAUTH_CLIENT_ID }}
          oauth-secret: ${{ secrets.TAILSCALE_OAUTH_SECRET }}
          tags: tag:ci

      - name: SSH でデプロイ
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.NAS_TAILSCALE_IP }}
          username: ${{ secrets.NAS_USER }}
          key: ${{ secrets.NAS_SSH_KEY }}
          script: |
            export PATH="/usr/local/bin:/usr/bin:/bin:$PATH"
            cd /volume1/docker/match_12
            git fetch origin main
            git reset --hard origin/main
            docker exec match_12 composer install --no-dev --optimize-autoloader
            docker exec match_12 php artisan migrate --force
            docker exec match_12 php artisan config:cache
            docker exec match_12 php artisan route:cache
```

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

### 403 エラー: "calling actor does not have enough permissions"

- OAuth クライアントの **Auth Keys** に Read/Write 権限があるか確認
- OAuth クライアントの **Devices Core** に Read/Write 権限があるか確認
- ACL に `tag:ci` が定義されているか確認
- GitHub Secrets が最新の OAuth credentials と一致しているか確認

### SSH タイムアウト

- Tailscale の **Machines** で NAS が「Connected」になっているか確認
- **Access Controls** にアクセスルールが設定されているか確認
- NAS で SSH サービスが有効になっているか確認
