SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-27

VPS Üzerinde Docker ile Nextcloud Kurulumu ve Yedekleme

Docker Compose, Postgres ve Redis kullanarak VPS üzerinde güvenli Nextcloud kurulumu yapın. TLS yapılandırması ve verilerinizi koruyan tutarlı yedekleme adımlarını öğrenin.

Gerçekte ne inşa ediyorsunuz

Bu kılavuz, bir VPS üzerinde Docker Compose ile Nextcloud çalıştırır, önüne Let's Encrypt TLS katmanı ekler ve gerçekten geri yüklenebilen bir yedekleme mekanizması kurar. Dört container ve bir proxy: loopback üzerinde dinleme yapan resmi nextcloud imajı, tüm dosya meta verilerini tutan Postgres, dosya kilitlerini tutan Redis, sadece cron döngüsünü çalıştıran ikinci bir Nextcloud imajı ve tüm bunların önünde TLS termination işlemini gerçekleştiren host üzerindeki nginx. Kurulumun kendisi yirmi dakika sürer ancak önemli olan kısım bu değildir. İlk saatte verilen iki karar, bir yıl sonra dosyalarınızın hala elinizde olup olmayacağını belirler: SQLite yerine gerçek bir veritabanı kullanmak ve veri dizinini, veritabanını ve config.php içeriğini tutarlı bir set olarak yakalayan bir yedekleme stratejisi.

Bu kılavuz, Ubuntu 24.04 LTS veya Debian 13 işletim sistemlerini, Docker'ın kendi deposundan kurulmuş Compose v2 eklentisine sahip Docker Engine'i ve VPS'i işaret eden bir DNS A kaydının (IPv6 kullanıyorsanız ek olarak AAAA kaydının) halihazırda cloud.example.com adresine yönlendirilmiş olduğunu varsayar. Tüm bu yapı, kontrolün sizde olduğu bir sunucu gerektirir; başkasının SaaS hizmeti üzerinde TLS termination yapmanın veya veritabanı dökümü almanın bir yolu yoktur.

Boyutlandırma: Belleği asıl tüketen unsurlar

Nextcloud'un bellek kullanımı üç ana unsur tarafından belirlenir ve bunların hiçbiri doğrudan "Nextcloud"un kendisi değildir.

PHP işleyicileri (workers). -apache imajı, eş zamanlı her isteği, bir PHP yorumlayıcısı barındıran bir işleyici sürecinden geçirir. PHP isteği sonlandırana kadar her işleyici PHP_MEMORY_LIMIT değerine kadar büyüyebilir. En kötü senaryoda yerleşik bellek kullanımı yaklaşık olarak eş zamanlı istek sayısı × bellek sınırı kadardır; masaüstü eşitleme istemcisi kullanıcı başına birden fazla paralel bağlantı açar. Üst sınırı kullanıcı sayısı değil, eş zamanlılık belirler.

Veritabanı. Postgres, her bağlantı için bir arka uç süreci oluşturur ve paylaşılan arabellekleri bellekte tutar. Çalışma kümesi, bayt sayısına göre değil dosya sayısına göre ölçeklenir: oc_filecache, kullanıcı başına dosya başına bir satır tutar. Yüz bin küçük dosya, yüz büyük dosyadan daha ağır bir veritabanı yükü oluşturur.

Önizleme oluşturma. Küçük resim oluşturma işlemi, kaynak görseli tam çözünürlükte belleğe açar. Video önizlemeleri ffmpeg aracılığıyla dış komut çalıştırır. occ preview:generate-all çalıştırmak, bu işlemi arka arkaya tekrarlayarak küçük bir VPS'i OOM killer (bellek yetersizliği sonlandırıcısı) ile karşı karşıya bırakmanın en yaygın yoludur.

Redis nispeten düşük maliyetlidir. Daha sonra eklediğiniz Collabora, tam metin arama, antivirüs tarayıcısı gibi her şey, kendi bellek ayak izine sahip ayrı bir yerleşik servistir ve etkinleştirmeden önce boyutlandırma planınıza dahil edilmelidir.

