鯖ドリル

※本記事にはアフィリエイト広告(PR)が含まれています

CoreKeeper

【2026年版】Core Keeper専用サーバーの立て方|ポート開放ゼロで24時間マルチ(VPS・Oracle無料枠 両対応)

Core Keeperの専用サーバーを立てる手順を、公式ドキュメントに沿って解説します。Core KeeperはSteamのリレー網を使うためポート開放が一切不要。x86のVPSなら公式手順そのまま、Oracle Cloudの無料ARM枠ならDocker+box64。両ルートを実機検証ベースで比較します。

#Core Keeper#VPS#Oracle Cloud#Docker#ARM#box64#専用サーバー#マルチプレイ
目次

Core Keeperは最大8人で遊べる採掘サンドボックスの良作ですが、マルチプレイは基本「ホストがゲームを起動している間だけ」。24時間動く専用サーバーがあれば、みんなが好きな時間に同じワールドへ入れます。

そしてCore Keeperの専用サーバーには、他のゲームにない大きな美点があります。ポート開放が一切要りません。

結論を先に言うと——

  • Core KeeperはSteamのリレー網(SDR)経由で繋がるので、ファイアウォールもルーターも触らなくていい
  • x86のVPSなら公式手順そのまま。Dockerもエミュレーションも不要で、実質コピペで終わる
  • Oracle Cloudの無料ARM枠でも動くが、x86バイナリを動かすためのDocker + box64が必要(=ここだけが茨)
  • メモリは2GB以上。実測で1.5GB前後使うので、1GBのプランでは入りきりません
  • コマンドを書きたくない人は、テンプレで立つ有料VPS(ConoHa for GAMEなど)を使うと、この記事の手順そのものが要らなくなります

