はじめに
本記事は Docker版プリザンターで運用する方法 - Qiita の内容をプリザンター 1.4系に更新したものです。
主な変更点
- Docker Compose に関する記述をV2に更新しました
- compose.yml、
pleasanter
サービスのポートマッピングにおけるコンテナ側ポートを8080
に変更しました - PostgreSQLのバージョンを 16 に変更しました
事前準備
本エントリではDocker Composeを用いた手順とします。
Docker ComposeはDocker Desktopをインストールするか、Compose pluginをインストールする2通りのシナリオがあります。
詳細はドキュメントを参照して使えるようにしておいてください。
配置イメージ
最終的にこのような配置にしていきます。
.
|-- compose.yml
|
+-- app_data_parameters
| +-- ExtendedSqls
| | +-- Sample.json.txt
| |
| +-- Mail.json
| +-- Rds.json
|
+-- CodeDefiner
| +-- Dockerfile
|
+---Pleasanter
+-- Dockerfile
パラメータファイルの配置
まずはパラメータJSONや拡張SQLなど App_Data/Parameters
配下を app_data_parameters
に置きます。
app_data_parameters
ディレクトリの注意点です。
-
App_Data/Parameters
と同じディレクトリ構造にする必要があります - 変更や追加したファイルだけを配置することを推奨いたします
- ファイルを編集しただけでは実行イメージに反映されないため必ず
docker compose build
を実行してください
環境変数の設定
ConnectionString
やPostgreSQLの初期化に必要な環境変数を設定します。設定する項目は以下です。
- PostgreSQLのバージョン指定
- PostgreSQL初期化パラメータ
- PostgreSQL用データボリュームのマウント先パス
- プリザンターのバージョン指定
- デーダベース接続文字列(
ConnectionString
)
PostgreSQLのバージョン指定
-
POSTGRES_VER
: PostgreSQLのバージョン
※Docker Hubで公開されているバージョンを指定してください
PostgreSQL初期化パラメータ
PostgreSQLの管理ユーザやそのパスワード、DBの指定は環境変数で渡していきます。
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB
POSTGRES_HOST_AUTH_METHOD
POSTGRES_INITDB_ARGS
POSTGRES_HOST_AUTH_METHOD
と POSTGRES_INITDB_ARGS
は認証方式を明示的に指定できます。
詳細は PostgreSQLの公式イメージのドキュメントを参照してください。
例としてこうなります。
POSTGRES_HOST_AUTH_METHOD=scram-sha-256
POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256"
こちらのブログが参考になります。
PostgreSQL用データボリュームのマウント先パス
Dockerの機能でコンテナとは別のデータ保持のための機構で、データベースのデータ領域にこのデータボリュームを使います。
PGDATA
コンテナ内でデータベースの実体ファイルが置かれるディレクトリをフルパスで指定します。
公式イメージのドキュメントを参照してください。
プリザンターのバージョン指定
プリザンターのバージョンを指定する環境変数です。
-
PLEASANTER_VER
: Pleasanterのバージョン
重要ポイントです。
- Docker Hubの公式イメージとして公開されているバージョンを指定してください
- この環境変数がない場合や有効なバージョンではない場合は
latest
になり、docker compose build
を実行したタイミングで公開されている最新バージョンになります
データベース接続文字列(ConnectionString)
いつものデータベース接続文字列ですが、この環境変数名にする必要があります。
Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString
Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString
Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString
理由は過去のエントリを参照してください。
データベース接続文字列についてのマニュアルです。
PostgreSQLの環境変数の内容と SaConnectionString
に記述されている内容を合わせる必要があります。
SaConnectionString
は最初にPostgreSQLにスーパーユーザで接続するための設定が一行で表現されています。それぞれの意味はこうです。
-
Database
: 環境変数のPOSTGRES_DB
と揃える -
UID
: 環境変数のPOSTGRES_USER
と揃える -
PWD
: 環境変数のPOSTGRES_PASSWORD
と揃える
いずれもPostgreSQLを初期化する initdb
で作成されるものとなります。
PostgreSQLのDocker公式イメージはコンテナの初期化時に initdb
が実行されます。
その際に POSTGRES_
ではじまる環境変数のものを使用して初期化するように実装されています。
環境変数のサンプル
各パスワード箇所は ********
にマスクしているため適宜修正してください
PLEASANTER_VER=1.4.xx.y
POSTGRES_VER=16
Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString='Server=db;Database=postgres;UID=postgres;PWD=********'
Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString='Server=db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=********'
Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString='Server=db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=********'
POSTGRES_USER=postgres
POSTGRES_PASSWORD=********
POSTGRES_DB=postgres
POSTGRES_HOST_AUTH_METHOD=scram-sha-256
POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256 --encoding=UTF-8"
PGDATA=/var/lib/postgresql/data
各定義ファイルのサンプル
以降にサンプルを載せますのでそれぞれ配置してください。
compose.yml
注意
ポートマッピングのコンテナ側を 8080
にすることに注意してください
services:
pleasanter:
build:
context: .
dockerfile: ./Pleasanter/Dockerfile
args:
- VERSION=${PLEASANTER_VER}
container_name: pleasanter_${PLEASANTER_VER}
environment:
Implem.Pleasanter_Rds_SaConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
Implem.Pleasanter_Rds_OwnerConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
Implem.Pleasanter_Rds_UserConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}
depends_on:
- db
ports:
- '8881:8080'
networks:
- default
codedefiner:
build:
context: .
dockerfile: ./CodeDefiner/Dockerfile
container_name: codedefiner
environment:
Implem.Pleasanter_Rds_SaConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
Implem.Pleasanter_Rds_OwnerConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
Implem.Pleasanter_Rds_UserConnectionString: ${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}
depends_on:
- db
networks:
- default
stdin_open: true
db:
container_name: postgres${POSTGRES_VER}
image: postgres:${POSTGRES_VER}
volumes:
- type: volume
source: pg_data
target: ${PGDATA}
networks:
- default
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
- POSTGRES_HOST_AUTH_METHOD
- POSTGRES_INITDB_ARGS
- PGDATA
user: postgres
dbbackup:
image: ubuntu
container_name: dbbackup
networks:
- default
volumes:
- type: volume
source: pg_data
target: /pg_data
- type: bind
source: .
target: /backup
volumes:
pg_data:
name: ${COMPOSE_PROJECT_NAME:-default}_pg_data_${POSTGRES_VER}
networks:
default:
name: pleasanter_prod_network
CodeDefiner/Dockerfile
FROM implem/pleasanter:codedefiner
COPY app_data_parameters/ /app/Implem.Pleasanter/App_Data/Parameters/
ENTRYPOINT [ "dotnet", "Implem.CodeDefiner.dll" ]
Pleasanter/Dockerfile
ARG VERSION=latest
FROM implem/pleasanter:${VERSION}
COPY app_data_parameters/ App_Data/Parameters/
ENTRYPOINT [ "dotnet", "Implem.Pleasanter.dll" ]
イメージ構築・DB初期化
実行する前にコンテナイメージのビルド(build
)をする点を意識してください。(忘れがちです)
各定義ファイルを配置したら実行してみます。
-
プリザンターのイメージ構築
docker compose build
-
DB初期化
docker compose run --rm codedefiner _rds
注意
ver 1.4.6以降の場合 CodeDefiner に引数を指定しないで実行した場合、言語:英語、タイムゾーン:UTCでセットアップされます。
デフォルト以外にしたい場合は以下のように指定します。
(例) 言語: 日本語、タイムゾーン: JST とする場合
docker compose run --rm codedefiner _rds /l "ja" /z "Asia/Tokyo"
-
プリザンターのサービス用のコンテナを構築、作成、実行
docker compose up -d pleasanter
ブラウザで http://localhost:8881/ にアクセスして、起動の確認をしてください。
初回のログインはいつもの通りです。
プリザンター停止
docker compose stop pleasanter
プリザンターのコンテナは残ったまま停止します。
PostgreSQLのコンテナは実行したままです。
プリザンター起動
stop
した場合は、start
とすることで再度実行することができます。
docker compose start pleasanter
PostgreSQL停止
PostgreSQLのコンテナを停止します。 コンテナは残ったままです。
start
すれば再度実行されます。
docker compose stop db
docker compose start db
コンテナログ
-
各サービスのコンテナのログを確認できます。
docker compose logs [サービス名]
-
-f
オプションでログを出力し続けますので起動確認などで利用すると良いです。docker compose logs -f [サービス名]
コンテナ及びネットワークの削除
down
すると次のものが依存関係を保ちながらコンテナが削除されます。
docker compose down
[+] Running 3/3
✔ Container pleasanter_1.4.5.0 Removed
✔ Container postgres16 Removed
✔ Network pleasanter_prod_network Removed
- プリザンターのコンテナ
- PostgreSQLのコンテナ
- ネットワーク
このコマンドを実行してもPostgreSQLのデータが格納されているデータボリュームはそのまま残っています。
再び実行したい場合は、
docker compose up -d pleasanter
とすると、ネットワーク作成後、PostgreSQLのコンテナとプリザンターのコンテナが作成されて起動します。
[+] Building 0.0s (0/0)
[+] Running 3/3
✔ Network pleasanter_prod_network Created
✔ Container postgres16 Started
✔ Container pleasanter_1.4.5.0 Started
バージョンアップの仕方
プリザンターのバージョンアップは以下の手順で実施できます。
- プリザンターの停止
- 環境変数のバージョンを変更
- 新バージョンのコンテナイメージを作成
- CodeDefinerの更新とDBの再定義
- プリザンターを実行
プリザンターのコンテナ停止
docker compose stop pleasanter
環境変数のバージョンを変更
Docker Hubにてバージョンタグを確認し環境変数のPLEASANTER_VER
を変更します。
プリザンターのバージョンアップ情報を確認してパラメータの差分があれば反映します。
新バージョンのコンテナイメージを作成
オプションに --pull
を指定してコンテナイメージを更新します。
docker compose build --pull
DBの再定義を実施します。
docker compose run --rm codedefiner _rds
プリザンターを実行
docker compose up -d pleasanter
[+] Building 0.0s (0/0)
[+] Running 3/3
✔ Container postgres16 Running
✔ Container pleasanter_1.4.5.0 Recreated
✔ Container pleasanter_1.4.x.y Started
停止して残っていた前バージョンのコンテナを再作成して新バージョンのコンテナとして再作成後開始します。
データベースのデータは引き継がれます。
コンテナ内を確認するには
ここからはコンテナの中身を確認したりする手順や注意点を書いていきます。
-
コンテナイメージがどのようになっているか確認する場合
docker compose run --rm --entrypoint /bin/bash pleasanter
-
動いているpleasanterのコンテナインスタンス内に入る場合
docker compose exec pleasanter /bin/bash
※動いているコンテナや Compose projects がある状態で有効なコマンドです。以下の条件を満たしている 必要があります。
-
docker compose ls
: running となっているプロジェクトが存在すること -
docker ps
: コンテナ一覧に表示されること
-
データボリュームのバックアップをするには
データボリュームとホストのバックアップ先ディレクトリをマウントし tar
でPostgreSQLのデータディレクトリをアーカイブすることで、バックアップが可能です。
例) pgdata-backup.tar.gz
として実行時のディレクトリに作成する
docker compose run --rm dbbackup tar czvf /backup/pgdata-backup.tar.gz -C /pg_data .
コンテナ、ネットワーク、データボリュームの削除
※注意※ : データボリュームの削除はデータベースのデータディレクトリ(${PGDATA}
)の削除と同じ意味なので注意してください
docker compose down -v
[+] Running 4/4
✔ Container pleasanter_1.4.5.0 Removed
✔ Container postgres16 Removed
✔ Volume production-env_pg_data_16 Removed
✔ Network pleasanter_prod_network Removed
以上です。