{"id":1788,"date":"2025-11-13T19:30:57","date_gmt":"2025-11-13T16:30:57","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/vpste-secrets-yonetimi-nasil-tatli-tatli-cozulur-sops-age-gitops-akisi-systemd-ve-rotasyon\/"},"modified":"2025-11-13T19:30:57","modified_gmt":"2025-11-13T16:30:57","slug":"vpste-secrets-yonetimi-nasil-tatli-tatli-cozulur-sops-age-gitops-akisi-systemd-ve-rotasyon","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/vpste-secrets-yonetimi-nasil-tatli-tatli-cozulur-sops-age-gitops-akisi-systemd-ve-rotasyon\/","title":{"rendered":"VPS\u2019te Secrets Y\u00f6netimi Nas\u0131l Tatl\u0131 Tatl\u0131 \u00c7\u00f6z\u00fcl\u00fcr? sops + age, GitOps Ak\u0131\u015f\u0131, systemd ve Rotasyon"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Ofiste_Baslayan_Kucuk_Panik_Bir_env_Dosyasi_Bir_PR_ve_Soguk_Ter\"><span class=\"toc_number toc_depth_1\">1<\/span> Ofiste Ba\u015flayan K\u00fc\u00e7\u00fck Panik: Bir .env Dosyas\u0131, Bir PR ve So\u011fuk Ter<\/a><\/li><li><a href=\"#VPSte_Secrets_Neden_Dert_Olur_GitOpsta_Tas_Gibi_Bir_Akis\"><span class=\"toc_number toc_depth_1\">2<\/span> VPS\u2019te Secrets Neden Dert Olur? GitOps\u2019ta Ta\u015f Gibi Bir Ak\u0131\u015f<\/a><\/li><li><a href=\"#sops_age_ile_Sifreli_Depo_Hizli_ve_Temiz_Baslangic\"><span class=\"toc_number toc_depth_1\">3<\/span> sops + age ile \u015eifreli Depo: H\u0131zl\u0131 ve Temiz Ba\u015flang\u0131\u00e7<\/a><ul><li><a href=\"#sops_ve_age_ne_yapar_nasil_calisir\"><span class=\"toc_number toc_depth_2\">3.1<\/span> sops ve age ne yapar, nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/a><\/li><li><a href=\"#Hangi_dosyalari_sifrelemeli\"><span class=\"toc_number toc_depth_2\">3.2<\/span> Hangi dosyalar\u0131 \u015fifrelemeli?<\/a><\/li><\/ul><\/li><li><a href=\"#GitOps_Akisi_PR_CI_ve_Sunucu_Tarafinda_Cozucu\"><span class=\"toc_number toc_depth_1\">4<\/span> GitOps Ak\u0131\u015f\u0131: PR, CI ve Sunucu Taraf\u0131nda \u00c7\u00f6z\u00fcc\u00fc<\/a><ul><li><a href=\"#PR_tabanli_degisim_audit_izleri_ve_huzur\"><span class=\"toc_number toc_depth_2\">4.1<\/span> PR tabanl\u0131 de\u011fi\u015fim, audit izleri ve huzur<\/a><\/li><li><a href=\"#Dagitim_otomasyonu_ve_ilk_hazirlik\"><span class=\"toc_number toc_depth_2\">4.2<\/span> Da\u011f\u0131t\u0131m otomasyonu ve ilk haz\u0131rl\u0131k<\/a><\/li><\/ul><\/li><li><a href=\"#systemd_ile_Entegrasyon_Guvenli_Cevre_Degiskenleri_ve_Credentials\"><span class=\"toc_number toc_depth_1\">5<\/span> systemd ile Entegrasyon: G\u00fcvenli \u00c7evre De\u011fi\u015fkenleri ve Credentials<\/a><ul><li><a href=\"#Guvenli_bir_yol_Decrypt_et_run_icine_yaz_EnvironmentFile_ile_yukle\"><span class=\"toc_number toc_depth_2\">5.1<\/span> G\u00fcvenli bir yol: Decrypt et, \/run i\u00e7ine yaz, EnvironmentFile ile y\u00fckle<\/a><\/li><li><a href=\"#systemd_credentials_ve_modern_dokunus\"><span class=\"toc_number toc_depth_2\">5.2<\/span> systemd credentials ve modern dokunu\u015f<\/a><\/li><li><a href=\"#Guvenlik_kucuk_notlari\"><span class=\"toc_number toc_depth_2\">5.3<\/span> G\u00fcvenlik k\u00fc\u00e7\u00fck notlar\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#Rotasyon_Anahtarlari_Insaat_Tozu_Kaldirmadan_Dondurmek\"><span class=\"toc_number toc_depth_1\">6<\/span> Rotasyon: Anahtarlar\u0131 \u0130n\u015faat Tozu Kald\u0131rmadan D\u00f6nd\u00fcrmek<\/a><ul><li><a href=\"#age_anahtari_nasil_dondurulur\"><span class=\"toc_number toc_depth_2\">6.1<\/span> age anahtar\u0131 nas\u0131l d\u00f6nd\u00fcr\u00fcl\u00fcr?<\/a><\/li><li><a href=\"#Otomasyonla_kucuk_bir_dans\"><span class=\"toc_number toc_depth_2\">6.2<\/span> Otomasyonla k\u00fc\u00e7\u00fck bir dans<\/a><\/li><\/ul><\/li><li><a href=\"#Yedekleme_ve_Kurtarma_Kotu_Gunu_Iyiye_Cevirmek\"><span class=\"toc_number toc_depth_1\">7<\/span> Yedekleme ve Kurtarma: K\u00f6t\u00fc G\u00fcn\u00fc \u0130yiye \u00c7evirmek<\/a><ul><li><a href=\"#age_kimliklerini_nasil_saklamali\"><span class=\"toc_number toc_depth_2\">7.1<\/span> age kimliklerini nas\u0131l saklamal\u0131?<\/a><\/li><li><a href=\"#Iz_ve_denetim\"><span class=\"toc_number toc_depth_2\">7.2<\/span> \u0130z ve denetim<\/a><\/li><\/ul><\/li><li><a href=\"#Uctan_Uca_Mini_Senaryo_Nodejs_Servisini_Hayata_Dondurelim\"><span class=\"toc_number toc_depth_1\">8<\/span> U\u00e7tan Uca Mini Senaryo: Node.js Servisini Hayata D\u00f6nd\u00fcrelim<\/a><ul><li><a href=\"#Repo_ve_secrets\"><span class=\"toc_number toc_depth_2\">8.1<\/span> Repo ve secrets<\/a><\/li><li><a href=\"#Sunucu_hazirligi\"><span class=\"toc_number toc_depth_2\">8.2<\/span> Sunucu haz\u0131rl\u0131\u011f\u0131<\/a><\/li><li><a href=\"#systemd_servisi\"><span class=\"toc_number toc_depth_2\">8.3<\/span> systemd servisi<\/a><\/li><li><a href=\"#Gunluklerde_sizintiyi_engelleme\"><span class=\"toc_number toc_depth_2\">8.4<\/span> G\u00fcnl\u00fcklerde s\u0131z\u0131nt\u0131y\u0131 engelleme<\/a><\/li><\/ul><\/li><li><a href=\"#Pratik_Ipuclari_Kucuk_Dokunuslar_Buyuk_Ferahlik\"><span class=\"toc_number toc_depth_1\">9<\/span> Pratik \u0130pu\u00e7lar\u0131: K\u00fc\u00e7\u00fck Dokunu\u015flar, B\u00fcy\u00fck Ferahl\u0131k<\/a><ul><li><a href=\"#Dagitimda_tek_yonlu_akis\"><span class=\"toc_number toc_depth_2\">9.1<\/span> Da\u011f\u0131t\u0131mda tek y\u00f6nl\u00fc ak\u0131\u015f<\/a><\/li><li><a href=\"#Izinler_ve_kullanicilar\"><span class=\"toc_number toc_depth_2\">9.2<\/span> \u0130zinler ve kullan\u0131c\u0131lar<\/a><\/li><li><a href=\"#Rotasyonu_takvime_baglayin\"><span class=\"toc_number toc_depth_2\">9.3<\/span> Rotasyonu takvime ba\u011flay\u0131n<\/a><\/li><\/ul><\/li><li><a href=\"#Kapanis_Panikten_Dunyayi_Kurtaran_Kucuk_Aliskanliklar\"><span class=\"toc_number toc_depth_1\">10<\/span> Kapan\u0131\u015f: Panikten D\u00fcnyay\u0131 Kurtaran K\u00fc\u00e7\u00fck Al\u0131\u015fkanl\u0131klar<\/a><\/li><\/ul><\/div>\n<h2 id='section-1'><span id=\"Ofiste_Baslayan_Kucuk_Panik_Bir_env_Dosyasi_Bir_PR_ve_Soguk_Ter\">Ofiste Ba\u015flayan K\u00fc\u00e7\u00fck Panik: Bir .env Dosyas\u0131, Bir PR ve So\u011fuk Ter<\/span><\/h2>\n<p>Hi\u00e7 ba\u015f\u0131n\u0131za geldi mi? Ak\u015fam \u00fcst\u00fc bir PR a\u00e7\u0131yorsunuz, her \u015fey tertemiz. Kod g\u00fczel, testler ye\u015fil. Son kontrole bakarken bir \u015fey g\u00f6ze \u00e7arp\u0131yor: .env dosyas\u0131ndaki API anahtar\u0131, yanl\u0131\u015fl\u0131kla d\u00fcz metin halde commitlenmi\u015f. O an insan\u0131n i\u00e7inden ge\u00e7en tek \u015fey, bir kahveyle beraber birka\u00e7 k\u00fcf\u00fcr. Birka\u00e7 dakika i\u00e7inde PR kapat\u0131l\u0131yor, anahtar iptal ediliyor, yeni anahtar \u00fcretiliyor. Ama o k\u0131sac\u0131k panik bize bir \u015fey s\u00f6yl\u00fcyor: Gizli anahtar i\u015fi \u015fansa b\u0131rak\u0131lmaz.<\/p>\n<p>Ben de y\u0131llar i\u00e7inde bu hikayeyi defalarca ya\u015fad\u0131m; bazen staging\u2019de \u015fifreli dosya unutuluyor, bazen prod sunucuda manuel bir de\u011fi\u015fiklik kal\u0131c\u0131 san\u0131l\u0131yor. \u0130\u015fin sonu genelde gecenin bir vakti SSH ile sunucuya girip temizlemeye, ve ertesi g\u00fcn \u201cbu i\u015fi nas\u0131l kal\u0131c\u0131 \u00e7\u00f6zeriz?\u201d sorusunu masaya koymaya var\u0131yor. Bug\u00fcn tam da bunu konu\u015fal\u0131m istiyorum: <a href=\"https:\/\/www.dchost.com\/tr\/vps\">VPS<\/a>\u2019te secrets y\u00f6netimini sops + age ile nas\u0131l d\u00fczg\u00fcn bir GitOps ak\u0131\u015f\u0131na ba\u011flar\u0131z, systemd ile nas\u0131l g\u00fcvenle y\u00fckleriz, ve rotasyonu nas\u0131l korkulacak bir i\u015f olmaktan \u00e7\u0131kar\u0131r\u0131z?<\/p>\n<p>Yaz\u0131n\u0131n devam\u0131nda tatt\u0131\u011f\u0131n\u0131z o minik paniklerin nedenlerini birlikte \u00e7\u00f6zece\u011fiz. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Her \u015fey kodla y\u00f6netiliyor, PR\u2019la de\u011fi\u015fiyor, deploy\u2019la hayata ge\u00e7iyor. Gizli anahtarlar da ayn\u0131 ak\u0131\u015fa kat\u0131ld\u0131\u011f\u0131 an i\u015fler bir anda berrakla\u015f\u0131yor. sops + age bize bunun pratik ve g\u00fcvenli y\u00f6ntemini sunuyor. \u00dcst\u00fcne bir de systemd ile servislerimize s\u0131zd\u0131rmadan enjekte edince, i\u015fler tad\u0131ndan yenmiyor.<\/p>\n<h2 id='section-2'><span id=\"VPSte_Secrets_Neden_Dert_Olur_GitOpsta_Tas_Gibi_Bir_Akis\">VPS\u2019te Secrets Neden Dert Olur? GitOps\u2019ta Ta\u015f Gibi Bir Ak\u0131\u015f<\/span><\/h2>\n<p>VPS taraf\u0131nda i\u015fleri y\u00fcr\u00fct\u00fcrken en kolay tuzak, \u2018zaten k\u00fc\u00e7\u00fck bir sunucu, bir scp atar\u0131z biter\u2019 diye d\u00fc\u015f\u00fcnmek. Bir s\u00fcre idare ediyor, kabul. Fakat tak\u0131m b\u00fcy\u00fcd\u00fc\u011f\u00fcnde, servis say\u0131s\u0131 artt\u0131\u011f\u0131nda, geli\u015ftirme ortam\u0131, staging ve production ayr\u0131\u015ft\u0131\u011f\u0131nda ayn\u0131 dosyay\u0131 nereye, kiminle, nas\u0131l g\u00fcncelledi\u011finizi takip etmek zorla\u015f\u0131yor. Bu karma\u015fa genelde d\u00fcz metinle saklanan .env dosyalar\u0131 ve da\u011f\u0131n\u0131k notlarla ba\u015fl\u0131yor.<\/p>\n<p>GitOps dedi\u011fimiz yakla\u015f\u0131m i\u015fte tam burada ila\u00e7 gibi geliyor. Fikir basit: Altyap\u0131 ve yap\u0131land\u0131rma dahil her de\u011fi\u015fiklik <strong>Git \u00fczerinden<\/strong> g\u00f6zlemlenebilir, denetlenebilir, geri al\u0131nabilir olmal\u0131. Secrets da bu hikayenin kahraman\u0131. Peki d\u00fcz metin commitlenmeden nas\u0131l yapaca\u011f\u0131z? \u015eifreli commit. Yani repo i\u00e7inde secrets dosyas\u0131 var, ama \u015fifreli. Decrypt sadece yetkili VPS\u2019lerde, sadece servis ba\u015flarken yap\u0131l\u0131yor. B\u00f6ylece PR\u2019\u0131n\u0131zda gizli anahtar\u0131 g\u00f6rm\u00fcyorsunuz, ama yine de de\u011fi\u015fiklikleri y\u00f6netiyor, versiyonluyor, iz b\u0131rak\u0131yorsunuz.<\/p>\n<p>Mesela d\u00fcn staging\u2019de kullan\u0131lan bir \u00fc\u00e7\u00fcnc\u00fc parti API anahtar\u0131n\u0131 de\u011fi\u015ftirmeniz gerekti. PR a\u00e7t\u0131n\u0131z, dosya \u015fifreli, de\u011fi\u015fiklik review\u2019dan ge\u00e7ti, merge edildi. Da\u011f\u0131t\u0131m pipeline\u2019\u0131 yeni dosyay\u0131 sunucuya getirdi, servis ba\u015flamadan \u00f6nce \u015fifreyi \u00e7\u00f6zd\u00fc ve g\u00fcvenli bir \u015fekilde belle\u011fe ald\u0131. Ne panik, ne s\u00fcrpriz. \u0130\u015fte arad\u0131\u011f\u0131m\u0131z d\u00fczen bu.<\/p>\n<h2 id='section-3'><span id=\"sops_age_ile_Sifreli_Depo_Hizli_ve_Temiz_Baslangic\">sops + age ile \u015eifreli Depo: H\u0131zl\u0131 ve Temiz Ba\u015flang\u0131\u00e7<\/span><\/h2>\n<h3><span id=\"sops_ve_age_ne_yapar_nasil_calisir\">sops ve age ne yapar, nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/span><\/h3>\n<p>sops, dosyalar\u0131n\u0131z\u0131 alan bazl\u0131 \u015fifrelemenize yarayan minik ama g\u00fc\u00e7l\u00fc bir ara\u00e7. YAML, JSON, dotenv gibi formatlar\u0131 sever; sadece belirli alanlar\u0131 \u015fifrelemeye de izin verir. age ise modern, sade ve h\u0131zl\u0131 bir dosya \u015fifreleme arac\u0131. \u0130kisi birle\u015fince, repoda duran secrets dosyas\u0131 \u015fifreli, a\u00e7mas\u0131 ise sadece do\u011fru kimliklere sahip sunucularda m\u00fcmk\u00fcn hale geliyor. K\u0131sacas\u0131, commit ediyorsunuz ama kimse i\u00e7eri\u011fi \u00e7\u0131plak g\u00f6zle g\u00f6remiyor.<\/p>\n<p>Ba\u015flang\u0131\u00e7 i\u00e7in \u00f6nce age kimli\u011fi \u00fcretelim:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">age-keygen -o agekey.txt\n# \u0130\u00e7eri\u011fi g\u00f6r\u00fcn, 'public key' k\u0131sm\u0131n\u0131 sops'a verece\u011fiz\ncat agekey.txt<\/code><\/pre>\n<p>age anahtar dosyas\u0131n\u0131 VPS\u2019inizde g\u00fcvenli bir yerde saklay\u0131n. Gerekirse sadece root\u2019un okuyabildi\u011fi bir dizin, izinleri s\u0131k\u0131, hatta disk \u015fifrelemesi d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f bir yakla\u015f\u0131m kullan\u0131n. Lokal makinenizde tutacaksan\u0131z \u015fifreli bir kasa da iyi fikir. Sonra sops\u2019a bu al\u0131c\u0131y\u0131 tan\u0131tal\u0131m. Proje k\u00f6k\u00fcne bir .sops.yaml koyarak kural yaz\u0131yoruz:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">cat &gt; .sops.yaml &lt;&lt;'YAML'\ncreation_rules:\n  - path_regex: 'secrets\/.*.yaml'\n    encrypted_regex: '^(data|secret|password|token)'\n    age: ['age1q3...alici_kamu_anahtari...']\n  - path_regex: 'secrets\/.*.env'\n    age: ['age1q3...alici_kamu_anahtari...']\nYAML<\/code><\/pre>\n<p>Art\u0131k repo i\u00e7inde secrets klas\u00f6r\u00fcndeki dosyalar commit edilirken sops taraf\u0131ndan age\u2019le \u015fifrelenmi\u015f olacak. Yeni bir secrets dosyas\u0131 \u00fcretmeyi deneyelim:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">mkdir -p secrets\nEDITOR=vim sops secrets\/app.env<\/code><\/pre>\n<p>sops komutu dosyay\u0131 a\u00e7t\u0131\u011f\u0131n\u0131zda, kaydedip \u00e7\u0131kt\u0131\u011f\u0131n\u0131z anda dosya \u015fifreli halde repoda duracak. \u0130\u00e7eride d\u00fcz metinle yazd\u0131\u011f\u0131n\u0131z sat\u0131rlar, diske \u015fifreli yaz\u0131l\u0131yor. Kontrol etmek isterseniz:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">cat secrets\/app.env\n# \u015eifreli blob g\u00f6rmelisiniz<\/code><\/pre>\n<p>Bu arada resmi kaynaklara g\u00f6z atmak isterseniz, sops i\u00e7in <a href=\"https:\/\/github.com\/getsops\/sops\" rel=\"nofollow noopener\" target=\"_blank\">sops projesinin GitHub sayfas\u0131<\/a> ve age i\u00e7in <a href=\"https:\/\/age-encryption.org\" rel=\"nofollow noopener\" target=\"_blank\">age dok\u00fcmantasyonu<\/a> gayet anla\u015f\u0131l\u0131r bir ba\u015flang\u0131\u00e7 sunuyor.<\/p>\n<h3><span id=\"Hangi_dosyalari_sifrelemeli\">Hangi dosyalar\u0131 \u015fifrelemeli?<\/span><\/h3>\n<p>\u0130\u00e7inde token, parolalar, API anahtarlar\u0131, ba\u011flant\u0131 stringleri, sertifika \u00f6zel anahtarlar\u0131 gibi de\u011ferler olan her dosya. Baz\u0131 ekipler komple dosyay\u0131 \u015fifreliyor, baz\u0131lar\u0131 sadece belirli alanlar\u0131. Ben k\u00fc\u00e7\u00fck ekiplerde komple \u015fifrelemeyi, b\u00fcy\u00fcd\u00fck\u00e7e alan bazl\u0131 \u015fifrelemeyi daha pratik buluyorum. \u00d6nemli olan, <strong>repoda hi\u00e7bir gizli \u015feyin d\u00fcz metin kalmamas\u0131<\/strong>.<\/p>\n<h2 id='section-4'><span id=\"GitOps_Akisi_PR_CI_ve_Sunucu_Tarafinda_Cozucu\">GitOps Ak\u0131\u015f\u0131: PR, CI ve Sunucu Taraf\u0131nda \u00c7\u00f6z\u00fcc\u00fc<\/span><\/h2>\n<h3><span id=\"PR_tabanli_degisim_audit_izleri_ve_huzur\">PR tabanl\u0131 de\u011fi\u015fim, audit izleri ve huzur<\/span><\/h3>\n<p>\u015eimdi ta\u015f\u0131 netle\u015ftirelim: Secrets dosyas\u0131 repoda \u015fifreli. Bir de\u011fi\u015fiklik gerekti\u011finde PR a\u00e7\u0131yorsunuz. \u0130nceleme yapan ki\u015fi i\u00e7eri\u011fi d\u00fcz g\u00f6remez, ama de\u011fi\u015fiklik sat\u0131rlar\u0131n\u0131 \u015fifreli halden anlar; esas kontrol, de\u011fi\u015fikli\u011fin motivasyonunda ve s\u00fcre\u00e7te. Merge edildi mi? CI pipeline\u2019\u0131 devreye girer, hedef VPS\u2019e \u015fifreli dosyay\u0131 yollar.<\/p>\n<p>Sunucu taraf\u0131nda age kimli\u011fi duruyor, sops ile dosyay\u0131 yaln\u0131zca orada \u00e7\u00f6z\u00fcyoruz. B\u00f6ylece \u2018\u00e7\u00f6z\u00fcld\u00fc m\u00fc, kim g\u00f6rd\u00fc, kim kopyalad\u0131\u2019 derdi yok. Kay\u0131tlar Git\u2019te, g\u00f6zler PR\u2019da, \u00fcretim ise yaln\u0131zca \u00fcretimde.<\/p>\n<h3><span id=\"Dagitim_otomasyonu_ve_ilk_hazirlik\">Da\u011f\u0131t\u0131m otomasyonu ve ilk haz\u0131rl\u0131k<\/span><\/h3>\n<p>\u0130lk kurulumda ya\u015fam\u0131 kolayla\u015ft\u0131ran iki dost var: cloud-init ve Ansible. VPS ilk nefesini ald\u0131\u011f\u0131nda, age anahtarlar\u0131n\u0131z\u0131 ve sops yap\u0131land\u0131rman\u0131z\u0131 g\u00fcvenle yerle\u015ftirmek i\u015fin yar\u0131s\u0131. Bu yakla\u015f\u0131m\u0131n ruhu i\u00e7in \u015fu rehbere g\u00f6z atmak iyi gelir: <a href=\"https:\/\/www.dchost.com\/blog\/bulutun-ilk-nefesi-cloud%E2%80%91init-ve-ansible-ile-tekrar-uretilebilir-vps-nasil-kurulur\/\">cloud-init ve Ansible ile tekrar \u00fcretilebilir VPS<\/a>. \u00dcst\u00fcne altyap\u0131 nesnelerini Git\u2019le y\u00f6netmek isterseniz Terraform katman\u0131 ekleyebilirsiniz; DNS ve VPS taraf\u0131n\u0131 da ayn\u0131 ak\u0131\u015fa ba\u011flamak, orkestrasyonu sadele\u015ftiriyor. Detayl\u0131 bir yol haritas\u0131 i\u00e7in \u015fu rehber gayet iyi: <a href=\"https:\/\/www.dchost.com\/blog\/terraform-ile-vps-ve-dns-otomasyonu-cloudflare-proxmox-openstack-ve-sifir-kesinti-dagitim-nasil-bir-araya-gelir\/\">Terraform ile VPS ve DNS otomasyonu<\/a>.<\/p>\n<p>CI taraf\u0131nda ise basit bir kural yeter: \u015eifreli dosyalar oldu\u011fu gibi paketlenip sunucuya kopyalans\u0131n; \u00e7\u00f6zme i\u015flemi <strong>sunucuda ve servis ba\u015flarken<\/strong> ger\u00e7ekle\u015fsin. B\u00f6ylece CI sisteminizin secrets g\u00f6rmesine gerek kalmaz.<\/p>\n<h2 id='section-5'><span id=\"systemd_ile_Entegrasyon_Guvenli_Cevre_Degiskenleri_ve_Credentials\">systemd ile Entegrasyon: G\u00fcvenli \u00c7evre De\u011fi\u015fkenleri ve Credentials<\/span><\/h2>\n<h3><span id=\"Guvenli_bir_yol_Decrypt_et_run_icine_yaz_EnvironmentFile_ile_yukle\">G\u00fcvenli bir yol: Decrypt et, \/run i\u00e7ine yaz, EnvironmentFile ile y\u00fckle<\/span><\/h3>\n<p>Pratik bir desen: Servis ba\u015flamadan hemen \u00f6nce sops ile \u015fifreli dosyay\u0131 \u00e7\u00f6z\u00fcp, \u00e7\u0131kt\u0131 dosyas\u0131n\u0131 tmpfs \u00fcst\u00fcnde bir dizine yazmak. \/run dizini bu i\u015f i\u00e7in ideal; reboot ile temizlenir, dosyalar RAM\u2019de durur, iz b\u0131rakma riski azal\u0131r. Sonra systemd\u2019nin EnvironmentFile direktifiyle o dosyay\u0131 servis ortam\u0131na y\u00fcklersiniz.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \/etc\/systemd\/system\/myapp.service\n[Unit]\nDescription=My App\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=myapp\nGroup=myapp\nEnvironmentFile=\/run\/myapp\/app.env\nExecStartPre=\/usr\/bin\/mkdir -p \/run\/myapp\nExecStartPre=\/usr\/bin\/chmod 0700 \/run\/myapp\nExecStartPre=\/usr\/bin\/sops -d \/etc\/myapp\/secrets\/app.env &gt; \/run\/myapp\/app.env\nExecStart=\/usr\/local\/bin\/myapp\nExecReload=\/bin\/kill -HUP $MAINPID\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Burada dikkat: \/etc\/myapp\/secrets\/app.env repodan gelen <strong>\u015fifreli<\/strong> dosya; \/run\/myapp\/app.env ise \u015fifresi \u00e7\u00f6z\u00fclm\u00fc\u015f, sadece servis taraf\u0131ndan okunacak dosya. \u0130zinleri s\u0131k\u0131 tutmak \u00f6nemli. Ayr\u0131ca g\u00fcnl\u00fcklerde gizli de\u011ferlerin g\u00f6r\u00fcnmemesi i\u00e7in uygulaman\u0131n log format\u0131na dikkat edin; bazen fark\u0131nda olmadan env\u2019i d\u00f6ken logger ayarlar\u0131 oluyor.<\/p>\n<h3><span id=\"systemd_credentials_ve_modern_dokunus\">systemd credentials ve modern dokunu\u015f<\/span><\/h3>\n<p>systemd\u2019nin yeni s\u00fcr\u00fcmlerinde credentials mekanizmas\u0131 var; servis ba\u015flat\u0131l\u0131rken dosya benzeri kimlikleri g\u00fcvenli bir \u015fekilde i\u00e7eri almak i\u00e7in iyi bir se\u00e7enek. Detaylar\u0131 <a href=\"https:\/\/systemd.io\/CREDENTIALS\/\" rel=\"nofollow noopener\" target=\"_blank\">systemd credentials dok\u00fcman\u0131nda<\/a> bulabilirsiniz. Basit bir kullan\u0131mda, ExecStartPre ile sops -d \u00e7al\u0131\u015ft\u0131r\u0131p output\u2019u $CREDENTIALS_DIRECTORY i\u00e7ine d\u00fc\u015f\u00fcr\u00fcr, serviste o dosyay\u0131 okursunuz. Bu sayede Environment de\u011fi\u015fkenlerinden ka\u00e7\u0131n\u0131r, dosya tabanl\u0131 t\u00fcketim yapars\u0131n\u0131z. Baz\u0131 diller ve framework\u2019ler dosyadan okuma konusunda daha disiplinli oldu\u011fu i\u00e7in ho\u015f bir desen.<\/p>\n<h3><span id=\"Guvenlik_kucuk_notlari\">G\u00fcvenlik k\u00fc\u00e7\u00fck notlar\u0131<\/span><\/h3>\n<p>Servis user\u2019\u0131 ayr\u0131 olsun; root\u2019la \u00e7al\u0131\u015ft\u0131rmaktan ka\u00e7\u0131n\u0131n. Decrypt edilen dosyay\u0131 sadece o kullan\u0131c\u0131 okuyabilsin. Dosyay\u0131 i\u015f bittikten sonra gereksiz yere b\u0131rakmay\u0131n; servis dururken ExecStopPost ile temizlemek iyi bir al\u0131\u015fkanl\u0131k. Ve m\u00fcmk\u00fcnse secrets hi\u00e7bir \u015fekilde journal, stdout, core dump gibi yerlere u\u011framas\u0131n. K\u00fc\u00e7\u00fck ayarlar b\u00fcy\u00fck kazalar \u00f6nler.<\/p>\n<h2 id='section-6'><span id=\"Rotasyon_Anahtarlari_Insaat_Tozu_Kaldirmadan_Dondurmek\">Rotasyon: Anahtarlar\u0131 \u0130n\u015faat Tozu Kald\u0131rmadan D\u00f6nd\u00fcrmek<\/span><\/h2>\n<h3><span id=\"age_anahtari_nasil_dondurulur\">age anahtar\u0131 nas\u0131l d\u00f6nd\u00fcr\u00fcl\u00fcr?<\/span><\/h3>\n<p>Bir g\u00fcn gelecek, age kimliklerini yenilemek isteyeceksiniz. Belki ekipten biri ayr\u0131ld\u0131, belki de g\u00fcvenlik politikas\u0131 b\u00f6yle istiyor. Korkulacak bir \u015fey yok. Yeni bir age kimli\u011fi \u00fcretirsiniz, sops\u2019a yeni al\u0131c\u0131y\u0131 eklersiniz, sonra t\u00fcm dosyalar\u0131 bu al\u0131c\u0131yla yeniden \u015fifreletirsiniz. Eski al\u0131c\u0131y\u0131 hemen silmek zorunda de\u011filsiniz; kademeli ge\u00e7i\u015f rahatlat\u0131r.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># Yeni kimlik\nage-keygen -o agekey_2024q4.txt\n\n# .sops.yaml i\u00e7ine yeni al\u0131c\u0131y\u0131 ekleyin\n# ard\u0131ndan projedeki \u015fifreli dosyalar\u0131 g\u00fcncelleyin\nsops updatekeys -y<\/code><\/pre>\n<p>\u0130lk deploy\u2019da servisler hem eski hem yeni al\u0131c\u0131yla \u00e7\u00f6z\u00fclebilir halde olur. Birka\u00e7 deploy sonra, g\u00fcvenle eskisini \u00e7\u0131kart\u0131rs\u0131n\u0131z. Bu yakla\u015f\u0131m bana <a href=\"https:\/\/www.dchost.com\/blog\/dnssec-key-rollover-ksk-zsk-ve-ds-kayit-guncelleme-sifir-kesintiyle-anahtar-dondurme-nasil-yapilir\/\">DNSSEC key rollover\u2019da s\u0131f\u0131r kesintili anahtar d\u00f6nd\u00fcrme<\/a> planlar\u0131n\u0131 an\u0131msat\u0131r. Ayn\u0131 nezaketle, kullan\u0131c\u0131y\u0131 rahats\u0131z etmeden i\u015fler y\u00fcr\u00fcr.<\/p>\n<h3><span id=\"Otomasyonla_kucuk_bir_dans\">Otomasyonla k\u00fc\u00e7\u00fck bir dans<\/span><\/h3>\n<p>\u0130\u015fleri el yordam\u0131yla yapmak yerine, k\u00fc\u00e7\u00fck bir script ve bir systemd timer ile hat\u0131rlatmalar ekleyebilirsiniz. Mesela her ay bir rapor \u00fcretip hangi secrets hangi al\u0131c\u0131larla \u015fifreli, hangileri eski anahtar\u0131 h\u00e2l\u00e2 ta\u015f\u0131yor g\u00f6relim. Script sadece rapor \u00fcretir; de\u011fi\u015fimi yine PR ile yapars\u0131n\u0131z. B\u00f6ylece hem kontrol sizde kal\u0131r hem de rotasyon unutulmaz.<\/p>\n<h2 id='section-7'><span id=\"Yedekleme_ve_Kurtarma_Kotu_Gunu_Iyiye_Cevirmek\">Yedekleme ve Kurtarma: K\u00f6t\u00fc G\u00fcn\u00fc \u0130yiye \u00c7evirmek<\/span><\/h2>\n<h3><span id=\"age_kimliklerini_nasil_saklamali\">age kimliklerini nas\u0131l saklamal\u0131?<\/span><\/h3>\n<p>\u015eunu asla unutmay\u0131n: age kimlikleriniz yoksa, \u015fifreli dosyalar\u0131n\u0131z yaln\u0131zca sanat eseridir. G\u00fczel bakars\u0131n\u0131z ama i\u00e7eri\u011fini g\u00f6remezsiniz. Bu y\u00fczden <strong>kimli\u011fi birden fazla g\u00fcvenli yerde<\/strong> tutun. Bir tanesi \u015fifreli parola kasan\u0131zda, bir kopya offline, gerekirse bir YubiKey \u00fcst\u00fcnde. Kurumsal bir depoda \u015fifreli saklamak da mant\u0131kl\u0131 olabilir.<\/p>\n<p>Yedekleme stratejisinde versiyonlama ve de\u011fi\u015fmezlik b\u00fcy\u00fck yard\u0131mc\u0131. Bu konuda en sevdi\u011fim pratiklerden biri, S3 benzeri depolarda Object Lock ve versioning kullanmak. E\u011fer bu fikir ilginizi \u00e7ekerse, \u015fu rehberin yakla\u015f\u0131m\u0131 i\u015finize yarar: <a href=\"https:\/\/www.dchost.com\/blog\/s3-object-lock-ile-fidye-yazilima-karsi-kale-gibi-yedek-versioning-mfa-delete-ve-geri-donus-testlerini-samimi-samimi-konusalim\/\">S3 Object Lock ile fidye yaz\u0131l\u0131ma kar\u015f\u0131 kale gibi yedek<\/a>. B\u00f6ylece yanl\u0131\u015fl\u0131kla silinen bir anahtar dosyas\u0131n\u0131 geri getirmek veya k\u00f6t\u00fc niyetli de\u011fi\u015fikli\u011fi geri almak \u00e7ok daha kolay olur.<\/p>\n<h3><span id=\"Iz_ve_denetim\">\u0130z ve denetim<\/span><\/h3>\n<p>GitOps\u2019un g\u00fczel taraf\u0131 burada kendini g\u00f6steriyor: PR ge\u00e7mi\u015fi, commit mesajlar\u0131, release notlar\u0131 size kimin ne zaman, neden bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131 anlat\u0131r. S\u00fcre\u00e7 \u015feffafla\u015ft\u0131k\u00e7a, hatalar daha erken yakalan\u0131r. Bir \u015feyler ters gitti\u011finde, \u2018kim, neyi, nas\u0131l de\u011fi\u015ftirdi?\u2019 sorusu dosdo\u011fru bir kayda bak\u0131larak yan\u0131tlan\u0131r.<\/p>\n<h2 id='section-8'><span id=\"Uctan_Uca_Mini_Senaryo_Nodejs_Servisini_Hayata_Dondurelim\">U\u00e7tan Uca Mini Senaryo: Node.js Servisini Hayata D\u00f6nd\u00fcrelim<\/span><\/h2>\n<h3><span id=\"Repo_ve_secrets\">Repo ve secrets<\/span><\/h3>\n<p>Varsayal\u0131m basit bir Node.js API\u2019niz var. Repo k\u00f6k\u00fcnde secrets\/app.env dosyas\u0131 dursun. \u0130\u00e7inde \u015f\u00f6yle de\u011ferler olsun:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># sops edit ile olu\u015fturdu\u011funuz .env i\u00e7eri\u011fi, kaydedince \u015fifreli saklan\u0131r\nNODE_ENV=production\nPORT=8080\nDB_URL=postgres:\/\/user:pass@localhost:5432\/app\nJWT_SECRET=super_gizli_anahtar<\/code><\/pre>\n<p>Bu dosyay\u0131 d\u00fcz metin commitlemiyorsunuz, sops zaten devrede. PR a\u00e7\u0131nca de\u011fi\u015fiklik \u015fifreli blob olarak g\u00f6r\u00fcn\u00fcr, ama versiyonlama \u00e7al\u0131\u015f\u0131r.<\/p>\n<h3><span id=\"Sunucu_hazirligi\">Sunucu haz\u0131rl\u0131\u011f\u0131<\/span><\/h3>\n<p>VPS\u2019te age anahtar\u0131n\u0131z \/etc\/myapp\/agekey.txt alt\u0131nda olsun. \u0130zinleri s\u0131kal\u0131m:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo mkdir -p \/etc\/myapp\/secrets\nsudo chown -R root:root \/etc\/myapp\nsudo chmod 0700 \/etc\/myapp\nsudo chmod 0600 \/etc\/myapp\/agekey.txt<\/code><\/pre>\n<p>sops\u2019a age kimli\u011fini tan\u0131tmak i\u00e7in ortam de\u011fi\u015fkeni kullanabilir veya .sops.yaml ile ya\u015fatabilirsiniz. Genelde repo i\u00e7inde .sops.yaml bulunur. Sunucuda decrypt ederken sops, dosya \u00fcst\u00fcndeki al\u0131c\u0131lara bakar; kimlik dosyas\u0131 ortamda ise \u00e7\u00f6zebilir. \u00d6rne\u011fin:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">export SOPS_AGE_KEY_FILE=\/etc\/myapp\/agekey.txt\nsops -d \/etc\/myapp\/secrets\/app.env<\/code><\/pre>\n<h3><span id=\"systemd_servisi\">systemd servisi<\/span><\/h3>\n<p>Bir systemd servisi yazal\u0131m. Servis, \u015fifreli app.env dosyas\u0131n\u0131 her start\u2019tan \u00f6nce \u00e7\u00f6zecek, \/run\/myapp\/app.env i\u00e7ine g\u00fcvenle koyacak, sonra uygulamay\u0131 ba\u015flatacak.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \/etc\/systemd\/system\/myapp.service\n[Unit]\nDescription=My Node App\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=myapp\nGroup=myapp\nEnvironment=SOPS_AGE_KEY_FILE=\/etc\/myapp\/agekey.txt\nEnvironmentFile=\/run\/myapp\/app.env\nExecStartPre=\/usr\/bin\/mkdir -p \/run\/myapp\nExecStartPre=\/usr\/bin\/chmod 0700 \/run\/myapp\nExecStartPre=\/usr\/bin\/sops -d \/etc\/myapp\/secrets\/app.env &gt; \/run\/myapp\/app.env\nExecStart=\/usr\/bin\/node \/srv\/myapp\/server.js\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Ard\u0131ndan:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable --now myapp\nsudo systemctl status myapp<\/code><\/pre>\n<p>Her restart\u2019ta secrets yeniden \u00e7\u00f6z\u00fcl\u00fcr. Deploy pipeline\u2019\u0131n\u0131z, \u015fifreli dosyay\u0131 g\u00fcncelledi\u011finde, sadece restart ile yeni de\u011ferler devreye girer. B\u00f6yle bir ak\u0131\u015fta SSL, DNS, TCP gibi \u00e7evre konular\u0131nda da tertemiz davranmak i\u015fleri daha da sa\u011flamla\u015ft\u0131r\u0131r. \u00d6rne\u011fin yo\u011fun trafi\u011fi olan hizmetlerde a\u011f ayarlar\u0131n\u0131 sakin ve bilin\u00e7li yapmak i\u00e7in \u015fu pratik yolculuk ho\u015f bir e\u015flik\u00e7i: <a href=\"https:\/\/www.dchost.com\/blog\/yuksek-trafikli-wordpress-laravelde-linux-tcp-tuning-sysctl-ayarlari-udp-bufferlari-ve-syn-flooda-karsi-sakin-kalmak\/\">Linux TCP tuning ile SYN f\u0131rt\u0131nas\u0131nda sakin kalmak<\/a>.<\/p>\n<h3><span id=\"Gunluklerde_sizintiyi_engelleme\">G\u00fcnl\u00fcklerde s\u0131z\u0131nt\u0131y\u0131 engelleme<\/span><\/h3>\n<p>Uygulaman\u0131z\u0131n loglama katman\u0131nda, asla env\u2019i topluca d\u00f6kmeyin. Gereksiz debug modlar\u0131n\u0131 \u00fcretimde kapal\u0131 tutun. systemd journal\u2019\u0131 d\u0131\u015far\u0131ya g\u00f6nderen forward ayar\u0131n\u0131z varsa, giden ak\u0131\u015fta da filtre oldu\u011fundan emin olun. Bir sat\u0131r dalg\u0131nl\u0131k, haftalarca ba\u015f a\u011fr\u0131s\u0131 demek olabilir.<\/p>\n<h2 id='section-9'><span id=\"Pratik_Ipuclari_Kucuk_Dokunuslar_Buyuk_Ferahlik\">Pratik \u0130pu\u00e7lar\u0131: K\u00fc\u00e7\u00fck Dokunu\u015flar, B\u00fcy\u00fck Ferahl\u0131k<\/span><\/h2>\n<h3><span id=\"Dagitimda_tek_yonlu_akis\">Da\u011f\u0131t\u0131mda tek y\u00f6nl\u00fc ak\u0131\u015f<\/span><\/h3>\n<p>\u015eifreli dosya repodan tek y\u00f6nl\u00fc akar: CI kopyalar, VPS\u2019te \u00e7\u00f6z\u00fcl\u00fcr. Decrypt edilmi\u015f dosyay\u0131 repoya, CI \u00e7\u0131kt\u0131s\u0131na veya kal\u0131c\u0131 diske geri yazmay\u0131n. \/run gibi u\u00e7ucu alanlar bu y\u00fczden g\u00fczel.<\/p>\n<h3><span id=\"Izinler_ve_kullanicilar\">\u0130zinler ve kullan\u0131c\u0131lar<\/span><\/h3>\n<p>Servis kullan\u0131c\u0131lar\u0131n\u0131 ayr\u0131 tutun. Sadece ihtiya\u00e7 duyan servis, sadece ihtiyac\u0131 olan dosyaya eri\u015fsin. En basitinden, chmod 0600 ve do\u011fru ownership \u00e7o\u011fu kazay\u0131 engeller. Ayr\u0131ca docker veya containerd ile ko\u015fuyorsan\u0131z, container i\u00e7inde decrypt yerine host taraf\u0131nda decrypt edip mount etmek, izleri azalt\u0131r.<\/p>\n<h3><span id=\"Rotasyonu_takvime_baglayin\">Rotasyonu takvime ba\u011flay\u0131n<\/span><\/h3>\n<p>Her \u00e7eyrekte k\u00fc\u00e7\u00fck bir rotasyon yapmak, beklenmedik anlarda aceleye gelmekten iyidir. K\u00fc\u00e7\u00fck PR\u2019lar, k\u00fc\u00e7\u00fck riskler demektir. PR a\u00e7\u0131klamalar\u0131na neden ve kapsam notunu eklemek, gelecekte kendinize g\u00f6nderece\u011finiz bir te\u015fekk\u00fcr kart\u0131d\u0131r.<\/p>\n<h2 id='section-10'><span id=\"Kapanis_Panikten_Dunyayi_Kurtaran_Kucuk_Aliskanliklar\">Kapan\u0131\u015f: Panikten D\u00fcnyay\u0131 Kurtaran K\u00fc\u00e7\u00fck Al\u0131\u015fkanl\u0131klar<\/span><\/h2>\n<p>Toparlayal\u0131m. VPS\u2019te secrets y\u00f6netimi, bir kez d\u00fczenli kuruldu\u011funda \u201c\u00fczerinde d\u00fc\u015f\u00fcn\u00fclmeyen\u201d bir konfor alan\u0131na d\u00f6n\u00fc\u015f\u00fcyor. sops + age ikilisiyle repoda \u015fifreli saklama, GitOps zihniyetiyle PR tabanl\u0131 de\u011fi\u015fim, systemd ile g\u00fcvenli enjekte etme ve d\u00fczenli rotasyon; hepsi bir arada olunca o me\u015fhur .env pani\u011fi tarihe kar\u0131\u015f\u0131yor. Kula\u011fa b\u00fcy\u00fck proje i\u015fi gibi gelmesin; k\u00fc\u00e7\u00fck bir serviste bile faydas\u0131n\u0131 hemen hissediyorsunuz.<\/p>\n<p>Pratik bir ba\u015flang\u0131\u00e7 i\u00e7in \u015funu \u00f6neririm: Bug\u00fcn bir age anahtar\u0131 \u00fcretin, sops\u2019u projeye al\u0131n, tek bir secrets dosyas\u0131n\u0131 \u015fifreleyin ve systemd ile \/run i\u00e7ine decrypt etmeyi deneyin. Yar\u0131n bunu CI ak\u0131\u015f\u0131na ba\u011flay\u0131n. Haftaya bir mini rotasyon provas\u0131 yap\u0131n. Hepsi k\u00fc\u00e7\u00fck ad\u0131mlar, ama toplamda g\u00fcveni ve huzuru art\u0131r\u0131yor. \u0130sterseniz bu ak\u0131\u015f\u0131, Let\u2019s Encrypt\u2019te ya\u015fad\u0131\u011f\u0131n\u0131z otomasyon keyfini kurarken ald\u0131\u011f\u0131n\u0131z tatl\u0131 derslerle de benzetebilirsiniz; ben h\u00e2l\u00e2 <a href=\"https:\/\/www.dchost.com\/blog\/lets-encrypt-rate-limitlerine-takilmadan-cok-alan-adinda-ssl-san-wildcard-acme-challenge-ve-tatli-stratejiler\/\">\u00e7ok alan ad\u0131nda SSL al\u0131rken izledi\u011fimiz stratejileri<\/a> bu mant\u0131\u011fa yan yana koyar\u0131m: d\u00fczen, otomasyon, \u015feffafl\u0131k.<\/p>\n<p>Umar\u0131m bu rehber, bir sonraki PR\u2019\u0131n\u0131zda i\u00e7inizi ferahlat\u0131r. Sorular\u0131n\u0131z olursa her zamanki gibi yaz\u0131n; kahve benden, sohbet sizden. Bir dahaki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Ofiste Ba\u015flayan K\u00fc\u00e7\u00fck Panik: Bir .env Dosyas\u0131, Bir PR ve So\u011fuk Ter2 VPS\u2019te Secrets Neden Dert Olur? GitOps\u2019ta Ta\u015f Gibi Bir Ak\u0131\u015f3 sops + age ile \u015eifreli Depo: H\u0131zl\u0131 ve Temiz Ba\u015flang\u0131\u00e73.1 sops ve age ne yapar, nas\u0131l \u00e7al\u0131\u015f\u0131r?3.2 Hangi dosyalar\u0131 \u015fifrelemeli?4 GitOps Ak\u0131\u015f\u0131: PR, CI ve Sunucu Taraf\u0131nda \u00c7\u00f6z\u00fcc\u00fc4.1 PR tabanl\u0131 de\u011fi\u015fim, audit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1789,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1788","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1788"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1788\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1789"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}