services: postgres: image: postgres:16-alpine container_name: libreader-db restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-libreader} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-libreader_pass} POSTGRES_DB: ${POSTGRES_DB:-libreader} volumes: - pgdata:/var/lib/postgresql/data networks: - libreader-net healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-libreader}'] interval: 5s timeout: 5s retries: 5 backend: build: context: ./backend dockerfile: Dockerfile container_name: libreader-backend restart: unless-stopped depends_on: postgres: condition: service_healthy environment: POSTGRES_HOST: postgres POSTGRES_PORT: 5432 POSTGRES_USER: ${POSTGRES_USER:-libreader} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-libreader_pass} POSTGRES_DB: ${POSTGRES_DB:-libreader} PORT: 3030 FILE_STORAGE_STRATEGY: filesystem NODE_ENV: production volumes: - uploads:/app/uploads networks: - libreader-net frontend: build: context: . dockerfile: Dockerfile.frontend container_name: libreader-frontend restart: unless-stopped depends_on: - backend ports: - '${APP_PORT:-4600}:80' networks: - libreader-net networks: libreader-net: driver: bridge volumes: pgdata: uploads: