Skills xcloud-docker-deploy
Deploy any project to xCloud hosting — auto-detects stack (WordPress, Laravel, PHP, Node.js, Next.js, NestJS, Python, Go, Rust), routes to native or Docker deployment, generates production-ready Dockerfile, docker-compose.yml, GitHub Actions CI/CD, and .env.example. Works from zero Docker setup.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/asif2bd/xcloud-docker-deploy" ~/.claude/skills/clawdbot-skills-xcloud-docker-deploy && rm -rf "$T"
skills/asif2bd/xcloud-docker-deploy/SKILL.mdxCloud Docker Deploy
Adapt any
docker-compose.yml to work with xCloud — a git-push Docker deployment platform.
How xCloud Works
git push → xCloud runs: docker-compose pull && docker-compose up -d
xCloud never runs
. Images must be pre-built in a public registry. SSL, reverse proxy, and domain routing are handled by xCloud — your stack must not duplicate them.docker build
Read
references/xcloud-constraints.md for the full ruleset before making changes.
Phase 0 — Detect Project Type First
Before anything else, scan the project directory for these files:
Read
DETECT.md for full detection rules. Quick routing:
| Found in project | Stack | Action |
|---|---|---|
or | WordPress | Read |
+ | Laravel | Read |
+ | Next.js | Docker path → use + |
(no framework config) | Node.js | Read |
(no artisan) | PHP | Read |
or | Python | Docker path → use |
| Go | Docker path — generate Dockerfile manually |
exists | Existing Docker | Proceed to Step 1 below |
(no compose) | Build-from-source | Generate compose → Scenario A below |
See
references/xcloud-deploy-paths.md for the Native vs Docker decision guide.
Step 1 — Detect Which Scenarios Apply
Inspect the provided
docker-compose.yml:
| Signal | Scenario |
|---|---|
or | A — Build-from-source |
| Caddy / Traefik / nginx-proxy service | B — Proxy conflict |
Multiple across services | B — Multi-port |
volume mount | B — External config |
Multiple services each with | C — Multi-service build |
, single port | Already compatible — verify port + env vars |
A compose file can trigger multiple scenarios simultaneously (handle A first, then B).
Scenario A — Build-from-Source
Read
for full details.references/scenario-build-source.md
What to do:
- Remove
directive from composebuild: - Replace
withimage:ghcr.io/OWNER/REPO:latest - Generate
using.github/workflows/docker-build.yml
templateassets/github-actions-build.yml - Generate
from all.env.example
references${VAR}
Deliverables:
- Modified
docker-compose.yml .github/workflows/docker-build.yml.env.example- xCloud Deploy Steps (see Output Format)
Scenario B — Proxy Conflict / Multi-Port / External Config
Read
for full details.references/scenario-proxy-conflict.md
What to do:
- Remove Caddy/Traefik/nginx-proxy service entirely
- Remove SSL labels and multi-port
from app services (replace withports:
)expose: - Add
service with inline config vianginx-router
blockconfigs: - Expose single port (default:
) for xCloud to proxy3080
Deliverables:
- Modified
withdocker-compose.yml
+nginx-router
blockconfigs: .env.example- xCloud Deploy Steps
Scenario C — Multi-Service Build
Read
for full details.references/scenario-multi-service-build.md
When multiple services have
build: directives (separate frontend + backend + worker):
What to do:
- For each service with
, create a separate GHCR image pathbuild: - Generate a matrix GitHub Actions workflow that builds all images in parallel
- Update compose to use all GHCR image references
Deliverables:
- Modified
(alldocker-compose.yml
removed)build:
(matrix strategy).github/workflows/docker-build.yml.env.example
Output Format
Always produce complete, copy-paste-ready output:
## Modified docker-compose.yml [full file] ## .github/workflows/docker-build.yml (Scenario A/C only) [full file] ## .env.example [full file] ## xCloud Deploy Steps 1. Push repo to GitHub 2. (Scenario A/C) Wait for GitHub Actions to build image — check Actions tab 3. Server → New Site → Custom Docker → connect repo 4. Exposed port: [PORT] 5. Env vars to add: [list from .env.example] 6. Deploy
Rules
- Never include
in the final compose — xCloud silently ignores itbuild: - Never expose database ports to host (remove
— use"5432:5432"
internally)expose: - Never include Caddy, Traefik, nginx-proxy, or Let's Encrypt config
- Always preserve
,environment:
,volumes:
, worker/sidecar serviceshealthcheck: - Always use
(internal) notexpose:
(host) for services behind nginx-routerports: - WebSockets? Add upgrade headers to nginx config (see proxy-conflict reference)
inline syntax requires Docker Compose v2.23+ — use heredocconfigs.content:
alternative if uncertaincommand:
Examples
See
examples/ for ready-made transformations:
— Caddy + multi-port app (Scenario B)examples/rybbit-analytics.md
— build-from-source (Scenario A)examples/custom-app-dockerfile.md
— multi-service build (Scenario C)examples/fullstack-monorepo.md