Web Services
A Web Service is a long-running container — your API, full-stack app, worker behind HTTP, anything that needs a process and CPU/RAM. Optionally attach a persistent disk that survives restarts.
Each service gets a free *.runsite.app subdomain and can serve any custom domain you attach.
Pricing & plans
Comparing options or looking for the free tier? See plans, specs and pricing on the Web Services hosting page.
How it works
Section titled “How it works”Runsite always runs your app as an isolated Docker container. You ship one in two ways:
- From a Git repo — push your code, we build the image. We use your
Dockerfileif there is one, otherwise we auto-detect the stack (Node, Python, Go, Java today). - From a registry image — point at any public or private Docker image.
Supported Git providers: GitHub, GitLab, Bitbucket.
For the full platform model — deployment lifecycle, deploy states, ephemeral filesystem, health checks — see Runtime.
Dockerfile examples
Section titled “Dockerfile examples”Most stacks need only a few lines. Pick your runtime — Minimal gets you to a first deploy, Production is a multi-stage build with smaller images and faster cold starts.
FROM node:20-alpineWORKDIR /appCOPY package*.json ./RUN npm ci --omit=devCOPY . .EXPOSE 8080CMD ["node", "server.js"]FROM node:20-alpine AS depsWORKDIR /appCOPY package*.json ./RUN npm ci
FROM node:20-alpine AS buildWORKDIR /appCOPY --from=deps /app/node_modules ./node_modulesCOPY . .RUN npm run build && npm prune --omit=dev
FROM node:20-alpineWORKDIR /appENV NODE_ENV=productionCOPY --from=build /app/node_modules ./node_modulesCOPY --from=build /app/dist ./distCOPY --from=build /app/package*.json ./EXPOSE 8080CMD ["node", "dist/server.js"]FROM python:3.12-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .EXPOSE 8080CMD ["gunicorn", "-b", "0.0.0.0:8080", "app:app"]FROM python:3.12-slim AS buildWORKDIR /appENV PIP_NO_CACHE_DIR=1 PIP_DISABLE_PIP_VERSION_CHECK=1COPY requirements.txt .RUN pip install --user -r requirements.txt
FROM python:3.12-slimWORKDIR /appENV PATH=/root/.local/bin:$PATH \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1COPY --from=build /root/.local /root/.localCOPY . .EXPOSE 8080CMD ["gunicorn", "-b", "0.0.0.0:8080", "-w", "2", "app:app"]FROM golang:1.23-alpineWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN go build -o server ./...EXPOSE 8080CMD ["./server"]FROM golang:1.23-alpine AS buildWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /server ./...
FROM gcr.io/distroless/static-debian12COPY --from=build /server /serverEXPOSE 8080USER nonroot:nonrootCMD ["/server"]The default port is 8080. If your app listens elsewhere, change it in Settings → Build & Deploy.
Don’t have a Dockerfile and your stack is one of Node, Python, Go or Java? Push without one — Runsite will detect the project and build it for you.
Where to next
Section titled “Where to next”- Runtime — container model, lifecycle, states, storage, health checks.
- Deploying — auto-deploy from Git and manual actions.
- Dashboard — what every tab does.
- Domains — default subdomain and custom domains.
- Scaling & resources — CPU, RAM, disk, autoscaling, sleep.
Front-end only?
If your project is a static site (React SPA, Astro, Hugo, plain HTML), use Static Sites instead — simpler, served from the edge, always-on.