Headless WordPress Dağıtımı: DNS, SSL ve AI
Tech
AI
headless CMS
WordPress
Next.js

Headless WordPress Dağıtımı: DNS, SSL ve AI

Gerçek bir headless WordPress dağıtımı DNS, SSL, görseller ve formları bozabilir. Bunu prodüksiyonda nasıl düzelttiğimi burada bulabilirsiniz.

Uygar DuzgunUUygar Duzgun
Mar 27, 2026
Updated 4 Nis 2026
8 min read

Bu, headless WordPress geçiş seriminin 2. bölümü. Headless WordPress deployment (headless WordPress dağıtımı) işte asıl sorunların başladığı yerdir; çünkü DNS, SSL, görseller, formlar ve yönlendirmeler farklı şekillerde bozulur. 1. Bölüm’de Claude Code, Stitch MCP ve Next.js ile ön yüzü tek günde yeniden kurdum. Bu yazıda, karşılaştığım dağıtım sorunlarını, nasıl çözdüğümü ve neden AI’nin hâlâ insan muhakemesine ihtiyaç duyduğunu anlatıyorum.

The Headless WordPress Deployment Problem Nobody Talks About

Ön yüzü kurmak kolay kısım. Benim deneyimimde, headless WordPress deployment tek bir siteyi iki sisteme böldüğünüz anda zorlaşır: ön yüz için Vercel ve arka uç için WordPress. Artık tek bir basit yığınınız yok. DNS, sertifikalar, medya URL’leri, REST endpoint’leri ve yönetici erişimi farklı yönlere çekiyor.

`optagonen.se` Vercel’e taşındığında, daha önce WordPress’e giden her istek yeni ön yüze düşmeye başladı. Bu, GraphQL’i, yüklemeleri, Contact Form 7’yi ve yönetici erişimini tek hamlede bozdu. Kendi headless WordPress deployment planınızı yapıyorsanız, DNS’i değiştirmeden önce bu kırılma noktaları için tasarım yapmanız gerekir.

Bunu gerçek bir üretim geçişinde test ettim; bir sandbox’ta değil. Ders açıktı: kod hızlı bitti, ama altyapı zaman aldı.

Splitting DNS for a Headless WordPress Deployment

En temiz çözüm, WordPress’e kendi alt alan adını vermekti: `wp.optagonen.se`. Bu, her şeyi tek bir origin üzerinden ters proxy yapmaya zorlamadan ön yüz ile arka ucu ayırdı. Ayrıca SSL ve medya teslimini sorun giderirken mimariyi anlamayı kolaylaştırdı.

DomainPoints toPurpose
---------
`optagonen.se`VercelFrontend in Next.js
`wp.optagonen.se`Origin serverWordPress backend

`wp.optagonen.se`’yi Hestia’da alias olarak ekledim, DNS A kaydını origin IP’ye işaretledim ve ön yüz ortam değişkenini güncelledim:

`WP_URL=https://wp.optagonen.se`
`CF7_FORM_ID=8`
`WP_APP_PASSWORD=...`

Bu kâğıt üzerinde basit. Ama pratikte headless WordPress deployment, zincirleme bir reaksiyonu ortaya çıkardı. Eski domain’i varsayan her sistem yeni bir hedefe ihtiyaç duydu.

Headless WordPress Deployment and SSL Certificate Failures

İlk bozulan şey SSL oldu. Eski Let's Encrypt sertifikası yalnızca `optagonen.se` ve `www.optagonen.se`’yi kapsıyordu; bu yüzden `https://wp.optagonen.se` hemen başarısız oldu. Bu beklenen bir davranış. Let's Encrypt, her hostname için alan adı sahipliğini doğrular ve sertifika eşleşmiyorsa tarayıcı bağlantıyı reddeder.

Hestia’nın yerleşik yenileme işlemi başarısız oldu; çünkü hâlâ ana domain’i HTTP-01 üzerinden doğrulamaya çalışıyordu, ama ana domain artık Vercel’e işaret ediyordu. Certbot ise başka bir nedenle başarısız oldu: Hestia ACME challenge’ı yakalayıp Certbot’un parmak izini yerine kendi thumbprint’ini döndürdü. AI’nin bunu ilk prensiplerden çıkaramayacağı türden bir çakışma bu. Panelin nasıl davrandığını bilmeniz gerekir.

