7 Days to Die V3.1 전용 서버 만들기 - 리눅스 Docker로 열기
작성일 2026-08-12 · SameOS Tools
7 Days to Die(세븐 데이즈 투 다이) V3.1 전용 서버를 집 리눅스 컴퓨터에 Docker Compose로 여는 방법입니다. 설치와 친구 접속만 적으면 짧게 끝나지만, 지금은 예전 글을 그대로 따라 하면 난이도·경험치·블러드 문 설정이 먹지 않는 경우가 있습니다. V3.0에서 여러 설정이 하나의 SandboxCode로 합쳐졌고, V3.1에서 그 코드의 적·동물 밀도와 재생성 항목이 다시 바뀌었기 때문입니다. 그래서 이 글은 설치보다 설정을 잃지 않는 운영까지 한 흐름으로 정리합니다.
먼저 확인할 것 - 현재 안정판은 V3.1입니다
2026년 8월 12일 기준 안정판은 V3.1.0 b14이고, 제작사는 전용 서버와 게임 클라이언트 모두 Default Public Version을 선택하라고 안내했습니다. 여기서는 LinuxGSM을 품은 커뮤니티 관리 이미지 vinanrra/7dtd-server v0.9.3을 사용합니다. 게임 파일은 SteamCMD의 stable 브랜치에서 따로 받으므로 Docker 이미지 버전과 게임 버전은 서로 다른 숫자입니다. 이 이미지는 x86-64(AMD64)용이며, 라즈베리 파이 같은 ARM 장비용 구성은 아닙니다.
준비물 - 4코어, 메모리 16GB 권장
스팀의 게임 사양표는 2.8GHz 4코어·메모리 8GB를 최소, 12GB를 권장으로 적지만 클라이언트 기준이 함께 섞인 값입니다. 전용 서버 공식 지원 문서는 메모리 16GB를 권장합니다. 현재 리눅스 서버 파일만 약 16GB라서 스팀 표의 저장 공간 15GB도 빠듯합니다. 최소 40GB, 백업을 오래 남기려면 80GB 정도를 잡는 편이 안전합니다. 아래에서 현재 계정을 docker 그룹에 넣는데, 이 그룹은 사실상 root와 같은 권한을 주므로 신뢰하는 서버 계정에만 적용하세요. id 두 줄의 결과가 1000이 아니라면 compose 파일의 PUID와 PGID도 같은 숫자로 바꿉니다.
# 1) 다운로드 도구와 이 글에서 사용할 편집기 설치 (우분투·데비안)
sudo apt-get update
sudo apt-get install -y curl ca-certificates nano
# 2) Docker 공식 설치 스크립트 받기
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 3) Docker와 Compose가 모두 설치됐는지 확인
docker --version
docker compose version
# 4) 현재 계정의 사용자·기본 그룹 번호 확인
id -u
id -g
# 5) 현재 계정에서 sudo 없이 Docker 실행 (docker 그룹은 root급 권한)
sudo usermod -aG docker "$USER"
newgrp docker
docker run --rm hello-world
# 6) 서버 작업 폴더 만들기
mkdir -p ~/7dtd && cd ~/7dtd
mkdir -p data lgsm serverfiles logs backups
compose.yaml - 게임 포트만 밖으로 열기
아래 파일은 서버 본체, 월드, LinuxGSM 설정, 로그, 백업을 각각 호스트 폴더에 남깁니다. 컨테이너를 새로 만들어도 이 다섯 폴더는 사라지지 않습니다. 원본 이미지 예제에는 선택 사항인 WebAdmin·Telnet 포트 8080~8082도 있지만, 관리 암호를 정하기 전에 인터넷에 노출할 이유가 없어 여기서는 뺐습니다. START_MODE는 평소 1(실행)이고 패치할 때만 3(업데이트 후 실행)을 넣습니다. 콘솔을 따라가는 Docker 로그가 디스크를 끝없이 쓰지 않도록 20MB짜리 5개로 순환시킵니다.
# ~/7dtd/compose.yaml
services:
7dtdserver:
image: vinanrra/7dtd-server:v0.9.3
container_name: 7dtdserver
restart: unless-stopped
stop_grace_period: 2m # 정상 저장·종료를 기다리는 시간
logging:
driver: local # Docker 로그 무한 증가 방지
options:
max-size: "20m"
max-file: "5"
environment:
LINUXGSM_VERSION: v25.2.0
START_MODE: "${START_MODE:-1}" # 평소 1, 업데이트할 때만 3
VERSION: stable # Default Public Version
PUID: "1000" # 위 id -u 결과로 교체
PGID: "1000" # 위 id -g 결과로 교체
TimeZone: Asia/Seoul # 한국 외 지역은 현지 IANA 시간대로 교체
BACKUP: "YES" # 매일 예약 백업
BACKUP_HOUR: "5" # 서버 시간 오전 5시
BACKUP_MAX: "7" # 7일이 지난 백업 삭제
MONITOR: "YES" # 프로세스가 죽으면 LinuxGSM이 복구
UPDATE_MODS: "NO"
volumes:
- ./data:/home/sdtdserver/.local/share/7DaysToDie
- ./lgsm:/home/sdtdserver/lgsm/config-lgsm/sdtdserver
- ./serverfiles:/home/sdtdserver/serverfiles
- ./logs:/home/sdtdserver/log
- ./backups:/home/sdtdserver/lgsm/backup
ports:
- "26900:26900/tcp" # 기본 게임 포트 TCP
- "26900:26900/udp" # 기본 게임 포트 UDP
- "26901:26901/udp" # 게임 연결용 추가 UDP
- "26902:26902/udp" # 게임 연결용 추가 UDP
- "26903:26903/udp" # 현재 공식 지원 문서의 호환 권장 UDP
ulimits:
nofile:
soft: 10240
hard: 10240
첫 실행 - 설치 완료와 설정 파일 확인
첫 실행은 컨테이너 안에 게임을 넣는 것이 아니라 ./serverfiles에 서버 파일을 내려받는 과정부터 시작하므로 바로 접속되지 않습니다. 로그가 계속 흘러도 오류로 단정하지 말고 LinuxGSM 상태가 ONLINE이 될 때까지 기다리세요. 첫 설치가 끝나면 실제 설정 파일은 호스트의 ./serverfiles/sdtdserver.xml에 생깁니다. 다른 경로의 serverconfig.xml을 고치면 이 구성에는 반영되지 않습니다. 이 이미지의 컨테이너 기본 사용자는 root지만 LinuxGSM 관리 명령은 root 실행을 거부하므로, 아래처럼 exec에는 반드시 --user sdtdserver를 붙입니다.
# YAML 문법과 최종 설정 먼저 검사
docker compose config
# 백그라운드에서 첫 설치와 서버 시작
docker compose up -d
# 설치 로그 보기 (Ctrl+C는 로그 보기만 끝내며 서버는 계속 실행)
docker compose logs -f --tail=150
# 설치 뒤 LinuxGSM이 보고하는 버전·상태·포트 확인
docker compose exec --user sdtdserver 7dtdserver ./sdtdserver details
# 이 파일이 생겨야 다음 단계로 이동
ls -l ./serverfiles/sdtdserver.xml
sdtdserver.xml - 전체를 덮지 말고 필요한 값만 바꾸기
서버를 먼저 정상 종료한 뒤 생성된 XML에서 아래 속성의 value만 찾고 바꿉니다. 코드 조각 전체를 새 파일로 저장하면 나머지 필수 설정이 빠지므로 안 됩니다. 서버 이름·설명에 &, <, "를 넣을 때는 각각 &, <, "처럼 XML 이스케이프가 필요합니다. ServerPassword는 실제 긴 비밀번호로 교체하고, 서버가 한국 밖에 있다면 Region도 실제 지역으로 바꾸세요. GameWorld와 GameName은 저장 경로를 정하므로 첫 플레이 전에 확정해야 합니다. 운영 중 바꾸면 기존 월드가 삭제된 것이 아니라 다른 새 세이브로 열려 초기화처럼 보입니다. 콘솔 크로스플레이 서버라면 아래처럼 최대 인원 8명, 크로스플레이와 EAC를 켜고 비공식 모드는 빼는 구성이 기준입니다.
# 설정을 고치기 전 서버를 정상 종료하고 원본 복사
docker compose stop
cp -a ./serverfiles/sdtdserver.xml ./serverfiles/sdtdserver.xml.before-v31
# 아래 이름을 검색한 뒤 편집기에서 기존 줄의 value만 교체
grep -nE 'ServerName|ServerDescription|ServerPassword|ServerVisibility|ServerDisabledNetworkProtocols|ServerMaxPlayerCount|ServerAllowCrossplay|EACEnabled|IgnoreEOSSanctions|Region|Language|ServerPort|GameWorld|GameName' \
./serverfiles/sdtdserver.xml
nano ./serverfiles/sdtdserver.xml
<!-- 같은 이름의 기존 줄을 아래 값처럼 수정합니다. 파일 전체를 덮지 않습니다. -->
<property name="ServerName" value="SameOS V3.1 생존 서버"/>
<property name="ServerDescription" value="친구들과 운영하는 전용 서버"/>
<property name="ServerPassword" value="CHANGE_ME_LONG_PASSWORD"/>
<property name="ServerVisibility" value="2"/>
<property name="ServerDisabledNetworkProtocols" value="SteamNetworking"/>
<property name="ServerMaxPlayerCount" value="8"/>
<property name="ServerAllowCrossplay" value="true"/>
<property name="EACEnabled" value="true"/>
<property name="IgnoreEOSSanctions" value="false"/>
<!-- 한국 밖에서 운영한다면 Europe, NorthAmericaEast 등 실제 지역으로 교체 -->
<property name="Region" value="Asia"/>
<property name="Language" value="Korean"/>
<property name="ServerPort" value="26900"/>
<property name="GameWorld" value="Navezgane"/>
<property name="GameName" value="sameos-v31"/>
# 편집을 마치면 다시 시작하고 설정 오류 확인
docker compose up -d
docker compose logs --tail=100 7dtdserver
V3.1 핵심 - SandboxCode를 새로 만들고 검증하기
V3.0부터 GameDifficulty, XPMultiplier, DayNightLength, BloodMoonFrequency, LootAbundance 같은 예전 XML 속성 수십 개는 개별 설정이 아니라 SandboxCode 하나에 들어갑니다. 기존 V2.6 월드를 이어 간다면 게임의 새 게임 화면 → Sandbox Options에서 예전 규칙을 다시 맞추고 Copy Code로 복사한 뒤 XML에 붙여야 합니다. 더 중요한 점은 V3.1에서 적·동물의 밀도와 재생성 속도가 낮·밤으로 나뉘어 V3.0 사용자 코드가 무효가 될 수 있다는 것입니다. 제작사는 잘못된 코드가 일부 또는 전부를 기본값으로 되돌릴 수 있다고 경고했으므로, V3.1 클라이언트에서 코드를 다시 만드는 것이 안전합니다. 콘솔 크로스플레이를 켰다면 콘솔에서 허용하지 않는 사용자 규칙도 있으므로 재시작 로그의 Sandbox 경고를 보고 실제 콘솔 접속까지 시험하세요.
# 실행 중인 서버를 먼저 정상 종료한 뒤 코드 줄을 편집기로 열기
docker compose stop
grep -n 'SandboxCode' ./serverfiles/sdtdserver.xml
nano ./serverfiles/sdtdserver.xml
<!-- YOUR_V3_1_SANDBOX_CODE를 V3.1 게임에서 복사한 실제 코드로 교체 -->
<property name="SandboxCode" value="YOUR_V3_1_SANDBOX_CODE"/>
# 저장 뒤 서버 시작
docker compose up -d
# 실제 적용값 확인을 위해 LinuxGSM 콘솔 열기
docker compose exec --user sdtdserver 7dtdserver ./sdtdserver console
# 콘솔 안에서 입력
getsandboxoptions
# 짧은 명령도 동일: gso
# 서버를 끄지 않고 콘솔만 빠져나오기: Ctrl+B를 누른 뒤 D
# Ctrl+C는 서버를 종료할 수 있으므로 누르지 않습니다.
친구 접속 - 방화벽과 공유기에 같은 프로토콜 열기
서버 컴퓨터 방화벽과 공유기 두 곳을 모두 통과해야 합니다. UFW에서는 26900 TCP와 26900~26903 UDP를 열고, 공유기에서도 같은 범위를 서버의 고정된 내부 IP로 전달합니다. 26903 UDP는 현재 주 용도가 없지만 공식 지원 문서는 접속 호환을 위해 함께 열기를 권합니다. 먼저 같은 집에서 내부 IP:26900으로 접속한 뒤, 휴대전화 테더링 같은 외부망에서 공인 IP:26900을 시험하면 문제 구간을 빨리 나눌 수 있습니다. 공유기 WAN 주소와 아래 공인 IP가 다르면 통신사 CGNAT나 이중 공유기일 수 있어 일반 포트포워딩만으로는 열리지 않습니다.
# 서버 컴퓨터의 내부 IP 확인
hostname -I
# UFW 방화벽 - TCP 하나, UDP 네 개
sudo ufw allow 26900/tcp comment '7DTD 게임 TCP'
sudo ufw allow 26900:26903/udp comment '7DTD 게임 UDP'
sudo ufw status
# 인터넷에서 보이는 공인 IPv4 확인
curl -4 https://ifconfig.me ; echo
# Docker가 실제로 공개한 포트 확인
docker compose port 7dtdserver 26900
docker compose ps
# 공유기 포트포워딩도 동일하게 설정
# 26900 TCP -> 서버 내부 IP
# 26900~26903 UDP -> 서버 내부 IP
안전 종료와 백업 - kill은 쓰지 않기
이 이미지의 시작 스크립트는 Docker의 SIGTERM을 받으면 LinuxGSM의 정상 종료 명령을 호출합니다. 그래서 위 구성의 docker compose stop은 최대 2분 동안 저장·종료를 기다리지만, docker kill은 그 절차를 건너뛰므로 쓰지 마세요. BACKUP=YES는 매일 지정 시각에 서버를 잠깐 멈추고 월드 폴더를 tar.gz로 묶은 뒤 다시 시작합니다. BACKUP_MAX=7은 7개가 아니라 7일보다 오래된 파일을 지운다는 뜻입니다. 접속자가 없는 시간으로 BACKUP_HOUR를 잡고, XML 설정도 별도로 복사해 두는 편이 안전합니다. 아래 restore-test는 압축이 실제로 풀리는지만 확인하는 격리 연습이며, 운영 월드 복원 때는 서버를 끄고 현재 data를 다른 이름으로 보존한 뒤 교체해야 합니다.
# 사람이 직접 백업 - 서버가 잠시 멈췄다가 자동으로 다시 켜집니다.
docker compose exec --user sdtdserver 7dtdserver ./scripts/server_backup.sh
# 월드 백업과 XML 설정 백업 확인
ls -lh ./backups
cp -a ./serverfiles/sdtdserver.xml \
"./backups/sdtdserver.xml-$(date +%Y%m%d-%H%M%S)"
# 실제 압축이 풀리는지 매번 새 임시 폴더에서 복구 연습
# YYYY-MM-DD-HHMMSS 부분은 방금 생성된 실제 파일명으로 교체합니다.
restore_dir=$(mktemp -d ./restore-test.XXXXXX)
tar -xzf ./backups/sdtdserver-YYYY-MM-DD-HHMMSS.tar.gz \
-C "$restore_dir" --strip-components=5
find "$restore_dir" -type f | head
# 평소 정상 종료·시작
docker compose stop
docker compose up -d
패치 날 업데이트 - 백업과 stable 브랜치 확인부터
Docker 이미지 갱신과 영구 폴더 안 게임 파일 갱신은 별개입니다. 이 구성은 커뮤니티 이미지를 고정하고, 패치 때만 START_MODE=3으로 SteamCMD stable 브랜치를 갱신합니다. 업데이트 직전에는 서버를 먼저 완전히 끄고 호스트에서 월드·XML·모드·compose를 한 묶음으로 백업합니다. 그래야 예약 백업 스크립트가 서버를 다시 켠 직후 곧바로 끄는 경합도 없습니다. 압축 검사가 성공한 뒤에만 업데이트하고, LinuxGSM details의 버전과 게임 클라이언트의 Default Public Version을 확인하세요. 마지막 명령은 평상시 START_MODE=1로 되돌립니다.
cd ~/7dtd
# 1) 서버를 먼저 끄고 일관된 오프라인 백업 생성
docker compose stop
backup_file="./backups/pre-update-$(date +%Y%m%d-%H%M%S).tar.gz"
tar -czf "$backup_file" ./data ./lgsm \
./serverfiles/sdtdserver.xml ./serverfiles/Mods ./compose.yaml
tar -tzf "$backup_file" >/dev/null
echo "백업 검사 완료: $backup_file"
# 2) 위 두 tar 명령에 오류가 없을 때만 stable 게임 파일 업데이트·시작
START_MODE=3 docker compose up -d --force-recreate
docker compose logs -f --tail=150
# 3) 로그 확인을 끝낸 뒤(Ctrl+C) 버전·상태 확인
docker compose exec --user sdtdserver 7dtdserver ./sdtdserver details
# 4) 평상시 실행 모드 1로 되돌려 한 번 더 정상 기동
docker compose up -d --force-recreate
docker compose exec --user sdtdserver 7dtdserver ./sdtdserver details
접속이 안 될 때 빠른 점검
- 게임과 서버의 브랜치가 모두
Default Public Version인지 먼저 봅니다. V3.1 서버에 다른 빌드의 클라이언트는 들어갈 수 없습니다. ./sdtdserver details가 ONLINE인지 확인합니다. 첫 월드 생성 중에는 컨테이너가 실행 중이어도 아직 접속할 수 없습니다.- 고친 파일이
./serverfiles/sdtdserver.xml인지 확인합니다. 다른 경로의serverconfig.xml은 이 이미지가 읽지 않습니다. - V3.0에서 복사해 둔 사용자
SandboxCode라면 V3.1 화면에서 다시 만들고gso로 적용값을 확인합니다. - 26900 TCP와 26900~26903 UDP의 방화벽·공유기 대상 IP를 다시 봅니다. 서버 내부 IP가 DHCP로 바뀌면 기존 포트포워딩은 엉뚱한 컴퓨터를 가리킵니다.
- 공유기 WAN 주소와 공인 IP가 다르면 CGNAT·이중 공유기를 의심합니다. 이때는 통신사 공인 IP, 상위 공유기 설정, 또는 별도 터널이 필요할 수 있습니다.
- 8080~8082 관리 포트는 접속 문제 해결용 게임 포트가 아닙니다. 암호·접근 제한 없이 인터넷에 열지 않습니다.
자주 묻는 질문
7 Days to Die V3.1 서버가 목록에 안 뜨는 이유는 무엇인가요?
서버가 아직 첫 월드를 만드는 중이거나, 서버와 클라이언트 브랜치가 다르거나, 26900 TCP 및 26900~26903 UDP가 방화벽·공유기에서 막힌 경우가 많습니다. 먼저 내부 IP로 접속하고 LinuxGSM details가 ONLINE인지 확인하세요.
V3.0에서 쓰던 SandboxCode를 V3.1에서도 쓸 수 있나요?
그대로 유효할 수도 있지만 V3.1은 적·동물 밀도와 재생성 옵션을 낮·밤으로 분리했습니다. 공식 안내처럼 기존 사용자 코드를 V3.1 화면에서 다시 만들고 getsandboxoptions로 적용값을 확인하는 편이 안전합니다.
7 Days to Die 전용 서버는 어떤 포트를 열어야 하나요?
26900 TCP와 26900~26903 UDP를 서버 방화벽과 공유기 포트포워딩 양쪽에 같은 프로토콜로 여세요. 26903 UDP는 현재 주 용도가 없지만 공식 지원 문서가 호환을 위해 권장합니다.
docker compose stop으로 월드가 안전하게 저장되나요?
이 글에서 사용한 vinanrra/7dtd-server 이미지는 SIGTERM을 LinuxGSM 정상 종료로 전달합니다. stop_grace_period를 2분으로 두고 docker compose stop을 쓰며, 정상 종료 절차를 건너뛰는 docker kill은 피하세요.
서버와 게임 버전이 다르다는 오류는 어떻게 해결하나요?
게임 클라이언트와 전용 서버를 모두 Default Public Version으로 맞춘 뒤, 백업하고 START_MODE=3으로 stable 서버 파일을 업데이트하세요. 업데이트 후 LinuxGSM details에서 버전과 ONLINE 상태를 확인합니다.