From 9502984420651f8b518cba9f35a034f3bb1be908 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Wed, 1 Apr 2026 16:22:25 -0500 Subject: [PATCH 01/12] FIXED: new docker-compose for testing API v2 in production --- docker-compose.yml | 188 +++++++++------------------------------------ 1 file changed, 36 insertions(+), 152 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 33e2920..be5d7c9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,178 +1,62 @@ # PRODUCTION ENVIRONMENT -# Use: docker-compose -f docker-compose.prod.yml up -d +# Use: docker compose -f docker-compose.yml up -d --build version: "3.9" services: - api: + apiv2: build: - context: ./apps/api + context: ./apps/api_v2 dockerfile: Dockerfile.prod - command: node dist/main.js - restart: always - expose: - - "${API_PORT:-3000}" - depends_on: - - postgres - - redis - environment: - - NODE_ENV=${NODE_ENV} - - PORT=${PORT} - - CORS_ORIGIN=${CORS_ORIGIN} - - POSTGRES_HOST=${POSTGRES_HOST} - - POSTGRES_PORT=${POSTGRES_PORT} - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=${POSTGRES_DB} - - REDIS_HOST=${REDIS_HOST} - - REDIS_PORT=${REDIS_PORT} - - REDIS_PASSWORD=${REDIS_PASSWORD} - - GEMINI_API_KEY=${GEMINI_API_KEY} - networks: - - judge_net - healthcheck: - test: ["CMD-SHELL", "node -e \"require('http').get('http://localhost:3000/health', (r) => {if (r.statusCode !== 200) process.exit(1)})\""] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - cpus: '1' - memory: 1G - - web: - build: - context: ./apps/web - dockerfile: Dockerfile.prod - args: - - VITE_API_URL=${VITE_API_URL} restart: always ports: - - "${WEB_PORT:-5173}:5173" + - "${APIV2_PORT:-4000}:${APIV2_PORT:-4000}" + env_file: + - .env.dev + environment: + - APIV2_PORT=${APIV2_PORT:-4000} + - RABBITMQ_URL=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/} + depends_on: + rabbitmq: + condition: service_healthy networks: - judge_net - healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:5173/health"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 20s - deploy: - resources: - limits: - cpus: '0.5' - memory: 512M - postgres: - image: postgres:16-alpine + rabbitmq: + image: rabbitmq:3.13-management restart: always - environment: - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: ${POSTGRES_DB} - volumes: - - pgdata_prod:/var/lib/postgresql/data - - ./apps/api/migrations:/docker-entrypoint-initdb.d:ro - networks: - - judge_net + expose: + - "5672:5672" + - "15672:15672" healthcheck: - test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB || exit 1"] - interval: 10s + test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] + interval: 5s timeout: 5s - retries: 15 - start_period: 40s - deploy: - resources: - limits: - cpus: '1' - memory: 1G - - redis: - image: redis:7-alpine - container_name: juez_redis_prod - restart: always - volumes: - - redis_data:/data + retries: 20 networks: - judge_net - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 15 - start_period: 30s - - runner-python: - profiles: ["judge"] - build: - context: ./apps/api/src/runners/python - image: juez_runner_python:prod - restart: "no" - runner-node: - profiles: ["judge"] + worker-python: build: - context: ./apps/api/src/runners/node - image: juez_runner_node:prod - restart: "no" - - runner-cpp: - profiles: ["judge"] - build: - context: ./apps/api/src/runners/cpp - image: juez_runner_cpp:prod - restart: "no" - - runner-java: - profiles: ["judge"] - build: - context: ./apps/api/src/runners/java - image: juez_runner_java:prod - restart: "no" - - worker: - profiles: ["judge"] - build: - context: ./apps/api - dockerfile: Dockerfile.worker - args: - - NODE_ENV=production - command: npm run worker + context: ./apps/workers/python + dockerfile: Dockerfile + working_dir: /app + command: python main.py restart: always + env_file: + - .env.dev + environment: + - API_BASE_URL=http://apiv2:${APIV2_PORT:-4000} + - RABBITMQ_URL=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/} + - QUEUE_NAME=${PYTHON_QUEUE:-python.queue} volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - submissions_data:/usr/src/app/data + - /var/run/docker.sock:/var/run/docker.sock depends_on: - - runner-python - - runner-node - - runner-cpp - - runner-java - - postgres - - redis - environment: - - NODE_ENV=${NODE_ENV} - - POSTGRES_HOST=${POSTGRES_HOST} - - POSTGRES_PORT=${POSTGRES_PORT} - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - POSTGRES_DB=${POSTGRES_DB} - - REDIS_HOST=${REDIS_HOST} - - REDIS_PORT=${REDIS_PORT} - - REDIS_PASSWORD=${REDIS_PASSWORD} - - HOST_SUBMISSIONS_DIR=${HOST_SUBMISSIONS_DIR} + apiv2: + condition: service_started + rabbitmq: + condition: service_healthy networks: - judge_net - deploy: - resources: - limits: - cpus: '2' - memory: 2G - -volumes: - pgdata_prod: - redis_data: - submissions_data: networks: judge_net: From 5ea7228717c682eba55739c0ff50773196035de6 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Thu, 2 Apr 2026 13:45:07 -0500 Subject: [PATCH 02/12] FIXED: go mod fixed and test execution removed for Dockerfile --- apps/api_v2/Dockerfile.prod | 14 ++++++-------- .../internal/application/container/builder.go | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/api_v2/Dockerfile.prod b/apps/api_v2/Dockerfile.prod index 7c399f0..98f67d0 100644 --- a/apps/api_v2/Dockerfile.prod +++ b/apps/api_v2/Dockerfile.prod @@ -1,16 +1,14 @@ -FROM golang:1.22-alpine AS builder +FROM golang:1.25-alpine AS builder WORKDIR /app -ENV GO111MODULE=off \ - GOPATH=/go \ - CGO_ENABLED=0 +ENV CGO_ENABLED=0 + +COPY go.mod ./ +RUN go mod download COPY . . -# Fetch runtime dependency in GOPATH mode because this project currently uses relative imports. -RUN go get github.com/gofiber/fiber/v2 -RUN go test ./... RUN go build -o /out/api ./cmd/app FROM alpine:3.20 @@ -21,7 +19,7 @@ RUN adduser -D -u 10001 appuser COPY --from=builder /out/api /usr/local/bin/api -EXPOSE 8080 +EXPOSE 4000 USER appuser diff --git a/apps/api_v2/internal/application/container/builder.go b/apps/api_v2/internal/application/container/builder.go index 39d3d43..9c8ddcc 100644 --- a/apps/api_v2/internal/application/container/builder.go +++ b/apps/api_v2/internal/application/container/builder.go @@ -8,7 +8,7 @@ import ( gemini_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/generative-ai/cloud/gemini" roble_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/persistance/roble" roble_user_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/persistance/roble/user" - rabbitmq_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/publisher/rabbitmq" + rabbitmq_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/publisher/rabbitMQ" security_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/security" course_repository "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/persistance/roble/course" From b6a5c04885cb5c9d573ead9b6e5f2578ab3e1e8a Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Thu, 2 Apr 2026 13:45:56 -0500 Subject: [PATCH 03/12] FIXED: ports fixed for rabbitMQ in docker-compose --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index be5d7c9..ac85370 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,8 +25,8 @@ services: image: rabbitmq:3.13-management restart: always expose: - - "5672:5672" - - "15672:15672" + - "5672" + - "15672" healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 5s From 18ffc7c89c225392de58676bf2670d4ef3c68153 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Thu, 2 Apr 2026 13:57:31 -0500 Subject: [PATCH 04/12] ADDED: example .env file without sensitive keys --- example.env | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 example.env diff --git a/example.env b/example.env new file mode 100644 index 0000000..06c4e9c --- /dev/null +++ b/example.env @@ -0,0 +1,59 @@ +#------------------------| Frontend |----------------------------# + +# Vite Configuration +VITE_API_URL=http://localhost:4000 +WEB_PORT=5137 + +# Node Environment +NODE_ENV=development/production + + +#--------------------------| API V2 |------------------------------# + +# API Configuration +APIV2_PORT=4000 +APIV2_BASE_URL=http://apiv2:4000 + +# Roble Configuration - Dev +ROBLE_PROJECT= +ROBLE_BASE_URL=https://roble-api.openlab.uninorte.edu.co + +# Test user configuration +INTERNAL_USER_EMAIL= +INTERNAL_USER_PASSWORD= + +# Worker Environment Variables +WORKER_KEY= +PYTHON_QUEUE=python.queue +JAVA_QUEUE=java.queue +CPP_QUEUE=cpp.queue + +# RabbitMQ Configuration +RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672/ + +# AI API keys +GEMINI_API_KEY= + + +#------------------------------------------------------------------# +# DEPRECATED # +#------------------------------------------------------------------# + +#--------------------------| API V1 |------------------------------# +# PostgreSQL Configuration +POSTGRES_USER=juez_prod +POSTGRES_PASSWORD= +POSTGRES_DB=juez_db_prod +POSTGRES_HOST=postgres +POSTGRES_PORT=5432 + +# Redis Configuration (optional, leave empty for no password) +REDIS_PASSWORD= +REDIS_HOST=redis +REDIS_PORT=6379 + +# Worker Configuration +HOST_SUBMISSIONS_DIR=/data/submissions + +# API Configuration +API_PORT=4000 \ No newline at end of file From 39ed339eb757d42cb16dde7a8bc02fbc8302dce3 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:08:40 -0500 Subject: [PATCH 05/12] ADDED: web to docker-compose for production --- docker-compose.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index ac85370..4c42609 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -57,7 +57,22 @@ services: condition: service_healthy networks: - judge_net - + web: + build: + context: ./apps/web + dockerfile: Dockerfile.prod + command: npm run dev -- --host + ports: + - "${WEB_PORT:-5173}:5173" + volumes: + - ./apps/web:/usr/src/app + - /usr/src/app/node_modules + env_file: + - .env.dev + networks: + - judge_net + depends_on: + - apiv2 networks: judge_net: driver: bridge From 9674597a64b09b8f25766612305d907fd3b0d2fb Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:09:09 -0500 Subject: [PATCH 06/12] FIXED: apiv2 ports not exposed --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4c42609..9835136 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ services: context: ./apps/api_v2 dockerfile: Dockerfile.prod restart: always - ports: + expose: - "${APIV2_PORT:-4000}:${APIV2_PORT:-4000}" env_file: - .env.dev From 1558b8b684f8c2ba00ee43b95fad375f93315454 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:17:04 -0500 Subject: [PATCH 07/12] FIXED: env.prod --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9835136..d65d57a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: dockerfile: Dockerfile.prod restart: always expose: - - "${APIV2_PORT:-4000}:${APIV2_PORT:-4000}" + - "${APIV2_PORT:-4000}" env_file: - .env.dev environment: @@ -68,7 +68,7 @@ services: - ./apps/web:/usr/src/app - /usr/src/app/node_modules env_file: - - .env.dev + - .env.prod networks: - judge_net depends_on: From a4c2af129084a096808c3e7b5a8f8bb971971d09 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:20:02 -0500 Subject: [PATCH 08/12] FIXED: .env file --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d65d57a..e345ea1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: expose: - "${APIV2_PORT:-4000}" env_file: - - .env.dev + - .env.production environment: - APIV2_PORT=${APIV2_PORT:-4000} - RABBITMQ_URL=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/} @@ -43,7 +43,7 @@ services: command: python main.py restart: always env_file: - - .env.dev + - .env.production environment: - API_BASE_URL=http://apiv2:${APIV2_PORT:-4000} - RABBITMQ_URL=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/} From a2d55d0887019e3016be3cd31ed1c9f70a5aa3e7 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:20:38 -0500 Subject: [PATCH 09/12] FIXED: .env.prod --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index e345ea1..8c6f515 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -68,7 +68,7 @@ services: - ./apps/web:/usr/src/app - /usr/src/app/node_modules env_file: - - .env.prod + - .env.production networks: - judge_net depends_on: From 71066ba0268e87cff96563b8f2a0caf6f1a77a8a Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:23:48 -0500 Subject: [PATCH 10/12] FIXED: import --- apps/api_v2/internal/application/container/builder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api_v2/internal/application/container/builder.go b/apps/api_v2/internal/application/container/builder.go index 9c8ddcc..39d3d43 100644 --- a/apps/api_v2/internal/application/container/builder.go +++ b/apps/api_v2/internal/application/container/builder.go @@ -8,7 +8,7 @@ import ( gemini_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/generative-ai/cloud/gemini" roble_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/persistance/roble" roble_user_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/persistance/roble/user" - rabbitmq_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/publisher/rabbitMQ" + rabbitmq_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/publisher/rabbitmq" security_infrastructure "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/security" course_repository "github.com/openlabun/CODER/apps/api_v2/internal/infrastructure/persistance/roble/course" From 15e1cea0ab702294948e8c1599f3c113b08377a4 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:27:17 -0500 Subject: [PATCH 11/12] FIXED: nginx config for prod, it wasn't directed to api v2 --- apps/web/nginx.prod.conf | 2 +- docker-compose.yml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/web/nginx.prod.conf b/apps/web/nginx.prod.conf index 22cc3f6..5e27e92 100644 --- a/apps/web/nginx.prod.conf +++ b/apps/web/nginx.prod.conf @@ -36,7 +36,7 @@ server { # Reverse proxy to internal API container. # Browser calls /api/* on the same public origin; nginx forwards inside Docker. location /api/ { - proxy_pass http://api:3000/; + proxy_pass http://apiv2:4000/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; diff --git a/docker-compose.yml b/docker-compose.yml index 8c6f515..7c1b2ac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,12 +61,8 @@ services: build: context: ./apps/web dockerfile: Dockerfile.prod - command: npm run dev -- --host ports: - "${WEB_PORT:-5173}:5173" - volumes: - - ./apps/web:/usr/src/app - - /usr/src/app/node_modules env_file: - .env.production networks: From 6f206f0c47d00e9c6fdd7801b27dd460ef833b37 Mon Sep 17 00:00:00 2001 From: Sebastian Maldonado Date: Fri, 10 Apr 2026 19:42:25 -0500 Subject: [PATCH 12/12] FIXED: web connection to API fixed, before it called to API v1 instead of API v2 --- apps/web/Dockerfile.prod | 2 +- apps/web/src/api/client.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/Dockerfile.prod b/apps/web/Dockerfile.prod index baa42bb..2e48129 100644 --- a/apps/web/Dockerfile.prod +++ b/apps/web/Dockerfile.prod @@ -9,7 +9,7 @@ RUN npm install COPY . . -ARG VITE_API_URL=http://localhost:3000 +ARG VITE_API_URL=/api ENV VITE_API_URL=$VITE_API_URL # Build the Vite application diff --git a/apps/web/src/api/client.js b/apps/web/src/api/client.js index a7d0820..66c60ac 100644 --- a/apps/web/src/api/client.js +++ b/apps/web/src/api/client.js @@ -1,6 +1,6 @@ import axios from 'axios'; -const baseURL = import.meta.env.VITE_API_URL || 'http://localhost:3000'; +const baseURL = import.meta.env.VITE_API_URL || '/api'; const client = axios.create({ baseURL,