Ev Sunucusu ile Kendi Hosting Altyapınızı Kurun: WordPress, Mail Server ve DNS Yönetimi
Ev Sunucusu ile odakli bu bolum, Icindekiler
- Ev Sunucusu ile: Neden Önemli?
- Gereksinimler
- Donanım
- Yazılım
- Ağ
- Rollback & Backup
- En İyi Uygulamalar
- Uygulama Adımları
- Ağ Yapılandırması
- BIND9 DNS Kurulumu ve Zone Dosyası
- WordPress Kurulumu
- E‑posta Sunucusu (Postfix + Dovecot)
- SSL Entegrasyonu (Let’s Encrypt)
- Sorun Giderme & Rollback
- DNS TTL Gecikmesi
- WordPress 500 Hatası
- Mail Sunucusu Port Çatışması
- Yedek Alma ve Restore Adımları
- Rollback Stratejisi
- Sistemsel Güncelleme Sorunları
- Optimizasyon & En İyi Uygulamalar
- Dosya İzinleri ve SELinux / AppArmor
- Önbellekleme (Redis, Varnish)
- Log Rotasyonu ve İzlenebilirlik
- Least Privilege Uygulaması
- Best‑Practice Kontrol Tablosu
- Gerçek Örnekler
- Kişisel Blog ve Alt Domain
- Küçük İşletme E‑Posta Çözümü
- Yedekleme Senaryosu (Snapshot + Backup)
- Sonuç
İçinde WordPress, e‑posta ve DNS’i tek bir sunucuda barındırmak, veri kontrolünü elinize alır. Sunucu donanımı ve yazılımı kendi yönetin, yetkisiz erişimi azaltın.
Bu rehber, üç kritik bileşeni güvenli bir biçimde birleştirmeye odaklanır. Her adım, en az ayrıcalık, düzenli yedekleme ve izlenebilir loglamaya dayanır.
Veri gizliliği, maliyet düşüşü ve gerçek‑zaman izleme, ev sunucusunun ana avantajlarıdır. Bilgiyi elinizde tutmak, saldırı yüzeyini küçültür ve operasyonel özerkliği artırır.
Şimdi WordPress güvenlik ayarlarından Postfix/Dovecot kurulumuna ve BIND ile DNS yapılandırmasına adım adım geçelim. Her bölümde olası hataları ve geri alma yöntemlerini bulacaksınız.
Ev Sunucusu ile: Neden Önemli?
Bulut sağlayıcılarının otomatik güncellemeleri ve veri saklama politikaları, kontrolü sınırlayabilir. Ev sunucusunda güncellemeleri kendi hızınızda uygulayabilirsiniz.
WordPress, mail ve DNS aynı sunucuda çalışırsa tek bir açık tüm hizmetleri etkileyebilir. Yerel yapılandırma, açığı izole etmenize ve hızlı bir rollback planı oluşturmanıza imkan verir.
Veri kaybı, saldırı sonrası ortaya çıkabilir. Yedekleme prosedürleri tamamen sizin sorumluluğunuzdadır. Şifreli, sürüm kontrolü ile yerinde saklama, kayıp riskini azaltır.
Bulut maliyetleri yıllık abonelik ve veri transfer ücretleriyle artarken, ev sunucusunda sabit maliyetler bulunur. Enerji, ekipman ömrü ve bakım giderleri göz önünde bulundurulmalı.
Log toplama, anormallik tespitini hızlandırır. syslog, journald ve auditd ile tam izlenebilirlik sağlanır. Bu loglar denetimde kanıt olarak kullanılır.
Least privilege, kullanıcı ve servis hesapları için ayrı, en az ayrıcalıklı erişim seviyeleri belirler. Örneğin, WordPress veritabanı yalnızca okuma/yazma yetkisine sahip olmalı.
Rollback stratejileri, güncelleme hatalarında hızlı geri dönüş için kritiktir. Snapshot ve yedekleme araçları, 15 dakikalık kesintiden önceki duruma dönmeyi mümkün kılar.
Ek olarak, güvenlik açıklarını izlemek için OSSEC veya Wazuh gibi host‑based IDS’ler kurmak, saldırı anında uyarı almanızı sağlar. Bu araçlar, sistem çağrılarını, kullanıcı girişlerini ve dosya değişikliklerini anlık izler.
Gereksinimler

