オープンソースの業務アプリ作成プラットフォーム「Pleasanter(プリザンター)」を、VPS 上の Ubuntu に Docker Compose で構築した記録です。所要時間は 30分ほどでした。
※ 以下、IP アドレスやパスワードは伏せ字(
<VPSのIP>SetSaPWDなど)にしています。実際に構築する際はご自身の値に置き換えてください。
前提
- Ubuntu が動く VPS(今回は ConoHa 等の一般的な VPS)
- Docker / Docker Compose がインストール済み
- sudo が使えるユーザーでログイン済み
1. OS を最新の状態にする
まずは足場固めです。古いパッケージのまま進めると、後で謎のエラーに悩まされます。
bash
sudo apt update && sudo apt upgrade -y
sudo apt full-upgrade -y
sudo apt autoremove -y
sudo reboot
各コマンドの役割はこうです。
| コマンド | やっていること |
|---|---|
apt update | パッケージの「カタログ」を最新化。実際の更新はまだしない |
apt upgrade -y | インストール済みパッケージを更新。パッケージの削除は伴わない |
apt full-upgrade -y | 依存関係の変化で不要になったパッケージの削除も含めた更新 |
apt autoremove -y | 用済みになった古いパッケージや旧カーネルを掃除 |
reboot | カーネル更新を反映するため再起動 |
-y は「確認プロンプトに全部 Yes と答える」オプションです。再起動後、SSH で再ログインします。
2. 専用ユーザーを作る
root で何でもやるのは行儀が悪いので、Pleasanter 用のユーザーを作ります。
bash
sudo adduser pleasanter
対話形式でパスワードを聞かれ、続いてフルネームや部屋番号などを聞かれますが、すべて未入力で Enter を押して構いません。最後に 以上でよろしいですか? [Y/n] と出るので y で確定します。
新しい値を入力してください。標準設定値を使うならリターンを押してください
フルネーム []:
部屋番号 []:
職場電話番号 []:
自宅電話番号 []:
その他 []:
以上でよろしいですか? [Y/n] y
次に、このユーザーが sudo なしで Docker を叩けるように docker グループへ追加します。
bash
sudo usermod -aG docker pleasanter
su - pleasanter
-aG の a は append(追加)の意味です。これを忘れると既存のグループ所属が上書きされてしまうので注意。su - pleasanter でユーザーを切り替えると、グループ設定が反映された状態でシェルが立ち上がります。
⚠️
dockerグループへの追加は、実質的に root 権限を与えるのと同等です。共用サーバーでは慎重に。
3. 作業ディレクトリと設定ファイルを用意する
bash
mkdir ~/pleasanter && cd ~/pleasanter
touch .env
touch compose.yaml
.env — 環境変数をまとめる
パスワードやバージョン番号など、環境ごとに変わる値をここに集約します。
ini
POSTGRES_VERSION=17
POSTGRES_VOLUMES_TARGET=/var/lib/postgresql/data
POSTGRES_USER=postgres
POSTGRES_PASSWORD=SetSaPWD
POSTGRES_DB=postgres
POSTGRES_HOST_AUTH_METHOD=scram-sha-256
POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256"
PLEASANTER_VERSION=latest
Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString="Server=db;Database=postgres;UID=postgres;PWD=SetSaPWD"
Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString="Server=db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD"
Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString="Server=db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD"
ポイントは 3 種類の接続文字列です。Pleasanter は権限レベルの違う 3 つの DB ユーザーを使い分けます。
- Sa … PostgreSQL の管理者。DB やユーザーの作成に使う
- Owner … テーブル定義の変更ができる所有者権限
- User … 通常のアプリ動作で使う一般権限
#ServiceName# は Pleasanter 側が自動で置換するプレースホルダなので、そのままで OK です。
scram-sha-256 は PostgreSQL のパスワード認証方式で、旧来の md5 より安全な現行の推奨方式です。
🔑
SetSaPWDSetAdminsPWDSetUsersPWDはサンプル値です。必ず強力なパスワードに変更してください。 また.envは Git 管理下に置かないよう.gitignoreに追加を。
compose.yaml — コンテナ構成を定義する
yaml
services:
db:
container_name: postgres
image: postgres:${POSTGRES_VERSION}
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
- POSTGRES_HOST_AUTH_METHOD
- POSTGRES_INITDB_ARGS
volumes:
- type: volume
source: pg_data
target: ${POSTGRES_VOLUMES_TARGET}
healthcheck:
test:
[
"CMD-SHELL",
"pg_isready -U $${POSTGRES_USER:-postgres} -d $${POSTGRES_DB:-postgres} || exit 1",
]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
restart: unless-stopped
pleasanter:
container_name: pleasanter
image: implem/pleasanter:${PLEASANTER_VERSION}
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- '50001:8080'
environment:
Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
Implem.Pleasanter_Rds_PostgreSQL_OwnerConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
Implem.Pleasanter_Rds_PostgreSQL_UserConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}
codedefiner:
container_name: codedefiner
image: implem/pleasanter:codedefiner
depends_on:
db:
condition: service_healthy
environment:
Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
Implem.Pleasanter_Rds_PostgreSQL_OwnerConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
Implem.Pleasanter_Rds_PostgreSQL_UserConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}
volumes:
pg_data:
name: ${COMPOSE_PROJECT_NAME:-default}_pg_data_volume
登場するサービスは 3 つです。
- db … PostgreSQL 本体
- pleasanter … アプリ本体。常時起動する
- codedefiner … DB の初期構築ツール。最初に一度だけ動かす
初心者がつまずきやすい箇所を補足します。
depends_on + condition: service_healthy
単に「DB コンテナが起動した」だけでは PostgreSQL はまだ接続を受け付けていません。healthcheck の pg_isready が通るまで待ってからアプリを起動する、という指定です。これがないと初回起動で接続エラーになりがちです。
$${POSTGRES_USER} のドル記号 2 つ
Compose ファイル内の $ は Compose 自身が変数展開してしまいます。$$ と書くことでエスケープされ、コンテナの中のシェルに $POSTGRES_USER として渡ります。
ports: '50001:8080'
左がホスト側、右がコンテナ側のポート。Pleasanter はコンテナ内で 8080 番を使い、それを VPS の 50001 番に公開しています。
volumes: pg_data
DB のデータを名前付きボリュームに永続化しています。これがないとコンテナを作り直したときにデータが消えます。
restart: unless-stopped
サーバー再起動時に自動でコンテナが立ち上がります。明示的に止めた場合だけは再起動しません。
4. CodeDefiner で DB を初期化する
プロジェクトディレクトリで実行します。
bash
docker compose run --rm codedefiner _rds /y /l "ja" /z "Asia/Tokyo"
Pleasanter が必要とするテーブルやユーザーを PostgreSQL 上に作成する処理です。オプションの意味は次のとおり。
--rm… 実行後にコンテナを自動削除(使い捨て実行)_rds… RDS / PostgreSQL 向けの構成で実行/y… 確認プロンプトを自動承認/l "ja"… 言語を日本語に/z "Asia/Tokyo"… タイムゾーンを日本時間に
言語とタイムゾーンをここで指定しておかないと、後から直すのが面倒です。
5. Pleasanter を起動する
bash
docker compose up -d pleasanter
-d はバックグラウンド実行(デタッチモード)。depends_on の設定により、db コンテナも一緒に立ち上がります。
起動を確認するには:
bash
docker compose ps # コンテナの状態を見る
docker compose logs -f pleasanter # ログを追う
6. ファイアウォールでポートを開ける
ここが一番ハマりやすいポイントです。 VPS 側のパケットフィルター(セキュリティグループ)で 50001 番ポートの TCP 受信を許可しておかないと、いくら待ってもブラウザから繋がりません。コンテナは正常に動いているのに画面が出ない、という場合はまずここを疑ってください。
VPS のコントロールパネルから設定します。可能であれば、接続元 IP を自分の環境に限定しておくとより安全です。
7. ログインする
ブラウザで以下にアクセスします。
http://<VPSのIP>:50001
初期アカウントは次のとおりです。
| ログイン ID | 初期パスワード |
|---|---|
| Administrator | pleasanter |
ログインしたら真っ先にパスワードを変更してください。 この初期パスワードは公開情報なので、放置は危険です。
構築後にやっておきたいこと
無事に動いたら、次のあたりを検討すると安心です。
- Administrator のパスワード変更 — 最優先
- HTTPS 化 — 現状は平文通信なので、ログイン情報が盗聴される可能性があります。Nginx や Caddy をリバースプロキシに立て、Let’s Encrypt で証明書を取得するのが定番です
.envのパスワード強化 — サンプル値のままなら必ず変更- DB のバックアップ —
docker compose exec db pg_dumpを cron で回すなど - ポートの絞り込み — リバースプロキシを立てたら 50001 は外部公開せず、443 のみ開ける
まとめ
Docker Compose のおかげで、実質「設定ファイル 2 つ書いて 2 コマンド叩く」だけで Pleasanter が立ち上がりました。ハマりどころは VPS のパケットフィルターと CodeDefiner の実行忘れの 2 つ。ここさえ押さえれば、スムーズに構築できるはずです。


コメント