더보기

Git 기반 Minecraft 서버 맵 관리 시리즈

현재 종이상자는 하늘마을 프로젝트라는 이름의 Minecraft BE 도시맵 제작 프로젝트를 진행하면서 순차적으로 관련 환경을 Git 기반으로 이전하고 있습니다. 이 시리즈는 옮기는 과정에서 알게된 정보를 나누는 것을 목적으로 합니다.

2020.12.14 - 맵 파일 Git로 자동 업로드하기

2022.07.30 - 맵 파일 클라우드로 자동 업로드하기 - 현재 글

지난 2020년 12월, 맵 파일을 Git으로 자동 업로드하는 글을 통해 곧 클라우드로 자동 업로드하는 방법에 대해서도 업로드를 약속 드렸으나 예기치 못한 사정으로 1년 이상 지연되어 이제 글을 쓰게 되었습니다. 최대한 작년에 적용했던 방식을 되짚어 보여드릴 예정이나, 일부 오류 등이 있을 수 있습니다.

사용 환경  
OS Ubuntu Server 20.04 LTS
Server iwinv rCore.Q1 (1 rCore, 2GB RAM, 25GB SSD)
rclone 1.57.0
Minecraft 서버 BDS 1.18.1.02

소프트웨어 설치 확인하기

이번에 사용할 소프트웨어는 rclone입니다. 리눅스 공식 CLI 클라이언트를 제공하고 있는 멋진 클라우드 스토리지 제공 회사라면 더 좋겠지만, 범용성이 좋은 소프트웨어에서 지원하고 있다면 클라우드 제공 업체만 바꾸면 되기 때문에 이렇게 선택하게 되었습니다.

참고로 제가 사용한 클라우드 스토리지 서비스 업체는 Box로, GUI가 아닌 환경에서 rclone을 사용하기 위해서는 텍스트 기반의 웹 브라우저를 설치하여 진행하는 것을 추천합니다. 이는 인증 과정에서 클라우드 스토리지 제공사의 OAuth 인증 페이지로 이동을 시도하기 때문입니다. 저의 경우 Lynx 브라우저를 이용하였습니다.[각주:1]

⚠ 명령어를 보시기 전에 : 이 블로그에서 소개하는 명령어는 앞의 paperbox@paperbox:~$을 제외하고 입력하세요. 그 이유는 단순히 해당 부분이 명령어가 아니기 때문입니다. 실제 터미널을 열어보시면 사용자명@호스트명:~$로 표시되는 걸 아실 수 있을 겁니다.

paperbox@paperbox:~$ sudo apt install rclone

원격 저장소 설정하기

현재 rclone 웹사이트에서는 어떤 클라우드 스토리지를 제공하고 있는지 설명하고 있습니다. # 그리고 물론 Box 클라우드를 rclone에 연동하는 방법도 친절하게 설명하고 있습니다. 다른 클라우드 스토리지에 대한 설정 방법을 보시려면 rclone 웹 사이트에 들어가셔서 상단 메뉴에서 Storage Systems를 누르시고, 원하는 클라우드 스토리지 서비스를 선택하세요.

 

Overview of cloud storage systems

© Nick Craig-Wood 2014-2022 Source file overview.md last updated 2022-07-09 Website hosted on a MEMSET CLOUD VPS, uploaded with rclone and built with Hugo. Logo by @andy23.

rclone.org

 

Box

© Nick Craig-Wood 2014-2022 Source file box.md last updated 2022-07-09 Website hosted on a MEMSET CLOUD VPS, uploaded with rclone and built with Hugo. Logo by @andy23.

rclone.org

rclone에서 클라우드 스토리지를 설정하려면 먼저 아래 명령어를 입력해주세요.

paperbox@paperbox:~$ rclone config
No remotes found, make a new one?
n) new remote
s) Set configuration password
q) quit config
n/s/q>

그러면 위와 같이 뜨는데 이때 n이 new remote이므로 키보드의 n을 입력하고 엔터 키를 눌러주세요. 이때 remote란 '원격'의 의미가 있으므로 rclone의 remote란 원격 저장소를 뜻하는 말로 이해하시면 됩니다.

