プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

『入門プリザンター』の内容を Container Station で試したい時のアプリケーションの作成

こちらの記事

blog.mori-soft.com

で、 Pleasanter を QNAP の Contaienr Station で動かす方法について書きました。

実際にこの環境を使って『入門プリザンター』の内容(第4章~第7章)を試していると、メールの送信設定とリマインダー設定を行っていないことに気づきました。なので、これらの設定を含めた起動方法を試したので、それをまとめておきます。

なお、各種環境は下記のとおりです。

  • QNAP TS-262
  • QTS QTS : 5.2.3.3006
  • Container Station : 3.0.9.1038 (2024/11/08)
  • Pleasanter : 1.4.13.0

Mail.json を設定

下記の記事

プリザンターからメールを送信できるように設定する | Pleasanter

の書き方を見ると、基本的には Mail.json の必要事項を設定して、 Pleasanter を再起動すれば反映されるみたいです。

ただ、 docker の場合、パラメータファイルを変更するには

Dockerイメージを使用しパラメータを既定値から変更して起動する | Pleasanter

にあるように、イメージ(DockerFile で指定)を作るところからやるのが正当っぽいです。うーん、ちょっと面倒だな。

まあ、最初の記事を踏まえると、 CodeDefiner 実行時には Mail.json の内容がなくてもよさそうなので、若干乱暴ですが Mail.json の内容が反映されることだけを考えて、バインドマウントを使う方法としてみました。

Mail.json の作成

まずは、 Mail.json を作ります。既存の docker コンテナに入って、 Mail.json の内容を表示させて、コピーしておきます。

[user1@nas01 pleasanter-test7]$ docker exec -it pleasanter /bin/bash
root@c4352b2df01b:/app# cd App_Data/Parameters/
root@c4352b2df01b:/app/App_Data/Parameters# cat Mail.json 
{
    "SmtpHost": null,
    "SmtpPort": 25,
    "SmtpUserName": null,
    "SmtpPassword": null,
    "SmtpEnableSsl": false,
    "ServerCertificateValidationCallback": false,
    "SecureSocketOptions": null,
    "FixedFrom": null,
    "AllowedFrom": null,
    "SupportFrom": "\"Pleasanter.org\" <support@pleasanter.org>",
    "InternalDomains": "",
    "Encoding": null,
    "ContentEncoding": null
}root@c4352b2df01b:/app/App_Data/Parameters# 

これを元に、自分用の Mail.json を作成します。こんな感じです。

{
    "SmtpHost": "SMTPサーバー名",
    "SmtpPort": 465,
    "SmtpUserName": "SMTP認証用のメールアドレス",
    "SmtpPassword": "パスワード",
    "SmtpEnableSsl": false,
    "ServerCertificateValidationCallback": false,
    "SecureSocketOptions": "SslOnConnect",
    "FixedFrom": null,
    "AllowedFrom": null,
    "SupportFrom": "support@pleasanter.org",
    "InternalDomains": "",
    "Encoding": null,
    "ContentEncoding": null
}

なお、上記の SMTP サーバー(さくらインターネットを利用)の場合、

    "SecureSocketOptions": "SslOnConnect",

がなかったら正しく送信できませんでした。

また、上記の項目の一部でもいいんじゃないかな?と勝手に思って、こんな Mail.json を使ったときも送信時にエラーとなってました。

{
    "SmtpHost": "SMTPサーバー名",
    "SmtpPort": 465,
    "SmtpUserName": "SMTP認証用のメールアドレス",
    "SmtpPassword": "パスワード",
    "FixedFrom": null,
    "SupportFrom": "support@pleasanter.org",
}

ご参考までに。

リマインダーを設定

リマインダーを有効にするのも設定ファイルを変更する必要があるようです。

プリザンターのリマインダー機能を有効化する | Pleasanter

ここの説明を読むと、リマインダーに関する設定ファイルは BackgroundService.json と Service.json の 2 つがあるようです。

なお、Service.json については、ここの説明に

パラメータ設定:Service.json | Pleasanter

AbsoluteUri が null の場合『現在接続中のURLが使用される』とあったので、最初は変更不要かと思ったのですが、後述するようにここを修正していないとリマインダーは動くものの URL のホスト名部分が抜けた状態でメールが送られてきました。なので、少なくともリマインダーの場合は設定しておいた方がよさそうです。

