Skip to content

Docker Setup

omegaUp is not one program — it is a PHP web application plus a handful of Go services plus their datastores, and the only sane way to run all of it on your machine is the Docker Compose stack in the repository's docker-compose.yml. This page explains what that stack actually starts and why, so that when something misbehaves you know which container to look at.

If your goal is to contribute — clone, boot, log in, edit code — start with Development Setup, which walks the happy path. This page is the map underneath it.

The services

Bringing the stack up (docker-compose up) starts these containers, each pinned to a specific image so everyone runs the same versions:

Service Image What it is
frontend omegaup/dev-php The PHP 8.1 web application (php-fpm behind nginx) — the MVC app that serves every page and the /api/ endpoints. This is the container you exec into to run tests, webpack, and PHP tooling.
mysql mysql:8.0.34 The database. Exposed to the host on port 13306 (not the default 3306, so it won't collide with a MySQL you already run).
redis redis Cache.
rabbitmq rabbitmq:3-management-alpine Message queue used for asynchronous work; the -management image also gives you its web console.
gitserver omegaup/gitserver:v1.9.13 The Go service that stores each problem as a git repository. See Gitserver.
grader omegaup/backend The Go grader — receives runs, queues them, dispatches to runners. The frontend reaches it over HTTP at OMEGAUP_GRADER_URL (default https://localhost:21680).
runner omegaup/runner The Go runner — compiles and executes submissions inside minijail.
broadcaster omegaup/backend The Go service that pushes scoreboard/verdict updates to the browser over WebSockets.
init-omegaupdata alpine A short-lived init container that seeds the shared problem-data volume before the long-running services start.

The grader, runner, broadcaster, and gitserver are prebuilt binaries shipped as Docker images — they are not built from this repository, which contains no Go source. They come from the separate omegaup/quark and omegaup/gitserver projects; see Infrastructure for how the pieces fit together in production.

Volumes

A few named volumes persist state across restarts so you don't re-seed everything each time: dbdata (MySQL), omegaupdata (the shared problem data the frontend, grader, and gitserver all read), plus rabbitmq and redis. If the stack ever gets into a genuinely wedged state, removing these volumes and re-seeding is the big hammer — see Troubleshooting.

Production vs. development

docker-compose.yml is the development stack. Production runs the same services on Kubernetes from docker-compose.k8s.yml with the omegaup/php and omegaup/nginx images rather than the all-in-one dev-php image. The service topology is the same; the packaging and scaling differ. See Deployment.