claude-bot 49f320fa71 installer: multi-role host/participant split + auto-platform + EULA + port UX
step2:
- 멀티 선택 시 호스트 / 참가자 sub-choice 추가. 호스트 는 기존 멀티 흐름 그대로,
  참가자 는 step3 (서버 설치) 를 건너뛰고 step4 client install 만 진행.

step4 client install:
- 플랫폼 설치/생략 선택 화면(sub41) 제거. 음악퀴즈 platform.type 이 vanilla 가
  아니면 무조건 자동 설치, vanilla 면 자동 건너뜀. 사용자 결정 없음.
- 참가자 모드에서는 ClientInstallPayload.skipMap=true 로 보내 client 측
  saves/ 에 맵을 풀지 않는다 (서버에 이미 있음).
- types.ts 에 skipMap 필드 추가. main.ts client:install 핸들러에서 분기.

step3 EULA modal:
- eula.txt 의 내용과 무관하게 항상 minecraft.net 의 공식 서버 EULA 페이지를
  받아 iframe 에 표시. readEula() 분기 제거.

step3 포트포워딩 결과:
- 성공(preForwarded/upnpOk) 시 "친구는 <address> 주소로 서버에 접속할 수
  있습니다" 처럼 외부 주소를 강조해 표시.
- 포트가 25565 면 :포트 를 생략하고 ip 만 보여줌 (마인크래프트 자바판
  기본 포트라 클라이언트에서도 생략 가능).

step5:
- 서버 마무리 액션 (바로가기/서버 실행 토글) 은 호스트 만 노출. 참가자는
  서버를 띄우지 않으므로 런처 토글만 보인다.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 22:06:48 +09:00
2026-05-11 03:31:07 +09:00

마인크래프트 음악퀴즈 통합 패키지

마인크래프트 음악퀴즈를 한 번에 배포·관리할 수 있도록 만든 통합 프로젝트입니다.

  • 관리 사이트 — 음악퀴즈 정보(JSON)와 음악·사진 목록, 데이터팩 출력을 한 곳에서 운영.
  • 음악퀴즈 간편설치기 (.exe)manifest.json 기반으로 사용자가 마인크래프트 본체·서버·모드를 자동 설치.
  • 리소스팩 간편설치기 (.exe) — 음악퀴즈 음악·표지를 yt-dlp 로 받아 painting variant 텍스처 리소스팩으로 패키징.

무엇이 들어 있나

디렉터리 역할 진입점
src/server/ 음악퀴즈 관리 웹사이트 (Express + EJS) bun start 또는 npm start
src/installer/ 음악퀴즈 간편설치기 (Electron) npm run installer
src/installer-rp/ 리소스팩 간편설치기 (Electron) npm run installer:rp
src/shared/ 두 설치기와 서버가 공유하는 타입·스토어
views/ EJS 템플릿 (관리 사이트)
manifest/ 음악퀴즈별 정의 JSON
file/list/ 음악퀴즈별 음악·사진 목록 JSON
file/ 정적 파일(서버 zip / 맵 zip / 모드 jar 등) 호스팅

핵심 컨셉

설치기는 사용자의 %APPDATA%\.minecraft 를 더럽히지 않기 위해 .mc_custom 을 별도 게임 디렉터리로 사용합니다.

%APPDATA%\
├─ .minecraft\           ← 원래 마인크래프트 폴더(공용 자원: assets, libraries, versions, runtime)
└─ .mc_custom\           ← 음악퀴즈 전용 게임 폴더(설치기가 자동 생성)
   ├─ mods\              ← 음악퀴즈가 지정한 모드(.jar)
   ├─ resourcepacks\     ← 리소스팩(.zip)
   ├─ saves\             ← 단일 맵 .zip 압축 해제 결과
   ├─ assets\  (junction → .minecraft\assets)
   ├─ libraries\ (junction → .minecraft\libraries)
   ├─ versions\ (junction → .minecraft\versions)
   ├─ options.txt 등     ← `.minecraft` 의 최상위 설정 파일을 복사해 사용
   └─ launcher_profiles  ← 실제 파일은 `.minecraft\launcher_profiles.json` 을 수정해 gameDir=.mc_custom 으로 지정

이렇게 분리해 두면 사용자가 평소 쓰던 마인크래프트와 음악퀴즈 설정이 섞이지 않고, 음악퀴즈만 삭제해도 본체에는 영향이 없습니다.


빠른 시작

전제: Node.js 18+, npm. 윈도우 빌드를 만들 때만 추가로 Electron 의 PE 서명·아이콘 도구가 필요합니다.

# 의존성 설치
npm install

# 환경변수 템플릿 복사 (처음 한 번만)
cp .env.example .env

# 1) 관리 사이트 개발 실행 (http://localhost:3000)
npm start

# 2) 음악퀴즈 간편설치기를 Electron 으로 실행해 보기
npm run installer

# 3) 리소스팩 간편설치기를 Electron 으로 실행해 보기
npm run installer:rp

# 4) 음악퀴즈 간편설치기 윈도우 .exe 빌드
npm run dist:win

