تشغيل وكيل ذكاء اصطناعي على سيرفر 24 ساعة باستخدام Docker

لكي يعمل وكيل الذكاء الاصطناعي 24 ساعة دون انقطاع، ضعه داخل حاوية Docker وشغّله بـ Docker Compose على سيرفر يعمل دائمًا مع سياسة restart: unless-stopped، واحفظ مفاتيح API في ملف .env لا يدخل git أبدًا، وحدّد حجم السجلات، وأضف فحصًا للصحة (health check)، وضع حدودًا صارمة لإنفاق LLM API. تجد أدناه كل خطوة مع ملفات جاهزة للنسخ لوكيل مكتوب بـ Python، والفكرة نفسها تنطبق على Node.js.
المقصود بالوكيل هنا عملية تعمل باستمرار، تستدعي نموذجًا لغويًا عبر واجهة خارجية وتستخدم أدوات، وغالبًا تتحدث مع الناس عبر Telegram أو واتساب أو Discord أو تنفذ مهام مجدولة. وإن كان مشروعك بوت محادثة بسيطًا، فدليلنا عن تشغيل بوت تيليجرام 24 ساعة على VPS يغطي التفاصيل الخاصة بالبوتات.
لماذا يتوقف الوكيل الذي يعمل على جهازك؟
وضع السكون: يتوقف الوكيل كلما نام الجهاز، ولا أحد يعيد تشغيله.
لا عنوان ثابت: اتصال المنزل خلف NAT وعنوان IP يتغير، فلا تصل إليك webhooks واتساب أو بوابة الدفع إلا عبر نفق.
الأعطال في منتصف الليل: خطأ واحد غير معالج ينهي العملية، ولا شيء يعيدها حتى تلاحظ أنت.
المفاتيح على جهاز شخصي ولا سجل تعود إليه عند حدوث مشكلة.
السيرفر الدائم يحل أول مشكلتين، والباقي انضباط في التشغيل: إشراف على العملية، وأسرار محمية، وسجلات، وفحص صحة، وحدود للتكلفة، وطابور مهام، وحالة محفوظة، وطريقة تحديث نظيفة. ولتقدير العتاد حسب نوع العمل راجع مقالنا عن متطلبات سيرفر تطبيقات الذكاء الاصطناعي.
الخطوة 1: وضع الوكيل داخل حاوية Docker
ضع الكود في حزمة agent/ تحتوي main.py (نقطة تشغيل البوت أو الواجهة) وworker.py (للمهام الطويلة)، وثبّت إصدارات المكتبات في requirements.txt، ثم أضف ملف Dockerfile التالي:
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
RUN useradd --create-home --uid 10001 agent
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY --chown=agent:agent . .
USER agent
CMD ["python", "-m", "agent.main"]نسخ requirements.txt قبل باقي الكود يجعل Docker يحتفظ بطبقة المكتبات، فتستغرق إعادة البناء بعد تعديل الكود ثوانيَ معدودة. والمتغير PYTHONUNBUFFERED=1 يجعل السجلات تظهر لحظة كتابتها، والحاوية تعمل بمستخدم بلا صلاحيات root. وأضف ملف .dockerignore، وإلا فإن COPY . . سينسخ أسرارك داخل الصورة نفسها:
.env
.git
__pycache__/
*.pycالخطوة 2: ملف docker compose مع إعادة التشغيل وفحص الصحة
هذا الملف يشغّل الوكيل، وworker للمهام الطويلة، وPostgreSQL مع pgvector للذاكرة:
x-logging: &default-logging
driver: json-file
options:
max-size: "10m"
max-file: "3"
services:
agent:
build: .
restart: unless-stopped
env_file: .env
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=3)"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
logging: *default-logging
worker:
build: .
command: ["python", "-m", "agent.worker"]
restart: unless-stopped
env_file: .env
stop_grace_period: 30s
depends_on:
db:
condition: service_healthy
logging: *default-logging
db:
image: pgvector/pgvector:pg16
restart: unless-stopped
environment:
POSTGRES_DB: agent
POSTGRES_USER: agent
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U agent -d agent"]
interval: 10s
timeout: 5s
retries: 5
logging: *default-logging
volumes:
pgdata:sudo systemctl enable --now docker
docker compose up -d --build
docker compose ps
docker compose logs -f --tail=100 agentدور كل جزء، والأخطاء التي يقع فيها كثيرون:
restart: unless-stopped يعيد تشغيل الحاوية إذا توقفت، ويشغّلها بعد إعادة تشغيل السيرفر ما دامت خدمة Docker مفعّلة. أما الحاوية التي أوقفتها يدويًا فتبقى متوقفة.
فحص الصحة يضع علامة "unhealthy" فقط. Docker Compose وحده لا يعيد تشغيل الحاوية غير السليمة. لذلك صمّم الوكيل لينهي نفسه عندما يعلق: اجعل
/healthيعرض وقت آخر دورة ناجحة، ودع مراقبًا داخليًا (watchdog) ينهي العملية إذا مرت على ذلك دقائق، وسياسة إعادة التشغيل تتكفل بالباقي.depends_on مع service_healthy يؤخر تشغيل الوكيل حتى تقبل PostgreSQL الاتصالات، فلا يدخل في حلقة أعطال عند الإقلاع.
حدود السجلات ضرورية، فبدون
max-sizeتكبر سجلات Docker الافتراضية حتى تمتلئ المساحة.
وإذا كان سيرفرك مثبتًا عليه PostgreSQL مع pgvector بالفعل، يمكنك حذف خدمة db وتوجيه DATABASE_URL إليها، مع السماح باتصالات شبكة Docker في listen_addresses وpg_hba.conf. وتفاصيل الإنتاج الأخرى في قائمة مراجعة Docker Compose لبيئة الإنتاج على VPS.
الخطوة 3: إبعاد مفاتيح API عن الكود وعن git
LLM_API_KEY=replace-with-your-key
TELEGRAM_BOT_TOKEN=replace-with-your-token
POSTGRES_PASSWORD=replace-with-output-of-openssl-rand-hex-24
DATABASE_URL=postgresql://agent:same-password-as-above@db:5432/agent
DAILY_BUDGET_USD=5
MAX_STEPS_PER_TASK=8openssl rand -hex 24
chmod 600 .env
echo ".env" >> .gitignoreيقرأ Compose ملف .env مرتين: عبر env_file، ولتعويض ${POSTGRES_PASSWORD} داخل ملف YAML. وكلمة المرور بصيغة hex تتجنب الرموز التي تُفسد رابط قاعدة البيانات. استخدم مفتاح API منفصلًا لكل مشروع لترى إنفاقه وتلغيه وحده عند الحاجة. وإذا وصل مفتاح إلى commit في git يومًا، فغيّره من لوحة المزود فورًا، ولا يكفي حذف الـ commit.
الخطوة 4: التحكم في فاتورة LLM API
الوكلاء يعملون في حلقات، وخطأ واحد في استدعاء أداة قد يكرر آلاف الطلبات أثناء الليل. ضع الحدود على عدة مستويات:
لكل استدعاء: حد أقصى لعدد tokens الناتجة ومهلة للطلب.
لكل مهمة: حد لعدد الخطوات (8 إلى 10 تكفي معظم الوكلاء) وللوقت الكلي.
لكل مستخدم: حصة يومية من الرسائل أو الـ tokens في أي بوت مفتوح للعامة.
إعادة المحاولة: انتظار متزايد عند أخطاء 429 و5xx مع عدد أقصى، لا حلقة لا نهائية.
لكل يوم: سجّل الاستهلاك وارفض أي استدعاء جديد بعد بلوغ الميزانية.
خط الدفاع الأخير: حدود الإنفاق وتنبيهات الميزانية في لوحة مزود النموذج اللغوي.
CREATE TABLE llm_usage (
id bigserial PRIMARY KEY,
created_at timestamptz NOT NULL DEFAULT now(),
task_id text,
model text NOT NULL,
input_tokens integer NOT NULL,
output_tokens integer NOT NULL,
cost_usd numeric(10,5) NOT NULL
);
-- before each LLM call: stop if today's spend reached the budget
SELECT coalesce(sum(cost_usd), 0) AS spent_today
FROM llm_usage
WHERE created_at >= date_trunc('day', now());الخطوة 5: طابور للمهام الطويلة بدل تعطيل الردود
منصات المراسلة تنتظر تأكيدًا سريعًا لكل webhook، وتعيد الإرسال إن لم يصلها، وهكذا ينتهي الوكيل البطيء بالرد مرتين على الرسالة نفسها. الحل: استقبل الرسالة، وسجّل مهمة، وأكّد الاستلام، ثم دع الـ worker ينفذ البحث أو جمع البيانات أو السلاسل الطويلة. وفي الأحجام الصغيرة تصلح PostgreSQL طابورًا ممتازًا:
CREATE TABLE jobs (
id bigserial PRIMARY KEY,
status text NOT NULL DEFAULT 'queued',
payload jsonb NOT NULL,
attempts integer NOT NULL DEFAULT 0,
created_at timestamptz NOT NULL DEFAULT now()
);
-- each worker claims one job; SKIP LOCKED stops two workers taking the same row
UPDATE jobs SET status = 'running', attempts = attempts + 1
WHERE id = (
SELECT id FROM jobs
WHERE status = 'queued'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED
)
RETURNING id, payload;انتقل إلى Redis حين تعالج عددًا كبيرًا من المهام في الثانية. ولربط الوكيل بواتساب استخدم WhatsApp Business Cloud API الرسمية، فالمكتبات غير الرسمية تخالف شروط المنصة وتعرّض الرقم للحظر.
الخطوة 6: الذاكرة والحالة في PostgreSQL
سجل المحادثات وإعدادات المستخدمين ونتائج الأدوات وحالة المهام مكانها قاعدة البيانات لا ذاكرة العملية، حتى لا تضيع أي معلومة عند إعادة التشغيل. وأرسل للنموذج آخر رسائل قليلة مع ملخص متجدد للمحادثة، لأن السجل الكامل يكلفك tokens في كل استدعاء. وللمعرفة طويلة المدى خزّن الـ embeddings بجوار بياناتك باستخدام pgvector، ويشرح دليل بناء RAG باستخدام PostgreSQL و pgvector الجداول والاستعلامات خطوة بخطوة.
الخطوة 7: التحديث والمراقبة
git pull
docker compose build agent worker
docker compose up -d agent worker
docker image prune -fيعيد Compose إنشاء الخدمات التي تسميها فقط، فلا يتجاوز التوقف ثواني إعادة التشغيل. وتعامل مع إشارة SIGTERM داخل الـ worker: أنهِ المهمة الحالية أو أعدها إلى الطابور خلال stop_grace_period. وبوت Telegram الذي يعمل بطريقة long polling لا يفقد شيئًا في إعادة تشغيل قصيرة، لأن Telegram يحتفظ بالتحديثات المعلقة حتى 24 ساعة.
نبضة حياة (heartbeat): اجعل الوكيل يرسل إشارة إلى خدمة مراقبة كل بضع دقائق، مع تنبيه عند انقطاعها. هذا يكشف الحلقات العالقة التي لا يكشفها فحص المنفذ.
الموارد:
docker statsللذاكرة لكل حاوية، وdf -hوdocker system dfللمساحة.التكلفة: رسالة صباحية لك بإنفاق الأمس من جدول
llm_usage.
ما حجم السيرفر الذي يحتاجه وكيل الذكاء الاصطناعي؟
وكيل يستدعي LLM API خارجية: معظم وقته انتظار للشبكة، وكقاعدة تقريبية يكفي 1 vCPU و2 GB RAM لبوت واحد أو عدة بوتات مع PostgreSQL بحركة متوسطة.
متصفحات بلا واجهة لجمع البيانات: كل نسخة Chromium قد تستهلك مئات الميجابايت، فابدأ من 4 GB وحدد عدد النسخ المتزامنة.
RAG مع pgvector: فهرس المتجهات يعمل أفضل وهو في الذاكرة، و4 إلى 8 GB تغطي مئات الآلاف من المقاطع.
النماذج المحلية: نموذج بحجم 7B إلى 8B بضغط 4-bit يحتاج تقريبًا 5 إلى 6 GB RAM للأوزان وحدها، ويولّد النص ببطء على المعالج. باقات IM HOST سيرفرات CPU بلا GPU، لذلك اترك توليد النص للواجهة البرمجية واكتفِ محليًا بنماذج صغيرة مثل نماذج الـ embeddings أو التصنيف.
تسلّمك استضافة وكلاء الذكاء الاصطناعي من IM HOST سيرفرًا يعمل دائمًا وعليه Docker وDocker Compose وNode.js وPython وPostgreSQL مع pgvector مثبتة مسبقًا، مع root كامل ونسخ احتياطي يومي مجاني ومنفذ 1 Gbit. تبدأ الباقات من Agent Starter (1 vCPU و2 GB) حتى Agent Scale (12 vCPU و32 GB)، في ألمانيا أو بولندا أو بريطانيا أو أمريكا أو مصر حسب التوفر. ولا تشمل الباقات رصيدًا لـ LLM API، فأنت تستخدم مفاتيحك أو نماذجك الخاصة. وللتطبيقات الأوسع راجع صفحة استضافة تطبيقات الذكاء الاصطناعي.
أسئلة شائعة
هل أحتاج كارت شاشة GPU لتشغيل وكيل ذكاء اصطناعي؟
لا، إذا كان الوكيل يستدعي نموذجًا لغويًا مستضافًا عبر API، وهذه طريقة عمل معظم الوكلاء. الحسابات الثقيلة تتم عند المزود، وسيرفرك يشغّل المنطق والأدوات وقاعدة البيانات. الـ GPU يهم فقط إذا أردت تشغيل نماذج كبيرة بنفسك.
هل سيعود الوكيل للعمل بعد إعادة تشغيل السيرفر؟
نعم، إذا كانت الحاوية مضبوطة على restart: unless-stopped أو always وخدمة Docker مفعّلة بأمر systemctl enable docker. أما الحاوية التي أوقفتها يدويًا مع unless-stopped فتبقى متوقفة.
كم تكلفة تشغيل وكيل ذكاء اصطناعي على مدار الساعة؟
جزءان: تكلفة شهرية ثابتة للسيرفر، وتكلفة متغيرة لكل token في الواجهة البرمجية. وفي الوكيل النشط غالبًا ما تتجاوز تكلفة الـ tokens ثمن السيرفر، ولهذا فجدول الميزانية وحدود الخطوات أهم من البحث عن أرخص سيرفر.
إذا أردت سيرفرًا يصلك وعليه Docker وPython وNode.js وpgvector جاهزة، فاطّلع على باقات استضافة وكلاء الذكاء الاصطناعي التي تبدأ من $8.99 شهريًا، مع root كامل ونسخ احتياطي يومي ومهندسين متاحين 24/7 إن تعثرت أي خطوة في النشر.
المزيد من مدونتنا
اكتشف المزيد من الأدلة العملية ورؤى الخدمات من فريق IM Host.
عرض كل المقالات