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,169 @@
1
+ """Caddy access log ingestion background service.
2
+
3
+ 持续读取 Caddy JSON 访问日志文件并写入数据库,供统计页面聚合。
4
+ Continuously tail Caddy JSON access logs and ingest into DB for stats dashboards.
5
+ """
6
+
7
+ import asyncio
8
+ import os
9
+ from pathlib import Path
10
+ from typing import List
11
+
12
+ from linglong_web.utils import logger
13
+
14
+ from cancan_microstack.services.opsbffsrv.application.caddy.access_log_analysis_app import AccessLogAnalysisApp
15
+
16
+
17
+ class CaddyAccessLogIngestionService:
18
+ """Caddy 访问日志采集后台服务 / Background ingestion service for Caddy access logs."""
19
+
20
+ def __init__(self):
21
+ log_path = os.getenv("CADDY_ACCESS_LOG_PATH", "/app/builds/caddy/logs/http-access.json")
22
+ offset_path = os.getenv("CADDY_ACCESS_LOG_OFFSET_PATH", "/app/server_log_data/caddy_access_log.offset")
23
+ poll_interval = os.getenv("CADDY_ACCESS_LOG_POLL_INTERVAL_SECONDS", "2")
24
+ batch_size = os.getenv("CADDY_ACCESS_LOG_BATCH_SIZE", "500")
25
+
26
+ self.log_file_path = Path(log_path)
27
+ self.offset_file_path = Path(offset_path)
28
+ self.poll_interval_seconds = max(float(poll_interval), 0.5)
29
+ self.batch_size = max(int(batch_size), 1)
30
+
31
+ self._app = AccessLogAnalysisApp()
32
+ self._task: asyncio.Task | None = None
33
+ self._stop_event = asyncio.Event()
34
+ self._missing_file_warned = False
35
+
36
+ async def start(self) -> None:
37
+ """启动采集任务 / Start ingestion loop."""
38
+ if self._task and not self._task.done():
39
+ logger.info("Caddy access log ingestion service is already running")
40
+ return
41
+
42
+ self._stop_event.clear()
43
+ self._task = asyncio.create_task(self._run_loop(), name="caddy-access-log-ingestion")
44
+ logger.info(
45
+ "Caddy access log ingestion started: file=%s, offset=%s, interval=%ss, batch=%s",
46
+ self.log_file_path,
47
+ self.offset_file_path,
48
+ self.poll_interval_seconds,
49
+ self.batch_size,
50
+ )
51
+
52
+ async def shutdown(self) -> None:
53
+ """停止采集任务 / Stop ingestion loop."""
54
+ if not self._task:
55
+ return
56
+
57
+ self._stop_event.set()
58
+ try:
59
+ await asyncio.wait_for(self._task, timeout=5)
60
+ except asyncio.TimeoutError:
61
+ self._task.cancel()
62
+ try:
63
+ await self._task
64
+ except asyncio.CancelledError:
65
+ pass
66
+ finally:
67
+ self._task = None
68
+
69
+ logger.info("Caddy access log ingestion stopped")
70
+
71
+ async def _run_loop(self) -> None:
72
+ """采集主循环 / Main polling loop."""
73
+ while not self._stop_event.is_set():
74
+ try:
75
+ await self.sync_once()
76
+ except Exception as exc:
77
+ logger.error("Caddy access log ingestion cycle failed: %s", exc, exc_info=True)
78
+
79
+ try:
80
+ await asyncio.wait_for(self._stop_event.wait(), timeout=self.poll_interval_seconds)
81
+ except asyncio.TimeoutError:
82
+ continue
83
+
84
+ async def sync_once(self) -> int:
85
+ """执行一次增量同步 / Run one incremental ingestion cycle."""
86
+ if not self.log_file_path.exists():
87
+ if not self._missing_file_warned:
88
+ logger.warning("Caddy access log file not found: %s", self.log_file_path)
89
+ self._missing_file_warned = True
90
+ return 0
91
+
92
+ self._missing_file_warned = False
93
+
94
+ current_size = self.log_file_path.stat().st_size
95
+ offset = self._read_offset()
96
+
97
+ # 文件被轮转或截断时回到开头 / Reset offset when file is rotated/truncated
98
+ if offset < 0 or offset > current_size:
99
+ offset = 0
100
+ self._write_offset(offset)
101
+
102
+ total_ingested = 0
103
+ with self.log_file_path.open("r", encoding="utf-8", errors="ignore") as log_file:
104
+ log_file.seek(offset)
105
+
106
+ while True:
107
+ lines, next_offset = self._read_line_batch(log_file)
108
+ if not lines:
109
+ break
110
+
111
+ result = await self._app.ingest_batch_logs(lines)
112
+ if result.get("status") != "success":
113
+ logger.warning("Caddy access log ingest batch failed: %s", result)
114
+ break
115
+
116
+ ingested_count = int(result.get("count", 0))
117
+ total_ingested += ingested_count
118
+ self._write_offset(next_offset)
119
+
120
+ if total_ingested > 0:
121
+ logger.info("Caddy access log ingestion synced %s entries", total_ingested)
122
+
123
+ return total_ingested
124
+
125
+ def _read_line_batch(self, log_file) -> tuple[List[str], int]:
126
+ """读取一批日志行并返回读取后 offset / Read one batch and return next offset."""
127
+ lines: List[str] = []
128
+
129
+ for _ in range(self.batch_size):
130
+ raw_line = log_file.readline()
131
+ if not raw_line:
132
+ break
133
+
134
+ line = raw_line.strip()
135
+ if line:
136
+ lines.append(line)
137
+
138
+ return lines, log_file.tell()
139
+
140
+ def _read_offset(self) -> int:
141
+ """读取 offset 文件 / Read persisted file offset."""
142
+ if not self.offset_file_path.exists():
143
+ return 0
144
+
145
+ try:
146
+ raw = self.offset_file_path.read_text(encoding="utf-8").strip()
147
+ return int(raw) if raw else 0
148
+ except Exception as exc:
149
+ logger.warning("Failed to read caddy log offset file: %s", exc)
150
+ return 0
151
+
152
+ def _write_offset(self, offset: int) -> None:
153
+ """写入 offset 文件 / Persist file offset."""
154
+ try:
155
+ self.offset_file_path.parent.mkdir(parents=True, exist_ok=True)
156
+ self.offset_file_path.write_text(str(offset), encoding="utf-8")
157
+ except Exception as exc:
158
+ logger.warning("Failed to write caddy log offset file: %s", exc)
159
+
160
+
161
+ _ingestion_service: CaddyAccessLogIngestionService | None = None
162
+
163
+
164
+ def get_caddy_access_log_ingestion_service() -> CaddyAccessLogIngestionService:
165
+ """获取全局采集服务实例 / Get singleton ingestion service instance."""
166
+ global _ingestion_service
167
+ if _ingestion_service is None:
168
+ _ingestion_service = CaddyAccessLogIngestionService()
169
+ return _ingestion_service
@@ -0,0 +1,355 @@
1
+ """
2
+ Caddy HTTPS 证书管理应用服务
3
+ 协调证书生命周期管理的业务流程。
4
+
5
+ 现状说明(重要):
6
+ - ACME 自动续订 **尚未实现**。本服务没有集成 certbot / acme.sh 等 ACME 客户端,
7
+ 无法真正申请 / 续订证书。因此 `renew_certificate_manually` 与
8
+ `check_and_renew_expiring_certificates` 一律 **不会** 把证书标记为续订成功,
9
+ 而是返回 / 抛出明确的"未实现"错误,避免把过期证书假装成有效证书。
10
+ - `mark_expired_certificates` 仍保留:把已过期证书标为 expired 是诚实且有用的。
11
+ """
12
+ import http
13
+ from typing import (
14
+ Any,
15
+ Dict,
16
+ List,
17
+ Optional,
18
+ )
19
+ from datetime import datetime
20
+ from linglong_web.utils import logger
21
+ from cancan_microstack.public.schemas.caddy import CaddyCertificate
22
+ from cancan_microstack.public.error import HTTPException
23
+ from cancan_microstack.public.const.error import ErrorCode
24
+ from cancan_microstack.services.opsbffsrv.domain.caddy.certificate_management import CertificateManagementDomain
25
+
26
+ # ACME 自动续订未实现时统一返回的提示信息 / Message returned when ACME auto-renew is not implemented
27
+ _ACME_NOT_IMPLEMENTED_MSG = (
28
+ "ACME 自动续订未实现,请手动续订证书 / "
29
+ "ACME auto-renewal is not implemented; please renew the certificate manually"
30
+ )
31
+
32
+
33
+ class CertificateManagementApp:
34
+ """证书管理应用服务"""
35
+
36
+ def __init__(self):
37
+ self.domain = CertificateManagementDomain()
38
+
39
+ async def register_certificate(self, cert: CaddyCertificate) -> Dict[str, Any]:
40
+ """
41
+ 注册证书
42
+
43
+ Args:
44
+ cert: 证书对象
45
+
46
+ Returns:
47
+ 结果字典
48
+ """
49
+ logger.info(f"Registering certificate for domain: {cert.domain}")
50
+
51
+ try:
52
+ registered_cert = await self.domain.register_new_certificate(cert)
53
+
54
+ return {
55
+ "status": "success",
56
+ "certificate": registered_cert
57
+ }
58
+ except ValueError as e:
59
+ logger.warning(f"Certificate registration failed: {e}")
60
+ return {
61
+ "status": "error",
62
+ "error": str(e)
63
+ }
64
+ except Exception as e:
65
+ logger.error(f"Unexpected error registering certificate: {e}", exc_info=True)
66
+ return {
67
+ "status": "error",
68
+ "error": "Internal server error"
69
+ }
70
+
71
+ async def renew_certificate_manually(self, cert_id: int) -> Dict[str, Any]:
72
+ """
73
+ 手动续期证书
74
+
75
+ 现状:ACME 证书申请逻辑 **尚未实现**(未集成 certbot / acme.sh 等客户端)。
76
+ 因此本方法不会真正续订证书,也 **绝不** 把未续订的证书标记为 active /
77
+ 续订成功(历史上这里写死 success=True,会把过期证书"洗"成有效,已移除)。
78
+ 在 ACME 集成落地前,统一抛出"未实现"错误,由调用方提示用户手动续订。
79
+
80
+ Args:
81
+ cert_id: 证书 ID
82
+
83
+ Raises:
84
+ HTTPException: 证书不存在(404);或 ACME 自动续订未实现(501)
85
+
86
+ Returns:
87
+ 结果字典(当前实现总是抛异常,不会正常返回)
88
+ """
89
+ logger.info(f"Manually renewing certificate: {cert_id}")
90
+
91
+ # 先确认证书存在,给出更准确的错误
92
+ cert = await self.domain.get_certificate_details(cert_id)
93
+ if not cert:
94
+ raise HTTPException(
95
+ status_code=http.HTTPStatus.NOT_FOUND.value,
96
+ error_code=ErrorCode.HANDLER_NOT_FOUND,
97
+ msg="Certificate not found",
98
+ )
99
+
100
+ # ACME 自动续订未实现:诚实失败,不记录任何"续订成功"结果。
101
+ # ACME auto-renewal not implemented: fail honestly, never record a fake success.
102
+ logger.warning(
103
+ "Certificate renewal requested for cert_id=%s but ACME auto-renewal is not implemented",
104
+ cert_id,
105
+ )
106
+ raise HTTPException(
107
+ status_code=http.HTTPStatus.NOT_IMPLEMENTED.value,
108
+ error_code=ErrorCode.SYSTEM_ERROR,
109
+ msg=_ACME_NOT_IMPLEMENTED_MSG,
110
+ )
111
+
112
+ async def check_and_renew_expiring_certificates(self) -> Dict[str, Any]:
113
+ """
114
+ 检查并续期即将过期的证书
115
+
116
+ 现状:此方法本应由调度器定期调用,但 **目前没有任何调度器调用它**;
117
+ 且 ACME 自动续订 **尚未实现**。因此它只能 **识别** 出哪些证书需要续订,
118
+ 但 **无法真正续订**,更 **绝不** 假装续订成功(历史实现会把过期证书
119
+ 洗成有效,已移除)。返回摘要中 renewed 恒为 0,needs_manual_renewal
120
+ 给出需人工续订的证书数量。
121
+
122
+ Returns:
123
+ 续期结果摘要(renewed 恒为 0;不抛异常,便于将来挂调度器时观测)
124
+ """
125
+ logger.info("Checking for expiring certificates...")
126
+
127
+ try:
128
+ # 获取需要续期的证书
129
+ certs_to_renew = await self.domain.get_certificates_needing_renewal()
130
+
131
+ if not certs_to_renew:
132
+ logger.info("No certificates need renewal")
133
+ return {
134
+ "status": "success",
135
+ "message": "No certificates need renewal",
136
+ "renewed": 0,
137
+ "needs_manual_renewal": 0,
138
+ }
139
+
140
+ # ACME 未实现:只识别、不续订、不假成功
141
+ # ACME not implemented: detect only, do not renew, never fake success
142
+ logger.warning(
143
+ "Found %s certificates needing renewal, but ACME auto-renewal is not implemented; "
144
+ "manual renewal required",
145
+ len(certs_to_renew),
146
+ )
147
+
148
+ return {
149
+ "status": "success",
150
+ "message": (
151
+ f"{len(certs_to_renew)} certificate(s) need renewal but ACME auto-renewal "
152
+ f"is not implemented; manual renewal required"
153
+ ),
154
+ "renewed": 0,
155
+ "needs_manual_renewal": len(certs_to_renew),
156
+ }
157
+ except Exception as e:
158
+ logger.error(f"Error in auto-renewal process: {e}", exc_info=True)
159
+ return {
160
+ "status": "error",
161
+ "error": str(e)
162
+ }
163
+
164
+ async def mark_expired_certificates(self) -> Dict[str, Any]:
165
+ """
166
+ 标记过期证书
167
+
168
+ 把已过期的证书状态标记为 expired —— 这是诚实且有用的操作(与"续订"无关,
169
+ 不涉及 ACME),保留。
170
+
171
+ 现状:此方法本应由调度器定期调用,但 **目前没有任何调度器调用它**;
172
+ 如需生效,需在外部接入定时调度。
173
+
174
+ Returns:
175
+ 标记结果
176
+ """
177
+ logger.info("Marking expired certificates...")
178
+
179
+ try:
180
+ count = await self.domain.check_and_mark_expired_certificates()
181
+
182
+ return {
183
+ "status": "success",
184
+ "message": f"Marked {count} certificates as expired"
185
+ }
186
+ except Exception as e:
187
+ logger.error(f"Error marking expired certificates: {e}", exc_info=True)
188
+ return {
189
+ "status": "error",
190
+ "error": str(e)
191
+ }
192
+
193
+ async def update_certificate(self, cert_id: int, data: Dict[str, Any]) -> Dict[str, Any]:
194
+ """
195
+ 更新证书信息
196
+
197
+ Args:
198
+ cert_id: 证书 ID
199
+ data: 更新数据
200
+
201
+ Returns:
202
+ 结果字典
203
+ """
204
+ logger.info(f"Updating certificate: {cert_id}")
205
+
206
+ try:
207
+ updated_cert = await self.domain.update_certificate_info(cert_id, data)
208
+
209
+ if not updated_cert:
210
+ return {
211
+ "status": "error",
212
+ "error": "Certificate not found"
213
+ }
214
+
215
+ return {
216
+ "status": "success",
217
+ "certificate": updated_cert
218
+ }
219
+ except Exception as e:
220
+ logger.error(f"Error updating certificate: {e}", exc_info=True)
221
+ return {
222
+ "status": "error",
223
+ "error": str(e)
224
+ }
225
+
226
+ async def toggle_auto_renew(self, cert_id: int, enabled: bool) -> Dict[str, Any]:
227
+ """
228
+ 切换证书自动续期状态
229
+
230
+ Args:
231
+ cert_id: 证书 ID
232
+ enabled: 是否启用
233
+
234
+ Returns:
235
+ 结果字典
236
+ """
237
+ logger.info(f"Toggling auto-renew for certificate {cert_id} to {enabled}")
238
+
239
+ try:
240
+ updated_cert = await self.domain.toggle_auto_renew(cert_id, enabled)
241
+
242
+ if not updated_cert:
243
+ return {
244
+ "status": "error",
245
+ "error": "Certificate not found"
246
+ }
247
+
248
+ return {
249
+ "status": "success",
250
+ "certificate": updated_cert
251
+ }
252
+ except Exception as e:
253
+ logger.error(f"Error toggling auto-renew: {e}", exc_info=True)
254
+ return {
255
+ "status": "error",
256
+ "error": str(e)
257
+ }
258
+
259
+ async def delete_certificate(self, cert_id: int) -> Dict[str, Any]:
260
+ """
261
+ 删除证书
262
+
263
+ Args:
264
+ cert_id: 证书 ID
265
+
266
+ Returns:
267
+ 结果字典
268
+ """
269
+ logger.info(f"Deleting certificate: {cert_id}")
270
+
271
+ try:
272
+ success = await self.domain.remove_certificate(cert_id)
273
+
274
+ if not success:
275
+ return {
276
+ "status": "error",
277
+ "error": "Certificate not found or deletion failed"
278
+ }
279
+
280
+ return {
281
+ "status": "success",
282
+ "message": "Certificate deleted successfully"
283
+ }
284
+ except Exception as e:
285
+ logger.error(f"Error deleting certificate: {e}", exc_info=True)
286
+ return {
287
+ "status": "error",
288
+ "error": str(e)
289
+ }
290
+
291
+ async def get_certificate(self, cert_id: int) -> Optional[CaddyCertificate]:
292
+ """
293
+ 获取证书详情
294
+
295
+ Args:
296
+ cert_id: 证书 ID
297
+
298
+ Returns:
299
+ 证书对象或 None
300
+ """
301
+ return await self.domain.get_certificate_details(cert_id)
302
+
303
+ async def get_certificate_by_domain(self, domain: str) -> Optional[CaddyCertificate]:
304
+ """
305
+ 根据域名获取证书
306
+
307
+ Args:
308
+ domain: 域名
309
+
310
+ Returns:
311
+ 证书对象或 None
312
+ """
313
+ return await self.domain.get_certificate_by_domain_name(domain)
314
+
315
+ async def list_all_certificates(self, filters: Optional[Dict[str, Any]] = None) -> List[CaddyCertificate]:
316
+ """
317
+ 列出所有证书
318
+
319
+ Args:
320
+ filters: 过滤条件
321
+
322
+ Returns:
323
+ 证书列表
324
+ """
325
+ return await self.domain.list_certificates(filters)
326
+
327
+ async def list_active_certificates(self) -> List[CaddyCertificate]:
328
+ """
329
+ 列出所有激活的证书
330
+
331
+ Returns:
332
+ 证书列表
333
+ """
334
+ return await self.domain.list_active_certificates()
335
+
336
+ async def list_expiring_certificates(self, days: int = 30) -> List[CaddyCertificate]:
337
+ """
338
+ 列出即将过期的证书
339
+
340
+ Args:
341
+ days: 多少天内过期
342
+
343
+ Returns:
344
+ 证书列表
345
+ """
346
+ return await self.domain.list_expiring_certificates(days)
347
+
348
+ async def get_certificate_statistics(self) -> Dict[str, int]:
349
+ """
350
+ 获取证书统计信息
351
+
352
+ Returns:
353
+ 统计信息字典
354
+ """
355
+ return await self.domain.get_certificate_statistics_summary()