Docker
Docker kontejnery a compose konfigurace
Přehled Docker souborů
| Soubor | Účel |
|---|---|
docker/Dockerfile.api | Multi-stage build pro NestJS API |
docker/Dockerfile.web | Multi-stage build pro veřejný web (SPA) |
docker/Dockerfile.admin | Multi-stage build pro admin dashboard (SPA) |
docker/docker-compose.yml | Lokální vývoj (PostgreSQL, Redis, MinIO, MailHog) |
docker/docker-compose.prod.yml | Produkční prostředí |
docker/docker-compose.e2e.yml | E2E testovací prostředí |
docker/docker-compose.test.yml | Integrač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žba | Port | Poznámka |
|---|---|---|
| PostgreSQL | 5433 | Standardně 5432 |
| Redis | 6380 | Standardně 6379 |
| MinIO API | 9002 | S3-kompatibilní úložiště |
| MinIO Console | 9003 | Web rozhraní pro správu |
| MailHog SMTP | 1026 | Zachytává odchozí emaily |
| MailHog Web | 8026 | Webové 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:/dataTestovací 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 (
nestjspro API,nginxpro web) - Nikdy nepoužívejte
docker compose down -v-- smaže datové volumes - Nikdy nepoužívejte
docker volume rmna produkční volumes - Health checks používají
127.0.0.1místolocalhost(Alpine preferuje IPv6)