操作
機能 #133
未完了task.call2arm.com 緊急復旧作業完了報告
ステータス:
新規
優先度:
急いで
担当者:
-
開始日:
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構成¶
- メインアクセス: https://task.call2arm.com/ → 301リダイレクト
- 実際のアプリ: https://task.call2arm.com/redmine-ui/
- API エンドポイント: https://task.call2arm.com/api/
✅ 復旧完了¶
- task.call2arm.com正常アクセス可能
- Redmine API連携Reactアプリケーション正常動作
- 顧客利用可能状態
📋 学習事項¶
- 本番環境作業時は必ず事前バックアップ取得
- nginx-proxy設定変更は段階的実施
- docker-compose管理されたサービスの正確な把握
- 緊急時の迅速な原因特定手順確立
復旧時間: 約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設計¶
- Public: https://task.call2arm.com/
- App: https://task.call2arm.com/redmine-ui/
- API: https://task.call2arm.com/api/ → task-api:3001
重要な設定ポイント¶
- nginx location
/
vs= /
の違い(無限ループ回避) - alias vs root の使い分け
- try_files の fallback 設定
- proxy_pass のトレーリングスラッシュ
この手順により緊急時でも迅速に復旧可能です。
操作