بک اند اپلیکیشن چیست
بک اند اپلیکیشن همان بخشی از محصول است که روی گوشی کاربر نیست: یک ای پی آی که درخواست ها را می گیرد، یک پایگاه داده که اطلاعات در آن می ماند، و یک سرویس ورود که تصمیم می گیرد چه کسی اجازه دیدن چه چیزی را دارد. اپ روی گوشی تصمیم گیرنده نیست و فقط همان چیزی را نشان می دهد که بک اند اجازه داده، و به همین دلیل یک اپ کاملا سالم وقتی سرور جواب ندهد هیچ کاری نمی تواند بکند.
- درس ۶ از ۸
- مقدماتی
- رایگان، بدون ثبت نام
دو ظاهر، یک بک اند
اپ روی گوشی
نصف نمایان محصول، و آن نصفی که کاربر با آن قضاوت می کند
- صفحه را می سازد و ورودی کاربر را می گیرد
- درخواست می فرستد و جواب را نشان می دهد
- هر چیزی که داخلش باشد قابل خواندن است
سایت یا پنل مدیریت
همان داده ها، از یک در دیگر و معمولا برای آدم دیگری
- سفارش ها را می بیند و وضعیتشان را عوض می کند
- دسترسی اش بیشتر است، پس قانونش هم جداست
هر دو با یک بک اند حرف می زنند و هیچ کدام خودش تصمیم نمی گیرد
بک اند
جایی که تصمیم گرفته می شود و داده واقعا می ماند
- ای پی آی: تنها دری که از بیرون باز است
- پایگاه داده: سفارش ها، کاربران، پیام ها
- سرویس ورود: هر درخواست مال کدام کاربر است
- ذخیره فایل: عکس و پیوست، با آدرس در پایگاه داده
این شکل ساده شده است: در محصول واقعی معمولا یک لایه کش و یک سرویس ارسال نوتیفیکیشن هم کنار همین قطعه ها می نشینند.
آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.
بک اند چیست و چرا نصف اپلیکیشن آنجاست؟
بک اند آن نیمه از اپلیکیشن است که کاربر هرگز نمی بیند و بدون آن، اپ فقط یک آلبوم عکس است. هر چیزی که باید بین چند نفر مشترک باشد، بعد از پاک شدن اپ باقی بماند، یا نباید دست خود کاربر باشد، آنجا زندگی می کند و نه روی گوشی.
یک مثال از هر تعریفی روشن تر است: فهرست سفارش های یک فروشگاه. اگر این فهرست روی گوشی ذخیره شود، با عوض کردن گوشی از بین می رود، روی تبلت همان آدم دیده نمی شود، و کسی که فایل های اپ را باز کند می تواند عددها را عوض کند. همین سه جمله کل دلیل وجود بک اند است.
اپ روی گوشی در عمل سه کار می کند. صفحه را می سازد، ورودی کاربر را می گیرد، و درخواست می فرستد. تصمیم گرفتن کار او نیست. این جمله ساده به نظر می رسد و اولین چیزی است که در پروژه های تازه زیر پا گذاشته می شود: تخفیف را اپ حساب می کند و مبلغ نهایی را می فرستد، و بعد معلوم می شود هر کسی می تواند همان درخواست را با هر عددی که دوست دارد بفرستد.
پس تقسیم کار درست این است: اپ نشان می دهد، بک اند تصمیم می گیرد. اگر اپلیکیشن چگونه کار می کند را خوانده باشید، این همان مرز است که این بار از طرف سرور نگاه شده.

