序章

Etherpadは、ブラウザでのリアルタイムの共同テキスト編集を可能にするWebアプリケーションです。 Node.jsで記述されており、さまざまなプラットフォームやオペレーティングシステムでセルフホストできます。

このチュートリアルでは、SQLiteデータベースエンジンを使用してデータを保存し、EtherpadをUbuntu20.04サーバーにインストールします。 また、アプリケーションのリバースプロキシとして機能するようにNginxをインストールして構成し、Let’s Encrypt認証局からSSL証明書を取得してインストールし、Etherpadインスタンスへの安全なHTTPS接続を有効にします。

注: App Platformサービスを使用してEtherpadをセルフホストする場合は、 Etherpad CollaborativeWebEditorをAppPlatformにデプロイするチュートリアルを参照してください。 Etherpad Dockerコンテナを実行し、マネージドPostgreSQLデータベースに接続するためのプラットフォームアプリ。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • root sudoが有効になっていないユーザー、およびUFWファイアウォールが有効になっているUbuntu20.04サーバー。 これらの要件の設定の詳細については、 Ubuntu20.04を使用した初期サーバー設定をお読みください。
  • Node.jsがインストールされている、バージョン14以降。 NodeSourceパッケージを使用して最新バージョンのNode.jsをインストールする方法については、Ubuntu20.04にNode.jsをインストールする方法のオプション2を参照してください。
  • サーバーのパブリックIPアドレスを指すドメイン名。 たとえば、example.cometherpad.example.comのようになります。

注: DigitalOceanを使用している場合は、 DNSドキュメントを使用すると、コントロールパネルでドメイン名を設定できます。

前提条件が整ったら、ステップ1に進み、Etherpadアプリケーションをダウンロードして構成します。

ステップ1—Etherpadのダウンロードと設定

Etherpadをインストールするには、ソースコードをダウンロードし、依存関係をインストールして、サーバーを実行するようにsystemdを構成する必要があります。

Etherpadのメンテナは、ソフトウェアを独自のユーザーとして実行することを推奨しているため、最初のステップは、adduserコマンドを使用して新しいetherpadユーザーを作成することです。

  1. sudo adduser --system --group --home /opt/etherpad etherpad

これにより、--systemユーザーが作成されます。つまり、直接ログインできず、パスワードやシェルが割り当てられていません。 /opt/etherpadのホームディレクトリを指定します。ここで、Etherpadソフトウェアをダウンロードして構成します。 また、--groupフラグを使用して、etherpadグループを作成します。

ここで、etherpadユーザーとしていくつかのコマンドを実行する必要があります。 これを行うには、sudoコマンドを使用して、bashシェルをetherpadユーザーとして開きます。 次に、ディレクトリ(cd)を/opt/etherpadに変更します。

  1. sudo -u etherpad bash
  2. cd /opt/etherpad

シェルプロンプトが更新され、etherpadユーザーであることが示されます。 etherpad@host:~$のようになります。

次に、Gitを使用してEtherpadリポジトリを/opt/etherpadに複製します。

  1. git clone --branch master https://github.com/ether/etherpad-lite.git .

これにより、Etherpadソースコードのmasterブランチが現在のディレクトリ(.)にプルされます。 それが完了したら、EtherpadのinstallDeps.shスクリプトを実行して、依存関係をインストールします。

  1. ./bin/installDeps.sh

これには1分かかる場合があります。 完了したら、最後の依存関係を手動でインストールする必要があります。 SQLiteをデータベースとして使用するには、cdをEtherpadsrcフォルダーに入れ、sqlite3パッケージをインストールする必要があります。

まず、srcディレクトリに移動します。

  1. cd src

次に、npmを使用してsqlite3パッケージをインストールします。

  1. npm install sqlite3

etherpad ユーザーとしての最後のタスクは、Etherpad settings.jsonファイルを更新して、データベースにSQLiteを使用し、Nginxとうまく連携することです。 /opt/etherpadディレクトリに戻ります。

  1. cd /opt/etherpad

次に、お気に入りのテキストエディタを使用して設定ファイルを開きます。

  1. nano settings.json

ファイルはJSONとしてフォーマットされていますが、各設定を説明する全体に広範なコメントが付いています。 構成できるものはたくさんありますが、今のところ、データベース構成を更新する2つの値に関心があります。

