麻雀サーバーの使い方

電脳麻将 ver.2.3.0ネット対戦 の機能を追加しましたが、麻雀サーバー の使い方を説明していませんでした。README だけでは説明が不十分と思ったので、補足記事を書くことにします。

麻雀サーバーを動作させるには Node.jsnpm が必要なので、あらかじめインストール*1しておいてください。

麻雀サーバーのインストール

npm でインストールします。

$ npm i -g @kobalab/majiang-server

電脳麻将のビルド

ネット対戦のフロントエンド側の機能(HTML/CSS/JavaScript)は電脳麻将にあるので、ダウンロードしてビルドします。

$ curl -L https://github.com/kobalab/Majiang/archive/master.tar.gz | tar xvfz -
$ cd Majiang-master
$ npm ci
$ npm run release

麻雀サーバーの起動

麻雀サーバーを起動します。電脳麻将をビルドしたディレクトリで以下のコマンドを実行します。

$ majiang-server -c /netplay.html -d dist

http://localhost:4615/netplay.html にアクセスすればネット対戦のページを表示します。

-p オプションで起動するポート番号を変更できます。以下のように実行すればWeb標準の80番ポートで起動するので、他にWebサーバが起動していなければ http://localhost/netplay.html でネット対戦できるようになるはずです*2

$ sudo majiang-server -p 80 -c /netplay.html -d dist

セッションを保存する

デフォルトではセッション情報をメモリで管理します。このままだと麻雀サーバーを再起動する度にログイン情報が失われますが、セッション情報をファイルに保存することも可能です。

$ mkdir session
$ majiang-server -c /netplay.html -d dist -s session

リバースプロキシの背後で使う

麻雀サーバーを外部に公開するのであれば、nginx によるリバースプロキシで運用した方がよいでしょう。nginx を使えばHTTPSの対応も容易になります。

kobalab.net では以下の設定でネット対戦を公開しています。

電脳麻将と設定ファイル・データファイルの配置

以下に配置しています。

ビルド済みの電脳麻将 /home/www/majiang/
認証設定 /home/www/majiang-server/auth/
セッション情報 /home/www/majiang-server/session/

認証設定については後述します。

majiang-server の起動方法

フロントエンド側の HTML/CSS/JavaScript の配信は nginx に任せ、麻雀サーバーはバックエンドの処理だけを担当します。起動オプションは以下となります。

$ majiang-server -c /netplay.html -o /home/www/majiang-server/auth/ \
    -s /home/www/majiang-server/session/

ですが、Linuxであれば systemd を使用してデーモンとして動作させるのが普通でしょう。/etc/systemd/system/majiang-server.service を以下のように記述します。

[Unit]
Description=Majiang Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Environment=LANG=ja_JP.UTF-8
ExecStart=/usr/local/bin/node /usr/local/bin/majiang-server -c /netplay.html -o /home/www/majiang-server/auth -s /home/www/majiang-server/session
Restart=always
User=koba
Group=koba

[Install]
WantedBy=multi-user.target

フルパス指定で起動させています。環境変数 LANGja_JP.UTF-8 を指定していますが、これは牌譜のタイトルに含まれる日時を日本人に馴染みのある形式にするためです。User / Group は環境に合わせて設定してください。root である必要はありません。

以下のコマンドで麻雀サーバーを常駐させます。

$ sudo systemctl enable majiang-server
$ sudo systemctl start majiang-server

nginx の設定

フロントエンド側の HTML/CSS/JavaScript の配信と、麻雀サーバーへのリバースプロキシ(WebSocketプロキシ)での接続を設定します。/etc/nginx/default.d/majiang.conf を以下のように設定しました。

location /majiang {
    alias   /home/www/majiang;
    charset utf-8;
    gzip on;
    gzip_types text/css application/javascript application/json;
}
location /majiang/server/ {
    proxy_pass http://127.0.0.1:4615/server/;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_redirect http://127.0.0.1:4615/ https://kobalab.net/majiang/;
    proxy_redirect / /majiang/;

    proxy_cookie_path / /majiang;

    gzip on;
    gzip_types text/plain text/css
               application/javascript application/json application/xml;
}

nginxを再起動します。

$ sudo systemctl restart nginx

外部認証を使う

麻雀サーバーは、はてなとGoogleのOAuth認証に対応しています*3。外部認証を使うにはそれぞれのサービスの「アプリ登録」が必要ですので、ご自分で登録をお願いします*4

はてな認証

http://www.hatena.ne.jp/oauth/develop でアプリ登録します。

登録すると OAuth Consumer KeyOAuth Consumer Secret が得られるので、これを /home/www/majiang-server/auth/hatena.json に設定します。

{
  "consumerKey": CONSUMER_KEY,
  "consumerSecret": CONSUMER_SECRET,
  "callbackURL": "https://kobalab.net/majiang/server/auth/hatena"
}

callbackURL には麻雀サーバーの /server/auth/hatena に転送されるURLを設定します。

Google認証

Google Cloud Platform でアプリ登録します。承認済みのリダイレクト URI には以下の2つを設定しました。

同様に client_idclient_secret*5が得られるので、これを これを /home/www/majiang-server/auth/google.json に設定します。

{
  "clientID": CLIENT_ID,
  "clientSecret": CLIENT_SECRET,
  "callbackURL": "https://kobalab.net/majiang/server/auth/google"
}

callbackURL には麻雀サーバーの /server/auth/google に転送されるURLを設定します。

設定したら麻雀サーバーを再起動します。

$ suro systemctl restart majiang-server

*1:macOSでのインストール手順Linuxでのインストール手順

*2:環境変数 PATH の指定が必要かもしれません

*3:認証には Express ミドルウェアの Passport を使用しています

*4:電脳麻将の登録情報は供与しません

*5:用語が違いますが、役割としては同じものです