11x-deploy-config : &deploy-config
22 deploy :
3- replicas : 2
3+ replicas : 3
44 placement :
55 max_replicas_per_node : 1
66 constraints :
@@ -12,6 +12,8 @@ x-deploy-config: &deploy-config
1212 parallelism : 1
1313 delay : 10s
1414 failure_action : rollback
15+ monitor : 30s
16+ max_failure_ratio : 0.3
1517 resources :
1618 limits :
1719 cpus : ${CPU_LIMIT:-1}
@@ -22,77 +24,103 @@ x-deploy-config: &deploy-config
2224 condition : any
2325 labels :
2426 - org.freecodecamp.autoupdate=true
27+ extra_hosts :
28+ - " host.docker.internal:host-gateway"
29+ healthcheck :
30+ test :
31+ [
32+ " CMD-SHELL" ,
33+ " wget --no-verbose --spider http://localhost:3001/health || exit 1" ,
34+ ]
35+ interval : 30s
36+ timeout : 5s
37+ start_period : 15s
38+ start_interval : 5s
39+ retries : 3
40+ environment :
41+ # Runtime
42+ - NODE_ENV=${NODE_ENV:-production}
43+ - PORT=3001
44+ - ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-*}
45+ - LOG_LEVEL=${LOG_LEVEL:-info}
46+ # Redis (local — each app connects to co-located Redis via host gateway)
47+ - REDIS_URL=redis://host.docker.internal:6379
48+ # Authentication
49+ - API_KEY=${API_KEY}
50+ # Groq AI
51+ - GROQ_API_KEY=${GROQ_API_KEY}
52+ - GROQ_MODEL=${GROQ_MODEL:-openai/gpt-oss-20b}
53+ - GROQ_MODEL_HTML=${GROQ_MODEL_HTML:-openai/gpt-oss-20b}
54+ - GROQ_MODEL_CSS=${GROQ_MODEL_CSS:-openai/gpt-oss-20b}
55+ - GROQ_MODEL_JAVASCRIPT=${GROQ_MODEL_JAVASCRIPT:-openai/gpt-oss-120b}
56+ - GROQ_MODEL_PYTHON=${GROQ_MODEL_PYTHON:-openai/gpt-oss-120b}
57+ - GROQ_TIMEOUT_MS=${GROQ_TIMEOUT_MS:-30000}
58+ - GROQ_MAX_RETRIES=${GROQ_MAX_RETRIES:-2}
59+ - GROQ_BACKOFF_BASE_MS=${GROQ_BACKOFF_BASE_MS:-500}
60+ - GROQ_MAX_TOKENS=${GROQ_MAX_TOKENS:-1024}
61+ - GROQ_MAX_TOKENS_RETRY=${GROQ_MAX_TOKENS_RETRY:-2048}
62+ - GROQ_EMPTY_RESPONSE_RETRIES=${GROQ_EMPTY_RESPONSE_RETRIES:-1}
63+ # Circuit Breaker
64+ - MODEL_CB_FAILURES=${MODEL_CB_FAILURES:-3}
65+ - MODEL_CB_COOLDOWN_MS=${MODEL_CB_COOLDOWN_MS:-30000}
66+ # Health Check
67+ - ENABLE_EXTENDED_HEALTH=${ENABLE_EXTENDED_HEALTH:-false}
68+ # Rate Limiting
69+ - PER_USER_LIMIT=${PER_USER_LIMIT:-10}
70+ - GLOBAL_LIMIT=${GLOBAL_LIMIT:-1000}
2571
2672x-port-config : &port-config
27- target : 3000
73+ target : 3001
2874 protocol : tcp
2975 mode : host
3076
3177services :
32- svc-socrates :
78+ svc-socrates-alpha :
3379 image : ${DOCKER_REGISTRY}/${DEPLOYMENT_ENV}/socrates:${DEPLOYMENT_VERSION}
3480 ports :
3581 - published : 4010
3682 << : *port-config
3783 << : *deploy-config
38- healthcheck :
39- test :
40- [
41- " CMD-SHELL" ,
42- " wget --no-verbose --spider http://localhost:3000/health || exit 1" ,
43- ]
44- interval : 30s
45- timeout : 5s
46- start_period : 15s
47- retries : 3
48- environment :
49- # Runtime
50- - NODE_ENV=${NODE_ENV:-production}
51- - PORT=3000
52- - SERVER_URL=${SERVER_URL}
53- - ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-*}
54- - LOG_LEVEL=${LOG_LEVEL:-info}
55- # Redis (overlay network service discovery)
56- - REDIS_URL=redis://svc-redis:6379
57- # Authentication
58- - API_KEY=${API_KEY}
59- - DOCS_BASIC_AUTH_USER=${DOCS_BASIC_AUTH_USER}
60- - DOCS_BASIC_AUTH_PASS=${DOCS_BASIC_AUTH_PASS}
61- # Groq AI
62- - GROQ_API_KEY=${GROQ_API_KEY}
63- - GROQ_MODEL=${GROQ_MODEL:-openai/gpt-oss-20b}
64- - GROQ_MODEL_HTML=${GROQ_MODEL_HTML:-openai/gpt-oss-20b}
65- - GROQ_MODEL_CSS=${GROQ_MODEL_CSS:-openai/gpt-oss-20b}
66- - GROQ_MODEL_JAVASCRIPT=${GROQ_MODEL_JAVASCRIPT:-openai/gpt-oss-120b}
67- - GROQ_MODEL_PYTHON=${GROQ_MODEL_PYTHON:-openai/gpt-oss-120b}
68- - GROQ_TIMEOUT_MS=${GROQ_TIMEOUT_MS:-30000}
69- - GROQ_MAX_RETRIES=${GROQ_MAX_RETRIES:-2}
70- - GROQ_BACKOFF_BASE_MS=${GROQ_BACKOFF_BASE_MS:-500}
71- - GROQ_MAX_TOKENS=${GROQ_MAX_TOKENS:-1024}
72- - GROQ_MAX_TOKENS_RETRY=${GROQ_MAX_TOKENS_RETRY:-2048}
73- - GROQ_EMPTY_RESPONSE_RETRIES=${GROQ_EMPTY_RESPONSE_RETRIES:-1}
74- # Circuit Breaker
75- - MODEL_CB_FAILURES=${MODEL_CB_FAILURES:-3}
76- - MODEL_CB_COOLDOWN_MS=${MODEL_CB_COOLDOWN_MS:-30000}
77- # Health Check
78- - ENABLE_EXTENDED_HEALTH=${ENABLE_EXTENDED_HEALTH:-false}
79- # Rate Limiting
80- - PER_USER_LIMIT=${PER_USER_LIMIT:-10}
81- - GLOBAL_LIMIT=${GLOBAL_LIMIT:-1000}
84+
85+ svc-socrates-bravo :
86+ image : ${DOCKER_REGISTRY}/${DEPLOYMENT_ENV}/socrates:${DEPLOYMENT_VERSION}
87+ ports :
88+ - published : 4011
89+ << : *port-config
90+ << : *deploy-config
8291
8392 svc-redis :
8493 image : redis:7.4-alpine
85- command : ["redis-server", "--appendonly", "yes"]
94+ ports :
95+ - published : 6379
96+ target : 6379
97+ protocol : tcp
98+ mode : host
99+ command :
100+ [
101+ " redis-server" ,
102+ " --appendonly" ,
103+ " yes" ,
104+ " --maxmemory" ,
105+ " 200mb" ,
106+ " --maxmemory-policy" ,
107+ " allkeys-lru" ,
108+ " --bind" ,
109+ " 0.0.0.0" ,
110+ " --protected-mode" ,
111+ " no" ,
112+ ]
86113 volumes :
87114 - redis_data:/data
88115 healthcheck :
89116 test : ["CMD", "redis-cli", "ping"]
90117 interval : 10s
91118 timeout : 5s
92119 start_period : 5s
120+ start_interval : 5s
93121 retries : 3
94122 deploy :
95- replicas : 1
123+ mode : global
96124 placement :
97125 constraints :
98126 - node.labels.socrates.enabled == true
0 commit comments