diff --git a/.gitignore b/.gitignore index 55080681..7dff4d4d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ mkcert .env .env.local .env.prod +.env.staging # Testing coverage diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml new file mode 100644 index 00000000..edac13f6 --- /dev/null +++ b/docker-compose.staging.yml @@ -0,0 +1,242 @@ +networks: + default: + driver: bridge + postgres_network: + driver: bridge + core_network: + driver: bridge + redis_network: + driver: bridge + traefik: + external: true + moodle_db_network: + driver: bridge + +services: + hub: + 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.premiumag.de`)" + - "traefik.http.routers.hub.entrypoints=websecure" + - "traefik.http.routers.hub.tls.certresolver=le" + - "traefik.http.services.hub.loadbalancer.server.port=3000" + ports: + - 3000:3000 + 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.premiumag.de`)" + - "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: + 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.dispatch.rule=Host(`dispatch.premiumag.de`)" + - "traefik.http.routers.dispatch.entrypoints=websecure" + - "traefik.http.routers.dispatch.tls.certresolver=le" + - "traefik.http.services.dispatch.loadbalancer.server.port=3000" + + environment: + - NEXTAUTH_URL=${AUTH_DISPATCH_URL} + - NEXTAUTH_SECRET=${AUTH_DISPATCH_SECRET} + + networks: + - postgres_network + - traefik + dispatch-server: + build: + context: . + dockerfile: ./apps/dispatch-server/Dockerfile + env_file: + - .env.prod + deploy: + replicas: 3 + labels: + - "traefik.enable=true" + - "traefik.http.routers.dispatch-server.rule=Host(`api.dispatch.premiumag.de`)" + - "traefik.http.routers.dispatch-server.entrypoints=websecure" + - "traefik.http.routers.dispatch-server.tls.certresolver=le" + - "traefik.http.services.dispatch-server.loadBalancer.sticky.cookie.name=server_id" + - "traefik.http.services.dispatch-server.loadBalancer.sticky.cookie.httpOnly=true" + - "traefik.http.services.dispatch-server.loadbalancer.server.port=3000" + networks: + - core_network + - postgres_network + - redis_network + - traefik + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + cadvisor: + image: gcr.io/cadvisor/cadvisor:latest + container_name: cadvisor + ports: + - "8090:8080" + volumes: + - /:/rootfs:ro + - /var/run:/var/run:ro + - /sys:/sys:ro + - /var/lib/docker/:/var/lib/docker:ro + networks: + - core_network + restart: unless-stopped + prometheus: + 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: + build: + context: . + dockerfile: ./apps/core-server/Dockerfile + env_file: + - .env.prod + deploy: + replicas: 1 + labels: + - "traefik.enable=false" + networks: + - postgres_network + - core_network + + docs: + build: + context: . + dockerfile: ./apps/docs/Dockerfile + labels: + - "traefik.enable=true" + - "traefik.http.routers.docs.rule=Host(`docs.premiumag.de`)" + - "traefik.http.routers.docs.entrypoints=websecure" + - "traefik.http.routers.docs.tls.certresolver=le" + - "traefik.http.services.docs.loadbalancer.server.port=80" + + networks: + - traefik + + postgres: + 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: + 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 37.221.196.140 + 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.premiumag.de`)" + - "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: + moodle_data: + moodle_database: + moodle_moodledata: + redis_data: + driver: local + portainer_data: + prometheus_data: diff --git a/package.json b/package.json index 110a8e5f..43eff148 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "lint": "turbo lint", "studio": "turbo run studio", "prod-start": "docker-compose --env-file .env.prod -f 'docker-compose.prod.yml' up -d --build", + "staging-start": "docker-compose --env-file .env.staging -f 'docker-compose.staging.yml' up -d --build", "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, "devDependencies": {