Geçtiğimiz yıl bir müşterimin veri gizliliği politikaları sebebiyle tüm dosyalarını yurt dışı bulut servislerinden çekmek zorunda kaldık. Bu durum, kendi verilerimiz üzerinde tam kontrol sahibi olmanın ne kadar kritik olduğunu bir kez daha gösterdi. Ben de kişisel ve bazı yan projelerim için Google Drive gibi üçüncü parti çözümlerden vazgeçip Nextcloud ile kendi bulutumu kurmaya karar verdim.
Kendi bulut sisteminizi kurmak, verileriniz üzerinde tam kontrol sağlamanın yanı sıra, zamanla ticari servislerin maliyetinden kurtulmak ve gizliliğinizi korumak için güçlü bir alternatiftir. Bu rehberde, Nextcloud’u başarılı bir şekilde kurmadan önce bilmeniz gereken temel mimari seçimleri ve pratik adımları, kendi tecrübelerimle anlatacağım.
Neden Kendi Bulutumu Kurma İhtiyacı Duydum?
Yıllardır hem kişisel hem de iş projelerinde Google Drive, Dropbox gibi ticari bulut servislerini kullandım. İlk başlarda sundukları kolaylık ve sıfır yönetim yükü cazip gelse de, zamanla bazı kısıtlamalar ve maliyet faktörleri beni kendi çözümümü aramaya itti. Özellikle bir yan ürünümün bazı finansal hesaplayıcıları için topladığım verileri ticari bulutlarda tutmak, hem KVKK hem de kendi iç denetimlerim açısından riskli gelmeye başlamıştı.
Ticari bulut servisleri, genellikle belirli dosya boyut limitleri, API kullanım kısıtlamaları ve artan depolama ihtiyaçlarıyla birlikte yükselen abonelik ücretleri gibi dezavantajlar sunar. Örneğin, bir dönem müşterilerden gelen yüzlerce GB’lık log dosyalarını yönetirken, Google Drive’ın günlük upload limitlerine takılmıştım. Bu durum, iş akışımı ciddi şekilde aksattı ve beni daha esnek, kontrol edilebilir bir çözüm bulmaya zorladı. İşte tam bu noktada, Nextcloud’un açık kaynak kodlu yapısı ve sunduğu geniş kontrol beni ikna etti.
Nextcloud Kurulumuna Başlamadan Önce Bilmeniz Gerekenler
Nextcloud kurulumu teknik olarak çok karmaşık olmasa da, başarılı ve stabil bir sistem için doğru temel mimari seçimlerini yapmak kritik. İlk denememde, elimdeki eski bir Raspberry Pi’ye kurdum, ama performans yetersizliği ve disk I/O sorunları yüzünden kısa sürede vazgeçtim. Bu yüzden, donanım ve yazılım altyapısı seçimlerine dikkat etmek şart.
Öncelikle, Nextcloud’un çalışacağı sunucuyu belirlemeniz gerekiyor. Bu bir VPS (Virtual Private Server) olabileceği gibi, evinizdeki eski bir bilgisayar veya özel bir sunucu da olabilir. Ben kendi yan ürünlerim için kullandığım VPS’lerden birini Nextcloud’a ayırdım. Minimum 2 CPU çekirdeği, 4 GB RAM ve hızlı bir SSD disk, orta ölçekli bir kullanım için ideal. Eğer 10’dan fazla aktif kullanıcınız olacaksa veya büyük dosyalarla sık sık çalışacaksanız, bu değerleri artırmayı düşünmelisiniz.
İşletim Sistemi ve Web Sunucusu Seçimi
Nextcloud, Linux tabanlı sistemlerde en iyi performansı verir. Benim tercihim genellikle Ubuntu Server veya Debian olur; kararlılıkları ve geniş topluluk destekleri sayesinde karşılaşabileceğiniz sorunlara çözüm bulmak daha kolaydır. Web sunucusu olarak ise, Nginx’i Apache’ye tercih ederim. Nginx’in düşük kaynak tüketimi ve yüksek eşzamanlı bağlantı yönetimi, Nextcloud gibi yoğun I/O işlemleri yapan uygulamalar için daha uygun.
# Ubuntu Server kurulumu sonrası temel paketleri güncelleme
sudo apt update && sudo apt upgrade -y
# Nginx kurulumu
sudo apt install nginx -y
# PHP-FPM kurulumu (Nextcloud için gerekli PHP modülleri ile birlikte)
sudo apt install php-fpm php-mysql php-mbstring php-gd php-curl php-xml php-zip php-intl php-imagick php-gmp php-bcmath php-redis -y
Bu temel paketlerin kurulumu, Nextcloud’un çalışması için gerekli ortamı hazırlar. Ancak asıl kritik nokta, bu bileşenlerin Nextcloud ile uyumlu bir şekilde ayarlanmasıdır. Örneğin, PHP-FPM ayarlarında memory_limit ve upload_max_filesize gibi değerleri Nextcloud’un ihtiyaçlarına göre düzenlemek, büyük dosya yüklemelerinde sorun yaşamamanızı sağlar.
Veritabanı Seçimi ve Optimizasyonu: PostgreSQL Neden Tercihim?
Nextcloud, MariaDB/MySQL, PostgreSQL ve SQLite gibi farklı veritabanlarını destekler. Küçük, tek kullanıcılı kurulumlar için SQLite basit bir çözüm sunsa da, performans ve ölçeklenebilirlik açısından ciddi kısıtlamaları vardır. Bir üretim ERP’sinde yıllarca PostgreSQL ile çalıştığım için, Nextcloud kurulumlarımda da genellikle PostgreSQL’i tercih ediyorum.
PostgreSQL’in sağlamlığı, gelişmiş sorgu optimizasyonu yetenekleri ve transaction outbox gibi kurumsal seviye özelliklere sahip olması, onu Nextcloud için güçlü bir aday yapar. MariaDB veya MySQL de kullanılabilir, ancak benim tecrübelerimde PostgreSQL, özellikle yoğun I/O operasyonlarında ve büyük veri setlerinde daha stabil performans verdi. Nextcloud’un dosya indeksleme ve senkronizasyon işlemleri yoğun veritabanı kullanımı gerektirdiğinden, doğru optimize edilmiş bir PostgreSQL kurulumu kritik önem taşır.
PostgreSQL Optimizasyon İpuçları
PostgreSQL kurulumundan sonra, postgresql.conf dosyasında bazı temel ayarlamalar yapmak performansı ciddi şekilde etkiler. shared_buffers, work_mem ve effective_cache_size gibi parametreleri sunucunuzun RAM miktarına göre ayarlamalısınız. Benim bir VPS’te Nextcloud için kullandığım temel ayarlar şuna benziyor:
# /etc/postgresql/<version>/main/postgresql.conf
# Örnek değerler, sunucunuzun RAM'ine göre ayarlanmalıdır
shared_buffers = 1GB # Toplam RAM'in %25'i
work_mem = 64MB # Sorgu başına hafıza, çok kullanıcılı sistemlerde dikkatli olun
maintenance_work_mem = 256MB # VACUUM ve INDEX işlemleri için
effective_cache_size = 3GB # Toplam RAM'in %50-75'i
max_connections = 100 # Nextcloud'un ihtiyaçlarına göre ayarlanmalı
wal_buffers = 16MB # WAL yazma performansını etkiler
synchronous_commit = off # Performans için kapatılabilir, ancak veri kaybı riski vardır
fsync = on # Veri bütünlüğü için açık kalmalı
Ayrıca, Nextcloud’un kullandığı veritabanı tablolarına uygun indeksler eklemek de performansı artırabilir. Nextcloud’un kendi optimizasyon komutları da bulunur:
# Nextcloud'un kendi CLI aracı ile veritabanı indekslerini kontrol etme
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
Bu komut, Nextcloud’un önerdiği eksik indeksleri ekleyerek veritabanı sorgularının hızlanmasına yardımcı olur.
Depolama Katmanı ve Performans: Disk Seçimi ve Ayarları
Nextcloud’un kalbi, dosya depolama katmanıdır. Doğru disk seçimi ve dosya sistemi ayarları, genel sistem performansını doğrudan etkiler. Eski HDD’lerle başladığım ilk denemelerde, özellikle küçük dosyaların çok sayıda olduğu durumlarda ciddi I/O gecikmeleri yaşadım. Bu nedenle, Nextcloud veri dizini ve veritabanı için kesinlikle SSD kullanmanızı öneririm.
NVMe SSD’ler, SATA SSD’lere göre çok daha yüksek okuma/yazma hızları sunar ve bütçeniz elveriyorsa en iyi tercihtir. Eğer büyük miktarda depolama alanına ihtiyacınız varsa ve bütçeniz kısıtlıysa, ana veri dizinini HDD’lerde tutabilir, ancak veritabanını ve Nextcloud uygulama dosyalarını mutlaka SSD’de barındırmalısınız.
Dosya Sistemi ve Mount Ayarları
Dosya sistemi olarak Linux sistemlerinde genellikle ext4 yeterli performansı sunar. Ancak veri bütünlüğü ve snapshot gibi gelişmiş özellikler arıyorsanız ZFS veya Btrfs gibi copy-on-write (CoW) dosya sistemlerini düşünebilirsiniz. Ben çoğu zaman basitliği ve kararlılığı nedeniyle ext4 kullanıyorum.
Diskleri bağlarken (mount ederken) fstab dosyasına bazı optimizasyon seçenekleri eklemek, I/O performansını artırabilir. Özellikle noatime seçeneği, her dosya erişiminde erişim zamanını güncelleme yükünü ortadan kaldırarak performansı artırır.
# /etc/fstab dosyasına örnek giriş
# UUID=xxxx-xxxx /mnt/nextcloud_data ext4 defaults,noatime,discard 0 2
# Burada:
# UUID=xxxx-xxxx: Diskinizin UUID'si (lsblk -f komutuyla bulabilirsiniz)
# /mnt/nextcloud_data: Nextcloud veri dizininin bağlanacağı yer
# ext4: Dosya sistemi
# defaults: Varsayılan mount seçenekleri
# noatime: Erişim zamanı güncellemelerini devre dışı bırakır (performans artışı)
# discard: SSD'ler için TRIM komutunu etkinleştirir (performans ve ömür)
Güvenlik ve Uzaktan Erişim: Nginx, SSL ve Fail2ban
Kendi bulutunuzu kurmanın en büyük avantajlarından biri, güvenlik üzerinde tam kontrol sahibi olmaktır. Ancak bu, aynı zamanda büyük bir sorumluluk anlamına gelir. Nextcloud’u internete açarken dikkatli olmazsanız, kolayca bir hedef haline gelebilir. Ben bu yüzden Nginx’i sadece bir ters proxy (reverse proxy) olarak kullanmakla kalmıyor, aynı zamanda SSL şifrelemesi ve brute-force koruması gibi katmanları da uyguluyorum.
Nginx, gelen istekleri Nextcloud’un PHP-FPM servisine yönlendirirken, aynı zamanda Let’s Encrypt ile ücretsiz SSL sertifikaları kullanarak tüm iletişimi şifrelememizi sağlar. SSL, veri aktarımı sırasında eavesdropping (kulak misafiri olma) saldırılarına karşı temel bir koruma sağlar.
Nginx ve SSL Yapılandırması
Nextcloud için tipik bir Nginx server bloğu yapılandırması şöyle görünür:
# /etc/nginx/sites-available/nextcloud.conf
server {
listen 80;
server_name nextcloud.alanadiniz.com;
return 301 https://$host$request_uri; # Tüm HTTP isteklerini HTTPS'e yönlendir
}
server {
listen 443 ssl http2;
server_name nextcloud.alanadiniz.com;
ssl_certificate /etc/letsencrypt/live/nextcloud.alanadiniz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nextcloud.alanadiniz.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/nextcloud.alanadiniz.com/chain.pem;
# Güvenlik ve performans için SSL ayarları
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
# Nextcloud için gerekli başlıklar
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag "none";
add_header X-Download-Options "noopen";
add_header X-Permitted-Cross-Domain-Policies "none";
add_header Referrer-Policy "no-referrer";
root /var/www/nextcloud; # Nextcloud kurulum dizini
location = /robots.txt {
allow all;
log_not_found off;
}
location = /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; }
location = /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; }
# ... diğer Nextcloud lokasyon ayarları ...
# (Bu kısım Nextcloud'un resmi Nginx yapılandırma rehberinden alınabilir)
}
Fail2ban ile Brute-Force Koruması
Nextcloud’un giriş ekranı, siber saldırganlar için potansiyel bir hedeftir. Özellikle zayıf şifrelerle deneme yanılma yapan brute-force saldırılarına karşı fail2ban vazgeçilmez bir araçtır. fail2ban, belirli bir süre içinde başarısız oturum açma denemeleri yapan IP adreslerini otomatik olarak bloke eder.
Nextcloud için özel bir fail2ban jail’i tanımlayarak, Nextcloud’un kendi loglarını izleyebiliriz:
# /etc/fail2ban/jail.d/nextcloud.conf
[nextcloud]
enabled = true
port = http,https
filter = nextcloud
logpath = /var/www/nextcloud/data/nextcloud.log
maxretry = 5
bantime = 3600 # 1 saat ban
Bu jail için nextcloud.conf filtresini de oluşturmak gerekir:
# /etc/fail2ban/filter.d/nextcloud.conf
[Definition]
failregex = {"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core","method":".*","url":".*","user":".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","userAgent":".*","version":".*"}
Bakım ve İzleme: Kendi Bulutunuzu Yaşatmak
Nextcloud’u kurmak işin sadece yarısıdır. Sistemi stabil, güvenli ve performanslı tutmak için düzenli bakım ve izleme şarttır. Bir müşterinin sisteminde, disk dolduğunu fark etmediğimiz için Nextcloud servisi durmuştu ve bu durum, raporlama akışını aksatmıştı. Bu tür durumları yaşamamak için proaktif olmak gerekiyor.
Güncellemeler ve Yedekleme
Nextcloud uygulamasını, temel işletim sistemini ve veritabanını düzenli olarak güncellemek, güvenlik açıklarını kapatmak ve yeni özelliklerden faydalanmak için önemlidir. Nextcloud’un kendi web arayüzünden veya occ komutu ile güncellemeleri yapabilirsiniz.
Yedekleme, felaket kurtarma planının vazgeçilmez bir parçasıdır. Nextcloud verileri (dosyalar) ve veritabanı olmak üzere iki ana bileşenden oluşur. Her ikisini de düzenli olarak yedeklemelisiniz. Benim tercihim, veritabanını pg_dump ile alıp, veri dizinini rsync ile başka bir depolama birimine kopyalamak.
#!/bin/bash
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_DIR="/mnt/backups/nextcloud"
NEXTCLOUD_DIR="/var/www/nextcloud"
DB_USER="nextcloud_user"
DB_NAME="nextcloud_db"
mkdir -p $BACKUP_DIR
# Veritabanı yedeklemesi
sudo -u postgres pg_dump -U $DB_USER $DB_NAME > $BACKUP_DIR/nextcloud_db_$DATE.sql
# Nextcloud veri dizini yedeklemesi (rsync ile)
rsync -Aax $NEXTCLOUD_DIR/data $BACKUP_DIR/nextcloud_data_$DATE
rsync -Aax $NEXTCLOUD_DIR/config $BACKUP_DIR/nextcloud_config_$DATE
echo "Nextcloud yedeklemesi tamamlandı: $DATE"
Bu script’i bir cron işi olarak tanımlayarak günlük veya haftalık olarak otomatik çalıştırabilirsiniz.
İzleme ve Hata Ayıklama
Nextcloud’un kararlı çalışması için sunucu kaynaklarını (CPU, RAM, disk I/O) ve Nextcloud’un kendi loglarını izlemek önemlidir. journalctl ile sistem loglarını, Nginx access/error loglarını ve Nextcloud’un kendi nextcloud.log dosyasını takip edebilirsiniz.
# Nextcloud loglarını canlı takip etme
tail -f /var/www/nextcloud/data/nextcloud.log
# Nextcloud'un sistem durumunu kontrol etme
sudo -u www-data php /var/www/nextcloud/occ status
Bu komutlar, olası sorunları erken tespit etmenizi sağlar. Özellikle disk kullanımını sürekli izlemek, “disk yangını” gibi durumları önlemek için kritik öneme sahiptir.
Docker Compose ile Hızlı Kurulum: Bir Pratik Çözüm
Yukarıda anlattığım manuel kurulum adımları, sistem üzerinde daha fazla kontrol sağlamak isteyenler için idealdir. Ancak, daha hızlı ve izole bir kurulum arıyorsanız, Docker Compose harika bir seçenektir. Ben kendi test ortamlarımda veya hızlı prototiplemelerde sıklıkla Docker Compose kullanıyorum.
Docker Compose, Nextcloud, PostgreSQL ve Nginx’i ayrı container’larda çalıştırarak kurulumu basitleştirir ve bağımlılık yönetimini kolaylaştırır. Ancak, Docker container’larının disk I/O performansı veya bellek limitleri konusunda dikkatli olmak gerekir. Yanlış yapılandırılmış bir Docker Compose kurulumu, “container memory limit” sorunlarına veya disk erişimlerinde yavaşlamalara yol açabilir.
İşte Nextcloud için basit bir docker-compose.yml örneği:
# docker-compose.yml
version: '3'
services:
db:
image: postgres:13-alpine
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: nextcloud_db
POSTGRES_USER: nextcloud_user
POSTGRES_PASSWORD: your_strong_db_password
networks:
- nextcloud_network
app:
image: nextcloud:latest
restart: always
volumes:
- nextcloud_data:/var/www/html
environment:
POSTGRES_DB: nextcloud_db
POSTGRES_USER: nextcloud_user
POSTGRES_PASSWORD: your_strong_db_password
POSTGRES_HOST: db
NEXTCLOUD_TRUSTED_DOMAINS: nextcloud.alanadiniz.com
ports:
- 8080:80 # Nginx ters proxy arkasında çalışacaksa 8080 portunu aç
networks:
- nextcloud_network
depends_on:
- db
volumes:
db_data:
nextcloud_data:
networks:
nextcloud_network:
driver: bridge
Bu yapılandırma, Nextcloud uygulamasını ve PostgreSQL veritabanını izole bir şekilde ayağa kaldırır. Nginx’i ise ayrı bir container’da veya doğrudan sunucunuzda bir ters proxy olarak kullanabilirsiniz. Özellikle volumes kısmına dikkat etmek, verilerinizin container silinse bile kalıcı olmasını sağlar.
Sonuç: Kendi Bulutunuz, Kendi Kontrolünüz
Google Drive gibi ticari bulut servislerinden uzaklaşıp Nextcloud ile kendi bulutunuzu kurmak, başta biraz çaba ve teknik bilgi gerektirse de, uzun vadede veri gizliliği, maliyet kontrolü ve esneklik açısından sayısız fayda sunar. Kendi deneyimlerimde, bu geçişin hem kişisel verilerim hem de küçük yan projelerim için ne kadar doğru bir karar olduğunu gördüm.
Unutmayın ki kendi bulutunuzu yönetmek, sürekli öğrenme ve bakım gerektiren bir süreçtir. Doğru donanım ve yazılım seçimleri, titiz bir güvenlik yapılandırması ve düzenli bakım rutinleri ile Nextcloud’unuzu uzun yıllar boyunca güvenle kullanabilirsiniz. Bu yolculukta karşılaşacağınız zorluklar, size sistem yönetimi ve network güvenliği konularında değerli dersler katacaktır. Bir sonraki adım, Nextcloud’unuzu kişisel otomasyonlarınızla entegre etmek olabilir.