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.
| Field | Type | Required | Notes |
|---|
context | string | yes | Path within the repo, relative to the repo root (e.g. ., ./api). |
dockerfile | string | no | Path to the Dockerfile, relative to context. Defaults to Dockerfile. |
args | map | no | Build 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.
| Field | Type | Required | Notes |
|---|
port | int | yes | Container port (1–65535). |
public | bool | no | If true, exposed via Ingress at <prefix>-<dep-id>.<apps-base>. |
prefix | string | no | URL prefix for the public hostname. Defaults to the service name. Must match ^[a-z][a-z0-9-]{0,30}$. |
domain | string | no | Verified 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
| Field | Type | Required | Notes |
|---|
cpu | string | yes | Kubernetes CPU quantity. e.g. "500m", "2". |
memory | string | yes | Kubernetes memory quantity. e.g. "512Mi", "2Gi". |
disk | string | no | Ephemeral 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.