目次
- この記事で得られること
- まず選ぶ: どこにサーバーを置くか
- Core Keeperはポート開放が不要
- ルートA: x86のVPSに公式手順で立てる
- A-1. SteamCMDの準備
- A-2. サーバー本体のダウンロード(公式コマンド)
- A-3. 公式ドキュメントの「つまずき」は起きませんでした
- A-4. 起動
- A-5. どのくらいのスペックが要るのか
- ルートB: Oracle Cloud無料ARM枠にDockerで立てる
- なぜARMだと面倒なのか
- B-1. Dockerのインストール
- B-2. compose.yaml の作成
- ★ ARM64_DEVICE は generic でいい
- 補足: なぜ USE_DEPOT_DOWNLOADER=true が要るのか
- Game IDと接続
- ⚠️ Game IDは実質パスワードです
- 鍵を2枚にする: パスワードを設定する
- 設定リファレンス
- 主な設定項目
- その他の環境変数(Dockerイメージ)
- Modが使えます
- 運用
- ルートA: systemdに登録して常駐させる
- ルートB: Dockerは何もしなくて常駐します
- セーブデータの場所とバックアップ
- ローカルのワールドを持ち込む
- トラブルシューティング
- まとめ
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 Pi | ARMなら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を使って建てました。スマートフォンのテザリング経由=自宅回線の外からでも接続できました。

⚠️ 公式ドキュメントによると、
-port-password-ipの3つはコマンドライン専用です。ServerConfig.jsonに書いても無視されます。ここは実際に引っかかりやすい箇所です。
ルートA: x86のVPSに公式手順で立てる
Dockerもエミュレーションも使いません。公式の手順がそのまま通ります。
前提は「SSHでログインできるUbuntuサーバーがあること」だけです。
検証した環境はこちらです。以下の実測値はすべてこの構成のものです。
| 項目 | 内容 |
|---|---|
| VPS | KAGOYA CLOUD VPS(1コア/1GB → 2コア/2GB の両方で測定・SSD 96GB) |
| OS | Ubuntu Server 24.04.4 LTS(カーネル 6.8.0) |
| クライアント | Windows 11 |

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 に移動してから決定してください。

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秒でした。

置かれる場所はここです。公式ドキュメントの説明と違いました。
~/.local/share/Steam/steamapps/common/Core Keeper Dedicated Server/ ← 653MB
~/.local/share/Steam/steamapps/common/Steamworks SDK Redist/ ← 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とクォート無しで書かれているため、空白を含むパスを渡すと途中で分解されます。
起動時の挙動ですが、
勝手にパッケージを入れにきます。 このスクリプトは libxi6 と xvfb が無いと 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
これが出れば起動成功です。

⚠️ ただし、このままSSHを切るとサーバーは止まります。 フォアグラウンドで動かしているので、ターミナルを閉じた時点で落ちます。24時間動かすには後述の「運用」でsystemdに登録してください。
A-5. どのくらいのスペックが要るのか
ここが一番知りたいところだと思うので、1GBと2GBの両方で実測しました。
| 1GBプラン(1コア) | 2GBプラン(2コア) | |
|---|---|---|
| サーバーのメモリ使用(RSS) | 685MB | 1.5GB |
| スワップ使用量 | 931MB | 0 |
| 空きメモリ | 69MB | 319MB |
| CPU使用率 | 20% | 20〜23% |
| 体感 | もっさりする | 引っかからない |
※ どちらもプレイヤー1人・同じワールドでの測定です

1GBでは足りません。
面白いのは、1GBのときの 685MBが「使いたい量」ではなかったことです。2GBに増やすと、同じワールドで 1.5GB 使いました。入りきらないぶんが追い出されていただけで、本当に要るのは1.5GB前後だったわけです。
だから1GBでは、プレイヤーがたった1人でも931MBがスワップへ逃げます。物理メモリの空きは69MB。実際に遊ぶと、移動中にはっきり引っかかります。

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_DEVICE は generic でいい
Oracle Cloudなら adlink。**イメージのドキュメントは、指示しています。**が、無視してgenericでいいです。
box64を選んでいるのは、土台の sonroyaalmerol/steamcmd-arm64 の box64.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)

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。その結果こうなります。
- SteamCMDが落ちる(=サーバー本体はダウンロードされていない)
- ラッパーが「成功」を返す
- セットアップ処理はエラーに気づかず先へ進む
- 起動しようとして初めて
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行だけです。

ネット上には「ホスト側で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 | -worldname | Core Keeper Server | サーバー表示名 |
WORLD_INDEX | -world | 0 | ワールドインデックス |
WORLD_SEED | -worldseed | ランダム | ワールドのシード |
WORLD_MODE | — | 0 | 0=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 | -ip | 0.0.0.0 | 待ち受けアドレス(CLI専用) |
| — | -datapath | 既定パス | セーブの保存先 |
その他の環境変数(Dockerイメージ)
| 変数 | 内容 |
|---|---|
MODS_ENABLED / MODIO_API_KEY / MODS | mod.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特有の書き方をしています。
ExecStart で bash -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/ へ置き、ファイル名の番号に合わせて -world(WORLD_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 found | compose.yaml に USE_DEPOT_DOWNLOADER=true があるか確認(B-2) |
permission denied ... docker.sock | SSHを入り直す(usermod の反映) |
no configuration file provided | cd ~/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)
質問・つまずきポイントはお問い合わせフォームからどうぞ。