ক্লাউডিনারি — ক্লাউডে ইমেজ ফাইল সার্ভ করা

image from fedtechmegazine

সাধারণত আমরা যেসব ওয়েব এপ তৈরী করি, তাতে বিভিন্ন স্ট্যাটিক ফাইল, বিশেষ করে ইমেজগুলো একই সার্ভার থেকে সার্ভ করা হয়। কিন্তু প্রডাকশনে একই সার্ভার থেকে ওয়েব এপ এবং ইমেজ-স্ট্যাটিক ফাইল সার্ভ করা হয় না পারফর্ম্যান্স এর কথা বিবেচনা করে। এসব ফাইলগুলো ভিন্ন সার্ভার থেকে সার্ভ করা হয়। এজন্যে বর্তমানে বিভিন্ন কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) রয়েছে, যেগুলোর কাজ থাকে কোনো ওয়েবসাইটের শুধুমাত্র স্ট্যাটিক ফাইলগুলো সার্ভ করা। উল্লেখযোগ্য হচ্ছে AWS S3 bucket, Google Cloud Platform ইত্যাদি। বড় বড় প্রায় সকল সাইটগুলো এভাবে স্ট্যাটিক ফাইল সার্ভ করে। এছাড়াও কিছু কিছু IaaS,যেমন হেরোকুতে ডাইনামিক ইমেজ ফাইলগুলো মূল সার্ভার থেকে সার্ভ করা হয় না। প্রতিবার ডাইনো রিস্টার্ট হলেই আগের সব ফাইল হারিয়ে যায়। এই সমস্যা সমাধানের জন্য প্রয়োজন কোনো CDN ব্যবহার করে ইমেজ সার্ভ করা।

কিন্তু আমরা গরীব, ক্রেডিট কার্ডের ঝামেলাও নিতে পারি না, তাহলে আমাদের ইমেজফাইলগুলোর কী হবে?

এই প্রশ্ন থেকে S3 Bucket এর একটা ভালো কিন্তু ফ্রি বিকল্প খুঁজছিলাম অনেকদিন ধরে, যাতে কোনো ক্রেডিট কার্ডের ঝামেলা ছাড়াই নিজেদের পোর্টফোলিও বা পেট প্রোজেক্টগুলো ডেপ্লয় করা যায়।

Cloudinary

ক্লাউডিনারি একটি Saas তথা সফটওয়্যার এজ আ সার্ভিস(Software as a Service) যা ক্লাউডভিত্তিক ইমেজ এবং ভিডিও ম্যানেজমেন্টের সেবা প্রদান করে। চমৎকার এই সার্ভিসটি আমাদের প্রজেক্টে যুক্ত করে খুব সহজেই ক্লাউডে ইমেজ ফাইল সার্ভ করার কাজটি করে ফেলতে পারি। আর হ্যা, এটি অবশ্যই ফ্রি,এবং ক্রেডিট কার্ড ভেরিফাই করার ঝামেলাও নেই।

আর দেরি না করে ঝাপিয়ে পরা যাক এর কার্যকারিতা দেখার জন্যে।

চলুন হাতে কাদা লাগানো যাক।

ক্লাউডিনারি সেট-আপ

প্রথমেই এই লিংকে গিয়ে ফ্রিতে একাউন্ট খুলে নিন।

ক্লাউডের নাম এবং বাকি সব তথ্য দিয়ে একাউন্ট খুললে নিচের মতো ড্যাশবোর্ড আসবে।

Account Details এর নিচে থাকা Cloud name, API Key এবং API Secret এর তথ্যগুলোতে নজর বুলিয়ে নিন। এই ক্লাউডের সাথে আমাদের প্রজেক্ট কনফিগার করার সময় এই ক্রেডেনশিয়ালগুলো লাগবে।

প্রজেক্ট সেট-আপ

ডেমো দেখানোর জন্যে আমরা জ্যাংগোর সাথে ক্লাউডিনারি যুক্ত করে দেখাবো কীভাবে ইউজারের আপলোড করা ইমেজ ফাইলগুলো ক্লাউডিনারিতে আপলোড করতে হয়।

(আর্টিকেলে দেখানো জ্যাংগো প্রজেক্ট কোড পাওয়া যাবে এখানে)

প্রথমেই জ্যাংগোর একটি প্রজেক্ট তৈরি করে ফেলি

django-admin startproject cloudinary

এবার প্রজেক্টের ফোল্ডারে গিয়ে একটি এপ তৈরী করি।

