Oracle CloudのA1インスタンスでArk Serverを建てる

## 用意するもの

- Oracle CloudのA1インスタンス
    - OS: Ubuntu

## 手順

### 事前準備

1. インストール済みのパッケージをアップデートする

    ```bash
    sudo apt update; sudo apt full-upgrade -y
    ```

1. 必須パッケージをインストールする

    ```bash
    sudo apt install -y git build-essential cmake
    ```

### box86をインストール

1. ホームをカレントディレクトリにする

    ```bash
    cd ~
    ```

1. box86のプロジェクトをクローンする

    ```bash
    git clone https://github.com/ptitSeb/box86
    ```

1. 32bitのアーキテクチャを追加する

    ```bash
    sudo dpkg --add-architecture armhf
    ```

1. パッケージリストを更新する

    ```bash
    sudo apt update
    ```

1. 必須パッケージをインストールする

    32bit版のパッケージをインストールするように気をつける。

    ```bash
    sudo apt install -y gcc-arm-linux-gnueabihf libc6:armhf libncurses5:armhf libstdc++6:armhf
    ```

1. box86のプロジェクトに移動する

    ```bash
    cd ~/box86
    ```

1. `build`フォルダを作成、移動する

    ```bash
    mkdir build; cd build
    ```

1. box86をビルドする

    しばらく待つことになる。
    64bit OSの場合、[for Raspberry Pi on 64bit OS](https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md#for-raspberry-pi-on-64bit-os)を使用する。

    ```bash
    cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)
    ```

1. ビルドしたbox86をインストールする

    ```bash
    sudo make install
    ```

1. systemd-binfmtサービスを再起動する

    ```bash
    sudo systemctl restart systemd-binfmt
    ```

    サービスの再起動中にエラーが発生する場合はVMを再起動する。

    ```bash
    sudo reboot
    ```

### box64をインストール

1. ホームをカレントディレクトリにする

    ```bash
    cd ~
    ```

1. box64のプロジェクトをクローンする

    ```bash
    git clone https://github.com/ptitSeb/box64.git
    ```

1. box64のプロジェクトに移動する

    ```bash
    cd ~/box64
    ```

1. `build`フォルダを作成、移動する

    ```bash
    mkdir build; cd build
    ```

1. box64をビルドする

    しばらく待つことになる。
    公式の[for Other ARM Linux platforms](https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md#for-other-arm-linux-platforms)でビルドする。

    ```bash
    cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)
    ```

1. ビルドしたbox64をインストールする

    ```bash
    sudo make install
    ```

1. systemd-binfmtサービスを再起動する

    ```bash
    sudo systemctl restart systemd-binfmt
    ```

    サービスの再起動中にエラーが発生する場合はVMを再起動する。

    ```bash
    sudo reboot
    ```

### pip3でアップデートを実行

1. pip3をインストール

    ```bash
    sudo apt install python3-pip
    ```

1. pip3をアップデート

    ```bash
    sudo pip3 install --upgrade requests
    ```

### steamCMDをインストール

1. steamCMDをインストールするディレクトリを作成する

    ```bash
    mkdir ~/steamcmd; cd ~/steamcmd
    ```

1. steamCMDのインストール用スクリプトをダウンロードする

    ```bash
    curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
    ```

1. steamCMDのインストール用スクリプトを実行する

    ```bash
    ./steamcmd.sh +quit
    ```

### Ark Serverを設定する

1. arkのインストールディレクトリを作成する

    ```bash
    mkdir -p ~/ark_server
    ```

1. steamCMDのインストールディレクトリに移動する

    ```bash
    cd ~/steamcmd
    ```

1. Arkのデータをダウンロードする

    ```bash
    ./steamcmd.sh +force_install_dir ~/ark_server +login anonymous +app_update 376030 validate +quit
    ```

1. Ark Serverの起動スクリプトを作成する

    ```bash
    cd ~/ark_server/ShooterGame/Binaries/Linux/
    vi start.sh
    ```

    ```bash
    #! /bin/bash
    MAP="Fjordur"
    SERVERNAME="Ark Server"
    MAXPLAYERS="70"
    SERVERPW=""
    ADMINPW=""
    PORTGAME="7777"
    PORTQUERY="27015"
    RCONON="true"
    PORTRCON="27020"
    RCONPW=""

    screen -DmS ark ./ShooterGameServer $MAP?listen?SessionName="$SERVERNAME"?MaxPlayers=$MAXPLAYERS?ServerPassword=${SERVERPW}?ServerAdminPassword=$ADMINPW?Port=$PORTGAME?QueryPort=$PORTQUERY?RCONEnabled=$RCONON?RCONPort=$PORTRCON?PreventDownloadSurvivors=False?PreventDownloadItems=False?PreventDownloadDinos=False?PreventUploadSurvivors=False?PreventUploadItems=False?PreventUploadDinos=False?noTributeDownloads=False -nosteamclient -server -log
    ```

    ```bash
    chmod +x start.sh
    ```

1. サービスとして設定する

    ```bash
    sudo vi /etc/systemd/system/ark-dedicated.service
    ```

    ```ini
    [Unit]
    Description=ARK: Survival Evolved dedicated server
    Wants=network-online.target
    After=syslog.target network.target nss-lookup.target network-online.target

    [Service]
    Group=ubuntu
    User=ubuntu
    ExecStartPre=bash /home/ubuntu/steamcmd/steamcmd.sh +login anonymous +force_install_dir /home/ubuntu/ark_server/ +app_update 376030 +quit
    ExecStart=bash /home/ubuntu/ark_server/ShooterGame/Binaries/Linux/start.sh
    WorkingDirectory=/home/ubuntu/ark_server/ShooterGame/Binaries/Linux
    LimitNOFILE=100000
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s INT $MAINPID

    [Install]
    WantedBy=multi-user.target
    ```

1. サーバーを起動する

    ```bash
    sudo systemctl daemon-reload
    sudo systemctl start ark-dedicated.service
    ```

1. サーバーを停止する

    ```bash
    sudo systemctl stop ark-dedicated.service
    ```

1. 設定を変更する

    以下のディレクトリにある`GameUserSettings.ini`と`Game.ini`を編集する

    ```bash
    cd ~/ark_server/ShooterGame/Saved/Config/LinuxServer
    ```

1. サーバーを起動する

    ```bash
    sudo systemctl start ark-dedicated.service
    ```

#### Modを導入する場合

1. サーバーを停止する

    ```bash
    sudo systemctl stop ark-dedicated.service
    ```

1. ark-server-toolsをインストールする

    ```bash
    curl -sL https://git.io/arkmanager | sudo bash -s ubuntu
    ```

1. arkのインストールディレクトリを指定する

    `arkserverroot`に`/home/ubuntu/ark_server`を指定する

    ```bash
    sudo vi /etc/arkmanager/instances/main.cfg
    ```

    ```bash
    arkserverroot="/home/ubuntu/ark_server"    # path of your ARK server files (default ~/ARK)
    ```

1. modをインストールする

    ```bash
    arkmanager installmod <mod id>[,<mod id>[,…​]]
    ```

1. 設定を変更する

    `ActiveMods`に有効化するModのIDを指定する

    ```bash
    vi ~/ark_server/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini
    ```

    ```ini
    ActiveMods=<mod id>[,<mod id>[,…​]]
    ```

1. サーバーを起動する

    ```bash
    sudo systemctl start ark-dedicated.service
    ```

### サーバーに接続する

1. steamの「表示」－「サーバー」を開く
1. 「サーバーを追加」を押す
1. `<IPアドレス>:<ポート番号>`になるように入力する
1. 「このアドレスをお気に入りに追加」を押す
1. Arkを起動する
1. サーバー検索で「お気に入り」を選んで自分のサーバーを表示する
1. 接続して楽しむ

## 参考

- [Setting up a Valheim Server on the Raspberry Pi](https://pimylifeup.com/raspberry-pi-valheim-server/)
- [for Raspberry Pi on 64bit OS](https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md#for-raspberry-pi-on-64bit-os)
- [for Other ARM64 Linux platforms](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md#for-other-arm64-linux-platforms)
- [ARK: Survival Evolved linux サーバーの立て方](https://www.yukkuriikouze.com/2020/03/11/3567/)