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
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
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.
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.
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 80
CMD ["node", "server.js"]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 .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>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>:latestDeploy 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.
Package
Bring a container image or a repository.
Run
Start the service beside your databases.
Observe
Watch status, logs, and resource use in one list.
Next capability