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
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ı:
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:
- Docker kurulu değilse kuruyor
- Dokploy servislerini kuruyor
- Web interface’i konfigüre ediyor
- 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#
- 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#
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şen | Aylı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:
- 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ç#
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#
- Cloudflare Tunnel Belgeleri (yeni sekmede açılır) - Gelen bağlantı noktaları açmadan servisleri güvenli şekilde dışa açmak için cloudflared kurulumuna yönelik resmi kılavuz.
- Dokploy Belgeleri (yeni sekmede açılır) - Kurulum, uygulama deployment ve veritabanı yönetimini kapsayan self-hosted PaaS için resmi belgeleme.
- Dokploy Kurulum Kılavuzu (yeni sekmede açılır) - Docker ile VPS üzerinde Dokploy kurmak için adım adım talimatlar.
- Cloudflare Tunnel Kurulum Kılavuzu (yeni sekmede açılır) - Tunnel’ları, giriş kurallarını ve trafiği yerel servislere yönlendirmeyi yapılandırma referansı.
- Traefik Proxy Belgeleri (yeni sekmede açılır) - Dokploy’un konteynerler arasında trafiği yönlendirmek için dahili olarak kullandığı reverse proxy belgeleri.
- Next.js Self-Hosting Kılavuzu (yeni sekmede açılır) - Node.js veya Docker ile kendi altyapınızda uygulama deploy etmeye yönelik resmi Next.js belgeleri.
İlgili yazılar
Üretim deploy'ları gerçek bir onay adımı ister: GitHub Environment, native koruma kuralları ve environment'a bağlı secret'lar; if: hilesi ya da marketplace değil.
github-actions · ci-cd · devops +2
Vercel dışında Next.js deploy etmenin kapsamlı rehberi: her hedef platform için maliyet profili, implementasyon detayları ve migration yolu.
nextjs · deployment · aws +4
Ölçekte karşılaşacağınız IAM boyut, ekleme ve kota limitleri; ve hepsinden uzak tutan dar kapsamlı politika, izin sınırı ve SCP yapısı.
aws · iam · security +2
Yüksek performanslı ekipler güvenlik incelemesini lead-time darboğazına çevirmiyor: shift-left otomasyon, risk-tabanlı kapılar, hazır yol ve bağımlılık ritmi.
ci-cd · devops · security +3
Organizasyon düzeyinde paylaşımlı bir GitHub Actions platformu kurma rehberi: mimari kararlar, güvenlik yönetişimi, benimseme ve en maliyetli 7 hata.
github-actions · ci-cd · devops +5