주의: 본 가이드는 편의상 Github나 Gitlab을 기준으로 하였으나, 되도록이면 자체적으로 구축한 git 서비스를 이용하시기를 권장합니다. 이는 Git 호스팅 서비스를 이러한 방식으로 사용하는 것이 어뷰징으로 간주될 수 있을 뿐더러, 제공 조건도 백업에는 적합하지 않기 때문입니다. 따라서 실제 맵 백업 용도로는 더욱 적합한 클라우드로 자동 업로드하는 법을 포스팅할 예정이므로 필요하신 분은 참고하시기 바랍니다.
더보기

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

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

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

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

2020년 7월, 더 쾌적한 환경에서 도시 맵을 만들기 위해 저는 서버로 Minecraft 맵을 옮겼습니다. 그러나 직접 파일을 옮긴 후 버튼 몇 번만 눌러주면 끝이었던 예전과 달리, Github나 클라우드에 올리기는 쉽지 않았습니다. 그래서 리눅스용 git과 cron을 통해 주기적으로 올려주는 방식을 쓰기로 했습니다. 원래 Git는 백업 도구로서는 부적합하나, 본래의 목적이 배포에 더 가깝기 때문에 큰 문제가 없다고 판단하여 업로드하게 되었습니다.[각주:1]

사용 환경  
OS Ubuntu Server 20.04 LTS
Server Microsoft Azure B1s VPS
git 2.25.1
Minecraft 서버 BDS 1.16.100 / BDS 1.16.200 #

소프트웨어 설치 확인하기

먼저 Git을 사용하기 위한 준비가 완료되어 있어야 합니다. 특히, Ubuntu Minimal 등 패키지가 최소한으로만 설치된 리눅스를 사용 중이신 경우에는 git이 설치되어 있는지 먼저 확인하세요.

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

paperbox@paperbox:~$ sudo apt install git

그러면 일반적으로는 아래와 같이 메시지가 출력될 것입니다.

Reading package lists... Done
Building dependency tree
Reading state information... Done
git is already the newest version (1:2.25.1-1ubuntu3).
git set to manually installed.

여기서 the newest version 뒤의 숫자는 크게 신경쓰실 부분이 아닙니다. 설령 다르다고 하더라도 방법이 바뀌지는 않습니다. 따라서 어쨌든 git is already installed나 already the newest version 같이 이미 설치되었음을 암시하는 문구가 출력되면 된 것입니다.

사용자 설정하기

그 다음으로 해 줄 것은 git 사용자 설정입니다. git으로 기록을 남길 때, 누가 - 언제 - 무엇을 변경했는지에 대한 기록은 필요하기 때문입니다. 단순 사용자명만을 기록하는 것이 아니라, 이메일 주소도 기록합니다. 이 중 무엇을 변경했는지에 대한 사항은 매번 기록할 때마다 변하기 때문에 초기에 설정하지 않습니다. 쉽게 말해서, 이 git 도구를 사용하는 사람이 누구인지를 저장하는 과정인 것입니다.

paperbox@paperbox:~$ git config --global user.email "이메일 주소"
paperbox@paperbox:~$ git config --global user.name "이름"

이메일 주소는 git 기록 관리에 사용할 주소로 입력합니다. 이번 경우에는 Github를 통해서 기록을 관리하고 있기 때문에, Github 계정의 이메일 주소를 입력해야 하겠네요. 이름은 Github 사용자명과 달라도 괜찮습니다. 참고로 이메일 주소와 이름은 큰 따옴표 안에 넣어야 합니다. 가령, aaa@example.com이라는 이메일 주소를 paperbox라는 이름으로 사용하고자 한다면 아래와 같이 입력해야 하는 셈입니다.

paperbox@paperbox:~$ git config --global user.email "aaa@example.com"
paperbox@paperbox:~$ git config --global user.name "paperbox"

레포지터리 복제 작업 준비하기

그 다음 시도할 것은 레포지터리의 내용을 복제해오는 것입니다. 만약 이전에도 저와 같이 맵의 전체 파일을 Github에 변경사항이 발생할 때마다 올리고 계셨다면 마지막으로 Git 클라이언트로 commit, push 작업을 모두 마치신 후에 진행하시기를 권장드립니다. 또한, 복제 작업을 수행하면 레포지터리 명으로 폴더가 생성되고 그 안에 컨텐츠가 저장되므로 기존 레포지터리 구조가 폴더 - Minecraft 맵 컨텐츠 구조였던 경우에는 아래와 같이 수정해주실 필요가 있습니다.

<기존>
[맵 폴더 명]
- level.dat
- \db
- levelname.txt
- world_icon.jpg

