319 lines
11 KiB
Python
319 lines
11 KiB
Python
#!/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()
|