プロジェクト

全般

プロフィール

バグ #596

未完了

【子チケット】VPSrootにデプロイ

Redmine Admin さんが1日前に追加. 約6時間前に更新.

ステータス:
新規
優先度:
急いで
担当者:
-
開始日:
2025-06-18
期日:
進捗率:

0%

予定工数:

説明

目的

結合テスト完了後、VPSroot環境への本番デプロイを実施

作業内容

1. VPS環境構築

サーバー基盤準備

  • VPSスペック確認・調整
    • CPU: 4コア以上
    • RAM: 8GB以上
    • Storage: SSD 100GB以上
  • Ubuntu 22.04 LTS セットアップ
  • ファイアウォール設定(ufw)
  • SSH公開鍵認証設定
  • 監視ユーザー作成・sudo権限設定

必要ソフトウェアインストール

  • Docker & Docker Compose インストール
  • Nginx インストール・設定
  • PostgreSQL 15+ & PostGIS インストール
  • Redis インストール・設定
  • Node.js 18+ インストール(PM2管理)
  • SSL証明書設定(Let's Encrypt)

2. アプリケーションデプロイ準備

環境変数設定

  • 本番環境用環境変数ファイル作成
    NODE_ENV=production
    DATABASE_URL=postgresql://...
    JWT_SECRET=...
    GOOGLE_MAPS_API_KEY=...
    LINE_CHANNEL_SECRET=...
    SMTP_HOST=...
    REDIS_URL=...
    
  • 機密情報暗号化・管理
  • 環境変数バリデーション

データベースセットアップ

  • PostgreSQL データベース作成
  • PostGIS 拡張機能有効化
  • Prisma マイグレーション実行
  • 本番用シードデータ投入
  • バックアップ設定(cron)

3. Docker化・コンテナデプロイ

Dockerfileベースデプロイ

  • マルチステージビルド設定
  • 本番用イメージ作成
  • docker-compose.prod.yml 設定
  • コンテナヘルスチェック設定
  • ログローテーション設定

コンテナ構成

services:
  web:          # React MPA (Nginx)
  api:          # Node.js API
  line-bot:     # LINE Bot Service  
  postgresql:   # Database
  redis:        # Cache
  nginx:        # Reverse Proxy

4. Nginx リバースプロキシ設定

HTTP/HTTPS設定

  • SSL証明書設定
  • HTTP → HTTPS リダイレクト
  • セキュリティヘッダー設定
  • gzip圧縮設定
  • 静的ファイル配信最適化

ロードバランシング・キャッシュ

  • API サーバーへのプロキシ設定
  • 静的ファイルキャッシュ設定
  • レート制限設定
  • アクセスログ設定

5. セキュリティ設定

サーバーセキュリティ

  • ファイアウォール設定(22, 80, 443のみ開放)
  • fail2ban設定(SSH, HTTP攻撃対策)
  • 自動セキュリティアップデート設定
  • 不要サービス停止

アプリケーションセキュリティ

  • CORS設定(本番ドメインのみ許可)
  • CSP設定
  • レート制限設定
  • セキュリティヘッダー設定

6. 監視・ログ設定

システム監視

  • Prometheus + Grafana セットアップ
  • Node Exporter設定
  • アプリケーションメトリクス収集
  • アラート設定(Slack通知)

ログ管理

  • ログ集約設定(rsyslog)
  • アプリケーションログ設定
  • ログローテーション設定
  • ログ監視・分析設定

7. パフォーマンス最適化

CDN設定

  • 静的ファイルCDN配信設定
  • 画像最適化設定
  • キャッシュポリシー設定

データベース最適化

  • PostgreSQL設定チューニング
  • インデックス最適化確認
  • コネクションプール設定
  • スロークエリ監視設定

8. バックアップ・復旧設定

自動バックアップ

  • データベース日次バックアップ(cron)
  • アプリケーションファイルバックアップ
  • 設定ファイルバックアップ
  • バックアップ世代管理(7日保持)

災害復旧準備

  • 復旧手順書作成
  • 復旧テスト実施
  • 緊急連絡先設定

9. デプロイ実行

段階的デプロイ

  • ステージング環境デプロイ
  • ステージング環境動作確認
  • 本番環境デプロイ
  • 本番環境動作確認

ヘルスチェック

  • アプリケーション起動確認
  • API エンドポイント疎通確認
  • データベース接続確認
  • 外部サービス連携確認

10. 運用移行準備

運用ドキュメント作成

  • サーバー運用手順書
  • トラブルシューティングガイド
  • 緊急時対応手順書
  • 定期メンテナンス手順書

運用体制移行

  • 監視体制確立
  • サポート体制確立
  • 運用担当者への引き継ぎ

成果物

  • 本番稼働システム
  • デプロイ手順書
  • 運用手順書
  • 監視・アラート設定
  • バックアップ・復旧設定
  • セキュリティ設定ドキュメント

技術要件

  • 可用性: 99.9%以上
  • レスポンス時間: API < 1秒、ページ < 3秒
  • 同時接続数: 1000ユーザー対応
  • SSL/TLS: TLS 1.3対応
  • セキュリティ: 最新のベストプラクティス適用

前提条件

  • チケット#595(結合試験)完了・品質基準クリア
  • VPSアカウント・ドメイン準備完了

期間

2週間

優先度

最高

Redmine Admin さんが約6時間前に更新

🌐 VPSrootへのestate.3dwork.jpドメインデプロイ設定

本番環境でのestate.3dwork.jpドメイン設定を詳細に追加します:

1. ドメイン・DNS設定

DNS レコード設定

  • A レコード設定

    estate.3dwork.jp.    A    85.131.243.51
    api.estate.3dwork.jp. A    85.131.243.51
    
  • CNAME レコード設定

    www.estate.3dwork.jp.        CNAME  estate.3dwork.jp.
    staging.estate.3dwork.jp.    CNAME  estate.3dwork.jp.
    
  • DNS設定確認

    # VPS側で確認
    dig estate.3dwork.jp +short
    nslookup api.estate.3dwork.jp
    

2. SSL証明書取得・設定

Let's Encrypt ワイルドカード証明書

  • certbot インストール・設定

    # VPS root環境
    sudo apt update && sudo apt install certbot python3-certbot-nginx
    
    # ワイルドカード証明書取得
    sudo certbot certonly --manual --preferred-challenges dns \
      -d "*.estate.3dwork.jp" -d "estate.3dwork.jp"
    
  • DNS TXT レコード設定

    # certbot指示に従いDNS TXT レコード追加
    _acme-challenge.estate.3dwork.jp. TXT "xxxxxxxxxxxx"
    
  • 証明書自動更新設定

    # crontab設定
    0 12 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
    

3. Nginx設定(本番環境)

メインサイト設定

  • /etc/nginx/sites-available/estate.3dwork.jp
    server {
        listen 80;
        server_name estate.3dwork.jp www.estate.3dwork.jp;
        return 301 https://estate.3dwork.jp$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name www.estate.3dwork.jp;
        return 301 https://estate.3dwork.jp$request_uri;
        
        ssl_certificate /etc/letsencrypt/live/estate.3dwork.jp/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/estate.3dwork.jp/privkey.pem;
    }
    
    server {
        listen 443 ssl http2;
        server_name estate.3dwork.jp;
        
        ssl_certificate /etc/letsencrypt/live/estate.3dwork.jp/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/estate.3dwork.jp/privkey.pem;
        
        # セキュリティヘッダー
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        add_header X-Frame-Options DENY always;
        add_header X-Content-Type-Options nosniff always;
        
        # React アプリケーション配信
        location / {
            root /var/www/estate.3dwork.jp/dist;
            try_files $uri $uri/ /index.html;
            
            # キャッシュ設定
            location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
                expires 1y;
                add_header Cache-Control "public, immutable";
            }
        }
        
        # API プロキシ
        location /api/ {
            proxy_pass http://localhost:8000/api/;
            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;
        }
    }
    

