عماد عابدینی
عماد عابدینی
خواندن ۷ دقیقه·۱ سال پیش

چجوری خیلی وقتا PocketBase کارمون رو راحت میکنه؟

فرض کنید میخوایم برای Backend پروژه برنامه‌ریزی کنیم که به چه صورت انجام بشه. خب معمولا اینطوریه که:

  • بیایم Backend رو خودمون بزنیم (کاملا از صفر یا به کمک فریمورک‌ها)
  • بیایم Backend رو بسپاریم به یک شخص/تیم دیگه
  • بیایم از Backend as a service (BaaS)ها (فعلا بهش بگیم Backendهای آماده!) استفاده کنیم.
AI Image
AI Image


هر کدوم از این حالت‌ها چالش‌های خاص مخصوص به خودشون رو دارن.

  • به فرض اگه قرار باشه Backend رو خودمون بزنیم، می‌تونیم جوری پیاده سازیش کنیم که از بهینه بودن و امنیت‌ش خیالمون راحت باشه؟
  • اگه بسپاریمش دست یک شخص/تیم دیگه، تا زمانی که پروژه بالا باشه پشتیبانی‌ش رو به خوبی انجام میده؟
  • اگه بخوایم از BaaSها استفاده کنیم، از کدوم استفاده کنیم؟ اصلا BaaSها جوابگوی کار ما هستن؟
اینکه کدوم حالت رو انتخاب کنیم و کدوم بهتره، طبیعتا بستگی به فاکتور‌های زیادی از پروژه داره، ولی خب از اونجایی که هدف از این پست آشنا شدن با یکی از BaaSها به اسم PocketBaseه، در ادامه می‌خوایم در مورد خوبی‌های استفاده از BasSها بدونیم.


بریم سراغ BaaSها

همونطور که از اسمش (Backend as a service) مشخصه، BaaS خیلی ساده که بخوایم بگیم یعنی جای اینکه Backend رو خودمون بزنیم، از ارائه دهنده‌های سرویس Backend استفاده کنیم! شاید سوال پیش بیاد که مگه میشه!؟ بله میشه. ولی قطعا نه همیشه.

اگه برای پروژتون به یک API نیاز دارین که عمده اصلی کارش فرایند CRUD هست، حالا این وسط احراز هویت و کنترل دسترسی نسبتا پایه ای رو هم براش در نظر دارین، به احتمال خیلی زیاد استفاده از BaaSها انتخاب مناسبی برای شماست.

اما بعضی وقتا هست که Backend قرار نیست فقط یه CRUD باشه، یه وقتی هست سمت سرور قراره پردازش AI یا به فرض Machine Learning یا اصلا یه وقتی هست که ما بر حسب پروژمون نیاز به دیتابیس خاصی مثل Neo4j داریم که خب طبیعیتا توی یه همچین حالت‌هایی نمیتونیم از BaaS‌ها استفاده کنیم. (البته نه که کلا نتونیم، میشه بخشی از کار رو با BaaSها انجام بدیم و بخش دیگه رو خودمون پیاده‌سازی کنیم، ولی در کل امکاناتی که BaaSها دارن یکسری امکانات عمومیه و نباید از یه BaaS انتظار داشته باشیم هر چی تو ذهنمون هست رو داشته باشه!)

source: https://blog.back4app.com/mbaas-comparison/
source: https://blog.back4app.com/mbaas-comparison/


حالا اگه یه سرچ ساده انجام بدیم، می‌بینیم که کلی ارائه دهنده‌ی BaaS داریم، چند تا از محبوب‌هاشون:

  • AWS Amplify
  • Firebase
  • Netlify
  • Appwrite
  • PocketBase
  • Supabase
  • ...

حالا ما تو این پست می‌خوایم با یکی از این BaaSها به اسم PocketBase آشنا بشیم، اینکه چجوری باید ازش استفاده کرد، چه امکاناتی داره و چجوری می‌تونه به عنوان Backend پروژه ازش استفاده بشه که در نهایت باعث شه هم کلی تو وقتمون صرفه‌جویی بشه و هم اینکه از نتیجه کار هم راضی باشیم...

