Ubuntu VPS に Docker で Pleasanter を構築する手順

Pleasanter

オープンソースの業務アプリ作成プラットフォーム「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

-aGa は 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 より安全な現行の推奨方式です。

🔑 SetSaPWD SetAdminsPWD SetUsersPWD はサンプル値です。必ず強力なパスワードに変更してください。 また .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 はまだ接続を受け付けていません。healthcheckpg_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初期パスワード
Administratorpleasanter

ログインしたら真っ先にパスワードを変更してください。 この初期パスワードは公開情報なので、放置は危険です。


構築後にやっておきたいこと

無事に動いたら、次のあたりを検討すると安心です。

  1. Administrator のパスワード変更 — 最優先
  2. HTTPS 化 — 現状は平文通信なので、ログイン情報が盗聴される可能性があります。Nginx や Caddy をリバースプロキシに立て、Let’s Encrypt で証明書を取得するのが定番です
  3. .env のパスワード強化 — サンプル値のままなら必ず変更
  4. DB のバックアップdocker compose exec db pg_dump を cron で回すなど
  5. ポートの絞り込み — リバースプロキシを立てたら 50001 は外部公開せず、443 のみ開ける

まとめ

Docker Compose のおかげで、実質「設定ファイル 2 つ書いて 2 コマンド叩く」だけで Pleasanter が立ち上がりました。ハマりどころは VPS のパケットフィルターCodeDefiner の実行忘れの 2 つ。ここさえ押さえれば、スムーズに構築できるはずです。

コメント

タイトルとURLをコピーしました