start_service.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """Start the frontend and QA API without fetching or updating any data."""
  2. import argparse
  3. import ipaddress
  4. import socket
  5. from pathlib import Path
  6. from step2_graph_building.runtime import release_snapshot
  7. from step4_web.api import run
  8. from step2_graph_building.config import get_service_address
  9. def access_urls(host: str, port: int) -> list[str]:
  10. """Return browser URLs; a wildcard bind address is never a client URL."""
  11. if host != '0.0.0.0':
  12. return [f'http://{host}:{port}/']
  13. urls = [f'http://127.0.0.1:{port}/']
  14. try:
  15. addresses = socket.gethostbyname_ex(socket.gethostname())[2]
  16. except OSError:
  17. addresses = []
  18. for address in sorted(set(addresses)):
  19. try:
  20. parsed = ipaddress.ip_address(address)
  21. except ValueError:
  22. continue
  23. if parsed.version == 4 and not (parsed.is_loopback or parsed.is_link_local or parsed.is_unspecified):
  24. urls.append(f'http://{address}:{port}/')
  25. return urls
  26. def print_access_urls(host: str, port: int) -> None:
  27. print(f'服务监听地址: {host}:{port}')
  28. for index, url in enumerate(access_urls(host, port)):
  29. label = '本机访问' if index == 0 else '局域网访问'
  30. print(f'{label}: {url}')
  31. if host == '0.0.0.0':
  32. print('提示: 0.0.0.0 仅用于服务监听,不能作为浏览器访问地址。')
  33. def main():
  34. ap=argparse.ArgumentParser(description=__doc__)
  35. ap.add_argument('--host', help='监听地址,覆盖 SERVICE_HOST')
  36. ap.add_argument('--port', type=int, help='监听端口,覆盖 SERVICE_PORT')
  37. ap.add_argument('--check-config', action='store_true', help='仅检查监听配置,不读取发布数据或启动服务')
  38. ap.add_argument('--restart', action='store_true', help='优雅停止本项目受管服务后启动')
  39. args=ap.parse_args()
  40. try:
  41. host, port = get_service_address(args.host, args.port)
  42. except (RuntimeError, ValueError) as exc:
  43. ap.error(str(exc))
  44. if args.check_config:
  45. print(f'监听配置有效: {host}:{port}')
  46. print_access_urls(host, port)
  47. return
  48. current=release_snapshot()
  49. for field in ('schema_file','display_schema_file','assessment_file'):
  50. if not Path(current[field]).is_file():
  51. raise SystemExit('发布文件不完整,请先运行 scripts/update_data.py --mode templates')
  52. if args.restart:
  53. from step4_web.service_control import stop_for_restart
  54. stop_for_restart()
  55. print_access_urls(host, port)
  56. run(host=host,port=port)
  57. if __name__=='__main__':
  58. main()