استفاده از Firebase بدون سرور – ساخت آسان برنامه های موبایل و وب

برنامه های تلفن همراه و وب معمولاً به یک سرور back-end نیاز دارند. برنامه های وب برای ارائه محتوا به سرور وب نیاز دارند. همچنین برنامه ها باید پروفایل ها و رسانه های کاربر مانند تصاویر و فیلم ها را ذخیره کنند. ارتباطات بین برنامه و سرور اغلب با استفاده از API انجام می شود که معمولاًREST است.

برنامه ها در طیف وسیعی از زبانها کدگذاری می شوند. یک برنامه iOS به زبان Swift یا Objective-C نوشته شده است. برنامه های اندروید به زبان جاوا یا کوتلین نوشته شده اند. برنامه های وب با HTML ،CSS ،JavaScript و اغلب چارچوب های پیچیده مانند Angular یا React نوشته می شوند. توسعه دهندگان Front-End باید زبانهای مربوطه و ابزارهای توسعه مربوط به آنها را بدانند.

سرورهای Back-End به طیف وسیعی از زبانها از جمله Go ،Java ،PHP و Python نوشته شده اند. هر یک از این زبان ها مجموعه کتابخانه های خاص خود را دارند تا نوشتن برنامه های پیچیده را تسهیل کنند.

بیشتر توسعه دهندگان خود را توسعه دهندگان frontend یا backend می دانند. توسعه دهندگان full stack که در هر دو نقش تبحر دارند نسبتاً نادر هستند.

راه اندازی و نگهداری سرور back-end چالش های خاص خود را دارد. سرورها باید ساخته شوند، به روز شوند و نسخه پشتیبان تهیه شوند. برای جلوگیری از اتلاف تصادفی یا مخرب داده ها یا دسترسی به داده های حساس، باید سرورها نیز ایمن باشند. علاوه بر این، سرورها باید نام میزبان و آدرس IP اختصاصی داشته باشند تا بتوان به آنها متصل شد.

Firebase چیست؟

Firebase به عنوان معماری پیام رسان موبایل شروع به کار کرد که توسط گوگل خریداری شد. از آن زمان به بعد تبدیل شده است به مجموعه ای متشکل از بیش از 25 مولفه که با Google Cloud Platform همکاری می کنند .

Firebase شامل کیت های توسعه نرم افزار (SDK) است که به توسعه دهندگان موبایل و وب امکان دسترسی ساده و ایمن و قابل اعتماد به قابلیت های ابری را می دهد. آنها به طور خودکار اتصال شبکه ضعیف را جبران می کنند. یک کنسول وب Firebase برای فعال کردن، مدیریت و ایمن سازی اجزا وجود دارد. همچنین ابزارهای خط فرمان و REST API برای استفاده عمیق تر وجود دارد.

برخی از اجزای Firebase بیشتر از بقیه شناخته شده اند. وابستگی های کمی بین اجزای سازنده وجود دارد که اجازه می دهد تا عملکرد به تدریج اتخاذ شود. تأیید اعتبار و تجزیه و تحلیل Firebase بیشترین استفاده را دارند.

Firebase به یک پلتفرم تبدیل شده است که به توسعه دهندگان تلفن همراه و وب امکان می دهد برنامه های کاملی را بدون نیاز به سرورهای back-end توسعه دهند. پیشرفت های اخیر راه حل های بدون سرور را که گزینه ای مناسب، مقیاس پذیر و مقرون به صرفه برای راه حل های سرور Cloud Virtual Machine فراهم می کنند، بسیار تسهیل کرده اند.

برنامه های قیمت گذاری و صورتحساب Firebase

طرح اصلی صدور صورت حساب Firebase، به نام Spark، رایگان است. استفاده از منابع ابری محدودیت هایی دارد، اما بسیار سخاوتمندانه است. اجرای یک برنامه با اندازه مناسب بدون تحمیل هزینه امکان پذیر است.

