Turtor Docs
Nasazení

Docker

Docker kontejnery a compose konfigurace

Přehled Docker souborů

SouborÚčel
docker/Dockerfile.apiMulti-stage build pro NestJS API
docker/Dockerfile.webMulti-stage build pro veřejný web (SPA)
docker/Dockerfile.adminMulti-stage build pro admin dashboard (SPA)
docker/docker-compose.ymlLokální vývoj (PostgreSQL, Redis, MinIO, MailHog)
docker/docker-compose.prod.ymlProdukční prostředí
docker/docker-compose.e2e.ymlE2E testovací prostředí
docker/docker-compose.test.ymlIntegrační testy (tmpfs)

API Dockerfile

API používá dvoustupňový build s Node.js 20 Alpine. Ukázka níže je zkrácená -- pro kompletní verzi viz docker/Dockerfile.api.

# Build stage
FROM node:20-alpine AS builder
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
# ... package.json soubory pro workspace
RUN pnpm install --frozen-lockfile --ignore-scripts
COPY packages/config packages/shared apps/api turbo.json ./
RUN pnpm turbo run build --filter=@turtor/api

# Production stage
FROM node:20-alpine AS production
RUN addgroup --system nodejs && adduser --system nestjs
# bcrypt vyžaduje nativní kompilaci na Alpine
RUN apk add --no-cache python3 make g++
RUN pnpm install --frozen-lockfile --prod --ignore-scripts && \
    cd node_modules/.pnpm/bcrypt@5.1.1/node_modules/bcrypt && npm rebuild bcrypt
RUN apk del python3 make g++
USER nestjs
EXPOSE 3001
CMD ["node", "dist/main.js"]

Příznak --ignore-scripts při pnpm install zabraňuje spuštění Husky git hooks uvnitř Docker kontejneru. Bcrypt se poté přestaví manuálně.

Web Dockerfile

Web app je SPA servírovaná přes nginx. Ukázka níže je zkrácená -- pro kompletní verzi viz docker/Dockerfile.web.

# Build stage - Node pro Vite build
FROM node:20-alpine AS builder
# Vite env proměnné se "zapékají" do statického bundlu při buildu
ARG VITE_API_URL
ARG VITE_WORKOS_CLIENT_ID
ARG VITE_STRIPE_PUBLISHABLE_KEY
RUN pnpm turbo build --filter=@turtor/web

# Production stage - nginx pro servírování SPA
FROM nginx:alpine
# Inline nginx config s SPA fallbackem a immutable cache pro assets
COPY --from=builder /app/apps/web/dist /usr/share/nginx/html
USER nginx
CMD ["nginx", "-g", "daemon off;"]

Frontend env proměnné (VITE_*) jsou součástí statického buildu. Při změně hodnot je nutné znovu provést build obrazu.

Docker Compose -- lokální vývoj

Služby pro lokální vývoj používají offsetované porty, aby nedocházelo ke konfliktu s jinými projekty:

pnpm docker:up    # Spustí všechny služby
pnpm docker:down  # Zastaví služby
SlužbaPortPoznámka
PostgreSQL5433Standardně 5432
Redis6380Standardně 6379
MinIO API9002S3-kompatibilní úložiště
MinIO Console9003Web rozhraní pro správu
MailHog SMTP1026Zachytává odchozí emaily
MailHog Web8026Webové UI pro prohlížení emailů

Docker Compose -- produkce

Produkční compose (docker-compose.prod.yml) obsahuje 5 služeb: nginx, api, web, postgres, redis. Služby api a web závisí na zdravotních kontrolách databáze a Redis.

services:
  api:
    depends_on:
      postgres: { condition: service_healthy }
      redis: { condition: service_healthy }

  postgres:
    volumes:
      - turtor_postgres_data:/var/lib/postgresql/data

  redis:
    command: redis-server --appendonly yes
    volumes:
      - turtor_redis_data:/data

Testovací prostředí

  • Integrační testy (docker-compose.test.yml) -- PostgreSQL port 6433, Redis port 7380, obojí na tmpfs (RAM) pro rychlost
  • E2E testy (docker-compose.e2e.yml) -- PostgreSQL port 5435, Redis port 6383, izolované volumes a síť

Bezpečnostní pravidla

  • Kontejnery běží pod neprivilegovaným uživatelem (nestjs pro API, nginx pro web)
  • Nikdy nepoužívejte docker compose down -v -- smaže datové volumes
  • Nikdy nepoužívejte docker volume rm na produkční volumes
  • Health checks používají 127.0.0.1 místo localhost (Alpine preferuje IPv6)