آموزش استفاده از Mongodbبه عنوان backend برای celery

سلری مونگو دیبی

با نام خدا و سلام، یه چند وقتی میشه دارم برای مدیریت task های یکی از پروژه ها با Celery کار می کنم. قرار شد برای backend از MongoDB استفاده کنم که کم اذیتم نکرد و تصمیم گرفت آموزش مرحله به مرحله اش رو بزارم که شاید به درد کسی بخوره.

نکته: مسئله اصلی این بود که MongoDBروی یه ماشین دیگه ای نصب بود و به صورت remote قرار بود بهش اتصال داشته باشم.

فرضیات و پیش نیاز ها:

۱- فرض بر آن داریم که Celery و پایتون و تمامی پیش نیاز های celery نصب شده است.

۲- فرض داریم سیستم عامل مورد استفاده linux Ubuntu 20.04 می باشد.

نصب Mongo روی اوبونتو

نکته: برای نصب حتما اتصال به پیلتر شکن داشته باشید.

برای شروع، کلید public GPG key آخرین ورژن پایدار از MongoDB را با دستور زیر import می کنیم.

curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

خروجی باید ok باشد. (برای مشاهده کلیدها می توانید از دستور apt-key list استفاده نمایید.)

روی سرور شما دو مکان وجود دارد که apt برای دانلود پکیج ها به آن نگاه می کند.۱) فایل sources.list و ۲) دایرکتوری sources.list.d

با استفاده از دستور زیر، یک فایل با نام mongodb-org-4.4.list درون دایرکتوری sources.list.d می سازیم و تنها محتوای این فایل، خط زیر می باشد.

deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse:

دستور به شرح زیر است:

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

حال نوبت به بروزرسانی می رسد.

sudo apt update

پس از آپدیت شدن، نوبت به نصب mongoDBمی رسد:

sudo apt install mongodb-org

خب امیدوارم که هیچ مشکلی بهنگام دانلود و نصب براتون بوجود نیامده باشد. در صورت ارور دادن حتما اون فایل ساخته شده در sources.list.d را ابتدا حذف و سپس از دستورات remove و purge برای پاک کردن mongoDB استفاده کنید و مجدد اقدام به نصب کنید.

به راه انداختن سرویس MongoDB

برای شروع شدن سرویس MongoDB از دستور زیر استفاده کنید:

sudo systemctl start mongod.service

برای مشاهده وضعیت سرویس MongoDB از دستور زیر استفاده کنید:

sudo systemctl status mongod

برای فعال سازی سرویس MongoDB جهت اجرا به هنگام بوت، از دستور زیر استفاده نمایید:

sudo systemctl enable mongod

برای تست MongoDBنصب شده از دستور زیر استفاده نمایید:

mongo --eval 'db.runCommand({ connectionStatus: 1 })'

در صورت نصب صحیح، خروجی به شکل زیر خواهد بود:

MongoDB shell version v4.4.4
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("dedd89ff-c0efad") }
MongoDB server version: 4.4.4
{
	"authInfo" : {
		"authenticatedUsers" : [ ],
		"authenticatedUserRoles" : [ ]
	},
	"ok" : 1
}

ایمن کردن ارتباط ریموت به MongoDB

همون طور که ابتدا گفتم، قصد ارتباط ریموت به ماشین MongoDB را داریم، به همین دلیل باید یه سری تغییرات در تنظیمات MongoDBانجام داد.

ابتدا باید بک user سطح ادمین به MongoDB اضافه کنیم.

با استفاده از دستور mongoوارد محیط شل می شویم:

mongo

خروجی به صورت زیر خواهد بود:

MongoDB shell version v4.4.4
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("978616c5-988ee52086") }
MongoDB server version: 4.4.4
> 

ابتدا دستور زیر را بزنید:

> show dbs

دستور فوق لیست پایگاه داده ها را نمایش می دهد.

admin   0.000GB
config  0.000GB
local   0.000GB

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

> use admin

خروجی به شکل زیر خواهد بود:

switched to db admin

MongoDB با تعدادی متد های مبتنی بر جاوا اسکریپت نصب می شود، که می توان از آنها برای مدیریت پایگاه داده ها استفاده کرد، یکی از آنها db.createUser می باشد.

> db.createUser(

با توجه با ساختار json باید user جدید با ساختار jsonساخته شود، پرانتز و آکولادها برای همین منظور است.

حال یک آکولاد باز کنید:

... {

حال فیلد user: و نام کاربری مورد نظر خودتون رو بزنید:

... user: "sadegh-khan",

پس از نام کاربری به رمز عبور می رسیم که از pwd: استفاده کنید یا اگر mongoDBورزن بالاتر از 4.2 دارید از دستور زیر استفاده کنید:

... pwd: passwordPrompt(),
... pwd: "password",

سپس دستور زیر برای دسترسی های ادمین بزنید:

... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]

حال آکولاد را ببنیدید:

... }

و همچنین پرانتز:

... )

کل دستورات به شکل زیر شد:

> db.createUser(
... {
... user: "sadegh-khan",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )

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

Successfully added user: {
    "user" : "AdminSammy",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        },
        "readWriteAnyDatabase"
    ]
}

برای خروج دستور exitرا بزنید و اینتر کنید.

حال باید ورود و authenticate کردن را فعال کنیم، فایل کانفیگ mongoDB را باید تغییر دهیم:

sudo nano /etc/mongod.conf

با قسمت securityکار خواهیم داشت، پس security را از حالت کامنت خارج کنید و در خط بعدی‌اش با دو تا فاصله، عبارت authorization: "enabled" را بنویسید.

. . .
security:
  authorization: "enabled"
. . .

همچنین باید bind را از حالت زیر به bind: 0.0.0.0 تغییر دهیم.

net:
  port: 27017
  bindIp: 127.0.0.1

حال مونگو را ریست کنید:

sudo systemctl restart mongod

برای ورود به شل با کاربر ساخته شده ی جدید، از دستور زیر استفاده کنید:

mongo u sadegh-khan -p --authenticationDatabase admin

اتصال به MongoDB در Celery به عنوان backend

اول از همه مطمین باشید پکیج pymongo نصب باشد.

برای اتصال به mongodbبرای backend هم به صورت زیر پیش روید:

app = Celery('tasks', backend='mongodb://sadegh-khan:password@192.168.100.31:27017/?authSource=admin',
broker='redis://192.168.100.31:6379')

مراجع :

مراجع: