2025-10-26
VPS, Dokploy ve Cloudflared ile Uygun Maliyetli Private Sunucu Kurulumu
VPS, Dokploy deployment platformu ve Cloudflared tunnel kullanarak güvenli, uygun maliyetli private sunucu kurulumu için pratik bir rehber
Neden Bu Stack?
Private sunucu çalıştırmak için pahalı cloud faturalarına ya da karmaşık infrastructure’lara ihtiyacınız yok. Çeşitli deployment setupları ile çalışırken öğrendiğim şey, en iyi çözümün genellikle kurumsal platformlar yerine basit, odaklanmış araçları birleştirmekte yattığı oldu.
Bu rehber, production-ready bir private sunucu kurulumunu anlatıyor:
- VPS uygun maliyetli compute için (~$5-20/ay)
- Dokploy temiz bir UI ile Docker-tabanlı deployment’lar için
- Cloudflared port açmadan güvenli erişim için
Toplam maliyet? Birden fazla uygulamayı güvenli şekilde çalıştıran temel bir kurulum için ayda yaklaşık $5-10.
Gereksinimler
Başlamadan önce ihtiyacınız olanlar:
- Bir domain name (Cloudflare tunnel için)
- Temel terminal/SSH bilgisi
- Cloudflare hesabı (ücretsiz tier yeterli)
- ~30 dakika kurulum süresi
Mimari Genel Bakış
İşte kuracağımız yapı:
Bu kurulumun güzelliği: sunucunuz asla doğrudan port açmıyor. Tüm trafik Cloudflare’in şifreli tunnel’ından akıyor.
Adım 1: VPS Seçimi ve İlk Kurulum
Provider Seçimi
Birkaç VPS provider ile çalıştım. İşte bütçe dostu seçenekler hakkında öğrendiklerim:
Hetzner ($5-10/ay):
- Mükemmel fiyat/performans oranı
- Avrupa data center’ları (GDPR uyumluluğu için iyi)
- Güvenilir network
- Production workload’ları için harika
Contabo ($4-8/ay):
- Çok uygun fiyatlı
- Fiyatına göre daha fazla kaynak
- Peak saatlerde network tutarsız olabiliyor
DigitalOcean ($6-12/ay):
- Mükemmel dokümantasyon
- Öngörülebilir performans
- Harika community desteği
Bu rehberde Hetzner kullanacağım, ama komutlar tüm provider’larda çalışıyor.
Minimum Özellikler
Dokploy ve birkaç küçük uygulama için:
- RAM: Minimum 2GB (4GB önerilir)
- CPU: 1-2 core
- Storage: Minimum 20GB SSD
- OS: Ubuntu 22.04 LTS
İlk Sunucu Kurulumu
VPS’iniz hazır olduktan sonra SSH ile bağlanın:
ssh root@your-server-ip
İlk olarak sistemi güncelleyin:
apt update && apt upgrade -y
Adım 2: Güvenlik Sağlamlaştırma
İşte öğrendiğim şey: şimdi güvenliğe 15 dakika ayırın, sonra saatlerce baş ağrısından kurtulun.
Root Olmayan Kullanıcı Oluşturma
# Kullanıcı oluştur
adduser deploy
usermod -aG sudo deploy
# Sudo erişimini test et
su - deploy
sudo ls -la /root
SSH Key Authentication Kurulumu
Local makinenizde:
# SSH key oluştur (yoksa)
ssh-keygen -t ed25519 -C "[email protected]"
# Sunucuya kopyala
ssh-copy-id deploy@your-server-ip
SSH Konfigürasyonunu Sağlamlaştırma
Sunucuya geri dönün:
sudo nano /etc/ssh/sshd_config
Bu ayarları güncelleyin:
# Root login'i devre dışı bırak
PermitRootLogin no
# Password authentication'ı devre dışı bırak
PasswordAuthentication no
PubkeyAuthentication yes
# Default port'u değiştir (opsiyonel ama önerilir)
Port 2222
# Boş şifreleri devre dışı bırak
PermitEmptyPasswords no
SSH’ı yeniden başlatın:
sudo systemctl restart sshd
Warning: Mevcut SSH oturumunuzu kapatmadan önce, yeni konfigürasyonu ayrı bir terminalde test edin. Bir sorun varsa, düzeltmek için hâlâ erişiminiz var.
Firewall Konfigürasyonu (UFW)
# Default'ları ayarla
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH'a izin ver (custom port kullandıysanız onu kullanın)
sudo ufw allow 2222/tcp
# Firewall'ı etkinleştir
sudo ufw enable
# Durumu kontrol et
sudo ufw status verbose
fail2ban Kurulumu
Brute force saldırılara karşı korur:
sudo apt install fail2ban -y
# Local config oluştur
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
SSH bölümünü güncelleyin:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
fail2ban’i başlatın:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Adım 3: Dokploy Kurulumu
Dokploy, Docker ile Heroku benzeri bir deployment deneyimi sağlıyor. İşte faydalı olmasının nedenleri: basit web UI, built-in database desteği ve kolay uygulama deployment’ı.
Docker Kurulumu
# Docker'ı kur
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Kullanıcıyı docker grubuna ekle
sudo usermod -aG docker deploy
# Docker servisini etkinleştir
sudo systemctl enable docker
sudo systemctl start docker
# Kurulumu doğrula
docker --version
Tip: Docker grup değişikliğinin etkili olması için çıkış yapıp tekrar giriş yapın.
Dokploy Kurulumu
# Tek satırda kurulum
curl -sSL https://dokploy.com/install.sh | sh
Bu script:
- Docker’ı kurmuyor ise kuruyor
- Dokploy servislerini kuruyor
- Web interface’i konfigüre ediyor
- Dokploy dashboard’unu başlatıyor
Kurulumdan sonra Dokploy 3000 portunda çalışıyor. Ama şöyle bir şey var: bu portu doğrudan açmayacağız. İşte Cloudflared burada devreye giriyor.
Adım 4: Cloudflared Tunnel Kurulumu
Port açmak yerine, Cloudflare üzerinden güvenli bir tunnel oluşturacağız. Bu yaklaşımın öğrenmeye değer birkaç avantajı var:
- Port forwarding gerekmez
- Built-in DDoS koruması
- Ücretsiz SSL sertifikaları
- Trafik analytics
Cloudflared Kurulumu
# İndir ve kur
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
Cloudflare ile Authentication
cloudflared tunnel login
Bu tunnel’ı authorize etmek için bir browser açıyor. Domain’inizi seçin.
Tunnel Oluşturma ve Konfigürasyon
# Tunnel oluştur
cloudflared tunnel create dokploy-server
# Çıktıdan tunnel ID'yi not edin
Konfigürasyon dosyası oluşturun:
sudo mkdir -p /etc/cloudflared
sudo nano /etc/cloudflared/config.yml
Bu konfigürasyonu ekleyin:
tunnel: YOUR-TUNNEL-ID
credentials-file: /root/.cloudflared/YOUR-TUNNEL-ID.json
ingress:
# Dokploy dashboard
- hostname: dokploy.yourdomain.com
service: http://localhost:3000
# Catch-all rule (gerekli)
- service: http_status:404
DNS Setup
# DNS kaydı oluştur
cloudflared tunnel route dns dokploy-server dokploy.yourdomain.com
Tunnel’ı Servis Olarak Çalıştırma
# Servis olarak kur
sudo cloudflared service install
# Servisi başlat
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
# Durumu kontrol et
sudo systemctl status cloudflared
Şimdi https://dokploy.yourdomain.com adresini ziyaret edin - Cloudflare tunnel üzerinden güvenli şekilde erişilen Dokploy dashboard’unu görmelisiniz.
Adım 5: İlk Uygulamanızı Deploy Etme
Her şeyin çalıştığını doğrulamak için basit bir Node.js uygulaması deploy edelim.
Dokploy’da Uygulama Oluşturma
- Dokploy dashboard’unu açın (
https://dokploy.yourdomain.com) - İlk setup’ı tamamlayın (admin hesabı oluşturun)
- “Create Project” tıklayın
- “Application” seçin
Örnek: Node.js App Deploy
İşte temel bir deployment konfigürasyonu:
Proje Yapısı:
my-app/
├── Dockerfile
├── package.json
└── src/
└── index.js
Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
package.json:
{
"name": "my-app",
"version": "1.0.0",
"main": "src/index.js",
"dependencies": {
"express": "^4.18.2"
}
}
src/index.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.json({
message: 'Hello from Dokploy!',
timestamp: new Date().toISOString()
});
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
Deployment Konfigürasyonu
Dokploy’da:
- Git repository’nizi bağlayın (GitHub, GitLab, vb.)
- Build ayarlarını yapın (Dockerfile-tabanlı)
- Port’u ayarlayın: 3000
- Deploy edin!
Uygulamanız İçin Tunnel Route Ekleme
/etc/cloudflared/config.yml dosyasını güncelleyin:
tunnel: YOUR-TUNNEL-ID
credentials-file: /root/.cloudflared/YOUR-TUNNEL-ID.json
ingress:
# Dokploy dashboard
- hostname: dokploy.yourdomain.com
service: http://localhost:3000
# Uygulamanız
- hostname: app.yourdomain.com
service: http://localhost:8080
- service: http_status:404
DNS oluşturun ve yeniden başlatın:
cloudflared tunnel route dns dokploy-server app.yourdomain.com
sudo systemctl restart cloudflared
İzleme ve Bakım
Kaynak İzleme
İşte işleri sorunsuz çalışır halde tutan basit kontroller:
# Disk alanını kontrol et
df -h
# Memory kullanımını kontrol et
free -h
# Docker kaynak kullanımını kontrol et
docker stats --no-stream
# Aktif container'ları kontrol et
docker ps
Log Yönetimi
# Dokploy loglarını görüntüle
docker logs dokploy
# Cloudflared loglarını görüntüle
sudo journalctl -u cloudflared -f
# Dokploy'da belirli container loglarını görüntüle
docker logs <container-name>
Backup Stratejisi
Backup’lar hakkında öğrendiğim şey: erken otomatize edin.
# Backup script'i oluştur
nano ~/backup.sh
#!/bin/bash
BACKUP_DIR="/home/deploy/backups"
DATE=$(date +%Y%m%d_%H%M%S)
# Backup dizini oluştur
mkdir -p $BACKUP_DIR
# Dokploy data'yı yedekle
docker run --rm \
-v dokploy_data:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/dokploy_$DATE.tar.gz -C /data .
# Sadece son 7 günü tut
find $BACKUP_DIR -name "dokploy_*.tar.gz" -mtime +7 -delete
echo "Backup completed: dokploy_$DATE.tar.gz"
Executable yapın ve zamanla:
chmod +x ~/backup.sh
# Crontab'a ekle (her gün saat 2'de)
crontab -e
# Ekle: 0 2 * * * /home/deploy/backup.sh
Güncelleme Prosedürü
# Sistem paketlerini güncelle
sudo apt update && sudo apt upgrade -y
# Dokploy'u güncelle (en son için dokümantasyona bakın)
docker pull dokploy/dokploy:latest
# Cloudflared'i güncelle
sudo cloudflared update
Yaygın Sorunların Çözümü
Tunnel Bağlantı Sorunları
Cloudflared tunnel’ınız bağlanmıyorsa:
# Servis durumunu kontrol et
sudo systemctl status cloudflared
# Logları kontrol et
sudo journalctl -u cloudflared -n 50
# Config syntax'ını doğrula
cloudflared tunnel validate /etc/cloudflared/config.yml
# Tunnel'ı manuel test et
cloudflared tunnel run dokploy-server
Dokploy’a Erişilemiyor
# Dokploy çalışıyor mu kontrol et
docker ps | grep dokploy
# Dokploy loglarını kontrol et
docker logs dokploy
# Dokploy'u yeniden başlat
docker restart dokploy
Port Zaten Kullanımda
“Port already in use” hatası alıyorsanız:
# Portu neyin kullandığını bul
sudo lsof -i :3000
# Ya da netstat kullan
sudo netstat -tulpn | grep :3000
Docker Storage Sorunları
# Docker disk kullanımını kontrol et
docker system df
# Kullanılmayan kaynakları temizle
docker system prune -a
# Belirli container'ları/image'leri kaldır
docker rm <container-id>
docker rmi <image-id>
Maliyet Dökümü
İşte bu kurulumun gerçek maliyeti:
| Bileşen | Aylık Maliyet |
|---|---|
| VPS (Hetzner 2GB) | $5-6 |
| Domain name | $1-2 (yıllık, bölünmüş) |
| Cloudflare Tunnel | Ücretsiz |
| Dokploy | Ücretsiz (açık kaynak) |
| Toplam | ~$6-8/ay |
Managed platformlarla karşılaştırın:
- Heroku: Benzer kaynaklar için $25-50/ay
- AWS Lightsail: $10-20/ay (tunnel/UI olmadan)
- Managed Kubernetes: Minimum $50-100/ay
Öğrenilenler
Bu stack ile birkaç deployment üzerinde çalışırken, işte öne çıkanlar:
İyi Çalışanlar:
- Güvenlik öncelikli yaklaşım: Cloudflared tüm bir güvenlik endişesi sınıfını ortadan kaldırıyor. Açık port yok, port tarama saldırıları yok demek.
- Basit güncellemeler: Dokploy, Kubernetes karmaşıklığı olmadan container orchestration’ı halediyor.
- Maliyet kontrolü: Sabit aylık maliyet, trafik artışlarından sürpriz fatura yok.
- Developer experience: Git push ile deploy, vendor lock-in olmadan modern hissettiriyor.
Göz Önünde Bulundurulması Gereken Trade-off’lar:
- Single point of failure: Bir VPS, donanım arızalanırsa downtime demek. Kritik uygulamalar için multiple region düşünün.
- Manuel scaling: Managed platformların aksine, scaling ek VPS instance’ları oluşturmak ve load balancing demek.
- Backup sorumluluğu: Backup stratejisinin sahibi sizsiniz. Otomatize edin ya da veri kaybı riski alın.
- Sınırlı kaynaklar: $5’lık bir VPS binlerce concurrent kullanıcı kaldırmaz. Limitinizi bilin.
Farklı Yapacağım Şeyler:
- Monitoring’i daha erken kurardım (Uptime Robot gibi)
- İlk setup adımlarını hemen dokümante ederdim
- İlk günden staging environment oluştururdum
- Güvenlik güncellemelerini unattended-upgrades ile otomatize ederdim
Sonraki Adımlar
Temel kurulumunuz çalıştıktan sonra, düşünün:
- Monitoring ekleyin: Availability kontrolleri için Uptime Robot veya benzeri kurun
- Otomatik güncellemeleri etkinleştirin: Güvenlik patch’leri için unattended-upgrades konfigüre edin
- Database’leri kurun: Dokploy out-of-the-box PostgreSQL, MySQL, MongoDB destekliyor
- Staging environment oluşturun: Test için ikinci bir ucuz VPS’e kurulumunuzu klonlayın
- CI/CD implement edin: Dokploy deployment’larını tetiklemek için GitHub Actions’ı bağlayın
Sonuç
Bu VPS + Dokploy + Cloudflared stack’i, pahalı managed platformlar ile karmaşık self-hosted setup’lar arasında pratik bir orta yol sağlıyor. Toplam setup süresi yaklaşık 30-45 dakika, devam eden bakım minimal - güncellemeler ve monitoring için ayda belki bir saat.
Bu yaklaşım özellikle şunlar için iyi çalışıyor:
- Yan projeler ve küçük uygulamalar
- Cloud platform karmaşıklığı olmadan DevOps öğrenmek
- Vendor lock-in olmadan deployment basitliği isteyen takımlar
- Orta düzey trafiğe sahip maliyet bilincine sahip production workload’ları
Mükemmel mi? Hayır. Managed platform kolaylığını maliyet tasarrufu ve kontrol için takas ediyorsunuz. Ama birçok kullanım durumu için, bu tam olarak doğru trade-off.
Burada kullanılan infrastructure pattern’leri - containerization, reverse proxying, secure tunneling - ölçekte kullanılan aynı pattern’ler. Bütçe dostu bir platform üzerinde production-grade konseptler öğreniyorsunuz.
Basit başlayın, kaynaklarınızı izleyin ve gerçekten ihtiyacınız olduğunda ölçeklendirin. Bu genellikle ilk günden aşırı mühendislik yapmaktan daha pratik.
İlgili yazılar
Organizasyon düzeyinde paylaşımlı bir GitHub Actions platformu kurmak için pratik bir rehber: mimari kararlar, güvenlik yönetişimi, benimseme stratejisi ve bu süreçte yaptığımız en büyük 7 hata.
AWS Secrets Manager ve Systems Manager Parameter Store'u karşılaştıran kapsamlı teknik rehber - hangi servisi ne zaman kullanmalı ve gerçek dünya implementation pattern'leri.
TypeScript ile organizasyonunuzun internal sistemleri için custom Model Context Protocol serverları nasıl geliştirip, güvenli hale getirip, deploy edeceğinizi öğren. Authentication, monitoring ve Kubernetes deployment örnekleriyle.
Geliştiriciler için pratik bir ağ kavramları sözlüğü - protokollerden DNS'e, debugging araçlarından güvenlik temellerine.
nginx kullanmayı bilen geliştiriciler için pratik Traefik rehberi. Temel kavramlar, kurulum örnekleri ve geleneksel reverse proxy'lere göre Traefik'i ne zaman seçeceğinizi öğrenin.