Bunu, Hestia’nın ACME challenge konfigürasyonunu geçici olarak nginx include path’inden çıkarıp yalnızca `wp.optagonen.se` için sertifika düzenleyerek ve ardından yenilenen dosyaları Hestia’nın SSL dizinine geri kopyalayarak çözdüm. Sürecin otomatik kalması için bir yenileme hook’u da ekledim.

Güven için Let's Encrypt ve Certbot’ın resmi dokümanlarına yaslandım. Üretime tekrar dokunmadan önce ACME akışını doğrulamaya yardımcı oldu.

Why the Headless WordPress Deployment Rejected the Subdomain

SSL çalıştıktan sonra bile WordPress yeni host’u kabul etmedi. GraphQL verisi döndürmek yerine `/wp-signup.php`’ye yönlendirdi. Bu, WordPress’in gelen host header’ını beğenmediğini gösterdi.

Çözüm tek bir nginx direktifiydi:

`proxy_set_header Host optagonen.se;`

Bu satır, istekler hâlâ ana domain’den geliyormuş gibi WordPress’in davranmasını sağladı; tarayıcı ise `wp.optagonen.se` üzerinde kaldı. headless WordPress deployment içinde bu tür host normalizasyonu, insanların beklediğinden daha fazla önem taşır. WordPress, site URL’leri konusunda oldukça görüş sahibidir.

Bu aynı sorun sınıfını başka geçişlerde de gördüm. Ön yüz çalışır, arka uç yanıt verir; sonra eşleşmeyen bir host header oturum akışını sessizce bozar.

Images Broke After the Headless WordPress Deployment

Dağıtımdan sonra her görsel 502 hatası döndürdü. Bunun nedeni WordPress medya URL’lerinin hâlâ `/wp-content/uploads/...` şeklinde işaret etmesiydi ve bu yollar artık origin server yerine Vercel’e göre çözümleniyordu. Kurulumumda sorun iki yerden geldi: statik dosyalardaki hardcoded URL’ler ve WPGraphQL tarafından dönen dinamik URL’ler.

Önce hardcoded URL’leri düzelttim. `https://optagonen.se/wp-content/uploads/` referanslarının her birini, altı dosya boyunca `https://wp.optagonen.se/wp-content/uploads/` ile değiştirdim. Bu, yaklaşık 70 görsel yolunu kapsadı.

Sonra dinamik GraphQL URL’lerini Next.js rewrite ile düzelttim:

`/wp-content/uploads/:path*` → `https://wp.optagonen.se/wp-content/uploads/:path*`

Bu, ön yüzü temiz tuttu ve medya verisini WordPress içinde yeniden yazmaktan kaçındı. Ayrıca tarayıcının hâlâ aynı path’i istemesi, sunucunun ise proxy’lemeyi üstlenmesi sayesinde headless WordPress deployment daha sürdürülebilir hale geldi.

Recommended reading

Bu tür bir sistem tasarımına daha derin girmek isterseniz, AI-powered WordPress migration workflow yazımı ve multi-agent content pipeline yazımı okumanızı öneririm. Bu yazılar, otomasyon etrafında altyapı ve içerik sistemlerini nasıl yapılandırdığımı gösteriyor.

Contact Forms, IDs, and the Last Deployment Trap

Contact Form 7 ilk başta düzgün görünüyordu, ama form çalışmayı bıraktı; çünkü ön yüzdeki ID yanlıştı. Varsayılan form ID’si `1`’di, ama WordPress’teki gerçek form `8`’di. Hızlı bir API kontrolü bunu doğruladı.

Bu küçük bir düzeltmeydi, ama önemli. headless WordPress deployment içinde tek bir yanlış ID, arka uç sağlıklı olsa bile çalışan bir formu bozuk gibi gösterebilir. `CF7_FORM_ID=8` ayarladım ve form hemen yeniden çevrimiçi oldu.

Bu yüzden ben her zaman tam akışı manuel test ederim:

Canlı ön yüzden formu gönderin.
Ağ isteğini kontrol edin.
WordPress’te yanıtı doğrulayın.
Verinin gelen kutusuna veya CRM’e ulaştığını doğrulayın.

