콘텐츠로 이동

멀티플레이어 서버

En Parlant~ 멀티플레이어 릴레이는 Axum과 socketioxide를 사용하여 Rust로 작성된 경량 WebSocket 서버입니다. Socket.IO를 통해 두 플레이어를 연결하여 실시간 체스를 가능하게 하며, 영구 저장소 없이 최소한의 리소스만 필요합니다.

릴레이 서버 소스 코드는 en-parlant-relay 저장소에 있습니다.

기본 릴레이 서버는 별도 설정 없이 바로 작동하지만, 자체 서버를 운영해야 할 좋은 이유들이 있습니다:

  • 프라이버시 — 모든 게임 트래픽이 자체 인프라 내에서 유지됩니다
  • 낮은 지연 시간 — 플레이어와 가까운 곳에 배포하여 더 빠른 수 전송이 가능합니다
  • 독립성 — 기본 릴레이의 가동 시간이나 가용성에 의존하지 않습니다

릴레이 저장소에 fly.toml 설정 파일이 포함되어 있어 Fly.io가 가장 쉬운 배포 경로입니다. Fly.io의 무료 티어는 개인 사용에 적합합니다.

  1. Fly CLI를 설치합니다:

    Terminal window
    curl -L https://fly.io/install.sh | sh
  2. 가입하거나 로그인합니다:

    Terminal window
    fly auth signup
    # or
    fly auth login
  3. 릴레이를 클론하고 배포합니다:

    Terminal window
    git clone https://github.com/DarrellThomas/en-parlant-relay.git
    cd en-parlant-relay
    fly launch
    fly deploy

Fly.io가 Rust 바이너리를 빌드하고 배포한 후 your-app-name.fly.dev와 같은 공개 URL을 제공합니다.

Rust 툴체인이 설치된 모든 머신에서 릴레이를 소스로부터 빌드하여 실행할 수 있습니다.

  1. 클론 및 빌드:

    Terminal window
    git clone https://github.com/DarrellThomas/en-parlant-relay.git
    cd en-parlant-relay
    cargo build --release
  2. 서버 실행:

    Terminal window
    ./target/release/en-parlant-relay

    서버는 기본적으로 포트 3210에서 수신 대기합니다.

  3. 프로덕션 환경에서는 TLS 종료를 처리하기 위해 리버스 프록시(nginx, Caddy 또는 유사 도구) 뒤에서 실행하십시오. 릴레이 자체는 일반 WebSocket을 사용하며, 프록시가 wss:// 암호화 계층을 추가합니다.

서버는 매우 경량입니다. 메모리에 게임 방을 유지하고 두 플레이어 간에 수를 전달하며, 그 외에는 아무것도 하지 않습니다. 소형 VPS나 Raspberry Pi에서도 충분히 운영할 수 있습니다.

릴레이가 실행되면 En Parlant~에서 해당 서버를 지정합니다:

  1. En Parlant~에서 Settings를 엽니다
  2. 멀티플레이어 릴레이 서버 URL 설정을 찾습니다
  3. 서버의 WebSocket 엔드포인트를 입력합니다:
    • Fly.io의 경우: wss://your-app-name.fly.dev
    • TLS 프록시가 있는 자체 호스팅의 경우: wss://relay.yourdomain.com
    • 로컬 개발의 경우: ws://localhost:3210

이것으로 완료입니다. 앱이 모든 멀티플레이어 게임에 해당 릴레이를 사용합니다.

릴레이 작동 방식에 대해 알아두어야 할 몇 가지 사항입니다:

  • 방 코드 — 서버는 혼동 없는 문자 집합을 사용하여 6자리 게임 코드를 생성합니다. 유사하게 보이는 문자는 제외됩니다(0/O, 1/I/L 없음). 이는 코드를 구두로 공유할 때 혼동을 방지하기 위함입니다.

  • 방 정리 — 30분 동안 활동이 없으면 방이 자동으로 제거됩니다. 60초마다 정리 작업이 실행되어 유휴 방을 정리합니다.

  • 영구 저장소 없음 — 모든 상태는 메모리에 존재합니다. 서버가 재시작되면 활성 방은 사라집니다. 이는 의도된 설계입니다 — 릴레이는 무상태이며 간단하게 교체할 수 있습니다.

  • 최소 리소스 — 서버는 CPU와 메모리를 매우 적게 사용합니다. 한 플레이어로부터 Socket.IO 이벤트를 수신하여 다른 플레이어에게 전달하기만 합니다. 게임 로직, 수 검증, 데이터베이스가 없습니다.