SameOS ~/tools/game-server-backup-restore-drill.md

게임 서버 백업은 파일 개수가 아니라 복구 성공으로 검증한다

작성·공식 문서 확인일 2026-08-29 · SameOS operator

매일 tar 파일이 생긴다고 백업이 완성된 것은 아닙니다. 저장 중간에 복사된 월드, 빠진 설정 파일, 같은 디스크에만 있는 압축 파일은 사고 뒤에 처음 풀어 보고서야 쓸 수 없다는 사실을 알게 됩니다. 이 글은 운영 서버를 덮지 않고 별도 디렉터리와 다른 포트에서 Minecraft, Palworld, Satisfactory 저장본을 복구해 보는 훈련 절차입니다.

먼저 복구 목표를 숫자로 정하기

RPO는 사고 때 얼마 전까지의 진행을 잃어도 되는지, RTO는 몇 분 안에 다시 접속 가능해야 하는지를 뜻합니다. 친구 서버라면 예를 들어 RPO 1시간, RTO 60분처럼 현실적인 값을 정할 수 있습니다. 이 숫자가 있어야 백업 간격과 보관 세대, 복구 연습 빈도를 결정할 수 있습니다.

백업 성공 기준도 “명령 종료 코드 0”이 아니라 압축 해제, 핵심 파일 존재, 서버 기동, 다른 포트 접속, 월드·플레이어 확인까지로 둡니다. 자동 백업 로그에는 시작 시각, 게임 버전, 원본 크기, 압축 크기와 SHA-256만 남기고 비밀번호나 토큰은 기록하지 않습니다.

쓰기를 멈춘 일관된 스냅샷 만들기

가장 보수적인 방법은 게임 안 저장 명령을 실행한 뒤 정상 종료하고 파일을 복사하는 것입니다. 무중단 백업이 꼭 필요하면 게임이 제공하는 저장 일시정지 기능이나 파일시스템 스냅샷을 사용해야 하지만, 기능을 확인하지 않고 실행 중 디렉터리를 rsync하는 것은 안전한 스냅샷이라고 부를 수 없습니다.

Minecraft는 save-all flush 후 저장을 멈추거나 서버를 정상 종료합니다. Palworld는 REST API나 관리자 명령으로 저장한 뒤 종료하고 Pal/Saved 전체를 보관합니다. 공식 설정의 bIsUseBackupSaveData를 켜면 여러 시점의 내부 백업도 생기지만, 그 폴더까지 포함한 외부 복사본은 별도로 필요합니다. Satisfactory 역시 정상 종료 후 SaveGames와 필요한 설정을 함께 보관합니다.

# 예: 서버를 정상 종료한 뒤 각 데이터 루트를 통째로 보관
# 경로는 설치 방식마다 다르므로 실행 전 반드시 실제 볼륨 위치 확인

sudo systemctl stop minecraft
sudo tar -C /srv/minecraft -czf /srv/game-backups/minecraft-$(date +%F-%H%M).tar.gz data
sudo systemctl start minecraft

# Palworld 공식/SteamCMD 설치의 핵심은 Pal/Saved 전체
sudo systemctl stop palworld
sudo tar -C /srv/palworld -czf /srv/game-backups/palworld-$(date +%F-%H%M).tar.gz Pal/Saved
sudo systemctl start palworld

예제 경로는 설명용입니다. 기존 서버의 실제 볼륨을 추측해 실행하지 말고 systemd WorkingDirectory 또는 Docker의 Mounts를 먼저 확인하세요.

아카이브 자체를 먼저 검사

복구일에는 가장 최신 파일이 아니라 검증을 통과한 가장 최신 파일을 고릅니다. tar 목록을 읽을 수 있는지, 압축 끝까지 오류가 없는지, SHA-256이 복사 전후 같은지 확인합니다. 백업이 원본과 같은 디스크에 있다면 다른 장치나 원격 저장소로 복사한 뒤 양쪽 체크섬을 비교합니다.

파일 이름만으로 게임과 버전을 추측하지 않도록 백업 옆에 작은 manifest를 둡니다. 서버 빌드, 생성 시각, 월드 이름, 정상 종료 여부, 데이터 루트와 체크섬을 적되 관리자 비밀번호, 공인 IP, 플레이어 식별자는 넣지 않습니다.

