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,343 @@
1
+ # Caddy with Coraza WAF - 使用指南
2
+
3
+ 本项目使用**自定义构建的 Caddy**,集成了 **Coraza WAF(Web Application Firewall)** 模块,提供企业级的安全防护。
4
+
5
+ ---
6
+
7
+ ## 🛡️ 安全特性
8
+
9
+ ### 已启用的防护功能
10
+
11
+ 1. **SQL 注入防护** - 检测和阻止 SQL 注入攻击
12
+ 2. **XSS 防护** - 阻止跨站脚本攻击
13
+ 3. **路径遍历防护** - 防止访问敏感文件(.env, .git, backup 等)
14
+ 4. **协议违规检测** - 验证 HTTP 协议合规性
15
+ 5. **文件扩展名过滤** - 阻止访问危险文件类型
16
+ 6. **请求大小限制** - 防止 DoS 攻击(最大 10MB)
17
+ 7. **Content-Type 验证** - API 请求必须使用 `application/json`
18
+
19
+ ### WAF 配置
20
+
21
+ - **偏执级别**: 2(增强保护)
22
+ - **入站异常阈值**: 5
23
+ - **出站异常阈值**: 4
24
+ - **审计日志**: 仅记录相关事件(4xx/5xx 错误)
25
+
26
+ ---
27
+
28
+ ## 📁 目录结构
29
+
30
+ ```
31
+ caddy/
32
+ ├── Dockerfile # 自定义 Caddy 构建文件(包含 Coraza)
33
+ ├── Caddyfile # Caddy 主配置文件
34
+ ├── waf/
35
+ │ └── coraza.conf # Coraza WAF 配置
36
+ ├── logs/
37
+ │ ├── access.log # 访问日志
38
+ │ ├── access.json # JSON 格式访问日志
39
+ │ ├── waf-audit.log # WAF 审计日志
40
+ │ └── waf-debug.log # WAF 调试日志
41
+ ├── data/ # Caddy 数据目录(证书等)
42
+ ├── config/ # Caddy 配置目录
43
+ └── geoip/ # GeoIP 数据库目录
44
+ └── GeoLite2-City.mmdb
45
+ ```
46
+
47
+ ---
48
+
49
+ ## 🚀 构建和启动
50
+
51
+ ### 1. 构建 Caddy 镜像
52
+
53
+ Docker Compose 会自动构建包含 Coraza WAF 的 Caddy 镜像:
54
+
55
+ ```bash
56
+ # 构建镜像
57
+ docker-compose build caddy.service
58
+
59
+ # 或直接启动(会自动构建)
60
+ docker-compose up -d caddy.service
61
+ ```
62
+
63
+ ### 2. 验证 WAF 是否启用
64
+
65
+ ```bash
66
+ # 查看 Caddy 日志
67
+ docker-compose logs caddy.service
68
+
69
+ # 应该看到类似的输出:
70
+ # {"level":"info","ts":...,"msg":"using provided configuration","adapter":"caddyfile"}
71
+ ```
72
+
73
+ ### 3. 测试 WAF 防护
74
+
75
+ #### 测试 SQL 注入防护
76
+
77
+ ```bash
78
+ # 应该被阻止(返回 403)
79
+ curl "http://localhost/v1/besrv/api?id=1' OR '1'='1"
80
+
81
+ # 正常请求应该成功
82
+ curl "http://localhost/v1/besrv/api?id=123"
83
+ ```
84
+
85
+ #### 测试 XSS 防护
86
+
87
+ ```bash
88
+ # 应该被阻止(返回 403)
89
+ curl "http://localhost/v1/besrv/api?name=<script>alert(1)</script>"
90
+
91
+ # 正常请求应该成功
92
+ curl "http://localhost/v1/besrv/api?name=John"
93
+ ```
94
+
95
+ #### 测试路径遍历防护
96
+
97
+ ```bash
98
+ # 应该被阻止(返回 403)
99
+ curl "http://localhost/.env"
100
+ curl "http://localhost/.git/config"
101
+ curl "http://localhost/backup/database.sql"
102
+
103
+ # 正常请求应该成功
104
+ curl "http://localhost/health"
105
+ ```
106
+
107
+ #### 测试 API Content-Type 验证
108
+
109
+ ```bash
110
+ # POST 请求没有 Content-Type: application/json 会被拒绝
111
+ curl -X POST "http://localhost/v1/besrv/api" \
112
+ -d "data=test" # 应该返回 400
113
+
114
+ # 正确的请求
115
+ curl -X POST "http://localhost/v1/besrv/api" \
116
+ -H "Content-Type: application/json" \
117
+ -d '{"key":"value"}' # 应该成功
118
+ ```
119
+
120
+ ---
121
+
122
+ ## 📊 WAF 日志
123
+
124
+ ### 审计日志
125
+
126
+ WAF 会记录所有被阻止的请求到审计日志:
127
+
128
+ ```bash
129
+ # 查看 WAF 审计日志
130
+ docker exec cancan_caddy tail -f /var/log/caddy/waf-audit.log
131
+ ```
132
+
133
+ 日志格式示例:
134
+ ```
135
+ [2025-01-01T10:30:00Z] [client 1.2.3.4] [id "900510"] [msg "SQL Injection Attempt Detected"] [uri "/v1/besrv/api?id=1' OR '1'='1"]
136
+ ```
137
+
138
+ ### 调试日志
139
+
140
+ 开发环境可以查看详细的 WAF 调试日志:
141
+
142
+ ```bash
143
+ # 查看 WAF 调试日志
144
+ docker exec cancan_caddy tail -f /var/log/caddy/waf-debug.log
145
+ ```
146
+
147
+ ---
148
+
149
+ ## ⚙️ WAF 配置调整
150
+
151
+ ### 修改偏执级别
152
+
153
+ 编辑 `caddy/waf/coraza.conf`:
154
+
155
+ ```conf
156
+ # 调整偏执级别(1-4)
157
+ SecAction \
158
+ "id:900000,\
159
+ phase:1,\
160
+ nolog,\
161
+ pass,\
162
+ t:none,\
163
+ setvar:tx.paranoia_level=3" # 改为 1(宽松)或 4(严格)
164
+ ```
165
+
166
+ ### 添加 IP 白名单
167
+
168
+ 在 `caddy/waf/coraza.conf` 中添加:
169
+
170
+ ```conf
171
+ # 允许特定 IP 绕过 WAF
172
+ SecRule REMOTE_ADDR "@ipMatch 192.168.1.0/24" \
173
+ "id:900401,\
174
+ phase:1,\
175
+ pass,\
176
+ nolog,\
177
+ ctl:ruleEngine=Off"
178
+ ```
179
+
180
+ ### 添加 IP 黑名单
181
+
182
+ ```conf
183
+ # 阻断特定 IP
184
+ SecRule REMOTE_ADDR "@ipMatch 1.2.3.4" \
185
+ "id:900402,\
186
+ phase:1,\
187
+ deny,\
188
+ status:403,\
189
+ log,\
190
+ msg:'Blocked IP address'"
191
+ ```
192
+
193
+ ### 添加自定义规则
194
+
195
+ ```conf
196
+ # 阻止特定 User-Agent
197
+ SecRule REQUEST_HEADERS:User-Agent "@contains BadBot" \
198
+ "id:900700,\
199
+ phase:1,\
200
+ deny,\
201
+ status:403,\
202
+ log,\
203
+ msg:'Blocked bot user-agent'"
204
+ ```
205
+
206
+ ### 修改后重启 Caddy
207
+
208
+ ```bash
209
+ docker-compose restart caddy.service
210
+ ```
211
+
212
+ ---
213
+
214
+ ## 🔧 故障排查
215
+
216
+ ### WAF 误报(False Positive)
217
+
218
+ 如果正常请求被 WAF 阻止:
219
+
220
+ 1. **查看审计日志**,找到触发的规则 ID
221
+ ```bash
222
+ docker exec cancan_caddy tail -100 /var/log/caddy/waf-audit.log
223
+ ```
224
+
225
+ 2. **禁用特定规则**(在 `coraza.conf` 中添加)
226
+ ```conf
227
+ # 禁用规则 ID 900510
228
+ SecRuleRemoveById 900510
229
+ ```
230
+
231
+ 3. **调整偏执级别**(降低到 1)
232
+
233
+ ### Caddy 启动失败
234
+
235
+ ```bash
236
+ # 查看详细错误
237
+ docker-compose logs caddy.service
238
+
239
+ # 常见问题:
240
+ # 1. Caddyfile 语法错误
241
+ # 2. WAF 配置文件路径不正确
242
+ # 3. 端口被占用
243
+ ```
244
+
245
+ ### 验证 Coraza 模块是否加载
246
+
247
+ ```bash
248
+ # 进入容器
249
+ docker exec -it cancan_caddy sh
250
+
251
+ # 检查 Caddy 版本和模块
252
+ /usr/bin/caddy version
253
+ /usr/bin/caddy list-modules | grep coraza
254
+ ```
255
+
256
+ ---
257
+
258
+ ## 📈 性能优化
259
+
260
+ ### 1. 关闭响应体检查
261
+
262
+ 响应体检查会影响性能,生产环境建议关闭:
263
+
264
+ ```conf
265
+ # 在 coraza.conf 中已默认关闭
266
+ SecResponseBodyAccess Off
267
+ ```
268
+
269
+ ### 2. 调整日志级别
270
+
271
+ 生产环境降低调试日志级别:
272
+
273
+ ```conf
274
+ SecDebugLogLevel 3 # 3=警告, 5=详细(开发环境)
275
+ ```
276
+
277
+ ### 3. 限制审计日志
278
+
279
+ 只记录阻断事件:
280
+
281
+ ```conf
282
+ SecAuditEngine RelevantOnly
283
+ SecAuditLogRelevantStatus "^(?:5|4(?!04))"
284
+ ```
285
+
286
+ ---
287
+
288
+ ## 🌐 OWASP CRS(可选)
289
+
290
+ 如果需要使用完整的 **OWASP Core Rule Set**:
291
+
292
+ ### 1. 下载 CRS
293
+
294
+ ```bash
295
+ cd caddy/waf
296
+ wget https://github.com/coreruleset/coreruleset/archive/v4.0.0.tar.gz
297
+ tar -xzf v4.0.0.tar.gz
298
+ mv coreruleset-4.0.0 owasp-crs
299
+ ```
300
+
301
+ ### 2. 更新 coraza.conf
302
+
303
+ ```conf
304
+ # 包含 OWASP CRS
305
+ Include /etc/caddy/waf/owasp-crs/crs-setup.conf.example
306
+ Include /etc/caddy/waf/owasp-crs/rules/*.conf
307
+ ```
308
+
309
+ ### 3. 重新构建镜像
310
+
311
+ ```bash
312
+ docker-compose build caddy.service
313
+ docker-compose up -d caddy.service
314
+ ```
315
+
316
+ ---
317
+
318
+ ## 📚 参考资料
319
+
320
+ - [Caddy 官方文档](https://caddyserver.com/docs/)
321
+ - [Coraza WAF 文档](https://coraza.io/docs/)
322
+ - [OWASP Core Rule Set](https://owasp.org/www-project-modsecurity-core-rule-set/)
323
+ - [Caddy Coraza 模块](https://github.com/corazawaf/coraza-caddy)
324
+
325
+ ---
326
+
327
+ ## ⚠️ 安全建议
328
+
329
+ 1. **定期更新** Caddy 和 Coraza 模块
330
+ 2. **定期审查** WAF 审计日志
331
+ 3. **调整规则** 根据实际业务需求调整 WAF 规则
332
+ 4. **监控误报** 及时处理误报,避免影响正常业务
333
+ 5. **备份配置** 修改配置前先备份
334
+ 6. **测试环境** 在测试环境验证配置后再应用到生产环境
335
+
336
+ ---
337
+
338
+ ## 📞 支持
339
+
340
+ 如有问题,请查看:
341
+ - WAF 审计日志: `/var/log/caddy/waf-audit.log`
342
+ - WAF 调试日志: `/var/log/caddy/waf-debug.log`
343
+ - Caddy 日志: `docker-compose logs caddy.service`
@@ -0,0 +1,5 @@
1
+ # GeoIP database placeholder
2
+
3
+ This folder must contain a GeoLite2 `.mmdb` file so both Caddy and the ops BFF IP locator can enrich requests during
4
+ local development. Cancan cannot redistribute those databases—create a free MaxMind account, download GeoLite2-City,
5
+ and place `GeoLite2-City.mmdb` here before starting the stack.
@@ -0,0 +1,78 @@
1
+ #!/bin/bash
2
+ # Caddy 快速启动脚本
3
+
4
+ set -e
5
+
6
+ echo "=========================================="
7
+ echo " Caddy with Coraza WAF - 快速启动"
8
+ echo "=========================================="
9
+ echo ""
10
+
11
+ # 检查必要的目录
12
+ echo "[1/5] 检查目录结构..."
13
+ mkdir -p caddy/logs
14
+ mkdir -p caddy/data
15
+ mkdir -p caddy/config
16
+ mkdir -p caddy/geoip
17
+ mkdir -p caddy/waf
18
+ echo "✓ 目录结构检查完成"
19
+ echo ""
20
+
21
+ # 下载 GeoIP 数据库(可选)
22
+ echo "[2/5] 检查 GeoIP 数据库..."
23
+ if [ ! -f "caddy/geoip/GeoLite2-City.mmdb" ]; then
24
+ echo "⚠️ GeoLite2-City.mmdb 不存在"
25
+ echo " 请手动下载并放置到 caddy/geoip/ 目录"
26
+ echo " 下载地址: https://dev.maxmind.com/geoip/geolite2-free-geolocation-data"
27
+ else
28
+ echo "✓ GeoIP 数据库已存在"
29
+ fi
30
+ echo ""
31
+
32
+ # 构建 Caddy 镜像
33
+ echo "[3/5] 构建 Caddy 镜像(包含 Coraza WAF)..."
34
+ docker-compose build caddy.service
35
+ echo "✓ Caddy 镜像构建完成"
36
+ echo ""
37
+
38
+ # 启动服务
39
+ echo "[4/5] 启动 Caddy 服务..."
40
+ docker-compose up -d caddy.service
41
+ echo "✓ Caddy 服务启动成功"
42
+ echo ""
43
+
44
+ # 等待服务就绪
45
+ echo "[5/5] 等待 Caddy 就绪..."
46
+ sleep 5
47
+
48
+ # 检查服务状态
49
+ if docker-compose ps | grep -q "caddy.service.*Up"; then
50
+ echo "✓ Caddy 运行正常"
51
+ else
52
+ echo "✗ Caddy 启动失败,请查看日志:"
53
+ echo " docker-compose logs caddy.service"
54
+ exit 1
55
+ fi
56
+ echo ""
57
+
58
+ echo "=========================================="
59
+ echo " Caddy 启动完成!"
60
+ echo "=========================================="
61
+ echo ""
62
+ echo "服务访问地址:"
63
+ echo " - HTTP: http://localhost"
64
+ echo " - HTTPS: https://localhost"
65
+ echo " - Admin API: http://localhost:2019"
66
+ echo ""
67
+ echo "查看日志:"
68
+ echo " - Caddy 日志: docker-compose logs -f caddy.service"
69
+ echo " - WAF 审计日志: docker exec my_app_caddy tail -f /var/log/caddy/waf-audit.log"
70
+ echo " - WAF 调试日志: docker exec my_app_caddy tail -f /var/log/caddy/waf-debug.log"
71
+ echo ""
72
+ echo "测试 WAF 防护:"
73
+ echo " - SQL 注入测试: curl \"http://localhost/v1/besrv/api?id=1' OR '1'='1\""
74
+ echo " - XSS 测试: curl \"http://localhost/v1/besrv/api?name=<script>alert(1)</script>\""
75
+ echo " - 路径遍历测试: curl \"http://localhost/.env\""
76
+ echo ""
77
+ echo "更多信息请查看: caddy/README.md"
78
+ echo ""
@@ -0,0 +1,179 @@
1
+ # Coraza WAF 优化配置
2
+ # 基于 OWASP Core Rule Set (CRS)
3
+
4
+ # ==========================================
5
+ # 核心引擎配置
6
+ # ==========================================
7
+ SecRuleEngine On
8
+
9
+ # 请求体访问控制(统一为 20MB)
10
+ SecRequestBodyAccess On
11
+ SecRequestBodyLimit 20971520
12
+ SecRequestBodyNoFilesLimit 131072
13
+ SecRequestBodyLimitAction Reject
14
+
15
+ # 响应体访问控制(关闭以提高性能)
16
+ SecResponseBodyAccess Off
17
+ SecResponseBodyMimeType text/plain text/html text/xml
18
+
19
+ # 临时目录
20
+ SecTmpDir /tmp/
21
+ SecDataDir /tmp/
22
+
23
+ # 调试日志级别(生产环境设置为 3)
24
+ SecDebugLog /var/log/caddy/waf-debug.log
25
+ SecDebugLogLevel 3
26
+
27
+ # 审计日志
28
+ SecAuditEngine RelevantOnly
29
+ SecAuditLogRelevantStatus "^(5|4[^0])"
30
+ SecAuditLogParts ABIJDEFHZ
31
+ SecAuditLogType Serial
32
+ SecAuditLog /var/log/caddy/waf-audit.log
33
+
34
+ # ==========================================
35
+ # OWASP CRS 配置
36
+ # ==========================================
37
+
38
+ # 设置偏执级别为 1(高准确性,低误报)
39
+ SecAction \
40
+ "id:900000,\
41
+ phase:1,\
42
+ nolog,\
43
+ pass,\
44
+ t:none,\
45
+ setvar:tx.paranoia_level=1"
46
+
47
+ # 异常评分阈值
48
+ # 入站阈值(请求)
49
+ SecAction \
50
+ "id:900110,\
51
+ phase:1,\
52
+ nolog,\
53
+ pass,\
54
+ t:none,\
55
+ setvar:tx.inbound_anomaly_score_threshold=5"
56
+
57
+ # 出站阈值(响应)
58
+ SecAction \
59
+ "id:900111,\
60
+ phase:1,\
61
+ nolog,\
62
+ pass,\
63
+ t:none,\
64
+ setvar:tx.outbound_anomaly_score_threshold=4"
65
+
66
+ # ==========================================
67
+ # 执行动作配置
68
+ # ==========================================
69
+
70
+ # 默认拒绝动作
71
+ # "pass" = 仅检测(日志)模式。
72
+ # "deny" = 拦截模式。
73
+ # 警告:请先使用 "pass" 模式充分测试,确认无误报后再切换到 "deny"。
74
+ SecDefaultAction "phase:1,log,auditlog,deny,status:403"
75
+ SecDefaultAction "phase:2,log,auditlog,deny,status:403"
76
+
77
+ # ==========================================
78
+ # 允许的 HTTP 方法
79
+ # ==========================================
80
+ SecAction \
81
+ "id:900200,\
82
+ phase:1,\
83
+ nolog,\
84
+ pass,\
85
+ t:none,\
86
+ setvar:'tx.allowed_methods=GET HEAD POST OPTIONS PUT PATCH DELETE'"
87
+
88
+ # ==========================================
89
+ # 允许的请求 Content-Type
90
+ # ==========================================
91
+ SecAction \
92
+ "id:900220,\
93
+ phase:1,\
94
+ nolog,\
95
+ pass,\
96
+ t:none,\
97
+ setvar:'tx.allowed_request_content_type=|application/x-www-form-urlencoded| |multipart/form-data| |multipart/related| |text/xml| |application/xml| |application/soap+xml| |application/json| |application/cloudevents+json| |application/cloudevents-batch+json|'"
98
+
99
+ # ==========================================
100
+ # 允许的响应 Content-Type
101
+ # ==========================================
102
+ SecAction \
103
+ "id:900230,\
104
+ phase:1,\
105
+ nolog,\
106
+ pass,\
107
+ t:none,\
108
+ setvar:'tx.allowed_response_content_type=|text/plain| |text/html| |text/xml| |text/javascript| |application/xml| |application/xhtml+xml| |application/json| |application/javascript| |application/x-javascript|'"
109
+
110
+ # ==========================================
111
+ # 文件扩展名限制
112
+ # ==========================================
113
+ SecAction \
114
+ "id:900240,\
115
+ phase:1,\
116
+ nolog,\
117
+ pass,\
118
+ t:none,\
119
+ setvar:'tx.restricted_extensions=.asa/ .asax/ .ascx/ .axd/ .backup/ .bak/ .bat/ .cdx/ .cer/ .cfg/ .cmd/ .com/ .config/ .conf/ .cs/ .csproj/ .csr/ .dat/ .db/ .dbf/ .dll/ .dos/ .htr/ .htw/ .ida/ .idc/ .idq/ .inc/ .ini/ .key/ .licx/ .lnk/ .log/ .mdb/ .old/ .pass/ .pdb/ .pol/ .printer/ .pwd/ .rdb/ .resources/ .resx/ .sql/ .swp/ .sys/ .vb/ .vbs/ .vbproj/ .vsdisco/ .webinfo/ .xsd/ .xsx/'"
120
+
121
+ # ==========================================
122
+ # 协议配置
123
+ # ==========================================
124
+ SecAction \
125
+ "id:900250,\
126
+ phase:1,\
127
+ nolog,\
128
+ pass,\
129
+ t:none,\
130
+ setvar:'tx.allowed_http_versions=HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/2.0 HTTP/3'"
131
+
132
+ # ==========================================
133
+ # 地理位置阻断(已按要求禁用)
134
+ # ==========================================
135
+ # SecGeoLookupDB /usr/share/GeoIP/GeoLite2-Country.mmdb
136
+ # ...
137
+
138
+ # ==========================================
139
+ # IP 黑名单(已按要求禁用)
140
+ # ==========================================
141
+ # SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" \
142
+ # ...
143
+
144
+ # ==========================================
145
+ # 自定义规则 (已移除)
146
+ # ==========================================
147
+
148
+ # 注:以下规则 (900500, 900510, 900520) 已被 OWASP CRS PL1 覆盖。
149
+ # 无需重复定义,已移除以提升性能和可维护性。
150
+ # SecRule REQUEST_URI "@rx /\.env|/\.git|..."
151
+ # SecRule ARGS|ARGS_NAMES... "@rx (?i:(\bunion\b.*\bselect\b...))"
152
+ # SecRule ARGS|ARGS_NAMES... "@rx (?i:<script|javascript:|...)"
153
+
154
+ # ==========================================
155
+ # API 特定规则
156
+ # ==========================================
157
+
158
+ # 限制请求大小(防止 DoS)
159
+ SecRule REQUEST_HEADERS:Content-Length "@gt 20971520" \
160
+ "id:900600,\
161
+ phase:1,\
162
+ deny,\
163
+ status:413,\
164
+ log,\
165
+ msg:'Request body too large (max 10MB)'"
166
+
167
+ # 要求 API v1-v9999 的 POST/PUT/PATCH 请求使用 JSON Content-Type
168
+ SecRule REQUEST_URI "@rx ^/v([1-9][0-9]{0,3})/" \
169
+ "id:900610,\
170
+ phase:1,\
171
+ pass,\
172
+ log,\
173
+ chain"
174
+ SecRule REQUEST_METHOD "@rx ^(POST|PUT|PATCH)$" \
175
+ "chain"
176
+ SecRule REQUEST_HEADERS:Content-Type "!@rx application/json" \
177
+ "deny,\
178
+ status:400,\
179
+ msg:'API (v1-v9999) requests must use application/json'"
@@ -0,0 +1,59 @@
1
+ # syntax=docker/dockerfile:1.7-labs
2
+ # Shared Python runtime image for infrasrv / opsbffsrv / controllersrv.
3
+ #
4
+ # The image installs the published `cancan-microstack` package (and its bundled
5
+ # service dependencies) from PyPI — it does NOT copy any source from the build
6
+ # context. A clean `pip install cancan-microstack` workspace can therefore build
7
+ # and run the stack without an `src/` tree.
8
+ #
9
+ # Build args (injected automatically by the `cancan` CLI):
10
+ # CANCAN_VERSION exact released version to install (keeps container == host CLI)
11
+ # CANCAN_PIP_SPEC override the whole pip spec (e.g. a local wheel / VCS url) for dev
12
+ # PIP_INDEX_URL custom index (mirrors / private index)
13
+
14
+ ARG PYTHON_VERSION=3.13-slim
15
+
16
+ FROM python:${PYTHON_VERSION} AS runtime
17
+
18
+ ENV DEBIAN_FRONTEND=noninteractive \
19
+ TZ=Asia/Shanghai \
20
+ PYTHONDONTWRITEBYTECODE=1 \
21
+ PYTHONUNBUFFERED=1 \
22
+ PIP_DISABLE_PIP_VERSION_CHECK=1
23
+
24
+ WORKDIR /app
25
+
26
+ RUN apt-get update && apt-get install -y --no-install-recommends \
27
+ curl \
28
+ tzdata \
29
+ && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
30
+ && echo ${TZ} > /etc/timezone \
31
+ && apt-get clean && rm -rf /var/lib/apt/lists/*
32
+
33
+ RUN python -m venv /opt/venv
34
+ ENV VIRTUAL_ENV=/opt/venv
35
+ ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
36
+
37
+ ARG CANCAN_VERSION
38
+ ARG CANCAN_PIP_SPEC=
39
+ ARG PIP_INDEX_URL=
40
+
41
+ # Install cancan-microstack from PyPI (or the override spec). Its dependencies
42
+ # (linglong-web[all], dragonfly-container[all], jinja2, ...) come transitively.
43
+ RUN --mount=type=cache,target=/root/.cache/pip \
44
+ set -eu; \
45
+ PIP_SPEC="${CANCAN_PIP_SPEC:-cancan-microstack==${CANCAN_VERSION}}"; \
46
+ if [ "${PIP_SPEC}" = "cancan-microstack==" ]; then \
47
+ echo "ERROR: set CANCAN_VERSION or CANCAN_PIP_SPEC (the 'cancan' CLI sets this automatically)" >&2; \
48
+ exit 1; \
49
+ fi; \
50
+ pip install --upgrade pip; \
51
+ pip install --no-warn-script-location ${PIP_INDEX_URL:+--index-url "${PIP_INDEX_URL}"} "${PIP_SPEC}"
52
+
53
+ RUN mkdir -p /app/server_log_data /app/ddl
54
+
55
+ EXPOSE 8080
56
+
57
+ # The concrete service is selected by compose, e.g.:
58
+ # python -m cancan_microstack.cmd.infrasrv.run
59
+ CMD ["python", "-c", "import sys; sys.stderr.write('Specify a service module via compose, e.g. python -m cancan_microstack.cmd.infrasrv.run\\n'); sys.exit(1)"]
@@ -0,0 +1,13 @@
1
+ # Service image scaffold
2
+
3
+ This folder contains the multi-stage Dockerfile that Cancan uses for Python services. The bootstrap command copies
4
+ `Dockerfile` into `builds/service/` so compose overrides can reference it via `context: ./builds/service`.
5
+
6
+ The image:
7
+ - Uses Python 3.13 slim with Asia/Shanghai timezone baked in.
8
+ - Creates a venv at `/opt/venv` and caches pip downloads.
9
+ - Copies `src/`, `cmd/`, and `tools/` into `/app` and sets `PYTHONPATH` accordingly.
10
+ - Leaves the final command to docker-compose per service, ensuring consistent base runtime.
11
+
12
+ Feel free to customize the exported copy for service-specific dependencies; rerunning bootstrap does not overwrite an
13
+ existing file.
@@ -0,0 +1,22 @@
1
+ -- 初始化三个逻辑数据库,分别面向基础设施、运维可视化以及业务域。
2
+ -- 该脚本主要用于本地调试或一次性初始化,正式环境由 DDLManager 自动管理。
3
+
4
+ \echo 'Ensuring Cancan logical databases (infra / ops / biz)...'
5
+
6
+ DO $$
7
+ BEGIN
8
+ IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'infra') THEN
9
+ EXECUTE 'CREATE DATABASE infra WITH ENCODING ''UTF8'' TEMPLATE template0 LC_COLLATE ''en_US.UTF-8'' LC_CTYPE ''en_US.UTF-8''';
10
+ END IF;
11
+
12
+ IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'ops') THEN
13
+ EXECUTE 'CREATE DATABASE ops WITH ENCODING ''UTF8'' TEMPLATE template0 LC_COLLATE ''en_US.UTF-8'' LC_CTYPE ''en_US.UTF-8''';
14
+ END IF;
15
+
16
+ IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'biz') THEN
17
+ EXECUTE 'CREATE DATABASE biz WITH ENCODING ''UTF8'' TEMPLATE template0 LC_COLLATE ''en_US.UTF-8'' LC_CTYPE ''en_US.UTF-8''';
18
+ END IF;
19
+ END;
20
+ $$;
21
+
22
+ \connect infra;