EC2にプリザンター+nginxの環境を構築(RHEL10/Docker利用)

certificate システム開発全般
certificate

OSSのローコード・ノーコードツール「プリザンター(Pleasanter)」をAWSのEC上でDockerを利用してセットアップする手順を説明します。公式のマニュアルはわかりづらい部分を補完してみました。利用するOS、ソフトウェアは以下の通りです。

OSRed Hat Enterprise Linux 10
.NET8.0.410
DBPostgreSQL17
Webサーバーnginx 1.25.1
Pleasanterプリザンター 1.4.0.0以降(最新版を利用)

この記事は基本的な手順を解説するためのものであるためセキュリティ観点では万全ではありません。TLSの導入も行っていません。業務で利用する場合は、しっかりとセキュリティ対策を行いましょう。

TLSの導入方法は以下の記事を参考にしてください。

本記事ではプリザンター、Postgres, nginxのDockerイメージをそのまま利用します。Dockerfileを利用したカスタムイメージを使って構築する場合は追加の手順が必要です。その場合は以下の公式手順を参照してください。(カスタムイメージを使わなくてもnginxの設定変更などは可能です)

事前準備

OSのロケール設定

デフォルトのロケールは英語なので日本語に変更します。まずは日本語ロケールをインストールします。

sudo yum install glibc-langpack-ja

ロケールを日本語に設定します。

sudo localectl set-locale LANG=ja_JP.utf8

タイムゾーンをJST(アジア/東京)へ変更します。

sudo timedatectl set-timezone Asia/Tokyo

日本語のキーマップをリストします。

localectl list-keymaps | grep jp
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106

リストアップされたものから日本語のキーマップを設定します。ここでは「jp106」を指定します。

sudo localectl set-keymap jp106

ロケールの設定を確認します。

localectl
System Locale: LANG=ja_JP.utf-8
    VC Keymap: jp106
   X11 Layout: jp
    X11 Model: jp106
  X11 Options: terminate:ctrl_alt_bksp

タイムゾーンがJSTに変更されていることを確認します。

date
Fri May 30 12:21:07 AM JST 2025

インストールに必要なツールのインストール

環境構築中に利用するコマンド・ツールをインストールしておきます。

sudo yum install wget
sudo dnf install unzip
sudo dnf install -y python3-pip
sudo pip3 install podman-compose
sudo dnf install -y podman

firewalldサービスをインストールし、有効化します。

sudo dnf install firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

以下のコマンドで起動状態を確認します。runningと表示されれば、firewalldは正常に動作しています。

sudo firewall-cmd --state

ファイアウォールでHTTPを許可します。

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

許可されているサービスをリストし、httpが追加されたことを確認します。

sudo firewall-cmd --list-services

EC2のセキュリティグループでもHTTP(80)ポートのインバウンドを許可しておきます。

プリザンター用ユーザー追加

プリザンターのサービス起動用ユーザーを作成します。ユーザー名は任意でOKです。ここでは「pleasanter」という名前で作成します。サービス起動に利用するユーザーであるため以下のオプションを付与しています。
-r : システムユーザーとして作成(ログイン不要)
-s /bin/false : シェルを無効化(ログイン不可

sudo useradd -r -s /bin/false pleasanter

プロジェクトルートフォルダの作成

プリザンターをインストールするためのプロジェクトルートフォルダを作成します。任意の場所で問題ありませんが、ここでは「/opt/pleasanter」をプロジェクトルートにし、所有者を作成したプリザンター用ユーザーに変更します。

sudo mkdir -p /opt/pleasanter
sudo chown pleasanter:pleasanter /opt/pleasanter

プリザンターのインストール準備(各サービスの設定ファイル作成)

環境変数ファイルの作成

以下の内容を /opt/pleasanter/.env に保存します。POSTGRES ではじまる環境変数はPostgreSQLのDocker公式イメージから参照され、コンテナの初期化時に実行される initdb で環境変数の値を使いPostgreSQLの初期設定が行われます。ユーザー名やパスワードは任意の内容に変更してください。

postgres – Official Image | Docker Hub
docker-library/postgres: Docker Official Image packaging for Postgres

POSTGRES_USER=postgres
POSTGRES_PASSWORD=yourpassword
POSTGRES_DB=pleasanter
POSTGRES_HOST_AUTH_METHOD=scram-sha-256
POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256 --encoding=UTF-8"

# SA(スーパーユーザー)接続
Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString='Server=db;Database=pleasanter;UID=postgres;PWD=yourpassword'
# 追加ユーザー(後ほど自作成する) 用の接続情報
Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString='Server=db;Database=pleasanter;UID=pleasanter_owner;PWD=ownerpassword'
Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString='Server=db;Database=pleasanter;UID=pleasanter_user;PWD=userpassword'

SaConnectionString、OwnerConnectionString、UserConnectionStringに指定している「Server=db;」の”db”はこのあとに作成するDocker Compose ファイル(compose.yaml)で指定するDBのサービス名と合わせておく必要があります。

コンテナ構成ファイル作成(docker-compose.yaml)

/opt/pleasanter/docker-compose.yml」を以下の内容で作成します。「image:」でDockerから取得するイメージのバージョンを指定しています。必要に応じて任意の値に変更してください。

version: '3'
services:
  db:
    container_name: postgres
    image: docker.io/postgres:17 #完全修飾イメージ名で指定
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_HOST_AUTH_METHOD=${POSTGRES_HOST_AUTH_METHOD}
      - POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
    volumes:
      - pg_data:/var/lib/postgresql/data

  pleasanter:
    container_name: pleasanter
    image: docker.io/implem/pleasanter:latest  #完全修飾イメージ名で指定
    depends_on:
      - db
    ports:
      - "8080: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:  docker.io/implem/pleasanter:codedefiner #完全修飾イメージ名で指定
    depends_on:
      - db
    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}

  nginx:
    container_name: nginx
    image:  docker.io/library/nginx:1.25.1-alpin
    depends_on:
      - pleasanter
    # ホストネットワークで起動することで、nginx の内部の "localhost:8080" が
    # ホストの8080番に向かうようにします。
    network_mode: "host"
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro

volumes:
  pg_data:

nginx設定ファイルの作成 (nginx.conf)

nginxをリバースプロキシとして動作させるための設定を記載します。ここではHTTP(80)ポートで受けつけた通信を内部のプリザンターサービスのポート(8080)へ転送しています。

server {
    listen 80;
    server_name <IPアドレス or ホスト名>;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

ここまでに作成したファイルの所有者も変更しておきます。

sudo chown pleasanter:pleasanter /opt/pleasanter/*

プリザンターのインストール

Dockerイメージの取得

プロジェクトルートに移動し、podman-composeで必要なDockerイメージを一括取得します。「docker-compose.yml」で指定したDockerイメージが取得されます。

cd /opt/pleasanter/
podman-compose pull

80ポートをrootlessで利用できるようにカーネル設定を変更

root以外でpodman を 利用する場合、デフォルトで1024 未満のポートはバインド不可なのでバインド可能なように設定します。
「sudo podman-compose up -d」のようにすることで回避も可能ですが、参考として手順を記載しておきます。

# 即時設定
sudo sysctl net.ipv4.ip_unprivileged_port_start=80

# 永続化
echo "net.ipv4.ip_unprivileged_port_start=80" | sudo tee -a /etc/sysctl.conf

Postgresユーザーの作成

Postgres用ユーザーを作成するためにDBサービスのみ立ち上げ、コンテナに接続します。

podman-compose up -d db
podman exec -it postgres psql -U postgres -d pleasanter

このあとの手順でCodeDefiner コンテナを実行し、Postgresの初期化を行いますが、その前にPostgreSQLに接続用のユーザーを手動で作成します。作成するのは「/opt/pleasanter/.env」のDB接続文字列のUIDで指定しているユーザーです。

CREATE ROLE pleasanter_owner WITH LOGIN PASSWORD 'ownerpassword';
CREATE ROLE pleasanter_user WITH LOGIN PASSWORD 'userpassword';

-- 必要に応じて、pleasanter_owner をデータベースの所有者にするか、すべての権限を付与します。
GRANT ALL PRIVILEGES ON DATABASE pleasanter TO pleasanter_owner;

-- アプリケーションでの利用に応じた権限設定を行う
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO pleasanter_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO pleasanter_user;

DBユーザーが作成されたことを確認します。

\du

「\q」を入力し、psqlを終了します。

CodeDefiner コンテナの実行

CodeDefiner コンテナは、プリザンターの初期セットアップおよび構成を行うためのユーティリティコンテナです。このコンテナを利用し、データベースに対して必要なスキーマの作成、初期データの投入、アプリケーションパラメータ設定など、運用開始前の準備作業(初期構成)を自動で実施します。

podman-compose run --rm codedefiner _rds /l "ja" /z "Asia/Tokyo"

全サービスの起動

これでセットアップは完了です!一旦コンテナを終了し、全コンテナを起動します。

podman-compose down
podman-compose up -d

プリザンター接続確認

「http://<IPアドレス or ホスト名>」にアクセスし、プリザンターのログイン画面が表示されることを確認します。

ユーザー名は「Administrator」、パスワードは「pleasanter」です。

うまく動作しない場合は
curl -v http://<IPアドレス>
などでアクセスして、HTTPレスポンスを確認したり、
podman logs nginx
などでログを確認してみましょう。

podman, podman-composeコマンドの使い方

# 停止
podman-compose stop

# 再起動
podman-compose start

# 全コンテナの停止・削除
podman-compose down

# 永続データも含めて削除
podman-compose down -v

# 実行中コンテナを表示
podman ps -a

# コンテナを個別に停止
podman stop <コンテナ名>

# ログ確認
podman logs <コンテナ名>

以上

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