services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: stock_oracle_postgres environment: POSTGRES_USER: stockoracle POSTGRES_PASSWORD: stockoracle2024 POSTGRES_DB: stock_oracle ports: - "15433:5432" # Unique port to avoid conflicts volumes: - postgres_data:/var/lib/postgresql/data - ./scripts/init_db.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U stockoracle -d stock_oracle"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # Redis Cache redis: image: redis:7-alpine container_name: stock_oracle_cache command: redis-server --appendonly yes ports: - "16380:6379" # Unique port to avoid conflicts volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # FastAPI Application api: build: context: . dockerfile: Dockerfile container_name: stock_oracle_api environment: - DATABASE_URL=postgresql+asyncpg://stockoracle:stockoracle2024@postgres:5432/stock_oracle - REDIS_URL=redis://redis:6379/0 - ENVIRONMENT=development - DEBUG=True - API_PORT=18000 - SEC_EMAIL=example@example.com - ALPACA_API_KEY=${ALPACA_API_KEY:-} - ALPACA_SECRET_KEY=${ALPACA_SECRET_KEY:-} - GOOGLE_TRENDS_ENABLED=true ports: - "18001:18000" # External:Internal port mapping depends_on: - postgres - redis volumes: - ./app:/app/app # Mount app directory for development - ./stock_oracle_analyzer.py:/app/stock_oracle_analyzer.py - ./API_DOCUMENTATION.md:/app/API_DOCUMENTATION.md # API documentation - ./yfinance_plus:/app/yfinance_plus # Mount yfinance_plus for development - ./data:/app/data # For data files restart: unless-stopped command: ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "18000", "--reload"] # Frontend Application frontend: build: context: ./frontend dockerfile: Dockerfile container_name: stock_oracle_frontend environment: - NODE_ENV=development - NEXT_PUBLIC_API_URL=http://localhost:18001/api/v1 ports: - "18002:3000" # External:Internal port mapping volumes: - ./frontend:/app # Mount entire frontend directory for development - frontend_node_modules:/app/node_modules # Named volume for node_modules - frontend_next:/app/.next # Named volume for .next build cache depends_on: - api restart: unless-stopped command: ["sh", "-c", "npm ci --legacy-peer-deps && npm run dev"] volumes: postgres_data: redis_data: frontend_node_modules: frontend_next: networks: default: name: stock_oracle_network