オンラインWeb対局時計（myokoym/webchessclock）構築メモ

# 背景
ドミニオンというボードゲームを御存じでしょうか。ボードゲーム界におけるデッキ構築システムの金字塔で、第一版の発売から約14年が経った今も拡張が発売され続けている長寿コンテンツです。元はアナログゲームでしたが、現在はオンラインで遊べる[Dominion Online](https://dominion.games/)なども運営されています。

さて、このDominion Onlineにはひとつ気になる仕様があります。それはプレイヤーに対してプレイ時間の制限がほぼ無いことです。そのためプレイングの速さはマナーで成り立っており、早い人と遅い人がマッチングしたりするとちょっとギクシャクする点が惜しい所です。

そこで今回は仲間内でDominion Onlineを遊ぶときに使えるWeb対局時計(myokoym/webchessclock)を立ち上げてみました。本ページではその構成要素と構築手順を整理しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/7b5516ad-2f0e-6851-b73f-a71cc4cd6b49.png)

# システム構成
私的利用のため最低限の構成で立ち上げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/8533905a-8cc7-d964-50ee-56bdfe6e3273.png)

## myokoym/webchessclock
@myokoym 氏作製の対局時計（チェスクロック）。複数人がインターネット経由で操作可能なWebアプリとなっています。こちらはMITライセンスで配布されており誰でも利用することが可能となっています。Awesomeですね。

今回はこちらのアプリをさくらVPSサーバ上で立ち上げることでChromeなどのWebブラウザからインターネット経由で参照可能とすることを目指しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/3791c003-c62d-0677-6ab8-df11267751d2.png)

# 作業詳細

## さくらVPS
老舗のサーバ屋さん。月額固定制でLinuxのWebサーバがサクッと手に入ります。今回の用途であれば最安構築（2023/1現在は月額600円程度）で問題ないでしょう。私の様なAWSなどの従課金サーバに慣れていない人には使いやすいサービスです。
[参考：さくらVPSトップページ](https://vps.sakura.ad.jp/)

## CentOS 7
アプリはCentOS 7で問題なく稼働しました。さくらVPSであればサーバ生成時に選択肢から選ぶだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/b5117e3d-4a7b-98f0-35ed-ce7c56727a7c.png)

## Git
GitHubからmyokoym/webchessclockをcloneしてくるためにサーバへGitをインストールします。
さくらVPSのCentOS7にはyumがプリインストールされているので「yum install git-all」するだけです。
[参考：1.5 使い始める - Gitのインストール](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

## Redis
### インストール
myokoym/webchessclockではデータIOにRedisを利用しているためこちらもインストールします。
以下の参考サイトではEPELリポジトリを追加していますが、「yum search redis」した所デフォルトでインストール可能なRedisが存在するため特にそのまま「yum install -y redis」でインストールしました。
[参考：Redis を CentOS 7 に yum インストールする手順](https://weblabo.oscasierra.net/redis-centos7-install-yum/)

### 実行
「systemctl start redis」で実行です。実行したら「systemctl status redis」で状態がactiveになっていることを確認しましょう。

## Node.js
こちらも今回は「yum install nodejs」するだけです。
[CentOS 7.5 に Node.js 12 系の最新版を yum インストールする](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3272)

## myokoym/webchessclock
ここまでの手順でwebchessclockアプリを実行するための環境が整いました。次にアプリ本体をダウンロード＆起動してみます。

1. https://github.com/myokoym/webchessclock よりclone URLを取得
1. さくらVPSサーバ内の適当な所にアプリの置き場所を適当に作成（/usr/ketman/gitとか）
1. 作製した置き場所にcdで移動して「clone https://github.com/myokoym/webchessclock.git 」を実行
1. ReadMeにある通りビルド
    1. ＃ install dependencies
    1. $ npm install
    1. ＃ build for production and launch server
    1. $ npm build
1. ReadMeにある通り実行
    1. $ npm run start

特に問題なければhttp://localhost:3000 でアプリが立ち上がると思います。

## 外部からのアクセスを許可する
立ち上げたアプリですが、このままではインターネット経由で外部からアクセス出来ません。
今回はnginxで外部からのアクセスポート（80番）を受け付けてwebchessclockのポート（3000番）へ繋ぐことにしました。

### nginx
こちらも今回は「yum install nginx」するだけです。
[参考：Nginx を CentOS 7 にインストールする手順](https://weblabo.oscasierra.net/nginx-centos7-install/)

### ファイアーウォールの設定
理由は判りませんでしたが初期状態でファイアウォールが落ちていたので立ち上げ直しました。
[参考：「FirewallD is not running」の対処法](https://ysklog.net/server/1155.html)

立ち上げ後「firewall-cmd --zone=public --add-service=http --permanent」でhttp通信を許可しておきます。

### さくらVPSの設定
さくらVPSでは初期設定の状態では80番ポート（外部からインターネット経由でサーバにアクセスする際の標準ポート）が許可されていません。GUIを操作してパケットフィルターを追加してあげる必要があります。ここ気が付かなくてちょっとはまりました・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/08987d98-2bdb-33cf-5d8c-3ca4674fb3a7.png)

### ポート80→3000へリバースプロキシの設定を追加する
/etc/nginx/conf.d/配下にdefault.confを作成して外部アクセス（80番）をwebchessclock（http://localhost:3000 ）に繋いであげます。
[参考：nginxを使ってnode.jsをWeb上に公開する](https://tech-waplus.com/programming/20190410-nginx-node-js-web/)
```conf
server {
 client_max_body_size 50M;
 listen 80;
 server_name ※サーバのホスト名（hogehoge.vs.sakura.ne.jpなど）;
 location / {
  proxy_pass http://localhost:3000;
 }
}
```

### 補足：80番ポートがhttpdと競合する
ここまでの設定で進めると、OSにデフォルトで入っているhttpdとポート80番が競合します。そのためhttpdかnginxのどちらも起動させようとすると後に起動させた方が失敗します。httpdは使わないので停止させればOKです。または、httpdのconfファイルに記載されているポートを80から別の値に変更しておくと良いでしょう。

# 実行結果
http://(ホスト名)でブラウザからアクセスしてみましょう。アプリが表示されればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/3791c003-c62d-0677-6ab8-df11267751d2.png)


# おわりに
Dominion Onlineで利用可能なWeb対局時計を立ち上げてみました。
これを使って長考癖プレイヤー同士での矯正練習や、東西戦の様な多人数参加型の企画を現実的な時間内で収める工夫などが考えられますね！

なおソースコードをいくらか自分でデバッグして使うことを覚悟していたのですが、全く変更することなくデフォルトで動いてくれたことに感激しました。末筆ながらアプリ製作者の@myokoym 氏に感謝致します。