forked from HKUDS/DeepTutor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
137 lines (128 loc) · 5.1 KB
/
Copy pathdocker-compose.yml
File metadata and controls
137 lines (128 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# ============================================
# DeepTutor Docker Compose Configuration
# ============================================
# This file provides orchestration for DeepTutor services
#
# Usage:
# Production: docker compose up -d
# Development: docker compose -f docker-compose.yml -f docker-compose.dev.yml up
# Build only: docker compose build
#
# Prerequisites:
# 1. Copy .env.example to .env and configure your API keys
# 2. Runtime settings are stored in ./data/user/settings (created automatically)
#
# Local LLM (LM Studio / Ollama / vLLM):
# Use "host.docker.internal" instead of "localhost" for LLM_HOST / EMBEDDING_HOST.
# See .env.example for details.
# ============================================
services:
# ============================================
# PocketBase — optional auth + storage sidecar
# Set POCKETBASE_URL=http://pocketbase:8090 in .env to activate.
# Leave POCKETBASE_URL blank to run without PocketBase (SQLite fallback).
# ============================================
pocketbase:
image: ghcr.io/muchobien/pocketbase:latest
container_name: pocketbase
restart: unless-stopped
ports:
- "${POCKETBASE_PORT:-8090}:8090"
volumes:
- ./data/pocketbase:/pb/pb_data
networks:
- deeptutor-network
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8090/api/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
# ============================================
# All-in-One DeepTutor Service
# ============================================
deeptutor:
build:
context: .
dockerfile: Dockerfile
target: production
args:
# Pass backend port at build time for Next.js static optimization
- BACKEND_PORT=${BACKEND_PORT:-8001}
container_name: deeptutor
restart: unless-stopped
ports:
- "${BACKEND_PORT:-8001}:${BACKEND_PORT:-8001}"
- "${FRONTEND_PORT:-3782}:${FRONTEND_PORT:-3782}"
# Load environment variables from .env file
env_file:
- .env
environment:
# LLM Configuration (Required)
- LLM_BINDING=${LLM_BINDING:-openai}
- LLM_MODEL=${LLM_MODEL}
- LLM_API_KEY=${LLM_API_KEY}
- LLM_HOST=${LLM_HOST}
- LLM_API_VERSION=${LLM_API_VERSION:-}
- DISABLE_SSL_VERIFY=${DISABLE_SSL_VERIFY:-false}
# Embedding Configuration (Required for Knowledge Base)
- EMBEDDING_BINDING=${EMBEDDING_BINDING:-openai}
- EMBEDDING_MODEL=${EMBEDDING_MODEL:-text-embedding-3-large}
- EMBEDDING_API_KEY=${EMBEDDING_API_KEY}
- EMBEDDING_HOST=${EMBEDDING_HOST}
- EMBEDDING_DIMENSION=${EMBEDDING_DIMENSION:-3072}
- EMBEDDING_API_VERSION=${EMBEDDING_API_VERSION:-}
# Web Search Configuration (Optional)
- SEARCH_PROVIDER=${SEARCH_PROVIDER:-}
- SEARCH_API_KEY=${SEARCH_API_KEY:-}
- SEARCH_BASE_URL=${SEARCH_BASE_URL:-}
# ============================================
# Service Ports Configuration
# ============================================
# Backend API port (default: 8001)
- BACKEND_PORT=${BACKEND_PORT:-8001}
# Frontend web port (default: 3782)
- FRONTEND_PORT=${FRONTEND_PORT:-3782}
# ============================================
# API URL Configuration (Important for Remote Deployment)
# ============================================
# The frontend runs in the USER'S BROWSER — "localhost" means the user's machine,
# not the Docker host. This matters when Docker runs on a remote server.
#
# LOCAL (browsing from the same machine running Docker):
# Leave blank — defaults to http://localhost:8001, which works via port mapping.
#
# REMOTE SERVER (Docker on a server, accessed from another machine):
# Set to the server's public IP or hostname, e.g.:
# NEXT_PUBLIC_API_BASE_EXTERNAL=http://203.0.113.10:8001
# Without this the browser tries localhost:8001 on the user's laptop and all
# API calls (including WebSocket) will fail.
- NEXT_PUBLIC_API_BASE_EXTERNAL=${NEXT_PUBLIC_API_BASE_EXTERNAL:-}
# Alternative: Direct API base URL (same priority as NEXT_PUBLIC_API_BASE_EXTERNAL)
- NEXT_PUBLIC_API_BASE=${NEXT_PUBLIC_API_BASE:-}
# Extra frontend origin(s) allowed by FastAPI CORS when auth is enabled.
- CORS_ORIGIN=${CORS_ORIGIN:-}
- CORS_ORIGINS=${CORS_ORIGINS:-}
volumes:
# Mount local data directory for persistence (read-write)
# This includes runtime settings under ./data/user/settings.
- ./data/user:/app/data/user
- ./data/memory:/app/data/memory
- ./data/knowledge_bases:/app/data/knowledge_bases
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:${BACKEND_PORT:-8001}/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
depends_on:
pocketbase:
condition: service_healthy
networks:
- deeptutor-network
# ============================================
# Networks
# ============================================
networks:
deeptutor-network:
driver: bridge