A CTF competition platform aiming at maximized possibility of customization and a fluid experience for users and developers.
This platform hosts the GeekGame 2025 competition with 22 challenges (45 flags), ≥2000 registered users (max online users ≥450), and ≥10000 submissions. Our server achieves a load_5 of ≤0.2 at the peak period with all features turned on.
Backend (in Python) → PKU-GeekGame/gs-backend
Frontend (in React) → PKU-GeekGame/gs-frontend
Challenge Docker → PKU-GeekGame/geekgame-challenge-docker
Live demo → geekgame.pku.edu.cn
Misc files → This repo
Overall backend architecture:
Case study: when a user submits a flag
Set up the backend: refer to README from gs-backend
Set up the frontend: refer to README from gs-frontend
Start the backend processes. We use systemd: example configuration for reducer and worker processes.
Use a reverse proxy (we use nginx) to proxy requests to backend or frontend: an example configuration file. Remember to also set a large value for both worker_rlimit_nofile and worker_connections in nginx.conf, because each online user will has a websocket connection to the backend.
To register the first user manually, visit /service/auth/manual?identity=<your_name>.
Manual login should be disabled in production environment by configuring MANUAL_AUTH_ENABLED = False in src/secret.py in the backend codebase.
Visit admin panel at /<ADMIN_URL>.
ADMIN_URL and IS_ADMIN can be configured in src/secret.py in the backend codebase.
Both backend and frontend is distributed under MIT License. See their LICENSE files for more information.
