| # ☁️ クラウドデプロイメント |
|
|
| リモートアクセスと本番利用のため、VPSまたはDockerに9Routerをデプロイ。 |
|
|
| --- |
|
|
| ## 🖥️ VPSデプロイメント |
|
|
| ### 前提条件 |
|
|
| - Ubuntu 20.04+ または同様のLinuxディストリビューション |
| - Node.js 20以上 |
| - Git |
| - rootまたはsudoアクセス |
|
|
| ### ステップ1: リポジトリをクローン |
|
|
| ```bash |
| git clone https://github.com/decolua/9router.git |
| cd 9router/app |
| ``` |
|
|
| ### ステップ2: 依存関係をインストール |
|
|
| ```bash |
| npm install |
| ``` |
|
|
| ### ステップ3: アプリケーションをビルド |
|
|
| ```bash |
| npm run build |
| ``` |
|
|
| ### ステップ4: 環境変数を設定 |
|
|
| `.env` ファイルを作成するか、変数をエクスポート: |
|
|
| ```bash |
| export JWT_SECRET="your-secure-secret-change-this-to-random-string" |
| export INITIAL_PASSWORD="your-secure-password" |
| export DATA_DIR="/var/lib/9router" |
| export NODE_ENV="production" |
| ``` |
|
|
| **環境変数:** |
|
|
| | 変数 | デフォルト | 説明 | |
| |----------|---------|-------------| |
| | `JWT_SECRET` | 自動生成 | **本番環境では必ず変更!** JWTトークンの署名に使用 | |
| | `INITIAL_PASSWORD` | `123456` | ダッシュボードログインパスワード | |
| | `DATA_DIR` | `~/.9router` | データベースとデータの保存パス | |
| | `NODE_ENV` | `development` | デプロイ時は `production` に設定 | |
| | `ENABLE_REQUEST_LOGS` | `false` | デバッグリクエスト/レスポンスログを有効化 | |
|
|
| ### ステップ5: データディレクトリを作成 |
|
|
| ```bash |
| sudo mkdir -p /var/lib/9router |
| sudo chown $USER:$USER /var/lib/9router |
| ``` |
|
|
| ### ステップ6: アプリケーションを起動 |
|
|
| ```bash |
| npm run start |
| ``` |
|
|
| ### ステップ7: 本番環境用にPM2をセットアップ |
|
|
| PM2はアプリケーションを稼働させ続け、クラッシュ時に再起動します: |
|
|
| ```bash |
| # PM2をグローバルにインストール |
| npm install -g pm2 |
| |
| # PM2で9Routerを起動 |
| pm2 start npm --name 9router -- start |
| |
| # PM2設定を保存 |
| pm2 save |
| |
| # システム起動時にPM2を開始するようセットアップ |
| pm2 startup |
| # 上記コマンドが出力する指示に従ってください |
| ``` |
|
|
| **PM2管理コマンド:** |
|
|
| ```bash |
| # ログを表示 |
| pm2 logs 9router |
| |
| # アプリケーションを再起動 |
| pm2 restart 9router |
| |
| # アプリケーションを停止 |
| pm2 stop 9router |
| |
| # ステータスを表示 |
| pm2 status |
| |
| # リソースをモニタリング |
| pm2 monit |
| ``` |
|
|
| --- |
|
|
| ## 🐳 Dockerデプロイメント |
|
|
| ### オプション1: Dockerfileを使用 |
|
|
| `app` ディレクトリに `Dockerfile` を作成: |
|
|
| ```dockerfile |
| FROM node:20-alpine |
| |
| WORKDIR /app |
| |
| # Copy package files |
| COPY package*.json ./ |
| |
| # Install dependencies |
| RUN npm ci --only=production |
| |
| # Copy application files |
| COPY . . |
| |
| # Build application |
| RUN npm run build |
| |
| # Expose ports |
| EXPOSE 3000 20128 |
| |
| # Set environment variables |
| ENV NODE_ENV=production |
| ENV DATA_DIR=/app/data |
| |
| # Create data directory |
| RUN mkdir -p /app/data |
| |
| # Start application |
| CMD ["npm", "run", "start"] |
| ``` |
|
|
| **ビルドと実行:** |
|
|
| ```bash |
| # イメージをビルド |
| docker build -t 9router . |
| |
| # コンテナを実行 |
| docker run -d \ |
| --name 9router \ |
| -p 3000:3000 \ |
| -p 20128:20128 \ |
| -e JWT_SECRET="your-secure-secret-change-this" \ |
| -e INITIAL_PASSWORD="your-secure-password" \ |
| -v 9router-data:/app/data \ |
| 9router |
| ``` |
|
|
| ### オプション2: Docker Compose |
|
|
| `docker-compose.yml` を作成: |
|
|
| ```yaml |
| version: '3.8' |
| |
| services: |
| 9router: |
| build: . |
| container_name: 9router |
| ports: |
| - "3000:3000" |
| - "20128:20128" |
| environment: |
| - NODE_ENV=production |
| - JWT_SECRET=your-secure-secret-change-this |
| - INITIAL_PASSWORD=your-secure-password |
| - DATA_DIR=/app/data |
| volumes: |
| - 9router-data:/app/data |
| restart: unless-stopped |
| |
| volumes: |
| 9router-data: |
| ``` |
|
|
| **Docker Composeで実行:** |
|
|
| ```bash |
| # サービスを起動 |
| docker-compose up -d |
| |
| # ログを表示 |
| docker-compose logs -f |
| |
| # サービスを停止 |
| docker-compose down |
| |
| # 再ビルドして再起動 |
| docker-compose up -d --build |
| ``` |
|
|
| --- |
|
|
| ## 🌐 Nginxリバースプロキシ |
|
|
| ### Nginxを使う理由 |
|
|
| - SSL/TLS終端 |
| - ドメイン名マッピング |
| - ロードバランシング |
| - セキュリティ強化 |
|
|
| ### ステップ1: Nginxをインストール |
|
|
| ```bash |
| sudo apt update |
| sudo apt install nginx |
| ``` |
|
|
| ### ステップ2: Nginxを設定 |
|
|
| `/etc/nginx/sites-available/9router` を作成: |
|
|
| ```nginx |
| server { |
| listen 80; |
| server_name your-domain.com; |
| |
| # Redirect HTTP to HTTPS |
| return 301 https://$server_name$request_uri; |
| } |
| |
| server { |
| listen 443 ssl http2; |
| server_name your-domain.com; |
| |
| # SSL certificates (use certbot to generate) |
| ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; |
| ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; |
| |
| # SSL configuration |
| ssl_protocols TLSv1.2 TLSv1.3; |
| ssl_ciphers HIGH:!aNULL:!MD5; |
| ssl_prefer_server_ciphers on; |
| |
| # Proxy to 9Router |
| location / { |
| proxy_pass http://localhost:3000; |
| proxy_http_version 1.1; |
| proxy_set_header Upgrade $http_upgrade; |
| proxy_set_header Connection 'upgrade'; |
| proxy_set_header Host $host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| proxy_set_header X-Forwarded-Proto $scheme; |
| proxy_cache_bypass $http_upgrade; |
| |
| # SSE support - CRITICAL for streaming |
| proxy_buffering off; |
| proxy_read_timeout 86400; |
| } |
| |
| # API endpoint |
| location /v1 { |
| proxy_pass http://localhost:20128; |
| proxy_http_version 1.1; |
| proxy_set_header Host $host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| proxy_set_header X-Forwarded-Proto $scheme; |
| |
| # SSE support - CRITICAL for streaming |
| proxy_buffering off; |
| proxy_read_timeout 86400; |
| } |
| } |
| ``` |
|
|
| ### ステップ3: サイトを有効化 |
|
|
| ```bash |
| # シンボリックリンクを作成 |
| sudo ln -s /etc/nginx/sites-available/9router /etc/nginx/sites-enabled/ |
| |
| # 設定をテスト |
| sudo nginx -t |
| |
| # Nginxをリロード |
| sudo systemctl reload nginx |
| ``` |
|
|
| ### ステップ4: Let's EncryptでSSLをセットアップ |
|
|
| ```bash |
| # certbotをインストール |
| sudo apt install certbot python3-certbot-nginx |
| |
| # SSL証明書を取得 |
| sudo certbot --nginx -d your-domain.com |
| |
| # 自動更新は自動的に設定されます |
| # 更新をテスト |
| sudo certbot renew --dry-run |
| ``` |
|
|
| --- |
|
|
| ## 🔒 セキュリティ考慮事項 |
|
|
| ### 1. デフォルト認証情報を変更 |
|
|
| **重要:** デプロイ前に `JWT_SECRET` と `INITIAL_PASSWORD` を変更: |
|
|
| ```bash |
| # 安全なJWTシークレットを生成 |
| openssl rand -base64 32 |
| |
| # この値をJWT_SECRETに使用 |
| export JWT_SECRET="generated-secret-here" |
| ``` |
|
|
| ### 2. ファイアウォール設定 |
|
|
| ```bash |
| # SSHを許可 |
| sudo ufw allow 22/tcp |
| |
| # HTTP/HTTPSを許可 (Nginx使用時) |
| sudo ufw allow 80/tcp |
| sudo ufw allow 443/tcp |
| |
| # リバースプロキシを使用しない場合、9Routerポートを許可 |
| sudo ufw allow 3000/tcp |
| sudo ufw allow 20128/tcp |
| |
| # ファイアウォールを有効化 |
| sudo ufw enable |
| ``` |
|
|
| ### 3. ダッシュボードアクセスを制限 |
|
|
| APIアクセスのみ必要な場合、ダッシュボードポートを制限: |
|
|
| ```bash |
| # ダッシュボードへのlocalhostアクセスのみ許可 |
| sudo ufw deny 3000/tcp |
| ``` |
|
|
| SSHトンネル経由でダッシュボードにアクセス: |
|
|
| ```bash |
| ssh -L 3000:localhost:3000 user@your-server.com |
| # ブラウザで http://localhost:3000 を開く |
| ``` |
|
|
| ### 4. 定期的な更新 |
|
|
| ```bash |
| # システムパッケージを更新 |
| sudo apt update && sudo apt upgrade -y |
| |
| # 9Routerを更新 |
| cd /path/to/9router/app |
| git pull |
| npm install |
| npm run build |
| pm2 restart 9router |
| ``` |
|
|
| ### 5. バックアップ戦略 |
|
|
| ```bash |
| # データディレクトリをバックアップ |
| tar -czf 9router-backup-$(date +%Y%m%d).tar.gz /var/lib/9router |
| |
| # 自動毎日バックアップ (crontabに追加) |
| 0 2 * * * tar -czf /backups/9router-$(date +\%Y\%m\%d).tar.gz /var/lib/9router |
| ``` |
|
|
| --- |
|
|
| ## 📊 モニタリング |
|
|
| ### アプリケーションステータスを確認 |
|
|
| ```bash |
| # PM2ステータス |
| pm2 status |
| |
| # ログを表示 |
| pm2 logs 9router --lines 100 |
| |
| # リソースをモニタリング |
| pm2 monit |
| ``` |
|
|
| ### Nginxログ |
|
|
| ```bash |
| # アクセスログ |
| sudo tail -f /var/log/nginx/access.log |
| |
| # エラーログ |
| sudo tail -f /var/log/nginx/error.log |
| ``` |
|
|
| ### システムリソース |
|
|
| ```bash |
| # CPUとメモリ使用量 |
| htop |
| |
| # ディスク使用量 |
| df -h |
| |
| # ネットワーク接続 |
| netstat -tulpn | grep -E '3000|20128' |
| ``` |
|
|
| --- |
|
|
| ## 🚨 トラブルシューティング |
|
|
| ### アプリケーションが起動しない |
|
|
| ```bash |
| # ログを確認 |
| pm2 logs 9router |
| |
| # ポートが使用中か確認 |
| sudo lsof -i :3000 |
| sudo lsof -i :20128 |
| |
| # 環境変数を確認 |
| pm2 env 9router |
| ``` |
|
|
| ### Nginx 502 Bad Gateway |
|
|
| ```bash |
| # 9Routerが実行中か確認 |
| pm2 status |
| |
| # Nginxエラーログを確認 |
| sudo tail -f /var/log/nginx/error.log |
| |
| # Nginx設定をテスト |
| sudo nginx -t |
| ``` |
|
|
| ### SSEストリーミングが動作しない |
|
|
| SSEサポート用にNginx設定で `proxy_buffering off` が設定されていることを確認。 |
|
|
| ### Permission Deniedエラー |
|
|
| ```bash |
| # データディレクトリ権限を修正 |
| sudo chown -R $USER:$USER /var/lib/9router |
| chmod 755 /var/lib/9router |
| ``` |
|
|
| --- |
|
|
| ## 🔗 次のステップ |
|
|
| - [プロバイダーを接続](/providers/subscription.md) |
| - [コンボをセットアップ](/features/combos.md) |
| - [ツールと統合](/integration/cursor.md) |
|
|