개요
RetroArch Web은 브라우저에서 바로 클래식 레트로 게임을 즐길 수 있는 웹 기반 에뮬레이터입니다. NES, SNES, Sega Genesis, Game Boy 등 다양한 레트로 콘솔의 게임을 별도 설치 없이 웹 브라우저만으로 플레이할 수 있습니다. Docker로 셀프 호스팅하면 자신만의 레트로 게임 아케이드를 구축할 수 있습니다.
RetroArch 공식: https://www.retroarch.com
GitHub (EmulatorJS): https://github.com/linuxserver/emulatorjs
GitHub Stars: 3,000+ (EmulatorJS)
라이선스: GPL
RetroArch Web이란?
RetroArch는 200개 이상의 에뮬레이터 “코어”를 지원하는 멀티 플랫폼 에뮬레이터 프론트엔드입니다. RetroArch Web은 이를 웹 브라우저에서 실행할 수 있도록 WebAssembly로 포팅한 버전입니다.
핵심 개념
- Libretro: 에뮬레이터 API 표준
- 코어(Core): 각 게임 시스템을 에뮬레이션하는 플러그인
- 프론트엔드: 코어를 실행하고 관리하는 인터페이스
- ROM: 게임 데이터 파일
왜 셀프 호스팅인가?
- 개인 ROM 컬렉션을 안전하게 관리
- 어떤 기기에서든 브라우저로 접속해 플레이
- 친구, 가족과 레트로 게임 아케이드 공유
- 클라우드 게이밍처럼 어디서든 이어하기
지원 시스템 및 코어
RetroArch Web은 다양한 레트로 게임 시스템을 지원합니다.
닌텐도 계열
| 시스템 | 추천 코어 | 설명 |
|---|---|---|
| NES | Nestopia, Mesen | 8비트 패미컴 |
| SNES | Snes9x, bsnes | 16비트 슈퍼패미컴 |
| Game Boy | Gambatte | GB/GBC |
| Game Boy Advance | mGBA | GBA |
| Nintendo 64 | Mupen64Plus | N64 |
| Nintendo DS | melonDS | NDS |
세가 계열
| 시스템 | 추천 코어 | 설명 |
|---|---|---|
| Master System | Genesis Plus GX | 8비트 |
| Genesis/Mega Drive | Genesis Plus GX | 16비트 메가드라이브 |
| Sega CD | Genesis Plus GX | CD-ROM 확장 |
| Game Gear | Genesis Plus GX | 휴대용 |
| Saturn | Beetle Saturn | 32비트 |
| Dreamcast | Flycast | 128비트 |
기타 시스템
| 시스템 | 추천 코어 | 설명 |
|---|---|---|
| PlayStation | Beetle PSX | PS1 |
| PlayStation 2 | PCSX2 | PS2 (고사양 필요) |
| PSP | PPSSPP | 휴대용 |
| Arcade | FinalBurn Neo, MAME | 아케이드 게임 |
| Neo Geo | FinalBurn Neo | SNK 아케이드 |
| Atari 2600 | Stella | 클래식 |
| DOS | DOSBox | PC 게임 |
유사 도구 비교
| 항목 | RetroArch Web | EmulatorJS | 개별 에뮬레이터 | 클라우드 게이밍 |
|---|---|---|---|---|
| 설치 | Docker | Docker | 각각 설치 | 불필요 |
| 지원 시스템 | 200+ | 40+ | 1개씩 | 제한적 |
| UI | RetroArch 스타일 | 모던/깔끔 | 각각 다름 | 서비스별 |
| ROM 관리 | 수동 | 자동 스캔 | 수동 | 제공됨 |
| 아트워크 | 제한적 | ✅ 자동 | 없음 | ✅ |
| 세이브 스테이트 | ✅ | ✅ | ✅ | 제한적 |
| 멀티플레이어 | Netplay 지원 | 제한적 | 코어별 | 서비스별 |
| 셀프 호스팅 | ✅ | ✅ | 해당없음 | ❌ |
어떤 것을 선택할까?
RetroArch Web이 적합한 경우:
- 다양한 시스템을 하나의 인터페이스로
- RetroArch에 익숙한 사용자
- 고급 설정 (쉐이더, 리와인드 등)이 필요한 경우
EmulatorJS가 적합한 경우:
- 깔끔한 모던 UI 선호
- ROM 아트워크 자동 관리 원함
- 쉬운 설정과 관리 원함
- Xbox 같은 콘솔 브라우저에서 사용
Docker 설치 방법
RetroArch Web을 Docker로 설치하는 여러 방법이 있습니다.
방법 1: 기본 RetroArch Web (간단)
가장 간단한 방법으로, 기본적인 RetroArch Web 플레이어를 제공합니다.
docker-compose.yml
services:
retroarch:
image: inglebard/retroarch-web:latest
container_name: retroarch-web
ports:
- "8080:80"
volumes:
- ./roms:/roms
restart: unless-stopped
실행
mkdir -p ~/docker/retroarch-web/roms
cd ~/docker/retroarch-web
docker compose up -d
브라우저에서 http://서버IP:8080 접속
방법 2: EmulatorJS (추천) ⭐
LinuxServer.io에서 제공하는 EmulatorJS는 더 풍부한 UI와 ROM 관리 기능을 제공합니다.
docker-compose.yml
services:
emulatorjs:
image: lscr.io/linuxserver/emulatorjs:latest
container_name: emulatorjs
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Seoul
volumes:
- ./config:/config
- ./data:/data
ports:
- "3000:3000" # 관리자 UI
- "80:80" # 게임 프론트엔드
- "4001:4001" # IPFS (옵션)
restart: unless-stopped
실행
mkdir -p ~/docker/emulatorjs/{config,data}
cd ~/docker/emulatorjs
docker compose up -d
접속
- 관리자 UI:
http://서버IP:3000– ROM 업로드, 설정 - 게임 플레이:
http://서버IP:80– 실제 게임 화면
방법 3: LinuxServer RetroArch (데스크톱 스타일)
웹 브라우저에서 전체 RetroArch 데스크톱 UI를 VNC로 접근합니다.
docker-compose.yml
services:
retroarch:
image: lscr.io/linuxserver/retroarch:latest
container_name: retroarch
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Seoul
volumes:
- ./config:/config
ports:
- "3000:3000" # HTTPS 웹 UI
- "3001:3001" # HTTP 웹 UI
shm_size: "1gb"
restart: unless-stopped
방법 4: 협업 버전 (게임 포함)
미리 게임이 포함된 이미지 (약 10GB). 테스트 용도로만 사용하세요.
services:
retroarch:
image: antoinebou12/retroarch-web-games:latest
container_name: retroarch-games
ports:
- "8080:8080"
restart: unless-stopped
⚠️ 주의: ROM 파일의 저작권을 확인하세요. 합법적으로 소유한 게임만 사용해야 합니다.
ROM 파일 추가 방법
EmulatorJS 사용 시 (추천)
- 관리자 UI (
http://서버IP:3000) 접속 - 시스템별 폴더에 ROM 파일 업로드
- 자동으로 게임 인식 및 아트워크 다운로드
- 프론트엔드 (
http://서버IP:80)에서 플레이
폴더 구조 예시
data/
├── nes/
│ └── roms/
│ ├── Super Mario Bros.nes
│ └── Zelda.nes
├── snes/
│ └── roms/
│ ├── Super Mario World.smc
│ └── Chrono Trigger.sfc
├── genesis/
│ └── roms/
│ └── Sonic the Hedgehog.md
└── gba/
└── roms/
└── Pokemon FireRed.gba
지원 ROM 형식
| 시스템 | 확장자 |
|---|---|
| NES | .nes, .zip |
| SNES | .smc, .sfc, .zip |
| Genesis | .md, .bin, .zip |
| Game Boy | .gb, .gbc, .zip |
| GBA | .gba, .zip |
| N64 | .n64, .z64, .v64 |
| PlayStation | .bin/.cue, .iso, .chd |
BIOS 파일 설정
일부 시스템은 BIOS 파일이 필요합니다.
BIOS가 필요한 시스템
| 시스템 | BIOS 파일 | 필수 여부 |
|---|---|---|
| PlayStation | scph1001.bin | 필수 |
| Sega CD | bios_CD_U.bin | 필수 |
| Saturn | saturn_bios.bin | 필수 |
| Dreamcast | dc_boot.bin, dc_flash.bin | 필수 |
| GBA | gba_bios.bin | 권장 |
| DS | bios7.bin, bios9.bin, firmware.bin | 필수 |
BIOS 파일 위치
EmulatorJS의 경우:
data/
└── bios/
├── scph1001.bin
├── gba_bios.bin
└── ...
⚠️ BIOS 파일은 합법적으로 자신의 콘솔에서 덤프해야 합니다.
고급 설정
컨트롤러 설정
웹 브라우저에서 게임패드를 연결하면 자동 인식됩니다.
지원 컨트롤러:
- Xbox 컨트롤러
- PlayStation DualShock/DualSense
- Nintendo Switch Pro 컨트롤러
- 일반 USB 게임패드
키보드 기본 매핑:
| 키 | 기능 |
|---|---|
| 방향키 | D-Pad |
| Z | B 버튼 |
| X | A 버튼 |
| A | Y 버튼 |
| S | X 버튼 |
| Enter | Start |
| Shift | Select |
| Q/W | L/R 숄더 |
세이브 스테이트
- 게임 중 메뉴에서 Save State/Load State 사용
- 브라우저 로컬 스토리지에 저장
- 여러 슬롯 지원
리와인드 (되감기)
일부 코어에서 게임 플레이를 되감을 수 있습니다. CPU 부하가 높아 저사양 시스템에서는 비활성화 권장.
쉐이더
CRT 스캔라인, LCD 효과 등 레트로 느낌을 살리는 그래픽 필터 적용 가능.
리버스 프록시 설정
Traefik 연동 (EmulatorJS)
services:
emulatorjs:
image: lscr.io/linuxserver/emulatorjs:latest
container_name: emulatorjs
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Seoul
volumes:
- ./config:/config
- ./data:/data
labels:
# 관리자 UI
- "traefik.enable=true"
- "traefik.http.routers.emulatorjs-admin.rule=Host(`games-admin.example.com`)"
- "traefik.http.routers.emulatorjs-admin.entrypoints=websecure"
- "traefik.http.routers.emulatorjs-admin.tls.certresolver=letsencrypt"
- "traefik.http.routers.emulatorjs-admin.service=emulatorjs-admin"
- "traefik.http.services.emulatorjs-admin.loadbalancer.server.port=3000"
# 게임 프론트엔드
- "traefik.http.routers.emulatorjs.rule=Host(`games.example.com`)"
- "traefik.http.routers.emulatorjs.entrypoints=websecure"
- "traefik.http.routers.emulatorjs.tls.certresolver=letsencrypt"
- "traefik.http.routers.emulatorjs.service=emulatorjs"
- "traefik.http.services.emulatorjs.loadbalancer.server.port=80"
networks:
- traefik-network
networks:
traefik-network:
external: true
Nginx 설정
server {
listen 443 ssl http2;
server_name games.example.com;
ssl_certificate /etc/letsencrypt/live/games.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/games.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
트러블슈팅
1. 게임이 로드되지 않음
# 컨테이너 로그 확인
docker logs emulatorjs
# ROM 파일 권한 확인
ls -la data/nes/roms/
# 파일 형식 확인 (올바른 확장자인지)
2. 컨트롤러가 인식되지 않음
- HTTPS 연결 필요 (HTTP에서는 Gamepad API 제한)
- 브라우저에서 게임패드 권한 허용
- 다른 브라우저 시도 (Chrome 권장)
3. 오디오가 나오지 않음
- 브라우저 자동재생 정책으로 인해 첫 클릭 후 소리 활성화
- 브라우저 오디오 권한 확인
4. 성능 문제
- N64, PS1 이상은 성능이 부족할 수 있음
- 최신 브라우저 사용 (Chrome, Edge)
- 쉐이더, 리와인드 비활성화
- 호스트 서버 사양 확인
5. 세이브가 사라짐
- 브라우저 데이터 삭제 시 세이브 손실
- EmulatorJS는 서버에 세이브 저장 옵션 있음
- 주기적으로 세이브 파일 백업
법적 고려사항
⚠️ 중요: 에뮬레이터 자체는 합법이지만, ROM 파일의 저작권은 별개입니다.
합법적인 ROM 획득 방법
- 자신이 소유한 게임 카트리지에서 덤프
- 홈브류 게임: itch.io 등에서 무료 공개된 레트로 스타일 게임
- 퍼블릭 도메인 게임: 저작권이 만료된 게임
- 공식 라이선스 재배포: 일부 개발사가 무료 공개한 게임
피해야 할 것
- ROM 다운로드 사이트에서 무단 다운로드
- 상업적 목적으로 ROM 배포
- 저작권이 있는 게임을 타인과 공유
마무리
RetroArch Web과 EmulatorJS는 레트로 게임 팬들에게 완벽한 셀프 호스팅 솔루션입니다. 브라우저만 있으면 어디서든 추억의 게임을 즐길 수 있고, 가족이나 친구와 함께 레트로 게임 아케이드를 공유할 수 있습니다.
추천 대상
- 레트로 게임을 좋아하는 분
- 홈랩에 게임 서버를 추가하고 싶은 분
- 가족/친구와 레트로 게임을 공유하고 싶은 분
- 스마트 TV, Xbox 등에서 레트로 게임을 하고 싶은 분
추천 설정
| 용도 | 추천 이미지 |
|---|---|
| 쉬운 설정 + 깔끔한 UI | EmulatorJS (linuxserver) |
| 순수 RetroArch 경험 | inglebard/retroarch-web |
| 데스크톱 RetroArch | linuxserver/retroarch |