services: # PostgreSQL Database database: image: postgres:15-alpine container_name: lernplattform_db environment: POSTGRES_DB: ${DB_NAME:-lernplattform} POSTGRES_USER: ${DB_USER:-lernplattform_user} POSTGRES_PASSWORD: ${DB_PASSWORD:-changeme123} PGDATA: /var/lib/postgresql/data/pgdata volumes: - postgres_data:/var/lib/postgresql/data - ./database/init:/docker-entrypoint-initdb.d:ro ports: - "${DB_PORT:-5432}:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-lernplattform_user} -d ${DB_NAME:-lernplattform}"] interval: 10s timeout: 5s retries: 5 networks: - lernplattform_network # Backend API backend: build: context: ./backend dockerfile: Dockerfile container_name: lernplattform_backend environment: NODE_ENV: ${NODE_ENV:-production} PORT: ${BACKEND_PORT:-3000} DB_HOST: database DB_PORT: 5432 DB_NAME: ${DB_NAME:-lernplattform} DB_USER: ${DB_USER:-lernplattform_user} DB_PASSWORD: ${DB_PASSWORD:-changeme123} JWT_SECRET: ${JWT_SECRET:-change_this_secret_key_in_production} SESSION_SECRET: ${SESSION_SECRET:-change_this_session_secret} ADMIN_DEFAULT_PASSWORD: ${ADMIN_DEFAULT_PASSWORD:-admin123} volumes: - ./backend/lessons:/app/lessons:ro ports: - "${BACKEND_PORT:-3000}:3000" depends_on: database: condition: service_healthy healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - lernplattform_network restart: unless-stopped # Frontend frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_URL: ${VITE_API_URL:-http://localhost:3000/api} container_name: lernplattform_frontend ports: - "${FRONTEND_PORT:-80}:80" depends_on: - backend networks: - lernplattform_network restart: unless-stopped volumes: postgres_data: driver: local networks: lernplattform_network: driver: bridge