Kendi PaaS Altyapımızı Kuruyoruz (Bölüm 7): Veritabanı İzolasyonu ve Otomatik Yedekleme (MinIO…
Serimizin önceki bölümlerinde sunucu altyapımızı kurduk, kimlik yönetimimizi “Zero Trust” felsefesiyle yapılandırdık ve sistem loglarımızı…
Kendi PaaS Altyapımızı Kuruyoruz (Bölüm 7): Veritabanı İzolasyonu ve Otomatik Yedekleme (MinIO, Rclone & Google Drive)

Serimizin önceki bölümlerinde sunucu altyapımızı kurduk, kimlik yönetimimizi “Zero Trust” felsefesiyle yapılandırdık ve sistem loglarımızı merkezi bir ekranda topladık. Ancak tüm bu uygulamalar çalışırken arka planda sistemin en değerli varlığı birikiyor: Kullanıcı Verileri.
Production ortamında veritabanlarını diğer uygulamalarla aynı ağ karmaşasında bırakmak veya manuel yedeklemelere güvenmek büyük bir risktir. Olası bir sunucu çökmesinde, yanlışlıkla silinen bir klasörde veya bir siber saldırıda veriyi geri getiremiyorsanız, kurduğunuz mükemmel altyapının hiçbir anlamı kalmaz.
Bu bölümde:
- Veritabanlarımızı Dokploy arayüzünü kullanarak dış erişime tamamen kapatacak şekilde izole edeceğiz.
- Amazon S3 standardında, kendi sunucumuzda barınan bulut depolama çözümümüz MinIO’yu kuracağız.
- Dokploy’un dahili yedekleme özelliğini kullanarak veritabanlarımızı her saat başı lokal S3 kasamıza (MinIO) yedekleyeceğiz.
- Sunucu dışı backup planımız için Google Drive entegrasyonu yapacak ve manuel bir otomasyon zinciriyle (Bash script + Rclone) yedekleri buraya kopyalayarak veri güvenliğini sağlayacağız.
Adım 1: Dokploy Arayüzü ile İzole Veritabanı Oluşturma
PaaS altyapımızda veritabanlarımızı (Örneğin PostgreSQL, MySQL veya Redis) oluştururken Dokploy’un kullanıcı dostu arayüzünü kullanıyoruz. Aşağıdaki adımları takip ederek ilk veritabanı servisimizi oluşturuyoruz.
- Dokploy ana ekranında projenizin içine girin.
- Sağ üst köşedeki “+ Create Service” butonuna tıklayın ve listeden Database seçeneğini seçin.
- Açılan pencerede veritabanı tipini (Örn: PostgreSQL), sunucunuza vereceğiniz ismi (Örn:
postgres-prod), veritabanı adını (Örn:my_production_db), kullanıcı adını ve şifresini ve tercih ettiğiniz postgres versiyon image adını girin (default:postgres:18).

Bu işlemle birlikte veritabanınız, dış dünyadan tamamen izole bir şekilde dokploy-network ağı içerisinde çalışmaya başlar. Dokploy, siz aksini belirtmedikçe dışarıya hiçbir port açmaz ve veritabanınızı sadece kendi iç ağındaki uygulamaların erişimine sunar.
Adım 2: Kendi S3 Depolamamız: MinIO Kurulumu
Yedeklerimizi sunucunun kendi diskinde bir klasörde tutmak felaket senaryolarına karşı bizi korumaz. Dokploy’un dahili yedekleme mekanizmasının verileri güvenle yönetebilmesi için Amazon S3 standartlarında, kendi sunucumuzda barınan bulut depolama çözümümüz MinIO’yu kurguluyoruz.
Dokploy üzerinden “Compose” servisi oluşturarak aşağıdaki yapılandırmayla MinIO’yu ayağa kaldıralım:
services:
minio:
image: minio/minio:latest
container_name: minio-storage
labels:
- "app_name=minio"
- "traefik.enable=true"
# --- S3 API Yönlendirmesi (Port 9000) ---
- "traefik.http.routers.minio-api.rule=Host(`s3.domaininiz.com`)"
- "traefik.http.routers.minio-api.entrypoints=websecure"
- "traefik.http.routers.minio-api.tls.certresolver=letsencrypt"
- "traefik.http.services.minio-api.loadbalancer.server.port=9000"
# --- Yönetim Paneli Yönlendirmesi (Port 9001) ---
- "traefik.http.routers.minio-console.rule=Host(`s3.domaininiz.com`)"
- "traefik.http.routers.minio-console.entrypoints=websecure"
- "traefik.http.routers.minio-console.tls.certresolver=letsencrypt"
- "traefik.http.services.minio-console.loadbalancer.server.port=9001"
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
# Güvenliğiniz için şifreyi en az 8 karakter belirleyin!
- MINIO_ROOT_USER=${MINIO_ROOT_USER}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
# MinIO'nun kendi adreslerini bilmesi arayüzün stabil çalışması için şarttır
- MINIO_SERVER_URL=https://s3.domaininiz.com
- MINIO_BROWSER_REDIRECT_URL=https://s3.domaininiz.com
volumes:
- /mnt/data/minio:/data
networks:
- dokploy-network
expose:
- "9000"
- "9001"
healthcheck:
test: ["CMD-SHELL", "bash -c '</dev/tcp/127.0.0.1/9000' || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
networks:
dokploy-network:
external: true
Burada root user ve şifresini ortam değişkeni olarak okuduğumuzdan dolayı, composeyi deploy etmeden önce environment variables sekmesinden bu bilgileri doldurmalıyız.
Yedekleme Kasasının (Bucket) Oluşturulması
MinIO çalıştıktan sonra s3.domaininiz.com adresine gidin ve Compose dosyasında belirlediğiniz root kullanıcı adı ve şifresiyle giriş yapın. Sol menüde bulunan "+ Create Bucket" butonuna tıklayarak **backups** adında yeni bir kasa oluşturun.
Adım 3: Hibrit Yedekleme Stratejisi (Dokploy + Backup Worker)
Altyapımızda veritabanlarını yedeklemek hayati bir önem taşısa da, sistemimiz sadece PostgreSQL veya MySQL’den ibaret değil. Kimlik yönetimimizi sağlayan LLDAP gibi uygulamaların konfigürasyon dosyaları veya SQLite veritabanları da en az diğerleri kadar kritiktir.
Bu nedenle “Zero Trust” felsefemize uygun, sunucumuzu kirletmeyen hibrit bir yedekleme mimarisi kuruyoruz:
- Dokploy Dahili Yedeklemesi: PostgreSQL/MySQL gibi servisleri ve Dokploy’un kendi backup yönetimini dokploy paneli üzerinden yapacağız.
- Kendi Backup-Worker Konteynerimiz: Dokploy’un kapsamadığı alanlar (LLDAP vb. servisler) için sadece yedekleme görevlerinden sorumlu izole bir “işçi” konteyner ayağa kaldırıp, Bash scriptleri ile otomasyon sağlayacağız.
Kısım 1: Dokploy Dahili Yedekleme Yapılandırması
Dokploy, desteklediği veritabanları için harika ve çok pratik bir dahili yedekleme modülü sunar. Bunu MinIO kasamıza bağlamak çok kolaydır:
- Dokploy sol menüsünden Settings -> S3 Destination sekmesine gidin. MinIO bilgilerinizi buraya girin (Endpoint:
http://minio-storage:9000, Bucket:backups, Access ve Secret keyleriniz). - Projenizdeki PostgreSQL/MySQL veritabanı sayfanıza gidin ve Backups sekmesine tıklayın.
- “+ Create Backup” butonuna tıklayarak kuralınızı oluşturun:
- Destination: S3 olarak kaydettiğiniz MinIO hedefini seçin.
- Database: Yedeklemek istediğiniz database adı.
- Schedule:
0 */1 * * *(Her saat başı). - Keep Latest:
20(Yalnızca son 20 yedeği tut).
Aynı adımları Web Server sayfasında Backups sekmesinde yaparak dokploy backup joblarımızıda kurabiliriz.
Kısım 2: LLDAP ve Dosya Yedekleri İçin Bash Scripti
LLDAP gibi servislerin /data klasörlerindeki verileri yedeklememiz gerekiyor. Bunun için sunucumuzda bir script klasörü oluşturacağız.
home/user klasörü altında backup-workerisimli klasör oluşturuyoruz. Burada scripts klasörü altında scriptlerimizi oluştacağız. LLDAP ve Grafana backuplarını her gece 3de alıp minio’ya yükleyen shell scriptleri github hesabımda bulabilirsiniz:
Kısım 3: Backup-Worker Konteynerinin Oluşturulması
Sunucumuzun kendi crontab dosyasını kirletmek yerine, sadece yedekleme saatinde uyanıp scriptlerimizi çalıştıran izole bir Alpine Linux konteyneri (Worker) oluşturacağız.
Dokploy üzerinden “Compose” servisi seçerek yeni bir uygulama oluşturun ve aşağıdaki kodla backup-worker isimli konteynerimizi ayağa kaldıralım:
services:
backup-worker:
image: alpine:latest
container_name: backup-worker
restart: unless-stopped
labels:
- "app_name=backup-worker"
# Konteyner başlarken paketleri kurar, cron görevlerini yazar ve crond servisini başlatır
command: >
sh -c "apk add --no-cache rclone sqlite curl zip tzdata &&
echo '0 3 * * * /scripts/job-nightly-backup.sh >> /logs/backup.log 2>&1' > /etc/crontabs/root &&
echo '0 4 * * * /scripts/job-cleanup-old-backups.sh >> /logs/cleanup.log 2>&1' >> /etc/crontabs/root &&
echo '30 */3 * * * /scripts/job-cloud-sync.sh >> /logs/sync.log 2>&1' >> /etc/crontabs/root &&
crond -f"
volumes:
# Kendi yazdığımız bash scriptlerinin bulunduğu klasör
- /home/user/backup-worker/scripts:/scripts
# Log dosyalarının sunucuda kalıcı olarak tutulacağı klasör
- /home/user/backup-worker/logs:/logs
# Adım 4'te oluşturacağımız Rclone konfigürasyonunu içeri alıyoruz (S3 ve GDrive için)
- /root/.config/rclone:/root/.config/rclone
# --- YEDEKLENECEK UYGULAMA VERİLERİ (Salt Okunur - Read Only) ---
# Dokploy'un oluşturduğu volume'lerin fiziksel yollarını bularak doğrudan bağlıyoruz
- /var/lib/docker/volumes/sizin_projeniz_grafana-storage/_data:/data/grafana:ro
- /var/lib/docker/volumes/sizin_projeniz_lldap_data/_data:/data/lldap:ro
environment:
- TZ=Europe/Istanbul
networks:
- dokploy-network
healthcheck:
test: ["CMD", "pidof", "crond"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
networks:
dokploy-network:
external: true
Adım 4: Rclone Kurulumu ve Google Drive Entegrasyonu (Headless OAuth)
“3–2–1 Yedekleme Kuralı” gereği verilerimizin bir kopyasını da sunucu dışına, yani Google Drive’a aktarmalıyız. Sunucular headless sistemler olduğu için, Google’ın OAuth doğrulama ekranını sunucuda açamayız. Bu yüzden yetkilendirmeyi kendi bilgisayarımızda yapıp ayar dosyasını sunucuya taşıyacağız.
- Kendi kişisel bilgisayarınıza (Windows/Mac) rclone.org üzerinden Rclone kurun.
- Bilgisayarınızın terminalini açıp
rclone configkomutunu çalıştırın. - Yeni bir bağlantı (
n) oluşturup adınıdokploy-google-drive-backupyapın ve listeden Google Drive'ı seçin.client_idgibi soruları boş geçip yetki alanını (scope)1(Full Access) olarak işaretleyin. Use auto config?sorusunaydediğinizde tarayıcınız açılacak ve Google hesabınızla giriş yapmanız istenecektir. Onayladığınızda bilgisayarınızdaki Rclone konfigürasyon dosyasına bağlantı token'ı işlenecektir.
Lokal Ayar Dosyasının Bulunması: Bu işlemler bittikten sonra Rclone, ürettiği yetki bloğunu bilgisayarınızdaki konfigürasyon dosyasına kaydeder. Bu dosyayı genellikle şu dizinlerde bulabilirsiniz:
- Windows:
C:\Users\<KullanıcıAdınız>\AppData\Roaming\rclone\rclone.conf - Mac / Linux:
~/.config/rclone/rclone.conf
Bu dosyayı bir metin editörüyle açın ve içindeki [dokploy-google-drive-backup] ile başlayan tüm bloğu (token dahil) kopyalayın.
Şimdi bu yapılandırmayı sunucumuza taşıyoruz. Sunucunuzda /root/.config/rclone dizinini oluşturun ve içine rclone.conf adında bir dosya yaratın:
mkdir -p /root/.config/rclone
nano /root/.config/rclone/rclone.conf
Açılan dosyanın içerisine hem az önce kurduğumuz yerel MinIO kasamızın bilgilerini hem de bilgisayarınızdan kopyaladığınız Google Drive yetki bloğunu yapıştırın. Dosyanın son hali şuna benzemelidir:
[minio_source]
type = s3
provider = Minio
env_auth = false
access_key_id = admin
secret_access_key = SuperGizliMinioSifresi123
# Konteyner adı minio-storage olduğu için Docker içindeki adres böyle olmalıdır:
endpoint = http://minio-storage:9000
acl = private
[dokploy-google-drive-backup]
type = drive
scope = drive
token = {"access_token":"sizin-google-access-tokeniniz","token_type":"Bearer","refresh_token":"sizin-google-refresh-tokeniniz","expiry":"2026-03-22T13:30:02.696008462+03:00","expires_in":3599}
team_drive =
Bu konfigürasyon dosyası, 3. Adımda oluşturduğumuz backup-worker konteynerinin içine dinamik olarak bağlanacak ve bash scriptlerimizin hem lokal S3 depomuza hem de Google Drive bulutuna güvenle veri aktarmasını sağlayacaktır.
Veritabanlarımızı dış dünyadan tamamen izole ettik, kendi bulut depolama çözümümüzü (MinIO) kurduk, host işletim sistemini kirletmeyen izole işçi konteynerler ile otomasyon sağladık ve “Headless OAuth” tekniğiyle verilerimizin felaket kurtarma kopyalarını sorunsuzca Google Drive’a taşıdık. Sisteminiz artık bir sunucu çökmesine veya kullanıcı hatalarına karşı %100 hazırlıklı.
Serimizin bir sonraki bölümü olan Bölüm 8: GitHub Actions ile CI/CD Süreçleri’nde; kodumuzu GitHub’a pushladığımız anda testleri koşturan, imajları derleyen ve Dokploy üzerindeki servislerimizi sıfır kesintiyle otomatik olarak güncelleyen pipeline kuracağız.
메타데이터
- post_id
- e112bcf914c4
- slug
- kendi-paas-altyapımızı-kuruyoruz-bölüm-7-veritabanı-i̇zolasyonu-ve-otomatik-yedekleme-minio-e112bcf914c4
- url
- https://medium.com/@myakupoglu/kendi-paas-altyap%C4%B1m%C4%B1z%C4%B1-kuruyoruz-b%C3%B6l%C3%BCm-7-veritaban%C4%B1-i%CC%87zolasyonu-ve-otomatik-yedekleme-minio-e112bcf914c4
- canonical_url
- https://medium.com/@myakupoglu/kendi-paas-altyap%C4%B1m%C4%B1z%C4%B1-kuruyoruz-b%C3%B6l%C3%BCm-7-veritaban%C4%B1-i%CC%87zolasyonu-ve-otomatik-yedekleme-minio-e112bcf914c4
- author_url
- https://medium.com/@myakupoglu
- status
- ok
- fetched_at
- 2026-07-13 10:48:08