From c441e53be4419080c475aadaaa805d4c48909719 Mon Sep 17 00:00:00 2001 From: Daniel Rosel Date: Thu, 2 Apr 2026 19:19:10 +0200 Subject: [PATCH] Update docker-compose.yml for single service deployment with Dokploy Traefik --- docker-compose.yml | 226 ++++++++++++++++++++------------------------- 1 file changed, 101 insertions(+), 125 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 275954b..5ee20e9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,162 +1,138 @@ -services: - redis: - container_name: "${NAME}-redis" - image: redis:7-alpine - ports: - - "${REDIS_PORT}:6379" - volumes: - - redis_data:/data - restart: unless-stopped +version: "3.8" - ml-inference: - container_name: "${NAME}-mlinfer" +networks: + dokploy-network: + external: true + cvfs-network: + +services: + webapp: + container_name: "cvfs-webapp" build: context: ./ - dockerfile: ./docker/ml.Dockerfile - ports: - - "8200:8000" + dockerfile: ./docker/webapp.Dockerfile environment: - - ML_LATEST_WEIGHTS_PATH=/app/models/weights - - PYTHONPATH=/app - volumes: - - ./ml/models:/app/models - - ./.env:/app/.env - depends_on: - - redis + - NEXT_PUBLIC_API_BASE_URL=https://api.cv.alves.world + networks: + - dokploy-network + - cvfs-network restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.cvfs-webapp.rule=Host(`cv.alves.world`)" + - "traefik.http.services.cvfs-webapp.loadbalancer.server.port=3000" + - "traefik.http.routers.cvfs-webapp.entrypoints=websecure" + - "traefik.http.routers.cvfs-webapp.tls.certresolver=letsencrypt" + + backend: + container_name: "cvfs-backend" + build: + context: ./ + dockerfile: ./docker/backend-fastapi.Dockerfile + environment: + - BACKEND_PORT=8080 + - DATABASE_URL=postgresql+asyncpg://postgres:postgres@cvfs-postgres:5432/resume_branches + - MINIO_ENDPOINT=http://cvfs-minio:9000 + - MINIO_BUCKET=resume-branches + - MINIO_REGION=us-east-1 + - MINIO_ROOT_USER=${MINIO_ROOT_USER:-minioadmin} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioadmin} + - PUBLIC_BASE_URL=https://cv.alves.world + - CV_PUBLIC_DOMAIN=cv.alves.world + - REDIS_URL=redis://cvfs-redis:6379/0 + - CELERY_BROKER_URL=redis://cvfs-redis:6379/0 + - CELERY_RESULT_BACKEND=redis://cvfs-redis:6379/0 + - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} + depends_on: + - postgres + - minio + - redis + networks: + - dokploy-network + - cvfs-network + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.cvfs-backend.rule=Host(`api.cv.alves.world`)" + - "traefik.http.services.cvfs-backend.loadbalancer.server.port=8080" + - "traefik.http.routers.cvfs-backend.entrypoints=websecure" + - "traefik.http.routers.cvfs-backend.tls.certresolver=letsencrypt" worker: - container_name: "${NAME}-worker" + container_name: "cvfs-worker" build: context: ./ dockerfile: ./docker/worker.Dockerfile environment: - - REDIS_URL=redis://redis:6379 + - REDIS_URL=redis://cvfs-redis:6379/0 + - CELERY_BROKER_URL=redis://cvfs-redis:6379/0 + - CELERY_RESULT_BACKEND=redis://cvfs-redis:6379/0 + - MINIO_ENDPOINT=http://cvfs-minio:9000 + - MINIO_BUCKET=resume-branches + - MINIO_REGION=us-east-1 + - MINIO_ROOT_USER=${MINIO_ROOT_USER:-minioadmin} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioadmin} - PYTHONPATH=/app - volumes: - - ./.env:/app/.env + - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} depends_on: - redis + - minio + networks: + - cvfs-network + restart: unless-stopped + + redis: + container_name: "cvfs-redis" + image: redis:7-alpine + volumes: + - redis_data:/data + networks: + - cvfs-network + restart: unless-stopped + + postgres: + image: postgres:15-alpine + container_name: "cvfs-postgres" + environment: + POSTGRES_DB: resume_branches + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - cvfs-network restart: unless-stopped minio: image: minio/minio:latest - container_name: "${NAME}-minio" - profiles: ["minio"] - ports: - - "9900:9000" # API endpoint - - "9901:9001" # Web console + container_name: "cvfs-minio" environment: - MINIO_ROOT_USER: minioadmin - MINIO_ROOT_PASSWORD: minioadmin + MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} volumes: - minio_data:/data command: server /data --console-address ":9001" + networks: + - cvfs-network restart: unless-stopped create-bucket: image: minio/mc - container_name: "${NAME}-create-bucket" - profiles: ["minio"] + container_name: "cvfs-create-bucket" depends_on: - minio + networks: + - cvfs-network entrypoint: > /bin/sh -c " sleep 5; - mc alias set myminio http://minio:9000 minioadmin minioadmin; - mc mb myminio/${NAME:-app} --ignore-existing; + mc alias set myminio http://cvfs-minio:9000 $${MINIO_ROOT_USER:-minioadmin} $${MINIO_ROOT_PASSWORD:-minioadmin}; + mc mb myminio/resume-branches --ignore-existing; + mc anonymous set public myminio/resume-branches; exit 0; " - tensorboard: - image: tensorflow/tensorflow:latest - container_name: "${NAME}-tensorboard" - profiles: ["tensorboard"] - ports: - - "6006:6006" - volumes: - - ./ml/tensorboard:/logs - command: tensorboard --logdir=/logs --host=0.0.0.0 --port=6006 - restart: unless-stopped - - mlflow: - image: python:3.12-slim - container_name: "${NAME}-mlflow" - profiles: ["mlflow"] - ports: - - "5000:5000" - volumes: - - mlflow_data:/mlflow - command: > - /bin/sh -c " - pip install --no-cache-dir mlflow && - mlflow server - --host 0.0.0.0 - --port 5000 - --backend-store-uri sqlite:////mlflow/mlflow.db - --default-artifact-root /mlflow/artifacts - " - restart: unless-stopped - - # Logging Infrastructure - Minimal Setup - loki: - image: grafana/loki:2.9.0 - container_name: "${NAME}-loki" - profiles: ["logging"] - ports: - - "${LOKI_PORT}:3100" - volumes: - - loki_data:/loki - restart: unless-stopped - - grafana: - image: grafana/grafana:10.2.0 - container_name: "${NAME}-grafana" - profiles: ["logging"] - ports: - - "${GRAFANA_PORT}:3000" - environment: - - GF_SECURITY_ADMIN_PASSWORD=admin - volumes: - - grafana_data:/var/lib/grafana - restart: unless-stopped - - # Database Services - postgres: - image: postgres:15-alpine - container_name: "${NAME}-postgres" - profiles: ["database", "postgres"] - ports: - - "${POSTGRES_PORT:-5432}:5432" - environment: - POSTGRES_DB: ${POSTGRES_DB:-app} - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} - volumes: - - postgres_data:/var/lib/postgresql/data - # place .sql files in ./database/ to auto-run on first start - - ./database/:/docker-entrypoint-initdb.d/:ro - restart: unless-stopped - - mongodb: - image: mongo:7-jammy - container_name: "${NAME}-mongodb" - profiles: ["database", "mongodb"] - ports: - - "${MONGO_PORT:-27017}:27017" - environment: - MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-admin} - MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-admin123} - MONGO_INITDB_DATABASE: ${MONGO_DB:-app} - volumes: - - mongodb_data:/data/db - restart: unless-stopped - volumes: redis_data: - minio_data: - loki_data: - grafana_data: postgres_data: - mongodb_data: - mlflow_data: + minio_data: \ No newline at end of file