Railwayで苦労したDify OSS、Lightsailに置いたら普通に動いて拍子抜けした話

以前、「Dify OSSをRailwayに構築してみた」という記事を書きました。

あの時は、

  • ドメイン設定
  • Railway側の障害
  • なぜかログインできない問題

などなど、なかなか盛りだくさんでした。
結局得られた教訓はひとつ。

「動く」と「運用できる」は別物。

そんなわけで今回は方針転換です。
RailwayのようなモダンなPaaSはいったん横に置いて、もっとシンプルに考えることにしました。

普通のLinuxサーバに置けばいいのでは?
使ったのは AWS Lightsail。

そして結果から言うと、
拍子抜けするほど普通に動きました。
本当に普通です。

Dockerを起動して、設定して、アクセスする。

それだけ。

前回あれだけ苦労した身からすると、

「え、終わり?」

という感想しか出てきませんでした。
むしろ何か見落としているんじゃないかと疑ったくらいです。

目次

今回の構成

今回やったことはこんな感じです。

Lightsailを作って、
Dockerを入れて、
Difyをgit cloneして、
docker compose up -d
あとはAPIキーを設定して、ドメイン付けて、WordPressに埋め込む。

文字にするとこれだけです。かなり王道なLinuxサーバ構築ですね。

逆に言うと、「特殊なことは何もしていない」というのが今回のポイントだったりします。

前回のRailway構築では環境固有の挙動に振り回されましたが、今回はサーバ上でDockerを動かしているだけなので、トラブルが起きても調べる場所が分かりやすい。

結果的に、こちらの方がずっと気楽でした。

まずはLightsail

今回使ったのは:

  • AWS Lightsail
  • Ubuntu 24.04

です。

正直、最初は
「EC2より簡単とはいえ、Linuxサーバ立てるの面倒そうだな…」
と思っていました。

でも実際やってみると、Railwayより何が起きてるかわかるので、逆に安心感がありました。

Docker環境を入れる

まずはDocker関連。

sudo apt update
sudo apt install -y git docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker ubuntu

ここで一度ログアウト / ログイン。この辺になると急に、

「あ、いま俺、普通にサーバ構築してるな…」

感が出てきます。

Dify OSSをclone

ここはかなりシンプルでした。

git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d

すると…

普通に起動。

え?
終わり?
Railway時代の苦労は…?

というぐらい普通に立ち上がりました。

しかし、2GBメモリでは甘かった

今回使ったLightsailは2GBメモリ。最初は「まあDifyだけだし余裕でしょ」
と思っていたのですが、甘かったです。
Difyログインが不安定だったので、途中で

free -h

を見たら、RAMがかなり埋まっていました。

Redis、Postgres、API、Worker…

Dify、思ったより普通に重い。

ということで swap を追加。

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

するとかなり安定。
Linux触ってる感が増してきます。

HTTPS化で nginx が殴り合いを始める

ここで次の壁。
Dify OSS側のDocker nginxがPORT、
80
443
を使っていました。一方で、OS側でも nginx を使いたい。

nginx vs nginx

開戦です。そこで、Dify側の .env を変更。

EXPOSE_NGINX_PORT=8080
EXPOSE_NGINX_SSL_PORT=8443

外側のOS nginxが80/443を受け、内部的にDifyの8080へ流す構成にしました。

つまり、
・OS側nginx:外部公開・HTTPS終端・リバースプロキシ
・Dify側nginx:Docker内のDifyアプリへの入口
という役割分担です。

外側nginxでリバースプロキシ

今回は、取得したドメイン
chat.******.jp
をDifyへ流す構成。

nginx側はこんな感じ。

