Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.slipway.sh/llms.txt

Use this file to discover all available pages before exploring further.

Static site or single-binary web app

slipway.yaml
version: 1

services:
  web:
    build:
      context: .
    ports:
      - { port: 3000, public: true }
    env:
      NODE_ENV: production
    resources:
      cpu: "500m"
      memory: "512Mi"
    healthcheck:
      readiness: { http: { path: /api/health, port: 3000 } }

Web + worker (no public port for the worker)

slipway.yaml
version: 1

services:
  web:
    build:
      context: .
    ports:
      - { port: 3000, public: true }
    env:
      LOG_LEVEL: ${var.LOG_LEVEL}
      DATABASE_URL: ${secret.DATABASE_URL}
      REDIS_URL: ${secret.REDIS_URL}
    resources: { cpu: "500m", memory: "512Mi" }
    healthcheck:
      readiness: { http: { path: /healthz, port: 3000 } }

  worker:
    image: ghcr.io/acme/worker:1.2.3
    env:
      LOG_LEVEL: ${var.LOG_LEVEL}
      DATABASE_URL: ${secret.DATABASE_URL}
      REDIS_URL: ${secret.REDIS_URL}
    resources: { cpu: "500m", memory: "512Mi" }
    healthcheck:
      liveness: { exec: { command: [/usr/local/bin/worker-healthcheck] } }
web is reachable at web-<dep-id>.<apps-base>. worker has no ports — no Service, no Ingress, no readiness gate. DATABASE_URL and REDIS_URL resolve against the repo or org secret store (repo first, org fallback). You configure them under Repos → settings → Secrets or Settings → Secrets, never in this file.

Custom build args + private registry pull

slipway.yaml
version: 1

services:
  api:
    build:
      context: ./api
      dockerfile: Dockerfile.prod
      args:
        NPM_TOKEN: ${secret.NPM_TOKEN}
        BUILD_REV: ${var.BUILD_REV}
    ports:
      - { port: 8080, public: true }
    env:
      DATABASE_URL: ${secret.DATABASE_URL}
    resources: { cpu: "1", memory: "1Gi" }
    healthcheck:
      readiness: { tcp: { port: 8080 } }
      liveness:  { http: { path: /metrics, port: 8080 } }

  cache:
    image: ghcr.io/acme/private-cache:tag
    ports:
      - { port: 6379 }
    resources: { cpu: "200m", memory: "256Mi" }
cache pulls from a private registry. Configure the credentials once at the org level under Settings → Registries (see Private registries) — no per-service config is needed.

Custom domain for one public port

slipway.yaml
version: 1

services:
  web:
    build: { context: . }
    ports:
      - { port: 3000, public: true, domain: app.acme.com }
    resources: { cpu: "500m", memory: "512Mi" }
    healthcheck:
      readiness: { http: { path: /healthz, port: 3000 } }
app.acme.com must be a verified parent zone for the org (claim and verify it under Settings → Domains first — see Custom domains). The deployed URL becomes web-<dep-id>.app.acme.com for default-branch deploys, or web-pr-<n>.app.acme.com for PR previews.