راستی اینم بگم که من از BaaSها با Firebase (GCP), Amplify (AWS) و Supabase کار کردم، ولی از کار کردن با PocketBase حس خیلی بهتری داشتم و از اون جایی که PocketBase هنوز اونقدری محبوب نشده، گفتم این پست رو بذارم شاید برای کسی مفید بود. ?

بعضی از امکاناتی که PocketBase داره:

  • کلا یدونه فایله! یعنی چی؟ یعنی برای راه‌اندازی PocketBase ما کلا با یدونه فایل سرو کار داریم، همین یدونه فایل رو اجرا می‌کنیم و تموم... ?
  • نحوه نصب و استفاده ازش به شدت راحته.
  • امکان نصب و راه‌اندازی روی سرور شخصی خودمون داره.
  • امکان تعریف احراز هویت (authentication) و کنترل دسترسی (authorization) خیلی خوبی داره.
  • امکان پیاده سازی احراز هویت به صورت دستی (نام کاربری، کلمه عبور) و یا OAuth2 (اکثر سرویس دهنده‌ها رو هم خودش از قبل داره، مثل Google, Facebook, Github و...)
  • دیتابیس به صورت real-time
  • ایجاد روابط بین کالکشن‌ها
  • برای Dart و JavaScript هم SDK داره و نیازی نیست مثلا بیایم از axios استفاده کنیم.
  • کاملا رایگانه
  • و کلی امکانات دیگه...
source: https://productcoalition.com/what-is-baas-backend-as-a-service-9c9a8ed12550
source: https://productcoalition.com/what-is-baas-backend-as-a-service-9c9a8ed12550


یه مثال از نحوه کار با PocketBase ببینیم...

پیاده سازی User Management

بیایم فرض کنیم می‌خوایم User Management رو با PocketBase پیاده‌سازی کنیم.
(این مثالی که می‌زنیم یه مثال خیلی سادست که فقط با نحوه کار با PocketBase آشنا بشیم.)
خب برای user management تو ساده‌ترین حالت هر کاربر یک username و یک password داره (حالا برای اینکه یکم مثالمون قشنگ‌تر بشه یه فیلد دیگه هم در نظر می‌گیریم که کاربر admin هست یا نه، اسمشم میذاریم is_admin)

پس بریم تو پنل PocketBase و یک کالکشن به اسم users ایجاد کنیم:

ایجاد کالکشن users به همراه فیلدهای username, password و is_admin
ایجاد کالکشن users به همراه فیلدهای username, password و is_admin


انتخاب type هر فیلد هم به سادگی انجام میشه:

تعیین type برای هر فیلد
تعیین type برای هر فیلد


کالکشنی که ایجاد کردیم میشه به این صورت: (یه رکورد هم بهش دستی اضافه شده اینجا)

کالکشن users
کالکشن users


خب کار تمومه... الان CRUD روی این کالکشن آماده استفادست.
برای نمونه Post و Deleteش به این صورت میشه :

Post
Post


Delete
Delete


کلی هم حالت‌های مختلف برای user management در اختیارمون میذاره:

user management
user management


دسترسی به هر Route رو هم می‌تونین خیلی راحت محدود کنین:

تعیین سطح دسترسی برای هر Route
تعیین سطح دسترسی برای هر Route


از این بخش هم می‌تونین log هاتون رو چک کنین:

لاگ کاربران معمولی و مدیر
لاگ کاربران معمولی و مدیر


و کلی امکانات دیگه که باید خودتون باهاش کار کنین...


چجوری روی سیستم شخصی (Local) نصبش کنیم؟

اگه بخوایم از PocketBase برای فرایند تست و در کل development استفاده کنیم، میتونیم local بیاریمش بالا که تو این حالت نصبش خیلی سادست و نیاز به توضیحی نداره، کافیه از اینجا نسبت به سیستم عامل دانلودش کنیم و تموم.

چجوری Online بهش دسترسی داشته باشیم؟

حالا یه موقع هست که می‌خوایم برای production ازش استفاده کنیم، یا در کل به هر دلیل می‌خوایم آنلاین بهش دسترسی داشته باشیم که این خودش میشه دو حالت:

