アプリケーションの設定

バーチャルポスターセッションはウェブアプリケーションとして実装されています。

ソースコード: GitHub

クライアントはウェブブラウザ(Chrome, Firefox, Safari)のみで動作し,特別なソフトウェアのインストールは不要です。
サーバーサイドに必要なものは,以下の2つです。
  • Node.js, PostgreSQL, Redisが動作するサーバー(Amazon Web Servicesなど)
  • Firebase Authentication (Google Cloud Platform; ユーザー認証に使用)

サーバーの概要

  • サーバーはAPIサーバーとソケット(Socket.IO)サーバーの2つから構成されます。
    • Fastifyフレームワークを用いたNode.js上で動作するREST APIサーバー
    • Socket.IOを用いたNode.js上で動作するソケットサーバー
  • 共有のデータベースとして,PostgreSQLおよびRedisを使用します。
  • それぞれ異なるポートにおいて待ち受けた上で,ロードバランサ(Amazon Application Load BalancerやNginxなど)でパス毎に通信を割り振ります。
  • APIサーバーとソケットサーバーはRedisのPub/Subを介して通信します(npmのsocket.io-redisパッケージを使用)。
  • clusterモジュールを利用して複数プロセス(ワーカー)を起動することが可能です(下記のapp_config.yamlにおいて,clusterオプションにワーカー数を記入)。

Amazon Web Services (AWS)の構成例

AWSを利用する際の構成例を以下に示します。

上記の構成が,AWSの無料使用枠(Ubuntu 18.04; t2.micro EC2インスタンス, db.t2.micro S3インスタンス)で動作することを確認済みです(※ ただし,下記のビルド・起動のセクションを参照)。

CloudFrontにおいて,下記のようにBehaviorを割り振ります。

  • /api/* → APIサーバー
  • /socket.io/* → ソケットサーバー
  • /files/* → S3バケット
  • デフォルト → APIサーバー

このように構成することで,ユーザーからは同一のドメインへのHTTPS通信としてアクセスが可能になります。

CloudFrontとALBにドメイン名を設定(Route 53を使用)し,TLS証明書を設定します(AWS Certificate Managerを使用)。

APIサーバー,ソケットサーバー,適切なセキュリティグループ,インバウンドルールを設定しておきます,

サーバー設定ファイル

app_config.yamlファイルに記入してください。 app_config.example.yamlファイルをひな形として app_config.yamlにコピーして,すべての項目に適切な値を入力する必要があります。主な設定項目は,下記の通りです。
  • アプリケーションのドメイン名
  • APIサーバーの待受けポート,TLSの有無,ワーカー数
  • ソケットサーバーの待受けポート,TLSの有無,ワーカー数
  • AWSのアクセスキー,S3のバケット名,CloudFrontのdistribution ID
  • Firebase authenticationの認証情報のJSONファイルのパス
下記に,全設定項目を示します。

app_config.yamlファイルの内容

domain: app.example.com    # ユーザーがアクセスするドメイン名
api_server:                # APIサーバーの設定
  port: 3000               # ポート
  tls: false               # TLSの有無
  http2: false             # HTTP2の使用(true: HTTP2, false: HTTP1.1)
  cluster: 0               # 複数ワーカーの使用(0: オフ, 1以上: ワーカー数)
  debug_log: true          # デバッグログの使用
socket_server:             # ソケットサーバーの設定(APIサーバーと同様)
  port: 5000
  tls: false
  http2: false
  cluster: 0
  debug_log: true
default_rooms:             # 新規ユーザーがデフォルトで入室可能な会場のID一覧
  - Rxxxxxxx
certificate_folder: /etc/letsencrypt/live/YOUR_DOMAIN.com  # (TLSを使用する場合)証明書の格納フォルダ
postgresql: postgres://postgres@localhost/virtual_poster   # PostgreSQLの接続文字列
redis: redis://localhost:6379                              # Redisの接続文字列
aws:
  access_key_id: xxxxxxxxxxx      # AWS Key ID
  secret_access_key: xxxxx        # AWS アクセスキー
  region: ap-northeast-1      # AWSリージョン
  s3:
    upload: true                  # S3へのポスター画像をアップロード ON/OFF
    bucket: BUCKET_NAME           # S3バケット名
    via_cdn: true                 # S3へのアクセスにCloudFrontを経由
  cloud_front:
    id: DISTRIBUTION_ID           # CloudFrontのdistribution ID
    domain: app.example.com       # CloudFrontのドメイン名(通常上記のdomainと同じ)
    key_pair_id: XXXXXX                   # CloudFrontのキーペアID
    private_key: ./cloud_front_priv.pem   # CloudFrontの秘密鍵
firebase_auth_credential: xxxxx.json    # Firebase Authenticationの認証情報のJSONファイルのパス
email:
  enabled: true
  domain: YOUR_EMAIL_DOMAIN.com
  max_rate_per_sec: 1
  max_rate_per_day: 50
  max_rate_user_per_hour: 1
profile_keys:
  - url
  - url2
  - url3
  - display_name_full
  - affiliation
cookie_expires: 10080
user_registration: true       # 管理者の事前登録なしのユーザー自身による登録を許可する
debug_token: xxxxx          # デバッグ用のパスワード
説明
  • CloudFront,ALBを用いる際は,それらにTLS終端を設定するので,HTTP2無し,TLS無し(false)でOKです。
  • ワーカー数は通常,APIサーバーとSocketサーバーをあわせてCPUコア数以下に設定します。
  • aws:の項目はAWSを使用しない場合は適当な値を入力しておきます(aws.s3.uploadがfalseの場合,aws以下の値は使用されません)。

ビルド・起動

  1. yarn buildでビルド。サーバーのコードはdist_server/serverに,クライアントのコードはdistにそれぞれ生成される。
  2. (EC2上でRedisを使用する場合)sudo systemctl start redis-serverでRedisを起動
  3. forever start dist_server/index.js && forever start dist_server/socket_index.js でAPIサーバー,ソケットサーバーを起動
  4. 終了したいときは,forever stopallを実行。
ただし,上記のt2.micro EC2インスタンス(1GB RAM)を利用する場合,ビルド時にRAMが不足するため途中で止まってしまいます。そのため,ビルドをローカル環境で行い(yarn buildを実行),生成されたdistおよびdist_serverフォルダをscpやrsyncを用いてサーバーにアップロードしてください。

サポート

不明な点がある場合や,サーバー設定にサポートが必要な場合には,作者(甲斐洋行; メール kai [アット] tohoku.ac.jp)までご連絡ください。可能な範囲で対応させていただきます。