cd /srv/game-backups
gzip -t minecraft-YYYY-MM-DD-HHMM.tar.gz
tar -tzf minecraft-YYYY-MM-DD-HHMM.tar.gz | sed -n '1,30p'
sha256sum minecraft-YYYY-MM-DD-HHMM.tar.gz \
  > minecraft-YYYY-MM-DD-HHMM.tar.gz.sha256
sha256sum -c minecraft-YYYY-MM-DD-HHMM.tar.gz.sha256

# 최소 파일이 실제로 포함됐는지 확인
tar -tzf minecraft-YYYY-MM-DD-HHMM.tar.gz | grep -E \
  'level.dat|server.properties|whitelist.json|ops.json'

운영 폴더가 아닌 격리 디렉터리에 복구

복구 훈련의 가장 중요한 규칙은 운영 데이터 위에 풀지 않는 것입니다. 날짜가 붙은 빈 디렉터리를 만들고 일반 사용자 권한으로 압축을 풉니다. 절대 경로, 상위 디렉터리 이동 항목과 예상하지 못한 소유권이 없는지 확인한 뒤에만 테스트 서버에 연결합니다.

테스트 서버는 운영 포트와 겹치지 않게 하고 127.0.0.1 또는 격리된 LAN에만 바인딩합니다. 공개 목록, 웹 관리 API와 RCON은 끈 상태로 시작합니다. 월드가 변환되거나 업그레이드될 수 있으므로 운영 서버와 정확히 같은 게임 빌드로 먼저 열고, 업그레이드 검증은 복사본을 하나 더 만든 뒤 별도로 합니다.

sudo install -d -o gameserver -g gameserver \
  /srv/restore-drills/minecraft-YYYY-MM-DD
sudo -u gameserver tar -xzf \
  /srv/game-backups/minecraft-YYYY-MM-DD-HHMM.tar.gz \
  -C /srv/restore-drills/minecraft-YYYY-MM-DD

# 파일 목록과 용량을 원본 백업 기록과 비교
find /srv/restore-drills/minecraft-YYYY-MM-DD -type f | wc -l
du -sh /srv/restore-drills/minecraft-YYYY-MM-DD

# 테스트 설정은 운영과 다른 포트, 로컬 바인딩, 공개 목록 끔
# 실제 설정 키는 게임마다 다르므로 복사본에서만 수정

게임별로 무엇을 눈으로 확인할까

Minecraft는 level.dat가 읽히는지, Nether와 End 차원이 있는지, 화이트리스트와 운영자 목록이 필요한 상태로 돌아왔는지 확인합니다. 서버가 기동돼도 새 빈 월드를 연 것일 수 있으므로 콘솔의 월드 이름과 게임 안 좌표·건축물을 확인해야 합니다.

Palworld는 Level.sav뿐 아니라 Players 디렉터리와 LevelMeta.sav, 월드 설정이 함께 있는지 봅니다. 캐릭터가 새로 생성되거나 길드·팰박스가 비어 있으면 부분 복구로 판단합니다. Satisfactory는 선택한 세션과 최근 자동 저장을 불러오고, 공장 위치, 플레이 시간과 전력망이 예상 시점인지 확인합니다.

복구 기록을 다음 백업 개선으로 연결

훈련을 마치면 실제 걸린 시간과 막힌 지점을 기록합니다. 압축 해제보다 게임 버전 찾기에 시간이 더 들었다면 설치 바이너리나 이미지 태그를 manifest에 추가하고, permissions 파일이 빠졌다면 백업 대상을 넓힙니다. 실패를 숨기지 않고 다음 자동 백업 검증 항목으로 바꾸는 것이 목적입니다.

테스트에 사용한 백업에는 월드와 플레이어 정보가 들어 있으므로 웹 루트나 공개 다운로드 폴더에 두지 않습니다. 공개 글에는 가짜 경로와 가린 로그만 쓰고, 실제 서버 주소·토큰·쿠키·플레이어 ID는 별도 비공개 기록으로 보관합니다.

검증 범위와 공식 참고자료

Minecraft 공식 서버 안내, Palworld 1.0.3 공식 백업 설정, Satisfactory 공식 저장 경로 문서를 기준으로 포함 대상을 교차 확인했습니다. 예제는 운영 데이터에 접근하지 않는 일반 경로만 사용했으며 실제 SameOS 서버의 월드·계정·토큰은 읽거나 공개하지 않았습니다.

SameOS 작성·번역·검수 원칙 보기

팰월드 안전 종료와 자동 백업 Minecraft Docker 자동 백업 Satisfactory 리눅스 서버