ponshu-room-lite/tools/proxy/REDIS_MIGRATION_GUIDE.md

291 lines
7.9 KiB
Markdown
Raw Normal View History

# Synology Proxy Server - Redis永続化移行ガイド
## 📋 概要
このガイドでは、Synology NAS上のProxy Serverを**In-Memory方式からRedis永続化方式**に移行する手順を説明します。
### 移行の目的
- **永続化**: Dockerコンテナ再起動後もレート制限カウントが維持される
- **Dokploy対応**: 将来のDokploy導入時にそのまま移行可能な構成
- **複数アプリ対応**: ダッシュボードWebシステム等、他プロジェクトでもRedisを共有可能
---
## 🛠️ 前提条件
- Synology NASContainer 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/` フォルダに移動してアーカイブしてください。**