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.
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
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.ymlSTACK_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.
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.ymlUse 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.ymlaccountsandconsolestill 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_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