【Botpress】Dockerでコンテナ起動し、ローカルをバインド⇒コード管理できるまで

# 概要
`Botpress`とはオープンソースのチャットボット構築プラットフォームです。
ボットの会話フローを視覚的に簡単に構築できるほか、内部でコールするAPIを変えるなどすることで、様々な`LLM`に対応することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/7299835b-fd4e-766e-8f3d-b15953be1ef5.png)
[Botpress公式より](https://botpress.com/ja/)

さらに、フロントエンド側にボットのURLを埋め込むことで、簡単にチャットスペースを用意することができます。

本記事では、`Docker`を使用して`Botpress`サーバーを立ち上げ、さらにコード管理できるようにサーバーの中身をバインドしてローカルに落とし込むところまでを紹介します。

なお、私の備忘録的な意味合いもありますので、よりよい方法やご指摘等ございましたら、ぜひご教示ください！
Dockerに慣れている方にはあたりまえの内容かと思います...。

# 前提
`Docker`がインストールされている。

# Dockerfile作成
任意のディレクトリにDockerfileを作成します。
```dockerfile
FROM botpress/server:v12_31_3

ARG WORKDIR=/botpress/data/
WORKDIR ${WORKDIR}

USER root

COPY ../ ${WORKDIR}
RUN chmod -R 777 ${WORKDIR}    # 適宜権限を調整

RUN apt-get -y update && apt-get -y upgrade && apt-get install -y git

CMD ["../bp", "serve"]
```

`botpress`サーバーのバージョンは[こちら](https://hub.docker.com/r/botpress/server/tags)から選択します。

# ビルド -> 起動
```bash
docker build -t botpress/server-image-001 . --no-cache=true
docker run -d -p 8000:3000 botpress/server-image-001
```

ログはこんな感じで、きちんと起動できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/c5a79845-2630-f3f6-e7b4-cf6c6e38f645.png)

この状態で [localhost:8000](localhost:8000) にアクセスすると、Botpressのログイン画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/08b43134-e3de-0ffb-5ea3-0c3074be6f0a.png)

# コンテナ内のデータをホストにコピー
先ほど作成した`Dockerfile`があるディレクトリに、Dockerコンテナ内のファイルをコピーします。

まずは起動しているコンテナのIDを取得します。
```bash
docker ps
```
```bash
CONTAINER ID   IMAGE                       COMMAND              CREATED          STATUS          PORTS                    NAMES
37d3bd303d83   botpress/server-image-001   "../bp serve"        2 minutes ago    Up 2 minutes    0.0.0.0:8000->3000/tcp   XXXXXXXXX
```

`CONTAINER ID`列の値を使用して、以下のコマンドを実行します。
```bash
docker cp 37d3bd303d83:./botpress/data/ <Dockerfileが存在するディレクトリ>
```
起動したコンテナサーバー内の `botpress/data/` をローカルにコピーしています。
コピーが終了した後のローカルはこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/7e666591-25f3-c295-2492-bda0ac1b10bd.png)

`data/` 内を覗くと、このような構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/19f260b3-ba92-49ba-9893-d7ee6fe876ce.png)

この中にも `Dockerfile` が存在しますが、先ほど作成した自前のを使用したいので、上の画像のように、`Dockerfile` 以外を1つ上の階層に全て移動します。
その後、`data/` フォルダは削除します。

最終的に、ルートディレクトリはこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/f8576603-671b-cd74-7a1c-9d524d5bb12a.png)

この状態で、再度ビルド ⇒ 起動します。
※`botpress/server-image-001`は停止してから行ってください。
```bash
docker build -t botpress/server-image-002 . --no-cache=true
docker run -d -p 8000:3000 botpress/server-image-002
```

起動できましたら [localhost:8000](localhost:8000) にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/57ac6cc2-42af-ddec-7a88-72f1cb828bf8.png)

初回アクセス時には、adminユーザーの登録を求められます。
適当な認証情報を入力して `Create Account` を押下します。

登録に成功すると、ダッシュボードにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/7a35b3c8-eaee-4589-25cc-e68776d09a41.png)

試しにボットを作成してみます。
画面右側の「Create Bot」をクリックして、作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/73cf774d-45cb-6831-7e0f-5c77c7ee8723.png)

作成後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/7921c086-f9bb-f062-dd7a-35f0dd1a132c.png)

この段階で、一度コンテナを停止し、もう一度起動します。
その状態で、再度[localhost:8000](localhost:8000)にアクセスしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/1605d381-420a-fd94-1761-db534cf58f93.png)

再度adminユーザーの登録を求められます。
すなわち、先ほどの登録情報が反映されていません。
なぜなら、先ほどの作業はコンテナ内で完結しており、停止した時点でその内容も失われてしまいます。

なので、コンテナ起動時にローカルをバインドしてあげる必要があります。
再度コンテナを停止し、以下のコマンドで起動します。
```bash
docker run -v <ローカルのルートディレクトリ>:/botpress/data -d -p 8000:3000 botpress/server-image-002
```

相も変わらず、再度adminユーザーの登録を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/57ac6cc2-42af-ddec-7a88-72f1cb828bf8.png)

登録 ⇒ ボットの作成までを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337466/2eb562cd-181b-62b2-d745-766359389892.png)

この時点で、ローカルに `data/bots/test-bot-001` というフォルダが作成されているかと思います。
これで無事に、Docker環境からローカルのフォルダをマウントできているのが分かります。
すなわち、Botpressサーバー上の変更をローカルにも反映することができ、内容をコード管理することで複数人で開発を行うことができます。

また認証情報などは `storage/core.sqlite` に保存されています。
Botpressはデフォルトで `sqlite` を使用しておりますが、環境変数を使用して `PostgreSQL` に接続することも可能です。
公式docは[こちら](http://botpress-docs.s3-website-us-east-1.amazonaws.com/docs/infrastructure/database/)。

# まとめ
本記事では、`Docker`を起動する際にローカルをバインドし、ボットの情報などをコード管理できるようにする流れをご紹介させていただきました。
`Docker`および`Botpress`初学者の助けになれば幸いです。

# ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area