Ciddi bir şekilde Heroku ve GitLab ile ücretsiz iş uygulaması geliştirilebilir mi?

nodejsherokugitlab

4 yıl önce 2 yorum

Bir uygulama fikriniz var ve bu uygulamayı kurmak için aklınızdan basitçe yapılacaklar geçiyor. Örneğin "bir sunucu sağlayıcıdan bir makine alırım, makineye Node.js falan kurarım, projemi oraya clone edeyim ve DevOps için pipeline eklerim". İşte bunların arkasından binbir türlü bağımlılık düşünüyor insan. "Yahu bu sunucunun veritabanı olacak, nasıl güncellerim, dışa çıkan portlarını şöyle ayarlarlarım, nginx kuracağım, uzaktan bağlanırım da şunu yapayım, bunu yapayım..." Uzar gider :)

Ek olarak belirteyim, olayları öyküleyici bir şekilde anlatacağım :)

Doların şu an 5.72₺ olduğu sıralarda uzaktan bir makine almak ve belkide ileride tahmin edildiği gibi yürümeyecek bir iş için para vermek benim aklımda şu soruyu oluşturdu: "Anaa!, şey vardı bir ara Heroku diye bir şey, Node.js uygulaması falan atabiliyorduk, acaba oradan yapabilir miyim?" 

İşte aklıma takılan bu soru için araştırmaya koyuldum. Heroku'da bir hesap açtım Node.js Tutorial'ı takip ettim ve Hello Word'ü başardım. Ancak bundan sonra şunu da düşündüm.

Heroku veritabanı sağlıyor muydu ki ücretsiz?

Bir de baktım ki "Dev plan" adı altında 10.000 satıra kadar Postgres veritabanını ücretsiz sunuyormuş. bkz.

Bunu öğrenince başladım harala gürele kod yazmaya, ama nasıl seviniyorum işin ucunda cebimden para çıkmayacak sonuçta. Sonra projemde kullanıcılara profil resmi eklemek için bir özellik aklıma geldi. Yani bir stream kayıt yapılacak. Bunu veritabanında mı tutayım yoksa dizinde mi diye düşündüm ve dizinde olması gerektiğine karar verdim. Yani kaydettiğim dizinin path değerini veritabanında bir alanda tutacağım ve böylelikle veritabanından stream işlemleri ile uğraşmayacağım.

NoSQL kullanmış olsam benim için sorun yok, yani veritabanında da tutabilirim. Ama ben uygulamayı baştan sql bir veritabanında tasarlamışım ve bununla devam etmek istiyorum. Ve böyle bir yapı kullanmak istedim. Sonra tabi resim upload işlemini local'de yazdım test ettim çalıştı. Heroku üzerine atınca uygulamayı, uygulama patladı! Neden böyle bir şey oldu diye araştırdım ve Herokunun sadece tmp dizinine yazma işlemine yekti verdiğini buldum. Herokunun istediği şekilde değiştirdim ancak bu sefer de birkaç saat sonra resimler gelmez oldu. Resimler silinmiş. Bu konuyu da araştırınca şöyle bir gerçekle yüzleştim: Why are my file uploads missing/deleted? , Ephemeral filesystem

Yani Heroku, uygulama kullanılmadığı süre içerisinde üzerine kaydedilen dosyaları tutmuyor. Yukarıda verdiğim adreslerde Heroku'nun dosya sisteminin geçici olduğunu ifade ediyor.

Böyle bir durum söz konusu olunca ben ilk başta veritabanında tutmayı düşündüm. Bu probleme takılınca yaklaşık üç gün boyunca başka alternatifler düşünmeye başlatım. Neden? çünkü hali hazırda bir sistem yazdım ve sadece dosya kaydetme noktasında takıldım diye bütün projemi Heroku üzerinde koşabilmesi için tekrar yazamam.

Sonra aklıma bir fikir geldi

Dosyaları bir CDN üzerinde tutayım. Uygulamaya dosya yüklemek isteyen bir kişi arkaplanda CDN'e upload edilmesini beklesin ve upload bitince postgresql veritabanına kaydetsin ve kullanıcıya başarılı olarak dönsün. Tabi CDN'de ücretsiz olsun.

