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.
Looking for plans or pricing?
Plans, CPU/RAM tiers, free-tier limits and pricing are not documented here — they live on the web app hosting page. This section covers how a service is built, deployed and run.
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.
Do I need a Dockerfile to deploy a web service?
Section titled “Do I need a Dockerfile to deploy a web service?”Not for Node, Python, Go or Java — Runsite auto-detects those and builds the image for you. For any other stack, or when you want a reproducible production build, add a Dockerfile and Runsite builds it as-is.
What port should my app listen on?
Section titled “What port should my app listen on?”Port 8080, bound to 0.0.0.0 (not localhost). If your app uses a different port, change it in Settings → Build & Deploy.
Why does my service fail with “did not start in time”?
Section titled “Why does my service fail with “did not start in time”?”Usually the app isn’t listening on 0.0.0.0:8080, or a required environment variable is missing and the app crashes on boot. Check the container logs for the real error. See Troubleshooting for the full checklist.
Are files my app writes to disk kept between deploys?
Section titled “Are files my app writes to disk kept between deploys?”No. The container filesystem is ephemeral — anything on local disk is lost on restart, redeploy or scale. Store data in managed PostgreSQL, Redis or Object Storage, or attach a persistent disk.
Can I deploy from a Docker image instead of Git?
Section titled “Can I deploy from a Docker image instead of Git?”Yes. Point a web service at any public or private registry image instead of connecting a Git repository.
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.