diff --git a/Makefile b/Makefile index 70588bab..9e19f303 100644 --- a/Makefile +++ b/Makefile @@ -255,8 +255,47 @@ docker-stop: docker-logs: @./scripts/docker.sh logs -# View Docker development logs docker-logs-frontend: @./scripts/docker.sh logs --frontend docker-logs-gateway: - @./scripts/docker.sh logs --gateway \ No newline at end of file + @./scripts/docker.sh logs --gateway + +# ========================================== +# Docker Publish Command +# ========================================== +# Usage: make docker-publish VERSION=v220.20251202 SERVICE=frontend +# Example: make docker-publish VERSION=v220.20251202 SERVICE=frontend +docker-publish: + @if [ -z "$(VERSION)" ]; then \ + echo "✗ VERSION is required (e.g. v220.20251202)"; \ + exit 1; \ + fi + @if [ -z "$(SERVICE)" ]; then \ + echo "✗ SERVICE is required (frontend, gateway, langgraph)"; \ + exit 1; \ + fi + @echo "==========================================" + @echo " Building Docker image for $(SERVICE)" + @echo "==========================================" + @IMAGE=registry.xueai.art/deerflow/deerflow-$(SERVICE):$(VERSION); \ + DOCKERFILE=$$(case "$(SERVICE)" in \ + frontend) echo "frontend/Dockerfile";; \ + gateway) echo "backend/Dockerfile";; \ + langgraph) echo "backend/Dockerfile";; \ + *) echo "";; \ + esac); \ + if [ -z "$$DOCKERFILE" ]; then \ + echo "✗ Unknown SERVICE: $(SERVICE)"; \ + exit 1; \ + fi; \ + docker build -f $$DOCKERFILE -t $$IMAGE .; \ + if [ $$? -ne 0 ]; then \ + echo "✗ Docker build failed"; \ + exit 1; \ + fi; \ + docker push $$IMAGE; \ + if [ $$? -ne 0 ]; then \ + echo "✗ Docker push failed"; \ + exit 1; \ + fi; \ + echo "✓ Docker image $$IMAGE built and pushed successfully" \ No newline at end of file diff --git a/docker/docker-compose-dev.yaml b/docker/docker-compose-dev.yaml index a8dfe4f9..c4b6649a 100644 --- a/docker/docker-compose-dev.yaml +++ b/docker/docker-compose-dev.yaml @@ -75,9 +75,9 @@ services: - deer-flow-dev restart: unless-stopped - # Frontend - Next.js Development Server +# Frontend - Next.js Development Server frontend: -# image: deer-flow-dev-frontend:latest + # image: deer-flow-dev-frontend:latest build: context: ../ dockerfile: frontend/Dockerfile @@ -103,9 +103,9 @@ services: - deer-flow-dev restart: unless-stopped - # Backend - Gateway API +# Backend - Gateway API gateway: -# image: deer-flow-dev-gateway:latest + # image: deer-flow-dev-gateway:latest build: context: ../ dockerfile: backend/Dockerfile @@ -140,7 +140,7 @@ services: # Backend - LangGraph Server langgraph: -# image: deer-flow-dev-langgraph:latest + # image: deer-flow-dev-langgraph:latest build: context: ../ dockerfile: backend/Dockerfile diff --git a/docker/docker-compose-prod.yaml b/docker/docker-compose-prod.yaml new file mode 100644 index 00000000..9a7f0f9a --- /dev/null +++ b/docker/docker-compose-prod.yaml @@ -0,0 +1,96 @@ +# DeerFlow Production Environment +# Usage: docker-compose -f docker-compose-prod.yaml up -d +# +# Services: +# - nginx: Reverse proxy (port 2026) +# - frontend: Frontend Next.js (production build) +# - gateway: Backend Gateway API +# - langgraph: LangGraph server +# +# All services use pre-built images from registry.xueai.art/deerflow + +version: '3.8' + +services: + nginx: + image: nginx:alpine + container_name: deer-flow-nginx + ports: + - "2026:2026" + volumes: + - ./nginx/nginx.local.conf:/etc/nginx/nginx.conf:ro + depends_on: + - frontend + - gateway + - langgraph + networks: + - deer-flow-dev + restart: unless-stopped + + frontend: + image: registry.xueai.art/deerflow/deerflow-frontend:${VERSION} + container_name: deer-flow-frontend + environment: + - NODE_ENV=production + env_file: + - ../frontend/.env + networks: + - deer-flow-dev + restart: unless-stopped + + gateway: + image: registry.xueai.art/deerflow/deerflow-backend:${VERSION} + container_name: deer-flow-gateway + volumes: + - ../config.yaml:/app/config.yaml + - ../skills:/app/skills + - ../logs:/app/logs + - ../backend/.deer-flow:/app/backend/.deer-flow + # Mount uv cache for faster dependency installation + - ~/.cache/uv:/root/.cache/uv + # Mount Docker socket for aio sandbox + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - CI=true + - DOCKER_HOST=unix:///var/run/docker.sock + env_file: + - ../.env + extra_hosts: + # For Linux: map host.docker.internal to host gateway + - "host.docker.internal:host-gateway" + networks: + - deer-flow-dev + restart: unless-stopped + + langgraph: + image: registry.xueai.art/deerflow/deerflow-langgraph:${VERSION} + container_name: deer-flow-langgraph + volumes: + # Persist LangGraph inmem runtime data (threads/checkpoints/store) + - ../backend/.langgraph_api:/app/backend/.langgraph_api + - ../config.yaml:/app/config.yaml + - ../skills:/app/skills + - ../logs:/app/logs + - ../backend/.deer-flow:/app/backend/.deer-flow + # Mount uv cache for faster dependency installation + - ~/.cache/uv:/root/.cache/uv + # Mount Docker socket for aio sandbox + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - CI=true + - DOCKER_HOST=unix:///var/run/docker.sock + env_file: + - ../.env + extra_hosts: + # For Linux: map host.docker.internal to host gateway + - "host.docker.internal:host-gateway" + networks: + - deer-flow-dev + restart: unless-stopped + +networks: + deer-flow-dev: + driver: bridge + ipam: + config: + - subnet: 192.168.200.0/24