Factorioサーバーの構築

Table of Contents

Factorioサーバーの構築

概要

Factorio Version 2と追加modのSpace Ageが2024年10月21日についにリリースされた。1 すでにシングルでプレイされている工場長もいるだろうが、 本稿ではマルチプレイで楽しみたい工場長のために、 私の環境でのFactorioサーバーの構築手順を共有する。

紹介するサーバーの構成は次のようになっている。

%%{init:{'theme':'dark'}}%%
graph LR;

client --- internet((internet))
internet --- DNS[(cloudflare DNS)]
internet ===|PPPoE|router@{shape: cross-circ,label="a"}
internet ---|IPv6 IPoE|router2@{shape: cross-circ}

subgraph home[自宅]
  router === switch((switch)) 
  router2 --- switch
  switch ===nic((nic))
  subgraph host[ホスト]
    nic===|macvlan|container
    subgraph container[コンテナ]
      factorio
    end
  end
end
  

Tip

  • ホスト・コンテナともにUbuntu 24.04 LTSを利用している。
  • コンテナのマネージャーにはlxdを利用している。
    • 筆者の好みです。記事として一般受けを狙うにはdockerを使うべきでしょう。
  • PPPoEによる経路は現状ではfactorio専用の経路になっている。
    • この経路はルーターの設定よりDHCPを無効化してdefault routeの配信を止めています。
  • 私のメイン回線はMAP-EによるIPv6 IPoEを利用しているため、 任意のポートを開けることができない
    • ELECOMの無線ルーターでMAP-E環境下で開放可能なポートを用いて port fowardingを試みたが何故か動作しなかったため、 以前使っていたルーターを用いてデュアルルーター構成になっている

Warning

DHCPがなにかわからない人は同じネットワーク内にルーターを2台以上設置しないでください。 ネットワークが動かなくなる恐れがあります。

LXD,DNS,factorioの順で説明します。

lxd

lxdは、Linuxカーネルのコンテナ機能を利用するマネージャツールで 類似のものにdockerがあります。

セットアップ

セットアップ方法はlxd-jaを参照してください。なお、ストレージのバックエンドはbtrfsでフォーマットしたパーティションを用意することをおすすめします。

最初にマシンの立ち上げには次のようにコマンドを叩きます。

lxd launch ubuntu:24.04 factorio # factorioと銘打ったコンテナを立ち上げる

次にホストのブリッジとは別系統のインターフェイスを作成します。

まず、ホストでmacvlanの親となるインターフェイスの名称を調べます。

ip a # 親にするインターフェイス名を調べる
lxc config device add factorio eth1 nic nictype=macvlan parent=インターフェイス名

そして、IPと経路情報を割り当てます。

lxc shell factorio # rootとしてログインする
ip a # 一応現状のネットワーク構成を確認しておく
vi /etc/netplan/50-cloud-init.yaml
netplan apply # エラーが出ないこと
ip a # eth1にアドレスが割り当てられていること
ip r # デフォルトルートが変更されていること
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true # ホストのブリッジのネットワークはDHCPを使う
    eth1:
      dhcp4: false
      addresses:
      - 192.168.0.80/24 # 静的に割り当てるアドレス
      routes:
      - to: default
        via: 192.168.0.2 #ポート開放できるルータをデフォルトにする
      nameservers:
        addresses:
        - 192.168.0.2 
        - 192.168.0.1

続けてfactorioを動かすためのアカウントを作成しておきます。

adduser factorio

cloudflare DNS

自宅サーバーのIPアドレスを名前解決するためにcloudflareのDNSを用いて DDNSを設定した。すでに自宅サーバーを名前解決できる人やcloudflare以外の サービスでドメインを登録する予定の人は読み飛ばしてもらってください。

Info

お金をかけたくない人はルーターの製造元と提携しているDDNSサービスや 無料で使えるduckdnsを利用するといいかもしれません。

理由付け

まず、cloudflareのDNSを用いた理由としては、 このブログで利用しているドメインterurin.workはcloudflareで管理しており 別途ドメインを取得・管理するコストを抑えたかったためであり、 terurin.workのサブドメインからIPアドレスを引けるように設定している。

なお、今回のケースではfactorioサーバーが配置される場所は 一般家庭向けの回線であることから周知の通りIPアドレスが変化する恐れがある。 そこでIPアドレスの変化を通知するDDNSへの対応が必要となる。

手順

今回、DDNSの設定にはcloudflareの記事2で進められていたddclient3を 利用した。

セットアップ手順としては、最初にcloudflareのDNSレコードにドメイン名から IPv4を引けるAレコードを追加します。 この際、プロキシステータスを必ず無効にしてください

Info

プロキシステータスが有効にして名前解決を試みると、 自宅サーバーではなくcloudflareのサーバーのアドレスが引かれるようになります。

次にcloudflareのtokenを取得します。tokenは、次の場所から得られます。

  1. ユーザーアイコン
  2. マイプロフィール
  3. APIトークン
  4. グローバル API キー

そして、ddclientをセットアップします。

lxc shell factorio 
apt update && apt upgrade -y
apt install ddclinet -y # プロンプトにてcloudflareのユーザー名やtokenが聞かれる
vi /etc/ddclient.conf # サブドメインや更新頻度を設定する。
ddclient -query #動作確認
  • /etc/ddclient.conf
daemon=300 \
syslog=yes \ 
pid=/var/run/ddclient.pid \
protocol=cloudflare \
use=web, web=ipify-ipv4 \
zone=terurin.work, \
[email protected] \
password='xxxxxxxxxxxxxxxxxxxxxxxxxx' \
factorio.terurin.work

最後にサービスとして登録します。

systemctl start ddclient
systemctl enable ddclient

factorio

まず、factorioのheadless serverは factorio公式サイトからダウンロードして 適当な場所に展開します。

mkdir -p /opt/factorio # インストール先を作成しておく
wget https://www.factorio.com/get-download/2.0.32/headless/linux64 #バージョンは変化しているはず
tar -xf factorio-headless_linux_2.0.32.tar.xz
mv factorio-headless_linux_2.0.32/* /opt/factorio
chown -R factorio /opt/factorio #所有権をfactorio用のユーザーにしておく

次にfactorio用のユーザーで起動スクリプトと設定ファイルを作成します。

sudo -iu factorio
mkdir factorio
vi launch.sh
chmod +x launch.sh
cp /opt/factorio/data/server-settings.example.json server-settings.json
vi server-settings.json
./launch.sh #起動実験すること
  • launch.sh
#!/bin/bash
dir=$(cd $(dirname $0); pwd)
/opt/factorio/bin/x64/factorio --start-server ${dir}/space.zip \
--server-settings ${dir}/server-settings.json
  • server-settings.json
    • クローズな環境を作成するならgame_passwordは設定しておくこと

そして自動起動できるように管理者に戻り、systemdを設定します。

vi /etc/systemd/system/factorio.service
systemctl start factorio # エラーが出ないこと
systemctl enable factorio
  • factorio.service
[Unit]
Descriptionm = factorio daemon

[Service]
ExecStart = /home/factorio/factorio/launch.sh
Restart = always
Type= simple
User=factorio
Group=factorio

[Install]
WantedBy = multi-user.target

最後にfactorioの更新に備えて更新ツールを入れます。

sudo -iu factorio
cd factorio
wget https://raw.githubusercontent.com/narc0tiq/factorio-updater/refs/heads/master/update_factorio.py
chmod +x update_factorio.py

次のように更新します。

./update_factorio.py --apply-to /opt/factorio/bin/x64/factorio

では楽しい工場長ライフを!!