- Piku, Dokku'dan ilham alan bir araçtır ve küçük self-hosted sunucularda bile uygulamaları
git push yöntemiyle dağıtmayı mümkün kılar
- Heroku/CloudFoundry benzeri bir akışı hedefler, ancak o dönemde Dokku ARM üzerinde çalışmıyordu ve Docker da fazla ağır kalabildiği için daha basit bir dağıtım yöntemi amaçlandı
- Dağıtım sırasında çalışma zamanını algılar, bağımlılıkları kurar, ardından
Procfile dosyasını okuyup worker'ları uwsgi ile çalıştırır; Python, Node, Java, Clojure, Ruby ve Go ile ilgili işlemleri içerir
- Tek bir host üzerinde birden çok uygulama bağımsız şekilde dağıtılabilir, yönetilebilir ve ölçeklenebilir; ayrıca sanal host, SSL, statik siteler, URL yolu eşleme ve backend yanıt önbellekleme desteği sunar
- Python 3.10 ve üzeri ile Python,
nginx, uwsgi ve SSH gerektirir; Debian ve Ubuntu LTS'in en güncel iki ana sürümünü desteklemeyi hedefleyen kararlı durumdaki bir projedir
Piku'nun çözdüğü sorun
- Piku, kendi sunucunuzda
git push ile dağıtım yapmanızı sağlayan bir araçtır
- Dokku'dan ilham almıştır ve çok küçük sunucularda bile çalışmayı hedefler
- Heroku/CloudFoundry benzeri bir dağıtım deneyimini birkaç ARM kart üzerinde kullanmak isteniyordu, ancak o dönemde Dokku ARM üzerinde çalışmıyordu ve Docker da bazı durumlarda gereğinden ağırdı; bu yüzden daha basit bir çözüme ihtiyaç vardı
- Bugün hem ARM hem de Intel mimarilerinde host başına birden fazla uygulamayı dağıtabilir, yönetebilir ve birbirinden bağımsız ölçekleyebilir
- Python,
nginx ve uwsgi çalıştırabilen bulut sağlayıcılarında ve bare-metal ortamlarda çalışır
Kurulum ve proje durumu
- Temel kurulum şu komutla yapılabilir
curl https://piku.github.io/get | sh
- Kurulum belgelerinde
cloud-init ve manuel kurulum dahil başka kurulum yöntemleri de bulunur
- Proje STABLE durumda kabul edilir
- Özellik seti büyük ölçüde tamamlanmıştır
- Yeni dil çalışma zamanları eklendiğinde veya yeniden üretilebilir hatalar ortaya çıktığında güncellenir
- Şu anda Python 3.10 ve üzeri gereklidir; testler de Python 3.10 ve üzeri sürümlerde yapılır
- Destek hedefi, Debian ve Ubuntu LTS'in en güncel iki ana sürümüdür
Git Push tabanlı iş akışı
- Piku, Heroku benzeri bir iş akışını destekler
- Uygulama adını depo adı olarak kullanıp Piku sunucusunu işaret eden bir Git SSH remote'u oluşturursunuz
git remote add piku piku@yourserver:appname
- Kodu push ederek dağıtım yaparsınız
git push piku master
- Mevcut branch yerine başka bir branch push etmek için şu kullanım geçerlidir
git push piku release-branch-name
- Dağıtım sürecinde Piku çalışma zamanını algılar, gerekli bağımlılıkları kurar ve gerekiyorsa derleme adımlarını yürütür
- Python uygulamaları bağımlılıkları uygulama başına ayrı bir virtualenv içinde izole eder
- Go uygulamaları uygulama başına ayrı bir
GOPATH tanımlar
- Node uygulamaları
package.json içindeki girdileri node_modules içine kurar
- Java uygulamaları
pom.xml veya build.gradle dosyasına göre derlenir
- Clojure uygulamaları
leiningen ya da Clojure CLI ve deps.edn dosyasını kullanabilir
- Ruby uygulamaları gem'leri izole bir klasöre
bundle install ile kurar
Çalışma modeli ve yapılandırma
- Piku,
Procfile dosyasını okuyup ilgili worker'ları uwsgi üzerinden çalıştırır
uwsgi, genel amaçlı bir süreç yöneticisi olarak kullanılır
- İsteğe bağlı olarak bir
release worker tanımlanabilir; bu worker uygulama dağıtımı sırasında bir kez çalıştırılır
- Uygulama ayarlarını uzaktan değiştirebilir veya worker süreçlerini artırıp azaltabilirsiniz
config:set ile uygulama ayarlarını değiştirirsiniz
ps:scale ile worker süreçlerini ölçeklersiniz
ENV dosyası uygulama yapılandırmasını ve nginx yapılandırmasını içerebilir
static worker türü kullanılarak gh-pages tarzı statik siteler de dağıtılabilir
- Kök yol parametre olarak verilir
git push sonrasında sunucuda işlem yapan release görevleri de çalıştırılabilir
Sanal host, SSL, statik yollar
- Piku, sanal hostları tam olarak destekler
- Aynı VPS üzerinde birden fazla uygulama barındırılabilir
- DNS alias kullanılarak uygulamalara farklı host adlarıyla erişilebilir
- SSL'yi etkinleştirmek için özel sertifikalar ayarlayabilir veya Let's Encrypt sertifikaları alabilirsiniz
- LAN içinde macOS, iOS ve Linux istemcilerinden erişiyorsanız,
piku/avahi-aliases kullanarak aynı IP için farklı hostları Avahi/mDNS/Bonjour üzerinden duyurabilirsiniz
- Statik sitelere ek olarak belirli URL prefix'leri doğrudan dosya sistemi yollarına eşlenebilir
- Uygulama yükünü azaltmak için backend yanıtlarını önbelleğe alma desteği de vardır
- Statik yol ve önbellekleme özellikleri
ENV dosyasındaki değerlerle yapılandırılır
Desteklenen platformlar ve çalışma zamanları
- Piku, Python,
nginx, uwsgi ve SSH bulunan POSIX benzeri ortamlarda çalışacak şekilde tasarlanmıştır
- Dağıtım örnekleri arasında Linux, FreeBSD, Cygwin ve Windows Subsystem for Linux yer alır
- Geliştirme 256MB Raspberry Pi Model B üzerinde başladı ve bugün de bu donanımda kararlı biçimde çalışıyor
- Başlıca kullanım amacı, Intel ve ARM CPU'lu bulut sunucularında uygulama çalıştıran bir mikro PaaS olmaktır
- Hedef platformlar Debian ve Ubuntu Linux'tur
- Şu anda Python, Node, Clojure ve Java uygulamalarını destekler; Go gibi bazı diller üzerinde de çalışmalar sürmektedir
- Genel ilke olarak, shell üzerinden çağrılabiliyorsa Piku içinde de çalıştırılabilir
Tasarım ilkeleri
- Düşük donanımlı cihazlarda çalışmaya önem verir
- Hobi geliştiriciler ve K-12 okulları için de erişilebilir olmalıdır
- Yaklaşık 1500 satırlık okunabilir kod hedefler
- Fonksiyonel kod stilini tercih eder
- Az sayıda bağımlılık bulundurmayı amaçlar
- 12 factor app yaklaşımını izler
- Kullanıcı deneyimini basitleştirmeye önem verir
- Yaygın kullanım senaryolarının %80'ini kapsamayı hedefler
- Tüm özellikler için makul varsayılanlar sunar
- Raspbian, Debian ve Ubuntu'nun dağıtım paketlerinden yararlanır
- Alpine ve RHEL desteği üzerinde çalışılmaktadır
git, ssh, uwsgi, nginx gibi standart araçları kullanır
- Mümkün olduğunda geriye dönük uyumluluğu korur
1 yorum
Hacker News yorumları
piku’yu sevdiğim için piku için bir web uygulaması öğreticisi yazdım; bu da resmi GitHub piku organizasyonunun deposuna girdi
https://github.com/piku/webapp-tutorial?tab=readme-ov-file#b...
piku’nun içeride nasıl çalıştığını açıklıyor ve kullanıcı açısından en minimal Python web uygulaması örneğini de gösteriyor
Belgeler, piku’yu çalıştırıp kullanmak için gereken her şeyi zaten bildiğinizi varsayıyor gibi geldiği için vazgeçmiştim; bu öğretici o boşluğu dolduruyor
Ancak epey uzun aramama rağmen bu belgeyi bulamamıştım; buradaki yorum olmasaydı varlığından bile haberdar olmayacaktım
En azından piku deposunda ve belge ana sayfasında bu belgeye görünür bir bağlantı verilmeli; mümkünse belge ana sayfasına bütünüyle dahil edilmesi daha iyi olur
Daha da ileri gidip yeni bir bare-metal sunucudan herkese açık erişilebilen özel alan adı ve SSL sertifikasına kadar giden uçtan uca bir öğretici eklemek çok daha faydalı olur
piku ile doğrudan ilgili olmayan adımlar gibi görünse de yeni kullanıcıların gerçekte istediği şey, 5 dolarlık bir Droplet gibi bir yere kendi sitelerini koymak; aradaki adımları çoğu zaman henüz bilmiyorlar
Hangi yöntemin seçildiği önemli değil; yöntemi tartışacak kişiler zaten kendi tercih ettikleri yolu biliyordur
Referans olarak Coolify tarafındaki uçtan uca örnek burada: https://billyle.dev/posts/self-hosting-your-website-with-coo...
Amaç bunu işlevsel olarak mümkün kılmak değil, daha fazla kişinin kolayca başlamasını sağlayarak piku benimsenme oranını ciddi biçimde artırmak
Heroku’nun ne olduğunu, ne yaptığını hiç bilmiyordum
Doğru anladıysam piku’nun yapısı, uzak makineye bir ajan kurmak ve yerel makineye commit hook’ları kurmak şeklinde mi?
Uzak makineyi doğrudan bir Git uzak deposu yapıp, belirli bir branch’e push edildiğinde tüm işleri uzakta yaptırarak ek yük azaltılamaz mıydı diye düşündüm
Güzel görünüyor ve Dokku da benim için çok kararlıydı; ancak Docker bağımlılığını kaldırınca artık işletim sisteminin sunduğu seçeneklere bağlı kalıyorsunuz
Yıllarca bakım görmeden çalışabilecek uygulamalar için ideal değil; sonunda belirli bir işletim sistemi sürümüne ihtiyaç duyduğunuz gerçeğiyle kısa sürede karşılaşıyorsunuz
Küçük yan projeleri VPS’e koymak için Dokku kurulumumu 3-4 Ubuntu LTS yükseltmesi boyunca güncelledim; sorunsuz şekilde iyi çalıştı
docker runifadeleri koyduğum birkaç şey var; tabii bu kullanım için tasarlanmış değilGördüğüm dağıtımların çoğu çok kararlı dağıtımlarda, genellikle LTS sürümlerinde çalışıyordu; bu yüzden runtime’ı 6 ayda bir yükseltmek gerekmiyordu. Benim web sitem de Ubuntu LTS iki kezden fazla değişirken piku üzerinde çalışmaya devam etti
Ortam değişkenlerini ayarlayınca
pyenv,nvenvgibi şeyler de kolayca kullanılabiliyorEv otomasyon sisteminin artık iki farklı Node sürümüne ihtiyacı var; her uygulama için birer tane yapılandırdım
“Sadece çalışır” yaklaşımı zarif ve Docker’ın teknik ve zihinsel ek yük nedeniyle her yerde kullanılamayacağını da anlıyorum; ama container’ların her şeyi izole edip zamanı durmuş gibi sabitleyebilmesi, 5 yıl sonra bile “sadece çalışır” halde kalmasını sağlaması hoşuma gidiyor
Benim küçük workflow’umda container yönetimini lazydocker, push ile dağıtımı GitLab workflow’u, build ile GitLab registry’ye push’u ve çalıştırmayı da küçük bir VPS hallediyor
Biraz fazla kaçıyor;
Dockerfilevecompose.yml,docker compose buildkombinasyonuyla da mümkün gibiÖlçeklemeyi henüz netleştirmedim ama şu an gerekmediği için şanslıyım; gerekirse Docker yerine k8s, lazydocker yerine k9s’ye geçerim gibi geliyor
DevOps’a yeni girdim; önerilere her zaman açığım
Sihirli soyutlama daha az olduğu için bana Dokku’dan daha iyi geliyor
git pushile dağıtımla doğrudan ilgili değil ama PaaS deneyimiyle yakından bağlantılı olarak, içinde bulunduğum ekip CNCF’nin açık spesifikasyonu olan Cloud Native Buildpacks(CNB) için önizleme yapıyorBunlar OCI’yi hedefleyen Buildpacks; yani Heroku’nun
git pushmantığı gibi dil desteğini algılayıp uygun şekilde işleyen bir build aracıyla yerelde Docker image’ları oluşturabileceğiniz anlamına geliyorYönettiğim buildpack ile bir Rails uygulaması build etmeye yönelik öğretici burada: https://www.schneems.com/2024/05/01/build-a-ruby-on-rails-ap...
Denerseniz iyi, kötü ya da kayıtsız fark etmeksizin, bağlantılı tartışmaya deneyiminizi bırakmanız iyileştirmeye yardımcı olur
piku’yu ilk kez gördüm
Nedenini bilmiyorum ama piku gibi
git pushile dağıtımın başlaması hissi bana hep sihir gibi gelmiştir; bundan daha basiti olamaz diye düşünüyorumTesadüfen dün aynı alandaki Kubernetes projemi açık kaynak olarak yayımladım, burada: https://github.com/pier-oliviert/sequencer
Her neyse, tebrikler; iyi görünüyor
Sunucuda
git init --bareile bir Git deposu oluşturupgit config receive.denyCurrentBranch updateInsteadayarını yapmanız yeterliArdından Git hook’larıyla, daha özel olarak push-to-checkout hook’u ile yüklemeyi alabilir, derleyebilir ve çalıştırabilirsiniz
Hook basit bir shell script’tir; en temel hâli
compile && install && systemctl restart servicegibi bir varyasyon olabilirSonrasında depoyu yerelde klonlarsanız, değişiklikleri push ettiğinizde ayarladığınız hook çalışır
git clone root@yourserver.com:/path/to/git/folderAçıklamaya göre
git pushdağıtımı değil de Kubernetes şablonları vekubectlile uğraşıyor gibi; bu durumda tamamen farklı bir alandaki proje gibi görünüyorYenilenmiş piku belgelerini burada görebilirsiniz: https://piku.github.io/
İlk commit 8 yıl önce miydi?
Keşke bu projeden yaklaşık 18 ay önce haberim olsaydı; Raspberry Pi’ye Heroku benzeri bir geliştirme deneyimiyle dağıtım yapmanın yolunu arıyordum ve piku tam olarak bunu hedefliyor gibi görünüyor
Az önce CapRover ile yeni bir VPS kurdum; “Heroku tarzı self-hosted PaaS” karşılaştırmalarını yaklaşık bir saat ararken Dokku, CapRover, Coolify, Dokploy gördüm ama piku’yu hiç görmedim
Bakımcısı ve ortak yazarıyım
Basit ve minimal dağıtım araçlarını seviyorsanız, cloud-init’i çok daha gerçekçi ele alan https://github.com/rcarmo/ground-init’e de bakarsanız sevinirim
Kesintisiz dağıtımı nasıl ele aldığına dair bir yöntem olup olmadığını merak ediyorum
Örneğin bir Python servisi tek bir makinede 8080 portunda nginx arkasında çalışıyorsa, piku aynı portta yeni instance’a nasıl geçiyor?
git pushdağıtımı bittikten sonra çalışan süreci sonlandırıyorSoket ve oturum yönetimi, kodun nasıl yazıldığına,
uwsgikullanıp kullanmadığına ya da doğrudan HTTP daemon’u çalıştırıp çalıştırmadığına bağlıHalihazırda isteğe bağlı desteklenen özelliklerden biri, kullanılmayan ve boşta olan instance’ları sonlandırmak ve yeni bağlantı geldiğinde gecikmeli başlatmak
Aynı işi Kubernetes üzerinde yapan Epinio’yu seviyorum
SUSE tarafından destekleniyor; örneğin GCP Cloud Run’ın temeli olan KNative’den daha hafif, ama Kubernetes tabanlı olduğu için Dokku veya piku’ya kıyasla hâlâ daha fazla kaynağa ihtiyaç duyuyor
Yine de olgun çözüm ekosistemi geniş olduğu için k8s’i daha çok tercih ediyorum
Tek bir sunucuda da hepsi çalıştırılabilir; sadece biraz daha büyük bir sunucu gerekir
Yeni Hetzner CX42; 8 vCPU, 16 GB RAM, 160 GB disk ile aylık €16.40, saatlik €0.0273; bu yeterli ve Kube Hetzner projesini kullanırsanız otomatik güncellenen MicroOS tabanlı bir Kubernetes cluster’ını 5 dakika içinde kurabilirsiniz
https://github.com/epinio/epinio/
https://github.com/kube-hetzner/terraform-hcloud-kube-hetzne...
piku’nun özünün Docker olmadan Heroku benzeri bir deneyim sunmak, mimarisinin gerçekten basit olması ve ARM’de de çalışması olduğunu düşünüyorum
Kubernetes’in ARM’de çalıştığını kabul ediyorum ama bildiğim kadarıyla Kubernetes, Docker olsun ya da başka bir şey, bir tür container gerektiriyor; mimarisi de bariz nedenlerle asla basit değil
Ayrıca Epinio’nun
git pushakışını mümkün kılıp kılmadığından da emin değilimHızlı başlangıç öğreticisi, uygulama dağıtımı için
epinio push manifest.yamlgibi bir komut kullanılmasını söylüyor gibi; bu da “Heroku benzeri deneyim”e uymuyorSonuçta ortak noktaları sadece dağıtımı ele almaları gibi geliyor
Minimal yaklaşımı hoşuma gitti, denemeyi planlıyorum
Benzer şekilde bakılabilecek başka şeyler de var
https://kamal-deploy.org/
https://github.com/basecamp/kamal
https://dokku.com/
https://github.com/dokku/dokku/
https://clace.io/
https://github.com/claceio/clace