Heroku Nedir?

Node.js ve ardından Express.js ile temel düzeyde web sunucusu oluşturma ve statik sayfalar yayınlama konularında bilgi sahibi olduk.

AA

Peki, oluşturduğumuz bu mini uygulamayı nasıl yayınlayacağız? Öyle ya, şimdiye kadar yaptığımız tüm işlemler localhost üzerinden yayınlanmaktaydı. Elbette, daha önce bahsi geçmiş olan Ngrok başlangıç için bir alternatif olabilir. Ancak, amacımız daha kalıcı ve genel bir çözüm; uygulamamıza herkes erişebilmeli. İşte bu gibi durumlarda, uygulamamızı deploy edebileceğimiz bir servis sağlayıcıya ihtiyaç duymaktayız. DigitalOcean bir seçenek olabilir1. Ancak, daha pek çok kullanılabilecek servis sağlayıcı mevcut. Bu yazının konusu olan Heroku seçeneklerden biri.

Heroku

Heroku, bir bulut bilişim (cloud computing) uygulama altyapısı servis sağlayıcısıdır. Platform as a Service (PaaS) olarak ifade edebileceğimiz Heroku, JavaScript, Ruby, Java, PHP, Python, Golang, Scala ve Clojure ile geliştirdiğimiz web tabanlı uygulamalarımızı internete taşımamızı (deploy, manage ve scale) sağlar. Bu işlemler için Dyno adı verilen Linux temelli küçük ve hafif sanal ortamlar kullanılmaktadır.

Heroku ayrıca add-on desteği de sunmaktadır. Add-ons2 sayfasında Heroku ve diğer 3. parti geliştiriciler / servis sağlayıcılar tarafından oluşturulmuş olan ek paketlerin listesini görebilirsiniz. Örneğin, mLab MongoDB3 ile Node.js servisini veritabanı ile ilişkilendirebilirsiniz.

Ek olarak, uygulamaları git ve bitbucket gibi servislerde tutup, Heroku’ya entegre etmek de mümkün.

Heroku Kullanımı

Öncelikle, Heroku platformuna erişim için bir üyelik oluşturulması gerekmektedir. Bu işlem için Signup Heroku sayfasını kullanabilirsiniz. Hesabın oluşturulması ve giriş yapılmasının ardından Account Settings sayfasından SSH Key tanımlaması yapmamız gerekmekte. Böylelikle, Heroku CLI aracılığıyla bilgisayarımızda geliştirdiğimiz uygulamalarımızı SSH ile kolaylıkla Heroku’ya aktarabileceğiz. Öncelikle CLI kurulumunu yapalım.

Heroku CLI

Heroku’yu pek çok şekilde bilgisayarımıza indirebiliriz4. Homebrew elbette bunlardan biri.

brew tap heroku/brew && brew install heroku

İndirme işleminin ardından sürüm kontrolü yaparak indirmenin sağlıklı bir şekilde gerçekleşip gerçekleşmediğini öğrenebiliriz.

heroku --version

Hata mesajı almasıysanız her şey yolunda demektir. Artık, heroku web sayfasında oluşturduğumuz üyeliğimizi CLI ile entegre etmemiz gerekiyor.

heroku login

Bu komutu uygulamamızın ardından ön tanımlı tarayıcımızda Heroku CLI Login sayfası açılacaktır. Kullanıcı bilgilerimizi doğru bir şekilde girmemizin ardından, artık CLI ile heroku kontrolünü sağlayabiliriz. Unutmadan, yükleme işleminin ardından autocomplete bildirimi alabilirsiniz. Autocomplete yapılandırması için aşağıdaki komutu uygulamanız yeterli.

heroku autocomplete

Komutun uygulanmasının ardından bash ve zsh için ayrı completion yolları iletilecektir:

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions

Zsh için son olarak şu komutu uygulayarak süreci sonlandırabiliriz.

printf "$(heroku autocomplete:script zsh)" >> ~/.zshrc; source ~/.zshrc

Örnek bir işlem için heroku auth yazıp TAB tuşuna basabilirsiniz.

Heroku SSH Key Tanımı

Heroku varsayılan olarak HTTP Git transport kullanmaktadır. Bunun yerine SSH kullanarak kodu deploy etmek için public/private bir anahtar çifti oluşturmanız gerekir. Bu keypair sayesinde kodlar güvenli ve benzersiz bir şekilde işlenir. O halde public key’imizi oluşturalım ve ardından heroku’ya ekleyelim.

ssh-keygen -t rsa
heroku keys:add

heroku keys:add komutu uygulandığında ön tanımlı olarak ~/.ssh/id_rsa.pub dosyasına bakılır. Farklı bir key kullanılmak isteniyorsa parametre olarak komuta eklemek yeterli olacaktır. Öncelikle, bilgisayarımızda yer alan, daha önceden tanımlanmış olan key’lerimizi listeleyelim.

