run_server.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/env python3
  2. """
  3. LQMDRetrieval 服务启动脚本
  4. """
  5. import sys
  6. import os
  7. import socket
  8. project_root = os.path.dirname(os.path.abspath(__file__))
  9. sys.path.insert(0, project_root)
  10. sys.path.insert(0, os.path.join(project_root, 'src'))
  11. from src.app.core.config import config_handler
  12. def check_port(host: str, port: int) -> bool:
  13. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  14. try:
  15. s.bind((host, port))
  16. return True
  17. except OSError:
  18. return False
  19. def find_available_port(host: str, start_port: int = 8000, max_port: int = 8010) -> int:
  20. for port in range(start_port, max_port + 1):
  21. if check_port(host, port):
  22. return port
  23. return None
  24. def main():
  25. import uvicorn
  26. host = config_handler.get("retrieval_app", "HOST", "0.0.0.0")
  27. port = config_handler.get_int("retrieval_app", "PORT", 8000)
  28. reload = config_handler.get_bool("retrieval_app", "RELOAD", True)
  29. debug = config_handler.get_bool("retrieval_app", "DEBUG", True)
  30. print(f"host={host}, port={port}")
  31. if not check_port(host, port):
  32. print(f"⚠️ 端口 {port} 已被占用,正在查找可用端口...")
  33. available_port = find_available_port(host, port, port + 10)
  34. if available_port:
  35. port = available_port
  36. print(f"✅ 找到可用端口: {port}")
  37. else:
  38. print(f"❌ 未找到可用端口 (尝试范围: {port}-{port+10})")
  39. sys.exit(1)
  40. print("=" * 70)
  41. print(f"🚀 正在启动 {config_handler.get('retrieval_app', 'APP_NAME', '多维度检索')} v{config_handler.get('retrieval_app', 'APP_VERSION', '1.0.0')}")
  42. print("=" * 70)
  43. print(f"📍 服务地址: http://{host}:{port}")
  44. print(f" API文档: http://{host}:{port}/docs")
  45. print(f"🔧 调试模式: {'开启' if debug else '关闭'}")
  46. print(f"🔄 热重载: {'开启' if reload else '关闭'}")
  47. print("=" * 70)
  48. try:
  49. reload_dirs = [os.path.join(project_root, "src")] if reload else None
  50. uvicorn.run(
  51. "src.app.server.app:app",
  52. host=host,
  53. port=port,
  54. reload=reload,
  55. reload_dirs=reload_dirs,
  56. log_level=config_handler.get("retrieval_app", "LOG_LEVEL", "INFO").lower(),
  57. access_log=True,
  58. use_colors=True
  59. )
  60. except KeyboardInterrupt:
  61. print("\n👋 服务已停止")
  62. except Exception as e:
  63. print(f"❌ 服务启动失败: {e}")
  64. import traceback
  65. traceback.print_exc()
  66. sys.exit(1)
  67. if __name__ == "__main__":
  68. main()