RAM konusunda kısıtlıysanız kullanabileceğiniz yöntemler şunlardır: PHP_MEMORY_LIMIT değerini düşürün, preview_max_x / preview_max_y / preview_max_filesize_image değerlerini sınırlayın, enabledPreviewProviders ayarını yalnızca göz attığınız formatlarla kısıtlayın ve veri dizininizin dosya boyutlarınızın birkaç katına sessizce çıkmaması için trashbin_retention_obligation ve versions_retention_obligation ayarlarını yapılandırın. Bir swap dosyası ekleyin. Swap yavaştır ancak yükseltme sırasında gerçekleşen bir OOM sonlandırması çok daha kötüdür.

SQLite neden sorun çıkarır

Nextcloud, SQLite desteğiyle gelir ve resmi imajı varsayılan olarak bunu kullanır. Bunu yapmayın. SQLite, yazma işlemlerini veritabanı genelinde bir kilitleme mekanizmasıyla sıraya alır: tüm dosya için aynı anda yalnızca bir yazma işlemi gerçekleşebilir. Nextcloud sürekli olarak dosya kilitleri, etkinlik satırları, önbellek girdileri ve iş durumları yazar; bir masaüstü istemcisinin dizin ağacını senkronize etmesi bile birçok eşzamanlı istek oluşturur. Bu kullanım modelinde SQLSTATE[HY000]: General error: 5 database is locked hatası ve HTTP 500 hataları alırsınız; hata tam olarak örnek (instance) kullanışlı hale geldiği anda ortaya çıkar.

Daha sonra occ db:convert-type ile dönüştürme yapmak mümkündür, ancak bu canlı veri seti üzerinde uzun süren ve ya hep ya hiç mantığıyla çalışan bir geçiş sürecidir. Başlangıçta Postgres veya MariaDB kullanın.

Compose dosyası

Bunu /srv/nextcloud/compose.yaml içine yerleştirin; parolaları ise 600 modunda, aynı dizindeki bir .env dosyasında tutun.

services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    volumes:
      - db:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_PASSWORD: ${DB_PASSWORD}

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD}

  app:
    image: nextcloud:31-apache
    restart: unless-stopped
    depends_on: [db, redis]
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - html:/var/www/html
      - /srv/nextcloud/data:/var/www/html/data
    environment:
      POSTGRES_HOST: db
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      REDIS_HOST: redis
      REDIS_HOST_PASSWORD: ${REDIS_PASSWORD}
      NEXTCLOUD_ADMIN_USER: admin
      NEXTCLOUD_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      NEXTCLOUD_TRUSTED_DOMAINS: cloud.example.com
      TRUSTED_PROXIES: 172.16.0.0/12
      OVERWRITEPROTOCOL: https
      OVERWRITECLIURL: https://cloud.example.com
      APACHE_DISABLE_REWRITE_IP: "1"
      PHP_MEMORY_LIMIT: 512M
      PHP_UPLOAD_LIMIT: 10G

  cron:
    image: nextcloud:31-apache
    restart: unless-stopped
    entrypoint: /cron.sh
    depends_on: [db, redis]
    volumes:
      - html:/var/www/html
      - /srv/nextcloud/data:/var/www/html/data

volumes:
  db:
  html:

Ana sürüm etiketini sabitleyin ve 31 ifadesini kopyalamadan önce Docker Hub üzerinden güncel sürümü kontrol edin. latest kullanımı, gelecekteki bir docker compose pull güncellemesinde sizi ana sürüm sınırının dışına taşıyabilir ve Nextcloud bunu desteklemez.

Veri dizini, isimlendirilmiş bir volume değil, bilinçli olarak bir bind mount olarak yapılandırılmıştır: yedekleme aracını doğrudan yönlendirebileceğiniz bir yol, düzenli görünmekten daha değerlidir. Bu dizini, imajın www-data UID değeriyle ve Nextcloud'un gerektirdiği izinlerle oluşturun:

sudo mkdir -p /srv/nextcloud/data
sudo chown -R 33:33 /srv/nextcloud/data
sudo chmod 0770 /srv/nextcloud/data