ls -la ~/.ssh

Örneğin, heroku_rsa adında ayrıca oluşturulmuş bir key’imiz mevcut olsun. Bunu heroku’ya tanımlamak istiyorum.

heroku keys:add heroku_rsa.pub

Evet, bu işlemin ardından key heroku’ya uplad edilecek ve bir aksilik olmaması durumunda tanımlama işlemi başarıyla sonuçlandırılacaktır. Unutmadan, heroku içerisinde tanımlı olan (heroku keys:add ile import edilmiş) key’leri heroku keys ile listeleyebilirsiniz.

cat ~/.ssh/id_rsa.pub

Ek olarak, heroku keys:add yerine bilgisayarımızdaki key’i cat ile görüntüleyebilir, görüntülenen key içeriğini kopyalayıp Account sayfasında yer alan SSH Keys alanına yapıştırabiliriz. Sonuç her iki durumda da aynı olacaktır. Heroku key tanımlama işlemleri için Managing Your SSH Keys5 sayfasını inceleyebilirsiniz.

Heroku SSH Key

Proje olarak heroku-app adına bir klasör oluşturdum. index.js içeriğinde de oldukça basit bir Express.js örneği yer almakta.

git clone https://gitlab.com/ceaksan/heroku-app

Ya da adım adım ilerleyebilirsiniz.

mkdir heroku-app
yarn init -y
yarn add express --save
touch index.js

index.js içeriğimiz de şöyle:

const express = require('express')
const app = express()

const port = process.env.PORT || 3000

app.get('/', (req, res) => res.send('Merhaba Dünya!'))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Heroku Uygulama Deploy Etmek

Artık Heroku üzerindeki ilk alanımızı oluşturabilir ve geliştirdiğimiz uygulamayı Heroku’da oluşturulan bu app alanına deploy edebiliriz.

heroku create

Bu komutun uygulanmasının ardınan Creating app... bildirimi ile benzersiz bir id değerine sahip alanımız oluşturulacaktır. Benim aldığım dönüş greve-bastille-50035 şeklindeydi. İnternet tarayıcısının adres barına greve-bastille-50035.herokuapp.com yazdığımda, ilgili uygulama alanını görüntüleyebilirim.

Heroku App

Uygulama oluşturma işleminin ardından şöyle bir hata almış olabilirsiniz.

fatal: not a git repository (or any of the parent directories): .git
 ▸    128: Command failed: git remote
 ▸    fatal: not a git repository (or any of the parent directories): .git

Bu hatayı almamızın nedeni, ilgili projenin bir git repository olmaması. Aksi durumda, çalışma klasörü içerisinde .git dosyası yer alacak ve heroku bu dosyayı işleme alacaktı. Bu durumda, git init ile tanımlama işlemimizi gerçekleştirebiliriz.

git init
heroku git:remote -a https://git.heroku.com/greve-bastille-50035.git
git add .
git commit -am "Initial Commit."
git push heroku master

Deploy edeceğimiz projenin package.json dosyası Heroku için oldukça önemli. Diyelimki Express.js ile basit bir uygulama hazırladık. Package.json dosyasımız en temel haliyle şu şekilde olacaktır.

{
  "name": "heroku-app",
  "version": "1.0.0",
  "main": "index.js",
  "author": "Ceyhun Enki Aksan ",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Heroku’nun buradaki dependencies‘i biliyor olması lazım. Çünkü, app alanını bu gereksinimlere göre yapılandıracak. package.json dosyamızı biraz daha düzenleyebiliriz.

{
  "name": "heroku-app",
  "version": "1.0.0",
  "main": "index.js",
  "author": "Ceyhun Enki Aksan ",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {},
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://git.heroku.com/piscine-fromage-14435.git"
  },
  "keywords": [
    "node.js",
    "express"
  ]
}

Tekrar heroku create komutunu uyguladığımızda bu kez app alanı oluşturulacak ve bize URL ve git yolları dönecektir. piscine-fromage-14435 adında oluşturulan app alanı için alınacak dönüşler şu şekildedir.

https://piscine-fromage-14435.herokuapp.com/ | https://git.heroku.com/piscine-fromage-14435.git

Verilen bu ismi değiştirebiliriz.

heroku rename [yeni-isim]

Eğer, belirttiğimiz isim daha önce oluşturulmuşsa bir hata mesajı dönecektir. Diğer durumda, isim değiştirme işlemi sorunsuz bir şekilde tamamlanacak ve bize yeni URL ve git yolu iletilecektir. Artık uygulamamızı açabiliriz.

heroku open

Evet, karşımızda “Merhaba Dünya!”. Elbette Heroku ile yapacağımız daha pek çok işlem olacak. Şimdilik temel işlemler yeterli. Daha detaylı bilgi edinmek için Heroku Devcenter‘a göz atabilirsiniz6.