최근에 친구들과 Fika를 통한 SPT 멀티 플레이를 즐겼다.
다 좋은데 아쉬운 건, 호스트인 친구가 서버를 24/7 열어둘 수가 없었다는 점.
따라서 이걸 데디 서버로 만들고 싶었는데, 마침 Fika 디스코드 서버에 그 방법이 있었다.
- 난 우분투 서버를 올린 라즈베리 파이4에 환경을 만들어 놨다.
- 하지만 설명의 편의를 위해 우분투 데스크탑을 통해 설명하겠다.
- Virtual Box / Ubuntu Desktop 24.04 / 4 Core / 4GM RAM - 리눅스 환경에 도커가 설치 돼 있다고 가정한다.
- Fika 디스코드 서버에 있는 내용을 기반으로 작성한다
1. 파일 준비
Dockerfile과 설정을 위한 스크립트를 준비해야 한다.
그전에 서버 관련 파일들을 모두 저장할 폴더를 하나 만들어야 한다.
mkdir -p ~/fika_server
난 fika_server
라는 폴더를 만들었고, 아래의 파일들도 모두 이 폴더 안에 만들 것이다.
A. Dockerfile
##
## Dockerfile
## FIKA LINUX Container
##
FROM ubuntu:latest AS builder
ARG FIKA=HEAD^
ARG FIKA_BRANCH=main
ARG SPT=HEAD^
ARG SPT_BRANCH=3.8.3
ARG NODE=20.11.1
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
WORKDIR /opt
# Install git git-lfs curl
RUN apt update && apt install -yq git git-lfs curl
# Install Node Version Manager and NodeJS
RUN git clone https://github.com/nvm-sh/nvm.git $HOME/.nvm || true
RUN \. $HOME/.nvm/nvm.sh && nvm install $NODE
## Clone the SPT AKI repo or continue if it exist
RUN git clone --branch $SPT_BRANCH https://dev.sp-tarkov.com/SPT/Server.git srv || true
## Check out and git-lfs (specific commit --build-arg SPT=xxxx)
WORKDIR /opt/srv/project
RUN git checkout $SPT
RUN git-lfs pull
## remove the encoding from aki - todo: find a better workaround
RUN sed -i '/setEncoding/d' /opt/srv/project/src/Program.ts || true
## Install npm dependencies and run build
RUN \. $HOME/.nvm/nvm.sh && npm install && npm run build:release -- --arch=$([ "$(uname -m)" = "aarch64" ] && echo arm64 || echo x64) --platform=linux
## Move the built server and clean up the source
RUN mv build/ /opt/server/
WORKDIR /opt
RUN rm -rf srv/
## Grab FIKA Server Mod or continue if it exist
RUN git clone --branch $FIKA_BRANCH https://github.com/project-fika/Fika-Server.git ./server/user/mods/fika-server
RUN \. $HOME/.nvm/nvm.sh && cd ./server/user/mods/fika-server && git checkout $FIKA && npm install
RUN rm -rf ./server/user/mods/FIKA/.git
FROM ubuntu:latest
WORKDIR /opt/
RUN apt update && apt upgrade -yq && apt install -yq dos2unix
COPY --from=builder /opt/server /opt/srv
COPY fcpy.sh /opt/fcpy.sh
# Fix for Windows
RUN dos2unix /opt/fcpy.sh
# Set permissions
RUN chmod o+rwx /opt -R
# Exposing ports
EXPOSE 6969
EXPOSE 6970
EXPOSE 6971
# Specify the default command to run when the container starts
CMD bash ./fcpy.sh
FIKA_BRANCH
는 main
SPT_BRANCH
는 현재 최신버전인 3.8.3
으로 설정했다.
B. fcpy.sh
# fcpy.sh
#!/bin/bash
echo "FIKA Docker"
if [ -d "/opt/srv" ]; then
start=$(date +%s)
echo "Started copying files to your volume/directory.. Please wait."
cp -r /opt/srv/* /opt/server/
rm -r /opt/srv
touch /opt/server/delete_me
end=$(date +%s)
echo "Files copied to your machine in $(($end-$start)) seconds."
echo "Starting the server to generate all the required files"
cd /opt/server
chown $(id -u):$(id -g) ./* -Rf
sed -i 's/127.0.0.1/0.0.0.0/g' /opt/server/Aki_Data/Server/configs/http.json
NODE_CHANNEL_FD= timeout --preserve-status 40s ./Aki.Server.exe </dev/null >/dev/null 2>&1
echo "Follow the instructions to proceed!"
exit 0
fi
if [ -e "/opt/server/delete_me" ]; then
echo "Error: Safety file found. Exiting."
echo "Please follow the instructions."
sleep 30
exit 1
fi
cd /opt/server && ./Aki.Server.exe
echo "Exiting."
exit 0
2. 이미지 빌드 및 설정
아래의 명령어로 빌드한다.
docker build --no-cache --label FIKA -t fika .
빌드가 완료될 때까지 기다리자.
파이4에선 시간이 꽤 걸렸다.
빌드가 왼료되면 아래의 명령어를 실행한다.
docker run --pull=never -v ~/fika_server:/opt/server --net=host -it --name fika fika
명령어가 제대로 실행이 됐다면 아래와 같은 상태일 것이다.
fcpy.sh
가 실행됐으므로 디폴트값인 루프팩 아이피가 전부 0.0.0.0
으로 변경됐다.
그리고 delete_me
는 실행을 막기 위한 세이프티 파일이다.
실행을 위해선 삭제해야 한다.
3. 실행
아래 명령어로 컨테이너를 실행한다.
docker start fika
docker update --restart unless-stopped fika
재시작 옵션은 취향 대로 설정한다.
여기선 "명시적 종료가 아닌 이상 컨테이너가 자동으로 재시작"되게 했다.
fika
fika
라는 결과가 나왔으면 정상이다.
아래의 명령어로 실행 로그를 확인해 보자.
docker logs -f --tail 20 fika
로그를 지속적으로 갱신하고(-f)
첫 표시 시엔 최신 로그 중 20 라인만 표시(--tail 20) 되게 했다.
나중에 로그를 다시 확인할 때 모든 로그를 표시하면 너무 많기 때문이다.
정상적으로 서버가 실행됐다.
4. 접속
라즈베리 파이는 공유기에 물리고 포트포워딩을 해 놓았지만
여기선 다른 방법을 다뤄보겠다.
누군가에겐 공유기 설정을 만지는 것이 맘에 들지 않을 수도 있다.
A. ZeroTier
여기서 활용할 수 있는 것은 네트워크 가상화 솔루션인 ZeroTier다.
하마치를 기억하는가? 그것과 유사한 기능을 한다고 생각하면 이해가 빠를 것이다.
먼저 우분투에 제로티어를 설치하기 위해 아래의 명령을 실행한자.
curl -s https://install.zerotier.com | sudo bash
성공적으로 설치된다면 이런 결과를 볼 수 있다.
가장 아래에 16진으로 된 주소가 표시되는데, 이 주소로 사용자를 구분할 수 있다.
제로티어 계정을 만들고 Networks 패널에 가면 아래와 같이 생성된 네트워크를 확인할 수 있다.
16진수로 된 아이디와 서브넷을 확인할 수 있다.
기본으로 생성되는 네트워크를 활용해도 되고 새로운 네트워크를 만들어도 된다.
리눅스에서의 접속은 아래의 명령어로 할 수 있다.
zerotier-cli join `Network ID`
200 join OK
라는 결과가 나오면 성공적으로 접속된 것이다.
이제 게임을 구동할 윈도우 환경에 제로티어를 설치해야 한다.
여기서 인스톨러를 다운받고 설치한다.
그럼 트레이 아이콘에 제로티어가 생긴다.
아이콘을 우클릭 하면 아래와 같은 메뉴가 나온다.
Join New Network
를 클릭하면 아래와 같은 창이 표시된다.
여기에 네트워크 ID를 넣고 Join
버튼을 누르면 접속이 완료된다.
이렇게 네트워크 이름이 뜨면 접속 성공이다.
B. ZeroTier 설정 및 주소 확인
제로티어 네트워크 페이지에서 네트워크를 클릭하면 설정으로 넘어갈 수 있다.
여기서 네트워크 전반에 관한 설정을 조작할 수 있다.
가장 중요한 것은 보안.
여기서 네트워크가 Private인지 Public인지 선택할 수 있다.
Public으로 설정하면 네트워크 ID만 있다면 누구나 멤버가 될 수 있다.
Private으로 설정하면 네트워크 ID가 있어도 관리자의 승인 없이는 멤버가 될 수 없다.
친구들만 빨리 받고 Private으로 돌리자.
좀 더 아래로 내리면 네트워크에 등록된 멤버들을 볼 수 있다.
내부 주소와 해당 멤버의 실제 물리 주소를 확인할 수도 있다.
아무에게나 보여주지 말자.
친구들에겐 서버의 Managed IPs
를 알려주면 된다.
C. 게임 실행
이제 진짜 접속해 보자.
런처에 서버의 아이피를 설정하고 서버 로그를 확인한다.
성공적으로 프로필까지 만들어졌다.
게임을 시작해 보자.
4. 실행 결과
오늘도 평화로운 신골조에 성공적으로 도착했다.
주의할 점
- 레이드 입장 시, 서버의 CPU 연산이 꽤 무겁다
- 파이4로 구동 시 꽤 시간을 잡아먹는다. 이 연산만 끝나면 나머진 호스트 클라이언트의 영역. - 윈도우에서 리눅스로 옮길 때 통으로 옮기지 말 것
- 윈도우에서 구동 중 생긴 몇몇 파일들이 문제를 일으킬 수 있다.
- 순수 모드 파일과 유저 정보만 옮겨야 에러가 없다. - 포트 개방을 확인하라
- 기본적으로 포트는 6969를 사용한다.
- 방화벽 설정 등을 미리 확인하라.
5. 마무리
컨테이너를 처음부터 세팅하는 것이 아니라 정말 편하다.
레이드 입장 때의 CPU 부하만 감당할 수 있다면 라즈베리 파이4도 나쁜 선택이 아닐 수 있다.
설정 몇 번으로 본섭에서 벗어나 SPT와 Fika로 친구들과 행복 타르코프를 즐겨보는 건 어떨까?
'Others' 카테고리의 다른 글
일본을 가기 위해 싱가포르를 거쳐야 한다면? (0) | 2024.05.15 |
---|---|
아카마이한테 딱 걸렸다... (0) | 2024.03.18 |
모니터가 꺼지고 그래픽 카드의 팬이 풀로드 되는 현상과 나의 해결법 (2) | 2024.02.08 |
봇은 JS로 새로 만드는 게 맞는 것 같다 (0) | 2024.01.18 |
결국 Cloudtype으로 돌아왔다 (0) | 2023.10.26 |