ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
알고리즘 스터디용 온라인 저지
Translation pending
EducationJava · TypeScriptGitHub @sjh1108OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
알고리즘 스터디를 위한 자체 호스팅 온라인 저지(Online Judge)입니다. 문제 출제부터 제출·채점·풀이 공유까지 스터디에 필요한 흐름을 한 곳에서 처리합니다. • 웹: https://oj-oui2.vercel.app (가입은 스터디원 대상) • API: Oracle Cloud Ampere 한 박스, blue-green 무중단 배포Read the full README ↗
알고리즘 스터디를 위한 자체 호스팅 온라인 저지(Online Judge)입니다. 문제 출제부터 제출·채점·풀이 공유까지 스터디에 필요한 흐름을 한 곳에서 처리합니다.
.md 파일로 문제 업로드/다운로드, 지문 이미지 업로드(박스 디스크)/서버상태 모니터링, master 머지 시 업데이트 자동 공지모든 구성 요소가 Oracle Cloud Ampere 한 박스(aarch64, 2 OCPU / 12GB) 에서 돕니다.
앱은 DB·브로커·채점기를 주소(.env)로만 알고 있어서 어디에 두든 설정만 바꾸면 됩니다 —
AWS에서 이 박스로 옮길 때 애플리케이션 코드를 거의 건드리지 않은 이유입니다.
Vercel (Next.js)
│ HTTPS algoj.duckdns.org
▼
┌────────── OCI Ampere (aarch64, 2 OCPU / 12GB) ──────────┐
│ nginx — TLS 종단 + blue-green 업스트림 │
│ ├─ API algoj-api-blue|green 127.0.0.1:8081|8082 │
│ └─ 내부 고정 :8080 ◀── Discord 봇 (host network) │
│ │
│ algoj-net (도커 네트워크 — 호스트 포트를 열지 않는다) │
│ ├─▶ MySQL 8 DB_HOST=mysql 스키마는 Flyway │
│ ├─▶ RabbitMQ 4 RABBITMQ_HOST judge.queue │
│ └─▶ judge-runner JUDGE0_URL 채점 샌드박스 │
└──────────────────────────────────────────────────────────┘
/api/health가
통과하면 nginx 업스트림을 갈아끼웁니다. 12GB라 JVM 두 개가 잠깐 겹쳐도 됩니다
(2GB 시절에는 스왑 때문에 불가능해 박스를 두 대로 나눴었습니다 → deploy/archive/redundancy.md)judge-runner/README.mdjudge.queue 적재 → 리스너 워커가 꺼내 채점 → 결과 저장, 프론트는 폴링으로 갱신.
PENDING으로 남은 제출은 스위퍼가 1분 주기로 재적재합니다src/main/resources/db/migration/)가 관리하고 Hibernate는 validate만 수행합니다/images/**로 직접 서빙합니다 (blue-green 두 색이 같은 디렉터리를 공유)deploy/backup.mddeploy/oracle-cloud-migration.md,
AWS 시절의 이중화·컴포넌트 분리 기록은 deploy/archive/에 남아 있습니다| 영역 | 스택 |
|---|---|
| 백엔드 | Java 21, Spring Boot 3.5 (Web·Security·Data JPA·AMQP·Validation·Actuator), Flyway, JJWT |
| 프론트엔드 | Node.js 22, Next.js 14, React 18, TypeScript, Tailwind CSS 4, TanStack Query, Monaco Editor, react-markdown + KaTeX |
| 인프라 | Oracle Cloud(Ampere/arm64), MySQL 8, RabbitMQ 4, 자체 채점기, Docker, nginx, GitHub Actions CI/CD |
| 봇 | Node.js 22, discord.js 14 |
├── src/ # Spring Boot 백엔드 (dev.algoj)
│ ├── domain/ # user · problem · submission · run · image
│ └── global/ # config · security · Judge0 클라이언트 · 모니터링
├── frontend/ # Next.js 프론트엔드
├── judge-runner/ # 채점기 (Judge0 대체) — 서비스 + 샌드박스 이미지
├── discord-bot/ # Discord 봇 (연동/비밀번호/서버상태/배포공지)
├── deploy/ # 배포 자료 + 운영 가이드
│ ├── deploy-api.sh # 한 박스 blue-green 배포 (CD가 실행)
│ ├── backup-db.sh # DB 백업 (cron으로 매일)
│ ├── nginx/ # 공개 사이트 · upstream 시드 · 내부 :8080 고정 진입점
│ ├── docker-compose*.yml # 로컬 인프라 · 운영(MySQL+RabbitMQ) · 채점기 · Discord 봇
│ └── archive/ # AWS 시절 설계·이전 기록 (현재 구성 아님)
├── scripts/dev.sh # 로컬 백엔드 실행 스크립트
└── .github/workflows/ # ci.yml (검증) · cd.yml (배포) · judge-images.yml (채점기 이미지)
ssh <박스> "docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' algoj-judge-runner"
ssh -L 2358:<위 IP>:2358 <박스>
cp .env.example .env.dev # 값 채우기 (DB, JWT_SECRET, JUDGE0_URL 등)
cd deploy
docker compose --env-file ../.env.dev up -d # mysql :3306, rabbitmq :5672 (+관리 UI :15672)
로컬 전용 구성입니다. 운영은 MySQL·RabbitMQ를 deploy/docker-compose.oci.yml로 띄우고
호스트 포트를 열지 않습니다(위 아키텍처 참고).
./scripts/dev.sh # .env.dev 로드 후 bootRun (dev 프로필)
첫 부팅 시 Flyway가 스키마를 자동 생성합니다. dev 프로필은 기본으로 admin / admin1234 계정을 시드합니다.
cd frontend
npm ci
npm run dev # http://localhost:3000, API는 NEXT_PUBLIC_API_BASE_URL (기본 :8080)
./gradlew test # 백엔드 전체 (통합 테스트는 MySQL 필요 — CI와 동일)
./gradlew test --tests 'dev.algoj.domain.*' --tests 'dev.algoj.global.*'
# DB 없이 실행 가능한 단위/H2 테스트만
cd frontend && npm run lint && npm run build
SchemaDdlGenerator 테스트로 DDL을 뽑아 diff를 확인하고 db/migration/V<N>__*.sql을 추가하세요.master에 머지되면 GitHub Actions(cd.yml)가 자동으로:
deploy-api.sh) 실행 —
비어 있는 포트에 새 컨테이너를 띄우고 /api/health가 통과하면 nginx upstream을 전환합니다.
통과하지 못하면 nginx를 건드리지 않고 새 컨테이너만 지우므로 구버전이 계속 서빙됩니다.## 공지 섹션으로 Discord 업데이트 공지Flyway 마이그레이션은 앱이 부팅하면서 자동 적용되므로 스키마 변경에 별도 서버 작업이 필요 없습니다. 서버 초기 세팅, nginx/TLS, 봇 운영 등 자세한 내용은 deploy/README.md 참고.
| 명령 | 설명 |
|---|---|
/연동 <코드> | OJ 계정 페이지에서 발급한 코드로 디스코드 계정 연동 |
/비밀번호분실 | 연동된 계정의 임시 비밀번호 발급 (본인에게만 표시) |
/서버상태 | DB · Judge0 · 채점 큐(대기/워커/DLQ) · 제출 현황 · JVM 상태 확인 |
배포 공지는 명령이 아니라 자동입니다 — PR 본문에 ## 공지 섹션을 쓰면, 머지·배포 성공 시
그 섹션 내용만 DISCORD_ANNOUNCE_CHANNEL_ID 채널에 올라갑니다. 섹션이 없는 PR은 공지 없이 배포됩니다.