systemdでインストールする(Ubuntu / Debian)
Ubuntu 24.04 LTS を想定した、engawaをゼロから構築する手順です。Debian 12でも、パッケージ名が同じなのでほぼそのまま使えます。
Dockerを使う場合はこのページではなく、Dockerでインストールするを参照してください。RHEL系(AlmaLinux・Rocky Linux・RHEL)をお使いの場合は systemdでインストールする(RHEL系) を参照してください。
用意するもの
Section titled “用意するもの”| 項目 | 目安 |
|---|---|
| サーバー | メモリ4GB以上を推奨。ビルド時にメモリを多く使います |
| ドメイン | 例: example.com。サーバーのIPアドレスを指すAレコード(IPv6ならAAAAレコード)を先に設定しておきます |
| メールサーバー | 必須ではありませんが、ユーザー登録の確認メールを送るなら必要です |
| オブジェクトストレージ | 必須ではありません。あとから管理画面で設定できます |
- 必要なソフトウェアを入れる(Node.js・PostgreSQL・Redis)
- engawa専用のユーザーとデータベースを作る
- ソースコードを取得してビルドする
- 設定ファイルを書く
- systemdサービスとして登録する
- リバースプロキシ(nginx)を立ててHTTPS配信する
以下のコマンドは、sudo が使える一般ユーザーで実行してください。
1. 基本的なパッケージを入れる
Section titled “1. 基本的なパッケージを入れる”まずシステムを最新にして、ビルドに必要なツールを入れます。
sudo apt updatesudo apt full-upgrade -ysudo apt install -y build-essential python3 curl git ca-certificates gnupg ffmpegbuild-essential と python3 は、engawaが使う一部のライブラリをビルドするために必要です。入れずに進むと、後の pnpm install で失敗します。
ffmpeg は、動画ファイルを扱うために必要です。engawaは ffmpeg と ffprobe のコマンドをそのまま呼び出すので、システムに入っていないと機能しません。入ったか確認しておきます。
ffprobe -version2. Node.js を入れる
Section titled “2. Node.js を入れる”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 -vv24. から始まるバージョンが表示されればOKです。
次に、パッケージマネージャーの pnpm を有効にします。engawaは npm や yarn ではなく pnpm を使います。
sudo corepack enablepnpm -v3. PostgreSQL を入れる
Section titled “3. PostgreSQL を入れる”sudo apt install -y postgresql postgresql-contribsudo systemctl enable --now postgresqlPostgreSQL 15以上が必要です。Ubuntu 24.04では16が入ります。バージョンは次のコマンドで確認できます。
psql --version4. Redis を入れる
Section titled “4. Redis を入れる”sudo apt install -y redis-serversudo systemctl enable --now redis-server動いているか確認します。
redis-cli pingPONG と返ってくればOKです。
5. engawa用のユーザーを作る
Section titled “5. engawa用のユーザーを作る”engawaをrootで動かすのは避けたいので、専用のユーザーを作ります。
sudo useradd -m -s /bin/bash engawa以降、engawa本体に関する作業はこのユーザーで行います。切り替えは次のコマンドです。
sudo -iu engawa元のユーザーに戻るときは exit と入力します。このページでは、どちらのユーザーで実行するコマンドなのかを都度書いています。
6. データベースを作る
Section titled “6. データベースを作る”元のユーザー(sudo が使えるユーザー)に戻ってから実行します。
sudo -u postgres psqlPostgreSQLのプロンプト(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 engawacd engawa依存パッケージを入れます。数分かかります。
pnpm install --frozen-lockfile8. 設定ファイルを書く
Section titled “8. 設定ファイルを書く”サンプルをコピーして編集します(engawaユーザーのまま)。
cp .config/example.yml .config/default.ymlnano .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 startNow 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 daemonAfter=network-online.target postgresql.service redis-server.service
[Service]Type=simpleUser=engawaGroup=engawaUMask=0027WorkingDirectory=/home/engawa/engawaExecStart=/usr/bin/node /home/engawa/engawa/packages/backend/built/boot/entry.jsEnvironment="NODE_ENV=production"TimeoutSec=60StandardOutput=journalStandardError=journalSyslogIdentifier=engawaRestart=always
[Install]WantedBy=multi-user.target読み込んで起動します。
sudo systemctl daemon-reloadsudo systemctl enable --now engawa状態を確認します。
sudo systemctl status engawaactive (running) と表示されればOKです。ログを見たいときは次のコマンドを使います。
sudo journalctl -u engawa -fCtrl+C で抜けられます。
11. リバースプロキシを立ててHTTPS配信する
Section titled “11. リバースプロキシを立ててHTTPS配信する”engawaは localhost:3000 で動いていますが、このままでは外部からアクセスできません。nginxを前段に置いて、HTTPSでの配信と証明書の管理を任せます。
設定ファイルは、リポジトリの contrib/ に本番用のものが用意されています。ここではそれをそのまま使います。contrib/README.md も一度目を通してください。
nginx とACMEモジュールを入れる
Section titled “nginx とACMEモジュールを入れる”ACMEモジュールが使えるのはnginx 1.29.0以降で、Ubuntuの標準リポジトリのnginxには含まれていません。nginx公式リポジトリを追加します。
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyringcurl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/nullecho "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.listsudo apt updatesudo apt install -y nginx nginx-module-acmeバージョンを確認します。
nginx -vnginx/1.29.0 以上であればOKです。
ACMEモジュールを読み込む
Section titled “ACMEモジュールを読み込む”/etc/nginx/nginx.conf を開きます。
sudo nano /etc/nginx/nginx.confファイルの先頭付近、http { より外側に次の1行を追加します。
load_module modules/ngx_http_acme_module.so;設定ファイルを置く
Section titled “設定ファイルを置く”リポジトリの 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.confACMEの保存先を作る
Section titled “ACMEの保存先を作る”証明書とアカウント鍵の保存先を、nginxのworkerユーザーが読み書きできるように作ります。nginx公式パッケージのworkerユーザーは nginx です。
sudo install -d -m 700 -o nginx -g nginx /var/lib/nginx/acme-engawaファイアウォールを開ける
Section titled “ファイアウォールを開ける”sudo ufw allow 80/tcpsudo ufw allow 443/tcp80番はHTTPSへのリダイレクトだけでなく、証明書の初回取得と更新(HTTP-01認証)にも使われます。閉じないでください。
設定の文法を確認してから起動します。
sudo nginx -tsudo systemctl enable --now nginxsyntax is ok と test is successful が出てから起動してください。すでに起動している場合は sudo systemctl reload nginx です。
初回の証明書発行には数十秒かかります。その間、HTTPSはまだ使えません。進行状況やエラーはnginxのログで確認できます。
sudo tail -f /var/log/nginx/error.log動作を確認する
Section titled “動作を確認する”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からのリダイレクトを標準機能で行うため、追加のモジュールは要りません。
Caddy を入れる
Section titled “Caddy を入れる”Ubuntuの標準リポジトリにもCaddyはありますが、バージョンが古いことがあるので公式リポジトリを追加します。
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curlcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpgcurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.listsudo apt updatesudo apt install -y caddyバージョンを確認します。
caddy versionv2. から始まるバージョンが表示されればOKです。
ファイアウォールを開ける
Section titled “ファイアウォールを開ける”sudo ufw allow 80/tcpsudo ufw allow 443/tcpsudo ufw allow 443/udp80番は証明書の取得と更新(HTTP-01認証)に使われるので、閉じないでください。443番のUDPはHTTP/3用です。使わない場合は省いて構いません。
設定ファイルを置く
Section titled “設定ファイルを置く”リポジトリの 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/Caddyfilerequest_body の max_size(268435456 = 256 MiB)は、engawa側の maxFileSize と揃える値です。変更するときは両方を直してください。
設定を検証する
Section titled “設定を検証する”Caddyには書式の整形と検証のコマンドがあります。起動前に通しておくと確実です。
caddy fmt --diff /etc/caddy/Caddyfile差分が表示された場合は、書式の乱れがあるという意味です(動作しないわけではありません)。
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfileValid configuration と出ればOKです。
sudo systemctl enable --now caddyすでに起動している場合は sudo systemctl reload caddy です。
初回の証明書発行には数十秒かかります。進行状況やエラーはログで確認できます。
sudo journalctl -u caddy -f動作を確認する
Section titled “動作を確認する”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 を開いて、初期設定画面が出れば完了です。最初に作ったアカウントが管理者になります。
アップデートのしかた
Section titled “アップデートのしかた”新しいバージョンが出たら、engawaユーザーで次の手順を実行します。
sudo systemctl stop engawasudo -iu engawacd engawagit pullpnpm install --frozen-lockfileNODE_ENV=production pnpm buildpnpm migrateexitsudo systemctl start engawaリリースノートに個別の作業が書かれている場合は、そちらを優先してください。
うまくいかないときは
Section titled “うまくいかないときは”| 症状 | 確認すること |
|---|---|
| サービスがすぐ落ちる | 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 で再起動してください。起動中のプロセスには反映されません。