DocsStartYour first deploy

Your first deploy

This walkthrough takes you from an empty workspace to a live HTTPS URL in a few minutes. You'll connect a Git provider, pick a service type, set build and start commands, and watch the pipeline stream to green.

The flow is the same for every runtime — Node.js, Python, Go, Ruby, Rust, Elixir or Docker. The only thing that changes between them is the pair of commands you type in step three.

Before you start
You need a Git repository (GitHub, GitLab or Bitbucket) with a working app, and a Muerte Cloud workspace. If you don't have an app yet, push any small Express, FastAPI or Docker app to a repository and follow along.

The five-minute path#

  1. 1
    Connect your Git provider
    In the dashboard, open Account → Git providers and authorise GitHub, GitLab or Bitbucket. Grant access to the repositories you want Muerte Cloud to see — you can widen or narrow this later without redeploying.
  2. 2
    Create a new service
    Click New → Web Service, pick the repo and branch. Muerte Cloud scans the tree and suggests a runtime; override it if the guess is wrong.
  3. 3
    Set build and start commands
    Confirm the suggested commands or edit them. The build command produces artefacts; the start command boots the process that binds to $PORT. See the table below for typical values.
  4. 4
    Add environment variables
    Paste a .env file or enter values one by one. Sensitive strings are encrypted at rest and never printed to logs. You can wire them up later, but most apps need at least a DATABASE_URL.
  5. 5
    Create and watch
    Click Create service. The Deploys tab streams build and runtime logs live. When the health check passes, traffic swings to the new instance and the service URL becomes reachable over HTTPS.

Picking a service type#

Web services are the most common choice, but Muerte Cloud offers four other types for jobs that don't accept HTTP traffic. Use the cheat sheet below or read the full service types guide.

FieldDescription
Web ServiceLong-running HTTP process with a public HTTPS URL. Zero-downtime deploys.
Static SitePre-built HTML, CSS and JS served over HTTPS. PR previews are In development and not yet available.
Private ServiceReachable only inside your workspace's private network. No public URL, ideal for internal APIs.
Background WorkerLong-running process with no inbound traffic. Queue consumers, ingestion pipelines, chat bots.
Cron JobRuns a command on a schedule. Billed only for the runtime of each invocation.

Build and start commands by runtime#

RuntimeBuildStart
Node.jsnpm ci && npm run buildnode dist/index.js
Pythonpip install -r requirements.txtgunicorn app.wsgi --bind 0.0.0.0:$PORT
Rubybundle installbundle exec puma -b tcp://0.0.0.0:$PORT
Gogo build -o app ./cmd/server./app
Rustcargo build --release./target/release/app
Elixirmix deps.get --only prod && mix compilemix phx.server
Docker— (Dockerfile is built)— (uses CMD, overridable)
Bind to $PORT on 0.0.0.0
Muerte Cloud injects PORT at boot. Bind the server to 0.0.0.0:$PORT — binding to 127.0.0.1 or a hard-coded port will fail the health check and cancel the deploy.

Minimal Node.js example

server.js
javascript
import http from "node:http";

const port = Number(process.env.PORT ?? 8080);

http
  .createServer((_, res) => res.end("ok"))
  .listen(port, "0.0.0.0", () => {
    console.log("listening on", port);
  });

What happens after you click Create#

Every deploy runs the same three-stage pipeline:

  1. 1
    Build
    Dependencies are installed and artefacts produced on separate build compute. Output is captured into an immutable image.
  2. 2
    Start
    A fresh instance boots the image. Once the health check passes, traffic swings from the previous instance in a single step.

Read the full pipeline reference in How deploys work.

Verifying the service is live#

Once the Deploys tab shows Live, the service is reachable at https://<name>.muerte.app. Quick checks:

bash
# HTTP 200 with response headers
curl -I https://my-service.muerte.app

Live and historical build/runtime logs are also available on the service's Logs tab in the dashboard.

If the first deploy fails#

Build fails on install
Check the lockfile is committed and the runtime version matches. Node uses .nvmrc or the engines field; Python reads runtime.txt.
Health check times out
Your process isn't binding to $PORT on 0.0.0.0, or it's crashing on boot. Check the runtime logs for the exact error.
Missing env vars
The build container sees the same variables as runtime. Add DATABASE_URL and any framework-required secrets before the first deploy.
Docker image too large
Multi-stage builds and slim base images cut boot time. Aim for under 500 MB compressed for fastest cold starts.

Next steps#

Add a custom domain
Point your own domain at the service and let Muerte Cloud provision TLS automatically.
Attach a database
Managed Postgres and Key-Value stores connect over the private network with a single URL.
Enable PR previews In development
Every pull request will get its own isolated environment, torn down on merge — in development.
Autoscaling In development
Automatic scaling on CPU and RPS is in development. Today you can bump the instance count manually for horizontal scale.