server {
    server_name chat.******.jp;

    client_max_body_size 50m;

    large_client_header_buffers 4 32k;
    client_header_buffer_size 16k;

    location / {
        proxy_pass http://127.0.0.1:8080;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

ここまで来ると、「AIアプリ構築記事」のはずなのに、nginx 記事っぽいな

certbot、君だったのか

HTTPS化では certbot を使いました。

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d chat.testdifytest.jp

途中で、
「certbotって何者だっけ…?」となりましたが、

Let’s Encrypt の証明書取得をかなり自動でやってくれる便利なやつです。
本当に便利。
昔のSSL設定の苦労は何だったのか。

そしてAWS側Firewallでハマる

そして最後に待っていたのが、まさかのFirewallでした。

必要だったのは、

  • HTTP (80)
  • HTTPS (443)
  • SSH (22)

この3つ。
特に HTTPS の 443 を開ける必要があります。

nginxも動いている。
certbotも成功している。
設定ファイルもそれっぽい。
なのに繋がらない。

「え、またDifyが何かやってる?」

と思いながら30分ぐらい眺めていたのですが、原因はシンプルでした。

Firewall閉まってました。

インフラあるあるですね。
複雑そうなところを疑っていたら、実は一番単純なところだったパターンです。
とはいえ、Lightsailの場合はAWSコンソールからポチポチ設定するだけなので数分で解決しました。

原因が分かった瞬間の脱力感はなかなかのものでした

ナレッジ投入でまたnginxが怒る

Difyに約8MBのMarkdownをアップロードしたところ、見事に失敗しました。
最初は

「またDifyか?」

と思ったのですが、ログを見てみると原因は一発でした。

client intended to send too large body

完全にお前でした。
ということで nginx の設定に

client_max_body_size 50m;

を追加。
無事アップロード成功です。

最近こういうことが本当に増えました。
AIを触っているつもりなのに、気付くと nginx のログを読んでいる。

AIエージェントを作っているつもりなのに、
気付くと Linux と Docker と nginx を触っている。

結局のところ、AIの周りには昔ながらのインフラ技術が山ほど残っています。
そしてトラブルの原因も、だいたいそっちにあります。

まとめ

今回やってみて一番感じたのは、
「モダンそうなものが、必ずしも簡単とは限らない」ということでした。

Railwayは便利です。
数クリックで環境ができるし、見た目も洗練されています。
ただ、その分ブラックボックスな部分も多く、

  • どこで問題が起きているのか分かりにくい
  • 切り分けに時間がかかる

という場面もありました。

一方で Lightsail は驚くほど普通です。
普通のUbuntu。
普通のDocker。
普通のnginx。
特別なことは何もありません。

でも、だからこそ何か問題が起きたときに原因を追いやすい。
ログを見れば分かるし、設定ファイルも見えるし、サーバの中で何が動いているのかも把握できます。
派手さはありませんが、個人的にはこちらの方が安心して運用できそうだと感じました。
少なくとも今回のDify環境については、

「おしゃれなPaaSで苦労する」より、

「普通のLinuxサーバで普通に動く」

の方が幸せだった気がします。

後編を書くつもりだった

ちなみにこの記事、前回の記事のタイトルが「前編」だったので、本来なら「後編」に続くはずでした。
ところが気づいたら、

Railway

Lightsail

へ転職していました。もう後編ではありません。別ルートです。
映画でいうと、「前作主人公が2作目で急にいなくなった」みたいな感じです。

ちなみに今回、Dify構築より nginx を触っていた時間の方が長かった気がします。

最近のAI構築、だいたい最後は nginx 触ってる説あります。
あと AWS を触るたびに思うのですが、

Lightsail
EC2
Route53
CloudFront

あたりの名前、毎回どれが何なのか一瞬わからなくなります。
そのうち、

Moonlight
Sunrise
Thunderbolt

とか出てきても普通に信じそうです。

そんなこんなで、今回の環境は今のところかなり安定しています。
少なくとも、
「朝起きたらなぜかログインできなくなっていた」
みたいなことは起きていません。

しばらくはこの構成で遊びながら、Difyそのものの検証を進めていこうと思います。

そしてもし本当に続きが書けたら、今度こそ「後編」です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次