問題概要
Proxy内でus-api.i.posthog.comにアクセスできない環境である。chromadbをclient/serverモードで使用したくserverを
$ chroma run --path ./tmp/chroma
などして起動したところ、
Backing off send_request(...) for 0.2s (requests.exceptions.ProxyError:
HTTPSConnectionPool(host='us-api.i.posthog.com', port=443): Max retries exceeded
with url: /batch/ (Caused by ProxyError('Unable to connect to proxy',
OSError('Tunnel connection failed: 403 Forbidden'))))
のようにエラーが出て、起動に失敗する。
これは、Chromadbがユーザー使用状況を測定するために、telemetryによる情報収集を実施しておりus-api.i.posthog.comにアクセスしに行くため。
背景情報
ネットワーク環境
- proxy環境下でコンテンツフィルターがあり、us-api.i.posthog.comにアクセス禁止されている。
実行環境
- Ubuntu
- Python 3.12.3
- chromadb.version 0.5.3
- systemdで起動
解決策の概要
chromaをサーバーモードで実行する場合、telemetryをdisableにするオプションを指定できない。一部のサイトに記載されていた
import os
os.environ["POSTHOG_DISABLED"] = "1"
を参考に、
$ export POSTHOG_DISABLED=1
などとしてみたが、効果がなかった。
Chroma Docsに環境変数で
ANONYMIZED_TELEMETRY=False
とするように記載を発見。こっちは効果があることが分かった。
https://docs.trychroma.com/telemetry
そこで、systemdで起動するためのserviceファイルに環境変数を設定した。
手順
- chromadb.serviceを修正
[Unit]
Description=Chromadb
After=syslog.target network.target
[Service]
User=root
WorkingDirectory=/opt/chromadb
Environment="PATH=/opt/chromadb/venv/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Environment="ANONYMIZED_TELEMETRY=False"
ExecStart=/opt/chromadb/venv/bin/chroma run --host xxx.xxx.xxx.xxx --port xxx --path /opt/chromadb/models
Restart=always
[Install]
WantedBy=multi-user.target
- chromadbサービスを停止
$ sudo systemctl stop chromadb
- chromadb.serviceを更新し、chromadbをリスタート
$ sudo cp chromadb.service /etc/systemd/system/chromadb.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable chromadb
$ sudo systemctl start chromadb
結果
telemetryが無効となり、us-api.i.posthog.comへのアクセスがなくなり、chromaが正常に起動した。
注意事項
- chromadbのクライアントもProxy下ではうまく動作しないため、手当てが必要。こっちも解決済みなので別途説明予定。
- サーバー側でEmbeddingsを計算すると思っていたら、クライアント側で実施し、サーバーはSQLite3でEmbeddingsとその他属性を蓄積するのが役割のようです。