팰월드 서버 직접 만들기 4탄 - 전원 제어, 서버 콘솔, 실시간 지도
작성일 2026-07-13 · SameOS Tools
3탄에서 만든 관리 페이지는 REST API를 버튼으로 바꾼 것이었습니다. 그런데 운영하다 보면 REST만으로는 안 되는 일이 두 가지 생깁니다 - 설정 바꾸기와 꺼진 서버 켜기. 이번 글은 그 두 가지를 해결하고, 덤으로 만들고 나니 가장 재미있었던 서버 콘솔과 실시간 지도까지 붙입니다.
REST로 안 되는 것 하나 - 설정 편집
REST API의 설정 조회(/settings)는 읽기 전용이라 설정 변경은 못 합니다. 그래서 설정 편집 기능은 중계 서버가 설정 파일(PalWorldSettings.ini)을 직접 고치는 방식으로 만들었습니다. 2탄에서 다룬 소유권 함정 그대로 - 파일을 통째로 교체하지 않고 내용만 덮어써서 소유권을 보존하고, 고치기 전 버전을 자동으로 백업 폴더에 복사해 둡니다. 변경은 서버 재시작 시 적용됩니다.
REST로 안 되는 것 둘 - 전원 켜기/끄기
꺼진 서버에는 REST API 자체가 없습니다. 그래서 켜기/끄기 버튼은 중계 서버가 docker start/stop 명령을 실행하는 방식입니다. 끄기는 반드시 공지와 저장을 먼저 하고 나서 docker stop을 부릅니다. 주의할 점 하나 - 중계 서버에 도커 제어 권한을 주는 것은 사실상 서버 전체 권한을 주는 것과 같아서, 이 페이지를 외부에 노출하면 안 되는 이유가 하나 더 늘어납니다.
서버 콘솔 - 깨지는 글자의 정체
서버 콘솔 화면은 docker logs(컨테이너가 남긴 기록을 보는 명령) 출력을 웹으로 중계하면 되는데, 함정이 하나 있습니다. 도커 로그 데이터에는 8바이트짜리 머리표가 구간마다 붙어 있어서 그대로 화면에 찍으면 몇 글자마다 깨진 문자가 섞입니다. 아래 코드처럼 머리표를 떼어내는 처리가 필요합니다. 몇 초마다 반복되는 상태 확인 기록은 걸러 내면 콘솔이 훨씬 읽기 좋아집니다.
실시간 지도 - 좌표 변환 공식
접속자 목록(/players)에는 각 플레이어의 게임 속 좌표가 들어 있는데, 팰월드 월드는 한 변이 1,447,840인 정사각형이라 지도 이미지 위 위치(%)로 바꿀 수 있습니다. 게임의 남북이 이미지의 좌우에 대응하는 축 교환이 있어 공식이 직관과 다르니 아래 코드를 그대로 쓰면 됩니다. 지도 위에 점을 얹으면 누가 어디서 놀고 있는지 한눈에 보입니다.
// docker logs 스트림 처리 - 8바이트 머리표를 떼지 않으면 글자가 깨진다
function demux(buf) {
let text = '', i = 0;
while (i + 8 <= buf.length) {
const len = buf.readUInt32BE(i + 4); // 4~7바이트: 본문 길이
text += buf.slice(i + 8, i + 8 + len); // 0바이트: stdout/stderr 구분
i += 8 + len;
}
return text;
}
// 월드 좌표(x, y) → 지도 이미지 위 백분율 (한 변 1,447,840)
// 게임의 남북이 이미지의 좌우에 대응하는 축 교환에 주의
function toMapPercent(x, y) {
return {
left: (y + 738920) / 1447840 * 100,
top: (1 - (x + 999940) / 1447840) * 100,
};
}
// 사용 예: /players의 각 플레이어를 지도 위 점으로
// const { left, top } = toMapPercent(p.location_x, p.location_y);
// dot.style.left = left + '%'; dot.style.top = top + '%';
이것으로 시리즈 완성입니다. 이제 서버 관리가 전부 브라우저 버튼으로 끝나고, 누가 어디서 놀고 있는지도 지도로 한눈에 보입니다. 시리즈 전체 코드는 GitHub에 올려 두었고, 관리자 로그인을 일회용 코드로 처리하는 방법은 별도 글에서 다룹니다.