تحت طرح Spark می توان وب سایتی با حداکثر 1 گیگابایت محتوا و انتقال کمتر از 10 گیگابایت در ماه را داشت. Firestore حداکثر 1 گیگابایت داده و ترافیک شبکه تا 10 گیگابایت در ماه را امکان پذیر می کند. محدودیت فضای ذخیره سازی ابر حداکثر 5 گیگابایت داده و بارگیری حداکثر 1 گیگابایت در روز است.

اگر برنامه به منابع بیشتری احتیاج دارد، یک برنامه پرداخت صورتحساب مانند پرداخت در حین انجام کار مورد نیاز است. محدودیت های رایگان طرح Spark هنوز اعمال می شود. هزینه های قابل پرداخت بسیار کم است. قیمت گذاری را می توان در صفحه قیمت گذاری Firebase یافت .

ماشین های مجازی در حالی که کار می کنند در فضای ابری متحمل بار می شوند، حتی اگر از آنها استفاده نشود. این بدان معنی است که منابع به طور موثر فقط در هنگام استفاده در حال اجرا هستند و در صورت عدم استفاده، هزینه ای را متحمل نمی شوند. این برای برنامه های کاربردی برای مشاغل فصلی مانند اجاره تعطیلات یا رویدادهای دوره ای مانند کنسرت ایده آل است. بعد از ماهها بی تحرکی فعالیت زیادی وجود خواهد داشت.

نحوه تنظیم Firebase

برای احراز هویت به یک حساب ایمیل احتیاج دارید. حساب ایمیل Google ترجیح داده می شود. می توان آنها را در  https://mail.google.com  ایجاد کرد .

حساب Google Cloud Platform (GCP) نیز مورد نیاز است. کارت اعتباری به عنوان اثبات هویت لازم است. Google ممکن است 1 دلار شارژ کند و سپس هزینه آن را پس دهد. در صورت فعال بودن صورتحساب و استفاده از منابع قابل پرداخت، کارت اعتباری ماهانه بدهکار خواهد شد. همچنین شرکتهای ارائه دهنده Google وجود دارند که به عنوان واسطه برای صورتحساب عمل می کنند. شما هزینه استفاده از ابر را به ارائه دهنده پرداخت می کنید و آنها نیز به Google پرداخت می کنند. 

برای نظارت بر میزان استفاده، مهم است که مرتباً قسمت صورتحساب کنسول ابر را کنترل کنید. منابعی مانند ذخیره سازی را در صورت عدم نیاز فعال نگه دارید، که این امر می تواند هزینه های قابل توجهی را در طول زمان متحمل شود.

پروژه های Firebase نیز پروژه های GCP هستند. می توانید یک پروژه GCP ایجاد کنید و آن را به Firebase وارد کنید یا یک پروژه Firebase ایجاد کنید که یک پروژه GCP نیز ایجاد می کند. کنسول Firebase اینجاست .

برای انواع مختلف برنامه ها، تنظیمات مختلفی لازم است. برنامه های اصلی Android ،iOS و برنامه های وب هستند. دستورالعمل های نصب را می توان در راهنمای رسمی Firebase یافت .

احراز هویت و مجوز

احراز هویت Firebase شاید پرکاربردترین مولفه Firebase باشد. کاربران می توانند یک یا چند مکانیزم احراز هویت را انتخاب کنند. اینها آدرس ایمیل و رمز ورود، شماره تلفن ها و ارائه دهندگان هویت Google ، Facebook ، Twitter و GitHub هستند. هر تعداد مکانیزم احراز هویت را می توان فعال کرد.

Firebase UI کاربر را به استفاده از مکانیزم دعوت می کند:

Firebase رابط های کاربری را برای احراز هویت فراهم می کند که می تواند از چند خط کد در سمت مشتری فراخوانی شود. همچنین API هایی برای انجام احراز هویت به صورت دستی وجود دارد. با احراز هویت موفقیت آمیز، یک رمز هویت تولید می شود که می تواند برای اعتبار سنجی مجدد استفاده شود.

API ها به کاربران مدیریت امکان مدیریت برنامه را می دهند. عملیات شامل:

  • ایجاد، به روزرسانی و حذف کاربران
  • با معیارهای جستجو مانند آدرس ایمیل یا شماره تلفن به جستجوی کاربران بپردازید
  • به اطلاعاتی مانند تاریخ ایجاد حساب و آخرین تاریخ ورود و زمان دسترسی داشته باشید
  • بدون نیاز به استفاده از گردش کار، آدرس های ایمیل و شماره تلفن ها را تأیید کنید

بیشتر برنامه های تلفن همراه و وب می خواهند تعداد زیادی از کاربران وارد برنامه های آنها شوند. به عنوان مثال، هر کسی با یک حساب Google Mail می تواند تأیید اعتبار خود را در هر برنامه ای که اجازه تأیید اعتبار Google را می دهد انجام دهد. برای محدود کردن دسترسی برنامه به کاربران خاص، نوعی مجوز لازم است. با ذخیره ارتباط بین آدرس های ایمیل و نقش های دسترسی در ذخیره سازی داده ها، این کار به راحتی انجام می شود. با احراز هویت موفقیت آمیز، آدرس ایمیل در ذخیره داده جستجو می شود. اگر کاربر با نقش های صحیح وجود داشته باشد، دسترسی مجاز است. در غیر این صورت، کاربر به زور از سیستم خارج می شود.

میزبانی Firebase

میزبانی Firebase به شما امکان می دهد محتوای استاتیک وب، که شامل JavaScript است، بدون نیاز به وب سرور در فضای ابری میزبانی شود و امکان دسترسی سریع به محتوا را از هرجای دنیا فراهم می کند.

با افزودن آنها به بخش میزبانی پروژه Firebase در کنسول Firebase، می توان یک یا چند وب سایت میزبانی کرد. محتوا از طریق SSL تحویل داده می شود و دو آدرس اینترنتی از فرم https://site-name.web.app و https://site-name.firebaseapp.com داده می شود، site-name محل نام پروژه یا نام سایت مشخص شده توسط کاربر است.

بسیار آسان است که سایت از نام دامنه خود میزبانی شود به شرطی که بتوانید رکوردهای DNS را برای دامنه تغییر دهید. شما نام دامنه خود را به سایتی در کنسول Firebase اضافه می کنید. سپس یک رکورد DNS TXT به شما داده می شود که باید آن را به DNS دامنه خود اضافه کنید تا به گوگل ثابت کنید که مالک دامنه هستید. هنگامی که رکورد TXT قابل مشاهده است، می توانید سوابق DNS A را برای سایت به دست آورید. یک گواهی SSL به طور خودکار برای سایت تهیه می شود. پس از ارائه گواهی، سایت در سطح جهانی در دسترس است. در اصل، ممکن است چندین ساعت برای بروزرسانی DNS و تهیه گواهی طول بکشد. در عمل می توان فرآیند را در مدت زمان 20 دقیقه به پایان رساند.

برای افزودن محتوا به میزبانی، اول از همه یک دایرکتوری برای سایت ایجاد کنید و در خط فرمان وارد آن شوید. بعد، وارد Firebase شوید و فهرست پروژه را مقداردهی کنید.

firebase login

firebase init

از شما خواسته می شود پروژه ای را انتخاب کنید و اینکه کدام یک از خدمات مشتری مورد نیاز است. سرویس ها همیشه می توانند بعداً اضافه شوند و نیازی به انتخاب در این مرحله نیست.

فایلی ایجاد کنید به نام firebase.json، که فهرست اصلی وب سایت و پرونده ها را برای جدا کردن تعریف می کند. شما همچنین به یک فایل  .gitignore برای حذف پرونده ها از کنترل نسخه نیاز دارید.

