П Prorvyomsya!
← All posts
· 1 min DevOpsDocker

Why we deploy everything with Docker

How a single approach to containerisation simplifies development, testing and production across all our products.

At Prorvyomsya! studio every product is packaged in Docker — from small Go services to multi-tenant Django platforms. It is not dogma, but a deliberate engineering choice.

One artifact from laptop to production

A container is built once and travels the whole path unchanged: local development, CI, staging, production. The classic “works on my machine” disappears — the environment is described in the Dockerfile and is reproducible.

Multi-stage builds

We use multi-stage builds: heavy dependencies and tooling stay in the build stage, while the final image contains only what is needed to run.

FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine AS runtime
WORKDIR /app
COPY --from=build /app/dist ./dist
CMD ["node", "./dist/server/entry.mjs"]

The resulting image is compact, starts fast and exposes a minimal attack surface.

A shared reverse proxy

All products live behind a shared Traefik with automatic TLS. A new service only needs to join the shared network — routing and certificates are configured declaratively.

Containerisation is not about fashion, it is about predictability. When infrastructure is reproducible, the team spends energy on the product, not on debugging environments.

This website is no exception: it is built into a multi-stage image and launched with a single docker compose up.