داخل بک اند چه چیزهایی هست؟
بک اند یک برنامه واحد نیست، چند قطعه است که هر کدام یک کار می کنند و معمولا با هم روی یک سرور می نشینند.
قطعه اول ای پی آی است، همان دری که اپ از آن رد می شود. اپ یک آدرس را صدا می زند، داده می فرستد، و جوابی می گیرد که معمولا JSON است. اینکه هر آدرس چه ورودی می خواهد و چه جوابی می دهد قرارداد بین اپ و سرور است، و ای پی آی چیست همین قرارداد را کامل باز کرده.
قطعه دوم پایگاه داده است. جایی که سفارش ها، کاربران و پیام ها واقعا نوشته می شوند و بعد از ریستارت سرور هم سر جایشان می مانند. اپ هیچ وقت نباید مستقیم به پایگاه داده وصل شود، چون رمز پایگاه داده آن وقت باید داخل خود اپ باشد و هر کسی که فایل اپ را باز کند آن را دارد.
قطعه سوم سرویس ورود است. کارش این نیست که فقط بگوید رمز درست بود یا نه؛ کارش این است که بعد از ورود، به هر درخواست بعدی بچسبد و بگوید این درخواست از طرف کدام کاربر آمده. سرور بدون این جواب، هیچ راهی ندارد بفهمد فهرست سفارش هایی که خواسته شده مال چه کسی است.
قطعه چهارم که همیشه دیر به آن فکر می شود ذخیره فایل است. عکس پروفایل و فایل پیوست معمولا داخل پایگاه داده نمی نشینند، جای جداگانه ای دارند و آدرسشان در پایگاه داده ذخیره می شود. اینکه این آدرس عمومی باشد یا امضا شده و موقت، خودش یک تصمیم امنیتی است.
همه اینها روی چیزی اجرا می شوند که در اینترنت چگونه کار می کند از پایین توضیح داده شده: یک ماشین که خاموش نمی شود و روی یک آدرس منتظر می ماند.
وقتی می گویند سرور قطع است، دقیقا چه اتفاقی افتاده؟
«سرور قطع است» تقریبا هیچ وقت یعنی کامپیوتر خاموش شده. سه حالت کاملا متفاوت زیر همین یک جمله جمع می شوند و هر کدام درمان دیگری دارند.
حالت اول، درخواست اصلا به سرور نرسیده. اینترنت کاربر قطع بوده، نام دامنه به آدرس ترجمه نشده، یا اپ روی یک شبکه است که آن آدرس را نمی دهد. سرور در این حالت کاملا سالم است و اصلا خبر ندارد کسی سراغش آمده.
حالت دوم، سرور جواب داده و جوابش خطا بوده. اینجا عدد وضعیت مهم است و دو خانواده دارد: خطای پانصدی یعنی مشکل از سمت سرور است، و خطای چهارصدی یعنی خود درخواست ایراد داشته. یک اپ که هر دو را «سرور قطع است» نشان بدهد، کاربر را دنبال نخود سیاه می فرستد؛ ۴۰۱ یعنی باید دوباره وارد شوی و ۵۰۰ یعنی بنشین و صبر کن.
حالت سوم که از هر دوی قبلی رایج تر است: سرور جواب داده، ولی خیلی دیر. چیزی در میانه راه صبرش تمام شده و ارتباط را قطع کرده، در حالی که برنامه هنوز داشت کار می کرد. از دید اپ این با خاموش بودن سرور فرقی ندارد.
حالت سوم جایی است که بیشترین وقت تیم ها تلف می شود، چون عدد صبر معمولا جایی نوشته شده که کسی سراغش نمی رود. مستندات خود PHP درباره تنظیم request_terminate_timeout می نویسد که این «مهلت سرویس دادن به یک درخواست است که بعد از آن پروسه کارگر کشته می شود»، و صریحا اضافه می کند این گزینه وقتی به کار می آید که max_execution_time جلوی اجرای اسکریپت را نگرفته باشد. یعنی دو عدد در دو فایل جدا وجود دارند و عدد کوچک تر است که حرف آخر را می زند.
نتیجه عملی برای کسی که اپ می نویسد: هر درخواستی که به سرور می فرستید یک مهلت مشخص داشته باشد، جواب خطا را از روی عدد وضعیت دسته بندی کنید نه از روی متن، و برای هر دسته یک رفتار متفاوت بنویسید. این کاری است که در ساعت اول پروژه ده دقیقه وقت می برد و اگر جا بماند، ماه ها بعد به شکل گزارش های «اپ کار نمی کند» برمی گردد که هیچ کدام قابل بازسازی نیستند.
یک درخواست، و چهار جایی که می تواند بمیرد
اپ همه اینها را یک جور می بیند مگر اینکه شما وادارش کنید فرق بگذارد.
-
۱
شبکه کاربر
درخواست اصلا از گوشی بیرون نرفته. سرور خبر ندارد.
-
۲
ترجمه نام دامنه
نام به آدرس تبدیل نشده. سایت برای بعضی ها بالاست و برای بعضی ها نه.
-
۳
خطای سمت سرور
جواب آمده و عددش پانصدی است. اپ باید بگوید بعدا دوباره امتحان کن.
-
۴
مهلت تمام شده
برنامه هنوز کار می کرد و یک عدد در فایل تنظیمات زودتر تمامش کرد.
این ترتیب همیشگی نیست: یک درخواست می تواند از چند ایستگاه سالم رد شود و در آخری بیفتد.
بک اند آماده بخریم یا خودمان بنویسیم؟
راه سومی هم هست که بیشتر تیم های کوچک آخر سر همان را انتخاب می کنند: بک اند به عنوان سرویس، یعنی سرویسی که پایگاه داده و ورود و ذخیره فایل را آماده تحویل می دهد و شما هیچ سروری بالا نمی آورید. فایربیس گوگل و سوپابیس دو نمونه شناخته شده اند.
چیزی که می خرید در مستندات خودشان صریح نوشته شده. صفحه شروع قوانین امنیتی فایراستور می گوید با این قوانین می توانید روی تجربه کاربری تمرکز کنید «بدون اینکه لازم باشد زیرساخت را مدیریت کنید یا کد احراز هویت و مجوزدهی سمت سرور بنویسید». همین یک جمله کل صرفه جویی را توضیح می دهد: کاری که معمولا هفته ها طول می کشد تبدیل می شود به یک فایل قانون.
چیزی که در ازایش می دهید هم در همان صفحه هست و کمتر خوانده می شود. وقتی سرور میانی حذف شد، اپ مستقیم با پایگاه داده حرف می زند و تنها چیزی که بین داده شما و یک کاربر بدخواه می ایستد همان فایل قانون است. مستندات فایربیس این را با همین لحن می گوید: قوانین امنیتی بیرون از اپ شما تعریف می شوند، پس کلاینت ها مسئول اعمال امنیت نیستند. جمله دلگرم کننده ای است تا وقتی یادتان بیفتد که پس هر اشتباهی در آن فایل، اشتباهی است که هیچ کد دیگری جلویش را نمی گیرد.
دو نکته ریز همان صفحه ها که بعدا گران تمام می شوند. اول، فایراستور نمونه قوانین ساده اش را نشان می دهد و خودش زیرش می نویسد که این نمونه ها معتبرند ولی برای اپ های محصولی توصیه نمی شوند. دوم، کتابخانه های سمت سرور تمام قوانین امنیتی را دور می زنند و از راه دیگری احراز هویت می شوند. یعنی همان کدی که روی سرور خودتان می نویسید، از قانون هایی که برای اپ نوشته اید معاف است.
سوال قفل شدن را هم بهتر است از زبان خودشان شنید تا از زبان ما. سوپابیس در صفحه معماری اش می نویسد که پستگرس را انتزاعی نمی کند و شما با دسترسی کامل به آن کار می کنید، و در اصولش می نویسد برای پرهیز از قفل شدن، جابه جایی به داخل و بیرون را آسان نگه می دارد و برای همین از استانداردهای موجود مثل pg_dump و فایل CSV استفاده می کند. این ادعای یک سازنده درباره محصول خودش است، نه اندازه گیری ما؛ ما مهاجرت واقعی از هیچ کدام از این دو انجام نداده ایم و نمی توانیم بگوییم در عمل چقدر طول می کشد.
موضع ما ساده است. برای اپی که یک نفر می نویسد و باید ماه دیگر روی گوشی کسی باشد، بک اند آماده انتخاب درستی است و وسواس روی «کد خودمان» فقط چند ماه تاخیر می خرد. برای محصولی که منطق پولی دارد، جایی می رسد که آن منطق باید روی سرور خودتان اجرا شود، و بهتر است این را از روز اول بدانید تا اینکه وسط راه کشفش کنید.
بک اند آماده در برابر بک اند خودتان
سرویس آماده
- ورود، پایگاه داده و ذخیره فایل از روز اول کار می کنند
- کد احراز هویت و مجوزدهی سمت سرور نمی نویسید
- همه امنیت داده در یک فایل قانون جمع می شود
- اپ مستقیم با پایگاه داده حرف می زند
بک اند خودتان
- هر تصمیم پولی روی سروری اجرا می شود که دست شماست
- ای پی آی قرارداد شماست و شکلش را خودتان می بندید
- هفته های اول به جای صفحه ها صرف زیرساخت می شود
- نصف شب که سرور خوابید، کسی باید بیدار شود
هیچ کدام از این دو ستون برنده نیست؛ ستون درست به این بستگی دارد که چقدر منطق پولی در محصول هست و چه کسی نگهبانی می دهد.
قبل از انتخاب، این چند چیز را از خودتان بپرسید
تصمیم بک اند تقریبا هیچ وقت تصمیم فنی خالص نیست. چهار سوال زیر را جدی جواب بدهید و جواب خودش را نشان می دهد.
یک: اگر فردا کسی درخواستی بفرستد که اپ شما هرگز نمی فرستد، چه اتفاقی می افتد؟ اگر جوابتان «اپ ما این کار را نمی کند» است، هنوز به بک اند فکر نکرده اید. کسی که با اپ شما کار می کند لازم نیست از اپ شما استفاده کند.
دو: کدام عددها را کاربر نباید تعیین کند؟ قیمت، موجودی، امتیاز، نقش. هر کدام از اینها که از سمت اپ می آید، در عمل ورودی کاربر است.
سه: اگر همین فردا این سرویس را ترک کنید، چه چیزی همراهتان می آید؟ نه به عنوان اتهام به فروشنده، به عنوان یک تمرین. جوابش معمولا نشان می دهد چقدر از محصولتان واقعا مال شماست.
چهار: چه کسی نصف شب سرور را بالا می آورد؟ اگر جواب «کسی نیست» است، سرویس آماده گران تر است و ارزانی محسوب می شود.
و یک توصیه که به هیچ کدام از این چهار ربط ندارد: قبل از نوشتن اولین خط بک اند، شکل داده را روی کاغذ بکشید. جدول ها یا مجموعه ها، فیلدهایشان، و اینکه هر سطر مال کیست. تغییر شکل داده بعد از اینکه هزار کاربر داده دارند، از هر کار دیگری در پروژه گران تر است. اگر تیم ندارید و کار به جایی رسیده که این تصمیم بزرگ تر از خودتان شده، صفحه اپلیکیشن RGB همین مرحله را می گوید که ما چطور جلو می بریم.
اینها را روی کاغذ داشته باشید
- فهرست جدول ها یا مجموعه ها با فیلدهایشان
- اینکه هر سطر مال کدام کاربر است
- عددهایی که فقط سرور اجازه دارد تعیینشان کند
- رفتار اپ برای هر خانواده خطا، جدا از هم
اینها نشانه اند که هنوز آماده نیستید
- رمز پایگاه داده جایی داخل اپ نوشته شده
- مبلغ نهایی را اپ حساب می کند و می فرستد
- هیچ درخواستی مهلت مشخص ندارد
- جواب این سوال که اگر سرویس را ترک کنیم چه می ماند، معلوم نیست
مسیر سریع با هوش مصنوعی
کاری که مدل ها امروز در بک اند واقعا خوب انجام می دهند نوشتن کد نیست، ساختن مشخصات است. اگر شکل داده و فهرست دسترسی ها را قبل از هر کدی از مدل بگیرید و خودتان بخوانید، دو سوم اشتباه های رایج پیش از تولد از بین می روند و کد بعدی هر که بنویسد بهتر می شود.
- کاری که محصول باید بکند را به زبان ساده بنویسید، بدون هیچ اصطلاح فنی. چه کسانی وارد می شوند، چه می بینند، چه می سازند و چه چیزی را عوض می کنند.
- نسخه پایین را با یک مدل قوی اجرا کنید، نه با مدل ارزان. این پاس تصمیم است و نه کار مکانیکی؛ انتخاب فعلی ما در بخش هوش مصنوعی سایت آمده است.
- جدول دسترسی را خط به خط بخوانید. این تنها جایی است که یک نفر غیر برنامه نویس هم می تواند غلط را ببیند، چون جمله های فارسی است و نه نحو یک زبان قانون.
- هر سطری که خودتان نمی توانید در یک جمله توضیح بدهید چرا لازم است، حذف کنید و دوباره بپرسید. مدل ها میل دارند جدول را کامل تر از نیاز شما بسازند.
نسخه آماده کپی
من دارم بک اند این محصول را طراحی می کنم:
{توضیح ساده محصول به زبان عادی}
هیچ کدی ننویس. سه چیز بده و نه بیشتر:
۱) شکل داده: فهرست جدول ها یا مجموعه ها، فیلدهای هر کدام با نوعشان، و اینکه هر سطر به کدام کاربر تعلق دارد. هر فیلدی که فقط سرور اجازه نوشتنش را دارد را با برچسب «فقط سرور» مشخص کن.
۲) جدول دسترسی: برای هر جدول و هر نقش کاربری، چهار ستون خواندن، ساختن، ویرایش و حذف. هر خانه را با یک جمله فارسی کامل پر کن، مثل «فقط سطرهایی که کاربر شناسه اش با مالک سطر یکی است». هیچ نحو قانون و هیچ کد ننویس.
۳) فهرست چیزهایی که کلاینت هرگز نباید تعیینشان کند، با دلیل یک خطی برای هر کدام.
قاعده های سختگیرانه:
- هیچ نام سرویس، نام کتابخانه، شماره نسخه و قیمتی ننویس.
- هیچ فیلدی اضافه نکن که در توضیح بالا نیامده باشد؛ اگر جای خالی دیدی به جای پر کردنش، در فهرست جداگانه «سوال هایی که باید بپرسم» بنویس.
- اگر جایی نمی دانی، بنویس نمی دانم. حدس نزن.
قبل از اعتماد به خروجی: جدول دسترسی خروجی را قبل از تبدیل شدن به هر کدی، خودتان بخوانید و روی سه چیز مکث کنید. اول، هر خانه ای که در آن جمله «همه کاربران وارد شده» آمده: این تقریبا هیچ وقت جواب درست نیست و همان چیزی است که مستندات فایراستور هم درباره نمونه قوانین ساده اش هشدار می دهد. دوم، هر فیلدی که مدل «فقط سرور» نزده ولی پول یا نقش را تعیین می کند. سوم، فهرست «سوال هایی که باید بپرسم» را جدی بگیرید؛ همان فهرست چیزهایی است که اگر جوابش را ندهید، بعدا کسی به جای شما حدس می زند.
هوش مصنوعی در این کار
بک اند جایی است که کمک هوش مصنوعی بیشترین سود و بیشترین خطر را با هم دارد. سود در طراحی است: شکل داده، جدول دسترسی و بازخوانی قانون هایی که خودتان نوشته اید. خطر در این است که همان چیزی که دستی به مدل می دهید تا کمکتان کند، اغلب رمز اتصال یا کلید سرویس است.
ابزارهایی که واقعا کمک می کنند
- Claude برای پاس طراحی بالا و برای بازخوانی جدول دسترسی خوب جواب می دهد. ایران در هیچ یک از دو فهرست کشورهای پشتیبانی شده انتروپیک نیست. این را از صفحه خود انتروپیک خوانده ایم و نه از تست شبکه.
- Claude Code وقتی بک اند از یک فایل بیشتر شد، ابزار خط فرمان روی خود پروژه کار می کند و لاگ سرور را هم می خواند، که برای خطاهای دسته سوم درس همین است که لازم است. روی همان حساب انتروپیک کار می کند و ایران در فهرست نیست.
- Gemini برای خلاصه کردن یک صفحه مستندات و برای پاس های ساده تر مقرون به صرفه است. صفحه خود گوگل می گوید اپ وب جمنای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
کجا نتیجه معکوس می دهد
خطر اول ساده است و همه یک بار مرتکبش می شوند: چسباندن رشته اتصال پایگاه داده یا کلید سرویس داخل پرامپت. رمزی که به یک سرویس بیرونی رفته باشد دیگر رمز نیست، و برخلاف یک کلید ای پی آی معمولی، رشته اتصال پایگاه داده مستقیم به همه داده ها می رسد. راه ساده اش این است که هیچ وقت فایل تنظیمات را کپی نکنید و به جای مقدار، اسم متغیر را بنویسید.
خطر دوم ظریف تر است و مستقیم از مستندات خود فایربیس درمی آید: کتابخانه های سمت سرور تمام قوانین امنیتی را دور می زنند و از راه اعتبارنامه های پیش فرض گوگل احراز هویت می شوند. یعنی اگر از مدل کد بخواهید و او نمونه سمت سرور بنویسد، آن کد از قانون هایی که ساعت ها رویشان وقت گذاشته اید معاف است و شما هیچ خطایی نمی بینید. هر بار که کد بک اند از مدل گرفتید، اول همین را چک کنید که این تکه با کدام کتابخانه حرف می زند.
منبع ها: Firebase: get started with Cloud Firestore Security Rules Firebase Security Rules: how they work and where they are defined Anthropic: supported countries Google: where Gemini Apps are available
حد این توصیه
این درس شکل بک اند را توضیح می دهد و نه ساختنش را. سه چیزی که عمدا نیامده اند: مقیاس پذیری وقتی چند هزار نفر همزمان کار می کنند، هزینه واقعی هر کدام از این دو مسیر، و طراحی خود پایگاه داده. برای هزینه هیچ عددی نمی گوییم چون به مصرف بستگی دارد و هر عددی که اینجا بنویسیم فردا غلط است. و یک محدودیت صادقانه تر: ما مهاجرت یک محصول واقعی از سرویس بک اند آماده به سرور خودی را انجام نداده ایم، پس هر چه درباره سختی این کار گفته شد، نقل حرف خود سازنده هاست و نه اندازه گیری ما.
از تجربه خود ما
حالت سوم همین درس، یعنی «سرور جواب داد ولی خیلی دیر»، روی همین سروری که این صفحه را به شما داد قابل نشان دادن است. دو فایل تنظیمات را همین امروز باز کردیم. در /www/server/php/85/etc/php.ini خط ۴۰۴ نوشته max_execution_time = 900، و در /www/server/php/85/etc/php-fpm.conf خط ۴۰ نوشته request_terminate_timeout = 180. یعنی روی سایتی که تنظیمات PHP اش می گوید پانزده دقیقه، آنچه واقعا درخواست را تمام می کند سه دقیقه است، و آن عدد در فایل دیگری نوشته شده که معمولا کسی سراغش نمی رود. برای اپی که به چنین سروری وصل است این یعنی یک عملیات سنگین می تواند در دقیقه سوم تمام شود بدون اینکه برنامه پیامی داده باشد، و کاربر فقط می بیند «سرور قطع است». همین یک اختلاف عدد، اولین جایی است که ما موقع بررسی کندی یک ای پی آی نگاه می کنیم.
سوال هایی که واقعا پرسیده می شوند
اپلیکیشن بدون بک اند اصلا ممکن است؟
بله، و بیشتر از چیزی که فکر می کنید. ماشین حساب، فلش کارت، ابزارهای آفلاین و هر اپی که داده اش فقط مال همان گوشی است، بک اند لازم ندارند. لحظه ای که بک اند لازم می شود جایی است که دو دستگاه باید یک چیز را ببینند، یا داده باید بعد از پاک شدن اپ باقی بماند.
می شود از همان بک اند سایت برای اپ استفاده کرد؟
اغلب بله و این معمولا انتخاب درستی است، ولی نه با همان درهایی که سایت استفاده می کند. سایت با کوکی و فرم کار می کند و اپ به یک ای پی آی نیاز دارد که با توکن کار کند و جواب JSON بدهد. یعنی همان پایگاه داده و همان منطق، با یک لایه ورودی تازه.
اول اپ را بسازیم یا اول بک اند را؟
هیچ کدام. اول قرارداد بینشان را بنویسید، یعنی فهرست آدرس ها با ورودی و خروجی هر کدام. بعد از آن دو نفر می توانند موازی کار کنند و لحظه اتصال دعوا نمی شود؛ بدون آن، همیشه یک طرف منتظر طرف دیگر می ماند.