This commit is contained in:
Johannes
2025-05-30 05:36:46 +02:00
parent 3539a4c6f6
commit d968507484
8 changed files with 202 additions and 116 deletions

View File

@@ -1,4 +1,5 @@
node_modules node_modules
letsencrypt/
apps/dispatch/node_modules apps/dispatch/node_modules
apps/dispatch-server/node_modules apps/dispatch-server/node_modules
apps/hub/node_modules apps/hub/node_modules

View File

@@ -7,18 +7,18 @@ AUTH_HUB_SECRET=var
AUTH_DISPATCH_COOKIE_PREFIX=DISPATCH AUTH_DISPATCH_COOKIE_PREFIX=DISPATCH
AUTH_HUB_COOKIE_PREFIX=HUB AUTH_HUB_COOKIE_PREFIX=HUB
AUTH_DISPATCH_URL=http://premiumag.de:3001 AUTH_DISPATCH_URL=https://dispatch.premiumag.de
AUTH_HUB_URL=http://premiumag.de:3000 AUTH_HUB_URL=https://hub.premiumag.de
NEXT_PUBLIC_DISPATCH_SERVICE_ID=1 NEXT_PUBLIC_DISPATCH_SERVICE_ID=1
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
# 🌐 Öffentliche URLs # 🌐 Öffentliche URLs
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
NEXT_PUBLIC_HUB_URL=http://premiumag.de:3000 NEXT_PUBLIC_HUB_URL=https://hub.premiumag.de
NEXT_PUBLIC_HUB_SERVER_URL=http://premiumag.de:3003 NEXT_PUBLIC_HUB_SERVER_URL=https://api.hub.premiumag.de
NEXT_PUBLIC_DISPATCH_URL=http://premiumag.de:3001 NEXT_PUBLIC_DISPATCH_URL=https://dispatch.premiumag.de
NEXT_PUBLIC_DISPATCH_SERVER_URL=http://premiumag.de:3002 NEXT_PUBLIC_DISPATCH_SERVER_URL=https://api.dispatch.premiumag.de
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
# 🗄️ Datenbank # 🗄️ Datenbank
@@ -28,7 +28,7 @@ DATABASE_URL=postgresql://persistant-data:persistant-data-pw@postgres:5432/var
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
# 📡 LiveKit Konfiguration # 📡 LiveKit Konfiguration
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
NEXT_PUBLIC_LIVEKIT_URL=ws://localhost:7880 NEXT_PUBLIC_LIVEKIT_URL=wss://livekit.premiumag.de
LIVEKIT_API_KEY=APIAnsGdtdYp2Ho LIVEKIT_API_KEY=APIAnsGdtdYp2Ho
LIVEKIT_API_SECRET=tdPjVsYUx8ddC7K9NvdmVAeLRF9GeADD6Fedm1x63fWC LIVEKIT_API_SECRET=tdPjVsYUx8ddC7K9NvdmVAeLRF9GeADD6Fedm1x63fWC
@@ -45,15 +45,14 @@ REDIS_PORT=6379
# 🧠 HUB Server (Backend) # 🧠 HUB Server (Backend)
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
HUB_SERVER_PORT=3000 HUB_SERVER_PORT=3000
HUB_URL=
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
# 📚 Moodle # 📚 Moodle
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
MOODLE_URL=http://premiumag.de:8081 MOODLE_URL=https://02.premiumag.de:8081
MOODLE_API_TOKEN=ac346f0324647b68488d13fd52a9bbe8 MOODLE_API_TOKEN=ac346f0324647b68488d13fd52a9bbe8
MOODLE_USER_PASSWORD=var-api-user-P1 MOODLE_USER_PASSWORD=var-api-user-P1
NEXT_PUBLIC_MOODLE_URL=http://premiumag.de:8081 NEXT_PUBLIC_MOODLE_URL=https://02.premiumag.de:8081
# ─────────────────────────────────────────────── # ───────────────────────────────────────────────
# 📧 E-Mail Einstellungen (nur HUB Server) # 📧 E-Mail Einstellungen (nur HUB Server)

View File

@@ -5,4 +5,5 @@ console.log("ENV:", process.env.NEXT_PUBLIC_DISPATCH_SERVER_URL);
export const dispatchSocket: Socket = io(process.env.NEXT_PUBLIC_DISPATCH_SERVER_URL, { export const dispatchSocket: Socket = io(process.env.NEXT_PUBLIC_DISPATCH_SERVER_URL, {
autoConnect: false, autoConnect: false,
transports: ["websocket"],
}); });

