# Synology Proxy Server - Redis永続化移行ガイド

## 📋 概要

このガイドでは、Synology NAS上のProxy Serverを**In-Memory方式からRedis永続化方式**に移行する手順を説明します。

### 移行の目的
- **永続化**: Dockerコンテナ再起動後もレート制限カウントが維持される
- **Dokploy対応**: 将来のDokploy導入時にそのまま移行可能な構成
- **複数アプリ対応**: ダッシュボードWebシステム等、他プロジェクトでもRedisを共有可能

---

## 🛠️ 前提条件

- Synology NAS（Container Manager インストール済み）
- 既存のProxy Serverコンテナが稼働中（`ponshu-proxy-server`）
- SSH接続可能な環境（または File Station経由のファイル操作）

---

## 📂 ステップ1: 既存コンテナの停止と削除

### 1-1. Container Managerで既存コンテナを停止

1. Synology DSM → **Container Manager** を開く
2. **コンテナ** タブで `ponshu-proxy-server` を選択
3. **アクション** → **停止** をクリック
4. 停止後、**削除** をクリック（イメージは削除しない）

**注意**: 既存のレート制限カウントは削除されますが、これは移行の性質上避けられません。

---

## 📂 ステップ2: 新しいファイルをSynologyに配置

### 2-1. File Stationでファイルをアップロード

PC上の `tools/proxy/` フォルダから、以下のファイルをSynologyの `/docker/ponshu_proxy/` にアップロードします。

**アップロード対象**:
- `docker-compose.yml` ← **新規追加**
- `server.js` ← **更新版**
- `package.json` ← **更新版（Redis依存追加）**
- `Dockerfile` ← 変更なし
- `.env` ← **新規作成（次ステップ）**

### 2-2. `.env` ファイルを作成

File Stationで `/docker/ponshu_proxy/.env` を新規作成し、以下の内容を記述します。

```env
# Gemini API Key
GEMINI_API_KEY=AIzaSy...（あなたのAPIキー）

# Proxy認証トークン（必須推奨）
PROXY_AUTH_TOKEN=your-secure-token-here

# 1日あたりの解析回数上限
DAILY_LIMIT=50

# Redis接続設定（Docker Compose使用時はデフォルトでOK）
REDIS_HOST=redis
REDIS_PORT=6379
```

**セキュリティ注意**:
- `.env` ファイルは**Git管理しない**こと（`.gitignore` に追加済み）
- `PROXY_AUTH_TOKEN` は推測困難な長いランダム文字列を使用

---

## 📂 ステップ3: Docker Composeでコンテナ起動

### 3-1. SSH接続でSynologyにログイン

```bash
ssh admin@100.76.7.3
```

### 3-2. プロジェクトディレクトリに移動

```bash
cd /volume1/docker/ponshu_proxy
```

### 3-3. Docker Composeで起動

```bash
sudo docker-compose up -d
```

**実行内容**:
- `ponshu-redis`: Redisコンテナを起動（ポート6379、永続化有効）
- `ponshu-proxy-server`: Proxy Serverコンテナを起動（ポート8080、Redis接続）

### 3-4. 起動確認

```bash
sudo docker-compose ps
```

**期待される出力**:
```
NAME                   IMAGE                     STATUS
ponshu-redis           redis:7-alpine            Up (healthy)
ponshu-proxy-server    ponshu_proxy-proxy        Up (healthy)
```

---

## ✅ ステップ4: 動作確認

### 4-1. ヘルスチェック

```bash
curl http://100.76.7.3:8080/health
```

**期待される出力**: `OK`

### 4-2. Redis接続確認

```bash
# Redisコンテナに接続
sudo docker exec -it ponshu-redis redis-cli

# Redis内でコマンド実行
127.0.0.1:6379> PING
PONG

127.0.0.1:6379> KEYS *
(empty array)  # 初回起動時は空

127.0.0.1:6379> exit
```

### 4-3. レート制限テスト（Flutter アプリから実行）

Flutter アプリ（`lib/secrets.local.dart`）で以下を設定:

```dart
static const String aiProxyAnalyzeUrl = 'http://100.76.7.3:8080/analyze';
static const bool useProxy = true;
static const String proxyAuthToken = 'your-secure-token-here'; // .envと同じ値
```

