Make the role work identically under both execution models: - local/pull (curl|bash -> ansible-playbook -c local; localhost == host) - remote controller (ansible-playbook -i inventory over ssh; tasks run on host) Changes: - Remove ALL delegate_to: localhost (the old raw 'command: rsync' detected local-vs-remote via ansible_connection, but delegate_to localhost forced it to 'local', so the user@host push branch was dead code -> remote runs wrote to the controller's /root and failed). - Acquire xworkspace-core-skills via ansible.builtin.git clone ON THE HOST (most universal/cross-platform), instead of requiring a controller-side dir. - Merge core skills into the canonical dir with ansible.builtin.copy (remote_src, host-local) instead of raw rsync; installer adapters install directly into the canonical dir on the host. - Drop rsync-only vars/excludes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| deepflow/deepflow-agent-playbook | ||
| docs | ||
| examples | ||
| group_vars | ||
| host_vars | ||
| inventory | ||
| roles | ||
| scripts | ||
| skills/release-branch-policy | ||
| vars | ||
| .gitignore | ||
| .gitleaksignore | ||
| alicloud_dns_record.yml | ||
| alicloud_dns_sync.yml | ||
| ansible.cfg | ||
| api.plist.j2 | ||
| apply-branch-protection.yml | ||
| bootstrap_cloud_dev_desktop.yml | ||
| common | ||
| common_setup.yml | ||
| console.plist.j2 | ||
| create_audit_user.yml | ||
| create_readonly_ssh_user.yml | ||
| deploy_accounts_svc_plus.yml | ||
| deploy_acp_codex_vhosts.yml | ||
| deploy_acp_gemini_vhosts.yml | ||
| deploy_acp_opencode_vhosts.yml | ||
| deploy_agent_hermes.yml | ||
| deploy_agent_svc_plus.yml | ||
| deploy_apisix_svc.plus.yaml | ||
| deploy_apisix.yml | ||
| deploy_billing_service.yml | ||
| deploy_blackbox_exporters_vhosts.yml | ||
| deploy_console_svc_plus.yml | ||
| deploy_deepflow_agent | ||
| deploy_docs_svc_plus.yml | ||
| deploy_exporters_vhosts.yml | ||
| deploy_gateway_openclaw.yml | ||
| deploy_grafana_docker.yaml | ||
| deploy_modern_it_history.yml | ||
| deploy_monitor_server.yml | ||
| deploy_neurapress_docker.yaml | ||
| deploy_nginx_vhosts.yml | ||
| deploy_nodejs_vhosts.yml | ||
| deploy_OpenObserve_docker.yaml | ||
| deploy_openresty_vhosts.yml | ||
| deploy_otel_docker.yaml | ||
| deploy_postgre_vhosts.yml | ||
| deploy_postgresql_svc_plus.yml | ||
| deploy_QMD.yml | ||
| deploy_redis_vhosts.yml | ||
| deploy_stunnel-client.yml | ||
| deploy_svc_plus_core_services_stack.yml | ||
| deploy_svc_plus_extended-services.yml | ||
| deploy_Tempo_docker.yaml | ||
| deploy_tiny_monitor_server_vhost.yml | ||
| deploy_vhosts_otel-collector.yml | ||
| deploy_VictoriaLogs_docker.yaml | ||
| deploy_VictoriaMetrics_docker.yaml | ||
| deploy_xcontrol_dashboard.yml | ||
| deploy_xcontrol_server._vhosts.yml | ||
| deploy_xray_exporter.yml | ||
| deploy_xworkmate_bridge_vhosts.yml | ||
| deploy_zitadel_docker.yaml | ||
| deploy-docker-harbor.yml | ||
| deploy-docker-keycloak.yml | ||
| destroy_cloud_dev_desktop.yml | ||
| gnome_xrdp_minimal.yaml | ||
| gpu_inference_01_prepare.yml | ||
| gpu_inference_02_sealos.yml | ||
| gpu_inference_03_gpu_operator.yml | ||
| gpu_inference_04_ray.yml | ||
| gpu_inference_05_vllm.yml | ||
| gpu_inference_site.yml | ||
| gpu_k8s_init.yml | ||
| gpu_k8s_reset.yml | ||
| harden_ssh_root_key_only.yml | ||
| init_chaos_mesh | ||
| init_chartmuseum | ||
| init_deepflow | ||
| init_flagger-loadtester | ||
| init_gitlab | ||
| init_grafana_alloy | ||
| init_harbor_server | ||
| init_jenkins | ||
| init_k3s_cluster_agent | ||
| init_k3s_cluster_server | ||
| init_k3s_cluster_std | ||
| init_k3s_cluster_with_argo_server | ||
| init_observability-agent | ||
| init_observability-server | ||
| init_openldap | ||
| init_splunk-otel-collector | ||
| init_telegraf | ||
| init_vault | ||
| init_vpn_gateway.yml | ||
| init-harbor-server | ||
| inventory.ini | ||
| k3s_platform_addon.yml | ||
| k3s_platform_bootstrap_with_gitops.yml | ||
| k3s_reset.yml | ||
| k3s-cluster.yaml | ||
| keycloak_server | ||
| LICENSE | ||
| plasma_xrdp_minimal.yaml | ||
| pre_setup.sh | ||
| README.md | ||
| renew_nodes_ssl_certs | ||
| setup-ai-agent-skills.yml | ||
| setup-ai-workspace-all-in-one.yml | ||
| setup-ai-workspace-backup.yml | ||
| setup-ai-workspace-migration.yml | ||
| setup-ai-workspace-preflight.yml | ||
| setup-ai-workspace-restore.yml | ||
| setup-ai-workspace-runtime.yml | ||
| setup-caddy.yml | ||
| setup-docker.yml | ||
| setup-litellm.yaml | ||
| setup-nextjs.yml | ||
| setup-nodejs.yml | ||
| setup-postgres-standalone.yaml | ||
| setup-python3.yml | ||
| setup-root-authorized-key.yml | ||
| setup-vault.yaml | ||
| setup-xfce-xrdp.yaml | ||
| setup-xworkspace-console.yaml | ||
| test.yml | ||
| ttyd.plist.j2 | ||
| update_cloudflare_dns.yml | ||
| update_cloudflare_svc_plus_dns.yml | ||
| vpn-overlay-dnat.yaml | ||
| vpn-overlay-vxlan-hub.yaml | ||
| vpn-overlay-vxlan-site.yaml | ||
| vpn-wireguard-hub.yaml | ||
| vpn-wireguard-over-vless.yml | ||
| vpn-wireguard-site.yaml | ||
| vpn-xray-client.yaml | ||
| vpn-xray-hub.yaml | ||
| vpn-xray-tproxy.yaml | ||
| wireguard_ali_vpn_gw | ||
| wireguard_client | ||
| wireguard_gateway | ||
| xworkspace_console_macos.yml | ||
playbooks
XWorkmate Bridge Distributed VPN
The bidirectional WireGuard-over-VLESS transport for the two XWorkmate bridge nodes is deployed by:
ansible-playbook -i inventory.ini vpn-wireguard-over-vless.yml
The implementation uses split bridge groups (xworkmate_bridge and
cn_xworkmate_bridge) under xworkmate_bridge_distributed, stores private keys
and the shared management-side Xray UUID in https://vault.svc.plus, and keeps
the host's default xray.service untouched. The runbook lives in
roles/vhosts/xworkmate_bridge_distributed_vpn/README.md.
Cloud Dev Desktop
The cloud dev desktop flow lives here as two playbooks:
bootstrap_cloud_dev_desktop.ymldestroy_cloud_dev_desktop.yml
bootstrap_cloud_dev_desktop.yml now includes the create/bootstrap/verify sequence in one entry point. The control-plane repo calls these playbooks from ../playbooks.
Traffic Billing Stack
The traffic billing stack now has a single aggregate playbook:
deploy_svc_plus_core_services_stack.yml
It orchestrates these existing playbooks in dependency order:
deploy_billing_service.ymldeploy_xworkmate_bridge_vhosts.ymldeploy_xray_exporter.ymldeploy_agent_svc_plus.ymldeploy_accounts_svc_plus.ymldeploy_stunnel-client.ymldeploy_apisix.ymldeploy_console_svc_plus.yml
Full stack deploy
cd /Users/shenlan/workspaces/cloud-neutral-toolkit/playbooks
export INTERNAL_SERVICE_TOKEN=...
export DATABASE_URL=postgres://...
export FRONTEND_IMAGE=ghcr.io/x-evor/dashboard:latest
export STACK_TARGET_HOST=jp_xhttp_contabo_host
export console_service_sync_dns=true
ansible-playbook -i inventory.ini deploy_svc_plus_core_services_stack.yml
STACK_ENV_FILE=./.env is optional. Use it when you want the aggregate playbook to read a local .env file; GitHub Actions or other CI runners can skip it and pass values with -e instead.
Deploy to one target host directly
Use STACK_TARGET_HOST to override the stack host groups when you want all services to target the same inventory host. For console-only runs, use Ansible's -l jp_xhttp_contabo_host limit instead of a separate host variable, and keep console_service_sync_dns=true if you want DNS reconciliation.
cd /Users/shenlan/workspaces/cloud-neutral-toolkit/playbooks
export STACK_TARGET_HOST=jp_xhttp_contabo_host
export INTERNAL_SERVICE_TOKEN=...
export DATABASE_URL=postgres://...
export FRONTEND_IMAGE=ghcr.io/x-evor/dashboard:latest
export console_service_sync_dns=true
ansible-playbook -i inventory.ini -l jp_xhttp_contabo_host deploy_svc_plus_core_services_stack.yml
Deploy only selected services
Use STACK_SERVICES with a comma-separated list:
billing-servicexworkmate-bridgexray-exporteragentaccountsstunnel-clientapisixconsole
cd /Users/shenlan/workspaces/cloud-neutral-toolkit/playbooks
export STACK_TARGET_HOST=jp-xhttp-contabo.svc.plus
export STACK_SERVICES=xray-exporter,billing-service,agent,xworkmate-bridge
export INTERNAL_SERVICE_TOKEN=...
export DATABASE_URL=postgres://...
ansible-playbook -i inventory.ini -l jp_xhttp_contabo_host deploy_svc_plus_core_services_stack.yml
Notes
accountsandconsolestill use their existing role contracts.consolerequiresFRONTEND_IMAGEbecause the target host only does pull-only compose deployment.consolenow writes a Caddy fragment named like<server-name>-<release_id>-<hostname>-<domain>.caddyinstead of managing the Caddy service container itself.billing-servicerequiresDATABASE_URL.xray-exporterandagentrequireINTERNAL_SERVICE_TOKEN.xworkmate-bridgeacceptsXWORKMATE_BRIDGE_HOSTS, and also followsSTACK_TARGET_HOSTwhen you want to deploy the whole stack to one host.
Deploy console to a specific host and sync DNS
deploy_console_svc_plus.yml now accepts console_service_sync_dns=true to rebuild and reconcile DNS records after deployment. For host selection, use Ansible's -l jp_xhttp_contabo_host limit.
Example:
cd /Users/shenlan/workspaces/cloud-neutral-toolkit/playbooks
ansible-playbook -i inventory.ini deploy_console_svc_plus.yml \
-e console_service_sync_dns=true \
-e FRONTEND_IMAGE=ghcr.io/x-evor/dashboard:latest