Devpi ile Özel PyPI Sunucusu Kurulumu
Python yazan bir şirketteyseniz belirli bir süre sonra kendinize göre oluşturduğunuz kütüphanelerin dağıtımı problem olmaya başlıyor. Bunları git üzerinden sunmak birer çözüm olsa da bazı zamanlarda pip bu bağımlılıkları çözemiyor ve hata verebiliyor. Bunların genel çözümü kendinize özel bir PyPi sunucusu kurarak bu paketleri kendi sunucunuzda dağıtmak.
Bu yazıda devpi kullanarak nasıl kendi paket sunucumuzu konfigüre edeceğimizi ve yönetebileceğimizi göreceğiz.
İhtiyaçlar¶
- Ubuntu 24.04 sunucu
- DNS kaydı
- Python
- Caddy web sunucusu
- Supervisor
- DevPi
Ubuntu 24.04¶
AWS ya da tercih edeceğiniz herhangi bir bulut servis sağlayıcısından bir sunucu edinin. Sunucuda 2 CPU ve 2GB ram olması yeterli olacaktır. DevPi sunucusu aynı zamanda cache yaptığı için disk olarak 100GB ayırmanız yararınıza olacaktır. Eğer yetmezse ilerde diski arttırabilirsiniz.
Kurulum yaptıktan sonra Ubuntu güncellemesi yapmayı ihmal etmeyin.
DNS Kaydı¶
PyPI sunucusunun DNS kaydına ihtiyacı var. Bu DNS adresini çeşitli konfigürasyon dosyalarına
yazacağız ve bu açıdan bir DNS adresinizin olması gerekiyor. Bunun için pypi.sirketismi.com gibi
bir alan adını tercih edebilirsiniz.
Ubuntu kurulumu yaptıktan sonra DNS adresinizi buraya yönlendirin ve çalıştığından emin olun.
Python Kurulumu¶
Aşağıdaki komut ile Python kurulumunu gerçekleştirin.
Caddy Kurulumu¶
SSL sertifikalarını otomatik olarak yönettiği için web sunucusu tercihimiz Caddy olacak. Bunun için Caddy kurulum belgesi'ni ziyaret edin ve oradaki yönergeleri izleyerek kurulum yapın.
Supervisor¶
DevPi sunucusunu yönetmek için ihtiyacımız olan yazılım. Aşağıdaki komut ile yükleyin.
DevPi Kurulumu¶
Kurulumu ubuntu kullanıcısında, ev dizininde yapacağız. Benim test ettiğim VM içerisindeki kullanıcı
ismim eren, yazının ilerleyen bölümlerinde kullanıcı ismi olarak bunu görebilirsiniz. Siz
kendinize göre bu kullanıcı ismini ve ev dizinini değiştirin.
Virtual Environment Oluşturma¶
DevPi Paketlerini Kurma¶
Sanal Python ortamını aktive ettikten sonra aşağıdaki komut ile ilgili paketleri yükleyin.
DevPi Dosyalarını Oluşturma¶
Kurulum öncesinde aşağıdaki dosyayı config.yaml olarak kaydedin. Dizinleri kendi ev dizininize
göre değiştirmeniz gerekmektedir.
devpi-server:
serverdir: /home/eren.linux/src/devpi/server
secretfile: /home/eren.linux/src/devpi/secret
host: localhost
port: 4040
Sonrasında aşağıdaki 2 komut ile devpi dosyalarını oluşturun.
Sunucunun artık çalışıyor olması gerekli. Bunu da aşağıdaki komut ile teyit edebilirsiniz.
http://localhost:4040 adresinden sunulacaktır.
Yeni Kullanıcı ve Index Oluşturma¶
Paketleri devops kullanıcı altında yayınlayacağız. Bu açıdan devops kullanıcısı ve parolası gerekmekte. Bu paroları bu şekilde bırakmayıp değiştirmenizi öneririm.
devpi use http://localhost:4040
devpi user -c devops password=devops
devpi login devops
devpi index -c pypi bases=root/pypi
Kullanıcı Parolası
Buradaki kullanıcı adı ve parola ile ilerde ayarlayacağımız Caddy HTTP Basic Auth kullanıcı adı ve parolasının aynı olması gerekmekte. Yoksa twine ve uv gibi araçlar auth hatası verip paket yükleyememekte.
Supervisor Konfigürasyonu¶
/etc/supervisor/conf.d/devpi.conf dosyasını oluşturun ve içerisine aşağıdaki satırları yazın.
[program:devpi]
directory = /home/eren.linux/src/devpi
command = /home/eren.linux/src/devpi/venv/bin/devpi-server -c config.yaml
user = eren
stdout_logfile=/var/log/supervisor/devpi.log
redirect_stderr=true
Sonrasında supervisorctl reread ve supervisorctl update komutları ile ilgili değişiklikten
supervisor'un haberdar olmasını sağlayın. supervisorctl status komutu ile servisin durumunu
öğrenebilirsiniz. Herhangi bir problem durumunda log dosyasına da bakabilirsiniz.
Caddy Konfigürasyonu¶
Caddy ile http basic auth yardımıyla sadece bizim erişebileceğimiz şekilde sunucuyu konfigüre edeceğiz. Şirket içerisinde kullanacağımız ve dışarıya açık olmayacağı için bu noktada basic auth tercih ediyoruz.
Öncelikle yukarıda oluşturduğumuz devops kullanıcısı ile aynı parolaya sahip olacak şekilde
parola oluşturmamız gerekmekte. Bunun için aşağıdaki komutu girin ve belirleyeceğiniz parolayı
yazın. Örnek olması açısından burada devops parolası kullanılacaktır.
/etc/caddy/Caddyfile dosyasını düzenleyin ve aşağıdaki satırları ekleyin. Burada DNS kaydınız daha
öncesinde belirlediğiniz DNS kaydı olması gerekiyor. pypi.sirketismi.com kısmını ilgili şekilde
değiştiriniz.
pypi.sirketismi.com {
basic_auth {
devops $2a$14$AQ3meWulTcxq0VLYTNkE.eg4Bn3VtwFq.WhhJOhqbfEMePod3v54O
}
reverse_proxy :4040
}
Bu ayarlarla birlikte basic auth olacak şekilde Caddy sunucusunu konfigüre etmiş olacaksınız.
Çalıştığını teyit etmek için pypi.sirketismi.com adresini ziyaret ediniz.
basic_auth Direktifi
Caddy'nin önceki sürümlerinde basic_auth direktifi yerine basicauth kullanılıyor. Bunu
dikkate alarak kullandığınız Caddy sürümüne göre düzenleyiniz.
Yeni PyPI Sunucusunu Kullanmak¶
Buraya kadar gelmişseniz PyPI sunucusunun kurulduğunu teyit etmişsiniz demektir. Bu bölümde yeni
paketlerin nasıl kurulacağını ve pip ile yeni indexin nasıl kullanılacağına değineceğiz.
Twine ile Paket Yüklemek¶
Twine PyPI ile etkileşim sağlayan bir uygulama. Bu uygulama ile yeni
kurduğumuz sunucuyu kullanmak için birkaç ayar yapmamız gerekmekte. Bunun için ~/.pypirc dosyasını
düzenlemeye ihtiyacımız var. Bu dosyayı açın ve aşağıdaki satırları kendinize göre değiştirerek
yazın.
[distutils]
index-servers =
sirket
[sirket]
repository = https://pypi.sirketismi.com/devops/pypi
username = devops
password = devops
Sonrasında göndermek istediğiniz Python modülünüze gelin ve bunu python -m build ile oluşturun. Sonrasında aşağıdaki komut ile bunu yeni kurduğumuz index'e gönderebilirsiniz.
Bu komuttaki sirket değerinin, .pypirc içerisindeki sirket olduğunu hatırlayalım.
Pip ile PyPI Sunucusunu Kullanmak¶
Pip ön tanımlı olarak pypi repolarından paketleri almakta. Bunun yerine öncelikle bizim repomuza
bakmasını söylememiz gerekiyor. Bunun için ~/.config/pip/pip.conf dosyasını açın ve içerisine aşağıdaki satırları yazın.
Sonrasında bir virtual environment oluşturarak pip install <paketismi> komutunu çalıştırın ve PyPI
indexinin düzgün çalıştığından emin olun. Burada öncesinde gönderdiğiniz ve normal PyPI repolarında
olmayan şirket içerisindeki bir paketi deneyebilirsiniz.
Uv ile PyPI Sunucusunu Kullanmak¶
Uv ile kullanırken ortam değişkeninin ayarlanması gerekiyor. Aşağıdaki ortam değişkenini
kullandığınız kabuğa girin ve sonrasında uv pip install ... komutunu çalıştırın.
Uv'ye bu özelliğin son sürüm ile birlikte geldiğini belirtmem gerekli. Eğer uv ile yukarıdaki ortam
değişkenini ayarlamış olmanıza rağmen indexi kullanamıyorsanız uv'nin son sürümünün yüklü olduğundan
emin olun. Bu yazının yazıldığı tarih itibariyle 0.4.24 sürümünde çalışır halde.
Sonuç¶
Şirket içerisinde özel PyPI sunucusunu HTTP Basic Auth ile sağlıyoruz. Yukarıda yazan kullanıcı adı ve parolaları kendinize göre değiştirmenizi ve bir parola yönetimi yazılımı ile 25 karakter parola üretmenizi tavsiye ederim.
PyPI sunucusunu kullanacağınız her yerde pip.conf ayarlarını yapmanız gerekecektir. Aynı zamanda --index parametresi ile bunu başarabilirsiniz.