마인크래프트 서버 직접 만들기 2탄 - Fabric 모드 서버와 Docker 운영
작성일 2026-07-21 · SameOS Tools
1탄에서 순정 서버를 열었으니, 이번엔 모드를 올리고 운영을 자동화할 차례입니다. 제 서버는 모드를 실행해 주는 로더로 Fabric을 쓰고, 서버 전체를 Docker 컨테이너로 감싸 돌리고 있습니다. 이렇게 바꾸면서 얻은 것은 두 가지입니다 - 자바를 호스트에 깔지 않아도 되고(컨테이너가 들고 옴), 크래시·재부팅 후 자동 복구가 팰월드·새티스팩토리와 같은 방식으로 통일됩니다. 대신 파일 소유권이라는 함정이 하나 생기는데, 그것까지 포함해 실제 쓰는 구성 그대로 정리했습니다.
Fabric 설치 - 서버용 실행 파일을 만듭니다
Fabric은 설치기(installer)를 한 번 실행해 서버용 실행 파일(fabric-server-launch.jar)을 만드는 방식입니다. 이후에는 server.jar 대신 이 파일을 실행하면 mods 폴더의 모드들이 함께 로드됩니다. 거의 모든 Fabric 모드가 요구하는 기반 모드인 Fabric API도 mods 폴더에 넣어 두세요. 모드는 반드시 게임 버전과 정확히 맞는 것을 받아야 합니다 - 버전이 하나만 어긋나도 서버가 켜지다 맙니다. 1탄에서 서버 버전을 최신이 아닌 26.1.2로 잡은 이유가 바로 이것입니다 - 쓰려는 모드가 지원하는 버전이 서버 버전을 결정합니다.
cd ~/minecraft
# 1) Fabric 설치기 받아서 서버용으로 실행 (게임 버전은 서버와 같게)
curl -LO https://maven.fabricmc.net/net/fabricmc/fabric-installer/1.0.1/fabric-installer-1.0.1.jar
java -jar fabric-installer-1.0.1.jar server -mcversion 26.1.2 -downloadMinecraft
# 2) 기반 모드 Fabric API 를 mods 폴더에 (fabricmc.net → use 페이지에서 버전 맞춰 받기)
mkdir -p mods
# 받은 파일 예: fabric-api-0.154.2+26.1.2.jar → mods/ 에 넣기
# 3) 이제 실행 파일이 바뀝니다 - server.jar 대신:
java -Xms2G -Xmx6G -jar fabric-server-launch.jar nogui
# 모드가 늘면 메모리도 함께 - 순정 4G 기준에서 6G 로 올렸습니다
Docker로 옮기기 - 소유권 함정 하나만 조심하면 됩니다
서버 폴더를 통째로 컨테이너에 물리고, 자바가 든 공식 이미지(eclipse-temurin)로 실행합니다. 여기서 함정이 소유권입니다. Docker는 기본적으로 root(관리자) 권한으로 파일을 만들기 때문에, 컨테이너가 만든 월드·설정 파일을 내 계정에서 수정하려면 매번 막힙니다. user 항목으로 내 계정 번호(보통 1000)를 지정하면 컨테이너가 처음부터 내 소유로 파일을 만들어 이 문제가 사라집니다. 종료 대기 90초는 새티스팩토리 글에서 데인 것과 같은 이유입니다 - 월드 저장이 끝나기 전에 잘리면 진행이 날아갑니다.
# compose.yaml
services:
minecraft:
image: eclipse-temurin:25-jre # 자바 25 포함 이미지 - 호스트에 자바 불필요
container_name: minecraft
# 내 계정 번호로 실행 - 컨테이너가 만든 파일을 내가 계속 다룰 수 있게
# (내 번호 확인: id -u)
user: "1000:1000"
restart: unless-stopped
stop_grace_period: 90s # 월드 저장이 끝날 때까지 기다렸다 종료
working_dir: /server
command: ["java", "-Xms2G", "-Xmx6G", "-jar", "fabric-server-launch.jar", "nogui"]
stdin_open: true # 콘솔 명령을 넣을 수 있게
tty: true
volumes:
- ./:/server # 서버 폴더 전체를 그대로 사용
ports:
- "25565:25565/tcp" # 게임 접속 - 이것만 외부 공개
# RCON(25575)은 절대 밖에 노출하지 말 것 - 비밀번호 하나로 op 권한까지
# 넘어갑니다. 관리 도구가 필요하면 도커 내부망으로만 접근하게 하세요.
# 켜기: docker compose up -d
# 로그: docker compose logs -f
# 콘솔 명령 넣기: docker attach minecraft (빠져나올 땐 Ctrl-p Ctrl-q)
월드 자동 백업 - 서버를 끄지 않고 안전하게
마인크래프트는 켜진 상태에서 월드 파일을 계속 고쳐 쓰기 때문에, 그냥 복사하면 반쯤 쓰다 만 파일이 섞인 백업이 나올 수 있습니다. 정석은 백업 직전에 저장을 잠깐 멈추는 것입니다 - 콘솔 명령 save-off(저장 중지)와 save-all(지금까지 것 모두 기록) 후 복사하고, 끝나면 save-on으로 되돌립니다. 콘솔에 명령을 넣는 통로로는 위 compose의 stdin을 쓰거나 RCON을 쓰는데, 아래 스크립트는 도커 콘솔 방식이라 추가 설정이 없습니다. cron에 걸어 두면 매일 알아서 쌓입니다.
#!/bin/bash
# minecraft-backup.sh - 월드 백업 (매일 새벽 cron 권장)
set -eu
SERVER_DIR=~/minecraft
DEST=~/minecraft-backups
KEEP_DAYS=14
mkdir -p "$DEST"
cd "$SERVER_DIR"
console() { docker exec minecraft sh -c "echo '$1' > /proc/1/fd/0" 2>/dev/null || true; }
console "save-off" # 저장 잠시 중지 - 복사 중 파일이 바뀌지 않게
console "save-all flush" # 지금까지 진행을 디스크에 전부 기록
sleep 5
tar -czf "$DEST/world-$(date +%Y%m%d-%H%M).tar.gz" world
console "save-on" # 저장 재개
# 14일 지난 백업 정리
find "$DEST" -name 'world-*.tar.gz' -mtime +$KEEP_DAYS -delete
echo "백업 완료: $(ls -t "$DEST" | head -1)"
# cron 등록 예 (매일 04:30):
# 30 4 * * * /home/내계정/minecraft-backup.sh >> /home/내계정/minecraft-backup.log 2>&1
몇 가지 운영 팁
모드를 넣고 빼면 반드시 재시작해야 하고, 접속하는 사람들도 같은 모드 구성을 맞춰야 합니다(서버 전용 모드는 예외 - 최적화 계열은 서버에만 넣어도 됩니다). 월드가 커질수록 메모리 사용이 늘어나므로 max-players와 view-distance를 함께 관리하세요. 큰 모드를 올리기 전에는 위 백업 스크립트를 한 번 수동 실행해 복구 지점을 만들어 두는 습관이 사고를 줄여 줍니다 - 모드가 월드를 한번 바꿔 놓으면 되돌리는 방법은 백업뿐입니다.
마무리
이제 마인크래프트도 팰월드·새티스팩토리와 같은 방식으로 돌아갑니다 - Docker 아래에서 크래시·재부팅에 스스로 복구되고, 백업은 cron이 알아서 합니다. 게임은 셋 다 다르지만 서버 운영의 뼈대는 결국 같다는 것이 이 시리즈를 쓰며 확인한 결론입니다: 정확한 버전 맞추기, 저장할 시간을 주는 종료, 관리 포트 비노출, 그리고 자동 백업입니다.