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.
- cancan_microstack/__init__.py +14 -0
- cancan_microstack/__version__.py +10 -0
- cancan_microstack/assets/__init__.py +6 -0
- cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
- cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
- cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
- cancan_microstack/assets/builds/caddy/README.md +343 -0
- cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
- cancan_microstack/assets/builds/caddy/start.sh +78 -0
- cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
- cancan_microstack/assets/builds/service/Dockerfile +59 -0
- cancan_microstack/assets/builds/service/README.md +13 -0
- cancan_microstack/assets/ddl/create_db.sql +22 -0
- cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
- cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
- cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
- cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
- cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
- cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
- cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
- cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
- cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
- cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
- cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
- cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
- cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
- cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
- cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
- cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
- cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
- cancan_microstack/assets/ddl/trigger.sql +21 -0
- cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
- cancan_microstack/assets/scripts/README.md +195 -0
- cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
- cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
- cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
- cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
- cancan_microstack/assets/scripts/docker/restart.sh +35 -0
- cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
- cancan_microstack/assets/scripts/docker/start.sh +78 -0
- cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
- cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
- cancan_microstack/assets/scripts/docker/stop.sh +67 -0
- cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
- cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
- cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
- cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
- cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
- cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
- cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
- cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
- cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
- cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
- cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
- cancan_microstack/assets/scripts/podman/stop.sh +73 -0
- cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
- cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
- cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
- cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
- cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
- cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
- cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
- cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
- cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
- cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
- cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
- cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
- cancan_microstack/assets/service/Dockerfile +65 -0
- cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
- cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
- cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
- cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
- cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
- cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
- cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
- cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
- cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
- cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
- cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
- cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
- cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
- cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
- cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
- cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
- cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
- cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
- cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
- cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
- cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
- cancan_microstack/assets/www/adminops/index.html +16 -0
- cancan_microstack/assets/www/adminops/vite.svg +1 -0
- cancan_microstack/cli/__init__.py +14 -0
- cancan_microstack/cli/__main__.py +9 -0
- cancan_microstack/cli/main.py +552 -0
- cancan_microstack/cmd/__init__.py +54 -0
- cancan_microstack/cmd/cancan/__init__.py +12 -0
- cancan_microstack/cmd/cancan/run.py +395 -0
- cancan_microstack/cmd/controllersrv/__init__.py +0 -0
- cancan_microstack/cmd/controllersrv/run.py +131 -0
- cancan_microstack/cmd/infrasrv/__init__.py +5 -0
- cancan_microstack/cmd/infrasrv/run.py +100 -0
- cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
- cancan_microstack/cmd/opsbffsrv/run.py +96 -0
- cancan_microstack/core/__init__.py +5 -0
- cancan_microstack/core/assets.py +123 -0
- cancan_microstack/core/compose_builder.py +102 -0
- cancan_microstack/core/doctor.py +152 -0
- cancan_microstack/core/microstack.py +71 -0
- cancan_microstack/core/runner.py +56 -0
- cancan_microstack/core/stack_manager.py +186 -0
- cancan_microstack/public/__init__.py +7 -0
- cancan_microstack/public/api/__init__.py +1 -0
- cancan_microstack/public/api/controllersrv_client.py +277 -0
- cancan_microstack/public/api/infrasrv_client.py +404 -0
- cancan_microstack/public/const/__init__.py +1 -0
- cancan_microstack/public/const/action_consts.py +18 -0
- cancan_microstack/public/const/app_consts.py +42 -0
- cancan_microstack/public/const/caddy_consts.py +22 -0
- cancan_microstack/public/const/controllersrv_consts.py +163 -0
- cancan_microstack/public/const/docker_consts.py +15 -0
- cancan_microstack/public/const/error.py +56 -0
- cancan_microstack/public/const/health_consts.py +52 -0
- cancan_microstack/public/const/hook_enums.py +56 -0
- cancan_microstack/public/const/logging_enums.py +13 -0
- cancan_microstack/public/const/metrics_enums.py +36 -0
- cancan_microstack/public/const/monitor_enums.py +26 -0
- cancan_microstack/public/const/operation_consts.py +53 -0
- cancan_microstack/public/const/opsbffsrv_error.py +92 -0
- cancan_microstack/public/const/overrides_consts.py +13 -0
- cancan_microstack/public/const/redis.py +17 -0
- cancan_microstack/public/const/service_consts.py +15 -0
- cancan_microstack/public/const/workflow_consts.py +65 -0
- cancan_microstack/public/error.py +41 -0
- cancan_microstack/public/logging/__init__.py +0 -0
- cancan_microstack/public/logging/initializer.py +109 -0
- cancan_microstack/public/logging/mq_handler.py +279 -0
- cancan_microstack/public/schemas/__init__.py +1 -0
- cancan_microstack/public/schemas/caddy/__init__.py +381 -0
- cancan_microstack/public/schemas/caddy/analysis.py +90 -0
- cancan_microstack/public/schemas/caddy/route.py +18 -0
- cancan_microstack/public/schemas/common.py +79 -0
- cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
- cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
- cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
- cancan_microstack/public/schemas/controllersrv/const.py +24 -0
- cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
- cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
- cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
- cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
- cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
- cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
- cancan_microstack/public/schemas/hook_metrics.py +124 -0
- cancan_microstack/public/schemas/hooks.py +39 -0
- cancan_microstack/public/schemas/infra/__init__.py +0 -0
- cancan_microstack/public/schemas/infra/cleanup.py +25 -0
- cancan_microstack/public/schemas/infra/container.py +74 -0
- cancan_microstack/public/schemas/infra/enums.py +135 -0
- cancan_microstack/public/schemas/infra/health_check.py +42 -0
- cancan_microstack/public/schemas/infra/hook_log.py +42 -0
- cancan_microstack/public/schemas/infra/operation.py +90 -0
- cancan_microstack/public/schemas/infra/overview.py +25 -0
- cancan_microstack/public/schemas/infra/push.py +33 -0
- cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
- cancan_microstack/public/schemas/infra/service_config.py +10 -0
- cancan_microstack/public/schemas/infra/service_info.py +69 -0
- cancan_microstack/public/schemas/infra/service_instance.py +93 -0
- cancan_microstack/public/schemas/infra/service_management.py +152 -0
- cancan_microstack/public/schemas/infra/service_operation.py +79 -0
- cancan_microstack/public/schemas/infra/service_registry.py +158 -0
- cancan_microstack/public/schemas/infra/status_types.py +19 -0
- cancan_microstack/public/schemas/infra/workflow.py +566 -0
- cancan_microstack/public/schemas/logging/__init__.py +1 -0
- cancan_microstack/public/schemas/logging/log_event.py +121 -0
- cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
- cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
- cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
- cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
- cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
- cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
- cancan_microstack/public/schemas/service_operation.py +24 -0
- cancan_microstack/public/schemas/service_registry.py +40 -0
- cancan_microstack/public/types/__init__.py +7 -0
- cancan_microstack/public/web/__init__.py +0 -0
- cancan_microstack/public/web/config_value.py +105 -0
- cancan_microstack/public/web/server.py +385 -0
- cancan_microstack/py.typed +0 -0
- cancan_microstack/runtime/__init__.py +0 -0
- cancan_microstack/runtime/compose_cmd.py +228 -0
- cancan_microstack/runtime/host_daemon.py +318 -0
- cancan_microstack/runtime/overrides.py +103 -0
- cancan_microstack/runtime/resources.py +25 -0
- cancan_microstack/runtime/workspace.py +94 -0
- cancan_microstack/services/__init__.py +0 -0
- cancan_microstack/services/controllersrv/__init__.py +8 -0
- cancan_microstack/services/controllersrv/application/__init__.py +0 -0
- cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
- cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
- cancan_microstack/services/controllersrv/conf/config.py +76 -0
- cancan_microstack/services/controllersrv/conf/settings.py +54 -0
- cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
- cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
- cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
- cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
- cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
- cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
- cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
- cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
- cancan_microstack/services/controllersrv/router.py +132 -0
- cancan_microstack/services/infrasrv/__init__.py +4 -0
- cancan_microstack/services/infrasrv/application/__init__.py +0 -0
- cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
- cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
- cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
- cancan_microstack/services/infrasrv/application/service_config.py +22 -0
- cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
- cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
- cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
- cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
- cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
- cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
- cancan_microstack/services/infrasrv/conf/config.py +98 -0
- cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
- cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
- cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
- cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
- cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
- cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
- cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
- cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
- cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
- cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
- cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
- cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
- cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
- cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
- cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
- cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
- cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
- cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
- cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
- cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
- cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
- cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
- cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
- cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
- cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
- cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
- cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
- cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
- cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
- cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
- cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
- cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
- cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
- cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
- cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
- cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
- cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
- cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
- cancan_microstack/services/infrasrv/router.py +341 -0
- cancan_microstack/services/opsbffsrv/__init__.py +4 -0
- cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
- cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
- cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
- cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
- cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
- cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
- cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
- cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
- cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
- cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
- cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
- cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
- cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
- cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
- cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
- cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
- cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
- cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
- cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
- cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
- cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
- cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
- cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
- cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
- cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
- cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
- cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
- cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
- cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
- cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
- cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
- cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
- cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
- cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
- cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
- cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
- cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
- cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
- cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
- cancan_microstack/services/opsbffsrv/router.py +901 -0
- cancan_microstack/utils/__init__.py +1 -0
- cancan_microstack/utils/container_env.py +218 -0
- cancan_microstack-0.0.1.dist-info/METADATA +155 -0
- cancan_microstack-0.0.1.dist-info/RECORD +440 -0
- cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
- cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
- cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
- 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;
|