name>

n을 누르고 나면 name을 묻는데 기억하기 쉽고, 되도록 짧고 간결한 이름으로 설정하는 편이 좋습니다. 앞으로 관련해서 스토리지에 업로드할 때 해당 이름을 사용하기 때문에 입력의 번거로움을 줄이는데 도움이 되기 때문입니다.

저의 경우 Box 클라우드 계정을 이것 하나만 사용할 예정이어서 'box'로 지정했습니다.

엔터를 눌러 설정하면 지원하는 클라우드 스토리지 목록이 뜰텐데, 원하는 클라우드 스토리지 저장소가 선택될 때까지 방향키를 눌러 위아래로 움직입니다. 엔터를 눌러 결정하시면 그 다음부터는 필요한 절차를 그대로 따라가시면 됩니다.

아래 내용부터는 Box 클라우드에 맞춰 기술되어 있어, 클라우드 스토리지에 따라 내용이 상이합니다.

Box App Client Id - leave blank normally.
client_id>
Box App Client Secret - leave blank normally.
client_secret>
Box App config.json location
Leave blank normally.
Enter a string value. Press Enter for the default ("").
box_config_file>
Box App Primary Access Token
Leave blank normally.
Enter a string value. Press Enter for the default ("").
access_token>

위 내용은 모두 빈 칸으로 놔두고 엔터만 누르시면 됩니다.

Enter a string value. Press Enter for the default ("user").
Choose a number from below, or type in your own value
 1 / Rclone should act on behalf of a user
   \ "user"
 2 / Rclone should act on behalf of a service account
   \ "enterprise"
box_sub_type>

일반 사용자처럼 동작할지, 웹 서비스 계정처럼 동작할지 물어보는 칸인데 일반적인 경우 사용자처럼 동작하도록 설정하여도 충분합니다. 아무런 값도 입력하지 않고 엔터를 누르면 사용자처럼 동작하도록 설정됩니다.

Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n>

자동 설정 페이지로 본래 원격 설정인 경우에는 n을 누르는 것이 맞지만, 편리하게 설정하기 위해서는 y를 선택해주세요. 다만, 그 전에 같은 기기로 연결되는 SSH 세션을 하나 더 열어주세요. 만약 SSH를 이용한 원격 설정이지만 Lynx나 w3m 등 텍스트 기반 브라우저를 설치할 예정이 없다면 n을 눌러 설정해주세요.

If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...

이런 메시지가 뜰 것입니다. 이때 다른 세션으로 이동하셔서 다음 명령어를 입력해주세요. 단, Lynx가 설치되어 있다는 가정 하에 설명한 것으로 GUI 환경에서 작업 중이시면 자동으로 사용하고 계시던 웹 브라우저가 뜰 것입니다.

paperbox@paperbox:~$ lynx http://127.0.0.1:53682/auth

이 링크로 들어가게 되면 Box의 OAuth 인증 페이지로 이동하게 됩니다. 아무래도 터미널 환경이다보니 익숙하지 않으실텐데 방향키로 입력란이나 링크를 이동하시면 되고, 입력란은 한 번 엔터 후 입력하시면 됩니다. 한국어 환경에서는 로그인 오류가 발생하기도 하는데, 이 경우 브라우저 창을 닫지 않고 해당 상황에서 다시 로그인할 수 있는 링크로 되돌아가서 로그인하면 해결됩니다. 다만 localhost이므로 서버 외부에서 해당 주소로 접속을 시도할 경우 당연히 안 됩니다.

코드를 무사히 받으면 Client ID와 Secret, 토큰을 받아올텐데 이때 y를 눌러 원격 저장소를 저장하시면 준비가 끝납니다.

Invalid refresh token?

