プロジェクト

全般

プロフィール

機能 #133

未完了

task.call2arm.com 緊急復旧作業完了報告

Redmine Admin さんが3日前に追加. 3日前に更新.

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

0%

予定工数:

説明

緊急復旧作業完了報告

🚨 インシデント概要

発生日時: 2025/06/03 01:00頃
影響範囲: task.call2arm.com(本番環境)
症状: nginx初期画面表示、顧客アクセス不可
根本原因: ガントチャート開発作業中の設定変更により本番環境に影響

🎯 復旧対象サービス仕様

task.call2arm.com システム構成

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   nginx-proxy   │    │     task-ui      │    │    task-api     │
│  (HTTPS終端)    │───▶│  (フロントエンド)  │───▶│  (バックエンド)   │
│  port 80/443    │    │   nginx:alpine   │    │   Node.js       │
└─────────────────┘    └──────────────────┘    └─────────────────┘
                               │                        │
                               ▼                        ▼
                       /var/docker/task-service/    Redmine API
                       app/web/                      (dev.call2arm.com)
                       (Reactアプリ)

重要なファイル構成

  • Docker Compose: /var/docker/task-service/docker-compose.yml
  • Reactアプリ: /var/docker/task-service/app/web/
  • nginx設定: /var/docker/task-service/nginx.conf
  • API: /var/docker/task-service/app/api/

URL構成

✅ 復旧完了

  • task.call2arm.com正常アクセス可能
  • Redmine API連携Reactアプリケーション正常動作
  • 顧客利用可能状態

📋 学習事項

  1. 本番環境作業時は必ず事前バックアップ取得
  2. nginx-proxy設定変更は段階的実施
  3. docker-compose管理されたサービスの正確な把握
  4. 緊急時の迅速な原因特定手順確立

復旧時間: 約1時間

Redmine Admin さんが3日前に更新

🔧 詳細復旧手順(緊急時対応マニュアル)

🔍 Phase 1: 原因調査手順

1.1 サービス状態確認

# コンテナ状態確認
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'task-ui|nginx-proxy'

# ヘルス状態確認
docker ps | grep task-ui
docker logs task-ui --tail 10

1.2 ネットワーク疎通確認

# nginx-proxyからtask-ui への接続確認
docker network inspect proxy-network | grep -A 5 -B 5 task-ui
docker exec nginx-proxy curl -I http://task-ui/

1.3 設定ファイル確認

# nginx-proxy設定
docker exec nginx-proxy cat /etc/nginx/conf.d/task-call2arm.conf

# task-ui内部nginx設定
docker exec task-ui cat /etc/nginx/conf.d/default.conf

Phase 2: 正しいサービス特定

2.1 元のサービス構成確認

# task-service ディレクトリ確認
find /var/docker -name '*task*'
cd /var/docker/task-service
cat docker-compose.yml

# 正しいアプリケーション確認
ls -la app/web/
head app/web/index.html

2.2 重要な仕様確認事項

  • コンテナ名: task-ui (nginx:stable-alpine)
  • マウントポイント: ./app/web:/usr/share/nginx/html:ro
  • ネットワーク: proxy-network
  • URL構造: /redmine-ui/ パスベース
  • バックエンド: task-api (port 3001) → Redmine API プロキシ

🔧 Phase 3: 復旧実行手順

3.1 コンテナ再作成

# 既存の壊れたコンテナ停止・削除
docker stop task-ui && docker rm task-ui

# 正しい設定でコンテナ再作成
cd /var/docker/task-service
docker-compose up -d task-ui

3.2 nginx設定修正(重要)

# 無限リダイレクト修正
# 変更前: location / { return 301 /redmine-ui/; }
# 変更後: location = / { return 301 /redmine-ui/; }

cat << 'EOF' > nginx.conf
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.html index.htm;

    # Redmine UI アプリケーション用の設定
    location /redmine-ui/ {
        alias /usr/share/nginx/html/;
        try_files $uri $uri/ /index.html;
    }
    
    # Root redirect (無限ループ回避のため = を使用)
    location = / {
        return 301 /redmine-ui/;
    }

    # API proxy - task-api使用
    location /api/ {
        proxy_pass http://task-api:3001/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;
    }

    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
}
EOF

# 設定適用
docker-compose restart task-ui

3.3 nginx-proxy設定確認

# 元の動作する設定に戻す
cat << 'EOF' > /root/nginx-proxy/conf.d/task-call2arm.conf
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name task.call2arm.com;

    ssl_certificate /etc/letsencrypt/live/call2arm.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/call2arm.com/privkey.pem;

    # Proxy to task-ui
    set $upstream http://task-ui:80;
    
    location / {
        proxy_pass $upstream;
        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_set_header X-Forwarded-Port 443;
        
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
    }

    add_header Strict-Transport-Security "max-age=63072000" always;
    client_max_body_size 50M;
}
EOF

docker restart nginx-proxy

Phase 4: 復旧確認

4.1 段階的確認手順

# 1. コンテナヘルス確認
docker ps | grep task-ui

# 2. 内部アクセス確認
docker exec task-ui curl -I http://localhost/redmine-ui/

# 3. プロキシ経由確認
curl -I https://task.call2arm.com/redmine-ui/

# 4. 最終確認
curl -s https://task.call2arm.com/ | head -5

4.2 正常状態の指標

  • HTTP Status: 200 OK (for /redmine-ui/)
  • HTTP Status: 301 (for / → /redmine-ui/)
  • Content-Type: text/html
  • React アプリのHTMLが返される

📋 重要な技術仕様まとめ

Docker構成

  • task-ui: nginx:stable-alpine + React SPA
  • task-api: Node.js + Redmine APIプロキシ
  • Network: proxy-network (nginx-proxy共通)

URL設計

重要な設定ポイント

  1. nginx location / vs = / の違い(無限ループ回避)
  2. alias vs root の使い分け
  3. try_files の fallback 設定
  4. proxy_pass のトレーリングスラッシュ

この手順により緊急時でも迅速に復旧可能です。

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