itsrda

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

  1. Önce yedek: Sanal ortamı ve veriyi yedekleyin; mevcut requirements.txt'i tarihli bir adla saklayın.
  2. Neyin güncelleneceğini görün: pip list --outdated.
  3. Tek tek ya da küçük gruplar halinde güncelleyin: Önce güvenlik yamaları, ana sürüm atlamaları ayrıca.
  4. Test edin: Uygulamayı başlatın, giriş, rapor ve yazma işlemlerini deneyin; sözdizimi için python -m py_compile.
  5. Yeni listeyi kaydedin: pip freeze > requirements.txt.
  6. Sorun çıkarsa geri dönün: Eski requirements.txt ile 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).

Not: Komutları üretim ortamında çalıştırmadan önce yedek alın ve önce test ortamında deneyin. Bir adım sizde farklı davranıyorsa bize yazın, rehberi güncelleyelim.