/self-host, open-source

Nextcloud'u Docker ile Kurmak: Deneyimlerimle Beraber Tam Rehber

Bir süredir kendi bulut depolama çözümümü oluşturmak istiyordum. Google Drive ve Dropbox kullanışlı ama verilerim üzerinde tam kontrole sahip olmak istiyordum. Nextcloud'a karar verdim ve Docker ile kurmaya başladım. Süreç düşündüğümden biraz daha zorlu geçti çünkü kurmak ile güvenli kurmak arasında farklar var. Burada barındıracağınız dosyalar, resimler sizin için çok özel olacağı için bir çoğunun dışarı sızmasını da istemiyor oluyorsunuz. Bu noktada nextcloud da çok yardımcı oluyor. Direkt /overview sekmesinde sahip olduğunuz zayıflıkları yazıyorlar. Bu bile bir çok noktadan seçim olarak tatmin edici olabiliyor. Devam edecek olursak işte deneyimlerim ve öğrendiklerim.

Neden Nextcloud?

Nextcloud, kendi sunucunuzda barındırabileceğiniz açık kaynaklı bir dosya senkronizasyon ve paylaşım platformu. Dosya depolama dışında takvim, kontaklar, ofis uygulamaları gibi birçok ek özelliği de var. Benim için en önemli artısı ise verilerimin tamamen benim kontrolümde olması.

Kurulum Öncesi Hazırlık

Docker ve Docker Compose'un kurulu olması gerekiyor. Ben zaten başka projelerim için kullanıyordum, sizin de sisteminizde hazır olduğunu varsayıyorum.

Kurulum için bir klasör oluşturdum:

mkdir nextcloud-setup cd nextcloud-setup

Docker Compose Dosyası

İlk başta basit bir docker-compose.yml dosyası ile başladım ama ilerledikçe bazı eklemeler yapmam gerekti. İşte kullandığım son hali:

services: nextcloud: image: nextcloud:30.0.2 restart: always ports: - 80 volumes: - nextcloud_data:/var/www/html environment: - NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_DOMAIN} 192.168.1.11 - MYSQL_HOST=nextcloud_db - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=${MYSQL_SECRET_PASSWORD} - OVERWRITEPROTOCOL=https - PHP_MEMORY_LIMIT=512M - PHP_UPLOAD_LIMIT=10G - REDIS_HOST=redis depends_on: - nextcloud_db - redis nextcloud_db: image: mariadb:10.11 restart: always command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW volumes: - nextcloud_db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=${MYSQL_SECRET_PASSWORD_ROOT} - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=${MYSQL_SECRET_PASSWORD} redis: image: redis:alpine restart: always volumes: - redis_data:/data volumes: nextcloud_data: nextcloud_db_data: redis_data: networks: dokploy-network: external: true

Karşılaştığım Sorunlar ve Çözümleri

1. Güvenilir Domain Hatası

Kurulumdan sonra tarayıcıdan girdiğimde "Trusted domain error" hatası aldım. Nextcloud, güvenlik için sadece belirlediğiniz domainlerden gelen istekleri kabul ediyor.

Çözüm: Environment değişkenlerine NEXTCLOUD_TRUSTED_DOMAINS ekledim. Hem domain adımı hem de lokal IP adresimi (192.168.1.11) ekledim. Bu sayede hem dışarıdan hem de ev ağımdan erişebiliyorum.

2. Redis Entegrasyonu

İlk başta Redis olmadan kurmuştum. Nextcloud çalışıyordu ama yavaştı, özellikle dosya senkronizasyonunda. Nextcloud'un admin panelinde de "No memory cache configured" uyarısı görüyordum.

Çözüm: Redis container'ı ekledim ve Nextcloud'a REDIS_HOST=redis environment değişkenini ekledim. Bu işlem sonrası performans fark edilir derecede arttı.

3. Büyük Dosya Yükleme Problemi

2GB'tan büyük dosya yüklemeye çalıştığımda upload yarıda kesiliyordu. PHP'nin varsayılan upload limiti düşükmüş.

Çözüm: PHP_UPLOAD_LIMIT=10G environment değişkenini ekledim. Aynı şekilde PHP_MEMORY_LIMIT=512M de ekledim çünkü büyük dosyalarda hafıza hatası alıyordum.

4. HTTPS Yönlendirme Sorunu

Reverse proxy (benim durumumda Dokploy) arkasında çalıştırdığım için Nextcloud, HTTP ile çalıştığını sanıyordu ve sürekli HTTP linkler üretiyordu.

