PyCharmとDockerとAzure Container Appsでチャットボット開発と構築

# 概要

PyCharmとDockerを用いて開発を行い、それをAzureにデプロイしてみました。

:::note info
PyCharmではDockerだけでなくdocker-composeも使用していますが、なぜかDockerの外側からのポート指定が上手くいかなかったのでdocker-composeを経由しています。Docker Desktopから起動した場合やアプリのデプロイ時には上手くいっているので、PyCharm上の設定が上手くいっていないのだと思います。
:::

## ソースコード
以下ではソースコードについては説明していません。
適宜、下記ソースコードを参照してください。

- https://github.com/hydrangeas/langchain-chainlit-test

## アーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/97bd7d81-ad36-98f9-f215-9b1b2d7390fc.png)

## ディレクトリ構造

```
.
|-- .chainlit
|   `-- config.toml ..Chainlitの設定ファイル
|-- Dockerfile
|-- chainlit.md ..Chainlit上で表示するReadme
|-- docker-compose.yml
|-- main.py ..チャットボットフロントエンド用Pythonファイル（Chainlit）
|-- make_data.py ..ドキュメントデータベース作成用Pythonふぃある
|-- public
|   |-- favicon.ico ..Chainlitで変更するfavicon
|   |-- logo_dark.png ..ダークテーマ用ロゴ
|   `-- logo_light.png ..通常テーマ用ロゴ
|-- requirements.txt
`-- samples
    `-- 001018385.pdf ..チャットボット用のデータサンプル
```

## PyCharmでDockerの設定

Dockerの設定についてはDockerfileを参照してください。基本的には.envファイルさえ作成されていればあとはローカルファイルをごっそりコピーして構築しています。また、Dockerだけでは起動できなかったので、docker-composeについても構築しています。

:::note warn
事前に.envファイルを作成しておいてください。環境変数（APIキー）はDocker外部から与えるのではなく、内部にファイルとして渡しています。
:::

### 実行構成の追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/2778dee6-a344-a98f-8a3a-1aadb28af4df.png)
**実行構成の編集**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/460d4683-1323-a715-5ff4-d33d10cba579.png)
**+** ⇒ **Docker Compose**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/f643e669-59e5-6f63-d216-5460f63404f1.png)
**実行**

以上でDockerがビルドされ、実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/66bc075d-a876-009a-d270-88e3ae2d768e.png)

## Azure Container Registry

### ACRリソース作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/3b7ed7ce-993f-408e-a4ee-089ea3dc4a15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/6acdd8f5-19c3-8962-12e3-ddcc2239fa4c.png)
**管理者ユーザー**のチェックを入れておく

### ACRへのpush

:::note info
ACRへpushする前にビルド済みdockerのtagをpush先と合わせておくと楽
コマンド例：```docker tag langchain-chainlit-test-web acrchainlit.azurecr.io/langchain-chainlit-test-web```
:::

```powershell
az login
az acr login --name acrchainlit
docker push acrchainlit.azurecr.io/langchain-chainlit-test-web
```

## Azure Container Apps

### ACAリソース作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/d77f1502-7e84-e669-d9e2-451cee76f1c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/0cb4d61a-12fc-2c1d-094c-514fec19d6d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/5e334b5c-bf36-f4ff-2258-625ad23a5916.png)

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/ab5523fb-54d5-c367-6084-c490031e2b44.png)

## 雑感

いくつかはまりポイントがありました。

1. Web AppsだとPython3.11に付属するSQLiteバージョンが足りず、Chainlitが起動できない（解決できなかった）
1. Vercelだと起動すらできなかった（理由不明）
1. 他の無料環境だとPythonライブラリが大きすぎてデプロイできないことが多かった
1. PyCharmでインタープリターを設定すると設定が完了できない（実行構成をするとあっさり終わる）
1. ACA設定時にターゲットポートを設定しておかないとアクセスできない（慣れていなかったので探すのに時間がかかってしまいました）

1週間くらいかかりましたが、ようやく考えていた通りの環境ができました。