<바꾼 형태>
- level.dat
- \db
- levelname.txt
- world_icon.jpg

아직 맵을 업로드할 레포지터리를 생성하지 않은 경우에는 인터넷 검색을 통해 Git 레포지터리 생성 방법을 숙지하시고 진행하시기 바랍니다. 이는 레포지터리 없이는 진행할 수 없기 때문입니다. 만약 이미 생성은 되어 있는데 아무 내용도 담겨있지 않거나 완전히 최신 상태라면 이제 복제를 수행할 차례입니다.

단, 이 명령어는 Vannilla Server (a.k.a BDS, Bedrock Dedicated Server) 기준으로 bedrock_server 바이너리가 있는 폴더(앞으로는 BDS 루트 폴더라고 부르겠습니다.)의 하위 폴더 중 하나인 worlds 폴더까지 진입하신 후 진행하셔야 합니다.

<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

<git clone>
paperbox@paperbox:~/worlds$ git clone (레포지터리 주소)

이때 만약 레포지터리 주소가 https://pbdiary.pw/paperbox/mcbe 라면 다음과 같이 입력할 수 있습니다. [각주:2]

paperbox@paperbox:~/worlds$ git clone https://pbdiary.pw/paperbox/mcbe

명령어 입력 후 해야 할 절차가 있습니다. 바로 한차례 add, commit 및 push를 해주는 작업입니다.

paperbox@paperbox:~$ git add *
paperbox@paperbox:~$ git commit -m "Test Build"
paperbox@paperbox:~$ git push origin master:master

새로 만드는 경우 Git 서비스의 정책에 따라 주 branch(Main Branch)가 master가 아닌 main인 경우가 있습니다. 이 경우에는 master:master가 아닌 main:main으로 바꿔주시면 됩니다. 이는 추후 작업할 쉘 스크립트에서도 마찬가지입니다.

그리고 commit 할 때 "Test Build 부분은 원하시는 문구로 바꾸셔도 상관 없습니다.

가장 중요한 것은 push 작업 때 비밀번호를 물어볼 것입니다.이때는 레포지터리가 어떻게 설정되어 있느냐에 따라서 다른데요, 구체적으로는 git 서버 혹은 계정에 2단계 인증이 설정되어 있는가와 아닌가에 따라서 갈립니다.

2단계 인증이 설정되어 있지 않다면

계정 비밀번호를 입력하고 엔터를 누릅니다. 별 일이 없다면 알아서 레포지터리의 내용을 받아 복사를 진행할 것입니다. 빈 레포지터리라면 git 클라이언트가 자동으로 생성한 폴더 안으로 진입한 후 기존 맵 파일을 업로드하는 과정도 필요합니다.

2단계 인증이 설정되어 있다면

Github라면 아래와 같이 합니다.

더보기

오른쪽 상단 계정 아이콘 클릭 > Settings > Developer Settings > Personal Access Tokens 선택

Personal Access Tokens 화면

여기서 Generate new token 버튼을 눌러주면, 비밀번호를 묻는 창이 나타날 것입니다. 비밀번호를 입력한 후 엔터를 치면 아래와 같은 화면이 나타납니다.

여기서 Note에는 토큰 구분을 위한 이름을 적어주고, repo 항목에 체크한 후 하단의 Generate Token 버튼을 눌러줍니다.

그러면 토큰이 나올텐데 복사하여 비밀번호를 묻는 창에 붙여 넣습니다. 토큰은 화면을 벗어나면 다시 볼 수 없으므로 새로고침 등의 이유로 벗어났다면 생성된 토큰을 삭제하고 새로 생성하시는 것을 권장드립니다.

Gitlab은 아래와 같이 합니다.

더보기

오른쪽 상단 프로필 사진 클릭 > 설정 > 액세스 토큰을 선택합니다.

Github와 유사하게 이름에는 다른 토큰과 구분지을 이름을 짓고, read_repository와 write_repository 항목에 체크한 후 'Create personal access token' 버튼을 누릅니다. Expires at은 만료 날짜를 지정하는 것이므로 일정 시기 이후 서버 운영을 그만 둘 예정이라면 모를까 그 시기가 정해지지 않았다면 지정하지 않아도 됩니다.

마찬가지로 생성된 토큰은 처음 한 번만 볼 수 있으므로 비밀번호를 묻는 창에 복사하여 붙여넣어 줍니다.

비밀번호 입력이 마무리되면 Git이 알아서 레포지터리의 내용을 모두 복제할 것입니다. 다만, 이때 서버를 바로 열어도 되는 것은 아닙니다. 아래와 같이 서버가 레포지터리 안의 맵을 서버 맵으로 사용하도록 설정이 필요합니다.