この記事で得られること

  • ポート開放ゼロで専用サーバーが立つ仕組み(SDRとDirect Connectの違い)
  • x86 VPSでの公式手順(SteamCMD → _launch.sh
  • Oracle無料ARM枠でのDocker + box64構築と、そこで詰まる箇所
  • ServerConfig.json と Docker環境変数の対応表(公式ドキュメント準拠)
  • Game IDの正しい扱い方と、パスワードで鍵を2枚にする方法
  • 実測したメモリの必要量と、SSHを切っても落ちない常駐のさせ方

まず選ぶ: どこにサーバーを置くか

Core Keeperのサーバー本体はx86_64のLinuxバイナリです。ここが分岐点になります。

置き場所手順費用向いている人
x86のVPS(KAGOYA / ConoHa / XServer など)公式手順そのまま。Docker不要・box64不要。実測1分4秒で導入完了月数百円〜大多数の人。手間と時間を金で省きたい人
Oracle Cloud 無料ARM枠(Ampere A1)Docker + box64が必要0円手間より金を惜しむ人。Linuxに抵抗がない人
自宅のPC・Raspberry PiARMならOracleと同じくbox64電気代のみ24時間つけっぱなしにできる人

ポート開放が要らないので、自宅の回線でも成立します。 ルーターの設定画面を開く必要はありません。

メモリは2GB以上を見てください。 実測で必要なのは1.5GB前後で、1GBだとプレイヤー1人でも収まりません(詳細は後述のルートA-5)。一方でCPUは20%しか使いません。コア数より、まずメモリです。


Core Keeperはポート開放が不要

Core Keeperの専用サーバーは、既定で SDR(Steam Datagram Relay) を使います。

  • サーバーがSteamのリレー網へ外向きに接続しにいく
  • プレイヤーはGame IDを頼りに、そのリレー経由でサーバーへ届く
  • つまりサーバー側は受信ポートを開けていない

実際に接続できました。 KAGOYAのVPSに専用サーバーを建て、手元のWindowsから接続できました。セキュリティグループは一度も触っていません(SSH用のTCP 22以外は何も開けていません)。

Ping値は24msでした。Oracle Cloudの無料枠で建てたときより速く感じます。

自宅のPCでも同じです。Apple Silicon MacでDockerを使って建てました。スマートフォンのテザリング経由=自宅回線の外からでも接続できました。

VPSに建てたサーバーへ接続できた画面。Ping値は24ms、Game IDはマスク

⚠️ 公式ドキュメントによると、-port -password -ip の3つはコマンドライン専用です。ServerConfig.json に書いても無視されます。ここは実際に引っかかりやすい箇所です。


ルートA: x86のVPSに公式手順で立てる

Dockerもエミュレーションも使いません。公式の手順がそのまま通ります。

前提は「SSHでログインできるUbuntuサーバーがあること」だけです。

検証した環境はこちらです。以下の実測値はすべてこの構成のものです。

項目内容
VPSKAGOYA CLOUD VPS(1コア/1GB → 2コア/2GB の両方で測定・SSD 96GB)
OSUbuntu Server 24.04.4 LTS(カーネル 6.8.0)
クライアントWindows 11

KAGOYA CLOUD VPSの1GBプラン。メモリ956Mi・スワップ2.8Gi・1コア・Ubuntu 24.04.4 LTS

A-1. SteamCMDの準備

sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y steamcmd lib32gcc-s1

lib32gcc-s1 を飛ばさないでください。 当ブログのValheim検証では、ここを抜かして起動しない事故が起きています。SteamCMDは32bitライブラリに依存します。

疑わしければ、入れたあとに確認できます。dpkg -l steamcmd の出力は steamcmd:i386 です。パッケージそのものが32bitなので、64bitのサーバーを建てる場合でもこの依存からは逃げられません。

⚠️ ここで画面が出て止まります

インストールの途中で、Steamの利用規約が全画面で表示されます。-y を付けていても出ます。

そして、次の確認画面で選択されているのは I DECLINE(拒否)です。

そのままEnterを押すと拒否したことになり、インストールが完了しません。 矢印キーで I AGREE に移動してから決定してください。

steamcmdのライセンス確認画面。赤く選択されているのは I DECLINE で、そのまま決定すると拒否になる

A-2. サーバー本体のダウンロード(公式コマンド)

steamcmd +login anonymous +app_update 1007 validate +app_update 1963720 validate +quit
  • App ID 1963720 = Core Keeper Dedicated Server(無料・匿名ダウンロード可)
  • App ID 1007 = Steamworks SDK Redist(steamclient.so のため。これが要ります)

サーバーだけは無料で入手できます

Success! App '1963720' fully installed. が出れば完了です。1コアのVPSで1分4秒でした。

Success! App '1963720' fully installed. と表示され、実行時間は real 1m4.280s

置かれる場所はここです。公式ドキュメントの説明と違いました

~/.local/share/Steam/steamapps/common/Core Keeper Dedicated Server/   ← 653MB
~/.local/share/Steam/steamapps/common/Steamworks SDK Redist/          ← 103MB

findの結果。CoreKeeperServerと_launch.shは Core Keeper Dedicated Server 配下にあり、サイズは653MBと103MB

A-3. 公式ドキュメントの「つまずき」は起きませんでした

公式のREADMEには、起動時に steamclient.so: wrong ELF class: ELFCLASS32 が出るという警告があります。対処として、64bit版へのシンボリックリンクを張る手順も載っています。

今回は出ませんでした。 理由はサーバー本体が自分用の steamclient.so を同梱しているからです。

Core Keeper Dedicated Server/steamclient.so
Core Keeper Dedicated Server/linux64/steamclient.so

起動ログでも SteamAPI_Init(): Loaded local 'steamclient.so' OK. と、同梱のものを読んでいます。SteamCMD側の32bit版を掴みにいかないので、そもそも競合しません。

つまり、この節は飛ばして構いません。 もし別のディストリビューションなどで実際にこのエラーが出たときだけ、下を実行してください。先回りで張る必要はありません。

mkdir -p ~/.steam/sdk64
ln -s ~/.local/share/Steam/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.so

A-4. 起動

付属の起動スクリプトを実行します。ディレクトリ名に空白が入っているので、クォートを忘れないでください。

cd ~/.local/share/Steam/steamapps/common/"Core Keeper Dedicated Server"
./_launch.sh -worldname MyCoreKeeper -maxplayers 5

⚠️ 必ず cd してから ./_launch.sh で起動してください。 フルパスで直接叩くと失敗します。スクリプトの中が pushd $installdir とクォート無しで書かれているため、空白を含むパスを渡すと途中で分解されます。

起動時の挙動ですが、

勝手にパッケージを入れにきます。 このスクリプトは libxi6xvfb が無いと sudo apt-get install を実行します。ゲームの起動スクリプトがsudoでパッケージを入れるのは驚きますが、仕様です。sudoにパスワードが必要な環境ではここで止まります

画面がほぼ無反応になります。 -logfile CoreKeeperServerLog.txt が固定で埋め込まれていて、進行状況はファイルに書かれます。ターミナルには Started server process with pid ... しか出ません。不安なら別の端末から追ってください。

tail -f ~/.local/share/Steam/steamapps/common/"Core Keeper Dedicated Server"/CoreKeeperServerLog.txt

仮想ディスプレイが立ちます。 Core Keeperのサーバーは中身がUnityです。裏で Xvfb :99 -screen 0 1x1x24 を起動し、そこへ描画します。1×1ピクセルの画面です。GUIの無いVPSでもこれで動きます。

初回はワールド生成が走り、最後にGame IDが表示されます。

No GameID found. Creating new GameID for the session.

GameID: XXXXXXXXXXXXXXX

これが出れば起動成功です。

起動が完了し、GameIDが発行された行(IDはマスク)

⚠️ ただし、このままSSHを切るとサーバーは止まります。 フォアグラウンドで動かしているので、ターミナルを閉じた時点で落ちます。24時間動かすには後述の「運用」でsystemdに登録してください。

A-5. どのくらいのスペックが要るのか

ここが一番知りたいところだと思うので、1GBと2GBの両方で実測しました。

1GBプラン(1コア)2GBプラン(2コア)
サーバーのメモリ使用(RSS)685MB1.5GB
スワップ使用量931MB0
空きメモリ69MB319MB
CPU使用率20%20〜23%
体感もっさりする引っかからない

※ どちらもプレイヤー1人・同じワールドでの測定です

プレイヤー1人時のfree -h。物理メモリの空きは68Mi、スワップは931Mi使われている

1GBでは足りません。

面白いのは、1GBのときの 685MBが「使いたい量」ではなかったことです。2GBに増やすと、同じワールドで 1.5GB 使いました。入りきらないぶんが追い出されていただけで、本当に要るのは1.5GB前後だったわけです。

だから1GBでは、プレイヤーがたった1人でも931MBがスワップへ逃げます。物理メモリの空きは69MB。実際に遊ぶと、移動中にはっきり引っかかります。

vmstatの出力。スワップアウト(so)はほぼ0で、スワップイン(si)が時々跳ねる。空きメモリは69716KBに張り付いている

2GBに変えると、スワップの使用量はゼロになりました。プレイ中に2分間サンプリングしても si/so は終始0、メモリの数値は1MBも動きません。そして体感の引っかかりも消えました。

この記事では2GB以上を勧めます。 1GBでも起動はしますが、それは「動く」であって「遊べる」ではありません。

正直に書いておきます。 KAGOYAの2GBプランはCPUも2コアになるので、変わったのはメモリだけではありません。ただ1GBのときもCPUは20%しか使っておらず余っていたので、効いたのはメモリだと考えています。

それと、測ったのはプレイヤー1人のときだけです。人数が増えたときにどう伸びるかまでは確かめられていません。

💡 KAGOYAはあとからメモリを増やせます。 実際に1GB→2GBへ変更しましたが、ワールドはそのまま引き継がれ、Game IDも変わりませんでした(友達に配ったIDを配り直す必要はありません)。ただし下げることはできません。迷ったら小さめに契約して、足りなければ上げるのが安全です。


ルートB: Oracle Cloud無料ARM枠にDockerで立てる

月0円で24時間動かしたい場合はこちら。ただし相応の癖があります。

📌 この節は、Oracle Cloudのインスタンスが既にある前提で進みます。 アカウント作成・インスタンスの作成・SSH接続・クォータの設定は、Oracle Cloud無料枠でゲームサーバー用インスタンスを作る全手順にまとめてあります。まだサーバーを持っていない方は先にそちらへ。

なぜARMだと面倒なのか

Core Keeperのサーバーはx86_64バイナリです。Oracleの無料枠で使えるAmpere A1はARMなので、そのままでは動きません。x86→ARMの変換を担う box64 が要ります。

box64を内蔵したDockerイメージ escapingnetwork/core-keeper-dedicated を使います。非公式のコミュニティ製イメージです。

B-1. Dockerのインストール

sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo usermod -aG docker ubuntu

ここで一度SSHを抜けて入り直してください(推奨)。docker ps がsudo無しで通ればOKです。入り直さないと permission denied ... docker.sock になります。

B-2. compose.yaml の作成

mkdir -p ~/corekeeper && cd ~/corekeeper
cat > compose.yaml << 'EOF'
services:
  core-keeper:
    image: escaping/core-keeper-dedicated:latest
    container_name: core-keeper
    restart: unless-stopped
    stop_grace_period: 2m
    environment:
      - ARM64_DEVICE=generic       # ← Oracle Ampere A1はこれ
      - USE_DEPOT_DOWNLOADER=true  # ← ARMでは必須。抜くと起動しません(理由は後述)
      - WORLD_NAME=MyCoreKeeper
      - MAX_PLAYERS=5
    volumes:
      - ./ck-data:/home/steam/core-keeper-data
EOF
docker compose up -d
docker logs -f core-keeper     # Ctrl+Cで抜けてもコンテナは動き続けます

ARM64_DEVICEgeneric でいい

Oracle Cloudなら adlink。**イメージのドキュメントは、指示しています。**が、無視してgenericでいいです。

box64を選んでいるのは、土台の sonroyaalmerol/steamcmd-arm64box64.sh です。これがコンテナ内の /usr/local/bin/box64 の正体で、中はこうなっています。

case "$ARM64_DEVICE" in
    rpi5)       SUFFIX="rpi5" ;;
    m1|apple)   SUFFIX="m1" ;;
    #  … ほか10分岐(rpi3 / rpi4 / rk3588 など)
    *)          SUFFIX="generic" ;;
