{"id":34735,"date":"2025-11-21T10:40:50","date_gmt":"2025-11-21T07:40:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34735"},"modified":"2025-11-21T10:40:50","modified_gmt":"2025-11-21T07:40:50","slug":"otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/","title":{"rendered":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme"},"content":{"rendered":"<p><body><\/p>\n<h2>Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, g\u00fcvenilirlik ve verimlilik, rekabet avantaj\u0131 sa\u011flaman\u0131n temel ta\u015flar\u0131 haline gelmi\u015ftir. S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (CD) pratikleri, bu hedeflere ula\u015fmak i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r. CI\/CD, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecini otomatikle\u015ftirerek kod de\u011fi\u015fikliklerinin daha h\u0131zl\u0131, daha g\u00fcvenli ve daha tutarl\u0131 bir \u015fekilde test edilmesini ve canl\u0131 ortamlara da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar. Bu makalede, pop\u00fcler bir CI\/CD platformu olan CircleCI&#8217;\u0131 kullanarak GitHub&#8217;daki bir projeyi Ubuntu 18.04 sunucusu \u00fczerine otomatik olarak nas\u0131l da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>Neden CircleCI ve GitHub? GitHub, d\u00fcnya genelinde milyonlarca geli\u015ftirici taraf\u0131ndan kullan\u0131lan, a\u00e7\u0131k kaynak ve \u00f6zel projeler i\u00e7in lider bir s\u00fcr\u00fcm kontrol sistemidir. Proje y\u00f6netimini ve i\u015fbirli\u011fini kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc \u00f6zelliklere sahiptir. CircleCI ise, GitHub ile sorunsuz bir \u015fekilde entegre olan, esnek ve g\u00fc\u00e7l\u00fc bir CI\/CD platformudur. Bulut tabanl\u0131 yap\u0131s\u0131 sayesinde altyap\u0131 y\u00f6netimi derdini ortadan kald\u0131r\u0131r ve geli\u015ftiricilerin sadece kod yazmaya odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Ubuntu 18.04, uzun s\u00fcreli destek (LTS) sunan, kararl\u0131 ve yayg\u0131n olarak kullan\u0131lan bir Linux da\u011f\u0131t\u0131m\u0131d\u0131r. Sunucu ortamlar\u0131nda s\u0131kl\u0131kla tercih edilmesi, bu makale i\u00e7in ideal bir da\u011f\u0131t\u0131m hedefi olmas\u0131n\u0131 sa\u011flam\u0131\u015ft\u0131r. Her ne kadar Ubuntu 18.04&#8217;\u00fcn resmi deste\u011fi sona ermi\u015f olsa da, bir\u00e7ok sistemde hala kullan\u0131lmakta olup, bu rehberdeki temel prensipler daha yeni Ubuntu s\u00fcr\u00fcmleri i\u00e7in de ge\u00e7erli olacakt\u0131r.<\/p>\n<p>Bu makalenin amac\u0131, bir geli\u015ftiricinin veya DevOps m\u00fchendisinin, kodunu GitHub&#8217;a g\u00f6nderdi\u011finde otomatik olarak bir Ubuntu sunucusuna da\u011f\u0131t\u0131m yapmas\u0131n\u0131 sa\u011flayacak eksiksiz bir CI\/CD hatt\u0131 kurmas\u0131na yard\u0131mc\u0131 olmakt\u0131r. Konunun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 basitle\u015ftirmek ad\u0131na, ad\u0131m ad\u0131m bir rehber sunulacak ve her a\u015fama detayl\u0131 bir \u015fekilde a\u00e7\u0131klanacakt\u0131r.<\/p>\n<h3>\u00d6n Ko\u015fullar<\/h3>\n<p>Bu rehberi takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6n ko\u015fullar\u0131n yerine getirilmi\u015f olmas\u0131 gerekmektedir:<\/p>\n<p>*   <strong>GitHub Hesab\u0131:<\/strong> Proje kodunuzu bar\u0131nd\u0131rmak i\u00e7in bir GitHub hesab\u0131n\u0131z olmal\u0131 ve bu hesaba eri\u015fiminiz bulunmal\u0131d\u0131r.<br \/>\n*   <strong>CircleCI Hesab\u0131:<\/strong> GitHub hesab\u0131n\u0131zla ili\u015fkilendirilmi\u015f bir CircleCI hesab\u0131n\u0131z olmal\u0131d\u0131r. CircleCI&#8217;a GitHub hesab\u0131n\u0131zla kaydolmak olduk\u00e7a kolayd\u0131r.<br \/>\n*   <strong>Ubuntu 18.04 Sunucusu:<\/strong> Da\u011f\u0131t\u0131m hedefi olarak kullanaca\u011f\u0131n\u0131z, internete a\u00e7\u0131k bir Ubuntu 18.04 sunucunuz olmal\u0131d\u0131r. Bu bir VPS (Virtual Private Server), bulut sunucusu (AWS EC2, Google Cloud Compute Engine, Azure VM vb.) veya kendi fiziksel sunucunuz olabilir. Sunucuya SSH eri\u015fiminizin oldu\u011fundan emin olun.<br \/>\n*   <strong>SSH Anahtar \u00c7ifti:<\/strong> Sunucuya g\u00fcvenli bir \u015fekilde ba\u011flanmak ve CircleCI&#8217;\u0131n sunucuya eri\u015fimini sa\u011flamak i\u00e7in bir SSH anahtar \u00e7ifti (genellikle <code>id_rsa<\/code> ve <code>id_rsa.pub<\/code>) olu\u015fturmu\u015f olman\u0131z ve genel anahtar\u0131n\u0131z\u0131 (<code>id_rsa.pub<\/code>) Ubuntu sunucunuzdaki yetkili kullan\u0131c\u0131n\u0131n <code>.ssh\/authorized_keys<\/code> dosyas\u0131na eklemi\u015f olman\u0131z gerekmektedir.<br \/>\n*   <strong>Temel Git Bilgisi:<\/strong> Git komutlar\u0131n\u0131 (clone, add, commit, push) kullanma konusunda temel bilgiye sahip olman\u0131z beklenmektedir.<br \/>\n*   <strong>Temel Linux Komut Bilgisi:<\/strong> Ubuntu sunucusu \u00fczerinde temel Linux komutlar\u0131n\u0131 (cd, ls, mkdir, apt, systemctl vb.) kullanma becerisine sahip olman\u0131z gerekmektedir.<br \/>\n*   <strong>\u00d6rnek Uygulama:<\/strong> Da\u011f\u0131t\u0131m\u0131n\u0131 yapaca\u011f\u0131m\u0131z basit bir web uygulamas\u0131 (\u00f6rne\u011fin, Node.js, Python Flask veya PHP) haz\u0131r olmal\u0131d\u0131r. Bu makalede Node.js tabanl\u0131 basit bir uygulama \u00fczerinden ilerleyece\u011fiz.<\/p>\n<h3>Proje Yap\u0131s\u0131 ve GitHub Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m s\u00fcrecini ba\u015flatmadan \u00f6nce, da\u011f\u0131t\u0131lacak bir projemizin ve bunun bir GitHub deposunda bulunmas\u0131 gerekmektedir.<\/p>\n<h4>\u00d6rnek Proje Olu\u015fturma<\/h4>\n<p>Basit bir Node.js uygulamas\u0131 olu\u015ftural\u0131m. Proje dizininde <code>app.js<\/code> ve <code>package.json<\/code> dosyalar\u0131 bulunacakt\u0131r.<\/p>\n<p><code>package.json<\/code>:<\/p>\n<pre><code class=\"language-json\">{\n  \"name\": \"my-node-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple Node.js app for CircleCI deployment\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"node app.js\",\n    \"test\": \"echo \\\"No tests specified\\\" && exit 0\"\n  },\n  \"dependencies\": {\n    \"express\": \"^4.17.1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}<\/code><\/pre>\n<p><code>app.js<\/code>:<\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst app = express();\nconst port = 3000;\n\napp.get('\/', (req, res) => {\n  res.send('Merhaba D\u00fcnya! Bu CircleCI ile da\u011f\u0131t\u0131lan bir Node.js uygulamas\u0131d\u0131r.');\n});\n\napp.listen(port, () => {\n  console.log(<code>Uygulama http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Bu basit uygulama, <code>express<\/code> k\u00fct\u00fcphanesini kullanarak 3000 portunda &#8220;Merhaba D\u00fcnya!&#8221; mesaj\u0131n\u0131 d\u00f6nd\u00fcren bir web sunucusu ba\u015flat\u0131r.<\/p>\n<h4>GitHub Deposu Olu\u015fturma<\/h4>\n<p>1.  GitHub hesab\u0131n\u0131za giri\u015f yap\u0131n.<br \/>\n2.  Yeni bir depo (repository) olu\u015fturun (\u00f6rne\u011fin, <code>circleci-deploy-demo<\/code>).<br \/>\n3.  Depoyu yerel bilgisayar\u0131n\u0131za klonlay\u0131n:<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/KULLANICI_ADINIZ\/circleci-deploy-demo.git\n    cd circleci-deploy-demo<\/code><\/pre>\n<p>4.  Olu\u015fturdu\u011funuz <code>app.js<\/code> ve <code>package.json<\/code> dosyalar\u0131n\u0131 bu dizine kopyalay\u0131n.<br \/>\n5.  De\u011fi\u015fiklikleri commit edin ve GitHub&#8217;a g\u00f6nderin:<\/p>\n<pre><code class=\"language-bash\">git add .\n    git commit -m \"Initial commit: Add simple Node.js app\"\n    git push origin main<\/code><\/pre>\n<h3>CircleCI ile Entegrasyon<\/h3>\n<p>Projemiz GitHub&#8217;da oldu\u011funa g\u00f6re, \u015fimdi CircleCI&#8217;\u0131 bu depoya ba\u011flayabiliriz.<\/p>\n<p>1.  <strong>CircleCI&#8217;a Giri\u015f Yap\u0131n:<\/strong> CircleCI web sitesine gidin ve GitHub hesab\u0131n\u0131zla giri\u015f yap\u0131n.<br \/>\n2.  <strong>Projenizi Ekleyin:<\/strong> CircleCI kontrol panelinde sol taraftaki men\u00fcden &#8220;Projects&#8221; (Projeler) se\u00e7ene\u011fine t\u0131klay\u0131n. GitHub depolar\u0131n\u0131z\u0131n bir listesini g\u00f6receksiniz. <code>circleci-deploy-demo<\/code> deponuzu bulun ve &#8220;Set Up Project&#8221; (Projeyi Kur) d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n3.  <strong>Yap\u0131land\u0131rma Dosyas\u0131:<\/strong> CircleCI, projenizi kurmak i\u00e7in size bir <code>config.yml<\/code> dosyas\u0131 olu\u015fturman\u0131z\u0131 \u00f6nerecektir. &#8220;Fastest&#8221; (En H\u0131zl\u0131) veya &#8220;Hello World&#8221; \u015fablonlar\u0131ndan birini se\u00e7ebilir veya bo\u015f bir dosya ile ba\u015flayabilirsiniz. \u015eimdilik, &#8220;Hello World&#8221; se\u00e7ene\u011fini se\u00e7ip &#8220;Add config.yml&#8221; (config.yml ekle) d\u00fc\u011fmesine t\u0131klayabiliriz. Bu, CircleCI&#8217;\u0131n deponuzda <code>.circleci\/config.yml<\/code> ad\u0131nda bir dosya olu\u015fturmas\u0131n\u0131 sa\u011flayacakt\u0131r. Bu dosyay\u0131 daha sonra kendi gereksinimlerimize g\u00f6re d\u00fczenleyece\u011fiz.<\/p>\n<h3>Da\u011f\u0131t\u0131m Hedefi Haz\u0131rl\u0131\u011f\u0131: Ubuntu 18.04 Sunucusu<\/h3>\n<p>Uygulamam\u0131z\u0131n da\u011f\u0131t\u0131laca\u011f\u0131 Ubuntu 18.04 sunucusunu haz\u0131rlamam\u0131z gerekiyor.<\/p>\n<p>1.  <strong>Sunucuya SSH ile Ba\u011flan\u0131n:<\/strong><\/p>\n<pre><code class=\"language-bash\">ssh KULLANICI_ADINIZ@SUNUCU_IP_ADRESINIZ<\/code><\/pre>\n<p>    <code>KULLANICI_ADINIZ<\/code> ve <code>SUNUCU_IP_ADRESINIZ<\/code> de\u011ferlerini kendi sunucu bilgilerinizle de\u011fi\u015ftirin.<\/p>\n<p>2.  <strong>Gerekli Yaz\u0131l\u0131mlar\u0131n Kurulumu:<\/strong> Node.js uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Node.js ve npm&#8217;e ihtiyac\u0131m\u0131z var. Uygulamay\u0131 s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda tutmak i\u00e7in PM2&#8217;yi kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt upgrade -y\n\n    # Node.js ve npm kurulumu (NodeSource deposu \u00f6nerilir)\n    curl -sL https:\/\/deb.nodesource.com\/setup_14.x | sudo -E bash -\n    sudo apt-get install -y nodejs\n\n    # PM2 kurulumu\n    sudo npm install -g pm2<\/code><\/pre>\n<p>    (Not: Ubuntu 18.04 i\u00e7in Node.js 14.x veya daha y\u00fcksek bir s\u00fcr\u00fcm \u00f6nerilir. <code>setup_14.x<\/code> yerine g\u00fcncel LTS s\u00fcr\u00fcm\u00fcn\u00fc de kullanabilirsiniz.)<\/p>\n<p>3.  <strong>G\u00fcvenlik \u00d6nlemleri:<\/strong><br \/>\n    *   <strong>UFW (Basit G\u00fcvenlik Duvar\u0131):<\/strong> Sadece gerekli portlara eri\u015fime izin verin.<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow OpenSSH\n        sudo ufw allow 3000\/tcp # Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n        # E\u011fer Nginx kuracaksan\u0131z: sudo ufw allow 'Nginx HTTP'\n        sudo ufw enable\n        sudo ufw status<\/code><\/pre>\n<p>    *   <strong>SSH Anahtar Tabanl\u0131 Kimlik Do\u011frulama:<\/strong> \u015eifre ile giri\u015f yerine SSH anahtarlar\u0131 kullanmak daha g\u00fcvenlidir. Bu ad\u0131m\u0131 zaten &#8220;\u00d6n Ko\u015fullar&#8221; b\u00f6l\u00fcm\u00fcnde tamamlam\u0131\u015f olmal\u0131s\u0131n\u0131z.<\/p>\n<p>4.  <strong>Da\u011f\u0131t\u0131m Klas\u00f6r\u00fc Olu\u015fturma ve \u0130zinleri Ayarlama:<\/strong><br \/>\n    Uygulaman\u0131z\u0131n sunucuda konu\u015flanaca\u011f\u0131 bir dizin olu\u015fturun. Bu dizinin do\u011fru izinlere sahip olmas\u0131 \u00f6nemlidir.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\/my-node-app\n    sudo chown -R KULLANICI_ADINIZ:KULLANICI_ADINIZ \/var\/www\/my-node-app<\/code><\/pre>\n<p>    <code>KULLANICI_ADINIZ<\/code> yerine SSH ile ba\u011fland\u0131\u011f\u0131n\u0131z kullan\u0131c\u0131 ad\u0131n\u0131 yaz\u0131n. CircleCI bu dizine kod da\u011f\u0131t\u0131m\u0131 yapaca\u011f\u0131 i\u00e7in, bu kullan\u0131c\u0131n\u0131n yazma iznine sahip olmas\u0131 gereklidir.<\/p>\n<h3>SSH Anahtarlar\u0131 ve G\u00fcvenli De\u011fi\u015fkenler<\/h3>\n<p>CircleCI&#8217;\u0131n Ubuntu sunucunuza eri\u015febilmesi i\u00e7in SSH anahtarlar\u0131n\u0131 do\u011fru bir \u015fekilde yap\u0131land\u0131rmam\u0131z gerekiyor.<\/p>\n<p>1.  <strong>Yeni Bir SSH Anahtar \u00c7ifti Olu\u015fturun:<\/strong><br \/>\n    E\u011fer CircleCI i\u00e7in \u00f6zel bir SSH anahtar \u00e7ifti olu\u015fturmak isterseniz, yerel makinenizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n (parola istemini bo\u015f b\u0131rak\u0131n):<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096 -C \"circleci-deployment-key\" -f ~\/.ssh\/circleci_deploy_key<\/code><\/pre>\n<p>    Bu, <code>~\/.ssh\/circleci_deploy_key<\/code> (\u00f6zel anahtar) ve <code>~\/.ssh\/circleci_deploy_key.pub<\/code> (genel anahtar) dosyalar\u0131n\u0131 olu\u015fturacakt\u0131r.<\/p>\n<p>2.  <strong>Genel Anahtar\u0131 Ubuntu Sunucusuna Ekleyin:<\/strong><br \/>\n    <code>circleci_deploy_key.pub<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini Ubuntu sunucunuzdaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyin.<\/p>\n<pre><code class=\"language-bash\"># Yerel makinenizde\n    cat ~\/.ssh\/circleci_deploy_key.pub\n\n    # \u00c7\u0131kt\u0131y\u0131 kopyalay\u0131n. Sonra Ubuntu sunucunuzda\n    ssh KULLANICI_ADINIZ@SUNUCU_IP_ADRESINIZ 'echo \"KOPYALADIGINIZ_GENEL_ANAHTAR_METNI\" >> ~\/.ssh\/authorized_keys'<\/code><\/pre>\n<p>    Bu, CircleCI&#8217;\u0131n bu anahtar ile sunucunuza ba\u011flanmas\u0131na izin verecektir.<\/p>\n<p>3.  <strong>\u00d6zel Anahtar\u0131 CircleCI&#8217;a Ekleme:<\/strong><br \/>\n    *   CircleCI kontrol panelinde projenizin ayarlar\u0131na gidin (&#8220;Project Settings&#8221;).<br \/>\n    *   Sol men\u00fcden &#8220;SSH Keys&#8221; (SSH Anahtarlar\u0131) se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n    *   &#8220;Add SSH Key&#8221; (SSH Anahtar\u0131 Ekle) d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n    *   <strong>Hostname:<\/strong> Sunucunuzun IP adresini veya alan ad\u0131n\u0131 girin (\u00f6rne\u011fin, <code>SUNUCU_IP_ADRESINIZ<\/code>).<br \/>\n    *   <strong>Private Key:<\/strong> <code>~\/.ssh\/circleci_deploy_key<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini buraya yap\u0131\u015ft\u0131r\u0131n. Bu, CircleCI&#8217;\u0131n sunucunuza ba\u011flanmak i\u00e7in kullanaca\u011f\u0131 \u00f6zel anahtard\u0131r.<br \/>\n    *   &#8220;Add SSH Key&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n. CircleCI bu anahtar\u0131 g\u00fcvenli bir \u015fekilde saklayacak ve da\u011f\u0131t\u0131m s\u0131ras\u0131nda kullanacakt\u0131r.<\/p>\n<p>4.  <strong>Ortam De\u011fi\u015fkenleri Olu\u015fturma:<\/strong><br \/>\n    Hassas bilgileri (<code>SUNUCU_IP_ADRESINIZ<\/code>, <code>KULLANICI_ADINIZ<\/code>) <code>config.yml<\/code> dosyas\u0131na do\u011frudan yazmak yerine, CircleCI ortam de\u011fi\u015fkenlerini kullanmak daha g\u00fcvenlidir.<br \/>\n    *   CircleCI kontrol panelinde projenizin ayarlar\u0131na gidin (&#8220;Project Settings&#8221;).<br \/>\n    *   Sol men\u00fcden &#8220;Environment Variables&#8221; (Ortam De\u011fi\u015fkenleri) se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n    *   A\u015fa\u011f\u0131daki de\u011fi\u015fkenleri ekleyin:<br \/>\n        *   <code>SSH_USER<\/code>: Ubuntu sunucusuna ba\u011flanmak i\u00e7in kullanaca\u011f\u0131n\u0131z kullan\u0131c\u0131 ad\u0131 (\u00f6rne\u011fin, <code>ubuntu<\/code> veya <code>your_username<\/code>).<br \/>\n        *   <code>SSH_HOST<\/code>: Ubuntu sunucusunun IP adresi veya alan ad\u0131 (\u00f6rne\u011fin, <code>192.168.1.100<\/code> veya <code>example.com<\/code>).<\/p>\n<p>Bu ad\u0131mlarla CircleCI, SSH anahtar\u0131n\u0131 ve sunucu ba\u011flant\u0131 bilgilerini kullanarak sunucunuza g\u00fcvenli bir \u015fekilde eri\u015febilecektir.<\/p>\n<h3>CircleCI Yap\u0131land\u0131rma Dosyas\u0131 (<code>config.yml<\/code>) Detaylar\u0131<\/h3>\n<p>\u015eimdi, da\u011f\u0131t\u0131m s\u00fcrecini otomatikle\u015ftirecek olan <code>.circleci\/config.yml<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m veya d\u00fczenleyelim. Bu dosya, CircleCI&#8217;a projenizi nas\u0131l derlemesi, test etmesi ve da\u011f\u0131tmas\u0131 gerekti\u011fini anlat\u0131r.<\/p>\n<p>Projenizin k\u00f6k dizininde <code>.circleci\/config.yml<\/code> ad\u0131nda bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-yaml\"># CircleCI yap\u0131land\u0131rma dosyas\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir.\nversion: 2.1\n\n<h2>Orbs, CircleCI'da tekrarlayan yap\u0131land\u0131rma kodlar\u0131n\u0131 paketlemek i\u00e7in kullan\u0131l\u0131r.<\/h2>\n<h2>Bu \u00f6rnekte kullanmasak da, bilmek \u00f6nemlidir.<\/h2>\n<h2>orbs:<\/h2>\n<h2>node: circleci\/node@4.1.0<\/h2>\n\n<h2>\u0130\u015f tan\u0131mlar\u0131<\/h2>\njobs:\n  build:\n    # Bu i\u015fin \u00e7al\u0131\u015faca\u011f\u0131 ortam\u0131 tan\u0131mlar.\n    # Docker imaj\u0131 olarak Ubuntu tabanl\u0131 bir Node.js ortam\u0131 kullan\u0131yoruz.\n    docker:\n      - image: cimg\/node:14.17.0 # Node.js 14 LTS s\u00fcr\u00fcm\u00fc\n    \n    # \u00c7al\u0131\u015fma dizini\n    working_directory: ~\/repo\n\n    # Ad\u0131mlar\n    steps:\n      - checkout # GitHub deposundaki kodu \u00e7al\u0131\u015fma dizinine klonlar.\n\n      - restore_cache: # Ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00f6nbellekten geri y\u00fcklemeye \u00e7al\u0131\u015f\u0131r.\n          keys:\n            - v1-dependencies-{{ checksum \"package.json\" }}\n            - v1-dependencies-\n\n      - run: npm install # package.json'daki ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckler.\n\n      - save_cache: # Y\u00fcklenen ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00f6nbelle\u011fe kaydeder.\n          paths:\n            - node_modules\n          key: v1-dependencies-{{ checksum \"package.json\" }}\n\n      - run: npm test # Testleri \u00e7al\u0131\u015ft\u0131r\u0131r. (\u00d6rnek uygulamam\u0131zda basit bir test var)\n\n  deploy:\n    docker:\n      - image: cimg\/base:stable # Da\u011f\u0131t\u0131m i\u00e7in temel bir Linux imaj\u0131 kullan\u0131yoruz.\n    \n    working_directory: ~\/repo\n\n    steps:\n      - checkout # GitHub deposundaki kodu \u00e7al\u0131\u015fma dizinine klonlar.\n\n      - add_ssh_keys: # CircleCI'da ekledi\u011fimiz SSH anahtar\u0131n\u0131 \u00e7al\u0131\u015fma ortam\u0131na ekler.\n          # Hostname de\u011feri, CircleCI'daki SSH anahtar\u0131 ayarlarken girdi\u011fimiz Hostname ile e\u015fle\u015fmeli.\n          # Bu genellikle sunucunun IP adresi veya alan ad\u0131d\u0131r.\n          # Bu ad\u0131m, anahtar\u0131n SSH agent'a eklenmesini sa\u011flar.\n          fingerprints:\n            - \"xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx\" # Kendi SSH anahtar\u0131n\u0131z\u0131n fingerprint'ini buraya ekleyin.\n                                                              # Bunu CircleCI proje ayarlar\u0131nda \"SSH Keys\" b\u00f6l\u00fcm\u00fcnden bulabilirsiniz.\n\n      - run:\n          name: Da\u011f\u0131t\u0131m Yap\n          command: |\n            # SSH ile sunucuya ba\u011flan ve komutlar\u0131 \u00e7al\u0131\u015ft\u0131r.\n            # Ortam de\u011fi\u015fkenleri SSH_USER ve SSH_HOST kullan\u0131l\u0131r.\n            ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=\/dev\/null $SSH_USER@$SSH_HOST << EOF\n              # Sunucudaki uygulama dizinine git.\n              cd \/var\/www\/my-node-app\n\n              # E\u011fer Git deposu daha \u00f6nce klonlanmad\u0131ysa, klonla.\n              if [ ! -d .git ]; then\n                git clone https:\/\/github.com\/KULLANICI_ADINIZ\/circleci-deploy-demo.git .\n              fi\n\n              # En son kodu \u00e7ek.\n              git pull origin main\n\n              # Ba\u011f\u0131ml\u0131l\u0131klar\u0131 yeniden y\u00fckle (e\u011fer de\u011fi\u015ftiyse).\n              npm install --production\n\n              # PM2 ile uygulamay\u0131 yeniden ba\u015flat veya ba\u015flat.\n              # E\u011fer uygulama daha \u00f6nce ba\u015flat\u0131lmad\u0131ysa, 'pm2 start' ile ba\u015flat.\n              # E\u011fer zaten \u00e7al\u0131\u015f\u0131yorsa, 'pm2 restart' ile yeniden ba\u015flat.\n              pm2 describe my-node-app > \/dev\/null\n              RUNNING=$?\n\n              if [ \"$RUNNING\" -ne 0 ]; then\n                pm2 start app.js --name my-node-app\n              else\n                pm2 restart my-node-app\n              fi\n\n              # PM2'nin sistem ba\u015flang\u0131c\u0131nda ba\u015flamas\u0131n\u0131 sa\u011fla (bir kerelik kurulum).\n              pm2 startup systemd\n              pm2 save\n            EOF\n\n<h2>\u0130\u015f ak\u0131\u015flar\u0131 (Workflows)<\/h2>\n<h2>Birden fazla i\u015fi belirli bir s\u0131rada veya ko\u015fullara g\u00f6re \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<\/h2>\nworkflows:\n  build_and_deploy:\n    jobs:\n      - build # \u00d6nce 'build' i\u015fini \u00e7al\u0131\u015ft\u0131r.\n      - deploy: # 'build' i\u015fi ba\u015far\u0131yla tamamland\u0131ktan sonra 'deploy' i\u015fini \u00e7al\u0131\u015ft\u0131r.\n          requires:\n            - build\n          filters: # Sadece 'main' dal\u0131na yap\u0131lan push'larda da\u011f\u0131t\u0131m yap.\n            branches:\n              only: main<\/code><\/pre>\n<h4><code>config.yml<\/code> A\u00e7\u0131klamas\u0131:<\/h4>\n<p>*   <strong><code>version: 2.1<\/code><\/strong>: CircleCI yap\u0131land\u0131rma dosyas\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir. En son \u00f6zellikler i\u00e7in 2.1 kullan\u0131lmas\u0131 \u00f6nerilir.<br \/>\n*   <strong><code>jobs<\/code><\/strong>: Yap\u0131lacak i\u015fleri tan\u0131mlar. Burada iki ana i\u015fimiz var: <code>build<\/code> ve <code>deploy<\/code>.<br \/>\n    *   <strong><code>build<\/code> i\u015fi<\/strong>:<br \/>\n        *   <code>docker<\/code>: Bu i\u015fin \u00e7al\u0131\u015faca\u011f\u0131 Docker imaj\u0131n\u0131 belirtir. <code>cimg\/node:14.17.0<\/code> imaj\u0131, Node.js ve npm&#8217;i kurulu olarak gelir.<br \/>\n        *   <code>working_directory<\/code>: \u0130\u015fin \u00e7al\u0131\u015faca\u011f\u0131 dizini ayarlar.<br \/>\n        *   <code>steps<\/code>: \u0130\u015fin ad\u0131mlar\u0131n\u0131 tan\u0131mlar.<br \/>\n            *   <code>checkout<\/code>: GitHub deposundaki kodu CircleCI \u00e7al\u0131\u015fma ortam\u0131na klonlar.<br \/>\n            *   <code>restore_cache<\/code>: Daha \u00f6nce kaydedilmi\u015f npm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 \u00f6nbellekten geri y\u00fcklemeye \u00e7al\u0131\u015f\u0131r. Bu, <code>npm install<\/code> s\u00fcresini k\u0131salt\u0131r.<br \/>\n            *   <code>run: npm install<\/code>: Projenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckler.<br \/>\n            *   <code>save_cache<\/code>: Y\u00fcklenen ba\u011f\u0131ml\u0131l\u0131klar\u0131 bir sonraki \u00e7al\u0131\u015ft\u0131rmalar i\u00e7in \u00f6nbelle\u011fe kaydeder.<br \/>\n            *   <code>run: npm test<\/code>: Projenin testlerini \u00e7al\u0131\u015ft\u0131r\u0131r. E\u011fer testler ba\u015far\u0131s\u0131z olursa, pipeline durur.<br \/>\n    *   <strong><code>deploy<\/code> i\u015fi<\/strong>:<br \/>\n        *   <code>docker<\/code>: Da\u011f\u0131t\u0131m i\u00e7in temel bir Linux imaj\u0131 (<code>cimg\/base:stable<\/code>) yeterlidir, \u00e7\u00fcnk\u00fc Node.js sunucuda kurulu olacak.<br \/>\n        *   <code>working_directory<\/code>: Ayn\u0131 \u015fekilde <code>~\/repo<\/code> olarak ayarlan\u0131r.<br \/>\n        *   <code>steps<\/code>:<br \/>\n            *   <code>checkout<\/code>: Da\u011f\u0131t\u0131m i\u015fi de projenin koduna ihtiya\u00e7 duydu\u011fundan tekrar klonlar.<br \/>\n            *   <code>add_ssh_keys<\/code>: CircleCI aray\u00fcz\u00fcnden ekledi\u011fimiz SSH \u00f6zel anahtar\u0131n\u0131 \u00e7al\u0131\u015fma ortam\u0131na ekler. <code>fingerprints<\/code> alan\u0131na kendi SSH anahtar\u0131n\u0131z\u0131n parmak izini eklemeyi unutmay\u0131n. Bu, CircleCI&#8217;\u0131n sunucunuza ba\u011flanmas\u0131na izin verir.<br \/>\n            *   <code>run: name: Da\u011f\u0131t\u0131m Yap<\/code>: Bu ad\u0131m, as\u0131l da\u011f\u0131t\u0131m mant\u0131\u011f\u0131n\u0131 i\u00e7erir.<br \/>\n                *   <code>ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=\/dev\/null $SSH_USER@$SSH_HOST<\/code>: SSH ile uzaktaki sunucuya ba\u011flan\u0131r. <code>$SSH_USER<\/code> ve <code>$SSH_HOST<\/code> daha \u00f6nce CircleCI&#8217;da tan\u0131mlad\u0131\u011f\u0131m\u0131z ortam de\u011fi\u015fkenleridir. <code>-o StrictHostKeyChecking=no -o UserKnownHostsFile=\/dev\/null<\/code> se\u00e7enekleri, SSH ba\u011flant\u0131s\u0131 s\u0131ras\u0131nda anahtar kontrol\u00fc istemini atlamak i\u00e7indir; bu, otomatik s\u00fcre\u00e7lerde yayg\u0131n bir kullan\u0131md\u0131r ancak dikkatli olunmal\u0131d\u0131r.<br \/>\n                *   <code><< EOF ... EOF<\/code>: SSH ba\u011flant\u0131s\u0131 \u00fczerinden uzaktaki sunucuda \u00e7al\u0131\u015ft\u0131r\u0131lacak komutlar\u0131 i\u00e7erir.<br \/>\n                    *   <code>cd \/var\/www\/my-node-app<\/code>: Uygulama dizinine ge\u00e7i\u015f yapar.<br \/>\n                    *   <code>if [ ! -d .git ]; then ... fi<\/code>: E\u011fer dizinde bir Git deposu yoksa (ilk da\u011f\u0131t\u0131m), depoyu klonlar.<br \/>\n                    *   <code>git pull origin main<\/code>: Depodaki en son kodu \u00e7eker.<br \/>\n                    *   <code>npm install --production<\/code>: \u00dcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 yeniden y\u00fckler.<br \/>\n                    *   <code>pm2 describe my-node-app > \/dev\/null; RUNNING=$?<\/code>: PM2 ile uygulaman\u0131n \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n                    *   <code>if [ \"$RUNNING\" -ne 0 ]; then ... else ... fi<\/code>: Uygulama \u00e7al\u0131\u015fm\u0131yorsa ba\u015flat\u0131r, \u00e7al\u0131\u015f\u0131yorsa yeniden ba\u015flat\u0131r.<br \/>\n                    *   <code>pm2 startup systemd<\/code> ve <code>pm2 save<\/code>: PM2'nin sunucu yeniden ba\u015flad\u0131\u011f\u0131nda uygulamay\u0131 otomatik olarak ba\u015flatmas\u0131n\u0131 sa\u011flar (sadece bir kerelik kurulum i\u00e7in).<br \/>\n*   <strong><code>workflows<\/code><\/strong>: \u0130\u015f ak\u0131\u015flar\u0131n\u0131 tan\u0131mlar.<br \/>\n    *   <code>build_and_deploy<\/code>: Bu i\u015f ak\u0131\u015f\u0131, <code>build<\/code> ve <code>deploy<\/code> i\u015flerini s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n        *   <code>jobs<\/code>: \u0130\u015f ak\u0131\u015f\u0131na dahil edilecek i\u015fleri listeler.<br \/>\n            *   <code>- build<\/code>: \u00d6nce <code>build<\/code> i\u015fini \u00e7al\u0131\u015ft\u0131r.<br \/>\n            *   <code>- deploy<\/code>: <code>build<\/code> i\u015fi ba\u015far\u0131yla tamamland\u0131ktan sonra <code>deploy<\/code> i\u015fini \u00e7al\u0131\u015ft\u0131r (<code>requires: - build<\/code>).<br \/>\n            *   <code>filters: branches: only: main<\/code>: Da\u011f\u0131t\u0131m i\u015fini sadece <code>main<\/code> (veya <code>master<\/code>) dal\u0131na yap\u0131lan commit'lerde \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, geli\u015ftirme dallar\u0131na yap\u0131lan commit'lerin otomatik olarak canl\u0131ya da\u011f\u0131t\u0131lmas\u0131n\u0131 engeller.<\/p>\n<p>Bu <code>config.yml<\/code> dosyas\u0131n\u0131 projenizin <code>.circleci\/<\/code> dizinine kaydedin ve GitHub'a g\u00f6nderin:<\/p>\n<pre><code class=\"language-bash\">git add .circleci\/config.yml\ngit commit -m \"Add CircleCI config for build and deploy\"\ngit push origin main<\/code><\/pre>\n<p>Bu push i\u015fleminden sonra CircleCI otomatik olarak bir pipeline ba\u015flatacak ve ad\u0131mlar\u0131 takip edecektir.<\/p>\n<h3>Uygulaman\u0131n Da\u011f\u0131t\u0131lmas\u0131 ve \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131<\/h3>\n<p><code>config.yml<\/code> dosyas\u0131n\u0131 GitHub'a g\u00f6nderdi\u011finizde, CircleCI pipeline'\u0131 tetiklenecek ve <code>build<\/code> ile <code>deploy<\/code> i\u015flerini s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<p>1.  <strong>CircleCI Kontrol Panelini \u0130zleyin:<\/strong> CircleCI kontrol panelinde projenizin pipeline'\u0131n\u0131 izleyin. <code>build<\/code> ve <code>deploy<\/code> i\u015flerinin ba\u015far\u0131yla tamamland\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz. Herhangi bir ad\u0131mda bir hata olu\u015fursa, loglar\u0131 inceleyerek sorunu tespit edebilirsiniz.<br \/>\n2.  <strong>Uygulamay\u0131 Kontrol Edin:<\/strong> Da\u011f\u0131t\u0131m ba\u015far\u0131l\u0131 olduktan sonra, taray\u0131c\u0131n\u0131zdan Ubuntu sunucunuzun IP adresini ve uygulaman\u0131z\u0131n portunu (\u00f6rne\u011fin, <code>http:\/\/SUNUCU_IP_ADRESINIZ:3000<\/code>) ziyaret ederek uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. \"Merhaba D\u00fcnya! Bu CircleCI ile da\u011f\u0131t\u0131lan bir Node.js uygulamas\u0131d\u0131r.\" mesaj\u0131n\u0131 g\u00f6rmelisiniz.<br \/>\n3.  <strong>PM2 Durumunu Kontrol Edin:<\/strong> Sunucunuza SSH ile ba\u011flanarak PM2'nin uygulaman\u0131z\u0131 y\u00f6netip y\u00f6netmedi\u011fini kontrol edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ssh KULLANICI_ADINIZ@SUNUCU_IP_ADRESINIZ\n    pm2 list<\/code><\/pre>\n<p>    <code>my-node-app<\/code> uygulamas\u0131n\u0131n <code>online<\/code> durumda oldu\u011funu g\u00f6rmelisiniz.<\/p>\n<h4>Nginx ile Reverse Proxy Yap\u0131land\u0131rmas\u0131 (\u00d6nerilir)<\/h4>\n<p>Do\u011frudan port 3000 \u00fczerinden eri\u015fim yerine, Nginx gibi bir reverse proxy kullanarak uygulamay\u0131 standart HTTP\/HTTPS portlar\u0131 (80\/443) \u00fczerinden yay\u0131nlamak daha iyi bir uygulamad\u0131r. Bu ayr\u0131ca SSL\/TLS sertifikalar\u0131 eklemenize de olanak tan\u0131r.<\/p>\n<p>1.  <strong>Nginx Kurulumu:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt install nginx -y\n    sudo ufw allow 'Nginx HTTP' # E\u011fer HTTPS kullanacaksan\u0131z 'Nginx HTTPS' de ekleyin<\/code><\/pre>\n<p>2.  <strong>Nginx Yap\u0131land\u0131rmas\u0131:<\/strong><br \/>\n    Yeni bir Nginx yap\u0131land\u0131rma dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/my-node-app<\/code><\/pre>\n<p>    \u0130\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi d\u00fczenleyin (alan ad\u0131n\u0131z\u0131 veya IP adresinizi kullan\u0131n):<\/p>\n<pre><code class=\"language-nginx\">server {\n        listen 80;\n        listen [::]:80;\n\n        server_name SUNUCU_IP_ADRESINIZ; # Veya alan ad\u0131n\u0131z (\u00f6rne\u011fin, example.com)\n\n        location \/ {\n            proxy_pass http:\/\/localhost:3000; # Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n            proxy_http_version 1.1;\n            proxy_set_header Upgrade $http_upgrade;\n            proxy_set_header Connection 'upgrade';\n            proxy_set_header Host $host;\n            proxy_cache_bypass $http_upgrade;\n        }\n    }<\/code><\/pre>\n<p>3.  <strong>Yap\u0131land\u0131rmay\u0131 Etkinle\u015ftirme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my-node-app \/etc\/nginx\/sites-enabled\/\n    sudo nginx -t # Yap\u0131land\u0131rma dosyas\u0131n\u0131 test et\n    sudo systemctl restart nginx<\/code><\/pre>\n<p>    Art\u0131k uygulaman\u0131za do\u011frudan sunucunuzun IP adresi \u00fczerinden (port belirtmeden) eri\u015febilirsiniz.<\/p>\n<h3>Test ve \u0130zleme<\/h3>\n<p>CI\/CD pipeline'\u0131n\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 s\u00fcrekli olarak izlemek, sorunlar\u0131 erken tespit etmek ve \u00e7\u00f6z\u00fcmlemek i\u00e7in kritiktir.<\/p>\n<p>*   <strong>Otomatik Testler:<\/strong> <code>npm test<\/code> gibi otomatik testler, kod de\u011fi\u015fikliklerinin mevcut i\u015flevselli\u011fi bozup bozmad\u0131\u011f\u0131n\u0131 kontrol etmenin ilk ad\u0131m\u0131d\u0131r. <code>config.yml<\/code> dosyan\u0131zda daha kapsaml\u0131 testler (birim testleri, entegrasyon testleri) eklemek, da\u011f\u0131t\u0131m \u00f6ncesi g\u00fcvenli\u011fi art\u0131racakt\u0131r.<br \/>\n*   <strong>CircleCI Aray\u00fcz\u00fc:<\/strong> CircleCI kontrol paneli, her bir pipeline'\u0131n durumunu, her bir ad\u0131m\u0131n ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc ve varsa hata mesajlar\u0131n\u0131 g\u00f6sterir. Ba\u015far\u0131s\u0131z bir pipeline durumunda, hatan\u0131n hangi ad\u0131mda meydana geldi\u011fini ve nedenini anlamak i\u00e7in loglar\u0131 dikkatlice inceleyin.<br \/>\n*   <strong>Sunucu Loglar\u0131:<\/strong> Uygulama veya sunucu taraf\u0131nda bir sorun oldu\u011funda, Ubuntu sunucusundaki loglar\u0131 kontrol edin.<br \/>\n    *   Uygulama loglar\u0131 i\u00e7in PM2: <code>pm2 logs my-node-app<\/code><br \/>\n    *   Nginx loglar\u0131: <code>\/var\/log\/nginx\/access.log<\/code> ve <code>\/var\/log\/nginx\/error.log<\/code><br \/>\n    *   Sistem loglar\u0131: <code>journalctl -u nginx<\/code> veya <code>journalctl -u pm2-KULLANICI_ADINIZ<\/code><\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Bu rehber, temel bir otomatik da\u011f\u0131t\u0131m pipeline'\u0131 kurmay\u0131 ele alsa da, ger\u00e7ek d\u00fcnya senaryolar\u0131nda dikkate al\u0131nmas\u0131 gereken daha geli\u015fmi\u015f konular vard\u0131r.<\/p>\n<p>*   <strong>Ortamlar Aras\u0131 Da\u011f\u0131t\u0131m (Dev, Staging, Prod):<\/strong> Genellikle, bir uygulamay\u0131 do\u011frudan \u00fcretim ortam\u0131na da\u011f\u0131tmadan \u00f6nce geli\u015ftirme (dev) ve haz\u0131rl\u0131k (staging) ortamlar\u0131nda test etmek istenir. Bunu CircleCI'da farkl\u0131 <code>workflow<\/code>'lar ve <code>filters<\/code> kullanarak veya farkl\u0131 ortam de\u011fi\u015fkenleri ile farkl\u0131 da\u011f\u0131t\u0131m hedeflerini hedefleyerek yapabilirsiniz. \u00d6rne\u011fin, <code>dev<\/code> dal\u0131na yap\u0131lan push'lar dev ortam\u0131na, <code>main<\/code> dal\u0131na yap\u0131lan ve etiketlenmi\u015f (tagged) commit'ler staging'e, manuel onay sonras\u0131 ise prod'a da\u011f\u0131t\u0131labilir.<br \/>\n*   <strong>Docker Kullan\u0131m\u0131:<\/strong> Uygulaman\u0131z\u0131 Docker konteynerleri i\u00e7inde \u00e7al\u0131\u015ft\u0131rmak, ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131 ortadan kald\u0131r\u0131r ve ortamlar aras\u0131 tutarl\u0131l\u0131\u011f\u0131 sa\u011flar. CircleCI, Docker imajlar\u0131n\u0131 olu\u015fturma ve konteynerleri da\u011f\u0131tma konusunda g\u00fc\u00e7l\u00fc destek sunar. Bu durumda, sunucunuzda Docker ve Docker Compose kurulu olmal\u0131, CircleCI ise imaj\u0131 olu\u015fturup Docker Hub gibi bir kay\u0131t defterine g\u00f6ndermeli, ard\u0131ndan sunucuda bu imaj\u0131 \u00e7ekip \u00e7al\u0131\u015ft\u0131rmal\u0131d\u0131r.<br \/>\n*   <strong>Rollback Stratejileri:<\/strong> Da\u011f\u0131t\u0131m sonras\u0131 ciddi bir sorun ya\u015fand\u0131\u011f\u0131nda, h\u0131zl\u0131 bir \u015fekilde \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme geri d\u00f6nebilmek (rollback) hayati \u00f6nem ta\u015f\u0131r. PM2, uygulamalar\u0131n farkl\u0131 s\u00fcr\u00fcmlerini y\u00f6netme yetene\u011fine sahiptir, ancak daha geli\u015fmi\u015f rollback stratejileri i\u00e7in da\u011f\u0131t\u0131m ara\u00e7lar\u0131 (\u00f6rne\u011fin, Capistrano) veya konteyner orkestrasyon sistemleri (Kubernetes) kullan\u0131labilir.<br \/>\n*   <strong>Bildirimler:<\/strong> Da\u011f\u0131t\u0131m pipeline'\u0131n\u0131n durumu hakk\u0131nda an\u0131nda bildirimler almak (ba\u015far\u0131l\u0131\/ba\u015far\u0131s\u0131z) \u00f6nemlidir. CircleCI, Slack, e-posta veya di\u011fer entegrasyonlar arac\u0131l\u0131\u011f\u0131yla bildirim g\u00f6nderme yetene\u011fine sahiptir.<br \/>\n*   <strong>G\u00fcvenlik \u0130pu\u00e7lar\u0131:<\/strong><br \/>\n    *   CircleCI ortam de\u011fi\u015fkenlerini hassas bilgiler i\u00e7in kullan\u0131n.<br \/>\n    *   SSH anahtarlar\u0131n\u0131z\u0131 sadece gerekli izinlerle s\u0131n\u0131rlay\u0131n.<br \/>\n    *   Sunucunuzda g\u00fcvenlik duvar\u0131n\u0131 (UFW) do\u011fru yap\u0131land\u0131r\u0131n.<br \/>\n    *   Sunucunuzdaki i\u015fletim sistemini ve yaz\u0131l\u0131mlar\u0131 d\u00fczenli olarak g\u00fcncelleyin.<br \/>\n    *   Minimum ayr\u0131cal\u0131k prensibini uygulay\u0131n; CircleCI'\u0131n sunucuda sadece ihtiyac\u0131 olan i\u015flemleri yapmas\u0131na izin verin.<br \/>\n    *   <code>StrictHostKeyChecking=no<\/code> kullan\u0131m\u0131ndan ka\u00e7\u0131nmak i\u00e7in <code>ssh-keyscan<\/code> ile <code>known_hosts<\/code> dosyas\u0131n\u0131 yap\u0131land\u0131rabilirsiniz, ancak bu otomatik da\u011f\u0131t\u0131mda ek karma\u015f\u0131kl\u0131k getirebilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, CircleCI ve GitHub kullanarak bir Node.js uygulamas\u0131n\u0131 Ubuntu 18.04 sunucusu \u00fczerine otomatik olarak nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. CI\/CD pipeline'\u0131 kurmak, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinizi \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r, hatalar\u0131 azalt\u0131r ve ekiplerin daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>S\u00fcrekli Entegrasyon ve S\u00fcrekli Da\u011f\u0131t\u0131m, modern DevOps pratiklerinin temelidir. CircleCI'\u0131n esnek yap\u0131land\u0131rma yetenekleri ve GitHub'\u0131n g\u00fc\u00e7l\u00fc s\u00fcr\u00fcm kontrol\u00fc ile birle\u015fti\u011finde, h\u0131zl\u0131 ve g\u00fcvenilir da\u011f\u0131t\u0131mlar ger\u00e7ekle\u015ftirmek art\u0131k \u00e7ok daha kolayd\u0131r. Ubuntu gibi kararl\u0131 bir sunucu i\u015fletim sistemi ise, uygulamalar\u0131n\u0131z i\u00e7in sa\u011flam bir temel sunar.<\/p>\n<p>Kurdu\u011funuz bu temel pipeline, ba\u015flang\u0131\u00e7 i\u00e7in harika bir ad\u0131md\u0131r. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve gereksinimleriniz de\u011fi\u015ftik\u00e7e, Docker, \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131, geli\u015fmi\u015f test stratejileri ve daha kapsaml\u0131 izleme ara\u00e7lar\u0131 gibi daha geli\u015fmi\u015f konular\u0131 entegre ederek pipeline'\u0131n\u0131z\u0131 s\u00fcrekli iyile\u015ftirebilirsiniz. Unutmay\u0131n, CI\/CD bir s\u00fcre\u00e7tir ve s\u00fcrekli \u00f6\u011frenme ve adaptasyon gerektirir. Bu rehberdeki prensipleri di\u011fer programlama dilleri ve \u00e7er\u00e7eveleri i\u00e7in de kolayca uyarlayabilirsiniz. Ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131mlar dileriz!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, g\u00fcve","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":[1468],"tags":[],"class_list":{"0":"post-34735","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme - 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\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme\" \/>\n<meta property=\"og:description\" content=\"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme Giri\u015f G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, g\u00fcve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-21T07:40:50+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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme\",\"datePublished\":\"2025-11-21T07:40:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\"},\"wordCount\":2912,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\",\"name\":\"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-21T07:40:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme\"}]},{\"@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":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme - 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\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/","og_locale":"tr_TR","og_type":"article","og_title":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme","og_description":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme Giri\u015f G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, g\u00fcve","og_url":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-21T07:40:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme","datePublished":"2025-11-21T07:40:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/"},"wordCount":2912,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/","url":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/","name":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-21T07:40:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-dagitimi-circleci-ve-github-ile-ubuntu-18-04-uzerinde-gerceklestirme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Otomatik Da\u011f\u0131t\u0131m\u0131 CircleCI ve GitHub ile Ubuntu 18.04 \u00dczerinde Ger\u00e7ekle\u015ftirme"}]},{"@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\/34735","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=34735"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34735\/revisions"}],"predecessor-version":[{"id":34736,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34735\/revisions\/34736"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}