DocsComputeWeb Services

Web Services

Host dynamic web apps and APIs — Express, FastAPI, Django, Rails, Go, Rust, whatever you use — at a public HTTPS URL. Deploy from Git or a prebuilt Docker image.

Muerte Cloud builds and deploys your code on every push to the branch you link. Every web service gets a unique *.muerte.app subdomain and can attach any number of custom domains with fully managed TLS. Services in the same project talk to each other over a free private network — no VPC to configure, no public exposure.

Important
Your web service must bind to a port on host 0.0.0.0 to receive traffic from the public internet. The default expected port is 8080 and is passed to your process as the PORT environment variable. See Port binding.
Request flow
Client
HTTPS
Edge / TLS
Global load balancer
Your service
0.0.0.0:$PORT
Muerte Cloud terminates TLS at the edge and forwards the request to your container over HTTP on the port your process binds to.

Deploy a template#

The fastest way to try the platform is to deploy one of the starter templates. Each one is a minimal, real app in the given stack with the correct build and start commands preconfigured:

Express
Node.js
FastAPI
Python
Django
Python
Ruby on Rails
Ruby
Gin
Go
Rocket
Rust
Phoenix
Elixir
Laravel
PHP

Deploy your own code#

You can deploy a web service from a linked GitHub, GitLab or Bitbucket repository, from a public Git URL, or from a prebuilt Docker image in any registry.

  1. 1
    Connect your Git provider
    Sign in to the Muerte Cloud dashboard, open New → Web Service and connect your GitHub, GitLab or Bitbucket account. Both public and private repositories your account can access are supported.
  2. 2
    Pick a repository and branch
    Choose the repository and the branch that should be auto-deployed. Every push to that branch triggers a new build.
  3. 3
    Fill in the service form
    FieldDescription
    NameA name for the service inside the Muerte Cloud dashboard. It is also used as the default *.muerte.app subdomain.
    RegionThe geographic region where the service runs. Services in the same region and project share a free private network.
    BranchThe Git branch to build. Every push to this branch triggers a new build and deploy.
    LanguageThe runtime for your app. Muerte Cloud auto-detects Node.js, Python, Go, Ruby, Elixir, Rust, PHP and .NET — or use a Dockerfile for anything else.
    Build CommandCommand that produces build artifacts. Typical values: npm ci && npm run build, pip install -r requirements.txt.
    Start CommandCommand that boots your HTTP server. Typical values: node dist/index.js, gunicorn app.wsgi.
  4. 4
    Choose an instance type
    Instance types range from a small shared instance to dedicated CPU tiers with autoscaling. You can change the instance later at any time without downtime.
  5. 5
    (Optional) configure advanced settings
    Set environment variables and secrets, attach a persistent disk, configure a health check path, enable pull-request previews, and pin a specific runtime version.
  6. 6
    Create the service
    Click Create Web Service. Muerte Cloud kicks off the first build; you can watch progress in real time on the service's Deploys tab.
First deploy failed?
The most common causes are a missing start command, binding to 127.0.0.1 instead of 0.0.0.0, or a build that runs out of memory on the selected instance. Check the build and runtime logs on the Deploys tab — every failure links directly to the offending log line.

Port binding#

Every web service must bind an HTTP server to a port on host 0.0.0.0. Muerte Cloud's edge terminates TLS, then forwards inbound requests to your container over HTTP on that port. The container itself is never reachable directly from the public internet.

We recommend binding to the port defined by the PORT environment variable — this way you never have to hard-code a value and it works both locally and in production.

server.js
javascript
const express = require("express");
const app = express();
const port = process.env.PORT || 8080;

app.get("/", (req, res) => {
  res.send("Hello from Muerte Cloud");
});

app.listen(port, "0.0.0.0", () => {
  console.log(`listening on ${port}`);
});
FieldDescription
Default port8080. Overridable from the service settings when a framework insists on a specific default.
Bind addressAlways 0.0.0.0. Binding to 127.0.0.1 or localhost makes the service unreachable and fails the deploy.
Auto-detectionIf your app binds to a different port, Muerte Cloud usually detects and uses it automatically. When detection fails, the deploy is marked unhealthy with a link to the log line where the bind was expected.
Reserved ports18012, 18013 and 19099 are reserved by the platform runtime and cannot be bound.

Binding to multiple ports

A web service exposes exactly one public HTTP port. A service can bind additional ports for use over the private network — internal admin interfaces, gRPC servers, metrics scrapers — but the public listener must always bind to $PORT.

Connect to your web service#

From the public internet

Every service gets a stable HTTPS URL of the form https://<service>.muerte.app. You can attach one or more custom domains at any time; TLS certificates are issued and renewed automatically, including wildcards.

The edge terminates SSL, then forwards to your container over HTTP. Requests that arrive over plain HTTP are redirected to HTTPS before forwarding.

Don't want public exposure?
Create a private service instead of a web service. Private services share the same runtime, build pipeline and observability, but are only reachable from other services in the same project.

From other services in your project

Services in the same project can reach each other over the private network using the service name as the hostname — no ingress fee, no public exposure. From a worker, a call to a service named api looks like this:

bash
curl http://api:8080/health

Additional features#

Web services on Muerte Cloud also include, out of the box:

Zero-downtime deploys
New releases become healthy before old ones drain.
Managed TLS
Free certificates, wildcards, auto-renewal.
Custom domains
Any number of apex and wildcard domains.
Autoscaling In development
Automatic scaling on CPU and RPS is in development. Instance count can be changed manually today.
Persistent disks
SSD volumes attached to a service.
WebSockets
Long-lived connections supported by default.
Preview environments In development
One isolated URL per pull request — in development.
Instant rollbacks
Restore any previous successful build with one click.
DDoS protection
Layer 3/4 mitigation on by default.