Project Zomboid Build 42 Linux 전용 서버 구축과 업데이트
작성·공식 문서 확인일 2026-08-29 · SameOS operator
Project Zomboid 서버는 실행 파일보다 사용자 홈의 Zomboid 데이터 디렉터리가 더 중요합니다. 첫 실행이 설정과 관리자 계정을 만들고, 서버 이름이 여러 설정·DB·저장 경로를 묶으며, Build 41과 42 월드는 함부로 섞으면 안 됩니다. 이 글은 SteamCMD 전용 서버 앱 380870을 별도 계정으로 설치하고 절대 cachedir로 데이터를 분리하는 절차입니다.
브랜치와 빌드 문자열부터 기록
2026년 Build 42 계열에서도 클라이언트와 서버는 정확한 빌드가 맞아야 합니다. stable, unstable, legacy41 같은 브랜치를 오갈 때는 같은 데이터 디렉터리를 바로 열지 말고 브랜치별 복사본을 둡니다. 새 빌드가 월드를 변환하면 이전 빌드가 다시 읽지 못할 수 있습니다.
아래 명령은 기본 stable 브랜치를 설치합니다. 베타 옵션을 복사해 넣기 전에 현재 공식 공지의 정확한 브랜치 이름을 확인하세요. 설치와 데이터는 /srv/zomboid/server와 /srv/zomboid/data로 분리합니다.
sudo apt update
sudo apt install -y steamcmd
sudo useradd --system --create-home --home-dir /srv/zomboid \
--shell /bin/bash zomboid
sudo install -d -o zomboid -g zomboid /srv/zomboid/server /srv/zomboid/data
sudo -u zomboid steamcmd \
+force_install_dir /srv/zomboid/server \
+login anonymous +app_update 380870 validate +quit
첫 실행은 터미널에서 한 번
첫 기동은 관리자 계정 암호를 묻고 friends.ini 같은 기본 설정을 생성하므로 systemd에 바로 넣지 않습니다. -servername 값은 파일 접두사와 저장 식별자가 되므로 공백 없는 짧은 이름을 정하고 계속 유지합니다. -cachedir에는 상대경로가 아니라 절대경로를 사용합니다.
최근 Build 42 Linux 문제 중 상대 cachedir 때문에 기동이 끝나는 사례가 확인됐습니다. 절대경로는 systemd의 작업 디렉터리가 달라져도 같은 데이터를 가리키며, 여러 서버를 운영할 때도 각 인스턴스를 명확히 분리합니다.
cd /srv/zomboid/server
sudo -u zomboid ./start-server.sh \
-servername friends \
-cachedir=/srv/zomboid/data
# 첫 기동과 관리자 암호 생성이 끝나면 콘솔에서 정상 종료
save
quit
find /srv/zomboid/data/Server -maxdepth 1 -type f -name 'friends*' -print
friends.ini와 메모리 확인
기본 설정은 /srv/zomboid/data/Server/friends.ini에 생기고 샌드박스·스폰 설정도 같은 접두사를 사용합니다. 처음에는 Public=false로 두고 Password, MaxPlayers, PauseEmpty, Open 값을 확인합니다. 공개 목록과 모드는 LAN 접속과 기본 저장이 정상인 뒤에 켭니다.
메모리 상한은 배포된 ProjectZomboid64.json의 JVM 인수에서 관리되는 빌드가 있습니다. start-server.sh만 고쳐도 적용되지 않을 수 있으므로 실제 JSON의 -Xmx를 확인하고, 전체 RAM을 모두 할당하지 말아 OS와 파일 캐시 여유를 남깁니다.
grep -E '^(Public|Open|Password|MaxPlayers|PauseEmpty)=' \
/srv/zomboid/data/Server/friends.ini
grep -n -- '-Xm[sx]' /srv/zomboid/server/ProjectZomboid64.json
# 설정 파일을 고친 뒤 소유권과 예상 서버 이름 확인
sudo chown -R zomboid:zomboid /srv/zomboid/data
ls -l /srv/zomboid/data/Server/friends*
systemd 등록과 포트 확인
서비스도 첫 실행과 똑같은 servername과 절대 cachedir를 전달해야 합니다. SIGINT 종료 뒤 로그에 저장 완료가 남는지 빈 테스트 월드에서 먼저 확인합니다. 검증 전에는 systemctl stop 직후 백업을 자동 실행하지 마세요.
기본 게임 포트는 UDP 16261이지만 Steam 네트워킹, 플레이어 직접 연결과 RCON 설정에 따라 추가 포트가 필요할 수 있습니다. 오래된 글의 넓은 포트 범위를 그대로 열기보다 현재 friends.ini와 기동 로그, ss 출력을 기준으로 필요한 UDP 포트만 라우터에 전달합니다.
# /etc/systemd/system/project-zomboid.service
[Unit]
Description=Project Zomboid Dedicated Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=zomboid
Group=zomboid
WorkingDirectory=/srv/zomboid/server
ExecStart=/srv/zomboid/server/start-server.sh \
-servername friends -cachedir=/srv/zomboid/data
KillSignal=SIGINT
TimeoutStopSec=180
Restart=on-failure
RestartSec=20
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now project-zomboid
sudo journalctl -u project-zomboid -f
sudo ss -lunp | grep -E ':16261|ProjectZomboid'
Workshop 모드는 두 목록이 모두 필요
friends.ini의 WorkshopItems에는 숫자 Workshop ID, Mods에는 모드 내부 ID가 들어갑니다. 둘 중 하나만 맞으면 서버가 파일을 받았어도 클라이언트와 활성 목록이 달라질 수 있습니다. 맵 모드는 Map 순서까지 영향을 주므로 새 월드 복사본에서 먼저 검증합니다.
업데이트 날에는 서버 앱, Workshop 파일과 클라이언트가 서로 다른 시점이 될 수 있습니다. 모드를 한꺼번에 많이 바꾸지 말고 서버를 비공개로 시작해 로그의 다운로드·로드 오류가 없는지 확인한 뒤 실제 클라이언트 한 대로 접속합니다.
grep -E '^(WorkshopItems|Mods|Map)=' \
/srv/zomboid/data/Server/friends.ini
# 로그에서 버전·모드·저장 오류만 좁혀 확인
grep -Ei 'version|workshop|mod|error|save' \
/srv/zomboid/data/server-console.txt 2>/dev/null | tail -80
백업과 Build 42 업데이트
정상 종료 뒤 cachedir 전체를 묶으면 Server 설정, db, Saves, Logs와 모드 관련 상태가 함께 남습니다. 압축본에는 관리자 계정과 플레이어 정보가 포함될 수 있으므로 웹 루트 밖에 두고 다른 저장장치로 복사합니다.
업데이트 전에는 현재 빌드와 브랜치, appmanifest 정보를 기록합니다. 백업 뒤 app_update 380870 validate를 실행하고 처음에는 모드 없이 복구 복사본으로 기동하면 게임 업데이트 문제와 모드 문제를 분리할 수 있습니다.
sudo systemctl stop project-zomboid
sudo -u zomboid tar -C /srv/zomboid -czf \
/srv/zomboid/zomboid-data-$(date +%F-%H%M).tar.gz data
sudo -u zomboid steamcmd \
+force_install_dir /srv/zomboid/server \
+login anonymous +app_update 380870 validate +quit
sudo systemctl start project-zomboid
sudo journalctl -u project-zomboid -n 150 --no-pager
Loading Map에서 멈출 때 순서
- 서버와 클라이언트의 전체 빌드 문자열 비교
- 절대 cachedir와 friends 서버 이름이 이전과 같은지 확인
- 모드를 잠시 뺀 복구 복사본에서 순정 접속 확인
- WorkshopItems와 Mods 두 목록 및 맵 순서 비교
- 16261/udp 리스닝과 실제 필요한 추가 포트를 로그로 확인
- RAM 상한과 OS 여유 메모리, 서버 로그의 OOM 확인
검증 범위와 공식 참고자료
Project Zomboid 공식 위키와 The Indie Stone 공식 포럼의 Linux 서버 안내, Build 42의 절대 cachedir 문제와 앱 380870 절차를 교차 확인했습니다. Build 42는 계속 바뀌므로 고정된 최대 인원·포트 범위를 과장하지 않았고 운영 데이터는 사용하지 않았습니다.