{"id":33850,"date":"2025-11-07T23:40:55","date_gmt":"2025-11-07T20:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33850"},"modified":"2025-11-07T23:40:55","modified_gmt":"2025-11-07T20:40:55","slug":"gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/","title":{"rendered":"GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme"},"content":{"rendered":"<p><body><\/p>\n<h2>GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, s\u00fcrekli entegrasyon (CI) ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) s\u00fcre\u00e7leri, ekiplerin daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha verimli bir \u015fekilde yaz\u0131l\u0131m teslim etmelerini sa\u011flayan temel ta\u015flard\u0131r. GitLab CI\/CD, geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn bu kritik a\u015famalar\u0131n\u0131 otomatikle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve entegre bir platform sunar. Ancak, dinamik i\u015f y\u00fcklerine sahip projelerde, CI\/CD i\u015flerini y\u00fcr\u00fcten GitLab Runner&#8217;lar\u0131n statik bir altyap\u0131da \u00e7al\u0131\u015fmas\u0131, performans darbo\u011fazlar\u0131na, y\u00fcksek maliyetlere veya kaynak israf\u0131na yol a\u00e7abilir. \u0130\u015fte tam bu noktada, GitLab Runner&#8217;lar\u0131n otomatik \u00f6l\u00e7eklendirilmesi devreye girer.<\/p>\n<p>Bu makalede, GitLab Continuous Deployment s\u00fcre\u00e7lerinizi DigitalOcean \u00fczerinde GitLab Runner ile nas\u0131l otomatik \u00f6l\u00e7eklendirece\u011finizi ad\u0131m ad\u0131m detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu sayede, CI\/CD i\u015flerinizin yo\u011funlu\u011funa g\u00f6re kaynaklar\u0131n\u0131z\u0131 dinamik olarak art\u0131r\u0131p azaltabilecek, maliyetleri optimize ederken performans ve g\u00fcvenilirli\u011fi en \u00fcst d\u00fczeye \u00e7\u0131karabileceksiniz.<\/p>\n<h3>Otomatik \u00d6l\u00e7eklendirmenin \u00d6nemi<\/h3>\n<p>Otomatik \u00f6l\u00e7eklendirme, modern bulut tabanl\u0131 uygulamalar ve hizmetler i\u00e7in vazge\u00e7ilmez bir \u00f6zelliktir. GitLab Runner ba\u011flam\u0131nda, bu yetenek, CI\/CD altyap\u0131n\u0131z\u0131n esnekli\u011fini, verimlili\u011fini ve g\u00fcvenilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h4>Esneklik ve Maliyet Verimlili\u011fi<\/h4>\n<p>Yaz\u0131l\u0131m geli\u015ftirme projeleri genellikle \u00f6ng\u00f6r\u00fclemeyen i\u015f y\u00fck\u00fc dalgalanmalar\u0131 ya\u015far. Bir g\u00fcn onlarca pipeline ayn\u0131 anda \u00e7al\u0131\u015f\u0131rken, di\u011fer g\u00fcn birka\u00e7 tane bile olmayabilir. Statik bir altyap\u0131, ya yo\u011fun zamanlarda yetersiz kal\u0131r ya da sakin zamanlarda gereksiz kaynaklar\u0131 bo\u015fa harcar. Otomatik \u00f6l\u00e7eklendirme ile:<\/p>\n<p>*   <strong>Y\u00fck Dalgalanmalar\u0131na Adaptasyon:<\/strong> Pipeline i\u015f y\u00fck\u00fc artt\u0131\u011f\u0131nda, sistem otomatik olarak yeni Runner \u00f6rnekleri (DigitalOcean Droplet&#8217;leri) olu\u015fturarak i\u015flerin h\u0131zl\u0131 bir \u015fekilde tamamlanmas\u0131n\u0131 sa\u011flar. \u0130\u015f y\u00fck\u00fc azald\u0131\u011f\u0131nda ise gereksiz Droplet&#8217;leri otomatik olarak kapat\u0131r.<br \/>\n*   <strong>Kaynaklar\u0131n Verimli Kullan\u0131m\u0131:<\/strong> Yaln\u0131zca ihtiya\u00e7 duyulan kadar kaynak kullan\u0131l\u0131r, bu da bulut sa\u011flay\u0131c\u0131n\u0131za (DigitalOcean) \u00f6dedi\u011finiz maliyetleri \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcr\u00fcr. Gereksiz Droplet&#8217;ler \u00e7al\u0131\u015fmad\u0131\u011f\u0131 i\u00e7in bo\u015fta kalan kaynak maliyeti olu\u015fmaz.<\/p>\n<h4>Performans ve G\u00fcvenilirlik<\/h4>\n<p>CI\/CD s\u00fcre\u00e7lerinin performans\u0131, geli\u015ftirme h\u0131z\u0131n\u0131 ve \u00fcr\u00fcn\u00fcn pazara \u00e7\u0131k\u0131\u015f s\u00fcresini do\u011frudan etkiler. Otomatik \u00f6l\u00e7eklendirme, bu performans\u0131 ve s\u00fcre\u00e7lerin g\u00fcvenilirli\u011fini art\u0131r\u0131r:<\/p>\n<p>*   <strong>Darbo\u011fazlar\u0131 \u00d6nleme:<\/strong> Yo\u011fun i\u015f y\u00fck\u00fc alt\u0131nda bile, yeterli say\u0131da Runner \u00f6rne\u011fi olu\u015fturularak pipeline&#8217;lar\u0131n kuyrukta bekleme s\u00fcresi minimuma indirilir. Bu, geli\u015ftiricilerin geri bildirimleri daha h\u0131zl\u0131 almas\u0131n\u0131 ve sorunlar\u0131 daha erken tespit etmesini sa\u011flar.<br \/>\n*   <strong>Kesintisiz \u00c7al\u0131\u015fma:<\/strong> Herhangi bir Runner \u00f6rne\u011finde meydana gelebilecek bir sorun, otomatik \u00f6l\u00e7eklendirme sayesinde di\u011fer Droplet&#8217;ler taraf\u0131ndan telafi edilebilir. Yeni Droplet&#8217;ler h\u0131zla devreye al\u0131narak CI\/CD ak\u0131\u015f\u0131n\u0131n kesintisiz devam etmesi sa\u011flan\u0131r.<\/p>\n<h4>Bak\u0131m Kolayl\u0131\u011f\u0131<\/h4>\n<p>Manuel olarak CI\/CD altyap\u0131s\u0131n\u0131 y\u00f6netmek, \u00f6zellikle b\u00fcy\u00fck ekipler ve projeler i\u00e7in zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir. Otomatik \u00f6l\u00e7eklendirme, altyap\u0131n\u0131n kendi kendini y\u00f6netmesini sa\u011flayarak operasyonel y\u00fck\u00fc azalt\u0131r:<\/p>\n<p>*   <strong>Otomatik Altyap\u0131 Y\u00f6netimi:<\/strong> Geli\u015ftiricilerin veya DevOps m\u00fchendislerinin s\u00fcrekli olarak Runner kapasitesini izlemesine ve ayarlamas\u0131na gerek kalmaz. Sistem, tan\u0131mlanan kurallara g\u00f6re otomatik olarak hareket eder.<br \/>\n*   <strong>G\u00fcncel ve Temiz Ortamlar:<\/strong> Her yeni CI\/CD i\u015fi i\u00e7in s\u0131f\u0131rdan olu\u015fturulan bir Droplet, temiz ve tutarl\u0131 bir ortam sa\u011flar. Bu, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 veya \u00f6nceki i\u015flerden kalan art\u0131klar\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<h3>GitLab Runner ve Otomatik \u00d6l\u00e7eklendirme Mimarisi<\/h3>\n<p>GitLab Runner, GitLab CI\/CD&#8217;nin kalbinde yer alan ve pipeline i\u015flerini y\u00fcr\u00fcten temel bile\u015fendir. Otomatik \u00f6l\u00e7eklendirme yetene\u011fi, Runner&#8217;\u0131n \u00f6zel bir yap\u0131land\u0131rma ile bulut sa\u011flay\u0131c\u0131larla entegre olmas\u0131yla m\u00fcmk\u00fcn olur.<\/p>\n<h4>GitLab Runner Nedir?<\/h4>\n<p>GitLab Runner, GitLab CI\/CD pipeline&#8217;lar\u0131nda tan\u0131mlanan i\u015fleri (job) y\u00fcr\u00fcten hafif bir ajand\u0131r. Farkl\u0131 y\u00fcr\u00fctme ortamlar\u0131n\u0131 (executor) destekler:<\/p>\n<p>*   <strong>Shell:<\/strong> \u0130\u015fleri Runner&#8217;\u0131n kurulu oldu\u011fu sunucuda do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Docker:<\/strong> \u0130\u015fleri Docker konteynerleri i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131r. Her i\u015f i\u00e7in yeni bir konteyner ba\u015flat\u0131l\u0131r.<br \/>\n*   <strong>Docker Machine:<\/strong> \u0130\u015fleri dinamik olarak olu\u015fturulan sanal makinelerde (VM) veya bulut sunucular\u0131nda (DigitalOcean Droplet&#8217;leri gibi) Docker konteynerleri i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131r. Otomatik \u00f6l\u00e7eklendirme i\u00e7in bu executor kullan\u0131l\u0131r.<br \/>\n*   <strong>Kubernetes:<\/strong> \u0130\u015fleri Kubernetes k\u00fcmesi i\u00e7inde pod&#8217;lar olarak \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n*   <strong>VirtualBox, Parallels, SSH, Custom:<\/strong> Di\u011fer \u00f6zel veya sanalla\u015ft\u0131rma ortamlar\u0131 i\u00e7in.<\/p>\n<p>Otomatik \u00f6l\u00e7eklendirme senaryomuzda, GitLab Runner&#8217;\u0131 DigitalOcean \u00fczerinde &#8220;docker+machine&#8221; executor&#8217;\u0131 ile yap\u0131land\u0131raca\u011f\u0131z. Bu, Runner&#8217;\u0131n DigitalOcean API&#8217;sini kullanarak CI\/CD i\u015fleri i\u00e7in an\u0131nda yeni Droplet&#8217;ler olu\u015fturmas\u0131n\u0131 ve i\u015fler tamamland\u0131\u011f\u0131nda bunlar\u0131 silmesini sa\u011flayacakt\u0131r.<\/p>\n<h4>Otomatik \u00d6l\u00e7eklendirme Mekanizmas\u0131<\/h4>\n<p>GitLab Runner&#8217;\u0131n &#8220;docker+machine&#8221; executor&#8217;\u0131, arka planda Docker Machine arac\u0131n\u0131 kullan\u0131r. Docker Machine, farkl\u0131 bulut sa\u011flay\u0131c\u0131lar\u0131nda (AWS, GCP, Azure, DigitalOcean vb.) veya sanalla\u015ft\u0131rma platformlar\u0131nda (VirtualBox gibi) Docker ana bilgisayarlar\u0131 olu\u015fturmak i\u00e7in kullan\u0131lan bir ara\u00e7t\u0131r.<\/p>\n<p>DigitalOcean entegrasyonu i\u00e7in, GitLab Runner&#8217;a DigitalOcean API token&#8217;\u0131 ve SSH anahtar\u0131 sa\u011flamam\u0131z gerekir. Runner, bu kimlik bilgileriyle DigitalOcean API&#8217;sine ba\u011flanarak \u015funlar\u0131 yapar:<\/p>\n<p>1.  <strong>\u0130\u015f Y\u00fck\u00fc \u0130zleme:<\/strong> Runner, bekleyen CI\/CD i\u015flerinin say\u0131s\u0131n\u0131 izler.<br \/>\n2.  <strong>Droplet Olu\u015fturma:<\/strong> Belirlenen e\u015fiklerin (\u00f6rne\u011fin, belirli bir say\u0131da bo\u015fta Runner \u00f6rne\u011fi olmad\u0131\u011f\u0131nda veya bekleyen i\u015f say\u0131s\u0131 artt\u0131\u011f\u0131nda) a\u015f\u0131lmas\u0131 durumunda, Runner DigitalOcean&#8217;da yeni bir Droplet olu\u015fturur. Bu Droplet, Docker kurulu ve GitLab Runner&#8217;\u0131n kontrol edebilece\u011fi \u015fekilde yap\u0131land\u0131r\u0131l\u0131r.<br \/>\n3.  <strong>\u0130\u015f Y\u00fcr\u00fctme:<\/strong> Yeni Droplet haz\u0131r oldu\u011funda, bekleyen CI\/CD i\u015flerinden birini bu Droplet \u00fczerindeki bir Docker konteynerinde ba\u015flat\u0131r.<br \/>\n4.  <strong>Droplet Silme:<\/strong> Bir Droplet belirli bir s\u00fcre (idle_time) bo\u015fta kald\u0131\u011f\u0131nda veya \u00fczerinde tan\u0131mlanan maksimum i\u015f say\u0131s\u0131n\u0131 (max_builds) tamamlad\u0131\u011f\u0131nda, Runner bu Droplet&#8217;i otomatik olarak siler. Bu, maliyetlerin kontrol alt\u0131nda tutulmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu mekanizma, <code>config.toml<\/code> dosyas\u0131nda yap\u0131lan yap\u0131land\u0131rmalarla y\u00f6netilir. Bu dosyadaki anahtar ayarlar \u015funlard\u0131r:<\/p>\n<p>*   <code>concurrent<\/code>: Ayn\u0131 anda ka\u00e7 i\u015fin paralel olarak \u00e7al\u0131\u015fabilece\u011fini belirler.<br \/>\n*   <code>limit<\/code>: Bir Runner&#8217;\u0131n ayn\u0131 anda ka\u00e7 i\u015fi i\u015fleyebilece\u011fini s\u0131n\u0131rlar.<br \/>\n*   <code>IdleCount<\/code>: Belirlenen say\u0131da bo\u015fta (idle) Droplet&#8217;in her zaman haz\u0131rda beklemesini sa\u011flar.<br \/>\n*   <code>IdleTime<\/code>: Bir Droplet&#8217;in silinmeden \u00f6nce ne kadar s\u00fcre bo\u015fta kalabilece\u011fini belirler.<br \/>\n*   <code>MaxBuilds<\/code>: Bir Droplet&#8217;in \u00f6mr\u00fc boyunca ka\u00e7 i\u015fi \u00e7al\u0131\u015ft\u0131rabilece\u011fini belirler. Bu say\u0131ya ula\u015f\u0131ld\u0131\u011f\u0131nda Droplet silinir ve yenisi olu\u015fturulur, bu da ortam\u0131n tazeli\u011fini korur.<br \/>\n*   <code>OffPeak<\/code>: Belirli zaman dilimlerinde (\u00f6rne\u011fin, mesai saatleri d\u0131\u015f\u0131nda) farkl\u0131 <code>IdleTime<\/code> ve <code>IdleCount<\/code> de\u011ferleri tan\u0131mlayarak maliyet optimizasyonu sa\u011flar.<\/p>\n<h3>DigitalOcean Hesab\u0131 Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>GitLab Runner&#8217;\u0131n DigitalOcean \u00fczerinde Droplet&#8217;ler olu\u015fturabilmesi ve y\u00f6netebilmesi i\u00e7in baz\u0131 \u00f6n haz\u0131rl\u0131klar\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<h4>API Token Olu\u015fturma<\/h4>\n<p>GitLab Runner&#8217;\u0131n DigitalOcean hesab\u0131n\u0131za programatik olarak eri\u015febilmesi i\u00e7in bir API token&#8217;\u0131na ihtiyac\u0131 vard\u0131r. Bu token, Runner&#8217;a Droplet olu\u015fturma, silme, listeleme gibi yetkiler verir.<\/p>\n<p>1.  <strong>DigitalOcean Kontrol Paneline Giri\u015f Yap\u0131n:<\/strong> Taray\u0131c\u0131n\u0131zdan DigitalOcean hesab\u0131n\u0131za giri\u015f yap\u0131n.<br \/>\n2.  <strong>API B\u00f6l\u00fcm\u00fcne Gidin:<\/strong> Sol men\u00fcden &#8220;API&#8221; se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n3.  <strong>Yeni Token Olu\u015fturun:<\/strong> &#8220;Tokens\/Keys&#8221; sekmesi alt\u0131nda &#8220;Generate New Token&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n4.  <strong>Token Detaylar\u0131n\u0131 Girin:<\/strong><br \/>\n    *   <strong>Token Name:<\/strong> Anlaml\u0131 bir isim verin (\u00f6rn: <code>gitlab-runner-autoscaling-token<\/code>).<br \/>\n    *   <strong>Select Scopes:<\/strong> &#8220;Read&#8221; ve &#8220;Write&#8221; izinlerinin her ikisini de se\u00e7ti\u011finizden emin olun. &#8220;Write&#8221; izni, Runner&#8217;\u0131n Droplet olu\u015fturabilmesi ve silebilmesi i\u00e7in gereklidir.<br \/>\n5.  <strong>Token&#8217;\u0131 Kopyalay\u0131n:<\/strong> &#8220;Generate Token&#8221; d\u00fc\u011fmesine t\u0131klad\u0131ktan sonra size g\u00f6sterilen token&#8217;\u0131 kopyalay\u0131n. <strong>Bu token yaln\u0131zca bir kez g\u00f6sterilecektir.<\/strong> Kaybetti\u011finiz takdirde yenisini olu\u015fturman\u0131z gerekir. Bu token&#8217;\u0131 g\u00fcvenli bir yerde saklay\u0131n, \u00e7\u00fcnk\u00fc DigitalOcean hesab\u0131n\u0131za tam eri\u015fim sa\u011flar.<\/p>\n<h4>SSH Anahtar \u00c7ifti Olu\u015fturma ve DigitalOcean&#8217;a Ekleme<\/h4>\n<p>GitLab Runner, olu\u015fturdu\u011fu Droplet&#8217;lere SSH \u00fczerinden ba\u011flanarak Docker&#8217;\u0131 kurar ve CI\/CD i\u015flerini y\u00fcr\u00fct\u00fcr. Bu ba\u011flant\u0131 i\u00e7in bir SSH anahtar \u00e7ifti gereklidir.<\/p>\n<p>1.  <strong>SSH Anahtar \u00c7ifti Olu\u015fturun:<\/strong><br \/>\n    *   Runner&#8217;\u0131 kuraca\u011f\u0131n\u0131z sunucuda veya yerel makinenizde bir terminal a\u00e7\u0131n.<br \/>\n    *   A\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096 -C \"gitlab-runner-key\"<\/code><\/pre>\n<p>    *   Anahtar dosyas\u0131n\u0131 kaydedece\u011finiz yeri ve parolas\u0131n\u0131 soracakt\u0131r. Varsay\u0131lan konumu (<code>~\/.ssh\/id_rsa<\/code>) kabul edebilir ve parola belirlemeyebilirsiniz (bu, otomatik i\u015flemler i\u00e7in daha uygundur, ancak g\u00fcvenlik risklerini g\u00f6z \u00f6n\u00fcnde bulundurun).<br \/>\n    *   Bu i\u015flem sonunda iki dosya olu\u015facakt\u0131r: <code>id_rsa<\/code> (\u00f6zel anahtar) ve <code>id_rsa.pub<\/code> (genel anahtar).<br \/>\n2.  <strong>Genel Anahtar\u0131 Kopyalay\u0131n:<\/strong><br \/>\n    *   Genel anahtar\u0131n\u0131z\u0131n i\u00e7eri\u011fini kopyalay\u0131n:<\/p>\n<pre><code class=\"language-bash\">cat ~\/.ssh\/id_rsa.pub<\/code><\/pre>\n<p>3.  <strong>Genel Anahtar\u0131 DigitalOcean&#8217;a Ekleyin:<\/strong><br \/>\n    *   DigitalOcean kontrol paneline geri d\u00f6n\u00fcn.<br \/>\n    *   Sol men\u00fcden &#8220;Settings&#8221; (Ayarlar) se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n    *   &#8220;Security&#8221; (G\u00fcvenlik) sekmesine gidin.<br \/>\n    *   &#8220;SSH keys&#8221; b\u00f6l\u00fcm\u00fcnde &#8220;Add SSH Key&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n    *   <strong>Name:<\/strong> Anahtar\u0131n\u0131za anlaml\u0131 bir isim verin (\u00f6rn: <code>gitlab-runner-ssh-key<\/code>).<br \/>\n    *   <strong>SSH Public Key:<\/strong> Kopyalad\u0131\u011f\u0131n\u0131z genel anahtar i\u00e7eri\u011fini buraya yap\u0131\u015ft\u0131r\u0131n.<br \/>\n    *   &#8220;Add SSH Key&#8221; d\u00fc\u011fmesine t\u0131klayarak anahtar\u0131 ekleyin.<\/p>\n<p>Bu anahtar \u00e7ifti, Runner&#8217;\u0131n olu\u015fturaca\u011f\u0131 t\u00fcm Droplet&#8217;lere otomatik olarak eklenecektir.<\/p>\n<h3>GitLab Runner Kurulumu ve Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>\u015eimdi GitLab Runner&#8217;\u0131 DigitalOcean&#8217;da Droplet&#8217;leri y\u00f6netecek olan &#8220;kontrol Droplet&#8217;ine&#8221; kurma ve yap\u0131land\u0131rma zaman\u0131.<\/p>\n<h4>GitLab Runner Kurulumu<\/h4>\n<p>Otomatik \u00f6l\u00e7eklenen Droplet&#8217;leri y\u00f6netecek olan GitLab Runner&#8217;\u0131n kendisi de bir DigitalOcean Droplet&#8217;inde \u00e7al\u0131\u015fmal\u0131d\u0131r. Bu Droplet&#8217;in \u00e7ok g\u00fc\u00e7l\u00fc olmas\u0131na gerek yoktur; k\u00fc\u00e7\u00fck bir boyutu (\u00f6rn: Basic, 1GB RAM, 1vCPU) yeterli olacakt\u0131r. Ubuntu i\u015fletim sistemini tercih edebilirsiniz.<\/p>\n<p>1.  <strong>Kontrol Droplet&#8217;ini Olu\u015fturun:<\/strong> DigitalOcean kontrol panelinden yeni bir Droplet olu\u015fturun ve SSH ile ba\u011flan\u0131n.<br \/>\n2.  <strong>GitLab Runner Deposunu Ekleyin:<\/strong><\/p>\n<pre><code class=\"language-bash\">curl -L \"https:\/\/packages.gitlab.com\/install\/repositories\/runner\/gitlab-runner\/script.deb.sh\" | sudo bash<\/code><\/pre>\n<p>3.  <strong>GitLab Runner&#8217;\u0131 Kurun:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt-get update\n    sudo apt-get install gitlab-runner<\/code><\/pre>\n<p>    Bu komutlar, GitLab Runner&#8217;\u0131 sunucunuza kuracak ve bir sistem hizmeti olarak ba\u015flatacakt\u0131r.<\/p>\n<h4>GitLab Runner Kayd\u0131 (Registration)<\/h4>\n<p>Kurulumdan sonra Runner&#8217;\u0131 GitLab instance&#8217;\u0131n\u0131za kaydetmeniz gerekir. Bu ad\u0131mda, Runner&#8217;\u0131n hangi GitLab projesi veya grubuyla ili\u015fkilendirilece\u011fini ve hangi executor&#8217;\u0131 kullanaca\u011f\u0131n\u0131 belirtiriz.<\/p>\n<p>1.  <strong>Kay\u0131t Komutunu \u00c7al\u0131\u015ft\u0131r\u0131n:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo gitlab-runner register<\/code><\/pre>\n<p>2.  <strong>Sorular\u0131 Yan\u0131tlay\u0131n:<\/strong><br \/>\n    *   <code>Please enter the GitLab instance URL (e.g. https:\/\/gitlab.com\/):<\/code><br \/>\n        *   Kendi GitLab URL&#8217;nizi girin (\u00f6rn: <code>https:\/\/gitlab.com<\/code> veya kendi kurdu\u011funuz instance&#8217;\u0131n adresi).<br \/>\n    *   <code>Please enter the registration token:<\/code><br \/>\n        *   GitLab projeniz veya grubunuzun &#8220;Settings > CI\/CD > Runners&#8221; b\u00f6l\u00fcm\u00fcnde bulabilece\u011finiz kay\u0131t token&#8217;\u0131n\u0131 girin.<br \/>\n    *   <code>Please enter a description for the runner:<\/code><br \/>\n        *   Runner i\u00e7in bir a\u00e7\u0131klama girin (\u00f6rn: <code>DigitalOcean Autoscaled Runner<\/code>).<br \/>\n    *   <code>Please enter tags for the runner (comma-separated):<\/code><br \/>\n        *   Bu Runner&#8217;\u0131n hangi i\u015fleri alaca\u011f\u0131n\u0131 belirlemek i\u00e7in etiketler girin (\u00f6rn: <code>digitalocean, autoscaled, docker<\/code>). Bu etiketleri <code>.gitlab-ci.yml<\/code> dosyan\u0131zda kullanacaks\u0131n\u0131z.<br \/>\n    *   <code>Please enter the executor: shell, docker, docker-autoscaling, docker-ssh, docker+machine, docker-ssh+machine, kubernetes, custom:<\/code><br \/>\n        *   <code>docker+machine<\/code> yaz\u0131n. Bu, otomatik \u00f6l\u00e7eklendirme i\u00e7in DigitalOcean ile entegrasyonu sa\u011flayacak executor&#8217;d\u0131r.<br \/>\n    *   <code>Please enter the default Docker image (e.g. ruby:2.7):<\/code><br \/>\n        *   CI\/CD i\u015fleriniz i\u00e7in varsay\u0131lan bir Docker imaj\u0131 belirleyin (\u00f6rn: <code>ubuntu:latest<\/code> veya <code>alpine\/git<\/code>). Bu, <code>.gitlab-ci.yml<\/code> dosyas\u0131nda \u00f6zel bir imaj belirtilmedi\u011finde kullan\u0131lacakt\u0131r.<br \/>\n    *   <code>Please enter the DigitalOcean region (e.g. nyc3):<\/code><br \/>\n        *   Droplet&#8217;lerin olu\u015fturulmas\u0131n\u0131 istedi\u011finiz DigitalOcean b\u00f6lgesini girin (\u00f6rn: <code>fra1<\/code>, <code>nyc3<\/code>, <code>ams3<\/code>).<br \/>\n    *   <code>Please enter the DigitalOcean droplet size (e.g. s-1vcpu-1gb):<\/code><br \/>\n        *   Olu\u015fturulacak Droplet&#8217;lerin boyutunu girin (\u00f6rn: <code>s-1vcpu-2gb<\/code>). \u0130\u015f y\u00fck\u00fcn\u00fcze uygun bir boyut se\u00e7in.<br \/>\n    *   <code>Please enter the DigitalOcean image (e.g. ubuntu-20-04-x64):<\/code><br \/>\n        *   Kullan\u0131lacak Droplet imaj\u0131n\u0131 girin (\u00f6rn: <code>ubuntu-22-04-x64<\/code>).<br \/>\n    *   <code>Please enter the DigitalOcean SSH key name (e.g. my-ssh-key):<\/code><br \/>\n        *   Daha \u00f6nce DigitalOcean&#8217;a ekledi\u011finiz SSH anahtar\u0131n\u0131z\u0131n ad\u0131n\u0131 girin (\u00f6rn: <code>gitlab-runner-ssh-key<\/code>).<br \/>\n    *   <code>Please enter the DigitalOcean API access token:<\/code><br \/>\n        *   Daha \u00f6nce olu\u015fturdu\u011funuz DigitalOcean API token&#8217;\u0131n\u0131 buraya yap\u0131\u015ft\u0131r\u0131n.<\/p>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, Runner GitLab&#8217;a kaydedilecek ve temel bir <code>config.toml<\/code> dosyas\u0131 olu\u015fturulacakt\u0131r.<\/p>\n<h4><code>config.toml<\/code> Dosyas\u0131n\u0131n Yap\u0131land\u0131r\u0131lmas\u0131<\/h4>\n<p>Otomatik \u00f6l\u00e7eklendirme ayarlar\u0131n\u0131n \u00e7o\u011fu <code>\/etc\/gitlab-runner\/config.toml<\/code> dosyas\u0131nda yap\u0131l\u0131r. Bu dosyay\u0131 bir metin d\u00fczenleyici ile a\u00e7\u0131n (<code>sudo nano \/etc\/gitlab-runner\/config.toml<\/code>).<\/p>\n<p>\u00d6rnek bir <code>config.toml<\/code> dosyas\u0131 \u015fu \u015fekilde g\u00f6r\u00fcnecektir:<\/p>\n<pre><code class=\"language-toml\">concurrent = 10 # Ayn\u0131 anda \u00e7al\u0131\u015fabilecek maksimum i\u015f say\u0131s\u0131\n\n[[runners]]\n  name = \"DigitalOcean Autoscaled Runner\"\n  url = \"https:\/\/gitlab.com\/\" # Kendi GitLab URL'niz\n  token = \"YOUR_RUNNER_TOKEN\" # Kay\u0131t s\u0131ras\u0131nda verilen token\n  executor = \"docker+machine\"\n  limit = 5 # Bu runner'\u0131n ayn\u0131 anda i\u015fleyebilece\u011fi maksimum i\u015f say\u0131s\u0131\n\n  [runners.docker]\n    tls_verify = false\n    image = \"ubuntu:latest\" # Varsay\u0131lan Docker imaj\u0131\n    privileged = false # G\u00fcvenlik i\u00e7in false olarak b\u0131rak\u0131n, sadece gerekti\u011finde true yap\u0131n\n    disable_cache = false\n    volumes = [\"\/cache\"] # \u00d6nbellekleme i\u00e7in volume\n    shm_size = 0\n\n  [runners.machine]\n    IdleCount = 1 # Her zaman haz\u0131rda bekleyecek bo\u015fta Droplet say\u0131s\u0131\n    IdleTime = 600 # Bir Droplet'in silinmeden \u00f6nce bo\u015fta kalabilece\u011fi saniye cinsinden s\u00fcre (10 dakika)\n    MaxBuilds = 10 # Bir Droplet'in \u00f6mr\u00fc boyunca i\u015fleyebilece\u011fi maksimum i\u015f say\u0131s\u0131\n    MachineDriver = \"digitalocean\"\n    MachineName = \"gitlab-runner-%s\" # Olu\u015fturulacak Droplet'lerin isim \u015fablonu (\u00f6rn: gitlab-runner-12345)\n    MachineOptions = [\n      \"digitalocean-image=ubuntu-22-04-x64\", # Kullan\u0131lacak DigitalOcean imaj\u0131\n      \"digitalocean-region=fra1\", # Droplet'lerin olu\u015fturulaca\u011f\u0131 b\u00f6lge\n      \"digitalocean-size=s-1vcpu-2gb\", # Droplet boyutu\n      \"digitalocean-ssh-user=root\", # Droplet'e ba\u011flanmak i\u00e7in SSH kullan\u0131c\u0131s\u0131\n      \"digitalocean-ssh-key-path=\/root\/.ssh\/id_rsa\", # SSH \u00f6zel anahtar\u0131n\u0131n yolu (kontrol Droplet'i \u00fczerinde)\n      \"digitalocean-access-token=YOUR_DIGITALOCEAN_API_TOKEN\", # DigitalOcean API token'\u0131\n      \"digitalocean-private-networking=true\", # \u00d6zel a\u011f kullan\u0131m\u0131 (iste\u011fe ba\u011fl\u0131)\n      \"digitalocean-tags=gitlab-runner,autoscaled\", # Droplet'lere eklenecek etiketler (iste\u011fe ba\u011fl\u0131)\n      \"digitalocean-monitoring=true\" # DigitalOcean monitoring \u00f6zelli\u011fini etkinle\u015ftir (iste\u011fe ba\u011fl\u0131)\n      # \"digitalocean-user-data=.\/init-script.sh\" # Ba\u015flang\u0131\u00e7ta \u00e7al\u0131\u015ft\u0131r\u0131lacak script (iste\u011fe ba\u011fl\u0131)\n    ]\n\n  # [runners.machine.autoscaling]\n  #   Periods = [\"<em> <\/em> 9-17 <em> <\/em> mon-fri\"] # Mesai saatleri (UTC)\n  #   IdleCount = 2\n  #   IdleTime = 300 # Mesai saatlerinde daha h\u0131zl\u0131 \u00f6l\u00e7eklenmesi i\u00e7in\n  #\n  # [runners.machine.autoscaling]\n  #   Periods = [\"<em> <\/em> <em> <\/em> <em> sat,sun\", \"<\/em> <em> 0-8,18-23 <\/em> * mon-fri\"] # Mesai d\u0131\u015f\u0131 saatler\n  #   IdleCount = 0\n  #   IdleTime = 1800 # Mesai d\u0131\u015f\u0131 saatlerde daha yava\u015f \u00f6l\u00e7eklenmesi i\u00e7in<\/code><\/pre>\n<p><strong>\u00d6nemli Ayarlar\u0131n A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>*   <strong><code>concurrent<\/code> (Global):<\/strong> GitLab Runner&#8217;\u0131n ayn\u0131 anda toplamda ka\u00e7 CI\/CD i\u015fini i\u015fleyebilece\u011fini belirler. Bu de\u011fer, t\u00fcm Runner&#8217;lar genelinde bir \u00fcst s\u0131n\u0131rd\u0131r.<br \/>\n*   <strong><code>limit<\/code> (Runner Ba\u015f\u0131na):<\/strong> Bu \u00f6zel <code>[[runners]]<\/code> tan\u0131m\u0131n\u0131n ayn\u0131 anda ka\u00e7 i\u015fi i\u015fleyebilece\u011fini s\u0131n\u0131rlar. <code>concurrent<\/code> de\u011ferinden b\u00fcy\u00fck olamaz.<br \/>\n*   <strong><code>[runners.docker]<\/code>:<\/strong><br \/>\n    *   <code>image<\/code>: Olu\u015fturulan Droplet&#8217;lerdeki Docker konteynerlerinde kullan\u0131lacak varsay\u0131lan Docker imaj\u0131.<br \/>\n    *   <code>privileged<\/code>: <code>true<\/code> olarak ayarlan\u0131rsa, konteynerler daha fazla yetkiye sahip olur. Genellikle g\u00fcvenlik nedeniyle <code>false<\/code> b\u0131rak\u0131lmas\u0131 \u00f6nerilir.<br \/>\n*   <strong><code>[runners.machine]<\/code>:<\/strong><br \/>\n    *   <code>IdleCount<\/code>: Her zaman haz\u0131rda bekleyecek minimum bo\u015fta Droplet say\u0131s\u0131. Bu, yeni bir i\u015f geldi\u011finde hemen ba\u015flat\u0131labilen haz\u0131r Droplet&#8217;lerin olmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>IdleTime<\/code>: Bir Droplet&#8217;in silinmeden \u00f6nce ne kadar s\u00fcre bo\u015fta kalabilece\u011fini (saniye cinsinden) belirler. Bu s\u00fcre doldu\u011funda ve Droplet \u00fczerinde i\u015f yoksa silinir.<br \/>\n    *   <code>MaxBuilds<\/code>: Bir Droplet&#8217;in \u00f6mr\u00fc boyunca \u00e7al\u0131\u015ft\u0131rabilece\u011fi maksimum i\u015f say\u0131s\u0131. Bu say\u0131ya ula\u015f\u0131ld\u0131\u011f\u0131nda, Droplet silinir ve yeni i\u015fler i\u00e7in yeni bir Droplet olu\u015fturulur. Bu, Droplet&#8217;lerin &#8220;kirlenmesini&#8221; \u00f6nler.<br \/>\n    *   <code>MachineDriver<\/code>: <code>digitalocean<\/code> olarak ayarlanmal\u0131d\u0131r.<br \/>\n    *   <code>MachineName<\/code>: Olu\u015fturulacak Droplet&#8217;lerin adland\u0131rma \u015fablonu. <code>%s<\/code> k\u0131sm\u0131, Docker Machine taraf\u0131ndan otomatik olarak bir ID ile de\u011fi\u015ftirilir.<br \/>\n    *   <code>MachineOptions<\/code>: DigitalOcean&#8217;a \u00f6zel yap\u0131land\u0131rma se\u00e7enekleri listesi. Bunlar, Droplet&#8217;in nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 (imaj, b\u00f6lge, boyut vb.) ve Runner&#8217;\u0131n Droplet&#8217;e nas\u0131l eri\u015fece\u011fini (SSH anahtar\u0131, API token&#8217;\u0131) belirler.<br \/>\n        *   <code>digitalocean-ssh-key-path<\/code>: Kontrol Droplet&#8217;i \u00fczerindeki SSH \u00f6zel anahtar\u0131n\u0131z\u0131n tam yolu. <strong><code>\/root\/.ssh\/id_rsa<\/code> olarak ayarlad\u0131\u011f\u0131n\u0131zdan emin olun<\/strong>, \u00e7\u00fcnk\u00fc GitLab Runner genellikle <code>root<\/code> kullan\u0131c\u0131s\u0131 alt\u0131nda \u00e7al\u0131\u015f\u0131r.<br \/>\n        *   <code>digitalocean-user-data<\/code>: \u0130ste\u011fe ba\u011fl\u0131 olarak, yeni olu\u015fturulan Droplet&#8217;lerde ba\u015flang\u0131\u00e7ta \u00e7al\u0131\u015ft\u0131r\u0131lacak bir cloud-init script&#8217;i belirtebilirsiniz. Bu, ek yaz\u0131l\u0131mlar\u0131 kurmak veya \u00f6zel yap\u0131land\u0131rmalar yapmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <strong><code>[runners.machine.autoscaling]<\/code> (OffPeak):<\/strong> Belirli zaman dilimlerinde farkl\u0131 <code>IdleCount<\/code> ve <code>IdleTime<\/code> de\u011ferleri tan\u0131mlaman\u0131za olanak tan\u0131r. Bu, maliyetleri daha da optimize etmek i\u00e7in harika bir yoldur. \u00d6rne\u011fin, mesai saatleri d\u0131\u015f\u0131nda <code>IdleCount<\/code>&#8216;\u0131 d\u00fc\u015f\u00fcr\u00fcp <code>IdleTime<\/code>&#8216;\u0131 art\u0131rabilirsiniz.<\/p>\n<p><code>config.toml<\/code> dosyas\u0131n\u0131 d\u00fczenledikten sonra kaydedin ve GitLab Runner hizmetini yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo gitlab-runner restart<\/code><\/pre>\n<p>Bu, yeni yap\u0131land\u0131rman\u0131n etkin olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>Otomatik \u00d6l\u00e7eklendirmeyi Test Etme<\/h3>\n<p>Yap\u0131land\u0131rman\u0131z\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in basit bir CI\/CD pipeline&#8217;\u0131 olu\u015fturup tetikleyelim ve DigitalOcean kontrol panelinden Droplet olu\u015fumunu g\u00f6zlemleyelim.<\/p>\n<h4>Basit Bir GitLab CI\/CD Pipeline Olu\u015fturma<\/h4>\n<p>GitLab projenizin k\u00f6k dizininde <code>.gitlab-ci.yml<\/code> ad\u0131nda bir dosya olu\u015fturun veya mevcut dosyan\u0131z\u0131 d\u00fczenleyin:<\/p>\n<pre><code class=\"language-yaml\">stages:\n  - build\n  - deploy\n\nbuild_job:\n  stage: build\n  script:\n    - echo \"Building application...\"\n    - apt-get update -y && apt-get install -y curl # \u00d6rnek: Bir paket kur\n    - curl -sL https:\/\/deb.nodesource.com\/setup_16.x | bash - # \u00d6rnek: Node.js kur\n    - apt-get install -y nodejs\n    - node -v\n    - sleep 120 # Uzun s\u00fcren bir build'i sim\u00fcle et\n  tags:\n    - digitalocean # Runner kaydederken verdi\u011finiz etiketlerden biri\n    - autoscaled # Runner kaydederken verdi\u011finiz etiketlerden biri\n\ndeploy_job:\n  stage: deploy\n  script:\n    - echo \"Deploying application...\"\n    - sleep 60 # Da\u011f\u0131t\u0131m\u0131 sim\u00fcle et\n  tags:\n    - digitalocean\n    - autoscaled<\/code><\/pre>\n<p>Bu \u00f6rnek pipeline:<\/p>\n<p>*   <code>build<\/code> ve <code>deploy<\/code> olmak \u00fczere iki a\u015famaya sahiptir.<br \/>\n*   Her a\u015famada basit <code>echo<\/code> komutlar\u0131 ve <code>sleep<\/code> komutlar\u0131, i\u015flerin biraz zaman almas\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131lm\u0131\u015ft\u0131r.<br \/>\n*   <code>tags<\/code> b\u00f6l\u00fcm\u00fcnde, Runner kaydederken verdi\u011finiz etiketleri kulland\u0131\u011f\u0131n\u0131zdan emin olun. Bu etiketler, GitLab&#8217;\u0131n bu i\u015fleri otomatik \u00f6l\u00e7eklenen Runner&#8217;\u0131n\u0131za atamas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Pipeline&#8217;\u0131 \u00c7al\u0131\u015ft\u0131rma ve Droplet Olu\u015fumunu G\u00f6zlemleme<\/h4>\n<p>1.  <strong>De\u011fi\u015fiklikleri Push Edin:<\/strong> <code>.gitlab-ci.yml<\/code> dosyas\u0131n\u0131 GitLab projenize commit edin ve push edin. Bu, otomatik olarak bir pipeline tetikleyecektir.<br \/>\n2.  <strong>GitLab UI&#8217;dan Takip Edin:<\/strong> GitLab projenizin &#8220;CI\/CD > Pipelines&#8221; b\u00f6l\u00fcm\u00fcne gidin. Yeni pipeline&#8217;\u0131n\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. \u0130lk ba\u015fta i\u015fler &#8220;pending&#8221; (beklemede) durumunda olabilir.<br \/>\n3.  <strong>DigitalOcean Kontrol Panelini G\u00f6zlemleyin:<\/strong> Ayr\u0131 bir taray\u0131c\u0131 sekmesinde DigitalOcean kontrol panelinizdeki &#8220;Droplets&#8221; b\u00f6l\u00fcm\u00fcne gidin.<br \/>\n    *   Birka\u00e7 dakika i\u00e7inde, <code>gitlab-runner-XXXXX<\/code> ad\u0131nda yeni Droplet&#8217;lerin olu\u015fmaya ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz.<br \/>\n    *   Bu Droplet&#8217;ler haz\u0131rland\u0131k\u00e7a, GitLab&#8217;daki i\u015fler &#8220;running&#8221; (\u00e7al\u0131\u015f\u0131yor) durumuna ge\u00e7ecektir.<br \/>\n    *   Birden fazla i\u015fi ayn\u0131 anda tetikleyerek (<code>concurrent<\/code> ve <code>limit<\/code> ayarlar\u0131n\u0131za ba\u011fl\u0131 olarak), birden fazla Droplet&#8217;in ayn\u0131 anda olu\u015ftu\u011funu g\u00f6zlemleyebilirsiniz.<br \/>\n4.  <strong>\u0130\u015flerin Tamamlanmas\u0131n\u0131 Bekleyin:<\/strong> Pipeline&#8217;daki t\u00fcm i\u015fler tamamland\u0131\u011f\u0131nda, Droplet&#8217;lerin <code>IdleTime<\/code> ve <code>MaxBuilds<\/code> ayarlar\u0131n\u0131za g\u00f6re belirli bir s\u00fcre sonra otomatik olarak silindi\u011fini g\u00f6receksiniz.<\/p>\n<p><strong>Ek Kontrol Komutlar\u0131 (Kontrol Droplet&#8217;inde):<\/strong><\/p>\n<p>*   <strong>GitLab Runner durumunu kontrol etme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo gitlab-runner status<\/code><\/pre>\n<p>*   <strong>Kay\u0131tl\u0131 Runner&#8217;lar\u0131 listeleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo gitlab-runner list<\/code><\/pre>\n<p>*   <strong>Docker Machine taraf\u0131ndan y\u00f6netilen makineleri listeleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">docker-machine ls<\/code><\/pre>\n<p>    Bu komut, Docker Machine&#8217;in hangi Droplet&#8217;leri y\u00f6netti\u011fini ve durumlar\u0131n\u0131 (Running, Stopped, Provisioning vb.) g\u00f6sterecektir.<\/p>\n<p>Bu test s\u00fcreci, otomatik \u00f6l\u00e7eklendirme yap\u0131land\u0131rman\u0131z\u0131n beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>GitLab Runner ile otomatik \u00f6l\u00e7eklendirmeyi DigitalOcean \u00fczerinde uygularken, g\u00fcvenli\u011fi, performans\u0131 ve maliyet verimlili\u011fini sa\u011flamak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h4>G\u00fcvenlik<\/h4>\n<p>*   <strong>API Token&#8217;\u0131 Y\u00f6netimi:<\/strong> DigitalOcean API token&#8217;\u0131n\u0131z, hesab\u0131n\u0131za tam eri\u015fim sa\u011flar. Bu token&#8217;\u0131 asla genel depolarda payla\u015fmay\u0131n ve Runner&#8217;\u0131n <code>config.toml<\/code> dosyas\u0131nda saklarken dosya izinlerinin do\u011fru ayarland\u0131\u011f\u0131ndan emin olun (<code>chmod 600 \/etc\/gitlab-runner\/config.toml<\/code>). M\u00fcmk\u00fcnse, token&#8217;\u0131 bir s\u0131r y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fcnde (HashiCorp Vault gibi) tutun ve Runner&#8217;\u0131n bu s\u0131rra eri\u015fmesini sa\u011flay\u0131n.<br \/>\n*   <strong>SSH Anahtarlar\u0131:<\/strong> SSH \u00f6zel anahtar\u0131n\u0131z\u0131 da ayn\u0131 \u015fekilde koruyun. <code>digitalocean-ssh-key-path<\/code> yolu, Runner&#8217;\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 kullan\u0131c\u0131n\u0131n eri\u015febilece\u011fi bir konumda olmal\u0131 ve do\u011fru izinlere sahip olmal\u0131d\u0131r.<br \/>\n*   <strong>Firewall Kurallar\u0131:<\/strong> DigitalOcean Droplet&#8217;leriniz i\u00e7in g\u00fcvenlik duvar\u0131 kurallar\u0131n\u0131 dikkatlice yap\u0131land\u0131r\u0131n. Yaln\u0131zca gerekli portlara (\u00f6rne\u011fin, GitLab ile ileti\u015fimi sa\u011flamak i\u00e7in 443 veya 80) izin verin.<br \/>\n*   <strong><code>privileged<\/code> Modu:<\/strong> <code>runners.docker<\/code> alt\u0131ndaki <code>privileged = true<\/code> ayar\u0131, Docker konteynerine \u00e7ok geni\u015f yetkiler verir ve g\u00fcvenlik riskleri ta\u015f\u0131r. Yaln\u0131zca ger\u00e7ekten gerekli oldu\u011funda kullan\u0131n ve risklerini anlad\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n*   <strong>Runner Kontrol Droplet&#8217;i G\u00fcvenli\u011fi:<\/strong> Otomatik \u00f6l\u00e7eklenen Droplet&#8217;leri y\u00f6neten kontrol Droplet&#8217;inin kendisi de g\u00fcvende olmal\u0131d\u0131r. D\u00fczenli g\u00fcncellemeler yap\u0131n, gereksiz servisleri kapat\u0131n ve g\u00fc\u00e7l\u00fc parolalar\/SSH anahtarlar\u0131 kullan\u0131n.<\/p>\n<h4>Performans ve Maliyet Optimizasyonu<\/h4>\n<p>*   <strong><code>IdleTime<\/code> ve <code>IdleCount<\/code> Optimizasyonu:<\/strong> Bu ayarlar, maliyet ve performans aras\u0131ndaki dengeyi sa\u011flar.<br \/>\n    *   <strong>D\u00fc\u015f\u00fck <code>IdleTime<\/code>, D\u00fc\u015f\u00fck <code>IdleCount<\/code>:<\/strong> Maliyetleri d\u00fc\u015f\u00fcr\u00fcr ancak yeni i\u015fler i\u00e7in Droplet&#8217;lerin ba\u015flat\u0131lmas\u0131n\u0131 beklemek zorunda kalabilirsiniz.<br \/>\n    *   <strong>Y\u00fcksek <code>IdleTime<\/code>, Y\u00fcksek <code>IdleCount<\/code>:<\/strong> \u0130\u015fler daha h\u0131zl\u0131 ba\u015flar ancak bo\u015fta kalan Droplet&#8217;ler i\u00e7in daha fazla \u00f6deme yapars\u0131n\u0131z.<br \/>\n    *   \u0130\u015f y\u00fck\u00fc kal\u0131plar\u0131n\u0131z\u0131 analiz ederek projenize en uygun de\u011ferleri bulun.<br \/>\n*   <strong>Do\u011fru Droplet Boyutu (<code>digitalocean-size<\/code>):<\/strong> CI\/CD i\u015flerinizin gereksinimlerine uygun Droplet boyutunu se\u00e7in. \u00c7ok k\u00fc\u00e7\u00fck bir boyut i\u015fleri yava\u015flat\u0131rken, \u00e7ok b\u00fcy\u00fck bir boyut gereksiz maliyetlere yol a\u00e7ar. CPU yo\u011fun i\u015fler i\u00e7in daha fazla vCPU, bellek yo\u011fun i\u015fler i\u00e7in daha fazla RAM i\u00e7eren boyutlar\u0131 tercih edin.<br \/>\n*   <strong><code>OffPeak<\/code> Ayarlar\u0131:<\/strong> Mesai saatleri d\u0131\u015f\u0131nda veya hafta sonlar\u0131 gibi d\u00fc\u015f\u00fck i\u015f y\u00fck\u00fc d\u00f6nemlerinde <code>IdleCount<\/code>&#8216;\u0131 d\u00fc\u015f\u00fcrmek ve <code>IdleTime<\/code>&#8216;\u0131 art\u0131rmak i\u00e7in <code>OffPeak<\/code> ayarlar\u0131n\u0131 kullan\u0131n. Bu, \u00f6nemli \u00f6l\u00e7\u00fcde maliyet tasarrufu sa\u011flayabilir.<br \/>\n*   <strong>\u00d6nbellekleme (<code>cache<\/code>):<\/strong> GitLab CI\/CD&#8217;nin \u00f6nbellekleme \u00f6zelli\u011fini kullanarak pipeline&#8217;lar aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve ara sonu\u00e7lar\u0131 depolayabilirsiniz. Bu, her i\u015fin s\u0131f\u0131rdan ba\u015flamas\u0131n\u0131 engelleyerek i\u015f s\u00fcrelerini k\u0131salt\u0131r ve performans art\u0131r\u0131r. <code>config.toml<\/code> dosyas\u0131ndaki <code>[runners.cache]<\/code> b\u00f6l\u00fcm\u00fcn\u00fc yap\u0131land\u0131rmay\u0131 unutmay\u0131n. DigitalOcean Spaces gibi bir S3 uyumlu depolama hizmetini \u00f6nbellek depolama alan\u0131 olarak kullanabilirsiniz.<br \/>\n*   <strong>\u00d6nceden Kurulmu\u015f \u0130majlar:<\/strong> <code>digitalocean-image<\/code> olarak, CI\/CD i\u015flerinizin temel ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (\u00f6rne\u011fin, Node.js, Python, Java) i\u00e7eren \u00f6zel bir imaj kullanabilirsiniz. Bu, her Droplet ba\u015flat\u0131ld\u0131\u011f\u0131nda bu ba\u011f\u0131ml\u0131l\u0131klar\u0131n yeniden kurulmas\u0131n\u0131 \u00f6nleyerek i\u015f ba\u015flatma s\u00fcrelerini h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong><code>MaxBuilds<\/code> Ayar\u0131:<\/strong> <code>MaxBuilds<\/code> de\u011feri, Droplet&#8217;lerin belirli say\u0131da i\u015ften sonra yenilenmesini sa\u011flar. Bu, Droplet&#8217;lerin &#8220;kirlenmesini&#8221; \u00f6nler ve tutarl\u0131 bir ortam sa\u011flar. \u00c7ok y\u00fcksek bir de\u011fer, bir Droplet&#8217;in uzun s\u00fcre \u00e7al\u0131\u015fmas\u0131na neden olabilirken, \u00e7ok d\u00fc\u015f\u00fck bir de\u011fer s\u0131k s\u0131k Droplet olu\u015fturma\/silme d\u00f6ng\u00fclerine yol a\u00e7abilir.<\/p>\n<h4>Hata Ay\u0131klama ve \u0130zleme<\/h4>\n<p>*   <strong>GitLab Runner Loglar\u0131:<\/strong> Runner kontrol Droplet&#8217;inde <code>\/var\/log\/gitlab-runner\/runner.log<\/code> dosyas\u0131n\u0131 d\u00fczenli olarak kontrol edin. Bu loglar, Runner&#8217;\u0131n DigitalOcean API ile ileti\u015fiminde veya Droplet olu\u015fturma\/silme i\u015flemlerinde olu\u015fan hatalar\u0131 i\u00e7erir.<br \/>\n*   <strong>DigitalOcean Droplet Loglar\u0131:<\/strong> Olu\u015fturulan Droplet&#8217;lerdeki sistem loglar\u0131n\u0131 (\u00f6rn: <code>\/var\/log\/syslog<\/code>, <code>cloud-init.log<\/code>) kontrol edin. \u00d6zellikle <code>digitalocean-user-data<\/code> ile bir ba\u015flang\u0131\u00e7 script&#8217;i kullan\u0131yorsan\u0131z, bu script&#8217;in do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in loglar\u0131 inceleyin.<br \/>\n*   <strong>GitLab CI\/CD Pipeline Loglar\u0131:<\/strong> GitLab UI&#8217;daki pipeline ve i\u015f loglar\u0131, CI\/CD i\u015flerinin neden ba\u015far\u0131s\u0131z oldu\u011funu anlamak i\u00e7in ilk ba\u015fvurulacak yerdir.<br \/>\n*   <strong>DigitalOcean Monitoring:<\/strong> DigitalOcean&#8217;\u0131n yerle\u015fik izleme ara\u00e7lar\u0131n\u0131 kullanarak Droplet&#8217;lerin CPU, RAM, disk ve a\u011f kullan\u0131m\u0131n\u0131 takip edin. Bu, otomatik \u00f6l\u00e7eklendirme ayarlar\u0131n\u0131z\u0131 optimize etmenize yard\u0131mc\u0131 olabilir.<br \/>\n*   <strong><code>docker-machine ls<\/code>:<\/strong> Runner kontrol Droplet&#8217;inde bu komutu d\u00fczenli olarak \u00e7al\u0131\u015ft\u0131rarak Docker Machine&#8217;in y\u00f6netti\u011fi Droplet&#8217;lerin durumunu kontrol edin.<\/p>\n<h4>S\u00fcr\u00fcm Y\u00f6netimi<\/h4>\n<p>*   <strong><code>config.toml<\/code> Dosyas\u0131:<\/strong> <code>config.toml<\/code> dosyan\u0131z\u0131 bir versiyon kontrol sisteminde (GitLab projenizin kendisi gibi) saklay\u0131n. Bu, yap\u0131land\u0131rma de\u011fi\u015fikliklerini izlemenizi, geri alman\u0131z\u0131 ve ekip \u00fcyeleri aras\u0131nda payla\u015fman\u0131z\u0131 sa\u011flar. Hassas bilgileri (API token&#8217;lar\u0131 gibi) do\u011frudan dosyada tutmak yerine, GitLab CI\/CD de\u011fi\u015fkenleri veya g\u00fcvenli s\u0131r y\u00f6netimi \u00e7\u00f6z\u00fcmleri kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn.<br \/>\n*   <strong>Runner \u0130majlar\u0131:<\/strong> GitLab Runner&#8217;\u0131 ve Docker imajlar\u0131n\u0131 d\u00fczenli olarak g\u00fcncelleyin. Bu, g\u00fcvenlik yamalar\u0131n\u0131 alman\u0131z\u0131 ve yeni \u00f6zelliklerden yararlanman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>GitLab Continuous Deployment s\u00fcre\u00e7lerinizi DigitalOcean \u00fczerinde GitLab Runner ile otomatik \u00f6l\u00e7eklendirmek, modern yaz\u0131l\u0131m geli\u015ftirme yakla\u015f\u0131mlar\u0131n\u0131n temel bir bile\u015fenidir. Bu makalede ele ald\u0131\u011f\u0131m\u0131z ad\u0131mlar\u0131 ve en iyi uygulamalar\u0131 takip ederek, CI\/CD altyap\u0131n\u0131z\u0131 dinamik, maliyet-etkin ve y\u00fcksek performansl\u0131 bir hale getirebilirsiniz.<\/p>\n<p>Otomatik \u00f6l\u00e7eklendirme sayesinde, yo\u011fun i\u015f y\u00fck\u00fc d\u00f6nemlerinde bile pipeline&#8217;lar\u0131n\u0131z\u0131n h\u0131zl\u0131 ve kesintisiz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilir, ayn\u0131 zamanda d\u00fc\u015f\u00fck i\u015f y\u00fck\u00fc zamanlar\u0131nda gereksiz kaynak maliyetlerinden ka\u00e7\u0131nabilirsiniz. DigitalOcean&#8217;\u0131n esnek bulut altyap\u0131s\u0131 ve GitLab Runner&#8217;\u0131n g\u00fc\u00e7l\u00fc otomatik \u00f6l\u00e7eklendirme yetenekleri birle\u015fti\u011finde, geli\u015ftirme ekipleriniz daha verimli \u00e7al\u0131\u015fabilir, yaz\u0131l\u0131mlar\u0131n\u0131z\u0131 daha h\u0131zl\u0131 teslim edebilir ve nihayetinde daha rekabet\u00e7i \u00fcr\u00fcnler ortaya \u00e7\u0131karabilir. Bu rehber, sa\u011flam ve otomatik \u00f6l\u00e7eklenen bir CI\/CD ortam\u0131 kurmak i\u00e7in size gerekli t\u00fcm ara\u00e7lar\u0131 ve bilgiyi sunmaktad\u0131r. Art\u0131k bu \u00e7\u00f6z\u00fcm\u00fc kendi projelerinizde hayata ge\u00e7irmeye haz\u0131rs\u0131n\u0131z.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m geli\u015ftirm","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-33850","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>GitLab Continuous Deployment&#039;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GitLab Continuous Deployment&#039;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme\" \/>\n<meta property=\"og:description\" content=\"GitLab Continuous Deployment&#039;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m geli\u015ftirm\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-07T20:40:55+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme\",\"datePublished\":\"2025-11-07T20:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\"},\"wordCount\":3822,\"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\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\",\"name\":\"GitLab Continuous Deployment'\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-07T20:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme\"}]},{\"@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":"GitLab Continuous Deployment'\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/","og_locale":"tr_TR","og_type":"article","og_title":"GitLab Continuous Deployment'\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme","og_description":"GitLab Continuous Deployment'\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m geli\u015ftirm","og_url":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-07T20:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme","datePublished":"2025-11-07T20:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/"},"wordCount":3822,"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\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/","url":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/","name":"GitLab Continuous Deployment'\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-07T20:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/gitlab-continuous-deploymenti-digitalocean-uzerinde-gitlab-runner-ile-otomatik-olceklendirme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GitLab Continuous Deployment&#8217;\u0131 DigitalOcean \u00dczerinde GitLab Runner ile Otomatik \u00d6l\u00e7eklendirme"}]},{"@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\/33850","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=33850"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33850\/revisions"}],"predecessor-version":[{"id":33851,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33850\/revisions\/33851"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}