services: postgres: image: postgres:17-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data - ../backend/migrations/000001_init.sql:/docker-entrypoint-initdb.d/010_init.sql:ro - ../backend/seed/001_seed.sql:/docker-entrypoint-initdb.d/020_seed.sql:ro networks: - control backend: build: context: ../backend dockerfile: Dockerfile env_file: - .env depends_on: - postgres ports: - "8080:8080" networks: - control - gateway admin-web: build: context: ../admin-web dockerfile: Dockerfile depends_on: - backend ports: - "8081:80" networks: - control reverse-proxy: image: nginx:1.27-alpine depends_on: - backend - admin-web ports: - "80:80" volumes: - ./nginx/reverse-proxy.conf:/etc/nginx/conf.d/default.conf:ro networks: - control gateway: image: alpine:3.21 command: ["sh", "/scripts/gateway-entrypoint.sh"] cap_add: - NET_ADMIN - SYS_MODULE volumes: - ./scripts/gateway-entrypoint.sh:/scripts/gateway-entrypoint.sh:ro - gateway-state:/var/lib/nexavpn networks: - gateway volumes: postgres-data: gateway-state: networks: control: gateway: