#!/usr/bin/env python3 """ 502エラー調査スクリプト: checkin_from_rogappエンドポイントのデバッグ """ import subprocess import time import requests import json from datetime import datetime def test_checkin_endpoint(): """ checkin_from_rogappエンドポイントをテストして502エラーを再現 """ print("🔍 502エラー調査: checkin_from_rogappエンドポイント") print("=" * 60) # テストデータ test_data = { "event_code": "fc_gifu_2025", "team_name": "テストチーム", "cp_number": "1", "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABA...", # 短縮版 "buy_flag": False, "gps_coordinates": { "latitude": 35.6762, "longitude": 139.6503, "accuracy": 5.0, "timestamp": datetime.now().isoformat() }, "camera_metadata": { "capture_time": datetime.now().isoformat(), "device_info": "debug_script" } } # URLを構築 base_url = "http://localhost:8100" checkin_url = f"{base_url}/gifuroge/checkin_from_rogapp" print(f"🎯 テスト対象URL: {checkin_url}") print(f"📊 テストデータ: {json.dumps({k: v if k != 'image' else '[BASE64_DATA]' for k, v in test_data.items()}, indent=2, ensure_ascii=False)}") # まず、GETリクエストでエンドポイントの存在確認 print(f"\n🔍 エンドポイント存在確認(GETリクエスト)") try: get_response = requests.get(checkin_url, timeout=10) print(f"GET レスポンス: {get_response.status_code}") if get_response.status_code == 405: print(f"✅ エンドポイントは存在するが、GETメソッドは許可されていない(正常)") elif get_response.status_code == 404: print(f"❌ エンドポイントが見つからない") return False except Exception as e: print(f"❌ GET テストエラー: {e}") # 正しいURLパターンでもテスト alternative_urls = [ f"{base_url}/rog/checkin_from_rogapp", f"{base_url}/api/checkin_from_rogapp", f"{base_url}/checkin_from_rogapp" ] print(f"\n🔍 代替URLパターンテスト") for url in alternative_urls: try: resp = requests.get(url, timeout=5) print(f" {url}: {resp.status_code}") if resp.status_code in [200, 405]: print(f" ✅ このURLが正しい可能性があります") except: print(f" {url}: 接続エラー") try: print(f"\n🚀 POSTリクエスト送信中...") # リクエスト送信 response = requests.post( checkin_url, json=test_data, headers={ 'Content-Type': 'application/json', 'User-Agent': 'Debug-Script/1.0' }, timeout=30 ) print(f"📥 レスポンス受信:") print(f" ステータスコード: {response.status_code}") print(f" ヘッダー: {dict(response.headers)}") if response.status_code == 405: print(f"❌ 405 Method Not Allowed エラー") print(f" 💡 原因: エンドポイントが存在するが、POSTメソッドが許可されていない") print(f" 📋 許可されているメソッドを確認が必要") print(f" レスポンステキスト: {response.text}") return False elif response.status_code == 502: print(f"❌ 502 Bad Gateway エラーを確認しました") print(f" レスポンステキスト: {response.text}") return False elif response.status_code == 200: print(f"✅ 正常レスポンス") print(f" レスポンスデータ: {response.json()}") return True else: print(f"⚠️ 予期しないステータスコード: {response.status_code}") print(f" レスポンステキスト: {response.text}") return False except requests.exceptions.ConnectionError as e: print(f"❌ 接続エラー: {e}") return False except requests.exceptions.Timeout as e: print(f"❌ タイムアウトエラー: {e}") return False except Exception as e: print(f"❌ その他のエラー: {e}") return False def monitor_logs_during_test(): """ テスト実行中のログを監視 """ print(f"\n🔍 ログ監視開始") print("-" * 40) try: # アプリケーションログを監視 result = subprocess.run( ['docker', 'compose', 'logs', '--tail=20', '--follow', 'app'], capture_output=True, text=True, timeout=10 ) print(f"📋 アプリケーションログ:") print(result.stdout) if result.stderr: print(f"⚠️ エラー出力:") print(result.stderr) except subprocess.TimeoutExpired: print(f"⏰ ログ監視タイムアウト(正常)") except Exception as e: print(f"❌ ログ監視エラー: {e}") def check_docker_services(): """ Dockerサービスの状態確認 """ print(f"\n🐳 Dockerサービス状態確認") print("-" * 40) try: # サービス状態確認 result = subprocess.run( ['docker', 'compose', 'ps'], capture_output=True, text=True, check=True ) print(f"📊 サービス状態:") print(result.stdout) # ヘルスチェック health_result = subprocess.run( ['docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'check'], capture_output=True, text=True ) if health_result.returncode == 0: print(f"✅ Djangoアプリケーション: 正常") print(health_result.stdout) else: print(f"❌ Djangoアプリケーション: エラー") print(health_result.stderr) except subprocess.CalledProcessError as e: print(f"❌ Dockerコマンドエラー: {e}") print(f"stderr: {e.stderr}") except Exception as e: print(f"❌ その他のエラー: {e}") def analyze_nginx_config(): """ nginx設定の確認 """ print(f"\n🌐 nginx設定確認") print("-" * 40) try: # nginx設定テスト result = subprocess.run( ['docker', 'compose', 'exec', 'nginx', 'nginx', '-t'], capture_output=True, text=True ) if result.returncode == 0: print(f"✅ nginx設定: 正常") print(result.stdout) else: print(f"❌ nginx設定: エラー") print(result.stderr) # 最近のnginxエラーログ error_log_result = subprocess.run( ['docker', 'compose', 'logs', '--tail=10', 'nginx'], capture_output=True, text=True ) print(f"\n📋 nginx最近のログ:") print(error_log_result.stdout) except Exception as e: print(f"❌ nginx確認エラー: {e}") def check_django_configuration(): """ Django設定の確認 """ print(f"\n⚙️ Django設定確認") print("-" * 40) try: # Django URL設定の確認 result = subprocess.run( ['docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'show_urls'], capture_output=True, text=True ) if result.returncode == 0: print(f"✅ URL確認コマンド実行成功") # checkin_from_rogappが含まれているかチェック if 'checkin_from_rogapp' in result.stdout: print(f"✅ checkin_from_rogappエンドポイントがURL設定に存在") else: print(f"❌ checkin_from_rogappエンドポイントがURL設定に見つからない") print(f"URL一覧(抜粋):") for line in result.stdout.split('\n'): if 'checkin' in line.lower() or 'rogapp' in line.lower(): print(f" {line}") else: print(f"⚠️ show_urlsコマンドが利用できません") # CSRF設定確認 csrf_result = subprocess.run( ['docker', 'compose', 'exec', 'app', 'python', '-c', "import django; django.setup(); from django.conf import settings; print(f'CSRF_COOKIE_SECURE: {settings.CSRF_COOKIE_SECURE}'); print(f'CSRF_TRUSTED_ORIGINS: {getattr(settings, \"CSRF_TRUSTED_ORIGINS\", \"Not set\")}')"], capture_output=True, text=True ) if csrf_result.returncode == 0: print(f"\n🔒 CSRF設定:") print(csrf_result.stdout) else: print(f"⚠️ CSRF設定確認エラー: {csrf_result.stderr}") except Exception as e: print(f"❌ Django設定確認エラー: {e}") def main(): """ メイン実行関数 """ print(f"🚨 405 Method Not Allowed エラー調査ツール") print(f"時刻: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print("=" * 60) # 1. Dockerサービス状態確認 check_docker_services() # 2. nginx設定確認 analyze_nginx_config() # 3. Django設定確認 check_django_configuration() # 4. エンドポイントテスト print(f"\n🎯 エンドポイントテスト実行") print("-" * 40) success = test_checkin_endpoint() # 5. ログ確認 monitor_logs_during_test() # 結果まとめ print(f"\n📊 調査結果まとめ") print("=" * 60) if success: print(f"✅ checkin_from_rogappエンドポイントは正常に動作しています") print(f"💡 502エラーは一時的な問題だった可能性があります") else: print(f"❌ 405 Method Not Allowed エラーを確認しました") print(f"💡 問題の原因と対策:") print(f" 🔧 考えられる原因:") print(f" 1. CSRFトークンの問題") print(f" 2. @api_viewデコレータの設定問題") print(f" 3. URLパターンの不一致") print(f" 4. nginx設定でPOSTメソッドがブロックされている") print(f" 🛠️ 推奨対策:") print(f" 1. views.pyで@api_view(['POST'])の設定確認") print(f" 2. urls.pyでのルーティング確認") print(f" 3. nginx設定でPOSTメソッド許可確認") print(f" 4. CSRF設定の確認") if __name__ == "__main__": main()