アプリから日本酒ラベル解析を実行し、成功することを確認。

### 4-4. Redis内のデータ確認

```bash
sudo docker exec -it ponshu-redis redis-cli

# 使用状況を確認（device_idは実際のデバイスIDに置き換え）
127.0.0.1:6379> KEYS usage:*
1) "usage:device-123:2026-02-21"

127.0.0.1:6379> GET "usage:device-123:2026-02-21"
"1"  # 1回解析済み

127.0.0.1:6379> TTL "usage:device-123:2026-02-21"
(integer) 43200  # 残り12時間（秒単位）
```

**重要**: TTL（有効期限）が設定されていることを確認してください。これにより、翌日0時以降に自動的にリセットされます。

---

## 🔄 ステップ5: コンテナ再起動テスト（永続化確認）

### 5-1. コンテナ再起動

```bash
sudo docker-compose restart
```

### 5-2. 再起動後のデータ確認

```bash
sudo docker exec -it ponshu-redis redis-cli

127.0.0.1:6379> GET "usage:device-123:2026-02-21"
"1"  # 再起動前のカウントが維持されている
```

**成功条件**: 再起動後もカウントが保持されていること。

---

## 📊 運用上の注意点

### ログの確認方法

```bash
# Proxy Serverのログ
sudo docker-compose logs -f proxy

# Redisのログ
sudo docker-compose logs -f redis
```

### コンテナの停止・削除

```bash
# 停止（データは保持）
sudo docker-compose stop

# 完全削除（データも削除される）
sudo docker-compose down -v
```

**警告**: `docker-compose down -v` を実行すると、Redisのデータボリュームも削除されます。

### Redis データのバックアップ

```bash
# Redisのデータをダンプ
sudo docker exec ponshu-redis redis-cli SAVE

# ダンプファイルをコピー
sudo docker cp ponshu-redis:/data/dump.rdb /volume1/backups/redis-backup-$(date +%Y%m%d).rdb
```

---

## 🚀 Dokploy移行への準備

この構成は**Dokploy環境にそのまま移行可能**です。

### Dokploy移行時の変更点

1. **Gitea連携**: Gitea pushで自動デプロイ
2. **環境変数管理**: `.env` ファイルの代わりにDokployのWeb UIで設定
3. **ドメイン設定**: `ponshu-proxy.local` 等のカスタムドメイン自動割り当て
4. **スケーリング**: Docker Swarmで複数ノードに分散可能

**移行時期**: Week 2（日本酒アプリとダッシュボードを同時にDokployへ移行）

---

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

### Q1: Proxy Serverが起動しない（`Redis connection failed`）

**原因**: Redisコンテナが起動していない、またはネットワーク設定が誤っている。

**解決策**:
```bash
# Redisの状態確認
sudo docker-compose ps

# Redisが "unhealthy" の場合、ログを確認
sudo docker-compose logs redis
```

### Q2: `docker-compose` コマンドが見つからない

**原因**: Synology DSMのバージョンによっては `docker compose`（スペース）を使用。

**解決策**:
```bash
sudo docker compose up -d  # ハイフンなし
```

### Q3: Flutter アプリから接続できない（認証エラー）

**原因**: `PROXY_AUTH_TOKEN` が `.env` と `secrets.local.dart` で一致していない。

**解決策**:
1. `.env` の `PROXY_AUTH_TOKEN` を確認
2. Flutter の `lib/secrets.local.dart` の `proxyAuthToken` を同じ値に設定
3. Flutter アプリを再起動

---

## ✅ 完了チェックリスト

- [ ] 既存コンテナを停止・削除
- [ ] 新しいファイル（`docker-compose.yml`, 更新版 `server.js`, `package.json`）をアップロード
- [ ] `.env` ファイルを作成（APIキー、認証トークン設定）
- [ ] `docker-compose up -d` で起動成功
- [ ] `curl http://100.76.7.3:8080/health` で `OK` 返却
- [ ] Redis内でデータが保存されることを確認（`KEYS usage:*`）
- [ ] コンテナ再起動後もデータが維持されることを確認
- [ ] Flutter アプリから解析が成功することを確認

---

**移行完了後は、この手順書を `docs/` フォルダに移動してアーカイブしてください。**
