仮ですが、他に挑戦する方の参考になるようDockerを使用した構築方法を記載しておきます。


環境

Docker、docker-compose導入済み
rootlessOK

現時点での問題点

パケットを受けた時の文字コードとプログラム側の文字コード、DB側の文字コードが絡み合って日本語の名前、サーバ名が文字化けする
(苦肉の策として名前はDB側で変更すればOKだが、名前の検索とかはできなくなる)
また、コンフィグで日本語は使用できない
このあたりに詳しい方、更新をお願いします。

Dockerfile

ARG BUILDER_IMAGE=ubuntu:noble
 
FROM $BUILDER_IMAGE as builder
RUN apt-get update \
 && apt-get -y install --no-install-recommends git libzip-dev gnupg gcc g++ libglib2.0-dev unixodbc-dev pkg-config libmysqlclient-dev ca-certificates make \
 && rm -rf /var/lib/apt/lists/*
 
WORKDIR /tmp
 
ARG __build_type=release
 
RUN git clone https://github.com/Acrisio-Filho/SuperSS-Dev
WORKDIR /tmp/SuperSS-Dev
 
# data_iff.hの更新でビルドできない問題への対応
RUN git reset --hard 29657d3233a84b77f3cc7bd07af6e50705a9a62d
 
WORKDIR /tmp/SuperSS-Dev/Server\ Lib/Linux\ Builds/
 
# Build gg
RUN make -f Makefile-ggauth70.mk
RUN make -f Makefile-ggsrvlib.mk
 
# BUild Smart
RUN make -f Makefile-smart.mk
 
# Build Game Server
RUN make -f Makefile-gs.mk
 
# Build Auth Server
RUN make -f Makefile-as.mk
 
# Build Login Server
RUN make -f Makefile-ls.mk
 
# Build Message Server
RUN make -f Makefile-ms.mk
 
# Build Rank Server
RUN make -f Makefile-rs.mk
 
# PangyaServer
FROM ubuntu:noble as Server
 
RUN apt-get update \
   && DEBIAN_FRONTEND=noninteractive apt-get install -y libc6 unzip curl gnupg libzip-dev tmux libglib2.0 libmysqlclient21 tdsodbc unixodbc \
   && rm -rf /var/lib/apt/lists/*
 
# ビルドしたものをコピー
COPY --from=builder ["/tmp/SuperSS-Dev/Server Lib/Linux Builds/Auth Server/", "/opt/AuthServer"]
COPY --from=builder ["/tmp/SuperSS-Dev/Server Lib/Linux Builds/Game Server/", "/opt/GameServer"]
COPY --from=builder ["/tmp/SuperSS-Dev/Server Lib/Linux Builds/Login Server/", "/opt/LoginServer"]
COPY --from=builder ["/tmp/SuperSS-Dev/Server Lib/Linux Builds/Message Server/", "/opt/MessageServer"]
COPY --from=builder ["/tmp/SuperSS-Dev/Server Lib/Linux Builds/Rank Server/", "/opt/RankServer"]
 
# 起動スクリプトと設定
COPY ./start.sh /entrypoint.sh
COPY ./ini/odbc.ini /etc/odbc.ini
COPY ./ini/odbcinst.ini /etc/odbcinst.ini
 
WORKDIR /opt
 
RUN chmod +x /entrypoint.sh
 
ENTRYPOINT ["/entrypoint.sh"]
CMD ["start"]
 

docker-compose.yaml

version: '3'
services:
  db:
    container_name: pangya_db
    hostname: pangya_db
    ports:
      - "1433:1433"
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=【ここは変更してください】
      - MSSQL_PID=Express
      - MSSQL_LCID=1041
      - MSSQL_COLLATION=Japanese_CI_AS
    volumes:
      - "./mssqlserver/data:/var/opt/mssql/data"
      - "./mssqlserver/log:/var/opt/mssql/log"
      - "./mssqlserver/secrets:/var/opt/mssql/secrets"
    networks:
      - pangya

  app:
    container_name: pangya_app
    ports:
      - "7777:7777"
      - "20203:20203"
      - "10303:10303"
      - "30303:30303"
      - "4774:4774"
    build: .
    image: japangya
    depends_on:
      - db
    networks:
      - pangya
    volumes:
      - "./ini/auth_server.ini:/opt/AuthServer/server.ini"
      - "./ini/game_server.ini:/opt/GameServer/server.ini"
      - "./ini/login_server.ini:/opt/LoginServer/server.ini"
      - "./ini/message_server.ini:/opt/MessageServer/server.ini"
      - "./ini/rank_server.ini:/opt/RankServer/server.ini"
      #- "./pangya_jp.iff:/opt/GameServer/data/pangya_jp.iff"  #iff入れ替えた場合
    command: /bin/sh -c "while :; do sleep 10; done"

  web:
    container_name: web
    image: nginx
    volumes:
      - "./www:/usr/share/nginx/html"
    ports:
      - "8080:80"

networks:
  pangya:
    driver: bridge
 

start.sh

#!/bin/bash
 
set -eu
 
# Base Directory
dir=/opt/
 
as=AuthServer
ls=LoginServer
ms=MessageServer
rs=RankServer
gs=GameServer
#smart=Smart-Calculator
 
# Smart Calculator lib
#tmux new-session -s "${smart}" -c "/home/acrisio/projects/Node/${smart}/" -d 'node smart.js'
 
# Auth Server
tmux new-session -s "${as}" -c "${dir}/${as}/" -d ./auth
 
# Login Server
tmux new-session -s "${ls}" -c "${dir}/${ls}/" -d ./login
 
# Message Server
tmux new-session -s "${ms}" -c "${dir}/${ms}/" -d ./msn
 
# Rank Server
tmux new-session -s "${rs}" -c "${dir}/${rs}/" -d ./rank
 
# Game Server
tmux new-session -s "${gs}" -c "${dir}/${gs}/" -d ./game
 
# Show sessions createds
tmux ls
 
if [ "$1" = 'start' ]; then
  tmux -v new-session -s console -d
  while true; do
    sleep 1
    tmux list-sessions > /dev/null 2>&1 || break
  done
  exit 0
fi
 
exec "$@"
 

odbc.ini

[pangya]
Driver  = FreeTDS
Server = pangya_db
host = pangya_db
port = 1433
tds version = 7.4
ClientCharset = SHIFT_JIS
 

odbcinst.ini

[FreeTDS]
Description = FreeTDS for SQL Server
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
UsageCount = 1
 

ファイル構造

以下の用にini等を配置
├ Dockerfile
├ docker-compose.yaml
├ start.sh
├ pangya_jp.iff
├ ini
│ ├ auth_server.ini
│ ├ game_server.ini
│ ├ login_server.ini
│ ├ message_server.ini
│ ├ odbc.ini
│ ├ odbcinst.ini
│ └ rank_server.ini
└ www

事前準備

上記ファイル構造通りに各iniファイルを配置します。
※authやgameなどはリポジトリ上から取得可能です。

各server.iniのDBIPはpangyaに設定します。
auth以外のserver.iniのAUTHSERVERのIPはauthに設定します。

それ以外は好きなように設定してください。
ただし、日本語を使うとバグるので英語でお願いします。(Windows版は日本語でも行ける)

www内はリポジトリのwwwをコピーしてきてください。

ビルド

docker compose buildを実行します。
CPUにもよりますが大体10~20分程度かかるのでコーヒーでも飲みながら待ちます。


DBの準備

docker compose up dbをして、SSMSからアクセスします。
pangyaユーザやsqlの実行をしてpangyaDBを作成します。

DB周りはWindowsと同様に設定可能なのでそちらを参照してください。

起動

docker compose up -dをして起動します。
docker compose logs -fでログを開きそれぞれ正常に起動していることを確認します。

補足

各サーバを別々で起動しようとしましたがどうにもゲームサーバだけCPU使用率が異常になるのでtmuxで起動する手法のままにしています。

サーバのメモリが2GB以下でMSSQLが起動できない時

MSSQLは要件として2GB以上を要求しています。

安定性を犠牲にして無理やり起動する場合は以下のDockerfileでビルドしてください。
(数ヶ月使った感じ大丈夫そうでした)

FROM oraclelinux:7-slim AS build0
WORKDIR /root
RUN yum update -y && yum install -y binutils gcc
ADD wrapper.c /root/
RUN gcc -shared -ldl -fPIC -o wrapper.so wrapper.c
 
FROM mcr.microsoft.com/mssql/rhel/server:2019-latest
COPY --from=build0 /root/wrapper.so /root/
ADD wrapper.c /root/
USER root
RUN echo "/root/wrapper.so" > /etc/ld.so.preload
USER mssql
 

タグ:

+ タグ編集
  • タグ:
最終更新:2024年09月13日 20:39