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 @@
|
|
|
1
|
+
"""Utility helpers bundled with Cancan Microstack."""
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"""
|
|
2
|
+
容器环境检测工具。
|
|
3
|
+
Container environment detection utilities.
|
|
4
|
+
|
|
5
|
+
自动检测当前环境使用的是 Docker 还是 Podman,并提供统一的命令接口。
|
|
6
|
+
Automatically detect whether the runtime uses Docker or Podman and expose unified compose helpers.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import shutil
|
|
10
|
+
import subprocess
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
from linglong_web.utils import logger
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ContainerEnv:
|
|
17
|
+
"""
|
|
18
|
+
容器环境管理器。
|
|
19
|
+
Container environment manager responsible for lazy detection and caching results.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
_detected_engine: Optional[str] = None
|
|
23
|
+
_detected_compose_cmd: Optional[str] = None
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def detect_engine(cls) -> str:
|
|
27
|
+
"""
|
|
28
|
+
检测容器引擎类型。
|
|
29
|
+
Detect container engine type and cache the decision.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
"podman" 或 "docker" / either "podman" or "docker".
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
if cls._detected_engine:
|
|
36
|
+
return cls._detected_engine
|
|
37
|
+
|
|
38
|
+
# 优先检测 Podman / prefer Podman first for local dev parity
|
|
39
|
+
if shutil.which("podman"):
|
|
40
|
+
try:
|
|
41
|
+
result = subprocess.run(
|
|
42
|
+
["podman", "--version"],
|
|
43
|
+
capture_output=True,
|
|
44
|
+
text=True,
|
|
45
|
+
timeout=5,
|
|
46
|
+
check=False,
|
|
47
|
+
)
|
|
48
|
+
if result.returncode == 0:
|
|
49
|
+
logger.info("Detected Podman: %s", result.stdout.strip())
|
|
50
|
+
cls._detected_engine = "podman"
|
|
51
|
+
return "podman"
|
|
52
|
+
except Exception as exc: # noqa: BLE001 - log unexpected detection errors
|
|
53
|
+
logger.warning("Failed to verify podman: %s", exc)
|
|
54
|
+
|
|
55
|
+
# 其次检测 Docker / fallback to Docker detection
|
|
56
|
+
if shutil.which("docker"):
|
|
57
|
+
try:
|
|
58
|
+
result = subprocess.run(
|
|
59
|
+
["docker", "--version"],
|
|
60
|
+
capture_output=True,
|
|
61
|
+
text=True,
|
|
62
|
+
timeout=5,
|
|
63
|
+
check=False,
|
|
64
|
+
)
|
|
65
|
+
if result.returncode == 0:
|
|
66
|
+
logger.info("Detected Docker: %s", result.stdout.strip())
|
|
67
|
+
cls._detected_engine = "docker"
|
|
68
|
+
return "docker"
|
|
69
|
+
except Exception as exc: # noqa: BLE001
|
|
70
|
+
logger.warning("Failed to verify docker: %s", exc)
|
|
71
|
+
|
|
72
|
+
# 默认返回 docker / Default to docker
|
|
73
|
+
logger.warning("No container engine detected, defaulting to docker")
|
|
74
|
+
cls._detected_engine = "docker"
|
|
75
|
+
return "docker"
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def detect_compose_command(cls) -> str:
|
|
79
|
+
"""
|
|
80
|
+
检测 Compose 命令。
|
|
81
|
+
Detect compose command (docker compose, docker-compose, podman compose, etc.).
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
完整命令字符串 / composed command name string.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if cls._detected_compose_cmd:
|
|
88
|
+
return cls._detected_compose_cmd
|
|
89
|
+
|
|
90
|
+
engine = cls.detect_engine()
|
|
91
|
+
|
|
92
|
+
if engine == "podman":
|
|
93
|
+
# Podman 环境:优先 podman-compose,其次 podman compose
|
|
94
|
+
if shutil.which("podman-compose"):
|
|
95
|
+
try:
|
|
96
|
+
result = subprocess.run(
|
|
97
|
+
["podman-compose", "--version"],
|
|
98
|
+
capture_output=True,
|
|
99
|
+
text=True,
|
|
100
|
+
timeout=5,
|
|
101
|
+
check=False,
|
|
102
|
+
)
|
|
103
|
+
if result.returncode == 0:
|
|
104
|
+
logger.info("Using podman-compose: %s", result.stdout.strip())
|
|
105
|
+
cls._detected_compose_cmd = "podman-compose"
|
|
106
|
+
return "podman-compose"
|
|
107
|
+
except Exception as exc: # noqa: BLE001
|
|
108
|
+
logger.warning("Failed to verify podman-compose: %s", exc)
|
|
109
|
+
|
|
110
|
+
# 尝试 podman compose(Podman 4.0+ 内置)
|
|
111
|
+
try:
|
|
112
|
+
result = subprocess.run(
|
|
113
|
+
["podman", "compose", "version"],
|
|
114
|
+
capture_output=True,
|
|
115
|
+
text=True,
|
|
116
|
+
timeout=5,
|
|
117
|
+
check=False,
|
|
118
|
+
)
|
|
119
|
+
if result.returncode == 0:
|
|
120
|
+
logger.info("Using podman compose: %s", result.stdout.strip())
|
|
121
|
+
cls._detected_compose_cmd = "podman compose"
|
|
122
|
+
return "podman compose"
|
|
123
|
+
except Exception as exc: # noqa: BLE001
|
|
124
|
+
logger.warning("Failed to verify podman compose: %s", exc)
|
|
125
|
+
else:
|
|
126
|
+
# Docker 环境:优先 docker compose(v2),其次 docker-compose(v1)
|
|
127
|
+
try:
|
|
128
|
+
result = subprocess.run(
|
|
129
|
+
["docker", "compose", "version"],
|
|
130
|
+
capture_output=True,
|
|
131
|
+
text=True,
|
|
132
|
+
timeout=5,
|
|
133
|
+
check=False,
|
|
134
|
+
)
|
|
135
|
+
if result.returncode == 0:
|
|
136
|
+
logger.info("Using docker compose: %s", result.stdout.strip())
|
|
137
|
+
cls._detected_compose_cmd = "docker compose"
|
|
138
|
+
return "docker compose"
|
|
139
|
+
except Exception as exc: # noqa: BLE001
|
|
140
|
+
logger.warning("Failed to verify docker compose: %s", exc)
|
|
141
|
+
|
|
142
|
+
if shutil.which("docker-compose"):
|
|
143
|
+
try:
|
|
144
|
+
result = subprocess.run(
|
|
145
|
+
["docker-compose", "--version"],
|
|
146
|
+
capture_output=True,
|
|
147
|
+
text=True,
|
|
148
|
+
timeout=5,
|
|
149
|
+
check=False,
|
|
150
|
+
)
|
|
151
|
+
if result.returncode == 0:
|
|
152
|
+
logger.info("Using docker-compose: %s", result.stdout.strip())
|
|
153
|
+
cls._detected_compose_cmd = "docker-compose"
|
|
154
|
+
return "docker-compose"
|
|
155
|
+
except Exception as exc: # noqa: BLE001
|
|
156
|
+
logger.warning("Failed to verify docker-compose: %s", exc)
|
|
157
|
+
|
|
158
|
+
logger.warning("No compose command detected, defaulting to docker-compose")
|
|
159
|
+
cls._detected_compose_cmd = "docker-compose"
|
|
160
|
+
return "docker-compose"
|
|
161
|
+
|
|
162
|
+
@classmethod
|
|
163
|
+
def get_compose_command_list(cls, compose_file: str, project_name: str) -> list[str]:
|
|
164
|
+
"""
|
|
165
|
+
获取 compose 命令的基础命令列表。
|
|
166
|
+
Build the command list for executing compose operations.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
compose_file: compose 文件路径 / compose file path.
|
|
170
|
+
project_name: 项目名称 / compose project name.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
命令列表,如 ["podman-compose", "-f", "xxx.yml", "-p", "project"]。
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
compose_cmd = cls.detect_compose_command()
|
|
177
|
+
cmd_parts = compose_cmd.split()
|
|
178
|
+
return cmd_parts + ["-f", compose_file, "-p", project_name]
|
|
179
|
+
|
|
180
|
+
@classmethod
|
|
181
|
+
def get_info(cls) -> dict[str, str | bool]:
|
|
182
|
+
"""
|
|
183
|
+
获取容器环境信息。
|
|
184
|
+
Return a summary dict of the detected container environment.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
engine = cls.detect_engine()
|
|
188
|
+
compose_cmd = cls.detect_compose_command()
|
|
189
|
+
return {
|
|
190
|
+
"engine": engine,
|
|
191
|
+
"compose_command": compose_cmd,
|
|
192
|
+
"is_podman": engine == "podman",
|
|
193
|
+
"is_docker": engine == "docker",
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def get_container_engine() -> str:
|
|
198
|
+
"""获取容器引擎类型 / Expose detected container engine."""
|
|
199
|
+
|
|
200
|
+
return ContainerEnv.detect_engine()
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def get_compose_command() -> str:
|
|
204
|
+
"""获取 compose 命令 / Expose detected compose command."""
|
|
205
|
+
|
|
206
|
+
return ContainerEnv.detect_compose_command()
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def is_podman_env() -> bool:
|
|
210
|
+
"""判断是否为 Podman 环境 / Return True when Podman is available."""
|
|
211
|
+
|
|
212
|
+
return ContainerEnv.detect_engine() == "podman"
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def is_docker_env() -> bool:
|
|
216
|
+
"""判断是否为 Docker 环境 / Return True when Docker is available."""
|
|
217
|
+
|
|
218
|
+
return ContainerEnv.detect_engine() == "docker"
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cancan-microstack
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Controllersrv/Infrasrv/Opsbffsrv bundle with compose tooling
|
|
5
|
+
Author-email: Victor Lai <victor.lai@foxmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/10000ms/cancan_microstack
|
|
8
|
+
Project-URL: Repository, https://github.com/10000ms/cancan_microstack
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/10000ms/cancan_microstack/issues
|
|
10
|
+
Keywords: fastapi,microservices,docker,compose,orchestration,workflow,ops
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: System Administrators
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
22
|
+
Classifier: Topic :: System :: Systems Administration
|
|
23
|
+
Classifier: Framework :: FastAPI
|
|
24
|
+
Classifier: Framework :: AsyncIO
|
|
25
|
+
Classifier: Typing :: Typed
|
|
26
|
+
Requires-Python: >=3.10
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: pyyaml<7.0.0,>=6.0.0
|
|
30
|
+
Requires-Dist: bcrypt<6.0.0,>=4.0.0
|
|
31
|
+
Requires-Dist: pyotp<3.0.0,>=2.9.0
|
|
32
|
+
Requires-Dist: Pillow<13.0.0,>=10.0.0
|
|
33
|
+
Requires-Dist: nanoid<4.0.0,>=2.0.0
|
|
34
|
+
Requires-Dist: redis[hiredis]<9.0.0,>=5.0.0
|
|
35
|
+
Requires-Dist: cryptography<50.0.0,>=41.0.0
|
|
36
|
+
Requires-Dist: qrcode<9.0.0,>=7.4.0
|
|
37
|
+
Requires-Dist: jinja2<4.0.0,>=3.1.0
|
|
38
|
+
Requires-Dist: geoip2<6.0.0,>=4.7.0
|
|
39
|
+
Requires-Dist: jmespath<2.0.0,>=1.0.0
|
|
40
|
+
Requires-Dist: dragonfly-container[all]>=0.0.1
|
|
41
|
+
Requires-Dist: linglong-web[all]>=0.0.1
|
|
42
|
+
Provides-Extra: dev
|
|
43
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
44
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
45
|
+
Dynamic: license-file
|
|
46
|
+
|
|
47
|
+
# Cancan Microstack
|
|
48
|
+
|
|
49
|
+
[](https://pypi.org/project/cancan-microstack/)
|
|
50
|
+
[](https://www.python.org/downloads/)
|
|
51
|
+
[](LICENSE)
|
|
52
|
+
|
|
53
|
+
可嵌入的基础设施微服务栈:把一整套基础设施微服务(`controllersrv` / `infrasrv` / `opsbffsrv`)连同 Docker Compose 编排、DDL、运维前端与统一 CLI,打包成**一个可 pip 安装的 Python 库**,让业务仓库“只写业务代码”。
|
|
54
|
+
|
|
55
|
+
An embeddable infrastructure microstack: bundle a complete set of infrastructure microservices (`controllersrv` / `infrasrv` / `opsbffsrv`) — together with Docker Compose orchestration, DDL, an ops UI and a unified CLI — into **a single pip-installable Python library**, so your product repo contains business logic only.
|
|
56
|
+
|
|
57
|
+
> 📖 **完整文档 / Full documentation**:[`docs/index.html`](docs/index.html) — 双语、含架构原理、CLI 参考与使用说明。
|
|
58
|
+
> Bilingual docs with architecture, CLI reference and guides.
|
|
59
|
+
|
|
60
|
+
> **定位 / Positioning**:本库只包含**通用基础设施能力**;具体业务服务与逻辑应留在你自己的业务仓库。
|
|
61
|
+
> This library contains **generic infrastructure capabilities only**; your business services and logic stay in your own product repo.
|
|
62
|
+
|
|
63
|
+
## 特性 / Features
|
|
64
|
+
|
|
65
|
+
- 🛠️ **统一 CLI / Unified CLI**:`cancan` 命令提供 `assets` / `compose` / `services` / `stack` 子命令。
|
|
66
|
+
- 🔀 **Compose 构建器 / Compose builder**:把内置 infra compose 与业务 compose、override 深度合并成一个可运行栈。
|
|
67
|
+
Deep-merge the built-in infra compose with your services compose and overrides into one runnable stack.
|
|
68
|
+
- 🔌 **免 Fork 覆盖 / Fork-free overrides**:用 `cancan_overrides/` 只替换你想改的文件,其余复用库实现。
|
|
69
|
+
- 🖥️ **内置运维前端 / Bundled ops UI**:随库附带 adminops UI 构建产物,可导出由 Caddy 挂载。
|
|
70
|
+
- 🗄️ **自管理 DDL / Self-managed DDL**:infra/ops 数据库表随服务启动自动初始化。
|
|
71
|
+
- ♻️ **整栈生命周期 / Full-stack lifecycle**:`stack up/down/status` 同时管理宿主机进程与容器栈。
|
|
72
|
+
|
|
73
|
+
构建于已发布的姊妹库之上 / Built on published sibling libraries:[`linglong-web`](https://pypi.org/project/linglong-web/) · [`dragonfly-container`](https://pypi.org/project/dragonfly-container/)。
|
|
74
|
+
|
|
75
|
+
## 快速开始 / Quick Start
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 1. 安装 / Install
|
|
79
|
+
pip install cancan-microstack
|
|
80
|
+
|
|
81
|
+
# 2. 脚手架:生成最小可跑工作区(业务 compose 样例 + .env + overrides 骨架)
|
|
82
|
+
# Scaffold a minimal workspace (services compose sample + .env + overrides skeleton)
|
|
83
|
+
cancan init
|
|
84
|
+
|
|
85
|
+
# 3. 预检环境(容器引擎 / 端口 / 配置 / 弱默认值)
|
|
86
|
+
# Pre-flight checks (engine / ports / config / weak defaults)
|
|
87
|
+
cancan doctor
|
|
88
|
+
|
|
89
|
+
# 4. 一键启动整套集群(推荐)/ Bring up the whole stack
|
|
90
|
+
# 生成 compose.cancan.yml、bootstrap 运行文件、宿主机起 controllersrv、容器栈 up
|
|
91
|
+
cancan stack up --workspace . --service-file docker-compose.services.yml
|
|
92
|
+
|
|
93
|
+
# 5. 状态 / 关闭 — status / teardown
|
|
94
|
+
cancan stack status --workspace .
|
|
95
|
+
cancan stack down --workspace .
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
> 安装即提供 `cancan` 命令;也可用 `python -m cancan_microstack.cli ...`。
|
|
99
|
+
> Installing provides the `cancan` command; `python -m cancan_microstack.cli ...` works too.
|
|
100
|
+
>
|
|
101
|
+
> 运行容器栈需要 Docker 或 Podman。 / Running the stack requires Docker or Podman.
|
|
102
|
+
|
|
103
|
+
> ⚠️ **生产安全 / Production safety**:凭据与密钥集中在工作区 `.env`(`cancan init` 会生成,并自动写入一个唯一的 TOTP 加密 key)。其中数据库等使用本地开发弱默认值(如 `admin123`)以便开箱即用。**生产部署务必在 `.env` 里改成真实凭证;`cancan doctor` 会提示仍在使用的弱默认值。**
|
|
104
|
+
> Credentials & secrets live in the workspace `.env` (created by `cancan init`, with a unique TOTP encryption key auto-generated). Databases use weak local-dev defaults (e.g. `admin123`) for out-of-the-box use. **In production, set real secrets in `.env`; `cancan doctor` flags any weak defaults still in use.**
|
|
105
|
+
|
|
106
|
+
## CLI 速览 / CLI at a glance
|
|
107
|
+
|
|
108
|
+
| 命令 / Command | 作用 / Purpose |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| `cancan init` | 脚手架最小可跑工作区 / scaffold a minimal runnable workspace |
|
|
111
|
+
| `cancan doctor` | 起栈前环境/配置预检 / pre-flight environment & config checks |
|
|
112
|
+
| `cancan assets list [subdir]` | 列出内置资产 / list bundled assets |
|
|
113
|
+
| `cancan assets export <name> <dest> [--overwrite]` | 导出资产到工作区 / export an asset to the workspace |
|
|
114
|
+
| `cancan compose build [--service-file …] [--override …]` | 合成 `compose.cancan.yml` / synthesize the stack file |
|
|
115
|
+
| `cancan services run <name> [--host] [--port]` | 前台运行内置服务 / run a bundled service in the foreground |
|
|
116
|
+
| `cancan stack up/down/status` | 整栈生命周期(宿主机进程 + 容器栈)/ full-stack lifecycle |
|
|
117
|
+
|
|
118
|
+
完整参数与原理见 [`docs/index.html`](docs/index.html)。 / Full options and design in the docs.
|
|
119
|
+
|
|
120
|
+
## 内置服务 / Bundled services
|
|
121
|
+
|
|
122
|
+
| 服务 / Service | 职责 / Responsibility |
|
|
123
|
+
| --- | --- |
|
|
124
|
+
| `controllersrv` | 宿主机进程,封装 Docker/Podman 容器操作(基于 `dragonfly-container`)/ host process managing containers |
|
|
125
|
+
| `infrasrv` | 服务注册、工作流引擎与调度、日志采集、健康检查 / registry, workflow, log ingestion, health checks |
|
|
126
|
+
| `opsbffsrv` | 运维 BFF:为 adminops 前端聚合接口(认证 / Caddy / DB / 日志)/ ops BFF for the admin UI |
|
|
127
|
+
|
|
128
|
+
服务配置基于 `linglong-web`,资源(PostgreSQL / Redis / MongoDB / RabbitMQ / Celery)由其统一编排。
|
|
129
|
+
Services are configured via `linglong-web`, which orchestrates the backing resources.
|
|
130
|
+
|
|
131
|
+
## 免 Fork 覆盖 / Fork-free overrides
|
|
132
|
+
|
|
133
|
+
在工作区放一个 `cancan_overrides/<service>/` 目录,只放你要替换的文件,运行时会优先加载它,其余仍复用库实现(也可用环境变量 `CANCAN_OVERRIDE_ROOT` 指定)。
|
|
134
|
+
|
|
135
|
+
Drop a `cancan_overrides/<service>/` directory in your workspace with only the files you want to replace; it is loaded with priority at runtime while the rest falls back to the library (or point at it via `CANCAN_OVERRIDE_ROOT`).
|
|
136
|
+
|
|
137
|
+
## 运维前端(adminops)/ The adminops UI
|
|
138
|
+
|
|
139
|
+
库内**只包含前端的构建产物**(`assets/www/adminops/`),不含前端源码。前端源码在独立仓库维护;更新流程:在前端源码仓构建(`pnpm build`)→ 把 `dist` 产物覆盖到 `assets/www/adminops/` → 重新发布本库。
|
|
140
|
+
|
|
141
|
+
This library ships **only the built frontend artifacts** (`assets/www/adminops/`), not the frontend source. The UI source lives in a separate repository; to update: build in the source repo (`pnpm build`) → copy the `dist` output into `assets/www/adminops/` → re-release this library.
|
|
142
|
+
|
|
143
|
+
## 开发 / Development
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
git clone https://github.com/10000ms/cancan_microstack.git
|
|
147
|
+
cd cancan_microstack
|
|
148
|
+
python -m venv .venv && . .venv/bin/activate
|
|
149
|
+
pip install -e ".[dev]"
|
|
150
|
+
pytest
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 许可证 / License
|
|
154
|
+
|
|
155
|
+
MIT License © 2026 Victor Lai
|