VxCloud
🐳Intermediate10 minContainers

Custom Service — write any docker-compose.yml

Deploy any Compose stack to your node. Start from one of 20+ built-in templates (Postgres, Redis, Kafka, ELK, n8n, Mattermost, Vault…) or paste your own YAML in a full Monaco editor.

What you'll build

  • An arbitrary multi-service Compose stack running on your node
  • A reusable template as a starting point instead of a blank file
  • A .env file kept out of the YAML and out of Git

Before you begin

  • A registered node with Docker (installed by the node agent)
  • A docker-compose.yml — or a template you want to start from
  • Any private-registry credentials, if your images aren’t public
1

Open the Custom Service wizard

Go to Development → Deploy → Custom Service. Step 1 is the target node. Step 2 is an optional Docker registry login — fill it only if you pull private images.

app.prodxcloud.com/dashboard/development

Custom Service — Server configuration

1
2
3
4
138.199.144.21
ubuntu
default (from Vault)▾
Steps 1–2 — node + (optional) registry auth.
2

Start from a template (or paste YAML)

Step 3 is a full Monaco editor with YAML highlighting and a template picker. Choosing a template drops a working, opinionated stack into the editor that you can tweak.

app.prodxcloud.com/dashboard/development
Postgres + pgAdmin
Redis
Kafka + ZK
ELK
n8n
Mattermost
Vault
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: [pgdata:/var/lib/postgresql/data]
  pgadmin:
    image: dpage/pgadmin4
    ports: ["5050:80"]
volumes: { pgdata: {} }
Step 3 — pick a template, then edit live. The same Monaco editor used across the dashboard.

20+ templates ship in the box

Databases (Postgres, MySQL, Mongo), cache (Redis), messaging (Kafka), observability (ELK, Prometheus), dev tools (n8n, Mattermost, Vault, Traefik) and more — all maintained alongside the product.
3

Keep secrets in the .env, not the YAML

Step 4 sets the stack name and a separate environment file. Reference variables in the Compose file with ${VAR} and put the values here — they stay out of the YAML you might commit.

app.prodxcloud.com/dashboard/development

Custom Service — Stack settings

4
data-platform
DB_PASSWORD=changeme-strong [email protected]
2 cores / 4 GB / 40 GB
Step 4 — the .env is applied at compose-up; the YAML stays free of literals.
4

Deploy the stack

Deploy submits to POST /api/v2/tenant/provision/docker-compose/custom with your YAML, stack name, and node details. The agent runs docker compose up -d on the box and streams the result.

Deployment progress100%
  • Validate compose YAML20%
  • Pull images (registry auth if set)55%
  • Apply .env + docker compose up -d85%
  • Containers healthy100%
Invalid YAML is caught before anything runs on the node.
bash
$ ssh ubuntu@<node-ip> "docker compose -p data-platform ps"NAME                 STATUS         PORTSdata-platform-db-1   Up (healthy)   5432/tcpdata-platform-pga-1  Up             0.0.0.0:5050->80/tcp

Any stack, your node

If it runs in Compose, it runs here. For a managed, backed-up Postgres specifically, prefer the MetalDB tutorial over a raw Postgres container.

Nice work — you're done!

You completed Custom Service — write any docker-compose.yml. Keep the momentum going with the next walkthrough, or jump back to the full catalog.