rclone에서 제공하는 Box 설정 문서를 보시면 Invalid refresh token 항목이 있을텐데, 이는 Box 클라우드의 정책상 60일간 사용하지 않으면 유효하지 않은 토큰이 되어 더는 한 번 설정한 내용으로 이용이 불가하기 때문입니다. 다시말해 앞으로 설명할 자동 업로드를 설정해두면 자동 업로드가 모종의 사유로 진행되지 않는 것이 아닌 한 오류가 발생할 일은 거의 없습니다.

업로드 준비하기

Git에 비하면 절차가 상당히 간단한 편이나, 안정적인 업로드를 위해 매 업로드마다 기존 파일을 삭제한 후에 올릴 것, 그리고 서버를 종료한 후에 파일을 복사 및 재부팅할 것을 권장드립니다. 실제 이번에 프로젝트의 파일을 관리하면서 클라우드에 정상적으로 업로드되어 있을 것으로 추정되었던 맵 파일이 알 수 없는 이유로 파손되어 서버를 안전하게 종료할 당시 노트북에 개인적으로 보관한 파일을 이용하여 계속하는 방법 외에는 없었던 적이 있습니다.

다만 Box의 경우 같은 이름을 가진 파일이 업로드되면 뒤에 (1), (2)...등이 붙거나 업로드 오류를 일으키지 않고 버전 관리의 영역으로 인식한다는 점을 이용해서 저는 맵 파일 폴더 산하의 db 폴더만 삭제하는 것으로 작업 부하를 최소화하고자 했습니다.

<BDS 서버 폴더 구조 - 계정의 home 폴더(/home/계정명/)에 위치한다고 가정>
 - \behavior_packs
 - \definitions
 - \structures
 - \resource_packs
 - \worlds
 - bedrock_server
 - bedrock_server_how_to.html
 - libCrypto.so
 - permissions.json
 - release-notes.txt
 - server.properties
 - whitelist.json
 
<worlds 폴더가 없다면>
paperbox@paperbox:~$ mkdir worlds
 
<worlds 폴더 안으로 진입>
paperbox@paperbox:~$ cd worlds

서버를 한 번 이상 실행하였거나 서버 구동을 위해 기존 맵을 미리 옮겨둔 경우에, worlds 폴더 안에 다른 폴더가 하다 더 있을 것입니다. 이때 알아야 할 것은 두 가지입니다.

  • 앞서 rclone에서 클라우드 저장소를 설정할 때 지정한 이름
  • 해당 클라우드 저장소에서 파일을 저장할 위치

rclone에서 파일을 삭제하는 명령어는 다음과 같습니다.

paperbox@paperbox:~$ rclone delete 저장소이름:경로

예를 들어 이 글에서 저장소 이름을 box로 설정하였고, 저는 Haneulcity 아래, nightly 폴더 아래, db 폴더만 삭제하였으므로 아래과 같이 됩니다.

paperbox@paperbox:~$ rclone delete box:Haneulcity/nightly/db

이때 폴더와 하위 폴더를 구분할 때는 "/"(슬래시)를 사용합니다.

반대로 rclone에서 파일을 업로드하는 명령어는 다음과 같습니다.

paperbox@paperbox:~$ rclone copy 복사할파일경로 저장소이름:경로

예를 들어, 현재 폴더에 있는 내용을 Haneulcity 폴더 아래, nightly 아래에 복사하고 싶으면 다음과 같이 하면 됩니다.

paperbox@paperbox:~$ rclone copy ./ box:Haneulcity/nightly

즉, 별도의 원격 저장소 이름 및 콜론(:)이 없으면 현재 해당 작업을 수행하는 기기의 저장소를 가리키는 것으로 인식하고 원격 저장소로 복사 작업을 수행하는 것입니다. 따라서 반대로 내려받고 싶으면 위 명령어의 copy 이후 부분을 맞바꿔주면 됩니다.

 

자동화를 위한 스크립트 작성

autoGitBackup.sh
0.00MB

업로드한 쉘 스크립트의 내용은 아래와 같습니다.

#!/bin/bash
cd 맵파일소재폴더
echo "Arrived"
rclone delete box:Box클라우드내폴더/db
echo "Preparing for copying fresh files"
rclone copy ./ box:Box클라우드내폴더/db
echo "All Copied"

 