で、基本的な方針としては Mail.json と同じなので、まずは設定ファイルを準備します。

BackgroundService.json の作成

Mail.json の時と同様に、既存の docker コンテナに入って、 BackgroundService.json の内容を表示させて、コピーしておきます。それを元に作ったのが、下記になります。

{
    "EnvironmentVariables": null,
    "Reminder": true,
    "SyncByLdap": false,
    "SyncByLdapTime": [ "02:00" ],
    "DeleteSysLogs": false,
    "DeleteSysLogsTime": [ "02:00" ],
    "DeleteTemporaryFiles": false,
    "DeleteTemporaryFilesTime": [ "02:00" ],
    "DeleteTrashBox": false,
    "DeleteTrashBoxTime": [ "02:00" ],
    "DeleteTrashBoxRetentionPeriod": 90
}

Reminder を true に変更しました。

Service.json の作成

こちらも同様に、既存の docker コンテナに入って、 Service.json の内容を表示させて、コピーしておきます。それを元に作ったのが、下記になります。

{
    "Name": "Implem.Pleasanter",
    "TimeZoneDefault": "UTC",
    "DefaultPassword": "pleasanter",
    "DeploymentEnvironment": null,
    "WithoutChangeDefaultPassword": false,
    "DefaultLanguage": "en",
    "AbsoluteUri": "http://nas01:50001",
    "MaxRequestBodySize": 30000000,
    "RequireHttps": false,
    "AnnouncementSiteId": 0,
    "ShowProfiles": true,
    "ShowChangePassword": false,
    "ShowStartGuide": true,
    "Demo": false,
    "DemoUsagePeriod": 60
}

AbsoluteUri を追加しています(nas01 という QNAP で Container Station で動かしています)。

上記にも書きましたが、最初は Service.json は変更せずにリマインダーを動かすと、ここの

『テスト』ボタンからの呼び出しの場合は、URLにホスト名が入っていたのですが、リマインダーとしての呼び出しだと、

こんなふうに、URL のホスト部分がない状態でメールが送られてきました。

このため、 BackgroundService.json だけでなく、最初のドキュメントにあったように、 Service.json も構成しないと(少なくとも)リマインダーでは正しく URL が記載されないようです。

アプリケーションの再作成

さて、今回はアプリケーションを再作成してみます。こういうところが docker のいいところですね。アプリケーションの作成で指定する docker-compse.yml を下記のように変更します。

services:
  db:
    container_name: postgres
    image: postgres:16
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_HOST_AUTH_METHOD
      - POSTGRES_INITDB_ARGS
    volumes:
      - type: volume
        source: pg_data
        target: /var/lib/postgresql/data
  pleasanter:
    container_name: pleasanter
    image: implem/pleasanter:1.4.13.0
    depends_on:
      - db
    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}
    volumes:
      - type: bind
        source: ./Mail.json
        target: /app/App_Data/Parameters/Mail.json
      - type: bind
        source: ./BackgroundService.json
        target: /app/App_Data/Parameters/BackgroundService.json
      - type: bind
        source: ./Service.json
        target: /app/App_Data/Parameters/Service.json
volumes:
  pg_data:
    name: ${COMPOSE_PROJECT_NAME:-default}_pg_data_volume

前回のものに比べて、 pleasanter に volumes を追加しています(あと、コンテナ名とポート番号も適宜変更しています)。

これを Container Station のアプリケーション作成時の GUI に入力して、作成を行うと、当然 Mail.json 等のファイルが見つからないので、

という感じにアプリケーションの作成に失敗します。ついでに、コンテナとしては、

のように、 postgres だけが作られています。

これはこれでOK(というか想定の挙動)なので、次に進みます。前回の記事と同様に、 QNAP に SSH でログインして、必要なファイル

  • .env
  • docker-compose.codedefiner.yml
  • Mail.json
  • BackgroundService.json
  • Service.json

をコピーします。 .env ファイルと docker-compose.codedefiner.yml は前回の記事と同じ内容です。また、 Mail.json, BackgroundService.json, Service.json は上記で作成したものです。

