ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
🎭 멀티진진가 (진짜 진짜 가짜) · made by 문수네집 학생들이 진짜 사실 5가지를 적으면 그중 하나를 그럴듯한 가짜로 바꿔, 반 전체가 "어느 것이 가짜일까?"를 맞히는 실시간 교실 게임입니다. QR로 입장하고 api.moonsunezip.com의 PostgreSQL REST API와 방 단위 WebSocket으로 동기화합니다. 화면은 index.html, 데이터 연결은 postgres-adapter.v1.js입니다. 방·학생·문제·투표는 임시 데이터입니다. made by 문수네집 — 🏠 문수네집 · 📷 인스타그램 · ✨ moonsune.zip ✅ 배포 완료 — 바로 사용 가능 • 데이터 원본: 홈서버 PostgreSQL (api.moonsunezip.com) • 배포: GitHub main 푸시 후 홈서버 자동 배포. Firebase 데이터 저장은 사용하지 않습니다.README 전문 보기 ↗
학생들이 진짜 사실 5가지를 적으면 그중 하나를 그럴듯한 가짜로 바꿔, 반 전체가 "어느 것이 가짜일까?"를 맞히는 실시간 교실 게임입니다.
QR로 입장하고 api.moonsunezip.com의 PostgreSQL REST API와 방 단위 WebSocket으로 동기화합니다. 화면은 index.html, 데이터 연결은 postgres-adapter.v1.js입니다. 방·학생·문제·투표는 임시 데이터입니다.
made by 문수네집 — 🏠 문수네집 · 📷 인스타그램 · ✨ moonsune.zip
✅ 배포 완료 — 바로 사용 가능
👉 https://jinjinga.moonsunezip.com
- 데이터 원본: 홈서버 PostgreSQL (
api.moonsunezip.com)- 배포: GitHub
main푸시 후 홈서버 자동 배포. Firebase 데이터 저장은 사용하지 않습니다.
api.moonsunezip.com/v1/jinjinga/rooms/...의 학생·문제·투표별 행을 사용하며 별도 API·DB·서버·소켓을 만들지 않습니다. 100ms 이상 간격으로 생성하고 한 번에 1표씩 전송합니다. 기존 requestId 및 제한된 재시도를 유지합니다.검증: node --test demo-bots.test.mjs postgres-adapter.test.mjs. 50명 생성, 25명 투표, 50명 정답률 변화, 중복 클릭, 새로고침·방 이동, 학생별 제출 플래그 저장을 확인합니다. 브라우저 검증은 운영 API와 분리한 로컬 API 모형을 사용했습니다.
문제 방 만들기 → 주제 입력 + 가짜 방식 선택(AI / 직접 작성) → 방 생성○/○ 완료)발표 시작하기 → 학생 한 명씩 문제 슬라이드 표시정답 공개 → 가짜 강조 + 진짜값 + 정답률 → 다음 → 반복학생이 진짜 5개 중 하나를 골라 직접 비슷한 가짜로 바꿉니다. 작성 화면에 예시·팁이 자동으로 표시돼요:
AI·외부 API를 전혀 쓰지 않습니다. API 키·요금·네트워크 호출이 필요 없어 100% 무료로 동작합니다.
rooms/JJG_<코드>
├─ topic, state(writing|presenting|done)
├─ players/<pid> : name, submitted
├─ problems/<pid> : items[5], fakeIndex, realValue, submittedAt
├─ present : order[], idx, revealed
└─ votes/<주인pid>/<투표자pid> : 선택한 보기 index
기존 qr-bingo 보안 규칙(rooms/$room 읽기·쓰기 허용)을 그대로 사용하므로 규칙 수정이 필요 없습니다.
index.html — 앱 전체 (HTML/CSS/JS + Firebase + QR, 빌드 불필요)firebase.json, .firebaserc — 배포 설정 (hosting target: jinjinga → 사이트 jinjinga-class)다른 세션·다른 AI 에서 이 앱을 고치기 전에 이 섹션을 먼저 읽으세요. 서버 관리자가 관리하는 섹션입니다(마지막 갱신 2026-09-27). 앱 설명은 위쪽 본문을 보세요.
| 항목 | 값 |
|---|---|
| 주소 | https://jinjinga.moonsunezip.com |
| 서버 포트 | 3001 (PM2 이름 jinjinga) |
| 배포 브랜치 | main |
| 배포 방식 | 빌드 없음 — 저장소 루트의 index.html 등을 그대로 정적 서버가 제공 |
| 서버 위치 | C:\homeserver\apps\multijinjinga |
postgres-adapter.v1.js → https://api.moonsunezip.com/v1/jinjinga/…, 실시간은 wss://api.moonsunezip.com/v1/realtime?room=방코드 입니다(쿼리 이름은 room, code 아님). 실시간은 서버→화면 단방향이고, 보내는 것은 HTTP 로 합니다.jjg_* 테이블)는 임시 데이터입니다. PostgreSQL UNLOGGED 테이블이라 빠르지만, 24시간이 지나면 자동 삭제되고 서버가 비정상 종료되면 비워집니다. 선생님이 오래 남길 기능(문제 저장 등)은 /v1/documents 같은 영구 저장소를 쓰세요.firebase.json, pb-adapter.js 는 예전 흔적입니다. 새 코드에서 쓰지 마세요.127.0.0.1 에만 열리고, 외부 접속은 Cloudflare Tunnel 이 전담합니다(집 IP·포트 비노출, HTTPS 자동).git reset --hard origin/<브랜치> 로 코드를 통째로 덮어쓰고 → npm ci → npm run build → PM2 재시작 순서로 배포합니다.따라서:
package-lock.json 을 반드시 커밋하세요(npm ci 는 lock 파일이 없으면 실패합니다)..md 문서만 바꾼 push는 재시작 없음).| 규칙 | 이유 |
|---|---|
서버는 HOST, PORT 환경변수를 읽고 기본값을 127.0.0.1 로 | 주소를 0.0.0.0 으로 코드에 고정하면 서버 설정으로 바꿀 수 없음 |
| IP 당 제한을 걸지 마세요 | 학교는 전교생이 공인 IP 하나로 나갑니다. 윷놀이의 "IP당 방 6개" 제한이 학교 전체를 막았습니다 |
| 방 상태 전송 시각·타이머는 방마다 따로 | 전역 변수 하나로 두면 한 반의 활동이 다른 반 갱신을 밀어냅니다(줄다리기에서 최장 4초 멈춤) |
큰 상태를 자주 보내면 WebSocket 압축(perMessageDeflate) | 줄다리기 20개 반 기준 161Mbps → 3Mbps |
| 끊긴 학생이 60초 안에 같은 자리로 재접속할 수 있게 | 교실 와이파이는 자주 끊깁니다. 빈 방도 60초는 유지하세요 |
| 요청 처리 중 동기 파일 I/O·느린 OS 호출 금지 | Windows 에서 os.networkInterfaces() 1회 25ms → 30명 방에서 서버가 멈췄습니다 |
| 요청마다 목록 전체를 훑는 코드 금지 | 사용자가 늘수록 느려집니다(backend 처리량이 4분의 1이던 원인) |
| 비밀값(키·비밀번호)은 저장소에 넣지 않기 | 서버의 비밀값은 C:\homeserver\secrets 에 따로 있습니다 |
부하 목표: 한 학교 20개 반 동시 사용(약 600명). 전국 배포라 한글날처럼 특정 날에 몰립니다.
| 용도 | 주소 |
|---|---|
| 데이터 API (PostgreSQL) | https://api.moonsunezip.com — /v1/documents/doc·/query·/commit, /health |
| 데이터 실시간 알림 (서버→화면 단방향) | wss://api.moonsunezip.com/v1/realtime?room=방코드 · /v1/documents/realtime?scope=범위 |
| 공용 게임 서버 (메모리, 양방향) | wss://game.moonsunezip.com/v1/game?room=방코드&game=게임이름&name=이름 |
새 주소(서브도메인)나 새 포트가 필요하면 서버 쪽에서 Cloudflare 설정과 PM2 등록을 해야 합니다. 코드만 올려서는 열리지 않습니다.
이 저장소를 고치기 전에 moonsugugu/coderule 을 먼저 읽으세요. 사람과 AI 모두 지킵니다.
핵심 여섯 가지
메시지 크기(바이트) × 초당 횟수 × 받는 사람 수 × 8 ÷ 1,000,000 으로 완료 전에 잰다.
2026-10-02 고조선이 30명 방 하나에 22Mbps를 써서, 20개 반이 몰리자 집 업로드(약 170Mbps)가 막혀 모든 앱이 끊겼다.perMessageDeflate)을 켜고, 위치처럼 계속 바뀌는 값은 초당 5HOST·PORT 환경변수(기본 127.0.0.1), 요청 경로에 동기 I/O 금지..md 문서만 바꾼 push는 재시작 없이 반영된다)api.moonsunezip.com)가 맡는다. backend 가 쓰기를 적응형 대기열로 나눠 처리하고, 바쁜 동안 실시간 연결을 끊지 않는다. 화면은 쓰기 503 을 받으면 1~5초 간격으로 늘려 가며 다시 시도하고, 같은 요청을 곧바로 반복하지 않는다.이 저장소 점검(2026-10-02): 이미 규칙을 지키고 있습니다(api.moonsunezip.com 방 단위 실시간, 바뀐 행만 전달, 재접속 백오프 최대 15초).