DigitalOcean (Ubuntu 20.04) で Pa11y Dashboard を簡単に立ち上げる

特定の Web ページの Web アクセシビリティ状況を監視するような用途で使える 「Pa11y Dashboard」 をクラウドサービス 「DigitalOcean」 を利用して短時間でとりあえず立ち上げる方法について、古い情報が多く、日本語での情報も少なかったので簡単に書いてみました。

この記事は 「アクセシビリティ Advent Calendar 2021」 2日目の記事です。

Web アクセシビリティチェックツール 「Pa11y」 は過去この Blog でも何度か紹介していて、CI ツール版の 「Pa11y CI」 などはたくさんの Web ページに対して機械的なアクセシビリティチェックをさくっと実施したい場合なんかにとても便利でよく使っています。

で、この Pa11y には Web サービスとして動作し、特定の Web ページのアクセシビリティ状況を監視するような用途で使える 「Pa11y Dashboard」 というプロダクトが用意されていますが、長いこと Pa11y を使っていながら、この Pa11y Dashboard だけは使ったことがなかったので、今回試しに使ってみようということで、やってみた記録を簡単に。

目次

  • DigitalOcean で Pa11y Dashboard を立ち上げる

    DigitalOcean で Pa11y Dashboard を立ち上げる

    ということで、なるべく簡単に立ち上げたかったのでサーバをどうするかなと考えたときに、これも一度使ってみたいと思っていた DigitalOcean を今回は選択してみました。

    DigitalOcean は 「デベロッパー向けクラウドサービス」 と銘打ってサービスを提供していますが、その名の通り、とりあえず Web アプリケーションのテスト用にサーバを立てたいみたいなときにはコントロールパネルから数クリック操作するだけで Droplet (仮想サーバ) を数秒で立ち上げられるのと、今回私が利用した 「1 GB Memory / 1 AMD vCPU / 25 GB Disk」 という最も安価な構成なら 1時間当たり 0.009 ドル、月額 6 ドル程度で利用できるので非常に手軽で便利です。

    Droplet の立ち上げ

    DigitalOcean のアカウントは持っている前提で話を進めますが、ダッシュボードの 「Create」 メニューから 「Droplets」 に進み、利用したい OS イメージやプランなどを選択していきます。

    今回は Ubuntu 20.04 x64 を最も安いプランで立ち上げます。データセンターの場所はお好みでいいですが、試しにシンガポールを選択してみました。

    「Authentication」 はサーバへの接続方法ですが、普通に SSH を使用したい場合は 「SSH Key」 を選択します。今回はブラウザベースのコンソールが使用できる 「Password」 を選択しました (セキュリティ優先なら SSH を選択しましょう)。

    コンソールに接続する際のパスワードを設定したら、「Create Droplet」 を押せば、サーバが立ち上がります。

    サーバが立ち上がったら、「Access」 メニューなどからコンソール (Droplet Console) が立ち上げられますのでサーバに接続しましょう。必要なソフトウェアをインストールしていきます。

    Node.js のインストール

    まずはお決まりのやつ。

    apt update
    apt upgrade
    

    次に npm をインストールします。

    apt install npm

    次に、Node.js のバージョン管理に便利なので n をインストール。

    npm install -g n

    Pa11y Dashboard は Node.js 16 以降には対応していないため、今回は Node.js 14 の最新版をインストールします。

    n v14.18

    これで、14.18.2 (記事執筆時点) がインストールされました。

    node -v
    v14.18.2
    

    apt でインストールした状態だと古いバージョン (v6.x.x) の npm が入っていると思いますので、

    npm install -g npm

    して、最新の npm にしておきます。

    もしこの時、

    Error: Cannot find module 'semver'

    みたいな感じでエラーが帰ってきてうまく行かない場合は、下記を実行してパスを通すと多分うまく行きます。

    PATH="$PATH"

    MongoDB のインストール

    次に MongoDB をインストールします。Pa11y Dashboard は v4.4 以前の MongoDB のみサポートします。今回は Ubuntu 20.04 の標準リポジトリから普通にインストールしてしまいますが (v3.6 系が入ります)、より新しい 4.4 系をインストールする場合は 「MongoDB 4.4 系をインストールする場合」 セクションまで飛ばしてください。

    apt install mongodb

    これで、 v3.6.8 がインストールされました。

    mongo -version
    MongoDB shell version v3.6.8
    

    systemctl コマンドで MongoDB のステータスを確認。

    systemctl status mongodb

    立ち上がっていなかったら立ち上げて、さらにブート時に起動するように設定します。

    systemctl start mongodb
    systemctl enable mongodb
    

    一応接続テストしてみましょう。

    mongo --eval 'db.runCommand({ connectionStatus: 1 })'
    

    下記のように "ok" : 1 が帰ってくれば問題なし。

    MongoDB server version: 3.6.8
    {
            "authInfo" : {
                    "authenticatedUsers" : [ ],
                    "authenticatedUserRoles" : [ ]
            },
            "ok" : 1
    }
    

    MongoDB 4.4 系をインストールする場合

    MongoDB 4.4 系を使用したい場合は、まず下記のように公開 GPG キーをインポートします。

    curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    

    正常にインポートされると 「OK」 というレスポンスが帰ってくると思いますので、下記のコマンドを実行して apt に v4.4 系のリポジトリ情報を追加します。

    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    

    あとはインストールして、

    apt update
    apt install mongodb-org
    

    起動すれば完了です。

    systemctl start mongod.service
    systemctl enable mongod
    

    Pa11y Dashboard のインストール

    Pa11y Dashboard の公式リポジトリは下記ですので、そちらをそのまま使用する場合は、

    cd /opt/
    git clone https://github.com/pa11y/pa11y-dashboard.git
    cd pa11y-dashboard
    npm install
    

    とし、あとは設定ファイルを本番用に変更します。例えば公開環境用の設定ファイルを使用する場合は、

    cp config/production.sample.json config/production.json

    とした上で、

    vim config/production.json

    ポート番号だけとりあえず変更すればよいと思いますが、実際に稼働させると Puppeteer (Headless Chrome) に --no-sandbox がないとエラーが帰ってくるので、その指定も入れてあげます (一番最後の chromeLaunchConfig 部分です)。

    {
            "port": 80,
            "noindex": true,
            "readonly": false,
    
            "webservice": {
                    "database": "mongodb://localhost/pa11y-webservice",
                    "host": "0.0.0.0",
                    "port": 3000,
                    "cron": "0 30 0 * * *",
                    "chromeLaunchConfig": { "args": [ "--no-sandbox" ] }
            }
    }
    

    あと、ちょっと依存関係を解消しないといけないのと、Node.js アプリの実行状態を永続化したり、ログを管理したりするための PM2 をインストールしたりします。

    apt install -y libnss3 libgconf-2-4
    npm install pm2 -g
    

    ここまで行ったらほぼ終わり。あとは Node.js アプリを立ち上げます。

    cd /opt/pa11y-dashboard/
    NODE_ENV=production pm2 start index.js
    

    上記のようにきちんと Node.js アプリが立ち上がったら、サーバの IP アドレスにブラウザでアクセスすれば、Pa11y Dashboard の初期画面が表示されるはずです。

    あとは URL を登録して、

    「Run Pa11y」 を実行しましょう。

    リザルトページが表示されると思います。

    もし正しく動作しない場合は、PM2 のログを確認しましょう。例えば 「Run Pa11y」 を実行した時に HTTP 404 が帰ってくる場合は、Headless Chrome がうまく動作していない場合が多いです。

    pm2 log

    pm2 のログに依存関係のエラーが出ている場合などは必要なパッケージをインストールしましょう。例えば下記のように。

    apt install libatk1.0-0 libatk-bridge2.0-0 libgbm1 libcups2 libxkbcommon0 libxdamage1 libgtk-3-0
    

    URL の登録が終わったら、production.json の設定を変更して新規 URL の登録ができないようにしておきましょうね。

    cd /opt/pa11y-dashboard/
    vim config/production.json
    

    具体的には readonlytrue にします。

    {
            "port": 80,
            "noindex": true,
            "readonly": true,
    
            ...略...
    }
    

    Node.js アプリを再起動しましょう。

    pm2 restart all

    Pa11y Dashboard にベーシック認証を追加する

    Pa11y Dashboard は URL さえ知っていればダッシュボードにアクセスできちゃいますので、公開サーバで運用するには注意が必要です。基本的には必要な場合を除いて readonly モードにしておくのがよいですが、より安心にするため、今回は少し Pa11y Dashboard をカスタマイズしてベーシック認証を追加してみました。

    ベーシック認証の追加にあたっては下記の記事が参考になりました。

    まず必要なパッケージを追加します。

    cd /opt/pa11y-dashboard/
    npm install http-auth http-auth-connect
    

    次に、config.js を編集します。

    vim config.js
    

    下記の行の下に、

    module.exports = {
      port: Number(env('PORT', '4000')),
      noindex: env('NOINDEX', 'true') === 'true',
      readonly: env('READONLY', 'false') === 'true',
    

    下記の 2 行を追加します。

      username: env('USERNAME', null),
      password: env('PASSWORD', null),
    

    次に、app.js を編集します。

    vim app.js
    

    変更箇所は下記のような感じです。

    最後に、production.json にログイン用のユーザー名とパスワードを設定します。

    vim config/production.json
    

    サンプルのユーザー名とパスワードは適当なのできちんとしたものにしてくださいね。

    {
            "port": 80,
            "noindex": true,
            "readonly": true,
            "username": "user",
    	    "password": "pass",
    
            ...略...
    }
    

    Node.js アプリを再起動してダッシュボードにアクセスするとベーシック認証が有効になっているのがわかると思います。

    で、今回カスタマイズした Pa11y Dashboard は下記のリポジトリに上げています。参考までにどうぞ。

    ということで、とりあえず動作するところまでなら簡単にできました。あとは日本語化したり少し手を入れてみようかなと思います。

    関連エントリー

    上で少し触れましたけど、Pa11y Dashboard の日本語化を実際にやってみたので下記の記事で紹介しています。

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?