django-admin startapp user

সেটিংসে গিয়ে INSTALLED_APP এ user এপটি যোগ করি।

INSTALLED_APPS = [                           
'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages',
'django.contrib.staticfiles',

# my app
'user',

]

user এপ এর models.py তে গিয়ে নিচের মতো সহজ একটি Profile মডেল তৈরি করি

#user/models.py
from django.db import models
class Profile(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField(max_length=256)
profile_image = models.ImageField(upload_to='images/', blank=True)
def __str__(self):
return self.name

মডেলটি এডমিন প্যানেলে রেজিস্টার করতে ভুলবেন না।

# user/admin.py
from django.contrib import admin
from .models import Profile

admin.site.register(Profile)

এবার ডাটাবেজটি মাইগ্রেট করি।

python manage.py makemigrationspython manage.py migrate

আমাদের মডেলটি সহ সব ডিফল্ট মডেল ডাটাবেজে যুক্ত হয়েছে। এখন সুপারইউজার তৈরি করে আপনার এডমিন প্যানেলে লগ ইন করলে Profile মডেলটি দেখতে পাবেন।

এবার পালা ক্লাউডিনারিকে প্রজেক্টে ইন্টিগ্রেট করার।

প্রজেক্টে ক্লাউডিনারি ইন্টিগ্রেট

প্রথমে জ্যাংগোর জন্য ক্লাউডিনারির লাইব্রেরি django-cloudinary-storage ইন্সটল করে নেই। এছাড়া আমরা যেহেতু ইমেজ নিয়ে কাজ করবো তাই Pillow ও ইন্সটল করতে হবে।

pip install django-cloudinary-storagepip install Pillow

এবার cloudinary_storage নামের এপ আমাদের INSTALLED_APP এ যোগ করি। এই এপটি অবশ্যই django.contrib.staticfiles এর আগে রাখতে হবে।

INSTALLED_APPS = [                           
'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages',

'cloudinary_storage', # installed 'django.contrib.staticfiles',

# my app
'user',
]

এবার settings.py তে গিয়ে নিচের কনফিগারেশনগুলো যোগ করে দেই।

MEDIA_URL = '/public/'
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
# Cloudinary Configuration
CLOUDINARY_STORAGE = {
'CLOUD_NAME': your_cloudinary_cloud_name,
'API_KEY': your_cloud_api_key,
'API_SECRET': your_cloud_api_secret
}

মনে আছে তো আপনার ক্লাউডিনারির ড্যাশবোর্ডে থাকা Cloud name, API Key এবং API Secret এর কথা? মুখস্থ থাকার কথা বলছিনা, তবে কোথায় এগুলো পাবেন সেটা মনে থাকলেই হবে। বাকিটার জন্য রয়েছে প্রিয় বন্ধু কপি-পেস্ট 😺

ব্যস। আমাদের কাজ শেষ।

এবার সার্ভার রান করে এডমিন প্যানেলে গিয়ে প্রোফাইল মডেলে ছবি আপলোড করি।

এখানে প্রোফাইল ইমেজের পাশে currently দিয়ে যে ফাইলনেমটি আছে, সেখানে মাউস রাখলে ব্রাউজারের একদম নিচে বাম দিকে আমরা দেখতে পারছি, ফাইলটির আসল লোকেশন আসলে cloudinary তে আছে। অর্থাৎ ইমেজটি ক্লাউডিনারিতে আপলোড হয়েছে।

এখন আপনার ক্লাউডিনারির ড্যাশবোর্ডে গিয়ে দেখুন public ফোল্ডারের ভেতরে আপনার ছবিটি আপলোড হয়ে গেছে।

এবার প্রজেক্টটি ডেপ্লয় করার পর কোনো ছবি আপলোড করলে তা ক্লাউডিনারিতে আপলোড হবে এবং সেখান থেকেই সার্ভ হবে। ফলে হেরোকুর ডাইনো রিস্টার্ট হলে যেমন ফাইলগুলো হারিয়ে যাবে না, তেমনি আলাদা জায়গা থেকে ইমেজগুলো সার্ভ করার মাধ্যমে এপ্লিকেশনের পারফর্ম্যান্সও বাড়বে।

আমি আশা করি এই সার্ভিসটি আমার অনেক কাজে আসবে। আপনাদেরও কাজে আসলে লেখাটি সার্থক।

ধন্যবাদ। হ্যাপি কোডিং।

--

--