🔧 詳細復旧手順(緊急時対応マニュアル)¶
🔍 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設計¶
重要な設定ポイント¶
- nginx location
/
vs = /
の違い(無限ループ回避)
- alias vs root の使い分け
- try_files の fallback 設定
- proxy_pass のトレーリングスラッシュ
この手順により緊急時でも迅速に復旧可能です。