গাইড

Python — Django, FastAPI ও Flask

Meghly-তে Django, FastAPI বা Flask অ্যাপ্লিকেশন চালানোর নিয়ম — রান কমান্ড, Celery ওয়ার্কার, ডেটাবেস মাইগ্রেশন এবং স্ট্যাটিক ও মিডিয়া ফাইল ব্যবস্থাপনা।

সমর্থিত ভার্সন ও প্যাকেজ ম্যানেজার

  • Python 3.14, 3.13 এবং 3.12।
  • ডিপেনডেন্সি ফাইল: requirements.txt, pyproject.toml (uv বা Poetry) অথবা Pipfile — আপনার প্রজেক্টে যে ফাইলটি থাকবে, সংশ্লিষ্ট টুল দিয়েই প্যাকেজগুলো ইনস্টল করা হবে।
  • পাইথনের ভার্সন নির্ধারণ করা হয় .python-version ফাইল থেকে; সেটি না থাকলে pyproject.toml-এর requires-python ফিল্ড অনুসরণ করা হয়।
.python-version
3.13

কোন ফ্রেমওয়ার্কে কী কমান্ড চলে

ফ্রেমওয়ার্কমূল Web প্রসেস কমান্ডঅতিরিক্ত যা স্বয়ংক্রিয়ভাবে সম্পন্ন হয়
Djangogunicorn <project>.wsgi --workers 2বিল্ডের সময় collectstatic এবং রিলিজ ধাপে migrate চলে
Django + Channelsuvicorn <project>.asgi:applicationসরাসরি WebSocket সাপোর্ট করে
FastAPIuvicorn <module> --proxy-headers—
Flaskgunicorn <module> --workers 2—

সব ক্ষেত্রেই পোর্ট 8080 এবং হোস্ট অ্যাড্রেস 0.0.0.0 স্বয়ংক্রিয়ভাবে সেট করে দেওয়া হয়। তবে আপনার প্রজেক্টের ডিপেনডেন্সিতে প্রোডাকশন সার্ভার প্যাকেজটি অবশ্যই যুক্ত থাকতে হবে: Django ও Flask-এর জন্য gunicorn, এবং FastAPI-এর জন্য uvicorn।

requirements.txt
django>=5.2
gunicorn
psycopg[binary]
whitenoise

আপনার প্রজেক্ট যদি ওপরের কোনো ফ্রেমওয়ার্কের না হয়, তবে অ্যাপের Processes পেজে গিয়ে নিজস্ব স্টার্ট কমান্ড সেট করে দিন এবং নিশ্চিত করুন যেন অ্যাপটি PORT এনভায়রনমেন্ট ভেরিয়েবলে রান করে।

Django কনফিগারেশন

১. প্রোডাকশন সেটিংস (settings.py)

অ্যাপটি যেহেতু Meghly-র HTTPS রাউটারের মাধ্যমে চলে, তাই settings.py ফাইলে নিচের কনফিগারেশনগুলো রাখুন:

settings.py
import os

SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
DEBUG = os.environ.get("DJANGO_DEBUG") == "1"
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "").split(",")
CSRF_TRUSTED_ORIGINS = [f"https://{h}" for h in ALLOWED_HOSTS if h]
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

এরপর প্যানেলের Environment সেকশনে গিয়ে DJANGO_SECRET_KEY (secret হিসেবে) এবং DJANGO_ALLOWED_HOSTS ভেরিয়েবল সেট করুন (একাধিক ডোমেইন থাকলে কমা দিয়ে লিখুন)।

২. ডেটাবেস সংযোগ

অ্যাপে ডেটাবেস যুক্ত করলে স্বয়ংক্রিয়ভাবে DATABASE_URL ভেরিয়েবল পাওয়া যায়, যা dj-database-url প্যাকেজের মাধ্যমে খুব সহজেই পড়া যায়:

settings.py
import dj_database_url

DATABASES = {"default": dj_database_url.config(conn_max_age=600)}

প্রতিটি ডিপ্লয়ের আগে রিলিজ ধাপে migration login ব্যবহার করে স্বয়ংক্রিয়ভাবে python manage.py migrate --noinput কমান্ড রান হয়।

৩. স্ট্যাটিক ও মিডিয়া ফাইল

  • স্ট্যাটিক ফাইল (CSS, JS): বিল্ডের সময় স্বয়ংক্রিয়ভাবে collectstatic রান হয়। স্ট্যাটিক ফাইলগুলো প্রোডাকশনে সার্ভ করার জন্য WhiteNoise ব্যবহার করুন — এজন্য MIDDLEWARE তালিকায় SecurityMiddleware-এর ঠিক পরের লাইনেই whitenoise.middleware.WhiteNoiseMiddleware যুক্ত করুন।
  • মিডিয়া ফাইল (ইউজার আপলোড): settings.py-এ MEDIA_ROOT = "/app/media" সেট করুন। Meghly এই ফোল্ডারটিকে স্থায়ী স্টোরেজে সংরক্ষণ করে, ফলে নতুন ডিপ্লয়ের পরেও ফাইলগুলো মুছে যায় না।

৪. Celery ও ব্যাকগ্রাউন্ড টাস্ক

প্রজেক্টের ডিপেনডেন্সিতে celery যুক্ত থাকলে Meghly স্বয়ংক্রিয়ভাবে একটি worker প্রসেস যোগ করে: celery -A <project> worker (FastAPI বা Flask প্রজেক্টের ক্ষেত্রেও এটি কাজ করে—সেক্ষেত্রে যে মডিউলে Celery() অবজেক্ট রয়েছে সেটি ব্যবহৃত হয়)। এছাড়া django-celery-beat থাকলে আলাদা একটি beat প্রসেসও তৈরি হয়। ব্রোকার হিসেবে অ্যাপে Redis বা RabbitMQ যুক্ত করে settings.py-এ নিচের লাইনটি দিন:

settings.py
CELERY_BROKER_URL = os.environ.get("REDIS_URL") or os.environ.get("RABBITMQ_URL")

FastAPI কনফিগারেশন

Meghly আপনার কোড স্ক্যান করে FastAPI() অবজেক্টটি খুঁজে নেয় এবং সেই অনুযায়ী uvicorn main:app-এর মতো রান কমান্ড তৈরি করে। যদি অটো-ডিটেকশনে ফাইলটি খুঁজে না পাওয়া যায়, তবে Processes পেজে গিয়ে কমান্ডটি নিজে নির্দিষ্ট করে দিন:

text
uvicorn app.main:app --host 0.0.0.0 --port 8080 --proxy-headers

প্রজেক্টে Alembic কনফিগার করা থাকলে প্রতি ডিপ্লয়ের আগে স্বয়ংক্রিয়ভাবে alembic upgrade head রান হয়।

Flask কনফিগারেশন

Flask অ্যাপ্লিকেশন gunicorn-এর মাধ্যমে রান হয়। Meghly কোড থেকে Flask() অবজেক্টটি খুঁজে নেয়; খুঁজে না পেলে ডিফল্ট হিসেবে app:app (app.py ফাইলের app অবজেক্ট) ধরে নেয়। আপনি যদি অ্যাপ ফ্যাক্টরি (app factory) বা ভিন্ন কোনো ফাইলের নাম ব্যবহার করেন, তবে Processes পেজ থেকে কমান্ডটি পরিবর্তন করে দিন (যেমন gunicorn "myapp:create_app()" --bind 0.0.0.0:8080)।

সচরাচর সমস্যা ও সমাধান

যে সমস্যা বা এরর দেখছেনকারণ ও সমাধান
Detect: "Add gunicorn to your requirements"আপনার requirements.txt ফাইলে gunicorn যুক্ত করুন (FastAPI হলে uvicorn)।
DisallowedHost এররপ্যানেলের Environment-এ DJANGO_ALLOWED_HOSTS ভেরিয়েবলে অ্যাপের ইউআরএল ও আপনার কাস্টম ডোমেইন যুক্ত করুন।
ফর্ম সাবমিট করলে CSRF verification failed দেখায়ওপরে দেখানো নিয়ম অনুযায়ী settings.py-এ CSRF_TRUSTED_ORIGINS এবং SECURE_PROXY_SSL_HEADER যুক্ত করুন।
সাইটে কোনো CSS বা স্টাইল লোড হচ্ছে নাপ্রজেক্টে whitenoise প্যাকেজ ও মিডলওয়্যার যুক্ত করুন।
নতুন ডিপ্লয়ের পর আপলোড করা মিডিয়া ফাইল হারিয়ে যাচ্ছেsettings.py-এ MEDIA_ROOT = "/app/media" ব্যবহার করুন।

আটকে গেছেন?

আমাদের ইঞ্জিনিয়ারদের সাথে সরাসরি কথা বলুন — ফোন বা ইমেইলে, বাংলায়।

01782618248shohag.meghly@gmail.com