
انتقال پروژه پایتون به هاست بدون خطا؛ چکلیست venv، requirements و دیتابیس
برای انتقال پروژه پایتون به هاست، این چکلیست venv، requirements، متغیرهای محیطی، دیتابیس، static، media، تست و rollback را اجرا کنید.
برای انتقال پروژه پایتون به هاست، پوشه پروژه و virtualenv را یکجا کپی نکنید. روش مطمئن این است که ابتدا از کد، وابستگیها، متغیرهای محیطی، دیتابیس، فایلهای کاربر و کارهای زمانبندیشده موجودی بگیرید؛ سپس در هاست مقصد نسخه سازگار Python را انتخاب کنید، یک محیط مجازی تازه بسازید، وابستگیها را از requirements یا lockfile نصب کنید، اسرار را جداگانه وارد کنید، دیتابیس و media را بازیابی کنید و پیش از تغییر DNS یک آزمون کامل انجام دهید. این ترتیب، خطاهای رایج مسیرهای مطلق، wheel ناسازگار، تنظیمات توسعه و جاافتادن داده را کاهش میدهد.
این مقاله برای پروژهای است که روی لپتاپ، سرور قبلی یا هاست دیگری کار میکند و باید بدون غافلگیری به محیط جدید منتقل شود. اگر هنوز میان Django، Flask، FastAPI یا اسکریپت دائمی مردد هستید، ابتدا راهنمای انتخاب هاست پایتون برای Django و Flask را بخوانید. اینجا درباره انتخاب فریمورک بحث نمیکنیم؛ تمرکز روی مهاجرت تکرارپذیر، تستپذیر و قابل بازگشت است.
فهرست مطالب
- نقشه انتقال پروژه پایتون
- موجودیگیری از پروژه و محیط مبدأ
- بازسازی venv و نصب requirements
- انتقال متغیرهای محیطی و تنظیمات production
- مهاجرت دیتابیس، static و media
- نکات Django، Flask و FastAPI
- تست، تغییر ترافیک و rollback
- رفع خطاهای رایج انتقال
- چکلیست انتخاب هاست پایتون
- پرسشهای متداول
نقشه درست انتقال پروژه پایتون به هاست
مهاجرت را بهعنوان «کپی فایل» تعریف نکنید؛ پروژه زنده از چند لایه تشکیل شده است. کد فقط یکی از آنهاست. interpreter و کتابخانهها، تنظیمات محرمانه، schema و داده دیتابیس، فایلهای بارگذاریشده، سرویس اجرا، jobهای دورهای، دامنه، SSL و مسیر لاگ نیز باید به وضعیت معادل در مقصد برسند. اگر هر لایه مالک، ورودی و معیار صحت نداشته باشد، ممکن است صفحه اصلی باز شود اما ورود کاربر، آپلود، ایمیل، صف یا پنل مدیریت خراب بماند.
| لایه | آنچه باید منتقل یا بازسازی شود | معیار تأیید |
|---|---|---|
| کد | نسخه مشخص از مخزن یا بسته انتشار | commit یا release در مقصد با مبدأ یکسان است |
| Python و وابستگیها | نسخه interpreter، requirements یا lockfile | نصب کامل و importهای اصلی موفقاند |
| پیکربندی | متغیرهای محیطی و تنظیمات production | هیچ secret در مخزن نیست و مقدارهای ضروری حاضرند |
| دیتابیس | schema، داده، کاربر و encoding | migration و چند شمارش کلیدی صحیح است |
| فایلها | static ساختهشده و media کاربر | URLها، مجوز و نمونه دانلود/آپلود سالم است |
| اجرا | WSGI/ASGI، worker، cron یا scheduler | restart و health check موفق است |
| شبکه | دامنه، DNS، HTTPS و proxy | درخواست واقعی از دامنه نهایی پاسخ درست میگیرد |
چهار فاز که ریسک را کنترل میکند
- کشف: از همه اجزای پروژه، نسخهها، وابستگیهای خارجی و دادهها موجودی بگیرید.
- ساخت مقصد: کد، venv، تنظیمات، دیتابیس و سرویس اجرا را بدون دستزدن به مبدأ آماده کنید.
- اعتبارسنجی: با دامنه یا URL آزمایشی، smoke test و آزمون مسیرهای حساس را اجرا کنید.
- Cutover: تغییر نهایی را در پنجره کنترلشده انجام دهید و تا پایان دوره مراقبت، مبدأ را برای rollback نگه دارید.
مهاجرت موفق یعنی بتوانید محیط مقصد را از روی اسناد و فایلهای نسخهگذاریشده دوباره بسازید؛ نه اینکه فقط یکبار با مجموعهای از فرمانهای فراموششدنی آن را بالا بیاورید.
پیش از شروع، موفقیت را تعریف کنید
«سایت باز شد» معیار کافی نیست. مسیرهای حیاتی کسبوکار را فهرست کنید: ورود، ثبتنام، ارسال فرم، پرداخت آزمایشی، آپلود، پنل مدیریت، ارسال ایمیل، API، webhook، job دورهای و تولید گزارش. برای هر مسیر، داده ورودی، نتیجه مورد انتظار و محل مشاهده خطا را بنویسید. سپس معیار بازگشت تعیین کنید؛ برای مثال اگر نرخ خطا پس از تغییر DNS از آستانه مشخص پروژه بالاتر رفت یا migration ناسازگار بود، ترافیک به محیط قبلی برگردد.
موجودیگیری پیش از انتقال؛ مهمترین مرحلهای که حذف میشود
پیش از ایجاد حساب مقصد، یک snapshot منطقی از پروژه تهیه کنید. نسخه Python، سیستمعامل، معماری پردازنده، فریمورک، فهرست packageها، سرویس دیتابیس، متغیرهای محیطی، مسیر media، دستور startup، workerها، cronها و dependencyهای سیستمی را ثبت کنید. هدف کپیکردن تمام جزئیات مبدأ نیست؛ هدف فهمیدن چیزهایی است که رفتار برنامه به آنها وابسته است. ممکن است یک کتابخانه Python به ابزار سیستمعاملی، header کامپایل یا shared library نیاز داشته باشد که در requirements دیده نمیشود.
کد را از یک نسخه مشخص منتقل کنید
بهترین ورودی برای انتشار، یک commit یا release مشخص است. کپی دستی پوشه توسعه ممکن است فایلهای آزمایشی، cache، دیتابیس محلی، secret، virtualenv و تغییرات ثبتنشده را همراه ببرد. مخزن را پاکسازی کنید، .gitignore را بازبینی و نسخهای را که تست شده برچسبگذاری کنید. اگر مخزن در دسترس نیست، آرشیوی بسازید که فقط کد و فایلهای لازم را داشته باشد و hash آن را ثبت کنید. در مقصد نیز همان نسخه را استخراج کنید تا اختلاف کد از اختلاف محیط جدا بماند.
- پوشههای
__pycache__، فایلهای.pycو cache ابزارها را منتقل نکنید. - پوشه
.venvیاvenvرا جزو artifact انتشار نگذارید. - فایل
.envواقعی، کلید خصوصی و credential را داخل آرشیو عمومی قرار ندهید. - فایلهای media کاربر و dump دیتابیس را از کد جدا نگه دارید.
- نسخه release، زمان تهیه و checksum آرشیو را ثبت کنید.
نسخه Python فقط عدد اصلی نیست
نسخه major و minor را دقیق ثبت کنید؛ تفاوت میان نسخهها میتواند روی syntax، dependency و availability بستهها اثر بگذارد. اگر پروژه از package باینری استفاده میکند، معماری و wheelهای قابل نصب را نیز بررسی کنید. اجرای موفق روی Python لپتاپ الزاماً به معنای نصب موفق روی محیط Linux مقصد نیست. پیش از انتقال نهایی، در مقصد یک محیط آزمایشی بسازید و نصب وابستگیها را بدون cache امتحان کنید تا وابستگی پنهان آشکار شود.
وابستگیهای بیرونی را فراموش نکنید
| وابستگی | اطلاعات لازم | آزمون مقصد |
|---|---|---|
| دیتابیس | نوع، نسخه، encoding، user و شبکه | اتصال و یک query خواندن/نوشتن |
| ایمیل | SMTP، sender، TLS و محدودیتها | ارسال به صندوق آزمایشی و ثبت نتیجه |
| ذخیرهسازی | مسیر محلی یا object storage | آپلود، دریافت و حذف فایل آزمایشی |
| API ثالث | URL، token، IP allowlist و timeout | درخواست کمخطر از IP مقصد |
| Queue/Cache | آدرس، namespace و سیاست expiry | قرار دادن و دریافت job یا key آزمایشی |
| Webhook | URL عمومی، HTTPS و secret | تحویل رخداد کنترلشده به مقصد |

