# Ponshu Room Proxy Server (Redis永続化対応)

Gemini APIキーを隠蔽し、デバイスごとの利用制限（レート制限）を管理するプロキシサーバー。

## 🎯 機能

- **APIキー保護**: クライアントアプリにAPIキーを含めず、プロキシサーバーのみが保持
- **レート制限**: デバイスIDごとに1日あたりのリクエスト数を制限
- **Redis永続化**: Dockerコンテナ再起動後もカウントを維持
- **認証**: Bearer Token認証（オプション）
- **Dokploy対応**: 将来のDokploy移行に対応した構成

---

## 🚀 クイックスタート（Synology NAS）

### 1. 環境変数ファイル作成

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

`.env` を編集してAPIキーと認証トークンを設定:

```env
GEMINI_API_KEY=AIzaSy...（あなたのAPIキー）
PROXY_AUTH_TOKEN=$(openssl rand -hex 32)  # ランダム生成推奨
DAILY_LIMIT=50
```

### 2. Docker Composeで起動

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

### 3. 動作確認

```bash
curl http://localhost:8080/health
# 期待される出力: OK
```

---

## 📊 Redis データ確認

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

# 使用状況確認
KEYS usage:*
GET "usage:device-123:2026-02-21"
TTL "usage:device-123:2026-02-21"
```

---

## 🔄 運用コマンド

```bash
# ログ確認
docker-compose logs -f proxy

# 再起動
docker-compose restart

# 停止
docker-compose stop

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

---

## 📚 ドキュメント

- **移行ガイド**: [REDIS_MIGRATION_GUIDE.md](REDIS_MIGRATION_GUIDE.md) - In-MemoryからRedis永続化への移行手順
- **セットアップガイド**: [../../docs/SYNOLOGY_PROXY_SETUP.md](../../docs/SYNOLOGY_PROXY_SETUP.md) - 初回構築手順（旧版・参考用）

---

## 🏗️ アーキテクチャ

```
Flutter App (Client)
    ↓ HTTP POST /analyze
    ↓ Authorization: Bearer <token>
Proxy Server (Node.js/Express)
    ↓ Rate Limit Check (Redis)
    ↓ Gemini API Call
Gemini 2.5 Flash API
```

---

## 🔐 セキュリティ

- `.env` ファイルは **Git管理しない**（`.gitignore`に追加済み）
- `PROXY_AUTH_TOKEN` は **長いランダム文字列** を使用
- 外部公開する場合は **リバースプロキシ + HTTPS** 推奨

---

## 📝 環境変数

| 変数名 | 説明 | デフォルト |
|--------|------|-----------|
| `GEMINI_API_KEY` | Gemini APIキー（必須） | なし |
| `PROXY_AUTH_TOKEN` | Bearer Token認証（推奨） | なし（認証無効） |
| `DAILY_LIMIT` | 1日あたりのリクエスト上限 | 50 |
| `REDIS_HOST` | Redisホスト名 | `redis` |
| `REDIS_PORT` | Redisポート | `6379` |
| `PORT` | Proxy Serverポート | `8080` |

---

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

### Q: `Redis connection failed`

**解決策**: Redisコンテナが起動していることを確認

```bash
docker-compose ps
# ponshu-redis が "Up (healthy)" になっているか確認
```

### Q: Flutter アプリから接続できない

**解決策**:
1. `.env` の `PROXY_AUTH_TOKEN` を確認
2. Flutter の `lib/secrets.local.dart` で同じトークンを設定
3. Synology NASのIPアドレス（`100.76.7.3`）が正しいか確認

---

**Last Updated**: 2026-02-21
