İçeriğe atla

VPS Üzerinde Dokploy ve Cloudflare Tunnel Kurulumu

VPS, Dokploy deployment platformu ve Cloudflared tunnel kullanarak güvenli, uygun maliyetli private sunucu kurulumu için pratik bir rehber

Ayhan Sipahi Ayhan Sipahi

Private sunucu çalıştırmak için pahalı cloud faturalarına ya da karmaşık infrastructure’lara ihtiyacınız yok. En iyi çözüm genellikle kurumsal platformlar yerine basit, odaklanmış araçları birleştirmekte yatıyor.

Production-ready bir private sunucu üç parçadan oluşuyor:

  • 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

Üçünün toplam maliyeti ayda yaklaşık $6-8 ve bu bütçe birden fazla uygulamayı güvenli şekilde çalıştırmaya yetiyor.

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

Mimariye Genel Bakış#

İşte kuracağımız yapı:

Kullanıcı

Cloudflare Network

Cloudflared Tunnel

VPS Server

Dokploy

Docker Container'ları

Uygulamalarınız

Kurulumun kilit özelliği: sunucunuz dışarıya hiç 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#

Bütçe dostu seçenekler hakkında bilinmesi gerekenler:

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

Örneklerde Hetzner kullanıyorum, 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üvenliği Sıkılaştırma#

Şimdi güvenliğe 15 dakika ayırmak, sonradan saatlerce baş ağrısından kurtarır.

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 "your-email@example.com"

# Sunucuya kopyala
ssh-copy-id deploy@your-server-ip

SSH Konfigürasyonunu Sıkılaş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:

  1. Docker kurulu değilse 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 bu portu doğrudan dışarıya açmayacağız. Cloudflared tam da 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 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 Kaydını Oluşturma#

# 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 açın. Cloudflare tunnel üzerinden güvenli şekilde sunulan 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:

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:

  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:

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#

Bu basit kontroller işleri yolunda tutuyor:

# 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ı 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ü#

Kurulumun aylık maliyeti şöyle:

BileşenAylık Maliyet
VPS (Hetzner 2GB)$5-6
Domain name$1-2 (yıllık ücretin 12 aya bölünmüş hali)
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’i birkaç deployment’ta kullanınca öne çıkan noktalar şunlar:

İ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.

Daha Erken Yapılması Gerekenler:

  • Monitoring’i erkenden kurun (Uptime Robot gibi)
  • İlk setup adımlarını hemen dokümante edin
  • İlk günden staging environment oluşturun
  • Güvenlik güncellemelerini unattended-upgrades ile otomatize edin

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ç#

VPS + Dokploy + Cloudflared birleşimi; yan projeler, küçük uygulamalar ve orta düzey trafiğe sahip, maliyet bilinci yüksek production workload’ları için yeterli. Kurulum yaklaşık 30-45 dakika sürüyor, bakım ise güncellemeler ve monitoring için ayda bir saat civarında kalıyor. Vendor lock-in istemeyen, deployment’ı basit tutmak isteyen takımlara da uyuyor; alttaki pattern’ler (containerization, reverse proxying, secure tunneling) daha büyük platformlarda da aynı şekilde geçerli.

Erişilebilirlik faturadan daha önemli hale geldiğinde başka bir çözüme geçin. Tek VPS bir bütün olarak arızalanıyor; uptime taahhüdü olan bir servis, managed failover sunan bir platforma ya da en azından load balancer arkasındaki ikinci bir makineye taşınmalı. Trafik tek makineyi aştığında da aynısı geçerli: o noktadan sonra manuel scaling’in maliyeti, kaçındığınız managed faturayı geçiyor.

Kaynaklar#

İlgili yazılar