API サーバー設定

  • /etc/nginx/sites-available/api.estate.3dwork.jp
    server {
        listen 443 ssl http2;
        server_name api.estate.3dwork.jp;
        
        ssl_certificate /etc/letsencrypt/live/estate.3dwork.jp/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/estate.3dwork.jp/privkey.pem;
        
        location / {
            proxy_pass http://localhost:8000;
            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;
            
            # CORS Headers
            add_header Access-Control-Allow-Origin "https://estate.3dwork.jp" always;
            add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
            add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
        }
    }
    

4. Docker Compose本番設定

  • docker-compose.prod.yml
    version: '3.8'
    services:
      web:
        build:
          context: .
          dockerfile: apps/web/Dockerfile.prod
        volumes:
          - /var/www/estate.3dwork.jp:/usr/share/nginx/html
        environment:
          - VITE_APP_DOMAIN=estate.3dwork.jp
          - VITE_API_BASE_URL=https://api.estate.3dwork.jp/api
          
      api:
        build:
          context: .
          dockerfile: apps/api/Dockerfile.prod
        ports:
          - "8000:8000"
        environment:
          - NODE_ENV=production
          - CORS_ORIGINS=https://estate.3dwork.jp
          - COOKIE_DOMAIN=.estate.3dwork.jp
          - DATABASE_URL=${DATABASE_URL}
        depends_on:
          - postgres
          - redis
          
      postgres:
        image: postgis/postgis:15-3.3
        environment:
          POSTGRES_DB: estate_production
          POSTGRES_USER: ${DB_USER}
          POSTGRES_PASSWORD: ${DB_PASSWORD}
        volumes:
          - postgres_data:/var/lib/postgresql/data
          
      redis:
        image: redis:7-alpine
        volumes:
          - redis_data:/data
          
    volumes:
      postgres_data:
      redis_data:
    

5. 本番環境変数設定

  • /opt/estate-app/.env.production
    NODE_ENV=production
    
    # ドメイン設定
    APP_DOMAIN=estate.3dwork.jp
    API_BASE_URL=https://api.estate.3dwork.jp/api
    WEB_BASE_URL=https://estate.3dwork.jp
    
    # セキュリティ
    JWT_SECRET=<生成された安全なシークレット>
    CORS_ORIGINS=https://estate.3dwork.jp
    COOKIE_DOMAIN=.estate.3dwork.jp
    
    # 外部API
    GOOGLE_MAPS_API_KEY=<本番用APIキー>
    LINE_CHANNEL_SECRET=<本番用シークレット>
    LINE_WEBHOOK_URL=https://api.estate.3dwork.jp/line/webhook
    
    # メール設定
    SMTP_HOST=smtp.gmail.com
    MAIL_FROM=noreply@estate.3dwork.jp
    

6. 外部サービス本番設定

7. 監視・ログ設定

  • Nginx アクセスログ

    access_log /var/log/nginx/estate.3dwork.jp.access.log;
    error_log /var/log/nginx/estate.3dwork.jp.error.log;
    
  • SSL証明書監視

    # SSL証明書期限監視スクリプト
    #!/bin/bash
    cert_exp_date=$(openssl x509 -in /etc/letsencrypt/live/estate.3dwork.jp/cert.pem -noout -dates | grep notAfter | cut -d= -f2)
    # アラート処理...
    

これらの設定により、estate.3dwork.jpドメインでの本格的な本番運用が可能になります。

他の形式にエクスポート: Atom PDF