نوشتن یک AI Agent که روی لپتاپ کار کند، نیمی از کار است. نیمه دیگر این است که ایجنت ۲۴ ساعته روی VPS اجرا شود: بعد از ریاستارت سرور خودش بالا بیاید، با خطا از کار نیفتد، لاگ قابل بررسی داشته باشد، هزینه API را کنترل کند و اگر متوقف شد، شما باخبر شوید. در این راهنما این موارد را با systemd، Docker و چند الگوی ساده پیاده میکنیم.
فهرست مطالب
ایجنت پایدار چه ویژگیهایی دارد؟
- شروع خودکار بعد از بوت سرور.
- بازیابی خودکار بعد از خطا یا کرش.
- مقاومت در برابر خطاهای موقت مثل قطعی شبکه یا خطای ۴۲۹ و 5xx از API مدل.
- حفظ وضعیت: بعد از ریاستارت، کارهای نیمهتمام از دست نروند.
- لاگ و هشدار: بدانید ایجنت چه کرده و اگر متوقف شد، مطلع شوید.
- سقف هزینه و اقدام: یک باگ یا حلقه بیپایان نباید صورتحساب API را منفجر کند.
اگر هنوز با مفهوم ایجنت آشنا نیستید، ابتدا AI Agent چیست را بخوانید.
انتخاب و آمادهسازی سرور
ایجنتی که از API مدلهای تجاری یا یک سرور مدل جداگانه استفاده میکند، به منابع زیادی نیاز ندارد؛ یک VPS با ۲ هسته و ۲ تا ۴ گیگابایت RAM برای یک یا چند ایجنت کافی است. اگر ایجنت مرورگر Headless اجرا میکند یا مدل محلی دارد، منابع بیشتری لازم است. قبل از هر چیز:
- تنظیمات امنیتی پایه VPS را انجام دهید.
- یک کاربر جداگانه و بدون دسترسی sudo برای اجرای ایجنت بسازید:
sudo adduser --system --group agent. - کلیدهای API را در فایل
.envبا دسترسی600و مالکیت همان کاربر نگه دارید.
روش ۱: اجرا با systemd
systemd مدیر سرویس پیشفرض لینوکس است و بدون نصب ابزار اضافه، شروع خودکار، ریاستارت و لاگ را فراهم میکند. برای یک ایجنت پایتونی در /opt/agent با محیط مجازی، فایل /etc/systemd/system/ai-agent.service را بسازید:
[Unit]
Description=AI Agent
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Type=simple
User=agent
WorkingDirectory=/opt/agent
EnvironmentFile=/opt/agent/.env
ExecStart=/opt/agent/venv/bin/python -u main.py
Restart=always
RestartSec=10
MemoryMax=1G
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/opt/agent/data
PrivateTmp=true
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ai-agent
sudo systemctl status ai-agent
Restart=alwaysوRestartSec: ریاستارت خودکار ۱۰ ثانیه بعد از هر توقف.StartLimitBurst: اگر ایجنت در ۵ دقیقه ۵ بار کرش کند، systemd ریاستارت را متوقف میکند تا یک خطای دائمی، حلقه بیپایان ریاستارت ایجاد نکند.MemoryMax: اگر نشت حافظه رخ دهد، فقط همین سرویس متوقف میشود، نه کل سرور.ProtectSystemوReadWritePaths: ایجنت فقط در پوشه داده خودش میتواند بنویسد. اگر ایجنت فریب بخورد، آسیب محدود میماند.- فلگ
-uپایتون خروجی را بدون بافر مینویسد تا لاگها فوراً دیده شوند.
روش ۲: اجرا با Docker Compose
اگر ایجنت وابستگیهای زیادی دارد یا چند سرویس کنار هم اجرا میشوند (مثلاً ایجنت، Redis و پایگاه داده برداری)، Docker مدیریت را سادهتر میکند:
services:
agent:
build: .
restart: unless-stopped
env_file: .env
volumes:
- ./data:/app/data
deploy:
resources:
limits:
memory: 1G
healthcheck:
test: ["CMD", "python", "healthcheck.py"]
interval: 60s
timeout: 10s
retries: 3
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
سیاست restart: unless-stopped کانتینر را بعد از کرش و بوت سرور دوباره اجرا میکند. تنظیم logging جلوی پر شدن دیسک با لاگ را میگیرد. نکات امنیتی اجرای کانتینر را در امنیت Docker ببینید.
روش ۳: PM2
PM2 مدیر فرایند محبوب در دنیای Node.js است و برای ایجنتهای جاوااسکریپتی انتخاب راحتی است:
npm install -g pm2
pm2 start agent.js --name ai-agent --max-memory-restart 1G
pm2 save
pm2 startup
دستور pm2 startup یک دستور دیگر چاپ میکند که باید با sudo اجرا شود تا PM2 بعد از بوت فعال شود. PM2 اسکریپتهای پایتون را هم اجرا میکند، اما برای ایجنتهای غیر Node.js، systemd سادهتر و بدون وابستگی اضافه است.
مقاومسازی کد ایجنت
مدیر فرایند فقط ایجنت کرشکرده را دوباره اجرا میکند. کد ایجنت باید خودش هم مقاوم باشد:
- تلاش مجدد با تأخیر افزایشی: برای خطاهای موقت API (Timeout، ۴۲۹، 5xx)، درخواست را با تأخیر ۲، ۴، ۸ ثانیه و الی آخر تکرار کنید، با سقف مشخص.
- Timeout برای همه درخواستها: درخواستی که برای همیشه منتظر بماند، ایجنت را بیصدا متوقف میکند.
- ذخیره وضعیت: صف کارها و پیشرفت هر کار را در SQLite، Redis یا فایل ذخیره کنید تا بعد از ریاستارت ادامه یابد.
- کارهای تکرارناپذیر: مطمئن شوید اجرای دوباره یک کار، مثلاً ارسال ایمیل، باعث تکرار نمیشود. شناسه کار را ثبت کنید و قبل از اجرا بررسی کنید.
- خاموشی درست: سیگنال SIGTERM را مدیریت کنید تا کار در حال انجام قبل از توقف ذخیره شود.
لاگ و پایش
# لاگ زنده در systemd
journalctl -u ai-agent -f
# لاگ یک ساعت اخیر
journalctl -u ai-agent --since "1 hour ago"
# در Docker
docker compose logs -f agent
برای پایش خودکار، یک الگوی ساده و مؤثر Heartbeat است: ایجنت در هر چرخه موفق، یک درخواست به یک سرویس پایش (مثل Uptime Kuma یا Healthchecks) میفرستد. اگر این درخواست در زمان مقرر نرسد، سرویس پایش از طریق تلگرام یا ایمیل هشدار میدهد. این روش هم کرش و هم «گیر کردن» ایجنت را تشخیص میدهد.
علاوه بر لاگ فنی، هر اقدام ایجنت را (چه ابزاری، با چه ورودی، چه نتیجهای) ثبت کنید تا بعداً بتوانید رفتار آن را بررسی کنید.
کنترل هزینه و ایمنی
- سقف تکرار: تعداد مراحل هر کار را محدود کنید تا ایجنت در حلقه بیپایان استدلال و اقدام گیر نکند.
- سقف مصرف روزانه: تعداد توکن یا درخواست روزانه را بشمارید و با رسیدن به سقف، ایجنت را متوقف و به شما اطلاع دهید. در پنل ارائهدهنده API هم سقف هزینه تعیین کنید.
- تأیید انسانی برای اقدامات حساس: پرداخت، حذف داده یا ارسال پیام به مشتری باید پیش از اجرا تأیید شود.
- کمترین دسترسی: ایجنت فقط به ابزارها و دادههایی دسترسی داشته باشد که واقعاً لازم دارد. جزئیات بیشتر در امنیت MCP Server و AI Agentها.
اگر نمیخواهید کد بنویسید، n8n همین قابلیتها را بهصورت بصری فراهم میکند؛ نمونه آن را در ساخت AI Agent با n8n و Ollama ببینید.
سوالات متداول
systemd بهتر است یا Docker؟
برای یک ایجنت ساده با وابستگیهای کم، systemd سادهتر و سبکتر است. اگر چند سرویس کنار هم دارید یا میخواهید محیط اجرا دقیقاً قابل تکرار باشد، Docker Compose انتخاب بهتری است.
اگر ایجنت با خطای Out of Memory مواجه شد چه کنیم؟
ابتدا بررسی کنید آیا نشت حافظه وجود دارد؛ مثلاً تاریخچه گفتگو یا نتایج بیپایان در حافظه نگه داشته میشوند. سقف حافظه را با MemoryMax تعیین کنید و اگر مصرف واقعی بیشتر است، RAM سرور را ارتقا دهید.
آیا برای اجرای ایجنت به GPU نیاز دارم؟
فقط اگر مدل زبانی را روی همان سرور اجرا میکنید. ایجنتهایی که از API استفاده میکنند، روی VPS معمولی اجرا میشوند.
چطور بفهمم ایجنت متوقف شده است؟
با الگوی Heartbeat: ایجنت در فواصل منظم به یک سرویس پایش اعلام حضور کند و در صورت قطع شدن این پیامها، هشدار دریافت کنید.
سرور پایدار برای ایجنتهای همیشه روشن
سرورهای مجازی تراست هاست با IP ثابت و دسترسپذیری بالا، بستر مناسبی برای اجرای ۲۴ ساعته ایجنتها هستند. برای مدلهای محلی هم سرور GPU در دسترس است.