Files
Riccardo Schirone cc94bdf05b fix(docker-compose): serve buttercup-ui on 31323 internally (#549)
The scheduler/task-server competition API URL is
http://buttercup-ui:31323, but the UI listened on the container-internal
port 1323 (31323 was only the host-published mapping). Inside the
compose network, scheduler -> http://buttercup-ui:31323 was refused,
so POV/patch/bundle submissions failed with "Failed to submit POV"
even though the host-side e2e.sh task POST (localhost:31323) worked.

Set BUTTERCUP_UI_PORT=31323 and map 31323:31323 so host, internal,
and the *_COMPETITION_API_URL env all use one consistent port.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:53:48 +02:00

332 lines
9.6 KiB
YAML

include:
- ../../competition-server/compose.yaml
- ../../competition-server/signoz/compose.yaml
services:
# ugh the only solution i can come up with is a dind instance paired with every single build-bot we will need like k8s groups or something
dind:
expose:
- "2375"
image: docker:29-dind
command: ["dockerd", "-H", "tcp://0.0.0.0:2375", "--tls=false", "--storage-driver=overlay2"]
restart: always
privileged: true # This must run with privlege to support nested virtualization within the public Linux CP for `virtme-ng`
environment:
- DOCKER_TLS_CERTDIR # intentionally blank to optimize runtime
volumes:
- type: bind
source: ../../crs_scratch
target: /crs_scratch
- shared-tmp:/tmp
- ../../node_data_storage/:/node_data
redis:
image: redis:7.4.2
restart: always
ports:
- '127.0.0.1:6379:6379'
# NOTE: Do not use the configuration file for now, so every time you restart
# the container, it will reset the redis instance
# command: redis-server /mount/redis.conf
# volumes:
# - cache:/data
# - ../../redis:/mount
healthcheck:
test: [ "CMD-SHELL", "redis-cli ping | grep PONG" ]
interval: 1s
timeout: 3s
retries: 5
program-model:
build:
context: ../../
dockerfile: ./program-model/Dockerfile
command: ["buttercup-program-model", "serve"]
env_file:
- env.dev.compose
- .env
volumes:
- ../../crs_scratch:/crs_scratch
- ../../tasks_storage:/tasks_storage
- ../../node_data_storage/:/node_data
depends_on:
redis:
condition: service_healthy
dind:
condition: service_started
# graphdb:
# condition: service_healthy
coverage-bot:
command: ["buttercup-coverage-bot", "--wdir", "/node_data/crs_scratch", "--redis_url", "redis://redis:6379"]
build:
context: ../../
dockerfile: ./fuzzer/Dockerfile
volumes:
- ../../crs_scratch:/crs_scratch
- ../../tasks_storage:/tasks_storage
- ../../node_data_storage/:/node_data
env_file:
- env.dev.compose
- .env
depends_on:
redis:
condition: service_healthy
dind:
condition: service_started
build-bot:
command: ["buttercup-fuzzer-builder", "--wdir", "/node_data/crs_scratch", "--redis_url", "redis://redis:6379", "--timer", "5000"]
build:
context: ../../
dockerfile: ./fuzzer/Dockerfile
deploy:
replicas: 4
mode: replicated
volumes:
- ../../crs_scratch:/crs_scratch
- ../../tasks_storage:/tasks_storage
- ../../node_data_storage/:/node_data
env_file:
- env.dev.compose
- .env
depends_on:
redis:
condition: service_healthy
dind:
condition: service_started
tracer-bot:
command: ["buttercup-tracer-bot", "--wdir", "/node_data/crs_scratch", "--redis_url", "redis://redis:6379"]
build:
context: ../../
dockerfile: ./fuzzer/Dockerfile
deploy:
replicas: 2
mode: replicated
volumes:
- ../../crs_scratch:/crs_scratch
- ../../tasks_storage:/tasks_storage
- ../../node_data_storage/:/node_data
env_file:
- env.dev.compose
- .env
depends_on:
redis:
condition: service_healthy
dind:
condition: service_started
fuzzer-bot:
build:
context: ../../
dockerfile: ./fuzzer/Dockerfile
command: ["buttercup-fuzzer"]
deploy:
replicas: 8
mode: replicated
env_file:
- env.dev.compose
- .env
volumes:
- ../../crs_scratch:/crs_scratch
- ../../node_data_storage/:/node_data
depends_on:
redis:
condition: service_healthy
task-downloader:
build:
context: ../../
dockerfile: ./orchestrator/Dockerfile
command: ["buttercup-task-downloader", "serve"]
volumes:
- ../../tasks_storage:/tasks_storage
- ../../node_data_storage/:/node_data
env_file:
- env.dev.compose
- .env
depends_on:
redis:
condition: service_healthy
task-server:
build:
context: ../../
dockerfile: ./orchestrator/Dockerfile
command: ["buttercup-task-server"]
ports:
- "127.0.0.1:8000:8000"
env_file:
- env.dev.compose
- .env
depends_on:
redis:
condition: service_healthy
scheduler:
build:
context: ../../
dockerfile: ./orchestrator/Dockerfile
command: ["buttercup-scheduler", "serve"]
volumes:
- ../../crs_scratch:/crs_scratch
- ../../tasks_storage:/tasks_storage
- ../../node_data_storage/:/node_data
env_file:
- env.dev.compose
- .env
depends_on:
redis:
condition: service_healthy
seed-gen:
build:
context: ../../
dockerfile: ./seed-gen/Dockerfile
command: >
/bin/sh -c 'timeout=120; interval=2; max=$$((timeout/interval)); i=0;
while [ ! -s "$$LITELLM_API_KEY_FILE" ] && [ $$i -lt $$max ]; do
echo "Waiting for LiteLLM key... ($$i/$$max)"; sleep $$interval; i=$$((i+1));
done;
if [ ! -s "$$LITELLM_API_KEY_FILE" ]; then
echo "Timed out waiting for LiteLLM key"; exit 1;
fi;
export LITELLM_API_KEY=$$(cat "$$LITELLM_API_KEY_FILE"); exec seed-gen server'
deploy:
replicas: 4
mode: replicated
volumes:
- ../../crs_scratch:/crs_scratch
- ../../node_data_storage/:/node_data
- litellm-user-keys-output:/secrets:ro
env_file:
- env.dev.compose
- .env
environment:
- LANGFUSE_HOST=${LANGFUSE_HOST}
- LANGFUSE_PUBLIC_KEY=${LANGFUSE_PUBLIC_KEY}
- LANGFUSE_SECRET_KEY=${LANGFUSE_SECRET_KEY}
- LITELLM_API_KEY_FILE=/secrets/llm-user_api_key
depends_on:
redis:
condition: service_healthy
litellm:
condition: service_started
dind:
condition: service_started
patcher:
build:
context: ../../
dockerfile: ./patcher/Dockerfile
command: >
/bin/sh -c 'timeout=120; interval=2; max=$$((timeout/interval)); i=0;
while [ ! -s "$$LITELLM_API_KEY_FILE" ] && [ $$i -lt $$max ]; do
echo "Waiting for LiteLLM key... ($$i/$$max)"; sleep $$interval; i=$$((i+1));
done;
if [ ! -s "$$LITELLM_API_KEY_FILE" ]; then
echo "Timed out waiting for LiteLLM key"; exit 1;
fi;
export LITELLM_API_KEY=$$(cat "$$LITELLM_API_KEY_FILE"); exec buttercup-patcher serve'
volumes:
- ../../crs_scratch:/crs_scratch
- ../../node_data_storage/:/node_data
- litellm-user-keys-output:/secrets:ro
env_file:
- env.dev.compose
- .env
environment:
- LANGFUSE_HOST=${LANGFUSE_HOST}
- LANGFUSE_PUBLIC_KEY=${LANGFUSE_PUBLIC_KEY}
- LANGFUSE_SECRET_KEY=${LANGFUSE_SECRET_KEY}
- LITELLM_API_KEY_FILE=/secrets/llm-user_api_key
depends_on:
redis:
condition: service_healthy
litellm:
condition: service_started
dind:
condition: service_started
litellm:
image: ghcr.io/berriai/litellm:litellm_stable_release_branch-v1.57.8-stable
configs:
- source: litellm_config
target: /app/config.yaml
env_file: .env
ports:
- "127.0.0.1:8080:8080"
environment:
DATABASE_URL: "postgresql://litellm_user:litellm_password11@litellm-db:5432/litellm"
# note: litellm recommends 1 worker for kubernetes: https://docs.litellm.ai/docs/proxy/prod
command: ["--config", "/app/config.yaml", "--port", "8080", "--num_workers", "8"]
depends_on:
litellm-db:
condition: service_healthy
# One-time service to create LiteLLM user API keys (mirrors k8s Job)
litellm-user-keys-setup:
image: curlimages/curl:8.3.0
user: "0"
restart: "no"
command: >
/bin/sh -c 'if [ -s /output/llm-user_api_key ]; then echo "API key already present, skipping creation"; exit 0; fi; \
echo "Waiting for LiteLLM..."; \
until curl -sSf "$$LITELLM_URL/health/readiness" >/dev/null 2>&1; do sleep 2; done; \
echo "Creating key for llm-user"; \
resp=$$(curl -sS -X POST "$$LITELLM_URL/key/generate" -H "Authorization: Bearer $$LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d "{\"user\":\"llm-user\",\"max_budget\":$${LITELLM_MAX_BUDGET:-100}}" -o -); \
key=$$(echo "$$resp" | sed -n "s/.*\"key\"[[:space:]]*:[[:space:]]*\"\\([^\"]*\\)\".*/\\1/p"); \
if [ -z "$$key" ]; then echo "Failed to obtain key"; echo "response: $$resp"; exit 1; fi; \
printf "%s" "$$key" > /output/llm-user_api_key && echo "Key saved to /output/llm-user_api_key"'
env_file:
- .env
environment:
- LITELLM_URL=http://litellm:8080
- LITELLM_MASTER_KEY=${BUTTERCUP_LITELLM_KEY}
- LITELLM_MAX_BUDGET=${LITELLM_MAX_BUDGET:-100}
volumes:
- ../../crs_scratch:/crs_scratch
- litellm-user-keys-output:/output
depends_on:
litellm:
condition: service_started
litellm-db:
image: postgres:17.2
restart: always
environment:
POSTGRES_DB: litellm
POSTGRES_USER: litellm_user
POSTGRES_PASSWORD: litellm_password11
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
interval: 5s
timeout: 5s
retries: 10
buttercup-ui:
build:
context: ../../
dockerfile: ./orchestrator/Dockerfile
command: ["buttercup-ui"]
ports:
- "127.0.0.1:31323:31323"
env_file:
- env.dev.compose
- .env
configs:
litellm_config:
file: ../../litellm/litellm_config.yaml
volumes:
cache:
driver: local
graphdb_data:
driver: local
shared-tmp:
litellm-user-keys-output: