−25%

Windows के सालाना भुगतान पर, 31 अक्टूबर तक। प्लान देखें

EQVPS
शुरू करें

Langfuse के लिए VPS: आपके AI एजेंटों ने क्या किया

Langfuse ख़ुद होस्ट करें और बिना निगरानी चलने वाले एजेंटों की हर LLM कॉल और हर टूल स्टेप ट्रेस करें। परखा हुआ Docker Compose, असली RAM आंकड़े और सही प्लान।

रात तीन बजे बिना किसी की निगरानी के काम करने वाला एजेंट उतना ही काम का है, जितना आप बाद में यह दोबारा जोड़ पाएँ कि उसने क्या किया। “रात भर में 38 $ के टोकन फूँक दिए” एक बुरी सुबह है। “38 $ फूँक दिए क्योंकि सर्च टूल ने ख़ाली पेज लौटाया और प्लानर ने 400 बार दोबारा कोशिश की” एक बग है, जिसे आप दोपहर के खाने से पहले ठीक कर देते हैं। दूसरे वाक्य के लिए ट्रेस चाहिए।

Langfuse हर LLM कॉल, हर प्रॉम्प्ट, टूल स्टेप, टोकन गिनती और लेटेंसी को एक पेड़ की तरह दर्ज करता है, जिसमें आप क्लिक करके घूम सकते हैं। जब आप इसे ख़ुद होस्ट करते हैं, तो ये प्रॉम्प्ट और जवाब — जिनमें अक्सर ग्राहकों का डेटा, API आउटपुट और कभी-कभार कोई भूला हुआ सीक्रेट भी होता है — आपके नियंत्रण वाले सर्वर पर रहते हैं, किसी और के डैशबोर्ड में नहीं।

इसे चलाए रखने की लागत

Langfuse v4 कोई छोटी बाइनरी नहीं, बल्कि छह कंटेनर है: वेब ऐप, बैकग्राउंड worker, Postgres, इवेंट्स के लिए ClickHouse, Redis और फ़ाइलों के लिए MinIO। हमने इसे एक टेस्ट सर्वर पर लगाया और ख़ाली प्रोजेक्ट के साथ लगभग 3.5 GB RAM इस्तेमाल में मापी। जो बढ़ता है, वह ClickHouse है, क्योंकि आपका भेजा हर span वहीं जाता है।

लोडप्लान
कुछ एजेंट, हफ़्तों के ट्रेसMedium-IP: 6 vCPU, 6 GB, 45 GB ($20/माह)
एजेंटों का बेड़ा, महीनों का इतिहासPro प्लान, 32 GB RAM से ऊपर — अनुरोध पर

छोटे प्लान पर यह इंस्टॉल तो हो जाता है, पर जैसे ही ClickHouse और worker को एक साथ मेमोरी चाहिए, यह हाँफने लगता है। मैं 6 GB से नीचे नहीं जाता।

एजेंट कहाँ रहते हैं? अगर वे दूसरी मशीनों पर चलते हैं, तो अपने IPv4 वाला प्लान लें: उन्हें HTTPS endpoint चाहिए, और NAT प्लान पर बाहर जाने वाला पता आपका अपना नहीं होता और बाहर से केवल SSH पोर्ट तक पहुँचा जा सकता है। अगर एजेंट इसी सर्वर पर चलते हैं, तो Langfuse को इंटरनेट की ओर खुलने की ज़रूरत ही नहीं: आज़माने के लिए NAT वाला Medium ($12/माह) काफ़ी है। दो लोकेशन हैं, जर्मनी और फ़िनलैंड; उपलब्धता ऑर्डर करते समय दिखती है। वह चुनें जो एजेंटों के क़रीब हो, आपके नहीं। सर्वर का भुगतान क्रिप्टो से होता है, बिना KYC के।

इंस्टॉलेशन

नए Ubuntu 24.04 या Debian 12 सर्वर पर, root के रूप में। पहले Docker:

curl -fsSL https://get.docker.com | sh

फिर Langfuse, compose फ़ाइल के डिफ़ॉल्ट मानों की जगह असली सीक्रेट्स के साथ:

git clone --depth 1 https://github.com/langfuse/langfuse.git
cd langfuse

PG=$(openssl rand -hex 16); MINIO=$(openssl rand -hex 16)
cat > .env <<EOF
NEXTAUTH_URL=https://langfuse.example.com
NEXTAUTH_SECRET=$(openssl rand -hex 32)
SALT=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$PG
DATABASE_URL=postgresql://postgres:$PG@postgres:5432/postgres
CLICKHOUSE_PASSWORD=$(openssl rand -hex 16)
MINIO_ROOT_PASSWORD=$MINIO
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=$MINIO
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=$MINIO
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY=$MINIO
REDIS_AUTH=$(openssl rand -hex 16)
TELEMETRY_ENABLED=false
EOF
chmod 600 .env

इनमें से दो पासवर्ड जोड़ी में चलते हैं: Postgres का पासवर्ड DATABASE_URL के अंदर भी है, और MinIO का पासवर्ड तीन S3_..._SECRET_ACCESS_KEY लाइनों से मेल खाना चाहिए। इसीलिए हर एक एक ही वेरिएबल से आता है।

अब जाल। compose फ़ाइल वेब ऐप को पोर्ट 3000 पर और MinIO को 9090 पर सभी इंटरफ़ेस पर प्रकाशित करती है, और Docker के प्रकाशित पोर्ट ufw को बायपास करते हैं। दोनों को localhost से बाँध दें, ताकि reverse proxy ही इकलौता रास्ता रहे:

sed -i 's/- 3000:3000/- 127.0.0.1:3000:3000/; s/- 9090:9000/- 127.0.0.1:9090:9000/' docker-compose.yml
docker compose up -d
curl -s http://127.0.0.1:3000/api/public/health

आख़िरी कमांड को {"status":"OK", ...} दिखाना चाहिए। पहली बार चालू होने पर डेटाबेस माइग्रेशन चलते हैं; हमारे टेस्ट में कंटेनर चालू होने के लगभग 15 सेकंड बाद हेल्थ चेक पास हुआ।

सामने HTTPS

langfuse.example.com को सर्वर के IP पर पॉइंट करें, फिर:

apt install -y caddy
cat > /etc/caddy/Caddyfile <<'EOF'
langfuse.example.com {
    reverse_proxy 127.0.0.1:3000
}
EOF
systemctl reload caddy
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable

Caddy सर्टिफ़िकेट ख़ुद ले लेता है। साइट खोलें, अपना खाता बनाएँ (यह पहला संगठन बनता है), एक प्रोजेक्ट जोड़ें और उसकी पब्लिक और सीक्रेट कुंजियाँ कॉपी करें।

फिर दरवाज़ा बंद कर दें। Langfuse AUTH_DISABLE_SIGNUP समझता है, पर डिफ़ॉल्ट compose फ़ाइल इसे web कंटेनर तक नहीं पहुँचाती, इसलिए langfuse-web के नीचे एक लाइन और चाहिए:

sed -i 's|^      NEXTAUTH_SECRET: \(.*\)$|      NEXTAUTH_SECRET: \1\n      AUTH_DISABLE_SIGNUP: ${AUTH_DISABLE_SIGNUP:-false}|' docker-compose.yml
echo "AUTH_DISABLE_SIGNUP=true" >> .env
docker compose up -d

अब से साइन अप की हर कोशिश को «Sign up is disabled» मिलता है। साथियों को प्रोजेक्ट के अंदर से जोड़ें।

एजेंट से ट्रेस भेजना

Python SDK आपके फ़ंक्शनों को रैप करता है, और नेस्टेड कॉल नेस्टेड span बन जाती हैं:

python3 -m venv venv && . venv/bin/activate
pip install langfuse
export LANGFUSE_PUBLIC_KEY=pk-lf-...
export LANGFUSE_SECRET_KEY=sk-lf-...
export LANGFUSE_BASE_URL=https://langfuse.example.com
from langfuse import get_client, observe

langfuse = get_client()  # LANGFUSE_* वेरिएबल पढ़ता है

@observe(name="fetch-prices")
def fetch_prices(pair: str) -> dict:
    return {"pair": pair, "bid": 64210.5}

@observe(name="nightly-agent-run")
def run() -> str:
    data = fetch_prices("BTC/USDT")
    return f"done: {data['pair']}"

print(run())
langfuse.flush()  # छोटी स्क्रिप्ट बैकग्राउंड भेजना पूरा होने से पहले खत्म हो जाती हैं

LANGFUSE_BASE_URL को न छोड़ें। इसके बिना SDK चुपचाप सब कुछ Langfuse के क्लाउड पर भेज देता है, आपकी कुंजियाँ वहाँ नहीं होतीं और आप ख़ाली डैशबोर्ड देखते रह जाते हैं।

टर्मिनल से जाँचें कि span पहुँच गए:

curl -s -u "$LANGFUSE_PUBLIC_KEY:$LANGFUSE_SECRET_KEY" \
  "$LANGFUSE_BASE_URL/api/public/v2/observations?limit=5"

v4 में पुराना endpoint /api/public/traces events-only मोड के बारे में एरर लौटाता है। यह अपेक्षित है, इंस्टॉलेशन टूटा नहीं है। असली एजेंट में आप LLM कॉल और हर टूल को इसी तरह रैप करते हैं; साथ ही Langfuse में लोकप्रिय LLM SDK और एजेंट फ़्रेमवर्क के इंटीग्रेशन हैं, इसलिए अक्सर हर जगह डेकोरेटर लगाने के बजाय एक import बदलना काफ़ी होता है।

किन चीज़ों पर नज़र रखें

  • डिस्क। ClickHouse और MinIO आपका भेजा सब कुछ रखते हैं। जगह कहाँ गई, यह docker system df -v दिखाता है। अगर आप लंबे प्रॉम्प्ट और जवाब ट्रेस करते हैं, तो Medium-IP की 45 GB डिस्क सालों में नहीं, हफ़्तों में भर जाती है। महीने में एक बार जाँचें; जगह कम पड़े तो 400 GB या उससे ज़्यादा वाला Pro प्लान अनुरोध पर मिलता है।
  • अपडेट। compose फ़ाइल मेजर वर्शन (:4) को पिन करती है। docker compose pull && docker compose up -d उसी के भीतर के फ़िक्स लाता है। मेजर वर्शन बदलने से पहले changelog पढ़ें: ट्रेस वाला endpoint ठीक v4 में ही ग़ायब हुआ।
  • बैकअप। जो मायने रखता है, वह Docker वॉल्यूम में है: Postgres में यूज़र, प्रोजेक्ट और कुंजियाँ; ClickHouse और MinIO में ख़ुद ट्रेस। इन्हें तय समय पर सर्वर से बाहर कॉपी करें।

क्या यह $20 महीने का है? अगर आपके एजेंट टोकन पर इससे ज़्यादा ख़र्च करते हैं — और ज़्यादातर बिना निगरानी वाले एजेंट करते हैं — तो टोकन कहाँ गए यह जानना पहली ही बार में वसूल हो जाता है, जब कोई लूप बेक़ाबू होता है। दिन में एक बार चलने वाले एक छोटे एजेंट को इसकी ज़रूरत नहीं: एक लॉग फ़ाइल और टोकन काउंटर काफ़ी है।

संबंधित

तैनात करने के लिए तैयार? क्रिप्टो से भुगतान करें, बिना KYC — लगभग एक मिनट में ऑनलाइन।

अभी तैनात करें →

FAQ

अपने सर्वर पर Langfuse को कितनी RAM चाहिए?

हमारे टेस्ट सर्वर पर Langfuse v4 छह कंटेनरों के रूप में चला — web, worker, Postgres, ClickHouse, Redis और MinIO — और ख़ाली प्रोजेक्ट के साथ लगभग 3.5 GB RAM लेता रहा। आप जो भी span भेजते हैं, उसके साथ ClickHouse बढ़ता है। Medium-IP (6 GB RAM, 45 GB डिस्क) कुछ एजेंटों के लिए इसे आराम से चलाता है; महीनों के इतिहास वाले पूरे एजेंट बेड़े को Pro प्लान चाहिए, जो अनुरोध पर मिलता है।

क्या Langfuse को अपना अलग IP पता चाहिए?

सिर्फ़ तब, जब एजेंट कहीं और चलते हों और ट्रेस इंटरनेट से भेजते हों: उन्हें HTTPS endpoint चाहिए, और NAT प्लान बाहर से केवल आपका SSH पोर्ट स्वीकार करता है। अगर एजेंट उसी सर्वर पर रहते हैं, तो Langfuse localhost पर रह सकता है और डैशबोर्ड आप SSH टनल से खोलते हैं; इसके लिए NAT वाला Medium प्लान काफ़ी है।

कोड चलता है, पर डैशबोर्ड ख़ाली रहता है। क्यों?

लगभग हमेशा LANGFUSE_BASE_URL सेट नहीं होता। इसके बिना SDK सब कुछ Langfuse के अपने क्लाउड पर भेजता है, आपकी अपनी इंस्टेंस की कुंजियाँ वहाँ मौजूद नहीं होतीं और आपके सर्वर तक कुछ नहीं पहुँचता। वेरिएबल में अपना पता डालें।

/api/public/traces endpoint एरर देता है। क्या इंस्टॉलेशन टूटा हुआ है?

नहीं। Langfuse v4 events-only मोड में चलता है, जिसमें यह endpoint बंद रहता है। डेटा /api/public/v2/observations से पढ़ें — इसी कॉल से हमने पुष्टि की थी कि हमारे टेस्ट span पहुँच गए हैं।

अनजान लोगों को अपनी इंस्टेंस पर साइन अप करने से कैसे रोकें?

Langfuse AUTH_DISABLE_SIGNUP पढ़ता है, लेकिन डिफ़ॉल्ट docker-compose.yml यह वेरिएबल web कंटेनर तक नहीं पहुँचाता, इसलिए इसे केवल .env में लिखने से कुछ नहीं होता। langfuse-web के environment में एक लाइन जोड़ें (कमांड नीचे है), अपना खाता बनाने के बाद इसे true करें, और आगे के साइन-अप को «Sign up is disabled» मिलेगा।

टिप्पणियाँ

अभी तक कोई टिप्पणी नहीं। पहले बनें।

एक टिप्पणी छोड़ें

टिप्पणियाँ दिखने से पहले मॉडरेट की जाती हैं।