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.
The five-minute path#
- 1Connect your Git providerIn the dashboard, open
Account → Git providersand 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. - 2Create a new serviceClick
New → Web Service, pick the repo and branch. Muerte Cloud scans the tree and suggests a runtime; override it if the guess is wrong. - 3Set build and start commandsConfirm 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. - 4Add environment variablesPaste a
.envfile 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 aDATABASE_URL. - 5Create and watchClick
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.
| Field | Description |
|---|---|
| Web Service | Long-running HTTP process with a public HTTPS URL. Zero-downtime deploys. |
| Static Site | Pre-built HTML, CSS and JS served over HTTPS. PR previews are In development and not yet available. |
| Private Service | Reachable only inside your workspace's private network. No public URL, ideal for internal APIs. |
| Background Worker | Long-running process with no inbound traffic. Queue consumers, ingestion pipelines, chat bots. |
| Cron Job | Runs a command on a schedule. Billed only for the runtime of each invocation. |
Build and start commands by runtime#
| Runtime | Build | Start |
|---|---|---|
| Node.js | npm ci && npm run build | node dist/index.js |
| Python | pip install -r requirements.txt | gunicorn app.wsgi --bind 0.0.0.0:$PORT |
| Ruby | bundle install | bundle exec puma -b tcp://0.0.0.0:$PORT |
| Go | go build -o app ./cmd/server | ./app |
| Rust | cargo build --release | ./target/release/app |
| Elixir | mix deps.get --only prod && mix compile | mix phx.server |
| Docker | — (Dockerfile is built) | — (uses CMD, overridable) |
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
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:
- 1BuildDependencies are installed and artefacts produced on separate build compute. Output is captured into an immutable image.
- 2StartA 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:
# HTTP 200 with response headers
curl -I https://my-service.muerte.appLive and historical build/runtime logs are also available on the service's Logs tab in the dashboard.