- Piku Dokku से प्रेरित एक टूल है, जो छोटे self-hosted servers पर भी
git push तरीके से applications deploy करने देता है
- यह Heroku/CloudFoundry जैसे flow का लक्ष्य रखता है, लेकिन उस समय ARM पर Dokku काम नहीं करता था और Docker भी कभी-कभी ज़रूरत से ज़्यादा भारी हो सकता था, इसलिए इसका उद्देश्य एक सरल deployment तरीका था
- Deployment के दौरान यह runtime पहचानता है, dependencies install करता है, फिर
Procfile पढ़कर uwsgi से workers चलाता है; इसमें Python·Node·Java·Clojure·Ruby·Go से जुड़ी handling शामिल है
- एक ही host पर कई apps को स्वतंत्र रूप से deploy, manage और scale किया जा सकता है, और यह virtual hosts, SSL, static sites, URL path mapping, और backend response caching को support करता है
- इसके लिए Python 3.10 या उससे ऊपर, और Python·
nginx·uwsgi·SSH चाहिए; यह एक stable project है जिसका लक्ष्य Debian और Ubuntu LTS के नवीनतम दो major versions को support करना है
Piku कौन-सी समस्या हल करता है
- Piku एक ऐसा tool है जो अपने server पर
git push deployment करने देता है
- यह Dokku से प्रेरित है, और बहुत छोटे servers पर भी काम करने को लक्ष्य बनाता है
- कुछ ARM boards पर Heroku/CloudFoundry जैसा deployment experience इस्तेमाल करना था, लेकिन उस समय Dokku ARM पर काम नहीं करता था और Docker भी कभी-कभी overkill होता था, इसलिए एक अधिक सरल समाधान की जरूरत थी
- अभी यह ARM और Intel दोनों architectures पर, प्रति host कई applications को deploy, manage और स्वतंत्र रूप से scale कर सकता है
- यह उन cloud providers और bare-metal environments में काम करता है जहाँ Python,
nginx, uwsgi चलाए जा सकते हैं
Installation और project status
- Basic installation नीचे दिए command से संभव है
curl https://piku.github.io/get | sh
- Installation docs में
cloud-init और manual installation सहित अन्य installation methods भी हैं
- Project को STABLE स्थिति में माना जाता है
- Feature set लगभग पूरा हो चुका है
- नया language runtime जुड़ने या reproduce किए जा सकने वाले bugs आने पर update होता है
- फिलहाल Python 3.10 या उससे ऊपर चाहिए, और tests भी Python 3.10 या उससे ऊपर पर target किए गए हैं
- Support का लक्ष्य Debian और Ubuntu LTS के नवीनतम दो major versions हैं
Git Push आधारित workflow
- Piku Heroku जैसा workflow support करता है
- App name को repository name के रूप में इस्तेमाल करके, Piku server की ओर point करने वाला Git SSH remote बनाते हैं
git remote add piku piku@yourserver:appname
- Code push करके deploy करते हैं
git push piku master
- Current branch के अलावा किसी और branch को push करना हो, तो ऐसे use करें
git push piku release-branch-name
- Deployment process में Piku runtime पहचानता है, जरूरी dependencies install करता है, और जरूरी build भी perform करता है
- Python apps dependencies को app-specific virtualenv से isolate करते हैं
- Go apps के लिए app-specific
GOPATH अलग से define करता है
- Node apps
package.json में मौजूद items को node_modules में install करते हैं
- Java apps
pom.xml या build.gradle के अनुसार build करते हैं
- Clojure apps
leiningen या Clojure CLI और deps.edn file इस्तेमाल कर सकते हैं
- Ruby apps isolated folder में gems को
bundle install करते हैं
Execution model और configuration
- Piku
Procfile पढ़ता है और संबंधित workers को uwsgi के जरिए चलाता है
uwsgi को general-purpose process manager के रूप में इस्तेमाल किया जाता है
- वैकल्पिक रूप से
release worker specify किया जा सकता है, जो app deploy होने पर एक बार चलता है
- Remote से application settings बदल सकते हैं या worker processes बढ़ा-घटा सकते हैं
config:set से application settings बदलते हैं
ps:scale से worker processes scale करते हैं
ENV file में application settings और nginx settings शामिल की जा सकती हैं
static worker type इस्तेमाल करने पर gh-pages style static sites भी deploy किए जा सकते हैं
- Argument के रूप में root path specify करते हैं
git push के बाद server पर processing करने वाला release task भी चलाया जा सकता है
Virtual hosts, SSL, static paths
- Piku virtual hosts को पूरी तरह support करता है
- एक ही VPS पर कई apps host किए जा सकते हैं
- DNS alias इस्तेमाल करके अलग-अलग hostnames से apps access किए जा सकते हैं
- SSL enable करने के लिए private certificate configure किया जा सकता है या Let's Encrypt certificate लिया जा सकता है
- अगर LAN में macOS, iOS, Linux clients से access कर रहे हैं, तो
piku/avahi-aliases इस्तेमाल करके एक ही IP के लिए अलग-अलग hosts को Avahi/mDNS/Bonjour से announce किया जा सकता है
- Static sites के अलावा, किसी खास URL prefix को सीधे filesystem path से map किया जा सकता है
- Backend responses को cache करके application load कम करने की functionality भी support करता है
- Static paths और caching functionality
ENV file के values से configure होती है
Supported platforms और runtimes
- Piku को Python,
nginx, uwsgi, SSH वाले POSIX-like environment में काम करने के लिए design किया गया है
- Deployment examples में Linux, FreeBSD, Cygwin, Windows Subsystem for Linux शामिल हैं
- Development 256MB Raspberry Pi Model B पर शुरू हुआ था, और आज भी उस device पर stable रूप से चलता है
- मुख्य use case Intel और ARM CPU वाले cloud servers पर apps चलाने वाला micro PaaS है
- Target platform Debian और Ubuntu Linux हैं
- फिलहाल Python, Node, Clojure, Java apps support करता है, और Go जैसी कुछ languages पर भी काम चल रहा है
- सामान्य सिद्धांत के तौर पर, अगर shell से call किया जा सकता है तो Piku के अंदर चलाया जा सकता है
Design principles
- Low-spec devices पर चलने को महत्व देता है
- Hobby developers और K-12 schools के लिए भी accessible होना चाहिए
- लगभग 1500 lines के readable code का लक्ष्य रखता है
- Functional code style को prefer करता है
- Dependencies कम रखने का लक्ष्य है
- 12 factor app का पालन करता है
- User experience को सरल बनाने पर जोर देता है
- Common use cases के 80% को cover करने का लक्ष्य रखता है
- हर feature के लिए reasonable defaults देता है
- Raspbian, Debian, Ubuntu के distribution packages का उपयोग करता है
- Alpine और RHEL support पर काम चल रहा है
git, ssh, uwsgi, nginx जैसे standard tools का उपयोग करता है
- जहाँ संभव हो, backward compatibility बनाए रखता है
1 टिप्पणियां
Hacker News की राय
मुझे piku पसंद है, इसलिए मैंने piku के लिए एक webapp tutorial लिखा, और वह आधिकारिक GitHub piku organization के repository में शामिल हो गया
https://github.com/piku/webapp-tutorial?tab=readme-ov-file#b...
यह अंदरूनी तौर पर piku कैसे काम करता है, यह समझाता है, और user के नज़रिए से एक न्यूनतम Python webapp उदाहरण भी दिखाता है
ऐसा लगा जैसे documentation यह मानकर चल रहा हो कि piku चलाने और इस्तेमाल करने के लिए जो कुछ चाहिए, वह सब पहले से पता है, इसलिए मैंने छोड़ दिया था; लेकिन इस tutorial ने वह कमी पूरी कर दी
फिर भी, काफी देर तक खोजने के बाद भी मुझे यह दस्तावेज़ नहीं मिला, और अगर यहाँ यह comment न होता तो मुझे इसके अस्तित्व का पता ही नहीं चलता
कम-से-कम piku repository और documentation home से इस दस्तावेज़ का साफ़ तौर पर link होना चाहिए, और संभव हो तो इसे documentation home में पूरी तरह शामिल करना चाहिए
इससे भी आगे, अगर एक end-to-end tutorial जोड़ दिया जाए जो नए bare-metal server से public access वाले custom domain और SSL certificate तक ले जाए, तो यह कहीं ज़्यादा मददगार होगा
भले ही यह piku से सीधे जुड़े हुए कदम न लगें, नए users असल में चाहते यही हैं कि वे $5 वाले Droplet जैसी किसी जगह पर अपनी site डाल सकें, और अक्सर उन्हें बीच के steps अभी नहीं पता होते
कौन-सा तरीका चुना जाता है, इससे फ़र्क नहीं पड़ता, और जो लोग तरीकों पर बहस करेंगे उन्हें आम तौर पर पहले से पता होता है कि उनकी पसंद क्या है
संदर्भ के लिए, Coolify की end-to-end example यहाँ है: https://billyle.dev/posts/self-hosting-your-website-with-coo...
लक्ष्य सिर्फ़ इसे functionally possible बनाना नहीं है, बल्कि ज़्यादा लोगों के लिए शुरुआत को आसान बनाकर piku adoption को काफ़ी बढ़ाना है
मुझे Heroku क्या है और वह क्या करता है, इसका बिल्कुल पता नहीं था
अगर मैंने सही समझा है, तो piku का ढाँचा ऐसा है कि remote machine पर agent install किया जाता है, और local machine पर commit hook install होता है?
क्या overhead कम करने के लिए remote machine को सीधे Git remote repository बनाकर, किसी खास branch पर push होने पर remote side पर ही सारा काम नहीं कराया जा सकता था?
यह अच्छा लगता है, और Dokku भी मेरे लिए बहुत stable रहा है, लेकिन Docker dependency हटाने का मतलब है कि अब आप operating system द्वारा दिए गए options तक सीमित हो जाते हैं
यह उन apps के लिए आदर्श नहीं है जो कई सालों तक बिना maintenance के चल सकते हैं, और जल्दी ही आप इस बात से टकराते हैं कि आखिरकार एक खास operating system version चाहिए
VPS पर छोटे side projects डालने के लिए मैंने Dokku install को Ubuntu LTS के 3~4 upgrades के दौरान चलाया, और यह बिना किसी समस्या के ठीक काम करता रहा
docker runstatements वाले कुछ setups हैं, हालाँकि यह उसके लिए design नहीं किया गया थामैंने ज़्यादातर deployments बहुत stable distributions पर देखे हैं, आम तौर पर LTS versions पर, इसलिए runtime को हर 6 महीने में upgrade करने की ज़रूरत नहीं पड़ी, और मेरी website भी Ubuntu LTS के दो से अधिक बदलावों के दौरान piku पर चलती रही
सिर्फ़ environment variables सेट करके
pyenv,nvenvजैसी चीज़ें भी आसानी से इस्तेमाल की जा सकती हैंमेरे home automation system को अब दो अलग-अलग Node versions चाहिए, और मैंने app के हिसाब से एक-एक सेट कर रखा है
“बस काम करता है” वाला रवैया elegant है, और मैं यह भी समझता हूँ कि Docker को उसके technical और mental overhead की वजह से हर जगह इस्तेमाल नहीं किया जा सकता, लेकिन containers की अच्छी बात यह है कि वे सब कुछ isolate कर देते हैं और समय को जैसे freeze कर देते हैं, ताकि 5 साल बाद भी चीज़ें “बस चलें”
मेरे छोटे workflow में container management के लिए lazydocker, push deployment के लिए GitLab workflow, और build के साथ GitLab registry पर push और run के लिए एक छोटा VPS इस्तेमाल होता है
यह थोड़ा overkill है, इसलिए शायद
Dockerfileऔरcompose.yml,docker compose buildके combination से भी काम चल सकता हैमैंने अभी scaling को अच्छी तरह नहीं सुलझाया है, लेकिन फिलहाल उसकी ज़रूरत नहीं है, जो राहत की बात है; और जब ज़रूरत पड़ेगी तो शायद Docker की जगह k8s और lazydocker की जगह k9s इस्तेमाल करूँगा
मैं अभी DevOps में नया हूँ, इसलिए सुझाव हमेशा स्वागतयोग्य हैं
इसमें जादुई abstraction कम हैं, इसलिए यह मेरे लिए Dokku से बेहतर है
यह
git pushdeployment से सीधे जुड़ा नहीं है, लेकिन PaaS experience से काफ़ी जुड़ा हुआ है: मेरी टीम Cloud Native Buildpacks(CNB), जो CNCF की एक open spec है, का preview कर रही हैयह OCI को target करने वाले Buildpacks हैं, और इसका मतलब है कि Heroku के
git pushlogic की तरह language support detect करके उसी हिसाब से handle करने वाले build tools से local में Docker image बनाई जा सकती हैजिस buildpack को मैं maintain करता हूँ, उससे Rails app build करने का tutorial यहाँ है: https://www.schneems.com/2024/05/01/build-a-ruby-on-rails-ap...
अगर आप इसे आज़माएँ, तो अच्छा, बुरा या बिल्कुल तटस्थ—किसी भी तरह का अनुभव linked discussion में छोड़ें, इससे इसे बेहतर बनाने में मदद मिलेगी
piku को पहली बार देखा
पता नहीं क्यों, लेकिन piku की तरह
git pushसे deployment शुरू होने का एहसास हमेशा जादू जैसा लगा, और लगा कि इससे ज़्यादा सरल कुछ हो ही नहीं सकतासंयोग से मैंने कल ही इसी क्षेत्र के Kubernetes प्रोजेक्ट को open source के रूप में जारी किया है, यहाँ है: https://github.com/pier-oliviert/sequencer
खैर, बधाई हो, अच्छा लग रहा है
सर्वर पर
git init --bareसे Git repository बनाइए औरgit config receive.denyCurrentBranch updateInsteadसेट कीजिएउसके बाद Git hook, और अधिक सटीक रूप से push-to-checkout hook, के जरिए upload लेना, compile करना और run करना संभव है
hook एक साधारण shell script होती है, और उसका सबसे बुनियादी रूप
compile && install && systemctl restart serviceजैसी किसी variant का हो सकता हैइसके बाद local में repository clone कर लें, फिर जब भी changes push करेंगे तो सेट किया गया hook चल जाएगा
git clone root@yourserver.com:/path/to/git/folderविवरण से तो यह
git pushdeployment नहीं बल्कि Kubernetes templates औरkubectlको संभालने वाली चीज़ लगती है, तो फिर यह पूरी तरह अलग क्षेत्र का प्रोजेक्ट दिखता हैpiku के नए रूप में तैयार किए गए docs यहाँ देखे जा सकते हैं: https://piku.github.io/
initial commit 8 साल पहले था?
काश मुझे यह प्रोजेक्ट लगभग 18 महीने पहले पता चला होता; मैं Raspberry Pi पर Heroku जैसी developer experience के साथ deploy करने का तरीका ढूंढ रहा था, और piku ठीक उसी लक्ष्य के लिए बना हुआ लगता है
मैंने अभी CapRover के साथ एक नया VPS सेट किया, और “Heroku-style self-hosted PaaS” की तुलना करीब एक घंटे तक खोजते हुए Dokku, CapRover, Coolify, Dokploy तो दिखे, लेकिन piku बिल्कुल नहीं दिखा
मैं maintainer और co-author हूँ
अगर आपको सरल और minimal deployment tools पसंद हैं, तो cloud-init को कहीं ज़्यादा व्यावहारिक तरीके से संभालने वाला https://github.com/rcarmo/ground-init भी देखिए
यह जानना दिलचस्प होगा कि क्या zero-downtime deployment को संभालने का कोई तरीका है
उदाहरण के लिए, अगर कोई Python service एक मशीन पर nginx के पीछे port 8080 पर चल रही हो, तो piku उसी port पर नई instance पर switch कैसे करेगा?
git pushdeployment पूरा होने के बाद ही चल रहे process को बंद किया जाता हैsocket और session handling इस पर निर्भर करती है कि code कैसे लिखा गया है,
uwsgiइस्तेमाल हो रहा है या सीधे कोई HTTP daemon चल रहा हैजिन features को पहले से वैकल्पिक रूप से support किया जाता है, उनमें से एक यह है कि unused instances और idle instances को बंद कर दिया जाए, और नई connection आने पर delay के साथ start किया जाए
मुझे Kubernetes पर यही काम करने वाला Epinio पसंद है
इसे SUSE support करता है, और उदाहरण के लिए GCP Cloud Run की बुनियाद KNative से हल्का है, लेकिन Kubernetes आधारित होने के कारण Dokku या piku की तुलना में फिर भी ज़्यादा resources चाहिए
फिर भी, mature solution ecosystem व्यापक है, इसलिए मैं k8s को ज़्यादा पसंद करता हूँ
यह सब एक single server पर भी चल सकता है, बस थोड़ा बड़ा server चाहिए
नया Hetzner CX42, 8 vCPU, RAM 16GB, disk 160GB के साथ €16.40 प्रति माह और €0.0273 प्रति घंटा है, जो पर्याप्त है, और Kube Hetzner project का उपयोग करें तो auto-updating MicroOS आधारित Kubernetes cluster को 5 मिनट के भीतर सेट किया जा सकता है
https://github.com/epinio/epinio/
https://github.com/kube-hetzner/terraform-hcloud-kube-hetzne...
piku की मूल बात यह लगती है कि वह Docker के बिना Heroku जैसी experience देता है, architecture सचमुच बहुत सरल है, और ARM पर भी चलता है
मैं मानता हूँ कि Kubernetes ARM पर चलता है, लेकिन जहाँ तक मुझे पता है, Kubernetes को Docker हो या कुछ और, किसी न किसी रूप में container चाहिए, और architecture भी स्पष्ट कारणों से कभी सरल नहीं होता
ऊपर से, मुझे यह भी नहीं पता कि Epinio
git pushflow को संभव बनाता है या नहींquick-start tutorial में application deploy करने के लिए
epinio push manifest.yamlजैसी command इस्तेमाल करने को कहा गया लगता है, इसलिए यह “Heroku जैसी experience” से भी मेल नहीं खाताआखिरकार, क्या दोनों में समानता बस इतनी ही नहीं है कि वे deployment संभालते हैं?
मुझे इसका minimal approach पसंद आया, इसलिए इसे आज़माने वाला हूँ
इसी तरह देखने लायक कुछ और चीज़ें भी हैं
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