−25%

Windows-এর বার্ষিক পেমেন্টে, ৩১ অক্টোবর পর্যন্ত। প্ল্যান দেখুন

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 পড়ুন: ঠিক v4-এই ট্রেসের endpoint উধাও হয়েছিল।
  • ব্যাকআপ। যা গুরুত্বপূর্ণ, তা Docker ভলিউমে থাকে: Postgres-এ ইউজার, প্রজেক্ট আর কী; ClickHouse আর MinIO-তে ট্রেসগুলো। নির্দিষ্ট সময়সূচিতে এগুলো সার্ভারের বাইরে কপি করুন।

মাসে $20 কি এর যোগ্য? আপনার এজেন্টরা যদি টোকেনে এর চেয়ে বেশি খরচ করে — আর নজরদারি ছাড়া চলা বেশিরভাগ এজেন্টই করে — তাহলে টোকেন কোথায় গেল জানাটা প্রথমবার কোনো লুপ বেসামাল হলেই খরচ তুলে দেয়। দিনে একবার চলা ছোট একটি এজেন্টের এসবের কিছুই লাগে না: একটি লগ ফাইল আর টোকেন কাউন্টারই যথেষ্ট।

সম্পর্কিত

স্থাপন করতে প্রস্তুত? ক্রিপ্টোতে পরিশোধ করুন, KYC ছাড়াই — প্রায় এক মিনিটে লাইভ।

এখনই ডেপ্লয় করুন →

সাধারণ প্রশ্ন

নিজের সার্ভারে 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»।

মন্তব্য

এখনো কোনো মন্তব্য নেই। প্রথম হোন।

একটি মন্তব্য দিন

মন্তব্য প্রকাশের আগে মডারেট করা হয়।