podmanを使ってDifyをローカルで動かしてみる（Macユーザー向け）

## この記事の目的
podmanを使用して、ローカル環境でDifyを実行する手順を解説します。
（Macユーザー向けですが、Windowsでも一部役に立つと思います。）

## 対象読者
- podmanを使ってローカル環境でDifyを試してみたい方
- podmanを使ってDifyを動かそうとしたらエラーが出て心が折れそうな方
- Appleシリコン（M1/M2/M3チップなど）PCでpodmanを動かしたい方

## 用語集
- podman
    - コンテナ管理ツール
        - dockerとの互換性は高いが、ちょいちょい面倒なエラーが発生する
            - 今回のDifyの環境構築にも影響あり
- Dify
    - オープンソースのLLMアプリケーションプラットフォーム
    - ローカル環境にセットアップ可能
    - APIを活用したAIアプリの開発や実行が可能

## podmanでDifyを動かす
### Difyをcloneする
[DifyのGitHubリポジトリ](https://github.com/langgenius/dify)からローカルにcloneする

### podmanのインストール / VM(仮想マシン)の起動
macユーザーであればbrewを使ってpodmanをインストール
```
brew install podman podman-compose
```
podmanで仮想マシンを起動
```
podman machine init
podman machine start
```
※ この時、Appleシリコン（M1/2/3チップ）ユーザーの場合arm・amdの違いに気をつける
`podman machine start`を実行して
`Error: vfkit exited unexpectedly with exit code 1`のエラーが出た場合は、
`podman info`を実行してインストールしたpodmanの情報を確認してください。
```
OS: darwin/amd64  #この行に注目
provider: applehv
version: 5.0.2
```
もし、Appleシリコンのpcを使っていて`amd`と記載されている場合はbrewが`amd`用の設定になっている可能性があるので、brewを下記のコマンドで再インストールします。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
export PATH="/opt/homebrew/bin:$PATH"
```
brew再インストール後、`brew config`を実行して表示される値の最後の方にある`Rosseta`が`false`になっていれば成功です。

今なら、仮想マシンを起動できるはずです。
```
podman machine start
```

[参考Issue：podman machine start continually fails with vfkit error #22624
](https://github.com/containers/podman/issues/22624)

### Difyコンテナ起動
[DifyのQuickStart](https://github.com/langgenius/dify?tab=readme-ov-file#quick-start)には、

![スクリーンショット 2024-11-04 2.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/9508c761-6c6a-758b-d42e-f2d4eed8d450.png)
で動くと書いてありますが、podmanではそんなにすんなりいきません。

```
cd dify
cd docker
cp .env.example .env
podman compose up -d
```
上記のコマンドを順々に実行していくと`podman compose up -d`で、
`RuntimeError: missing networks: default`というエラーが発生します。

`docker-compose.yaml`に追記しましょう。

```[docker-compose.yaml]
networks:
  # create a network between sandbox, api and ssrf_proxy, and can not access outside.
  ssrf_proxy_network:
    driver: bridge
    internal: true
  default:  # この行を追加
    driver: bridge  # この行を追加
```
[参考Issue：Podman deployment issues: RuntimeError: missing networks: default and socket.gaierror: [Errno -3] Temporary failure in name resolution](https://github.com/langgenius/dify/issues/4773)

そしてもう一度`podman compose up -d`を実行すると、

`Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024)`

と言われるので、

1. podmanをルートフルモードで起動
1. Difyを立ち上げるポート番号を変更

上記 1 or 2 の方法どちらかで対応してください。

#### 1. podmanをルートフルモードで起動
```
podman machine stop
podman machine set --rootful
podman machine start
```
podmanをルートフルで起動すれば、Difyデフォルト設定のポート番号でも動くはずです。

#### 2. Difyを立ち上げるポート番号を変更
`.env`にそれぞれ下記の値を入力する必要があります。

```[.env]
# ------------------------------
# Docker Compose Service Expose Host Port Configurations
# ------------------------------
EXPOSE_NGINX_PORT={適当なポート番号}  # 1024より大きい値を入力
EXPOSE_NGINX_SSL_PORT={適当なポート番号}  # 1024より大きい値を入力
```

podmanの仕様上1024より大きい数字をポート番号として使用する必要があるようで、Difyのデフォルトの数値では動かないみたいです。

1 or 2 の対応ができれば、今度こそ`podman compose up -d`で動くはずです！

### Difyの起動を確認
![スクリーンショット 2024-11-04 0.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/566fd242-2f8d-4386-3613-a21efe9c1a90.png)

`http://localhost:{先ほど入力したEXPOSE_NGINX_PORTのポート番号}/install`にアクセスするとDifyの画面が見えるはずです。

初回起動時はローディング画面か新規アカウント登録画面なのでよしなに進めていく。

### LLMのAPIキーを設定
![スクリーンショット 2024-11-04 0.24.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/a0205513-b13a-d5e1-3b04-40df862671f4.png)
画面右上のアカウント名をクリック

![スクリーンショット 2024-11-04 0.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/00c6caaf-fb9f-ecde-f5c6-908a24fe966c.png)

「プルダウン」 => 「設定」 => 「モデルプロバイダー」 => モデルを選択し、APIキーを登録。

### Difyを使ってみる
![スクリーンショット 2024-11-04 2.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641515/201cd556-9796-615c-63f3-3c31db9e4926.png)

APIキーの登録ができたら、

「探索」 => 使ってみたいテンプレートからアプリを作成してみてください。

数クリックのみで生成AIを利用したアプリを作ることができます。


## 追記（一度立ち上がったのに、気付いたら動かなくなってた人向け）
`git pull`してDifyの最新版を持ってきてから、
`podman compose up -d`をしたらDifyコンテナが立ち上がりました。


## まとめ
この記事が、podmanとdocker・Intel製チップとAppleシリコン（M1/2/3など）の差異によりローカルでDifyを動かすのに詰まって諦めそうになっていた方のヘルプになれば幸いです。

僕はpcを乗り換えたあと、以前のpcでは動いていたのに、新しいpcではpodmanが動かなくなってしまった原因がarmとamdの違いであると気づくのに最も時間を取られました。(ChatGPTに聞いても全然解決せず。。。)

せっかく書いたので記事を見てほしいという自分のエゴもありますが、できればこの記事もOpenAIのモデル等に食べてもらって、いちいちググらなくてもLLMとの対話で解決できるようになってほしい🙏