# Munich News Daily - Docker Compose Configuration # # GPU Support: # To enable GPU acceleration for Ollama (5-10x faster): # 1. Check GPU availability: ./check-gpu.sh # 2. Start with GPU: ./start-with-gpu.sh # Or manually: docker-compose -f docker-compose.yml -f docker-compose.gpu.yml up -d # # Security: # Ollama service is internal-only (no ports exposed to host) # Only accessible by other Docker Compose services # # See docs/OLLAMA_SETUP.md for detailed setup instructions services: # Ollama AI Service (Internal only - not exposed to host) ollama: image: ollama/ollama:latest container_name: munich-news-ollama restart: unless-stopped # No ports exposed - only accessible within Docker network volumes: - ollama_data:/root/.ollama networks: - munich-news-network # GPU support (uncomment if you have NVIDIA GPU) # deploy: # resources: # reservations: # devices: # - driver: nvidia # count: all # capabilities: [gpu] healthcheck: test: ["CMD-SHELL", "ollama list || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s # Ollama Model Loader - Pulls phi3:latest on startup ollama-setup: image: curlimages/curl:latest container_name: munich-news-ollama-setup depends_on: ollama: condition: service_healthy networks: - munich-news-network entrypoint: /bin/sh command: > -c " echo 'Waiting for Ollama service to be ready...' && sleep 5 && echo 'Pulling phi3:latest model via API...' && curl -X POST http://ollama:11434/api/pull -d '{\"name\":\"phi3:latest\"}' && echo '' && echo 'Model phi3:latest pull initiated!' " restart: "no" # MongoDB Database mongodb: image: mongo:latest container_name: munich-news-mongodb restart: unless-stopped ports: - "27017:27017" environment: # For production, set MONGO_PASSWORD environment variable MONGO_INITDB_ROOT_USERNAME: ${MONGO_USERNAME:-admin} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-changeme} MONGO_INITDB_DATABASE: munich_news volumes: - mongodb_data:/data/db - mongodb_config:/data/configdb networks: - munich-news-network command: mongod --bind_ip_all ${MONGO_AUTH:---auth} healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 30s timeout: 10s retries: 3 # News Crawler - Runs at 6 AM Berlin time crawler: build: context: . dockerfile: news_crawler/Dockerfile container_name: munich-news-crawler restart: unless-stopped depends_on: - mongodb - ollama environment: - MONGODB_URI=mongodb://${MONGO_USERNAME:-admin}:${MONGO_PASSWORD:-changeme}@mongodb:27017/ - TZ=Europe/Berlin volumes: - ./backend/.env:/app/.env:ro networks: - munich-news-network healthcheck: test: ["CMD", "python", "-c", "import sys; sys.exit(0)"] interval: 1m timeout: 10s retries: 3 # Backend API - Tracking and analytics backend: build: context: ./backend dockerfile: Dockerfile container_name: munich-news-backend restart: unless-stopped depends_on: - mongodb ports: - "5001:5001" environment: - MONGODB_URI=mongodb://${MONGO_USERNAME:-admin}:${MONGO_PASSWORD:-changeme}@mongodb:27017/ - FLASK_PORT=5001 - TZ=Europe/Berlin volumes: - ./backend/.env:/app/.env:ro - /var/run/docker.sock:/var/run/docker.sock:ro networks: - munich-news-network healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5001/health')"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Newsletter Sender - Runs at 7 AM Berlin time sender: build: context: . dockerfile: news_sender/Dockerfile container_name: munich-news-sender restart: unless-stopped depends_on: - mongodb - backend - crawler environment: - MONGODB_URI=mongodb://${MONGO_USERNAME:-admin}:${MONGO_PASSWORD:-changeme}@mongodb:27017/ - TZ=Europe/Berlin volumes: - ./backend/.env:/app/.env:ro networks: - munich-news-network healthcheck: test: ["CMD", "python", "-c", "import sys; sys.exit(0)"] interval: 1m timeout: 10s retries: 3 volumes: mongodb_data: driver: local mongodb_config: driver: local ollama_data: driver: local networks: munich-news-network: driver: bridge