Skip to content
~/sph.sh

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:

bash
ssh root@your-server-ip

İlk olarak sistemi güncelleyin:

bash
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

bash
# Kullanıcı oluşturadduser deployusermod -aG sudo deploy
# Sudo erişimini test etsu - deploysudo ls -la /root

SSH Key Authentication Kurulumu

Local makinenizde:

bash
# SSH key oluştur (yoksa)ssh-keygen -t ed25519 -C "[email protected]"
# Sunucuya kopyalassh-copy-id deploy@your-server-ip

SSH Konfigürasyonunu Sağlamlaştırma

Sunucuya geri dönün:

bash
sudo nano /etc/ssh/sshd_config

Bu ayarları güncelleyin:

text
# Root login'i devre dışı bırakPermitRootLogin no
# Password authentication'ı devre dışı bırakPasswordAuthentication noPubkeyAuthentication yes
# Default port'u değiştir (opsiyonel ama önerilir)Port 2222
# Boş şifreleri devre dışı bırakPermitEmptyPasswords no

SSH'ı yeniden başlatın:

bash
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)

bash
# Default'ları ayarlasudo ufw default deny incomingsudo ufw default allow outgoing
# SSH'a izin ver (custom port kullandıysanız onu kullanın)sudo ufw allow 2222/tcp
# Firewall'ı etkinleştirsudo ufw enable
# Durumu kontrol etsudo ufw status verbose

fail2ban Kurulumu

Brute force saldırılara karşı korur:

bash
sudo apt install fail2ban -y
# Local config oluştursudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localsudo nano /etc/fail2ban/jail.local

SSH bölümünü güncelleyin:

ini
[sshd]enabled = trueport = 2222filter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 3600

fail2ban'i başlatın:

bash
sudo systemctl enable fail2bansudo 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

bash
# Docker'ı kurcurl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh
# Kullanıcıyı docker grubuna eklesudo usermod -aG docker deploy
# Docker servisini etkinleştirsudo systemctl enable dockersudo systemctl start docker
# Kurulumu doğruladocker --version

Tip: Docker grup değişikliğinin etkili olması için çıkış yapıp tekrar giriş yapın.

Dokploy Kurulumu

bash
# Tek satırda kurulumcurl -sSL https://dokploy.com/install.sh | sh

Bu script:

  1. Docker'ı kurmuyor ise kuruyor
  2. Dokploy servislerini kuruyor
  3. Web interface'i konfigüre ediyor
  4. 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

bash
# İndir ve kurwget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.debsudo dpkg -i cloudflared-linux-amd64.deb

Cloudflare ile Authentication

bash
cloudflared tunnel login

Bu tunnel'ı authorize etmek için bir browser açıyor. Domain'inizi seçin.

Tunnel Oluşturma ve Konfigürasyon

bash
# Tunnel oluşturcloudflared tunnel create dokploy-server
# Çıktıdan tunnel ID'yi not edin

Konfigürasyon dosyası oluşturun:

bash
sudo mkdir -p /etc/cloudflaredsudo nano /etc/cloudflared/config.yml

Bu konfigürasyonu ekleyin:

yaml
tunnel: YOUR-TUNNEL-IDcredentials-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

bash
# DNS kaydı oluşturcloudflared tunnel route dns dokploy-server dokploy.yourdomain.com

Tunnel'ı Servis Olarak Çalıştırma

bash
# Servis olarak kursudo cloudflared service install
# Servisi başlatsudo systemctl start cloudflaredsudo systemctl enable cloudflared
# Durumu kontrol etsudo 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

  1. Dokploy dashboard'unu açın (https://dokploy.yourdomain.com)
  2. İlk setup'ı tamamlayın (admin hesabı oluşturun)
  3. "Create Project" tıklayın
  4. "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:

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:

json
{  "name": "my-app",  "version": "1.0.0",  "main": "src/index.js",  "dependencies": {    "express": "^4.18.2"  }}

src/index.js:

javascript
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:

  1. Git repository'nizi bağlayın (GitHub, GitLab, vb.)
  2. Build ayarlarını yapın (Dockerfile-tabanlı)
  3. Port'u ayarlayın: 3000
  4. Deploy edin!

Uygulamanız İçin Tunnel Route Ekleme

/etc/cloudflared/config.yml dosyasını güncelleyin:

yaml
tunnel: YOUR-TUNNEL-IDcredentials-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:

bash
cloudflared tunnel route dns dokploy-server app.yourdomain.comsudo systemctl restart cloudflared

İzleme ve Bakım

Kaynak İzleme

İşte işleri sorunsuz çalışır halde tutan basit kontroller:

bash
# Disk alanını kontrol etdf -h
# Memory kullanımını kontrol etfree -h
# Docker kaynak kullanımını kontrol etdocker stats --no-stream
# Aktif container'ları kontrol etdocker ps

Log Yönetimi

bash
# Dokploy loglarını görüntüledocker logs dokploy
# Cloudflared loglarını görüntülesudo journalctl -u cloudflared -f
# Dokploy'da belirli container loglarını görüntüledocker logs <container-name>

Backup Stratejisi

Backup'lar hakkında öğrendiğim şey: erken otomatize edin.

bash
# Backup script'i oluşturnano ~/backup.sh
bash
#!/bin/bashBACKUP_DIR="/home/deploy/backups"DATE=$(date +%Y%m%d_%H%M%S)
# Backup dizini oluşturmkdir -p $BACKUP_DIR
# Dokploy data'yı yedekledocker 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ü tutfind $BACKUP_DIR -name "dokploy_*.tar.gz" -mtime +7 -delete
echo "Backup completed: dokploy_$DATE.tar.gz"

Executable yapın ve zamanla:

bash
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ü

bash
# Sistem paketlerini güncellesudo 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üncellesudo cloudflared update

Yaygın Sorunların Çözümü

Tunnel Bağlantı Sorunları

Cloudflared tunnel'ınız bağlanmıyorsa:

bash
# Servis durumunu kontrol etsudo systemctl status cloudflared
# Logları kontrol etsudo journalctl -u cloudflared -n 50
# Config syntax'ını doğrulacloudflared tunnel validate /etc/cloudflared/config.yml
# Tunnel'ı manuel test etcloudflared tunnel run dokploy-server

Dokploy'a Erişilemiyor

bash
# Dokploy çalışıyor mu kontrol etdocker ps | grep dokploy
# Dokploy loglarını kontrol etdocker logs dokploy
# Dokploy'u yeniden başlatdocker restart dokploy

Port Zaten Kullanımda

"Port already in use" hatası alıyorsanız:

bash
# Portu neyin kullandığını bulsudo lsof -i :3000
# Ya da netstat kullansudo netstat -tulpn | grep :3000

Docker Storage Sorunları

bash
# Docker disk kullanımını kontrol etdocker system df
# Kullanılmayan kaynakları temizledocker system prune -a
# Belirli container'ları/image'leri kaldırdocker rm <container-id>docker rmi <image-id>

Maliyet Dökümü

İşte bu kurulumun gerçek maliyeti:

BileşenAylı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:

  1. Monitoring ekleyin: Availability kontrolleri için Uptime Robot veya benzeri kurun
  2. Otomatik güncellemeleri etkinleştirin: Güvenlik patch'leri için unattended-upgrades konfigüre edin
  3. Database'leri kurun: Dokploy out-of-the-box PostgreSQL, MySQL, MongoDB destekliyor
  4. Staging environment oluşturun: Test için ikinci bir ucuz VPS'e kurulumunuzu klonlayın
  5. 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