コンテンツにスキップ

systemdでインストールする(Ubuntu / Debian)

Ubuntu 24.04 LTS を想定した、engawaをゼロから構築する手順です。Debian 12でも、パッケージ名が同じなのでほぼそのまま使えます。

Dockerを使う場合はこのページではなく、Dockerでインストールするを参照してください。RHEL系(AlmaLinux・Rocky Linux・RHEL)をお使いの場合は systemdでインストールする(RHEL系) を参照してください。

項目 目安
サーバー メモリ4GB以上を推奨。ビルド時にメモリを多く使います
ドメイン 例: example.com。サーバーのIPアドレスを指すAレコード(IPv6ならAAAAレコード)を先に設定しておきます
メールサーバー 必須ではありませんが、ユーザー登録の確認メールを送るなら必要です
オブジェクトストレージ 必須ではありません。あとから管理画面で設定できます
  1. 必要なソフトウェアを入れる(Node.js・PostgreSQL・Redis)
  2. engawa専用のユーザーとデータベースを作る
  3. ソースコードを取得してビルドする
  4. 設定ファイルを書く
  5. systemdサービスとして登録する
  6. リバースプロキシ(nginx)を立ててHTTPS配信する

以下のコマンドは、sudo が使える一般ユーザーで実行してください。

1. 基本的なパッケージを入れる

Section titled “1. 基本的なパッケージを入れる”

まずシステムを最新にして、ビルドに必要なツールを入れます。

ターミナルウィンドウ
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y build-essential python3 curl git ca-certificates gnupg ffmpeg

build-essential と python3 は、engawaが使う一部のライブラリをビルドするために必要です。入れずに進むと、後の pnpm install で失敗します。

ffmpeg は、動画ファイルを扱うために必要です。engawaは ffmpeg と ffprobe のコマンドをそのまま呼び出すので、システムに入っていないと機能しません。入ったか確認しておきます。

ターミナルウィンドウ
ffprobe -version

engawaにはNode.js 24以上が必要です。Ubuntuの標準リポジトリにあるNode.jsはバージョンが古いので、NodeSourceのリポジトリを追加します。

ターミナルウィンドウ
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs

入ったか確認します。

ターミナルウィンドウ
node -v

v24. から始まるバージョンが表示されればOKです。

次に、パッケージマネージャーの pnpm を有効にします。engawaは npm や yarn ではなく pnpm を使います。

ターミナルウィンドウ
sudo corepack enable
ターミナルウィンドウ
pnpm -v
ターミナルウィンドウ
sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql

PostgreSQL 15以上が必要です。Ubuntu 24.04では16が入ります。バージョンは次のコマンドで確認できます。

ターミナルウィンドウ
psql --version
ターミナルウィンドウ
sudo apt install -y redis-server
sudo systemctl enable --now redis-server

動いているか確認します。

ターミナルウィンドウ
redis-cli ping

PONG と返ってくればOKです。

engawaをrootで動かすのは避けたいので、専用のユーザーを作ります。

ターミナルウィンドウ
sudo useradd -m -s /bin/bash engawa

以降、engawa本体に関する作業はこのユーザーで行います。切り替えは次のコマンドです。

ターミナルウィンドウ
sudo -iu engawa

元のユーザーに戻るときは exit と入力します。このページでは、どちらのユーザーで実行するコマンドなのかを都度書いています。

元のユーザー(sudo が使えるユーザー)に戻ってから実行します。

ターミナルウィンドウ
sudo -u postgres psql

