操作
バグ #596
未完了【子チケット】VPSrootにデプロイ
ステータス:
新規
優先度:
急いで
担当者:
-
開始日:
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 さんが約10時間前に更新
🌐 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. 外部サービス本番設定¶
-
Google Maps API設定
- HTTP リファラー: estate.3dwork.jp/*
- IP制限: 85.131.243.51
-
LINE Developers設定
- Webhook URL: https://api.estate.3dwork.jp/line/webhook
- ドメイン許可: estate.3dwork.jp
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ドメインでの本格的な本番運用が可能になります。
操作