DockerでPleasanterの環境を構築したメモ

# 動機
ローコード開発プラットフォームを色々と触ってみる中で、Pleasanterも試してみました。その際いくつか詰まったところがあったので、その記録として。

# 環境
- WSL2 Ubuntu24.04 LTS
- Docker 及び Docker compose plugin

# 本題
基本的な内容は開発元の方による以下の記事に沿っています。
- [Docker版プリザンターで運用する方法](https://qiita.com/imp-kawano/items/fe0680f756899b251a4d)

### 変更点
- DBデータ永続化方法の変更
>VolumesからBindマウントへ、これによってホストから直接コンテナが利用するディレクトリに触れるようになる

- 割り当てポートの変更
>当環境では8080番ポートへつなぐ必要があったので、割り当ての変更
- /app/App_Data以下の取り扱いの変更
>拡張SQL等の利用にはコンテナ内の`/app/App_Data`以下へ設定ファイルを配置する必要があるようで、上記導入記事ではそれをDockerイメージのビルドの際に行っていますが、都度ビルドするのはめんどくさそうなので<br>ただしこちらについては導入以降の動作確認を行っていません
    
### .envファイル
```
Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString='Server=pleasanter_db;Database=pleasanter_db;UID=postgres;PWD=password'
Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString='Server=pleasanter_db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=password'
Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString='Server=pleasanter_db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=password'
```
### docker-compose.yml

```YAML
services:

  pleasanter:
    container_name: pleasanter
    image: implem/pleasanter:1.4.5.0
    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}
    depends_on:
      pleasanter_db:
        condition: service_healthy
    restart: no
#    volumes:
#      - "./pleasanter:/app/appdata"
#    volumes:
#      - "./pleasanter/App_Data:/app/App_Data"
    ports:
      - '127.0.0.1:8880:80'
      - '127.0.0.1:8881:8080'
    networks:
      - pleasanter_network

  codedefiner:
    container_name: codedefiner
    image: implem/pleasanter:codedefiner
    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}
    depends_on:
      pleasanter_db:
        condition: service_healthy
    restart: no
    networks:
      - pleasanter_network

  pleasanter_db:
    container_name: pleasanter_db
    image: postgres:16.2
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=pleasanter_db
      - POSTGRES_HOST_AUTH_METHOD=scram-sha-256
      - POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256"
    healthcheck:
      interval: 10s
      retries: 10
      test: 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"'
      timeout: 2s
    restart: no
    volumes:
      - "./postgres:/var/lib/postgresql/data"
    networks:
      - pleasanter_network

networks:
  pleasanter_network: 
    external: true
```

### 手順
- #### 事前準備
1. 今回の導入例では、Bindによるコンテナ内部データの永続化を行います。そのため、DBデータ等の保存先として適切なディレクトリを用意しておいてください。作業時にはそのディレクトリを使用します
    ```YAML
        volumes:
          - "./postgres:/var/lib/postgresql/data"
    ```
    この記述がBindによるマウントを表すものでホストの`./postgres`をコンテナ内の`/var/lib/postgresql/data`と紐づけるものとなります <p>
1. 事前にネットワークを作成します。以下のコマンドを実行してください。<br>`docker network create pleasanter_network`<br>なお、ネットワーク名は任意のものに変更しても問題ありませんが、`docker-compose.yml`の記述と一致させるようにしてください<p>
1. `.env`ファイルおよび`docker-compose.yml`に記述された**password**を任意のものに変更してください。また、使用するコンテナのバージョン等も適宜指定してください
    本記事ではそれぞれ以下の通りとしています
    
    ```YAML
        image: implem/pleasanter:1.4.5.0
        image: postgres:16.2
    ```
      <p>
1. `docker-compose.yml`にて、以下の通りにコメントアウトを解除してください
    ```YAML
        volumes:
          - "./pleasanter:/app/appdata"
    #    volumes:
    #      - "./pleasanter/App_Data:/app/App_Data"
    ```
      <p>
1. 古いcodedefinerのイメージがある場合`docker image rm implem/pleasanter:codedefiner`で削除してください<p>

- #### 導入
1. 作業ディレクトリで`docker compose run --rm codedefiner _rds`を実行します。すると、設定された依存関係に従って`pleasanter_db`が立ち上がり、次いで`codedefiner`が起動します<p>
1. `codedefiner`が正常に終了したら、次に`docker compose up -d pleasanter`を実行します。しばらく待つとPleasanterが立ち上がるはずなので、ブラウザで`localhost:8881`へ接続すると、ログイン画面が表示されると思います<p>
1. 再びターミナルへ戻り`docker exec -it pleasanter /bin/bash`を実行します。この操作により、コンテナの中へと入ることができます<p>
1. コンテナ内で次のコマンドを実行します。`cp -r App_Data appdata`コピーが完了したら`exit`でコンテナから抜けます<p>
1. `docker compose down`で一旦コンテナを削除します<p>
1. `docker-compose.yml`を編集して次の通りコメントアウトを設定してください
    ```YAML
    #    volumes:
    #      - "./pleasanter:/app/appdata"
        volumes:
          - "./pleasanter/App_Data:/app/App_Data"
    ```
      <p>
1. `docker compose up -d pleasanter`でPleasanterを起動します。以降の停止・始動は`docker compose stop`と`docker compose start pleasanter`でいいんじゃないでしょうか

# 付記
DockerのBindマウントはコンテナ内のディレクトリを上書きするそうなので、妙な手順を踏んでいます。Dockerの運用としても良い方策とは思えないので、あんまり推奨はいたしません。