The deploy is green but the URL returns 403
Your framework rejected the request’sHost header. slipway records a
public_host_rejected event on the deployment, with the service and the host that was
refused. The deploy stays healthy, because the container is running correctly and is
refusing the request on purpose.
Add the service’s hostname to your framework’s allowed-hosts setting.
slipway.yaml
The deploy is green but the URL returns 404
For a static site,publish: is probably pointing at the wrong directory. It is
relative to rootDir and must name the directory your build writes, such as dist or
build. If the build ran but the directory was empty or missing, the upload has nothing to
serve.
For a web service, check the container is listening on the port you declared, and on
all interfaces rather than only loopback. A server bound to 127.0.0.1 cannot be reached
from outside its own container.
The service never becomes healthy
The container starts and readiness never passes. For a web service the deploy fails after five minutes withdeclared port N, but nothing listened on it, and the version that was
serving before keeps serving unless the service’s Failed deploys setting says otherwise.
A container that exits as soon as it starts fails sooner, with its exit code. Common causes:
- The health check path does not return 2xx.
healthCheckPathmust answer before the service cuts over. A path that requires authentication, or that itself waits on a database, will not pass. - The port is wrong. The probe targets the public port, or the first declared port.
- The app is still starting. A slow boot needs a
startupprobe with a longerfailureThresholdrather than a longer readiness period.
dependsOn never came up
A service with dependsOn waits for its dependency to be ready. If the dependency never
becomes ready, the dependent fails with a timeout.
Check the dependency’s own logs first. A database that cannot start because its disk is
full, or an allocation below the engine’s memory floor, will hold up everything behind it.
dependsOn is rejected on cron and static services, and the graph must be acyclic. A
cycle is reported as a → b → a.
The image cannot be pulled
For a private registry, add the credentials under Settings → Registries. slipway attaches them automatically to every pull in the organization that needs them, and there is nothing to reference from the spec. See Private registries. Also check the image islinux/amd64, or a multi-arch manifest that includes it.
no_credentials on a service using a bucket
The bucket’s default access key was deleted, so ${service.X.access_key_id} and
${service.X.secret_access_key} no longer resolve.
Create a default key again from the bucket’s Keys tab, or point the references at a
named key. See Object storage.
self_reference on a database’s own password
The database’s password was set to a reference back to itself, usually
${service.<name>.url} picked from the value picker. Its connection URL is built from
the password, so there is no value for the reference to resolve to.
slipway now refuses the deploy instead of substituting one level and booting the engine
with the result. Rotate the password from the service’s Credentials tab, which
generates a real one and applies it to the live database, then redeploy the services that
connect to it.
A service referencing its own host, port or public_url is fine and unaffected — those
describe where it is served, not how to log in.
unresolved_password on a service using a database
The database this service references has no usable password: its password secret still
holds a ${…} reference that never resolved. Embedding it would produce a connection
string that looks complete and fails authentication at runtime.
Rotate the database’s password from its Credentials tab, then redeploy.
A paused database’s deploy waits, then fails
A managed database that is paused runs no pods, so a deploy that waits for it to become ready waits for something that cannot happen. slipway now starts the database as part of the deploy, the same way an ordinary service’s replica count comes back from its spec, so this resolves itself. If a deploy still reports a paused database, start it from the service header and deploy again. Managing credentials on a paused database also starts it, because the change has to be made inside the running engine.resources_clamped on the deployment
The spec asked for more CPU or memory than your plan allows for one service, so slipway
deployed at the ceiling instead of failing. The deploy is healthy and running smaller than
requested.
Lower the request, or raise the plan. See Plans.
Two sources declare the same service name
Service names are unique within a project, because siblings reach each other by bare name. slipway refuses to deploy a service whose name another source already publishes, and recordsservice_name_conflict.
Rename one of them. The console’s create flow disambiguates automatically, so this
generally comes from two hand-written specs.
The spec will not parse
slipway validates before anything runs and reports the line. These are the errors that come from the format changing.
Other frequent validation errors:
A build fails
The build output is in the deployment’s Logs tab, under the service being built.- A dependency is missing. The build runs in a clean container, so anything not in your lockfile or install step will not be there.
- The lockfile is out of sync.
npm cirefuses apackage-lock.jsonthat disagrees withpackage.json, which npm on macOS produces by leaving out optional packages for other platforms. The build falls back tonpm installand says so in the log. Commit a regenerated lockfile to get exact installs back. pnpm and yarn get the same fallback. - The build ran out of memory. Raise the build machine.
- A base image moved. Choose Rebuild without cache from the Deploy latest dropdown. See How deploys work.
A push did not deploy anything
Check three things, in order:- Auto-deploy is on for that service. It defaults on for a single-repo project and off for sources added to a multi-repo project.
- The push was to the tracked branch. A source deploys one branch.
- A
buildFilterdid not skip it. If no changed file matched, the deploy is skipped by design. See Monorepos.