Bu sıra, yalnızca loglara bakarak tahmin etmekten daha hızlı sorun yakalar.

What AI Helped With and What It Missed

Claude Code hızlı ilerlememi sağladı, ama anlayışın yerini tutmadı. Tekrarlayan işleri iyi yaptı: config dosyalarında arama yapmak, nginx snippet’leri üretmek, certbot komutlarında yardımcı olmak ve görsel URL’lerini toplu halde değiştirmek. Ayrıca hata zincirini akılda tuttu; bir düzeltme başka bir sorunu doğurduğunda zaman kazandırdı.

Ancak AI tam mimariye karar veremezdi. Hestia’nın ACME isteklerini yakalayacağını bilmiyordu. Reverse proxy yerine ne zaman alt alan adı kullanılacağını bilmiyordu. Ayrıca kesintisizliği önleyecek operasyon sırasını da bilmiyordu.

Recommended reading

headless WordPress deployment içinde AI’nin gerçek değeri şudur: teşhisi hızlandırır, ama yine de yığını anlayan insan gerekir. Ben de AI automation systems for e-commerce inşa ederken ve içerik pipeline çalışmamda aynı prensibi kullanıyorum.

Final Architecture After the Deployment

Düzeltmelerden sonra yığın temiz bir ayrımda oturdu:

ComponentLocationPurpose
---------
Next.js frontendVercelSayfaları sunar ve routing’i yönetir
WordPress + WPGraphQL`wp.optagonen.se`Content API ve medya depolama
Contact Form 7`wp.optagonen.se`Form işleme
Image proxyNext.js rewrite ruleUpload’ları origin’e yönlendirir
Frontend SSLVercelOtomatik yönetim
Backend SSLCertbot + renewal hookOtomatik yenilenen sertifikalar

Bu yapı stabil ve hata ayıklaması kolay. Ayrıca WordPress içindeki editoryal iş akışını korurken ön yüzü hızlı tutar. Bir headless WordPress deployment için hedef budur.

Lessons From This Headless WordPress Deployment

Bu headless WordPress deployment geçişinden öğrendiklerim:

DNS değişiklikleri beklediğinizden daha fazla şeyi bozar; özellikle tek domain artık iki sistemi de servis ediyorsa.
SSL genellikle ilk önce başarısız olur; çünkü sertifika doğrulaması routing’e bağlıdır.
Sunucu panelleri ve harici ACME araçları, aynı domain’i yönetiyorlarsa çakışabilir.
Görsel URL’leri düşündüğünüzden fazla yerde yaşar; statik dosyalar ve GraphQL çıktısı dahil.
AI hata ayıklamada faydalıdır, ama altyapı muhakemesinin yerini tutamaz.

Bu dersler bir tutorial’dan değil, gerçek bir üretim hamlesinden geldi. Bu yüzden artık deployment için, inşa etmek kadar zaman ayırıyorum.

Conclusion

Headless WordPress deployment kod yüzünden zor değil. Zor; çünkü DNS, SSL, medya ve host header’ların hepsi birbirine bağlı. Bu geçişte alt alan adı ayrımını, sertifika doğrulamasını, görsel teslimini ve Contact Form 7’yi düzelttim; ayrıca AI’nin nerede yardımcı olduğunu ve nerede durduğunu tam olarak öğrendim.

Kendi geçişinizi planlıyorsanız, önce frontend yeniden inşasını okuyun, sertifika akışını erken test edin ve yayına almadan önce her medya path’ini doğrulayın. Sonra canlı siteyi kontrol edin, formları doğrulayın ve arka uç tarafının WordPress’in beklediği şekilde hâlâ davrandığından emin olun.

Daha pratik deployment kırılımları istiyorsanız, ilgili yazıları okumaya devam edin ve kendi stack’inizle karşılaştırın. Bir sonraki headless WordPress deployment’ınızda hatalardan kaçınmanın en hızlı yolu bu.

Suggested image alt text:

Vercel ve WordPress ayrım mimarisini gösteren, frontend ve backend domain’lerini içeren ekran görüntüsü
wp.optagonen.se sertifika yenilemesi için Hestia kontrol paneli SSL kurulumu
WordPress upload’larını origin server’a eşleyen Next.js rewrite kuralı