<server.properties를 편집할 편집기 실행: 여기서는 가장 간단한 nano 사용>
paperbox@paperbox:~$ nano server.properties

<server.properties에서 수정할 내용>
level-name=레포지터리명

이때 server.properties는 worlds 폴더가 아닌 밖에 있습니다. (BDS 루트 폴더에 존재합니다.) 서버 설정에 관련된 것이므로 처음 구동하는 것이라면 필요한 내용도 같이 수정하시기를 권장드립니다.

Git 백업을 위한 스크립트 작성

autoGitBackup.sh
0.00MB

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

#!/bin/bash
DATE=`date +%Y%m%d`
cd 레포지터리가 담긴 폴더
git add *
git commit -m "(담고자 하는 commit 메시지 - 예시: $DATE)"
git push origin master:master

여기서 눈여겨 보아야 할 부분은 '레포지터리가 담긴 폴더'와 '(담고자 하는 commit 메시지 - 예시: $DATE)" 부분입니다. 레포지터리가 담긴 폴더란 (BDS 루트 폴더)/worlds/레포지터리명/을 말합니다. 가령, paperbox 계정의 Home 폴더가 BDS 루트 폴더이고 레포지터리명이 mcbe라면 아래와 같은 내용이 될 것입니다.

paperbox@paperbox:~$ cd /home/paperbox/worlds/mcbe

이렇게 하는 이유는 서버 내 어디에 autoGitBackup.sh이 위치해도 정상적으로 작업을 할 수 있도록 하기 위함입니다. 먼저 Git 레포지터리가 설정된 공간에 이동한 후 git 작업을 하는 것이라고 이해하시면 되겠습니다.

그리고 (담고자 하는 commit 메시지 - 예시: $DATE) 부분은 말 그대로 commit을 할 때 남길 메시지를 말합니다. Git를 써 오신 분이라면 commit 할 때 항상 메시지를 적어 오셨을 것입니다. 어떤 변경사항이 있을지를 기록하는 자리인데, 저는 매일 일간 빌드 형태로 배포하고 있으므로 변수 DATE를 만들어 사용[각주:3]하였습니다.

그 외 git add *은 해당 폴더 내 모든 파일을 기록하겠다는 의미이며 git push origin master:master는 git clone했던 주소[각주:4]로 변경사항을 전송한다는 뜻입니다. 앞서 git commit을 통해 git add한 파일들을 메시지와 함께 기록했으므로 그 내용을 보내는 것이 되겠지요. 다만 한 가지 주의하셔야 할 점이 있다면 생성하실 때 주 브랜치를 main으로 설정하셨다면 master:master가 아닌 main:main으로 바꿔주셔야 한다는 것입니다.

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까지 설정하셨다면 Git 서버에서 잘 연동이 되었는지 확인하는 절차만이 남았습니다. crontab에 지정해둔 시간 이후에 git 서버 혹은 git 서비스에 접속하여 잘 올라왔는지 확인하시면 됩니다. 제대로 올라가지 않았다면 다음 사항을 고려해 볼 수 있습니다.

  • 클론 이후 git add, commit, push 작업을 건너뛰지는 않으셨나요?
  • 첫 push 작업에서 비밀번호를 저장하지 않는 설정을 하지는 않으셨나요?

이 두 가지가 주요 원인일 것이고, 만약 중간에 git, nano나 cron이 없다면 이를 설치하여 해결하실 수 있습니다. 보통은 Ubuntu Minimal 버전으로 진행하시는 경우 없을 수 있는 패키지입니다.

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

설정이 잘 되었다면 아래와 같이 주기적으로 올라가는 모습을 보실 수 있습니다.

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

 

  1. 다만, 장기적으로는 파일 크기가 늘어나고 네트워크 트래픽에도 무리를 줄 수 있으므로 추후 클라우드 스토리지로 이전 후 특정 빌드만 Github에 변경사항과 같이 옮기는 방식으로 변화를 줄 예정입니다. [본문으로]
  2. 실존하는 주소는 아니며, 이해를 돕기 위해 임의로 만든 주소입니다. 예를 들어 github라면 https://github.com/계정명/레포지터리명 으로 표시될 것입니다. [본문으로]
  3. 여기서 변수 정의는 스크립트 2번째 줄에 있으며, 사용은 $DATE와 같은 방식으로 합니다. 변수 DATE에서 date는 현재 서버 시간을, +%Y%m%d는 시간의 표현 방식을 나타내는 것으로 %Y%m%d는 년월일 식으로 표현하겠다는 의미입니다. [본문으로]
  4. git clone시에는 origin이 clone한 주소로 설정됩니다. [본문으로]