Sonra ücretsiz CDN araştırmaya başladım ve aklıma git üzerinde tutabileceğim geldi. GitLab ve GitHub'ı araştırdım ve GitLab üzerinde repo başına 10GB'a kadar bir limit olduğunu okudum. Yani bir fotoğraf maksimum 1MB olsa (ki bu büyük bir rakam) 10.240 adet avatar saklayabilirim. Dikkat ederseniz bu limit Heroku veritabanı ile denkleşiyor.

Şundan bahsedeyim

Şöyle diyebilirsiniz "10.000 kayıt şu an kime yeter". Çok haklısınız evet, ama siz ürününüzü canlıya aldınız arkada 10.000 kayıta gelecek kadar veri kaydettiniz, bu da demek oluyor ki uygulama artık ayaklarının üstüne basacak kadar büyüdü. O zaman da zaten başka bir sunucuya verilerinizi taşırsınız ve bir şey olmamış gibi devam edersiniz. Taşıma işlemi çok kolay olacak, yazının devamında bundan bahsedeceğim.

Bu kısımdan sonra öyküleyici anlatıma son veriyorum.

GitLab'daki bir repo'ya dosya atmak aslında bir commit atmak anlamına geliyor. Birkaç araştırma ile GitLab'ın bunun için olan API'sini buldum. 

Bilgisayarımızda örnek olarak bir proje kuralım

Bu makaleye örnek olsun diyerek yazdığım projeyi aşağıdaki komut ile bir dizine indirelim:

git clone http://github.com/abdurrahmanekr/nodejs-user-list-server.git

Sonra bu projenin dizinine geçiş yapıp bağımlılıklarını kuralım.

cd nodejs-user-list-server && npm install

Veritabanı işlemleri için tabloları oluşturalım.

Kullanıcılara ihtiyacımız olacak, o yüzden users tablosunu şu şekilde oluşturabiliriz:

id name email avatar created_date
id'si tam adı e-posta adresi avatar hash değeri oluşturulma tarihi

Bu veritabanını görünce gözüm kanadı(!) Tahmin edeceğiniz üzere normalize olmayan bir tablo ama anlatmak için böyle devam edelim :)

Aşağıdaki komutla bu tabloyu localdeki postgresql veritabanda oluşturalım:

CREATE TABLE users (
    id SERIAL NOT NULL,
    name VARCHAR(255),
    email VARCHAR(255) UNIQUE NOT NULL,
    avatar VARCHAR(255),
    created_date TIMESTAMPTZ NOT NULL
);

Not: Veritabanınızın olduğunu varsayıyorum. İsmi veya kullanıcı şifresi hiç önemli değil.

Projenin içinde istediğimiz şeyleri yapan kodlar mevcut. Peki bu kodlar ne içeriyor. 

CDN on Git Server

Yakın zamanda bu kütüphaneyi tam da bu işleri yapması için yazdım. Dosya eklemek için set methodunu kullanıyoruz örneğin:

GitCDN.set({
    fileName: 'file.txt',
    content: Buffer.from('lorem ipsum'),
})
.then(status => console.log);

Dosya getirmek için ise get methodunu kullanıyoruz. Örneğin:

GitCDN.get('file.txt')
.then(data => console.log(data));

Tüm dokümantasyonu bu adreste mevcut.

İşte indirdiğimiz projenin içinde bu kütüphane yardımıyla dosya ekleme ve getirme süreçleri yazılmış durumda. Projenin kodlarını inceleyebilirsiniz. Kurulum için ise bir adım kaldı. GitLab üzerinde bir adet proje oluşturmak ve GitLab erişim anahtarı. Bunların elde edilmesi bu adreste yazılmış ancak kısa bahsedelim.

GitLab üzerinden bir proje oluşturun ve Project ID değerini kaydedin. GitLab Access Tokens alanından api değerine yetkisi olan bir anahtar oluşturun ve kaydedin. Sonra indirdiğimiz projedeki index.js dosyasında bulunan gerekli yerlere bu değerleri yazıp kaydedin.

Projeyi bilgisayarımızda çalıştıralım

Kurulumu da yaptığımıza göre npm start komutu ile projeyi başlatalım. İstek atmak için Postman kullanabilirsiniz. Örnek Postman koleksiyonu https://www.getpostman.com/collections/fd293d7fd271263593a4

Örneğin bir kullanıcı eklemek istediğinizde Add User isteğinden avatar, name, email değerini atarsanız kullanıcı eklenir:

