mcman 개발기

2022년 12월 28일
제작기간 2022년 07월 02일 ~ 08월 02일
태그 go web Project
GitHub

mcman

mcman icon

소개

mcman은 ☕️Doppio lab에서 만든 마인크래프트 매니저다. 마인크래프트 서버 로그를 받고 입력하는 기능과 월드 맵 및 플레이어 위치를 열람하는 기능을 지원한다. 최근 업데이트로 서버 mods 폴더 안에 있는 모든 mod를 보여주고 다운로드할 수 있는 페이지를 제공한다. 유저가 열람할 수 있는 public page이며, 이 마인크래프트 서버에서 요구하는 mods를 소통 에러없이 편하게 공유할 수 있다.

요약하자면, 마인크래프트 서버 관리자가 쉽게 서버를 관리하게 도와주는 툴을 제공하는 토이 프로젝트다.

개발 동기

서버를 띄우기는 간단하지만 단점이 존재한다. 서버용 컴퓨터를 집에 두고 서버를 띄워두었다고 치자. 외부에서 서버 관리가 불가능하기 때문에 서버 관리가 필요한 경우, 컴퓨터가 있는 위치로 이동하지 않으면 안된다. 서로 접속 시간이 늘 비슷하면 별 문제가 되지 않지만 그렇지 않은 경우가 더 많았기 때문에 이 방식은 불편했다. OP를 자신의 계정에 주고 외부에서 마인크래프트에 접속하여 관리할 수 있지만 마찬가지로 불편함은 해소되지 않는다.

그런 이유로, 마인크래프트 명령어를 입력하는 등 서버 managing을 웹을 통해 하면 편하겠다는 생각이 들었다. 웹은 언제 어디서나 접속이 가능하니까! (홈서버면 도메인 주소로 입장이 힘들 수 있다. 이건 뒤에서…)

마크 서버

실행

Setting up a server_minecraft fandom에 자세한 설명이 있다. 대부분의 방식에 대한 가이드라인이 존재하기 때문에 이 페이지를 참고하면 어렵지 않게 마인크래프트 서버를 운영할 수 있을 것이다.

요약하자면… java command로 minecraft server용 jar를 실행하면 된다. 옵션관련은 위 링크를 참고.

Port forwarding

Local에서 할거면 굳이 port forwarding을 해줄 필요가 없다. 동일 네트워크에 접속하고 ip만 공유해주면 된다. 그러나 만약 외부에서 들어올 수 있게 하고 싶으면 (아마도 대부분의 경우) 이 과정이 필요하다.

Port forwarding은 내 기기를 인터넷 상에서 접속 가능하게 해주는 방법이다. 이건 OS마다 방식이 다르니까 자기 OS에 맞는 방법으로 하면 된다. 포트를 따로 지정하지 않았으면 default setting을 따르기 때문에 25565에 내 서버가 떴을 것이다. Server properties_minecraft fandom참고.

개발

서버는 Go, 클라이언트는 js를 사용했다.

mcman 구조

구조

서버는 마인크래프트 서버를 실행하고 마인크래프트 서버에서 발생하는 로그를 전달한다. 로그는 웹소켓, 웹훅을 통해서 전달되어 웹의 TTY나 슬랙, 디스코드 메세지로 출력된다. 반대로 마인크래프트 서버에 커맨드를 입력하고 싶다면 웹의 TTY를 이용하면 된다.

커맨드 입력

웹 TTY에서 커맨드를 입력하면 웹소켓을 통해 서버로 커맨드가 전달되고, minecraft의 stdin 파이프로 보낸다.

로그 출력

minecraft에서 stdout이나 stderr로 출력되는 로그는 logstream에 등록된 모든 callback을 통해 전달된다.

배포 과정

CI/CD 세팅

gitHub를 사용했기 때문에 gitHub workflows 관점에서 얘기한다. yml파일로 쉽게 CI/CD 세팅을 할 수 있다.
CI 단계에서는 go 프로젝트 빌드, lint, test, Docker Image 빌드 체크를 진행한다.
CD 단계에서는 Docker Image를 Build하고 Push한다.

사용법

Docker로 빌드할 수 있게 만들었다. 그 외 방식은 고려하지 않았다.

Docker

Container는 Container화된 어플리케이션이 각자 독립된 프로세스로 돌아가도록 하는 app 레이어의 추상적인 개념이다. VM과 다르게 OS를 공유하는 방식이고 부팅이 빠르며 용량이 작다. docker architecture

Docker로 빌드하여 만들어진 image는 Docker container를 생성하는데 필요하다. 다르게 말하면, Container는 Image의 실행가능한 인스턴스이다. Docker API나 CLI를 이용해서 Container를 관리/조작할 수 있다.

실행하기

mcman 배포 파일에서는 image를 pull하는 커맨드를 제공한다. 이를 이용한 실행 과정은 이렇다.

  1. pull 명령어를 통해 image를 내 local로 가져온다.
  2. config.yml 파일을 생성한다. README를 참고하자.
  3. EULA 허용한다. eula.txt에서 수정할 수 있다.
  4. docker run [image name]으로 지정한 image를 이용해 Container를 생성하고 실행한다.

docker에서는 Container의 포트와 Host의 포트를 바인딩하기 때문에 헷갈리지 않게 같게 설정하는 걸 추천한다. (이미 사용중인 포트가 아니면 이게 편하다.) 이제 Host ip 주소로 접속이 가능하다.

운영 과정

Home server setting

다른 서비스를 사용하지 않고 홈서버를 이용했다. 구조는 간단히 보면 다음과 같다.

홈서버

사용기

별 다른 번거로운 세팅 없이 웹 페이지 하나로 관리가 되니 편하다. whitelist 권한 요청이 들어온다거나 해도 mcman정도는 켜뒀다가 짬짬히 쉴 때 커맨드 한 줄 치면 되니 부담이 없다.