جایگزین Heroku و Render

جایگزین Heroku و Render؛ پلتفرم‌های PaaS برای اجرای بک‌اند

اپ بک‌اند را با یک git push روی Heroku بالا آورده بودید و سال‌ها کار می‌کرد. بعد پلن رایگان حذف شد، پرداخت با کارت بین‌المللی دردسر شد و حالا دنبال جای تازه‌ای هستید. Render اولین اسمی است که پیشنهاد می‌شود، ولی سرویس رایگانش بعد از ۱۵ دقیقه بی‌ترافیکی می‌خوابد و بیدار شدنش حدود یک دقیقه طول می‌کشد. این مقاله گزینه‌های جایگزین Heroku و Render را برای اجرای API، ربات و بک‌اند کنار هم می‌گذارد: از PaaSهای خارجی مثل Railway و Fly.io تا ابزارهای متن‌باز Dokku و Coolify و هاست ابری کانتینری چابکان، با نقطه‌ضعف هر کدام.

اگر هنوز با خود مفهوم پلتفرم به‌عنوان سرویس آشنا نیستید، اول PaaS چیست؟ و Heroku چیست؟ را بخوانید. این‌جا فرض می‌کنیم می‌دانید Procfile و dyno چه هستند.

چرا خیلی‌ها دنبال جایگزین Heroku و Render هستند؟

Heroku در اعلامیهٔ رسمی Heroku’s Next Chapter نوشت که از ۲۸ نوامبر ۲۰۲۲ پلن‌های رایگان dyno، Postgres و Redis را جمع می‌کند و حساب‌هایی را که بیش از یک سال غیرفعال مانده‌اند پاک می‌کند. از آن روز هر اپی روی Heroku فقط با پلن پولی زنده می‌ماند و پرداختش برای کاربر ایرانی کارت ارزی می‌خواهد.

Render جای خالی پلن رایگان را پر کرد، ولی مستندات خودش صریح می‌گوید سرویس Free برای production نیست. چند محدودیتش در عمل بیشتر از همه اذیت می‌کند:

  • وب‌سرویس رایگان بعد از ۱۵ دقیقه بدون درخواست ورودی خاموش می‌شود و اولین درخواست بعدی حدود یک دقیقه منتظر می‌ماند. برای وب‌هوک تلگرام یا درگاه پرداخت این تأخیر یعنی درخواست از دست‌رفته.
  • فایل‌سیستم موقت است. هر عکس آپلودی یا فایل SQLite با هر ری‌استارت، دیپلوی یا خواب سرویس پاک می‌شود و دیسک دائمی فقط روی پلن پولی وصل می‌شود.
  • دیتابیس Postgres رایگان ۳۰ روز بعد از ساخت منقضی می‌شود و پشتیبان‌گیری ندارد.
  • دسترسی Shell، اجرای job یک‌باره و ارسال ایمیل از پورت‌های SMTP روی سرویس رایگان بسته است.

یک مشکل دیگر هم مخصوص کاربران داخل ایران است: سرورهای این پلتفرم‌ها در آمریکا و اروپا هستند. وقتی کاربران اپ داخل ایران‌اند، هر درخواست مسیر طولانی بین‌المللی را می‌رود و برگردد، و اگر لینک بین‌الملل کند یا قطع شود، سرویس از دید کاربر از دسترس خارج است.

قبل از انتخاب جایگزین Heroku، این شش چیز را بسنجید

جایگزین خوب برای هر پروژه فرق می‌کند. یک ربات تلگرام ساده با یک SaaS که صف پردازش و cron دارد نیاز یکسانی ندارد. این معیارها را کنار پروژهٔ خودتان بگذارید:

  1. روش دیپلوی: آیا با git push یا اتصال به GitHub خودکار دیپلوی می‌شود، یا باید CLI و CI راه بیندازید؟
  2. Buildpack یا Dockerfile: اپ‌هایی که روی Heroku با buildpack بالا آمده‌اند Dockerfile ندارند. بعضی پلتفرم‌ها buildpack را می‌فهمند و بعضی فقط ایمیج یا Dockerfile قبول می‌کنند.
  3. دیسک دائمی: اگر اپ فایل روی دیسک می‌نویسد، پلتفرمی که فقط فایل‌سیستم موقت دارد کار را سخت می‌کند.
  4. دیتابیس مدیریت‌شده: Postgres یا MySQL با بکاپ خودکار کنار اپ، یا باید خودتان دیتابیس نگه دارید؟
  5. Worker و cron: پروسه‌های پس‌زمینه‌ای که در Procfile با worker: تعریف کرده بودید جای اجرا می‌خواهند.
  6. موقعیت دیتاسنتر و پرداخت: کاربران کجا هستند و با چه روشی می‌توانید هر ماه پرداخت کنید؟
جایگزین Heroku؛ سه مسیر PaaS مدیریت‌شده، PaaS خودمیزبان و سرور ابری

۱. Railway؛ نزدیک‌ترین تجربه به Heroku

Railway همان حس «ریپو را وصل کن و تمام» را دارد. طبق مستندات Railway، هر Service یک مخزن گیت یا ایمیج Docker می‌گیرد. اگر منبع کد باشد، Railway خودش آن را تحلیل می‌کند، ایمیج Docker می‌سازد و دیپلوی می‌کند. سرویس‌های یک Project خودکار در یک شبکهٔ خصوصی قرار می‌گیرند، پس اپ و دیتابیس بدون عبور از اینترنت به هم وصل می‌شوند. برای داده هم Volume دارد و از Volume می‌شود بکاپ زمان‌بندی‌شده گرفت.

مناسب برای: تیمی که تجربهٔ Heroku را بدون تغییر عادت می‌خواهد و کاربرانش بیرون از ایران‌اند.
نقطه‌ضعف: پرداخت ارزی، دیتاسنترهای خارج از ایران، و مدل هزینهٔ مصرفی که اگر محدودیت خرج نگذارید ممکن است ماه شلوغ غافلگیرتان کند.

۲. Fly.io؛ ماشین‌های سبک در چند منطقهٔ جغرافیایی

Fly.io اپ را داخل Fly Machines اجرا می‌کند که ماشین‌های مجازی سبک با زمان روشن شدن زیر یک ثانیه‌اند. می‌توانید منطقهٔ هر ماشین را انتخاب کنید، ماشین را در چند منطقه کلون کنید و بگذارید بر اساس ترافیک خودکار خاموش و روشن شود. فایل‌سیستم هر ماشین با هر بار روشن شدن خالی است و برای دادهٔ دائمی باید Volume وصل کنید.

مناسب برای: API‌هایی که کاربرانشان در چند قاره پخش‌اند و تأخیر برایشان مهم است.
نقطه‌ضعف: منحنی یادگیری بیشتر از Heroku (فایل fly.toml، مفهوم Machine و Volume)، پرداخت ارزی، و سرورهایی که همه خارج از ایران‌اند.

۳. Dokku؛ Heroku کوچک روی سرور خودتان

Dokku یک PaaS متن‌باز است که روی یک سرور اوبونتو یا دبیان نصب می‌شود. همان جریان آشنای Heroku را دارد: کد را با git push می‌فرستید، Dokku با Dockerfile یا با تشخیص خودکار زبان از طریق Buildpack ایمیج می‌سازد و کانتینر را اجرا می‌کند. مسیریابی پروسه‌های وب با nginx و taskهای زمان‌بندی‌شده با cron را هم خودش مدیریت می‌کند. چون از Buildpack پشتیبانی می‌کند، بیشتر اپ‌های Heroku بدون نوشتن Dockerfile منتقل می‌شوند.

مناسب برای: توسعه‌دهنده‌ای که با لینوکس راحت است و می‌خواهد چند اپ کوچک را روی یک سرور ابری اجرا کند.
نقطه‌ضعف: نگهداری سرور، آپدیت سیستم‌عامل، فایروال و بکاپ کاملاً با خودتان است. اگر سرور بیفتد، همهٔ اپ‌ها با هم می‌افتند.

۴. Coolify؛ پنل گرافیکی برای PaaS خودمیزبان

