{"id":38676,"date":"2026-02-05T12:30:43","date_gmt":"2026-02-05T09:30:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/"},"modified":"2026-02-05T12:30:43","modified_gmt":"2026-02-05T09:30:43","slug":"node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/","title":{"rendered":"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma"},"content":{"rendered":"<h2>Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z, g\u00fcvenilirlik ve tekrarlanabilirlik, ekiplerin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Teslimat (CD) pratikleri, bu hedeflere ula\u015fman\u0131n temel ta\u015flar\u0131d\u0131r. Bu makalede, Node.js tabanl\u0131 bir uygulamay\u0131 Docker ile kaps\u00fclleyerek, GitHub Actions kullanarak otomatik test, derleme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini nas\u0131l otomatikle\u015ftirece\u011finizi ve son olarak AWS EC2 sunucular\u0131na nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu rehber, geli\u015ftirme d\u00f6ng\u00fcn\u00fcz\u00fc h\u0131zland\u0131r\u0131rken hata oran\u0131n\u0131 d\u00fc\u015f\u00fcrmenize ve daha g\u00fcvenilir yaz\u0131l\u0131mlar sunman\u0131za yard\u0131mc\u0131 olacak pratik bir yol haritas\u0131 sunmaktad\u0131r.<\/p>\n<h3>CI\/CD Neden \u00d6nemli? Temel Kavramlar<\/h3>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan manuel hatalar\u0131, yava\u015f da\u011f\u0131t\u0131m d\u00f6ng\u00fclerini ve entegrasyon sorunlar\u0131n\u0131 ortadan kald\u0131rmak i\u00e7in CI\/CD (Continuous Integration\/Continuous Delivery) pratikleri hayati bir rol oynar. Bu b\u00f6l\u00fcm, CI\/CD&#8217;nin temelini ve sa\u011flad\u0131\u011f\u0131 faydalar\u0131 a\u00e7\u0131klamaktad\u0131r.<\/p>\n<h4>S\u00fcrekli Entegrasyon (CI) Nedir?<\/h4>\n<p>S\u00fcrekli Entegrasyon (CI), geli\u015ftiricilerin kodlar\u0131n\u0131 g\u00fcnde birka\u00e7 kez ana kod taban\u0131na entegre etmelerini gerektiren bir yaz\u0131l\u0131m geli\u015ftirme prati\u011fidir. Her entegrasyon, otomatik bir derleme ve test s\u00fcreci taraf\u0131ndan do\u011frulan\u0131r. Bu, entegrasyon hatalar\u0131n\u0131n erken tespit edilmesini sa\u011flar, b\u00f6ylece sorunlar b\u00fcy\u00fcmeden \u00e7\u00f6z\u00fclebilir ve geli\u015ftirme ekibinin verimlili\u011fi artar.<\/p>\n<h4>S\u00fcrekli Teslimat (CD) Nedir?<\/h4>\n<p>S\u00fcrekli Teslimat (CD), CI&#8217;nin bir uzant\u0131s\u0131d\u0131r. CI a\u015famas\u0131ndan ba\u015far\u0131yla ge\u00e7en kod de\u011fi\u015fikliklerinin, her an \u00fcretime haz\u0131r bir \u015fekilde depolanmas\u0131n\u0131 ve manuel bir tetikleyici ile da\u011f\u0131t\u0131ma haz\u0131r hale getirilmesini sa\u011flar. Bu, yaz\u0131l\u0131m\u0131n daha s\u0131k ve daha g\u00fcvenilir bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131na olanak tan\u0131r, b\u00f6ylece yeni \u00f6zellikler ve hata d\u00fczeltmeleri kullan\u0131c\u0131lara daha h\u0131zl\u0131 ula\u015f\u0131r.<\/p>\n<h4>Geleneksel Yakla\u015f\u0131mlar\u0131n Zorluklar\u0131<\/h4>\n<p>Geleneksel geli\u015ftirme yakla\u015f\u0131mlar\u0131nda, kod entegrasyonu ve da\u011f\u0131t\u0131m\u0131 genellikle uzun aral\u0131klarla ve manuel olarak yap\u0131l\u0131r. Bu durum, b\u00fcy\u00fck entegrasyon \u00e7at\u0131\u015fmalar\u0131na, ge\u00e7 ke\u015ffedilen hatalara ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde ya\u015fanan insan kaynakl\u0131 aksakl\u0131klara yol a\u00e7abilir. Ayr\u0131ca, manuel s\u00fcre\u00e7ler zaman al\u0131c\u0131d\u0131r ve tekrarlanabilirlik sorunlar\u0131 yarat\u0131r.<\/p>\n<h4>CI\/CD&#8217;nin \u0130\u015fletmeye Faydalar\u0131<\/h4>\n<p>CI\/CD, i\u015fletmelere bir dizi \u00f6nemli fayda sunar:<\/p>\n<ul>\n<li><strong>H\u0131z:<\/strong> Yeni \u00f6zellikler ve d\u00fczeltmeler daha h\u0131zl\u0131 bir \u015fekilde kullan\u0131c\u0131lara sunulur.<\/li>\n<li><strong>G\u00fcvenilirlik:<\/strong> Otomatik testler sayesinde hatalar erken yakalan\u0131r, \u00fcretim ortam\u0131ndaki sorunlar azal\u0131r.<\/li>\n<li><strong>Daha Az Risk:<\/strong> K\u00fc\u00e7\u00fck, s\u0131k yap\u0131lan de\u011fi\u015fiklikler, b\u00fcy\u00fck ve riskli da\u011f\u0131t\u0131mlar\u0131n \u00f6n\u00fcne ge\u00e7er.<\/li>\n<li><strong>Geli\u015ftirici Verimlili\u011fi:<\/strong> Geli\u015ftiriciler, manuel da\u011f\u0131t\u0131m i\u015fleriyle u\u011fra\u015fmak yerine kod yazmaya odaklanabilirler.<\/li>\n<li><strong>Maliyet Tasarrufu:<\/strong> Hata d\u00fczeltme maliyetleri azal\u0131r ve operasyonel verimlilik artar.<\/li>\n<\/ul>\n<h3>Proje Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131: Node.js ve Docker<\/h3>\n<p>CI\/CD hatt\u0131m\u0131z\u0131n ilk ad\u0131m\u0131, uygulamam\u0131z\u0131 standartla\u015ft\u0131r\u0131lm\u0131\u015f ve ta\u015f\u0131nabilir bir formatta haz\u0131rlamakt\u0131r. Docker, bu konuda bize b\u00fcy\u00fck kolayl\u0131klar sa\u011flar. Bu b\u00f6l\u00fcmde, basit bir Node.js uygulamas\u0131n\u0131 Docker ile nas\u0131l kaps\u00fclleyece\u011fimizi \u00f6\u011frenece\u011fiz.<\/p>\n<h4>Node.js Uygulamas\u0131 Olu\u015fturma (Basit Bir \u00d6rnek)<\/h4>\n<p>\u00d6ncelikle, basit bir Node.js uygulamas\u0131 olu\u015ftural\u0131m. Proje dizininizde <code>app.js<\/code> ad\u0131nda bir dosya ve <code>package.json<\/code> dosyas\u0131 bulunsun.<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\nconst express = require('express');\nconst app = express();\nconst port = 3000;\n\napp.get('\/', (req, res) => {\n  res.send('Merhaba D\u00fcnya! Node.js Uygulamas\u0131 \u00c7al\u0131\u015f\u0131yor!');\n});\n\napp.listen(port, () => {\n  console.log(<code>Uygulama http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-json\">\/\/ package.json\n{\n  \"name\": \"my-nodejs-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple Node.js app for CI\/CD demo\",\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}\n<\/pre>\n<p><\/code><\/p>\n<p><code>npm install<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin.<\/p>\n<h4>Dockerfile ile Uygulamay\u0131 Kaps\u00fclleme<\/h4>\n<p>Uygulamam\u0131z\u0131 Docker ile kaps\u00fcllemek i\u00e7in bir <code>Dockerfile<\/code> olu\u015ftural\u0131m. Bu dosya, Docker'\u0131n uygulamam\u0131z\u0131 nas\u0131l derleyece\u011fini ve \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131 tan\u0131mlar.<\/p>\n<pre><code class=\"language-dockerfile\"># Dockerfile\n# Resmi Node.js imaj\u0131n\u0131 temel al\nFROM node:18-alpine\n\n# \u00c7al\u0131\u015fma dizinini ayarla\nWORKDIR \/app\n\n# package.json ve package-lock.json dosyalar\u0131n\u0131 kopyala\n# Ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00f6nbelle\u011fe almak i\u00e7in bu ad\u0131m\u0131 ayr\u0131 tutmak \u00f6nemlidir\nCOPY package*.json .\/\n\n# Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\nRUN npm install\n\n# Uygulama kaynak kodunu kopyala\nCOPY . .\n\n# Uygulaman\u0131n dinleyece\u011fi portu a\u00e7\nEXPOSE 3000\n\n# Uygulamay\u0131 ba\u015flat\nCMD [\"npm\", \"start\"]\n<\/pre>\n<p><\/code><\/p>\n<h4>.dockerignore Dosyas\u0131<\/h4>\n<p><code>.dockerignore<\/code> dosyas\u0131, Docker imaj\u0131na dahil edilmemesi gereken dosyalar\u0131 ve dizinleri belirtir. Bu, imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve gereksiz dosyalar\u0131n kopyalanmas\u0131n\u0131 engeller.<\/p>\n<pre><code class=\"language-text\"># .dockerignore\nnode_modules\nnpm-debug.log\n.git\n.gitignore\nDockerfile\nREADME.md\n<\/pre>\n<p><\/code><\/p>\n<h4>Yerel Ortamda Docker \u0130le \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Uygulamay\u0131 yerel olarak test etmek i\u00e7in Docker imaj\u0131n\u0131 derleyip \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker build -t my-nodejs-app .\ndocker run -p 3000:3000 my-nodejs-app\n<\/pre>\n<p><\/code><\/p>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine giderek uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<h3>GitHub Actions ile S\u00fcrekli Entegrasyon (CI)<\/h3>\n<p>GitHub Actions, kod depolar\u0131n\u0131zda do\u011frudan CI\/CD i\u015f ak\u0131\u015flar\u0131 olu\u015fturman\u0131za, test etmenize ve da\u011f\u0131tman\u0131za olanak tan\u0131yan g\u00fc\u00e7l\u00fc bir otomasyon platformudur. Bu b\u00f6l\u00fcmde, bir Node.js uygulamas\u0131n\u0131n testlerini \u00e7al\u0131\u015ft\u0131ran ve Docker imaj\u0131n\u0131 olu\u015fturan bir CI i\u015f ak\u0131\u015f\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h4>GitHub Actions'a Giri\u015f<\/h4>\n<p>GitHub Actions, deponuzdaki belirli olaylara (\u00f6rne\u011fin, <code>push<\/code>, <code>pull request<\/code>) yan\u0131t olarak tetiklenen \u00f6zelle\u015ftirilebilir i\u015f ak\u0131\u015flar\u0131 (workflows) tan\u0131mlaman\u0131za olanak tan\u0131r. Bu i\u015f ak\u0131\u015flar\u0131, sanal makinelerde (runner'lar) \u00e7al\u0131\u015ft\u0131r\u0131lan bir veya daha fazla i\u015f (job) i\u00e7erir. Her i\u015f, bir dizi ad\u0131mdan (step) olu\u015fur.<\/p>\n<h4>Workflow Dosyas\u0131 Yap\u0131s\u0131 (.github\/workflows)<\/h4>\n<p>GitHub Actions i\u015f ak\u0131\u015flar\u0131, deponuzun k\u00f6k dizinindeki <code>.github\/workflows\/<\/code> klas\u00f6r\u00fcnde YAML dosyalar\u0131 olarak tan\u0131mlan\u0131r. \u00d6rne\u011fin, <code>ci.yml<\/code> ad\u0131nda bir dosya olu\u015fturabiliriz.<\/p>\n<h4>CI Workflow Olu\u015fturma: Test ve Docker Image Olu\u015fturma<\/h4>\n<p>A\u015fa\u011f\u0131daki <code>ci.yml<\/code> dosyas\u0131, her <code>push<\/code> olay\u0131nda tetiklenecek bir CI i\u015f ak\u0131\u015f\u0131 tan\u0131mlar. Bu i\u015f ak\u0131\u015f\u0131, Node.js ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar, testleri \u00e7al\u0131\u015ft\u0131r\u0131r ve Docker imaj\u0131n\u0131 olu\u015fturur.<\/p>\n<pre><code class=\"language-yaml\"># .github\/workflows\/ci.yml\nname: Node.js CI with Docker\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\njobs:\n  build-and-test:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Depoyu \u00c7ek\n      uses: actions\/checkout@v3\n\n    - name: Node.js Kurulumu\n      uses: actions\/setup-node@v3\n      with:\n        node-version: '18'\n\n    - name: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckle\n      run: npm ci\n\n    - name: Testleri \u00c7al\u0131\u015ft\u0131r\n      run: npm test\n\n    - name: Docker \u0130maj\u0131n\u0131 Olu\u015ftur\n      run: docker build -t my-nodejs-app .\n\n    - name: Docker \u0130maj\u0131n\u0131 Etiketle ve GitHub Container Registry'ye Giri\u015f Yap\n      uses: docker\/login-action@v2\n      with:\n        registry: ghcr.io\n        username: ${{ github.actor }}\n        password: ${{ secrets.GITHUB_TOKEN }}\n\n    - name: \u0130maj\u0131 Etiketle\n      run: |\n        IMAGE_ID=ghcr.io\/${{ github.repository_owner }}\/my-nodejs-app\n        VERSION=$(echo \"${{ github.sha }}\" | cut -c 1-7)\n        docker tag my-nodejs-app:latest $IMAGE_ID:$VERSION\n        docker tag my-nodejs-app:latest $IMAGE_ID:latest\n\n    - name: \u0130maj\u0131 GitHub Container Registry'ye G\u00f6nder\n      run: |\n        IMAGE_ID=ghcr.io\/${{ github.repository_owner }}\/my-nodejs-app\n        VERSION=$(echo \"${{ github.sha }}\" | cut -c 1-7)\n        docker push $IMAGE_ID:$VERSION\n        docker push $IMAGE_ID:latest\n<\/pre>\n<p><\/code><\/p>\n<h4>Docker Image'\u0131 GitHub Container Registry'ye (GHCR) G\u00f6nderme<\/h4>\n<p>Yukar\u0131daki i\u015f ak\u0131\u015f\u0131, Docker imaj\u0131n\u0131 olu\u015fturduktan sonra <code>ghcr.io<\/code> adresindeki GitHub Container Registry'ye (GHCR) g\u00f6nderir. Bu, da\u011f\u0131t\u0131m a\u015famas\u0131nda sunucular\u0131m\u0131z\u0131n bu imaja kolayca eri\u015fmesini sa\u011flar. <code>GITHUB_TOKEN<\/code>, GitHub Actions taraf\u0131ndan otomatik olarak sa\u011flanan bir secret't\u0131r ve depoya yazma izinlerine sahiptir.<\/p>\n<h3>AWS EC2 \u00dczerinde Da\u011f\u0131t\u0131m Ortam\u0131 Kurulumu<\/h3>\n<p>Uygulamam\u0131z\u0131 da\u011f\u0131taca\u011f\u0131m\u0131z hedef ortam olarak AWS EC2 kullanaca\u011f\u0131z. Bu b\u00f6l\u00fcmde, bir EC2 instance'\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve Docker ile da\u011f\u0131t\u0131ma haz\u0131r hale getirece\u011finizi anlataca\u011f\u0131z.<\/p>\n<h4>EC2 Instance Olu\u015fturma ve Yap\u0131land\u0131rma<\/h4>\n<ol>\n<li><strong>AWS Y\u00f6netim Konsolu'na Giri\u015f:<\/strong> AWS hesab\u0131n\u0131za giri\u015f yap\u0131n.<\/li>\n<li><strong>EC2 Servisine Git:<\/strong> EC2 hizmetini se\u00e7in.<\/li>\n<li><strong>Instance Ba\u015flat:<\/strong> \"Launch instances\" butonuna t\u0131klay\u0131n.<\/li>\n<li><strong>AMI Se\u00e7imi:<\/strong> Ubuntu Server 20.04 LTS (HVM), SSD Volume Type gibi g\u00fcncel bir AMI se\u00e7in.<\/li>\n<li><strong>Instance Tipi Se\u00e7imi:<\/strong> T2.micro (\u00fccretsiz katman i\u00e7in uygun) veya ihtiyac\u0131n\u0131za g\u00f6re ba\u015fka bir tip se\u00e7in.<\/li>\n<li><strong>A\u011f Ayarlar\u0131:<\/strong> Varsay\u0131lan VPC ve alt a\u011f\u0131 kullanabilir veya kendi \u00f6zel a\u011f\u0131n\u0131z\u0131 yap\u0131land\u0131rabilirsiniz.<\/li>\n<li><strong>Depolama:<\/strong> Varsay\u0131lan depolama ayarlar\u0131n\u0131 b\u0131rakabilirsiniz.<\/li>\n<li><strong>G\u00fcvenlik Grubu Ayarlar\u0131:<\/strong> Yeni bir g\u00fcvenlik grubu olu\u015fturun veya mevcut birini se\u00e7in. SSH (Port 22) eri\u015fimine izin verdi\u011finizden emin olun. Uygulaman\u0131z\u0131n \u00e7al\u0131\u015faca\u011f\u0131 portu (\u00f6rne\u011fin, 3000) de HTTP\/HTTPS kural\u0131 olarak ekleyin.<\/li>\n<li><strong>Anahtar \u00c7ifti Olu\u015fturma:<\/strong> Yeni bir anahtar \u00e7ifti (key pair) olu\u015fturun ve <code>.pem<\/code> dosyas\u0131n\u0131 g\u00fcvenli bir yere indirin. Bu dosya, EC2 instance'\u0131na SSH ile ba\u011flanmak i\u00e7in kullan\u0131lacakt\u0131r.<\/li>\n<li><strong>Instance'\u0131 Ba\u015flat:<\/strong> Instance'\u0131 ba\u015flat\u0131n ve durumunun \"running\" olmas\u0131n\u0131 bekleyin.<\/li>\n<\/ol>\n<h4>G\u00fcvenlik Grubu Ayarlar\u0131 (SSH ve Uygulama Portu)<\/h4>\n<p>EC2 instance'\u0131n\u0131z\u0131n g\u00fcvenlik grubunu, SSH (Port 22) ve uygulaman\u0131z\u0131n dinleyece\u011fi port (\u00f6rne\u011fin, 3000) i\u00e7in gelen trafi\u011fe izin verecek \u015fekilde yap\u0131land\u0131rmal\u0131s\u0131n\u0131z. Genellikle SSH i\u00e7in kendi IP adresinizi veya \u015firket IP'nizi, uygulama portu i\u00e7in ise t\u00fcm interneti (0.0.0.0\/0) veya belirli bir IP aral\u0131\u011f\u0131n\u0131 hedefleyebilirsiniz.<\/p>\n<h4>Docker ve Docker Compose Kurulumu<\/h4>\n<p>EC2 instance'\u0131n\u0131za SSH ile ba\u011fland\u0131ktan sonra (<code>ssh -i \/path\/to\/your-key.pem ubuntu@your-ec2-public-ip<\/code>), Docker ve Docker Compose'u kurun:<\/p>\n<pre><code class=\"language-bash\"># Docker Kurulumu\nsudo apt update\nsudo apt install apt-transport-https ca-certificates curl software-properties-common -y\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg\necho \"deb [arch=$(dpkg --print-architecture) signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null\nsudo apt update\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Mevcut kullan\u0131c\u0131y\u0131 docker grubuna ekle (yeniden oturum a\u00e7may\u0131 gerektirebilir)\nsudo usermod -aG docker $USER\n\n# Docker Compose Kurulumu\nsudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/v2.2.3\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose\nsudo chmod +x \/usr\/local\/bin\/docker-compose\n\n# Docker ve Docker Compose versiyonlar\u0131n\u0131 kontrol et\ndocker --version\ndocker-compose --version\n<\/pre>\n<p><\/code><\/p>\n<h4>SSH Anahtarlar\u0131 ve G\u00fcvenli Eri\u015fim<\/h4>\n<p>GitHub Actions'\u0131n EC2 sunucunuza SSH ile ba\u011flanabilmesi i\u00e7in, GitHub Secrets'a \u00f6zel bir SSH anahtar\u0131 eklemeniz gerekecek. EC2 instance'\u0131 olu\u015ftururken indirdi\u011finiz <code>.pem<\/code> dosyas\u0131n\u0131 kullanmay\u0131n. Bunun yerine, yeni bir SSH anahtar \u00e7ifti olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096 -C \"github-actions-deploy-key\" -f ~\/.ssh\/github_actions_deploy_key -N \"\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, <code>github_actions_deploy_key<\/code> (\u00f6zel anahtar) ve <code>github_actions_deploy_key.pub<\/code> (genel anahtar) dosyalar\u0131n\u0131 olu\u015fturacakt\u0131r.<\/p>\n<ol>\n<li><strong>Genel Anahtar\u0131 EC2'ye Ekle:<\/strong> <code>github_actions_deploy_key.pub<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini EC2 sunucunuzdaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyin.<\/li>\n<li><strong>\u00d6zel Anahtar\u0131 GitHub Secrets'a Ekle:<\/strong> <code>github_actions_deploy_key<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini kopyalay\u0131n. GitHub deponuzda \"Settings\" -> \"Secrets\" -> \"Actions\" b\u00f6l\u00fcm\u00fcne gidin ve \"New repository secret\" butonuna t\u0131klayarak yeni bir secret olu\u015fturun. Ad\u0131n\u0131 <code>SSH_PRIVATE_KEY<\/code> olarak belirleyin ve kopyalad\u0131\u011f\u0131n\u0131z \u00f6zel anahtar\u0131 de\u011fer olarak yap\u0131\u015ft\u0131r\u0131n.<\/li>\n<\/ol>\n<h3>GitHub Actions ile S\u00fcrekli Teslimat (CD)<\/h3>\n<p>\u015eimdi, CI a\u015famas\u0131nda olu\u015fturdu\u011fumuz Docker imaj\u0131n\u0131 AWS EC2 sunucumuza da\u011f\u0131tmak i\u00e7in bir CD i\u015f ak\u0131\u015f\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h4>Da\u011f\u0131t\u0131m Stratejileri (Basit Bir Yakla\u015f\u0131m)<\/h4>\n<p>Bu makalede, en basit da\u011f\u0131t\u0131m stratejilerinden birini kullanaca\u011f\u0131z: mevcut uygulaman\u0131n durdurulmas\u0131, yeni Docker imaj\u0131n\u0131n \u00e7ekilmesi ve uygulaman\u0131n yeniden ba\u015flat\u0131lmas\u0131. Daha karma\u015f\u0131k senaryolar i\u00e7in Blue\/Green, Canary da\u011f\u0131t\u0131m\u0131 gibi stratejiler de mevcuttur.<\/p>\n<h4>GitHub Actions CD Workflow'u Olu\u015fturma<\/h4>\n<p><code>.github\/workflows\/cd.yml<\/code> ad\u0131nda yeni bir dosya olu\u015ftural\u0131m. Bu i\u015f ak\u0131\u015f\u0131, <code>main<\/code> branch'ine yap\u0131lan her ba\u015far\u0131l\u0131 <code>push<\/code> i\u015fleminden sonra tetiklenecektir.<\/p>\n<pre><code class=\"language-yaml\"># .github\/workflows\/cd.yml\nname: Node.js CD to EC2\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build-and-test # CI i\u015f ak\u0131\u015f\u0131n\u0131n ba\u015far\u0131l\u0131 olmas\u0131n\u0131 bekler\n\n    steps:\n    - name: Depoyu \u00c7ek\n      uses: actions\/checkout@v3\n\n    - name: SSH Anahtar\u0131n\u0131 Kur\n      uses: webfactory\/ssh-agent@v0.7.0\n      with:\n        ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}\n\n    - name: Da\u011f\u0131t\u0131m Sunucusuna Ba\u011flan ve Uygulamay\u0131 Da\u011f\u0131t\n      env:\n        EC2_HOST: ${{ secrets.EC2_HOST }} # EC2 genel IP adresi veya DNS ad\u0131\n        EC2_USER: ubuntu # EC2 instance'\u0131n\u0131z\u0131n kullan\u0131c\u0131 ad\u0131 (\u00f6rne\u011fin, ubuntu, ec2-user)\n        GHCR_USERNAME: ${{ github.actor }}\n        GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        IMAGE_NAME: ghcr.io\/${{ github.repository_owner }}\/my-nodejs-app:latest\n      run: |\n        ssh -o StrictHostKeyChecking=no ${EC2_USER}@${EC2_HOST} << 'EOF'\n          # Docker'a GitHub Container Registry ile giri\u015f yap\n          echo ${GHCR_TOKEN} | docker login ghcr.io -u ${GHCR_USERNAME} --password-stdin\n\n          # Mevcut uygulamay\u0131 durdur ve kald\u0131r\n          docker stop my-nodejs-app || true\n          docker rm my-nodejs-app || true\n\n          # Yeni Docker imaj\u0131n\u0131 \u00e7ek\n          docker pull ${IMAGE_NAME}\n\n          # Yeni imaj\u0131 kullanarak uygulamay\u0131 \u00e7al\u0131\u015ft\u0131r\n          docker run -d --name my-nodejs-app -p 3000:3000 ${IMAGE_NAME}\n\n          # Docker'dan \u00e7\u0131k\u0131\u015f yap\n          docker logout ghcr.io\n        EOF\n<\/pre>\n<p><\/code><\/p>\n<p>Bu i\u015f ak\u0131\u015f\u0131nda kullanaca\u011f\u0131m\u0131z GitHub Secrets:<\/p>\n<ul>\n<li><code>SSH_PRIVATE_KEY<\/code>: EC2'ye ba\u011flanmak i\u00e7in olu\u015fturdu\u011funuz \u00f6zel SSH anahtar\u0131.<\/li>\n<li><code>EC2_HOST<\/code>: EC2 instance'\u0131n\u0131z\u0131n genel IP adresi veya DNS ad\u0131.<\/li>\n<\/ul>\n<p>Bu s\u0131rlar\u0131 GitHub deponuzun \"Settings\" -> \"Secrets\" -> \"Actions\" b\u00f6l\u00fcm\u00fcne eklemeyi unutmay\u0131n.<\/p>\n<h4>EC2 Sunucusuna SSH \u00dczerinden Ba\u011flanma<\/h4>\n<p>Yukar\u0131daki CD i\u015f ak\u0131\u015f\u0131, <code>webfactory\/ssh-agent@v0.7.0<\/code> action'\u0131n\u0131 kullanarak SSH anahtar\u0131n\u0131 kurar ve ard\u0131ndan <code>ssh<\/code> komutu ile EC2 sunucusuna ba\u011flan\u0131r. <code>StrictHostKeyChecking=no<\/code>, ilk ba\u011flant\u0131da host anahtar\u0131 do\u011frulamas\u0131n\u0131 atlamak i\u00e7in kullan\u0131l\u0131r, ancak \u00fcretim ortamlar\u0131nda bu genellikle daha g\u00fcvenli bir \u015fekilde y\u00f6netilmelidir.<\/p>\n<h4>Yeni Docker Image'\u0131 \u00c7ekme ve Uygulamay\u0131 Yeniden Ba\u015flatma<\/h4>\n<p>SSH ba\u011flant\u0131s\u0131 kurulduktan sonra, sunucu \u00fczerinde bir dizi komut \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r:<\/p>\n<ol>\n<li>GitHub Container Registry'ye (GHCR) giri\u015f yap\u0131l\u0131r.<\/li>\n<li>Mevcut <code>my-nodejs-app<\/code> konteyneri durdurulur ve kald\u0131r\u0131l\u0131r.<\/li>\n<li>GHCR'den en son Docker imaj\u0131 \u00e7ekilir.<\/li>\n<li>Yeni imaj kullan\u0131larak uygulama tekrar \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r ve 3000 numaral\u0131 port d\u0131\u015far\u0131ya a\u00e7\u0131l\u0131r.<\/li>\n<li>GHCR'den \u00e7\u0131k\u0131\u015f yap\u0131l\u0131r.<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar, uygulaman\u0131z\u0131n kesintisiz olmasa da h\u0131zl\u0131 bir \u015fekilde g\u00fcncellenmesini sa\u011flar.<\/p>\n<h3>G\u00fcvenlik ve \u0130yile\u015ftirmeler<\/h3>\n<p>Bir CI\/CD hatt\u0131 kurarken g\u00fcvenlik ve performans iyile\u015ftirmeleri her zaman g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<\/p>\n<h4>Ortam De\u011fi\u015fkenleri ve GitHub Secrets<\/h4>\n<p>Hassas bilgileri (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri, SSH \u00f6zel anahtarlar\u0131) do\u011frudan kodda veya a\u00e7\u0131k metin olarak saklamaktan ka\u00e7\u0131n\u0131n. GitHub Secrets, bu t\u00fcr bilgileri g\u00fcvenli bir \u015fekilde saklaman\u0131za ve i\u015f ak\u0131\u015flar\u0131n\u0131zda kullanman\u0131za olanak tan\u0131r. AWS IAM rolleri ve politikalar\u0131 da EC2 instance'lar\u0131n\u0131z\u0131n AWS hizmetlerine g\u00fcvenli bir \u015fekilde eri\u015fmesini sa\u011flamak i\u00e7in kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h4>G\u00fcvenlik Grubu En \u0130yi Uygulamalar\u0131<\/h4>\n<p>EC2 g\u00fcvenlik gruplar\u0131n\u0131z\u0131 m\u00fcmk\u00fcn oldu\u011funca k\u0131s\u0131tl\u0131 tutun. SSH (Port 22) eri\u015fimini sadece belirli IP adresleriyle s\u0131n\u0131rlay\u0131n. Uygulaman\u0131z\u0131n portunu (\u00f6rne\u011fin, 3000) sadece uygulaman\u0131z\u0131n eri\u015filebilir olmas\u0131 gereken IP adreslerine veya a\u011flara a\u00e7\u0131n. Herkese a\u00e7\u0131k eri\u015fim (0.0.0.0\/0) sadece ger\u00e7ekten gerekliyse kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h4>Otomatik Testlerin \u00d6nemi<\/h4>\n<p>CI\/CD hatt\u0131n\u0131n temel amac\u0131, hatalar\u0131 erken yakalamakt\u0131r. Birim testleri, entegrasyon testleri ve u\u00e7tan uca (end-to-end) testler gibi kapsaml\u0131 otomatik testler yazmak, da\u011f\u0131t\u0131m \u00f6ncesinde uygulaman\u0131z\u0131n kalitesini garanti alt\u0131na alman\u0131n en iyi yoludur. GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131zda bu testlerin \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun.<\/p>\n<h4>Rollback Stratejileri<\/h4>\n<p>Her da\u011f\u0131t\u0131m\u0131n ba\u015far\u0131l\u0131 olaca\u011f\u0131 garanti edilemez. Bir sorun durumunda h\u0131zl\u0131 bir \u015fekilde \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme geri d\u00f6nebilmek (rollback) hayati \u00f6neme sahiptir. Docker imajlar\u0131n\u0131 versiyonlamak (\u00f6rne\u011fin, <code>ghcr.io\/user\/app:commit_sha<\/code> gibi) ve \u00f6nceki bir versiyonu h\u0131zl\u0131ca da\u011f\u0131tabilecek bir mekanizma kurmak, bu t\u00fcr durumlar i\u00e7in haz\u0131rl\u0131kl\u0131 olman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Node.js uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 kullanarak sa\u011flam bir CI\/CD hatt\u0131 olu\u015fturman\u0131n temel ad\u0131mlar\u0131n\u0131 inceledik. Uygulaman\u0131z\u0131 Docker ile kaps\u00fclleyerek ta\u015f\u0131nabilirli\u011fini sa\u011flad\u0131k, GitHub Actions ile otomatik test ve imaj olu\u015fturma s\u00fcre\u00e7lerini kurduk ve son olarak AWS EC2 \u00fczerine otomatik da\u011f\u0131t\u0131m\u0131 ger\u00e7ekle\u015ftirdik. Bu entegre yakla\u015f\u0131m, geli\u015ftirme s\u00fcre\u00e7lerinizi h\u0131zland\u0131racak, hatalar\u0131 azaltacak ve yaz\u0131l\u0131m teslimatlar\u0131n\u0131z\u0131 daha g\u00fcvenilir hale getirecektir. Gelecekte bu hatt\u0131 daha da geli\u015ftirmek i\u00e7in izleme (monitoring), loglama (logging) ve daha geli\u015fmi\u015f da\u011f\u0131t\u0131m stratejileri (\u00f6rne\u011fin, AWS ECS\/EKS, Blue\/Green da\u011f\u0131t\u0131mlar) gibi konular\u0131 ara\u015ft\u0131rabilirsiniz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. GitHub Container Registry (GHCR) yerine ba\u015fka bir Docker kay\u0131t defteri kullanabilir miyim?<\/h4>\n<p>Evet, kesinlikle. AWS ECR (Elastic Container Registry), Docker Hub veya kendi \u00f6zel kay\u0131t defterinizi kullanabilirsiniz. GitHub Actions'\u0131n Docker login ad\u0131mlar\u0131n\u0131 ve imaj etiketleme\/g\u00f6nderme komutlar\u0131n\u0131 ilgili kay\u0131t defterinizin gereksinimlerine g\u00f6re ayarlaman\u0131z yeterlidir.<\/p>\n<h4>2. EC2 yerine AWS Fargate veya Lambda gibi sunucusuz hizmetler kullanabilir miyim?<\/h4>\n<p>Evet, sunucusuz hizmetler CI\/CD i\u00e7in harika alternatiflerdir. AWS Fargate, Docker konteynerlerinizi sunucu y\u00f6netimi derdi olmadan \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. AWS Lambda ise daha \u00e7ok olay tabanl\u0131, k\u0131sa s\u00fcreli i\u015f y\u00fckleri i\u00e7in uygundur. Da\u011f\u0131t\u0131m stratejileri bu platformlara g\u00f6re farkl\u0131l\u0131k g\u00f6sterecektir, ancak temel CI (test, derleme, imaj olu\u015fturma) ad\u0131mlar\u0131 benzer kal\u0131r.<\/p>\n<h4>3. Da\u011f\u0131t\u0131m s\u0131ras\u0131nda kesinti ya\u015fanmamas\u0131 i\u00e7in ne yapmal\u0131y\u0131m?<\/h4>\n<p>Bu makaledeki basit da\u011f\u0131t\u0131m stratejisi k\u0131sa bir kesintiye neden olabilir. Kesintisiz da\u011f\u0131t\u0131m i\u00e7in Blue\/Green da\u011f\u0131t\u0131m, Canary da\u011f\u0131t\u0131m\u0131 veya Rolling Update gibi daha geli\u015fmi\u015f stratejiler kullanmal\u0131s\u0131n\u0131z. Bu stratejiler genellikle bir y\u00fck dengeleyici (Load Balancer) ve birden fazla sunucu (veya konteyner) gerektirir. AWS Elastic Load Balancer (ELB) ve Auto Scaling Groups, bu t\u00fcr senaryolar i\u00e7in idealdir.<\/p>\n<h4>4. GitHub Actions'ta ortam de\u011fi\u015fkenlerini nas\u0131l y\u00f6netmeliyim?<\/h4>\n<p>Hassas olmayan ortam de\u011fi\u015fkenlerini do\u011frudan workflow dosyan\u0131zda <code>env<\/code> blo\u011fu alt\u0131nda tan\u0131mlayabilirsiniz. Hassas bilgiler (API anahtarlar\u0131, \u015fifreler) i\u00e7in GitHub Secrets kullanmal\u0131s\u0131n\u0131z. Ayr\u0131ca, farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in farkl\u0131 secret'lar veya ortam de\u011fi\u015fkenleri tan\u0131mlayarak y\u00f6netimi kolayla\u015ft\u0131rabilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan manuel hatalar\u0131, yava\u015f da\u011f\u0131t\u0131m d\u00f6ng\u00fclerini ve entegrasyon sorunlar\u0131n\u0131 ortadan kald\u0131rm&#8230;","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":[1407],"tags":[],"class_list":{"0":"post-38676","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-docker","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>Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma - 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\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan manuel hatalar\u0131, yava\u015f da\u011f\u0131t\u0131m d\u00f6ng\u00fclerini ve entegrasyon sorunlar\u0131n\u0131 ortadan kald\u0131rm...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-05T09:30:43+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=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma\",\"datePublished\":\"2026-02-05T09:30:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\"},\"wordCount\":2478,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Docker\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\",\"name\":\"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-05T09:30:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma\"}]},{\"@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":"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma - 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\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma","og_description":"Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan manuel hatalar\u0131, yava\u015f da\u011f\u0131t\u0131m d\u00f6ng\u00fclerini ve entegrasyon sorunlar\u0131n\u0131 ortadan kald\u0131rm...","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-05T09:30:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma","datePublished":"2026-02-05T09:30:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/"},"wordCount":2478,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Docker"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/","name":"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-05T09:30:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamalari-icin-docker-github-actions-ve-aws-ec2-ile-gercek-dunya-ci-cd-hatti-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js Uygulamalar\u0131 i\u00e7in Docker, GitHub Actions ve AWS EC2 ile Ger\u00e7ek D\u00fcnya CI\/CD Hatt\u0131 Olu\u015fturma"}]},{"@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\/38676","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=38676"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38676\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}