این راهنما به شما کمک میکند تا برنامه ربات تلگرام خود را به درستی در Railway استقرار دهید و مشکلهای احتمالی را برطرف کنید.
-
یک حساب کاربری در Railway ایجاد کنید (اگر ندارید)
-
مخزن گیتهاب خود را به Railway متصل کنید یا مستقیماً با CLI آپلود نمایید
-
یک سرویس دیتابیس PostgreSQL در Railway ایجاد کنید:
- در داشبورد Railway، روی "New Service" کلیک کنید
- گزینه "Database" و سپس "PostgreSQL" را انتخاب کنید
- منتظر بمانید تا دیتابیس ایجاد شود
-
متغیرهای محیطی ضروری را در Railway تنظیم کنید:
TELEGRAM_BOT_TOKEN
: توکن ربات تلگرام شما (این متغیر بسیار مهم است!)DATABASE_URL
: به صورت خودکار تنظیم میشود (اگر از دیتابیس Railway استفاده میکنید)- سایر متغیرهای محیطی مورد نیاز مانند کلیدهای TWILIO اگر از آن استفاده میکنید
نکته مهم: برای تنظیم متغیرهای محیطی در Railway:
- وارد داشبورد پروژهتان شوید
- روی تب "Variables" کلیک کنید
- دکمه "New Variable" را بزنید
- نام متغیر (TELEGRAM_BOT_TOKEN) و مقدار آن را وارد کنید
- روی "Add" کلیک کنید
- پس از اضافه کردن همه متغیرها، دکمه "Deploy" را بزنید تا تغییرات اعمال شود
-
روش استقرار را بر اساس Dockerfile تنظیم کنید:
- در تنظیمات سرویس، به بخش Settings بروید
- در قسمت Deploy، اطمینان حاصل کنید که "Dockerfile" انتخاب شده باشد
-
استقرار را آغاز کنید با کلیک روی "Deploy"
-
لاگها را برای اطمینان از اجرای درست بررسی نمایید
-
آدرس نهایی برنامه شما در بخش "Deployments" قابل مشاهده خواهد بود
در Python 3.12 که در Railway استفاده میشود، ماژول distutils
حذف شده است. کتابخانه undetected-chromedriver
به این ماژول وابسته است.
برای رفع این مشکل، چندین راهحل در اختیار شما قرار داده شده است. میتوانید یکی از این روشها را انتخاب کنید:
فایل Dockerfile
که در مخزن ارائه شده، یک محیط پایدار با Python 3.10 و تمام وابستگیهای مورد نیاز ایجاد میکند. کافی است اطمینان حاصل کنید که Railway برای استقرار از Dockerfile استفاده میکند.
- در تنظیمات پروژه Railway، به بخش Settings بروید
- در قسمت Deploy، حالت را به "Nixpacks" یا "Docker" تغییر دهید
- فایل
Dockerfile
باید به صورت خودکار شناسایی و استفاده شود
فایل railway.toml
تنظیمات لازم برای نصب وابستگیهای سیستمی و استفاده از Python 3.10 را فراهم میکند.
فایل Procfile
و اسکریپت fix-distutils.py
به طور خودکار مشکل را قبل از اجرای اصلی برنامه برطرف میکنند.
میتوانید فایل patcher.py
را مستقیماً در محیط Railway بعد از استقرار تغییر دهید:
- به ترمینال SSH در Railway وصل شوید
- مسیر کتابخانه را پیدا کنید:
find /opt -name patcher.py | grep undetected_chromedriver
- فایل را ویرایش کنید:
nano [مسیر_فایل_پیدا_شده]
- خط
from distutils.version import LooseVersion
را بهfrom packaging.version import parse as LooseVersion
تغییر دهید - ابتدا مطمئن شوید که
pip install packaging
را اجرا کردهاید
-
متغیرهای محیطی: مطمئن شوید که تمام متغیرهای محیطی لازم (TELEGRAM_BOT_TOKEN، TWILIO_ACCOUNT_SID و غیره) در تنظیمات Railway وارد شدهاند.
-
پورت: Railway به صورت خودکار یک پورت را از طریق متغیر محیطی
PORT
اختصاص میدهد. در Dockerfile و Procfile، از${PORT:-5000}
استفاده شده تا در صورت عدم تعریف متغیر، از پورت 5000 استفاده شود. اگر با خطای'$PORT' is not a valid port number
مواجه شدید، حتماً از این روش استفاده کنید. -
دیتابیس: اگر از پایگاه داده PostgreSQL استفاده میکنید، مطمئن شوید که یک خدمت دیتابیس در Railway تنظیم کردهاید و متغیر محیطی
DATABASE_URL
به درستی تنظیم شده است. -
بازبینی لاگها: بعد از استقرار، لاگها را بررسی کنید تا از اجرای صحیح برنامه مطمئن شوید.
اگر همچنان با مشکل مواجه هستید:
-
خطای PORT: اگر با خطای
'$PORT' is not a valid port number
مواجه میشوید، مراحل زیر را انجام دهید:- در
Dockerfile
وProcfile
از عبارت${PORT:-5000}
به جای$PORT
استفاده کنید - در تنظیمات پروژه Railway متغیر محیطی
PORT
را به صورت دستی با مقدار عددی (مثلاً ۵۰۰۰) تنظیم کنید - در فایل
railway.toml
در بخش[variables]
مقدارPORT = "5000"
را اضافه کنید - برای هر متغیر محیطی در
${VAR}
اطمینان حاصل کنید که یک مقدار پیشفرض مانند${VAR:-default}
در نظر گرفته شده
- در
-
مشکل healthcheck: اگر با خطای "Service unavailable" در healthcheck مواجه میشوید:
- سادهترین راهحل: مسیر healthcheck را در فایل
railway.toml
به/healthz
تغییر دهید و مطمئن شوید که اندپوینت مربوطه درmain.py
پاسخ سادهای مثل"OK"
برمیگرداند - اگر با خطای persistent مواجه هستید، چندین مسیر healthcheck را امتحان کنید:
/healthz
،/health
و/_health
healthcheckTimeout
را به ۳۰ ثانیه وhealthcheckInterval
را به ۳۰ ثانیه تغییر دهید- در فایل
railway.toml
چندین مسیر healthcheck به صورت زیر تعریف کنید:[[healthchecks]] path = "/healthz" timeout = 30 interval = 15 grace = 120 [[healthchecks]] path = "/health" timeout = 30 interval = 15
- اطمینان حاصل کنید که مسیرهای healthcheck به درستی در
main.py
پیادهسازی شدهاند و پاسخ بسیار سادهای میدهند - اگر باز هم مشکل ادامه داشت، سعی کنید
workers
را در Gunicorn به ۱ کاهش دهید تا بار کاری سرور کمتر شود
- سادهترین راهحل: مسیر healthcheck را در فایل
-
استفاده از نسخه خاص کتابخانه: میتوانید به صورت دستی نسخه خاصی از undetected-chromedriver را نصب کنید که با Python 3.12 سازگار است.
-
غیرفعال کردن موقت: برای تست، میتوانید با تغییر موقت کد، بخشهای مربوط به جیمیلکریتور و اتوماسیون وب را غیرفعال کنید تا حداقل ربات تلگرام کار کند.
-
پشتیبانی Railway: میتوانید از تیم پشتیبانی Railway درخواست کمک کنید یا به انجمن آنها مراجعه کنید.
امیدوارم یکی از این راهحلها مشکل شما را برطرف کند!
اگر با خطای Healthcheck Retry window: 2m0s
و Attempt # failed with service unavailable
مواجه میشوید، این خطا نشان میدهد که Railway نمیتواند به مسیر سلامتسنجی برنامه دسترسی پیدا کند. برای رفع این مشکل موارد زیر را انجام دهید:
بهترین راهحل، غیرفعال کردن کامل healthcheck در Railway است. این کار را میتوانید با ویرایش فایل railway.toml
انجام دهید:
[deploy]
# استفاده از Dockerfile بدون دستور شروع اضافی
builder = "dockerfile"
# کاملاً غیرفعال کردن healthcheck
healthcheckDisabled = true
# تنظیم نوع راهاندازی مجدد
restartPolicyType = "always"
این تنظیمات باعث میشود Railway بدون نیاز به healthcheck، برنامه شما را اجرا کند و در صورت بروز مشکل، به صورت خودکار راهاندازی مجدد انجام دهد.
-
سادهسازی اندپوینت healthcheck:
@app.route('/healthz') def healthz(): return "OK", 200
-
اضافه کردن چندین مسیر healthcheck:
@app.route('/health') def health(): return "OK", 200 @app.route('/_health') def _health(): return "OK", 200
-
تنظیم صحیح فایل railway.toml (اگر نمیخواهید healthcheck را کاملاً غیرفعال کنید):
[deploy] healthcheckPath = "/healthz" healthcheckTimeout = 30 healthcheckInterval = 30
-
تنظیم Gunicorn برای پاسخگویی سریع:
web: gunicorn --bind 0.0.0.0:${PORT:-5000} --workers 1 --threads 2 --timeout 90 --keep-alive 5 main:app
-
فعال کردن لاگها برای عیبیابی:
--access-logfile - --error-logfile -
اگر ربات روی Railway فعال میشود اما به دستورات تلگرام پاسخ نمیدهد و منوی شیشهای را نمایش نمیدهد:
-
بررسی متغیر محیطی TELEGRAM_BOT_TOKEN:
- حتماً متغیر محیطی TELEGRAM_BOT_TOKEN را در تنظیمات Railway وارد کنید
- دقت کنید که توکن دقیقاً مطابق با توکن دریافتی از BotFather باشد
-
راهاندازی مجدد پس از تنظیم متغیر محیطی:
- پس از اضافه کردن یا ویرایش متغیر TELEGRAM_BOT_TOKEN، حتماً یک بار دیگر Deploy کنید
-
بررسی لاگهای ربات:
- در بخش Logs پروژه، جستجو کنید تا ببینید ربات با موفقیت به API تلگرام متصل میشود یا خیر
- به دنبال پیامهایی مانند "Connected to bot" یا خطاهای احتمالی باشید