Kurulumdan önce donanım, yazılım ve ağ yapılandırmasını netleştirin.
Donanım
En az 4 çekirdekli CPU, 8 GB RAM, 500 GB SSD ve 1 TB HDD önerilir. UPS, ani kapanma riskini ortadan kaldırır.
| Yeterli | İdeal |
|---|---|
| CPU: 2 çekirdek, 2 GHz | CPU: 4 çekirdek, 3 GHz |
| RAM: 4 GB | RAM: 8 GB |
| Depolama: 256 GB SSD | Depolama: 500 GB SSD + 1 TB HDD |
| UPS: 500 VA | UPS: 1000 VA, 2 saat çalışma süresi |
Yazılım
Ubuntu 24.04 LTS, Docker Engine, BIND9, Postfix, Dovecot, MySQL, PHP‑FPM ve Cert‑bot temel bileşenlerdir.
Örnek apt install:
sudo apt update sudo apt install -y docker.io bind9 postfix dovecot-core dovecot-imapd dovecot-pop3d mysql-server php-fpm php-mysql certbot
Yöntem karşılaştırma tablosu: Docker vs. native paket yönetimi
| Yöntem | Avantajlar | Dezavantajlar |
|---|---|---|
| Docker | Hızlı kurulum, bağımsız konteynerler | Ek kaynak tüketimi, snapshot yönetimi zor |
| Ağ Paketleri | Düşük kaynak, yerel yönetim | Yeniden kurulum zaman alıcı |
Ağ
Sabit IP, port yönlendirme ve DNS yapılandırması kritik. 80, 443, 25, 587, 143, 993 portlarını yönlendirin. BIND9 zone dosyası örneği:
$TTL 600 @ IN SOA ns1.example.com. admin.example.com. ( 2024040601 ; serial 604800 ; refresh 86400 ; retry 2419200 ; expire 604800 ) ; minimum @ IN NS ns1.example.com. @ IN A 203.0.113.10 ns1 IN A 203.0.113.10 www IN CNAME @ mail IN A 203.0.113.10
Rollback & Backup
Snapshot ile tüm sistem durumunu 15 dakika içinde geri döndürün. LVM veya Btrfs snapshotları kullanın. MySQL için mysqldump, WordPress dizini için rsync ile günlük yedek alın.
Risk ve rollback noktası tablosu:
| Risk | Rollback Noktası | Geri Dönüş Yöntemi |
|---|---|---|
| WordPress Güncelleme Hatası | WP-CLI ile wp core update öncesi wp db export |
Veritabanı yedeği geri yükle |
| Postfix Yapılandırma Değişikliği | Configuration directory snapshot | Snapshot’ı btrfs restore ile geri yükle |
| DNS Zone Güncelleme | Zone dosyası snapshot | İlk haliyle yeniden yükle |
| Sistemsel Güncelleme | İlk snapshot | Rollback için systemctl reboot ile snapshot’dan başla |
En İyi Uygulamalar
- Least privilege: Her servis kendi kullanıcı hesabıyla çalışmalı.
- Loglama:
journald,syslog-ngveauditdile tam izlenebilirlik. - SSL/TLS: Let’s Encrypt ile otomatik yenileme.
- Port güvenliği:
ufwile sadece gerekli portları açın.
Uygulama Adımları

