Postat acum 21 ore
Am trecut prin vreo 10 variante de setup local până am ajuns la unul care "merge" în fiecare dimineață.
Obiective
docker compose uppornește TOTUL în <10 sec după primul build- DB-ul păstrează datele între restart-uri
- Port-urile nu se bat cu nimic nativ
- Serviciile "opționale" (Redis, MinIO) sunt în profile-uri, pornesc doar când le cer
Minim necesar
postgres:17-alpinecu port 54321 (nu default 5432, să nu se bată cu eventuală instalare nativă)redis:7-alpineîn profilecachemailhogpentru email dev
Volume
- Postgres: named volume, NU bind mount (e mai rapid pe macOS/Windows)
- App-ul meu: bind mount pe
./src+ anonymous volume penode_modules(să nu overwrite cu host)
Healthchecks
Fără healthcheck, app-ul pornește înainte ca DB-ul să fie gata și crapă. O configurație simplă:
services:
db:
image: postgres:17-alpine
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
timeout: 3s
retries: 5
app:
depends_on:
db:
condition: service_healthy
Profile-uri
docker compose --profile cache up pornește și Redis. Fără flag: doar strict necesarul.
.env pentru compose vs .env pentru app
Compose citește .env din folderul lui. App-ul poate avea .env.local. Nu le amesteca — confuzia e garantată.
Seeduri automate
La primul up, rulezi un init-script. În Postgres, pui ./init-scripts:/docker-entrypoint-initdb.d:ro. Scriptul SQL de acolo rulează O DATĂ (pe volume gol).
Un singur comandă "reset"
docker compose down -v && docker compose up --build -d && npm run db:migrate
Resetezi totul în 15 secunde când ai nevoie de un DB curat.