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. Gizli bilgileri, mode 600 ile ayarlanmış kardeş .env dosyasına koyun.
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:35-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:35-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 35 değerini olduğu gibi kopyalamadan önce Docker Hub üzerindeki güncel etiketi kontrol edin. 21 October 2026 itibarıyla Nextcloud, 33, 34 ve 35 sürümlerini sürdürüyor. Version 31 Şubat 2026'da, 32 ise Eylül 2026'da kullanım ömrünün sonuna ulaştı. Bu nedenle eski bir kılavuzdan kopyalanan bir etiket, artık düzeltme almayan bir sürümü kurar. latest, gelecekteki bazı docker compose pull işlemlerinde sizi ana sürüm sınırları arasında geçirir. Nextcloud bunu desteklemez.
Veri dizini, bilerek adlandırılmış volume yerine bind mount olarak kullanılır. Yedekleme aracının doğrudan gösterebileceği bir yol, düzenli bir yapıdan daha değerlidir. Dizini image'ın www-data UID değeriyle ve Nextcloud'un zorunlu kıldığı izinlerle oluşturun:
sudo mkdir -p /srv/nextcloud/data
sudo chown -R 33:33 /srv/nextcloud/data
sudo chmod 0770 /srv/nextcloud/dataPort publish ayarına dikkat edin: 127.0.0.1:8080:80. Docker, ufw'nin INPUT zinciri paketi görmeden önce değerlendirilen DNAT kuralları yazar. Tek başına 8080:80 kullanılması, ufw ne söylerse söylesin şifrelenmemiş bir Nextcloud örneğini public internet'e açar. Loopback'e bağlamak, servisi public interface üzerinde erişilemez durumda tutar. Böylece firewall yalnızca proxy'ye izin vermek zorunda kalır. SSH'yi tüm internet'e açık bırakmak istemiyorsanız, self-hosted WireGuard VPN üzerinden VPS'ye erişmek port 22'yi public kurallardan tamamen çıkarmanıza olanak tanır:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enabledocker compose up -d ile başlatın, ardından docker compose logs -f app değerini izleyin. İlk açılışta tüm application tree volume içine kopyalanır ve installer çalıştırılır. Bu işlem tamamlanana kadar container hiçbir isteğe yanıt vermez.
TLS ve reverse proxy
Nginx ve certbot paketlerini dağıtımın deposundan 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 sınamasının mekaniği, yenileme zamanlayıcısı ve hata modları Ubuntu 24.04 üzerinde certbot ve nginx ile Let's Encrypt sertifikası oluşturma rehberinde ayrıntılı olarak ele alınmıştır:
sudo apt install nginx certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.comCertbot, 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. Bunun 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.1 ve sonraki sürümlerde http2 on; yönergesini ekleyin. Bu yönerge 1.25.0 sürümünde bulunmaz ve nginx bu sürümde yönergeyi görürse başlatılamaz. Ubuntu 24.04, eşdeğerinin listen 443 ssl http2; olduğu daha eski bir sürümle gelir. nginx -t komutu, kullandığınız sürümün hangisini kabul ettiğini size gösterecektir.
Eğer client_max_body_size değeri çok küçükse, nginx büyük yüklemeleri doğrudan 413 hatasıyla reddeder. Okuma zaman aşımları çok kısa tutulursa, yükleme yarıda kesilir. Yukarıdaki değerler her iki sorunu da önler. proxy_request_buffering off, yüklenen dosyayı önce proxy diski üzerinde biriktirmek yerine doğrudan akış olarak iletir.
Ana makine üzerindeki nginx, tek bir uygulama için çalışan 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 rehberi, yönlendirme ve sertifika oluşturma işlemlerini container etiketlerine taşır; aynı client_max_body_size ve zaman aşımı endişeleri orada middleware ve transport ayarları olarak tekrar 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:cronHer 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 --allfiles: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.
Upgrades: each major version separately
Nextcloud, ana sürüm başına yalnızca tek bir sürüm yükseltmesini destekler. Resmi Docker imajında 29 sürümünden 31 sürümüne doğrudan geçiş, yükseltme işlemine hiç ulaşmaz. Entrypoint, occ upgrade çalıştırılmadan önce ana sürümleri karşılaştırır, Can't start Nextcloud because upgrading from <installed version> to <image version> is not supported. ve ardından It is only possible to upgrade one major version at a time. çıktısını verir ve sonlanır. Container başlatılamaz; restart: unless-stopped kullanıldığında yeniden başlatılır ve aynı satırlar tekrar yazdırılır. Maintenance mode etkinleştirilmez, veriler ve veritabanı değiştirilmez. Tag değeri bir sonraki ana sürüme ayarlanmalı ve işlem yeniden başlatılmalıdır.
Docker yükseltme işlemi şöyledir: yedek alınır, hem app hem de cron servislerinde tag değeri bir ana sürüm artırılır (36 sürümü çıktığında, Nextcloud'un Şubat 2027 için planladığı şekilde 35 sürümünden 36 sürümüne), ardından docker compose pull && docker compose up -d ve sonra docker compose logs -f app çalıştırılır. Image entrypoint'i, mevcut verilerle karşılaştırıldığında kodun daha yeni olduğunu algılar ve occ upgrade işlemini kendisi çalıştırır. Bu işlem kesilmemelidir. Log çıktısı durulduğunda docker compose exec -u www-data app php occ status çalıştırılmalı, versionstring doğrulanmalı ve uygulamaların yeniden etkinleştirildiği kontrol edilmelidir.
İki kural sorunları önler: Bir ana sürüm artırılmalı, doğrulama yapılmalı, ardından sonraki ana sürüme geçilmelidir. Ayrıca app servisindeki tag değeri, eşleşmesi için cron servisinde değiştirilmeden kesinlikle güncellenmemelidir. Aynı veritabanına karşı iki farklı Nextcloud sürümü kullanılması veri bozulmasına yol açabilir.
Karşılaşacağınız gerçek hatalar
"Your data directory is readable by other people. Please change the permissions to 0770 so that the directory cannot be listed by other people." Dizin modunun son hanesi, yani diğer kullanıcılar için olan kısım sıfır değildir. Diğerleri için tanımlanmış herhangi bir okuma, yazma veya çalıştırma biti bu uyarıyı tetikler. Grup bitleri kontrol edilmez, çünkü 0770 zaten gruba tam erişim izni verir. Nextcloud önce kendi başına chmod 0770 işlemini dener ve yalnızca bu başarısız olursa uyarı verir; bind mount yapılarında bu durum genellikle dizinin UID 33 sahibine ait olmadığı anlamına gelir. sudo chown -R 33:33 /srv/nextcloud/data ve sudo chmod 0770 /srv/nextcloud/data.
"Your data directory is invalid. Ensure there is a file called ".ncdata" in the root of the data directory." Bind mount noktası Nextcloud tarafından hiç başlatılmamış bir yeri gösteriyor olabilir, yolda bir yazım hatası vardır veya çalışan bir örneğin altına boş bir dizin yerleştirilmiştir. Ana makine yolunun volume satırı ile eşleştiğini doğrulayın.
"Access through untrusted domain." İstekteki ana makine adı trusted_domains içinde yer almıyor. NEXTCLOUD_TRUSTED_DOMAINS yalnızca ilk kurulumda geçerlidir; sonrasında ayarı canlı olarak şu şekilde yapı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 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 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 occ config:system:get memcache.locking ile doğrulayın; bu komut Redis sınıfını döndürmelidir.
"The PHP memory limit is below the recommended value of 512 MB." PHP_MEMORY_LIMIT değerini yükseltin ve konteyneri yeniden oluşturun. Bu değişikliğin en kötü durum senaryosundaki bellek tavanını nasıl etkileyeceğini unutmayın.
Ö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 image buna izin verir. Ancak paralel istekler gönderen tek bir masaüstü sync client bile SQLSTATE[HY000]: General error: 5 database is locked değerine ve HTTP 500 hatalarına yol açar. SQLite veritabanı genelinde yazma kilidi alır. Nextcloud ise sürekli olarak dosya kilitleri, activity kayıtları ve job durumu yazar. Postgres veya MariaDB ile başlayın. occ db:convert-type mevcuttur, ancak canlı veriler üzerinde uzun süren ve tamamen tamamlanması gereken bir migration işlemidir.
Bir Nextcloud VPS gerçekte ne kadar RAM gerektirir?
Boyutlandırmayı kullanıcı sayısına göre değil, eşzamanlılık düzeyine göre yapın. En kötü durumdaki resident memory, kabaca eşzamanlı istek sayısının PHP_MEMORY_LIMIT ile çarpımına, Postgres shared buffer alanına, her bağlantı için bir backend sürecine ve preview oluşturmanın neden olduğu ani kullanım artışına eşittir. 2 GB RAM bulunan bir sunucuda preview işlemlerini sınırlayıp swap ekleyerek küçük bir ev ortamı instance'ı çalıştırılabilir. Collabora veya full-text search eklendiğinde ikinci bir resident servis grubu için de kaynak ayrılması gerekir.
nginx reverse proxy arkasında büyük upload işlemleri neden başarısız olur?
Genellikle proxy üzerindeki iki ayar bunu açıklar. client_max_body_size değeri varsayılan 1 MB olarak bırakılırsa nginx daha büyük tüm istekleri doğrudan 413 (Request Entity Too Large) hatasıyla reddeder. Bu durum kısmi bir dosya olarak değil, nginx error log içinde görünür. Kısa proxy_read_timeout / proxy_send_timeout değerleri uzun transferleri ortasında keser. Her iki değeri de yeterince yüksek ayarlayın, proxy_request_buffering off değerini spool yerine stream kullanacak şekilde yapılandırın ve uygulama container'ındaki PHP_UPLOAD_LIMIT değerini buna uygun olarak yükseltin.
Nextcloud neden redirect döngüsüne giriyor veya reverse proxy hakkında uyarı veriyor?
Container, nginx'i 127.0.0.1 adresinde görmez. Bunun yerine Docker bridge gateway'ini, 172.x aralığında bir adresi görür. Bu adres TRUSTED_PROXIES içinde bulunmadığında X-Forwarded-Proto: https header'ı yok sayılır. Nextcloud http:// URL'leri üretir ve proxy bu URL'leri tekrar geri yönlendirir. TRUSTED_PROXIES değerini gerçek bridge subnet'i olarak 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, her upgrade işleminde yalnızca bir major sürümü destekler. Resmi Docker image üzerinde entrypoint, occ upgrade çalıştırılmadan önce major sürümleri denetler. It is only possible to upgrade one major version at a time. mesajını yazdırıp çıkar. Bu nedenle container başlatılmaz; verileriniz ve veritabanınız mevcut haliyle kalır. Tag değerini önce 30 olarak ayarlayın: yedek alın, hem app hem de cron servislerinde tag değerini bir major sürüm artırın, docker compose pull && docker compose up -d çalıştırın, occ status ile doğrulayın ve ardından işlemi tekrarlayın.