From ct
Provides deep operational guidance for Coolify v4 self-hosted PaaS: control-plane/destination split, build-pack detection, env-var precedence, Traefik label generation, webhooks, preview deployments, backups, and upgrade/rollback.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ct:coolifyThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Concise operational pointers for Coolify v4 self-hosted PaaS troubleshooting and tuning.
Concise operational pointers for Coolify v4 self-hosted PaaS troubleshooting and tuning.
Assumes you already know Docker, docker-compose, Traefik basics, and Postgres basics. This skill covers the Coolify-specific layer — the parts models tend to gloss over or hallucinate: the control-plane/destination split, build-pack quirks, env-var precedence, magic SERVICE_* vars, Traefik label generation, deploy-webhook semantics, persistent-storage layout, and the upgrade/rollback path.
Load when the question is about:
SERVICE_* generation, shared-variable scopes/api/v1/deploy endpoint (force, pr, tag, uuid){{pr_id}}/{{random}})/data/coolify/ and Compose is_directory: / content: sugar-Fc vs plain on cross-version upgrade)install.sh -s <version>, auto-update toggle, instance restore (APP_KEY, APP_PREVIOUS_KEYS)Do NOT load for: writing Dockerfiles, vanilla docker-compose.yml syntax, generic Traefik routing, generic CI/CD pipeline design — those don't need this skill.
coolify-proxy Traefik container by default).root@~/.ssh/authorized_keys. Docker Engine 24+ required on every destination (server prerequisites).docker-compose.yml Coolify renders. Different UI tabs, different env-var handling rules.Coolify ships exactly four build packs (overview):
nixpacks.toml/nixpacks.json at repo root for install/build/start command overrides. Build args injected from Coolify env-vars marked "Build Variable."Dockerfile from the repo. Build args auto-injected by default — disable in Advanced if you want to manage ARGs manually. Network-port field must match the port the container actually LISTENs on (0.0.0.0, not 127.0.0.1); mismatch yields a Traefik No available server error (Dockerfile pack).docker-compose.yml is the source of truth for env, ports, volumes, healthchecks. Remove any user-defined networks: — Coolify injects its own bridge for Traefik routing; custom networks cause intermittent 502s (compose pack). Rolling updates not supported with Compose (static container names — see "Deployments" below)./dist, /out, /build). Custom Nginx config via the Generate button + edit (static pack).ARG / build-arg / --env-file to BuildKit) and Runtime Variable (written to a .env file at deploy and loaded by docker compose --env-file). Both default on. Disable build to keep secrets out of image layers (env vars).docker history — use this in preference to --build-arg for tokens.$, e.g. P@ss$word123.COOLIFY_FQDN, COOLIFY_URL, COOLIFY_BRANCH, COOLIFY_RESOURCE_UUID, COOLIFY_CONTAINER_NAME, plus SOURCE_COMMIT, PORT, HOST. Available at runtime in every container.{{team.VAR}}, {{project.VAR}}, {{environment.VAR}}. Resource-level wins over scoped — set the override on the resource, not by editing the team scope.SERVICE_<TYPE>_<IDENTIFIER> (compose docs):
SERVICE_FQDN_<NAME> — full host (e.g. api-x9fk2.example.com)SERVICE_URL_<NAME>_<PORT> — full URL with optional path-prefix routingSERVICE_PASSWORD_<NAME> / SERVICE_PASSWORD_64_<NAME> — generated, persisted, reused across redeploysSERVICE_USER_<NAME> — random 16-char stringSERVICE_BASE64_<NAME> — random base64{{random}} (random subdomain) or {{pr_id}} (PR number) — wildcard DNS required. Preview env-vars are a separate scope from production — production secrets do not leak to PR builds. Auto-cleaned on PR close/merge (preview-deploy).POST /api/v1/deploy with bearer token (Keys & Tokens → API tokens). Query params: uuid (CSV), tag (CSV), force=true|false (skip build cache), pr / pull_request_id (preview), docker_tag (preview only). pr is mutually exclusive with tag (deploy endpoint).HEALTHCHECK instruction. Container needs curl or wget — Alpine images often need apk add --no-cache curl for the UI mode to work. Compose-pack services must use the compose-file healthcheck: attribute. Set exclude_from_hc: true on one-shot migration services (health checks).Coolify ships Traefik as the default proxy on the control plane and on every destination (proxy overview). Caddy is supported but marked experimental (supported proxies).
Host()), entry-points, TLS resolver (letsencrypt), service loadbalancer port. Read-only labels mode (default) means the UI controls them — your custom labels merge on top via the Container Labels field.https://app.example.com and Coolify auto-issues a Let's Encrypt cert; enter http://... and no TLS is requested — useful when sitting behind another proxy that terminates TLS (domains). Multiple domains: comma-separated. Path-based routing supported (https://example.com/api).1.1.1.1 (override in Settings → Advanced). A misconfigured DNS will fail the Check DNS step before any cert request.redirectregex middleware in custom labels (redirects).coolify-proxy will not start if 80/443 is occupied — even if you've configured the proxy to listen on different ports (issue #6234). To run Coolify behind another reverse proxy, edit /data/coolify/proxy/docker-compose.yml, change host ports to e.g. 5080/5443, restart, and set FQDNs as http://... (let the outer proxy do TLS).http:// — using https:// causes loops. For TCP services (SSH, raw TCP databases) the cloudflared connector must run with network_mode: host or be deployed as a separate TCP-mode application (Cloudflare tunnels)./data/coolify/ on the destination host — applications, databases, ssh keys, proxy config, backups (backup/restore)./data/coolify/applications/<uuid>/. The Storages tab in the UI is the source of truth — adding a volume there modifies the generated compose.docker-compose.yml. Coolify-specific sugar:
is_directory: true — pre-create as a directory, not a file (default behavior is "guess from path")content: | — inline file content, supports ${VAR} interpolation. Useful for config files generated at deploy time.pg_dump -Fc (custom format); MySQL → mysqldump; MariaDB → mariadb-dump; MongoDB → mongodump --gzip. Redis/KeyDB/Dragonfly use their respective dumpers; Clickhouse uses backup tables.pg_restore — only valid for -Fc files. For cross-version upgrades (e.g. PG 14 → PG 16), -Fc is fragile — use plain or tar format on dump and switch the import command to psql (Postgres docs)./data/coolify/databases/<uuid>/ on the destination — back this up at the filesystem level if you need consistency-with-WAL recovery rather than logical dump.POSTGRES_USER/PASSWORD/DB, Mongo exposes MONGO_INITDB_ROOT_USERNAME/PASSWORD. Don't assume parity.cdn.coollabs.io periodically and self-installs new versionscurl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash (no version → latest)... | bash -s 4.0.0-beta.<N>. Disable auto-update first or you'll be re-upgraded next cycle (downgrade).APP_KEY from /data/coolify/source/.env (encrypts secrets at rest), the SSH keys at /data/coolify/ssh/keys/ (or your destinations become unreachable), and the Postgres backup of the Coolify DB. Set APP_PREVIOUS_KEYS=<old_key> in the new install's .env to decrypt secrets encrypted under the old key. Without all three you'll hit decryption or SSH auth errors (instance backup/restore).apt/dnf/zypper) — manual click only, never auto-applies. Docker package updates restart Docker, briefly killing every container including Coolify itself (server patching)./api/v1, bearer-token auth (Keys & Tokens → API tokens). Must enable API Access in Settings → Configuration → Advanced first. Resources exposed: applications, services, servers, deployments, projects, teams, environment variables, private keys, databases.coolify-cli: separate Go binary, installable via brew install coollabsio/coolify-cli/coolify-cli or go install github.com/coollabsio/coolify-cli/coolify@latest (repo). Multi-context (cloud + multiple self-hosted in one config). Authenticate with coolify context add (self-hosted) / coolify context set-token cloud <token>. Same surface as the API — apps, services, servers, deployments, env vars, GitHub Apps.restart: always in your compose combined with rolling-update conditions: rolling update needs to spawn a sibling, but a host-port mapping in the compose blocks it. Drop the host port and let Traefik do the routing.http:// while debugging DNS, switch back to https:// once 1.1.1.1 resolves correctly.<name>-new. If you renamed via compose container_name:, the rename collides.force=false on deploy still rebuilds for some pack/state combinations — known issue #8104. Don't trust the param to cache reliably; treat any deploy as a potential full rebuild.Coolify docs (coolify.io/docs):
COOLIFY_*SERVICE_FQDN_*, SERVICE_PASSWORD_*Source / release tracking:
Before recommending a non-trivial change (proxy switch, upgrade across ≥10 betas, DB engine version bump, restore from backup):
Verify version: Coolify is fast-moving; check the docs/CHANGELOG before recommending any specific UI path or API field. UI labels, API params (e.g. force semantics, issue #8104), and even default packs (Static gained Nginx-only mode at beta.402; Swarm deprecated at beta.474) shift between betas. Anchor every recommendation on a freshly read doc page or release note.
npx claudepluginhub pvillega/claude-templates --plugin ctManages Coolify deployments, applications, databases, and services via the Coolify API. Useful for deploying, starting, stopping, restarting, and monitoring applications on Coolify.
Provides quick reference for Fly.io PaaS deployments including fly.toml config, global distribution, scaling patterns, secrets management, health checks, and troubleshooting. Auto-loads on fly.toml detection.
Deploys and manages infrastructure on Northflank: projects, services, jobs, databases, secrets, domains, environments, pipelines, and templates. Use when interacting with the Northflank API, CLI, or JS client.