Langfuseセルフホストで遭遇した課題のまとめ
AI Shift Tech Blog の記事は、Langfuse v3 を GKE でセルフホストする際に遭遇する環境変数の依存関係や Helm values の設定ミス、ClickHouse と ZooKeeper の構成トラブルといった実務的な課題と解決策を詳述している。
キーポイント
環境変数の相互依存関係の理解不足
ドキュメントで必須とされる環境変数が、他の設定との組み合わせにより不要になるケースがあり、事前の包括的なドキュメント確認が不可欠である。
Helm values ファイルでの追加設定の難しさ
公式 Helm チャートの README に記載された `additionalEnv` などの設定を正しく適用し、意図通りの環境変数が生成されているかを検証する必要がある。
ClickHouse と ZooKeeper の構成最適化
単一レプリカ構成でもデフォルトで起動する ZooKeeper を無効化する設定や、分散コーディネーターとしての役割を理解した上でリソースを削減する必要がある。
PVC とノードのゾーン不一致問題
永続ボリューム(PVC)と Pod が異なるゾーンに配置されるとマウント失敗が発生するため、`volumeBindingMode: WaitForFirstConsumer` の設定が重要である。
影響分析・編集コメントを表示
影響分析
この記事は、Langfuse のような LLM エージェント監視ツールをオンプレミスやクラウド環境で運用する開発者にとって、ドキュメントの盲点となる実装上の落とし穴を明確に指摘しており、導入コストとトラブルシューティング時間の削減に寄与します。特に Kubernetes 環境でのストレージ設定や依存サービスの構成に関する知見は、大規模な AI インフラ構築において即座に活用可能な実践的価値を持ちます。
編集コメント
ドキュメントの記述と実際の挙動の乖離に気づくのは容易ではないため、この実務知見は Langfuse のセルフホストを検討するチームにとって非常に貴重なリソースです。特にストレージ設定に関する指摘は、K8s 環境特有のトラブルを未然に防ぐための重要なチェックリストとなり得ます。
Langfuseセルフホストでハマったポイントをまとめてみる
Advent Calendar
こんにちは、AIチームの長澤 (@sp_1999N) です。
この記事はAI Shift Advent Calendar 2025の16日目の記事です。
弊社サービスのAI Worker PlatformではAIエージェントの監視基盤としてLangfuseを採用しています。
Langfuseをはじめとしたエージェント監視基盤については、こちらの記事でまとめておりますので、よければご覧ください。
さて、この記事ではLangfuseを (GKEでHelm dependencyを使って) セルフホストするときに、個人的にハマってしまったポイントを整理してご紹介します。
ドキュメントを詳しく読めばわかるものも含まれますが、何かの参考になれば幸いです!
* 本記事はLangfuse v3を対象としています
Langfuseをセルフホストする場合、ローカルであればDocker Composeを、クラウド (k8s) であればHelm chartを使ってデプロイします。
この時、設定すべき環境変数が多数あります。ドキュメントには丁寧にまとめられており、またGitHubリポジトリを参考にすれば、Docker Composeを使ってのローカル環境では比較的簡単に立ち上げられます。(実際に git clone
docker compose up
必須なものが必ずしも必須とは限らない
ただ少し注意が必要なのが「一見requiredとして紹介されているが、他の環境変数と組み合わせると必須でなくなる」ものが存在する点です。例えばドキュメントではREDIS_CONNECTION_STRING
このように「組み合わせで代替できるもの」がいくつか存在します。ただ代替が可能なものは以下のように明記されているため、事前にドキュメントに目を通しておくことをお勧めします。
Connection string of your redis instance. Instead of REDIS_CONNECTION_STRING
一方でEnvironment Variablesに載っていない環境変数も設定できます。例えば、プロジェクトなどの初期セットアップを行うために必要なLANGFUSE_INIT_PROJECT_ID
従って、環境変数でハマらないようにするには、事前にドキュメントページを (Environment Variablesだけでなく、関連しそうなページを全体的に) 読んでおくことをおすすめします。
ハマりポイント:Helm values
k8sを使ってセルフホストする場合、公式配布されているHelmチャートを使う形になります。ドキュメントを見ると、概ねアプリケーション設定ごとにどのようにvaluesファイルに変数を設定すべきかが分かります。
ただし、Composeファイルで設定した環境変数をvaluesファイルではどのように書けば良いかが明記されていないものもあります。
そんな時はlangfuse-k8sのリポジトリにあるREADMEを見ることをおすすめします。READMEには必要なvalueやその指定方法が網羅されています。例えばlangfuse.salt
langfuse.additionalEnv
ただ「何をadditionalEnv
AUTH_GOOGLE_CLIENT_ID
AUTH_DISABLE_SIGNUP
AUTH_DISABLE_SIGNUP
langfuse.features.signUpDisabled
AUTH_DISABLE_SIGNUP
このほかにも「additionalEnv
このポイントにハマらないようにするにはREADMEと睨めっこしながらも「実際にレンダリングを行って、意図通りの環境変数が作成されているか」をチェックすることをオススメします。
ハマりポイント:ClickHouse
Langfuseではトレース保存用データベースとしてClickHouseを内部利用します。ClickHouseに関して、ハマりポイントが2つあったのでご紹介します。
いつの間にかいるZooKeeper
Langfuseのドキュメントではその存在を見かけないのですが、実際にk8sでデプロイするとZooKeeperというPodが立っていることに気が付きます。この正体は「ClickHouseが内部的に利用する分散コーディネータ」になります。ClickHouseを複数レプリカ立てる時に、分散クエリの調整やテーブルメタデータの管理などをしてくれます。
この時、nodeSelector
逆に単一レプリカのnon-HA構成ならZooKeeperがデプロイされないかというとそういうわけではなく、デフォルトでデプロイされるようになっています。単一レプリカ時は不要になるので、Helmチャートでデプロイされないように指定する必要があります。(e.g., clickhouse.zookeeper.enabled: false
(一点余談としては、ClickHouseは分散コーディネーターとしてClickHouse Keeperを推奨しているようですので、将来的にはLangfuseでZooKeeperを意識することもなくなるのかなと感じています)
PVC作成ゾーンに気をつけろ
これはLangfuseに限った話ではないですが、ClickHouseのPodがうまく立たない時に遭遇したものになります。
ClickHouseには永続ボリュームが必要なため、PVC (PersistentVolumeClaim) が作成されます。この時、環境や設定によっては「PVCとClickHouse Pod (k8s node) が存在するゾーンが互いに異なる」ことがあります。このような状況が発生すると、ClickHouse Podが永続ボリュームをマウントすることができず、Podが立ち上がってくれない事態が発生します。
これを避けるにはclickhouse.persistence.storageClass
volumeBindingMode
WaitForFirstConsumer
PodがスケジュールされるまでPVCのバインディングを遅延
Podがスケジュールされるノードのゾーンに合わせてPVが作成される
今回の記事では、弊社のAIエージェントサービスで利用しているLangfuseについて、個人的にハマってしまったポイントをご紹介しました。公式のHelmチャートをそのまま利用する場合は強く意識せずともうまく立ち上がる気もしますが、既存のクラスタに取り込むなど、LangfuseをHelm dependencyでサブチャート化しようとした時に自分は苦しんでしまいました。
この躓きが誰かの参考になれば幸いです。
原文を表示
Langfuse セルフホストでハマったポイントをまとめてみる
Advent Calendar
こんにちは、AI チームの長澤 (@sp_1999N) です。
この記事はAI Shift Advent Calendar 2025の16日目の記事です。
弊社サービスの AI Worker Platform では AI エージェントの監視基盤として Langfuse を採用しています。
Langfuse をはじめとしたエージェント監視基盤については、こちらの記事でまとめておりますので、よければご覧ください。
さて、この記事では Langfuse を (GKE で Helm dependency を使って) セルフホストするときに、個人的にハマってしまったポイントを整理してご紹介します。
ドキュメントを詳しく読めばわかるものも含まれますが、何かの参考になれば幸いです!
* 本記事は Langfuse v3 を対象としています
Langfuse をセルフホストする場合、ローカルであれば Docker Compose を、クラウド (k8s) であれば Helm chart を使ってデプロイします。
この時、設定すべき環境変数が多数あります。ドキュメントには丁寧にまとめられており、また GitHub リポジトリを参考にすれば、Docker Compose を使ってのローカル環境では比較的簡単に立ち上げられます。(実際に git clone
docker compose up
必須なものが必ずしも必須とは限らない
ただ少し注意が必要なのが「一見 required として紹介されているが、他の環境変数と組み合わせると必須でなくなる」ものが存在する点です。例えばドキュメントでは REDIS_CONNECTION_STRING
このように「組み合わせで代替できるもの」がいくつか存在します。ただ代替が可能なものは以下のように明記されているため、事前にドキュメントに目を通しておくことをお勧めします。
Connection string of your redis instance. Instead of REDIS_CONNECTION_STRING
一方で Environment Variables に載っていない環境変数も設定できます。例えば、プロジェクトなどの初期セットアップを行うために必要な LANGFUSE_INIT_PROJECT_ID
従って、環境変数でハマらないようにするには、事前にドキュメントページを (Environment Variables だけでなく、関連しそうなページを全体的に) 読んでおくことをおすすめします。
ハマりポイント:Helm values
k8s を使ってセルフホストする場合、公式配布されている Helm チャートを使う形になります。ドキュメントを見ると、概ねアプリケーション設定ごとにどのように values ファイルに変数を設定すべきかが分かります。
ただし、Compose ファイルで設定した環境変数を values ファイルではどのように書けば良いかが明記されていないものもあります。
そんな時は langfuse-k8s のリポジトリにある README を見ることをおすすめします。README には必要な value やその指定方法が網羅されています。例えば langfuse.salt
langfuse.additionalEnv
ただ「何を additionalEnv
AUTH_GOOGLE_CLIENT_ID
AUTH_DISABLE_SIGNUP
AUTH_DISABLE_SIGNUP
langfuse.features.signUpDisabled
AUTH_DISABLE_SIGNUP
このほかにも「additionalEnv
このポイントにハマらないようにするには README と睨めっこしながらも「実際にレンダリングを行って、意図通りの環境変数が作成されているか」をチェックすることをオススメします。
ハマりポイント:ClickHouse
Langfuse ではトレース保存用データベースとして ClickHouse を内部利用します。ClickHouse に関して、ハマりポイントが2つあったのでご紹介します。
いつの間にかいる ZooKeeper
Langfuse のドキュメントではその存在を見かけないのですが、実際に k8s でデプロイすると ZooKeeper という Pod が立っていることに気が付きます。この正体は「ClickHouse が内部的に利用する分散コーディネータ」になります。ClickHouse を複数レプリカ立てる時に、分散クエリの調整やテーブルメタデータの管理などをしてくれます。
この時、nodeSelector
逆に単一レプリカの non-HA 構成なら ZooKeeper がデプロイされないかというとそういうわけではなく、デフォルトでデプロイされるようになっています。単一レプリカ時は不要になるので、Helm チャートでデプロイされないように指定する必要があります。(e.g., clickhouse.zookeeper.enabled: false
(一点余談としては、ClickHouse は分散コーディネーターとして ClickHouse Keeper を推奨しているようですので、将来的には Langfuse で ZooKeeper を意識することもなくなるのかなと感じています)
PVC 作成ゾーンに気をつけろ
これは Langfuse に限った話ではないですが、ClickHouse の Pod がうまく立たない時に遭遇したものになります。
ClickHouse には永続ボリュームが必要なため、PVC (PersistentVolumeClaim) が作成されます。この時、環境や設定によっては「PVC と ClickHouse Pod (k8s node) が存在するゾーンが互いに異なる」ことがあります。このような状況が発生すると、ClickHouse Pod が永続ボリュームをマウントすることができず、Pod が立ち上がってくれない事態が発生します。
これを避けるには clickhouse.persistence.storageClass
volumeBindingMode
WaitForFirstConsumer
PodがスケジュールされるまでPVCのバインディングを遅延
Podがスケジュールされるノードのゾーンに合わせてPVが作成される
今回の記事では、弊社の AI エージェントサービスで利用している Langfuse について、個人的にハマってしまったポイントをご紹介しました。公式の Helm チャートをそのまま利用する場合は強く意識せずともうまく立ち上がる気もしますが、既存のクラスタに取り込むなど、Langfuse を Helm dependency でサブチャート化しようとした時に自分は苦しんでしまいました。
この躓きが誰かの参考になれば幸いです。
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み