準備ができたら、前回の記事と同様に、 codedefiner を実行して、問題がなければ続いて、 pleasanter を起動します。

[user1@nas01 pleasanter-test8]$ docker compose up -d pleasanter
[+] Running 2/2
 ✔ Container postgres2    Running                                                                                                                                                                                                   0.0s 
 ✔ Container pleasanter2  Started                                                                                                                                                                                                   2.5s 
[user1@nas01 pleasanter-test8]$ 

これで、 Mail.json やリマインダー設定の内容が反映された Pleasanter のコンテナができました。

メール送信の確認

メールが正しく送れるか確認します。『入門プリザンター』の『5.9 通知を設定する』の手順を一通り試すと、

のようなメールが送信されてきました。問題ないですね。

なお、メール送信時の差出人については、

メールの差出人の設定について #Pleasanter - Qiita

などが詳しいです(記事中の『ユーザーメールアドレス』というのはログインユーザーのことですね)。

リマインダーの確認

リマインダーが正しく機能するか確認します。『入門プリザンター』の『7.4 リマインダーを設定する』の手順を一通り試すと、

のように指定したメールアドレスにテストメールが送られてきました。

メール送信エラーの確認

さて、上記はうまくいった場合の話なんですが、成功するまでいろいろとありました。

Pleasanter の場合、通知の設定により、メールの送信が発生して、それが失敗した場合でも、画面上からはわかりません。個人的にはこの手のエラーは、ユーザーにわかるようになってほしい気はしますが、この辺は今後に期待ですかね。

なんにしても、設定作業中はメールが届かずエラーを確認したいこともあるので、その方法を探してみました。

Security.json

Pleasanter には『特権ユーザー』という権限を持ったユーザーを設定することができ、このユーザーでログインすると、『システムログの管理』機能を使うことができるようになるそうです(『入門プリザンター』だと、 p.361 『8.4.5 特権ユーザの設定』に記述がありました)。

ユーザ管理機能:特権ユーザの設定 | Pleasanter

システムログとあるので、これをみれば、きっとこのあたりのエラーも確認できるんでしょう。

やってみます。

起動済みの pleasanter コンテナに入ります。

[user1@nas01 pleasanter-test7]$ docker exec -it pleasanter2 /bin/bash
root@c4352b2df01b:/app# 
root@c4352b2df01b:/app# cd App_Data/Parameters/
root@c4352b2df01b:/app/App_Data/Parameters# 
root@c4352b2df01b:/app/App_Data/Parameters# cp -p Security.json Security.json.org
root@c4352b2df01b:/app/App_Data/Parameters# 
root@c4352b2df01b:/app/App_Data/Parameters# sed 's/"PrivilegedUsers": null/"PrivilegedUsers": ["Administrator"]/g' Security.json.org > Security.json
root@c4352b2df01b:/app/App_Data/Parameters# diff Security.json.org Security.json
5c5
<     "PrivilegedUsers": null,
---
>     "PrivilegedUsers": ["Administrator"],
root@c4352b2df01b:/app/App_Data/Parameters# exit

のようにして、コンテナ内の Security.json の PrivilegedUsers を書き換えます。

問題なさそうなら、一度コンテナを再起動します。次に、上記で指定した特権ユーザー(この場合は Administrator )でログインします。

『システムログの管理』が現れました。ここをクリックすると、

こんな感じに何も表示されません。公式の説明によると、システムログは、フィルタ条件を設定していないと何も表示されないとのことなので、『ログ種別』で

Info 以外を選択して、『フィルタ』ボタンを押すと、

おぉ、なんか Exception が出ててますね。この行をクリックして詳細を表示すると、

のように、 host が null と怒られているようです。 Mail.json 設定前にメールの送信を試したので、その際のエラーで、たぶん SMTP ホスト設定がないことを意味しているんでしょうね。

まとめ

Pleasanter が画面上からメール送信設定ができるかと思っていたのですが、設定ファイルで指定しないといけないのがちょっと意外でした。 でも、設定ファイルを書き換えれば、いろいろと挙動も変更できそうなので、それはそれで面白そうです。

  • 2025/3/12 リマインダーの設定も必要だったので、それに関する記述を追加