settings.json
  "dbType": "dirty",
  "dbSettings": {
    "filename": "var/dirty.db"
  },

下にスクロールして、ここに表示されているdbTypeおよびdbSettingsセクションを探します。 次のように、設定をsqliteと選択したファイル名に更新します。

settings.json
  "dbType": "sqlite",
  "dbSettings": {
    "filename": "var/sqlite.db"
  },

最後に、もう少し下にスクロールして、trustProxy設定を見つけ、trueに更新します。

settings.json
"trustProxy": true,

設定ファイルを保存して閉じます。 nanoでは、CTRL+OENTERと入力して保存し、CTRL+Xと入力して終了します。

それが終わったら、必ずetherpadユーザーのシェルを終了してください

  1. exit

通常のユーザーのシェルに戻ります。

Etherpadがインストールおよび構成されています。 次に、Etherpadプロセスを開始および管理するためのsystemdサービスを作成します。

ステップ2—Etherpad用のSystemdサービスを作成する

起動時にEtherpadを起動し、systemctlを使用してプロセスを管理するには、systemdサービスファイルを作成する必要があります。 お気に入りのテキストエディタで新しいファイルを開きます。

  1. sudo nano /etc/systemd/system/etherpad.service

Etherpadのドキュメントwikiの情報に基づいてサービス定義を作成します。 Etherpad Liteをサービスとして展開する方法ページには、機能させるためにいくつかの変更が必要な構成例が示されています。

次のコンテンツをテキストエディタに追加し、ファイルを保存して閉じます。

/etc/systemd/system/etherpad.service
[Unit]
Description=Etherpad, a collaborative web editor.
After=syslog.target network.target

[Service]
Type=simple
User=etherpad
Group=etherpad
WorkingDirectory=/opt/etherpad
Environment=NODE_ENV=production
ExecStart=/usr/bin/node --experimental-worker /opt/etherpad/node_modules/ep_etherpad-lite/node/server.js
Restart=always

[Install]
WantedBy=multi-user.target

このファイルは、Etherpadを実行するために必要な情報(実行するユーザーとグループ、プロセスの開始に使用されるコマンド(ExecStart=...)など)をsystemdに提供します。

ファイルを閉じた後、systemdデーモンをリロードして、新しい構成をプルします。

  1. sudo systemctl daemon-reload

次に、etherpadサービスを有効にします。 これは、サーバーが再起動するたびにサービスが起動することを意味します。

  1. sudo systemctl enable etherpad

そして最後に、サービスを開始できます。

  1. sudo systemctl start etherpad

systemctl statusを使用して、サービスが正しく開始されたことを確認します。

  1. sudo systemctl status etherpad