{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

سپس، محتوای استاتیک را در فهرست عمومی کپی کنید. در آخر، سایت را در فضای ابری مستقر کنید.

  • firebase deploy

برای تغییر محتوای وب، به سادگی فایل های محتوا را تغییر دهید و دستور deploy را صادر کنید. هر استقرار به عنوان نسخه ای در کنسول Firebase ظاهر می شود. با یک کلیک می توانید به نسخه قبلی برگردید.

Firebase Hosting همچنین می تواند URI ها را در پرونده ها، Cloud Functions و Cloud Run بازنویسی کند. این امر کارها را بسیار ساده می کند زیرا اختصاص دامنه به این سرویس ها ضروری نیست. بازنویسی ها با افزودن یک قسمت بازنویسی به بخش میزبانی firebase.json تعریف می شوند. در صورت عدم وجود سرویس، استقرار میزبان از کار خواهد افتاد.

{
	"hosting": {
		"public": "public",
		"rewrites": [
		{
			"source": "/xxx",
			"destination": "/profile.html"
		},
		{
			"source": "/yyy",
			"function": "profile"
		},
		{
			"source": "/api{,/**}",
			"run": {	
				"serviceId": "cloud-api",
				"region": "europe-west1"
			}
		}
		]
	}
}

ذخیره اطلاعات

Firebase می تواند API های مشتری را برای دسترسی به ذخیره سازی داده های مبتنی بر ابر فراهم کند. سه نوع ذخیره سازی وجود دارد:

  • Realtime Database
  • Cloud Firestore
  • Cloud Storage

با این کار سرویس گیرندگان تلفن همراه و وب می توانند داده ها را بدون نیاز به سرور ذخیره و بازیابی کنند.

پایگاه داده بی درنگ

Realtime Database یک پایگاه داده NoSQL میزبان ابر است. داده ها در پایگاه داده Realtime به طور خودکار در همه زمان ها با همه دستگاه های متصل هماهنگ می شوند. از طریق پلتفرم اندروید، iOS و وب کار می کند. داده ها به عنوان یک ساختار درختی JSON ذخیره می شوند. قوانین امنیتی را می توان برای کنترل دسترسی خواندن و نوشتن به داده ها تنظیم کرد.

هر دستگاه یک نسخه محلی از پایگاه داده را نگه می دارد. این به این معنی است که داده ها در صورت عدم اتصال به شبکه در دسترس هستند. هنگام اتصال مجدد، نسخه های محلی و مبتنی بر ابر داده ها هماهنگ می شوند.

داده ها توسط برنامه ها با استفاده از شنونده خوانده می شوند. شنونده در یک گره از درخت JSON گوش می دهد. هر زمان داده ها در کنسول یا توسط کاربر دیگری تغییر می یابد، پاسخ شنونده با مقدار داده جدید فراخوانی می شود. پایگاه داده Realtime همچنین از query پشتیبانی می کند. هر query یک گره و همه گره های فرزند خود را برمی گرداند.

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

پایگاه داده بیدرنگ برای داده های کوچکی که به ساختار داده ای عمیقاً تودرتو نیاز ندارند، مناسب است. محدودیت رایگان 1 گیگابایت داده است.

Cloud Firestore

Cloud Firestore به عنوان جایگزینی برای پایگاه داده Realtime دیده می شود. این قابلیت پایگاه داده Realtime را گسترش می دهد. داده ها در یک درخت JSON نیستند بلکه یک مجموعه سلسله مراتبی از اسناد هستند. هر سند از مجموعه ای از جفت های مقدار کلید و زیر سندهای اختیاری تشکیل شده است. کوئری ها فیلتر کردن و مرتب سازی پیچیده تری را مجاز می داند و فقط اسناد کامل را برمی گرداند. کوئری ها مستندات فرعی را بر نمی گردانند.

Cloud Firestore بزودی جای Cloud Datastore را خواهد گرفت. می تواند در حالت Datastore یا در حالت محلی اجرا شود. همه برنامه های Datastore به طور خودکار به Cloud Firestore منتقل می شوند.

Cloud Firestore برای داده های نسبتاً کوچک مناسب است و می تواند یک ساختار داده ای کاملاً تو در تو داشته باشد. محدودیت رایگان 1 گیگابایت داده است.

فضای ذخیره ابری

Cloud Storage برای ذخیره فایل هایی مانند تصاویر و کلیپ های ویدیویی است. سرویس گیرندگان موبایل و وب می توانند از Firebase برای آپلود و بارگیری مستقیم پرونده ها از داخل و بدون ابر بدون نیاز به سرور back-end استفاده کنند. محدودیت رایگان 5 گیگابایت داده است.

عملکردهای ابر

Cloud Functions یک فناوری مهم برای ایجاد برنامه های بدون سرور است. یک تابع cloud را می توان با JavaScript ، TypeScript ، Python یا Go نوشت که مستقیماً در Google cloud مستقر شده است. یک عملکرد با درخواست HTTP یا با رویدادی در ابر مانند نوشتن در Cloud Storage آغاز می شود.

عملکرد Cloud می تواند همزمان یک درخواست را کنترل کند، اما cloud با تکرار عملکرد به طور خودکار مقیاس بندی می شود. یک تابع Cloud نوشته شده در پایتون از کتابخانه Flask برای رسیدگی به درخواست های HTTP استفاده می کند. این تابع یک شی درخواست را به عنوان یک پارامتر گرفته و بدنه پاسخ را برمی گرداند.

یک تابع Cloud ساده Python به یک دایرکتوری کاری نیاز دارد و نقطه ورود به فایل main.py است.

def simple_cloud_function(request):
    return "It worked"

وابستگی ها توسط pip مدیریت می شوند و وارد پرونده ای به نام requirements.txt می شوند.

Flask==1.0.2

یک تابع با استفاده از gcloud ابزار خط فرمان مستقر می شود . و نام تابع ، زبان و تریگر را مشخص می کند.

gcloud functions deploy simple_cloud_function --runtime python37 \ 
       --trigger-http

URL تابع در هنگام استقرار نمایش داده می شود و با اجرای دستور توصیف می توان آن را یافت.

gcloud functions describe simple_cloud_function
Url: https://europe-west1-project-id.cloudfunctions.net/simplecloud_function

Cloud Functions می تواند با Google Cloud و Firebase API تماس بگیرد تا قابلیت بازگشت به مرحله را فراهم کند. آنها اطلاعات ورود به سیستم در مورد زمان راه اندازی و زمان اجرا را ارائه می دهند. ورود به سیستم اضافی به راحتی می تواند اضافه شود. گزارش ها را می توان در Stackdriver Logging UI و از طریق gcloud ابزار خط فرمان مشاهده کرد.

gcloud functions logs read simple_cloud_function 

توابع را می توان در Google Cloud Console مشاهده و حذف کرد.

عملکردهای Cloud بهتر است برای عملیاتی که به ندرت اتفاق می افتد استفاده شود. به عنوان مثال، ایجاد یک تصویر کوچک هنگام بارگذاری تصویری در Cloud Storage است. محدودیت رایگان 125000 فراخوان در ماه است.

اجرای ابر

Cloud Run اخیراً قابلیت اضافه شده ای دارد که برنامه های بدون سرور را بسیار تسهیل می کند. کانتینرهای Docker را قادر می سازد تا بدون نیاز به تنظیمات پیچیده زیرساخت، در فضای ابری اجرا شوند و می تواند در حالت مدیریت شده اجرا شود که از زمان اجرا Knative استفاده می کند، که بر روی Kubernetes ساخته شده است. همچنین می تواند بر روی Anthos اجرا شود، که همچنین بر روی Kubernetes ساخته شده است اما اجازه می دهد کانتینرها در ابرها و حتی در مرکز داده های خود اجرا شوند. نیازی به تنظیم و مدیریت خوشه Kubernetes نیست زیرا همه کارها به صورت خودکار انجام می شوند.

هر برنامه ای که می تواند در تصاویر Docker تعبیه شود، می تواند توسط Cloud Run مدیریت شود. به طور خودکار تعداد کانتینرها را بر اساس تقاضا مقیاس بندی می کند. همچنین وقتی از سرویس استفاده نمی شود، به صفر می رسد. خدمات بلااستفاده بدون هزینه است.

در صورتی که کانتینرهای Docker بخواهند به درخواستهای HTTP پاسخ دهند، باید یک وب سرور را اجرا کنند. سرویس پایتون از Flask استفاده خواهد کرد. app.py نقطه ورود به سیستم خواهد بود .

from flask import Flask, request

app = Flask(__name__)

@app.route(’/api/profile’)
def profile():
	page = ’’’
Page content
	’’’
	return page

کانتینرهای Cloud Run مستقیماً در فضای ابری مستقر می شوند.

FROM python
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . .
ENV PORT 8080
RUN pip install Flask gunicorn firebase-admin
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app

اگر نام سرویس ، سیستم عامل ، منطقه یا اجازه تأیید غیرمجاز در پیکربندی پروژه تعریف نشده باشد یا در خط فرمان ارائه نشود، از آنها خواسته می شود. پس از تکمیل استقرار، URL سرویس نمایش داده می شود. URL را می توان با استفاده از دستور gcloud نیز بدست آورد.

gcloud run deploy --image=image_name --platform=managed \
       --region=europe-west1 --allow-unauthenticated  

URL حاوی یک عدد تصادفی است که مدیریت آن دشوار است. اینجاست که قوانین بازنویسی میزبان Firebase بسیار مفید می شوند.

سرویس ها را می توان در Google Cloud Console مشاهده و حذف کرد.

Cloud Run به طور ایده آل برای میزبانی یک REST API مناسب است. محدودیت های رایگان ماهانه 180،000 CPU ثانیه ، 360،000 GB ثانیه حافظه ، 2 میلیون درخواست و 1 GB خروج شبکه است. محدودیت خروج از شبکه رایگان فقط درصورت اعمال سرویس در منطقه آمریکای شمالی اعمال می شود.

احراز هویت

به طور پیش فرض، Cloud Functions و Cloud Run عمومی هستند و هر کسی در اینترنت می تواند به آنها دسترسی داشته باشد. با استفاده از قوانین IAM در Cloud Console، خدمات می توانند به اعضای پروژه، Google Groups و آدرسهای ایمیل فردی محدود شوند.

در صورت وجود محدودیت ها، دسترسی غیر مجاز ممنوع است. برای فعال کردن دسترسی، یک رمز هویت باید به عناوین درخواست اضافه شود. رمز شناسایی را می توان با استفاده از دستور gcloud یا در طی مراحل احراز هویت Firebase بدست آورد.

gcloud auth print-identity-token

عنوان مجوز لازم است.

Authorization: Bearer id-token

خلاصه

Google Cloud Platform و Firebase طیف وسیعی از محصولات را ارائه می دهند که توسعه برنامه های تلفن همراه و وب را بسیار تسهیل می کنند. با دسترسی به کلاینتها برای دسترسی مستقیم به قابلیت های Cloud یا استقرار کدهای Back-End در ابر با استفاده از Cloud Functions یا Cloud Run، می توان نیاز به سرور Back-End را کاملاً برطرف کرد.

برنامه های موجود را می توان به صورت فزاینده به سمت سرور منتقل کرد. در حقیقت، نحوه تکامل این فناوری می تواند به این معنی باشد که دیگر نیازی به راه حل های سنتی مبتنی بر ماشین مجازی نیست.