Ağ Yapılandırması
- Sunucuya sabit IP atayın. Örneğin
203.0.113.10. - Yönlendiricide 80, 443, 25, 587, 143, 993 portlarını
203.0.113.10IP’ine yönlendirin. - UFW ile sadece gerekli portları açın:
ufw allow 80,443,25,587,143,993/tcp. - DNS için TTL’i 600 saniye altına düşürün; hızlı değişiklik için kritik.
- Firewall’da
ufw deny 22/tcpile SSH’ye sadece yetkili IP’lerden erişim izni verin.
BIND9 DNS Kurulumu ve Zone Dosyası
apt-get install bind9 bind9utils bind9-doc- Zone dosyasını
/etc/bind/db.example.comiçinde oluşturun:$TTL 600 @ IN SOA ns1.example.com. admin.example.com. ( 2024040601 ; serial 604800 ; refresh 86400 ; retry 2419200 ; expire 604800 ) ; minimum @ IN NS ns1.example.com. @ IN A 203.0.113.10 ns1 IN A 203.0.113.10 www IN CNAME @ mail IN A 203.0.113.10 - BIND’in
/etc/bind/named.conf.localdosyasına zone’ı ekleyin:zone "example.com" IN { type master; file "/etc/bind/db.example.com"; }; - Servisi yeniden başlatın:
systemctl restart bind9. - DNS sorgularını
dig @203.0.113.10 mail.example.comile test edin.
WordPress Kurulumu
- MySQL kuruluysa veri tabanı oluşturun:
mysql -u root -p -e "CREATE DATABASE wordpress; CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'root_pass'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost'; FLUSH PRIVILEGES;" - Web dizini
/var/www/htmlolarak ayarlayın ve yetkileri sınırlandırın:chown -R www-data:www-data /var/www/html. - WP-CLI ile kurulumu tamamlayın:
wp core download --path=/var/www/html wp config create --path=/var/www/html --dbname=wordpress --dbuser=wpuser --dbpass=root_pass --dbhost=localhost wp core install --path=/var/www/html --url="https://example.com" --title="Ev Sunucusu" --admin_user="admin" --admin_password="admin_pass" --admin_email="[email protected]"
- Apache yapılandırma dosyası
/etc/apache2/sites-available/ev-sunucu.conf:<VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/html Redirect permanent / https://example.com/ </VirtualHost> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem </VirtualHost> - Site’i etkinleştirin:
a2ensite ev-sunucu,systemctl reload apache2. - WordPress’in dosya izinlerini 644/755 olarak kurun:
find /var/www/html -type d -exec chmod 755 {} \;,find /var/www/html -type f -exec chmod 644 {} \;.
E‑posta Sunucusu (Postfix + Dovecot)
- Postfix kurun:
apt-get install postfix. “Internet Site” seçin veexample.comgirin. - Postfix yapılandırması
/etc/postfix/main.cf:
myhostname = mail.example.com
mydestination = $myhostname, example.com, localhost.$mydomain, localhost
inet_interfaces = all
inet_protocols = all
myorigin = /etc/mailname
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_use_tls = yes
smtpd_tls_security_level = encrypt
smtpd_tls_auth_only = yes
smtpd_tls_ciphers = high
smtpd_tls_protocols = TLSv1.2, TLSv1.3
smtpd_tls_exclude_ciphers = ALL-EXP, RC4, DES, MD5, SHA1, SSLv2, SSLv3
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
apt-get install dovecot-core dovecot-imapd dovecot-pop3d./etc/dovecot/dovecot.conf:protocols = imap pop3 lmtp ssl = required ssl_cert =
systemctl restart postfix dovecot.SSL Entegrasyonu (Let’s Encrypt)
- Certbot kurun:
apt-get install certbot python3-certbot-apache python3-certbot-dovecot. - Doğrulama ve sertifika alımı:
certbot certonly --apache -d example.com -d www.example.com -d mail.example.com
- Postfix ve Dovecot dosyalarını otomatik yenileme için
/etc/letsencrypt/renewal-hooks/deployiçinde script ekleyin:#!/bin/bash systemctl reload postfix systemctl reload dovecot
- Sertifika süresini kontrol edin:
certbot certificates.
Sorun Giderme & Rollback
DNS TTL Gecikmesi
TTL değeri düşükse değişiklikler hemen uygulanmaz. Adım 1: /etc/hosts dosyasında geçici IP yönlendirme ekleyin. Adım 2: DNS sunucusunda TTL’i 60 saniyeye düşürün. Adım 3: dig @dns.example.com mail.example.com +trace ile kontrol edin. Adım 4: TTL’i 3600 saniyeye yükseltin.
WordPress 500 Hatası
500 hatası dosya izinleri eksikse veya tema hatası varsa ortaya çıkar. İzinleri kontrol edin: wp-content 755, dosyalar 644; wp-config.php 600. Adım 1: .htaccess dosyasını yedekleyin. Adım 2: WordPress’i varsayılan temaya geçin. Adım 3: eklenti sayısını sıfırla. Adım 4: php.ini’de memory_limiti artırın. Adım 5: logları /var/log/apache2/error.log’da inceleyin.
Mail Sunucusu Port Çatışması
Postfix ve Dovecot genelde 25, 143 ve 587 portlarını kullanır. Aynı port başka servis tarafından çalışıyorsa çatışma olur. Adım 1: netstat -tuln ile port kullanımını kontrol edin. Adım 2: Çakışan servisi durdurun: systemctl stop apache2. Adım 3: Postfix’i yeniden başlatın: systemctl restart postfix. Adım 4: Dovecot portunu /etc/dovecot/dovecot.conf’da 993’e taşıyın. Adım 5: SSL sertifikasını yeniden yükleyin.
Yedek Alma ve Restore Adımları
Adım 1: MySQL yedekleme: mysqldump -u root -p --all-databases > all.sql. Adım 2: Dosya sistem yedeği: rsync -avz /var/www/html /backup/html. Adım 3: Postfix ve Dovecot yapılandırmalarını /etc/backup/ dizinine kopyalayın.
Restore için:
- MySQL yedeğini yükleyin:
mysql -u root -p < all.sql. - Dosya sistemini geri yükleyin:
rsync -avz /backup/html /var/www/html. - Postfix/Dovecot yapılandırmalarını geri taşıyın ve servisleri yeniden başlatın.
- SSL sertifikasını certbot ile yeniden başlatın:
certbot renew --deploy-hook "systemctl reload postfix dovecot".
Rollback Stratejisi
Yedek alımı, değişiklik öncesi kritik. Her güncellemeden önce tam yedek alın. Gerekirse snapshot ile anlık geri dönüş yapılabilir. Rollback planı sürüm kontrol sisteminde saklanmalı.
Sistemsel Güncelleme Sorunları
Ubuntu 24.04 LTS’de apt upgrade sonrası kernel değişikliği, grub yapılandırmasını günceller. Sorun yaşarsanız, GRUB_TIMEOUT=0 ekleyerek doğrudan kök çekirdeğe atlayın. Yedek grub dosyası: cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak.
Optimizasyon & En İyi Uygulamalar
Dosya İzinleri ve SELinux / AppArmor
Web kök dizini ve e‑posta klasörleri için 644 dosya, 755 klasör izinleri belirleyin. Sahipliği www-data kullanıcısına verin. SELinux aktifse httpd_can_network_connect ve httpd_enable_homedirs booleanlarını setsebool -P ile açın. AppArmor için /etc/apparmor.d/apache2 içinde /var/www/html/** r, ve owner izinlerini kontrol edin.
Önbellekleme (Redis, Varnish)
Redis’i yalnızca localhost üzerinden erişime açın (bind 127.0.0.1), requirepass ile şifreleme yapın ve save "" ile kalıcı saklama devre dışı bırakın. Varnish’i 80 portunda dinleyip, backend default { .host = "127.0.0.1"; .port = "8080"; } ile Apache’e yönlendirin. Cache-control başlıklarını Cache-Control: max-age=300, public olarak ayarlayarak 5 dakikalık önbellek süresi elde edin.
Log Rotasyonu ve İzlenebilirlik
Her servis için /etc/logrotate.d/ içinde günlük log dosyalarını 7 gün saklayın, sıkıştırın ve rotate 7 ile eski logları silin. logrotate çalıştırıldığında systemctl reload komutuyla servislere log yeniden açılmasını bildirin. syslog-ng ile merkezi log toplayıcıya yönlendirme ekleyerek izlenebilirliği artırın.
Least Privilege Uygulaması
Apache, Postfix, Dovecot ve Redis’i root değil, kendi kullanıcıları altında çalıştırın. sudoers dosyasında sadece gerekli komutlara izin verin: örn. www-data ALL=(ALL) NOPASSWD:/usr/sbin/apache2ctl. Dosya ve dizin erişimlerini chmod ile minimum seviyeye indirin; gereksiz 777 izinlerinden kaçının.
Best‑Practice Kontrol Tablosu
| Alan | Doğrulama |
|---|---|
| Dosya İzinleri | 644 / 755, www-data sahibi |
| SELinux Booleanlar | httpd_can_network_connect, httpd_enable_homedirs |
| Redis Konfigürasyonu | bind 127.0.0.1, requirepass, save "" |
| Varnish Backend | localhost:8080, Cache‑Control 300s |
| Log Rotasyonu | rotate 7, compress, postrotate reload |
| Least Privilege | Root olmayan kullanıcılar, sudoers NOPASSWD |
| Günlük Log İzleme | syslog-ng + SIEM entegrasyonu |
| SSL Sertifikası Yenileme | Certbot otomatik deploy hook |
| Snapshot Otomasyonu | crontab: 0 2 * * * btrfs subvolume snapshot / /srv/backup/root_$(date +%F) |
| Veri Yedekleme | mysqldump + rsync periyotluk |
| Port Güvenliği | ufw deny 22/tcp, izin verilen IP listesi |
| Uygulama Güncelleme | WP-CLI update önce yedek, rollback test |
| Sunucu Güncelleme | GRUB backup, kernel rollback |
Gerçek Örnekler
Kişisel Blog ve Alt Domain
WordPress’i blog.mydomain.com alt domainine kurarak ana web sunucusundan izole bir ortam yaratın. virtualhost dosyasında DocumentRoot /srv/blog ve ServerName blog.mydomain.com ayarlarını yapın. SSL için Let’s Encrypt sertifikası, postfix ve dovecot ile aynı subdomain üzerinden e‑posta gönderimini etkinleştirin. Logları /srv/blog/logs içine yönlendirin ve logrotate ile 30 gün saklayın.
Küçük İşletme E‑Posta Çözümü
İşletme alan adı company.com için mail.company.com subdomaini oluşturun. Postfix’in myhostname alanını bu subdomain olarak ayarlayın, smtpd_tls_security_level=may ile şifreli bağlantı zorunlu edin. Dovecot’da mail_location olarak maildir:/srv/mail/%d/%n yapılandırın. Kullanıcı dizinlerini 700 izinleriyle kısıtlayın, postfix ve dovecot servislerini ayrı kullanıcılar altında çalıştırın.
Yedekleme Senaryosu (Snapshot + Backup)
Sunucu snapshot’ı için btrfs subvolume snapshot / /srv/backup/root_$(date +%F) komutunu kullanın. Veri tabanı yedeklemesi için mysqldump --single-transaction --quick --lock-tables=false --databases wpdb > /srv/backup/db_$(date +%F).sql. Özel dosya yedekleri için rsync -avz /srv/blog/ /srv/backup/blog_$(date +%F)/. Snapshot ve dosya yedeklerini haftalık olarak cron üzerinden daily_backup.sh scriptiyle otomatikleştirin. Geri yükleme sırasında önce snapshot’ı btrfs restore, ardından mysqldump restore dosyasını mysql ile geri yükleyin.
Sonuç
Ev sunucusu kurmak, güvenlik, dayanıklılık ve performansın birleştiği bir ekosistem oluşturur. En az ayrıcalık ile servisleri çalıştırın; dosya izinlerini 700, kullanıcı dizinlerini 700 olarak ayarlayın. Günlük logları /srv/blog/logs konumuna yönlendirin ve logrotate ile 30‑günlük döngü sağlayın. Snapshot + mysqldump + rsync kombinasyonu ile haftalık cron otomasyonu oluşturun. TLS zorunlu olmalı, sertifika Let's Encrypt üzerinden otomatik yenilenmeli ve SMTP/IMAP için güvenli bağlantı tercih edilmeli.
İleri adımlar için; Kurulum rehberi, Sorun giderme, Güvenlik notları ve WordPress Hardening belgelerini derinlemesine inceleyin. Monit veya Prometheus + Grafana ile servis izlenebilirliği ekleyin.
Son kontrol listesi:
- Postfix ve Dovecot ayrı kullanıcılarla çalışıyor mu?
- MySQL yedeği günlük olarak alınıyor ve restore senaryosu test edildi mi?
- Logrotates 30 gün saklanıyor, eski loglar arşivleniyor mu?
- TLS sertifikası otomatik yenileniyor ve sertifika süresi kritik bir aşamaya gelmeden uyarı gönderiliyor mu?
- Btrfs snapshot günlük otomasyonuyla saklanıyor ve restore adımları belgelendi mi?
- Dosya izinleri ve grup/owner rolleri en az ayrıcalık ilkesine uygun mu?
- Ana alarm ve e‑posta bildirimleri yapılandırıldı mı?
- Yedek dosyaları güvenli bir harici ortamda saklanıyor mu?
Bu adımları tamamladığınızda ev sunucusu ortamı güvenli, izlenebilir ve sürdürülebilir bir sistem haline gelir. Operasyonel disiplin ve düzenli kontrollerle kritik hizmetlerin sürekliliğini sağlar.



