{"id":33139,"date":"2025-10-30T04:31:13","date_gmt":"2025-10-30T01:31:13","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/"},"modified":"2025-10-30T04:31:13","modified_gmt":"2025-10-30T01:31:13","slug":"coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/","title":{"rendered":"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz"},"content":{"rendered":"<p>Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration&#8217;lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 &#8220;Goose&#8221; kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, tek bir monolitik uygulama yerine mikroservis tabanl\u0131 veya birbirine ba\u011fl\u0131 birden fazla projenin geli\u015ftirilmesi olduk\u00e7a yayg\u0131n bir yakla\u015f\u0131md\u0131r. Bu yap\u0131, esneklik ve \u00f6l\u00e7eklenebilirlik gibi \u00f6nemli avantajlar sunsa da, beraberinde ciddi konfig\u00fcrasyon y\u00f6netimi zorluklar\u0131n\u0131 da getirir. Her projenin kendine \u00f6zg\u00fc veritaban\u0131 ba\u011flant\u0131 ayarlar\u0131, API anahtarlar\u0131, \u00fc\u00e7\u00fcnc\u00fc taraf servis entegrasyonlar\u0131 ve ortam de\u011fi\u015fkenleri bulunur. \u00dcstelik bu konfig\u00fcrasyonlar geli\u015ftirme (dev), test (test), haz\u0131rl\u0131k (staging) ve \u00fcretim (production) gibi farkl\u0131 ortamlar aras\u0131nda de\u011fi\u015fiklik g\u00f6sterebilir. Ortaya \u00e7\u0131kan karma\u015f\u0131kl\u0131k, manuel yap\u0131lan hatalara, yanl\u0131\u015f da\u011f\u0131t\u0131mlara ve hatta sistem kesintilerine yol a\u00e7abilir.<\/p>\n<p>Peki, bu da\u011f\u0131n\u0131kl\u0131\u011f\u0131 nas\u0131l kontrol alt\u0131na alabiliriz? \u0130\u015fte burada &#8220;Goose&#8221; gibi ara\u00e7lar devreye giriyor. Goose, \u00f6zellikle veritaban\u0131 \u015femas\u0131 de\u011fi\u015fikliklerini (migration&#8217;lar) y\u00f6netmek i\u00e7in tasarlanm\u0131\u015f, Go dilinde yaz\u0131lm\u0131\u015f basit ama g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ancak Goose&#8217;u sadece veritaban\u0131 migration&#8217;lar\u0131 i\u00e7in kullanmakla kalmay\u0131p, \u00e7oklu proje konfig\u00fcrasyon y\u00f6netimini merkeze alan daha geni\u015f bir stratejinin par\u00e7as\u0131 olarak da d\u00fc\u015f\u00fcnebiliriz. Asl\u0131nda, tutarl\u0131 veritaban\u0131 \u015femalar\u0131, uygulamalar\u0131n do\u011fru \u00e7al\u0131\u015fmas\u0131 i\u00e7in kritik bir konfig\u00fcrasyon bile\u015fenidir. \u00c7oklu projelerde her bir veritaban\u0131n\u0131n do\u011fru migration seviyesinde oldu\u011fundan emin olmak, genel sistem kararl\u0131l\u0131\u011f\u0131 i\u00e7in vazge\u00e7ilmezdir. Bu nedenle, Goose&#8217;un etkin kullan\u0131m\u0131, sadece veritaban\u0131 taraf\u0131nda de\u011fil, genel konfig\u00fcrasyon y\u00f6netiminde de disiplinli bir yakla\u015f\u0131m benimsememize yard\u0131mc\u0131 olabilir. Bu makalede, Goose&#8217;u temel alarak, farkl\u0131 projeler ve ortamlar aras\u0131nda konfig\u00fcrasyonlar\u0131 nas\u0131l merkezile\u015ftirebilece\u011finizi, otomatikle\u015ftirebilece\u011finizi ve en \u00f6nemlisi tutarl\u0131 tutabilece\u011finizi derinlemesine inceleyece\u011fiz. Geli\u015ftiricilerin ve DevOps m\u00fchendislerinin g\u00fcnl\u00fck operasyonlar\u0131n\u0131 kolayla\u015ft\u0131racak pratik bilgiler ve ger\u00e7ek d\u00fcnya senaryolar\u0131yla dolu bir yolculu\u011fa \u00e7\u0131kmaya haz\u0131r olun.<\/p>\n<h2>Kaz Konfig\u00fcrasyon Y\u00f6netiminin Temelleri: Ne Anlama Geliyor?<\/h2>\n<p>Konfig\u00fcrasyon y\u00f6netimi, bir sistemin veya uygulaman\u0131n \u00e7al\u0131\u015fma zaman\u0131ndaki davran\u0131\u015f\u0131n\u0131 tan\u0131mlayan parametrelerin, ayarlar\u0131n ve di\u011fer verilerin d\u00fczenlenmesi ve s\u00fcrd\u00fcr\u00fclmesidir. Bu, sadece veritaban\u0131 ba\u011flant\u0131 dizelerini veya API anahtarlar\u0131n\u0131 i\u00e7ermez; ayn\u0131 zamanda log seviyeleri, \u00f6nbellek ayarlar\u0131, g\u00fcvenlik politikalar\u0131 ve hatta uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 ortamla ilgili spesifik ayarlar\u0131 da kapsar. \u0130yi bir konfig\u00fcrasyon y\u00f6netimi stratejisi, uygulaman\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti ederken, ayn\u0131 zamanda de\u011fi\u015fikliklerin kolayca uygulanmas\u0131n\u0131 ve geri al\u0131nmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Goose, \u00f6zellikle SQL veritabanlar\u0131 i\u00e7in \u015fema de\u011fi\u015fikliklerini y\u00f6netme konusunda \u00f6ne \u00e7\u0131kar. Migration dosyalar\u0131n\u0131 versiyonlayarak, hangi de\u011fi\u015fikliklerin hangi veritaban\u0131na uyguland\u0131\u011f\u0131n\u0131 takip etmeyi m\u00fcmk\u00fcn k\u0131lar. Bu, \u00f6zellikle birden fazla projenin ayn\u0131 veritaban\u0131n\u0131 kulland\u0131\u011f\u0131 veya her projenin kendi veritaban\u0131 \u015femas\u0131na sahip oldu\u011fu senaryolarda hayat kurtar\u0131c\u0131d\u0131r. Goose&#8217;un rol\u00fc, bu veritaban\u0131 \u015femalar\u0131n\u0131n belirli bir versiyonda olmas\u0131n\u0131 sa\u011flamakt\u0131r. Bu, uygulaman\u0131n beklenen \u015fema yap\u0131s\u0131yla uyumlu \u00e7al\u0131\u015fmas\u0131n\u0131n temelini olu\u015fturur. \u00d6rne\u011fin, bir mikroservis projesinde, birden fazla servis farkl\u0131 veritabanlar\u0131na veya ayn\u0131 veritaban\u0131n\u0131n farkl\u0131 \u015femalar\u0131na sahip olabilir. Goose, her servisin kendi gerektirdi\u011fi \u015fema de\u011fi\u015fikliklerini izlemesine ve uygulamas\u0131na olanak tan\u0131r.<\/p>\n<p>Goose&#8217;un avantajlar\u0131 aras\u0131nda basitli\u011fi, Go dilinde yaz\u0131lm\u0131\u015f olmas\u0131 nedeniyle h\u0131zl\u0131 ve g\u00fcvenilir olmas\u0131, \u00e7e\u015fitli veritabanlar\u0131n\u0131 desteklemesi (PostgreSQL, MySQL, SQLite, MSSQL vb.) ve komut sat\u0131r\u0131ndan kolayca y\u00f6netilebilir olmas\u0131 say\u0131labilir. Migration dosyalar\u0131 genellikle basit SQL betikleri (<code>.sql<\/code>) veya Go dilinde yaz\u0131lm\u0131\u015f fonksiyonlar (<code>.go<\/code>) olabilir. Bu sayede, veritaban\u0131 de\u011fi\u015fiklikleri hem s\u00fcr\u00fcm kontrol sistemlerinde (Git gibi) izlenebilir hem de CI\/CD s\u00fcre\u00e7lerine entegre edilebilir.<\/p>\n<p>Basit bir Goose konfig\u00fcrasyon \u00f6rne\u011fi, projenizin k\u00f6k dizininde bir <code>db\/migrations<\/code> klas\u00f6r\u00fc olu\u015fturmakla ba\u015flar. \u0130\u00e7ine her bir migration i\u00e7in tarih ve a\u00e7\u0131klama i\u00e7eren bir dosya ad\u0131 format\u0131nda (\u00f6rne\u011fin, <code>20231027100000_create_users_table.sql<\/code>) dosyalar yerle\u015ftirirsiniz. Her dosya, veritaban\u0131nda yap\u0131lacak de\u011fi\u015fiklikleri (UP) ve bu de\u011fi\u015fiklikleri geri almay\u0131 (DOWN) tan\u0131mlayan SQL komutlar\u0131n\u0131 i\u00e7erir. Bu yap\u0131, hem ileriye d\u00f6n\u00fck de\u011fi\u015fiklikleri hem de olas\u0131 hatalarda geri d\u00f6n\u00fc\u015fleri planlaman\u0131za yard\u0131mc\u0131 olur. B\u00f6ylece, her bir projenin veritaban\u0131 yap\u0131s\u0131, bu migration dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla y\u00f6netilebilir ve farkl\u0131 ortamlarda tutarl\u0131 bir \u015fekilde da\u011f\u0131t\u0131labilir.<\/p>\n<pre><code>\n-- 20231027100000_create_users_table.sql\n-- +goose Up\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(255) NOT NULL,\n    email VARCHAR(255) UNIQUE NOT NULL,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- +goose Down\nDROP TABLE users;\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>+goose Up<\/code> ve <code>+goose Down<\/code> direktifleri Goose'a hangi SQL komutlar\u0131n\u0131n migration'\u0131 uygulamak (yukar\u0131) ve geri almak (a\u015fa\u011f\u0131) i\u00e7in kullan\u0131laca\u011f\u0131n\u0131 s\u00f6yler. Goose'un bu basit ama etkili yap\u0131s\u0131, veritaban\u0131 \u015fema y\u00f6netimini \u00e7oklu proje ortamlar\u0131nda bile anla\u015f\u0131l\u0131r ve y\u00f6netilebilir hale getirir.<\/p>\n<h2>\u00c7oklu Projeler \u0130\u00e7in Etkin Konfig\u00fcrasyon Stratejileri Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>\u00c7oklu projelerde etkin konfig\u00fcrasyon y\u00f6netimi, tek bir \"herkese uyan tek boyut\" \u00e7\u00f6z\u00fcm\u00fcnden ziyade, projenin yap\u0131s\u0131na, boyutuna ve ekibin \u00e7al\u0131\u015fma \u015fekline g\u00f6re \u00f6zelle\u015ftirilmesi gereken bir dizi stratejinin birle\u015fimidir. Temel hedef, konfig\u00fcrasyonlar\u0131 tekrar eden g\u00f6revlerden ar\u0131nd\u0131rmak, hata oran\u0131n\u0131 d\u00fc\u015f\u00fcrmek ve farkl\u0131 ortamlar aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>Konfig\u00fcrasyonlar\u0131 S\u00fcr\u00fcm Kontrol Sistemleri ile Nas\u0131l Senkronize Ederiz?<\/h3>\n<p>Konfig\u00fcrasyon dosyalar\u0131n\u0131 s\u00fcr\u00fcm kontrol sistemleri (VCS), \u00f6zellikle Git ile senkronize etmek, \u015f\u00fcphesiz en temel ve en \u00f6nemli ad\u0131md\u0131r. Bu, konfig\u00fcrasyonlar\u0131n versiyonlanabilmesini, de\u011fi\u015fikliklerin izlenebilmesini ve gerekti\u011finde eski bir duruma geri d\u00f6n\u00fclebilmesini sa\u011flar. Monorepo (tek depo) ve Polyrepo (\u00e7oklu depo) yakla\u015f\u0131mlar\u0131, konfig\u00fcrasyonlar\u0131 VCS ile entegre etme \u015feklimizi etkiler.<\/p>\n<ul>\n<li>\n        <strong>Monorepo Yakla\u015f\u0131m\u0131:<\/strong> T\u00fcm projelerin ve onlar\u0131n konfig\u00fcrasyonlar\u0131n\u0131n tek bir Git deposunda tutuldu\u011fu durumdur. Bu, ortak konfig\u00fcrasyon dosyalar\u0131n\u0131 (\u00f6rne\u011fin, veritaban\u0131 ba\u011flant\u0131 dizelerinin \u015fablonlar\u0131, log ayarlar\u0131 gibi) merkezi bir yerde tutmay\u0131 kolayla\u015ft\u0131r\u0131r. Farkl\u0131 projeler bu ortak konfig\u00fcrasyonlar\u0131 referans alabilir ve kendi \u00f6zel ayarlar\u0131n\u0131 ayr\u0131 dosyalarda tutabilirler. Monorepo'da, \u00f6rne\u011fin <code>config\/common.yaml<\/code> veya <code>db\/goose.env.template<\/code> gibi dosyalar t\u00fcm projeler taraf\u0131ndan payla\u015f\u0131labilirken, her projenin kendi dizininde (<code>projects\/service-a\/config\/development.yaml<\/code>) o projeye \u00f6zg\u00fc ayarlar bulunabilir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Monorepo kullan\u0131rken, Git submod\u00fclleri veya Git alt a\u011fa\u00e7lar\u0131n\u0131 kullanarak baz\u0131 ortak konfig\u00fcrasyonlar\u0131 ayr\u0131 depolardan \u00e7ekmeyi d\u00fc\u015f\u00fcnebilirsiniz. Bu, mod\u00fclerli\u011fi art\u0131r\u0131rken, tek bir depodaki karma\u015f\u0131kl\u0131\u011f\u0131 azaltabilir.<\/div>\n<\/li>\n<li>\n        <strong>Polyrepo Yakla\u015f\u0131m\u0131:<\/strong> Her projenin kendi Git deposuna sahip oldu\u011fu durumdur. Bu senaryoda ortak konfig\u00fcrasyon y\u00f6netimi biraz daha zorlu olabilir. Ortak konfig\u00fcrasyonlar i\u00e7in ayr\u0131 bir \"konfig\u00fcrasyon deposu\" olu\u015fturmak veya bir konfig\u00fcrasyon y\u00f6netim arac\u0131 (HashiCorp Vault, Consul, AWS Parameter Store gibi) kullanmak daha uygun olabilir. Ancak Goose \u00f6zelinde, her projenin kendi veritaban\u0131 migration'lar\u0131n\u0131 ve ba\u011flant\u0131 konfig\u00fcrasyonlar\u0131n\u0131 kendi deposunda tutmas\u0131 en yayg\u0131n yakla\u015f\u0131md\u0131r.\n    <\/li>\n<\/ul>\n<p><strong>Ortak Konfig\u00fcrasyon Dosyalar\u0131 ve Ortam De\u011fi\u015fkenleri:<\/strong> Her iki yakla\u015f\u0131mda da, konfig\u00fcrasyonlar\u0131 y\u00f6netmenin en iyi yollar\u0131ndan biri, ortam de\u011fi\u015fkenlerini (environment variables) kullanmakt\u0131r. Hassas bilgiler (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) do\u011frudan kodda veya konfig\u00fcrasyon dosyalar\u0131nda tutulmamal\u0131d\u0131r. Bunun yerine, bu de\u011ferler ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla uygulamaya sa\u011flanmal\u0131d\u0131r. Goose gibi ara\u00e7lar, genellikle kendi konfig\u00fcrasyon dosyalar\u0131nda (\u00f6rne\u011fin <code>goose.env<\/code>) ortam de\u011fi\u015fkenlerine referans verebilir veya do\u011frudan komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 olarak al\u0131nabilir.<\/p>\n<p>\u00d6rne\u011fin, bir <code>.env<\/code> dosyas\u0131 \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\nDB_HOST=localhost\nDB_PORT=5432\nDB_USER=goose_user\nDB_PASSWORD=supersecret\nDB_NAME=my_application_db\nGOOSE_DRIVER=postgres\nGOOSE_DBSTRING=\"host=${DB_HOST} port=${DB_PORT} user=${DB_USER} password=${DB_PASSWORD} dbname=${DB_NAME} sslmode=disable\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu dosya genellikle <code>.gitignore<\/code>'a eklenerek s\u00fcr\u00fcm kontrol\u00fcne dahil edilmez, ancak bir \u015fablonu (<code>.env.template<\/code>) depoda tutularak geli\u015ftiricilere rehberlik edilebilir. Uygulama ise bu ortam de\u011fi\u015fkenlerini okuyarak \u00e7al\u0131\u015f\u0131r. Bu yakla\u015f\u0131m, g\u00fcvenlik risklerini azalt\u0131r ve farkl\u0131 ortamlar i\u00e7in kolayca farkl\u0131 de\u011ferler sa\u011flamaya olanak tan\u0131r.<\/p>\n<pre><code>\n# .gitignore\n.env\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Proje Bazl\u0131 \u00d6zelle\u015ftirmeler:<\/strong> Her projenin kendine \u00f6zg\u00fc ihtiya\u00e7lar\u0131 olacakt\u0131r. Bu nedenle, ortak konfig\u00fcrasyonlar\u0131n yan\u0131 s\u0131ra, her projenin kendi \u00f6zel ayarlar\u0131n\u0131 bar\u0131nd\u0131racak bir mekanizmaya sahip olmas\u0131 \u00f6nemlidir. Bu, projenin kendi dizininde bir <code>config.yaml<\/code> veya <code>settings.json<\/code> dosyas\u0131 olabilir. Goose i\u00e7in ise, her projenin kendi migration dosyalar\u0131n\u0131 (<code>db\/migrations<\/code> alt\u0131nda) ve kendi <code>goose.env<\/code> veya benzeri ba\u011flant\u0131 ayarlar\u0131n\u0131 bulundurmas\u0131 beklenir. Bu sayede, bir projenin veritaban\u0131 \u015femas\u0131 veya ba\u011flant\u0131 ayarlar\u0131 di\u011fer projeleri etkilemez.<\/p>\n<h3>Vaka Analizi: B\u00fcy\u00fck Bir E-ticaret \u015eirketinin \u00c7oklu Mikroservis Projesinde Goose Konfig\u00fcrasyon Y\u00f6netimi<\/h3>\n<p>Hayali bir e-ticaret \u015firketi olan \"TrendSepet\", \u00fcr\u00fcn y\u00f6netimi, sipari\u015f i\u015fleme, kullan\u0131c\u0131 hesaplar\u0131 ve \u00f6deme gibi farkl\u0131 fonksiyonlar i\u00e7in yakla\u015f\u0131k 20 mikroservis kullanmaktad\u0131r. Her mikroservisin kendi veritaban\u0131 (PostgreSQL veya MongoDB) ve bu veritabanlar\u0131na \u00f6zg\u00fc \u015fema de\u011fi\u015fiklikleri (migration'lar) vard\u0131r. Ayr\u0131ca, her servisin kendi API anahtarlar\u0131, \u00fc\u00e7\u00fcnc\u00fc taraf servis entegrasyon ayarlar\u0131 ve \u00f6nbellekleme konfig\u00fcrasyonlar\u0131 bulunmaktad\u0131r. TrendSepet ba\u015flang\u0131\u00e7ta her servisin konfig\u00fcrasyonlar\u0131n\u0131 manuel olarak y\u00f6netiyordu, bu da s\u0131k s\u0131k yanl\u0131\u015f migration uygulamalar\u0131na, yanl\u0131\u015f ortam de\u011fi\u015fkeni ayarlar\u0131na ve da\u011f\u0131t\u0131m hatalar\u0131na yol a\u00e7\u0131yordu.<\/p>\n<p>Bu karma\u015f\u0131kl\u0131kla ba\u015fa \u00e7\u0131kmak i\u00e7in TrendSepet, a\u015fa\u011f\u0131daki stratejileri benimsedi:<\/p>\n<ol>\n<li>\n        <strong>Standartla\u015ft\u0131r\u0131lm\u0131\u015f Goose Kullan\u0131m\u0131:<\/strong> Her mikroservis projesinde veritaban\u0131 migration'lar\u0131 i\u00e7in Goose kullan\u0131lmas\u0131 zorunlu hale getirildi. Her projenin kendi <code>db\/migrations<\/code> klas\u00f6r\u00fc ve <code>goose.yaml<\/code> (veya <code>goose.env<\/code>) dosyas\u0131 vard\u0131. Bu dosyalar, Git s\u00fcr\u00fcm kontrol\u00fcne dahil edildi.\n    <\/li>\n<li>\n        <strong>Ortam De\u011fi\u015fkeni Entegrasyonu:<\/strong> T\u00fcm hassas konfig\u00fcrasyonlar (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) do\u011frudan kodda tutulmak yerine Kubernetes Secrets ve CI\/CD ortam de\u011fi\u015fkenleri olarak sakland\u0131. Goose'un veritaban\u0131 ba\u011flant\u0131 dizeleri de bu ortam de\u011fi\u015fkenleri \u00fczerinden dinamik olarak olu\u015fturuldu.\n    <\/li>\n<li>\n        <strong>CI\/CD Otomasyonu:<\/strong> Her mikroservisin da\u011f\u0131t\u0131m pipeline'\u0131na, \u00f6nce Goose migration'lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131ran otomatik bir ad\u0131m eklendi. Bu ad\u0131m, uygulaman\u0131n da\u011f\u0131t\u0131laca\u011f\u0131 ortam\u0131n (dev, staging, production) veritaban\u0131 konfig\u00fcrasyonlar\u0131n\u0131 kullanarak ilgili migration'lar\u0131 uyguluyordu. Bu, \"uygulama ba\u015flamadan \u00f6nce veritaban\u0131 haz\u0131r olmal\u0131\" prensibini g\u00fcvence alt\u0131na ald\u0131.\n    <\/li>\n<li>\n        <strong>Ortak Konfig\u00fcrasyon \u015eablonlar\u0131:<\/strong> Baz\u0131 genel ayarlar (\u00f6rne\u011fin, log formatlar\u0131, temel g\u00fcvenlik ayarlar\u0131) i\u00e7in bir \"ortak konfig\u00fcrasyon deposu\" olu\u015fturuldu. Her servis bu depodan \u015fablonlar\u0131 \u00e7ekebilir ve kendi \u00f6zel ayarlar\u0131yla birle\u015ftirebilirdi. Bu, geli\u015ftiricilerin yeni bir servis olu\u015ftururken h\u0131zl\u0131 ba\u015flang\u0131\u00e7 yapmas\u0131n\u0131 sa\u011flad\u0131.\n    <\/li>\n<li>\n        <strong>Geri Alma Stratejileri:<\/strong> Goose'un <code>down<\/code> komutu sayesinde, bir migration hatas\u0131nda h\u0131zl\u0131ca geri d\u00f6nme yetene\u011fi kazan\u0131ld\u0131. Bu da da\u011f\u0131t\u0131m riskini \u00f6nemli \u00f6l\u00e7\u00fcde azaltt\u0131.\n    <\/li>\n<\/ol>\n<p>Bu stratejiler sayesinde TrendSepet, da\u011f\u0131t\u0131m hatalar\u0131n\u0131 %70 oran\u0131nda azaltt\u0131, geli\u015ftirme d\u00f6ng\u00fclerini h\u0131zland\u0131rd\u0131 ve operasyonel maliyetlerini d\u00fc\u015f\u00fcrd\u00fc. Geli\u015ftiriciler art\u0131k konfig\u00fcrasyon sorunlar\u0131yla daha az vakit harc\u0131yor ve ana i\u015flerine odaklanabiliyordu. Bu vaka analizi, Goose'un sadece bir migration arac\u0131 olman\u0131n \u00f6tesinde, \u00e7oklu proje ortamlar\u0131nda kritik bir konfig\u00fcrasyon y\u00f6netim arac\u0131 olarak nas\u0131l konumland\u0131r\u0131labilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<h2>CI\/CD S\u00fcre\u00e7lerine Goose Konfig\u00fcrasyonlar\u0131n\u0131 Entegre Etmek Ne Gibi Avantajlar Sa\u011flar?<\/h2>\n<p>S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) s\u00fcre\u00e7leri, modern yaz\u0131l\u0131m geli\u015ftirmenin omurgas\u0131n\u0131 olu\u015fturur. Bu s\u00fcre\u00e7lere Goose konfig\u00fcrasyonlar\u0131n\u0131 entegre etmek, manuel hatalar\u0131 ortadan kald\u0131r\u0131r, da\u011f\u0131t\u0131m s\u00fcrelerini k\u0131salt\u0131r ve en \u00f6nemlisi, farkl\u0131 ortamlar aras\u0131nda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131l\u0131\u011f\u0131 garanti eder. Otomatik da\u011f\u0131t\u0131m, uygulaman\u0131n kod taban\u0131 de\u011fi\u015fti\u011finde, ilgili veritaban\u0131 \u015femas\u0131n\u0131n da otomatik olarak g\u00fcncellenmesini sa\u011flar. Bu, \"geli\u015ftirme ortam\u0131nda \u00e7al\u0131\u015f\u0131yor, \u00fcretimde \u00e7al\u0131\u015fm\u0131yor\" t\u00fcr\u00fcndeki klasik sorunlar\u0131n \u00f6n\u00fcne ge\u00e7er.<\/p>\n<p>Dev, Test, Prod ortamlar\u0131 i\u00e7in farkl\u0131 konfig\u00fcrasyonlar sa\u011flamak, CI\/CD pipeline'\u0131n\u0131z\u0131n ana g\u00f6revlerinden biridir. Her ortam\u0131n kendi veritaban\u0131 ba\u011flant\u0131 dizeleri, performans ayarlar\u0131 veya g\u00fcvenlik protokolleri olabilir. CI\/CD ara\u00e7lar\u0131 (GitHub Actions, GitLab CI, Jenkins, Azure DevOps vb.) bu farkl\u0131l\u0131klar\u0131 ortam de\u011fi\u015fkenleri, s\u0131rlar (secrets) veya \u00f6zel konfig\u00fcrasyon dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla y\u00f6netmenize olanak tan\u0131r. \u00d6rne\u011fin, bir GitHub Actions i\u015f ak\u0131\u015f\u0131nda, \u00fcretim ortam\u0131 i\u00e7in farkl\u0131 bir veritaban\u0131 ba\u011flant\u0131 dizesi veya farkl\u0131 bir Goose komutu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<p>\u00d6rnek bir GitHub Actions ad\u0131m\u0131, bir Go uygulamas\u0131n\u0131n derlenmesi ve ard\u0131ndan Goose migration'lar\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 i\u00e7in \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\nname: CI\/CD Pipeline for My Go App\n\non:\n  push:\n    branches:\n      - main\n      - develop\n\nenv:\n  # Ortak ortam de\u011fi\u015fkenleri\n  GOOSE_DRIVER: postgres\n\njobs:\n  build_and_deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions\/checkout@v3\n\n      - name: Setup Go\n        uses: actions\/setup-go@v4\n        with:\n          go-version: '1.21'\n\n      - name: Build application\n        run: go build -o myapp .\/cmd\/app\n\n      - name: Determine environment\n        id: environment\n        run: |\n          if [ \"${{ github.ref }}\" == \"refs\/heads\/main\" ]; then\n            echo \"ENV=production\" >> $GITHUB_ENV\n            echo \"DB_CONNECTION_STRING=${{ secrets.PROD_DB_CONNECTION_STRING }}\" >> $GITHUB_ENV\n          elif [ \"${{ github.ref }}\" == \"refs\/heads\/develop\" ]; then\n            echo \"ENV=development\" >> $GITHUB_ENV\n            echo \"DB_CONNECTION_STRING=${{ secrets.DEV_DB_CONNECTION_STRING }}\" >> $GITHUB_ENV\n          else\n            echo \"ENV=test\" >> $GITHUB_ENV\n            echo \"DB_CONNECTION_STRING=${{ secrets.TEST_DB_CONNECTION_STRING }}\" >> $GITHUB_ENV\n          fi\n\n      - name: Run Goose Migrations\n        run: |\n          # Goose kurulu oldu\u011fundan emin olun veya kurun\n          go install github.com\/pressly\/goose\/v3\/cmd\/goose@latest\n          goose -dir .\/db\/migrations ${{ env.GOOSE_DRIVER }} \"${{ env.DB_CONNECTION_STRING }}\" up\n        env:\n          # Ortam de\u011fi\u015fkenleri yukar\u0131da set edildi\u011fi i\u00e7in burada tekrar tan\u0131mlamaya gerek yok\n          # Ancak \u00f6zel bir durum varsa burada override edilebilir\n          # GOOSE_DBSTRING: ${{ env.DB_CONNECTION_STRING }} # Bu \u015fekilde de kullan\u0131labilir\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, GitHub Actions'\u0131n <code>secrets<\/code> \u00f6zelli\u011fi kullan\u0131larak hassas veritaban\u0131 ba\u011flant\u0131 dizeleri g\u00fcvenli bir \u015fekilde sa\u011flanm\u0131\u015ft\u0131r. Pipeline, hangi dal\u0131n (main, develop) tetiklendi\u011fine g\u00f6re farkl\u0131 ortam de\u011fi\u015fkenleri ayarlar ve bu sayede Goose do\u011fru veritaban\u0131na ba\u011flan\u0131p migration'lar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r. Bu yakla\u015f\u0131m, manuel yap\u0131land\u0131rma hatalar\u0131n\u0131 minimize eder ve da\u011f\u0131t\u0131m s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: CI\/CD pipeline'\u0131n\u0131zda Goose migration'lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce, bir \"dry run\" (deneme \u00e7al\u0131\u015ft\u0131rma) ad\u0131m\u0131 eklemek faydal\u0131 olabilir. Bu, \u00fcretim ortam\u0131na ger\u00e7ek de\u011fi\u015fiklikleri uygulamadan \u00f6nce olas\u0131 hatalar\u0131 tespit etmenizi sa\u011flar. Baz\u0131 migration ara\u00e7lar\u0131 veya \u00f6zel betikler bu t\u00fcr bir \u00f6zelli\u011fi destekleyebilir.<\/div>\n<h3>Karma\u015f\u0131k Ortamlar \u0130\u00e7in \u0130leri D\u00fczey Konfig\u00fcrasyon Teknikleri Nelerdir?<\/h3>\n<p>Mikroservisler ve bulut yerel (cloud-native) uygulamalar\u0131n y\u00fckseli\u015fiyle birlikte, konfig\u00fcrasyon y\u00f6netimi daha da karma\u015f\u0131k hale gelmi\u015ftir. Goose'u bu modern altyap\u0131larla entegre etmek, konfig\u00fcrasyon y\u00f6netimini daha sa\u011flam ve \u00f6l\u00e7eklenebilir hale getirebilir.<\/p>\n<ul>\n<li>\n        <strong>Kubernetes ConfigMaps ve Secrets ile Entegrasyon:<\/strong> Kubernetes ortam\u0131nda \u00e7al\u0131\u015fan uygulamalar i\u00e7in ConfigMaps, hassas olmayan konfig\u00fcrasyon verilerini (uygulama ayarlar\u0131, log seviyeleri) depolamak ve y\u00f6netmek i\u00e7in kullan\u0131l\u0131rken, Secrets ise hassas verileri (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) g\u00fcvenli bir \u015fekilde saklamak i\u00e7in idealdir. Goose migration'lar\u0131 genellikle CI\/CD pipeline'\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, bu pipeline'\u0131n Kubernetes Secrets'a eri\u015fim yetkisi olmal\u0131 ve veritaban\u0131 ba\u011flant\u0131 dizesini buradan alabilmelidir.<\/p>\n<pre><code>\n        apiVersion: v1\n        kind: Secret\n        metadata:\n          name: myapp-db-secret\n        type: Opaque\n        data:\n          DB_PASSWORD: bXlwYXNzd29yZA== # \"mypassword\" base64 encode edilmi\u015f hali\n        ---\n        apiVersion: v1\n        kind: ConfigMap\n        metadata:\n          name: myapp-config\n        data:\n          DB_HOST: \"my-db-service\"\n          DB_PORT: \"5432\"\n          DB_USER: \"myapp_user\"\n          DB_NAME: \"myapp_db\"\n        <\/pre>\n<p><\/code><br \/>\n        Bu ConfigMap ve Secret'lar\u0131 bir pod'a ba\u011flayarak, Goose komutunu \u00e7al\u0131\u015ft\u0131racak konteynerin bu bilgilere ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla eri\u015fmesini sa\u011flayabilirsiniz.\n    <\/li>\n<li>\n        <strong>Helm Charts ve Goose:<\/strong> Helm, Kubernetes uygulamalar\u0131n\u0131 paketlemek ve da\u011f\u0131tmak i\u00e7in bir ara\u00e7t\u0131r. Bir Helm Chart, uygulaman\u0131z\u0131n t\u00fcm Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, Ingress vb.) ve konfig\u00fcrasyonlar\u0131n\u0131 (ConfigMaps, Secrets) tek bir pakette birle\u015ftirir. Goose migration'lar\u0131n\u0131 Helm Chart'\u0131n\u0131z\u0131n bir par\u00e7as\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, uygulaman\u0131n da\u011f\u0131t\u0131m\u0131n\u0131n bir par\u00e7as\u0131 olarak veritaban\u0131 \u015femas\u0131n\u0131n da otomatik olarak g\u00fcncellenmesini sa\u011flar. Bu genellikle bir Helm <code>pre-install<\/code> veya <code>pre-upgrade<\/code> kancas\u0131 (hook) kullan\u0131larak yap\u0131l\u0131r, b\u00f6ylece uygulama pod'lar\u0131 ba\u015flat\u0131lmadan \u00f6nce migration'lar tamamlanm\u0131\u015f olur.<\/p>\n<pre><code>\n        # templates\/goose-migration-job.yaml\n        apiVersion: batch\/v1\n        kind: Job\n        metadata:\n          name: {{ include \"myapp.fullname\" . }}-goose-migration\n          annotations:\n            \"helm.sh\/hook\": pre-install,pre-upgrade\n            \"helm.sh\/hook-delete-policy\": before-hook-creation,hook-succeeded\n          labels:\n            {{- include \"myapp.labels\" . | nindent 4 }}\n        spec:\n          template:\n            metadata:\n              labels:\n                {{- include \"myapp.selectorLabels\" . | nindent 6 }}\n            spec:\n              restartPolicy: OnFailure\n              containers:\n                - name: goose-migrator\n                  image: \"goose\/goose-image:latest\" # Goose ve veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc i\u00e7eren bir image\n                  imagePullPolicy: {{ .Values.image.pullPolicy }}\n                  env:\n                    - name: GOOSE_DRIVER\n                      value: postgres\n                    - name: GOOSE_DBSTRING\n                      valueFrom:\n                        secretKeyRef:\n                          name: myapp-db-secret\n                          key: DB_CONNECTION_STRING # Ya da ConfigMap ve Secret birle\u015fimi\n                  command: [\"goose\", \"-dir\", \"\/migrations\", \"up\"] # Goose migration'lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\n        <\/pre>\n<p><\/code><br \/>\n        Bu \u00f6rnek, Helm'in nas\u0131l Goose migration'lar\u0131n\u0131 bir da\u011f\u0131t\u0131m \u00f6ncesi ad\u0131m olarak \u00e7al\u0131\u015ft\u0131rabilece\u011fini g\u00f6stermektedir.\n    <\/li>\n<li>\n        <strong>Uygulama Bazl\u0131 \u00d6zelle\u015ftirme Stratejileri:<\/strong> Bazen, konfig\u00fcrasyonlar sadece ortam baz\u0131nda de\u011fil, ayn\u0131 zamanda uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 b\u00f6lgeye, m\u00fc\u015fteriye veya belirli bir A\/B test grubuna g\u00f6re de farkl\u0131l\u0131k g\u00f6sterebilir. Bu gibi senaryolarda, merkezi bir konfig\u00fcrasyon sunucusu (\u00f6rne\u011fin, Spring Cloud Config Server, HashiCorp Consul\/Vault) veya \u00f6zellik bayraklar\u0131 (feature flags) y\u00f6netimi ara\u00e7lar\u0131 (LaunchDarkly, Split.io) kullan\u0131labilir. Goose \u00f6zelinde, migration'lar genellikle daha statik oldu\u011fundan, bu t\u00fcr dinamik \u00f6zelle\u015ftirmeler daha \u00e7ok uygulama i\u00e7i kod konfig\u00fcrasyonlar\u0131 i\u00e7in ge\u00e7erli olur.\n    <\/li>\n<li>\n        <strong>Infrastructure as Code (IaC) ve Goose:<\/strong> Terraform, Ansible gibi IaC ara\u00e7lar\u0131, altyap\u0131y\u0131 kod olarak tan\u0131mlaman\u0131za olanak tan\u0131r. Veritabanlar\u0131n\u0131n (veya Kubernetes k\u00fcmelerinin) IaC ile olu\u015fturulmas\u0131 ve ard\u0131ndan Goose migration'lar\u0131n\u0131n bu altyap\u0131ya uygulanmas\u0131, u\u00e7tan uca otomatize bir da\u011f\u0131t\u0131m zinciri olu\u015fturur. Bu yakla\u015f\u0131m, \"altyap\u0131n\u0131n kendisi de bir konfig\u00fcrasyondur\" felsefesini destekler ve t\u00fcm sistemin tutarl\u0131 bir \u015fekilde kurulmas\u0131n\u0131 ve y\u00f6netilmesini sa\u011flar.\n    <\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey teknikler, \u00e7oklu proje ve karma\u015f\u0131k bulut ortamlar\u0131nda Goose konfig\u00fcrasyon y\u00f6netimini daha g\u00fc\u00e7l\u00fc, g\u00fcvenilir ve otomatize hale getirerek, ekiplerin daha h\u0131zl\u0131 ve daha az hatayla da\u011f\u0131t\u0131m yapmas\u0131n\u0131 sa\u011flar. S\u00fcrekli entegrasyon ve da\u011f\u0131t\u0131m\u0131n temelini olu\u015ftururlar.<\/p>\n<p>Mobil uyumlu HTML'e dair bir medya sorgusu \u00f6rne\u011fi a\u015fa\u011f\u0131dad\u0131r. Her ne kadar konfig\u00fcrasyon y\u00f6netimi ile do\u011frudan alakal\u0131 olmasa da, bu t\u00fcr teknik makalelerde web sayfalar\u0131n\u0131n farkl\u0131 cihazlarda d\u00fczg\u00fcn g\u00f6r\u00fcnt\u00fclenmesi \u00f6nemlidir:<\/p>\n<pre><code>\n<style>\n  \/* Varsay\u0131lan stil: B\u00fcy\u00fck ekranlar i\u00e7in *\/\n  .container {\n    width: 960px;\n    margin: 0 auto;\n    padding: 20px;\n  }\n\n  \/* Mobil cihazlar i\u00e7in medya sorgusu *\/\n  @media (max-width: 768px) {\n    .container {\n      width: 100%;\n      padding: 10px;\n    }\n    h2 {\n      font-size: 1.5em;\n    }\n    h3 {\n      font-size: 1.2em;\n    }\n  }\n<\/style>\n<\/pre>\n<p><\/code><\/p>\n<h2>Yayg\u0131n Hatalardan Ka\u00e7\u0131nmak: En \u0130yi Uygulamalar ve P\u00fcf Noktalar\u0131 Nelerdir?<\/h2>\n<p>\u00c7oklu projelerde Goose konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netirken kar\u015f\u0131la\u015f\u0131labilecek bir\u00e7ok tuzak vard\u0131r. Bu tuzaklardan ka\u00e7\u0131nmak ve sorunsuz bir i\u015f ak\u0131\u015f\u0131 sa\u011flamak i\u00e7in belirli en iyi uygulamalar\u0131 benimsemek kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcm, geli\u015ftirme ve operasyon ekiplerinin yayg\u0131n hatalar\u0131 \u00f6nlemesine yard\u0131mc\u0131 olacak ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131 sunmaktad\u0131r.<\/p>\n<ul>\n<li>\n        <strong>Hassas Bilgilerin G\u00fcvenli\u011fi: Asla Sabit Kodlamay\u0131n!<\/strong><\/p>\n<p>Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131, g\u00fcvenlik token'lar\u0131 gibi hassas bilgiler asla do\u011frudan konfig\u00fcrasyon dosyalar\u0131na veya kaynak koduna sabit kodlanmamal\u0131d\u0131r. Bu, en temel ve en s\u0131k yap\u0131lan g\u00fcvenlik hatalar\u0131ndan biridir. Bunun yerine, bu bilgiler ortam de\u011fi\u015fkenleri, Kubernetes Secrets, HashiCorp Vault veya AWS Parameter Store\/Secrets Manager gibi g\u00fcvenli depolama \u00e7\u00f6z\u00fcmleri arac\u0131l\u0131\u011f\u0131yla sa\u011flanmal\u0131d\u0131r. Bu sayede, hassas veriler s\u00fcr\u00fcm kontrol\u00fcne dahil edilmez ve farkl\u0131 ortamlara \u00f6zel olarak y\u00f6netilebilir. Goose komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131rken de bu ortam de\u011fi\u015fkenlerini kullanmay\u0131 unutmay\u0131n.<\/p>\n<pre><code>\n        # Yanl\u0131\u015f Uygulama (DB \u015eifresi do\u011frudan kodda)\n        # dbString := \"host=localhost port=5432 user=myuser password=hardcodedpass dbname=mydb sslmode=disable\"\n\n        # Do\u011fru Uygulama (Ortam de\u011fi\u015fkenleri kullan\u0131larak)\n        dbHost := os.Getenv(\"DB_HOST\")\n        dbPort := os.Getenv(\"DB_PORT\")\n        dbUser := os.Getenv(\"DB_USER\")\n        dbPassword := os.Getenv(\"DB_PASSWORD\")\n        dbName := os.Getenv(\"DB_NAME\")\n        dbString := fmt.Sprintf(\"host=%s port=%s user=%s password=%s dbname=%s sslmode=disable\", dbHost, dbPort, dbUser, dbPassword, dbName)\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Konfig\u00fcrasyon Dosyalar\u0131n\u0131n Test Edilebilirli\u011fi:<\/strong><\/p>\n<p>Migration dosyalar\u0131 da dahil olmak \u00fczere konfig\u00fcrasyonlar, uygulaman\u0131n kendisi kadar test edilebilir olmal\u0131d\u0131r. Her bir migration dosyas\u0131n\u0131n hem <code>Up<\/code> hem de <code>Down<\/code> i\u015flemlerinin beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in otomatik testler yazmak iyi bir uygulamad\u0131r. Bu, \u00f6zellikle karma\u015f\u0131k \u015fema de\u011fi\u015fikliklerinde veya b\u00fcy\u00fck ekiplerle \u00e7al\u0131\u015f\u0131rken olas\u0131 regresyonlar\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. CI\/CD pipeline'\u0131n\u0131za, migration'lar\u0131 ge\u00e7ici bir veritaban\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131p do\u011frulu\u011funu kontrol eden bir ad\u0131m ekleyebilirsiniz.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Test ortam\u0131nda, her da\u011f\u0131t\u0131mdan \u00f6nce veya sonra bir \"schema dump\" alarak ve bunu \u00f6nceki sa\u011fl\u0131kl\u0131 bir \"dump\" ile kar\u015f\u0131la\u015ft\u0131rarak \u015fema uyumsuzluklar\u0131n\u0131 otomatik olarak tespit edebilirsiniz.<\/div>\n<\/li>\n<li>\n        <strong>Dok\u00fcmantasyonun \u00d6nemi: Kim Ne Yapt\u0131, Neden Yapt\u0131?<\/strong><\/p>\n<p>\u00c7oklu projelerde konfig\u00fcrasyonlar zamanla karma\u015f\u0131kla\u015fabilir. Her bir konfig\u00fcrasyon de\u011fi\u015fikli\u011finin (\u00f6zellikle migration'lar\u0131n) neden yap\u0131ld\u0131\u011f\u0131n\u0131, hangi projeyi etkiledi\u011fini ve ne gibi sonu\u00e7lar\u0131 olabilece\u011fini a\u00e7\u0131k\u00e7a belgelemek \u00e7ok \u00f6nemlidir. Bu, yeni ekip \u00fcyelerinin sistemi anlamas\u0131na yard\u0131mc\u0131 olur, sorun gidermeyi kolayla\u015ft\u0131r\u0131r ve gelecekteki de\u011fi\u015fikliklerin olas\u0131 etkilerini tahmin etmeyi sa\u011flar. Goose migration dosyalar\u0131na yorumlar ekleyebilir, ayr\u0131ca projenin genel dok\u00fcmantasyonunda (README.md, Confluence sayfas\u0131 vb.) konfig\u00fcrasyon stratejisini a\u00e7\u0131klayabilirsiniz.<\/p>\n<\/li>\n<li>\n        <strong>DevOps K\u00fclt\u00fcr\u00fc ile Entegrasyon: Geli\u015ftirici ve Operasyon \u0130\u015fbirli\u011fi.<\/strong><\/p>\n<p>Konfig\u00fcrasyon y\u00f6netimi, sadece geli\u015ftiricilerin veya sadece operasyon ekiplerinin sorumlulu\u011fu de\u011fildir. Ba\u015far\u0131l\u0131 bir \u00e7oklu proje konfig\u00fcrasyon y\u00f6netimi i\u00e7in geli\u015ftirme ve operasyon ekipleri aras\u0131nda g\u00fc\u00e7l\u00fc bir i\u015fbirli\u011fi \u015fartt\u0131r. Geli\u015ftiricilerin konfig\u00fcrasyonlar\u0131n nas\u0131l y\u00f6netildi\u011fini anlamas\u0131, operasyon ekiplerinin ise uygulama gereksinimlerini bilmesi \u00f6nemlidir. D\u00fczenli ileti\u015fim, ortak ara\u00e7lar\u0131n kullan\u0131m\u0131 ve bilgi payla\u015f\u0131m\u0131 bu entegrasyonu g\u00fc\u00e7lendirecektir. \u00d6rne\u011fin, Goose migration'lar\u0131 yazarken, operasyon ekibinin geri bildirimleri, \u00fcretim ortam\u0131ndaki performans veya g\u00fcvenlik etkileri a\u00e7\u0131s\u0131ndan \u00e7ok de\u011ferli olabilir.<\/p>\n<\/li>\n<li>\n        <strong>Idempotency Prensibi: Tekrar \u00c7al\u0131\u015fsa da Sonu\u00e7 Ayn\u0131 Olmal\u0131.<\/strong><\/p>\n<p>Goose migration'lar\u0131n\u0131z\u0131 yazarken, onlar\u0131n idempotent (tekrarlanabilir) olmas\u0131n\u0131 sa\u011flamak \u00f6nemlidir. Yani, bir migration'\u0131 birden fazla kez \u00e7al\u0131\u015ft\u0131rsan\u0131z bile, sistemde ayn\u0131 nihai durumu elde etmelisiniz. \u00d6rne\u011fin, <code>CREATE TABLE IF NOT EXISTS<\/code> gibi SQL komutlar\u0131 kullanarak, tablo zaten varsa hata vermesini engelleyebilirsiniz. Bu, CI\/CD pipeline'lar\u0131nda veya acil durumlarda migration'lar\u0131 tekrar \u00e7al\u0131\u015ft\u0131rman\u0131z gerekti\u011finde sorun ya\u015fanmamas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n        -- Do\u011fru Uygulama (Idempotent CREATE TABLE)\n        -- +goose Up\n        CREATE TABLE IF NOT EXISTS products (\n            id SERIAL PRIMARY KEY,\n            name VARCHAR(255) NOT NULL UNIQUE\n        );\n\n        -- +goose Down\n        DROP TABLE IF EXISTS products;\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Versiyon Kontrol ve Dallanma Stratejileri:<\/strong><\/p>\n<p>Konfig\u00fcrasyon dosyalar\u0131n\u0131 (\u00f6zellikle Goose migration'lar\u0131n\u0131) Git gibi bir s\u00fcr\u00fcm kontrol sisteminde y\u00f6netmek esast\u0131r. Hangi dalda hangi migration'lar\u0131n oldu\u011funu a\u00e7\u0131k\u00e7a belirleyen bir dallanma stratejisi (\u00f6rne\u011fin Git Flow veya Trunk Based Development) benimsemek, farkl\u0131 ortamlara da\u011f\u0131t\u0131lacak konfig\u00fcrasyonlar\u0131n kar\u0131\u015fmas\u0131n\u0131 \u00f6nler. \u00d6rne\u011fin, ana (main) dalda sadece \u00fcretime haz\u0131r migration'lar bulunurken, geli\u015ftirme (develop) dal\u0131nda daha yeni ve hen\u00fcz test a\u015famas\u0131ndaki migration'lar olabilir.<\/p>\n<\/li>\n<\/ul>\n<p>Bu en iyi uygulamalar\u0131 takip ederek, \u00e7oklu projelerdeki konfig\u00fcrasyon y\u00f6netimi s\u00fcre\u00e7lerinizi \u00f6nemli \u00f6l\u00e7\u00fcde g\u00fc\u00e7lendirebilir, hatalar\u0131 azaltabilir ve ekiplerinizin daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Unutmay\u0131n ki, iyi y\u00f6netilen konfig\u00fcrasyonlar, uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131 ve g\u00fcvenli\u011fi i\u00e7in temel bir bile\u015fendir.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fin Konfig\u00fcrasyon Y\u00f6netimi Yakla\u015f\u0131mlar\u0131 Neler Olacak?<\/h2>\n<p>Bu makalede, \u00e7oklu proje ortamlar\u0131nda Goose kullanarak veritaban\u0131 migration'lar\u0131n\u0131 ve dolay\u0131s\u0131yla genel konfig\u00fcrasyon y\u00f6netimini nas\u0131l etkin bir \u015fekilde y\u00fcr\u00fctebilece\u011fimizi detayl\u0131 bir \u015fekilde inceledik. Ba\u015flang\u0131\u00e7ta konfig\u00fcrasyon y\u00f6netiminin zorluklar\u0131n\u0131 ele ald\u0131k ve Goose'un bu karma\u015f\u0131kl\u0131\u011f\u0131 nas\u0131l basitle\u015ftirdi\u011fini temel kavramlarla a\u00e7\u0131klad\u0131k. Ard\u0131ndan, monorepo ve polyrepo yakla\u015f\u0131mlar\u0131, ortam de\u011fi\u015fkenleri ve s\u00fcr\u00fcm kontrol entegrasyonu gibi etkin stratejiler \u00fczerinde durduk. Ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 ele alan vaka analizleri ile bu stratejilerin pratikteki de\u011ferini g\u00f6sterdik. CI\/CD s\u00fcre\u00e7lerine entegrasyonun sa\u011flad\u0131\u011f\u0131 avantajlar\u0131 ve Kubernetes ConfigMaps, Helm Charts gibi ileri d\u00fczey teknikleri ele alarak, modern bulut altyap\u0131lar\u0131nda Goose'un nas\u0131l kullan\u0131labilece\u011fini ortaya koyduk. Son olarak, hassas veri g\u00fcvenli\u011fi, test edilebilirlik, dok\u00fcmantasyon ve DevOps k\u00fclt\u00fcr\u00fc gibi yayg\u0131n hatalardan ka\u00e7\u0131nmak i\u00e7in en iyi uygulamalar\u0131 ve p\u00fcf noktalar\u0131n\u0131 payla\u015ft\u0131k.<\/p>\n<p>Gelecekte, konfig\u00fcrasyon y\u00f6netimi daha da ak\u0131ll\u0131 ve otonom hale gelecektir. Makine \u00f6\u011frenimi destekli sistemler, anormallikleri tespit ederek konfig\u00fcrasyon hatalar\u0131n\u0131 \u00f6nceden belirleyebilir ve hatta otomatik d\u00fczeltmeler \u00f6nerebilir. Politika olarak kod (Policy as Code) yakla\u015f\u0131mlar\u0131, g\u00fcvenlik ve uyumluluk politikalar\u0131n\u0131n konfig\u00fcrasyonlara otomatik olarak uygulanmas\u0131n\u0131 sa\u011flayacak. Ayr\u0131ca, bulut sa\u011flay\u0131c\u0131lar\u0131n\u0131n sundu\u011fu y\u00f6netilen servisler (\u00f6rne\u011fin AWS AppConfig, Google Cloud Runtime Configurator), konfig\u00fcrasyon y\u00f6netimini daha da soyutlayarak geli\u015ftiricilerin ve operasyon ekiplerinin y\u00fck\u00fcn\u00fc hafifletecektir. Ancak t\u00fcm bu geli\u015fmelere ra\u011fmen, Goose gibi temel ara\u00e7lar\u0131n sa\u011flad\u0131\u011f\u0131 versiyon kontrol, otomasyon ve tutarl\u0131l\u0131k prensipleri her zaman ge\u00e7erlili\u011fini koruyacakt\u0131r. \u00d6nemli olan, teknolojiyi do\u011fru anlamak ve projenizin \u00f6zel ihtiya\u00e7lar\u0131na uygun stratejiler geli\u015ftirmektir. Unutmay\u0131n, iyi y\u00f6netilen konfig\u00fcrasyonlar, ba\u015far\u0131l\u0131 bir yaz\u0131l\u0131m projesinin temel ta\u015f\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>A\u015fa\u011f\u0131da, \"\u00c7oklu Projelerde Goose Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek\" konusuyla ilgili s\u0131k\u00e7a sorulan baz\u0131 sorular\u0131 ve cevaplar\u0131n\u0131 bulabilirsiniz.<\/p>\n<ol>\n<li>\n        <strong>Goose sadece veritaban\u0131 migration'lar\u0131 i\u00e7in mi kullan\u0131l\u0131r?<\/strong><\/p>\n<p>Evet, Goose temel olarak veritaban\u0131 \u015fema migration'lar\u0131 i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7t\u0131r. Ancak, veritaban\u0131 \u015femalar\u0131 uygulaman\u0131n kritik bir konfig\u00fcrasyon bile\u015feni oldu\u011fu i\u00e7in, Goose'un etkin kullan\u0131m\u0131 genel konfig\u00fcrasyon y\u00f6netimi stratejisinin \u00f6nemli bir par\u00e7as\u0131 haline gelir. Di\u011fer uygulama konfig\u00fcrasyonlar\u0131 (API anahtarlar\u0131, log ayarlar\u0131 vb.) genellikle ortam de\u011fi\u015fkenleri, konfig\u00fcrasyon dosyalar\u0131 veya \u00f6zel konfig\u00fcrasyon y\u00f6netim servisleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir.<\/p>\n<\/li>\n<li>\n        <strong>\u00c7oklu projelerde ortak bir Goose migration deposu kullanabilir miyim?<\/strong><\/p>\n<p>Monorepo yap\u0131s\u0131nda evet, ortak bir <code>db\/migrations<\/code> klas\u00f6r\u00fc olu\u015fturup t\u00fcm projelerin bu klas\u00f6r\u00fc kullanmas\u0131n\u0131 sa\u011flayabilirsiniz. Ancak polyrepo yap\u0131s\u0131nda bu daha zordur ve her projenin kendi migration'lar\u0131n\u0131 kendi deposunda tutmas\u0131 daha yayg\u0131n bir yakla\u015f\u0131md\u0131r. Ortak bir veritaban\u0131n\u0131 kullanan birden fazla servis varsa, bu servislerin migration'lar\u0131n\u0131 dikkatli bir \u015fekilde koordine etmek ve \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek \u00f6nemlidir.<\/p>\n<\/li>\n<li>\n        <strong>Hassas konfig\u00fcrasyon bilgilerini (\u015fifreler gibi) Goose ile nas\u0131l y\u00f6netmeliyim?<\/strong><\/p>\n<p>Hassas bilgiler asla do\u011frudan Goose migration dosyalar\u0131na veya herhangi bir s\u00fcr\u00fcm kontrol\u00fcne dahil edilmemelidir. Bunun yerine, bu t\u00fcr bilgileri ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla veya Kubernetes Secrets, HashiCorp Vault gibi g\u00fcvenli bir s\u0131r y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc \u00fczerinden sa\u011flamal\u0131s\u0131n\u0131z. Goose, veritaban\u0131 ba\u011flant\u0131 dizesini ortam de\u011fi\u015fkenlerinden okuyacak \u015fekilde yap\u0131land\u0131r\u0131labilir.<\/p>\n<\/li>\n<li>\n        <strong>CI\/CD pipeline'\u0131mda Goose migration'lar\u0131n\u0131 ne zaman \u00e7al\u0131\u015ft\u0131rmal\u0131y\u0131m?<\/strong><\/p>\n<p>Genellikle, Goose migration'lar\u0131 uygulaman\u0131n yeni s\u00fcr\u00fcm\u00fc da\u011f\u0131t\u0131lmadan hemen \u00f6nce \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131d\u0131r. Bu, uygulaman\u0131n ba\u015flad\u0131\u011f\u0131nda veritaban\u0131 \u015femas\u0131n\u0131n zaten beklenen durumda olmas\u0131n\u0131 sa\u011flar. Kubernetes Helm Charts kullan\u0131l\u0131yorsa, <code>pre-install<\/code> veya <code>pre-upgrade<\/code> hook'lar\u0131 bu ama\u00e7 i\u00e7in idealdir.<\/p>\n<\/li>\n<li>\n        <strong>Bir migration'\u0131 geri almam gerekirse ne yapmal\u0131y\u0131m?<\/strong><\/p>\n<p>Goose, her migration dosyas\u0131nda bir <code>+goose Down<\/code> b\u00f6l\u00fcm\u00fc tan\u0131mlaman\u0131z\u0131 gerektirir. Bu b\u00f6l\u00fcm, <code>Up<\/code> komutuyla yap\u0131lan de\u011fi\u015fiklikleri geri alan SQL komutlar\u0131n\u0131 i\u00e7erir. E\u011fer bir migration'\u0131 geri alman\u0131z gerekirse, <code>goose down<\/code> komutunu kullanarak ilgili migration'\u0131 geri \u00e7evirebilirsiniz. Ancak, \u00fcretim ortam\u0131nda geri alma i\u015flemleri her zaman dikkatli ve test edilmi\u015f bir \u015fekilde yap\u0131lmal\u0131d\u0131r.<\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration&#8217;lar\u0131 gibi kritik&hellip;","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":[1],"tags":[],"class_list":{"0":"post-33139","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz<\/title>\n<meta name=\"description\" content=\"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration&#039;lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 &quot;Goose&quot; kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.\" \/>\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\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz\" \/>\n<meta property=\"og:description\" content=\"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration&#039;lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 &quot;Goose&quot; kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-30T01:31:13+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz\",\"datePublished\":\"2025-10-30T01:31:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\"},\"wordCount\":4354,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\",\"name\":\"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-30T01:31:13+00:00\",\"description\":\"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration'lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 \\\"Goose\\\" kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz\"}]},{\"@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":"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz","description":"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration'lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 \"Goose\" kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.","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\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/","og_locale":"tr_TR","og_type":"article","og_title":"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz","og_description":"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration'lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 \"Goose\" kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.","og_url":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-30T01:31:13+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz","datePublished":"2025-10-30T01:31:13+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/"},"wordCount":4354,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/","url":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/","name":"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-30T01:31:13+00:00","description":"Birden fazla projenin konfig\u00fcrasyonlar\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle veritaban\u0131 migration'lar\u0131 gibi kritik ad\u0131mlarda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zorluk te\u015fkil eder. Bu makale, pop\u00fcler veritaban\u0131 migration arac\u0131 \"Goose\" kullanarak \u00e7oklu projelerde konfig\u00fcrasyon y\u00f6netimini nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacak, b\u00f6ylece da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenilir ve verimli hale getirecektir.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/coklu-projelerde-kaz-konfigurasyonlarini-yonetmek-bir-kilavuz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u00c7oklu Projelerde Kaz Konfig\u00fcrasyonlar\u0131n\u0131 Y\u00f6netmek: Bir K\u0131lavuz"}]},{"@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\/33139","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=33139"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33139\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}