ما توی تیم موازی یه تصمیم مهم گرفتیم: وقتی قراره پروژهای رو به مشتری تحویل بدیم، نباید همهی کدها به صورت خام و قابلخواندن باشن. چرا؟ چون اینطوری هر کسی راحت میتونه کل منطق و ساختار پروژه رو بفهمه و کپی کنه. واسه همین، اومدیم و یه راه حل حرفهای پیدا کردیم: استفاده از ترکیب Cython و Docker.
اصلاً Cython چیه و به چه دردی میخوره؟
Cython یه ابزار برنامهنویسیه که میتونه کدهای پایتون رو به زبان C تبدیل کنه. خروجی این کار میشه فایلهایی با پسوند .so
که مثل یه جعبه قفلشدهان؛ یعنی کاربر نمیتونه راحت داخلش رو ببینه یا کپیش کنه. این فایلها هم سریعتر اجرا میشن، هم امنترن.
چطور این کارو داخل Docker انجام دادیم؟
ما این فرایند رو توی سه مرحله ساده اجرا کردیم:
۱. نصب ابزارهای لازم
برای اینکه بتونیم کدها رو کامپایل کنیم، اول باید ابزارهایی مثل gcc
(کامپایلر C)، Cython
و کتابخونههای مربوط به پایتون رو نصب کنیم.
RUN apt-get update && apt-get install -y gcc python3-dev musl-dev && rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir Cython
۲. تبدیل فایلهای پایتون به فایل قفلشده
تو این مرحله، همه فایلهای مهم پایتون (به جز بعضی فایلهای استثنا) رو تبدیل میکنیم به نسخههای کامپایلشده که همون فایلهای .so
هستن.
RUN find . -name "*.py" ! -name "__init__.py" \
! -wholename "./settings.py" \
! -wholename "./manage.py" \
! -path "/migrations/*" \
-print0 | xargs -0 -I {} sh -c 'python3 -m Cython.Build.Cythonize -i "{}"'
۳. حذف نسخهی قابلخواندن فایلها
وقتی نسخهی قفلشده (کامپایلشده) ساخته شد، فایلهای اصلی .py
رو حذف میکنیم تا کسی نتونه راحت به کد اصلی دسترسی پیدا کنه.
RUN find . -name "*.py" ! -name "__init__.py" \
! -wholename "/settings.py" \
! -wholename "./manage.py" \
-exec sh -c 'FILE="{}"; if [ -f "${FILE%.py}.cpython-311-x86_64-linux-gnu.so" ]; then rm "$FILE"; fi' \;
نکته مهم
- ما همیشه بعضی فایلهای حساس مثل
manage.py
یا فایل تنظیمات رو نگه میداریم چون لازمشون داریم برای اجرای پروژه. - با این روش حتی اگه کسی فایلهای پروژه رو هم داشته باشه، نمیتونه راحت کدها رو ببینه و تغییر بده.
جمعبندی
اگه دنبال یه راه ساده و حرفهای هستی تا کدهای پایتونت رو برای مشتری یا دنیای بیرون قفل کنی، این روش کاملاً به دردت میخوره. با کمک Docker و Cython هم امنیت پروژه میره بالا، هم از لو رفتن منطق اصلی نرمافزارت جلوگیری میکنی.
نظرت چیه؟ برام کامنت بذار تا با هم بهترش کنیم 💬