اگر Dokku را دوست دارید ولی ترجیح می‌دهید به جای ترمینال با داشبورد کار کنید، Coolify را ببینید. طبق معرفی رسمی Coolify، این ابزار متن‌باز از طریق SSH به سرورهای شما وصل می‌شود، Docker را آماده می‌کند و اپ را از مخزن گیت، Dockerfile، فایل Docker Compose یا ایمیج آماده بالا می‌آورد. دامنه، HTTPS، متغیرهای محیطی، لاگ و health check هم از همان پنل مدیریت می‌شوند. یک نکتهٔ خوب دارد: اگر خود Coolify از دسترس خارج شود، کانتینرهایی که در حال اجرا هستند خاموش نمی‌شوند و فقط پنل و اتوماسیون را از دست می‌دهید.

مناسب برای: تیم کوچکی که چند اپ و دیتابیس دارد و یک رابط گرافیکی مشترک می‌خواهد.
نقطه‌ضعف: مستندات خود Coolify می‌گوید آپدیت سیستم‌عامل، فایروال، DNS و استراتژی بکاپ و بازیابی همچنان مسئولیت شماست. اگر خود Coolify را هم میزبانی کنید، آپدیت و بکاپ آن هم به لیست کارها اضافه می‌شود.

۵. سرور ابری با systemd و Nginx؛ کنترل کامل، کار بیشتر

ساده‌ترین جایگزین از نظر ابزار و سخت‌ترین از نظر نگهداری: یک سرور لینوکس می‌گیرید، Node یا Python را نصب می‌کنید، پروسه را با systemd یا PM2 زنده نگه می‌دارید و Nginx را جلویش می‌گذارید. هیچ لایهٔ اضافه‌ای بین شما و سیستم نیست. اگر نمی‌دانید این مسیر برای پروژه‌تان می‌صرفد یا نه، مقالهٔ PaaS یا VPS؟ هزینهٔ زمانی هر دو را مقایسه کرده است.

مناسب برای: پروژه‌ای که نیاز خاص سیستمی دارد، مثلاً نصب سرویس جانبی یا دسترسی root.
نقطه‌ضعف: دیپلوی خودکار، SSL، لاگ متمرکز و rollback را باید خودتان بسازید.

۶. هاست ابری چابکان؛ PaaS کانتینری با دیتاسنتر ایران و اروپا

هاست ابری چابکان هر اپ را در کانتینر جدای خودش اجرا می‌کند و نصب runtime، تنظیم وب‌سرور و SSL رایگان با تمدید خودکار را خودش انجام می‌دهد. برای هر زبان سرویس جدا دارد، از هاست Node.js و هاست پایتون تا گولنگ و لاراول. اگر اپ Dockerfile یا ایمیج آماده دارد، هاست داکر همان را اجرا می‌کند. موقع ساخت سرویس بین دیتاسنتر ایران و اروپا انتخاب می‌کنید، که برای اپی با کاربران داخل ایران تأخیر شبکه را به‌مراتب کمتر از سرورهای آمریکا می‌کند. پرداخت هم ریالی است.

روش دیپلوی کمی با Heroku فرق دارد. خبری از git push heroku main نیست. کد را با CLI چابکان (chabok deploy)، گیت داخل کنسول سرویس، FTP یا فایل‌منیجر می‌فرستید. برای اینکه هر push به شاخهٔ main خودکار دیپلوی شود، طبق راهنمای CI/CD با GitHub یک workflow در GitHub Actions می‌سازید که CLI را با توکن پنل اجرا می‌کند. دیتابیس را هم می‌توانید جدا روی دیتابیس ابری بسازید و رشتهٔ اتصالش را در متغیرهای محیطی سرویس بگذارید.

مناسب برای: بک‌اند، API و رباتی که کاربرانش در ایران‌اند و می‌خواهید نگهداری سرور با پلتفرم باشد.
نقطه‌ضعف: Procfile خوانده نمی‌شود و دستور اجرا از package.json یا متغیر سرویس می‌آید، و دیپلوی خودکار با push به راه‌اندازی یک‌بارهٔ CI نیاز دارد. اگر به اجرای چند منطقه‌ای در چند قاره نیاز دارید، Fly.io برایتان مناسب‌تر است.

جدول مقایسهٔ جایگزین‌های Heroku و Render

