version: '3.8'
services:
db:
image: postgres:15-alpine
container_name: nextjs-db
environment:
POSTGRES_USER: dev_user
POSTGRES_PASSWORD: dev_password
POSTGRES_DB: dev_db
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U dev_user -d dev_db"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: nextjs-redis
ports:
- "6379:6379"
web:
build:
context: .
dockerfile: Dockerfile.dev
container_name: nextjs-web
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
- /app/.next
environment:
DATABASE_URL: postgres://dev_user:dev_password@db:5432/dev_db
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
pgdata:Salutare! Am văzut prea multe proiecte unde setup-ul local e un coșmar de scripturi bash și instrucțiuni de trei pagini în README. Astăzi vă arăt cum configurez eu un mediu local curat cu Docker Compose pentru Next.js, PostgreSQL și Redis, fără bătăi de cap și cu timpi de pornire instantanei.
De ce ne complicăm cu Docker pe local?
Am trecut prin faza în care instalam Postgres direct pe macOS, apoi aveam nevoie de versiunea 14 pentru un client și 16 pentru altul. Un haos total. Docker Compose rezolvă asta elegant. Totuși, marea problemă la Next.js în Docker este viteza de rebuild (hot-reload). Dacă montezi tot folderul orbește, Docker va încerca să sincronizeze node_modules între container și mașina gazdă. Pe Windows sau macOS, asta înseamnă că build-ul va fi incredibil de lent. Am pățit asta la un proiect cu peste 50 de pagini unde un simplu save dura 8 secunde să se vadă în browser.
Soluția? Folosim un volum anonim pentru node_modules. Îi spunem practic lui Docker: „Păstrează modulele de Node în interiorul containerului, nu le aduce pe mașina mea”.
Configurația de la care pornesc mereu
Mai jos aveți un docker-compose.yml pe care l-am rafinat în ultimii doi ani. L-am folosit recent la un startup unde am redus timpul de onboarding pentru un dev nou de la o zi întreagă la doar 5 minute. Dai docker compose up și totul funcționează.
Observați secțiunea de healthcheck pentru baza de date. Next.js are prostul obicei să crape la pornire dacă baza de date nu este complet gata să accepte conexiuni. Cu depends_on configurat corect, containerul de Next.js va aștepta cu răbdare ca Postgres să fie activ.
Compromisul de care trebuie să fii conștient
Merge excelent pentru izolare și onboarding rapid, dar există un trade-off sincer. Dacă folosești un MacBook cu procesor Intel sau un laptop Windows mai vechi, virtualizarea Docker va consuma destul de multe resurse. Pe Apple Silicon (M1/M2/M3) treaba se mișcă brici, dar pe hardware mai vechi s-ar putea să simți o încetinire.
În plus, debugging-ul (breakpoints în VS Code) devine puțin mai greoi când codul rulează în container. De aceea, la proiectele mari, uneori prefer să rulez doar Postgres și Redis în Docker, iar Next.js să îl rulez nativ pe mașina mea cu npm run dev, legat la porturile expuse de containere.
Voi cum procedați? Rulați aplicația de Node/Next direct pe sistemul gazdă sau preferați să aveți absolut totul izolat în Docker Compose?