Output
● etherpad.service - Etherpad, a collaborative web editor. Loaded: loaded (/etc/systemd/system/etherpad.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-09-09 14:12:43 UTC; 18min ago Main PID: 698 (node) Tasks: 13 (limit: 1136) Memory: 152.0M CGroup: /system.slice/etherpad.service └─698 /usr/bin/node --experimental-worker /opt/etherpad/node_modules/ep_etherpad-lite/node/server.js

出力は、サービスがactive (running)であることを示しているはずです。

Etherpadは現在実行中ですが、ポート9001がファイアウォールによってブロックされているため、一般には利用できません。 次のステップでは、Etherpadプロセスの前にリバースプロキシとしてNginxを設定することにより、Etherpadを公開します。

ステップ3—Nginxのインストールと構成

NginxなどのWebサーバーをNode.jsサーバーの前に配置すると、キャッシュ、圧縮、静的ファイルの提供をより効率的なプロセスにオフロードすることで、パフォーマンスを向上させることができます。 Nginxをインストールし、Etherpadへの proxy リクエストを構成します。つまり、ユーザーからのリクエストをEtherpadに渡し、また元に戻します。

まず、パッケージリストを更新してから、aptを使用してNginxをインストールします。

  1. sudo apt update
  2. sudo apt install nginx

「NginxFull」UFWアプリケーションプロファイルを使用して、ポート80および443(HTTPおよびHTTPS)へのトラフィックを許可します。

  1. sudo ufw allow "Nginx Full"
Output
Rule added Rule added (v6)

次に、/etc/nginx/sites-availableディレクトリにある新しいNginx構成ファイルを開きます。 etherpad.confと呼びますが、別の名前を使用することもできます。

  1. sudo nano /etc/nginx/sites-available/etherpad.conf

以下を新しい構成ファイルに貼り付けます。必ずyour_domain_hereをEtherpadサーバーを指すドメインに置き換えてください。 たとえば、これはetherpad.example.comのようになります。

/etc/nginx/sites-available/etherpad.conf
server {
    listen       80;
    listen       [::]:80;
    server_name  your_domain_here;

    access_log  /var/log/nginx/etherpad.access.log;
    error_log   /var/log/nginx/etherpad.error.log;

    location / {
        proxy_pass         http://127.0.0.1:9001;
        proxy_buffering    off;
        proxy_set_header   Host $host;
        proxy_pass_header  Server;

        # proxy headers
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $remote_addr;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_http_version  1.1;

        # websocket proxying
        proxy_set_header  Upgrade $http_upgrade;
        proxy_set_header  Connection "upgrade";
    }
}

この構成は、Etherpadwikiで提供されているa構成に大まかに基づいています。 次のステップでCertbotにSSLの構成を任せるため、現時点ではHTTPのみです。 残りの構成では、ログの場所を設定してから、すべてのトラフィックをhttp://127.0.0.1:9001に渡します。これは、前の手順で起動したEtherpadインスタンスです。 また、正常に動作するプロキシと、プロキシを介して機能するWebSocket(リアルタイムの双方向通信を可能にする永続的なHTTP接続)に必要なさまざまなヘッダーを設定します。

ファイルを保存して閉じ、/etc/nginx/sites-enabled/にリンクして構成を有効にします。

  1. sudo ln -s /etc/nginx/sites-available/etherpad.conf /etc/nginx/sites-enabled/

nginx -tを使用して、構成ファイルの構文が正しいことを確認します。

  1. sudo nginx -t
[secondary_lable Output]
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

最後に、nginxサービスをリロードして、新しい構成を取得します。

  1. sudo systemctl reload nginx

これで、EtherpadサイトがプレーンHTTPで利用できるようになり、次のようになります。

The default homepage of an Etherpad instance, with a button for "New Pad" and a text box for creating a named pad

サイトがHTTP経由で稼働しているので、CertbotおよびLet’sEncrypt証明書を使用して接続を保護します。

ステップ4—CertbotのインストールとSSL証明書の設定

CertbotとLet’sEncryptの無料認証局のおかげで、EtherpadアプリにSSL暗号化を追加するのに必要なコマンドは2つだけです。

まず、CertbotとそのNginxプラグインをインストールします。

  1. sudo apt install certbot python3-certbot-nginx

次に、certbot--nginxモードで実行し、Nginxserver_name構成で使用したものと同じドメインを指定します。

  1. sudo certbot --nginx -d your_domain_here

Let’s Encryptの利用規約に同意し、メールアドレスを入力するよう求められます。

その後、すべてのHTTPトラフィックをHTTPSにリダイレクトするかどうかを尋ねられます。 それはあなた次第ですが、これは一般的に推奨され、安全に行うことができます。

その後、Let’s Encryptがリクエストを確認し、Certbotが証明書をダウンロードします。

Output
Congratulations! You have successfully enabled https://etherpad.example.com You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=etherpad.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/etherpad.example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/etherpad.example.com/privkey.pem Your cert will expire on 2021-12-06. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

Certbotは自動的にNginxをリロードして、新しい構成と証明書を取得します。 サイトをリロードすると、リダイレクトオプションを選択した場合、自動的にHTTPSに切り替わります。

The default Etherpad editor, with a textbox and placeholder text

完了です。 新しいEtherpadエディターを試して、協力者を招待してください。

結論

このチュートリアルでは、NginxとLet’sEncryptSSL証明書を使用してEtherpadをセットアップします。 これでEtherpadを使用する準備が整いましたが、認証済みユーザーの追加、プラグインの追加、スキンによるユーザーインターフェイスのカスタマイズなど、さらに多くの構成を行うことができます。

SQLiteを利用したEtherpadインスタンスは、適度な数のアクティブユーザーを処理できますが、トラフィックが非常に多いと予想される場合は、代わりにMySQLまたはPostgreSQLデータベースの構成を検討することをお勧めします。

これらの構成オプションはすべて、公式のEtherpadwikiに記載されています。