cancan-microstack 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. cancan_microstack/__init__.py +14 -0
  2. cancan_microstack/__version__.py +10 -0
  3. cancan_microstack/assets/__init__.py +6 -0
  4. cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
  5. cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
  6. cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
  7. cancan_microstack/assets/builds/caddy/README.md +343 -0
  8. cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
  9. cancan_microstack/assets/builds/caddy/start.sh +78 -0
  10. cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
  11. cancan_microstack/assets/builds/service/Dockerfile +59 -0
  12. cancan_microstack/assets/builds/service/README.md +13 -0
  13. cancan_microstack/assets/ddl/create_db.sql +22 -0
  14. cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
  15. cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
  16. cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
  17. cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
  18. cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
  19. cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
  20. cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
  21. cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
  22. cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
  23. cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
  24. cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
  25. cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
  26. cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
  27. cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
  28. cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
  29. cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
  30. cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
  31. cancan_microstack/assets/ddl/trigger.sql +21 -0
  32. cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
  33. cancan_microstack/assets/scripts/README.md +195 -0
  34. cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
  35. cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
  36. cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
  37. cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
  38. cancan_microstack/assets/scripts/docker/restart.sh +35 -0
  39. cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
  40. cancan_microstack/assets/scripts/docker/start.sh +78 -0
  41. cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
  42. cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
  43. cancan_microstack/assets/scripts/docker/stop.sh +67 -0
  44. cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
  45. cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
  46. cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
  47. cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
  48. cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
  49. cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
  50. cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
  51. cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
  52. cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
  53. cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
  54. cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
  55. cancan_microstack/assets/scripts/podman/stop.sh +73 -0
  56. cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
  57. cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
  58. cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
  59. cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
  60. cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
  61. cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
  62. cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
  63. cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
  64. cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
  65. cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
  66. cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
  67. cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
  68. cancan_microstack/assets/service/Dockerfile +65 -0
  69. cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
  70. cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
  71. cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
  72. cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
  73. cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
  74. cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
  75. cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
  76. cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
  77. cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
  78. cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
  79. cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
  80. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
  81. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
  82. cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
  83. cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
  84. cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
  85. cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
  86. cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
  87. cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
  88. cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
  89. cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
  90. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
  91. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
  92. cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
  93. cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
  94. cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
  95. cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
  96. cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
  97. cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
  98. cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
  99. cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
  100. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
  101. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
  102. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
  103. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
  104. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
  105. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
  106. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
  107. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
  108. cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
  109. cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
  110. cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
  111. cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
  112. cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
  113. cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
  114. cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
  115. cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
  116. cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
  117. cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
  118. cancan_microstack/assets/www/adminops/index.html +16 -0
  119. cancan_microstack/assets/www/adminops/vite.svg +1 -0
  120. cancan_microstack/cli/__init__.py +14 -0
  121. cancan_microstack/cli/__main__.py +9 -0
  122. cancan_microstack/cli/main.py +552 -0
  123. cancan_microstack/cmd/__init__.py +54 -0
  124. cancan_microstack/cmd/cancan/__init__.py +12 -0
  125. cancan_microstack/cmd/cancan/run.py +395 -0
  126. cancan_microstack/cmd/controllersrv/__init__.py +0 -0
  127. cancan_microstack/cmd/controllersrv/run.py +131 -0
  128. cancan_microstack/cmd/infrasrv/__init__.py +5 -0
  129. cancan_microstack/cmd/infrasrv/run.py +100 -0
  130. cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
  131. cancan_microstack/cmd/opsbffsrv/run.py +96 -0
  132. cancan_microstack/core/__init__.py +5 -0
  133. cancan_microstack/core/assets.py +123 -0
  134. cancan_microstack/core/compose_builder.py +102 -0
  135. cancan_microstack/core/doctor.py +152 -0
  136. cancan_microstack/core/microstack.py +71 -0
  137. cancan_microstack/core/runner.py +56 -0
  138. cancan_microstack/core/stack_manager.py +186 -0
  139. cancan_microstack/public/__init__.py +7 -0
  140. cancan_microstack/public/api/__init__.py +1 -0
  141. cancan_microstack/public/api/controllersrv_client.py +277 -0
  142. cancan_microstack/public/api/infrasrv_client.py +404 -0
  143. cancan_microstack/public/const/__init__.py +1 -0
  144. cancan_microstack/public/const/action_consts.py +18 -0
  145. cancan_microstack/public/const/app_consts.py +42 -0
  146. cancan_microstack/public/const/caddy_consts.py +22 -0
  147. cancan_microstack/public/const/controllersrv_consts.py +163 -0
  148. cancan_microstack/public/const/docker_consts.py +15 -0
  149. cancan_microstack/public/const/error.py +56 -0
  150. cancan_microstack/public/const/health_consts.py +52 -0
  151. cancan_microstack/public/const/hook_enums.py +56 -0
  152. cancan_microstack/public/const/logging_enums.py +13 -0
  153. cancan_microstack/public/const/metrics_enums.py +36 -0
  154. cancan_microstack/public/const/monitor_enums.py +26 -0
  155. cancan_microstack/public/const/operation_consts.py +53 -0
  156. cancan_microstack/public/const/opsbffsrv_error.py +92 -0
  157. cancan_microstack/public/const/overrides_consts.py +13 -0
  158. cancan_microstack/public/const/redis.py +17 -0
  159. cancan_microstack/public/const/service_consts.py +15 -0
  160. cancan_microstack/public/const/workflow_consts.py +65 -0
  161. cancan_microstack/public/error.py +41 -0
  162. cancan_microstack/public/logging/__init__.py +0 -0
  163. cancan_microstack/public/logging/initializer.py +109 -0
  164. cancan_microstack/public/logging/mq_handler.py +279 -0
  165. cancan_microstack/public/schemas/__init__.py +1 -0
  166. cancan_microstack/public/schemas/caddy/__init__.py +381 -0
  167. cancan_microstack/public/schemas/caddy/analysis.py +90 -0
  168. cancan_microstack/public/schemas/caddy/route.py +18 -0
  169. cancan_microstack/public/schemas/common.py +79 -0
  170. cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
  171. cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
  172. cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
  173. cancan_microstack/public/schemas/controllersrv/const.py +24 -0
  174. cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
  175. cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
  176. cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
  177. cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
  178. cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
  179. cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
  180. cancan_microstack/public/schemas/hook_metrics.py +124 -0
  181. cancan_microstack/public/schemas/hooks.py +39 -0
  182. cancan_microstack/public/schemas/infra/__init__.py +0 -0
  183. cancan_microstack/public/schemas/infra/cleanup.py +25 -0
  184. cancan_microstack/public/schemas/infra/container.py +74 -0
  185. cancan_microstack/public/schemas/infra/enums.py +135 -0
  186. cancan_microstack/public/schemas/infra/health_check.py +42 -0
  187. cancan_microstack/public/schemas/infra/hook_log.py +42 -0
  188. cancan_microstack/public/schemas/infra/operation.py +90 -0
  189. cancan_microstack/public/schemas/infra/overview.py +25 -0
  190. cancan_microstack/public/schemas/infra/push.py +33 -0
  191. cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
  192. cancan_microstack/public/schemas/infra/service_config.py +10 -0
  193. cancan_microstack/public/schemas/infra/service_info.py +69 -0
  194. cancan_microstack/public/schemas/infra/service_instance.py +93 -0
  195. cancan_microstack/public/schemas/infra/service_management.py +152 -0
  196. cancan_microstack/public/schemas/infra/service_operation.py +79 -0
  197. cancan_microstack/public/schemas/infra/service_registry.py +158 -0
  198. cancan_microstack/public/schemas/infra/status_types.py +19 -0
  199. cancan_microstack/public/schemas/infra/workflow.py +566 -0
  200. cancan_microstack/public/schemas/logging/__init__.py +1 -0
  201. cancan_microstack/public/schemas/logging/log_event.py +121 -0
  202. cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
  203. cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
  204. cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
  205. cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
  206. cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
  207. cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
  208. cancan_microstack/public/schemas/service_operation.py +24 -0
  209. cancan_microstack/public/schemas/service_registry.py +40 -0
  210. cancan_microstack/public/types/__init__.py +7 -0
  211. cancan_microstack/public/web/__init__.py +0 -0
  212. cancan_microstack/public/web/config_value.py +105 -0
  213. cancan_microstack/public/web/server.py +385 -0
  214. cancan_microstack/py.typed +0 -0
  215. cancan_microstack/runtime/__init__.py +0 -0
  216. cancan_microstack/runtime/compose_cmd.py +228 -0
  217. cancan_microstack/runtime/host_daemon.py +318 -0
  218. cancan_microstack/runtime/overrides.py +103 -0
  219. cancan_microstack/runtime/resources.py +25 -0
  220. cancan_microstack/runtime/workspace.py +94 -0
  221. cancan_microstack/services/__init__.py +0 -0
  222. cancan_microstack/services/controllersrv/__init__.py +8 -0
  223. cancan_microstack/services/controllersrv/application/__init__.py +0 -0
  224. cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
  225. cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
  226. cancan_microstack/services/controllersrv/conf/config.py +76 -0
  227. cancan_microstack/services/controllersrv/conf/settings.py +54 -0
  228. cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
  229. cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
  230. cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
  231. cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
  232. cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
  233. cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
  234. cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
  235. cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
  236. cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
  237. cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
  238. cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
  239. cancan_microstack/services/controllersrv/router.py +132 -0
  240. cancan_microstack/services/infrasrv/__init__.py +4 -0
  241. cancan_microstack/services/infrasrv/application/__init__.py +0 -0
  242. cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
  243. cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
  244. cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
  245. cancan_microstack/services/infrasrv/application/service_config.py +22 -0
  246. cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
  247. cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
  248. cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
  249. cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
  250. cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
  251. cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
  252. cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
  253. cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
  254. cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
  255. cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
  256. cancan_microstack/services/infrasrv/conf/config.py +98 -0
  257. cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
  258. cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
  259. cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
  260. cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
  261. cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
  262. cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
  263. cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
  264. cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
  265. cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
  266. cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
  267. cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
  268. cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
  269. cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
  270. cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
  271. cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
  272. cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
  273. cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
  274. cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
  275. cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
  276. cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
  277. cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
  278. cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
  279. cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
  280. cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
  281. cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
  282. cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
  283. cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
  284. cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
  285. cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
  286. cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  287. cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
  288. cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
  289. cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
  290. cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
  291. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
  292. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
  293. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
  294. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
  295. cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
  296. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
  297. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
  298. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
  299. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
  300. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
  301. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
  302. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
  303. cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
  304. cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
  305. cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
  306. cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
  307. cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
  308. cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
  309. cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
  310. cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
  311. cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
  312. cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
  313. cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
  314. cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
  315. cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
  316. cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
  317. cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
  318. cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
  319. cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
  320. cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
  321. cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
  322. cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
  323. cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
  324. cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
  325. cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
  326. cancan_microstack/services/infrasrv/router.py +341 -0
  327. cancan_microstack/services/opsbffsrv/__init__.py +4 -0
  328. cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
  329. cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
  330. cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
  331. cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
  332. cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
  333. cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
  334. cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
  335. cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
  336. cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
  337. cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
  338. cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
  339. cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
  340. cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
  341. cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
  342. cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
  343. cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
  344. cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
  345. cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
  346. cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
  347. cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
  348. cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
  349. cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
  350. cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
  351. cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
  352. cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
  353. cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
  354. cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
  355. cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
  356. cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
  357. cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
  358. cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
  359. cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
  360. cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
  361. cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
  362. cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
  363. cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
  364. cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
  365. cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
  366. cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
  367. cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
  368. cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
  369. cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
  370. cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
  371. cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
  372. cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
  373. cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
  374. cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
  375. cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
  376. cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
  377. cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
  378. cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
  379. cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
  380. cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
  381. cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
  382. cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
  383. cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
  384. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
  385. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
  386. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
  387. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
  388. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
  389. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  390. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
  391. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
  392. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
  393. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
  394. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
  395. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
  396. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
  397. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
  398. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
  399. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
  400. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
  401. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
  402. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
  403. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
  404. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
  405. cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
  406. cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
  407. cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
  408. cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
  409. cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
  410. cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
  411. cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
  412. cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
  413. cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
  414. cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
  415. cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
  416. cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
  417. cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
  418. cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
  419. cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
  420. cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
  421. cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
  422. cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
  423. cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
  424. cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
  425. cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
  426. cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
  427. cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
  428. cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
  429. cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
  430. cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
  431. cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
  432. cancan_microstack/services/opsbffsrv/router.py +901 -0
  433. cancan_microstack/utils/__init__.py +1 -0
  434. cancan_microstack/utils/container_env.py +218 -0
  435. cancan_microstack-0.0.1.dist-info/METADATA +155 -0
  436. cancan_microstack-0.0.1.dist-info/RECORD +440 -0
  437. cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
  438. cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
  439. cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
  440. cancan_microstack-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,250 @@