이렇게 하는 이유는 서버 내 어디에 autoGitBackup.sh이 위치해도 정상적으로 작업을 할 수 있도록 하기 위함입니다. 사용하고 계신 환경에 맞춰 적당히 수정해주시면 되며, Box 클라우드를 사용하지 않는 경우에도 수정하여 일부 적용하실 수 있을 것입니다.

crontab으로 작업 주기 설정하기

주기 설정을 위해서는 간단히 크론 탭으로 설정해주면 됩니다. 아래 명령어를 입력합니다.

paperbox@paperbox:~$ crontab -e

여기서 -e는 편집하겠다는 의미입니다. 기본 편집기에 따라 vi가 나타날 수도 있고, nano가 나타날 수도 있습니다. 아마 처음이라면 어떤 편집기를 사용할지 물어볼 것입니다. 개인적으로는 vi가 단축키를 외워야 하는 등 어려움이 있기 때문에 nano를 사용하시는 것을 추천합니다.

그러면 곧 편집기가 나타나며 현재 설정된 crontab 작업이 보일 것입니다. 한 줄에 하나의 작업을 입력하는 것이며, 기본 구조는 아래와 같이 띄어쓰기로 구분합니다.

분 시 일 월 요일 명령어

가령 저 같은 경우 매일 오후 11시 30분에 autoGitBackup.sh를 실행하도록 설정하였습니다. 계정명은 paperbox, 스크립트 파일은 계정의 홈 폴더에 있다고 가정했을 때 아래와 같이 작성하게 됩니다.

30 23 * * * /home/paperbox/autoGitBackup.sh

다만 서버 시간대가 한국 시간대(KST)이므로 Git 시스템에 기록되는 시간과는 차이가 날 수 있습니다. 이 점 감안하여 설정하시기를 권장드립니다.

마무리

이제 crontab까지 설정하셨다면 저장소에 제대로 업로드되었는지 확인하는 절차만이 남았습니다. 다만 설정하시는 과정에서 패키지가 없다는 등의 오류가 발생할 수 있는데 주로 crontab과 텍스트 에디터인 nano가 설치되어 있지 않아서 그럴 수 있습니다. 원하시는 경우, 혹은 더 손에 익은 상황이신 경우 굳이 nano를 설치하지 않고 vim을 쓰셔도 됩니다.

paperbox@paperbox:~$ sudo apt install cron
paperbox@paperbox:~$ sudo apt install nano

설정이 잘 되었다면 아래와 같이 주기적으로 일정한 시각에 올라가는 모습을 보실 수 있습니다. 다만, 모종의 설정 오류로 하루에 두 번씩 올라가는 문제가 있었던 것 같네요. 이 부분은 Git 기반으로 사용할 때 쓴 crontab과 당시 crontab이 다른 설정 값이어서 현재 제가 어떻게 잘못 설정하였는지는 짐작은 되나 확인하기는 어렵습니다. 다만, Git 쪽이 오류가 없었던 것은 확실하므로 cron 작업 예약은 당시 기준으로 설명하였습니다.

 

본 내용은 Minecraft Bedrock Edition(Windows 10, Android, iOS, Nintendo Switch, Xbox One 등)을 기준으로 하며, BDS라고 불리는 Mojang 공식 서버 구동기를 제외하고 다른 서버 구동기와는 내용이 호환되지 않을 수 있습니다.
궁금하신 점이나 저작권, 정책 상 문제가 있는 부분이 있다면 주저 마시고 댓글 및 트위터 멘션/DM @paperbox_update로 연락 주시면 최대한 빠른 시일 내에 처리하겠습니다. 감사합니다 XD

 

  1. 원하시는 경우 아래 명령어 부분에서 rclone 대신 lynx라고 입력하여 그대로 설치하실 수 있습니다. 혹은 같이 설치하시려면, rclone 옆에 띄어쓰기를 하나 주셔서 나란히 입력하면 됩니다. [본문으로]