گزینه نوع روش دیپلوی Buildpack چه کسی سرور را نگه می‌دارد نزدیکی به کاربر ایرانی
Railway PaaS مدیریت‌شده اتصال GitHub یا ایمیج Docker ساخت خودکار ایمیج از کد Railway دیتاسنتر خارج
Fly.io PaaS روی ماشین مجازی سبک CLI و fly.toml Dockerfile یا ایمیج Fly.io دیتاسنتر خارج، چندمنطقه‌ای
Dokku PaaS متن‌باز خودمیزبان git push دارد شما بستگی به محل سرور
Coolify پنل PaaS خودمیزبان گیت، Dockerfile، Compose، ایمیج بسته به نوع منبع شما بستگی به محل سرور
VPS + systemd زیرساخت خام دستی یا اسکریپت خودتان ندارد شما بستگی به محل سرور
هاست ابری چابکان PaaS کانتینری CLI، GitHub Actions، گیت، FTP سرویس آماده برای هر زبان چابکان دیتاسنتر ایران یا اروپا

برای مقایسهٔ هزینه‌ها جدول تعرفهٔ هر سرویس را در صفحهٔ خودش ببینید. قیمت‌ها مرتب عوض می‌شوند و عددی که امروز این‌جا بنویسیم چند ماه بعد اشتباه است.

چک‌لیست مهاجرت از Heroku به پلتفرم جدید

مهاجرت معمولاً در پنج قدم تمام می‌شود. بیشترین دردسر را دیتابیس و متغیرهای محیطی دارند، نه خود کد.

مراحل مهاجرت از Heroku به جایگزین Heroku در پنج قدم

۱. متغیرهای محیطی را بیرون بکشید

همهٔ Config Varها را در قالب قابل‌استفاده در شل خروجی بگیرید و بعد در بخش متغیرهای سرویس جدید وارد کنید. DATABASE_URL را دست نزنید، چون بعد از انتقال دیتابیس آدرس تازه می‌گیرد.

heroku config --shell --app example-app > heroku.env

۲. از دیتابیس Postgres بکاپ بگیرید و بازگردانی کنید

طبق راهنمای Import و Export در Heroku، اول یک بکاپ تازه می‌سازید و دانلودش می‌کنید. خروجی در قالب فشردهٔ custom است و با pg_restore روی دیتابیس جدید برمی‌گردد:

heroku pg:backups:capture --app example-app
heroku pg:backups:download --app example-app
pg_restore --verbose --clean --no-acl --no-owner -h NEW_DB_HOST -U NEW_DB_USER -d NEW_DB_NAME latest.dump

اگر می‌خواهید از Postgres به MySQL بروید، این مسیر کافی نیست و ابزار تبدیل جدا لازم دارید. مقالهٔ MySQL یا PostgreSQL؟ کمک می‌کند ببینید اصلاً تغییر موتور ارزشش را دارد یا نه.

۳. Procfile را به دستور اجرا ترجمه کنید

خط web: در Procfile همان دستوری است که پلتفرم جدید باید اجرا کند. روی Dokku خود Procfile خوانده می‌شود. روی هاست Node.js چابکان پیش‌فرض npm start است و اگر دستور دیگری می‌خواهید، آن را در متغیر START_COMMAND می‌گذارید. خط worker: را معمولاً به یک سرویس جدا تبدیل کنید تا ری‌استارت وب روی صف پردازش اثر نگذارد.

# Procfile on Heroku
web: node dist/server.js
worker: node dist/worker.js

# Same web process as a service variable
START_COMMAND="node dist/server.js"

۴. پورت و فایل‌های آپلودی را چک کنید

Heroku پورت را در متغیر PORT می‌دهد و بیشتر اپ‌ها به همان گوش می‌دهند. روی پلتفرم جدید ببینید درخواست‌ها به کدام پورت فرستاده می‌شود و اگر لازم است آن را در تنظیمات سرویس عوض کنید. فایل‌هایی که اپ روی دیسک می‌نوشت را هم به یک فضای ذخیره‌سازی سازگار با S3 ببرید تا با هر دیپلوی پاک نشوند.

۵. دیپلوی خودکار و DNS