esac

genericになりますが 起動するので問題ないです。

補足: なぜ USE_DEPOT_DOWNLOADER=true が要るのか

立ち上がっていれば読み飛ばして構いません。 上の1行を抜くと何が起きるか、という話です。

抜くと、こう出て止まります。

/usr/local/bin/box64: line 48: Segmentation fault (core dumped) "$BINARY_PATH" "$@"
...
[BOX64] Error: File is not found. (./CoreKeeperServer)

ARM環境での失敗。Error: File is not found. (./CoreKeeperServer) のあと exited with code 255 で終了する

CoreKeeperServer が無いと言われますが、これは結果であって原因ではありません。

先ほどの box64.sh には、SteamCMDを動かしたときだけ、落ちても成功したことにする分岐が入っています。

if [ "$IS_STEAMCMD" -eq 1 ]; then
    "$BINARY_PATH" "$@"
    STATUS=$?
    [[ $STATUS -eq 139 || $STATUS -eq 134 ]] && exit 0   # ← SIGSEGV / SIGABRT を握り潰す
    exit $STATUS

139 はSIGSEGV、134 はSIGABRTです。クラッシュしたのに終了コードは 0。その結果こうなります。

  1. SteamCMDが落ちる(=サーバー本体はダウンロードされていない)
  2. ラッパーが「成功」を返す
  3. セットアップ処理はエラーに気づかず先へ進む
  4. 起動しようとして初めて File is not found. になる

