-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
144 lines (137 loc) · 3.83 KB
/
docker-compose.yml
File metadata and controls
144 lines (137 loc) · 3.83 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
138
139
140
141
142
143
144
services:
# Ollama (Local LLM Backend)
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434" # Expose for manual testing
volumes:
- ollama_data:/root/.ollama # Persist downloaded models
healthcheck:
test: ["CMD", "/bin/ollama", "list"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
restart: unless-stopped
# FastAPI Backend
api:
build:
context: .
dockerfile: Dockerfile
target: runtime
container_name: pr-review-api
ports:
- "8000:8000"
environment:
- LOG_LEVEL=${LOG_LEVEL:-info}
- LOG_FORMAT=console # Pretty logs for dev
- DEBUG=${DEBUG:-false}
- LLM_BASE_URL=http://ollama:11434
- LLM_MODEL_NAME=${LLM_MODEL_NAME:-qwen2.5-coder:3b}
- LLM_TIMEOUT=${LLM_TIMEOUT:-60.0}
- GITHUB_TOKEN=${GITHUB_TOKEN:-}
- ENABLE_METRICS=${ENABLE_METRICS:-true}
volumes:
- ./src:/app/src:ro # Read-only for safety (hot reload for dev)
depends_on:
ollama:
condition: service_healthy
prometheus:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 15s
restart: unless-stopped
# Streamlit UI (Web Interface)
streamlit:
build:
context: .
dockerfile: Dockerfile
target: runtime
container_name: pr-review-streamlit
ports:
- "8501:8501"
environment:
- API_BASE_URL=http://api:8000
command: ["streamlit", "run", "src/ui/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0", "--server.headless=true"]
volumes:
- ./src:/app/src:ro # Hot reload for dev
depends_on:
api:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8501/_stcore/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
restart: unless-stopped
# Test runner service
api-test:
build:
context: .
dockerfile: Dockerfile
target: builder
container_name: pr-review-test
command: pytest tests/ -v --cov=src --cov-report=term-missing
volumes:
- ./src:/app/src:ro
- ./tests:/app/tests:ro
- ./test-results:/app/test-results
environment:
- PYTHONPATH=/app
profiles:
- test
# Prometheus (metrics scraper)
prometheus:
image: prom/prometheus:latest
container_name: pr-review-prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.console.libraries=/etc/prometheus/console_libraries"
- "--web.console.templates=/etc/prometheus/consoles"
- "--web.enable-lifecycle"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9090/-/healthy"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
# Grafana (visualization)
grafana:
image: grafana/grafana:latest
container_name: pr-review-grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/dashboards:/etc/grafana/provisioning/dashboards:ro
- ./grafana/datasources:/etc/grafana/provisioning/datasources:ro
depends_on:
- prometheus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:
ollama_data:
networks:
default:
name: pr-review-network