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,427 @@
1
+ """
2
+ Docker Compose 管理应用层
3
+
4
+ 职责:
5
+ 1. 接收 API 请求
6
+ 2. 创建任务并入队(操作型 API)
7
+ 3. 直接查询并返回(查询型 API)
8
+ """
9
+ from typing import (
10
+ Dict,
11
+ Any,
12
+ Optional,
13
+ List,
14
+ Union,
15
+ )
16
+
17
+ from linglong_web.utils import logger
18
+ from cancan_microstack.public.error import (
19
+ HTTPException,
20
+ ParamError,
21
+ )
22
+ from cancan_microstack.public.const.controllersrv_consts import ControllersrvErrorCode
23
+ from cancan_microstack.public.const.operation_consts import OperationStatus
24
+ from cancan_microstack.public.schemas.controllersrv.responses import (
25
+ EnqueueSuccessResponse,
26
+ TaskNotFoundResponse,
27
+ TaskStatusResponse,
28
+ TaskListResponse,
29
+ QueueStatsResponse,
30
+ ServiceStatusResponse,
31
+ ServiceListResponse,
32
+ ContainerHealthResponse,
33
+ ComposeStatusResponse,
34
+ )
35
+ from cancan_microstack.public.schemas.controllersrv.docker_responses import (
36
+ ContainerInfo,
37
+ ContainerListResponse,
38
+ ContainerDetailResponse,
39
+ ContainerLogsResponse,
40
+ ImageInfo,
41
+ ImageListResponse,
42
+ NetworkInfo,
43
+ NetworkListResponse,
44
+ VolumeInfo,
45
+ VolumeListResponse,
46
+ EngineInfo,
47
+ EngineHealthResponse,
48
+ )
49
+ from cancan_microstack.public.const.operation_consts import (
50
+ OperationType,
51
+ )
52
+ from cancan_microstack.public.schemas.controllersrv.task_models import Task
53
+ from cancan_microstack.services.controllersrv.domain.task.task_queue import get_task_queue
54
+ from cancan_microstack.services.controllersrv.domain.docker_compose.docker_compose_domain import DockerComposeDomain
55
+
56
+
57
+ class DockerComposeApp:
58
+ """
59
+ 应用层:负责任务创建和查询功能
60
+ """
61
+
62
+ def __init__(self, domain: DockerComposeDomain):
63
+ """
64
+ 初始化应用层
65
+
66
+ Args:
67
+ domain: 领域层实例
68
+ """
69
+ self.domain = domain
70
+ self.task_queue = get_task_queue()
71
+ logger.info("DockerComposeApp initialized")
72
+
73
+ async def create_operation_task(
74
+ self,
75
+ serial_number: str,
76
+ operation: OperationType,
77
+ service_names: List[str],
78
+ params: Optional[Dict[str, Any]] = None,
79
+ ) -> EnqueueSuccessResponse:
80
+ """
81
+ 创建操作任务并入队
82
+
83
+ Args:
84
+ serial_number: 流水号
85
+ operation: 操作类型
86
+ service_names: 服务名称列表
87
+ params: 额外参数
88
+
89
+ Returns:
90
+ 入队结果对象
91
+ """
92
+ try:
93
+ # 创建任务
94
+ task = Task(
95
+ serial_number=serial_number,
96
+ operation=operation,
97
+ service_names=service_names,
98
+ params=params or {},
99
+ )
100
+
101
+ # 入队
102
+ enqueued = await self.task_queue.enqueue(task)
103
+
104
+ # 队列已满时 enqueue 返回 False,必须显式失败,不能再无条件返回成功
105
+ # enqueue returns False when the queue is full; fail explicitly instead of reporting success
106
+ if not enqueued:
107
+ logger.warning(f"Task queue is full, rejecting task: serial={serial_number}")
108
+ raise HTTPException(
109
+ error_code=ControllersrvErrorCode.TASK_QUEUE_FULL,
110
+ msg="Task queue is full"
111
+ )
112
+
113
+ logger.info(
114
+ f"Task enqueued: serial={serial_number}, "
115
+ f"operation={operation}, "
116
+ f"services={service_names}"
117
+ )
118
+
119
+ return EnqueueSuccessResponse(
120
+ serial_number=serial_number,
121
+ operation=operation,
122
+ service_names=service_names,
123
+ )
124
+
125
+ except ValueError as e:
126
+ # 流水号重复
127
+ logger.warning(f"Duplicate serial number: {serial_number}")
128
+ raise HTTPException(
129
+ error_code=ControllersrvErrorCode.DUPLICATE_SERIAL_NUMBER,
130
+ msg=str(e)
131
+ )
132
+
133
+ except HTTPException:
134
+ # 已是明确的 HTTP 错误(如队列已满),直接向上抛出,避免被下面的通用处理重新包装
135
+ # Already a precise HTTP error (e.g. queue full); re-raise so the generic handler below does not re-wrap it
136
+ raise
137
+
138
+ except Exception as e:
139
+ # 其他错误
140
+ logger.error(f"Failed to enqueue task: {e}", exc_info=True)
141
+ raise HTTPException(
142
+ error_code=ControllersrvErrorCode.OPERATION_FAILED,
143
+ msg=f"Failed to enqueue task: {str(e)}"
144
+ )
145
+
146
+ async def get_task_status(self, serial_number: str) -> Union[TaskStatusResponse, TaskNotFoundResponse]:
147
+ """
148
+ 查询任务状态
149
+
150
+ Args:
151
+ serial_number: 流水号
152
+
153
+ Returns:
154
+ 任务状态信息
155
+ """
156
+ task = await self.task_queue.get_task(serial_number)
157
+
158
+ if not task:
159
+ raise ParamError("serial_number")
160
+
161
+ return TaskStatusResponse(task=task.to_dict())
162
+
163
+ async def list_tasks(
164
+ self,
165
+ status: Optional[OperationStatus] = None,
166
+ limit: int = 100
167
+ ) -> TaskListResponse:
168
+ """
169
+ 列出任务
170
+
171
+ Args:
172
+ status: 过滤状态
173
+ limit: 最大返回数量
174
+
175
+ Returns:
176
+ 任务列表响应对象
177
+ """
178
+ tasks = await self.task_queue.list_tasks(status=status, limit=limit)
179
+ return TaskListResponse(tasks=tasks, count=len(tasks))
180
+
181
+ async def get_queue_stats(self) -> QueueStatsResponse:
182
+ """
183
+ 获取队列统计信息
184
+
185
+ Returns:
186
+ 队列统计信息响应对象
187
+ """
188
+ # 获取队列统计(返回 TaskQueueStats Pydantic 模型)
189
+ stats = await self.task_queue.get_queue_stats()
190
+
191
+ # 直接返回嵌套的 stats 对象
192
+ return QueueStatsResponse(
193
+ success=True,
194
+ stats=stats
195
+ )
196
+
197
+ async def get_service_status(self, service_names: Optional[List[str]] = None) -> ServiceStatusResponse:
198
+ """
199
+ 获取服务状态(查询型 API,使用 API Executor)
200
+
201
+ Args:
202
+ service_names: 服务名称列表,None 表示获取所有服务状态
203
+
204
+ Returns:
205
+ 服务状态响应对象
206
+ """
207
+ logger.info(f"Getting service status: {service_names or 'all'}")
208
+ # 调用领域层获取服务状态
209
+ result = await self.domain.get_service_status(service_names)
210
+
211
+ # domain层返回的是ServiceListResult对象
212
+ return ServiceStatusResponse(
213
+ success=result.success,
214
+ services=result.services,
215
+ error=getattr(result, 'error', None),
216
+ )
217
+
218
+ async def list_services(self) -> ServiceListResponse:
219
+ """
220
+ 列出所有服务(查询型 API,使用 API Executor)
221
+
222
+ Returns:
223
+ 服务列表响应对象
224
+ """
225
+ logger.info("Listing all services")
226
+ # 调用领域层列出服务
227
+ result = await self.domain.list_services()
228
+
229
+ # domain层返回的是ServiceListResult对象
230
+ return ServiceListResponse(
231
+ success=result.success,
232
+ services=result.services,
233
+ error=getattr(result, 'error', None)
234
+ )
235
+
236
+ async def get_container_health(self, service_name: str) -> ContainerHealthResponse:
237
+ """
238
+ 获取容器健康状态(查询型 API,使用 API Executor)
239
+
240
+ Args:
241
+ service_name: 服务名称
242
+
243
+ Returns:
244
+ 容器健康状态响应对象
245
+ """
246
+ logger.info(f"Getting container health for service: {service_name}")
247
+ # 调用领域层获取容器健康状态
248
+ result = await self.domain.get_container_health(service_name)
249
+
250
+ # domain层返回的是ContainerHealthResult对象
251
+ # 将 ContainerHealthDetail 列表转换为字典列表
252
+ containers_dict = [c.model_dump() for c in result.containers] if result.containers else []
253
+ return ContainerHealthResponse(
254
+ success=result.success,
255
+ service_name=service_name,
256
+ containers=containers_dict,
257
+ error=getattr(result, 'error', None)
258
+ )
259
+
260
+ async def get_compose_status(self) -> ComposeStatusResponse:
261
+ """
262
+ 获取 Docker Compose 整体状态(查询型 API,使用 API Executor)
263
+
264
+ Returns:
265
+ Docker Compose 状态响应对象
266
+ """
267
+ logger.info("Getting Docker Compose status")
268
+ # 调用领域层获取 Compose 状态
269
+ result = await self.domain.get_compose_status()
270
+
271
+ # domain层返回的是ComposeStatusResult对象
272
+ return ComposeStatusResponse(
273
+ success=result.success,
274
+ is_running=result.is_running,
275
+ service_count=result.service_count,
276
+ services=result.services,
277
+ error=getattr(result, 'error', None)
278
+ )
279
+
280
+ # ==================== 新增:基于 UnifiedExecutor API 的容器管理方法 ====================
281
+
282
+ async def list_containers(self, include_stopped: bool = False) -> ContainerListResponse:
283
+ """
284
+ 列出容器(使用 API)
285
+
286
+ Args:
287
+ include_stopped: 是否包括已停止的容器
288
+
289
+ Returns:
290
+ 容器列表响应对象
291
+ """
292
+ containers = await self.domain.executor.list_containers(all=include_stopped)
293
+ return ContainerListResponse(
294
+ success=True,
295
+ containers=[
296
+ ContainerInfo(
297
+ id=c.id,
298
+ name=c.name,
299
+ status=c.status,
300
+ image=c.image,
301
+ created=c.created.isoformat() if c.created else None,
302
+ ports=c.ports,
303
+ labels=c.labels,
304
+ )
305
+ for c in containers
306
+ ]
307
+ )
308
+
309
+ async def inspect_container(self, container_id: str) -> ContainerDetailResponse:
310
+ """
311
+ 检查容器详细信息(使用 API)
312
+
313
+ Args:
314
+ container_id: 容器 ID 或名称
315
+
316
+ Returns:
317
+ 容器详细信息响应对象
318
+ """
319
+ detail = await self.domain.executor.inspect_container(container_id)
320
+ return ContainerDetailResponse(success=True, container=detail)
321
+
322
+ async def get_container_logs(
323
+ self,
324
+ container_id: str,
325
+ tail: int = 100,
326
+ since: Optional[str] = None
327
+ ) -> ContainerLogsResponse:
328
+ """
329
+ 获取容器日志(使用 API)
330
+
331
+ Args:
332
+ container_id: 容器 ID 或名称
333
+ tail: 返回最后 N 行
334
+ since: 时间戳,返回此时间之后的日志
335
+
336
+ Returns:
337
+ 容器日志响应对象
338
+ """
339
+ logs = await self.domain.executor.get_container_logs(
340
+ container_id,
341
+ tail=tail,
342
+ since=since,
343
+ )
344
+ return ContainerLogsResponse(success=True, logs=logs)
345
+
346
+ async def list_images(self) -> ImageListResponse:
347
+ """
348
+ 列出镜像(使用 API)
349
+
350
+ Returns:
351
+ 镜像列表响应对象
352
+ """
353
+ images = await self.domain.executor.list_images()
354
+ return ImageListResponse(
355
+ success=True,
356
+ images=[
357
+ ImageInfo(
358
+ id=img.id,
359
+ tags=img.tags,
360
+ size=img.size,
361
+ created=img.created.isoformat() if img.created else None,
362
+ )
363
+ for img in images
364
+ ]
365
+ )
366
+
367
+ async def list_networks(self) -> NetworkListResponse:
368
+ """
369
+ 列出网络(使用 API)
370
+
371
+ Returns:
372
+ 网络列表响应对象
373
+ """
374
+ networks = await self.domain.executor.list_networks()
375
+ return NetworkListResponse(
376
+ success=True,
377
+ networks=[
378
+ NetworkInfo(
379
+ id=net.id,
380
+ name=net.name,
381
+ driver=net.driver,
382
+ scope=net.scope,
383
+ containers=net.containers,
384
+ )
385
+ for net in networks
386
+ ]
387
+ )
388
+
389
+ async def list_volumes(self) -> VolumeListResponse:
390
+ """
391
+ 列出卷(使用 API)
392
+
393
+ Returns:
394
+ 卷列表响应对象
395
+ """
396
+ volumes = await self.domain.executor.list_volumes()
397
+ return VolumeListResponse(
398
+ success=True,
399
+ volumes=[
400
+ VolumeInfo(
401
+ name=vol.name,
402
+ driver=vol.driver,
403
+ mountpoint=vol.mountpoint,
404
+ )
405
+ for vol in volumes
406
+ ]
407
+ )
408
+
409
+ async def get_engine_health(self) -> EngineHealthResponse:
410
+ """
411
+ 检查引擎健康状态(使用 API)
412
+
413
+ Returns:
414
+ 引擎健康状态响应对象
415
+ """
416
+ is_healthy = await self.domain.executor.check_engine_health()
417
+ engine_info = await self.domain.executor.get_engine_info()
418
+ return EngineHealthResponse(
419
+ success=True,
420
+ healthy=is_healthy,
421
+ engine_info=EngineInfo(
422
+ version=engine_info.version,
423
+ api_version=engine_info.api_version,
424
+ os_type=engine_info.os_type,
425
+ architecture=engine_info.architecture,
426
+ )
427
+ )
@@ -0,0 +1,76 @@
1
+ import logging
2
+ import os
3
+
4
+ from linglong_web import LinglongConfigBase
5
+
6
+ from cancan_microstack.runtime.workspace import configure_workspace, ensure_server_log_dir
7
+
8
+ _WORKSPACE_ROOT = str(configure_workspace())
9
+ ensure_server_log_dir()
10
+
11
+
12
+ def _resolve_compose_file() -> str:
13
+ """根据实际存在的文件动态选择 Compose 配置
14
+ Select the compose file dynamically based on what exists on disk."""
15
+
16
+ env_override = os.getenv("CANCAN_COMPOSE_FILE")
17
+ if env_override:
18
+ return env_override
19
+
20
+ candidates = [
21
+ os.path.join(_WORKSPACE_ROOT, "compose.cancan.yml"),
22
+ os.path.join(_WORKSPACE_ROOT, "docker-compose.yml"),
23
+ os.path.join(_WORKSPACE_ROOT, "docker-compose.services.yml"),
24
+ ]
25
+
26
+ for candidate in candidates:
27
+ if os.path.exists(candidate):
28
+ return candidate
29
+
30
+ # 默认返回第一个候选,哪怕文件暂时缺失
31
+ # Default to the first candidate even if it does not exist yet
32
+ return candidates[0]
33
+
34
+
35
+ class _BaseConfig(LinglongConfigBase):
36
+ """controllersrv 基础配置"""
37
+
38
+ # 特殊标识:这是一个控制器服务,不需要服务注册等逻辑
39
+ IS_CONTROLLER_SERVICE = True
40
+
41
+ # 禁用数据库初始化:controllersrv 不访问 PostgreSQL
42
+ # Disable PostgreSQL initialization because controllersrv never talks to PGSQL
43
+ PGSQL_HOST = ""
44
+ PGSQL_USER = ""
45
+ PGSQL_PASSWORD = ""
46
+ PGSQL_DB = ""
47
+ PGSQL_DATABASES = None
48
+
49
+ # Docker Compose 配置
50
+ DOCKER_COMPOSE_FILE = _resolve_compose_file()
51
+ # 默认使用工作区目录名作为 project_name;可通过环境变量覆盖
52
+ # Default to workspace folder name as project_name; override via env when needed
53
+ DOCKER_COMPOSE_PROJECT_NAME = os.getenv("CANCAN_COMPOSE_PROJECT_NAME") or (os.path.basename(_WORKSPACE_ROOT) or "cancan")
54
+
55
+ # controllersrv 监听端口
56
+ CONTROLLER_PORT = 22100
57
+
58
+ # 日志配置 - 启用文件写入(10个文件,每个10MB)
59
+ LOGGING_ENABLE_FILE_HANDLER = True
60
+ LOGGING_FILE_ADDR_FORMAT = os.path.join(_WORKSPACE_ROOT, "server_log_data", "controllersrv-{}.log")
61
+ LOGGING_FILE_MAX_BYTES = 10 * 1024 * 1024 # 10MB
62
+ LOGGING_FILE_BACKUP_COUNT = 10 # 保留10个备份文件
63
+ LOGGING_LEVEL = logging.INFO
64
+ DEBUG = False
65
+
66
+
67
+ class _ProductionConfig(_BaseConfig):
68
+ """生产环境配置"""
69
+ DEBUG = False
70
+ LOGGING_LEVEL = logging.INFO
71
+
72
+
73
+ # 必须导出 service_conf_dict
74
+ service_conf_dict = {
75
+ 'prod': _ProductionConfig,
76
+ }
@@ -0,0 +1,54 @@
1
+ """
2
+ controllersrv 服务配置管理
3
+
4
+ 存放程序运行时设置(不通过配置中心管理,只能修改代码)
5
+ """
6
+ from cancan_microstack.public.const.controllersrv_consts import TimeoutKey
7
+
8
+
9
+ class ServiceSettings:
10
+ """服务设置类"""
11
+
12
+ # 超时配置(秒)
13
+ TIMEOUT_CONFIG = {
14
+ TimeoutKey.START: 300, # 启动超时:5分钟
15
+ TimeoutKey.STOP: 60, # 停止超时:1分钟
16
+ TimeoutKey.RESTART: 120, # 重启超时:2分钟
17
+ TimeoutKey.PS: 30, # 查询超时:30秒
18
+ TimeoutKey.CONFIG: 10, # 配置读取超时:10秒
19
+ }
20
+
21
+ # 重试配置
22
+ MAX_RETRIES = 3 # 最大重试次数
23
+ RETRY_DELAY = 2 # 重试延迟(秒)
24
+
25
+ # 任务配置
26
+ TASK_MAX_EXECUTION_TIME = 1200 # 单个任务最大执行时间:20分钟
27
+ TASK_QUEUE_MAX_SIZE = 100 # 任务队列最大容量
28
+ TASK_CLEANUP_INTERVAL = 300 # 任务清理间隔:5分钟
29
+
30
+ # Worker 配置
31
+ WORKER_POLL_INTERVAL = 0.5 # Worker 轮询间隔(秒)
32
+ WORKER_SHUTDOWN_TIMEOUT = 30 # Worker 关闭超时(秒)
33
+
34
+ # 流水号配置
35
+ SERIAL_NUMBER_MAX_AGE = 86400 # 流水号最大保留时间:24小时
36
+ SERIAL_NUMBER_CLEANUP_INTERVAL = 3600 # 流水号清理间隔:1小时
37
+
38
+ @classmethod
39
+ def get_timeout(cls, operation_key: TimeoutKey) -> int:
40
+ """
41
+ 获取指定操作的超时时间
42
+
43
+ Args:
44
+ operation_key: 操作类型键(TimeoutKey 枚举)
45
+
46
+ Returns:
47
+ 超时时间(秒)
48
+ """
49
+ return cls.TIMEOUT_CONFIG.get(operation_key, 30)
50
+
51
+ @classmethod
52
+ def get_all_timeouts(cls) -> dict:
53
+ """获取所有超时配置"""
54
+ return cls.TIMEOUT_CONFIG.copy()