本当の失敗は1で起きているのに、見えるエラーは4で出ます。 これが原因を追いにくくしている正体です。ちなみに box64: line 48 はこのスクリプトの**最終行(fi)**で、「ラッパーの中で落ちた」以上のことは教えてくれません。

そこで USE_DEPOT_DOWNLOADER=true です。ドキュメントの説明は “Use Depot downloader instead of steamcmd. Useful for system not compatible with 32 bits.”。SteamCMDの代わりにDepotDownloaderで取得する、という切り替えです。

同じApp IDを同じ場所へ入れるので取得できるものは同じです。しかもこのDepotDownloaderはARM64ネイティブ版が焼き込まれています(DepotDownloader-linux-arm64.zip)。box64を通らないので、そもそもクラッシュしようがありません。

実際にApple Silicon(M3・Docker Desktop)で、この1行だけを足して確かめました。

変数なしだと、SteamCMDは自身の更新(40MB)もSteam接続も成功します。落ちるのは本体のダウンロードの途中でした。

 Update state (0x61) downloading, progress: 34.72 (37470688 / 107911652)
/usr/local/bin/box64: line 48:    46 Segmentation fault      "$BINARY_PATH" "$@"

103MBのうち37MBまで進んだところです。足すと、SteamCMDの行が丸ごと消えてDepotDownloaderに変わりました。

Total downloaded: 151907856 bytes (573551364 bytes uncompressed) from 2 depots

Segfaultは一度も出ず、そのまま起動してGame IDが出ました。変えたのはこの1行だけです。

