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.

Every service produces one Kubernetes Deployment. If ports is set, slipway also creates a Service; for public: true ports, an Ingress. Service names match ^[a-z][a-z0-9-]{0,30}$ and must be unique within the spec.

build or image (exactly one required)

build

Build the service’s image from your repo.
FieldTypeRequiredNotes
contextstringyesPath within the repo, relative to the repo root (e.g. ., ./api).
dockerfilestringnoPath to the Dockerfile, relative to context. Defaults to Dockerfile.
argsmapnoBuild args (--build-arg).
services:
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
      args:
        NODE_ENV: development
        NPM_TOKEN: ${secret.NPM_TOKEN}
Builds are content-addressed: the image tag is derived from the commit SHA plus a hash of the build inputs (context, dockerfile, args). If a previous deploy on the same commit produced the same inputs, the build short-circuits and the cached image is reused.
Build-arg foot-gun. Passing a secret into build.args is safe at the pod-spec layer (slipway never echoes the value), but if your Dockerfile does RUN echo $TOKEN the value will be baked into the resulting image layer. Don’t put credentials into build args unless your Dockerfile discards them inside the same RUN step.

image

Use a prebuilt image instead of building.
services:
  redis:
    image: redis:7-alpine
For private registries, configure them at the org level under Settings → Registries — see Private registries. slipway assembles the kubelet pull-secret automatically; no per-service field needed.

ports

List of ports the container listens on. Empty or omitted means the service is a worker — no Service, no Ingress, no readiness gating on cutover.
FieldTypeRequiredNotes
portintyesContainer port (1–65535).
publicboolnoIf true, exposed via Ingress at <prefix>-<dep-id>.<apps-base>.
prefixstringnoURL prefix for the public hostname. Defaults to the service name. Must match ^[a-z][a-z0-9-]{0,30}$.
domainstringnoVerified custom parent zone (managed under Settings → Domains). Served at <prefix>-<dep-id>.<domain> instead of the platform’s apps domain.
ports:
  - { port: 3000, public: true }                # served at web-<dep-id>.<apps>
  - { port: 9000 }                              # internal-only
  - { port: 3001, public: true, domain: app.acme.com }
Only one public port per service is allowed today. If you need path-based routing across services, define each service separately and use a parent reverse-proxy in your repo.

env

Environment variables passed to the container. A plain map:
env:
  LOG_LEVEL: info
  DATABASE_URL: ${secret.DATABASE_URL}
  GREETING: "hello"
See Environment & secrets for the substitution syntax.

resources

FieldTypeRequiredNotes
cpustringyesKubernetes CPU quantity. e.g. "500m", "2".
memorystringyesKubernetes memory quantity. e.g. "512Mi", "2Gi".
diskstringnoEphemeral storage hint.
slipway applies a per-namespace ResourceQuota on top — see your org’s plan for the cap.

healthcheck

Per-phase probes — set any subset of startup, readiness, liveness. See Healthchecks for the full handler reference.
healthcheck:
  readiness: { http: { path: /ready,   port: 3000 } }
  liveness:  { http: { path: /healthz, port: 3000 } }
For portless services, readiness probes are optional. If you don’t set one, slipway considers the service ready as soon as the pod is Running.