Modern Web Uygulamalarını DigitalOcean’a Hızlı ve Güvenli Bir Şekilde Nasıl Dağıtabilirsiniz?
Günümüzün rekabetçi dijital dünyasında, web uygulamalarını hızlı, güvenilir ve kesintisiz bir şekilde canlıya almak, geliştiriciler için kritik bir başarı faktörüdür. Ancak bu süreç, genellikle karmaşık konfigürasyonlar, sunucu yönetimi ve sürekli bakım gerektiren zorlu bir mücadeleye dönüşebilir. Özellikle küçük ve orta ölçekli projelerde, DevOps süreçlerine ayrılacak zaman ve kaynak kısıtlı olduğunda, basit ama güçlü bir dağıtım aracı hayati önem taşır. İşte tam da bu noktada, Kamal devreye giriyor. Kamal, popüler bulut sağlayıcılardan biri olan DigitalOcean üzerinde, Docker container’larını kullanarak Fizzy gibi herhangi bir web uygulamasını otomatikleştirilmiş bir şekilde dağıtmanıza olanak tanır. Bu makalede, Kamal’ın sunduğu kolaylıkları, DigitalOcean’ın esnek altyapısını ve Fizzy uygulamasının bu ekosistemde nasıl hayat bulduğunu adım adım inceleyeceğiz. Otomatik SSL sertifikaları, sıfır kesintiyle güncellemeler ve basitleştirilmiş yönetimle dağıtım süreçlerinizi nasıl dönüştürebileceğinizi keşfedin.
Bu rehber, Kamal’ı sıfırdan öğrenmek isteyenlerden, mevcut dağıtım süreçlerini optimize etmek isteyen deneyimli geliştiricilere kadar geniş bir kitleye hitap etmektedir. Amacımız, Fizzy uygulamasını DigitalOcean’a taşırken karşılaşabileceğiniz tüm adımları, pratik örnekler ve açıklayıcı bilgilerle anlaşılır kılmaktır. Böylece, karmaşık altyapı detaylarına takılmadan, uygulamanızın geliştirilmesine daha fazla odaklanabilirsiniz. Hazırsanız, Kamal’ın büyülü dünyasına dalalım ve Fizzy’nizi bulutlara taşıyalım!
Kamal, Fizzy ve DigitalOcean: Temel Taşlar Nelerdir?
Herhangi bir dağıtım sürecine başlamadan önce, kullanacağımız temel araçları ve platformları iyi anlamak önemlidir. Bu bölümde, Kamal’ın ne olduğunu, örnek uygulamamız Fizzy’nin neyi temsil ettiğini ve DigitalOcean’ın bu ekosistemdeki rolünü detaylı bir şekilde ele alacağız. Bu temel bilgiler, sonraki adımları daha kolay kavramanıza yardımcı olacaktır.
Kamal Nedir ve Neden Tercih Edilmeli?
Kamal (eski adıyla MRSK), Ruby on Rails’in yaratıcıları olan 37signals ekibi tarafından geliştirilmiş, Docker container’larını kullanarak web uygulamalarını dağıtmak için tasarlanmış basit ama güçlü bir dağıtım aracıdır. Kamal’ın temel felsefesi “basitlik” ve “otomasyon” üzerine kuruludur. Karmaşık Kubernetes kümeleri veya ağır CI/CD boru hatları kurmak yerine, Kamal tek bir YAML dosyası ve birkaç komutla uygulamanızı sunucuya dağıtmanızı sağlar. Bu, özellikle küçük ekipler veya bireysel geliştiriciler için büyük bir avantajdır, çünkü DevOps yükünü önemli ölçüde azaltır.
Kamal’ın en önemli özelliklerinden biri, yerleşik bir yük dengeleyici ve ters proxy olan Traefik ile entegrasyonudur. Bu entegrasyon sayesinde, otomatik SSL sertifikaları (Let’s Encrypt aracılığıyla) ve sıfır kesintiyle dağıtım (zero-downtime deployment) gibi gelişmiş özellikler kutudan çıktığı gibi gelir. Kamal, uygulamanızı Docker imajı olarak alır, belirlediğiniz sunuculara SSH üzerinden bağlanır, imajı çeker, yeni container’ı başlatır ve eski container’ı sorunsuz bir şekilde kapatır. Tüm bu süreç, tek bir komutla yönetilir ve uygulamanızın sürekli erişilebilir olmasını sağlar. Kamal’ın hafif yapısı ve Docker ekosistemiyle uyumu, onu modern web uygulamaları için cazip bir dağıtım çözümü haline getirir.
Fizzy Uygulaması Ne Anlama Geliyor?
Bu rehberde “Fizzy” adını verdiğimiz uygulama, aslında herhangi bir modern web uygulamasını temsil etmektedir. İster bir Ruby on Rails uygulaması, ister Node.js tabanlı bir API, isterse de Go ile yazılmış bir mikroservis olsun, önemli olan uygulamanızın bir Docker imajı olarak paketlenebilmesidir. Fizzy, bu senaryoda, Kamal’ın dağıtım yeteneklerini göstermek için kullandığımız genel bir yer tutucudur. Uygulamanızın içinde ne olduğu, Kamal için birincil endişe kaynağı değildir; Kamal sadece Docker imajınızı alır ve onu belirlenen sunucularda çalıştırır.
Örnek bir Fizzy uygulaması, basit bir HTTP sunucusu olabilir. Örneğin, bir “Merhaba Dünya” mesajı döndüren veya basit bir CRUD (Oluşturma, Okuma, Güncelleme, Silme) operasyonu gerçekleştiren bir web uygulaması düşünün. Bu uygulamanın Dockerfile’ı ve gerekli bağımlılıkları içeren bir Docker imajı olması yeterlidir. Bu sayede, rehber boyunca anlatılan dağıtım adımları, kendi uygulamanız için de kolayca uyarlanabilir olacaktır. Fizzy, Kamal’ın platform bağımsızlığını ve Docker’ın kapsülleme gücünü vurgulayan ideal bir örnektir.
DigitalOcean’ın Dağıtım Süreçlerindeki Rolü Nedir?
DigitalOcean, geliştiriciler için tasarlanmış, kullanımı kolay bir bulut altyapısı sağlayıcısıdır. “Droplet” adı verilen sanal makineleriyle tanınır ve geliştiricilere hızlı bir şekilde sunucu kaynakları sağlamak konusunda oldukça başarılıdır. DigitalOcean’ın basit arayüzü, uygun fiyatlandırması ve güçlü API’si, özellikle başlangıç seviyesindeki kullanıcılar ve hızlı prototipleme ihtiyacı olan projeler için idealdir.
Bu rehberde DigitalOcean’ı tercih etmemizin temel nedenleri şunlardır:
- Kolay Kullanım: Droplet oluşturma, SSH anahtarı ekleme ve DNS yönetimi gibi işlemler DigitalOcean panelinden son derece basittir.
- Performans: SSD tabanlı Droplet’ler ve optimize edilmiş ağ altyapısı, uygulamalarınız için iyi bir performans sunar.
- Ölçeklenebilirlik: İhtiyaç duyduğunuzda kolayca daha büyük Droplet’lere geçiş yapabilir veya yük dengeleyicilerle birden fazla Droplet arasında trafiği dağıtabilirsiniz.
- Maliyet Etkinliği: Özellikle başlangıç seviyesinde, diğer bulut sağlayıcılara göre daha uygun fiyatlı çözümler sunar.
Kamal, DigitalOcean’ın sunduğu bu esnek ve yönetilebilir altyapı üzerinde Docker container’larını çalıştırarak, dağıtım sürecini daha da kolaylaştırır. Bir DigitalOcean Droplet’i, Kamal’ın uygulamanızı dağıtacağı hedef sunucu görevi görecektir. Ayrıca, DigitalOcean’ın yönetilen veritabanı servisleri veya nesne depolama (Spaces) gibi ek hizmetleri, Fizzy uygulamanızın ihtiyaç duyabileceği diğer bileşenleri sağlamak için kullanılabilir. Bu entegrasyon, uygulamanızın tüm yaşam döngüsünü tek bir bulut sağlayıcı üzerinde yönetmenize olanak tanır.
Kamal ile DigitalOcean Ortamının Hazırlanması: Adım Adım Rehber
Kamal ile Fizzy uygulamanızı DigitalOcean’a dağıtmadan önce, temel altyapı bileşenlerini hazırlamamız gerekiyor. Bu bölüm, bir DigitalOcean Droplet’i oluşturmaktan, gerekli yazılımları kurmaya ve DNS ayarlarını yapmaya kadar olan tüm ön hazırlık adımlarını detaylandıracaktır. Her adım, uygulamanızın sorunsuz bir şekilde canlıya alınması için kritik öneme sahiptir.
DigitalOcean Droplet Oluşturma ve SSH Erişimi Nasıl Yapılır?
İlk adım, uygulamanızı barındıracak bir DigitalOcean Droplet’i oluşturmaktır. Bir Droplet, temel olarak bir sanal sunucudur. İşte adım adım nasıl yapacağınız:
- DigitalOcean Hesabı Oluşturma/Giriş Yapma: Eğer yoksa bir DigitalOcean hesabı oluşturun veya mevcut hesabınıza giriş yapın.
- Droplet Oluşturma: Yönetim panelinde “Create” (Oluştur) butonuna tıklayın ve “Droplets” seçeneğini seçin.
- İşletim Sistemi Seçimi: Kamal, Docker tabanlı olduğu için herhangi bir Linux dağıtımıyla çalışabilir. Ancak, genellikle Ubuntu LTS (Long Term Support) sürümleri önerilir (örneğin, Ubuntu 22.04 LTS).
- Plan Seçimi: Uygulamanızın ihtiyaçlarına göre bir plan seçin. Başlangıç için en ucuz planlar (örneğin, 1 CPU, 1GB RAM) yeterli olabilir, ancak uygulamanızın yüküne göre daha güçlü bir plan seçmeniz gerekebilir.
- Veri Merkezi Bölgesi: Kullanıcılarınıza en yakın veri merkezini seçmek, uygulamanızın performansını artıracaktır (daha düşük gecikme süresi).
- Kimlik Doğrulama (Authentication): Burası çok önemli! SSH anahtarı eklemelisiniz. Daha önce bir SSH anahtarı oluşturmadıysanız, yerel makinenizde aşağıdaki komutla bir tane oluşturabilirsiniz:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"Ardından, genel anahtarınızı (genellikle
~/.ssh/id_rsa.pubdosyasında bulunur) DigitalOcean’a kopyalayıp yeni bir SSH anahtarı olarak ekleyin. Bu, parolasız ve güvenli bir şekilde sunucuya bağlanmanızı sağlar. - Droplet Sayısı ve İsimlendirme: Bir Droplet oluşturun ve ona anlamlı bir isim verin (örneğin,
fizzy-app-server). - Oluşturmayı Tamamlama: “Create Droplet” butonuna tıklayın. Birkaç dakika içinde Droplet’iniz hazır olacaktır.
Droplet’iniz oluşturulduktan sonra, size bir genel IP adresi atanacaktır. Bu IP adresi ile SSH üzerinden sunucuya bağlanabilirsiniz. SSH anahtarınızın yerel makinenizde doğru şekilde yapılandırıldığından emin olun. Ardından, aşağıdaki komutu kullanarak Droplet’inize bağlanın:
ssh root@your_droplet_ip
Bağlantı başarılı olursa, sunucunuzun komut satırına erişmiş olacaksınız. Bu, Kamal’ın dağıtım yapacağı hedef ortamdır.
Docker ve Kamal Kurulumu İçin Gerekli Adımlar Nelerdir?
Droplet’inize SSH ile bağlandıktan sonra, Kamal’ın çalışması için gerekli olan Docker Engine’i ve Kamal CLI aracını kurmamız gerekiyor. Bu adımlar, uygulamanızın container’lar içinde çalıştırılmasını ve Kamal’ın bu container’ları yönetmesini sağlayacaktır.
- Sistem Güncellemesi: Her zaman olduğu gibi, sunucunuzu güncelleyerek başlayın:
sudo apt update && sudo apt upgrade -y - Docker Engine Kurulumu: Docker’ı kurmanın en kolay yolu, Docker’ın resmi kurulum betiğini kullanmaktır:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.shKurulumdan sonra, mevcut kullanıcınızı (genellikle
rootveya kendi oluşturduğunuz bir kullanıcı)dockergrubuna ekleyereksudokullanmadan Docker komutlarını çalıştırmasını sağlayın. Bu, Kamal’ın sorunsuz çalışması için önemlidir:sudo usermod -aG docker root # Eğer root kullanıyorsanız # veya sudo usermod -aG docker your_username # Kendi kullanıcınız varsa newgrp docker # Değişikliklerin hemen uygulanması içinDocker’ın doğru şekilde kurulduğunu test etmek için:
docker run hello-worldBu komut “Hello from Docker!” mesajını döndürmelidir.
- Kamal CLI Kurulumu: Kamal, bir Ruby Gem’i olarak dağıtılır. Bu nedenle, yerel makinenizde Ruby ve RubyGems’in kurulu olması gerekmektedir. Eğer yoksa, RVM veya rbenv gibi bir Ruby versiyon yöneticisi kullanarak kolayca kurabilirsiniz. Kurulduktan sonra, Kamal’ı yüklemek için aşağıdaki komutu çalıştırın:
gem install kamalEğer Homebrew kullanıyorsanız (macOS veya Linux üzerinde):
brew install kamalKurulumun başarılı olduğunu doğrulamak için:
kamal --versionBu, Kamal’ın kurulu sürümünü göstermelidir. Unutmayın, Kamal CLI yerel makinenizde kurulur, DigitalOcean Droplet’inde değil. Kamal, SSH üzerinden Droplet’inizdeki Docker’ı yönetecek.
DNS Ayarları ve Alan Adı Yönlendirmesi Nasıl Yapılır?
Uygulamanızın internet üzerinden erişilebilir olması için bir alan adına ihtiyacınız olacak ve bu alan adını DigitalOcean Droplet’inizin IP adresine yönlendirmeniz gerekecek. Bu adım, kullanıcıların tarayıcılarına alan adınızı yazdıklarında Fizzy uygulamanıza ulaşmasını sağlayacaktır.
- Alan Adı Temini: Henüz bir alan adınız yoksa, bir alan adı kayıt şirketinden (Godaddy, Namecheap vb.) bir tane satın almanız gerekmektedir.
- DigitalOcean’da Alan Adı Ekleme: DigitalOcean panelinde “Networking” (Ağ) bölümüne gidin ve “Domains” (Alan Adları) sekmesini seçin. “Add Domain” (Alan Adı Ekle) butonuna tıklayın ve alan adınızı girin.
- A Kaydı Oluşturma: Alan adınızı ekledikten sonra, DigitalOcean otomatik olarak birkaç DNS kaydı oluşturacaktır. Sizin için en önemlisi “A kaydı”dır. Bir “A kaydı” oluşturun veya mevcut olanı düzenleyin:
- Hostname (Ana Bilgisayar Adı):
@(bu, ana alan adınız için geçerlidir, örneğinexample.com) veyawww(örneğinwww.example.com) veya uygulamanız için özel bir alt alan adı (örneğinapp.example.com). - Will Direct To (Yönleneceği Yer): Oluşturduğunuz Droplet’inizi seçin. DigitalOcean otomatik olarak Droplet’inizin IP adresini dolduracaktır.
# Örnek A kaydı yapılandırması # Hostname | Type | Value | TTL # ----------|------|-------------------|------ # @ | A | your_droplet_ip | 3600 # www | A | your_droplet_ip | 3600 - Hostname (Ana Bilgisayar Adı):
- NS Kayıtlarını Güncelleme: Alan adınızı satın aldığınız kayıt şirketinin paneline gidin ve alan adınızın NS (Name Server) kayıtlarını DigitalOcean’ın NS sunucularına yönlendirin. DigitalOcean’ın NS sunucuları genellikle şunlardır:
ns1.digitalocean.comns2.digitalocean.comns3.digitalocean.com
Bu adım, DigitalOcean’ın alan adınızın DNS kayıtlarını yönetmesini sağlayacaktır.
- Yayılma Süresi (Propagation): DNS değişikliklerinin internet genelinde yayılması biraz zaman alabilir (genellikle birkaç dakika ila birkaç saat). Bu süre zarfında alan adınız henüz Droplet’inize yönlenmeyebilir. Yayılma durumunu kontrol etmek için DNS Checker gibi araçları kullanabilirsiniz.
app.example.com, api.example.com) aynı Droplet’e yönlendirecekseniz, her biri için ayrı bir A kaydı oluşturmanız gerekecektir. Kamal’ın Traefik entegrasyonu sayesinde, bu alt alan adları için otomatik SSL sertifikaları almanız da mümkün olacaktır.
Tüm bu adımları tamamladıktan sonra, DigitalOcean Droplet’iniz, Docker Engine’iniz ve Kamal CLI’niz dağıtıma hazır hale gelmiş demektir. Ayrıca, alan adınız da uygulamanıza yönlendirilmiş olacaktır. Artık Fizzy uygulamanızın Kamal ile konfigürasyonuna geçebiliriz.
Fizzy Uygulamasının Kamal ile Dağıtım Konfigürasyonu
Ortam kurulumunu tamamladığımıza göre, şimdi sıra Fizzy uygulamanızın Kamal ile nasıl dağıtılacağını belirleyen ana konfigürasyon dosyasına geldi: config/deploy.yml. Bu dosya, Kamal’ın uygulamanızı nasıl derleyeceğini, hangi sunuculara dağıtacağını, hangi ortam değişkenlerini kullanacağını ve Traefik ile nasıl entegre olacağını tanımlar. Bu bölüm, bu kritik dosyanın her bir bölümünü ve uygulamanız için nasıl özelleştireceğinizi açıklayacaktır.
config/deploy.yml Dosyasını Anlama ve Yapılandırma
Kamal, tüm dağıtım mantığını config/deploy.yml adlı tek bir YAML dosyasında toplar. Bu dosya, projenizin kök dizininde veya config/ dizini altında bulunmalıdır. İşte temel bir deploy.yml dosyasının yapısı ve önemli parametreleri:
# config/deploy.yml
service: fizzy # Uygulamanızın adı (Docker container adı olarak kullanılır)
image: your_docker_username/fizzy # Docker Hub veya özel registry'deki imajınızın yolu
# Dağıtım yapılacak sunucular
servers:
- your_droplet_ip # DigitalOcean Droplet'inizin IP adresi
# Dağıtım ortamları (production, staging vb.)
# Genellikle "production" ortamı kullanılır
# Bu bölüm, uygulamanızın farklı ortamlar için farklı ayarlar kullanmasını sağlar.
# Örneğin, veritabanı bağlantı bilgileri gibi.
production:
# Ortam değişkenleri
env:
SECRET_KEY_BASE: TBD # Uygulamanızın ihtiyaç duyduğu gizli anahtarlar
RAILS_ENV: production # Rails uygulamaları için
DATABASE_URL: postgresql://user:password@host:port/database # Veritabanı URL'si
# Bağlantı noktası eşlemeleri (host:container)
port: 80 # Uygulamanızın dinleyeceği port
# Traefik (yük dengeleyici ve ters proxy) ayarları
# Kamal, Traefik'i otomatik olarak yönetir ve SSL sertifikalarını sağlar.
traefik:
args:
# Traefik'in dinleyeceği portlar
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# Docker sağlayıcısını etkinleştir
- --providers.docker=true
- --providers.docker.exposedbydefault=false
# Let's Encrypt için sertifika çözücü
- --certificatesresolvers.le.acme.email=your_email@example.com
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.caserver=https://acme-v02.api.letsencrypt.org/directory
- --certificatesresolvers.le.acme.tlschallenge=true # TLS Challenge ile domain doğrulaması
# Docker imajının oluşturulacağı dizin (genellikle uygulama kök dizini)
build:
args:
# Dockerfile'a iletilecek argümanlar
RUBY_VERSION: 3.2.2 # Eğer Ruby uygulaması ise
secrets:
- GIT_SSH_KEY # Özel bir git deposundan çekim yapılıyorsa
cache: true # Docker build cache kullanılsın mı?
# Dağıtım kancaları (hooks)
# Dağıtım öncesi veya sonrası çalıştırılacak komutlar
hooks:
pre_build: "echo 'Building Fizzy Docker image...'"
post_release: "echo 'Fizzy deployed successfully!'"
# Docker registry ayarları (isteğe bağlı, Docker Hub kullanmıyorsanız)
# registry:
# username: your_registry_username
# password:
# - ENV['REGISTRY_PASSWORD']
Bu dosyadaki anahtar bölümler:
serviceveimage: Uygulamanızın adını ve Docker imajının yolunu tanımlar. Docker imajınızın bir container registry’de (örneğin Docker Hub) herkese açık veya kimlik doğrulamasıyla erişilebilir olması gerekir.servers: Uygulamanızın dağıtılacağı DigitalOcean Droplet’lerinin IP adreslerini listeler. Birden fazla sunucu ekleyerek yük dengelemeyi ve yüksek erişilebilirliği sağlayabilirsiniz.production: Ortam spesifik ayarları içerir.envaltında uygulamanızın ihtiyaç duyduğu tüm ortam değişkenlerini tanımlayabilirsiniz. Özellikle hassas bilgiler (veritabanı şifreleri, API anahtarları) içinSECRET_KEY_BASE: TBDgibi yer tutucular kullanın ve bunlarıkamal env pushkomutu ile sunucuya güvenli bir şekilde aktarın.port: Uygulamanızın Docker container’ı içinde dinleyeceği portu belirtir.traefik: Kamal’ın Traefik’i nasıl yapılandıracağını tanımlar. Bu bölümde, Traefik’in hangi portları dinleyeceği, Docker sağlayıcısını nasıl kullanacağı ve Let’s Encrypt ile otomatik SSL sertifikalarını nasıl alacağı belirtilir.certificatesresolvers.le.acme.emailalanına geçerli bir e-posta adresi girdiğinizden emin olun.build: Docker imajınızın nasıl oluşturulacağına dair ayarları içerir. Dockerfile’ınıza argümanlar geçirebilir, gizli dosyaları kullanabilir ve önbelleklemeyi etkinleştirebilirsiniz.hooks: Dağıtım yaşam döngüsünün belirli noktalarında (örneğin, imaj oluşturulmadan önce veya yeni sürüm yayınlandıktan sonra) çalıştırılacak komutları tanımlar.
Bu deploy.yml dosyasını kendi projenizin gereksinimlerine göre doldurmanız ve özelleştirmeniz gerekmektedir. Özellikle your_docker_username/fizzy kısmını kendi Docker imajınızın adıyla, your_droplet_ip kısmını DigitalOcean Droplet’inizin IP adresiyle ve your_email@example.com kısmını kendi e-posta adresinizle değiştirmeyi unutmayın.
Veritabanı ve Diğer Servisler İçin Ayarlamalar Nasıl Yapılır?
Fizzy uygulamanızın bir veritabanına veya başka bir harici servise (örneğin Redis, dosya depolama) ihtiyacı varsa, bu servisleri de dağıtım stratejinize dahil etmeniz gerekir. DigitalOcean, bu konuda çeşitli seçenekler sunar:
- DigitalOcean Managed Databases: En kolay ve önerilen yöntem, DigitalOcean’ın yönetilen veritabanı hizmetlerini kullanmaktır (PostgreSQL, MySQL, Redis). Bu hizmetler, yedekleme, ölçeklendirme ve güvenlik gibi operasyonel yükleri sizin üzerinizden alır. Bir yönetilen veritabanı oluşturduğunuzda, size bir bağlantı URL’si (örneğin
DATABASE_URL) verilecektir. Bu URL’yideploy.ymldosyasındakienvbölümüne eklemeniz yeterlidir.# config/deploy.yml içinde production: env: DATABASE_URL: postgresql://doadmin:YOUR_PASSWORD@db-host.ondigitalocean.com:25060/defaultdb?sslmode=requireBu yaklaşım, veritabanı yönetimi karmaşıklığını Kamal’ın kapsamı dışına çıkarır ve basitleştirir.
- Docker Compose ile Ek Servisler: Eğer veritabanınızı veya diğer servisleri (örneğin Redis) aynı Droplet üzerinde çalıştırmak istiyorsanız, Kamal ile birlikte Docker Compose kullanabilirsiniz. Kamal,
docker-compose.ymldosyasını doğrudan desteklemez, ancak birdocker-compose.ymldosyası oluşturup manuel olarak başlatabilir veyahookskullanarak Kamal dağıtım sürecine entegre edebilirsiniz. Bu yöntem daha fazla yönetim gerektirir ancak tam kontrol sağlar.# docker-compose.yml örneği (Droplet üzerinde manuel olarak çalıştırılacak) version: '3.8' services: db: image: postgres:14 restart: always environment: POSTGRES_DB: fizzy_prod POSTGRES_USER: fizzy POSTGRES_PASSWORD: mysecretpassword volumes: - db_data:/var/lib/postgresql/data redis: image: redis:6-alpine restart: always volumes: db_data:Bu
docker-compose.ymldosyasını sunucunuza kopyalayıpdocker compose up -dkomutuyla başlatabilirsiniz. Ardından, uygulamanızın ortam değişkenlerini buna göre ayarlamanız gerekir. - DigitalOcean Spaces (S3 Uyumlu Depolama): Uygulamanızın statik dosyalar veya kullanıcı tarafından yüklenen dosyalar için depolamaya ihtiyacı varsa, DigitalOcean Spaces kullanabilirsiniz. Bu, S3 uyumlu bir nesne depolama hizmetidir ve uygulamanızın dosya depolama yükünü sunucudan alır.
deploy.yml dosyasına yazmak yerine, kamal env push komutuyla sunucuya güvenli bir şekilde yüklemeyi tercih edin. Bu, hassas bilgilerin versiyon kontrol sistemine (Git) girmesini engeller. Örneğin, kamal env push --env production komutunu çalıştırdığınızda, Kamal yerel .env.production dosyanızdaki değişkenleri sunucuya şifreli olarak yükler.
SSL Sertifikaları ve Traefik Entegrasyonu Nasıl Sağlanır?
Modern web uygulamaları için HTTPS kullanımı bir zorunluluktur. Kamal, bu süreci Traefik ile entegrasyonu sayesinde inanılmaz derecede basitleştirir. Yukarıdaki deploy.yml örneğinde gördüğünüz gibi, Traefik ayarları, Let’s Encrypt aracılığıyla otomatik SSL sertifikaları almanızı sağlar.
Traefik, Kamal tarafından Droplet’inize ayrı bir Docker container’ı olarak dağıtılır. Gelen tüm HTTP (80) ve HTTPS (443) trafiğini dinler. Bir kullanıcı alan adınız üzerinden uygulamanıza erişmeye çalıştığında:
- Traefik, gelen isteği yakalar.
- Eğer isteğiniz HTTP üzerinden geliyorsa, Traefik otomatik olarak HTTPS’e yönlendirme yapar.
- Traefik, alan adınız için geçerli bir SSL sertifikası olup olmadığını kontrol eder. Eğer yoksa veya süresi dolmuşsa, Let’s Encrypt ile iletişime geçerek yeni bir sertifika talep eder. Bu süreç,
tlschallengemekanizması sayesinde alan adınızın sahipliğini otomatik olarak doğrular. - Sertifika alındıktan sonra, Traefik bu sertifikayı kullanır ve şifreli trafiği Fizzy uygulamanızın container’ına yönlendirir.
Bu otomatikleştirilmiş süreç sayesinde, SSL sertifikalarını manuel olarak yönetmek, yenilemek veya sunucuya kurmak gibi karmaşık işlemlerle uğraşmanıza gerek kalmaz. Tek yapmanız gereken, deploy.yml dosyasında Traefik ayarlarını doğru bir şekilde yapılandırmak ve geçerli bir e-posta adresi sağlamaktır. Traefik, sertifikaları /letsencrypt/acme.json yolunda saklar, bu nedenle bu dosyanın kalıcı olması için Kamal, Traefik container’ı için bir Docker volume bağlar.
Bu konfigürasyonlarla, Fizzy uygulamanız DigitalOcean üzerinde güvenli ve erişilebilir hale gelecektir. Artık ilk dağıtımı gerçekleştirmeye hazırsınız!
İlk Dağıtım ve Uygulamanın Canlıya Alınması
Tüm ön hazırlıklar ve konfigürasyonlar tamamlandıktan sonra, sıra Fizzy uygulamanızı DigitalOcean’a ilk kez dağıtmaya gelir. Kamal’ın gücü, bu süreci tek bir komutla ve sıfır kesintiyle gerçekleştirebilmesinde yatar. Bu bölümde, ilk dağıtımın nasıl yapılacağını, dağıtım sonrası kontrolleri ve uygulamanızı nasıl güncelleyip geri alabileceğinizi ele alacağız.
Kamal Deploy Komutu ve Süreci Nasıl İşler?
Kamal ile uygulamanızı dağıtmak, yerel makinenizden çalıştıracağınız tek bir komutla başlar:
kamal deploy
Bu komutu çalıştırdığınızda, Kamal arka planda aşağıdaki adımları otomatik olarak gerçekleştirir:
- SSH Bağlantısı: Kamal,
deploy.ymldosyasında belirtilen sunuculara SSH üzerinden bağlanır. - Docker İmajı Oluşturma (Build): Yerel makinenizde, uygulamanızın kök dizinindeki Dockerfile’ı kullanarak yeni bir Docker imajı oluşturur. Bu imaj,
deploy.ymldosyasında belirtilenimageadını ve etiketini (genellikle bir zaman damgası) alır. - İmajı Kayıt Defterine Gönderme (Push): Oluşturulan Docker imajını,
deploy.ymldosyasında belirtilen Docker kayıt defterine (varsayılan olarak Docker Hub) gönderir. - Sunucularda İmajı Çekme (Pull): Her bir hedef sunucuya bağlanır ve yeni Docker imajını kayıt defterinden çeker.
- Yeni Container’ı Başlatma: Çekilen imajı kullanarak yeni bir Docker container’ı başlatır. Bu container, uygulamanızın yeni sürümünü içerir. Kamal, yeni container’ın sağlıklı bir şekilde çalıştığından emin olmak için sağlık kontrolleri yapar.
- Yük Dengeleyici Güncelleme: Traefik (veya kullandığınız başka bir yük dengeleyici) konfigürasyonunu güncelleyerek gelen trafiği yeni container’a yönlendirir.
- Eski Container’ı Durdurma: Yeni container başarılı bir şekilde çalıştığında ve trafik almaya başladığında, Kamal eski container’ı durdurur ve kaldırır. Bu “rolling update” mekanizması, uygulamanızın sıfır kesintiyle güncellenmesini sağlar.
- Gereksiz İmajları Temizleme: Eski Docker imajlarını ve container’larını temizleyerek sunucu disk alanını boşaltır.
Bu süreç boyunca, Kamal komut satırında size ilerleme hakkında bilgi verecektir. Her adımın başarıyla tamamlandığından emin olmak için çıktıları dikkatlice takip etmeniz önemlidir. Özellikle ilk dağıtımda, herhangi bir hata mesajı alırsanız, deploy.yml dosyanızdaki konfigürasyonları ve sunucu ayarlarını kontrol etmeniz gerekebilir.
Dağıtım Sonrası Kontroller ve Log İzleme Nasıl Yapılır?
Dağıtım başarılı olduktan sonra, uygulamanızın gerçekten çalıştığını ve beklendiği gibi davrandığını doğrulamak önemlidir. Ayrıca, herhangi bir sorun durumunda logları izlemek, sorun giderme için hayati önem taşır.
- Uygulamanın Erişilebilirliğini Kontrol Etme: Tarayıcınızda alan adınızı ziyaret edin (örneğin
https://fizzy.example.com). Uygulamanızın ana sayfasını veya beklenen çıktıyı görmelisiniz. Eğer bir sorunla karşılaşırsanız, aşağıdaki adımlara geçin. - Kamal Durumunu Kontrol Etme: Kamal’ın sunucudaki durumunu kontrol etmek için:
kamal statusBu komut, çalışan container’lar, imajlar ve Traefik’in durumu hakkında genel bir bakış sunar.
- Uygulama Loglarını İzleme: Uygulamanızın loglarını canlı olarak takip etmek için Kamal’ın log komutunu kullanabilirsiniz:
kamal logs -fBu komut, tüm uygulama container’larından gelen logları tek bir akışta gösterir. Herhangi bir hata mesajı veya uyarı olup olmadığını kontrol edin. Eğer sadece belirli bir container’ın loglarını görmek isterseniz,
docker logskomutunu doğrudan Droplet üzerinde de kullanabilirsiniz. - Traefik Loglarını Kontrol Etme: SSL sertifikası veya yönlendirme sorunları yaşıyorsanız, Traefik’in loglarını kontrol etmek faydalı olabilir:
kamal traefik logs -fBu, Traefik’in ne yaptığını ve neden bir isteği işleyemediğini anlamanıza yardımcı olabilir.
Bu kontroller, uygulamanızın canlı ortamda sorunsuz çalıştığından emin olmanızı ve olası sorunları hızla tespit etmenizi sağlar.
Uygulama Güncelleme ve Geri Alma İşlemleri Nasıl Gerçekleştirilir?
Uygulamanızda yeni özellikler geliştirdiğinizde veya hataları düzelttiğinizde, güncellenmiş sürümü dağıtmanız gerekecektir. Kamal, bu süreci de ilk dağıtım kadar kolay hale getirir.
- Uygulama Güncelleme: Uygulamanızın kodunda değişiklikler yaptıktan sonra, yeni bir Docker imajı oluşturmanız ve bunu kayıt defterine göndermeniz gerekir. Kamal’ın
deploykomutu, bu adımları otomatik olarak gerçekleştirir. Tekrarkamal deploykomutunu çalıştırın:kamal deployKamal, mevcut imajı ve çalışan container’ı tespit edecek, yeni imajı çekecek, yeni container’ı başlatacak ve sıfır kesintiyle eski container’ı değiştirecektir.
- Uygulama Geri Alma (Rollback): Bazen, yeni bir dağıtım beklenmedik sorunlara neden olabilir. Bu durumda, uygulamanızı önceki, çalışan bir sürüme geri almak isteyebilirsiniz. Kamal, bu senaryo için de basit bir çözüm sunar:
kamal rollbackBu komut, uygulamanızı otomatik olarak bir önceki başarılı dağıtım sürümüne geri döndürür. Eğer daha eski bir sürüme dönmek isterseniz, belirli bir imaj etiketini belirtebilirsiniz. Kamal, varsayılan olarak son 5 başarılı dağıtımın imajlarını saklar.
Kamal’ın bu basit ve güçlü komutları, uygulama yaşam döngüsünü yönetmeyi son derece kolaylaştırır. Geliştiriciler, karmaşık dağıtım boru hatlarıyla uğraşmak yerine, kod yazmaya ve uygulama geliştirmeye odaklanabilirler. Bu, özellikle sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçlerini basitleştirmek isteyen ekipler için büyük bir avantajdır.
Gelişmiş Kamal Özellikleri ve En İyi Uygulamalar
Kamal, basit bir dağıtım aracı olmasına rağmen, daha karmaşık senaryolar için de gelişmiş özellikler sunar. Bu bölümde, çoklu sunucu dağıtımları, CI/CD entegrasyonu ve performans optimizasyonları gibi konulara değineceğiz. Bu ipuçları, Fizzy uygulamanızın daha ölçeklenebilir, güvenli ve verimli çalışmasına yardımcı olacaktır.
Çoklu Sunucu Dağıtımları ve Yük Dengeleme Nasıl Yapılır?
Tek bir DigitalOcean Droplet’i, küçük ve orta ölçekli uygulamalar için yeterli olabilir. Ancak, uygulamanızın trafiği arttıkça veya daha yüksek erişilebilirlik gereksinimleri ortaya çıktıkça, birden fazla sunucuya dağıtım yapmak kaçınılmaz hale gelir. Kamal, bu senaryoyu deploy.yml dosyasındaki servers listesini genişleterek kolayca destekler.
Birden fazla Droplet’e dağıtım yapmak için:
- Yeni Droplet’ler Oluşturun: DigitalOcean panelinden mevcut Droplet’inizle aynı konfigürasyonda (işletim sistemi, SSH anahtarları vb.) yeni Droplet’ler oluşturun. Her birine ayrı bir genel IP adresi atanacaktır.
deploy.ymlDosyasını Güncelleyin:config/deploy.ymldosyanızdakiserversbölümüne yeni Droplet’lerin IP adreslerini ekleyin:# config/deploy.yml servers: - your_droplet_ip_1 - your_droplet_ip_2 - your_droplet_ip_3- Kamal Deploy Çalıştırın: Normal
kamal deploykomutunu çalıştırın. Kamal, her bir sunucuya sırayla bağlanacak, Docker imajını çekecek ve uygulamanızın bir örneğini çalıştıracaktır.
Kamal, her sunucuya ayrı bir Traefik container’ı dağıtır ve bu Traefik örnekleri, kendi sunucularındaki uygulama container’ları arasında yük dengelemesi yapar. Ancak, birden fazla sunucu arasında trafiği dağıtmak için harici bir yük dengeleyiciye ihtiyacınız olacaktır. DigitalOcean, bu amaçla “Load Balancers” (Yük Dengeleyiciler) hizmeti sunar. Bir DigitalOcean Load Balancer oluşturup, arka uç sunucular olarak tüm Droplet’lerinizi ekleyerek, gelen trafiği Droplet’leriniz arasında dağıtabilirsiniz. Bu, hem uygulamanızın performansını artırır hem de bir Droplet’in arızalanması durumunda uygulamanızın erişilebilirliğini sağlar (yüksek erişilebilirlik).
Sıfır Kesinti Dağıtımı (Zero-Downtime Deployment) Mekanizmaları Nelerdir?
Kamal’ın en çekici özelliklerinden biri, sıfır kesinti dağıtımını yerleşik olarak desteklemesidir. Bu, uygulamanızın güncellenmesi sırasında kullanıcıların herhangi bir hizmet kesintisi yaşamayacağı anlamına gelir. Kamal bunu “rolling update” (kademeli güncelleme) stratejisiyle başarır:
- Yeni Docker imajı çekilir ve yeni bir container başlatılır.
- Kamal, yeni container’ın tamamen başlatıldığını ve sağlık kontrollerinden geçtiğini doğrular (örneğin, HTTP sağlık kontrolü endpoint’ine başarılı bir yanıt gelmesi beklenir).
- Yeni container sağlıklı olarak onaylandığında, Traefik gelen trafiği kademeli olarak yeni container’a yönlendirmeye başlar.
- Tüm trafik yeni container’a yönlendirildikten ve eski container’da aktif bağlantı kalmadığından emin olunduktan sonra, eski container nazikçe kapatılır ve kaldırılır.
Bu süreç, her zaman en az bir çalışan uygulama örneğinin mevcut olmasını sağlayarak kesintisiz bir kullanıcı deneyimi sunar. Bu mekanizma, özellikle e-ticaret siteleri veya sürekli erişilebilirlik gerektiren diğer kritik uygulamalar için hayati öneme sahiptir.
CI/CD Entegrasyonu ve Otomatik Dağıtım Süreçleri Nasıl Kurulur?
Kamal, manuel dağıtımları basitleştirse de, modern bir geliştirme iş akışında sürekli entegrasyon ve sürekli dağıtım (CI/CD) boru hatları vazgeçilmezdir. Kamal, bu boru hatlarına kolayca entegre edilebilir.
Örneğin, GitHub Actions veya GitLab CI gibi araçlarla Kamal’ı kullanarak otomatik dağıtım yapabilirsiniz:
- GitHub Actions Workflow Örneği:
# .github/workflows/deploy.yml name: Deploy Fizzy to DigitalOcean with Kamal on: push: branches: - main # Ana dala yapılan her push'ta tetikle jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.2.2' # Uygulamanızın Ruby versiyonu - name: Install Kamal run: gem install kamal - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Deploy with Kamal env: # Kamal'ın SSH anahtarını kullanması için # Bu anahtar, DigitalOcean Droplet'inize erişim sağlamalıdır. # secrets.SSH_PRIVATE_KEY olarak GitHub Secrets'a ekleyin. SSH_AUTH_SOCK: /tmp/ssh_agent.sock run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa ssh-keyscan -H your_droplet_ip >> ~/.ssh/known_hosts kamal deployBu workflow, her
maindalına yapılan push işleminde Kamal’ı çalıştırarak uygulamanızı otomatik olarak dağıtacaktır.secrets.DOCKER_USERNAME,secrets.DOCKER_PASSWORDvesecrets.SSH_PRIVATE_KEYgibi hassas bilgileri GitHub Secrets olarak eklemeyi unutmayın.
Bu tür bir CI/CD entegrasyonu, geliştirme sürecinizi hızlandırır, insan hatalarını azaltır ve uygulamanızın sürekli olarak güncel kalmasını sağlar.
Güvenlik İpuçları ve Performans Optimizasyonları Nelerdir?
Uygulamanızın güvenliğini ve performansını artırmak için bazı en iyi uygulamaları takip etmek önemlidir:
- Güvenlik Duvarı (Firewall): DigitalOcean Droplet’leriniz için bir güvenlik duvarı (Cloud Firewall) yapılandırın. Yalnızca gerekli portlara (HTTP için 80, HTTPS için 443, SSH için 22) erişime izin verin. Gelen SSH bağlantılarını belirli IP adresleriyle kısıtlamak, güvenliği artıracaktır.
- Ortam Değişkenleri ve Sırlar: Hassas bilgileri (veritabanı şifreleri, API anahtarları) asla doğrudan
deploy.ymldosyasına yazmayın. Bunun yerine,kamal env pushkomutunu kullanarak bu sırları güvenli bir şekilde sunucuya aktarın ve ortam değişkenleri olarak kullanın. - Docker İmajı Optimizasyonu: Daha küçük Docker imajları, daha hızlı dağıtım ve daha az disk alanı tüketimi anlamına gelir. Multi-stage build (çok aşamalı derleme) kullanarak derleme bağımlılıklarını nihai imajdan çıkarın. Gereksiz dosyaları
.dockerignoreile hariç tutun.Uzman İpucu: Dağıtım öncesi Docker imajınızın boyutunu optimize etmek, hem dağıtım süresini kısaltır hem de sunucu kaynak tüketimini azaltır. Multi-stage build kullanmayı düşünebilirsiniz. Örneğin:# Dockerfile örneği (Multi-stage build) # Aşama 1: Bağımlılıkları kur FROM ruby:3.2.2-slim-bullseye as builder WORKDIR /app COPY Gemfile Gemfile.lock ./ RUN bundle install --without development test # Aşama 2: Uygulamayı oluştur FROM ruby:3.2.2-slim-bullseye WORKDIR /app COPY --from=builder /usr/local/bundle /usr/local/bundle COPY . . CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"] - İzleme ve Loglama: Uygulamanızın performansını ve sağlığını izlemek için DigitalOcean’ın yerleşik izleme araçlarını veya Prometheus/Grafana gibi harici çözümleri kullanın. Logları merkezi bir yerde toplamak (örneğin, Logtail, Papertrail) sorun gidermeyi kolaylaştırır.
- Yedeklemeler: DigitalOcean Droplet’lerinizin düzenli anlık görüntülerini (snapshots) alın veya yönetilen veritabanları kullanıyorsanız otomatik yedeklemeleri etkinleştirin. Bu, veri kaybı durumunda kurtarma için kritik öneme sahiptir.
- Mobil Uyumlu Tasarım: Uygulamanızın mobil cihazlarda da sorunsuz çalışması için responsive tasarım prensiplerine uyun. CSS media query’leri bu konuda size yardımcı olacaktır.
Uzman İpucu: Mobil cihazlar için responsive tasarım yaparken, CSS media query’lerini doğru kullanmak kritik öneme sahiptir. Örneğin:
@media (max-width: 768px) { .container { width: 100%; padding: 15px; } .sidebar { display: none; } }Bu kod bloğu, ekran genişliği 768 pikselin altına düştüğünde belirli stillerin nasıl uygulanacağını gösterir, böylece mobil cihazlarda daha iyi bir kullanıcı deneyimi sunulur.
Bu gelişmiş özellikler ve en iyi uygulamalar, Kamal ile dağıtım deneyiminizi daha da zenginleştirecek ve uygulamanızın uzun vadede başarılı olmasını sağlayacaktır. Kamal’ın esnekliği, ihtiyaçlarınız büyüdükçe bu tür geliştirmeleri kolayca entegre etmenize olanak tanır.
Sonuç: Kamal ile Geleceğin Dağıtım Pratikleri
Bu makale boyunca, Kamal’ın gücünü kullanarak Fizzy uygulamasını DigitalOcean’a nasıl dağıtacağımızı adım adım inceledik. Karmaşık dağıtım süreçlerinin nasıl basitleştirilebileceğini, Docker container’larının esnekliğini ve DigitalOcean’ın sağlam altyapısını bir araya getirerek modern web uygulamalarını canlıya almanın ne kadar kolay olabileceğini gördük. Kamal, otomatik SSL sertifikaları, sıfır kesintiyle güncellemeler ve tek bir YAML dosyasıyla yönetilebilir konfigürasyon gibi özellikleriyle geliştiricilere büyük bir kolaylık sağlamaktadır.
Kamal’ın minimalist yaklaşımı, özellikle DevOps süreçlerine yeni başlayanlar veya mevcut dağıtım yükünü azaltmak isteyen küçük ve orta ölçekli ekipler için ideal bir çözümdür. Geliştiricilerin altyapı detaylarına takılmadan, doğrudan ürün geliştirmeye odaklanmalarına olanak tanır. DigitalOcean ile birleştiğinde ise, güçlü, uygun maliyetli ve ölçeklenebilir bir dağıtım ekosistemi ortaya çıkar. Umarız bu rehber, kendi uygulamalarınızı Kamal ve DigitalOcean ile bulutlara taşımanız için size ilham vermiş ve yol göstermiştir. Geleceğin dağıtım pratikleri, şüphesiz ki otomasyon, sadelik ve verimlilik üzerine kuruludur ve Kamal bu vizyonu gerçeğe dönüştüren önemli araçlardan biridir.
Sıkça Sorulan Sorular
-
Kamal sadece Ruby on Rails uygulamaları için mi?
Hayır, Kamal herhangi bir Docker imajını dağıtabilir. Bu, Ruby on Rails, Node.js, Python, Go veya herhangi bir başka dilde yazılmış uygulamanızı Kamal ile dağıtabileceğiniz anlamına gelir. Önemli olan, uygulamanızın bir Dockerfile’a sahip olması ve bir Docker imajı olarak paketlenebilmesidir.
-
DigitalOcean’da veritabanı yönetimi nasıl yapılır?
DigitalOcean, PostgreSQL, MySQL ve Redis gibi popüler veritabanları için yönetilen hizmetler sunar. Bu hizmetler, veritabanı kurulumu, yedekleme, ölçeklendirme ve güvenlik gibi operasyonel yükleri sizin üzerinizden alır. Dağıtım sırasında, bu yönetilen veritabanlarının bağlantı URL’lerini uygulamanızın ortam değişkenlerine eklemeniz yeterlidir.
-
Dağıtım sırasında bir sorun olursa ne yapmalıyım?
İlk olarak,
kamal logs -fkomutuyla uygulama loglarını kontrol edin. Hata mesajları genellikle sorunun kaynağını gösterir. Ayrıca,kamal statusile çalışan container’ların durumunu kontrol edebilir vekamal traefik logs -file Traefik loglarına bakabilirsiniz. Eğer yeni bir dağıtım sorunlara neden olduysa,kamal rollbackkomutunu kullanarak önceki çalışan sürüme hızla geri dönebilirsiniz. -
Kamal ile birden fazla uygulama dağıtabilir miyim?
Evet, Kamal ile aynı sunucuya veya farklı sunuculara birden fazla uygulama dağıtabilirsiniz. Her uygulama için ayrı bir Kamal projesi ve
deploy.ymldosyası oluşturmanız gerekir. Her uygulamanınserviceadı benzersiz olmalı ve Traefik ayarlarında farklı alan adları veya alt alan adları kullanılarak yönlendirme yapılmalıdır. -
Kamal’ın alternatifleri nelerdir?
Kamal’a benzer işlevsellik sunan alternatifler arasında Docker Swarm, Kubernetes (daha karmaşık), Capistrano (Ruby odaklı), Ansible ve Terraform gibi araçlar bulunmaktadır. Ancak, Kamal’ın Docker container’ları ve Traefik entegrasyonu ile sunduğu basitlik ve sıfır kesinti dağıtım yeteneği, onu birçok senaryo için benzersiz bir seçenek haline getirir.