Files
var-monorepo/docker-compose.prod.yml
2025-07-22 11:09:24 -07:00

237 lines
6.7 KiB
YAML

networks:
default:
driver: bridge
postgres_network:
driver: bridge
core_network:
driver: bridge
redis_network:
driver: bridge
traefik:
external: true
services:
hub:
restart: unless-stopped
build:
context: .
dockerfile: ./apps/hub/Dockerfile
args:
- NEXT_PUBLIC_HUB_URL=$NEXT_PUBLIC_HUB_URL
- NEXT_PUBLIC_HUB_SERVER_URL=$NEXT_PUBLIC_HUB_SERVER_URL
- NEXT_PUBLIC_DISCORD_URL=$NEXT_PUBLIC_DISCORD_URL
- NEXT_PUBLIC_MOODLE_URL=$NEXT_PUBLIC_MOODLE_URL
- NEXT_PUBLIC_DISPATCH_URL=$NEXT_PUBLIC_DISPATCH_URL
labels:
- "traefik.enable=true"
- "traefik.http.routers.hub.rule=Host(`hub.virtualairrescue.com`)"
- "traefik.http.routers.hub.entrypoints=websecure"
- "traefik.http.routers.hub.tls.certresolver=le"
- "traefik.http.services.hub.loadbalancer.server.port=3000"
- "traefik.http.routers.lst-redirect.rule=Host(`lst.virtualairrescue.com`)"
- "traefik.http.routers.lst-redirect.entrypoints=websecure"
- "traefik.http.routers.lst-redirect.tls.certresolver=le"
- "traefik.http.middlewares.lst-to-hub-redirect.redirectregex.regex=^https://lst.virtualairrescue.com/(.*)"
- "traefik.http.middlewares.lst-to-hub-redirect.redirectregex.replacement=https://hub.virtualairrescue.com/"
- "traefik.http.middlewares.lst-to-hub-redirect.redirectregex.permanent=true"
- "traefik.http.routers.lst-redirect.middlewares=lst-to-hub-redirect"
environment:
- NEXTAUTH_URL=${AUTH_HUB_URL}
- NEXTAUTH_SECRET=${AUTH_HUB_SECRET}
env_file:
- .env.prod
networks:
- core_network
- postgres_network
- traefik
hub-server:
build:
context: .
dockerfile: ./apps/hub-server/Dockerfile
container_name: hub-server
labels:
- "traefik.enable=true"
- "traefik.http.routers.hub-server.rule=Host(`api.hub.virtualairrescue.com`)"
- "traefik.http.routers.hub-server.entrypoints=websecure"
- "traefik.http.routers.hub-server.tls.certresolver=le"
- "traefik.http.services.hub-server.loadbalancer.server.port=3000"
env_file:
- .env.prod
networks:
- core_network
- postgres_network
- traefik
depends_on:
postgres:
condition: service_healthy
# Dispatch Service
dispatch:
restart: unless-stopped
build:
context: .
dockerfile: ./apps/dispatch/Dockerfile
args:
- NEXT_PUBLIC_DISPATCH_URL=$NEXT_PUBLIC_DISPATCH_URL
- NEXT_PUBLIC_HUB_URL=$NEXT_PUBLIC_HUB_URL
- NEXT_PUBLIC_DISPATCH_SERVICE_ID=1
- NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
- NEXT_PUBLIC_DISPATCH_SERVER_URL=$NEXT_PUBLIC_DISPATCH_SERVER_URL
env_file:
- .env.prod
deploy:
replicas: 2
labels:
- "traefik.enable=true"
- "traefik.http.routers.ops.rule=Host(`ops.virtualairrescue.com`)"
- "traefik.http.routers.ops.entrypoints=websecure"
- "traefik.http.routers.ops.tls.certresolver=le"
- "traefik.http.services.ops.loadbalancer.server.port=3000"
environment:
- NEXTAUTH_URL=${AUTH_DISPATCH_URL}
- NEXTAUTH_SECRET=${AUTH_DISPATCH_SECRET}
networks:
- postgres_network
- traefik
dispatch-server:
restart: unless-stopped
build:
context: .
dockerfile: ./apps/dispatch-server/Dockerfile
env_file:
- .env.prod
deploy:
replicas: 3
labels:
- "traefik.enable=true"
- "traefik.http.routers.ops-server.rule=Host(`api.ops.virtualairrescue.com`)"
- "traefik.http.routers.ops-server.entrypoints=websecure"
- "traefik.http.routers.ops-server.tls.certresolver=le"
- "traefik.http.services.ops-server.loadBalancer.sticky.cookie.name=server_id"
- "traefik.http.services.ops-server.loadBalancer.sticky.cookie.httpOnly=true"
- "traefik.http.services.ops-server.loadbalancer.server.port=3000"
networks:
- core_network
- postgres_network
- redis_network
- traefik
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
cadvisor:
restart: unless-stopped
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
privileged: true
ports:
- "8090:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
networks:
- core_network
prometheus:
restart: unless-stopped
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- "./packages/prometheus/prometheus.prod.yml:/etc/prometheus/prometheus.yml"
- /var/run/docker.sock:/var/run/docker.sock
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--web.enable-remote-write-receiver"
networks:
- traefik
- core_network
core-server:
restart: unless-stopped
build:
context: .
dockerfile: ./apps/core-server/Dockerfile
env_file:
- .env.prod
deploy:
replicas: 1
labels:
- "traefik.enable=false"
networks:
- postgres_network
- core_network
- redis_network
postgres:
restart: unless-stopped
image: postgres:13
container_name: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U persistant-data -d var"]
interval: 10s
timeout: 5s
retries: 3
ports:
- "5432:5432"
environment:
POSTGRES_USER: persistant-data
POSTGRES_PASSWORD: persistant-data-pw
POSTGRES_DB: var
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- postgres_network
- traefik
redis:
restart: unless-stopped
container_name: redis
image: redis/redis-stack:latest
ports:
- "6379:6379"
volumes:
- "redis_data:/data"
networks:
- redis_network
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
livekit:
image: livekit/livekit-server
command: --config /etc/livekit.yaml --node-ip 148.251.0.86
restart: unless-stopped
networks:
- traefik
- core_network
ports:
- "7881:7881"
- "7882:7882/udp"
depends_on:
- redis
volumes:
- ./packages/livekit/livekit.yaml:/etc/livekit.yaml
labels:
- "traefik.enable=true"
- "traefik.http.routers.livekit.rule=Host(`livekit.virtualairrescue.com`)"
- "traefik.http.routers.livekit.entrypoints=websecure"
- "traefik.http.routers.livekit.tls=true"
- "traefik.http.routers.livekit.tls.certresolver=le"
- "traefik.http.routers.livekit.service=livekit"
- "traefik.http.services.livekit.loadbalancer.server.port=7880"
volumes:
postgres-data:
redis_data:
driver: local
portainer_data:
prometheus_data: