{"id":38908,"date":"2026-02-10T13:00:40","date_gmt":"2026-02-10T10:00:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/"},"modified":"2026-02-10T13:00:40","modified_gmt":"2026-02-10T10:00:40","slug":"docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/","title":{"rendered":"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#8217;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi"},"content":{"rendered":"<h2>Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#8217;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z, g\u00fcvenilirlik ve otomasyon olmazsa olmazlardand\u0131r. Uygulamalar\u0131n\u0131z\u0131 konteynerize etmek ve bulut ortamlar\u0131na h\u0131zl\u0131ca da\u011f\u0131tmak, rekabet\u00e7i kalmak i\u00e7in kritik \u00f6neme sahiptir. Bu makalede, Docker konteynerlerinizi DigitalOcean Droplet&#8217;e GitHub Actions kullanarak nas\u0131l otomatik olarak da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, kodunuzu her push etti\u011finizde uygulaman\u0131z\u0131n canl\u0131ya al\u0131nmas\u0131n\u0131 sa\u011flayarak geli\u015ftirme s\u00fcre\u00e7lerinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131racak ve insan hatas\u0131n\u0131 minimize edeceksiniz.<\/p>\n<h3>1. Giri\u015f: Modern Da\u011f\u0131t\u0131m\u0131n \u00d6nemi ve Ara\u00e7lar<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda, uygulamalar\u0131n s\u00fcrekli entegrasyon (CI) ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) prensipleriyle y\u00f6netilmesi, geli\u015ftiricilere b\u00fcy\u00fck avantajlar sunar. Bu b\u00f6l\u00fcmde, bu prensiplerin temelini olu\u015fturan kavramlar\u0131 ve kullanaca\u011f\u0131m\u0131z ara\u00e7lar\u0131 tan\u0131yaca\u011f\u0131z.<\/p>\n<h4>1.1. CI\/CD Nedir ve Neden \u00d6nemlidir?<\/h4>\n<p>CI\/CD (Continuous Integration\/Continuous Delivery veya Continuous Deployment), yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerini otomatikle\u015ftirmeyi ama\u00e7layan bir dizi uygulamad\u0131r. S\u00fcrekli Entegrasyon (CI), geli\u015ftiricilerin kod de\u011fi\u015fikliklerini s\u0131k s\u0131k merkezi bir depoya birle\u015ftirmesini ve bu de\u011fi\u015fikliklerin otomatik olarak test edilmesini sa\u011flar. S\u00fcrekli Da\u011f\u0131t\u0131m (CD) ise, testlerden ge\u00e7en kodun otomatik olarak \u00fcretim ortam\u0131na da\u011f\u0131t\u0131lmas\u0131 s\u00fcrecidir. Bu yakla\u015f\u0131m, hata oran\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r ve ekiplerin daha verimli \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r.<\/p>\n<h4>1.2. Docker ve Konteynerle\u015fmenin Avantajlar\u0131<\/h4>\n<p>Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 &#8220;konteyner&#8221; ad\u0131 verilen izole edilmi\u015f birimler i\u00e7inde paketlemeye yarayan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Konteynerle\u015fme, uygulamalar\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. &#8220;Bir kere yaz, her yerde \u00e7al\u0131\u015ft\u0131r&#8221; felsefesiyle, ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131 ortadan kald\u0131r\u0131r, da\u011f\u0131t\u0131m\u0131 basitle\u015ftirir ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r.<\/p>\n<h4>1.3. GitHub Actions ve Otomasyon<\/h4>\n<p>GitHub Actions, GitHub depolar\u0131nda do\u011frudan entegre edilmi\u015f bir CI\/CD platformudur. Kod de\u011fi\u015fiklikleri, pull request&#8217;ler veya manuel tetikleyiciler gibi belirli olaylara yan\u0131t olarak otomatik i\u015f ak\u0131\u015flar\u0131 (workflows) olu\u015fturman\u0131za olanak tan\u0131r. Bu i\u015f ak\u0131\u015flar\u0131, kodunuzu derleyebilir, test edebilir, Docker imajlar\u0131 olu\u015fturabilir ve uygulamalar\u0131n\u0131z\u0131 sunuculara da\u011f\u0131tabilir. GitHub Actions&#8217;\u0131n esnekli\u011fi ve geni\u015f topluluk deste\u011fi, onu modern CI\/CD \u00e7\u00f6z\u00fcmleri i\u00e7in ideal bir se\u00e7enek haline getirir.<\/p>\n<h3>2. Gerekli \u00d6n Haz\u0131rl\u0131klar ve Ortam Kurulumu<\/h3>\n<p>Da\u011f\u0131t\u0131m s\u00fcrecine ba\u015flamadan \u00f6nce, hem DigitalOcean Droplet&#8217;inizde hem de GitHub deponuzda baz\u0131 temel ayarlamalar\u0131 yapmam\u0131z gerekiyor. Bu ad\u0131mlar, sorunsuz bir entegrasyon i\u00e7in zemin haz\u0131rlayacakt\u0131r.<\/p>\n<h4>2.1. DigitalOcean Droplet Olu\u015fturma ve Yap\u0131land\u0131rma<\/h4>\n<p>\u0130lk ad\u0131m, uygulaman\u0131z\u0131 bar\u0131nd\u0131racak bir DigitalOcean Droplet olu\u015fturmakt\u0131r.<\/p>\n<ol>\n<li>DigitalOcean hesab\u0131n\u0131za giri\u015f yap\u0131n.<\/li>\n<li>&#8220;Create&#8221; men\u00fcs\u00fcnden &#8220;Droplets&#8221; se\u00e7ene\u011fini t\u0131klay\u0131n.<\/li>\n<li>Bir Ubuntu i\u015fletim sistemi imaj\u0131 se\u00e7in (\u00f6rne\u011fin, Ubuntu 22.04 LTS).<\/li>\n<li>Uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na uygun bir plan se\u00e7in (CPU, RAM).<\/li>\n<li>SSH anahtar\u0131 ekleyin veya olu\u015fturun. Bu anahtar, GitHub Actions&#8217;\u0131n Droplet&#8217;inize g\u00fcvenli bir \u015fekilde ba\u011flanmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/li>\n<li>Bir b\u00f6lge se\u00e7in ve Droplet&#8217;inizi olu\u015fturun.<\/li>\n<\/ol>\n<p>Droplet olu\u015fturulduktan sonra, SSH ile ba\u011flanarak gerekli g\u00fcncellemeleri yap\u0131n:<\/p>\n<pre><code>ssh root@your_droplet_ip\nsudo apt update && sudo apt upgrade -y\n<\/pre>\n<p><\/code><\/p>\n<h4>2.2. Docker ve Docker Compose Kurulumu<\/h4>\n<p>Uygulaman\u0131z Docker konteynerleri i\u00e7inde \u00e7al\u0131\u015faca\u011f\u0131 i\u00e7in, Droplet'inize Docker ve Docker Compose'u kurman\u0131z gerekmektedir.<\/p>\n<pre><code># Docker kurulumu\nsudo apt install docker.io -y\nsudo systemctl start docker\nsudo systemctl enable docker\n\n# Kullan\u0131c\u0131y\u0131 docker grubuna ekleme (iste\u011fe ba\u011fl\u0131 ama pratik)\nsudo usermod -aG docker $USER\nnewgrp docker # veya SSH oturumunu yeniden ba\u015flat\u0131n\n\n# Docker Compose kurulumu (genellikle daha yeni versiyonlar i\u00e7in \u00f6nerilir)\nsudo apt install docker-compose -y\n# E\u011fer eski bir versiyon ise veya daha yeni versiyon isterseniz:\n# sudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/v2.24.5\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose\n# sudo chmod +x \/usr\/local\/bin\/docker-compose\n<\/pre>\n<p><\/code><br \/>\nKurulumu do\u011frulamak i\u00e7in:<\/p>\n<pre><code>docker --version\ndocker compose version\n<\/pre>\n<p><\/code><\/p>\n<h4>2.3. GitHub Repository ve Uygulama Haz\u0131rl\u0131\u011f\u0131<\/h4>\n<p>Uygulama kodunuzun bulundu\u011fu bir GitHub deposuna sahip olman\u0131z gerekmektedir. Deponuzda en az\u0131ndan bir <code>Dockerfile<\/code> ve bir <code>docker-compose.yml<\/code> dosyas\u0131 bulunmal\u0131d\u0131r.<\/p>\n<p>*   <strong>Dockerfile \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code># Dockerfile\nFROM node:18-alpine\nWORKDIR \/app\nCOPY package*.json .\/\nRUN npm install\nCOPY . .\nEXPOSE 3000\nCMD [\"npm\", \"start\"]\n    <\/pre>\n<p><\/code><\/p>\n<p>*   <strong>docker-compose.yml \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code># docker-compose.yml\nversion: '3.8'\nservices:\n  web:\n    build: .\n    ports:\n      - \"80:3000\"\n    restart: always\n    environment:\n      NODE_ENV: production\n    # \u0130ste\u011fe ba\u011fl\u0131 olarak, veritaban\u0131 gibi ba\u015fka servisler de eklenebilir\n    # db:\n    #   image: postgres:13\n    #   volumes:\n    #     - db_data:\/var\/lib\/postgresql\/data\n    #   environment:\n    #     POSTGRES_DB: myapp\n    #     POSTGRES_USER: user\n    #     POSTGRES_PASSWORD: password\n# volumes:\n#   db_data:\n    <\/pre>\n<p><\/code><br \/>\nBu dosyalar\u0131n deponuzun k\u00f6k dizininde oldu\u011fundan emin olun.<\/p>\n<h3>3. DigitalOcean Droplet'in G\u00fcvenli Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Droplet'iniz haz\u0131r oldu\u011funda, g\u00fcvenlik ve eri\u015fim ayarlar\u0131n\u0131 do\u011fru bir \u015fekilde yap\u0131land\u0131rmak \u00e7ok \u00f6nemlidir. Bu, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini sa\u011flarken, GitHub Actions'\u0131n sorunsuz bir \u015fekilde da\u011f\u0131t\u0131m yapmas\u0131na olanak tan\u0131r.<\/p>\n<h4>3.1. G\u00fcvenlik Duvar\u0131 Ayarlar\u0131 (UFW)<\/h4>\n<p>DigitalOcean'\u0131n kendi g\u00fcvenlik duvar\u0131 se\u00e7eneklerini kullanabilir veya Droplet i\u00e7inde UFW (Uncomplicated Firewall) yap\u0131land\u0131rabilirsiniz. UFW, sunucunuza gelen ve giden trafi\u011fi kontrol etmenizi sa\u011flar.<\/p>\n<pre><code># UFW'yi etkinle\u015ftirme\nsudo ufw enable\n\n# SSH ba\u011flant\u0131s\u0131na izin verme\nsudo ufw allow ssh\n\n# Web trafi\u011fine izin verme (HTTP ve HTTPS)\nsudo ufw allow http\nsudo ufw allow https\n\n# Docker'\u0131n kulland\u0131\u011f\u0131 portlara izin verme (docker-compose.yml'deki port e\u015fle\u015fmelerine g\u00f6re)\n# E\u011fer 80:3000 kullan\u0131yorsan\u0131z, 80'e izin vermelisiniz.\nsudo ufw allow 80\/tcp\n\n# G\u00fcvenlik duvar\u0131 durumunu kontrol etme\nsudo ufw status verbose\n<\/pre>\n<p><\/code><br \/>\nBu ad\u0131mlar, yaln\u0131zca gerekli portlar\u0131n d\u0131\u015far\u0131dan eri\u015filebilir olmas\u0131n\u0131 sa\u011flayarak sunucunuzun sald\u0131r\u0131 y\u00fczeyini azalt\u0131r.<\/p>\n<h4>3.2. Da\u011f\u0131t\u0131m \u0130\u00e7in Uygulama Dizini Olu\u015fturma<\/h4>\n<p>GitHub Actions, Droplet'inize ba\u011flan\u0131p kodunuzu belirli bir dizine kopyalayacakt\u0131r. Bu dizini \u00f6nceden olu\u015fturmak ve gerekli izinleri vermek iyi bir pratiktir.<\/p>\n<pre><code># Uygulama dizini olu\u015fturma\nsudo mkdir -p \/var\/www\/my-docker-app\nsudo chown -R $USER:$USER \/var\/www\/my-docker-app # Kendi kullan\u0131c\u0131n\u0131za yetki verin\n<\/pre>\n<p><\/code><br \/>\nBu dizin, uygulaman\u0131z\u0131n kodunu ve Docker dosyalar\u0131n\u0131 bar\u0131nd\u0131racak yer olacakt\u0131r. GitHub Actions, SSH \u00fczerinden bu dizine eri\u015ferek da\u011f\u0131t\u0131m i\u015flemlerini ger\u00e7ekle\u015ftirecektir.<\/p>\n<h3>4. GitHub Actions Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131<\/h3>\n<p>GitHub Actions'\u0131n Droplet'inize g\u00fcvenli bir \u015fekilde ba\u011flanabilmesi ve da\u011f\u0131t\u0131m i\u015flemlerini ger\u00e7ekle\u015ftirebilmesi i\u00e7in baz\u0131 gizli anahtarlar (secrets) tan\u0131mlamam\u0131z gerekiyor.<\/p>\n<h4>4.1. GitHub Secrets Tan\u0131mlama<\/h4>\n<p>GitHub Actions, hassas bilgileri (SSH anahtarlar\u0131, \u015fifreler vb.) do\u011frudan workflow dosyas\u0131na yazmak yerine, \"Secrets\" ad\u0131 verilen g\u00fcvenli bir mekanizma arac\u0131l\u0131\u011f\u0131yla y\u00f6netir.<\/p>\n<ol>\n<li>GitHub deponuza gidin.<\/li>\n<li>\"Settings\" sekmesine t\u0131klay\u0131n.<\/li>\n<li>Sol men\u00fcden \"Secrets and variables\" alt\u0131nda \"Actions\" se\u00e7ene\u011fini se\u00e7in.<\/li>\n<li>\"New repository secret\" butonuna t\u0131klayarak a\u015fa\u011f\u0131daki s\u0131rlar\u0131 ekleyin:<\/li>\n<\/ol>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Secret Ad\u0131<\/th>\n<th>De\u011fer<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>SSH_PRIVATE_KEY<\/code><\/td>\n<td>Droplet olu\u015ftururken kulland\u0131\u011f\u0131n\u0131z SSH \u00f6zel anahtar\u0131n\u0131z\u0131n i\u00e7eri\u011fi. (<code>~\/.ssh\/id_rsa<\/code> veya benzeri dosyan\u0131n i\u00e7eri\u011fi)<\/td>\n<td>GitHub Actions'\u0131n Droplet'e SSH ile ba\u011flanmas\u0131 i\u00e7in kullan\u0131l\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><code>DROPLET_IP<\/code><\/td>\n<td>DigitalOcean Droplet'inizin genel IP adresi.<\/td>\n<td>Hedef sunucunun IP adresini belirtir.<\/td>\n<\/tr>\n<tr>\n<td><code>SSH_USERNAME<\/code><\/td>\n<td>Droplet'e ba\u011flanmak i\u00e7in kullanaca\u011f\u0131n\u0131z kullan\u0131c\u0131 ad\u0131 (genellikle <code>root<\/code> veya olu\u015fturdu\u011funuz kullan\u0131c\u0131).<\/td>\n<td>SSH ba\u011flant\u0131s\u0131 i\u00e7in kullan\u0131c\u0131 ad\u0131.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>\u00d6nemli:<\/b> SSH \u00f6zel anahtar\u0131n\u0131z\u0131 kopyalarken, anahtar\u0131n tamam\u0131n\u0131 (<code>-----BEGIN OPENSSH PRIVATE KEY-----<\/code> ile ba\u015flay\u0131p <code>-----END OPENSSH PRIVATE KEY-----<\/code> ile biten k\u0131s\u0131m dahil) kopyalad\u0131\u011f\u0131n\u0131zdan emin olun.<\/p>\n<h4>4.2. Workflow Dosyas\u0131 Olu\u015fturma (.github\/workflows)<\/h4>\n<p>GitHub Actions i\u015f ak\u0131\u015flar\u0131, <code>.github\/workflows<\/code> dizini alt\u0131nda YAML dosyalar\u0131 olarak tan\u0131mlan\u0131r. Bu dizini deponuzun k\u00f6k dizininde olu\u015fturun.<\/p>\n<pre><code>.\n\u251c\u2500\u2500 .github\/\n\u2502   \u2514\u2500\u2500 workflows\/\n\u2502       \u2514\u2500\u2500 deploy.yml  # Bu dosyay\u0131 olu\u015fturaca\u011f\u0131z\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 docker-compose.yml\n\u251c\u2500\u2500 package.json\n\u2514\u2500\u2500 ...\n<\/pre>\n<p><\/code><br \/>\n<code>deploy.yml<\/code> ad\u0131nda bir dosya olu\u015fturup i\u00e7ine workflow tan\u0131m\u0131n\u0131 yazaca\u011f\u0131z.<\/p>\n<h3>5. GitHub Actions Workflow Dosyas\u0131n\u0131n Olu\u015fturulmas\u0131<\/h3>\n<p>\u015eimdi en kritik ad\u0131ma geldik: GitHub Actions workflow dosyas\u0131n\u0131 yazmak. Bu dosya, kodunuz her push edildi\u011finde otomatik olarak \u00e7al\u0131\u015facak ve uygulaman\u0131z\u0131 Droplet'e da\u011f\u0131tacakt\u0131r.<\/p>\n<h4>5.1. Workflow Yap\u0131s\u0131 ve Tetikleyiciler<\/h4>\n<p>Bir GitHub Actions workflow dosyas\u0131, tetikleyiciler (triggers), i\u015fler (jobs) ve ad\u0131mlar (steps) i\u00e7erir. A\u015fa\u011f\u0131daki \u00f6rnek, <code>main<\/code> branch'ine yap\u0131lan her push'ta \u00e7al\u0131\u015facak bir workflow tan\u0131mlar.<\/p>\n<pre><code># .github\/workflows\/deploy.yml\nname: Deploy Docker App to DigitalOcean\n\non:\n  push:\n    branches:\n      - main # main branch'ine yap\u0131lan push'larda \u00e7al\u0131\u015f\u0131r\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest # \u0130\u015fin \u00e7al\u0131\u015faca\u011f\u0131 i\u015fletim sistemi\n\n    steps:\n      - name: Checkout code\n        uses: actions\/checkout@v4 # Depodaki kodu \u00e7ek\n\n      - name: Set up SSH\n        uses: webfactory\/ssh-agent@v0.9.0\n        with:\n          ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} # GitHub Secret'tan SSH \u00f6zel anahtar\u0131n\u0131 kullan\n\n      - name: Deploy to DigitalOcean Droplet\n        env:\n          DROPLET_IP: ${{ secrets.DROPLET_IP }}\n          SSH_USERNAME: ${{ secrets.SSH_USERNAME }}\n        run: |\n          echo \"Connecting to Droplet at $DROPLET_IP...\"\n          # SSH \u00fczerinden Droplet'e ba\u011flan ve komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\n          ssh -o StrictHostKeyChecking=no $SSH_USERNAME@$DROPLET_IP \"\n            # Uygulama dizinine git\n            mkdir -p \/var\/www\/my-docker-app\n            cd \/var\/www\/my-docker-app\n\n            # Eski konteynerleri durdur ve kald\u0131r\n            docker compose down --remove-orphans || true\n            \n            # GitHub'dan yeni kodu \u00e7ek (e\u011fer git repo olarak kullan\u0131yorsan\u0131z)\n            # E\u011fer sadece dosyalar\u0131 kopyalayacaksan\u0131z bu ad\u0131m\u0131 atlay\u0131n\n            # git pull origin main || git clone https:\/\/github.com\/your-username\/your-repo.git .\n\n            # Mevcut dizini temizle ve yeni dosyalar\u0131 kopyala\n            # Bu k\u0131s\u0131m genellikle rsync ile yap\u0131l\u0131r, ancak bu \u00f6rnekte dosyalar\u0131 do\u011frudan aktarmak i\u00e7in\n            # GitHub Actions'\u0131n scp veya rsync aksiyonlar\u0131 kullan\u0131labilir.\n            # Basitlik ad\u0131na, burada manuel olarak kopyalama ad\u0131m\u0131 yerine, \n            # SSH \u00fczerinden do\u011frudan Docker Compose \u00e7al\u0131\u015ft\u0131rmay\u0131 hedefliyoruz.\n            # E\u011fer kodunuzu Droplet'e aktarman\u0131z gerekiyorsa, 'appleboy\/scp-action' gibi bir action kullanabilirsiniz.\n\n            # Bu \u00f6rnekte, kodu GitHub Actions'tan Droplet'e kopyalamak yerine,\n            # Docker imaj\u0131n\u0131 do\u011frudan Droplet \u00fczerinde build edece\u011fiz.\n            # Alternatif olarak, imaj\u0131 bir Docker Registry'ye (Docker Hub) push edip,\n            # Droplet'ten \u00e7ekmek daha \u00f6l\u00e7eklenebilir bir yakla\u015f\u0131md\u0131r.\n\n            # Docker Compose ile uygulamay\u0131 yeniden ba\u015flat\n            docker compose up -d --build\n            echo 'Deployment complete!'\n          \"\n<\/pre>\n<p><\/code><\/p>\n<h4>5.2. Kodun \u00c7ekilmesi ve Da\u011f\u0131t\u0131m Mant\u0131\u011f\u0131<\/h4>\n<p>Yukar\u0131daki <code>deploy.yml<\/code> dosyas\u0131nda, <code>webfactory\/ssh-agent@v0.9.0<\/code> aksiyonu ile SSH ba\u011flant\u0131s\u0131 kurulur. Ard\u0131ndan, <code>Deploy to DigitalOcean Droplet<\/code> ad\u0131m\u0131, SSH \u00fczerinden Droplet'e ba\u011flan\u0131r ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r:<\/p>\n<ol>\n<li><code>docker compose down --remove-orphans<\/code>: \u00c7al\u0131\u015fan konteynerleri durdurur ve eski imajlar\u0131 temizler. Bu, yeni da\u011f\u0131t\u0131m i\u00e7in temiz bir ortam sa\u011flar.<\/li>\n<li><code>docker compose up -d --build<\/code>: <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 kullanarak yeni Docker imajlar\u0131n\u0131 olu\u015fturur (<code>--build<\/code>) ve konteynerleri arka planda (<code>-d<\/code>) ba\u015flat\u0131r. Bu komut, deponuzdaki <code>Dockerfile<\/code> ve <code>docker-compose.yml<\/code> dosyalar\u0131n\u0131 kullan\u0131r.<\/li>\n<\/ol>\n<p><strong>Not:<\/strong> Bu \u00f6rnekte, uygulama kodunuzun GitHub Actions taraf\u0131ndan \u00e7ekilip do\u011frudan Droplet'e kopyalanmas\u0131 yerine, Droplet \u00fczerinde <code>docker compose up --build<\/code> komutu ile imaj\u0131n yeniden olu\u015fturuldu\u011fu varsay\u0131lm\u0131\u015ft\u0131r. Daha geli\u015fmi\u015f senaryolarda, Docker imaj\u0131n\u0131z\u0131 bir Docker Registry'ye (Docker Hub, GitHub Container Registry vb.) push edip, Droplet'ten bu imaj\u0131 \u00e7ekmek daha yayg\u0131n ve verimli bir yakla\u015f\u0131md\u0131r. Bu, <code>docker compose pull<\/code> komutunu kullanmay\u0131 gerektirir.<\/p>\n<h3>6. Da\u011f\u0131t\u0131m Stratejileri ve En \u0130yi Uygulamalar<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m yaparken, uygulaman\u0131z\u0131n kesintisiz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak ve olas\u0131 sorunlara kar\u015f\u0131 haz\u0131rl\u0131kl\u0131 olmak i\u00e7in baz\u0131 stratejileri ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h4>6.1. S\u0131f\u0131r Kesintiyle Da\u011f\u0131t\u0131m (Zero-Downtime Deployment)<\/h4>\n<p>Yukar\u0131daki <code>docker compose down<\/code> komutu, k\u0131sa bir kesintiye neden olabilir. S\u0131f\u0131r kesintiyle da\u011f\u0131t\u0131m i\u00e7in, yeni versiyonu eski versiyon \u00e7al\u0131\u015f\u0131rken ba\u015flat\u0131p, yeni versiyon haz\u0131r oldu\u011funda trafi\u011fi ona y\u00f6nlendiren stratejiler (mavi\/ye\u015fil da\u011f\u0131t\u0131m, rolling update) kullan\u0131labilir. Bu genellikle bir y\u00fck dengeleyici (load balancer) veya ters proxy (nginx, traefik) gerektirir. \u00d6rne\u011fin, Nginx'i ters proxy olarak kullan\u0131p, yeni konteyner aya\u011fa kalkt\u0131\u011f\u0131nda Nginx konfig\u00fcrasyonunu dinamik olarak g\u00fcncelleyebilirsiniz.<\/p>\n<h4>6.2. Rollback Mekanizmalar\u0131<\/h4>\n<p>Her da\u011f\u0131t\u0131m ba\u015far\u0131l\u0131 olmayabilir. Bir sorun durumunda, uygulaman\u0131n \u00f6nceki, \u00e7al\u0131\u015fan versiyonuna h\u0131zl\u0131ca geri d\u00f6nebilmek kritik \u00f6neme sahiptir. Docker ve Docker Compose ile bu, \u00f6nceki bir Docker imaj\u0131na veya Git commit'ine geri d\u00f6n\u00fcp yeniden da\u011f\u0131t\u0131m yaparak nispeten kolayca yap\u0131labilir. GitHub Actions workflow'unuza manuel bir rollback tetikleyicisi ekleyebilirsiniz.<\/p>\n<h4>6.3. Ortam De\u011fi\u015fkenlerinin Y\u00f6netimi<\/h4>\n<p>Hassas bilgiler (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) do\u011frudan kod i\u00e7inde tutulmamal\u0131d\u0131r. Bunlar\u0131 GitHub Secrets olarak tan\u0131mlay\u0131p, workflow dosyas\u0131nda <code>env<\/code> blo\u011fu arac\u0131l\u0131\u011f\u0131yla Docker konteynerlerine aktarmak en g\u00fcvenli yoldur.<\/p>\n<pre><code># docker-compose.yml i\u00e7inde\nservices:\n  web:\n    environment:\n      - DATABASE_URL=${DATABASE_URL} # Bu de\u011fi\u015fkeni GitHub Secret olarak tan\u0131mlay\u0131p aktar\u0131n\n<\/pre>\n<p><\/code><\/p>\n<h4>6.4. G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h4>\n<ul>\n<li>SSH \u00d6zel Anahtar\u0131n\u0131z\u0131 asla herkese a\u00e7\u0131k bir depoda saklamay\u0131n. Daima GitHub Secrets kullan\u0131n.<\/li>\n<li>Droplet'inizdeki g\u00fcvenlik duvar\u0131n\u0131 (UFW) do\u011fru yap\u0131land\u0131rarak sadece gerekli portlara izin verin.<\/li>\n<li>Root kullan\u0131c\u0131s\u0131 yerine, SSH ba\u011flant\u0131s\u0131 i\u00e7in ayr\u0131, daha az yetkili bir kullan\u0131c\u0131 olu\u015fturmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<li>Docker imajlar\u0131n\u0131z\u0131 d\u00fczenli olarak g\u00fcncelleyin ve bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 taray\u0131n.<\/li>\n<\/ul>\n<h3>7. Sorun Giderme ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Her ne kadar otomasyon s\u00fcre\u00e7leri kolayla\u015ft\u0131rsa da, zaman zaman sorunlarla kar\u015f\u0131la\u015fmak m\u00fcmk\u00fcnd\u00fcr. \u0130\u015fte yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcm \u00f6nerileri.<\/p>\n<h4>7.1. Yayg\u0131n Hatalar ve \u00c7\u00f6z\u00fcmleri<\/h4>\n<ul>\n<li><b>SSH Ba\u011flant\u0131 Hatas\u0131:<\/b>\n<ul>\n<li><code>SSH_PRIVATE_KEY<\/code> secret'\u0131n\u0131n do\u011fru ve eksiksiz oldu\u011fundan emin olun.<\/li>\n<li><code>DROPLET_IP<\/code> ve <code>SSH_USERNAME<\/code> secret'lar\u0131n\u0131n do\u011fru oldu\u011funu kontrol edin.<\/li>\n<li>Droplet'in g\u00fcvenlik duvar\u0131n\u0131n SSH (port 22) trafi\u011fine izin verdi\u011finden emin olun.<\/li>\n<\/ul>\n<\/li>\n<li><b>Docker Komutlar\u0131 \u00c7al\u0131\u015fm\u0131yor:<\/b>\n<ul>\n<li>Droplet'te Docker ve Docker Compose'un do\u011fru kuruldu\u011fundan ve \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun (<code>docker ps<\/code>, <code>docker compose version<\/code>).<\/li>\n<li>SSH kullan\u0131c\u0131s\u0131n\u0131n Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rma yetkisine sahip oldu\u011fundan emin olun (kullan\u0131c\u0131y\u0131 <code>docker<\/code> grubuna ekleyin).<\/li>\n<\/ul>\n<\/li>\n<li><b>Uygulama Ba\u015flam\u0131yor:<\/b>\n<ul>\n<li><code>Dockerfile<\/code> ve <code>docker-compose.yml<\/code> dosyalar\u0131n\u0131 kontrol edin. S\u00f6zdizimi hatalar\u0131 veya yanl\u0131\u015f yap\u0131land\u0131rmalar olabilir.<\/li>\n<li>Uygulama loglar\u0131n\u0131 kontrol edin (<code>docker compose logs web<\/code>).<\/li>\n<li>Port \u00e7ak\u0131\u015fmalar\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>7.2. Loglar\u0131 \u0130zleme<\/h4>\n<p>GitHub Actions workflow'unuzun \u00e7\u0131kt\u0131s\u0131, her ad\u0131m\u0131n loglar\u0131n\u0131 i\u00e7erir. Herhangi bir hata durumunda, bu loglar\u0131 dikkatlice incelemek sorunun k\u00f6kenini anlamak i\u00e7in hayati \u00f6neme sahiptir. Droplet \u00fczerinde de Docker konteyner loglar\u0131n\u0131 (<code>docker compose logs -f web<\/code>) takip ederek uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 g\u00f6zlemleyebilirsiniz.<\/p>\n<h4>7.3. Performans Optimizasyonu<\/h4>\n<p>B\u00fcy\u00fck Docker imajlar\u0131 veya \u00e7ok say\u0131da ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olan projelerde <code>docker compose up --build<\/code> ad\u0131m\u0131 uzun s\u00fcrebilir. Bu s\u00fcreyi k\u0131saltmak i\u00e7in:<\/p>\n<ul>\n<li>Docker imajlar\u0131n\u0131 katmanl\u0131 (layered) yap\u0131da optimize edin (de\u011fi\u015fmeyen ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00fcst katmanlara koyun).<\/li>\n<li>Gereksiz dosyalar\u0131 <code>.dockerignore<\/code> ile imaja dahil etmeyin.<\/li>\n<li>Daha h\u0131zl\u0131 build s\u00fcreleri i\u00e7in Docker Hub gibi bir registry kullan\u0131p imaj\u0131 Droplet'e \u00e7ekmek, build i\u015flemini her seferinde tekrarlamaktan daha h\u0131zl\u0131 olabilir.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Docker konteyner uygulamalar\u0131n\u0131z\u0131 DigitalOcean Droplet'e GitHub Actions kullanarak nas\u0131l otomatik olarak da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik. CI\/CD prensiplerini benimseyerek, geli\u015ftirme s\u00fcre\u00e7lerinizi h\u0131zland\u0131rabilir, hata oran\u0131n\u0131 d\u00fc\u015f\u00fcrebilir ve ekiplerinizin daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. GitHub Actions'\u0131n g\u00fcc\u00fc ve Docker'\u0131n esnekli\u011fi sayesinde, modern ve g\u00fcvenilir bir da\u011f\u0131t\u0131m hatt\u0131 kurmak art\u0131k \u00e7ok daha eri\u015filebilir. Unutmay\u0131n, otomasyon bir kere kuruldu\u011funda size uzun vadede b\u00fcy\u00fck zaman ve \u00e7aba kazand\u0131racakt\u0131r.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Neden GitHub Actions kullanmal\u0131y\u0131z?<\/h4>\n<p>GitHub Actions, GitHub depolar\u0131yla derinlemesine entegre olmas\u0131, zengin bir aksiyon k\u00fct\u00fcphanesine sahip olmas\u0131, \u00fccretsiz kullan\u0131m limitleri sunmas\u0131 ve YAML tabanl\u0131 kolay yap\u0131land\u0131rmas\u0131 sayesinde modern CI\/CD s\u00fcre\u00e7leri i\u00e7in g\u00fc\u00e7l\u00fc ve eri\u015filebilir bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h4>2. Hangi DigitalOcean plan\u0131n\u0131 se\u00e7meliyim?<\/h4>\n<p>Se\u00e7ti\u011finiz DigitalOcean Droplet plan\u0131, uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu CPU, RAM ve depolama kaynaklar\u0131na ba\u011fl\u0131d\u0131r. K\u00fc\u00e7\u00fck bir demo uygulamas\u0131 i\u00e7in en temel planlar yeterli olabilirken, y\u00fcksek trafikli veya kaynak yo\u011fun uygulamalar i\u00e7in daha g\u00fc\u00e7l\u00fc planlar tercih edilmelidir. Uygulaman\u0131z\u0131n performans\u0131n\u0131 izleyerek gerekti\u011finde plan\u0131n\u0131z\u0131 y\u00fckseltebilirsiniz.<\/p>\n<h4>3. Veritaban\u0131 gibi servisleri nas\u0131l y\u00f6netmeliyim?<\/h4>\n<p>Veritabanlar\u0131 gibi durum bilgisi olan (stateful) servisleri genellikle Docker konteynerleri i\u00e7inde de\u011fil, ayr\u0131 bir y\u00f6netilen veritaban\u0131 servisi olarak (\u00f6rne\u011fin DigitalOcean Managed Databases) kullanmak daha g\u00fcvenlidir ve \u00f6nerilir. E\u011fer veritaban\u0131n\u0131 Droplet \u00fczerinde Docker ile \u00e7al\u0131\u015ft\u0131rmak istiyorsan\u0131z, veri kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in Docker volume'lar\u0131n\u0131 do\u011fru \u015fekilde yap\u0131land\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.<\/p>\n<h4>4. G\u00fcvenlik konusunda nelere dikkat etmeliyim?<\/h4>\n<p>SSH \u00f6zel anahtar\u0131n\u0131z\u0131 asla herkese a\u00e7\u0131k tutmay\u0131n ve sadece GitHub Secrets \u00fczerinden kullan\u0131n. Droplet'inizdeki g\u00fcvenlik duvar\u0131n\u0131 do\u011fru yap\u0131land\u0131r\u0131n ve sadece gerekli portlara izin verin. M\u00fcmk\u00fcnse, SSH ba\u011flant\u0131lar\u0131 i\u00e7in <code>root<\/code> yerine daha az yetkili bir kullan\u0131c\u0131 kullan\u0131n. Docker imajlar\u0131n\u0131z\u0131 d\u00fczenli olarak g\u00fcncelleyin ve g\u00fcvenlik taramalar\u0131ndan ge\u00e7irin.<\/p>\n<h4>5. Birden fazla Droplet'e da\u011f\u0131t\u0131m yapabilir miyim?<\/h4>\n<p>Evet, GitHub Actions workflow'unuzu birden fazla Droplet'e da\u011f\u0131t\u0131m yapacak \u015fekilde geni\u015fletebilirsiniz. Bu genellikle her Droplet i\u00e7in ayr\u0131 bir SSH ba\u011flant\u0131s\u0131 ve da\u011f\u0131t\u0131m ad\u0131m\u0131 gerektirir veya bir orkestrasyon arac\u0131 (Kubernetes, Docker Swarm) kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"\u00d6nemli: SSH \u00f6zel anahtar\u0131n\u0131z\u0131 kopyalarken, anahtar\u0131n tamam\u0131n\u0131 (&#8212;&#8211;BEGIN OPENSSH PRIVATE KEY&#8212;&#8211; ile ba\u015flay\u0131p &#8212;&#8211;END OPENSSH PRIVATE KEY&#8212;&#8211; i&#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-38908","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>Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#039;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi - 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\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#039;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi\" \/>\n<meta property=\"og:description\" content=\"\u00d6nemli: SSH \u00f6zel anahtar\u0131n\u0131z\u0131 kopyalarken, anahtar\u0131n tamam\u0131n\u0131 (-----BEGIN OPENSSH PRIVATE KEY----- ile ba\u015flay\u0131p -----END OPENSSH PRIVATE KEY----- i...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-10T10:00:40+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=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#8217;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi\",\"datePublished\":\"2026-02-10T10:00:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\"},\"wordCount\":2352,\"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\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\",\"name\":\"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet'e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-10T10:00:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#8217;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi\"}]},{\"@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":"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet'e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi - 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\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet'e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi","og_description":"\u00d6nemli: SSH \u00f6zel anahtar\u0131n\u0131z\u0131 kopyalarken, anahtar\u0131n tamam\u0131n\u0131 (-----BEGIN OPENSSH PRIVATE KEY----- ile ba\u015flay\u0131p -----END OPENSSH PRIVATE KEY----- i...","og_url":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-10T10:00:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#8217;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi","datePublished":"2026-02-10T10:00:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/"},"wordCount":2352,"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\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/","name":"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet'e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-10T10:00:40+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/docker-uygulamalarini-digitalocean-droplete-github-actions-ile-otomatik-dagitma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker Uygulamalar\u0131n\u0131 DigitalOcean Droplet&#8217;e GitHub Actions ile Otomatik Da\u011f\u0131tma Rehberi"}]},{"@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\/38908","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=38908"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38908\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38908"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38908"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}