Bir sözcük haricinde başlık tamamen İngilizce oldu kusura bakmayın. Çünkü bu yazının konusu bu 3 tane aracın bir araya gelip Voltran’ı oluşturması olacak. Efenim önce bahse konu arkadaşları tanıyalım:
- Go (golang) programlama dili. Bununla ilgili şurada bir yazı yazmıştım.
- BeeGo framework. Go için geliştirilmiş bir web uygulama çatısıdır kendileri. MVC destekler. Kullanımı oldukça kolaydır. Ben de henüz detayına vakıf değilim. Zamanla olurum inşallah.
- Heroku. Platformu servis olarak sunan (PaaS) bir bulut yapısı. Bir çok dilde uygulama çalıştırılmasını destekliyor. Python, Ruby, PHP, Go, vb.
Bu yazıda;
- Sadece kısa kodlar ve kısa açıklamalar olacak.
- Beego framework kullanarak çok basit bir web sayfası yapacağız.
- Bunu Go araçları ile derleyip yerelde test edeceğiz.
- Oluşturduğumuz web sitesini ücretsiz olarak Heroku üzerinden yayınlayacağız.
- Üstte bahsedilenleri yapmak için gerekli olan bileşenleri yükleyip yapılandıracağız.
Gerekli bileşenleri yükleyelim
ÖNEMLİ: Bu yazının tamamında Ubuntu Linux işletim sistemi baz alınacaktır. Ancak isteyenler hepsini Windows üzerinde de benzer şekilde uygulayabilir.
Çalışmanın temelinde Go dili var. Bu nedenle öncelikle Go’yu yükleyip test etmeliyiz. Bunun için farklı seçeneklerimiz var. Ancak benim en sevdiğim yöntem GVM (Go Version Manager) kullanmak. Bu sayede; hem farklı Go versiyonlarını yükleyip kullanabiliyoruz hem de gerekli bir takım ayarları kendisi otomatik yapıyor.
GVM Kurulumu:
1 2 3 4 5 6 7 8 9 10 |
### https://github.com/moovweb/gvm bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) source /home/murat/.gvm/scripts/gvm gvm listall gvm install go1.4 gvm list gvm use go1.4 go version echo $GOPATH echo $GOROOT |
İlk satırdaki adres, GVM web adresidir. Detaylı bilgi oradan edinilebilir. İkinci satırda, GVM kurulumu için hazırlanmış betik indirilip çalıştırılıyor. 3. satırı sürekli kullanmanıza gerek yok, zaten ~/.bashrc içerisine yazmış oluyor bunu. gvm ile başlayan satırları teker teker deneyebilirsiniz. Tehlikeli birşey yok. yazı yazıldığı sırada Go’nun son sürümü 1.5 idi. Ancak Beego ile kullanmaya kalktığımda anlamsız bir hata aldığım için uğraşmadım, 1.4’e geçtim.
“go version” komutundan sonra alınan cevap düzgün ise Go dili bilgisayarımızda çalışıyor demektir. Son iki satırda (echo ile başlayanlar) ise alttaki işlemleri sağlıklı yapabilmemiz için ayarlanmış olması gereken çevresel değişkenlerdir. GVM bunu otomatik olarak düzenlemektedir.
İstenirse bu aşamada Go dilinde “hello world” uygulamaları yapılabilir. Uzantısı .go olan bir dosya oluşturup içine birşeyler yazın, “go build” deyip derleyin, sonra çalıştırın. Şimdilik bu kısmı hızlı geçeceğiz.
Beego yükleyelim:
1 2 3 4 5 6 |
go get github.com/beego/bee cd $GOPATH/src bee new ilkuyg cd ilkuyg rm -rf tests bee run ### http://localhost:8080 |
İlk satırda github üzerinden bir Go paketi (kütüphanelere paket diyoruz bu dilde) yüklüyoruz. Sonra uygulamanın kodlarını tutacağımız yere gidiyoruz.
3. satırda ilkuyg isminde, yeni bir Beego projesi oluşturuluyor. Ne kadar kolay, tam benlik :) Projeyi oluşturduğumuzda; şöyle bir dosya/klasör yapısı oluşuyor. Şimdilik bu klasör yapısını da hızlı geçeceğim. Bu yazıyı oryantasyon olarak düşünün. İsteyenler uzun süre kalacak ve zaten ezberleyecek buradaki herşeyi.
1 2 3 4 5 6 7 8 |
conf/ controllers/ main.go models/ routers/ static/ tests/ views/ |
Üstteki komutlarda 4. satırda sildiğimiz tests klasörünün ne işe yaradığını şimdilik bilmiyorum ama Heroku’ya yüklerken sorun çıkardığını ve sildiğimiz taktirde sorun olmadığını biliyorum :)
Beego yüklemesinin son satırı ise oluşturulan uygulamayı çalıştırmak için kullanılıyor. Bu aşamada isterseniz önce “go build” deyip sonra da “./ilkuyg” şeklinde çalıştırabilirsiniz. Beego’nun varsayılan TCP portu 8080‘dir. Bu aşamada eğer sorun çıkmamışsa, tarayıcıdan kendi bilgisayarınızda ilk web projenizi görüp bir keyif çayı içebilirsiniz. Gidin şimdi biraz gezinin, oksijen alın. Biz oturak insanlar, ara sıra gezinmezsek, omurgamızda geri dönülemez hasarlar oluşabiliyor. Biraz sonra uygulamamızı arkadaşlarımıza gösterebilmek için WEB üzerinden yayınlayacağız.
Heroku’da proje yayınlama
Bu kısmı, benim anlamam biraz zor oldu. Bu nedenle benim gibi dinamik bir dil ile web sitesi yapıp yayınlamamış olanlar için biraz detaya girebilirim, sıkarsam kusura bakmayın. Daha önce WEB tabanlı diller ile ilgili ötek çalışmam, statik HTML ve CSS dosyalarını FTP ile yüklemek şeklinde olmuştu. Şimdi ise; publish, deploy, git, dyno, reverse proxy, environment, vb. gibi acayip kavramlar çıktı karşıma.
Bu başlığın ilk aşaması, bir Heroku hesabının açılmış olmasıdır. Ücretsiz olarak yapılabilecek birşey. Bu tarz amatör projelerden para kazanmıyorlar. Hit’i fazla olan siteler asıl para kazandıran kısmı. Üye olurken biraz web sitesini kurcalayabilir, beleş üyeliğe verdikleri isim olan “free tier” kapsamını inceleyebilirsiniz. Özetle; her gün en az 6 saat uygulamanızın “uyumak” zorunda olduğunu söyleyebilirim. Bu aşamada bunu kimsenin dert edeceğini sanmıyorum.
Heroku hesabınızı açtıysanız, tanıtımı yine hızlandırıyoruz:
1 2 3 4 5 6 7 8 9 10 11 12 |
wget -O- --no-check-certificate https://toolbelt.heroku.com/install-ubuntu.sh | sh sudo apt-get install -y --force-yes heroku-toolbelt git init heroku login heroku create -b https://github.com/heroku/heroku-buildpack-go.git ilkuyg echo "web: ilkuyg" > Procfile go get -u github.com/tools/godep godep save -r ./... git add -vA . git commit -m "ilk uygulama, ilk kodlar" git push heroku master heroku open |
Üstteki işlemleri altta satır satır açıklamaktan daha güzel bir yol gelmedi aklıma:
- Heroku bulut platformuna kolay bağlanabilmek için, Heroku Toolbelt adı verilen aracı yüklüyoruz. Bu, bize Heroku’ya ait konsol komutlarını veriyor.
- İlk satırda normalde “takır tukur” yüklenmesi gereken, ama yükleme betiğindeki bir problem nedeniyle yarım kalan işi tamamlıyor.
- Kodların sürüm takibi GIT ile yapılıyor. Bu satırda, uygulama klasörü içerisinde “.git” adında bir klasör oluşturuluyor.
- Konsol’dan Heroku’ya bağlanabilmek için oturum açmalıyız. Daha önce WEB üzerinden kayıt olduğumuz bilgileri isteyecek bizden.
- Heroku üzerinde yeni bir uygulama oluşturuyor. En sondaki ismi yazmazsanız, sallama çirkin bir isim veriyor kendisi. Sonradan WEB üzerinden değiştirilebiliyor bu isim. Çok önemli değil ama uygulamanın web adresi bu şekilde olacak. Bizim örnek için: http://ilkuyg.herokuapp.com
- Heroku’nun bir standardı bu. Her uygulamada, hangi dilde yazılmış olursa olsun, Procfile isminde bir dosya içerisinde, “neyi çalıştıracağını” söylemeniz gerekiyor. Burada yazılmış olan ilkuyg sözcüğü, “bee new ilkuyg” şeklinde uygulama klasörünü ilk oluşturduğumuzda verdiğimiz isim. Heroku’daki ilkuyg ile bunun ilgisi yok.
- godep paketini Go’ya kazandırıyoruz. Bu paket, Heroku için gerekli. Bağımlılıkların belirtildiği Godeps/Godep.json dosyasının oluşturulmasını sağlayacak. Heroku da kendi ortamında bu bağımlılıkları hazırlayacak.
- Üstte belirtilen bağımlılıkların düzenlenmesi işi yapılıyor.
- “git add -vA .” komutu ile uygulama klasöründeki tüm dosyaları sunucuya yüklemek için işaretliyoruz.
- “git commit” komutu ile, uygulamayı kendi yerel depomuzda güncelliyoruz. Bu aşamada henüz sunucuya giden birşey yok. Bir de git bu aşamada bir hata veriyor sanırım. Kullanıcı adı ve e-posta adresi gibi birşeyler istiyor. Bunları hatada yazdığı şeklinde yazarsanız, sorun çıkarmıyor.
- “git push heroku master“, oluşturduğumuz heroku uygulamasına kodlarımızı gönderiyor. Bu aşamada kodların hangi dilde olduğunu tespit edecek ve ekranda yazacaktır. Bundan sonra kodlarda yapılan her değişiklik için, son 3 basamağın tekrarlanması gerekecektir.
HATA: Son satırdaki komutu çalıştırdığınızda, problem çıktığını göreceksiniz. Beni birkaç gün tırmalattıran kısım buydu. Alttaki resme bakın, sonra bir açıklama daha yazacağım. Sonra da hatanın düzeltmesi gelecek.
En alt katman Heroku üzerinde uygulamamızın çalıştığı katman. Buradaki süreç yürütücülerine dyno diyor vatandaşlar. En üstteki katman ise, tarayıcı üzerinden (TCP-80) gelen kullanıcı katmanı. Yukarıdaki hataya sebep olan kısım ise; Beego’nun standart olarak TCP-8080’i kullanması; ancak Heroku dyno’larının rasgele bir port açıp dinlemesi. Bedava açılan hesaba, VPS gibi istediğimiz portu vermesini beklemiyoruz değil mi?
Beego uygulamasının Heroku Dyno portunu dinlemesi
Bunun için kodun biraz düzenlenmesi gerekiyor. Aşağıda main.go dosyasının düzenlenmiş hali var. Dikkat edilirse, anlaşılmayacak gibi değil. Yapılan temel işlem; dyno’nun çalıştığı bilgiyi işletim sisteminin $PORT çevresel değişkeninden almak ve Beego’ya parametrik olarak göndermekten ibaret. Bu şekilde dyno her restart olduğunda yeni bir portu dinleyecek ama Beego da her seferinde o porta yapışacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package main import ( "dayno/Godeps/_workspace/src/github.com/astaxie/beego" _ "ilkuyg/routers" "strconv" "os" ) func main() { port, err := strconv.Atoi(os.Getenv("PORT")) if err == nil { beego.HttpPort = port } beego.Run() } |
Beego tarafından oluşturulmuş olan orijinal main.go dosyasında, import kısmındaki strconv ve os sözcükleri, eklendi. func main içerisinde kullanılacak olan komutların kütüphane paketidir bunlar.
func main içerisinde de normalde sadece beego.Run() satırı vardı. Diğerleri sonradan eklendi. İşletim sisteminden PORT çevresel değişkeninin değerini istiyor. Sorunsuz bir şekilde bu bilgiyi alabilirse, Beego’ya bu değeri gönderiyor.
Düzeltilmiş kodları Heroku’ya gönderelim
1 2 3 4 5 |
godep save -r ./... git add -vA . git commit -m "Beego artik Heroku dyno'sunun TCP port numarasini aliyor" git push heroku master heroku open |
Bu sefer sorunsuz bir şekilde Beego uygulamasının standart sayfasını görüyor olmamız lazım. İstenirse Heroku üzerinden loglama, veritabanı bağlantısı, vb. farklı addon’lar ekleyebilirsiniz uygulamaya.
İyi eğlenceler.
Teşekkür:
Recai Oktaş, 2-3 gün boyunca boğuştuğum, Heroku dyno’sunun dinlediği portu beego’ya bağlama konusunda saplandığım yerden bir dokunuşla çıkardı. Kendisine çok çok teşekkür ediyorum.
2 ping
Go (GoLang) Programlama Dili Maceram - Murat Özalp
25 Ağustos 2015, 22:24 (UTC 2) Bu yoruma bağlantı
[…] Go (golang), BeeGo framework ve Heroku » […]
Golang (Go), Beego ve ORM - Murat Özalp
08 Şubat 2016, 22:29 (UTC 2) Bu yoruma bağlantı
[…] http://web.bilecik.edu.tr/murat-ozalp/2015/08/25/go-golang-beego-framework-ve-heroku/ […]