Port yönlendirmesine dikkat edin: 127.0.0.1:8080:80. Docker, portları ufw'nin INPUT zinciri paketi görmeden önce değerlendirilen DNAT kuralları yazarak yayınlar; çıplak bir 8080:80, ufw ne derse desin şifrelenmemiş bir Nextcloud'u genel internete açar. Loopback arayüzüne bağlamak, servisi genel ağ arayüzünden uzak tutar. Bu durumda güvenlik duvarının yalnızca proxy'ye izin vermesi yeterlidir; eğer SSH'ı tüm internete açık bırakmak istemiyorsanız, VPS'e kendi barındırdığınız WireGuard VPN üzerinden erişmek, 22 numaralı portu genel kurallardan tamamen kaldırmanıza olanak tanır:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Servisi docker compose up -d ile ayağa kaldırın ve ardından docker compose logs -f app ile günlük kayıtlarını izleyin. İlk başlatma, tüm uygulama ağacını volume içine kopyalar ve kurulumu çalıştırır; bu işlem tamamlanana kadar container yanıt vermez.

TLS ve reverse proxy

Dağıtımın paket yöneticisinden nginx ve certbot paketlerini kurun, doğru server_name değerlerini içeren standart bir 80 numaralı port sunucu bloğu oluşturun ve ardından certbot'un bu bloğu yeniden yazmasını sağlayın. HTTP-01 challenge mekanizması, yenileme zamanlayıcısı ve hata modları ile ilgili tüm detaylar Ubuntu 24.04 üzerinde certbot ve nginx ile Let's Encrypt sertifikası oluşturma rehberinde açıklanmıştır:

sudo apt install nginx certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.com

Certbot, ssl_certificate satırlarını ve :80:443 yönlendirmesini ekler; ayrıca 90 günlük sertifikayı yenileyen bir systemd zamanlayıcısı kurar. Bu zamanlayıcının varlığını systemctl list-timers | grep certbot ile doğrulayın; etkinleştirilmemiş bir yenileme zamanlayıcısı, 90 günlük bir saatli bomba gibidir.

Proxy bloğunun kendisi:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name cloud.example.com;

    # certbot manages ssl_certificate / ssl_certificate_key here

    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

    client_max_body_size 10G;
    client_body_timeout 300s;

    location = /.well-known/carddav { return 301 /remote.php/dav; }
    location = /.well-known/caldav  { return 301 /remote.php/dav; }

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_request_buffering off;
        proxy_buffering off;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

nginx 1.25 ve sonraki sürümlerde http2 on; parametresini ekleyin. Ubuntu 24.04, eşdeğeri listen 443 ssl http2; olan daha eski bir sürümle gelmektedir. nginx -t komutu, kullandığınız sürümün hangisini kabul ettiğini size gösterecektir.

client_max_body_size ve uzun okuma zaman aşımları (read timeouts), büyük yüklemelerin yarıda kesilmesini engeller. proxy_request_buffering off, dosyanın tamamını önce proxy diski üzerinde biriktirmek yerine yüklemeyi doğrudan akış (stream) olarak iletir.

Tek bir uygulama için ana makine üzerinde çalışan nginx, işlevsel olan en basit çözümdür. Eğer Nextcloud, VPS üzerinde diğer container'lar ile paylaşılacaksa, birden fazla uygulama için Docker Compose ile Traefik reverse proxy çalıştırma yöntemi, yönlendirme ve sertifika oluşturma işlemlerini container etiketlerine taşır; aynı client_max_body_size ve zaman aşımı endişeleri orada da middleware ve transport ayarları olarak karşınıza çıkar.

trusted_proxies ve overwriteprotocol

Self-hosted Nextcloud kurulumlarının çoğunda hata yapılan ve belirtileri asıl nedenden bağımsız görünen kısım burasıdır.

X-Forwarded-Proto: https, yalnızca trusted_proxies içinde listelenen bir adresten gelen istekler için dikkate alınır. Bu ayar dikkate alınmadığında, Nextcloud isteğin düz HTTP olduğunu varsayar ve http:// URL'leri üretir; proxy bunları HTTPS'e yönlendirir; tarayıcı yönlendirmeyi takip eder; Nextcloud tekrar http:// üretir. Bu durum bir yönlendirme döngüsüne (redirect loop) yol açar. OVERWRITEPROTOCOL: https ise şemayı ne olursa olsun sabitler.

TRUSTED_PROXIES ayarındaki tuzak, Nextcloud'un gördüğü adresin 127.0.0.1 olmamasıdır. nginx ana makinede çalışır ve yayınlanan bir porta bağlanır; bu nedenle container, Docker köprü ağ geçidini, yani 172.x içindeki bir adresi görür. Gerçek alt ağı bulun:

docker network inspect nextcloud_default \
  -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}'