- میایم یه سرور اجاره می‌کنیم، PocketBase رو روش نصب می‌کنیم و ازش استفاده می‌کنیم.
- حالت دوم اینکه حالو حوصله Server رو نداریم (اینطوری نباشیم ?) ، تو این حالت می‌تونیم از سرویس دهنده‌هایی مثل آروان، لیارا و چابکان استفاده کنیم که کل فرایند رو انجام میدن.
(البته آروان فعلا تو لیست Appهای پیشفرض ندارش ولی میتونین داکرش رو خیلی راحت تو پنل کانتینر ابری‌ش اضافه کنید)

ایجاد PocketBase در پنل چابکان
ایجاد PocketBase در پنل چابکان


چجوری روی Server نصبش کنیم و به بیرون Exposeش کنیم؟

همونطور که صحبتش شد، یه راه استفاده از PocketBase اینه که بیایم رو سرور خودمون بیاریمش بالا.

قبلش بگم که مستندات کامل Deploy کردنش رو از اینجا میتونین مطالعه کنین و از اینجا هم میتونین با نسخه Demoش کار کنین.

خب از اونجایی که معمولا سرور رو لینوکسی می‌گیریم، توضیحات رو با لینوکس میریم جلو:
اول از اینجا نسخه لینوکسیش رو دانلود می‌کنیم، به سرور انتقالش میدیم و unzipش می‌کنیم.
حالا کامند زیر رو اجرا می‌کنیم و تموم! همین

./pocketbase serve

بعد از اجرا شدن، بهمون 2 تا مسیر میده:

الان فقط از داخل سرور بهش دسترسی داریم، پس باید به بیرون هم exposeش کنیم که بتونیم خارج از سرور هم بهش دسترسی داشته باشیم.
اینجا هم PocketBase کارو برامون راحت کرده و فقط کافیه به جای کامند بالا از این یکی استفاده کنیم:

./pocketbase serve --http= [SERVER_IP/DOMAIN : PORT]

الان دیگه می‌تونیم با IP سرور و از اینترنت هم بهش دسترسی داشته باشیم، ولی مشکلی که داره اگه ارتباطمون با سرور قطع شه (مثلا ssh زدیم و ببندیمش) و یا سرور ریستارت شه، دیگه بهش (PocketBase) دسترسی نداریم، برای حل این مشکل می‌تونیم یه سرویس اضافه کنیم، به این صورت:

تو مسیر زیر یک فایل ایجاد می‌کنیم:

/lib/systemd/system/pocketbase.service

و محتواش رو به صورت زیر قرار میدیم:

تعریف سرویس
تعریف سرویس


و بعد میایم سرویسی که تعریف کردیم رو start می‌کنیم:

systemctl enable pocketbase.service

و آخرین مرحله اینکه PocketBase رو هم start می‌کنیم:

systemctl start pocketbase

با این سرویسی که تعریف کردیم با بسته شدن ssh و یا ریستارت شدن سرور، PocketBase خودش دوباره start میشه.


AI Image
AI Image




تو این پست سعی کردم به شما یک دید کلی از BaaSها و PocketBase بدم. اینکه خیلی وقتا به جای صرف زمان و هزینه برای توسعه Backend میتونیم از BaaSهایی مثل PocketBase استفاده کنیم.

راستی:

در حال حاضر آخرین نسخه PocketBase ، نسخه 0.19.3 هست و بهتره تا قبل منتشر شدن نسخه 1.0.0 برای پروژه‌های تجاری ازش استفاده نکنید. (کلا برای پروژه‌های تجاری سطح متوسط به بالا، استفاده از BaaS رو پیشنهاد نمی‌کنم.)
همونطور که بالاتر هم توضیح دادم، استفاده از BaaSها خیلی وقتا انتخاب درستی نیست. (بستگی به پروژه داره)
سرویس‌هایی مشابه با PocketBase زیاد هستن، این PocketBase هم به قول یکی از دوستان خیلی چیز WOW ای نیست، ولی نسبت به بقیه BaaSها احتمالا شما هم حس بهتری ازش می‌گیرین.


امیدوارم از این پست خوشتون اومده باشه و براتون مفید بوده باشه. اگه دوست داشتید میتونید از طریق لینکدین باهام در ارتباط باشید.?

موفق باشید...

برنامه نویسیbackendapi
Security Researcher | Full Stack Developer
شاید از این پست‌ها خوشتان بیاید