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,53 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Default Caddy routes initialization module
|
|
3
|
+
"""
|
|
4
|
+
from linglong_web.utils import logger
|
|
5
|
+
from cancan_microstack.public.schemas.caddy import CaddyRouteCreate
|
|
6
|
+
from cancan_microstack.services.opsbffsrv.infrastructure.db.operate.caddy_route import (
|
|
7
|
+
get_route_by_name,
|
|
8
|
+
create_route,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
DEFAULT_ROUTES = [
|
|
12
|
+
CaddyRouteCreate(
|
|
13
|
+
route_name="opsbffsrv-internal",
|
|
14
|
+
domain="*",
|
|
15
|
+
path_pattern="/v1/opsbffsrv/*",
|
|
16
|
+
upstream_service="opsbffsrv",
|
|
17
|
+
upstream_host="opsbffsrv.service",
|
|
18
|
+
upstream_port=8080,
|
|
19
|
+
priority=1000,
|
|
20
|
+
is_enabled=True,
|
|
21
|
+
enable_https=False,
|
|
22
|
+
force_https=False,
|
|
23
|
+
enable_waf=False,
|
|
24
|
+
waf_rule_set="default",
|
|
25
|
+
load_balance_strategy="round_robin",
|
|
26
|
+
health_check_path=None,
|
|
27
|
+
health_check_interval=30,
|
|
28
|
+
strip_path_prefix=None,
|
|
29
|
+
add_path_prefix=None,
|
|
30
|
+
route_metadata=None,
|
|
31
|
+
description="Internal route for opsbffsrv"
|
|
32
|
+
),
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
async def init_default_routes():
|
|
37
|
+
"""
|
|
38
|
+
Initialize default Caddy routes if they don't exist
|
|
39
|
+
"""
|
|
40
|
+
logger.info("Initializing default Caddy routes...")
|
|
41
|
+
|
|
42
|
+
for route in DEFAULT_ROUTES:
|
|
43
|
+
try:
|
|
44
|
+
existing = await get_route_by_name(route.route_name)
|
|
45
|
+
if not existing:
|
|
46
|
+
logger.info(f"Creating default route: {route.route_name}")
|
|
47
|
+
await create_route(route)
|
|
48
|
+
else:
|
|
49
|
+
logger.debug(f"Default route already exists: {route.route_name}")
|
|
50
|
+
except Exception as e:
|
|
51
|
+
logger.error(f"Failed to initialize default route {route.route_name}: {e}")
|
|
52
|
+
|
|
53
|
+
logger.info("Default Caddy routes initialization completed")
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Caddy 限流规则管理领域服务
|
|
3
|
+
包含限流规则的核心业务逻辑和业务规则
|
|
4
|
+
"""
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
Dict,
|
|
8
|
+
List,
|
|
9
|
+
Optional,
|
|
10
|
+
)
|
|
11
|
+
from linglong_web.utils import logger
|
|
12
|
+
from cancan_microstack.public.schemas.caddy import CaddyRateLimit, CaddyRateLimitCreate
|
|
13
|
+
from cancan_microstack.services.opsbffsrv.infrastructure.db.operate.caddy_rate_limit import (
|
|
14
|
+
get_rate_limit_by_id,
|
|
15
|
+
get_rate_limit_by_name,
|
|
16
|
+
get_enabled_rate_limits,
|
|
17
|
+
get_rate_limits_by_match_type,
|
|
18
|
+
get_all_rate_limits,
|
|
19
|
+
create_rate_limit,
|
|
20
|
+
update_rate_limit,
|
|
21
|
+
update_rate_limit_by_name,
|
|
22
|
+
enable_rate_limit,
|
|
23
|
+
disable_rate_limit,
|
|
24
|
+
delete_rate_limit,
|
|
25
|
+
delete_rate_limit_by_name,
|
|
26
|
+
add_whitelist_ip,
|
|
27
|
+
remove_whitelist_ip,
|
|
28
|
+
add_blacklist_ip,
|
|
29
|
+
remove_blacklist_ip,
|
|
30
|
+
count_rate_limits,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class RateLimitManagementDomain:
|
|
35
|
+
"""限流规则管理领域服务"""
|
|
36
|
+
|
|
37
|
+
async def create_new_rate_limit(self, rate_limit: CaddyRateLimitCreate) -> CaddyRateLimit:
|
|
38
|
+
"""
|
|
39
|
+
创建新限流规则
|
|
40
|
+
|
|
41
|
+
业务规则:
|
|
42
|
+
1. 规则名称必须唯一
|
|
43
|
+
2. 限流值必须大于 0
|
|
44
|
+
3. 时间窗口至少 1 秒
|
|
45
|
+
4. 优先级范围:0-1000
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
rate_limit: 限流规则创建对象
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
创建后的限流规则对象
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
ValueError: 业务规则违反
|
|
55
|
+
"""
|
|
56
|
+
logger.info(f"Creating new rate limit rule: {rate_limit.rule_name}")
|
|
57
|
+
|
|
58
|
+
# 业务规则验证
|
|
59
|
+
await self._validate_rate_limit_create(rate_limit)
|
|
60
|
+
|
|
61
|
+
# 创建数据库记录
|
|
62
|
+
db_rate_limit = await create_rate_limit(rate_limit)
|
|
63
|
+
logger.info(f"Rate limit rule created in database: {db_rate_limit.id}")
|
|
64
|
+
|
|
65
|
+
return db_rate_limit
|
|
66
|
+
|
|
67
|
+
async def update_existing_rate_limit(self, rule_id: int, data: Dict[str, Any]) -> Optional[CaddyRateLimit]:
|
|
68
|
+
"""
|
|
69
|
+
更新现有限流规则
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
rule_id: 规则 ID
|
|
73
|
+
data: 更新数据
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
更新后的限流规则对象或 None
|
|
77
|
+
"""
|
|
78
|
+
logger.info(f"Updating rate limit rule: {rule_id}")
|
|
79
|
+
|
|
80
|
+
# 验证规则存在
|
|
81
|
+
existing_rule = await get_rate_limit_by_id(rule_id)
|
|
82
|
+
if not existing_rule:
|
|
83
|
+
logger.warning(f"Rate limit rule not found: {rule_id}")
|
|
84
|
+
return None
|
|
85
|
+
|
|
86
|
+
# 验证更新数据
|
|
87
|
+
if 'limit_value' in data and data['limit_value'] <= 0:
|
|
88
|
+
raise ValueError("Limit value must be greater than 0")
|
|
89
|
+
|
|
90
|
+
if 'limit_window' in data and data['limit_window'] < 1:
|
|
91
|
+
raise ValueError("Limit window must be at least 1 second")
|
|
92
|
+
|
|
93
|
+
# 更新数据库记录
|
|
94
|
+
updated_rule = await update_rate_limit(rule_id, data)
|
|
95
|
+
|
|
96
|
+
if updated_rule:
|
|
97
|
+
logger.info(f"Rate limit rule updated: {rule_id}")
|
|
98
|
+
|
|
99
|
+
return updated_rule
|
|
100
|
+
|
|
101
|
+
async def toggle_rate_limit_status(self, rule_id: int, enabled: bool) -> Optional[CaddyRateLimit]:
|
|
102
|
+
"""
|
|
103
|
+
切换限流规则启用状态
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
rule_id: 规则 ID
|
|
107
|
+
enabled: 是否启用
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
更新后的限流规则对象或 None
|
|
111
|
+
"""
|
|
112
|
+
logger.info(f"Toggling rate limit rule {rule_id} status to: {enabled}")
|
|
113
|
+
|
|
114
|
+
if enabled:
|
|
115
|
+
updated_rule = await enable_rate_limit(rule_id)
|
|
116
|
+
else:
|
|
117
|
+
updated_rule = await disable_rate_limit(rule_id)
|
|
118
|
+
|
|
119
|
+
return updated_rule
|
|
120
|
+
|
|
121
|
+
async def remove_rate_limit(self, rule_id: int) -> bool:
|
|
122
|
+
"""
|
|
123
|
+
删除限流规则
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
rule_id: 规则 ID
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
是否删除成功
|
|
130
|
+
"""
|
|
131
|
+
logger.info(f"Removing rate limit rule: {rule_id}")
|
|
132
|
+
|
|
133
|
+
# 验证规则存在
|
|
134
|
+
existing_rule = await get_rate_limit_by_id(rule_id)
|
|
135
|
+
if not existing_rule:
|
|
136
|
+
logger.warning(f"Rate limit rule not found: {rule_id}")
|
|
137
|
+
return False
|
|
138
|
+
|
|
139
|
+
# 删除数据库记录
|
|
140
|
+
success = await delete_rate_limit(rule_id)
|
|
141
|
+
|
|
142
|
+
if success:
|
|
143
|
+
logger.info(f"Rate limit rule removed: {rule_id}")
|
|
144
|
+
|
|
145
|
+
return success
|
|
146
|
+
|
|
147
|
+
async def get_rate_limit_details(self, rule_id: int) -> Optional[CaddyRateLimit]:
|
|
148
|
+
"""
|
|
149
|
+
获取限流规则详情
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
rule_id: 规则 ID
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
限流规则对象或 None
|
|
156
|
+
"""
|
|
157
|
+
return await get_rate_limit_by_id(rule_id)
|
|
158
|
+
|
|
159
|
+
async def list_rate_limits(self, filters: Optional[Dict[str, Any]] = None) -> List[CaddyRateLimit]:
|
|
160
|
+
"""
|
|
161
|
+
列出限流规则
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
filters: 过滤条件
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
限流规则列表
|
|
168
|
+
"""
|
|
169
|
+
return await get_all_rate_limits(filters)
|
|
170
|
+
|
|
171
|
+
async def list_rate_limits_by_match_type(self, match_type: str) -> List[CaddyRateLimit]:
|
|
172
|
+
"""
|
|
173
|
+
按匹配类型列出限流规则
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
match_type: 匹配类型(path/domain/ip/header/all)
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
限流规则列表
|
|
180
|
+
"""
|
|
181
|
+
return await get_rate_limits_by_match_type(match_type)
|
|
182
|
+
|
|
183
|
+
async def manage_whitelist_ip(self, rule_id: int, ip: str, action: str) -> Optional[CaddyRateLimit]:
|
|
184
|
+
"""
|
|
185
|
+
管理白名单 IP
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
rule_id: 规则 ID
|
|
189
|
+
ip: IP 地址
|
|
190
|
+
action: 操作(add/remove)
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
更新后的限流规则对象或 None
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
ValueError: 操作无效
|
|
197
|
+
"""
|
|
198
|
+
logger.info(f"Managing whitelist IP for rule {rule_id}: {action} {ip}")
|
|
199
|
+
|
|
200
|
+
# 验证 IP 格式
|
|
201
|
+
if not self._is_valid_ip(ip):
|
|
202
|
+
raise ValueError(f"Invalid IP address: {ip}")
|
|
203
|
+
|
|
204
|
+
if action == "add":
|
|
205
|
+
return await add_whitelist_ip(rule_id, ip)
|
|
206
|
+
elif action == "remove":
|
|
207
|
+
return await remove_whitelist_ip(rule_id, ip)
|
|
208
|
+
else:
|
|
209
|
+
raise ValueError(f"Invalid action: {action}. Must be 'add' or 'remove'")
|
|
210
|
+
|
|
211
|
+
async def manage_blacklist_ip(self, rule_id: int, ip: str, action: str) -> Optional[CaddyRateLimit]:
|
|
212
|
+
"""
|
|
213
|
+
管理黑名单 IP
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
rule_id: 规则 ID
|
|
217
|
+
ip: IP 地址
|
|
218
|
+
action: 操作(add/remove)
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
更新后的限流规则对象或 None
|
|
222
|
+
|
|
223
|
+
Raises:
|
|
224
|
+
ValueError: 操作无效
|
|
225
|
+
"""
|
|
226
|
+
logger.info(f"Managing blacklist IP for rule {rule_id}: {action} {ip}")
|
|
227
|
+
|
|
228
|
+
# 验证 IP 格式
|
|
229
|
+
if not self._is_valid_ip(ip):
|
|
230
|
+
raise ValueError(f"Invalid IP address: {ip}")
|
|
231
|
+
|
|
232
|
+
if action == "add":
|
|
233
|
+
return await add_blacklist_ip(rule_id, ip)
|
|
234
|
+
elif action == "remove":
|
|
235
|
+
return await remove_blacklist_ip(rule_id, ip)
|
|
236
|
+
else:
|
|
237
|
+
raise ValueError(f"Invalid action: {action}. Must be 'add' or 'remove'")
|
|
238
|
+
|
|
239
|
+
async def get_rate_limit_count(self, filters: Optional[Dict[str, Any]] = None) -> int:
|
|
240
|
+
"""
|
|
241
|
+
获取限流规则数量
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
filters: 过滤条件
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
规则数量
|
|
248
|
+
"""
|
|
249
|
+
return await count_rate_limits(filters)
|
|
250
|
+
|
|
251
|
+
async def _validate_rate_limit_create(self, rate_limit: CaddyRateLimitCreate):
|
|
252
|
+
"""
|
|
253
|
+
验证限流规则创建的业务规则
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
rate_limit: 限流规则创建对象
|
|
257
|
+
|
|
258
|
+
Raises:
|
|
259
|
+
ValueError: 业务规则违反
|
|
260
|
+
"""
|
|
261
|
+
# 验证规则名称唯一性
|
|
262
|
+
existing_rule = await get_rate_limit_by_name(rate_limit.rule_name)
|
|
263
|
+
if existing_rule:
|
|
264
|
+
raise ValueError(f"Rate limit rule name already exists: {rate_limit.rule_name}")
|
|
265
|
+
|
|
266
|
+
# 验证限流值
|
|
267
|
+
if rate_limit.limit_value <= 0:
|
|
268
|
+
raise ValueError("Limit value must be greater than 0")
|
|
269
|
+
|
|
270
|
+
# 验证时间窗口
|
|
271
|
+
if rate_limit.limit_window < 1:
|
|
272
|
+
raise ValueError("Limit window must be at least 1 second")
|
|
273
|
+
|
|
274
|
+
# 验证优先级范围
|
|
275
|
+
if rate_limit.priority < 0 or rate_limit.priority > 1000:
|
|
276
|
+
raise ValueError(f"Priority must be between 0 and 1000: {rate_limit.priority}")
|
|
277
|
+
|
|
278
|
+
# 验证匹配类型
|
|
279
|
+
valid_match_types = ['path', 'domain', 'ip', 'header', 'all']
|
|
280
|
+
if rate_limit.match_type not in valid_match_types:
|
|
281
|
+
raise ValueError(f"Invalid match type: {rate_limit.match_type}. Must be one of {valid_match_types}")
|
|
282
|
+
|
|
283
|
+
# 验证限流类型
|
|
284
|
+
valid_limit_types = ['request', 'bandwidth']
|
|
285
|
+
if rate_limit.limit_type not in valid_limit_types:
|
|
286
|
+
raise ValueError(f"Invalid limit type: {rate_limit.limit_type}. Must be one of {valid_limit_types}")
|
|
287
|
+
|
|
288
|
+
# 验证限流键
|
|
289
|
+
valid_limit_keys = ['ip', 'header', 'cookie', 'path']
|
|
290
|
+
if rate_limit.limit_key not in valid_limit_keys:
|
|
291
|
+
raise ValueError(f"Invalid limit key: {rate_limit.limit_key}. Must be one of {valid_limit_keys}")
|
|
292
|
+
|
|
293
|
+
def _is_valid_ip(self, ip: str) -> bool:
|
|
294
|
+
"""
|
|
295
|
+
验证 IP 地址格式
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
ip: IP 地址字符串
|
|
299
|
+
|
|
300
|
+
Returns:
|
|
301
|
+
是否为有效 IP
|
|
302
|
+
"""
|
|
303
|
+
try:
|
|
304
|
+
import ipaddress
|
|
305
|
+
ipaddress.ip_address(ip)
|
|
306
|
+
return True
|
|
307
|
+
except ValueError:
|
|
308
|
+
return False
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Caddy 路由管理领域服务
|
|
3
|
+
包含路由配置的核心业务逻辑和业务规则
|
|
4
|
+
"""
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
Dict,
|
|
8
|
+
List,
|
|
9
|
+
Optional,
|
|
10
|
+
)
|
|
11
|
+
from linglong_web.utils import logger
|
|
12
|
+
from cancan_microstack.public.schemas.caddy import CaddyRoute, CaddyRouteCreate
|
|
13
|
+
from cancan_microstack.services.opsbffsrv.infrastructure.db.operate.caddy_route import (
|
|
14
|
+
get_route_by_id,
|
|
15
|
+
get_route_by_name,
|
|
16
|
+
get_routes_by_domain,
|
|
17
|
+
get_routes_by_service,
|
|
18
|
+
get_enabled_routes,
|
|
19
|
+
get_all_routes,
|
|
20
|
+
create_route,
|
|
21
|
+
update_route,
|
|
22
|
+
update_route_by_name,
|
|
23
|
+
enable_route,
|
|
24
|
+
disable_route,
|
|
25
|
+
delete_route,
|
|
26
|
+
delete_route_by_name,
|
|
27
|
+
count_routes,
|
|
28
|
+
)
|
|
29
|
+
from cancan_microstack.services.opsbffsrv.infrastructure.caddy.admin_api_client import caddy_admin_client
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class RouteManagementDomain:
|
|
33
|
+
"""路由管理领域服务"""
|
|
34
|
+
|
|
35
|
+
async def create_new_route(self, route: CaddyRouteCreate) -> CaddyRoute:
|
|
36
|
+
"""
|
|
37
|
+
创建新路由
|
|
38
|
+
|
|
39
|
+
业务规则:
|
|
40
|
+
1. 路由名称必须唯一
|
|
41
|
+
2. 优先级范围:0-1000
|
|
42
|
+
3. 创建后自动同步到 Caddy
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
route: 路由创建对象
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
创建后的路由对象
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
ValueError: 业务规则违反
|
|
52
|
+
"""
|
|
53
|
+
logger.info(f"Creating new route: {route.route_name}")
|
|
54
|
+
|
|
55
|
+
# 业务规则验证
|
|
56
|
+
await self._validate_route_create(route)
|
|
57
|
+
|
|
58
|
+
# 创建数据库记录
|
|
59
|
+
db_route = await create_route(route)
|
|
60
|
+
logger.info(f"Route created in database: {db_route.id}")
|
|
61
|
+
|
|
62
|
+
return db_route
|
|
63
|
+
|
|
64
|
+
async def update_existing_route(self, route_id: int, data: Dict[str, Any]) -> Optional[CaddyRoute]:
|
|
65
|
+
"""
|
|
66
|
+
更新现有路由
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
route_id: 路由 ID
|
|
70
|
+
data: 更新数据
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
更新后的路由对象或 None
|
|
74
|
+
"""
|
|
75
|
+
logger.info(f"Updating route: {route_id}")
|
|
76
|
+
|
|
77
|
+
# 验证路由存在
|
|
78
|
+
existing_route = await get_route_by_id(route_id)
|
|
79
|
+
if not existing_route:
|
|
80
|
+
logger.warning(f"Route not found: {route_id}")
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
# 更新数据库记录
|
|
84
|
+
updated_route = await update_route(route_id, data)
|
|
85
|
+
|
|
86
|
+
if updated_route:
|
|
87
|
+
logger.info(f"Route updated: {route_id}")
|
|
88
|
+
|
|
89
|
+
return updated_route
|
|
90
|
+
|
|
91
|
+
async def toggle_route_status(self, route_id: int, enabled: bool) -> Optional[CaddyRoute]:
|
|
92
|
+
"""
|
|
93
|
+
切换路由启用状态
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
route_id: 路由 ID
|
|
97
|
+
enabled: 是否启用
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
更新后的路由对象或 None
|
|
101
|
+
"""
|
|
102
|
+
logger.info(f"Toggling route {route_id} status to: {enabled}")
|
|
103
|
+
|
|
104
|
+
if enabled:
|
|
105
|
+
updated_route = await enable_route(route_id)
|
|
106
|
+
else:
|
|
107
|
+
updated_route = await disable_route(route_id)
|
|
108
|
+
|
|
109
|
+
return updated_route
|
|
110
|
+
|
|
111
|
+
async def remove_route(self, route_id: int) -> bool:
|
|
112
|
+
"""
|
|
113
|
+
删除路由
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
route_id: 路由 ID
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
是否删除成功
|
|
120
|
+
"""
|
|
121
|
+
logger.info(f"Removing route: {route_id}")
|
|
122
|
+
|
|
123
|
+
# 验证路由存在
|
|
124
|
+
existing_route = await get_route_by_id(route_id)
|
|
125
|
+
if not existing_route:
|
|
126
|
+
logger.warning(f"Route not found: {route_id}")
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
# 删除数据库记录
|
|
130
|
+
success = await delete_route(route_id)
|
|
131
|
+
|
|
132
|
+
if success:
|
|
133
|
+
logger.info(f"Route removed: {route_id}")
|
|
134
|
+
|
|
135
|
+
return success
|
|
136
|
+
|
|
137
|
+
async def get_route_details(self, route_id: int) -> Optional[CaddyRoute]:
|
|
138
|
+
"""
|
|
139
|
+
获取路由详情
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
route_id: 路由 ID
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
路由对象或 None
|
|
146
|
+
"""
|
|
147
|
+
return await get_route_by_id(route_id)
|
|
148
|
+
|
|
149
|
+
async def list_routes(self, filters: Optional[Dict[str, Any]] = None) -> List[CaddyRoute]:
|
|
150
|
+
"""
|
|
151
|
+
列出路由
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
filters: 过滤条件
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
路由列表
|
|
158
|
+
"""
|
|
159
|
+
return await get_all_routes(filters)
|
|
160
|
+
|
|
161
|
+
async def list_routes_by_domain(self, domain: str) -> List[CaddyRoute]:
|
|
162
|
+
"""
|
|
163
|
+
按域名列出路由
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
domain: 域名
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
路由列表
|
|
170
|
+
"""
|
|
171
|
+
return await get_routes_by_domain(domain)
|
|
172
|
+
|
|
173
|
+
async def list_routes_by_service(self, service: str) -> List[CaddyRoute]:
|
|
174
|
+
"""
|
|
175
|
+
按服务列出路由
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
service: 服务名称
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
路由列表
|
|
182
|
+
"""
|
|
183
|
+
return await get_routes_by_service(service)
|
|
184
|
+
|
|
185
|
+
async def sync_routes_to_caddy(self) -> bool:
|
|
186
|
+
"""
|
|
187
|
+
将所有启用的路由同步到 Caddy
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
是否同步成功
|
|
191
|
+
"""
|
|
192
|
+
logger.info("Syncing routes to Caddy")
|
|
193
|
+
|
|
194
|
+
# 获取所有启用的路由
|
|
195
|
+
enabled_routes_list = await get_enabled_routes()
|
|
196
|
+
|
|
197
|
+
if not enabled_routes_list:
|
|
198
|
+
logger.warning("No enabled routes found, clearing all routes in Caddy")
|
|
199
|
+
# Continue to sync empty list to clear routes
|
|
200
|
+
# return False
|
|
201
|
+
|
|
202
|
+
# 构建 Caddy 路由配置
|
|
203
|
+
caddy_routes = []
|
|
204
|
+
for route in enabled_routes_list:
|
|
205
|
+
route_config = await caddy_admin_client.build_route_config(
|
|
206
|
+
domain=route.domain,
|
|
207
|
+
path_pattern=route.path_pattern,
|
|
208
|
+
upstream_host=route.upstream_host,
|
|
209
|
+
upstream_port=route.upstream_port,
|
|
210
|
+
enable_https=route.enable_https,
|
|
211
|
+
force_https=route.force_https,
|
|
212
|
+
enable_waf=route.enable_waf,
|
|
213
|
+
waf_rule_set=route.waf_rule_set,
|
|
214
|
+
strip_path_prefix=route.strip_path_prefix,
|
|
215
|
+
add_path_prefix=route.add_path_prefix,
|
|
216
|
+
)
|
|
217
|
+
caddy_routes.append(route_config)
|
|
218
|
+
|
|
219
|
+
# 批量应用到 Caddy
|
|
220
|
+
success = await caddy_admin_client.apply_routes_batch(caddy_routes)
|
|
221
|
+
|
|
222
|
+
if success:
|
|
223
|
+
logger.info(f"Successfully synced {len(caddy_routes)} routes to Caddy")
|
|
224
|
+
else:
|
|
225
|
+
logger.warning("Failed to sync routes to Caddy (Caddy may be unavailable)")
|
|
226
|
+
|
|
227
|
+
return success
|
|
228
|
+
|
|
229
|
+
async def _validate_route_create(self, route: CaddyRouteCreate):
|
|
230
|
+
"""
|
|
231
|
+
验证路由创建的业务规则
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
route: 路由创建对象
|
|
235
|
+
|
|
236
|
+
Raises:
|
|
237
|
+
ValueError: 业务规则违反
|
|
238
|
+
"""
|
|
239
|
+
# 验证路由名称唯一性
|
|
240
|
+
existing_route = await get_route_by_name(route.route_name)
|
|
241
|
+
if existing_route:
|
|
242
|
+
raise ValueError(f"Route name already exists: {route.route_name}")
|
|
243
|
+
|
|
244
|
+
# 验证优先级范围
|
|
245
|
+
if route.priority < 0 or route.priority > 1000:
|
|
246
|
+
raise ValueError(f"Priority must be between 0 and 1000: {route.priority}")
|
|
247
|
+
|
|
248
|
+
# 验证上游端口范围
|
|
249
|
+
if route.upstream_port < 1 or route.upstream_port > 65535:
|
|
250
|
+
raise ValueError(f"Invalid upstream port: {route.upstream_port}")
|
|
251
|
+
|
|
252
|
+
# 验证健康检查间隔
|
|
253
|
+
if route.health_check_interval < 5:
|
|
254
|
+
raise ValueError(f"Health check interval must be at least 5 seconds: {route.health_check_interval}")
|
|
255
|
+
|
|
256
|
+
async def _validate_route_priority(self, priority: int):
|
|
257
|
+
"""
|
|
258
|
+
验证路由优先级
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
priority: 优先级
|
|
262
|
+
|
|
263
|
+
Raises:
|
|
264
|
+
ValueError: 优先级无效
|
|
265
|
+
"""
|
|
266
|
+
if priority < 0 or priority > 1000:
|
|
267
|
+
raise ValueError(f"Priority must be between 0 and 1000: {priority}")
|
|
268
|
+
|
|
269
|
+
async def get_route_count(self, filters: Optional[Dict[str, Any]] = None) -> int:
|
|
270
|
+
"""
|
|
271
|
+
获取路由数量
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
filters: 过滤条件
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
路由数量
|
|
278
|
+
"""
|
|
279
|
+
return await count_routes(filters)
|