Python Sanal Ortam ve Bağımlılık Yönetimi: Sunucuda Tekrarlanabilir Kurulum
venv, pip ve requirements dosyasıyla Python projelerinde sürümleri sabitlemek, sunucuyu yeniden kurarken aynı ortamı elde etmek, güncellemeleri güvenle yapmak ve sık hataları çözmek için rehber.
"Bende çalışıyordu" cümlesinin arkasında genellikle farklı kütüphane sürümleri vardır. Bir Flask uygulamasını sunucuya kurarken ya da kartı bozulan bir Raspberry Pi'yi yeniden kurarken aynı ortamı elde edebilmek, bağımlılık yönetiminin asıl amacıdır. Bu rehber, sanal ortamı, sürüm sabitlemeyi ve güncelleme düzenini anlatır.
Neden sanal ortam?
Sistem Python'una doğrudan paket kurmak, işletim sisteminin kendi araçlarını bozabilir ve iki projenin farklı sürümler istediği durumda çakışma yaratır. Sanal ortam (venv), her proje için ayrı bir paket klasörü oluşturur. Debian tabanlı sistemlerde artık sistem Python'una pip ile kurulum engellenir; sanal ortam bu yüzden zorunlu hale gelmiştir.
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn
Ortamı etkinleştirmeden de doğrudan venv/bin/python ve venv/bin/gunicorn yolunu kullanabilirsiniz; systemd birim dosyalarında bu yol kullanılır (Flask systemd rehberi).
Sürümleri sabitlemek
Çalışan sistemden bağımlılık listesi çıkarın:
pip freeze > requirements.txt
Yeni bir makinede ya da sıfırlanmış bir kartta aynı ortamı kurmak için:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
pip freeze doğrudan ve dolaylı tüm paketleri sürümleriyle yazar; bu tekrar üretilebilirlik için istenen davranıştır. Büyük projelerde yalnızca doğrudan bağımlılıkları yazan bir requirements.in ve ondan üretilen kilit dosyası (pip-tools) kullanılır, ama küçük bir panel için pip freeze yeterlidir.
Yedeğe dahil etmeyi unutmayın
Sanal ortam klasörünün kendisini yedeklemek gerekmez (yeniden üretilebilir, ve işlemci mimarisine bağlıdır); ama requirements.txt mutlaka yedeğe girmeli. Bir felaket tatbikatında paket sürümlerinin sabitlenmemesi yüzünden yeni kurulumda farklı bir sürüm gelmiş ve bir şablon uyarı vermişti (yedek tatbikatı). requirements.txt ve kurulum notlarını 3-2-1 kuralı kapsamında tutun.
Güvenli güncelleme düzeni
- Önce yedek: Sanal ortamı ve veriyi yedekleyin; mevcut
requirements.txt'i tarihli bir adla saklayın. - Neyin güncelleneceğini görün:
pip list --outdated. - Tek tek ya da küçük gruplar halinde güncelleyin: Önce güvenlik yamaları, ana sürüm atlamaları ayrıca.
- Test edin: Uygulamayı başlatın, giriş, rapor ve yazma işlemlerini deneyin; sözdizimi için
python -m py_compile. - Yeni listeyi kaydedin:
pip freeze > requirements.txt. - Sorun çıkarsa geri dönün: Eski
requirements.txtile yeniden kurun.
Bu adımları betikleyen bir geri dönüş düzenini güvenli güncelleme rehberinde anlatıyoruz.
Güvenlik açısından
Kullandığınız her kütüphane saldırı yüzeyinizi büyütür. Gereksiz bağımlılık eklemeyin; yalnızca ihtiyaç duyduğunuz paketleri kurun. Güvenlik açığı bildirimleri için pip-audit gibi araçlar bilinen zayıflıkları tarar. Bağımlılıkları yıllarca güncellemeden bırakmak, sunucunun en büyük sessiz riskidir. Kimlik doğrulama ve oturum gibi kritik işleri kendiniz yazmak yerine bakımı yapılan kütüphanelere bırakın (Flask güvenli giriş).
Sık hatalar
| Hata | Neden | Çözüm |
|---|---|---|
externally-managed-environment |
Sistem Python'a pip ile kurulum | Sanal ortam kullanın |
ModuleNotFoundError servis içinde |
Servis sistem Python'unu çağırıyor | ExecStart içinde venv/bin/... yolu |
| Derleme hatası (Pi) | Derleme araçları yok | sudo apt install build-essential python3-dev |
| Sürüm çakışması | Paketler birbirine uyumsuz | Eski requirements.txt'ten yeniden kur |
| Yavaş kurulum (Pi) | Paket kaynaktan derleniyor | Hazır ARM paketli sürümü tercih edin |
Sık sorulan sorular
venv klasörünü sürüm kontrolüne koymalı mıyım? Hayır; requirements.txt yeterlidir.
Python sürümünü nasıl sabitlerim? Servis ve kurulum belgenize sürümü yazın (python3 --version); büyük sürüm atlamaları ayrı test gerektirir.
Docker ile aynı sorun çözülür mü? Evet, ama Pi'de çoğu küçük proje için gereksiz karmaşıklık getirir (Docker rehberi).