SameOS ~/tools/factorio-linux-headless-server.md

Factorio Linux 헤드리스 전용 서버 구축과 운영

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

Factorio는 그래픽과 소리를 뺀 공식 Linux headless 패키지를 제공해 서버에 게임 클라이언트를 설치할 필요가 없습니다. 대신 시작할 저장 파일이 반드시 있어야 하고, 공개 목록용 인증 토큰과 모드 버전이 클라이언트와 맞아야 합니다. 이 글은 비공개 서버부터 시작해 새 맵 생성, 서비스 등록, UDP 포트와 업데이트 순서를 다룹니다.

호스트와 패키지 확인

공식 위키는 현재 glibc 2.31 이상을 요구합니다. 오래된 CentOS/RHEL 7 같은 호스트에서 시스템 glibc를 억지로 교체하기보다 지원되는 새 배포판이나 컨테이너를 선택하는 편이 안전합니다. 서버는 root가 아닌 factorio 계정으로 실행합니다.

공식 다운로드 페이지의 stable headless Linux 패키지를 받아 /opt/factorio에 풉니다. 아래 stable 주소는 현재 안정판으로 이동하므로 업데이트 전후 factorio --version 출력을 운영 기록에 남기세요.

ldd --version | head -1
curl -fL 'https://factorio.com/get-download/stable/headless/linux64' \
  -o /tmp/factorio-headless.tar.xz

sudo useradd --system --create-home --home-dir /opt/factorio \
  --shell /usr/sbin/nologin factorio
sudo install -d -o factorio -g factorio /opt/factorio
sudo tar -xJf /tmp/factorio-headless.tar.xz \
  --strip-components=1 -C /opt/factorio
sudo chown -R factorio:factorio /opt/factorio
sudo -u factorio /opt/factorio/bin/x64/factorio --version

저장 파일과 서버 설정 만들기

헤드리스 서버는 시작할 save ZIP이 필요합니다. 기존 싱글 저장을 saves에 복사하거나 --create로 새 맵을 만듭니다. 맵 자원과 적 설정을 바꾸려면 첫 생성 때 map-gen-settings와 map-settings를 함께 지정해야 하므로, 월드를 만든 뒤 뒤늦게 같은 효과를 기대하면 안 됩니다.

data/server-settings.example.json을 복사해 이름, 설명, 최대 인원, visibility, game_password와 require_user_verification을 검토합니다. 공개 목록을 켤 때만 factorio.com 사용자 이름과 토큰이 필요합니다. 토큰은 평문 설정에 저장되므로 파일 권한을 600으로 제한하고 글·로그·Git에 넣지 않습니다.

sudo -u factorio mkdir -p /opt/factorio/saves /opt/factorio/mods /opt/factorio/config
sudo -u factorio /opt/factorio/bin/x64/factorio \
  --create /opt/factorio/saves/friends.zip

sudo -u factorio cp \
  /opt/factorio/data/server-settings.example.json \
  /opt/factorio/data/server-settings.json
sudo chmod 600 /opt/factorio/data/server-settings.json

# JSON 편집 후 문법 검사
python3 -m json.tool /opt/factorio/data/server-settings.json >/dev/null

systemd에서 최신 저장 불러오기

--start-server-load-latest는 saves에서 가장 최근 저장을 선택합니다. 테스트 파일을 같은 디렉터리에 두면 예상과 다른 월드를 열 수 있으므로 복구 훈련용 저장은 별도 디렉터리에 둡니다. Factorio는 정상 종료 때 저장하므로 SIGINT 시간을 충분히 줍니다.

# /etc/systemd/system/factorio.service
[Unit]
Description=Factorio Headless Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=factorio
Group=factorio
WorkingDirectory=/opt/factorio
ExecStart=/opt/factorio/bin/x64/factorio \
  --start-server-load-latest \
  --server-settings /opt/factorio/data/server-settings.json
KillSignal=SIGINT
TimeoutStopSec=120
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl enable --now factorio
sudo journalctl -u factorio -f

UDP 34197과 접속 진단

Factorio 기본 포트는 UDP 34197이며 TCP 규칙은 대신할 수 없습니다. 모든 클라이언트는 서버와 정확히 같은 게임 버전과 모드 구성을 사용해야 합니다. 포트가 열려 있어도 모드 체크섬이 다르면 접속 단계에서 거절됩니다.

먼저 LAN 주소로 연결해 프로세스와 설정을 확인하고, 외부에서만 실패할 때 라우터 포워딩을 봅니다. 공인 목록을 사용하지 않는 hidden 서버는 IP와 포트로 직접 접속할 수 있습니다.

sudo ss -lunp | grep ':34197'
sudo ufw allow 34197/udp

# 로그에서 버전, 포트, 로드한 저장 확인
sudo journalctl -u factorio -n 120 --no-pager | \
  grep -E 'Loading map|Hosting game|version|port'

모드, 관리자와 백업

모드를 사용할 때는 mods 디렉터리와 mod-list.json을 저장과 함께 버전 관리하듯 보관합니다. 클라이언트도 같은 모드 이름과 버전을 받아야 하므로 업데이트 날에는 서버만 먼저 올리지 말고 테스트 접속까지 한 묶음으로 처리합니다.

관리자는 factorio-current.log와 같은 데이터 영역의 server-adminlist.json에 사용자 이름 배열로 기록됩니다. 서버를 정상 종료한 뒤 saves, mods, config와 server-settings.json을 백업하되 인증 토큰이 들어간 압축 파일은 웹 루트에 두지 않습니다.

sudo systemctl stop factorio
sudo -u factorio tar -C /opt/factorio -czf \
  /opt/factorio/factorio-data-$(date +%F-%H%M).tar.gz \
  saves mods config data/server-settings.json
sudo systemctl start factorio

gzip -t /opt/factorio/factorio-data-YYYY-MM-DD-HHMM.tar.gz

안전한 업데이트 순서

검증 범위와 공식 참고자료

Wube의 공식 Factorio 위키와 지원 FAQ에서 headless 패키지, 저장 생성, 설정 예제, glibc 요구사항과 UDP 34197를 확인했습니다. 공개 목록 토큰이나 운영 저장은 사용하지 않았습니다.

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

게임 서버 백업 복구 훈련 Valheim 리눅스 서버 Satisfactory 리눅스 서버