{"id":36231,"date":"2025-12-11T00:21:28","date_gmt":"2025-12-10T21:21:28","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/"},"modified":"2025-12-11T00:21:28","modified_gmt":"2025-12-10T21:21:28","slug":"modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/","title":{"rendered":"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?"},"content":{"rendered":"<p><title>Kamal ile Fizzy Uygulamas\u0131n\u0131 DigitalOcean&#8217;a Sorunsuz Da\u011f\u0131tma Rehberi<\/title><br \/>\n<body><\/p>\n<h2>Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, <a href=\"https:\/\/kamal-deploy.org\/\">Kamal<\/a> devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan <a href=\"https:\/\/www.digitalocean.com\/\">DigitalOcean<\/a> \u00fczerinde, Docker container&#8217;lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal&#8217;\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean&#8217;\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.<\/p>\n<p>Bu rehber, Kamal&#8217;\u0131 s\u0131f\u0131rdan \u00f6\u011frenmek isteyenlerden, mevcut da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini optimize etmek isteyen deneyimli geli\u015ftiricilere kadar geni\u015f bir kitleye hitap etmektedir. Amac\u0131m\u0131z, Fizzy uygulamas\u0131n\u0131 DigitalOcean&#8217;a ta\u015f\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz t\u00fcm ad\u0131mlar\u0131, pratik \u00f6rnekler ve a\u00e7\u0131klay\u0131c\u0131 bilgilerle anla\u015f\u0131l\u0131r k\u0131lmakt\u0131r. B\u00f6ylece, karma\u015f\u0131k altyap\u0131 detaylar\u0131na tak\u0131lmadan, uygulaman\u0131z\u0131n geli\u015ftirilmesine daha fazla odaklanabilirsiniz. Haz\u0131rsan\u0131z, Kamal&#8217;\u0131n b\u00fcy\u00fcl\u00fc d\u00fcnyas\u0131na dalal\u0131m ve Fizzy&#8217;nizi bulutlara ta\u015f\u0131yal\u0131m!<\/p>\n<h2>Kamal, Fizzy ve DigitalOcean: Temel Ta\u015flar Nelerdir?<\/h2>\n<p>Herhangi bir da\u011f\u0131t\u0131m s\u00fcrecine ba\u015flamadan \u00f6nce, kullanaca\u011f\u0131m\u0131z temel ara\u00e7lar\u0131 ve platformlar\u0131 iyi anlamak \u00f6nemlidir. Bu b\u00f6l\u00fcmde, Kamal&#8217;\u0131n ne oldu\u011funu, \u00f6rnek uygulamam\u0131z Fizzy&#8217;nin neyi temsil etti\u011fini ve DigitalOcean&#8217;\u0131n bu ekosistemdeki rol\u00fcn\u00fc detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z. Bu temel bilgiler, sonraki ad\u0131mlar\u0131 daha kolay kavraman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Kamal Nedir ve Neden Tercih Edilmeli?<\/h3>\n<p>Kamal (eski ad\u0131yla MRSK), Ruby on Rails&#8217;in yarat\u0131c\u0131lar\u0131 olan 37signals ekibi taraf\u0131ndan geli\u015ftirilmi\u015f, Docker container&#8217;lar\u0131n\u0131 kullanarak web uygulamalar\u0131n\u0131 da\u011f\u0131tmak i\u00e7in tasarlanm\u0131\u015f basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131d\u0131r. Kamal&#8217;\u0131n temel felsefesi &#8220;basitlik&#8221; ve &#8220;otomasyon&#8221; \u00fczerine kuruludur. Karma\u015f\u0131k Kubernetes k\u00fcmeleri veya a\u011f\u0131r CI\/CD boru hatlar\u0131 kurmak yerine, Kamal tek bir YAML dosyas\u0131 ve birka\u00e7 komutla uygulaman\u0131z\u0131 sunucuya da\u011f\u0131tman\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle k\u00fc\u00e7\u00fck ekipler veya bireysel geli\u015ftiriciler i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r, \u00e7\u00fcnk\u00fc DevOps y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p>Kamal&#8217;\u0131n en \u00f6nemli \u00f6zelliklerinden biri, yerle\u015fik bir y\u00fck dengeleyici ve ters proxy olan <a href=\"https:\/\/traefik.io\/\">Traefik<\/a> ile entegrasyonudur. Bu entegrasyon sayesinde, otomatik SSL sertifikalar\u0131 (Let&#8217;s Encrypt arac\u0131l\u0131\u011f\u0131yla) ve s\u0131f\u0131r kesintiyle da\u011f\u0131t\u0131m (zero-downtime deployment) gibi geli\u015fmi\u015f \u00f6zellikler kutudan \u00e7\u0131kt\u0131\u011f\u0131 gibi gelir. Kamal, uygulaman\u0131z\u0131 Docker imaj\u0131 olarak al\u0131r, belirledi\u011finiz sunuculara SSH \u00fczerinden ba\u011flan\u0131r, imaj\u0131 \u00e7eker, yeni container&#8217;\u0131 ba\u015flat\u0131r ve eski container&#8217;\u0131 sorunsuz bir \u015fekilde kapat\u0131r. T\u00fcm bu s\u00fcre\u00e7, tek bir komutla y\u00f6netilir ve uygulaman\u0131z\u0131n s\u00fcrekli eri\u015filebilir olmas\u0131n\u0131 sa\u011flar. Kamal&#8217;\u0131n hafif yap\u0131s\u0131 ve Docker ekosistemiyle uyumu, onu modern web uygulamalar\u0131 i\u00e7in cazip bir da\u011f\u0131t\u0131m \u00e7\u00f6z\u00fcm\u00fc haline getirir.<\/p>\n<h3>Fizzy Uygulamas\u0131 Ne Anlama Geliyor?<\/h3>\n<p>Bu rehberde &#8220;Fizzy&#8221; ad\u0131n\u0131 verdi\u011fimiz uygulama, asl\u0131nda herhangi bir modern web uygulamas\u0131n\u0131 temsil etmektedir. \u0130ster bir Ruby on Rails uygulamas\u0131, ister Node.js tabanl\u0131 bir API, isterse de Go ile yaz\u0131lm\u0131\u015f bir mikroservis olsun, \u00f6nemli olan uygulaman\u0131z\u0131n bir Docker imaj\u0131 olarak paketlenebilmesidir. Fizzy, bu senaryoda, Kamal&#8217;\u0131n da\u011f\u0131t\u0131m yeteneklerini g\u00f6stermek i\u00e7in kulland\u0131\u011f\u0131m\u0131z genel bir yer tutucudur. Uygulaman\u0131z\u0131n i\u00e7inde ne oldu\u011fu, Kamal i\u00e7in birincil endi\u015fe kayna\u011f\u0131 de\u011fildir; Kamal sadece Docker imaj\u0131n\u0131z\u0131 al\u0131r ve onu belirlenen sunucularda \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<p>\u00d6rnek bir Fizzy uygulamas\u0131, basit bir HTTP sunucusu olabilir. \u00d6rne\u011fin, bir &#8220;Merhaba D\u00fcnya&#8221; mesaj\u0131 d\u00f6nd\u00fcren veya basit bir CRUD (Olu\u015fturma, Okuma, G\u00fcncelleme, Silme) operasyonu ger\u00e7ekle\u015ftiren bir web uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu uygulaman\u0131n Dockerfile&#8217;\u0131 ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren bir Docker imaj\u0131 olmas\u0131 yeterlidir. Bu sayede, rehber boyunca anlat\u0131lan da\u011f\u0131t\u0131m ad\u0131mlar\u0131, kendi uygulaman\u0131z i\u00e7in de kolayca uyarlanabilir olacakt\u0131r. Fizzy, Kamal&#8217;\u0131n platform ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 ve Docker&#8217;\u0131n kaps\u00fclleme g\u00fcc\u00fcn\u00fc vurgulayan ideal bir \u00f6rnektir.<\/p>\n<h3>DigitalOcean&#8217;\u0131n Da\u011f\u0131t\u0131m S\u00fcre\u00e7lerindeki Rol\u00fc Nedir?<\/h3>\n<p><a href=\"https:\/\/www.digitalocean.com\/\">DigitalOcean<\/a>, geli\u015ftiriciler i\u00e7in tasarlanm\u0131\u015f, kullan\u0131m\u0131 kolay bir bulut altyap\u0131s\u0131 sa\u011flay\u0131c\u0131s\u0131d\u0131r. &#8220;Droplet&#8221; ad\u0131 verilen sanal makineleriyle tan\u0131n\u0131r ve geli\u015ftiricilere h\u0131zl\u0131 bir \u015fekilde sunucu kaynaklar\u0131 sa\u011flamak konusunda olduk\u00e7a ba\u015far\u0131l\u0131d\u0131r. DigitalOcean&#8217;\u0131n basit aray\u00fcz\u00fc, uygun fiyatland\u0131rmas\u0131 ve g\u00fc\u00e7l\u00fc API&#8217;si, \u00f6zellikle ba\u015flang\u0131\u00e7 seviyesindeki kullan\u0131c\u0131lar ve h\u0131zl\u0131 prototipleme ihtiyac\u0131 olan projeler i\u00e7in idealdir.<\/p>\n<p>Bu rehberde DigitalOcean&#8217;\u0131 tercih etmemizin temel nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Kolay Kullan\u0131m:<\/strong> Droplet olu\u015fturma, SSH anahtar\u0131 ekleme ve DNS y\u00f6netimi gibi i\u015flemler DigitalOcean panelinden son derece basittir.<\/li>\n<li><strong>Performans:<\/strong> SSD tabanl\u0131 Droplet&#8217;ler ve optimize edilmi\u015f a\u011f altyap\u0131s\u0131, uygulamalar\u0131n\u0131z i\u00e7in iyi bir performans sunar.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> \u0130htiya\u00e7 duydu\u011funuzda kolayca daha b\u00fcy\u00fck Droplet&#8217;lere ge\u00e7i\u015f yapabilir veya y\u00fck dengeleyicilerle birden fazla Droplet aras\u0131nda trafi\u011fi da\u011f\u0131tabilirsiniz.<\/li>\n<li><strong>Maliyet Etkinli\u011fi:<\/strong> \u00d6zellikle ba\u015flang\u0131\u00e7 seviyesinde, di\u011fer bulut sa\u011flay\u0131c\u0131lara g\u00f6re daha uygun fiyatl\u0131 \u00e7\u00f6z\u00fcmler sunar.<\/li>\n<\/ul>\n<p>Kamal, DigitalOcean&#8217;\u0131n sundu\u011fu bu esnek ve y\u00f6netilebilir altyap\u0131 \u00fczerinde Docker container&#8217;lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak, da\u011f\u0131t\u0131m s\u00fcrecini daha da kolayla\u015ft\u0131r\u0131r. Bir DigitalOcean Droplet&#8217;i, Kamal&#8217;\u0131n uygulaman\u0131z\u0131 da\u011f\u0131taca\u011f\u0131 hedef sunucu g\u00f6revi g\u00f6recektir. Ayr\u0131ca, DigitalOcean&#8217;\u0131n y\u00f6netilen veritaban\u0131 servisleri veya nesne depolama (Spaces) gibi ek hizmetleri, Fizzy uygulaman\u0131z\u0131n ihtiya\u00e7 duyabilece\u011fi di\u011fer bile\u015fenleri sa\u011flamak i\u00e7in kullan\u0131labilir. Bu entegrasyon, uygulaman\u0131z\u0131n t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc tek bir bulut sa\u011flay\u0131c\u0131 \u00fczerinde y\u00f6netmenize olanak tan\u0131r.<\/p>\n<h2>Kamal ile DigitalOcean Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Kamal ile Fizzy uygulaman\u0131z\u0131 DigitalOcean&#8217;a da\u011f\u0131tmadan \u00f6nce, temel altyap\u0131 bile\u015fenlerini haz\u0131rlamam\u0131z gerekiyor. Bu b\u00f6l\u00fcm, bir DigitalOcean Droplet&#8217;i olu\u015fturmaktan, gerekli yaz\u0131l\u0131mlar\u0131 kurmaya ve DNS ayarlar\u0131n\u0131 yapmaya kadar olan t\u00fcm \u00f6n haz\u0131rl\u0131k ad\u0131mlar\u0131n\u0131 detayland\u0131racakt\u0131r. Her ad\u0131m, uygulaman\u0131z\u0131n sorunsuz bir \u015fekilde canl\u0131ya al\u0131nmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>DigitalOcean Droplet Olu\u015fturma ve SSH Eri\u015fimi Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>\u0130lk ad\u0131m, uygulaman\u0131z\u0131 bar\u0131nd\u0131racak bir DigitalOcean Droplet&#8217;i olu\u015fturmakt\u0131r. Bir Droplet, temel olarak bir sanal sunucudur. \u0130\u015fte ad\u0131m ad\u0131m nas\u0131l yapaca\u011f\u0131n\u0131z:<\/p>\n<ol>\n<li><strong>DigitalOcean Hesab\u0131 Olu\u015fturma\/Giri\u015f Yapma:<\/strong> E\u011fer yoksa bir DigitalOcean hesab\u0131 olu\u015fturun veya mevcut hesab\u0131n\u0131za giri\u015f yap\u0131n.<\/li>\n<li><strong>Droplet Olu\u015fturma:<\/strong> Y\u00f6netim panelinde &#8220;Create&#8221; (Olu\u015ftur) butonuna t\u0131klay\u0131n ve &#8220;Droplets&#8221; se\u00e7ene\u011fini se\u00e7in.<\/li>\n<li><strong>\u0130\u015fletim Sistemi Se\u00e7imi:<\/strong> Kamal, Docker tabanl\u0131 oldu\u011fu i\u00e7in herhangi bir Linux da\u011f\u0131t\u0131m\u0131yla \u00e7al\u0131\u015fabilir. Ancak, genellikle Ubuntu LTS (Long Term Support) s\u00fcr\u00fcmleri \u00f6nerilir (\u00f6rne\u011fin, Ubuntu 22.04 LTS).<\/li>\n<li><strong>Plan Se\u00e7imi:<\/strong> Uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re bir plan se\u00e7in. Ba\u015flang\u0131\u00e7 i\u00e7in en ucuz planlar (\u00f6rne\u011fin, 1 CPU, 1GB RAM) yeterli olabilir, ancak uygulaman\u0131z\u0131n y\u00fck\u00fcne g\u00f6re daha g\u00fc\u00e7l\u00fc bir plan se\u00e7meniz gerekebilir.<\/li>\n<li><strong>Veri Merkezi B\u00f6lgesi:<\/strong> Kullan\u0131c\u0131lar\u0131n\u0131za en yak\u0131n veri merkezini se\u00e7mek, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131racakt\u0131r (daha d\u00fc\u015f\u00fck gecikme s\u00fcresi).<\/li>\n<li><strong>Kimlik Do\u011frulama (Authentication):<\/strong> Buras\u0131 \u00e7ok \u00f6nemli! SSH anahtar\u0131 eklemelisiniz. Daha \u00f6nce bir SSH anahtar\u0131 olu\u015fturmad\u0131ysan\u0131z, yerel makinenizde a\u015fa\u011f\u0131daki komutla bir tane olu\u015fturabilirsiniz:\n<pre><code>\n        ssh-keygen -t rsa -b 4096 -C \"your_email@example.com\"\n      <\/code><\/pre>\n<p>      Ard\u0131ndan, genel anahtar\u0131n\u0131z\u0131 (genellikle <code class=\"language-\">~\/.ssh\/id_rsa.pub<\/code> dosyas\u0131nda bulunur) DigitalOcean&#8217;a kopyalay\u0131p yeni bir SSH anahtar\u0131 olarak ekleyin. Bu, parolas\u0131z ve g\u00fcvenli bir \u015fekilde sunucuya ba\u011flanman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>Droplet Say\u0131s\u0131 ve \u0130simlendirme:<\/strong> Bir Droplet olu\u015fturun ve ona anlaml\u0131 bir isim verin (\u00f6rne\u011fin, <code class=\"language-\">fizzy-app-server<\/code>).<\/li>\n<li><strong>Olu\u015fturmay\u0131 Tamamlama:<\/strong> &#8220;Create Droplet&#8221; butonuna t\u0131klay\u0131n. Birka\u00e7 dakika i\u00e7inde Droplet&#8217;iniz haz\u0131r olacakt\u0131r.<\/li>\n<\/ol>\n<p>Droplet&#8217;iniz olu\u015fturulduktan sonra, size bir genel IP adresi atanacakt\u0131r. Bu IP adresi ile SSH \u00fczerinden sunucuya ba\u011flanabilirsiniz. SSH anahtar\u0131n\u0131z\u0131n yerel makinenizde do\u011fru \u015fekilde yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun. Ard\u0131ndan, a\u015fa\u011f\u0131daki komutu kullanarak Droplet&#8217;inize ba\u011flan\u0131n:<\/p>\n<pre><code>\n    ssh root@your_droplet_ip\n  <\/code><\/pre>\n<p>Ba\u011flant\u0131 ba\u015far\u0131l\u0131 olursa, sunucunuzun komut sat\u0131r\u0131na eri\u015fmi\u015f olacaks\u0131n\u0131z. Bu, Kamal&#8217;\u0131n da\u011f\u0131t\u0131m yapaca\u011f\u0131 hedef ortamd\u0131r.<\/p>\n<h3>Docker ve Kamal Kurulumu \u0130\u00e7in Gerekli Ad\u0131mlar Nelerdir?<\/h3>\n<p>Droplet&#8217;inize SSH ile ba\u011fland\u0131ktan sonra, Kamal&#8217;\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan Docker Engine&#8217;i ve Kamal CLI arac\u0131n\u0131 kurmam\u0131z gerekiyor. Bu ad\u0131mlar, uygulaman\u0131z\u0131n container&#8217;lar i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 ve Kamal&#8217;\u0131n bu container&#8217;lar\u0131 y\u00f6netmesini sa\u011flayacakt\u0131r.<\/p>\n<ol>\n<li><strong>Sistem G\u00fcncellemesi:<\/strong> Her zaman oldu\u011fu gibi, sunucunuzu g\u00fcncelleyerek ba\u015flay\u0131n:\n<pre><code>\n        sudo apt update && sudo apt upgrade -y\n      <\/code><\/pre>\n<\/li>\n<li><strong>Docker Engine Kurulumu:<\/strong> Docker&#8217;\u0131 kurman\u0131n en kolay yolu, Docker&#8217;\u0131n resmi kurulum beti\u011fini kullanmakt\u0131r:\n<pre><code>\n        curl -fsSL https:\/\/get.docker.com -o get-docker.sh\n        sudo sh get-docker.sh\n      <\/code><\/pre>\n<p>      Kurulumdan sonra, mevcut kullan\u0131c\u0131n\u0131z\u0131 (genellikle <code class=\"language-\">root<\/code> veya kendi olu\u015fturdu\u011funuz bir kullan\u0131c\u0131) <code class=\"language-\">docker<\/code> grubuna ekleyerek <code class=\"language-\">sudo<\/code> kullanmadan Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flay\u0131n. Bu, Kamal&#8217;\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in \u00f6nemlidir:<\/p>\n<pre><code>\n        sudo usermod -aG docker root # E\u011fer root kullan\u0131yorsan\u0131z\n        # veya\n        sudo usermod -aG docker your_username # Kendi kullan\u0131c\u0131n\u0131z varsa\n        newgrp docker # De\u011fi\u015fikliklerin hemen uygulanmas\u0131 i\u00e7in\n      <\/code><\/pre>\n<p>      Docker&#8217;\u0131n do\u011fru \u015fekilde kuruldu\u011funu test etmek i\u00e7in:<\/p>\n<pre><code>\n        docker run hello-world\n      <\/code><\/pre>\n<p>      Bu komut &#8220;Hello from Docker!&#8221; mesaj\u0131n\u0131 d\u00f6nd\u00fcrmelidir.<\/li>\n<li><strong>Kamal CLI Kurulumu:<\/strong> Kamal, bir Ruby Gem&#8217;i olarak da\u011f\u0131t\u0131l\u0131r. Bu nedenle, yerel makinenizde Ruby ve RubyGems&#8217;in kurulu olmas\u0131 gerekmektedir. E\u011fer yoksa, <a href=\"https:\/\/rvm.io\/\" target=\"_blank\">RVM<\/a> veya <a href=\"https:\/\/rbenv.org\/\" target=\"_blank\">rbenv<\/a> gibi bir Ruby versiyon y\u00f6neticisi kullanarak kolayca kurabilirsiniz. Kurulduktan sonra, Kamal&#8217;\u0131 y\u00fcklemek i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:\n<pre><code>\n        gem install kamal\n      <\/code><\/pre>\n<p>      E\u011fer Homebrew kullan\u0131yorsan\u0131z (macOS veya Linux \u00fczerinde):<\/p>\n<pre><code>\n        brew install kamal\n      <\/code><\/pre>\n<p>      Kurulumun ba\u015far\u0131l\u0131 oldu\u011funu do\u011frulamak i\u00e7in:<\/p>\n<pre><code>\n        kamal --version\n      <\/code><\/pre>\n<p>      Bu, Kamal&#8217;\u0131n kurulu s\u00fcr\u00fcm\u00fcn\u00fc g\u00f6stermelidir. Unutmay\u0131n, Kamal CLI yerel makinenizde kurulur, DigitalOcean Droplet&#8217;inde de\u011fil. Kamal, SSH \u00fczerinden Droplet&#8217;inizdeki Docker&#8217;\u0131 y\u00f6netecek.<\/li>\n<\/ol>\n<h3>DNS Ayarlar\u0131 ve Alan Ad\u0131 Y\u00f6nlendirmesi Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Uygulaman\u0131z\u0131n internet \u00fczerinden eri\u015filebilir olmas\u0131 i\u00e7in bir alan ad\u0131na ihtiyac\u0131n\u0131z olacak ve bu alan ad\u0131n\u0131 DigitalOcean Droplet&#8217;inizin IP adresine y\u00f6nlendirmeniz gerekecek. Bu ad\u0131m, kullan\u0131c\u0131lar\u0131n taray\u0131c\u0131lar\u0131na alan ad\u0131n\u0131z\u0131 yazd\u0131klar\u0131nda Fizzy uygulaman\u0131za ula\u015fmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<ol>\n<li><strong>Alan Ad\u0131 Temini:<\/strong> Hen\u00fcz bir alan ad\u0131n\u0131z yoksa, bir alan ad\u0131 kay\u0131t \u015firketinden (Godaddy, Namecheap vb.) bir tane sat\u0131n alman\u0131z gerekmektedir.<\/li>\n<li><strong>DigitalOcean&#8217;da Alan Ad\u0131 Ekleme:<\/strong> DigitalOcean panelinde &#8220;Networking&#8221; (A\u011f) b\u00f6l\u00fcm\u00fcne gidin ve &#8220;Domains&#8221; (Alan Adlar\u0131) sekmesini se\u00e7in. &#8220;Add Domain&#8221; (Alan Ad\u0131 Ekle) butonuna t\u0131klay\u0131n ve alan ad\u0131n\u0131z\u0131 girin.<\/li>\n<li><strong>A Kayd\u0131 Olu\u015fturma:<\/strong> Alan ad\u0131n\u0131z\u0131 ekledikten sonra, DigitalOcean otomatik olarak birka\u00e7 DNS kayd\u0131 olu\u015fturacakt\u0131r. Sizin i\u00e7in en \u00f6nemlisi &#8220;A kayd\u0131&#8221;d\u0131r. Bir &#8220;A kayd\u0131&#8221; olu\u015fturun veya mevcut olan\u0131 d\u00fczenleyin:\n<ul>\n<li><strong>Hostname (Ana Bilgisayar Ad\u0131):<\/strong> <code class=\"language-\">@<\/code> (bu, ana alan ad\u0131n\u0131z i\u00e7in ge\u00e7erlidir, \u00f6rne\u011fin <code class=\"language-\">example.com<\/code>) veya <code class=\"language-\">www<\/code> (\u00f6rne\u011fin <code class=\"language-\">www.example.com<\/code>) veya uygulaman\u0131z i\u00e7in \u00f6zel bir alt alan ad\u0131 (\u00f6rne\u011fin <code class=\"language-\">app.example.com<\/code>).<\/li>\n<li><strong>Will Direct To (Y\u00f6nlenece\u011fi Yer):<\/strong> Olu\u015fturdu\u011funuz Droplet&#8217;inizi se\u00e7in. DigitalOcean otomatik olarak Droplet&#8217;inizin IP adresini dolduracakt\u0131r.<\/li>\n<\/ul>\n<pre><code>\n        # \u00d6rnek A kayd\u0131 yap\u0131land\u0131rmas\u0131\n        # Hostname  | Type | Value             | TTL\n        # ----------|------|-------------------|------\n        # @         | A    | your_droplet_ip   | 3600\n        # www       | A    | your_droplet_ip   | 3600\n      <\/code><\/pre>\n<\/li>\n<li><strong>NS Kay\u0131tlar\u0131n\u0131 G\u00fcncelleme:<\/strong> Alan ad\u0131n\u0131z\u0131 sat\u0131n ald\u0131\u011f\u0131n\u0131z kay\u0131t \u015firketinin paneline gidin ve alan ad\u0131n\u0131z\u0131n NS (Name Server) kay\u0131tlar\u0131n\u0131 DigitalOcean&#8217;\u0131n NS sunucular\u0131na y\u00f6nlendirin. DigitalOcean&#8217;\u0131n NS sunucular\u0131 genellikle \u015funlard\u0131r:\n<ul>\n<li><code class=\"language-\">ns1.digitalocean.com<\/code><\/li>\n<li><code class=\"language-\">ns2.digitalocean.com<\/code><\/li>\n<li><code class=\"language-\">ns3.digitalocean.com<\/code><\/li>\n<\/ul>\n<p>      Bu ad\u0131m, DigitalOcean&#8217;\u0131n alan ad\u0131n\u0131z\u0131n DNS kay\u0131tlar\u0131n\u0131 y\u00f6netmesini sa\u011flayacakt\u0131r.<\/li>\n<li><strong>Yay\u0131lma S\u00fcresi (Propagation):<\/strong> DNS de\u011fi\u015fikliklerinin internet genelinde yay\u0131lmas\u0131 biraz zaman alabilir (genellikle birka\u00e7 dakika ila birka\u00e7 saat). Bu s\u00fcre zarf\u0131nda alan ad\u0131n\u0131z hen\u00fcz Droplet&#8217;inize y\u00f6nlenmeyebilir. Yay\u0131lma durumunu kontrol etmek i\u00e7in <a href=\"https:\/\/dnschecker.org\/\" target=\"_blank\">DNS Checker<\/a> gibi ara\u00e7lar\u0131 kullanabilirsiniz.<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: E\u011fer birden fazla alt alan ad\u0131n\u0131 (\u00f6rne\u011fin, <code>app.example.com<\/code>, <code>api.example.com<\/code>) ayn\u0131 Droplet&#8217;e y\u00f6nlendirecekseniz, her biri i\u00e7in ayr\u0131 bir A kayd\u0131 olu\u015fturman\u0131z gerekecektir. Kamal&#8217;\u0131n Traefik entegrasyonu sayesinde, bu alt alan adlar\u0131 i\u00e7in otomatik SSL sertifikalar\u0131 alman\u0131z da m\u00fcmk\u00fcn olacakt\u0131r.\n  <\/div>\n<p>T\u00fcm bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, DigitalOcean Droplet&#8217;iniz, Docker Engine&#8217;iniz ve Kamal CLI&#8217;niz da\u011f\u0131t\u0131ma haz\u0131r hale gelmi\u015f demektir. Ayr\u0131ca, alan ad\u0131n\u0131z da uygulaman\u0131za y\u00f6nlendirilmi\u015f olacakt\u0131r. Art\u0131k Fizzy uygulaman\u0131z\u0131n Kamal ile konfig\u00fcrasyonuna ge\u00e7ebiliriz.<\/p>\n<h2>Fizzy Uygulamas\u0131n\u0131n Kamal ile Da\u011f\u0131t\u0131m Konfig\u00fcrasyonu<\/h2>\n<p>Ortam kurulumunu tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi s\u0131ra Fizzy uygulaman\u0131z\u0131n Kamal ile nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 belirleyen ana konfig\u00fcrasyon dosyas\u0131na geldi: <code class=\"language-\">config\/deploy.yml<\/code>. Bu dosya, Kamal&#8217;\u0131n uygulaman\u0131z\u0131 nas\u0131l derleyece\u011fini, hangi sunuculara da\u011f\u0131taca\u011f\u0131n\u0131, hangi ortam de\u011fi\u015fkenlerini kullanaca\u011f\u0131n\u0131 ve Traefik ile nas\u0131l entegre olaca\u011f\u0131n\u0131 tan\u0131mlar. Bu b\u00f6l\u00fcm, bu kritik dosyan\u0131n her bir b\u00f6l\u00fcm\u00fcn\u00fc ve uygulaman\u0131z i\u00e7in nas\u0131l \u00f6zelle\u015ftirece\u011finizi a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3><code class=\"language-\">config\/deploy.yml<\/code> Dosyas\u0131n\u0131 Anlama ve Yap\u0131land\u0131rma<\/h3>\n<p>Kamal, t\u00fcm da\u011f\u0131t\u0131m mant\u0131\u011f\u0131n\u0131 <code class=\"language-\">config\/deploy.yml<\/code> adl\u0131 tek bir YAML dosyas\u0131nda toplar. Bu dosya, projenizin k\u00f6k dizininde veya <code class=\"language-\">config\/<\/code> dizini alt\u0131nda bulunmal\u0131d\u0131r. \u0130\u015fte temel bir <code class=\"language-\">deploy.yml<\/code> dosyas\u0131n\u0131n yap\u0131s\u0131 ve \u00f6nemli parametreleri:<\/p>\n<pre><code>\n    # config\/deploy.yml\n    service: fizzy # Uygulaman\u0131z\u0131n ad\u0131 (Docker container ad\u0131 olarak kullan\u0131l\u0131r)\n    image: your_docker_username\/fizzy # Docker Hub veya \u00f6zel registry'deki imaj\u0131n\u0131z\u0131n yolu\n\n    # Da\u011f\u0131t\u0131m yap\u0131lacak sunucular\n    servers:\n      - your_droplet_ip # DigitalOcean Droplet'inizin IP adresi\n\n    # Da\u011f\u0131t\u0131m ortamlar\u0131 (production, staging vb.)\n    # Genellikle \"production\" ortam\u0131 kullan\u0131l\u0131r\n    # Bu b\u00f6l\u00fcm, uygulaman\u0131z\u0131n farkl\u0131 ortamlar i\u00e7in farkl\u0131 ayarlar kullanmas\u0131n\u0131 sa\u011flar.\n    # \u00d6rne\u011fin, veritaban\u0131 ba\u011flant\u0131 bilgileri gibi.\n    production:\n      # Ortam de\u011fi\u015fkenleri\n      env:\n        SECRET_KEY_BASE: TBD # Uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu gizli anahtarlar\n        RAILS_ENV: production # Rails uygulamalar\u0131 i\u00e7in\n        DATABASE_URL: postgresql:\/\/user:password@host:port\/database # Veritaban\u0131 URL'si\n\n      # Ba\u011flant\u0131 noktas\u0131 e\u015flemeleri (host:container)\n      port: 80 # Uygulaman\u0131z\u0131n dinleyece\u011fi port\n      \n      # Traefik (y\u00fck dengeleyici ve ters proxy) ayarlar\u0131\n      # Kamal, Traefik'i otomatik olarak y\u00f6netir ve SSL sertifikalar\u0131n\u0131 sa\u011flar.\n      traefik:\n        args:\n          # Traefik'in dinleyece\u011fi portlar\n          - --entrypoints.web.address=:80\n          - --entrypoints.websecure.address=:443\n          # Docker sa\u011flay\u0131c\u0131s\u0131n\u0131 etkinle\u015ftir\n          - --providers.docker=true\n          - --providers.docker.exposedbydefault=false\n          # Let's Encrypt i\u00e7in sertifika \u00e7\u00f6z\u00fcc\u00fc\n          - --certificatesresolvers.le.acme.email=your_email@example.com\n          - --certificatesresolvers.le.acme.storage=\/letsencrypt\/acme.json\n          - --certificatesresolvers.le.acme.caserver=https:\/\/acme-v02.api.letsencrypt.org\/directory\n          - --certificatesresolvers.le.acme.tlschallenge=true # TLS Challenge ile domain do\u011frulamas\u0131\n\n    # Docker imaj\u0131n\u0131n olu\u015fturulaca\u011f\u0131 dizin (genellikle uygulama k\u00f6k dizini)\n    build:\n      args:\n        # Dockerfile'a iletilecek arg\u00fcmanlar\n        RUBY_VERSION: 3.2.2 # E\u011fer Ruby uygulamas\u0131 ise\n      secrets:\n        - GIT_SSH_KEY # \u00d6zel bir git deposundan \u00e7ekim yap\u0131l\u0131yorsa\n      cache: true # Docker build cache kullan\u0131ls\u0131n m\u0131?\n\n    # Da\u011f\u0131t\u0131m kancalar\u0131 (hooks)\n    # Da\u011f\u0131t\u0131m \u00f6ncesi veya sonras\u0131 \u00e7al\u0131\u015ft\u0131r\u0131lacak komutlar\n    hooks:\n      pre_build:    \"echo 'Building Fizzy Docker image...'\"\n      post_release: \"echo 'Fizzy deployed successfully!'\"\n\n    # Docker registry ayarlar\u0131 (iste\u011fe ba\u011fl\u0131, Docker Hub kullanm\u0131yorsan\u0131z)\n    # registry:\n    #   username: your_registry_username\n    #   password:\n    #     - ENV['REGISTRY_PASSWORD']\n  <\/code><\/pre>\n<p>Bu dosyadaki anahtar b\u00f6l\u00fcmler:<\/p>\n<ul>\n<li><strong><code class=\"language-\">service<\/code> ve <code class=\"language-\">image<\/code>:<\/strong> Uygulaman\u0131z\u0131n ad\u0131n\u0131 ve Docker imaj\u0131n\u0131n yolunu tan\u0131mlar. Docker imaj\u0131n\u0131z\u0131n bir container registry&#8217;de (\u00f6rne\u011fin Docker Hub) herkese a\u00e7\u0131k veya kimlik do\u011frulamas\u0131yla eri\u015filebilir olmas\u0131 gerekir.<\/li>\n<li><strong><code class=\"language-\">servers<\/code>:<\/strong> Uygulaman\u0131z\u0131n da\u011f\u0131t\u0131laca\u011f\u0131 DigitalOcean Droplet&#8217;lerinin IP adreslerini listeler. Birden fazla sunucu ekleyerek y\u00fck dengelemeyi ve y\u00fcksek eri\u015filebilirli\u011fi sa\u011flayabilirsiniz.<\/li>\n<li><strong><code class=\"language-\">production<\/code>:<\/strong> Ortam spesifik ayarlar\u0131 i\u00e7erir. <code class=\"language-\">env<\/code> alt\u0131nda uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu t\u00fcm ortam de\u011fi\u015fkenlerini tan\u0131mlayabilirsiniz. \u00d6zellikle hassas bilgiler (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) i\u00e7in <code class=\"language-\">SECRET_KEY_BASE: TBD<\/code> gibi yer tutucular kullan\u0131n ve bunlar\u0131 <code class=\"language-\">kamal env push<\/code> komutu ile sunucuya g\u00fcvenli bir \u015fekilde aktar\u0131n.<\/li>\n<li><strong><code class=\"language-\">port<\/code>:<\/strong> Uygulaman\u0131z\u0131n Docker container&#8217;\u0131 i\u00e7inde dinleyece\u011fi portu belirtir.<\/li>\n<li><strong><code class=\"language-\">traefik<\/code>:<\/strong> Kamal&#8217;\u0131n Traefik&#8217;i nas\u0131l yap\u0131land\u0131raca\u011f\u0131n\u0131 tan\u0131mlar. Bu b\u00f6l\u00fcmde, Traefik&#8217;in hangi portlar\u0131 dinleyece\u011fi, Docker sa\u011flay\u0131c\u0131s\u0131n\u0131 nas\u0131l kullanaca\u011f\u0131 ve Let&#8217;s Encrypt ile otomatik SSL sertifikalar\u0131n\u0131 nas\u0131l alaca\u011f\u0131 belirtilir. <code class=\"language-\">certificatesresolvers.le.acme.email<\/code> alan\u0131na ge\u00e7erli bir e-posta adresi girdi\u011finizden emin olun.<\/li>\n<li><strong><code class=\"language-\">build<\/code>:<\/strong> Docker imaj\u0131n\u0131z\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131na dair ayarlar\u0131 i\u00e7erir. Dockerfile&#8217;\u0131n\u0131za arg\u00fcmanlar ge\u00e7irebilir, gizli dosyalar\u0131 kullanabilir ve \u00f6nbelleklemeyi etkinle\u015ftirebilirsiniz.<\/li>\n<li><strong><code class=\"language-\">hooks<\/code>:<\/strong> Da\u011f\u0131t\u0131m ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn belirli noktalar\u0131nda (\u00f6rne\u011fin, imaj olu\u015fturulmadan \u00f6nce veya yeni s\u00fcr\u00fcm yay\u0131nland\u0131ktan sonra) \u00e7al\u0131\u015ft\u0131r\u0131lacak komutlar\u0131 tan\u0131mlar.<\/li>\n<\/ul>\n<p>Bu <code class=\"language-\">deploy.yml<\/code> dosyas\u0131n\u0131 kendi projenizin gereksinimlerine g\u00f6re doldurman\u0131z ve \u00f6zelle\u015ftirmeniz gerekmektedir. \u00d6zellikle <code class=\"language-\">your_docker_username\/fizzy<\/code> k\u0131sm\u0131n\u0131 kendi Docker imaj\u0131n\u0131z\u0131n ad\u0131yla, <code class=\"language-\">your_droplet_ip<\/code> k\u0131sm\u0131n\u0131 DigitalOcean Droplet&#8217;inizin IP adresiyle ve <code class=\"language-\">your_email@example.com<\/code> k\u0131sm\u0131n\u0131 kendi e-posta adresinizle de\u011fi\u015ftirmeyi unutmay\u0131n.<\/p>\n<h3>Veritaban\u0131 ve Di\u011fer Servisler \u0130\u00e7in Ayarlamalar Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Fizzy uygulaman\u0131z\u0131n bir veritaban\u0131na veya ba\u015fka bir harici servise (\u00f6rne\u011fin Redis, dosya depolama) ihtiyac\u0131 varsa, bu servisleri de da\u011f\u0131t\u0131m stratejinize dahil etmeniz gerekir. DigitalOcean, bu konuda \u00e7e\u015fitli se\u00e7enekler sunar:<\/p>\n<ol>\n<li><strong>DigitalOcean Managed Databases:<\/strong> En kolay ve \u00f6nerilen y\u00f6ntem, DigitalOcean&#8217;\u0131n y\u00f6netilen veritaban\u0131 hizmetlerini kullanmakt\u0131r (PostgreSQL, MySQL, Redis). Bu hizmetler, yedekleme, \u00f6l\u00e7eklendirme ve g\u00fcvenlik gibi operasyonel y\u00fckleri sizin \u00fczerinizden al\u0131r. Bir y\u00f6netilen veritaban\u0131 olu\u015fturdu\u011funuzda, size bir ba\u011flant\u0131 URL&#8217;si (\u00f6rne\u011fin <code class=\"language-\">DATABASE_URL<\/code>) verilecektir. Bu URL&#8217;yi <code class=\"language-\">deploy.yml<\/code> dosyas\u0131ndaki <code class=\"language-\">env<\/code> b\u00f6l\u00fcm\u00fcne eklemeniz yeterlidir.\n<pre><code>\n        # config\/deploy.yml i\u00e7inde\n        production:\n          env:\n            DATABASE_URL: postgresql:\/\/doadmin:YOUR_PASSWORD@db-host.ondigitalocean.com:25060\/defaultdb?sslmode=require\n      <\/code><\/pre>\n<p>      Bu yakla\u015f\u0131m, veritaban\u0131 y\u00f6netimi karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 Kamal&#8217;\u0131n kapsam\u0131 d\u0131\u015f\u0131na \u00e7\u0131kar\u0131r ve basitle\u015ftirir.<\/li>\n<li><strong>Docker Compose ile Ek Servisler:<\/strong> E\u011fer veritaban\u0131n\u0131z\u0131 veya di\u011fer servisleri (\u00f6rne\u011fin Redis) ayn\u0131 Droplet \u00fczerinde \u00e7al\u0131\u015ft\u0131rmak istiyorsan\u0131z, Kamal ile birlikte Docker Compose kullanabilirsiniz. Kamal, <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 do\u011frudan desteklemez, ancak bir <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131 olu\u015fturup manuel olarak ba\u015flatabilir veya <code class=\"language-\">hooks<\/code> kullanarak Kamal da\u011f\u0131t\u0131m s\u00fcrecine entegre edebilirsiniz. Bu y\u00f6ntem daha fazla y\u00f6netim gerektirir ancak tam kontrol sa\u011flar.\n<pre><code>\n        # docker-compose.yml \u00f6rne\u011fi (Droplet \u00fczerinde manuel olarak \u00e7al\u0131\u015ft\u0131r\u0131lacak)\n        version: '3.8'\n        services:\n          db:\n            image: postgres:14\n            restart: always\n            environment:\n              POSTGRES_DB: fizzy_prod\n              POSTGRES_USER: fizzy\n              POSTGRES_PASSWORD: mysecretpassword\n            volumes:\n              - db_data:\/var\/lib\/postgresql\/data\n          redis:\n            image: redis:6-alpine\n            restart: always\n        volumes:\n          db_data:\n      <\/code><\/pre>\n<p>      Bu <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 sunucunuza kopyalay\u0131p <code class=\"language-\">docker compose up -d<\/code> komutuyla ba\u015flatabilirsiniz. Ard\u0131ndan, uygulaman\u0131z\u0131n ortam de\u011fi\u015fkenlerini buna g\u00f6re ayarlaman\u0131z gerekir.<\/li>\n<li><strong>DigitalOcean Spaces (S3 Uyumlu Depolama):<\/strong> Uygulaman\u0131z\u0131n statik dosyalar veya kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar i\u00e7in depolamaya ihtiyac\u0131 varsa, DigitalOcean Spaces kullanabilirsiniz. Bu, S3 uyumlu bir nesne depolama hizmetidir ve uygulaman\u0131z\u0131n dosya depolama y\u00fck\u00fcn\u00fc sunucudan al\u0131r.<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Hassas ortam de\u011fi\u015fkenlerini (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) do\u011frudan <code>deploy.yml<\/code> dosyas\u0131na yazmak yerine, <code>kamal env push<\/code> komutuyla sunucuya g\u00fcvenli bir \u015fekilde y\u00fcklemeyi tercih edin. Bu, hassas bilgilerin versiyon kontrol sistemine (Git) girmesini engeller. \u00d6rne\u011fin, <code>kamal env push --env production<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Kamal yerel <code>.env.production<\/code> dosyan\u0131zdaki de\u011fi\u015fkenleri sunucuya \u015fifreli olarak y\u00fckler.\n  <\/div>\n<h3>SSL Sertifikalar\u0131 ve Traefik Entegrasyonu Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Modern web uygulamalar\u0131 i\u00e7in HTTPS kullan\u0131m\u0131 bir zorunluluktur. Kamal, bu s\u00fcreci Traefik ile entegrasyonu sayesinde inan\u0131lmaz derecede basitle\u015ftirir. Yukar\u0131daki <code class=\"language-\">deploy.yml<\/code> \u00f6rne\u011finde g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, Traefik ayarlar\u0131, Let&#8217;s Encrypt arac\u0131l\u0131\u011f\u0131yla otomatik SSL sertifikalar\u0131 alman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Traefik, Kamal taraf\u0131ndan Droplet&#8217;inize ayr\u0131 bir Docker container&#8217;\u0131 olarak da\u011f\u0131t\u0131l\u0131r. Gelen t\u00fcm HTTP (80) ve HTTPS (443) trafi\u011fini dinler. Bir kullan\u0131c\u0131 alan ad\u0131n\u0131z \u00fczerinden uygulaman\u0131za eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda:<\/p>\n<ol>\n<li>Traefik, gelen iste\u011fi yakalar.<\/li>\n<li>E\u011fer iste\u011finiz HTTP \u00fczerinden geliyorsa, Traefik otomatik olarak HTTPS&#8217;e y\u00f6nlendirme yapar.<\/li>\n<li>Traefik, alan ad\u0131n\u0131z i\u00e7in ge\u00e7erli bir SSL sertifikas\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer yoksa veya s\u00fcresi dolmu\u015fsa, Let&#8217;s Encrypt ile ileti\u015fime ge\u00e7erek yeni bir sertifika talep eder. Bu s\u00fcre\u00e7, <code class=\"language-\">tlschallenge<\/code> mekanizmas\u0131 sayesinde alan ad\u0131n\u0131z\u0131n sahipli\u011fini otomatik olarak do\u011frular.<\/li>\n<li>Sertifika al\u0131nd\u0131ktan sonra, Traefik bu sertifikay\u0131 kullan\u0131r ve \u015fifreli trafi\u011fi Fizzy uygulaman\u0131z\u0131n container&#8217;\u0131na y\u00f6nlendirir.<\/li>\n<\/ol>\n<p>Bu otomatikle\u015ftirilmi\u015f s\u00fcre\u00e7 sayesinde, SSL sertifikalar\u0131n\u0131 manuel olarak y\u00f6netmek, yenilemek veya sunucuya kurmak gibi karma\u015f\u0131k i\u015flemlerle u\u011fra\u015fman\u0131za gerek kalmaz. Tek yapman\u0131z gereken, <code class=\"language-\">deploy.yml<\/code> dosyas\u0131nda Traefik ayarlar\u0131n\u0131 do\u011fru bir \u015fekilde yap\u0131land\u0131rmak ve ge\u00e7erli bir e-posta adresi sa\u011flamakt\u0131r. Traefik, sertifikalar\u0131 <code class=\"language-\">\/letsencrypt\/acme.json<\/code> yolunda saklar, bu nedenle bu dosyan\u0131n kal\u0131c\u0131 olmas\u0131 i\u00e7in Kamal, Traefik container&#8217;\u0131 i\u00e7in bir Docker volume ba\u011flar.<\/p>\n<p>Bu konfig\u00fcrasyonlarla, Fizzy uygulaman\u0131z DigitalOcean \u00fczerinde g\u00fcvenli ve eri\u015filebilir hale gelecektir. Art\u0131k ilk da\u011f\u0131t\u0131m\u0131 ger\u00e7ekle\u015ftirmeye haz\u0131rs\u0131n\u0131z!<\/p>\n<h2>\u0130lk Da\u011f\u0131t\u0131m ve Uygulaman\u0131n Canl\u0131ya Al\u0131nmas\u0131<\/h2>\n<p>T\u00fcm \u00f6n haz\u0131rl\u0131klar ve konfig\u00fcrasyonlar tamamland\u0131ktan sonra, s\u0131ra Fizzy uygulaman\u0131z\u0131 DigitalOcean&#8217;a ilk kez da\u011f\u0131tmaya gelir. Kamal&#8217;\u0131n g\u00fcc\u00fc, bu s\u00fcreci tek bir komutla ve s\u0131f\u0131r kesintiyle ger\u00e7ekle\u015ftirebilmesinde yatar. Bu b\u00f6l\u00fcmde, ilk da\u011f\u0131t\u0131m\u0131n nas\u0131l yap\u0131laca\u011f\u0131n\u0131, da\u011f\u0131t\u0131m sonras\u0131 kontrolleri ve uygulaman\u0131z\u0131 nas\u0131l g\u00fcncelleyip geri alabilece\u011finizi ele alaca\u011f\u0131z.<\/p>\n<h3>Kamal Deploy Komutu ve S\u00fcreci Nas\u0131l \u0130\u015fler?<\/h3>\n<p>Kamal ile uygulaman\u0131z\u0131 da\u011f\u0131tmak, yerel makinenizden \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z tek bir komutla ba\u015flar:<\/p>\n<pre><code>\n    kamal deploy\n  <\/code><\/pre>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Kamal arka planda a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 otomatik olarak ger\u00e7ekle\u015ftirir:<\/p>\n<ol>\n<li><strong>SSH Ba\u011flant\u0131s\u0131:<\/strong> Kamal, <code class=\"language-\">deploy.yml<\/code> dosyas\u0131nda belirtilen sunuculara SSH \u00fczerinden ba\u011flan\u0131r.<\/li>\n<li><strong>Docker \u0130maj\u0131 Olu\u015fturma (Build):<\/strong> Yerel makinenizde, uygulaman\u0131z\u0131n k\u00f6k dizinindeki Dockerfile&#8217;\u0131 kullanarak yeni bir Docker imaj\u0131 olu\u015fturur. Bu imaj, <code class=\"language-\">deploy.yml<\/code> dosyas\u0131nda belirtilen <code class=\"language-\">image<\/code> ad\u0131n\u0131 ve etiketini (genellikle bir zaman damgas\u0131) al\u0131r.<\/li>\n<li><strong>\u0130maj\u0131 Kay\u0131t Defterine G\u00f6nderme (Push):<\/strong> Olu\u015fturulan Docker imaj\u0131n\u0131, <code class=\"language-\">deploy.yml<\/code> dosyas\u0131nda belirtilen Docker kay\u0131t defterine (varsay\u0131lan olarak Docker Hub) g\u00f6nderir.<\/li>\n<li><strong>Sunucularda \u0130maj\u0131 \u00c7ekme (Pull):<\/strong> Her bir hedef sunucuya ba\u011flan\u0131r ve yeni Docker imaj\u0131n\u0131 kay\u0131t defterinden \u00e7eker.<\/li>\n<li><strong>Yeni Container&#8217;\u0131 Ba\u015flatma:<\/strong> \u00c7ekilen imaj\u0131 kullanarak yeni bir Docker container&#8217;\u0131 ba\u015flat\u0131r. Bu container, uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcm\u00fcn\u00fc i\u00e7erir. Kamal, yeni container&#8217;\u0131n sa\u011fl\u0131kl\u0131 bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in sa\u011fl\u0131k kontrolleri yapar.<\/li>\n<li><strong>Y\u00fck Dengeleyici G\u00fcncelleme:<\/strong> Traefik (veya kulland\u0131\u011f\u0131n\u0131z ba\u015fka bir y\u00fck dengeleyici) konfig\u00fcrasyonunu g\u00fcncelleyerek gelen trafi\u011fi yeni container&#8217;a y\u00f6nlendirir.<\/li>\n<li><strong>Eski Container&#8217;\u0131 Durdurma:<\/strong> Yeni container ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131nda ve trafik almaya ba\u015flad\u0131\u011f\u0131nda, Kamal eski container&#8217;\u0131 durdurur ve kald\u0131r\u0131r. Bu &#8220;rolling update&#8221; mekanizmas\u0131, uygulaman\u0131z\u0131n s\u0131f\u0131r kesintiyle g\u00fcncellenmesini sa\u011flar.<\/li>\n<li><strong>Gereksiz \u0130majlar\u0131 Temizleme:<\/strong> Eski Docker imajlar\u0131n\u0131 ve container&#8217;lar\u0131n\u0131 temizleyerek sunucu disk alan\u0131n\u0131 bo\u015falt\u0131r.<\/li>\n<\/ol>\n<p>Bu s\u00fcre\u00e7 boyunca, Kamal komut sat\u0131r\u0131nda size ilerleme hakk\u0131nda bilgi verecektir. Her ad\u0131m\u0131n ba\u015far\u0131yla tamamland\u0131\u011f\u0131ndan emin olmak i\u00e7in \u00e7\u0131kt\u0131lar\u0131 dikkatlice takip etmeniz \u00f6nemlidir. \u00d6zellikle ilk da\u011f\u0131t\u0131mda, herhangi bir hata mesaj\u0131 al\u0131rsan\u0131z, <code class=\"language-\">deploy.yml<\/code> dosyan\u0131zdaki konfig\u00fcrasyonlar\u0131 ve sunucu ayarlar\u0131n\u0131 kontrol etmeniz gerekebilir.<\/p>\n<h3>Da\u011f\u0131t\u0131m Sonras\u0131 Kontroller ve Log \u0130zleme Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Da\u011f\u0131t\u0131m ba\u015far\u0131l\u0131 olduktan sonra, uygulaman\u0131z\u0131n ger\u00e7ekten \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve beklendi\u011fi gibi davrand\u0131\u011f\u0131n\u0131 do\u011frulamak \u00f6nemlidir. Ayr\u0131ca, herhangi bir sorun durumunda loglar\u0131 izlemek, sorun giderme i\u00e7in hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<ol>\n<li><strong>Uygulaman\u0131n Eri\u015filebilirli\u011fini Kontrol Etme:<\/strong> Taray\u0131c\u0131n\u0131zda alan ad\u0131n\u0131z\u0131 ziyaret edin (\u00f6rne\u011fin <code class=\"language-\">https:\/\/fizzy.example.com<\/code>). Uygulaman\u0131z\u0131n ana sayfas\u0131n\u0131 veya beklenen \u00e7\u0131kt\u0131y\u0131 g\u00f6rmelisiniz. E\u011fer bir sorunla kar\u015f\u0131la\u015f\u0131rsan\u0131z, a\u015fa\u011f\u0131daki ad\u0131mlara ge\u00e7in.<\/li>\n<li><strong>Kamal Durumunu Kontrol Etme:<\/strong> Kamal&#8217;\u0131n sunucudaki durumunu kontrol etmek i\u00e7in:\n<pre><code>\n        kamal status\n      <\/code><\/pre>\n<p>      Bu komut, \u00e7al\u0131\u015fan container&#8217;lar, imajlar ve Traefik&#8217;in durumu hakk\u0131nda genel bir bak\u0131\u015f sunar.<\/li>\n<li><strong>Uygulama Loglar\u0131n\u0131 \u0130zleme:<\/strong> Uygulaman\u0131z\u0131n loglar\u0131n\u0131 canl\u0131 olarak takip etmek i\u00e7in Kamal&#8217;\u0131n log komutunu kullanabilirsiniz:\n<pre><code>\n        kamal logs -f\n      <\/code><\/pre>\n<p>      Bu komut, t\u00fcm uygulama container&#8217;lar\u0131ndan gelen loglar\u0131 tek bir ak\u0131\u015fta g\u00f6sterir. Herhangi bir hata mesaj\u0131 veya uyar\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. E\u011fer sadece belirli bir container&#8217;\u0131n loglar\u0131n\u0131 g\u00f6rmek isterseniz, <code class=\"language-\">docker logs <container_id_or_name><\/code> komutunu do\u011frudan Droplet \u00fczerinde de kullanabilirsiniz.<\/li>\n<li><strong>Traefik Loglar\u0131n\u0131 Kontrol Etme:<\/strong> SSL sertifikas\u0131 veya y\u00f6nlendirme sorunlar\u0131 ya\u015f\u0131yorsan\u0131z, Traefik&#8217;in loglar\u0131n\u0131 kontrol etmek faydal\u0131 olabilir:\n<pre><code>\n        kamal traefik logs -f\n      <\/code><\/pre>\n<p>      Bu, Traefik&#8217;in ne yapt\u0131\u011f\u0131n\u0131 ve neden bir iste\u011fi i\u015fleyemedi\u011fini anlaman\u0131za yard\u0131mc\u0131 olabilir.<\/li>\n<\/ol>\n<p>Bu kontroller, uygulaman\u0131z\u0131n canl\u0131 ortamda sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olman\u0131z\u0131 ve olas\u0131 sorunlar\u0131 h\u0131zla tespit etmenizi sa\u011flar.<\/p>\n<h3>Uygulama G\u00fcncelleme ve Geri Alma \u0130\u015flemleri Nas\u0131l Ger\u00e7ekle\u015ftirilir?<\/h3>\n<p>Uygulaman\u0131zda yeni \u00f6zellikler geli\u015ftirdi\u011finizde veya hatalar\u0131 d\u00fczeltti\u011finizde, g\u00fcncellenmi\u015f s\u00fcr\u00fcm\u00fc da\u011f\u0131tman\u0131z gerekecektir. Kamal, bu s\u00fcreci de ilk da\u011f\u0131t\u0131m kadar kolay hale getirir.<\/p>\n<ol>\n<li><strong>Uygulama G\u00fcncelleme:<\/strong> Uygulaman\u0131z\u0131n kodunda de\u011fi\u015fiklikler yapt\u0131ktan sonra, yeni bir Docker imaj\u0131 olu\u015fturman\u0131z ve bunu kay\u0131t defterine g\u00f6ndermeniz gerekir. Kamal&#8217;\u0131n <code class=\"language-\">deploy<\/code> komutu, bu ad\u0131mlar\u0131 otomatik olarak ger\u00e7ekle\u015ftirir. Tekrar <code class=\"language-\">kamal deploy<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n:\n<pre><code>\n        kamal deploy\n      <\/code><\/pre>\n<p>      Kamal, mevcut imaj\u0131 ve \u00e7al\u0131\u015fan container&#8217;\u0131 tespit edecek, yeni imaj\u0131 \u00e7ekecek, yeni container&#8217;\u0131 ba\u015flatacak ve s\u0131f\u0131r kesintiyle eski container&#8217;\u0131 de\u011fi\u015ftirecektir.<\/li>\n<li><strong>Uygulama Geri Alma (Rollback):<\/strong> Bazen, yeni bir da\u011f\u0131t\u0131m beklenmedik sorunlara neden olabilir. Bu durumda, uygulaman\u0131z\u0131 \u00f6nceki, \u00e7al\u0131\u015fan bir s\u00fcr\u00fcme geri almak isteyebilirsiniz. Kamal, bu senaryo i\u00e7in de basit bir \u00e7\u00f6z\u00fcm sunar:\n<pre><code>\n        kamal rollback\n      <\/code><\/pre>\n<p>      Bu komut, uygulaman\u0131z\u0131 otomatik olarak bir \u00f6nceki ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131m s\u00fcr\u00fcm\u00fcne geri d\u00f6nd\u00fcr\u00fcr. E\u011fer daha eski bir s\u00fcr\u00fcme d\u00f6nmek isterseniz, belirli bir imaj etiketini belirtebilirsiniz. Kamal, varsay\u0131lan olarak son 5 ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131m\u0131n imajlar\u0131n\u0131 saklar.<\/li>\n<\/ol>\n<p>Kamal&#8217;\u0131n bu basit ve g\u00fc\u00e7l\u00fc komutlar\u0131, uygulama ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmeyi son derece kolayla\u015ft\u0131r\u0131r. Geli\u015ftiriciler, karma\u015f\u0131k da\u011f\u0131t\u0131m boru hatlar\u0131yla u\u011fra\u015fmak yerine, kod yazmaya ve uygulama geli\u015ftirmeye odaklanabilirler. Bu, \u00f6zellikle s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) s\u00fcre\u00e7lerini basitle\u015ftirmek isteyen ekipler i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r.<\/p>\n<h2>Geli\u015fmi\u015f Kamal \u00d6zellikleri ve En \u0130yi Uygulamalar<\/h2>\n<p>Kamal, basit bir da\u011f\u0131t\u0131m arac\u0131 olmas\u0131na ra\u011fmen, daha karma\u015f\u0131k senaryolar i\u00e7in de geli\u015fmi\u015f \u00f6zellikler sunar. Bu b\u00f6l\u00fcmde, \u00e7oklu sunucu da\u011f\u0131t\u0131mlar\u0131, CI\/CD entegrasyonu ve performans optimizasyonlar\u0131 gibi konulara de\u011finece\u011fiz. Bu ipu\u00e7lar\u0131, Fizzy uygulaman\u0131z\u0131n daha \u00f6l\u00e7eklenebilir, g\u00fcvenli ve verimli \u00e7al\u0131\u015fmas\u0131na yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>\u00c7oklu Sunucu Da\u011f\u0131t\u0131mlar\u0131 ve Y\u00fck Dengeleme Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Tek bir DigitalOcean Droplet&#8217;i, k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar i\u00e7in yeterli olabilir. Ancak, uygulaman\u0131z\u0131n trafi\u011fi artt\u0131k\u00e7a veya daha y\u00fcksek eri\u015filebilirlik gereksinimleri ortaya \u00e7\u0131kt\u0131k\u00e7a, birden fazla sunucuya da\u011f\u0131t\u0131m yapmak ka\u00e7\u0131n\u0131lmaz hale gelir. Kamal, bu senaryoyu <code class=\"language-\">deploy.yml<\/code> dosyas\u0131ndaki <code class=\"language-\">servers<\/code> listesini geni\u015fleterek kolayca destekler.<\/p>\n<p>Birden fazla Droplet&#8217;e da\u011f\u0131t\u0131m yapmak i\u00e7in:<\/p>\n<ol>\n<li><strong>Yeni Droplet&#8217;ler Olu\u015fturun:<\/strong> DigitalOcean panelinden mevcut Droplet&#8217;inizle ayn\u0131 konfig\u00fcrasyonda (i\u015fletim sistemi, SSH anahtarlar\u0131 vb.) yeni Droplet&#8217;ler olu\u015fturun. Her birine ayr\u0131 bir genel IP adresi atanacakt\u0131r.<\/li>\n<li><strong><code class=\"language-\">deploy.yml<\/code> Dosyas\u0131n\u0131 G\u00fcncelleyin:<\/strong> <code class=\"language-\">config\/deploy.yml<\/code> dosyan\u0131zdaki <code class=\"language-\">servers<\/code> b\u00f6l\u00fcm\u00fcne yeni Droplet&#8217;lerin IP adreslerini ekleyin:\n<pre><code>\n        # config\/deploy.yml\n        servers:\n          - your_droplet_ip_1\n          - your_droplet_ip_2\n          - your_droplet_ip_3\n      <\/code><\/pre>\n<\/li>\n<li><strong>Kamal Deploy \u00c7al\u0131\u015ft\u0131r\u0131n:<\/strong> Normal <code class=\"language-\">kamal deploy<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Kamal, her bir sunucuya s\u0131rayla ba\u011flanacak, Docker imaj\u0131n\u0131 \u00e7ekecek ve uygulaman\u0131z\u0131n bir \u00f6rne\u011fini \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/li>\n<\/ol>\n<p>Kamal, her sunucuya ayr\u0131 bir Traefik container&#8217;\u0131 da\u011f\u0131t\u0131r ve bu Traefik \u00f6rnekleri, kendi sunucular\u0131ndaki uygulama container&#8217;lar\u0131 aras\u0131nda y\u00fck dengelemesi yapar. Ancak, birden fazla sunucu aras\u0131nda trafi\u011fi da\u011f\u0131tmak i\u00e7in harici bir y\u00fck dengeleyiciye ihtiyac\u0131n\u0131z olacakt\u0131r. DigitalOcean, bu ama\u00e7la &#8220;Load Balancers&#8221; (Y\u00fck Dengeleyiciler) hizmeti sunar. Bir DigitalOcean Load Balancer olu\u015fturup, arka u\u00e7 sunucular olarak t\u00fcm Droplet&#8217;lerinizi ekleyerek, gelen trafi\u011fi Droplet&#8217;leriniz aras\u0131nda da\u011f\u0131tabilirsiniz. Bu, hem uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131r\u0131r hem de bir Droplet&#8217;in ar\u0131zalanmas\u0131 durumunda uygulaman\u0131z\u0131n eri\u015filebilirli\u011fini sa\u011flar (y\u00fcksek eri\u015filebilirlik).<\/p>\n<h3>S\u0131f\u0131r Kesinti Da\u011f\u0131t\u0131m\u0131 (Zero-Downtime Deployment) Mekanizmalar\u0131 Nelerdir?<\/h3>\n<p>Kamal&#8217;\u0131n en \u00e7ekici \u00f6zelliklerinden biri, s\u0131f\u0131r kesinti da\u011f\u0131t\u0131m\u0131n\u0131 yerle\u015fik olarak desteklemesidir. Bu, uygulaman\u0131z\u0131n g\u00fcncellenmesi s\u0131ras\u0131nda kullan\u0131c\u0131lar\u0131n herhangi bir hizmet kesintisi ya\u015famayaca\u011f\u0131 anlam\u0131na gelir. Kamal bunu &#8220;rolling update&#8221; (kademeli g\u00fcncelleme) stratejisiyle ba\u015far\u0131r:<\/p>\n<ol>\n<li>Yeni Docker imaj\u0131 \u00e7ekilir ve yeni bir container ba\u015flat\u0131l\u0131r.<\/li>\n<li>Kamal, yeni container&#8217;\u0131n tamamen ba\u015flat\u0131ld\u0131\u011f\u0131n\u0131 ve sa\u011fl\u0131k kontrollerinden ge\u00e7ti\u011fini do\u011frular (\u00f6rne\u011fin, HTTP sa\u011fl\u0131k kontrol\u00fc endpoint&#8217;ine ba\u015far\u0131l\u0131 bir yan\u0131t gelmesi beklenir).<\/li>\n<li>Yeni container sa\u011fl\u0131kl\u0131 olarak onayland\u0131\u011f\u0131nda, Traefik gelen trafi\u011fi kademeli olarak yeni container&#8217;a y\u00f6nlendirmeye ba\u015flar.<\/li>\n<li>T\u00fcm trafik yeni container&#8217;a y\u00f6nlendirildikten ve eski container&#8217;da aktif ba\u011flant\u0131 kalmad\u0131\u011f\u0131ndan emin olunduktan sonra, eski container nazik\u00e7e kapat\u0131l\u0131r ve kald\u0131r\u0131l\u0131r.<\/li>\n<\/ol>\n<p>Bu s\u00fcre\u00e7, her zaman en az bir \u00e7al\u0131\u015fan uygulama \u00f6rne\u011finin mevcut olmas\u0131n\u0131 sa\u011flayarak kesintisiz bir kullan\u0131c\u0131 deneyimi sunar. Bu mekanizma, \u00f6zellikle e-ticaret siteleri veya s\u00fcrekli eri\u015filebilirlik gerektiren di\u011fer kritik uygulamalar i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>CI\/CD Entegrasyonu ve Otomatik Da\u011f\u0131t\u0131m S\u00fcre\u00e7leri Nas\u0131l Kurulur?<\/h3>\n<p>Kamal, manuel da\u011f\u0131t\u0131mlar\u0131 basitle\u015ftirse de, modern bir geli\u015ftirme i\u015f ak\u0131\u015f\u0131nda s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131 vazge\u00e7ilmezdir. Kamal, bu boru hatlar\u0131na kolayca entegre edilebilir.<\/p>\n<p>\u00d6rne\u011fin, GitHub Actions veya GitLab CI gibi ara\u00e7larla Kamal&#8217;\u0131 kullanarak otomatik da\u011f\u0131t\u0131m yapabilirsiniz:<\/p>\n<ol>\n<li><strong>GitHub Actions Workflow \u00d6rne\u011fi:<\/strong>\n<pre><code>\n        # .github\/workflows\/deploy.yml\n        name: Deploy Fizzy to DigitalOcean with Kamal\n\n        on:\n          push:\n            branches:\n              - main # Ana dala yap\u0131lan her push'ta tetikle\n\n        jobs:\n          deploy:\n            runs-on: ubuntu-latest\n            steps:\n              - uses: actions\/checkout@v3\n\n              - name: Setup Ruby\n                uses: ruby\/setup-ruby@v1\n                with:\n                  ruby-version: '3.2.2' # Uygulaman\u0131z\u0131n Ruby versiyonu\n\n              - name: Install Kamal\n                run: gem install kamal\n\n              - name: Login to Docker Hub\n                uses: docker\/login-action@v2\n                with:\n                  username: ${{ secrets.DOCKER_USERNAME }}\n                  password: ${{ secrets.DOCKER_PASSWORD }}\n\n              - name: Deploy with Kamal\n                env:\n                  # Kamal'\u0131n SSH anahtar\u0131n\u0131 kullanmas\u0131 i\u00e7in\n                  # Bu anahtar, DigitalOcean Droplet'inize eri\u015fim sa\u011flamal\u0131d\u0131r.\n                  # secrets.SSH_PRIVATE_KEY olarak GitHub Secrets'a ekleyin.\n                  SSH_AUTH_SOCK: \/tmp\/ssh_agent.sock\n                run: |\n                  mkdir -p ~\/.ssh\n                  echo \"${{ secrets.SSH_PRIVATE_KEY }}\" > ~\/.ssh\/id_rsa\n                  chmod 600 ~\/.ssh\/id_rsa\n                  eval $(ssh-agent -s)\n                  ssh-add ~\/.ssh\/id_rsa\n                  ssh-keyscan -H your_droplet_ip >> ~\/.ssh\/known_hosts\n                  kamal deploy\n      <\/code><\/pre>\n<p>      Bu workflow, her <code class=\"language-\">main<\/code> dal\u0131na yap\u0131lan push i\u015fleminde Kamal&#8217;\u0131 \u00e7al\u0131\u015ft\u0131rarak uygulaman\u0131z\u0131 otomatik olarak da\u011f\u0131tacakt\u0131r. <code class=\"language-\">secrets.DOCKER_USERNAME<\/code>, <code class=\"language-\">secrets.DOCKER_PASSWORD<\/code> ve <code class=\"language-\">secrets.SSH_PRIVATE_KEY<\/code> gibi hassas bilgileri GitHub Secrets olarak eklemeyi unutmay\u0131n.<\/li>\n<\/ol>\n<p>Bu t\u00fcr bir CI\/CD entegrasyonu, geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131r\u0131r, insan hatalar\u0131n\u0131 azalt\u0131r ve uygulaman\u0131z\u0131n s\u00fcrekli olarak g\u00fcncel kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>G\u00fcvenlik \u0130pu\u00e7lar\u0131 ve Performans Optimizasyonlar\u0131 Nelerdir?<\/h3>\n<p>Uygulaman\u0131z\u0131n g\u00fcvenli\u011fini ve performans\u0131n\u0131 art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<ol>\n<li><strong>G\u00fcvenlik Duvar\u0131 (Firewall):<\/strong> DigitalOcean Droplet&#8217;leriniz i\u00e7in bir g\u00fcvenlik duvar\u0131 (Cloud Firewall) yap\u0131land\u0131r\u0131n. Yaln\u0131zca gerekli portlara (HTTP i\u00e7in 80, HTTPS i\u00e7in 443, SSH i\u00e7in 22) eri\u015fime izin verin. Gelen SSH ba\u011flant\u0131lar\u0131n\u0131 belirli IP adresleriyle k\u0131s\u0131tlamak, g\u00fcvenli\u011fi art\u0131racakt\u0131r.<\/li>\n<li><strong>Ortam De\u011fi\u015fkenleri ve S\u0131rlar:<\/strong> Hassas bilgileri (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) asla do\u011frudan <code class=\"language-\">deploy.yml<\/code> dosyas\u0131na yazmay\u0131n. Bunun yerine, <code class=\"language-\">kamal env push<\/code> komutunu kullanarak bu s\u0131rlar\u0131 g\u00fcvenli bir \u015fekilde sunucuya aktar\u0131n ve ortam de\u011fi\u015fkenleri olarak kullan\u0131n.<\/li>\n<li><strong>Docker \u0130maj\u0131 Optimizasyonu:<\/strong> Daha k\u00fc\u00e7\u00fck Docker imajlar\u0131, daha h\u0131zl\u0131 da\u011f\u0131t\u0131m ve daha az disk alan\u0131 t\u00fcketimi anlam\u0131na gelir. Multi-stage build (\u00e7ok a\u015famal\u0131 derleme) kullanarak derleme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 nihai imajdan \u00e7\u0131kar\u0131n. Gereksiz dosyalar\u0131 <code class=\"language-\">.dockerignore<\/code> ile hari\u00e7 tutun.\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Da\u011f\u0131t\u0131m \u00f6ncesi Docker imaj\u0131n\u0131z\u0131n boyutunu optimize etmek, hem da\u011f\u0131t\u0131m s\u00fcresini k\u0131salt\u0131r hem de sunucu kaynak t\u00fcketimini azalt\u0131r. Multi-stage build kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code>\n        # Dockerfile \u00f6rne\u011fi (Multi-stage build)\n        # A\u015fama 1: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 kur\n        FROM ruby:3.2.2-slim-bullseye as builder\n        WORKDIR \/app\n        COPY Gemfile Gemfile.lock .\/\n        RUN bundle install --without development test\n\n        # A\u015fama 2: Uygulamay\u0131 olu\u015ftur\n        FROM ruby:3.2.2-slim-bullseye\n        WORKDIR \/app\n        COPY --from=builder \/usr\/local\/bundle \/usr\/local\/bundle\n        COPY . .\n        CMD [\"bundle\", \"exec\", \"rails\", \"server\", \"-b\", \"0.0.0.0\"]\n        <\/code><\/pre>\n<\/p><\/div>\n<\/li>\n<li><strong>\u0130zleme ve Loglama:<\/strong> Uygulaman\u0131z\u0131n performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in DigitalOcean&#8217;\u0131n yerle\u015fik izleme ara\u00e7lar\u0131n\u0131 veya Prometheus\/Grafana gibi harici \u00e7\u00f6z\u00fcmleri kullan\u0131n. Loglar\u0131 merkezi bir yerde toplamak (\u00f6rne\u011fin, Logtail, Papertrail) sorun gidermeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Yedeklemeler:<\/strong> DigitalOcean Droplet&#8217;lerinizin d\u00fczenli anl\u0131k g\u00f6r\u00fcnt\u00fclerini (snapshots) al\u0131n veya y\u00f6netilen veritabanlar\u0131 kullan\u0131yorsan\u0131z otomatik yedeklemeleri etkinle\u015ftirin. Bu, veri kayb\u0131 durumunda kurtarma i\u00e7in kritik \u00f6neme sahiptir.<\/li>\n<li><strong>Mobil Uyumlu Tasar\u0131m:<\/strong> Uygulaman\u0131z\u0131n mobil cihazlarda da sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in responsive tasar\u0131m prensiplerine uyun. CSS media query&#8217;leri bu konuda size yard\u0131mc\u0131 olacakt\u0131r.\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Mobil cihazlar i\u00e7in responsive tasar\u0131m yaparken, CSS media query&#8217;lerini do\u011fru kullanmak kritik \u00f6neme sahiptir. \u00d6rne\u011fin:<\/p>\n<pre><code>\n        @media (max-width: 768px) {\n          .container {\n            width: 100%;\n            padding: 15px;\n          }\n          .sidebar {\n            display: none;\n          }\n        }\n        <\/code><\/pre>\n<p>        Bu kod blo\u011fu, ekran geni\u015fli\u011fi 768 pikselin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde belirli stillerin nas\u0131l uygulanaca\u011f\u0131n\u0131 g\u00f6sterir, b\u00f6ylece mobil cihazlarda daha iyi bir kullan\u0131c\u0131 deneyimi sunulur.\n      <\/p><\/div>\n<\/li>\n<\/ol>\n<p>Bu geli\u015fmi\u015f \u00f6zellikler ve en iyi uygulamalar, Kamal ile da\u011f\u0131t\u0131m deneyiminizi daha da zenginle\u015ftirecek ve uygulaman\u0131z\u0131n uzun vadede ba\u015far\u0131l\u0131 olmas\u0131n\u0131 sa\u011flayacakt\u0131r. Kamal&#8217;\u0131n esnekli\u011fi, ihtiya\u00e7lar\u0131n\u0131z b\u00fcy\u00fcd\u00fck\u00e7e bu t\u00fcr geli\u015ftirmeleri kolayca entegre etmenize olanak tan\u0131r.<\/p>\n<h2>Sonu\u00e7: Kamal ile Gelece\u011fin Da\u011f\u0131t\u0131m Pratikleri<\/h2>\n<p>Bu makale boyunca, Kamal&#8217;\u0131n g\u00fcc\u00fcn\u00fc kullanarak Fizzy uygulamas\u0131n\u0131 DigitalOcean&#8217;a nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceledik. Karma\u015f\u0131k da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin nas\u0131l basitle\u015ftirilebilece\u011fini, Docker container&#8217;lar\u0131n\u0131n esnekli\u011fini ve DigitalOcean&#8217;\u0131n sa\u011flam altyap\u0131s\u0131n\u0131 bir araya getirerek modern web uygulamalar\u0131n\u0131 canl\u0131ya alman\u0131n ne kadar kolay olabilece\u011fini g\u00f6rd\u00fck. Kamal, otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve tek bir YAML dosyas\u0131yla y\u00f6netilebilir konfig\u00fcrasyon gibi \u00f6zellikleriyle geli\u015ftiricilere b\u00fcy\u00fck bir kolayl\u0131k sa\u011flamaktad\u0131r.<\/p>\n<p>Kamal&#8217;\u0131n minimalist yakla\u015f\u0131m\u0131, \u00f6zellikle DevOps s\u00fcre\u00e7lerine yeni ba\u015flayanlar veya mevcut da\u011f\u0131t\u0131m y\u00fck\u00fcn\u00fc azaltmak isteyen k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli ekipler i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr. Geli\u015ftiricilerin altyap\u0131 detaylar\u0131na tak\u0131lmadan, do\u011frudan \u00fcr\u00fcn geli\u015ftirmeye odaklanmalar\u0131na olanak tan\u0131r. DigitalOcean ile birle\u015fti\u011finde ise, g\u00fc\u00e7l\u00fc, uygun maliyetli ve \u00f6l\u00e7eklenebilir bir da\u011f\u0131t\u0131m ekosistemi ortaya \u00e7\u0131kar. Umar\u0131z bu rehber, kendi uygulamalar\u0131n\u0131z\u0131 Kamal ve DigitalOcean ile bulutlara ta\u015f\u0131man\u0131z i\u00e7in size ilham vermi\u015f ve yol g\u00f6stermi\u015ftir. Gelece\u011fin da\u011f\u0131t\u0131m pratikleri, \u015f\u00fcphesiz ki otomasyon, sadelik ve verimlilik \u00fczerine kuruludur ve Kamal bu vizyonu ger\u00e7e\u011fe d\u00f6n\u00fc\u015ft\u00fcren \u00f6nemli ara\u00e7lardan biridir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n<h4>Kamal sadece Ruby on Rails uygulamalar\u0131 i\u00e7in mi?<\/h4>\n<p>Hay\u0131r, Kamal herhangi bir Docker imaj\u0131n\u0131 da\u011f\u0131tabilir. Bu, Ruby on Rails, Node.js, Python, Go veya herhangi bir ba\u015fka dilde yaz\u0131lm\u0131\u015f uygulaman\u0131z\u0131 Kamal ile da\u011f\u0131tabilece\u011finiz anlam\u0131na gelir. \u00d6nemli olan, uygulaman\u0131z\u0131n bir Dockerfile&#8217;a sahip olmas\u0131 ve bir Docker imaj\u0131 olarak paketlenebilmesidir.<\/p>\n<\/li>\n<li>\n<h4>DigitalOcean&#8217;da veritaban\u0131 y\u00f6netimi nas\u0131l yap\u0131l\u0131r?<\/h4>\n<p>DigitalOcean, PostgreSQL, MySQL ve Redis gibi pop\u00fcler veritabanlar\u0131 i\u00e7in y\u00f6netilen hizmetler sunar. Bu hizmetler, veritaban\u0131 kurulumu, yedekleme, \u00f6l\u00e7eklendirme ve g\u00fcvenlik gibi operasyonel y\u00fckleri sizin \u00fczerinizden al\u0131r. Da\u011f\u0131t\u0131m s\u0131ras\u0131nda, bu y\u00f6netilen veritabanlar\u0131n\u0131n ba\u011flant\u0131 URL&#8217;lerini uygulaman\u0131z\u0131n ortam de\u011fi\u015fkenlerine eklemeniz yeterlidir.<\/p>\n<\/li>\n<li>\n<h4>Da\u011f\u0131t\u0131m s\u0131ras\u0131nda bir sorun olursa ne yapmal\u0131y\u0131m?<\/h4>\n<p>\u0130lk olarak, <code class=\"language-\">kamal logs -f<\/code> komutuyla uygulama loglar\u0131n\u0131 kontrol edin. Hata mesajlar\u0131 genellikle sorunun kayna\u011f\u0131n\u0131 g\u00f6sterir. Ayr\u0131ca, <code class=\"language-\">kamal status<\/code> ile \u00e7al\u0131\u015fan container&#8217;lar\u0131n durumunu kontrol edebilir ve <code class=\"language-\">kamal traefik logs -f<\/code> ile Traefik loglar\u0131na bakabilirsiniz. E\u011fer yeni bir da\u011f\u0131t\u0131m sorunlara neden olduysa, <code class=\"language-\">kamal rollback<\/code> komutunu kullanarak \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme h\u0131zla geri d\u00f6nebilirsiniz.<\/p>\n<\/li>\n<li>\n<h4>Kamal ile birden fazla uygulama da\u011f\u0131tabilir miyim?<\/h4>\n<p>Evet, Kamal ile ayn\u0131 sunucuya veya farkl\u0131 sunuculara birden fazla uygulama da\u011f\u0131tabilirsiniz. Her uygulama i\u00e7in ayr\u0131 bir Kamal projesi ve <code class=\"language-\">deploy.yml<\/code> dosyas\u0131 olu\u015fturman\u0131z gerekir. Her uygulaman\u0131n <code class=\"language-\">service<\/code> ad\u0131 benzersiz olmal\u0131 ve Traefik ayarlar\u0131nda farkl\u0131 alan adlar\u0131 veya alt alan adlar\u0131 kullan\u0131larak y\u00f6nlendirme yap\u0131lmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Kamal&#8217;\u0131n alternatifleri nelerdir?<\/h4>\n<p>Kamal&#8217;a benzer i\u015flevsellik sunan alternatifler aras\u0131nda Docker Swarm, Kubernetes (daha karma\u015f\u0131k), Capistrano (Ruby odakl\u0131), Ansible ve Terraform gibi ara\u00e7lar bulunmaktad\u0131r. Ancak, Kamal&#8217;\u0131n Docker container&#8217;lar\u0131 ve Traefik entegrasyonu ile sundu\u011fu basitlik ve s\u0131f\u0131r kesinti da\u011f\u0131t\u0131m yetene\u011fi, onu bir\u00e7ok senaryo i\u00e7in benzersiz bir se\u00e7enek haline getirir.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Kamal ile Fizzy Uygulamas\u0131n\u0131 DigitalOcean&#8217;a Sorunsuz Da\u011f\u0131tma Rehberi Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1401],"tags":[],"class_list":{"0":"post-36231","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-git","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#039;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, Kamal devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan DigitalOcean \u00fczerinde, Docker container&#039;lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal&#039;\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean&#039;\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#039;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, Kamal devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan DigitalOcean \u00fczerinde, Docker container&#039;lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal&#039;\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean&#039;\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T21:21:28+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?\",\"datePublished\":\"2025-12-10T21:21:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\"},\"wordCount\":6026,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Git\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\",\"name\":\"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean'a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-10T21:21:28+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, Kamal devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan DigitalOcean \u00fczerinde, Docker container'lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal'\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean'\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean'a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?","description":"G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, Kamal devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan DigitalOcean \u00fczerinde, Docker container'lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal'\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean'\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/","og_locale":"tr_TR","og_type":"article","og_title":"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean'a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?","og_description":"G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, Kamal devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan DigitalOcean \u00fczerinde, Docker container'lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal'\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean'\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-10T21:21:28+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?","datePublished":"2025-12-10T21:21:28+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/"},"wordCount":6026,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Git"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/","url":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/","name":"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean'a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-10T21:21:28+00:00","description":"G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, web uygulamalar\u0131n\u0131 h\u0131zl\u0131, g\u00fcvenilir ve kesintisiz bir \u015fekilde canl\u0131ya almak, geli\u015ftiriciler i\u00e7in kritik bir ba\u015far\u0131 fakt\u00f6r\u00fcd\u00fcr. Ancak bu s\u00fcre\u00e7, genellikle karma\u015f\u0131k konfig\u00fcrasyonlar, sunucu y\u00f6netimi ve s\u00fcrekli bak\u0131m gerektiren zorlu bir m\u00fccadeleye d\u00f6n\u00fc\u015febilir. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde, DevOps s\u00fcre\u00e7lerine ayr\u0131lacak zaman ve kaynak k\u0131s\u0131tl\u0131 oldu\u011funda, basit ama g\u00fc\u00e7l\u00fc bir da\u011f\u0131t\u0131m arac\u0131 hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam da bu noktada, Kamal devreye giriyor. Kamal, pop\u00fcler bulut sa\u011flay\u0131c\u0131lardan biri olan DigitalOcean \u00fczerinde, Docker container'lar\u0131n\u0131 kullanarak Fizzy gibi herhangi bir web uygulamas\u0131n\u0131 otomatikle\u015ftirilmi\u015f bir \u015fekilde da\u011f\u0131tman\u0131za olanak tan\u0131r. Bu makalede, Kamal'\u0131n sundu\u011fu kolayl\u0131klar\u0131, DigitalOcean'\u0131n esnek altyap\u0131s\u0131n\u0131 ve Fizzy uygulamas\u0131n\u0131n bu ekosistemde nas\u0131l hayat buldu\u011funu ad\u0131m ad\u0131m inceleyece\u011fiz. Otomatik SSL sertifikalar\u0131, s\u0131f\u0131r kesintiyle g\u00fcncellemeler ve basitle\u015ftirilmi\u015f y\u00f6netimle da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilece\u011finizi ke\u015ffedin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/modern-web-uygulamalarini-digitaloceana-hizli-ve-guvenli-bir-sekilde-nasil-dagitabilirsiniz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Modern Web Uygulamalar\u0131n\u0131 DigitalOcean&#8217;a H\u0131zl\u0131 ve G\u00fcvenli Bir \u015eekilde Nas\u0131l Da\u011f\u0131tabilirsiniz?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36231"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36231\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}