All capabilities
04 / 14Your server, your runtime

Ship services next to the data they use.

River runs containerized backends — APIs, workers, and scheduled services — on the same machine as your databases. Any language, one private network, one control plane.

Languages & runtimes

Node.jsPythonGoRustJavaC# / .NETPHPRuby

The problem

A small service usually drags in a second cloud account, a separate build pipeline, and another set of credentials pointed back at your database.

The River approach

Containers live on the server that already holds your data, reachable over a private network, with restarts and logs handled inside the same workspace as everything else.

See it working

Inside Containers.

Services

private network · 10.0.4.0/24

api-gateway:8080 · 38 MBrunning
jobs-workerqueue · 112 MBrunning
auth-service:9000 · 24 MBrunning
webhooks:9100 · 12 MBrestarting
databases reachable by namerestarts handled in-processlogs streamed to the workspace
Apps and databases on one box — status, ports, and memory in a single services view.

Get started

Deploy your first container

From a fresh project to a live service — build, tag, and push your Docker image to River's built-in registry, then deploy it with a single click.

01

Write a Dockerfile

Start with a minimal Dockerfile at the root of your project. River runs any image — pick the base that matches your stack.

Dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 80
CMD ["node", "server.js"]
02

Build the image

Build your image locally and tag it with River's registry hostname. Replace `<org>` with your River organization slug and `<name>` with your app name.

docker build -t <workspace>-r.river.li/<org>/<name>:latest .
03

Log in to River's registry

Authenticate with the built-in registry using your River organization slug as the username and your API key as the password. Find your API key under Settings → API Keys.

docker login <workspace>-r.river.li \
  --username <org> \
  --password <your-api-key>
04

Push the image

Push the tagged image to River's registry. The platform stores it and makes it available for deployment.

docker push <workspace>-r.river.li/<org>/<name>:latest
05

Deploy from the dashboard

Open the Containers view in your River workspace, create a new app with source set to River Registry, enter the image path, and click Deploy. Your service comes online at `<workspace>-c-<slug>.river.li` with TLS handled automatically.

Done — your container is live.

What changes for your team

Less friction between the question and the answer.

Deploy services written in any language
Keep applications and databases on one private network
See what is running without opening a second console
01

Package

Bring a container image or a repository.

02

Run

Start the service beside your databases.

03

Observe

Watch status, logs, and resource use in one list.

Next capability

Table Editor

Explore Table Editor