Skip to content

Commit 8b2f21a

Browse files
authored
fix(swarm): adjust ports and configs (#1124)
1 parent ad8608f commit 8b2f21a

File tree

3 files changed

+78
-52
lines changed

3 files changed

+78
-52
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ ansible/inventory/hosts
4747

4848
# Secrets
4949
*.env
50+
*.env.*
5051
.envrc
5152

5253
.kubeconfig.yaml

docker/swarm/stacks/socrates/.env.sample

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@ DEPLOYMENT_VERSION=
55

66
# -- Runtime
77
NODE_ENV=production
8-
SERVER_URL=
98
# ALLOWED_ORIGINS=*
109
# LOG_LEVEL=info
1110

1211
# -- Authentication
1312
API_KEY=
14-
DOCS_BASIC_AUTH_USER=
15-
DOCS_BASIC_AUTH_PASS=
1613

1714
# -- Groq AI
1815
GROQ_API_KEY=

docker/swarm/stacks/socrates/stack-socrates.yml

Lines changed: 77 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
x-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

2672
x-port-config: &port-config
27-
target: 3000
73+
target: 3001
2874
protocol: tcp
2975
mode: host
3076

3177
services:
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

Comments
 (0)