O kişinin profil resmini getirmek için Get Avatar isteğini kullanabilirsiniz:

Gördüğünüz gibi resim yükleme ve getirme işlemi başarılı bir şekilde çalışıyor. Aynı zamanda GitLab'den eklenen resimleri görebilirsiniz. Benim deneme için eklediğim projede şöyle dosyalara birikmiş durumda:

Gelelim Heroku Tarafına

Uygulamamızı heroku tarafına yükleme için öncelikle bir heroku hesabına sahip olmalıyız. Heroku'ya kayıt olduktan sonra bilgisayarımızda oturum açmak için şu adımları takip edebilirsiniz: https://devcenter.heroku.com/articles/heroku-cli

heroku-cli kurulumunu yaptıktan sonra projemizi oluşturabiliriz. Oluşturmak için aşağıdaki komutu projenin dizininde çalıştıralım:

heroku create

Bu komutu çalıştırınca bir adres verecek bu adresi saklayın. Sonra kodlarımızı yüklemek için aşağıdaki komutu çalıştıralım:

git push heroku master

Sonra heroku uygulamasına postgresql eklemek için bir komut daha gireceğiz:

heroku addons:create heroku-postgresql:hobby-dev

Bundan sonra veritabanına tablo eklemek için heroku psql komutu ile bağlanıp tabloları oluşturalım:

heroku psql

::DATABASE=> CREATE TABLE users (
::DATABASE(>     id SERIAL NOT NULL,
::DATABASE(>     name VARCHAR(255),
::DATABASE(>     email VARCHAR(255) UNIQUE NOT NULL,
::DATABASE(>     avatar VARCHAR(255),
::DATABASE(>     created_date TIMESTAMPTZ NOT NULL
::DATABASE(> );
CREATE TABLE

Tablomuz da eklendiğine göre artık istekleri atabiliriz. Şimdi istekleri sakladığınız adrese atabiliriz. Artık kullanıcı ekleyebiliyor ve resmini getirebiliyoruz.

Genel özet

Postgresql kullanan bir Nodejs uygulamasını hemen hemen yapılabilecek iş uygulamalarıyla deneme fırsatımız oldu. Stream paketleri GitLab üzerinden yürütebilir bir hale getirdik.

Aslında eğer sisteminizi NoSQL olarak tasarladıyanız böyle bir sistem kullanmanıza gerek yok çünkü heroku NoSQL hizmet de sunuyor ve onun da belli bir limiti var. Dosyalarınızı NoSQL üzerinden yönetmek daha caziptir.

Verileri Taşımak

Herokudaki posgtresql veritabanının içerisindeki tüm verileri bilgisayarınıza indirip onu yeni postgresql veritabanına ekleyebilirsiniz. Bu adresten tüm detayları öğrenebilirsiniz.

Teşekkürler :)

Arkadaşlar beni uzun aralıklarla görüyorsunuzdur farkındayım, eğer makalelerimi merak ediyorsanız bloguma abone olarak bana destek olabilirsiniz. Böylelikle makaleleri kaçırmamış olursunuz. Beni okuduğunuz için teşekkürler :)

Yorumlar ({{totalCommentCount}})

  • Fatih Şen

    {{commentLike153Count}} beğenme 3 yıl önce

    Hocam merhabalar yazdıkarınızı okudum çok açıklayıcı olmuş teşkkürler . Fakat ben hala heroku da database oluşturmama rağmen tablo oluşturamıyorum. Database i de manual olarak oluşturdum kodlarla değil yani. Aldığım hata da bu Lütfen yardımcı olun. sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: posts
    Beğen Beğendin
  • Abdurrahman Eker

    {{commentLike154Count}} beğenme 3 yıl önce

    Merhaba Fatih, kullandığın kod sanırsam bir sqlite çalıştırmaya çalışıyor, heroku sqlite destekliyor mu bilmiyorum. Ben makalede sadece postgresql'den bahsettim. Database'i zaten manuel oluşturman gerekiyor, heroku addons'un satış politikası böyle.
    Beğen Beğendin
  • Düşündüklerin nedir ?

    Abdurrahman Eker

    (1010 Eylül 11111001100)

  • Full Stack Developer Turkey/Sivas
  • İnternette Avare Kodcu
  • coffee
  • github
  • instagram
  • linkedin
  • youtube
  • Yeni içeriklerden haberdar olmak ister misin ?