−25%

على الدفع السنوي لـ Windows حتى 31 أكتوبر. عرض الخطط

EQVPS
ابدأ الآن

خادم VPS لـ Langfuse: اعرف ما فعله وكلاؤك الأذكياء

استضف Langfuse بنفسك وتتبّع كل استدعاء LLM وكل خطوة أداة لوكلائك الذين يعملون دون مراقبة. ملف Docker Compose مُختبَر وأرقام RAM حقيقية والخطة المناسبة.

قيمة الوكيل الذي يعمل في الثالثة فجرًا دون أن يراقبه أحد تساوي قدرتك على أن تعيد لاحقًا بناء ما فعله. «أحرق رموزًا بقيمة 38 دولارًا خلال الليل» صباح سيئ. «أحرق 38 دولارًا لأن أداة البحث أعادت صفحة فارغة فأعاد المخطِّط المحاولة 400 مرة» خطأ برمجي تصلحه قبل الغداء. الجملة الثانية تحتاج إلى تتبّعات.

يسجّل Langfuse كل استدعاء LLM وكل prompt وخطوة أداة وعدد الرموز وزمن الاستجابة على شكل شجرة يمكنك التنقل فيها بالنقر. وحين تستضيفه بنفسك، تبقى هذه الطلبات والردود — وفيها غالبًا بيانات العملاء ومخرجات 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، وفي خطة NAT لا يكون العنوان الصادر عنوانك الخاص ولا يُوصَل من الخارج إلا إلى منفذ SSH. وإذا كان الوكلاء يعملون على هذا الخادم نفسه، فلا داعي لأن يواجه Langfuse الإنترنت أصلًا: للتجربة تكفي خطة Medium مع NAT (‏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 ليبقى الوكيل العكسي هو المدخل الوحيد:

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». أما الزملاء فتضيفهم من داخل المشروع.

إرسال التتبّعات من وكيل

تغلّف مكتبة SDK للغة Python دوالّك، وتتحول الاستدعاءات المتداخلة إلى spans متداخلة:

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، ومفاتيحك غير موجودة هناك، فتبقى تحدّق في لوحة فارغة.

للتحقق من الطرفية أن spans وصلت:

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

في الإصدار v4 تردّ نقطة النهاية القديمة /api/public/traces بخطأ عن وضع events-only. هذا متوقع، وليس تثبيتًا معطّلًا. في وكيل حقيقي تغلّف استدعاء LLM وكل أداة بالطريقة نفسها؛ كما أن لدى Langfuse تكاملات مع مكتبات LLM الشائعة وأطر الوكلاء، فيكفي غالبًا تغيير سطر import بدلًا من نثر المزخرِفات في كل مكان.

ما يجب مراقبته

  • القرص. يحتفظ ClickHouse وMinIO بكل ما ترسله. يُظهر docker system df -v أين ذهبت المساحة. إذا كنت تتتبّع طلبات وردودًا طويلة، فستمتلئ مساحة ‎45 GB في Medium-IP خلال أسابيع لا سنوات. افحصها مرة في الشهر؛ وحين تضيق، تتوفر خطة Pro بسعة 400 GB أو أكثر عند الطلب.
  • التحديثات. يثبّت ملف compose الإصدار الرئيسي (:4). يجلب docker compose pull && docker compose up -d الإصلاحات ضمنه. اقرأ سجل التغييرات قبل الانتقال إلى إصدار رئيسي آخر: ففي v4 تحديدًا اختفت نقطة نهاية التتبّعات.
  • النسخ الاحتياطية. ما يهم موجود في وحدات تخزين Docker: يحفظ Postgres المستخدمين والمشاريع والمفاتيح، ويحفظ ClickHouse وMinIO التتبّعات نفسها. انسخها إلى خارج الخادم وفق جدول.

هل يستحق 20$ شهريًا؟ إذا كان وكلاؤك ينفقون على الرموز أكثر من ذلك — وأغلب الوكلاء غير المراقَبين يفعلون — فإن معرفة أين ذهبت الرموز تسترد ثمنها في أول مرة تخرج فيها حلقة عن السيطرة. أما وكيل صغير يعمل مرة يوميًا فلا يحتاج إلى أي من هذا: يكفيه ملف سجل وعدّاد للرموز.

ذو صلة

جاهز للنشر؟ ادفع بالعملات المشفّرة، بلا KYC — يعمل في نحو دقيقة.

← انشر الآن

الأسئلة الشائعة

كم RAM يحتاج Langfuse المستضاف ذاتيًا؟

على خادم الاختبار لدينا عمل Langfuse v4 كست حاويات — web وworker وPostgres وClickHouse وRedis وMinIO — واستهلك نحو 3.5 GB من RAM مع مشروع فارغ. يكبر ClickHouse مع كل span ترسله. تشغّله خطة Medium-IP (‏6 GB RAM و‏45 GB قرص) براحة لعدد قليل من الوكلاء؛ أما أسطول كامل بسجل يمتد لأشهر فيحتاج إلى خطة Pro، وهي متاحة عند الطلب.

هل يحتاج Langfuse إلى عنوان IP مخصّص؟

فقط إذا كان وكلاؤك يعملون في مكان آخر ويرسلون التتبّعات عبر الإنترنت: فهم يحتاجون إلى نقطة نهاية HTTPS، وخطة NAT لا تستقبل من الخارج إلا منفذ SSH الخاص بك. إذا كان الوكلاء على الخادم نفسه، فيمكن أن يبقى Langfuse على localhost وتفتح اللوحة عبر نفق SSH؛ وتكفي لذلك خطة Medium مع NAT.

الكود يعمل، لكن اللوحة تبقى فارغة. لماذا؟

في الغالب لم تُضبط LANGFUSE_BASE_URL. من دونها يرسل SDK كل شيء إلى سحابة Langfuse نفسها، ومفاتيحك المستضافة ذاتيًا غير موجودة هناك، فلا يصل شيء إلى خادمك. ضع عنوانك أنت في هذا المتغيّر.

نقطة النهاية ‎/api/public/traces تُرجع خطأ. هل التثبيت معطّل؟

لا. يعمل Langfuse v4 في وضع events-only، وفيه تكون نقطة النهاية هذه معطّلة. اقرأ البيانات عبر ‎/api/public/v2/observations — فبهذا الاستدعاء تأكدنا من وصول spans الاختبار لدينا.

كيف أمنع الغرباء من التسجيل في نسختي؟

يقرأ Langfuse المتغيّر AUTH_DISABLE_SIGNUP، لكن ملف docker-compose.yml الافتراضي لا يمرّره إلى حاوية web، لذا لا يفيد وضعه في ‎.env وحده. أضف سطرًا واحدًا إلى بيئة langfuse-web (الأمر أدناه)، واضبطه على true بعد إنشاء حسابك، وستتلقى محاولات التسجيل التالية «Sign up is disabled».

التعليقات

لا تعليقات بعد. كن الأول.

اترك تعليقًا

تُراجَع التعليقات قبل ظهورها.