networks: chat-network: driver: bridge services: frontend: # Fertiges Frontend-Image von Docker Hub. image: francesco448/chat-app-frontend:latest container_name: chat-app-frontend restart: unless-stopped # Frontend startet erst, nachdem der Backend-Container gestartet wurde. depends_on: - backend # Nur das Frontend wird nach außen veröffentlicht. # Standardmäßig TrueNAS-Port 9004 -> Nginx-Port 80. # FRONTEND_PORT kann optional über .env geändert werden. ports: - "${FRONTEND_PORT:-9004}:80" networks: - chat-network backend: image: francesco448/chat-app-backend:latest container_name: chat-app-backend restart: unless-stopped depends_on: mongo: condition: service_healthy environment: - PORT=4000 - NODE_ENV=production - CLIENT_ORIGIN=${CLIENT_ORIGIN:?CLIENT_ORIGIN muss gesetzt werden} - DATA_STORE=mongo - MONGO_URI=mongodb://${MONGO_ROOT_USER:-admin}:${MONGO_ROOT_PASSWORD:?MONGO_ROOT_PASSWORD muss gesetzt werden}@mongo:27017/${MONGO_DB:-chatapp}?authSource=admin - MONGO_DB=${MONGO_DB:-chatapp} networks: - chat-network healthcheck: test: - CMD - node - -e - "fetch('http://localhost:4000/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))" interval: 10s timeout: 5s retries: 10 start_period: 10s mongo: # Feste Major-Version verwenden statt "latest". image: mongo:7 container_name: chat-app-mongo restart: unless-stopped environment: # Benutzer kann über .env überschrieben werden. - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER:-admin} # Für Production kein unsicheres Default-Passwort wie "chatpass". # Der Stack startet nicht, solange das Passwort in .env fehlt. - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD:?MONGO_ROOT_PASSWORD muss in .env gesetzt werden} # Datenbankname kann über .env überschrieben werden. - MONGO_INITDB_DATABASE=${MONGO_DB:-chatapp} # Persistenz direkt auf deinem TrueNAS-Dataset. volumes: - /mnt/PoolHDD/AppData/Chat-App/mongodb:/data/db # Kein Port 27017 nach außen. # MongoDB ist ausschließlich im internen Docker-Netzwerk erreichbar. networks: - chat-network # Authentifizierter MongoDB-Healthcheck. # $$ verhindert, dass Docker Compose die Variablen bereits auf dem Host ersetzt. healthcheck: test: - CMD-SHELL - >- mongosh --quiet --host 127.0.0.1 --username "$$MONGO_INITDB_ROOT_USERNAME" --password "$$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase admin --eval "quit(db.adminCommand('ping').ok ? 0 : 2)" interval: 10s timeout: 5s retries: 10 start_period: 20s