RetroArch Web – 브라우저에서 즐기는 레트로 게임 에뮬레이터 Docker 설치 가이드




개요

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은 다양한 레트로 게임 시스템을 지원합니다.

닌텐도 계열

시스템추천 코어설명
NESNestopia, Mesen8비트 패미컴
SNESSnes9x, bsnes16비트 슈퍼패미컴
Game BoyGambatteGB/GBC
Game Boy AdvancemGBAGBA
Nintendo 64Mupen64PlusN64
Nintendo DSmelonDSNDS

세가 계열

시스템추천 코어설명
Master SystemGenesis Plus GX8비트
Genesis/Mega DriveGenesis Plus GX16비트 메가드라이브
Sega CDGenesis Plus GXCD-ROM 확장
Game GearGenesis Plus GX휴대용
SaturnBeetle Saturn32비트
DreamcastFlycast128비트

기타 시스템

시스템추천 코어설명
PlayStationBeetle PSXPS1
PlayStation 2PCSX2PS2 (고사양 필요)
PSPPPSSPP휴대용
ArcadeFinalBurn Neo, MAME아케이드 게임
Neo GeoFinalBurn NeoSNK 아케이드
Atari 2600Stella클래식
DOSDOSBoxPC 게임

유사 도구 비교

항목RetroArch WebEmulatorJS개별 에뮬레이터클라우드 게이밍
설치DockerDocker각각 설치불필요
지원 시스템200+40+1개씩제한적
UIRetroArch 스타일모던/깔끔각각 다름서비스별
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 사용 시 (추천)

  1. 관리자 UI (http://서버IP:3000) 접속
  2. 시스템별 폴더에 ROM 파일 업로드
  3. 자동으로 게임 인식 및 아트워크 다운로드
  4. 프론트엔드 (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 파일필수 여부
PlayStationscph1001.bin필수
Sega CDbios_CD_U.bin필수
Saturnsaturn_bios.bin필수
Dreamcastdc_boot.bin, dc_flash.bin필수
GBAgba_bios.bin권장
DSbios7.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
ZB 버튼
XA 버튼
AY 버튼
SX 버튼
EnterStart
ShiftSelect
Q/WL/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 획득 방법

  1. 자신이 소유한 게임 카트리지에서 덤프
  2. 홈브류 게임: itch.io 등에서 무료 공개된 레트로 스타일 게임
  3. 퍼블릭 도메인 게임: 저작권이 만료된 게임
  4. 공식 라이선스 재배포: 일부 개발사가 무료 공개한 게임

피해야 할 것

  • ROM 다운로드 사이트에서 무단 다운로드
  • 상업적 목적으로 ROM 배포
  • 저작권이 있는 게임을 타인과 공유

마무리

RetroArch Web과 EmulatorJS는 레트로 게임 팬들에게 완벽한 셀프 호스팅 솔루션입니다. 브라우저만 있으면 어디서든 추억의 게임을 즐길 수 있고, 가족이나 친구와 함께 레트로 게임 아케이드를 공유할 수 있습니다.

추천 대상

  • 레트로 게임을 좋아하는 분
  • 홈랩에 게임 서버를 추가하고 싶은 분
  • 가족/친구와 레트로 게임을 공유하고 싶은 분
  • 스마트 TV, Xbox 등에서 레트로 게임을 하고 싶은 분

추천 설정

용도추천 이미지
쉬운 설정 + 깔끔한 UIEmulatorJS (linuxserver)
순수 RetroArch 경험inglebard/retroarch-web
데스크톱 RetroArchlinuxserver/retroarch

참고 자료




댓글 남기기