services: # PostgreSQL Database db: image: postgres:16-alpine container_name: qrmaster-db restart: unless-stopped environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: qrmaster POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8" ports: - "5432:5432" volumes: - dbdata:/var/lib/postgresql/data - ./docker/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres -d qrmaster" ] interval: 5s timeout: 5s retries: 10 networks: - qrmaster-network # Redis Cache redis: image: redis:7-alpine container_name: qrmaster-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru ports: - "6379:6379" volumes: - redisdata:/data healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s timeout: 3s retries: 5 networks: - qrmaster-network # Next.js Application web: build: context: . dockerfile: Dockerfile container_name: qrmaster-web restart: unless-stopped ports: - "3050:3000" environment: NODE_ENV: production DATABASE_URL: postgresql://postgres:postgres@db:5432/qrmaster?schema=public REDIS_URL: redis://redis:6379 NEXTAUTH_URL: http://localhost:3050 NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-your-secret-key-change-in-production} IP_SALT: ${IP_SALT:-your-salt-change-in-production} depends_on: db: condition: service_healthy redis: condition: service_healthy healthcheck: test: [ "CMD", "node", "-e", "require('http').get('http://localhost:3000',()=>process.exit(0)).on('error',()=>process.exit(1))" ] interval: 10s timeout: 3s retries: 10 networks: - qrmaster-network # Adminer - Database Management UI (Optional) adminer: image: adminer:latest container_name: qrmaster-adminer restart: unless-stopped ports: - "8080:8080" environment: ADMINER_DEFAULT_SERVER: db depends_on: - db networks: - qrmaster-network profiles: - dev volumes: dbdata: driver: local redisdata: driver: local networks: qrmaster-network: driver: bridge