백준(BOJ) 모의 테스트를 웹으로 제공하는 프로젝트입니다. 기존 VSCode 확장(boj-mock-test)의 핵심 기능을 웹으로 옮겼고, 서버 리소스를 최소화하는 방향으로 설계했습니다.
- 싱글/멀티 모드
- solved.ac 기반 랜덤 문제 선정 + 백준 번호 직접 지정
- BOJ 문제 페이지 파싱 (설명/입력/출력/샘플)
- 샘플/커스텀 테스트 실행
- 참가자 현황 실시간 공유 (SSE)
- 문제별 코드 저장 및 재접속 복구(멀티)
- 종료 후 결과 화면(코드 열람/복사)
- 에디터 자동완성 ON/OFF
- 다크/라이트 테마
- 백엔드: Node.js + Express
- DB: SQLite (better-sqlite3)
- 프론트: Vite + React
- 실시간: SSE
- 러너: 로컬 실행 또는 Docker 재사용 컨테이너
- 의존성 설치
npm install- 서버/웹 동시 실행
npm run dev- 기본:
local(로컬 프로세스 실행) - 권장:
docker(격리/보안 강화)
npm run runner:init
RUNNER_MODE=docker npm run dev러너 작업 루트 기본값:
/tmp/boj-mock-run
- Python
- JavaScript (Node)
- C
- C++ (GNU++20)
- Java
- Kotlin
로컬 모드에서는 gcc/g++/javac/kotlinc 설치 필요
- 세션 동시 실행 제한:
MAX_CONCURRENT_RUNS(기본 2) - 실행 타임아웃:
RUN_TIMEOUT_MS(기본 2000ms) - 출력 제한:
MAX_STDOUT_BYTES,MAX_STDERR_BYTES - 참가자 실행 레이트 리밋: 2초에 1회
- 시험 종료 시간 경과 시 즉시 종료 상태
/api/run,/api/session/:id/problems→ 410- 기존 참가자는 결과 화면만 접근 가능
- 신규 참가자는 참여 불가
- 종료 후 24시간 유지, 이후 자동 정리 (TTL)
- 방 만들기 → 세션 ID / URL 생성
- URL 공유
- 참여하기에서 닉네임 + 비밀번호로 입장
- 동일 닉네임 재접속 시 비밀번호 일치 필요
POST /api/session/soloPOST /api/session/groupPOST /api/session/:id/joinPOST /api/runGET /api/session/:id/snapshotGET /api/session/:id/events(SSE)
server/src/config.js 참고
PORT,DB_PATHRUNNER_MODE,RUNNER_WORK_ROOTRUN_TIMEOUT_MS,MAX_STDOUT_BYTES,MAX_STDERR_BYTESMAX_CONCURRENT_RUNS,SESSION_TTL_HOURSBOJ_PROXY(선택): BOJ 페이지가 403으로 막히는 서버 환경에서 HTTP(S) 프록시를 통해 가져오기BOJ_FETCH_TIMEOUT_MS(선택): BOJ 페이지 fetch 타임아웃 (기본 8000ms)EXIT_ON_FATAL(기본true, 치명적 예외 시 프로세스 종료 후 systemd 재시작)
- MVP 성격상 LSP 기반 자동완성은 없음 (Monaco 기본 제공만 사용)
- 로컬 러너는 격리 수준이 낮아 운영 환경에서는 Docker 모드 권장
- DB를 초기화하려면 SQLite 파일 삭제 (
server/src/config.js의DB_PATH) - TTL 정리는 서버에서 30분마다 자동 실행
- 요청/오류 로그는 JSON 형태로
boj-mock서비스 로그에 남습니다. - 운영 서버에서 확인:
sudo journalctl -u boj-mock -fCI:.github/workflows/ci.yml- 모든 push/PR에서 의존성 설치 + 웹 빌드 검증
Deploy:.github/workflows/deploy.ymlmain브랜치 push 또는 수동 실행 시 VM으로 SSH 배포
OCI_VM_HOST: VM 공인 IP 또는 도메인OCI_VM_USER: SSH 사용자 (예:ubuntu)OCI_SSH_PRIVATE_KEY: 배포용 개인키 전체 내용DEPLOY_DIR(선택): 기본/opt/boj-mock-webDEPLOY_BRANCH(선택): 기본mainAPP_SERVICE_NAME(선택): 기본boj-mock
- 원격 서버에서 최신 코드 pull
web빌드 +server의존성 설치- 러너 컨테이너 초기화
boj-mocksystemd 서비스 재시작 및 헬스체크