PostgreSQLのプロンプト(postgres=#)が出たら、次の3行を順に実行します。example-pass の部分は自分で決めたパスワードに置き換えてください。あとで設定ファイルに書くので、控えておきます。

CREATE ROLE engawa WITH LOGIN PASSWORD 'example-pass';
CREATE DATABASE engawa OWNER engawa;
\q

\q でプロンプトを抜けます。

7. ソースコードを取得してビルドする

Section titled “7. ソースコードを取得してビルドする”

ここからは engawaユーザー で作業します。

ターミナルウィンドウ
sudo -iu engawa

リポジトリを取得します。

ターミナルウィンドウ
git clone --branch develop https://github.com/bettaku/engawa.git engawa
cd engawa

依存パッケージを入れます。数分かかります。

ターミナルウィンドウ
pnpm install --frozen-lockfile

サンプルをコピーして編集します(engawaユーザーのまま)。

ターミナルウィンドウ
cp .config/example.yml .config/default.yml
nano .config/default.yml

最低限、次の項目を自分の環境に合わせます。

# 公開するURL。末尾のスラッシュは必要です
url: https://example.com/
# engawaが待ち受けるポート。nginxからここに中継します
port: 3000
db:
host: localhost
port: 5432
db: engawa
user: engawa
pass: example-pass # 手順6で決めたパスワード
redis:
host: localhost
port: 6379
# 手順11で立てるリバースプロキシを信頼します。
# これがないと、すべてのアクセス元IPがプロキシのIPとして記録されます
trustProxy:
- '127.0.0.1/32'
- '::1/128'
# サーバーを作った後は変更しないでください
id: 'aidx'

nano での保存は Ctrl+O → Enter、終了は Ctrl+X です。

他の項目もすべてコメント付きでサンプルに書かれているので、一度目を通しておくことをおすすめします。設定ファイルと環境変数の関係については バックエンドの環境変数、データベース接続の細かい調整については db.extra で指定できる設定 を参照してください。

9. ビルドしてデータベースを初期化する

Section titled “9. ビルドしてデータベースを初期化する”

engawaユーザーのまま、リポジトリのルートで実行します。

ターミナルウィンドウ
NODE_ENV=production pnpm build

ビルドが終わったら、データベースにテーブルを作ります。

ターミナルウィンドウ
pnpm migrate

ここまで成功したら、一度手動で起動して動作を確認します。

ターミナルウィンドウ
pnpm start

Now listening on port 3000 のような行が出れば成功です。Ctrl+C で止めて、次に進みます。

エラーが出た場合は、データベースのパスワードやRedisの設定を見直してください。

10. systemdサービスとして登録する

Section titled “10. systemdサービスとして登録する”

exit でengawaユーザーを抜けて、元のユーザーに戻ります。

サービス定義ファイルを作ります。

ターミナルウィンドウ
sudo nano /etc/systemd/system/engawa.service

次の内容を貼り付けて保存します。

[Unit]
Description=engawa daemon
After=network-online.target postgresql.service redis-server.service
[Service]
Type=simple
User=engawa
Group=engawa
UMask=0027
WorkingDirectory=/home/engawa/engawa
ExecStart=/usr/bin/node /home/engawa/engawa/packages/backend/built/boot/entry.js
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=journal
StandardError=journal
SyslogIdentifier=engawa
Restart=always
[Install]
WantedBy=multi-user.target

読み込んで起動します。

ターミナルウィンドウ
sudo systemctl daemon-reload
sudo systemctl enable --now engawa

状態を確認します。

ターミナルウィンドウ
sudo systemctl status engawa

active (running) と表示されればOKです。ログを見たいときは次のコマンドを使います。

ターミナルウィンドウ
sudo journalctl -u engawa -f

Ctrl+C で抜けられます。

11. リバースプロキシを立ててHTTPS配信する

Section titled “11. リバースプロキシを立ててHTTPS配信する”

engawaは localhost:3000 で動いていますが、このままでは外部からアクセスできません。nginxを前段に置いて、HTTPSでの配信と証明書の管理を任せます。

設定ファイルは、リポジトリの contrib/ に本番用のものが用意されています。ここではそれをそのまま使います。contrib/README.md も一度目を通してください。

ACMEモジュールが使えるのはnginx 1.29.0以降で、Ubuntuの標準リポジトリのnginxには含まれていません。nginx公式リポジトリを追加します。

ターミナルウィンドウ
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
ターミナルウィンドウ
curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
ターミナルウィンドウ
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
ターミナルウィンドウ
sudo apt update
sudo apt install -y nginx nginx-module-acme

バージョンを確認します。

ターミナルウィンドウ
nginx -v

nginx/1.29.0 以上であればOKです。

/etc/nginx/nginx.conf を開きます。

ターミナルウィンドウ
sudo nano /etc/nginx/nginx.conf

ファイルの先頭付近、http { より外側に次の1行を追加します。

load_module modules/ngx_http_acme_module.so;

リポジトリの contrib/nginx.sample.conf を、nginxの conf.d にコピーします。

ターミナルウィンドウ
sudo cp /home/engawa/engawa/contrib/nginx.sample.conf /etc/nginx/conf.d/engawa.conf

ドメインと連絡先を自分のものに置き換えます。

ターミナルウィンドウ
sudo sed -i 's/engawa\.example\.com/example.com/g; s/admin@example\.com/you@example.com/g' /etc/nginx/conf.d/engawa.conf

置き換わったか、中身を確認しておきます。

ターミナルウィンドウ
sudo nano /etc/nginx/conf.d/engawa.conf

あわせて、次の項目が環境に合っているか確認してください。

項目 既定値 説明
resolver 1.1.1.1 1.0.0.1 ACMEモジュールが使うDNSサーバーです。社内DNSがあればそちらに変更します
ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt Ubuntu・DebianのCA証明書のパスです。このままでOKです
client_max_body_size 256m アップロード上限です。engawa側の maxFileSize と揃えます

nginx公式パッケージには、80番ポートを受ける既定の設定が付属しています。競合するので消しておきます。

ターミナルウィンドウ
sudo rm -f /etc/nginx/conf.d/default.conf

証明書とアカウント鍵の保存先を、nginxのworkerユーザーが読み書きできるように作ります。nginx公式パッケージのworkerユーザーは nginx です。

ターミナルウィンドウ
sudo install -d -m 700 -o nginx -g nginx /var/lib/nginx/acme-engawa
ターミナルウィンドウ
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

80番はHTTPSへのリダイレクトだけでなく、証明書の初回取得と更新(HTTP-01認証)にも使われます。閉じないでください。

設定の文法を確認してから起動します。

ターミナルウィンドウ
sudo nginx -t
sudo systemctl enable --now nginx

syntax is ok と test is successful が出てから起動してください。すでに起動している場合は sudo systemctl reload nginx です。

初回の証明書発行には数十秒かかります。その間、HTTPSはまだ使えません。進行状況やエラーはnginxのログで確認できます。

ターミナルウィンドウ
sudo tail -f /var/log/nginx/error.log
ターミナルウィンドウ
curl -I http://example.com/

HTTP/1.1 308 Permanent Redirect が返ればHTTPからのリダイレクトは正常です。

ターミナルウィンドウ
curl -I https://example.com/

HTTP/2 200 が返れば、証明書の発行とengawaへの中継ができています。

ブラウザで https://example.com を開いて、初期設定画面が出れば完了です。最初に作ったアカウントが管理者になります。

手順11の代替: Caddy でHTTPS配信する

Section titled “手順11の代替: Caddy でHTTPS配信する”

nginxの代わりにCaddyを使う手順です。手順11を実行した場合、このセクションは不要です。 どちらも80番・443番を使うので、両方を同時に動かすことはできません。

Caddyは証明書の取得・更新とHTTPからのリダイレクトを標準機能で行うため、追加のモジュールは要りません。

Ubuntuの標準リポジトリにもCaddyはありますが、バージョンが古いことがあるので公式リポジトリを追加します。

ターミナルウィンドウ
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
ターミナルウィンドウ
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
ターミナルウィンドウ
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
ターミナルウィンドウ
sudo apt update
sudo apt install -y caddy

バージョンを確認します。

ターミナルウィンドウ
caddy version

v2. から始まるバージョンが表示されればOKです。

ターミナルウィンドウ
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp

80番は証明書の取得と更新(HTTP-01認証)に使われるので、閉じないでください。443番のUDPはHTTP/3用です。使わない場合は省いて構いません。

リポジトリの contrib/Caddyfile をコピーします。

ターミナルウィンドウ
sudo cp /home/engawa/engawa/contrib/Caddyfile /etc/caddy/Caddyfile

ドメインと連絡先を自分のものに置き換えます。連絡先は、証明書に関する通知がLet’s Encryptから届くアドレスです。

ターミナルウィンドウ
sudo sed -i 's/engawa\.example\.com/example.com/g; s/admin@example\.com/you@example.com/g' /etc/caddy/Caddyfile

中身を確認しておきます。

ターミナルウィンドウ
sudo nano /etc/caddy/Caddyfile

request_body の max_size(268435456 = 256 MiB)は、engawa側の maxFileSize と揃える値です。変更するときは両方を直してください。

Caddyには書式の整形と検証のコマンドがあります。起動前に通しておくと確実です。

ターミナルウィンドウ
caddy fmt --diff /etc/caddy/Caddyfile

差分が表示された場合は、書式の乱れがあるという意味です(動作しないわけではありません)。

ターミナルウィンドウ
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile

Valid configuration と出ればOKです。

ターミナルウィンドウ
sudo systemctl enable --now caddy

すでに起動している場合は sudo systemctl reload caddy です。

初回の証明書発行には数十秒かかります。進行状況やエラーはログで確認できます。

ターミナルウィンドウ
sudo journalctl -u caddy -f
ターミナルウィンドウ
curl -I http://example.com/

HTTP/1.1 308 Permanent Redirect が返ればHTTPからのリダイレクトは正常です。CaddyはHTTPからHTTPSへのリダイレクトを自動で設定します。

ターミナルウィンドウ
curl -I https://example.com/

HTTP/2 200 が返れば、証明書の発行とengawaへの中継ができています。

ブラウザで https://example.com を開いて、初期設定画面が出れば完了です。最初に作ったアカウントが管理者になります。

新しいバージョンが出たら、engawaユーザーで次の手順を実行します。

ターミナルウィンドウ
sudo systemctl stop engawa
sudo -iu engawa
cd engawa
git pull
pnpm install --frozen-lockfile
NODE_ENV=production pnpm build
pnpm migrate
exit
sudo systemctl start engawa

リリースノートに個別の作業が書かれている場合は、そちらを優先してください。

症状 確認すること
サービスがすぐ落ちる sudo journalctl -u engawa -n 50 でエラーを確認します。設定ファイルの書式ミスが多いです
502 Bad Gateway engawa本体が起動しているか(systemctl status engawa)、port とnginxの proxy_pass の番号が一致しているかを確認します
HTTPSにつながらない・証明書が発行されない 80番が外部から到達できるか、DNSがこのサーバーを指しているかを確認します。詳細は /var/log/nginx/error.log に出ます
module ... is already loaded で起動しない load_module の行が nginx.conf と modules-enabled/ で重複しています。どちらか一方にしてください
アクセス元IPがすべて同じになる 設定ファイルの trustProxy が抜けています
タイムラインが自動更新されない nginxのWebSocket設定(Upgrade と Connection のヘッダー)が抜けていないか確認します
データベースに接続できない psql -h localhost -U engawa -d engawa で手動接続を試します。パスワードが設定ファイルと一致しているか確認します
ビルドが途中で止まる メモリ不足です。手順9のスワップ追加を試してください
Caddyを使っていて様子がおかしい sudo journalctl -u caddy -n 50 でログを確認します
動画のサムネイルが出ない ffprobe -version でffmpegが入っているか確認します。入れた後はengawaの再起動が必要です

設定ファイルを書き換えたときは、必ず sudo systemctl restart engawa で再起動してください。起動中のプロセスには反映されません。