Bir uygulama Heroku’ya nasıl dağıtılır?
Bu eğitim, Python tabanlı bir uygulamanın Heroku’ya dağıtım sürecini kapsamaktadır. Bu makaleyi okuyarak, Heroku’nun temel işlevlerini, Heroku’nun uygulama dağıtım sürecini ve bir uygulamanın Heroku’ya nasıl dağıtılacağını anlayabilirsiniz.
Bunun da ötesinde, aynı uygulamayı Heroku’ya harika bir ücretsiz alternatif olan Back4app Containers’a dağıtmak için talimatlar sağlar.
Contents
Hedefler
Bu eğitimin sonunda şunları yapabileceksiniz:
- Heroku’yu ve işlevselliğini anlama
- Uygulamalarınızı Heroku’ya dağıtın
- Back4app Konteynerlerini ve özelliklerini kavrayın
- Uygulamalarınızı Back4app Containers’a dağıtın
- Uygulamanız için hangi hizmeti kullanacağınızı belirleyin
Heroku nedir?
2007’de kurulan Heroku, en güvenilir Hizmet Olarak Platform (PaaS) platformlarından biridir. Bulut platformu, uygulamaları kolayca oluşturmanıza, yönetmenize, dağıtmanıza ve ölçeklendirmenize olanak tanır.
Ruby, Python, Java, Clojure, Node, Scala, Go ve PHP’yi yerel olarak destekler. Bununla birlikte, Docker aracılığıyla diğer programlama dillerini ve çerçevelerini dağıtmanıza olanak tanır.
Heroku’nun başlıca avantajları arasında kullanım kolaylığı, ölçeklendirme yetenekleri, güvenlik özellikleri, eklentiler, Heroku CLI ve geliştirici merkezli olması sayılabilir.
Öte yandan, Heroku genellikle pahalı olması, yetersiz bölgesel desteğe sahip olması ve en son geliştirme trendlerinin gerisinde kalması nedeniyle eleştirilmektedir.
Heroku’nun bu kadar popüler olmasının ana nedenlerinden biri, geçmişte ücretsiz hizmetler sunmasıdır. Kasım 2022’ye kadar, uygulamalarınızı ve hatta veritabanlarınızı tamamen ücretsiz olarak barındırmak için Heroku’yu kullanabilirsiniz.
Ne yazık ki, dolandırıcılık ve ücretsiz katmanın kötüye kullanılmasıyla mücadele etmek için bu ücretsiz hizmetleri iptal etmeye karar verdiler. Son değişikliklere rağmen, Heroku en popüler barındırma platformlarından biri olmaya devam ediyor. Heroku’ya nasıl dağıtım yapılacağını öğrenmek için okumaya devam edin.
Heroku hakkında daha fazla bilgi edinmek için Heroku Nedir adlı diğer makalemize göz atın.
Proje Kurulumu
Uygulamaların Heroku ve Back4app Containers‘a nasıl dağıtılacağını göstermek için, bir Python uygulamasının Heroku’ya nasıl dağıtılacağını anlatan basit bir web uygulaması hazırladım. Web uygulaması FastAPI çerçevesini kullanıyor ve basit bir URL kısaltıcı hizmeti olarak hizmet veriyor. İki uç nokta ile birlikte gelir:
/shorten
long_url
öğesine bir takmaad
atar/<alias>
kullanıcıyı ilgililong_url
öğesine yönlendirir
Kendi projenizle birlikte takip ederek anlayışınızı test etmekten çekinmeyin.
Ön Koşullar
- Python ve Git hakkında temel bilgi
- Python 3.9+ yerel makinenizde yüklü
- Git Bash ve Docker Desktop yüklü ve yapılandırılmış
- Kişisel bir GitHub hesabı
Klonla ve Çalıştır
Heroku dağıtımı, GitHub’daki bu depoyu çatallayarak ve ardından çatalı yerel makinenize klonlayarak başlar:
$ git clone <fork_remote_git_url>
$ cd back4app-heroku-deploy
Çatallamak istemiyorsanız, kendi deponuzu oluşturabilir ve kaynak kodunu buraya gönderebilirsiniz.
Sanal bir ortam oluşturun ve etkinleştirin:
$ python -m venv env && source env/bin/activate
Ardından, proje gereksinimlerini yükleyin:
(env)$ pip install -r requirements.txt
Son olarak, geliştirme sunucusunu başlatın:
(env)$ python -m uvicorn main:app --reload
INFO: Will watch for changes in these directories: [...]
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [1488] using WatchFiles
INFO: Started server process [2316]
INFO: Application startup complete.
Favori web tarayıcınızı açın ve http://localhost:8000/docs adresine gidin. Web uygulamasını test etmek için etkileşimli belgeleri kullanın. İstekleri biçimlendirmek için yardıma ihtiyacınız varsa test_main.http dosyasına göz atın.
Bir uygulama Heroku’ya nasıl dağıtılır?
Bu bölümde, Heroku’ya bir uygulama dağıtacağız.
Aşağıdaki adımlar bir Heroku hesabı gerektirecektir. Henüz bir hesabınız yoksa, devam edin ve kaydolun. Bunun da ötesinde, Heroku hesabınıza ödeme bilgilerini eklediğinizden emin olun.
Uygulamanızı eğitimden hemen sonra silerseniz, herhangi bir ücret ödemezsiniz.
Heroku
adında yeni bir şubeye geçin:
$ git checkout -b heroku
Hedefler
- Heroku CLI’yi yükleyin.
- Bir Heroku uygulaması oluşturun.
- Çalışma zamanını runtime.txt aracılığıyla belirtin.
- Procfile aracılığıyla uygulama süreçlerini belirtin.
- Kaynak kodunu Heroku’ya aktarın.
Heroku CLI
Heroku ile etkileşim kurmanın birden fazla yolu vardır. Kontrol panelini, Heroku CLI‘yi veya Heroku API‘yi kullanabilirsiniz.
Ben Heroku CLI’yi tercih ediyorum çünkü işlerinizi hızlı bir şekilde yapmanızı sağlayan güçlü bir araç. Eğitim boyunca bunu kullanacağız.
İlk olarak, resmi kurulum talimatlarını takip ederek Heroku CLI’yi kurun.
Bundan sonra, CLI sürümünü kontrol ederek kurulumun başarılı olduğundan emin olun:
$ heroku --version
heroku/8.4.2 win32-x64 node-v16.19.0
Ardından, CLI güncellemelerini kontrol edin ve Heroku hesabınızı kullanarak kimlik doğrulaması yapın:
$ heroku update
$ heroku login
İkinci komutu çalıştırırken bir tarayıcı penceresi açılacaktır. Kimliğinizi doğrulamak için “Oturum aç “a tıklayın ve tarayıcı penceresini kapatın.
Heroku Uygulaması Oluşturma
Heroku’ya dağıtmak için öncelikle bir Heroku uygulaması oluşturmanız gerekir.
Terminali bir kez daha açın, yerel projenize gidin (örneğin, back4app-heroku-deploy klasörü) ve aşağıdaki komutu çalıştırın:
$ heroku create -a <app_name>
Creating ⬢ <app_name>... !
https://<app_name>-31a6fd70e769.herokuapp.com/ |
https://git.heroku.com/<app_name>.git
Değiştirdiğinizden emin olun <app_name> ile istediğiniz uygulama adını girin.
Ardından, uygulamaları listeleyerek uygulamanın başarıyla oluşturulup oluşturulmadığını kontrol edin:
$ heroku apps
=== <email_address> Apps
<app_name>
Ardından uygulamanın ayrıntılarını kontrol edin:
$ heroku apps:info <app_name>
=== <app_name>
Auto Cert Mgmt: false
Dynos:
Git URL: https://git.heroku.com/<app_name>.git
Owner: <email_address>
Region: us
Repo Size: 0 B
Slug Size: 0 B
Stack: heroku-22
Web URL: https://<app_name>-21de155883d3.herokuapp.com/
Bildiğiniz gibi, Heroku Git ile sıkı bir şekilde entegre edilmiştir. Bir Heroku uygulaması oluşturduğunuzda, kaynak kodunuzu dağıtmak için gönderebileceğiniz uzak bir Git deposu oluşturulur. Bizim durumumuzda, uzak Git URL’si şöyledir:
https://git.heroku.com/<app_name>.git
Heroku CLI, bir uygulama oluşturduğunuzda otomatik olarak bir Git uzaktan kumandası kaydeder. Uzaktan kumandaları listelemeyi deneyin:
$ git remote -v
heroku https://git.heroku.com/back4app-url-shortener.git (fetch)
heroku https://git.heroku.com/back4app-url-shortener.git (push)
origin [email protected]:duplxey/back4app-heroku-deploy.git (fetch)
origin [email protected]:duplxey/back4app-heroku-deploy.git (push)
Kaynak kodumuzu dağıtmak için bir sonraki bölümde heroku
remote’u kullanacağız.
runtime.txt
Bir runtime.txt dosyası, Heroku’nun kullanmasını istediğiniz Python sürümünü tam olarak belirtmenize olanak tanır. Projenizin çalışması için belirli bir Python sürümü gerekiyorsa bu önemlidir. Yazma sırasında, varsayılan olarak python-3.11.5
‘tir.
Çalışma zamanını belirtmek için, çalışma zamanı sürümünü içeren bir runtime.txt dosyası oluşturun. Örnek:
python-3.11.5
Desteklenen Python çalışma zamanlarının listesi için Heroku Python Desteği‘ne göz atın.
Procfile
Bir Procfile, uygulamanın işlemlerini başlatmak için yürütülmesi gereken komutları tanımlamanıza olanak tanır. Uvicorn web sunucusunu başlatmak için bir Procfile kullanacağız.
Proje kök dizininde web
süreci ile birlikte bir Procfile oluşturun:
web: gunicorn -w 1 -k uvicorn.workers.UvicornWorker main:app
Üretim uygulamalarında, muhtemelen bir yerine birden fazla işçi oluşturmak isteyeceksiniz. Bir veritabanı uygulamamızı desteklemediği için (bellek içi veri kullanır), verileri birden fazla çalışan süreç arasında senkronize edemeyiz. Bu nedenle tek bir işçi kullanmak zorundayız.
Değişiklikleri GitHub deponuza gönderin:
$ git add .
$ git commit -m "configured app for heroku"
$ git push origin heroku
Heroku Uygulamasını Dağıtma
Heroku, uygulamaları dyno’larda çalıştırılabilecek birimlere dönüştürmek için buildpack adı verilen paketleri kullanır. Bir buildpack, belirli bir programlama dili için özel bir dizi komut dosyasıdır.
Kodunuzu Heroku’ya gönderirken, Heroku projenizin programlama dilini ve onu derlemek için gereken yapı paketini otomatik olarak algılar. Python söz konusu olduğunda, bir requirements.txt dosyasının mevcut olup olmadığını kontrol eder.
Uygulamanızı dağıtmak için tek yapmanız gereken kodu heroku
remote’a göndermektir:
$ git push heroku heroku:main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Updated five paths from 30a4ffb
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Using buildpack: heroku/python
remote: -----> Python app detected
remote: -----> Requirements file has been changed, clearing cached dependencies
remote: -----> Installing python-3.11.5
remote: -----> Installing pip 23.2.1, setuptools 68.0.0 and wheel 0.41.0
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 30.6M
remote: -----> Launching...
remote: Released v5
remote: https://<app_name>-31a6fd70e769.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
Heroku otomatik olarak uygun bir yapı komut dosyası seçti, gereksinimleri yükledi ve uygulamayı bir dyno’ya dağıttı.
Dağıtımınızın başarısız olması durumunda, günlükleri görüntülemek için Heroku CLI’yı kullanın:
$ heroku logs --tail
Ardından, uygulamanızın durumunu kontrol edin:
$ heroku apps:info <app_name>
=== <app_name>
Auto Cert Mgmt: false
Dynos: web: 1
Git URL: https://git.heroku.com/<app_name>.git
Owner: <your_email>
Region: us
Repo Size: 9 KB
Slug Size: 31 MB
Stack: heroku-22
Web URL: https://<app_name>-31a6fd70e769.herokuapp.com/
“Web URL “sine giderek uygulamanızı tarayıcıda ziyaret etmeyi deneyin.
Heroku kısmı için bu kadar. Bir sonraki bölümde aynı uygulamayı Back4app Containers’a dağıtmayı inceleyeceğiz.
Back4app Containers’a bir uygulama nasıl dağıtılır?
Bu bölümde, Back4app Containers’a bir uygulama dağıtacağız.
Back4app Konteynerleri Nedir?
Back4app Containers harika bir Containers as a Service (CaaS) platformudur. Uygulamaları küresel olarak dağıtılmış kapsayıcılara dağıtmanıza, yönetmenize ve ölçeklendirmenize olanak tanır.
Platform GitHub ile sıkı bir şekilde entegre edilmiştir ve yerleşik bir CI/CD sistemi sağlar. Diğer özellikleri arasında sıfır kesinti süresi dağıtımları, özel alan adı bağlama, günlük kaydı, izleme ve daha fazlası bulunur.
Hepsinden iyisi, platform cömert bir ücretsiz katman sunuyor. Aylık 600’den fazla ücretsiz konteyner saati ile evcil hayvan projelerinizi kolayca prototipleyebilir ve barındırabilirsiniz. Uygulamanız ölçeklendikçe, öngörülebilir fiyatlandırma ile premium katmanlara yükseltebilirsiniz.
Hizmet Olarak Kapsayıcılar hakkında daha fazla bilgi edinmek için CaaS – Hizmet Olarak Kapsayıcılar Nedir?
Ana
dalı temel alarak back4app
adında yeni bir dala geçin:
$ git checkout master && git checkout -b back4app
Hedefler
- Uygulamayı Dockerize edin.
- GitHub’ınızı Back4app hesabınıza bağlayın.
- İstediğiniz GitHub deposunu içe aktarın.
- Dağıtın!
Dockerize
Bir uygulamayı Back4app Containers’a dağıtmak için önce onu dockerize etmeniz gerekir.
Dockerizing, Docker konteynerlerinde uygulama oluşturma, dağıtma ve çalıştırma işlemidir. Bir uygulamayı dockerize etmenin en kolay yolu bir Dockerfile kullanmaktır.
Dockerfile
Dockerfile, bir Docker konteyner görüntüsü oluşturmak için talimatlar içeren bir betiktir. Bu dosyayı, bir uygulamayı oluşturmak ve çalıştırmak için gereken ortamı, bağımlılıkları ve diğer komutları tanımlamak için kullanabilirsiniz.
Aşağıdaki sözdizimine sahiptir:
COMMAND <arg_1> <arg_2> ... <arg_n>
Proje kök dizininde aşağıdaki içeriğe sahip bir Dockerfile oluşturun:
FROM python:3.9.6-alpine
# Set the working directory
WORKDIR /app
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Copy over the requirements file and install the dependencies
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt
# Copy over the source code
COPY . .
# Expose the port
EXPOSE 80
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
Bu Dockerfile python:3.9.6-alpine
imajını temel alır. İlk olarak çalışma dizinini, ortam değişkenlerini ayarlar ve ardından gereksinimleri ele alır. Bundan sonra, kaynak kodu kopyalar, 80
numaralı bağlantı noktasını açığa çıkarır ve bu bağlantı noktasında Uvicorn sunucusunu başlatır.
Diğer programlama dillerini ve çerçevelerini dağıtmak için, Back4app Containers dokümanlarından Docker dosyalarını almaktan çekinmeyin.
Bir Dockerfile komutunun nasıl çalıştığı konusunda açıklamaya ihtiyacınız varsa, Dockerfile referansına bakın.
.dockerignore
Docker görüntü boyutunu azaltmak için bir .dockerignore dosyası kullanabiliriz. Bu dosyalar .gitignore dosyalarına benzer şekilde çalışır. İmajdan çıkarılmasını istediğiniz dosya ve dizinleri tanımlamanız gerekir.
Bizim durumumuzda, bu sanal ortam, IDE dosyaları ve .git klasörüdür.
Bunun gibi bir .dockerignore dosyası oluşturun:
.git/
.idea/
venv/
.dockerignore dosyasını projenizin ihtiyaçlarına göre uyarlamaktan çekinmeyin.
Değişiklikleri GitHub deponuza gönderin:
$ git add .
$ git commit -m "configured app for back4app"
$ git push origin back4app
Oluştur, Çalıştır ve Test Et
Kodunuzu buluta göndermeden önce yerel olarak test etmek iyi bir fikirdir.
Önce görseli oluşturun ve etiketleyin:
$ docker build -t back4app-url-shortener:1.0 .
Ardından, resimleri listeleyin:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
back4app-url-shortener 1.0 1cbe348a04ad 1 minute ago 68.7MB
Yeni oluşturulmuş imajı kullanarak konteyneri çalıştırın:
$ docker run -p 80:80 --name back4app-url-shortener back4app-url-shortener:1.0
Argüman açıklaması:
-p 80:80
ana makinenin80
numaralı portunu konteynerin80
numaralı portuna bağlar--name back4app-url-shortener
kapsayıcı örneğini adlandırır
Konteyneri müstakil modda (terminali işgal etmeden) çalıştırmak için
-d
kullanabilirsiniz.
Konteynerin çalışıp çalışmadığını kontrol edin:
$ docker ps
CONTAINER ID IMAGE CREATED STATUS PORTS
b3b82313ab65 back4app-url-shortener:1.0 3s ago 1s 0.0.0.0:80->80/tcp
Favori web tarayıcınızı açın ve http://localhost/docs adresine gidin. URL kısaltıcı hizmetini görebilmeniz gerekir.
Uygulama Dağıtma
Aşağıdaki adımlar bir Back4app hesabı gerektirecektir. Henüz bir hesabınız yoksa, ücretsiz bir hesap için kaydolun. Bu eğitimde yapacağımız her şey ücretsiz katmanda olacak.
Back4app hesabınıza giriş yaptığınızda, uygulama listesi karşınıza çıkacaktır. Uygulama oluşturma sürecini başlatmak için “Yeni uygulama oluştur” seçeneğine tıklayın.
Back4app iki çözüm sunar:
- Hizmet Olarak Arka Uç (BaaS) – kullanıma hazır bir arka uç çözümü
- Containers as a Service (CaaS) – Docker destekli bir konteyner dağıtım platformu
Özel bir Python uygulaması dağıttığımız için CaaS ile devam edeceğiz. Ekranın sağ tarafındaki “Containers as a Service” seçeneğini seçin.
Back4app ile ilk kez çalışıyorsanız GitHub hesabınızı bağlamanız istenecektir. Bunun da ötesinde, dağıtmak istediğiniz tüm depoları içe aktardığınızdan emin olun.
Ardından, dağıtmak istediğiniz GitHub deposunu “seçin”:
Basit bir uygulama dağıttığımız için ortamı çok fazla yapılandırmamız gerekmiyor. Tek yapmanız gereken ayarlamak:
- Uygulama Adı: back4app-url-shortener (farklı bir isim seçebilirsiniz)
- Şube: back4app (GitHub şubeniz)
Ardından “Dağıt” seçeneğine tıklayın.
Back4app Containers, otomatik dağıtımlar, bağlantı noktası ayarları, ortam değişkenleri ve sağlık kontrolleri dahil olmak üzere birçok yapılandırma seçeneği sunar.
Back4app Containers’ın Docker görüntünüzü oluşturması ve dağıtması biraz zaman alacaktır. Uygulamanız hazır olduğunda, uygulamanın durumu “Kullanılabilir” olarak değişecektir. Uygulamanızı ziyaret etmek için, resimde gösterildiği gibi durumun altındaki bağlantıya tıklayın.
İyi iş çıkardınız! Back4app Containers’a bir web uygulamasını başarıyla dağıttınız.
Sonuç
Bu eğitim size basit bir web uygulamasını Heroku ve Back4app Containers’a nasıl dağıtacağınızı öğretti. Her iki platformun da bir uygulamayı dağıtırken göz önünde bulundurmanız gereken artıları ve eksileri vardır.
Genel bir kural olarak, veritabanı gerektirmeyen uygulamalar için Back4app Containers’ı tercih ederim. Back4app Containers paradan tasarruf etmenize yardımcı olacaktır ve ücretsiz katmanı evcil hayvan projeleriniz için fazlasıyla yeterlidir.
Uygulamanız bir veritabanına veya süslü eklentilere dayanıyorsa Heroku daha iyi olabilir.
Ana platform farklılıklarından bazılarını aşağıdaki tabloda özetledim:
Heroku | Back4app Konteynerleri | |
---|---|---|
Bulut modeli | Hizmet Olarak Platform (PaaS) | Hizmet Olarak Konteynerler (CaaS) |
Oluşturun ve dağıtın | Buildpacks | Docker |
Desteklenen diller | 9 programlama dili | Herhangi bir dil veya çerçeve |
Ücretsiz HTTPS/SSL | ✔️ | ✔️ |
Özel alan adları | ✔️ | ✔️ |
Ücretsiz katman | ❌ | ✔️ |
Satıcı kilitlenmesi riski | ✔️ | ❌ |
Yönetilen veritabanları | ✔️ | ❌ |
Acemi dostu | Evet (bazı DevOps becerileri gerektirir) | Evet (biraz Docker becerisi gerektirir) |
GitHub deposundan nihai kaynak kodunu almaktan çekinmeyin.
SSS
Heroku nedir?
Heroku, 2007 yılında kurulan öncü Platform olarak Hizmet (PaaS) platformlarından biridir. Java, PHP, Python ve Ruby dahil olmak üzere dokuz programlama dilini dağıtmanıza olanak tanır. Ayrıca, yönetilen veritabanları, eklentiler, gelişmiş günlükleme, izleme ve daha fazlasını sağlar.
Heroku’ya bir uygulama nasıl dağıtılır?
1. Bir Heroku hesabı oluşturun.
2. Heroku CLI’yi yükleyin ve yapılandırın.
3. Bir Heroku uygulaması oluşturun.
4. runtime.txt ile çalışma zamanını belirtin.
5. Procfile ile uygulama süreçlerini belirtin.
6. Kaynak kodunuzu Heroku’ya gönderin.
Back4app Containers nedir?
Containers, mükemmel bir Hizmet Olarak Konteyner (CaaS) platformudur. Platform, dockerlaştırılmış uygulamaları küresel olarak dağıtılmış konteynerler üzerinde hızla dağıtmanıza, yönetmenize ve ölçeklendirmenize olanak tanır. Yerleşik bir CI/CD sistemine sahiptir, kesinti süresi olmadan dağıtımı destekler, özel alan adları ve daha fazlasını sunar!
Back4app Containers’a bir uygulama nasıl dağıtılır?
1. Ücretsiz bir Back4app hesabı oluşturun.
2. Uygulamanızı dockerlaştırın.
3. Kaynak kodunuzu GitHub’a gönderin.
4. GitHub hesabınızı Back4app hesabınızla bağlayın.
5. İlgili repoyu içe aktarın ve dağıtın!