{"id":2001,"date":"2025-11-17T23:17:04","date_gmt":"2025-11-17T20:17:04","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/wordpressi-docker-ile-konteynerize-etmek-tek-vpste-traefik-nginx-reverse-proxy-ile-uretim-mimarisi-nasil-kurulur\/"},"modified":"2025-11-17T23:17:04","modified_gmt":"2025-11-17T20:17:04","slug":"wordpressi-docker-ile-konteynerize-etmek-tek-vpste-traefik-nginx-reverse-proxy-ile-uretim-mimarisi-nasil-kurulur","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/wordpressi-docker-ile-konteynerize-etmek-tek-vpste-traefik-nginx-reverse-proxy-ile-uretim-mimarisi-nasil-kurulur\/","title":{"rendered":"WordPress\u2019i Docker ile Konteynerize Etmek: Tek VPS\u2019te Traefik\/Nginx Reverse Proxy ile \u00dcretim Mimarisi Nas\u0131l Kurulur?"},"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_Kucuk_Bir_Sorun_Buyuk_Bir_Aydinlanma_Tek_VPSte_WordPressi_Nasil_Derli_Toplu_Kostururuz\"><span class=\"toc_number toc_depth_1\">1<\/span> Ofiste K\u00fc\u00e7\u00fck Bir Sorun, B\u00fcy\u00fck Bir Ayd\u0131nlanma: Tek VPS\u2019te WordPress\u2019i Nas\u0131l Derli Toplu Ko\u015ftururuz?<\/a><\/li><li><a href=\"#Mimarinin_Fotografi_Kucuk_Kutular_Net_Sorumluluklar\"><span class=\"toc_number toc_depth_1\">2<\/span> Mimarinin Foto\u011fraf\u0131: K\u00fc\u00e7\u00fck Kutular, Net Sorumluluklar<\/a><\/li><li><a href=\"#Traefik_ile_Reverse_Proxy_HTTPS_Yonlendirmeler_ve_Etiketlerle_Buyu_Yapmak\"><span class=\"toc_number toc_depth_1\">3<\/span> Traefik ile Reverse Proxy: HTTPS, Y\u00f6nlendirmeler ve Etiketlerle B\u00fcy\u00fc Yapmak<\/a><\/li><li><a href=\"#docker-composeyml_WordPress_PHP-FPM_Nginx_App_MariaDB_ve_Traefik\"><span class=\"toc_number toc_depth_1\">4<\/span> docker-compose.yml: WordPress + PHP-FPM, Nginx (App), MariaDB ve Traefik<\/a><ul><li><a href=\"#On_Hazirlik_env_ve_kucuk_ayarlar\"><span class=\"toc_number toc_depth_2\">4.1<\/span> \u00d6n Haz\u0131rl\u0131k: .env ve k\u00fc\u00e7\u00fck ayarlar<\/a><\/li><li><a href=\"#Compose_dosyasi_Servisleri_sahneye_alalim\"><span class=\"toc_number toc_depth_2\">4.2<\/span> Compose dosyas\u0131: Servisleri sahneye alal\u0131m<\/a><\/li><li><a href=\"#Nginx_tarafi_PHP-FPMe_nazikce_pas_atmak\"><span class=\"toc_number toc_depth_2\">4.3<\/span> Nginx taraf\u0131: PHP-FPM\u2019e nazik\u00e7e pas atmak<\/a><\/li><\/ul><\/li><li><a href=\"#Ilk_Calistirma_Kucuk_Kontroller_Buyuk_Rahatlik\"><span class=\"toc_number toc_depth_1\">5<\/span> \u0130lk \u00c7al\u0131\u015ft\u0131rma: K\u00fc\u00e7\u00fck Kontroller, B\u00fcy\u00fck Rahatl\u0131k<\/a><\/li><li><a href=\"#Veriler_Yedekler_Guncellemeler_Gece_Uykunuzu_Kacirmayan_Rutin\"><span class=\"toc_number toc_depth_1\">6<\/span> Veriler, Yedekler, G\u00fcncellemeler: Gece Uykunuzu Ka\u00e7\u0131rmayan Rutin<\/a><\/li><li><a href=\"#Performans_ve_Olcek_Kucuk_Dokunuslarla_Buyuk_Fark\"><span class=\"toc_number toc_depth_1\">7<\/span> Performans ve \u00d6l\u00e7ek: K\u00fc\u00e7\u00fck Dokunu\u015flarla B\u00fcy\u00fck Fark<\/a><\/li><li><a href=\"#Nginxi_Reverse_Proxy_Olarak_Kullanmak_Ne_Zaman_Nasil\"><span class=\"toc_number toc_depth_1\">8<\/span> Nginx\u2019i Reverse Proxy Olarak Kullanmak: Ne Zaman, Nas\u0131l?<\/a><\/li><li><a href=\"#Guvenlik_ve_Seffaflik_En_Az_Izin_Net_Loglar_Sakin_Geceler\"><span class=\"toc_number toc_depth_1\">9<\/span> G\u00fcvenlik ve \u015eeffafl\u0131k: En Az \u0130zin, Net Loglar, Sakin Geceler<\/a><\/li><li><a href=\"#Sorun_Giderme_Kucuk_Hatalar_Nasil_Hizla_Yakalanir\"><span class=\"toc_number toc_depth_1\">10<\/span> Sorun Giderme: K\u00fc\u00e7\u00fck Hatalar Nas\u0131l H\u0131zla Yakalan\u0131r?<\/a><\/li><li><a href=\"#Kaynaklar_ve_Kucuk_Notlar\"><span class=\"toc_number toc_depth_1\">11<\/span> Kaynaklar ve K\u00fc\u00e7\u00fck Notlar<\/a><\/li><li><a href=\"#Kapanis_Tek_VPSte_Uretim_Disiplini_Rahat_Bir_Nefes\"><span class=\"toc_number toc_depth_1\">12<\/span> Kapan\u0131\u015f: Tek VPS\u2019te \u00dcretim Disiplini, Rahat Bir Nefes<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Ofiste_Kucuk_Bir_Sorun_Buyuk_Bir_Aydinlanma_Tek_VPSte_WordPressi_Nasil_Derli_Toplu_Kostururuz\">Ofiste K\u00fc\u00e7\u00fck Bir Sorun, B\u00fcy\u00fck Bir Ayd\u0131nlanma: Tek <a href=\"https:\/\/www.dchost.com\/tr\/vps\">VPS<\/a>\u2019te WordPress\u2019i Nas\u0131l Derli Toplu Ko\u015ftururuz?<\/span><\/h2>\n<p>Hi\u00e7 WordPress sitenizi tek bir VPS\u2019e ta\u015f\u0131rken \u201cbunu daha temiz, daha d\u00fczenli ve g\u00fcvenli nas\u0131l yapar\u0131m?\u201d diye uzun uzun d\u00fc\u015f\u00fcnd\u00fcn\u00fcz m\u00fc? Ben bir ak\u015fam tam da bu soruyla bo\u011fu\u015furken, sunucuda bir WordPress, bir veritaban\u0131, bir de \u00f6n\u00fcnde bir ters vekil (reverse proxy) derken her \u015feyin birbirine kar\u0131\u015ft\u0131\u011f\u0131n\u0131 fark ettim. Klasik kurulumda dizin izinleri, PHP ayarlar\u0131, SSL yenilemeleri ve yedeklemeler derken k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik bile domino ta\u015f\u0131 gibi her \u015feyi etkileyebiliyor. O g\u00fcn kendime \u201cBunu konteynerlerle, g\u00f6z\u00fcm arkada kalmadan, \u00fcretim ortam\u0131 disiplininde toparlayamaz m\u0131y\u0131m?\u201d diye sordum.<\/p>\n<p>\u0130\u015fte bu yaz\u0131da, tek bir VPS \u00fczerinde WordPress\u2019i Docker ile konteynerize edip, \u00f6n\u00fcne Traefik ya da Nginx reverse proxy koyarak \u00fcretim \u015fartlar\u0131na yak\u0131\u015f\u0131r bir mimariyi ad\u0131m ad\u0131m kuraca\u011f\u0131z. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Her par\u00e7a kendi kutusunda, ba\u011f\u0131ml\u0131l\u0131klar \u015feffaf, g\u00fcncellemeler kontroll\u00fc, SSL otomatik ve loglar tertemiz. Ben hem pratikte uygulad\u0131\u011f\u0131m \u00f6rnek dosyalar\u0131 hem de yolda g\u00f6rebilece\u011finiz k\u00fc\u00e7\u00fck t\u00fcmsekleri anlataca\u011f\u0131m. En sonda da g\u00fcncelleme ve yedekleme stratejisiyle g\u00fcvenle uyuman\u0131z\u0131 sa\u011flayacak birka\u00e7 tatl\u0131 tavsiye b\u0131rakaca\u011f\u0131m.<\/p>\n<h2 id=\"section-2\"><span id=\"Mimarinin_Fotografi_Kucuk_Kutular_Net_Sorumluluklar\">Mimarinin Foto\u011fraf\u0131: K\u00fc\u00e7\u00fck Kutular, Net Sorumluluklar<\/span><\/h2>\n<p>Bir an g\u00f6z\u00fcn\u00fcz\u00fcn \u00f6n\u00fcne getirin: Tek bir VPS, \u00fcst\u00fcnde Docker Engine, onun \u00fczerinde \u00fc\u00e7 ana oyuncu. \u00d6nde trafi\u011fi kar\u015f\u0131layan reverse proxy (Traefik veya Nginx), ortada WordPress uygulamas\u0131 (PHP-FPM olarak), arkada da veritaban\u0131. Hepsi kendi konteynerinde, kendi hayatlar\u0131n\u0131 ya\u015f\u0131yor. Network olarak iki k\u00fc\u00e7\u00fck sahne var; <strong>edge<\/strong> sahnesinde reverse proxy d\u0131\u015far\u0131ya bak\u0131yor, <strong>backend<\/strong> sahnesinde WordPress ile veritaban\u0131 sakin sakin konu\u015fuyor. Veriler kal\u0131c\u0131 volume\u2019larda duruyor, logs ve config\u2019ler repo\u2019da sakince takip ediliyor.<\/p>\n<p>B\u00f6yle olunca sihirli birka\u00e7 \u015fey oluyor. Birincisi, sorun oldu\u011funda su\u00e7luyu bulmak kolayla\u015f\u0131yor. \u0130kincisi, g\u00fcncelleme yapmak g\u00fc\u00e7 g\u00f6sterisine d\u00f6n\u00fc\u015fm\u00fcyor; imaj\u0131 de\u011fi\u015ftir, servisi yeniden ba\u015flat, mis gibi. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, g\u00fcvenlik s\u0131n\u0131rlar\u0131 netle\u015fiyor; d\u0131\u015far\u0131 sadece reverse proxy bak\u0131yor, veritaban\u0131 kapal\u0131 bir arka sokakta ya\u015f\u0131yor. D\u00f6rd\u00fcnc\u00fcs\u00fc, ta\u015f\u0131mas\u0131 kolay; yar\u0131n ba\u015fka bir VPS\u2019e ge\u00e7mek isterseniz, dosyalar\u0131n\u0131z\u0131n ve .env\u2019inizin pe\u015finden gitmeniz \u00e7o\u011fu zaman yetiyor.<\/p>\n<h2 id=\"section-3\"><span id=\"Traefik_ile_Reverse_Proxy_HTTPS_Yonlendirmeler_ve_Etiketlerle_Buyu_Yapmak\">Traefik ile Reverse Proxy: HTTPS, Y\u00f6nlendirmeler ve Etiketlerle B\u00fcy\u00fc Yapmak<\/span><\/h2>\n<p>Traefik\u2019i \u00f6zellikle tek VPS senaryosunda seviyorum; Docker etiketleriyle konu\u015fuyor, servisleri otomatik ke\u015ffediyor ve TLS sertifikalar\u0131n\u0131 kendi al\u0131yor. Bir kere do\u011fru kurdunuz mu, yeni bir servis eklemek i\u00e7in \u00e7o\u011fu zaman sadece birka\u00e7 label yazman\u0131z yeterli oluyor. HTTP\u2019den HTTPS\u2019e y\u00f6nlendirme, HSTS, s\u0131k\u0131\u015ft\u0131rma gibi detaylar\u0131 da ayar dosyas\u0131nda toparlayabilirsiniz. En g\u00fczeli de, loglar net ve anla\u015f\u0131l\u0131r.<\/p>\n<p>E\u011fer DNS taraf\u0131nda ACME do\u011frulamas\u0131n\u0131 merak ediyorsan\u0131z, <a href=\"https:\/\/www.dchost.com\/blog\/acme-challenge-turleri-derinlemesine-http%e2%80%9101-dns%e2%80%9101-ve-tls%e2%80%91alpn%e2%80%9101-ne-zaman-hangisi\/\">ACME challenge t\u00fcrlerini sakin sakin anlatt\u0131\u011f\u0131m yaz\u0131<\/a> tam yerine oturuyor. Sertifika sa\u011flay\u0131c\u0131s\u0131nda aksakl\u0131klar\u0131 yedekli y\u00f6netmek isterseniz de <a href=\"https:\/\/www.dchost.com\/blog\/acme-otomasyonunda-yedekli-ca-nasil-kurulur-acme-sh-ile-lets-encrypt-%e2%86%92-zerossl-fallback-oran-limitlerine-karsi-guvenli-olcekleme\/\">ACME otomasyonunda yedekli CA kurma rehberini<\/a> g\u00f6z atmal\u0131k notlar listesine ekleyin.<\/p>\n<p>Traefik\u2019in etiket tabanl\u0131 yakla\u015f\u0131m\u0131yla tan\u0131\u015fmak i\u00e7in resmi <a href=\"https:\/\/doc.traefik.io\/traefik\/\" rel=\"nofollow noopener\" target=\"_blank\">Traefik belgeleri<\/a> iyi bir ba\u015flang\u0131\u00e7. Ben burada pratik, \u00e7al\u0131\u015f\u0131r bir \u00f6rnek \u00fczerinden ilerleyece\u011fim. Etiketleri okuyabilen bir g\u00f6z, sistemin niyetini de hemen okuyor, bu g\u00fczel bir his.<\/p>\n<h2 id=\"section-4\"><span id=\"docker-composeyml_WordPress_PHP-FPM_Nginx_App_MariaDB_ve_Traefik\">docker-compose.yml: WordPress + PHP-FPM, Nginx (App), MariaDB ve Traefik<\/span><\/h2>\n<h3><span id=\"On_Hazirlik_env_ve_kucuk_ayarlar\">\u00d6n Haz\u0131rl\u0131k: .env ve k\u00fc\u00e7\u00fck ayarlar<\/span><\/h3>\n<p>Ben yap\u0131land\u0131rmalar\u0131 olabildi\u011fince .env\u2019e almay\u0131 seviyorum. B\u00f6ylece repo\u2019yla kimlik bilgilerinin yolunu ay\u0131rmak kolayla\u015f\u0131yor. A\u015fa\u011f\u0131daki gibi basit bir .env dosyas\u0131 iyi bir start:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">DOMAIN=example.com\nACME_EMAIL=ops@example.com\nDB_PASSWORD=supersecret\nDB_ROOT_PASSWORD=evenmoresecret\n<\/code><\/pre>\n<p>Bir de PHP i\u00e7in upload ve memory limitini tatl\u0131 bir noktaya \u00e7ekmek i\u00e7in k\u00fc\u00e7\u00fck bir ini dosyas\u0131 a\u00e7\u0131yorum:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">; uploads.ini\nfile_uploads = On\nmemory_limit = 256M\nupload_max_filesize = 64M\npost_max_size = 64M\nmax_execution_time = 300\n<\/code><\/pre>\n<h3><span id=\"Compose_dosyasi_Servisleri_sahneye_alalim\">Compose dosyas\u0131: Servisleri sahneye alal\u0131m<\/span><\/h3>\n<p>Gelelim as\u0131l dosyaya. A\u015fa\u011f\u0131daki \u00f6rnek, tek bir VPS\u2019te Traefik\u2019i reverse proxy olarak kullan\u0131yor; WordPress\u2019i PHP-FPM ile \u00e7al\u0131\u015ft\u0131r\u0131p Nginx\u2019i uygulama sunucusu gibi konumland\u0131r\u0131yor. MariaDB de arkada, sessiz ve derinden:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">version: &quot;3.9&quot;\n\nservices:\n  traefik:\n    image: traefik:v2.11\n    command:\n      - --providers.docker=true\n      - --providers.docker.exposedbydefault=false\n      - --entrypoints.web.address=:80\n      - --entrypoints.websecure.address=:443\n      - --certificatesresolvers.le.acme.tlschallenge=true\n      - --certificatesresolvers.le.acme.email=${ACME_EMAIL}\n      - --certificatesresolvers.le.acme.storage=\/letsencrypt\/acme.json\n    ports:\n      - 80:80\n      - 443:443\n    volumes:\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock:ro\n      - letsencrypt:\/letsencrypt\n    networks:\n      - edge\n\n  db:\n    image: mariadb:10.11\n    environment:\n      - MYSQL_DATABASE=wordpress\n      - MYSQL_USER=wp\n      - MYSQL_PASSWORD=${DB_PASSWORD}\n      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}\n    volumes:\n      - db_data:\/var\/lib\/mysql\n    healthcheck:\n      test: [&quot;CMD&quot;, &quot;mysqladmin&quot;, &quot;ping&quot;, &quot;-h&quot;, &quot;localhost&quot;]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n    networks:\n      - backend\n\n  wordpress:\n    image: wordpress:6.6-fpm\n    environment:\n      - WORDPRESS_DB_HOST=db:3306\n      - WORDPRESS_DB_USER=wp\n      - WORDPRESS_DB_PASSWORD=${DB_PASSWORD}\n      - WORDPRESS_DB_NAME=wordpress\n    volumes:\n      - wp_data:\/var\/www\/html\n      - .\/uploads.ini:\/usr\/local\/etc\/php\/conf.d\/uploads.ini:ro\n    depends_on:\n      db:\n        condition: service_healthy\n    networks:\n      - backend\n\n  web:\n    image: nginx:1.25-alpine\n    volumes:\n      - wp_data:\/var\/www\/html:ro\n      - .\/nginx.conf:\/etc\/nginx\/conf.d\/default.conf:ro\n    depends_on:\n      - wordpress\n    labels:\n      - traefik.enable=true\n      - traefik.http.routers.wp.rule=Host(`${DOMAIN}`)\n      - traefik.http.routers.wp.entrypoints=websecure\n      - traefik.http.routers.wp.tls.certresolver=le\n      - traefik.http.services.wp.loadbalancer.server.port=80\n      - traefik.http.routers.wp.middlewares=wp-https-redirect\n      - traefik.http.middlewares.wp-https-redirect.redirectscheme.scheme=https\n    networks:\n      - edge\n      - backend\n\nvolumes:\n  db_data:\n  wp_data:\n  letsencrypt:\n\nnetworks:\n  edge:\n  backend:\n<\/code><\/pre>\n<p>Bu dosyada dikkatinizi \u00e7ekecek nokta \u015fu: Traefik d\u0131\u015f d\u00fcnyaya bak\u0131yor, Nginx i\u00e7erde 80\u2019de dinliyor ve PHP-FPM\u2019e fastcgi ge\u00e7i\u015f yap\u0131yor. Traefik\u2019in TLS i\u015fini \u00fcstlenmesi i\u015fleri ciddi basitle\u015ftiriyor. Etiketlerle tek domain\u2019e route ettik; isterseniz alt alanlar veya farkl\u0131 siteler i\u00e7in \u00e7o\u011faltman\u0131z \u00e7ok kolay.<\/p>\n<h3><span id=\"Nginx_tarafi_PHP-FPMe_nazikce_pas_atmak\">Nginx taraf\u0131: PHP-FPM\u2019e nazik\u00e7e pas atmak<\/span><\/h3>\n<p>Nginx konteyneri, statik dosyalar\u0131 h\u0131zl\u0131ca sunarken, dinamik istekleri PHP-FPM\u2019e iletiyor. Bunun i\u00e7in basit bir Nginx yap\u0131land\u0131rmas\u0131 yeterli:<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n  listen 80 default_server;\n  server_name ${DOMAIN};\n\n  root \/var\/www\/html;\n  index index.php index.html;\n\n  location \/ {\n    try_files $uri $uri\/ \/index.php?$args;\n  }\n\n  location ~ .php$ {\n    include fastcgi_params;\n    fastcgi_pass wordpress:9000;\n    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n  }\n\n  location ~* .(jpg|jpeg|png|gif|css|js|ico|svg)$ {\n    expires 7d;\n    add_header Cache-Control &quot;public, no-transform&quot;;\n  }\n}\n<\/code><\/pre>\n<p>Burada <strong>fastcgi_pass wordpress:9000<\/strong> ifadesi, PHP-FPM\u2019in konteyner ad\u0131n\u0131 kullanarak eri\u015fildi\u011fini anlat\u0131yor. Yani basit\u00e7e s\u00f6ylemek gerekirse Nginx \u201cdinami\u011fi\u201d WordPress\u2019e at\u0131yor, WordPress de PHP-FPM ile i\u015fi pi\u015firiyor. Statikler Nginx\u2019ten f\u0131rl\u0131yor, dinamikler sakin sakin arka mutfakta haz\u0131rlan\u0131yor.<\/p>\n<h2 id=\"section-5\"><span id=\"Ilk_Calistirma_Kucuk_Kontroller_Buyuk_Rahatlik\">\u0130lk \u00c7al\u0131\u015ft\u0131rma: K\u00fc\u00e7\u00fck Kontroller, B\u00fcy\u00fck Rahatl\u0131k<\/span><\/h2>\n<p>\u0130lk aya\u011fa kald\u0131rmada ad\u0131mlar genelde \u015f\u00f6yle ak\u0131yor. \u00d6nce .env\u2019i doldurun, sonra volume\u2019lar\u0131n bo\u015f oldu\u011funa emin olun. Ard\u0131ndan compose\u2019u \u00e7al\u0131\u015ft\u0131r\u0131n. Ben bu noktada bir <strong>docker compose pull<\/strong> ile imajlar\u0131n g\u00fcncelini \u00e7ekmeyi ve sonra <strong>docker compose up -d<\/strong> ile servisleri kalk\u0131nd\u0131rmay\u0131 seviyorum. \u0130lk dakikalarda Traefik sertifika almaya \u00e7al\u0131\u015facak, loglar\u0131nda ACME ile ilgili birka\u00e7 sat\u0131r g\u00f6rebilirsiniz. Domain DNS\u2019inin do\u011fru IP\u2019yi g\u00f6sterdi\u011fini test etmeyi unutmay\u0131n.<\/p>\n<p>WordPress kurulum ekran\u0131na ula\u015ft\u0131\u011f\u0131n\u0131zda \u201ctamam\u201d hissi gelir. Fakat acele etmeyin; medya y\u00fckleyin, k\u00fc\u00e7\u00fck bir yaz\u0131 yay\u0131nlay\u0131n, bir de kal\u0131c\u0131 ba\u011flant\u0131lar\u0131 de\u011fi\u015ftirip yeniden kaydedin. Bunlar k\u00fc\u00e7\u00fck ama s\u0131k kar\u015f\u0131la\u015f\u0131lan problemlerin g\u00f6r\u00fcn\u00fcr olmas\u0131n\u0131 sa\u011flar. Bir sorun yakalarsan\u0131z \u201cdocker compose logs -f web\u201d ve \u201cdocker compose logs -f wordpress\u201d ile iki tarafta da an\u0131nda iz s\u00fcr\u00fcn.<\/p>\n<h2 id=\"section-6\"><span id=\"Veriler_Yedekler_Guncellemeler_Gece_Uykunuzu_Kacirmayan_Rutin\">Veriler, Yedekler, G\u00fcncellemeler: Gece Uykunuzu Ka\u00e7\u0131rmayan Rutin<\/span><\/h2>\n<p>Veritaban\u0131 volume\u2019u kritik. MariaDB\u2019nin <strong>db_data<\/strong> volume\u2019u sizin alt\u0131n kasan\u0131z. WordPress\u2019in <strong>wp_data<\/strong> volume\u2019u ise i\u00e7erikler, temalar ve eklentilerle dolu gard\u0131robunuz. \u0130kisini de d\u00fczenli yedekleyin. Ben uygulama tutarl\u0131 yedekleri seviyorum; \u00f6zellikle veritaban\u0131 taraf\u0131nda k\u00fc\u00e7\u00fck bir dondurma\/\u00e7\u00f6zme prati\u011fiyle p\u0131r\u0131l p\u0131r\u0131l dump\u2019lar alabilirsiniz. <a href=\"https:\/\/www.dchost.com\/blog\/uygulama%e2%80%91tutarli-yedekler-nasil-alinir-lvm-snapshot-ve-fsfreeze-ile-mysql-postgresqli-usutmeden-dondurmak\/\">Uygulama-tutarl\u0131 yedek alma rehberindeki pratik ad\u0131mlar<\/a> bu konuda i\u015finizi \u00e7ok kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Basit bir \u00f6rnek olarak, g\u00fcnl\u00fck bir dump ile anl\u0131k kopya alabilirsiniz:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">docker exec -i $(docker compose ps -q db) \n  mysqldump -uwp -p${DB_PASSWORD} --databases wordpress \n  | gzip &gt; backups\/wp-$(date +%F).sql.gz\n<\/code><\/pre>\n<p>Bu komutu zamanlamak i\u00e7in isterseniz cron, isterseniz systemd timer kullan\u0131n. Hangi durumda hangisi daha temiz olur sorusunu merak ediyorsan\u0131z, <a href=\"https:\/\/www.dchost.com\/blog\/cron-mu-systemd-timer-mi-neden-nasil-ve-ne-zaman-hangisini-secmeli\/\">cron mu systemd Timer m\u0131 yaz\u0131mda<\/a> kula\u011fa k\u00fcpe olacak \u00f6neriler var. G\u00fcncelleme taraf\u0131nda ise, WordPress \u00e7ekirde\u011fini ve eklentileri d\u00fczenli tutarken PHP 8.x y\u00fckseltmelerinde dikkat edilmesi gerekenleri <a href=\"https:\/\/www.dchost.com\/blog\/php-8-x-yukseltme-kontrol-listesi-wordpress-ve-laravelde-geriye-uyumluluk-opcache-preload-ve-fpm-havuz-ayarlari-nasil-tatli-tatli-kurulur\/\">\u015fu kapsaml\u0131 kontrol listesine<\/a> bakarak ad\u0131m ad\u0131m y\u00f6netebilirsiniz.<\/p>\n<h2 id=\"section-7\"><span id=\"Performans_ve_Olcek_Kucuk_Dokunuslarla_Buyuk_Fark\">Performans ve \u00d6l\u00e7ek: K\u00fc\u00e7\u00fck Dokunu\u015flarla B\u00fcy\u00fck Fark<\/span><\/h2>\n<p>Tek VPS senaryosunda mucize beklemek yerine do\u011fru ayarlarla ferah bir kullan\u0131m hedefleyin. Nginx taraf\u0131nda statiklere uzun s\u00fcreli cache ba\u015fl\u0131klar\u0131 vermek, PHP-FPM\u2019de havuz de\u011ferlerini sitenizin ritmine g\u00f6re ayarlamak, WordPress taraf\u0131nda iyi bir \u00f6nbellek eklentisi kullanmak \u00e7ok i\u015fe yar\u0131yor. Baz\u0131 projelerde Redis ekleyip oturum ve obje cache\u2019i h\u0131zland\u0131rmak ho\u015f sonu\u00e7 veriyor; ama bu karar\u0131 site trafi\u011fine ve eklenti ekosistemine g\u00f6re verin.<\/p>\n<p>G\u00fcncelleme ve da\u011f\u0131t\u0131m taraf\u0131nda da konforlu bir ak\u0131\u015f kural\u0131m. Yeni bir tema g\u00fcncellemesi ya da \u00f6nemli bir eklenti de\u011fi\u015fikli\u011fi yapacaksan\u0131z, \u201ckademeli\u201d ge\u00e7irmek iyi hissettirebilir. Traefik\u2019te a\u011f\u0131rl\u0131kland\u0131r\u0131lm\u0131\u015f servislerle k\u00fc\u00e7\u00fck bir kanarya ak\u0131\u015f\u0131 kurmak m\u00fcmk\u00fcn; bu mant\u0131\u011f\u0131 ve geri d\u00f6n\u00fc\u015f yollar\u0131n\u0131 <a href=\"https:\/\/www.dchost.com\/blog\/vpste-canary-dagitimi-nasil-tatli-tatli-kurulur-nginx-agirlikli-yonlendirme-saglik-kontrolu-ve-guvenli-rollback\/\">canary da\u011f\u0131t\u0131m\u0131 rehberinde<\/a> uzun uzun anlatt\u0131m. Tek VPS\u2019te bile k\u00fc\u00e7\u00fck \u00f6l\u00e7ekte kontroll\u00fc ge\u00e7i\u015fler huzur veriyor.<\/p>\n<h2 id=\"section-8\"><span id=\"Nginxi_Reverse_Proxy_Olarak_Kullanmak_Ne_Zaman_Nasil\">Nginx\u2019i Reverse Proxy Olarak Kullanmak: Ne Zaman, Nas\u0131l?<\/span><\/h2>\n<p>Traefik ho\u015funuza gitmedi mi, ya da y\u0131llard\u0131r Nginx\u2019ten vazge\u00e7emiyor musunuz? Dert de\u011fil. Nginx\u2019i de reverse proxy olarak kullan\u0131p SSL\u2019i burada sonland\u0131rabilirsiniz. Sertifikalar\u0131 certbot ile yenileyip Nginx\u2019e teslim etmek ve arka tarafta yine \u201cweb\u201d ve \u201cwordpress\u201d konteynerleriyle konu\u015fmak gayet m\u00fcmk\u00fcn. Mimarinin genel ak\u0131\u015f\u0131 de\u011fi\u015fmiyor; sadece TLS yenileme ve y\u00f6nlendirmeleri Nginx taraf\u0131na alm\u0131\u015f oluyorsunuz.<\/p>\n<p>Ben Nginx yakla\u015f\u0131m\u0131nda iki \u015feye dikkat ediyorum. Birincisi, sertifika yenileme jobs\u2019lar\u0131n\u0131 temiz yazmak; ikincisi, konfig\u00fcrasyon par\u00e7alar\u0131n\u0131 mod\u00fcler tutmak. Yar\u0131n bir domain daha eklerseniz, bir dosya kopyalayarak \u00e7o\u011faltmak kadar basit olsun istiyorum. \u201cTek VPS, tek reverse proxy, birden \u00e7ok site\u201d deseni bu \u015fekilde ac\u0131s\u0131z b\u00fcy\u00fcyor. Bu mimaride de Docker Compose mant\u0131\u011f\u0131 aynen ge\u00e7erli; sadece Traefik yerine Nginx konu\u015fuyor.<\/p>\n<h2 id=\"section-9\"><span id=\"Guvenlik_ve_Seffaflik_En_Az_Izin_Net_Loglar_Sakin_Geceler\">G\u00fcvenlik ve \u015eeffafl\u0131k: En Az \u0130zin, Net Loglar, Sakin Geceler<\/span><\/h2>\n<p>Tek VPS\u2019te g\u00fcvenlik \u00e7izgilerini basit ama s\u0131k\u0131 tutmak b\u00fcy\u00fck fark yarat\u0131yor. D\u0131\u015far\u0131ya sadece reverse proxy\u2019yi a\u00e7\u0131n, veritaban\u0131n\u0131 private network\u2019te tutun, host\u2019tan konteynerlere eri\u015fimi daralt\u0131n. G\u00fcnl\u00fckleri ayr\u0131 dosyalara y\u00f6nlendirmek, container bazl\u0131 log rotasyonu yapmak ve gerekti\u011finde merkezi bir dizine aktarmak, sorun an\u0131nda alt\u0131n de\u011ferinde. Do\u011fru TLS etki alan\u0131n\u0131 se\u00e7mek ve sertifika otomasyonunu sa\u011flama almak i\u00e7in az \u00f6nce bahsetti\u011fim ACME yaz\u0131lar\u0131n\u0131 el alt\u0131nda tutun, bir de domain\/TLS ayarlar\u0131n\u0131 belgeleyin ki bir ay sonra \u201cbunu nas\u0131l yapm\u0131\u015ft\u0131m\u201d demeyesiniz.<\/p>\n<p>WordPress y\u00f6netici panelinde iki fakt\u00f6rl\u00fc do\u011frulama eklentileri kullanmak, XML-RPC\u2019yi s\u0131n\u0131rlamak ve gereksiz eklentileri hayat\u0131n\u0131zdan \u00e7\u0131karmak da g\u00f6r\u00fcnenden daha \u00e7ok i\u015fe yarar. Reverse proxy taraf\u0131nda ger\u00e7ek istemci IP\u2019lerini do\u011fru iletti\u011finizden emin olun ki g\u00fcvenlik eklentileriniz do\u011fru g\u00fcnl\u00fck tutsun. K\u00fc\u00e7\u00fck not: SSL yenileme ve do\u011frulamalarda tak\u0131ld\u0131\u011f\u0131n\u0131zda, bazen sadece loglar\u0131 dikkatle okumak bile \u00e7\u00f6z\u00fcm\u00fc g\u00f6sterir.<\/p>\n<h2 id=\"section-10\"><span id=\"Sorun_Giderme_Kucuk_Hatalar_Nasil_Hizla_Yakalanir\">Sorun Giderme: K\u00fc\u00e7\u00fck Hatalar Nas\u0131l H\u0131zla Yakalan\u0131r?<\/span><\/h2>\n<p>\u201cSite a\u00e7\u0131l\u0131yor ama y\u00fckleme tu\u015fu d\u00f6n\u00fcyor\u201d mu? Genellikle PHP upload limitleri ya da Nginx\u2019deki body size s\u0131n\u0131r\u0131 akla gelir; uploads.ini ve Nginx ayarlar\u0131n\u0131 kontrol edin. \u201cSSL ald\u0131 ama y\u00f6nlendirme yok\u201d diyorsan\u0131z, Traefik etiketlerinde middleware tan\u0131m\u0131n\u0131n do\u011fru ge\u00e7ti\u011finden emin olun. \u201cBeyaz sayfa\u201d g\u00f6rd\u00fc\u011f\u00fcn\u00fczde, \u00f6nce WordPress hatalar\u0131n\u0131 a\u00e7\u0131n, sonra \u201cweb\u201d ve \u201cwordpress\u201d container loglar\u0131na bak\u0131n; \u00e7o\u011fu zaman bir eklenti veya tema s\u0131k\u0131\u015ft\u0131rmas\u0131 ipucu verir.<\/p>\n<p>Bir de veritaban\u0131 ba\u011flant\u0131 hatalar\u0131. Bu durumda WORDPRESS_DB_HOST de\u011ferini, kullan\u0131c\u0131\/parola e\u015fle\u015fmesini ve MariaDB healthcheck durumunu kontrol edin. E\u011fer veritaban\u0131 ilk kurulumdan sonra ba\u015fl\u0131yorsa, host makinedeki disk alan\u0131 ve inode de\u011ferleri de bazen g\u00f6r\u00fcnmez kahramanlar olur. K\u0131sacas\u0131, sakince loglara bak\u0131n, a\u011f yap\u0131land\u0131rmas\u0131na ve volume\u2019lara g\u00f6z at\u0131n; genellikle ilk 10 dakikada \u0131\u015f\u0131k yanar.<\/p>\n<h2 id=\"section-11\"><span id=\"Kaynaklar_ve_Kucuk_Notlar\">Kaynaklar ve K\u00fc\u00e7\u00fck Notlar<\/span><\/h2>\n<p>Compose d\u00fcnyas\u0131na yeni ad\u0131m at\u0131yorsan\u0131z, <a href=\"https:\/\/docs.docker.com\/compose\/\" rel=\"nofollow noopener\" target=\"_blank\">Docker Compose rehberi<\/a> h\u0131zl\u0131ca elinizi \u0131s\u0131t\u0131r. WordPress imaj\u0131nda hangi tag\u2019ler, hangi ortam de\u011fi\u015fkenleri var diye merak ederseniz <a href=\"https:\/\/hub.docker.com\/_\/wordpress\" rel=\"nofollow noopener\" target=\"_blank\">WordPress resmi Docker imaj\u0131 sayfas\u0131<\/a> k\u0131sa yoldur. Traefik\u2019i ilk kez deniyorsan\u0131z da az \u00f6nce verdi\u011fim <a href=\"https:\/\/doc.traefik.io\/traefik\/\" rel=\"nofollow noopener\" target=\"_blank\">Traefik belgeleri<\/a> fazla uzatmadan i\u015fin \u00f6z\u00fcne g\u00f6t\u00fcr\u00fcyor. Bazen bir \u00f6rnek dosya, bir de log ekran\u0131 g\u00f6rmek t\u00fcm sis perdesini aralar.<\/p>\n<h2 id=\"section-12\"><span id=\"Kapanis_Tek_VPSte_Uretim_Disiplini_Rahat_Bir_Nefes\">Kapan\u0131\u015f: Tek VPS\u2019te \u00dcretim Disiplini, Rahat Bir Nefes<\/span><\/h2>\n<p>Bir VPS \u00fczerinde WordPress\u2019i Docker ile ta\u015f\u0131y\u0131p, \u00f6n\u00fcne Traefik ya da Nginx koydu\u011funuzda, d\u00fczen bir anda kendini belli ediyor. Her bile\u015fen kendi alan\u0131nda; g\u00fcncellemeler \u00f6ng\u00f6r\u00fclebilir, yedekler tekrarlanabilir, sorunlar izlenebilir oluyor. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Yar\u0131n PHP versiyonunu y\u00fckseltmek istediniz; imaj etiketini de\u011fi\u015ftirip do\u011frulama ad\u0131mlar\u0131yla k\u00fc\u00e7\u00fck bir tur at\u0131yorsunuz ve her \u015fey kontrol\u00fcn\u00fcz alt\u0131nda ilerliyor. Bu his, uzun vadede en b\u00fcy\u00fck kazan\u00e7.<\/p>\n<p>Pratik bir kapan\u0131\u015f listesi b\u0131rakay\u0131m: .env kay\u0131tlar\u0131n\u0131z\u0131 temiz tutun, volume\u2019lar\u0131 d\u00fczenli yedekleyin, loglar\u0131n\u0131z\u0131 toplay\u0131n, TLS otomasyonunu g\u00fcvenceye al\u0131n ve y\u00f6netici panelinde gereksiz eklentileri hayat\u0131n\u0131zdan \u00e7\u0131kar\u0131n. K\u00fc\u00e7\u00fck ad\u0131mlar, b\u00fcy\u00fck huzur. Umar\u0131m bu yolculuk sizi de benim gibi \u201coh be\u201d dedirten bir d\u00fczene g\u00f6t\u00fcr\u00fcr. Sorular\u0131n\u0131z olursa, yorumlarda bulu\u015furuz; bir dahaki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Ofiste K\u00fc\u00e7\u00fck Bir Sorun, B\u00fcy\u00fck Bir Ayd\u0131nlanma: Tek VPS\u2019te WordPress\u2019i Nas\u0131l Derli Toplu Ko\u015ftururuz?2 Mimarinin Foto\u011fraf\u0131: K\u00fc\u00e7\u00fck Kutular, Net Sorumluluklar3 Traefik ile Reverse Proxy: HTTPS, Y\u00f6nlendirmeler ve Etiketlerle B\u00fcy\u00fc Yapmak4 docker-compose.yml: WordPress + PHP-FPM, Nginx (App), MariaDB ve Traefik4.1 \u00d6n Haz\u0131rl\u0131k: .env ve k\u00fc\u00e7\u00fck ayarlar4.2 Compose dosyas\u0131: Servisleri sahneye alal\u0131m4.3 Nginx taraf\u0131: PHP-FPM\u2019e nazik\u00e7e [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2002,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-2001","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\/2001","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=2001"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/2001\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/2002"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=2001"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=2001"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=2001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}