環境変数を足したあとのARMでの起動ログ。Listening on SteamID のあとGame IDが発行される(IDはマスク)

ネット上には「ホスト側でDepotDownloaderを実行してコンテナに渡す」という手順が出回っています。実際それでも動きます。

ただ、上のとおりイメージが最初から同じことをやる用意をしています。手で外から入れる必要はありません。


Game IDと接続

Core Keeperの専用サーバーは、IPアドレスではなく Game ID で接続します。

# Dockerの場合
docker exec core-keeper cat /home/steam/core-keeper-dedicated/GameID.txt

クライアント側: Core Keeperを起動 → マルチプレイ → Game IDで参加 → IDを入力 → ワールドイン。

💡 起動ログでの出方が、ルートによって違います。 ここを知らないとログの中で迷子になります。

  • ルートA(公式の _launch.sh: GameID: XXXXXXXXXXXXXXX とラベル付きで出ます
  • ルートB(Docker): GameID: というラベルは付きません。 IDだけの行と、続く Started session with info: XXXXXXXXXXXXXXX の2箇所に出ます

ルートBで GameID を目印に探すと見つかりません。Started session で探してください。

⚠️ Game IDは実質パスワードです

実機で確認しましたが、Game IDさえ知っていれば誰でも入れます。

ここはドキュメントと実際の挙動が食い違うところなので、名指しで書いておきます。ドキュメントはパスワードについて「省略または無効な場合はランダムなパスワードが生成される」と説明しています。ところが生成された ServerConfig.json を開くと、こうなっていました。

{
    "gameId": "",
    "password": "",
    "worldName": "SabadrillKagoya",
    "maxNumberPlayers": 5,
    ...
}

空のままです。 ランダムなパスワードは生成されていません。

これはルートA・ルートBの両方で確認しました。x86のVPSで公式の _launch.sh を直接叩いた場合も、ARMでDockerを使った場合も、どちらも空でした。Dockerイメージ側の都合ではなく、そういう挙動だと考えてください

「指定しなくても勝手に鍵がかかっているはず」と思い込むのが一番危険です。必要なら自分でパスワードを設定してください。

  • 共有はDiscordなどクローズドな場で
  • SNSやブログに載せない(スクリーンショットの端に写り込みがちです。要マスク)
  • 漏れたらワールド設定でIDを再生成する

鍵を2枚にする: パスワードを設定する

Game IDだけが頼りという状態が不安なら、接続パスワードを別途設定できます(最大28文字)。

environment:
  - PASSWORD=あなたのパスワード

直接インストールした場合は起動時の引数で渡します(前述のとおり -passwordコマンドライン専用で、設定ファイルに書いても無視されます)。

この場合はGame IDが漏れても、パスワードを知らなければ入れません。


設定リファレンス

Core Keeperの設定は ServerConfig.json とコマンドライン引数で行います。Dockerイメージを使う場合は、環境変数がこれらに変換されます。

主な設定項目

Docker環境変数対応する引数既定内容
WORLD_NAME-worldnameCore Keeper Serverサーバー表示名
WORLD_INDEX-world0ワールドインデックス
WORLD_SEED-worldseedランダムワールドのシード
WORLD_MODE00=Normal / 1=Hard / 2=Creative / 4=Casual
MAX_PLAYERS-maxplayers※下記参照最大接続人数
GAME_ID-gameid自動生成Game IDを固定したい場合に指定
PASSWORD-passwordなし接続パスワード(最大28文字・CLI専用
SERVER_PORT-portなし(SDR)指定するとDirect ConnectになるCLI専用
SERVER_IP-ip0.0.0.0待ち受けアドレス(CLI専用
-datapath既定パスセーブの保存先

その他の環境変数(Dockerイメージ)

変数内容
MODS_ENABLED / MODIO_API_KEY / MODSmod.io経由のMod導入
DISCORD_WEBHOOK_URL参加・退出・起動・停止をDiscordへ通知
ACTIVATE_CONTENT / ACTIVATE_ALL_CONTENT / SEASONシーズン・コンテンツ制御
ALLOW_ONLY_PLATFORM接続元を Steam / Epic / Microsoft / GOG に限定

Game IDは実測で15文字でした。ルートA・ルートBのどちらで建てても同じです。

ドキュメントは食い違っていて、本体側は「23文字以上」、Dockerイメージ側は「15文字以上28文字以下」と書いています。実測と一致するのは後者です。MAX_PLAYERS の既定値も同じく食い違いますが(本体100 / イメージ10)、ルートBなら10です。

Modが使えます

Core Keeperは MODS_ENABLED と mod.io の連携でModを導入できます。

ゲームによっては、Linux専用サーバーだとMod導入が不可能なものもあります。当ブログのPalworld検証がそうでした。これは嬉しい点です。


運用

ルートA: systemdに登録して常駐させる

./_launch.sh を手で叩いただけでは、SSHを切ると止まります。 サービスとして登録してしまいましょう。

sudo tee /etc/systemd/system/corekeeper.service > /dev/null << 'EOF'
[Unit]
Description=Core Keeper Dedicated Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/.local/share/Steam/steamapps/common/Core Keeper Dedicated Server
ExecStart=/bin/bash -c "cd \"/home/ubuntu/.local/share/Steam/steamapps/common/Core Keeper Dedicated Server\" && exec ./_launch.sh -worldname MyCoreKeeper -maxplayers 5"
Restart=on-failure
RestartSec=15
KillMode=mixed
TimeoutStopSec=150

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now corekeeper

2箇所、Core Keeper特有の書き方をしています。

ExecStartbash -c を噛ませて cd してから ./_launch.sh を呼んでいるのは、A-4と同じ理由です。絶対パスで直接呼ぶと、スクリプト内の pushd $installdir がパスの空白で分解されます。

KillMode=mixed保存のためです。systemdの既定(control-group)は停止時にサーバー本体へも直接シグナルを送るので、_launch.sh が保存を終える前に殺される恐れがあります。mixed ならメインプロセスにだけ届き、スクリプトが後始末をしてから終われます。

普段の操作はこれだけです。

起動

sudo systemctl start corekeeper

停止(保存してから終了します)

sudo systemctl stop corekeeper

再起動

sudo systemctl restart corekeeper

状態の確認

systemctl status corekeeper --no-pager -n 10

ログは2箇所に分かれます。ゲームの中身はファイル、起動・終了の記録は journalctl です。

ゲーム本体のログ(ワールド生成やGame IDはこちら)

tail -f ~/.local/share/Steam/steamapps/common/"Core Keeper Dedicated Server"/CoreKeeperServerLog.txt

systemd側の記録(起動・停止の履歴はこちら)

journalctl -u corekeeper -n 30 --no-pager

実際に動かして確かめました。stop は3秒で終わり、ログには強制終了ではなく Deactivated successfully が残ります。ワールドのファイルもその時刻で更新されていました。OSを再起動すると、起動から6秒後にサーバーが自動で立ち上がります。 Game IDも変わりません。

ルートB: Dockerは何もしなくて常駐します

停止stop_grace_period の猶予内にセーブして終了します)

cd ~/corekeeper && docker compose stop

起動

cd ~/corekeeper && docker compose start

ログ確認

docker logs -f core-keeper

docker compose up -d の時点でコンテナはDockerの管理下に入るので、SSHを切っても動き続けます。 restart: unless-stopped を書いてあるので、OS再起動後も自動で戻り、手動で止めた状態も記憶されます。

常駐に関してはルートBのほうが楽です。 x86は導入が速い代わりにsystemdを自分で書く必要があり、ARMは導入が茨な代わりに常駐が最初から付いてきます。

セーブデータの場所とバックアップ

Linuxでのセーブは次の場所に作られます。

~/.config/unity3d/Pugstorm/Core Keeper/DedicatedServer/
  ├── ServerConfig.json
  └── worlds/0.world.gzip      ← ワールド本体

Dockerの場合は -datapath がこのボリュームへ向きます。なので core-keeper-data(上の例では ./ck-data)の直下に展開されます。実機で数えた中身は次のとおりでした。

ck-data/
  ├── ServerConfig.json
  ├── Admins.json
  ├── Admins.json.pugbackup
  ├── worlds/
  │   └── 0.world.gzip         ← ワールド本体。これが消えたら終わりです
  ├── modloader/config.json
  └── mods/README.txt

守るべきは worlds/ です。 ただ、ディレクトリ全体でも1.5MBしかありません(実測)。worlds/ 以外は合わせて1KB未満です。選り分ける意味がないので、丸ごと固めるのが確実です。

必ずサーバーを停止してから固めてください。稼働中のセーブを掴むと壊れることがあります。

ルートA(systemd)ならこれです。

sudo systemctl stop corekeeper && tar czf ~/ck-backup-$(date +%Y%m%d).tar.gz -C ~/.config unity3d && sudo systemctl start corekeeper

ルートB(Docker)はこちら。

cd ~/corekeeper && docker compose stop && tar czf ~/ck-backup-$(date +%Y%m%d).tar.gz ck-data && docker compose start

⚠️ Game IDはこのバックアップに入りません。 GameID.txt はセーブではなくインストール先Core Keeper Dedicated Server/)にあります。別のサーバーへ移すとIDが振り直され、友達に配ったIDが使えなくなります。IDを保ちたいなら、起動引数に -gameid あなたのID を足して固定してください。

そして固めたら手元のPCへ落としてください。 サーバーの中に置いたままでは保険になりません。VPSのコントロールパネルが操作不能になったことが実際にあり、そのときはバックアップにも手が届きませんでした。ボス戦の前など、節目で取る習慣をつけておくと安心です。

💡 Macで検証すると .DS_Store が紛れ込みますが、これはmacOS側が作るものでLinuxのサーバーには出ません。無視して構いません。

ローカルのワールドを持ち込む

ソロで進めたワールドを専用サーバーへ移すこともできます。#.world.gzip を上の worlds/ へ置き、ファイル名の番号に合わせて -worldWORLD_INDEX)を指定します。アップロード前に必ずサーバーを停止してください。


トラブルシューティング

ルートA(x86 VPS)

症状対処
インストールが終わらないライセンス画面で 既定の I DECLINE のまま決定していないか(A-1)
SteamCMDが32bitライブラリで落ちるlib32gcc-s1 が入っているか確認(A-1)
_launch.sh を実行しても何も起きないcd してから ./_launch.sh。フルパスだとパスの空白で分解されます(A-4)
画面に何も出ない・止まって見える正常です。ログは CoreKeeperServerLog.txt に出ます(A-4)
Could not resolve keysym XF86... が大量に出る無害。仮想ディスプレイ(Xvfb)のキー定義の警告です
steamclient.so: wrong ELF class: ELFCLASS32本手順では発生しませんでした。出た場合のみ ~/.steam/sdk64 へリンク(A-3)
動くが「もっさり」するメモリ不足を疑ってください。free -h でスワップ使用量を確認(A-5)

ルートB(Oracle ARM・Docker)

症状対処
SteamCMDのSegfault → File is not foundcompose.yaml に USE_DEPOT_DOWNLOADER=true があるか確認(B-2)
permission denied ... docker.sockSSHを入り直す(usermod の反映)
no configuration file providedcd ~/corekeeper してから docker compose
Game IDが見つからないまだ初期化中。docker logs -f で進行を確認(初回は10〜20分)。ルートBでは GameID: というラベルは出ません

まとめ

  • Core KeeperはSDR方式なのでポート開放が一切不要。ルーターもファイアウォールも触らずに済む、珍しく親切なゲームです
  • x86のVPSなら公式手順そのまま。SteamCMDで落として _launch.sh を叩くだけで、Dockerもbox64も要りません
  • Oracle無料ARM枠でも0円で動きます。ただしDocker + box64が必要です
  • ARM側の関門は2つ。ARM64_DEVICE=adlink は無効値で、黙って generic になること。そしてSteamCMDのクラッシュが「成功」として握り潰され、原因が見えなくなること。後者は USE_DEPOT_DOWNLOADER=true で回避できます
  • メモリは2GB以上。1GBだと931MBがスワップに逃げて体感でもたつきます。2GBならスワップ0で、実測で必要なのは1.5GB前後でした
  • x86はsystemdに登録しないとSSHを切った時点で止まります。逆にDockerは何もしなくても常駐します。導入が楽なのはx86、運用が楽なのはDockerです
  • Game IDは実質パスワード。公開の場に出す予定があるなら、PASSWORD を設定して鍵を2枚に

ここまで読んで「ARMの茨には付き合いたくない」と感じたなら、素直にx86のVPSが早いです。ルートAの1分4秒も、A-5のメモリ実測も、KAGOYAのVPSで測ったものです。メモリは2GB以上のプランを選んでください


次に読む: Valheimサーバーを完全無料で立てる(Oracle Cloud無料枠 + box64)


質問・つまずきポイントはお問い合わせフォームからどうぞ。