version: "3.8" services: db: image: postgres:16-alpine container_name: jobsboard_db restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: jobsboard ports: - "${DB_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d jobsboard"] interval: 5s timeout: 5s retries: 5 web: build: context: ./web dockerfile: Dockerfile container_name: jobsboard_web restart: always ports: - "${WEB_PORT:-3000}:3000" environment: DATABASE_URL: "postgresql://postgres:postgres@db:5432/jobsboard?schema=public" NEXTAUTH_SECRET: "${NEXTAUTH_SECRET:-jobsboard-secret-key-for-auth-sessions}" NEXTAUTH_URL: "${NEXTAUTH_URL:-http://localhost:3000}" NODE_ENV: "production" depends_on: db: condition: service_healthy scraper: build: context: ./scraper dockerfile: Dockerfile container_name: jobsboard_scraper restart: always environment: DATABASE_URL: "postgresql://postgres:postgres@db:5432/jobsboard?schema=public" SCRAPE_INTERVAL_MINUTES: "30" depends_on: db: condition: service_healthy volumes: postgres_data: