141 lines
3.2 KiB
Markdown
141 lines
3.2 KiB
Markdown
# 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
|