Refactor launcher profiles and port automation
Some checks failed
Build / release (macos-latest) (push) Has been cancelled
Build / release (ubuntu-latest) (push) Has been cancelled
Build / release (windows-latest) (push) Has been cancelled
Windows Smoke Test / windows-smoke (push) Has been cancelled

This commit is contained in:
2026-05-05 21:52:17 +09:00
parent e266387784
commit 9786cfe031
22 changed files with 1558 additions and 798 deletions

View File

@@ -1,65 +1,42 @@
# Minecraft Launcher
Electron 기반 커스텀 마인크래프트 런처입니다. `MRSLauncher`를 최신 소스로 가져온 뒤, 단일 모드팩 구조를 `설치 페이지 + 라이브러리` 구조로 확장했습니다.
Electron 기반 커스텀 마인크래프트 런처입니다. `MRSLauncher`를 최신 소스로 가져온 뒤, 설치 페이지 + 라이브러리 구조와 관리자 사이트를 붙였습니다.
## 현재 상태
## 현재 구조
- 여러 프로필을 설치 페이지에서 라이브러리로 추가 가능
- 프로필 종류 지원:
- `modpack`
- `map`
- `server-pack`
- 라이브러리에서 프로필 선택, 제거, 자료 준비, 실행 화면 이동, 바로 실행 가능
- 프로필별 `distribution.json` 전환 가능
- `map` 프로필은 월드 ZIP/로컬 폴더를 `saves/`에 설치하고 `quickPlaySingleplayer`로 바로 실행
- `server-pack` 프로필은 로컬 서버 번들 설치, 서버 시작/중지, 선택형 터널 명령 실행, 공개 주소 표시 지원
- 라이브러리의 주소 입력칸에 `host:port`를 넣으면 실행 시 자동 접속
- 설치 페이지는 관리자가 미리 등록한 프로필을 보여주는 읽기 전용 카탈로그 화면
- 설치 페이지에서 프로필 제목, 요약, 상세 설명, 실행 조건을 확인 가능
- 프로필은 `맵`을 기본으로 두고 `모드`, `플러그인`, `서버` 기능을 조합합니다.
- 설치 페이지는 관리자 등록 프로필을 읽기 전용으로 보여줍니다.
- 라이브러리에서는 프로필 설치, 선택, 제거만 하고, 서버 프로필은 접속 주소를 직접 입력할 수 있습니다.
- `PLAY`를 누르면:
- 서버 기능이 없는 프로필은 맵을 싱글플레이로 실행
- 서버 기능이 있고 접속 주소가 있으면 해당 주소로 접속
- 서버 기능이 있고 접속 주소가 없으면 로컬 서버를 먼저 실행한 뒤 `localhost`로 접속
- 메인 화면 왼쪽 아래는 선택된 서버 프로필의 자동 포트 개방 상태를 표시합니다.
## 중요한 제한
## 자동 포트 개방
포트포워딩 없이 외부 사용자가 접속하게 만드는 기능은 런처만으로 해결되지 않습니다.
- 현재 구현은 `UPnP + Windows 방화벽` 기준입니다.
- 성공하면 자동 개방 상태를 표시합니다.
- 이미 열려 있으면 기존 포트를 그대로 사용합니다.
- 실패하면 `직접 포트포워딩 해주세요` 안내를 표시합니다.
- 접속 주소를 직접 입력한 경우에는 자동 포트 개방을 건너뜁니다.
필요한 것 중 하나:
## 관리자 사이트
- 별도 릴레이 서버
- 터널링 도구
- VPN/NAT traversal 백엔드
```bash
npm run admin
```
현재 구현은 `server-pack` 프로필에 `tunnelCommand`를 넣어 외부 도구를 호출하는 자리까지 제공합니다.
- 기본 주소: `http://127.0.0.1:8787`
- `distribution.json` 업로드 / 새로 만들기 / 직접 편집 가능
- 월드 ZIP 업로드 가능
- 서버용 버킷 JAR 업로드 가능
- 서버 메모리, 최대 인원수, 화이트리스트, 포트 설정 가능
추후 설계 문서:
문서:
- [docs/portforwarding-free-connection-plan.md](docs/portforwarding-free-connection-plan.md)
## 프로젝트 구조
- `app/`
- Electron renderer 자산
- 설치/라이브러리/로그인/설정 화면
- `app/assets/js/catalogmanager.js`
- 관리자 등록 카탈로그 로드, 프로필 메타데이터 정규화
- `app/assets/js/profileassetmanager.js`
- 맵 ZIP, 서버 번들 ZIP/폴더 설치
- `app/assets/js/serverruntime.js`
- 로컬 서버 실행, 선택형 터널 프로세스 관리
- `src/main/index.ts`
- TypeScript 메인 프로세스 엔트리
- `index.js`
- `dist/main/index.js` 우선 실행, 없으면 `index.legacy.js` 폴백
## 카탈로그 / 프로필
기본 카탈로그:
- `app/assets/launcher/catalog.json`
원격 카탈로그:
- 관리자 배포 설정으로 연결
세부 스키마는 [docs/launcher-catalog.md](docs/launcher-catalog.md)를 보면 됩니다.
- [docs/admin-site.md](docs/admin-site.md)
- [docs/launcher-catalog.md](docs/launcher-catalog.md)
## 개발
@@ -73,17 +50,6 @@ Electron 기반 커스텀 마인크래프트 런처입니다. `MRSLauncher`를
npm install
```
관리자 사이트 실행:
```bash
npm run admin
```
설치 페이지용 프로필을 웹 UI로 관리할 수 있습니다.
- `distribution.json`도 사이트 안에서 직접 만들고 수정할 수 있습니다.
- 문서: [docs/admin-site.md](docs/admin-site.md)
개발 실행:
```bash
@@ -96,8 +62,6 @@ npm start
npm run smoke:win
```
이 명령은 TypeScript 메인 프로세스를 빌드한 뒤 Electron 앱을 실제로 한 번 띄우고, `LAUNCHER_SMOKE_EXIT` 환경변수로 자동 종료합니다.
TypeScript 메인 프로세스만 빌드:
```bash
@@ -107,11 +71,10 @@ npm run build
배포 빌드:
```bash
npm run dist
npm run dist:win
```
## 참고
- Upstream: `https://github.com/peunsu/MRSLauncher`
- Original base: `https://github.com/dscalzi/HeliosLauncher`
- CI: `.github/workflows/windows-smoke.yml` 에서 Windows smoke run 수행