

Frontend assignment submission and auto-grading platform. Students upload HTML/CSS/JS or React assignments, and the system runs Playwright tests in isolated Docker environments to produce scores, test results, screenshots, and logs.

| Service | Description |
|---|---|
| PostgreSQL | Database for application data and judge jobs |
| MinIO | Object storage for submissions and artifacts |
| API | Fastify REST API backend built from this repository with Docker |
| Web | React SPA built from this repository with Docker and served by Nginx |
| Caddy | Public entrypoint that routes /api/* to API, /img/* to MinIO, and everything else to Web |
After deployment, log in with:
adminDEFAULT_ADMIN_PASSWORDThe Judge Worker polls the database for jobs. It needs outbound access to PostgreSQL and MinIO, but no inbound ports.
In the Zeabur Dashboard, open the PostgreSQL service and copy Connection String (external, for Worker) from Instructions.
In the Zeabur Dashboard, open the MinIO service, go to Domains, and bind a domain such as minio.yourdomain.com so MinIO is reachable over HTTPS on port 443.
git clone <your-repo>
cd frontend-judge
pnpm install
docker build -t judge-runner:latest docker/judge-runner/
pnpm --filter @judge/shared build
pnpm --filter @judge/worker build
export DATABASE_URL='postgresql://root:<password>@hkg1.clusters.zeabur.com:<port>/zeabur'
export MINIO_ENDPOINT='minio.yourdomain.com'
export MINIO_PORT='443'
export MINIO_ACCESS_KEY='minio'
export MINIO_SECRET_KEY='<your-minio-secret>'
export MINIO_USE_SSL='true'
node apps/worker/dist/index.js
The worker will connect to the remote database, poll pending jobs, run them in local Docker containers, and upload artifacts back to MinIO.