1
+ """
2
+ Caddy 路由管理 API 接口
3
+
4
+ 提供路由的 CRUD 操作、同步、统计等功能
5
+ """
6
+ from typing import (
7
+ Any,
8
+ Dict,
9
+ Optional,
10
+ )
11
+ import http
12
+
13
+ from linglong_web.utils import logger
14
+ from linglong_web import limiter
15
+ from cancan_microstack.public.schemas.common import APIResponse
16
+ from cancan_microstack.public.schemas.caddy.route import (
17
+ ToggleRoutePayload,
18
+ )
19
+ from linglong_web import (
20
+ build_success_response,
21
+ )
22
+ from cancan_microstack.public.schemas.caddy import CaddyRouteCreate, CaddyRouteUpdate
23
+ from cancan_microstack.public.error import HTTPException
24
+ from cancan_microstack.services.opsbffsrv.application.caddy.route_management_app import RouteManagementApp
25
+
26
+ # 应用层实例
27
+ _route_app = RouteManagementApp()
28
+
29
+
30
+ @limiter("20/second")
31
+ async def create_route_handler(route_data: CaddyRouteCreate) -> APIResponse[Dict[str, Any]]:
32
+ """
33
+ 创建新路由
34
+
35
+ Args:
36
+ route_data: 路由创建数据
37
+
38
+ Returns:
39
+ 统一响应格式
40
+ """
41
+ logger.info(f"创建路由: domain={route_data.domain}, path={route_data.path_pattern}")
42
+ result = await _route_app.create_route_and_sync(route_data)
43
+
44
+ if result.get("status") == "success":
45
+ return build_success_response(data=result)
46
+
47
+ raise HTTPException(
48
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
49
+ msg=result.get("message") or result.get("error") or "创建路由失败",
50
+ detail=str(result)
51
+ )
52
+
53
+
54
+ @limiter("20/second")
55
+ async def update_route_handler(route_id: int, route_data: CaddyRouteUpdate) -> APIResponse[Dict[str, Any]]:
56
+ """
57
+ 更新路由
58
+
59
+ Args:
60
+ route_id: 路由ID
61
+ route_data: 更新数据
62
+
63
+ Returns:
64
+ 统一响应格式
65
+ """
66
+ logger.info(f"更新路由: id={route_id}")
67
+ update_payload = route_data.model_dump(exclude_unset=True)
68
+ # 确保包含有效更新字段,避免空请求 / Ensure payload carries real updates and reject empty requests
69
+ if not update_payload:
70
+ raise HTTPException(
71
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
72
+ msg="更新内容不能为空",
73
+ )
74
+
75
+ result = await _route_app.update_route_and_sync(route_id, update_payload)
76
+
77
+ if result.get("status") == "success":
78
+ return build_success_response(data=result)
79
+
80
+ raise HTTPException(
81
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
82
+ msg=result.get("message") or result.get("error") or "更新路由失败",
83
+ detail=str(result)
84
+ )
85
+
86
+
87
+ @limiter("20/second")
88
+ async def get_route_handler(route_id: int) -> APIResponse[Dict[str, Any]]:
89
+ """
90
+ 获取单个路由详情
91
+
92
+ Args:
93
+ route_id: 路由ID
94
+
95
+ Returns:
96
+ 统一响应格式
97
+ """
98
+ logger.info(f"获取路由: id={route_id}")
99
+ route = await _route_app.get_route(route_id)
100
+
101
+ if route:
102
+ return build_success_response(data=route.model_dump())
103
+
104
+ raise HTTPException(
105
+ status_code=http.HTTPStatus.NOT_FOUND.value,
106
+ msg="路由不存在"
107
+ )
108
+
109
+
110
+ @limiter("20/second")
111
+ async def list_routes_handler(
112
+ domain: Optional[str] = None,
113
+ service_name: Optional[str] = None,
114
+ is_enabled: Optional[bool] = None
115
+ ) -> APIResponse[Dict[str, Any]]:
116
+ """
117
+ 列出路由(支持过滤)
118
+
119
+ Args:
120
+ domain: 域名过滤
121
+ service_name: 服务名称过滤
122
+ is_enabled: 启用状态过滤
123
+
124
+ Returns:
125
+ 统一响应格式
126
+ """
127
+ logger.info(f"列出路由: domain={domain}, service={service_name}, enabled={is_enabled}")
128
+
129
+ # 构建过滤条件
130
+ filters = {}
131
+ if domain:
132
+ filters['domain'] = domain
133
+ if service_name:
134
+ filters['upstream_service'] = service_name
135
+ if is_enabled is not None:
136
+ filters['is_enabled'] = is_enabled
137
+
138
+ routes = await _route_app.list_all_routes(filters=filters if filters else None)
139
+
140
+ return build_success_response(data={
141
+ "routes": [r.model_dump() for r in routes],
142
+ "total": len(routes)
143
+ })
144
+
145
+
146
+ @limiter("10/second")
147
+ async def delete_route_handler(route_id: int) -> APIResponse[Dict[str, Any]]:
148
+ """
149
+ 删除路由
150
+
151
+ Args:
152
+ route_id: 路由ID
153
+
154
+ Returns:
155
+ 统一响应格式
156
+ """
157
+ logger.info(f"删除路由: id={route_id}")
158
+ result = await _route_app.delete_route_and_sync(route_id)
159
+
160
+ if result.get("status") == "success":
161
+ return build_success_response(data=result)
162
+
163
+ raise HTTPException(
164
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
165
+ msg=result.get("message") or result.get("error") or "删除路由失败",
166
+ detail=str(result)
167
+ )
168
+
169
+
170
+ @limiter("10/second")
171
+ async def toggle_route_handler(route_id: int, payload: Optional[ToggleRoutePayload] = None) -> APIResponse[
172
+ Dict[str, Any]]:
173
+ """
174
+ 切换路由启用状态
175
+
176
+ Args:
177
+ route_id: 路由ID
178
+
179
+ Returns:
180
+ 统一响应格式
181
+ """
182
+ logger.info(f"切换路由状态: id={route_id}")
183
+ target_enabled = payload.enabled if payload else None
184
+ # 支持指定目标状态,默认自动取反 / Allow explicit target state while auto-inverting when absent
185
+ result = await _route_app.toggle_route_and_sync(route_id, target_enabled)
186
+
187
+ if result.get("status") == "success":
188
+ return build_success_response(data=result)
189
+
190
+ raise HTTPException(
191
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
192
+ msg=result.get("message") or result.get("error") or "切换路由状态失败",
193
+ detail=str(result)
194
+ )
195
+
196
+
197
+ @limiter("5/second")
198
+ async def sync_all_routes_handler() -> APIResponse[Dict[str, Any]]:
199
+ """
200
+ 同步所有路由到 Caddy
201
+
202
+ Returns:
203
+ 统一响应格式
204
+ """
205
+ logger.info("同步所有路由到 Caddy")
206
+ result = await _route_app.sync_all_routes()
207
+
208
+ if result.get("status") == "success":
209
+ return build_success_response(data=result)
210
+
211
+ raise HTTPException(
212
+ status_code=http.HTTPStatus.INTERNAL_SERVER_ERROR.value,
213
+ msg=result.get("message", "同步路由失败"),
214
+ detail=str(result)
215
+ )
216
+
217
+
218
+ @limiter("20/second")
219
+ async def get_route_statistics_handler() -> APIResponse[Dict[str, Any]]:
220
+ """
221
+ 获取路由统计信息
222
+
223
+ Returns:
224
+ 统一响应格式
225
+ """
226
+ logger.info("获取路由统计信息")
227
+ stats = await _route_app.get_route_statistics()
228
+
229
+ return build_success_response(data=stats)
230
+
231
+
232
+ @limiter("20/second")
233
+ async def get_routes_by_domain_handler(domain: str) -> APIResponse[Dict[str, Any]]:
234
+ """
235
+ 根据域名获取路由列表
236
+
237
+ Args:
238
+ domain: 域名
239
+
240
+ Returns:
241
+ 统一响应格式
242
+ """
243
+ logger.info(f"根据域名获取路由: domain={domain}")
244
+ routes = await _route_app.get_routes_by_domain(domain)
245
+
246
+ return build_success_response(data={
247
+ "domain": domain,
248
+ "routes": [r.model_dump() for r in routes],
249
+ "total": len(routes)
250
+ })
@@ -0,0 +1,243 @@
1
+ """
2
+ Caddy 统计分析 API 接口
3
+
4
+ 提供实时统计、趋势分析、Top 排行等功能
5
+ Provides realtime statistics, trend analysis, and top rankings for Caddy traffic
6
+ """
7
+ from typing import (
8
+ List,
9
+ Optional,
10
+ )
11
+ import http
12
+
13
+ from linglong_web.utils import logger
14
+ from cancan_microstack.public.const.opsbffsrv_error import OpsbffsrvCaddyStatsErrorCode
15
+ from cancan_microstack.public.schemas.caddy import (
16
+ CaddyStats,
17
+ RealtimeStatsResponse,
18
+ GlobalTrendResponse,
19
+ ServiceTrendResponse,
20
+ RouteTrendResponse,
21
+ TopDimensionResponse,
22
+ CleanupStatsResponse,
23
+ )
24
+ from cancan_microstack.public.schemas.common import APIResponse
25
+ from linglong_web import build_success_response
26
+ from linglong_web import limiter
27
+ from cancan_microstack.public.error import HTTPException
28
+ from cancan_microstack.services.opsbffsrv.application.caddy.stats_aggregation_app import StatsAggregationApp
29
+
30
+ # 应用层实例 / Application layer instance
31
+ _stats_app = StatsAggregationApp()
32
+
33
+
34
+ def _check_result_or_raise(
35
+ result: Optional[dict],
36
+ error_code: OpsbffsrvCaddyStatsErrorCode,
37
+ default_message: str,
38
+ ) -> dict:
39
+ """验证应用层返回的结果字典,失败则抛出异常"""
40
+
41
+ if not isinstance(result, dict):
42
+ raise HTTPException(
43
+ status_code=http.HTTPStatus.INTERNAL_SERVER_ERROR.value,
44
+ error_code=error_code,
45
+ msg=default_message
46
+ )
47
+
48
+ if result.get("status") != "success":
49
+ message = result.get("error") or default_message
50
+ raise HTTPException(
51
+ status_code=http.HTTPStatus.INTERNAL_SERVER_ERROR.value,
52
+ error_code=error_code,
53
+ msg=message
54
+ )
55
+
56
+ return result
57
+
58
+
59
+ def _normalize_stats_sequence(raw_items: List[object]) -> List[CaddyStats]:
60
+ """将原始数据转换为 CaddyStats 列表
61
+ Normalize raw stats payload into a list of CaddyStats models
62
+ """
63
+
64
+ normalized: List[CaddyStats] = []
65
+ for item in raw_items:
66
+ if isinstance(item, CaddyStats):
67
+ normalized.append(item)
68
+ else:
69
+ normalized.append(CaddyStats.model_validate(item))
70
+ return normalized
71
+
72
+
73
+ @limiter("30/second")
74
+ async def get_realtime_global_stats_handler() -> APIResponse[RealtimeStatsResponse]:
75
+ """获取实时全局统计 / Fetch realtime global statistics"""
76
+
77
+ logger.info("获取实时全局统计")
78
+ stats = await _stats_app.get_realtime_global_stats()
79
+ payload = RealtimeStatsResponse(stats=stats)
80
+ return build_success_response(data=payload)
81
+
82
+
83
+ @limiter("30/second")
84
+ async def get_realtime_service_stats_handler(service_name: str) -> APIResponse[RealtimeStatsResponse]:
85
+ """获取实时服务统计 / Fetch realtime statistics for specific service"""
86
+
87
+ logger.info("获取实时服务统计: service=%s", service_name)
88
+ stats = await _stats_app.get_realtime_service_stats(service_name)
89
+ if stats:
90
+ payload = RealtimeStatsResponse(stats=stats)
91
+ return build_success_response(data=payload)
92
+
93
+ raise HTTPException(
94
+ status_code=http.HTTPStatus.NOT_FOUND.value,
95
+ error_code=OpsbffsrvCaddyStatsErrorCode.REALTIME_SERVICE_NOT_FOUND,
96
+ msg="服务统计不存在"
97
+ )
98
+
99
+
100
+ @limiter("20/second")
101
+ async def get_global_trend_handler(
102
+ period: str = "hourly",
103
+ start_time: Optional[str] = None,
104
+ end_time: Optional[str] = None,
105
+ ) -> APIResponse[GlobalTrendResponse]:
106
+ """获取全局趋势数据 / Fetch global traffic trend"""
107
+
108
+ logger.info("获取全局趋势: period=%s", period)
109
+ raw_result = await _stats_app.get_global_trend(period, start_time, end_time)
110
+ result = _check_result_or_raise(
111
+ raw_result,
112
+ OpsbffsrvCaddyStatsErrorCode.GLOBAL_TREND_FAILED,
113
+ "获取全局趋势失败",
114
+ )
115
+
116
+ trend_items = _normalize_stats_sequence(result.get("data", [])) if result else []
117
+ payload = GlobalTrendResponse(
118
+ period=result.get("period", period),
119
+ hours=result.get("hours", 0),
120
+ trend=trend_items,
121
+ )
122
+ return build_success_response(data=payload)
123
+
124
+
125
+ @limiter("20/second")
126
+ async def get_service_trend_handler(
127
+ service_name: str,
128
+ period: str = "hourly",
129
+ start_time: Optional[str] = None,
130
+ end_time: Optional[str] = None,
131
+ ) -> APIResponse[ServiceTrendResponse]:
132
+ """获取服务趋势数据 / Fetch service-specific trend"""
133
+
134
+ logger.info("获取服务趋势: service=%s, period=%s", service_name, period)
135
+ raw_result = await _stats_app.get_service_trend(service_name, period, start_time, end_time)
136
+ result = _check_result_or_raise(
137
+ raw_result,
138
+ OpsbffsrvCaddyStatsErrorCode.SERVICE_TREND_FAILED,
139
+ "获取服务趋势失败",
140
+ )
141
+
142
+ trend_items = _normalize_stats_sequence(result.get("data", [])) if result else []
143
+ payload = ServiceTrendResponse(
144
+ service_name=result.get("service", service_name),
145
+ period=result.get("period", period),
146
+ hours=result.get("hours", 0),
147
+ trend=trend_items,
148
+ )
149
+ return build_success_response(data=payload)
150
+
151
+
152
+ @limiter("20/second")
153
+ async def get_route_trend_handler(
154
+ route_id: int,
155
+ period: str = "hourly",
156
+ start_time: Optional[str] = None,
157
+ end_time: Optional[str] = None,
158
+ ) -> APIResponse[RouteTrendResponse]:
159
+ """获取路由趋势数据 / Fetch route-specific trend"""
160
+
161
+ logger.info("获取路由趋势: route_id=%s, period=%s", route_id, period)
162
+ raw_result = await _stats_app.get_route_trend(route_id, period, start_time, end_time)
163
+ result = _check_result_or_raise(
164
+ raw_result,
165
+ OpsbffsrvCaddyStatsErrorCode.ROUTE_TREND_FAILED,
166
+ "获取路由趋势失败",
167
+ )
168
+
169
+ trend_items = _normalize_stats_sequence(result.get("data", [])) if result else []
170
+ payload = RouteTrendResponse(
171
+ route_id=route_id,
172
+ period=result.get("period", period),
173
+ hours=result.get("hours", 0),
174
+ trend=trend_items,
175
+ )
176
+ return build_success_response(data=payload)
177
+
178
+
179
+ @limiter("20/second")
180
+ async def get_top_countries_handler(
181
+ limit: int = 10,
182
+ start_time: Optional[str] = None,
183
+ end_time: Optional[str] = None,
184
+ ) -> APIResponse[TopDimensionResponse]:
185
+ """获取访问量 Top 国家 / Fetch top countries by traffic volume"""
186
+
187
+ logger.info("获取Top国家: limit=%s", limit)
188
+ raw_result = await _stats_app.get_top_countries(limit, start_time, end_time)
189
+ result = _check_result_or_raise(
190
+ raw_result,
191
+ OpsbffsrvCaddyStatsErrorCode.TOP_COUNTRY_FAILED,
192
+ "获取Top国家失败",
193
+ )
194
+
195
+ items = _normalize_stats_sequence(result.get("data", [])) if result else []
196
+ payload = TopDimensionResponse(
197
+ period=result.get("period", "hour"),
198
+ limit=limit,
199
+ items=items,
200
+ )
201
+ return build_success_response(data=payload)
202
+
203
+
204
+ @limiter("20/second")
205
+ async def get_top_ips_handler(
206
+ limit: int = 10,
207
+ start_time: Optional[str] = None,
208
+ end_time: Optional[str] = None,
209
+ ) -> APIResponse[TopDimensionResponse]:
210
+ """获取访问量 Top IP / Fetch top IPs by request volume"""
211
+
212
+ logger.info("获取Top IP: limit=%s", limit)
213
+ raw_result = await _stats_app.get_top_ips(limit, start_time, end_time)
214
+ result = _check_result_or_raise(
215
+ raw_result,
216
+ OpsbffsrvCaddyStatsErrorCode.TOP_IP_FAILED,
217
+ "获取Top IP失败",
218
+ )
219
+
220
+ items = _normalize_stats_sequence(result.get("data", [])) if result else []
221
+ payload = TopDimensionResponse(
222
+ period=result.get("period", "hour"),
223
+ limit=limit,
224
+ items=items,
225
+ )
226
+ return build_success_response(data=payload)
227
+
228
+
229
+ @limiter("5/second")
230
+ async def cleanup_old_stats_handler(days: int = 90) -> APIResponse[CleanupStatsResponse]:
231
+ """清理旧统计数据 / Cleanup outdated statistics records"""
232
+
233
+ logger.info("清理旧统计数据: days=%s", days)
234
+ raw_result = await _stats_app.cleanup_old_stats(days)
235
+ result = _check_result_or_raise(
236
+ raw_result,
237
+ OpsbffsrvCaddyStatsErrorCode.CLEANUP_FAILED,
238
+ "清理旧统计数据失败",
239
+ )
240
+
241
+ message = result.get("message", "清理完成") if result else "清理完成"
242
+ payload = CleanupStatsResponse(message=message)
243
+ return build_success_response(data=payload)
@@ -0,0 +1,62 @@
1
+ """数据库结构管理 API 处理器 / API handlers for database schema management tasks."""
2
+ from typing import Optional
3
+
4
+ from linglong_web import build_success_response
5
+
6
+ from cancan_microstack.public.schemas.common import APIResponse
7
+ from cancan_microstack.public.schemas.opsbffsrv.db_admin import (
8
+ SchemaApplyRequest,
9
+ SchemaDiffRequest,
10
+ SchemaOperationResponse,
11
+ SchemaRebuildDatabaseRequest,
12
+ SchemaRebuildTablesRequest,
13
+ )
14
+ from cancan_microstack.services.opsbffsrv.application.db_admin_app import DatabaseAdminApp
15
+
16
+ # 应用层实例(懒加载)/ Lazily instantiated application layer
17
+ _db_admin_app: Optional[DatabaseAdminApp] = None
18
+
19
+
20
+ def _get_app() -> DatabaseAdminApp:
21
+ """获取数据库管理应用层实例 / Retrieve the database admin application instance."""
22
+
23
+ global _db_admin_app
24
+ if _db_admin_app is None:
25
+ _db_admin_app = DatabaseAdminApp()
26
+ return _db_admin_app
27
+
28
+
29
+ async def schema_apply_handler(
30
+ payload: SchemaApplyRequest,
31
+ ) -> APIResponse[SchemaOperationResponse]:
32
+ """执行模式应用操作 / Apply canonical schema definitions."""
33
+
34
+ result = await _get_app().ensure_schema(payload)
35
+ return build_success_response(data=result)
36
+
37
+
38
+ async def schema_diff_handler(
39
+ payload: SchemaDiffRequest,
40
+ ) -> APIResponse[SchemaOperationResponse]:
41
+ """执行模式比对操作 / Inspect schema drift without applying changes."""
42
+
43
+ result = await _get_app().diff_schema(payload)
44
+ return build_success_response(data=result)
45
+
46
+
47
+ async def schema_rebuild_database_handler(
48
+ payload: SchemaRebuildDatabaseRequest,
49
+ ) -> APIResponse[SchemaOperationResponse]:
50
+ """重建整个数据库 / Rebuild an entire database."""
51
+
52
+ result = await _get_app().rebuild_database(payload)
53
+ return build_success_response(data=result)
54
+
55
+
56
+ async def schema_rebuild_tables_handler(
57
+ payload: SchemaRebuildTablesRequest,
58
+ ) -> APIResponse[SchemaOperationResponse]:
59
+ """重建指定数据表 / Rebuild selected tables."""
60
+
61
+ result = await _get_app().rebuild_tables(payload)
62
+ return build_success_response(data=result)
@@ -0,0 +1,109 @@
1
+ """
2
+ 数据库初始化 API
3
+ 提供数据库初始化和增量构建的 HTTP 接口
4
+ """
5
+ from linglong_web import build_success_response
6
+ from linglong_web.utils import logger
7
+
8
+ from cancan_microstack.public.schemas.common import APIResponse
9
+ from cancan_microstack.public.schemas.opsbffsrv.db_init import (
10
+ DatabaseInitRequest,
11
+ DatabaseIncrementalBuildRequest,
12
+ DatabaseBuildResult,
13
+ DatabaseStatus,
14
+ )
15
+ from cancan_microstack.services.opsbffsrv.application.db_init_app import DatabaseInitApp
16
+
17
+ # 应用层实例(懒加载)
18
+ _db_init_app = None
19
+
20
+
21
+ def _get_app():
22
+ """获取应用层实例"""
23
+ global _db_init_app
24
+ if _db_init_app is None:
25
+ _db_init_app = DatabaseInitApp()
26
+ return _db_init_app
27
+
28
+
29
+ async def initialize_databases_handler(
30
+ request: DatabaseInitRequest,
31
+ ) -> APIResponse[DatabaseBuildResult]:
32
+ """
33
+ 一键初始化所有数据库
34
+
35
+ POST /v1/opsbffsrv/db_init/initialize
36
+
37
+ Body:
38
+ {
39
+ "force": false, // 是否强制重建(会删除已有数据)
40
+ "databases": ["infra", "ops", "biz"] // 可选,不传则初始化全部
41
+ }
42
+
43
+ 适用场景:
44
+ - 首次部署,需要创建所有数据库和表
45
+ - 测试环境重置
46
+ """
47
+ logger.info(f"Initialize databases request: {request}")
48
+ app = _get_app()
49
+ result = await app.initialize_all_databases(request)
50
+
51
+ return build_success_response(data=result)
52
+
53
+
54
+ async def incremental_build_handler(
55
+ request: DatabaseIncrementalBuildRequest,
56
+ ) -> APIResponse[DatabaseBuildResult]:
57
+ """
58
+ 增量构建数据库和表
59
+
60
+ POST /v1/opsbffsrv/db_init/incremental
61
+
62
+ Body:
63
+ {
64
+ "databases": ["infra", "ops"], // 可选,不传则处理全部数据库
65
+ "tables": ["service_config_tbl"] // 可选,不传则处理全部表
66
+ }
67
+
68
+ 逻辑:
69
+ - 数据库不存在则创建,存在则跳过
70
+ - 表不存在则创建,存在则跳过
71
+
72
+ 适用场景:
73
+ - 新增数据库或表
74
+ - 修复缺失的数据库/表
75
+ - 开发环境同步
76
+ """
77
+ logger.info(f"Incremental build request: {request}")
78
+ app = _get_app()
79
+ result = await app.incremental_build(request)
80
+
81
+ return build_success_response(data=result)
82
+
83
+
84
+ async def get_database_status_handler() -> APIResponse[DatabaseStatus]:
85
+ """
86
+ 获取数据库状态
87
+
88
+ GET /v1/opsbffsrv/db_init/status
89
+
90
+ 返回:
91
+ {
92
+ "success": true,
93
+ "data": {
94
+ "databases": [
95
+ {
96
+ "name": "infra",
97
+ "exists": true,
98
+ "tables": ["service_config_tbl", "service_info_tbl", ...]
99
+ },
100
+ ...
101
+ ],
102
+ "ddl_path": "/path/to/ddl"
103
+ }
104
+ }
105
+ """
106
+ app = _get_app()
107
+ status = await app.get_database_status()
108
+
109
+ return build_success_response(data=status)