Çözüm: OVERWRITEPROTOCOL=https ekleyerek Nextcloud'a HTTPS kullandığımı söyledim. Bu sayede üretilen tüm linkler doğru protokol ile oluşturuldu.

5. MariaDB Transaction Isolation

İlk kurulumda veritabanı ayarlarında herhangi bir özel konfigürasyon yapmamıştım. Nextcloud admin panelinde "database transaction isolation level" ile ilgili bir uyarı görünce araştırdım.

Çözüm: MariaDB container'ına --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW komut parametrelerini ekledim. Nextcloud dokümantasyonunda önerilen ayarlar bunlar.

.env Dosyası

Güvenlik için şifreleri docker-compose dosyasına yazmadım. Aynı klasörde bir .env dosyası oluşturdum:

NEXTCLOUD_DOMAIN=cloud.example.com MYSQL_SECRET_PASSWORD=güçlü_bir_şifre_buraya MYSQL_SECRET_PASSWORD_ROOT=başka_güçlü_bir_şifre

Bu dosyayı .gitignore'a ekledim tabii ki.

Kurulumu Başlatma

Her şey hazır olduğunda çalıştırdım:

docker-compose up -d

Container'lar ayağa kalktıktan sonra tarayıcıdan domain adresime girdim. İlk giriş biraz uzun sürdü çünkü Nextcloud ilk kurulumunu yapıyordu.

İlk Kurulum Ekranı

Tarayıcıdan eriştiğimde karşıma admin kullanıcı adı ve şifre oluşturma ekranı geldi. Burada dikkat edilmesi gereken nokta: Varsayılan olarak SQLite kullanmak istiyor ama biz zaten MariaDB ayarladık.

"Storage & database" kısmını açıp şunları girdim:

  • Database user: nextcloud
  • Database password: .env dosyasındaki şifre
  • Database name: nextcloud
  • Database host: nextcloud_db

Kurulum Sonrası Ayarlar

Cron İşleri

Nextcloud'un bazı arka plan işleri var. Varsayılan olarak AJAX kullanıyor ama Cron kullanmak daha performanslı. Nextcloud container'ına girip ayarladım:

docker exec -u www-data nextcloud-nextcloud-1 php cron.php

Bunu otomatikleştirmek için host sistemde bir crontab kaydı ekledim:

*/5 * * * * docker exec -u www-data nextcloud-nextcloud-1 php cron.php

Email Ayarları

SMTP ayarlarını yapana kadar kullanıcı daveti ve şifre sıfırlama gibi özellikler çalışmıyor. Admin panelinden Settings > Basic settings kısmından SMTP bilgilerimi girdim.

Performans İyileştirmeleri

Bir süre kullandıktan sonra fark ettiğim bazı şeyler:

  1. Preview Generator: Fotoğraf galerisi için önizleme oluşturucu uygulamasını kurdum. İlk seferde biraz zaman aldı ama artık galeriye girdiğimde çok daha hızlı açılıyor.

  2. Memory Caching: Redis'i ekledikten sonra zaten iyiydi ama admin panelinden "APCu" cache'i de etkinleştirdim.

  3. Background Job Scheduler: AJAX yerine Cron kullanmaya geçtim, yukarıda bahsetmiştim.

Yedekleme Stratejisi

Verilerim önemli olduğu için yedekleme konusunu da düşündüm. Docker volume'larını düzenli olarak yedekliyorum:

docker run --rm -v nextcloud-setup_nextcloud_data:/data -v $(pwd):/backup alpine tar czf /backup/nextcloud-data-$(date +%Y%m%d).tar.gz /data

Veritabanı için mysqldump kullanıyorum:

docker exec nextcloud-setup-nextcloud_db-1 mysqldump -u root -p$MYSQL_SECRET_PASSWORD_ROOT nextcloud > nextcloud-db-$(date +%Y%m%d).sql

Bu komutları bir bash script'e koydum ve haftalık çalışacak şekilde ayarladım.

Son Düşünceler

Nextcloud kurmak başta biraz karmaşık görünse de Docker sayesinde oldukça yönetilebilir. Karşılaştığım sorunların çoğu dokümantasyonda var aslında ama pratikte deneyince daha iyi anlaşılıyor.

Şu anda 500GB'tan fazla dosyam Nextcloud'da. Hem masaüstü hem mobil uygulamaları sorunsuz senkronize oluyor. Google Drive'dan tamamen kopmuş değilim ama önemli verilerim artık kendi kontrolümde.

Kurulumda takıldığınız bir yer olursa yorumlarda sormaktan çekinmeyin. Elimden geldiğince yardımcı olurum.