چرا venv را باید در هاست مقصد بازسازی کرد؟
مستندات رسمی Python محیط مجازی را disposable و غیرقابلانتقال میداند: مسیر interpreter در scriptهای محیط ثبت میشود و محیط باید در محل هدف دوباره ساخته شود. کپی پوشه venv میتواند به shebang قدیمی، مسیر مطلق مبدأ، باینری ناسازگار یا packageهایی منجر شود که برای سیستم دیگری نصب شدهاند. بنابراین venv مبدأ یک منبع قابل حمل نیست؛ فایل وابستگی و روش ساخت، منبع بازسازی است.
ساخت محیط تازه با interpreter درست
python3 --version
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
نام فرمان Python در هر محیط میتواند متفاوت باشد؛ از مسیری استفاده کنید که کنترلپنل یا صفحه محصول برای نسخه انتخابشده معرفی میکند. پس از فعالسازی، با which python و python -c مطمئن شوید interpreter داخل venv اجرا میشود. نصب را با همان کاربری انجام دهید که برنامه را اجرا میکند تا permission و محل packageها قابل پیشبینی بماند.
requirements.txt، lockfile یا pyproject؟
Requirements file مجموعه آرگومانهای نصب pip است و میتواند نسخهها را برای بازسازی یک محیط pin کند. pyproject.toml وابستگیهای پروژه و metadata آن را توصیف میکند، در حالی که ابزارهایی مانند pip-tools، Poetry یا Pipenv میتوانند lockfile تولید کنند. اصل مهم، داشتن ورودی تکرارپذیر است. خروجی تصادفی pip freeze از محیطی آلوده به ابزارهای توسعه ممکن است packageهای غیرضروری را قفل کند؛ بهتر است وابستگی مستقیم، وابستگی توسعه و مجموعه production را آگاهانه تفکیک کنید.
استراتژی وابستگی برای مهاجرت قابل تکرار
- محدوده نسخه Python را در اسناد پروژه صریح کنید.
- وابستگیهای production را از test و lint جدا کنید.
- نسخههای حساس را pin یا با lockfile تثبیت کنید.
- منبع package خصوصی و credential آن را بیرون مخزن نگه دارید.
- نصب را در محیط تمیز و بدون packageهای global آزمایش کنید.
- پس از نصب، خروجی نسخه packageهای کلیدی را برای گزارش انتشار ذخیره کنید.
وقتی pip در مقصد خطا میدهد چه کنیم؟
اولین خطای واقعی را بخوانید، نه آخرین عبارت عمومی failed building wheel. ممکن است package برای نسخه Python مقصد wheel نداشته باشد و به compiler یا header سیستمی نیاز پیدا کند؛ ممکن است نام package تغییر کرده یا نسخه pinشده با interpreter جدید ناسازگار باشد. راهحل امن، تطبیق نسخهها و بررسی مستندات همان package است. حذف نسخه pinشده یا اجرای نصب با دسترسی گسترده بدون فهم علت، محیطی غیرقابل تکرار میسازد.
وابستگیهای باینری و تفاوت محیطها
packageهای پردازش تصویر، رمزنگاری، داده و اتصال دیتابیس ممکن است کد بومی داشته باشند. اگر wheel مناسب معماری و نسخه Python منتشر نشده باشد، pip سراغ build از source میرود. در هاست اشتراکی دسترسی نصب package سیستمعاملی ممکن است محدود باشد؛ بنابراین پیش از خرید یا cutover، نام و نسخه این وابستگیها را با امکانات جاری سرویس تطبیق دهید. اگر پروژه به library سطح سیستم یا daemon اختصاصی نیاز دارد، سرور مجازی یا محیط مدیریتشده دیگری ممکن است مناسبتر باشد.
آزمون نهایی بازسازی محیط
برای اطمینان، venv آزمایشی را حذف و فقط با راهنمای پروژه و فایلهای وابستگی دوباره بسازید. اگر برای موفقیت به فرمانی نیاز داشتید که در سند نیست، همان لحظه آن را ثبت کنید. این تمرین کوچک نشان میدهد در خرابی یا مهاجرت بعدی واقعاً میتوانید محیط را بازیابی کنید.

انتقال متغیرهای محیطی و تنظیمات production
متغیر محیطی پل میان کد ثابت و تفاوت محیطهاست: SECRET_KEY، DATABASE_URL، credential ایمیل، API token، hostname، debug flag و مسیر فایل میتوانند در مقصد عوض شوند. فهرستی از نام متغیرهای لازم بسازید، اما مقدار واقعی را در مخزن قرار ندهید. یک فایل نمونه مانند .env.example فقط نامها و توضیحها را نشان میدهد. مقدار واقعی از مسیر امن وارد کنترلپنل یا محیط اجرا میشود.
رازها را کپی نکنید؛ مدیریت کنید
اگر secret قدیمی در فایل، پیامرسان یا آرشیو جابهجا شده، آن را بالقوه افشاشده بدانید و پس از انتقال rotate کنید. دسترسی هر credential را به حداقل لازم محدود کنید؛ کاربر دیتابیس برنامه به مجوزهای مورد نیاز همان schema نیاز دارد، نه حساب مدیریتی همهکاره. لاگ startup نباید مقدار envها را چاپ کند. برای عیبیابی میتوانید حضور متغیر و طول یا fingerprint غیرقابلبازگشت آن را ثبت کنید، نه خود مقدار.
تفاوت تنظیمات توسعه و تولید
| موضوع | محیط توسعه | محیط تولید |
|---|---|---|
| Debug | برای توسعه محلی مفید | خاموش؛ خطا در لاگ و سامانه گزارش ثبت شود |
| Secret | مقدار محلی جدا | مقدار قوی و اختصاصی، خارج از مخزن |
| دامنه | localhost | دامنههای مجاز واقعی و HTTPS |
| دیتابیس | گاهی SQLite یا نمونه محلی | سرویس مقصد با backup و credential محدود |
| Static/Media | ممکن است dev server سرو کند | مسیر و وبسرور مقصد باید صریح تنظیم شود |
| اجرای برنامه | server توسعه و reload | WSGI/ASGI و سازوکار restart مناسب |
مستندات Django توصیه میکند manage.py check --deploy با تنظیمات production اجرا شود و runserver برای تولید استفاده نشود. مستندات Flask نیز development server را برای تولید امن، پایدار یا کارآمد نمیداند. محیط مقصد باید از entrypoint و server متناسب استفاده کند؛ روش دقیق به فریمورک و امکانات سرویس وابسته است.
مسیرها و permissionهای قابل حمل
مسیر مطلق لپتاپ یا سرور قبلی را در کد hard-code نکنید. BASE_DIR یا ریشه برنامه را از محل فایل محاسبه و مسیرهای media، log و cache را با تنظیم محیطی تعریف کنید. پس از انتقال، مالکیت و permission را برای کاربر اجرای برنامه بررسی کنید. دادن permission بسیار باز مانند 777 مسئله طراحی را پنهان و سطح خطر را زیاد میکند؛ برنامه باید فقط در مسیرهایی بنویسد که واقعاً لازم دارد.

مهاجرت دیتابیس، فایلهای static و media
کد را میتوان دوباره deploy کرد، اما داده کاربر معمولاً منحصربهفرد است. پیش از مهاجرت، نوع دیتابیس، نسخه، collation یا encoding، timezone، extensionها، اندازه و روش backup را ثبت کنید. dump را در مقصد آزمایشی restore کنید و فقط به موفقیت فرمان اعتماد نکنید؛ شمارش چند جدول کلیدی، نمونه رابطهها، طول متن فارسی، timestamp و عملیات خواندن/نوشتن را بررسی کنید.
ترتیب امن انتقال دیتابیس
- از دیتابیس مبدأ backup سازگار بگیرید و امکان restore آن را پیش از پنجره نهایی آزمایش کنید.
- کاربر و دیتابیس مقصد را با encoding و مجوز مناسب بسازید؛ آموزش ساخت دیتابیس در cPanel برای بخش کنترلپنل مفید است.
- نسخه اولیه را restore و migrationهای برنامه را در محیط آزمایشی اجرا کنید.
- تفاوت schema و داده را کنترل و زمان لازم برای dump/restore نهایی را اندازه بگیرید.
- در cutover، نوشتن روی مبدأ را متوقف یا همگامسازی کنترلشده تعریف کنید، dump نهایی بگیرید و دوباره restore کنید.
- پس از تأیید، دسترسی برنامه مقصد را باز و credential موقت مهاجرت را حذف کنید.
Migration دیتابیس را با backup اشتباه نگیرید
migrationهای Django یا Alembic ساختار schema را تغییر میدهند؛ backup نسخهای از داده و ساختار برای بازیابی است. وجود migration به معنای داشتن نسخه پشتیبان نیست. پیش از اجرای migration برگشتناپذیر روی داده واقعی، backup قابل restore بگیرید و زمان و اثر قفل جدول را بسنجید. اگر نسخه جدید برنامه با schema جدید ناسازگار با نسخه قدیمی است، rollback کد بهتنهایی کافی نخواهد بود و باید برنامه بازگشت دیتابیس نیز داشته باشید.
static با media چه تفاوتی دارد؟
Static معمولاً از کد و packageها تولید میشود: CSS، JavaScript و تصویرهای رابط. Media را کاربر یا کسبوکار بارگذاری میکند و باید بهعنوان داده نگهداری شود. در Django، مستندات رسمی اجرای collectstatic و سرو مسیر STATIC_ROOT را در محیط production مطرح میکند. پوشه static ساختهشده را میتوان دوباره تولید کرد، اما media باید با ابزار انتقالی که timestamp، اندازه و صحت فایل را حفظ میکند جابهجا و شمارش شود.
- تعداد و حجم کل فایلهای media را قبل و بعد مقایسه کنید.
- چند فایل کوچک، بزرگ، فارسینام و قدیمی را باز کنید.
- مجوز خواندن وبسرور و نوشتن برنامه را جدا کنترل کنید.
- از اجرای فایل بارگذاریشده بهعنوان کد جلوگیری کنید.
- URLهای ذخیرهشده در دیتابیس را برای وابستگی به دامنه قدیمی بررسی کنید.
- backup فایل و دیتابیس را همزمان یا با نقطه سازگاری مشخص تهیه کنید.
نکات انتقال Django، Flask و FastAPI
چکلیست انتقال Django
- تنظیمات production، SECRET_KEY، DEBUG، ALLOWED_HOSTS و CSRF trusted origins را بازبینی کنید.
- اتصال DATABASES و cache را با credential مقصد آزمایش کنید.
python manage.py check --deployرا روی تنظیمات تولید اجرا کنید.- migrationها را ابتدا روی restore آزمایشی اجرا و سپس برای تولید برنامهریزی کنید.
- STATIC_ROOT و MEDIA_ROOT را تعیین و collectstatic را در فرایند انتشار قرار دهید.
- entrypoint صحیح WSGI یا ASGI و روش restart برنامه را ثبت کنید.
- ارسال ایمیل، پنل admin، session و taskهای دورهای را جدا تست کنید.
Django پروژه را ساختاریافته میکند، اما انتقال کورکورانه settings قدیمی خطرناک است. مقدارهایی که باید بین محیطها فرق کنند از کد جدا شوند. اگر از cache درونپردازهای در توسعه استفاده شده، رفتار آن در چند worker ممکن است متفاوت باشد. همچنین فایل media ورودی غیرقابل اعتماد است؛ وبسرور نباید آن را بهعنوان کد اجرا کند.
چکلیست انتقال Flask
در Flask نقطه ورود ممکن است یک app object یا application factory باشد. دستور server توسعه را با WSGI server سازگار با محیط جایگزین کنید و import path را دقیق آزمایش کنید. config instance، secret، database URL و مسیر upload را از پوشه توسعه جدا سازید. اگر پشت proxy هستید، فقط با شناخت headerهای قابل اعتماد ProxyFix یا تنظیم معادل را اعمال کنید؛ اعتماد بیحد به headerهای ورودی میتواند امنیت URL و scheme را خراب کند.
چکلیست انتقال FastAPI و ASGI
FastAPI معمولاً با ASGI server اجرا میشود. entrypoint، تعداد worker، timeout، lifespan event و dependencyهای async را بررسی کنید. اگر WebSocket یا connection طولانی دارید، پشتیبانی proxy و سرویس مقصد را پیش از انتقال تأیید کنید. اجرای endpoint ساده کافی نیست؛ startup hook، اتصال دیتابیس، background task و graceful shutdown را نیز آزمایش کنید. از نسبتدادن هر مشکل async به هاست خودداری کنید؛ ابتدا event loop، clientهای blocking و pool اتصال را در لاگ و پروفایل بررسی کنید.
Worker و cron؛ اجزایی که پس از انتقال جا میمانند
وباپلیکیشن ممکن است باز شود، اما queue worker، scheduler یا اسکریپت دورهای اجرا نشود. همه process typeها را جدا فهرست کنید: web، worker، scheduler، bot و job import. برای هرکدام دستور اجرا، working directory، env، محل log و سیاست restart تعیین کنید. Cron نباید همزمان روی مبدأ و مقصد کار تغییردهنده داده را اجرا کند؛ در cutover مالک هر job را صریح تغییر دهید.

تست مقصد، تغییر DNS و برنامه بازگشت
قبل از تغییر عمومی DNS، مقصد را با URL آزمایشی، hosts file یا دامنه فرعی کنترلشده بررسی کنید. آزمون باید با تنظیمات production و همان دیتابیس آزمایشی انجام شود، نه development server. health endpoint تنها بخشی از کار است؛ مسیرهای واقعی کاربر و jobهای پسزمینه را نیز اجرا کنید. خروجی تست، زمان پاسخ و خطاها را نگه دارید تا پس از cutover خط مبنا داشته باشید.
Smoke test حداقلی اما معنادار
| مسیر | آزمون | شاهد موفقیت |
|---|---|---|
| صفحه عمومی | درخواست از دامنه و HTTPS | کد پاسخ، محتوای درست و asset سالم |
| احراز هویت | ورود و خروج کاربر آزمایشی | session و cookie امن و بدون redirect loop |
| دیتابیس | خواندن و ثبت داده کمخطر | رکورد در مقصد و encoding صحیح |
| فایل | آپلود و دانلود نمونه | ذخیره، URL و permission درست |
| ایمیل/API | عملیات کنترلشده | پاسخ ثبتشده و timeout مناسب |
| Worker/Cron | job آزمایشی | یکبار اجرا و نتیجه قابل ردیابی |
| Restart | راهاندازی مجدد برنامه | برگشت خودکار و health سبز |
Cutover مرحلهبهمرحله
TTL را با فاصله کافی و مطابق سیاست DNS خود کاهش دهید؛ تغییر لحظه آخر الزاماً اثر فوری ندارد. درست پیش از cutover، تغییرات مبدأ را محدود کنید، backup نهایی بگیرید، دیتابیس و media را همگام و برنامه مقصد را به داده نهایی متصل کنید. سپس DNS یا routing را تغییر دهید و از چند شبکه پاسخ را کنترل کنید. تا وقتی cacheهای DNS و sessionهای قدیمی ممکن است به مبدأ برسند، محیط قدیمی را ناگهانی حذف نکنید.
پنجره تغییر چه اطلاعاتی باید داشته باشد؟
- زمان آغاز و پایان، مسئول تصمیم و کانال ارتباطی
- نسخه کد، checksum backup و وضعیت migrationها
- فرمانها یا مراحل دقیق و ترتیب اجرا
- معیار موفقیت و آستانه rollback
- روش بازگرداندن DNS، کد و دیتابیس
- دوره مراقبت و شاخصهای مورد پایش
Rollback واقعی فقط تغییر DNS نیست
اگر پس از cutover نوشتن روی دیتابیس مقصد شروع شود، بازگرداندن DNS به مبدأ میتواند داده جدید را置 جا بگذارد. پیشاپیش تصمیم بگیرید rollback داده چگونه انجام میشود: توقف موقت نوشتن، replication، export تغییرات یا پذیرش یک RPO مشخص. نسخه جدید schema نیز ممکن است با کد قدیم ناسازگار باشد. rollback باید کد، تنظیمات، schema، داده، media و jobها را با هم در نظر بگیرد.
چه کسی و با چه نشانهای بازگشت را اعلام میکند؟
یک نفر باید اختیار تصمیم داشته باشد و شاخصها از قبل تعیین شوند: خطای ورود، شکست پرداخت آزمایشی، افزایش 5xx، شکست job یا اختلاف داده. بدون مالک و آستانه، تیم در لحظه بحرانی میان ادامه اصلاح و بازگشت مردد میماند. هرچه بازگشت دیرتر شود، داده بیشتری در مقصد تولید و همگامسازی دشوارتر میشود.
تمرین بازگشت پیش از روز انتقال
روی داده غیرواقعی یک بار مسیر rollback را تمرین کنید. زمان لازم، permissionهای گمشده و فرمانهای خطرناک در تمرین آشکار میشوند. برنامهای که فقط روی کاغذ وجود دارد، هنوز قابلیت بازیابی اثباتشده نیست.
مراقبت پس از انتقال
در ساعات نخست، نرخ خطا، latency، CPU، حافظه، I/O، اتصال دیتابیس، صف worker، ایمیل، فضای دیسک و log را پایش کنید. 404های static و media، redirect loop، خطای timezone و taskهای تکراری معمولاً پس از ترافیک واقعی دیده میشوند. backup جدید را از محیط مقصد تهیه و restore آن را در برنامه قرار دهید. مبدأ را پس از پایان دوره مراقبت و طبق سیاست نگهداری امن از دسترس خارج کنید.
خطاهای رایج انتقال پروژه پایتون و مسیر تشخیص
| خطا یا نشانه | علتهای محتمل | بررسی اول |
|---|---|---|
| ModuleNotFoundError | venv اشتباه یا requirements ناقص | which python، pip list و فایل وابستگی |
| Permission denied | مالکیت یا مسیر نوشتن نادرست | کاربر اجرا و permission پوشه |
| DisallowedHost/CSRF | دامنه مقصد در تنظیمات نیست | host، scheme و تنظیمات trusted origin |
| Static 404 | collectstatic یا mapping ناقص | STATIC_ROOT و مسیر سرو وب |
| Database connection failed | credential، host، allowlist یا driver | اتصال مستقل و پاسخ server |
| 502/503 | entrypoint غلط یا process متوقف | startup log و status پردازه |
| Unicode/فارسی خراب | encoding یا collation متفاوت | dump، restore و charset اتصال |
| Job دوباره اجرا میشود | cron همزمان در دو محیط | فهرست scheduler مبدأ و مقصد |
رفع خطای import بدون نصب تصادفی
ابتدا مطمئن شوید command از interpreter داخل venv اجرا میشود. سپس package را در requirements یا lockfile جستوجو کنید. اگر نصب شده ولی import شکست میخورد، نام distribution ممکن است با نام module فرق داشته باشد یا نسخه با Python ناسازگار باشد. نصب دستی یک package روی production میتواند مشکل را موقتاً پنهان کند؛ تغییر باید به فایل وابستگی بازگردد تا محیط بعدی نیز همان نتیجه را بسازد.
خطای 502 یا 503 پس از انتقال
این خطا اغلب از نرسیدن proxy به application server میآید، اما علت میتواند entrypoint غلط، exception در startup، timeout، کمبود process یا restart loop باشد. نخست وضعیت پردازه و اولین stack trace را ببینید، سپس socket/port و mapping دامنه را بررسی کنید. افزایش timeout پیش از شناخت علت ممکن است خطای startup را فقط دیرتر نمایش دهد.
اختلاف زمان و داده پس از مهاجرت
timezone سیستم، برنامه و دیتابیس را ثبت کنید. داده زمانی را ترجیحاً بهشکل آگاهانه و قابل تبدیل ذخیره کنید و نمایش محلی را در لایه مناسب انجام دهید. پس از restore چند timestamp قدیمی و جدید را با انتظار کسبوکار مقایسه کنید. اختلاف ساعت میتواند cron، انقضای token، گزارش روزانه و ترتیب رویدادها را خراب کند حتی اگر صفحه ظاهراً درست باشد.
اگر مقصد کندتر شد، از حدس منابع شروع نکنید
زمان را بین DNS/TLS، web server، application، query و dependency خارجی تفکیک کنید. ممکن است DEBUG خاموش نشده، cache متصل نیست، index دیتابیس جا افتاده، static از برنامه عبور میکند یا worker بیش از ظرفیت تنظیم شده باشد. منابع بیشتر فقط زمانی تصمیم معنادار است که مانیتورینگ فشار CPU، حافظه، I/O یا اتصال را همزمان با کندی نشان دهد.
چکلیست انتخاب هاست برای مهاجرت پروژه پایتون
پیش از خرید، نیاز پروژه را به سؤال قابل تأیید تبدیل کنید. صفحه فعلی هاست پایتون وطن هاست دسترسی ترمینال، cPanel، نسخههای Python و ماژول اجرای پروژه را معرفی میکند. با این حال، نسخه دقیق interpreter، روش entrypoint، پشتیبانی WSGI یا ASGI، اجرای worker و dependencyهای سیستمعاملی را برای همان پروژه و پلن روز بررسی کنید. قیمت، منابع و محدودیتها را فقط از اطلاعات جاری سفارش بگیرید.
| نیاز پروژه | پرسش پیش از خرید | چرا مهم است |
|---|---|---|
| نسخه Python | نسخه major/minor مورد نیاز در دسترس است؟ | سازگاری framework و wheelها |
| ترمینال و venv | آیا ساخت محیط و نصب package ممکن است؟ | بازسازی وابستگی و اجرای migration |
| WSGI/ASGI | entrypoint و restart چگونه تعریف میشود؟ | اجرای production بهجای dev server |
| دیتابیس | نوع، نسخه، دسترسی و backup چیست؟ | سازگاری driver و حفظ داده |
| Worker/Cron | پردازه دائمی و job دورهای چگونه اجرا میشود؟ | جلوگیری از توقف کارهای پسزمینه |
| لاگ | stdout، stderr و access log کجا دیده میشود؟ | تشخیص startup و خطای runtime |
| SSL/دامنه | اتصال دامنه و HTTPS چگونه است؟ | امنیت session و API |
| بازیابی | backup شامل چه اجزایی است و restore چگونه تست میشود؟ | بازگشت واقعی پس از خرابی |
هاست پایتون یا سرور مجازی؟
هاست پایتون برای پروژهای که با مدل اجرای ارائهشده سازگار است و تیم نمیخواهد مدیریت کامل سیستمعامل را بر عهده بگیرد، مسیر سادهتری فراهم میکند. اگر به root، daemon سفارشی، package سیستمعاملی خاص، چند سرویس شبکه یا معماری پیچیده نیاز دارید، سرور مجازی میتواند انعطاف بیشتری بدهد؛ در مقابل سختسازی، update، firewall، backup و مانیتورینگ نیز مسئولیت شما یا سرویس مدیریتشده خواهد بود. برای وبسایتهای PHP معمولی، هاست لینوکس ممکن است انتخاب اقتصادیتر و سادهتری باشد.
چکلیست نهایی مهاجرت و خرید
- نسخه Python و dependencyهای باینری پروژه را دقیق ثبت کردهام.
- venv را منتقل نمیکنم و فایل وابستگی تکرارپذیر دارم.
- تمام envها، secretها و سرویسهای بیرونی فهرست شدهاند.
- backup دیتابیس و media را restore آزمایشی کردهام.
- روش WSGI/ASGI، worker، cron، log و restart در مقصد روشن است.
- smoke test مسیرهای حیاتی و health check آماده است.
- پنجره cutover، مسئول تصمیم و معیار rollback مشخص است.
- امکانات و محدودیتهای جاری پلن را از صفحه محصول یا پشتیبانی تأیید کردهام.
رانبوک تحویل: اطلاعاتی که پس از مهاجرت باید باقی بماند
مهاجرت زمانی واقعاً تمام میشود که اجرای پروژه فقط در ذهن فرد انتقالدهنده نباشد. یک رانبوک کوتاه اما دقیق بسازید تا توسعهدهنده یا مدیر بعدی بتواند بدون حدسزدن، وضعیت سرویس را بررسی و آن را بازیابی کند. این سند نباید secret واقعی داشته باشد؛ بهجای مقدار رمز، نام متغیر، محل امن نگهداری و مسئول دسترسی را ثبت کنید. شماره نسخه Python، فرمان ساخت محیط، روش نصب وابستگیها، مسیر entrypoint، نام دامنه، محل log، روش restart، زمانبندی jobها و وابستگیهای بیرونی حداقل اجزای سند هستند. همچنین بنویسید کدام فایلها از کد ساخته میشوند و کدام دادهها باید backup شوند.
برای هر عملیات حساس یک فرمان نمونه و نتیجه مورد انتظار ثبت کنید. مثلاً توضیح دهید health check در حالت سالم چه کد وضعیتی میدهد، migration چگونه در حالت dry-run یا محیط staging کنترل میشود، و پس از collectstatic کدام مسیر باید بررسی شود. اگر اجرای فرمان به دایرکتوری خاص یا فعالبودن venv وابسته است، همان پیششرط را کنار فرمان بنویسید. این جزئیات مانع خطای متداولی میشود که فرمان درست در محیط یا مسیر نادرست اجرا گردد.
مالکیت دسترسیها و مسیر تمدید
فهرست دسترسیها را به نقشها پیوند دهید: چه کسی به پنل، مخزن کد، DNS، دیتابیس، سامانه ایمیل و سرویسهای بیرونی دسترسی دارد؟ دسترسی مشترک و بینام، پیگیری رویداد را دشوار میکند. حسابها را تا حد امکان شخصی و سطح دسترسی را محدود نگه دارید. در رانبوک، تاریخ انقضای دامنه یا گواهی و روش تمدید را فقط در حد عملیاتی ثبت کنید؛ اطلاعات پرداخت یا رمز نباید در سند عمومی پروژه قرار گیرد. اگر مسئول اصلی در دسترس نبود، مسیر جایگزین و فرد پاسخگو باید معلوم باشد.
آزمون دورهای بازیابی، نه فقط تهیه نسخه پشتیبان
وجود فایل backup بهتنهایی تضمین بازیابی نیست. یک چرخه آزمایش تعریف کنید: نسخه پشتیبان را در محیط جداگانه بازیابی کنید، migrationهای لازم را اجرا کنید، تعداد رکوردها و چند سناریوی کاربردی را بسنجید و زمان لازم تا سرویس سالم را ثبت کنید. برای media نیز checksum یا حداقل تعداد و حجم فایلها را مقایسه کنید. اگر backup رمزگذاری شده است، دسترسی به کلید و روش بازیابی آن باید مستقل از سروری باشد که ممکن است از دسترس خارج شود. نتیجه هر مانور، مشکلهای مشاهدهشده و اقدام اصلاحی را در همان سند ثبت کنید.
هدف این تمرین رسیدن به دو عدد عملیاتی است: حداکثر دادهای که از دست رفتن آن قابل پذیرش است و حداکثر زمانی که سرویس میتواند قطع بماند. این اعداد باید با روش backup و توان واقعی بازیابی سازگار باشند. اگر backup روزانه است اما کسبوکار از دست رفتن یک ساعت داده را نمیپذیرد، طراحی فعلی کافی نیست. اگر بازیابی آزمایشی چهار ساعت زمان میبرد، وعده بازگشت پانزدهدقیقهای واقعبینانه نخواهد بود.
برنامه مراقبت هفته اول
پس از انتقال، یک دوره مراقبت تعریف کنید و مسئول هر بازه را مشخص سازید. در ساعات نخست، لاگ خطا، پاسخ مسیرهای حیاتی، وضعیت دیتابیس، صفها و jobها را با فاصله کوتاه بررسی کنید. در روزهای بعد، روند مصرف منابع، خطاهای پراکنده، پیامهای کاربران و خروجی کارهای زمانبندیشده را با خط مبنای قبل از مهاجرت مقایسه کنید. تغییرات غیرضروری را در این دوره محدود نگه دارید تا علت هر مشکل قابل ردیابی باشد.
برای پایان دوره مراقبت معیار خروج تعیین کنید: چند روز بدون خطای بحرانی، موفقیت backup جدید، اجرای درست cron و worker، نبود افزایش غیرعادی زمان پاسخ و تأیید مسیرهای تجاری. سپس محیط مبدأ را طبق سیاست نگهداری و با رعایت امنیت از مدار خارج کنید؛ حذف عجولانه امکان rollback را میگیرد و نگهداری بیزمان نیز سطح حمله و هزینه مدیریت را بالا میبرد. تصمیم و تاریخ خروج را مستند کنید.
منابع رسمی فنی
برای ماهیت غیرقابلانتقال venv و روش بازسازی محیط از مستندات رسمی Python venv و برای requirements و pip از Python Packaging User Guide استفاده شده است. چکهای production، migration و static براساس Deployment checklist رسمی Django و نکات server تولید براساس مستندات رسمی Flask تنظیم شدهاند. نسخه مستندات را با نسخه واقعی پروژه خود تطبیق دهید.
جمعبندی: انتقال خوب یعنی محیط قابل بازسازی و بازگشت
برای انتقال پروژه پایتون به هاست، کد را از داده و محیط جدا ببینید. نسخه مشخص کد را منتقل کنید، venv تازه بسازید، dependencyها را از فایل تکرارپذیر نصب کنید، secretها را امن وارد کنید، دیتابیس و media را با آزمون صحت بازیابی کنید و برنامه را با server production اجرا کنید. پیش از DNS، مسیرهای واقعی را تست و پس از تغییر، شاخصها را پایش کنید. مهمتر از همه، rollback را برای کد و داده با هم طراحی کنید.
اگر پروژه شما با محیط کنترلپنلی و دسترسی ترمینال سازگار است، مشخصات جاری خرید هاست پایتون را بررسی کنید و فهرست نیازهای فنی را پیش از سفارش با پلن تطبیق دهید. ارائه نسخه Python، requirements، نوع فریمورک، دیتابیس، entrypoint و نیاز worker به تیم فروش یا پشتیبانی، انتخاب را دقیقتر و زمان انتقال را کوتاهتر میکند.
سؤالات متداول انتقال پروژه پایتون به هاست
آیا میتوان پوشه venv را مستقیم به هاست منتقل کرد؟
توصیه نمیشود. مستندات Python محیط مجازی را غیرقابلانتقال میداند، زیرا مسیرها و باینریها به محل و سیستم مبدأ وابستهاند. در مقصد venv تازه بسازید و وابستگیها را از requirements یا lockfile نصب کنید.
برای انتقال پروژه پایتون چه فایلهایی لازم است؟
کد نسخه مشخص، فایل وابستگی، راهنمای اجرا، فهرست متغیرهای محیطی، migrationها و در صورت نیاز dump دیتابیس و media لازماند. cache، pyc، venv و secret واقعی را داخل آرشیو عمومی نگذارید.
requirements.txt را چگونه برای مهاجرت بسازیم؟
بهتر است وابستگیهای production را آگاهانه pin یا lock کنید. pip freeze میتواند نقطه شروع باشد، اما خروجی محیط توسعه ممکن است ابزارهای اضافی داشته باشد. نصب را در یک محیط تمیز آزمایش کنید.
بعد از انتقال Django چه فرمانهایی مهماند؟
بسته به پروژه، نصب dependency، check –deploy، اجرای migration و collectstatic مهماند. همه فرمانها را ابتدا با تنظیمات production و دیتابیس آزمایشی اجرا کنید و پیش از migration واقعی backup قابل restore داشته باشید.
چرا پروژه Flask روی لپتاپ کار میکند اما روی هاست نه؟
ممکن است development server، مسیر مطلق، env محلی، نسخه Python یا dependency پنهان عامل باشد. در تولید باید entrypoint و WSGI server مناسب، تنظیمات محیط و لاگ startup را بررسی کنید.
چطور دیتابیس را بدون از دست رفتن داده منتقل کنیم؟
restore را پیشاپیش تمرین کنید، پنجره نهایی نوشتن را کنترل کنید، dump آخر را بگیرید و پس از بازیابی شمارش و نمونه داده را بسنجید. برنامه rollback باید داده تولیدشده پس از cutover را نیز در نظر بگیرد.
تفاوت static و media در مهاجرت چیست؟
Static معمولاً از کد تولید و با collectstatic یا فرایند build بازسازی میشود. Media داده بارگذاریشده کاربر است و باید جداگانه backup، منتقل و از نظر تعداد، حجم، URL و permission کنترل شود.
آیا تغییر DNS بلافاصله همه کاربران را به هاست جدید میفرستد؟
نه همیشه. cache و TTL میتواند باعث شود مدتی هر دو محیط ترافیک ببینند. مبدأ را فوراً حذف نکنید و برای جلوگیری از نوشتن دوگانه یا اجرای همزمان cron برنامه داشته باشید.
چه زمانی هاست پایتون برای پروژه مناسب نیست؟
اگر پروژه به root، daemon یا library سیستمعاملی خاص، شبکه سفارشی، چند سرویس مستقل یا کنترل کامل نیاز دارد، هاست اشتراکی ممکن است کافی نباشد. نیازها را با امکانات جاری پلن تطبیق دهید و در صورت لزوم سرور مجازی را بررسی کنید.
چطور بفهمیم مهاجرت موفق بوده است؟
علاوه بر بازشدن صفحه، ورود، دیتابیس، آپلود، ایمیل، API، worker، cron، restart و HTTPS را تست کنید. سپس نرخ خطا، latency، منابع، صف و لاگ را در دوره مراقبت با خط مبنا مقایسه کنید.




دیدگاهها
در حال دریافت دیدگاهها…