View File

@@ -3,4 +3,5 @@ import { io, Socket } from "socket.io-client";
export const pilotSocket: Socket = io(process.env.NEXT_PUBLIC_DISPATCH_SERVER_URL, { export const pilotSocket: Socket = io(process.env.NEXT_PUBLIC_DISPATCH_SERVER_URL, {
autoConnect: false, autoConnect: false,
transports: ["websocket"],
}); });

View File

@@ -27,6 +27,7 @@ export const options: AuthOptions = {
}, },
}), }),
], ],
secret: process.env.AUTH_HUB_SECRET, secret: process.env.AUTH_HUB_SECRET,
session: { session: {
strategy: "jwt", strategy: "jwt",

View File

@@ -3,7 +3,7 @@ export const services = [
id: "1", id: "1",
service: "dispatch", service: "dispatch",
name: "Leitstellendisposition", name: "Leitstellendisposition",
approvedUrls: ["http://localhost:3001"], approvedUrls: ["https://dispatch.premiumag.de"],
}, },
{ {
id: "2", id: "2",

View File

@@ -1,31 +1,57 @@
services: services:
traefik: traefik:
image: traefik:v2.11 image: traefik:v3.4
ports:
- "80:80"
- "443:443"
- "8080:8080" # Traefik Dashboard
deploy:
placement:
constraints:
- node.role == manager
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`traefik.premiumag.de`)"
- "traefik.http.routers.api.service=api@internal"
- "traefik.http.routers.api.entrypoints=web"
- "traefik.http.services.api.loadbalancer.server.port=8080"
command: command:
- "--api.dashboard=true" - "--api.dashboard=true" # Dashboard aktivieren (nicht für Produktion)
- "--api.insecure=true" # Nur für Testzwecke! - "--api.insecure=true" # Unsicheres Dashboard (nur für Entwicklung)
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.useBindPortIP=true"
- "--entrypoints.web.address=:80" - "--entrypoints.web.address=:80"
- "--providers.docker" - --entrypoints.web.http.redirections.entryPoint.to=websecure
- "--providers.docker.swarmmode=true" - --entrypoints.web.http.redirections.entryPoint.scheme=https
- --entrypoints.web.http.redirections.entrypoint.permanent=true
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.le.acme.httpchallenge=true"
- "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.le.acme.email=johannesambre@gmail.com"
- "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
ports:
- "443:443" # HTTPS-Zugang
- "80:80" # HTTP-Zugang
- "8080:8080" # Traefik Dashboard
volumes: volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro" - "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt"
networks:
- traefik_network
portainer:
image: portainer/portainer-ce:latest
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
labels:
# Frontend
- "traefik.enable=true"
- "traefik.http.routers.portainer-frontend.rule=Host(`portainer.premiumag.de`)"
- "traefik.http.routers.portainer-frontend.entrypoints=websecure"
- "traefik.http.services.portainer-frontend.loadbalancer.server.port=9000"
- "traefik.http.routers.portainer-frontend.service=portainer-frontend"
- "traefik.http.routers.portainer-frontend.tls.certresolver=le"
# Edge
- "traefik.http.routers.portainer-edge.rule=Host(`edge.premiumag.de`)"
- "traefik.http.routers.portainer-edge.entrypoints=websecure"
- "traefik.http.services.portainer-edge.loadbalancer.server.port=8000"
- "traefik.http.routers.portainer-edge.service=portainer-edge"
- "traefik.http.routers.portainer-edge.tls.certresolver=le"
networks:
- traefik_network
# Dispatch Service
dispatch: dispatch:
deploy:
replicas: 3
build: build:
context: . context: .
dockerfile: ./apps/dispatch/Dockerfile dockerfile: ./apps/dispatch/Dockerfile
@@ -35,14 +61,53 @@ services:
- NEXT_PUBLIC_DISPATCH_SERVICE_ID=1 - NEXT_PUBLIC_DISPATCH_SERVICE_ID=1
- NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL - NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
- NEXT_PUBLIC_DISPATCH_SERVER_URL=$NEXT_PUBLIC_DISPATCH_SERVER_URL - NEXT_PUBLIC_DISPATCH_SERVER_URL=$NEXT_PUBLIC_DISPATCH_SERVER_URL
env_file:
- .env.prod
deploy:
replicas: 1
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.dispatch.rule=Host(`dispatch.premiumag.de`)" - "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" - "traefik.http.services.dispatch.loadbalancer.server.port=3000"
env_file: - "traefik.docker.network=var-monorepo_traefik_network"
- .env.prod environment:
- NEXTAUTH_URL=${AUTH_DISPATCH_URL}
networks: networks:
- postgres_network - postgres_network
- traefik_network
dispatch-server:
build:
context: .
dockerfile: ./apps/dispatch-server/Dockerfile
env_file:
- .env.prod
deploy:
replicas: 1
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"
- "traefik.docker.network=var-monorepo_traefik_network"
networks:
- postgres_network
- redis_network
- traefik_network
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
# Hub Service
hub: hub:
build: build:
context: . context: .
@@ -52,47 +117,41 @@ services:
- NEXT_PUBLIC_HUB_URL=$NEXT_PUBLIC_HUB_URL - NEXT_PUBLIC_HUB_URL=$NEXT_PUBLIC_HUB_URL
- NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL - NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
- NEXT_PUBLIC_HUB_SERVER_URL=$NEXT_PUBLIC_HUB_SERVER_URL - NEXT_PUBLIC_HUB_SERVER_URL=$NEXT_PUBLIC_HUB_SERVER_URL
container_name: hub labels:
ports: - "traefik.enable=true"
- "3000:3000" - "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"
- "traefik.docker.network=var-monorepo_traefik_network"
environment:
- NEXTAUTH_URL=${AUTH_HUB_URL}
env_file: env_file:
- .env.prod - .env.prod
networks: networks:
- postgres_network - postgres_network
- traefik_network
hub-server: hub-server:
build: build:
context: . context: .
dockerfile: ./apps/hub-server/Dockerfile dockerfile: ./apps/hub-server/Dockerfile
container_name: hub-server container_name: hub-server
ports:
- "3003:3000"
env_file:
- .env.prod
networks:
- postgres_network
depends_on:
postgres:
condition: service_healthy
dispatch-server:
deploy:
replicas: 3
build:
context: .
dockerfile: ./apps/dispatch-server/Dockerfile
env_file:
- .env.prod
networks:
- postgres_network
- redis_network
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.dispatch.rule=Host(`dispatch-server.premiumag.de`)" - "traefik.http.routers.hub-server.rule=Host(`api.hub.premiumag.de`)"
- "traefik.http.services.dispatch.loadbalancer.server.port=3000" - "traefik.http.routers.hub-server.entrypoints=websecure"
- "traefik.http.routers.hub-server.tls.certresolver=le"
- "traefik.http.services.hub-server.loadbalancer.server.port=3000"
- "traefik.docker.network=var-monorepo_traefik_network"
env_file:
- .env.prod
networks:
- postgres_network
- traefik_network
depends_on: depends_on:
postgres: postgres:
condition: service_healthy condition: service_healthy
redis:
condition: service_healthy
postgres: postgres:
image: postgres:13 image: postgres:13
container_name: postgres container_name: postgres
@@ -112,15 +171,7 @@ services:
- postgres-data:/var/lib/postgresql/data - postgres-data:/var/lib/postgresql/data
networks: networks:
- postgres_network - postgres_network
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "4100:3000"
depends_on:
- postgres
volumes:
- ./grafana:/var/lib/grafana
redis: redis:
container_name: redis container_name: redis
image: redis/redis-stack:latest image: redis/redis-stack:latest
@@ -133,66 +184,98 @@ services:
healthcheck: healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"] test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
moodle_database: # grafana:
container_name: moodle_database # image: grafana/grafana:latest
image: docker.io/bitnami/mariadb:latest # container_name: grafana
environment: # ports:
# ALLOW_EMPTY_PASSWORD is recommended only for development. # - "4100:3000"
- ALLOW_EMPTY_PASSWORD=yes # depends_on:
- MARIADB_USER=bn_moodle # - postgres
- MARIADB_DATABASE=bitnami_moodle # volumes:
- MARIADB_CHARACTER_SET=utf8mb4 # - ./grafana:/var/lib/grafana
- MARIADB_COLLATE=utf8mb4_unicode_ci
volumes:
- "moodle_database:/bitnami/mariadb"
moodle:
image: bitnami/moodle:latest
container_name: moodle
ports:
- "8081:8080" # Moodle läuft auf http://localhost:8081
environment:
- MOODLE_DATABASE_HOST=moodle_database
- MOODLE_DATABASE_PORT_NUMBER=3306
- MOODLE_DATABASE_USER=bn_moodle
- MOODLE_DATABASE_NAME=bitnami_moodle
- MOODLE_USERNAME=admin #moodle_database:
- MOODLE_PASSWORD=admin123 # container_name: moodle_database
- MOODLE_EMAIL=admin@example.com # image: docker.io/bitnami/mariadb:latest
- MOODLE_SITE_NAME="Mein Lokales Moodle" # environment:
- MOODLE_SSLPROXY=false # # ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes # - ALLOW_EMPTY_PASSWORD=yes
depends_on: # - MARIADB_USER=bn_moodle
- moodle_database # - MARIADB_DATABASE=bitnami_moodle
volumes: # - MARIADB_CHARACTER_SET=utf8mb4
- moodle_data:/bitnami/moodle # - MARIADB_COLLATE=utf8mb4_unicode_ci
- moodle_moodledata:/bitnami/moodledata # volumes:
# - "moodle_database:/bitnami/mariadb"
# networks:
# - moodle_db_network
#moodle:
# image: bitnami/moodle:latest
# container_name: moodle
# environment:
# - MOODLE_DATABASE_HOST=moodle_database
# - MOODLE_DATABASE_PORT_NUMBER=3306
# - MOODLE_DATABASE_USER=bn_moodle
# - MOODLE_DATABASE_NAME=bitnami_moodle
#
# - MOODLE_USERNAME=admin
# - MOODLE_PASSWORD=admin123
# - MOODLE_EMAIL=admin@example.com
# - MOODLE_SITE_NAME="Mein Lokales Moodle"
# - MOODLE_SSLPROXY=false
# - ALLOW_EMPTY_PASSWORD=yes
# depends_on:
# - moodle_database
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.moodle.rule=Host(`moodle.premiumag.de`)"
# - "traefik.http.routers.moodle.entrypoints=websecure"
# - "traefik.http.routers.moodle.tls.certresolver=le"
# - "traefik.http.services.moodle.loadbalancer.server.port=8080"
# - "traefik.docker.network=var-monorepo_traefik_network"
# networks:
# - moodle_db_network
# - traefik_network
# volumes:
# - moodle_data:/bitnami/moodle
# - moodle_moodledata:/bitnami/moodledata
# networks:
# - postgres_network
# - traefik_network
# Für den Zugriff auf den Host # Für den Zugriff auf den Host
livekit-server: livekit:
image: livekit/livekit-server image: livekit/livekit-server
container_name: livekit_server command: --config /etc/livekit.yaml --node-ip 37.221.196.140
restart: unless-stopped restart: unless-stopped
networks:
- traefik_network
ports: ports:
- "7880:7880"
- "7881:7881" - "7881:7881"
- "7882:7882/udp" - "7882:7882/udp"
depends_on:
- redis
volumes: volumes:
- "./livekit.yaml:/livekit.yaml" - ./livekit.yaml:/etc/livekit.yaml
command: labels:
- "--config" - "traefik.enable=true"
- "/livekit.yaml" - "traefik.http.routers.livekit.rule=Host(`livekit.premiumag.de`)"
- "--node-ip=127.0.0.1" - "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"
networks: networks:
default: default:
driver: bridge driver: bridge
networks:
traefik_public:
external: true
postgres_network: postgres_network:
driver: bridge driver: bridge
redis_network: redis_network:
driver: bridge driver: bridge
traefik_network:
driver: bridge
moodle_db_network:
driver: bridge
volumes: volumes:
postgres-data: postgres-data:
@@ -201,3 +284,4 @@ volumes:
moodle_moodledata: moodle_moodledata:
redis_data: redis_data:
driver: local driver: local
portainer_data:

View File

@@ -3,7 +3,6 @@ rtc:
udp_port: 7882 udp_port: 7882
tcp_port: 7881 tcp_port: 7881
use_external_ip: false use_external_ip: false
enable_loopback_candidate: false
# ice_servers: # ice_servers:
# - urls: ["stun:stun.l.google.com:19302"] # - urls: ["stun:stun.l.google.com:19302"]
keys: keys: