Ubuntu 24.04 Python 3.12 ile gelir, ancak düz pip ile paket kurmak artık «externally-managed-environment» hatası verir. Çözüm, her projeyi kendi sanal ortamında yalıtmaktır. Bu rehber VPS Linux Infrawire sunucunuzu nasıl hazırlayacağınızı, bağımlılıkları düzgün nasıl yöneteceğinizi ve bir uygulamayı systemd servisi olarak nasıl çalışır tutacağınızı gösterir.
📋 Ön koşullar
- Ubuntu 24.04 veya Debian 12 çalıştıran, root SSH erişimli bir VPS (IP adresi ve root parolası müşteri alanınızda yer alır)
- Bir Python projesi veya denemek için basit bir betik
- Temel komut satırı bilgisi
1. Python 3, pip ve venv kurulumu
Python 3 genellikle önceden kuruludur, ancak pip ve venv modülü ayrı paketlerdir.
Bashapt update apt install -y python3 python3-pip python3-venv python3-dev build-essential python3 --version pip3 --version
2. PEP 668 hatasını anlama
Ubuntu 24.04 veya Debian 12'de root olarak pip install requests çalıştırınca şu çıktı gelir:
TEXTerror: externally-managed-environment
Bu koruma (PEP 668), pip'in apt tarafından yönetilen dosyaların üzerine yazıp sistem araçlarını bozmasını engeller. --break-system-packages ile aşmayın. Aşağıdaki üç temiz yoldan birini kullanın.
3. Sanal ortam oluşturma
Sanal ortam, tek bir proje için Python ve pip'in özel bir kopyasıdır.
Bashmkdir -p /opt/myapp && cd /opt/myapp python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install requests flask gunicorn
İstem artık (venv) ile başlar. Ortamdan deactivate ile çıkarsınız.
4. requirements.txt ile bağımlılıkları yönetme
Projeyi başka bir sunucuda birebir yeniden kurabilmek için tam sürümleri sabitleyin.
Bashpip freeze > requirements.txt # Yeni bir makinede python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
5. pipx ile komut satırı araçları kurma
Bağımsız araçlar (httpie, yt-dlp, black...) için pipx her birine gizli bir sanal ortam verir ve komutu genel olarak erişilebilir kılar.
Bashapt install -y pipx pipx ensurepath pipx install httpie
Güncellenen PATH yüklensin diye ardından yeni bir kabuk açın. Debian paketi bulunan bir kütüphane için apt install python3-requests de geçerli bir seçimdir.
6. Uygulamayı systemd servisi olarak çalıştırma
Ayrıcalıksız özel bir kullanıcı oluşturun, ardından sanal ortamdaki yorumlayıcıyı başlatan bir unit yazın (burada app.py içindeki app adlı Flask nesnesini sunan Gunicorn).
Bashuseradd --system --home /opt/myapp --shell /usr/sbin/nologin myapp chown -R myapp:myapp /opt/myapp
/etc/systemd/system/myapp.service dosyasını oluşturun:
INI1[Unit] 2Description=My Python application 3After=network.target 4 5[Service] 6User=myapp 7WorkingDirectory=/opt/myapp 8ExecStart=/opt/myapp/venv/bin/gunicorn --bind 127.0.0.1:8000 app:app 9Restart=on-failure 10RestartSec=5 11 12[Install] 13WantedBy=multi-user.target
Bashsystemctl daemon-reload systemctl enable --now myapp
Uygulamayı internete açmak için 8000 portunun önüne nginx gibi bir ters vekil koyun.
✅ Doğrulama
Bashwhich python # etkinleştirildiğinde /opt/myapp/venv içini göstermeli pip list systemctl status myapp --no-pager journalctl -u myapp -n 50 --no-pager curl -I http://127.0.0.1:8000
🔧 Sorun giderme
The virtual environment was not created successfully because ensurepip is not available : venv paketi eksik. apt install python3-venv (veya python3.12-venv) ile kurun ve komutu yeniden çalıştırın.
systemd'de status=203/EXEC : ExecStart içindeki yol yanlış ya da dosya servis kullanıcısı tarafından çalıştırılamıyor. ls -l /opt/myapp/venv/bin/gunicorn ile ve daha önce ayarlanan sahiplikle kontrol edin.
ModuleNotFoundError yalnızca systemd altında : servis sanal ortam yerine sistem Python'unu kullanıyor. ExecStart içinde her zaman /opt/myapp/venv/bin/python ya da venv/bin altındaki ikili dosyayı çağırın.
pip: command not found : python3 -m pip kullanın veya önce sanal ortamı etkinleştirin.
🎉 Python projeleriniz artık yalıtılmış, tekrarlanabilir ve güvenilir bir servis olarak çalışıyor!