本チュートリアルでは Resonite ヘッドレスサーバを載せる GCE インスタンスが稼働するネットワークを構築します
下記を構築、設定します
VPC ネットワーク
ネットワークファイアウォール
右側の Cloud Shell
へコピーするボタンをクリックし、ターミナルで Enter を押してください
インフラ構築用の環境変数を読み込みます
source ~/resonite-headless-infra/scripts/env-headless-server.bash
環境変数が設定されたことを確認します
echo -e "RESONITE_HEADLESS_ENVIRONMENT=${RESONITE_HEADLESS_ENVIRONMENT}" \\n "VPC_NAME=${VPC_NAME}" \\n "SUBNET_NAME=${SUBNET_NAME}" \\n "REGION=${REGION}" \\n "SUBNET_RANGE=${SUBNET_RANGE}" \\n "RESONITE_HEADLESS_SERVER_INSTANCE_NAME=${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}" \\n "IMAGE_PROJECT=${IMAGE_PROJECT}" \\n "IMAGE_FAMILY_SCOPE=${IMAGE_FAMILY_SCOPE}" \\n "IMAGE_FAMILY=${IMAGE_FAMILY}" \\n "ZONE=${ZONE}" \\n "SETUP_RESONITE_HEADLESS_SERVER_SCRIPT=${SETUP_RESONITE_HEADLESS_SERVER_SCRIPT}" \n "MACHINE_TYPEt=${MACHINE_TYPE}"
編集する時は
Cloud Shell Editor で編集してください(初回は編集しないで進めましょう)
edit ~/resonite-headless-infra/scripts/env-headless-server.bash
gcloud コマンドを使用してヘッドレスサーバのインフラを構築していきます。 事前に gcloud CLI の構成を設定します
PROJECT_NAME=$(gcloud config list --format="value(core.project)")
gcloud config set project ${PROJECT_NAME}
gcloud config set compute/zone ${ZONE}
gcloud config set compute/region ${REGION}
VPC を作成します
gcloud compute networks create ${VPC_NAME} --subnet-mode custom --mtu=1500
VPC が作成されたことを確認します
gcloud compute networks list --filter="name=${VPC_NAME}"
作成したVPCネットワークにリージョンとサブネットを割り当てます
gcloud compute networks subnets create ${SUBNET_NAME} \
--network ${VPC_NAME} \
--region ${REGION} \
--range ${SUBNET_RANGE} \
--enable-private-ip-google-access
サブネットが割り当てられたことを確認します
gcloud compute networks subnets list --filter="name=${SUBNET_NAME}"
IAP から VPC ネットワークへのアクセスを許可します
gcloud compute firewall-rules create \
allow-iap-forwarding-to-resonite-headless \
--direction=INGRESS \
--priority=1000 \
--network=${VPC_NAME} \
--allow=tcp:22,tcp:80,tcp:443,tcp:8080,icmp \
--source-ranges=35.235.240.0/20
ヘッドレスサーバの forcePort へのアクセスを許可します
gcloud compute firewall-rules create allow-resonite-headless-forceport \
--target-tags=${FIREWALL_TAG_NAME} \
--direction=INGRESS \
--priority=1000 \
--network=${VPC_NAME} \
--allow=udp:49151-49160 \
--enable-logging \
--source-ranges=0.0.0.0/0
ファイアウォールルールが作成されたことを確認します
gcloud compute firewall-rules list --filter="NOT(name:default)"
ヘッドレスサーバの設定ファイル Config.json
を Secret Manager
に格納します。
カレントディレクトリをクローンしたリポジトリに変更します
REPOSITORY_DIR="${HOME}/resonite-headless-infra" && cd ${REPOSITORY_DIR}/config/
Config.json が存在することを確認する
HEADLESS_CONFIG_FILE=Config.json && ls -l ${HEADLESS_CONFIG_FILE}
Config.json
を編集します ※Ctrl+s で上書き保存する
edit ${HEADLESS_CONFIG_FILE}
インスタンス名をシークレット名の変数に入れます(インスタンス名は resonite-headless-server)
HEADLESS_CONFIG_SECRET=${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} && echo ${HEADLESS_CONFIG_SECRET}
ヘッドレスの config ファイルを Secret Manager に格納します
gcloud secrets create ${HEADLESS_CONFIG_SECRET} --data-file ${HEADLESS_CONFIG_FILE}
シークレットに格納されたことを確認します
gcloud secrets versions list ${HEADLESS_CONFIG_SECRET}
シークレットの内容を出力します
gcloud secrets versions access latest --secret ${HEADLESS_CONFIG_SECRET}
GCE インスタンスに紐づく Google Service Account を変数に入れます
GSA=$(gcloud projects describe $(gcloud config get-value project) --format="value(projectNumber)")-compute@developer.gserviceaccount.com && echo ${GSA}
作成したシークレットに対して IAM ポリシーバインディングを設定します
gcloud secrets add-iam-policy-binding ${HEADLESS_CONFIG_SECRET} --member serviceAccount:${GSA} --role roles/secretmanager.secretAccessor
シークレットへのアクセス権限を確認します
gcloud secrets get-iam-policy ${HEADLESS_CONFIG_SECRET}
カレントディレクトリをスクリプトが配置されたディレクトリに変更し OS セットアップファイルのテンプレートがあることを確認します
cd ${REPOSITORY_DIR}/scripts/ && ls -l setup-config.yaml.template
ヘッドレスサーバを作成する為に必要な情報を編集します
edit personal-information.json
# 編集内容
{
"HEADLESS_PASSWORD": "フレンド欄の resonite に /headlessCode とメッセージを送って返ってくる文字列",
"STEAM_USER": "ヘッドレスサーバ用に作成した Steam アカウント名",
"STEAM_PASSWORD": "Steam アカウントのパスワード",
"HEADLESS_USER": "ヘッドレスサーバ用に作成した Resonite ユーザ名"
}
GCE インスタンスを作成する為の設定ファイルを生成します
python gce_cloudinit_yaml_generator.py
#cloud-config
で始まるファイルが生成された事を確認します
edit setup-config.yaml
GCE インスタンスを作成します
gcloud compute instances create ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} \
--tags=${FIREWALL_TAG_NAME} \
--image-project=${IMAGE_PROJECT} \
--image-family=${IMAGE_FAMILY} \
--image-family-scope=${IMAGE_FAMILY_SCOPE} \
--machine-type=${MACHINE_TYPE} \
--subnet=${SUBNET_NAME} \
--metadata-from-file=user-data=${SETUP_RESONITE_HEADLESS_SERVER_SCRIPT} \
--network-tier=STANDARD \
--scopes cloud-platform
GCE インスタンスが作成され、ステータスが Running であることを確認します
gcloud compute instances describe ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} --format="value(status)"
5分程待てば、ヘッドレスサーバが起動しているはずです。クライアントから参加できるか確認してみてください
問題がなければインスタンスを停止しましょう
gcloud compute instances stop ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
以上です。お疲れさまでした。
OS にログインして、GCE インスタンスの OS セットアップが完了しているかどうかを確認します
SSH で GCE インスタンスへログインします
gcloud compute ssh --tunnel-through-iap ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}
以下のようなメッセージが出ますが、全て Enter を押して問題ありません
WARNING: The private SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/${HOME}/.ssh] before being able to generate SSH keys.
Do you want to continue (Y/n)? ← Enter で良い
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): ※ ssh が使う秘密鍵のパスフレーズを要求されるが入力しなくても良い。鍵を削除し gcloud compute ssh 実行すればを再作成される
Enter same passphrase again:
Your identification has been saved in /home/${HOME}/.ssh/google_compute_engine
~省略~
Waiting for SSH key to propagate.
~省略~
/root/INITIALIZED
というファイルが存在していればセットアップが完了しています
sudo ls -l /root/INITIALIZED
INITIALIZED
が存在していなかった場合、ログを確認し、エラーが出ていた場合は出力メッセージを元にして調査をします
エラーが出ていない場合は command.log
を tail して Succeeded.
と表示されるまで待ちます
sudo tail -f /root/command.log
成功した際のログ出力例
root@resonite-headless-server:~# tail -f command.log
2025-12-03 19:54:29 Start Scrpt
2025-12-03 19:54:30 Executed: sudo apt update
2025-12-03 19:54:41 Executed: sudo apt install -y software-properties-common
2025-12-03 19:54:47 Executed: sudo add-apt-repository -y multiverse
2025-12-03 19:54:47 Executed: sudo dpkg --add-architecture i386
2025-12-03 19:54:57 Executed: sudo add-apt-repository -y ppa:dotnet/backports
2025-12-03 19:54:59 Executed: sudo apt update
2025-12-03 19:54:59 Executed: echo steam steam/license note "" | sudo debconf-set-selections
2025-12-03 19:54:59 Executed: echo steam steam/question select "I AGREE" | sudo debconf-set-selections
2025-12-03 19:55:25 Executed: sudo apt install -y lib32gcc-s1 curl libopus-dev libopus0 opus-tools libc-dev tmux dstat powerline gnupg ca-certificates vim dotnet-runtime-9.0 steamcmd
2025-12-03 19:55:26 Executed: curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
2025-12-03 19:55:51 Executed: sudo bash add-google-cloud-ops-agent-repo.sh --also-install
2025-12-03 19:55:52 Executed: sudo apt autoremove -y
2025-12-03 19:55:52 Executed: echo steam steam/license note | sudo debconf-set-selections
2025-12-03 19:55:52 Executed: echo steam steam/question select "I AGREE" | sudo debconf-set-selections
2025-12-03 19:55:53 Executed: sudo apt install -y steamcmd
2025-12-03 19:57:07 Executed: sudo -u USER /usr/games/steamcmd +login STEAMUSER STEAMPASSWORD +app_license_request 2519830 +app_update 2519830 -beta headless -betapassword BETAPASSWORD validate +exit
2025-12-03 19:57:07 Executed: export RESONITE_HEADLESS_DIR="/home/go_yamada4649/.local/share/Steam/steamapps/common/Resonite/Headless"
2025-12-03 19:57:07 Executed: systemctl daemon-reload
2025-12-03 19:57:13 Executed: systemctl --now enable resonite-headless.service
2025-12-03 19:57:13 Executed: sudo touch ~/INITIALIZED
2025-12-03 19:57:13 Succeeded.
ヘッドレスサーバの Unit の状態を確認をします。ログの一部を確認できます
systemctl status resonite-headless.service
ヘッドレスサーバの Config.json を確認し、問題があれば修正します
HEADLESS_CONFIG_FILE=${RESONITE_HEADLESS_DIR}/Config/Config.json
nano ${HEADLESS_CONFIG_FILE}
ヘッドレスサーバを再起動します
sudo systemctl restart resonite-headless.service
GCE インスタンスのシェルから抜ける
exit
以上