Bu CIDR değerini (veya onu kapsayan 172.16.0.0/12 değerini) TRUSTED_PROXIES içine yerleştirin. Çok geniş bir aralık belirlerseniz herhangi bir istemci X-Forwarded-For başlığını taklit edebilir; yanlış belirlerseniz tüm girişler ağ geçidi adresinden geliyormuş gibi görünür, kaba kuvvet koruması (brute-force protection) tüm instance'ınızı aynı anda engeller ve yönetici genel bakış ekranında "Ters proxy başlık yapılandırması yanlış veya Nextcloud'a güvenilir bir proxy üzerinden erişiyorsunuz." uyarısı görüntülenir.

OVERWRITECLIURL, ana bilgisayar adını çıkarabileceği gelen bir isteği bulunmayan cron container'ı için önemlidir. Bu ayar yapılmadığında, arka plan işleri localhost adresine bağlantılar oluşturur ve e-posta bildirimleri kullanılamaz URL'ler gönderir.

Arka plan işleri: AJAX yerine cron

Nextcloud'un varsayılan iş çalıştırıcısı AJAX'tır: işler, bir kullanıcı sayfayı yüklediğinde yan etki olarak yürütülür. Saat 04:00'te kimse tarayıcı kullanmadığı için çöp temizleme, sürüm temizliği, önizleme oluşturma ve federasyon yeniden denemeleri durur; bunun ilk belirtisi, veri dizininin sürekli büyümesidir. Yukarıdaki cron servisi, aynı birimler üzerinde resmi /cron.sh döngüsünü çalıştırır. Nextcloud'a bunu kullanması gerektiğini bildirin:

docker compose exec -u www-data app php occ background:cron

Her occ komutu şu yapıyı izler: docker compose exec -u www-data app php occ <command>. Bu komut için bir alias tanımlamak yararlıdır.

Yedekleme: üç bileşen veya hiçbiri

Yalnızca dosya sistemini içeren bir yedekleme, bozuk bir örneğe geri yükleme yapar. Veri dizini baytları tutar; Postgres dosya önbelleğini, paylaşımları, kullanıcıları ve uygulama durumunu barındırır; config.php ise veritabanı kimlik bilgilerini, örnek kimliğini (instance ID) ve parola tuzunu (password salt) saklar. Dosyaları veritabanı olmadan geri yüklerseniz Nextcloud bunları göremez. Veritabanını config.php olmadan geri yüklerseniz veritabanını açamaz. Eski bir veritabanını daha yeni bir veri dizini üzerine geri yüklerseniz, yerleri değişmiş dosyaları işaret eden paylaşımlarla karşılaşırsınız.

Durağan (quiesced) bir örnekten üçünü de yedekleyin:

#!/usr/bin/env bash
set -euo pipefail
cd /srv/nextcloud
DEST="/var/backups/nextcloud/$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -p "$DEST"

occ() { docker compose exec -T -u www-data app php occ "$@"; }

occ maintenance:mode --on
trap 'occ maintenance:mode --off' EXIT

docker compose exec -T db \
  pg_dump -U nextcloud --clean --if-exists nextcloud | gzip > "$DEST/db.sql.gz"

docker compose exec -T app \
  tar -C /var/www/html -cf - config custom_apps themes > "$DEST/app.tar"

rsync -a --delete /srv/nextcloud/data/ /var/backups/nextcloud/data/

Bakım modu, veritabanı dökümü ile dosya kopyasının birbiriyle uyumlu olmasını sağlar. Bu adımı atlarsanız, rsync henüz ulaşmamışken veritabanının bir dosyaya referans verdiği bir anı yakalayabilirsiniz. Betiğin zaman damgalı veritabanı dökümlerini tuttuğunu, ancak veri dizininin yalnızca tek bir güncel yansımasını sakladığını unutmayın; rsync --delete her çalıştırmada bu yansımayı üzerine yazar, bu nedenle yalnızca en yeni döküm dosya kopyasıyla eşleşir.

Ardından yedekleri sunucudan dışarı çıkarın. Yedeklenen şeyle aynı VPS üzerinde duran bir yedek, yedek değil yalnızca bir kopyadır. restic ile nesne depolama alanına veya ikinci bir sunucuya aktarım standart çözümdür; ayrıca tekilleştirme (deduplication) özelliği, veri dizinini gecelik tar arşivlerinden çok daha verimli yönetir. Depo başlatma işleminden gecelik zamanlayıcıya ve geri yükleme tatbikatına kadar tüm kurulum restic ile sunucu dışı VPS yedekleme rehberinde yer almaktadır.