بعد از اینکه اپ روی آدرس موقت درست جواب داد، CI را وصل کنید تا هر push خودکار دیپلوی شود. ایدهٔ پشت این کار را در استقرار خودکار چیست؟ و GitOps چیست؟ توضیح داده‌ایم. آخر سر TTL رکورد DNS را چند ساعت قبل کم کنید، رکورد را به سرویس جدید ببرید و تا چند روز اپ Heroku را خاموش نکنید تا اگر چیزی جا ماند، راه برگشت داشته باشید. اگر وب‌هوک تلگرام یا درگاه پرداخت دارید، آدرس آن‌ها را هم به‌روز کنید. وب‌هوک چیست؟ نحوهٔ کارش را نشان می‌دهد.

کدام جایگزین Heroku برای پروژهٔ شما مناسب است؟

  • کاربرانتان خارج از ایران‌اند و پرداخت ارزی برایتان مشکلی ندارد: Railway برای سادگی، Fly.io برای اجرای چندمنطقه‌ای.
  • با لینوکس راحتید و می‌خواهید چند اپ کوچک را روی یک سرور جمع کنید: Dokku اگر ترمینال را ترجیح می‌دهید، Coolify اگر پنل می‌خواهید.
  • اپ نیاز سیستمی خاصی دارد: سرور ابری خام.
  • کاربرانتان در ایران‌اند و نمی‌خواهید وقت نگهداری سرور بگذارید: یک PaaS با دیتاسنتر داخلی مثل هاست ابری چابکان.

اگر بخشی از پروژه فرانت‌اند Next.js یا سایت استاتیک است، جایگزین‌های آن را جدا در مقالهٔ جایگزین Vercel و Netlify در ایران بررسی کرده‌ایم. برای بک‌اندی که به سرویس آماده مثل احراز هویت و دیتابیس نیاز دارد هم جایگزین Firebase و Supabase را ببینید.

اگر می‌خواهید همین امروز اپ Node.js، پایتون یا داکری‌تان را روی دیتاسنتر ایران امتحان کنید، از صفحهٔ هاست ابری چابکان زبان پروژه را انتخاب کنید و پلن مناسب را از جدول تعرفه بردارید. راهنمای استقرار Node.js در مستندات چابکان قدم‌به‌قدم کار را جلو می‌برد.

سؤالات متداول

آیا Heroku هنوز پلن رایگان دارد؟

نه. Heroku از ۲۸ نوامبر ۲۰۲۲ پلن‌های رایگان dyno، Postgres و Redis را متوقف کرد و الان فقط پلن پولی دارد.

Render برای production مناسب است؟

پلن‌های پولی Render بله. ولی خود Render می‌گوید سرویس Free برای production نیست، چون بعد از ۱۵ دقیقه بی‌ترافیکی می‌خوابد، فایل‌سیستمش موقت است و دیتابیس رایگانش بعد از ۳۰ روز منقضی می‌شود.

برای جایگزین Heroku حتماً باید Dockerfile بنویسم؟

بستگی به پلتفرم دارد. Dokku مثل Heroku با Buildpack زبان را تشخیص می‌دهد و Railway از روی کد ایمیج می‌سازد. روی هاست ابری چابکان هم برای Node.js، پایتون، PHP و زبان‌های دیگر سرویس آماده هست و Dockerfile لازم نیست. فقط برای هاست داکر باید Dockerfile یا ایمیج داشته باشید.

Dokku بهتر است یا Coolify؟

هر دو روی سرور خودتان اجرا می‌شوند. Dokku سبک‌تر است و با ترمینال و git push کار می‌کند. Coolify داشبورد گرافیکی، قالب‌های آماده و مدیریت چند سرور دارد ولی خودش هم یک سرویس است که باید آپدیت و بکاپ شود.

بعد از مهاجرت، اپ Heroku را کی پاک کنم؟

وقتی DNS کامل منتقل شد، لاگ‌های سرویس جدید چند روز بدون خطا بود و از دیتابیس جدید بکاپ سالم داشتید. تا آن موقع اپ قدیمی را در حالت خاموش نگه دارید تا راه برگشت داشته باشید.

دیدگاه خود را بنویسید:

آدرس ایمیل شما نمایش داده نخواهد شد.

فوتر سایت