سیر تا پیاز راه‌ا‌ندازی یک «automated backup» ارزون برای کسب‌وکارها/سایت‌های نچندان بزرگ

یک سرویس بدون backup, یک سرویس مرده است!نکاتی‌ قبل خواندن:سطح این نوشته متوسط هستش. برای افرادی میتونه مفید باشه که مسئولیت نگهداری و توسعه سرویس‌های کوچیکی رو دارن و هنوز سرویسشون بار و لود زیادی نداره. (تقریبا خیلی از سرویس‌ها)میتونه برای کسایی که ایده‌ای از backup گرفتن سرویس‌ها/سرورهاشون ندارن هم جذاب باشه. یا افرادی که میخوان کمی با چالش‌های server-side بیشتر دست و پنجه نرم کنند.برای افرادی که خودشون اینکاره هستن شاید قسمت معرفی اشتراک رایگان cloud storage مگا براشون جدید باشه (شایدم نه) مگرنه بقیه موارد رو بلدن خودشون.مفاهیم و ابزارهایی که بهشون نیاز داریم عبارتند از: Linux knowledge, Bash و دیگر هیچ :))اگر از هاست‌های اشتراکی استفاده میکنید، اکثر خدمات‌دهنده‌ها سیستم backupگیری دارند و احتمالا دسترسی لازم برای این کارها رو ندارید. پس احتمالا این نوشته میتونه برای شما جنبه آموزشی داشته باشه و وقتی به کارتون بیاد که رو vps و سرور اختصاصی خودتون مهاجرت کرده باشید.هکسره رو برای خوانایی بیشتر بعضا رعایت نکردم و نوشتن به سبک گفتاری رو ترجیح دادم. اگر OCD ادبیاتی دارید از این متن پرهیز کنید :)))شاید کمی طولانی شده باشه. نمیخواستم از محتواها کم کنم و خب جداکردن نوشته و تبدیلش به دوتا متن هم زیاد جذاب نبود و یکنواختیش رو از دست میداد. پس پیشاپیش از صبر و توجه شما بسی سپاسمندم(قلب)مقدمه ( تو این قسمت بیشتر درباره خودم و خلاصه داستان چگونگی ایجاد نیازم صحبت میکنم. اگر علت نوشتنم برات مهم نیست، میتونی خیلی راحت رد کنی این قسمت رو! )از اواسط فروردین ۹۹ که ایده تریبون(treeboon.ir) به ذهنمون زد، کرونا، تعطیلی‌ها و کم‌شدن رفت‌و‌آمد هامون رو غنیمت دونستیم و خیلی سریع شروع به ساختن اولین نسخه ایده‌مون کردیم. من همیشه به انتقال تجربه حس خوبی داشتم و تلاشم بر این هست که تو مراحل رشد تریبون راه حل‌هایی که انتخاب کردیم و قسمت‌هایی از مسیری که طی میکنیم رو با شما به اشتراک بزارم. در نتیجه این راه‌حل ها قسمت‌هایی از مسیر یک کسب‌و‌کار نوپا و در حال حاضر کوچیک هستش و اشتباه داشتن، بهینه نبودن یا بهترین نبودن میتونه توش مکرر دیده شه. اما به نقل قول از دوست خوبم شهاب جا داره که بگم:یک مهندس نرم‌افزار معمولی، کارش رو شاید با شناخت کم از ابزار و مفاهیم معمولی هم انجام میده. یک مهندس نرم‌افزار خوب، ابزارها و مفاهیم رو به خوبی میشناسه و همه‌جا از اون‌ها استفاده میکنه و قواعد بازی رو به خوبی رعایت میکنه؛ و اما یک مهندس نرم‌افزار هنرمند، با شناخت کامل ابزارها و مفاهیم، باتوجه به محیط و شرایط قواعد رو هنرمندانه میشکونه و با آگاهی از نتایج تصمیم دیگه‌ای رو انتخاب میکنه! مهندس هنرمند >>>>>>>>>>> مهندس خوب تو موقعیت های متفاوت با دونستن راه درست‌تر، راه دیگه‌ای رو انتخاب کردم و سعی کردم کنار دید تکنیکال دید محصولی (product based) هم داشته باشم. صفر# نیاز اصلی: چه موقعی به backup نیاز داریم اصلا؟اگر تا به حال تجربه‌های تلخی مثل زیر رو داشتی که هیچ! میدونی خودت:)) rm -rf /wrong/path/* کاملا اتفاقی، پاک‌شدن همه اطلاعاتتون و جواب سربالا شنیدن از پشتیبانی و انکار این اتفاق، یا در بهترین حالت ابراز تاسف پشتیبانی از اتفاقی که رخ داده و فرستادن کد تخفیف برای دلجویی! هک شدن و نفوز هکر به کل(یا قسمتی) از سیستم شما و باج خواستن در ازای پاک نکردن اطلاعات(در بهترین حالت!)اما اگر ندیدی و تجربه‌اش نکردی توصیه میکنم به فکر راه حل باشی و قبول کنی حس‌های زیاد قشنگی نیستن :)) پس برای نگهداری نسخه‌ای به‌روز از سرویس‌هاتون حتما نیاز به یک برنامه پشتیبانی منظم و خودکار دارید، یا همون automated backup.یک# از چه چیزهایی رو چند وقت یکبار backup بگیریم تا خیالمون راحت باشه؟خیلی سوال کلی هست و جوابش هم کاملا بستگی به شرایط و نیازهای سرویس شما داره! برای جواب دادن به این سوال نوع(ساختار) اطلاعات شما، حساسیت اونها، میزان تغییرات و افزایش اطلاعات و ... و کلی معیار دیگر موثر میتونن باشن.ما داخل تریبون(treeboon.ir) اطلاعات آگهی‌ها(تریبون‌های تبلیغاتی) و عکس هاشون رو داریم. پس یعنی عکس(فایل)، سورس کد و دیتابیس انواع اطلاعاتی هست که ما نیاز به backup گرفتن از اونها هستیم. اما یک نکته رو نباید فراموش کنیم که یک backup خوب همه چی رو شامل میشه! هرچیزی که داخل سرورهاتون دارید(کانفیگ‌ها و‌ جاب‌ها و ...). اما خب با توجه به نوپا بودن تریبون تصمیم گرفتیم پیچیدگی کار رو زیاد نکنیم و درواقع یک Disaster Recovery Plan داشته باشیم فعلا.و خب درباره چند وقت یکبار backup گرفتن هم خودتون و منابعی که در دسترس دارید بهترین جواب رو میدونن! میتونید از روزی یکبار تست کنید تا عدد بهینه‌تر برای سرویستون رو پیدا کنید.دو# خب چه‌جوری شروع کنیم؟ با نام و یاد خدا: موسیقی مورد علاقه خودتون رو اول پلی کنید :)) بد نیست اگر تاحالا از Bash استفاده نکردید کمی باهاش آشنا شید و بعدش شروع کنید.(در حدی که الان نیاز دارید، داخل این لینک هست)بعدش یک دایرکتوری ایجاد کنید و برای هر اسکریپتی که میخوایید بنویسید یک فایل ".sh" بسازید. خب از backup دیتابیس شروع کنیم که به نوعی همه درگیرش هستند. مدل backup گرفتن از هر دیتابیسی متفاوته و برای هرکدوم کلی اسکریپت آماده و خوب هست مثل: postgresql, mongodb, mysql که برای نیاز ما همشون جواب میدن و راحت هستن! خب یک مثال خیلی ساده از mysql با هم یه نگاه بندازیم:(کد داخل گیتهابم هست)داخل متغیرها مشخصات خودتون مثل آدرس backup و ساختار نام فایل backup رو مشخص میکنید و به‌جای YOUR_USER هم اسم یوزری که قصد دارید این اسکریپت رو اجرا کنه بنویسید(برای اینکه به مشکل دسترسی نخورید). اون nice کاری که میکنه اینه که اولویت انجام این کار(اون خط از اسکریپت) رو برای CPU کمتر میکنه و درواقع nice اش میکنه!(برای مشکل کمبود CPU این راه فرار رو برای مدتی انتخاب کردم! اگر دوست داشتید بیشتر دربارش بدونید از این لینک میتونید استفاده کنید). به همین سادگی شما یک کپی از دیتابیس دارید(برای سرویس های بزرگ راه حل‌های دیگری هستن که تو این نوشته مجالش نیست)! خب برای داشتن نسخه‌های مختلف کدها هم از گیتلب استفاده میکنم. حالا یک سری سرور اختصاصی دارند، نداشتید هم مهم نیست و خود سایت گیتلب هم کارتون رو تا حد زیادی راه میندازه. میمونه backup گرفتن از فایل ها(فیلم: عکس: pdf ویا ...). این قسمت خیلی بستگی به وقت، سلیقه و حوصله‌ای که دارید وابسته است. من در حد نیاز و وقت خودم به شکلی که زیر اشاره میکنم انجامش دادم. شما میتونید اگر نیازهای بیشتری دارید توسعه بدیدش و جزعیات بیشتری براش درنظر بگیرید.خب بازهم خیلی ساده است! با کامند زیرsudo apt-get install zipمیتونید پیکیج zip رو نصب کنید و با تغییر مقدار متغیرها مسیر دلخواهتون رو مشخص کنید و فایل هاتون رو داخل همون مسیری که مشخص کردید به شکل zip شده کپی بگیرید.خب چرا میگیم کپی؟ چون همه اینکارا رو کردیم که در مواقع بحرانی و خاص ما نسخه به‌روز از سرویسمون رو داشته باشیم، این شکلی اگر سرور اپلیکیشن ما بترکه، کپی‌های ما هم باهاش میترکن! اگر هم نترکه کار بهتر این هست که نگهداری سرورهای سرویس اپلیکیشن و سرورهای پشتیبانی رو جدا کنیم همیشه! سه# خب برای backup داشتن از این کپی‌ها چه کنیم؟ کجا ببریم و چگونه اینکار رو انجام بدیم؟راه خوبش اینه که یک یا چندین سرور پشتیبانی داشته باشید و داستان های خودش! اما من قصدم اون راه‌های خیلی اصولی نیست چون هزینه‌اش شاید زیاد شه برای شروع کار. و خب با اینکه راه‌های فنی درست‌تر برای تریبون(treeboon.ir) میدونستیم، تصمیم گرفتیم به سراغ storageهای رایگان بریم. تعدادشون زیاد هست اما خب هرکدوم دردسرهای خودشون رو دارن! یکی معروفترین‌ها هم google-drive عزیز هستن. اما خب برای اشتراک رایگانش ۱۵گیگ میده و من دنبال بیشتر ازینا بودم. یه خفن‌تر پیدا کردم از نوع ۵۰گیگ :)) مگا خدمات Cloud Storage هست که ۵۰ گیگ تو اشتراک رایگانش میده و چی ازین بهتر! به‌روزرسانی: درحال حاضر مگا برای اشتراک رایگان ۱۵ گیگ میده و اون دوران خوش تمام شد :))خب ایده اینه که backupهاتون رو یجوری باید بفرستید رو سرورهای پشتیبانی‌تون و اونجا نگهداریشون کنی. راه‌های مختلفی هست که هرکدوم خوبی بدی های خودشون رو دارن. rsync, ftp, mount و ... از راه‌هایی هستن که میتونید استفاده کنید. mount کردن گوگل‌درایو و سرویس های شبیه بهش کلی ابزار و پکیج آماده هم داره. حالا این مگا عزیز پکیج آماده برای هم cmd و هم gui آماده کرده که خیلی راحت میتونید رو لینک بزنید و نصبش کنید. mac, windows و linux رو پشتیبانی میکنه. برای نصب روی سرور خب به نسخه cmd نیاز داریم. بعدش کافیه آخر اسکریپت‌هاتون این خط رو اضافه کنی تا فایل‌های کپی که ساختید رو به جای دیگه‌ای منتقل کنی و backup واقعی بسازی برای خودت:(برای دیدن بقیه امکانات مگا میتونید تو سایتش برید و ببینید)این اسکریپت با کاربر YOUR_USER و اهمیت ۱۵ برای CPU(هرچی این عدد بیشتر باشه اولویت انجام کار برای CPU کمتر میشه و اون کار niceness بیشتری داره)الان خیلی تمیز میتونید اسکریپت‌هایی بنویسید برای فشرده‌سازی فایل‌هاتون و نگهداری از آنها را به عهده فضاهای دیگر بدید و به اونجا منتقلشون کنید. چهار# خب قسمت automate پس چی میشه؟ این اسکریپت‌هارو دستی اجرا کنیم هربار؟فکر کن یک درصد این کار رو بکنیم! :))اگر با مفهوم cron و job آشنا هستید که خیلی هم عالی. اگر نه به این لینک سر بزنید و بعدش بیایید با هم به کمک ‍‍crontab یک کامندی بنویسیم و بهش یگیم که اسکریپت‌های ما هرچند وقت یکباره، نیاز به اجرا دارند. از این سایت برای اجرا و تست زمان بندی cronهاتون می‌توانید استفاده کنید و بعدش آدرس اسکریپتی که باید انجام بشه رو میدیم بهش:0 5 * * * /bin/bash -c &quot/backup/scripts/run.sh&quot >> /backup/scripts/logger.log 2>&1خب ما اینجا گفتیم ساعت ۵ صبح هرروز(با توجه به timezone سرورتون) بره و اسکریپت run.sh رو اجرا کنه و لاگ‌های اجرای اسکریپت رو بریزه داخل فایل logger.log. و ایزی ایزی تامام تامام!شما ازین به بعد به صورت خودکار backupهاتون رو به ساده‌ترین شکل و با کمترین هزینه ممکن دارید.پنج# نکاتی که میتونه کار رو حرفه‌ای تر و قشنگ‌تر کنههیچ وقت backupهاتون رو replace با قبلی نکنید و هر دفعه فایلی جدید بسازید و قبلی‌هارو تا چندین نسخه نگهداری کنید. (تا اگر مشکلی روی فایل هاتون پیش اومد و در نتیجه backupهاتون هم خراب بود، backupهای قبلی رو از دست نداده باشید)نسخه های خیلی قدیمی رو هم اسکریپتی بنویسید خودکار پاک کنید تا حافظه سرورتون پر نشه.با توجه به مدل backupگیری که انتخاب میکنید، روش تمیز کردن کپی‌های قدیمی میتونه متفاوت باشه اما من یک نمونه ازش رو داخل صفحه گیتهابم گذاشتم. نکات پایانیکدهایی که من نوشتم رو میتونید از صفحه گیتهابم داشته باشید و پیشنهادی داشتید PR, MR بزارید.در طراحی این روش نکات غیرتکنیکال هم در نظر گرفته شده، مثل زمان و هزینه و ... . درنتیجه بهترین راه ممکن نیست، اما راه آسون و کم‌هزینه و خوبی برای تریبون(treeboon.ir) بود. و کلی نکته رعایت نشده هست که شاید خودم ندونمش. ممنون میشم بهم یادآوری کنیدش(قلب)در ریزه‌کاری‌ها امکان داره که کد و روش من با نیاز شما متفاوت باشه ویا فراموش کرده باشیم جزعیات خیلی‌ریز رو بنویسم. به مشکلی خوردید بپرسید و اگر مشکلی هم دیدید، داخل نظرات بگید تا بقیه دوستان هم بدونند و اشتباه نکنند. من هم حتما با اصلاحات جدی متن رو اصلاح میکنم.ممنون میشم اگر هر انتقاد و پیشنهادی بود برام بنویسید(برام بسیار ارزشمند هست نظراتتون). اگر فکر میکنید این متن رو دوست داشتید ویا به درد دوستانتون میخوره به اشتراکش بزارید.سعی میکنم تا جایی که برسم، همراه رشد تریبون(treeboon.ir) مطالبی که شاید مشکل دیگران هم باشه رو انتشار بدم. پس منتظر باشید تا تریبون رو بیشتر ببینید ازین به بعد ;)مرسی که تا آخر متن همراهی کردی. امیدوارم به اطلاعاتی که داشتی اضافه شده باشه و لذت برده باشی.به ‌امید دیدار. https://treeboon.ir/