DocsDeploysHow deploys work

Deploying on Muerte Cloud

Every push to your tracked branch produces a fresh atomic release. This page covers how a deploy runs end to end — the pipeline stages, rollout, rollback and shutdown.

Muerte Cloud can deploy your service automatically on every commit, or on demand from the dashboard. Web services, private services, background workers and cron jobs all redeploy with zero downtime, unless the service has a persistent disk attached.

Every deploy is visible in real time on the service's Deploys tab: build logs, runtime logs, commit SHA, duration and status all in one place.

Automatic deploys#

When you create a service you link it to a branch of a GitHub, GitLab or Bitbucket repository. By default, every push or merge to that branch rebuilds and redeploys the service.

Auto-deploys require a connected Git provider. Services that pull a prebuilt Docker image or a public Git URL are deployed manually.

Configuring auto-deploys

Change auto-deploy behaviour from the service's Settings tab:

FieldDescription
On commitDeploy as soon as a change lands on the tracked branch. Default for new services.
After CI checks passWait for every CI check on the commit to conclude. Deploy only if all of them pass.
OffNo auto-deploys. Every release is triggered manually from the dashboard.

Skipping a commit

Some commits — README edits, comment tweaks — don't need to ship. Add a skip phrase anywhere in the commit message and Muerte Cloud will record the event without triggering a build:

bash
git commit -m "[skip deploy] tighten copy in README"

Accepted phrases: [skip deploy], [deploy skip], [skip ci].

Manual deploys#

You can also trigger a release outside the git-push flow from the Deploys tab: pick the latest commit, a specific SHA, or clear the build cache first.

Pinning a specific commit
Deploying a specific SHA from the dashboard automatically disables auto-deploys — otherwise the next push would overwrite your pinned release.

Deploy steps#

Every deploy runs the same two-stage pipeline:

  1. 1
    Build command
    Installs dependencies and produces build artifacts. Runs on separate build compute — anything it writes to the filesystem is only carried forward through the resulting image.
  2. 2
    Start command
    Boots your process on a fresh instance. Once it becomes healthy, traffic swings over from the previous instance.
Important
If any stage fails or times out, the deploy is cancelled and your previous release keeps serving traffic. Stage timeouts: build 120 min, start 15 min.

Example build commands

RuntimeTypical build command
Node.jsnpm ci · pnpm install --frozen-lockfile · bun install
Pythonpip install -r requirements.txt · poetry install · uv sync
Rubybundle install
Gogo build -o app ./cmd/server
Rustcargo build --release
Elixirmix deps.get --only prod && mix compile
Dockerno build command — Dockerfile or prebuilt image is used

Example start commands

RuntimeTypical start command
Node.jsnode dist/index.js · npm start
Pythongunicorn app.wsgi --bind 0.0.0.0:8080
Rubybundle exec puma -b tcp://0.0.0.0:8080
Go./app
Rust./target/release/app
Elixirmix phx.server
DockerDockerfile CMD, overridable per service

Managing deploys#

Overlapping deploys

Only one deploy runs at a time per service. When a new deploy is triggered while one is already in flight, Muerte Cloud can either wait (finish the current deploy, then jump straight to the newest triggered one, skipping any intermediate ones) or override (cancel the running deploy and start the new one immediately). The default is wait; change it in workspace settings.

Cancelling a deploy

Click Cancel deploy on the Deploys tab to abort an in-flight build. If another deploy is queued behind it, that one starts immediately.

Restarting a service

A restart is a special manual deploy: same commit, same env vars, new instance. Because a fresh instance is spun up and swapped in, restarts are zero-downtime just like a normal deploy. Note that a restart does not pick up recent env-var edits — trigger a fresh deploy for those to take effect.

Rolling back

Every successful build is stored as a rollback point, so you can return a service to a previous version from the Deploys tab without rebuilding. See Rollbacks for the full flow.

Deployment concepts#

Ephemeral filesystem

By default a service's filesystem is ephemeral: any writes at runtime are discarded on the next deploy or restart. To keep data across releases, use a managed Postgres or Key-Value store, or attach a persistent disk under a specific mount path.

Zero-downtime deploys

When a new version builds successfully, Muerte Cloud starts a fresh instance alongside the current one. The old instance keeps serving every request until the new instance passes its health check, then the edge swings traffic across in a single step.

  1. Build the new version. If the build fails, the deploy is cancelled and the current instance keeps serving.
  2. Boot a new instance next to the current one.
  3. Wait for the new instance to pass its health check.
  4. Swing traffic to the new instance; drain in-flight requests on the old one.
  5. After a 60-second grace period, send SIGTERM to the old instance.
  6. If it doesn't exit within the shutdown delay, send SIGKILL.

Services scaled to multiple instances repeat steps 2–6 one instance at a time. If any new instance fails to become healthy, the whole deploy is cancelled and every replica is reverted to the previous version. Persistent disks disable zero-downtime deploys because only one instance can safely hold the volume open at once.

Graceful shutdown

Your process receives SIGTERM when it's time to stop. Handle it: drain in-flight HTTP requests, finish or requeue worker tasks, close outbound connections, and exit with a zero status. The default shutdown budget is 30 seconds and can be extended up to 300 seconds per service.

server.js
javascript
const server = app.listen(port, "0.0.0.0");

process.on("SIGTERM", () => {
  console.log("received SIGTERM, draining connections");
  server.close(() => process.exit(0));
});
Tip
If a service consistently gets SIGKILLed during rollouts, either the shutdown handler is missing or the drain takes longer than the shutdown delay. Bump the delay in service settings, or shorten the drain by closing keepalive connections at the top of the handler.