روش تنظیم storage دیجیتال اوشن روی django
یکی از محصولات محبوب digital ocean به دلیل قیمت بسیار مناسب آن و استفادهی ساده از آن محصول storage دیجیتال اوشن است. در این نوشته به روش تنظیم storage دیجیتال اوشن بر روی فریمورک جنگو میپردازیم.
روش تنظیم storage دیجیتال اوشن روی django
برای اینکار ابتدا باید پکیجهای django-storages و boto3 را بر روی پروژهی خود نصب کنید. برای نصب پکیجهای django-storages و boto3 روی پروژه از دو دستور زیر استفاده کنید:
pip install django-storages
pip install boto3
ممکن است نصب پکیجهای بالا بر روی سیستم شما با توجه به سرعت اینترنت کمی به طول بینجامد ولی بعد از نصب آنها این دو پکیج را در فایل requirements.txt پروژه خود قرار دهید.
پیشنهاد نویسنده: در نوشتههای قبلی در مورد ساخت خودکار فایل requirements.txt صحبت کردهایم.
البته پیش فرض این نوشته این است که شما یک پروژهی انجام شده دارید و قصد نصب آن روی دیجیتال اوشن را دارید پس قطعا پکیجهای Django و gunicorn را نیز نصب دارید. بعد از نصب تمام موارد بالا به فایل settings.py بروید و در بخش INSTALLED_APPS مقدار storages را نیز قرار دهید. سپس کدهای زیر را نیز در فایل settings.py قرار دهید:
AWS_ACCESS_KEY_ID = 'key_id'
AWS_SECRET_ACCESS_KEY = 'access_key'
AWS_STORAGE_BUCKET_NAME = 'bucket_name'
AWS_DEFAULT_ACL = 'public-read'
AWS_S3_ENDPOINT_URL = 'https://nyc3.digitaloceanspaces.com'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400'
}
AWS_S3_REGION_NAME = "nyc3"
AWS_STATIC_LOCATION = 'static/'
STATIC_URL = '%s/%s' % (AWS_S3_ENDPOINT_URL, AWS_STATIC_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
پیش فرض ما در این نوشته این است که شما دانش خوبی برای کار با جنگو دارید، پس احتمالا باید بدانید فایل settings.py در مسیر app اصلی شما قرار دارد. خب حالا مقادیر بالا را باید از کجا پیدا کنید؟ برای اینکار به digital ocean بروید و در منوی بالایی آن روی دکمهی create بزنید سپس گزینهی spaces را بزنید.

با پر کردن موارد بالا میتوانید یک spaces بسازید بعد از ساخت آن به لیست spacesها میروید و در آنجا مقدار AWS_SECRET_ACCESS_KEY قرار دارد. مقدار AWS_STORAGE_BUCKET_NAME را نیز در هنگام ساخت spaces انتخاب میکنید. مقدار AWS_S3_ENDPOINT_URL آدرس کلاستر space شما است؛ اگر cdn را فعال کنید، میتوانید از مقداری که با cdn است استفاده کنید. در متغیر AWS_S3_REGION_NAME نیز نام سرور خود را وارد کنید. مقدار AWS_ACCESS_KEY_ID را در بخش API اکانت خود و spaces key بدست آورید. شاید وقتی متن بالا را خواندید با خود گفتید که ما در حال تنظیم کردن این قابلیت روی دیجیتال اوشن هستیم پس چرا موارد بالا پیشوند AWS دارد؟ با توجه به مستندات djngo storage که در این لینک موجود است از این آموزش میتوانید برای apache libcloud و azure storage و digital ocean و backblaze B2 و DropBox و Google cloud storage و … استفاده کرد. حالا در مسیری که فایل settings.py قرار گرفته است فایل جدیدی با نام storage_backends.py ایجاد کنید و کد زیر را درون آن قرار دهید:
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = 'static'
default_acl = 'public-read'
class MediaStorage(S3Boto3Storage):
bucket_name = 'media'
location = ''
در فایل بالا در صورتی که میخواهید مسیر فولدر static و media را تغییر دهید آن را تغییر دهید. سپس به فایل settings.py برگردید و مقادیر زیر را نیز وارد کنید:
AWS_MEDIA_LOCATION = 'media/' PUBLIC_MEDIA_LOCATION = 'media' MEDIA_URL = '%s%s' % (AWS_S3_ENDPOINT_URL, AWS_MEDIA_LOCATION) DEFAULT_FILE_STORAGE = 'django_project.storage_backends.MediaStorage'
در کد بالا مقدار django_project را برابر نام app اصلی خود قرار دهید. بعد از موارد بالا در صورتی که کارهای بالا را درست انجام دهید با دستور python manage.py collectstatic باید دادههای شما به storage شما منتقل شود.
اگر با هر بخش از نوشتهی بالا مشکلی داشتید در بخش نظرات همین نوشته برای ما بنویسید.


















این تنظیمات روی محیط dev هم لازمه یا فقط production؟
این تنظیمات معمولاً فقط برای محیط production لازم است تا فایلهای استاتیک و مدیا به صورت بهینه در DigitalOcean ذخیره شوند. در محیط توسعه (dev) میتوانید از تنظیمات پیشفرض Django استفاده کنید.
اگر CDN فعال کنیم، باید AWS_S3_ENDPOINT_URL رو تغییر بدیم؟
سلام. بله، اگر CDN را فعال کنید، باید از آدرس CDN که در DigitalOcean ارائه میشود به جای AWS_S3_ENDPOINT_URL استفاده کنید.
استفاده از public-read روی همه فایلها لازمه؟
سلام، استفاده از public-read برای فایلهای استاتیک معمولاً ضروری است تا مرورگرها بتوانند آنها را بارگذاری کنند. برای فایلهای مدیا، بسته به نیاز امنیتی پروژه، ممکن است لازم باشد این تنظیمات را تغییر دهید.
اگه بخوایم static و media رو تو پوشههای جدا قرار بدیم، باید کلاسهای storage رو تغییر بدیم؟
سلام، بله، اگر بخواهید فایلهای static و media را در پوشههای جداگانه قرار دهید، باید مقادیر ر را در کلاسهای StaticStorage و MediaStorage در فایل storage_backends.py تغییر دهید.
این روش فقط برای DigitalOcean Spaces کار میکنه یا روی AWS S3 هم مشابه هست؟
سلام، این روش به دلیل استفاده از پکیج django-storages و پیکربندی مشابه، روی AWS S3 نیز به همین شکل قابل پیادهسازی است.