Geri yükleme, işlemin basitçe tersine çevrilmesi değildir. Yeni başlatılan bir yığın, yükleyiciyi çalıştırır ve yepyeni bir config.php, yeni bir örnek kimliği ve parola tuzu yazar; dökümü bu yeni kimliğin üzerine aktarmak, bozuk oturumlara ve geçersiz paylaşım belirteçlerine yol açar. Önce eski kimliği şu sırayla geri yükleyin:

docker compose up -d && docker compose stop app cron    # create the volumes, then halt the app
sudo rsync -a --delete /var/backups/nextcloud/data/ /srv/nextcloud/data/
docker compose run --rm -T --entrypoint "" app \
  tar -C /var/www/html -xf - < app.tar                  # the original config.php returns
gunzip -c db.sql.gz | docker compose exec -T db psql -U nextcloud -d nextcloud
docker compose start app cron
docker compose exec -T -u www-data app php occ maintenance:mode --off
docker compose exec -T -u www-data app php occ files:scan --all

files:scan, dosya önbelleğini diskteki gerçek verilerle uyumlu hale getirir. Buna ihtiyaç duymadan önce, yedek bir VPS üzerinde bu süreci bir kez prova edin. Diskteki baytlar ile Postgres'teki meta veriler arasındaki bu ayrım, aynı yapıdaki tüm uygulamalar için geçerlidir; kütüphaneyi yedekleyip veritabanını yedeklemeyen bir Immich yedeğinin boş bir zaman çizelgesine geri dönmesinin nedeni budur.

Yükseltmeler: her seferinde bir ana sürüm

Nextcloud, her seferinde tam olarak bir ana sürüm yükseltmeyi destekler. 29 sürümünden 31 sürümüne doğrudan geçiş düzgün bir şekilde sonuçlanmaz; Exception: Updates between multiple major versions and downgrades are unsupported. hatası verir ve sizi bakım modunda bırakır.

Docker yükseltme süreci şu şekildedir: bir yedek alın, app ve cron servislerinin her ikisinde de etiketi 31 değerinden 32 değerine güncelleyin, ardından docker compose pull && docker compose up -d komutunu çalıştırın ve son olarak docker compose logs -f app komutunu uygulayın. İmajın giriş noktası (entrypoint), mevcut verilerle karşılaştırarak daha yeni kodu algılar ve occ upgrade işlemini kendisi gerçekleştirir. Bu işlemi kesintiye uğratmayın. Günlük kayıtları sessizleştiğinde docker compose exec -u www-data app php occ status komutunu çalıştırın, versionstring üzerinden kontrol edin ve uygulamaların etkinleştirilmiş halde geri geldiğinden emin olun.

Sizi kurtaracak iki kural şunlardır: her seferinde bir ana sürüm yükseltin, doğrulayın ve ardından bir sonrakine geçin. Ayrıca, cron dosyasını da eşleşecek şekilde düzenlemeden app servisi üzerindeki etiketi asla değiştirmeyin; tek bir veritabanına karşı iki farklı Nextcloud sürümü çalıştırmak veri bozulmasına yol açar.

Karşılaşacağınız gerçek hatalar

"Your data directory is readable by other users. Please change the permissions to 0770." Bind-mount edilen dizin, grup veya diğer kullanıcılar için okuma iznine sahiptir. sudo chmod 0770 /srv/nextcloud/data ve sudo chown -R 33:33 /srv/nextcloud/data komutlarını kullanın.

"Your data directory is invalid. Ensure there is a file called .ocdata in the root." Bind mount noktası Nextcloud'un hiç başlatılmadığı bir yere işaret ediyor, yolda bir yazım hatası var veya çalışan bir örneğin altına boş bir dizin yerleştirildi. Host yolunun volume satırı ile eşleştiğini doğrulayın.

"Access through untrusted domain." İstekteki ana makine adı (hostname) trusted_domains içinde tanımlı değil. NEXTCLOUD_TRUSTED_DOMAINS yalnızca ilk kurulumda geçerlidir; sonrasında canlı olarak ayarlayın: occ config:system:set trusted_domains 1 --value=cloud.example.com.

502 Bad Gateway, /var/log/nginx/error.log içinde connect() failed (111: Connection refused) while connecting to upstream hatası ile birlikte. nginx, 127.0.0.1:8080 üzerinde hiçbir şeye ulaşamadı. Konteyner hala başlatılıyor olabilir (docker compose logs app ile kontrol edin), çıkış yapmış olabilir (docker compose ps) veya publish satırı proxy_pass portu ile eşleşmiyor olabilir. ss -ltnp | grep 8080 ile doğrulayın.

Yönlendirme döngüsü veya yönetici genel bakışında "insecure" uyarıları. OVERWRITEPROTOCOL: https eksik veya TRUSTED_PROXIES, Docker ağ geçidi alt ağını içermiyor. Yukarıdaki proxy bölümüne bakın.

LockedException: "files/..." is locked. REDIS_HOST ayarlandığında, imaj Redis'i kilitleme arka ucu (locking backend) olarak yapılandırır ve eski kilitler nadiren oluşur. Bu ayar olmadan kilitler oc_file_locks veritabanı tablosunda tutulur ve yazma işlemi sırasında kesilen bir istek, geride satırlar bırakır. Kilit satırlarını elle temizlemeden önce Redis'in gerçekten kullanımda olduğunu doğrulayın; occ config:system:get memcache.locking komutu Redis sınıfını döndürmelidir.

"The PHP memory limit is below the recommended value of 512MB." PHP_MEMORY_LIMIT değerini yükseltin ve konteyneri yeniden oluşturun. Bunun en kötü durum senaryosundaki üst sınır üzerindeki etkisini göz önünde bulundurun.

Ölçeklendirme sırasında karşılaşılan sorunlar

İlk engel, veri dizininin birim kapasitesini aşmasıdır. Bir VPS üzerinde birimi büyütmek, yeniden boyutlandırma ve dosya sistemi genişletme işlemlerini gerektirir; bu süreci disk doluluk oranı %100'e ulaştığında değil, planlı bir şekilde yönetmek çok daha az zahmetlidir. Disk kullanımına ilişkin uyarıları şimdi yapılandırın, ertelemeyin.

İkinci engel oc_filecache ile ilgilidir. Dosya listeleme ve senkronizasyon taramaları, satır sayısı arttıkça yavaşlar. Çözüm veritabanı tarafındadır: Postgres'i hızlı depolama birimlerinde tutun, yeterli paylaşımlı bellek kullanmasına izin verin ve çöp dosyalar ile sürümleri sonsuza kadar biriktirmek yerine saklama ayarlarıyla temizleyin.

Üçüncü engel, önizleme oluşturma sürecinin diğer tüm işlemlerle kaynak rekabetine girmesidir. Küçük bir sunucuda önizleme sağlayıcılarını sınırlı tutun ve occ preview:generate-all işlemini asla mesai saatleri içerisinde çalıştırmayın. Depoladığınız verilerin büyük çoğunluğunu telefon kamera yedekleri oluşturuyorsa, küçük resim oluşturma işini bu amaca özel bir fotoğraf sunucusuna devredin. RAM kullanımı, mobil uygulamalar ve yedekleme komutları açısından PhotoPrism ve Immich karşılaştırması, her ikisinin de bir Nextcloud sunucusuna kıyasla maliyetini açıklar.

Bunun ötesinde, dürüst cevap şudur: ek özellikler kendi makinelerine ihtiyaç duyar. Collabora ve tam metin arama, kendi bellek profillerine sahip ayrı yerleşik servislerdir. Bunları dosyalarınızın tek kopyasını barındıran sunucuya kurmak, herhangi bir fayda sağlamadan hata etki alanını genişletir. Tarayıcı içi belge düzenleme istediğiniz ek özellik ise, OnlyOffice ile Collabora arasındaki RAM taban değerleri ve bağlantı limitleri, 2 ila 4 GB RAM'e sahip bir VPS'in hangisini kaldırabileceğini belirler. Birim yapısı artık ihtiyacınızı karşılamadığında dosya depolamayı S3 uyumlu birincil depolama birimine taşıyın. Bunun yedeklemeyi kolaylaştırmadığını, aksine zorlaştırdığını unutmayın: veritabanı hala meta verileri tutar ve bu verilerin bucket ile eşzamanlı olarak dökümünün alınması gerekir.

Örnek (instance) gerçek kullanıcılara hizmet vermeye başladığında, önüne Uptime Kuma yerleştirin; böylece kesintilerden senkronizasyon istemcilerinden önce haberdar olursunuz. Özel bir bulut, kendi posta sunucunuz ile iyi bir uyum sağlar. Servisleri manuel olarak birbirine bağlamak istemiyorsanız, Cloudron, CasaOS ve Coolify bu süreci sizin yerinize yapan platformları karşılaştırır. Eğer listedeki bir sonraki adım kendi kendine barındırılan bir arama motoru ise, yukarıdakilerden farklı türde sorunlar bekleyin: SearXNG'nin 429 hataları, ya kendi hız sınırlayıcısından ya da yukarı akış (upstream) motorlarının VPS IP adresinizi engellemesinden kaynaklanır; hangisi olduğunu yalnızca günlük kayıtları (log) söyler.

FAQ

Nextcloud'u Postgres yerine SQLite üzerinde çalıştırabilir miyim?

Çalıştırabilirsiniz ve resmi imaj buna izin verir, ancak paralel istekler gönderen tek bir masaüstü eşitleme istemcisi SQLSTATE[HY000]: General error: 5 database is locked hatasına ve HTTP 500 hatalarına yol açacaktır. SQLite veritabanı genelinde yazma kilidi kullanır; Nextcloud ise sürekli olarak dosya kilitleri, etkinlik satırları ve iş durumları yazar. Postgres veya MariaDB ile başlayın; occ db:convert-type mevcuttur ancak canlı veriler üzerinde uzun ve ya hep ya hiç şeklinde bir geçiş sürecidir.

Bir Nextcloud VPS'i gerçekte ne kadar RAM'e ihtiyaç duyar?

Kullanıcı sayısına göre değil, eşzamanlılık kapasitesine göre boyutlandırma yapın. En kötü senaryoda bellek kullanımı, kabaca eşzamanlı istek sayısı ile PHP_MEMORY_LIMIT değerinin çarpımı, artı Postgres paylaşımlı arabellekleri ve bağlantı başına bir arka uç süreci, artı önizleme oluşturma sırasında oluşan ani bellek artışları kadardır. 2 GB'lık bir sunucu, önizlemeleri sınırlandırıp swap alanı eklerseniz küçük bir ev tipi kurulumu çalıştırabilir; ancak Collabora veya tam metin arama eklerseniz, ikinci bir yerleşik servis kümesi için boyutlandırma yapmanız gerekir.

Büyük yüklemeler neden nginx reverse proxy arkasında başarısız oluyor?

Bunun nedeni genellikle proxy üzerindeki iki ayardır: 1 MB varsayılan değerinde bırakılan client_max_body_size isteği keser ve kısa proxy_read_timeout / proxy_send_timeout değerleri uzun süren aktarımları yarıda keser. Her iki değeri de cömertçe ayarlayın, proxy_request_buffering off değerini spool yerine stream moduna getirin ve uygulama container'ı üzerindeki PHP_UPLOAD_LIMIT değerini buna uyacak şekilde yükseltin.

Nextcloud neden döngüsel yönlendirme yapıyor veya reverse proxy hakkında uyarı veriyor?

Container, 127.0.0.1 üzerindeki nginx'i görmez; bunun yerine 172.x içindeki Docker köprü ağ geçidini görür. Bu adres TRUSTED_PROXIES içinde eksik olduğunda, X-Forwarded-Proto: https başlığı göz ardı edilir, Nextcloud http:// URL'leri üretir ve proxy bunları geri döndürür. TRUSTED_PROXIES değerini gerçek köprü alt ağına ayarlayın ve OVERWRITEPROTOCOL: https değerini sabitleyin.

Nextcloud'u 29 sürümünden doğrudan 31 sürümüne yükseltebilir miyim?

Hayır. Nextcloud, yükseltme başına yalnızca bir ana sürüm atlamayı destekler; sürüm atlamak Updates between multiple major versions and downgrades are unsupported. hatasıyla durur ve kurulumu bakım modunda bırakır. Yedek alın, hem app hem de cron servislerinde etiketi bir ana sürüm artırın, docker compose pull && docker compose up -d işlemini gerçekleştirin, occ status ile doğrulayın ve ardından işlemi tekrarlayın.