리소스팩 설치기는 yt-dlp 가 필요합니다. 자동 다운로드되지만, 막혀 있는 환경이라면 docs/yt-dlp-setup.md 참고.


자주 쓰는 문서

문서 내용
docs/installer.md 음악퀴즈 간편설치기 사용자 흐름(단계별 화면·동작).
docs/admin-site.md 관리 사이트 운영자 가이드(음악퀴즈 추가·편집, 음악 목록, 데이터팩 출력).
docs/resourcepack-installer.md 리소스팩 간편설치기 동작 명세(yt-dlp 흐름, 이미지 정규화 규칙).
docs/painting-variant.md 1.21+ painting variant 슬롯/리소스팩 텍스처 규격.
docs/yt-dlp-setup.md yt-dlp 자동/수동 설치, 트러블슈팅.

데이터 포맷 (요약)

자세한 필드 설명은 docs/admin-site.md 의 "음악퀴즈 JSON" 절을 참고하세요.

manifest.json — 사이트 루트, 음악퀴즈 목록

{
  "packs": [
    { "name": "음악퀴즈 v1", "file": "mq-v1" }
  ]
}
  • file/manifest/<file>.json 의 파일명(확장자 제외).
  • 관리 사이트에서 음악퀴즈를 추가/삭제하면 자동으로 갱신됩니다.

/manifest/<key>.json — 음악퀴즈 정의

{
  "name": "음악퀴즈 v1",
  "mcVersion": "1.21.4",
  "platform": {
    "type": "fabric",
    "loaderVersion": "0.16.10"
  },
  "modsFolder": "mq-v1",
  "resourcepackPath": "mq-v1.zip",
  "mapPath": "mq-v1-map.zip",
  "serverPath": "mq-v1-server.zip",
  "serverMinRam": 4096,
  "serverMaxRam": 8192,
  "clientMinRam": 4096,
  "clientRecommendedRam": 8192
}
  • platform.type = vanilla / forge / fabric / neoforge.
  • fabricloaderVersion 만 지정하면 설치기가 최신 fabric-installer 로 자동 CLI 설치합니다.
  • 나머지(forge/neoforge) 는 platform.downloadUrl 에 설치 jar URL.
  • modsFolder/file/mods/<폴더>/ 의 모든 .jar 를 자동으로 받습니다.
  • serverPath / mapPath / resourcepackPath/file/servers/, /file/maps/, /file/resourcepacks/ 아래 zip 파일명.

/file/list/<key>.json — 음악·사진 목록 (리소스팩 설치기용)

{
  "musicPlaylistUrl": "https://www.youtube.com/playlist?list=...",
  "imagePlaylistUrl": "https://www.youtube.com/playlist?list=...",
  "music": [
    { "url": "https://www.youtube.com/watch?v=...", "title": "...", "artist": "...", "durationSec": 213 }
  ],
  "images": [
    { "url": "https://www.youtube.com/watch?v=..." },
    { "url": "https://example.com/cover.png" }
  ]
}

디렉터리 구조 (전체)

minecraft_launcher/
├─ src/
│  ├─ server/              Express + EJS 관리 사이트
│  ├─ installer/           음악퀴즈 간편설치기 (Electron 메인 + preload)
│  ├─ installer-rp/        리소스팩 간편설치기 (Electron 메인 + 음악/이미지 파이프라인)
│  └─ shared/              공용 타입, 매니페스트 스토어, mojang/upnp 유틸
├─ installer/              음악퀴즈 설치기 렌더러(HTML/CSS/JS)
├─ installer-rp/           리소스팩 설치기 렌더러(HTML/CSS/JS)
├─ views/                  관리 사이트 EJS 템플릿
├─ public/                 관리 사이트 정적 파일(styles.css 등)
├─ manifest/               음악퀴즈 JSON 정의 (운영자가 편집)
├─ file/
│  ├─ servers/             서버 zip
│  ├─ maps/                맵 zip
│  ├─ mods/<폴더>/         모드 jar 묶음 (index.json 자동 생성)
│  ├─ resourcepacks/       리소스팩 zip
│  ├─ platforms/           Forge / NeoForge 설치 jar
│  └─ list/<key>.json      음악·사진 목록
├─ docs/                   사용·운영 문서
├─ manifest.json           사이트 루트 매니페스트 (자동 관리)
├─ account.json            관리자 계정 (절대 외부 노출 금지)
├─ package.json
└─ tsconfig.{,server,installer,installer-rp}.json

빌드 산출물 / 배포

산출물 빌드 명령 비고
관리 사이트 (Node 실행) npm start systemd 등으로 띄우기. 외부 도메인이 manifest 의 base URL 이 됩니다.
음악퀴즈 간편설치기 .exe npm run dist:win electron-builder.yml 설정 사용.
리소스팩 간편설치기 .exe tsconfig.installer-rp.json 빌드 후 electron-builder 수동 패키징

라이선스

내부 프로젝트. 외부 공개 시 별도 명시.

Description
No description provided
Readme 41 MiB
v0.3.5 Latest
2026-05-23 17:31:42 +09:00
Languages
TypeScript 58.7%
JavaScript 24.2%
EJS 10.2%
CSS 6.5%
HTML 0.4%