Menjalankan Nextcloud di VPS dengan Docker dan TLS
Pelajari konfigurasi Nextcloud di VPS dengan Docker Compose, Postgres, Redis, nginx, TLS Let's Encrypt, serta backup dan upgrade agar data tetap dapat dipulihkan.
Yang sebenarnya Anda bangun
Panduan ini menjalankan Nextcloud pada VPS dengan Docker Compose, menempatkan TLS Let's Encrypt di depannya, dan menyiapkan backup yang benar-benar dapat dipulihkan. Terdapat empat container dan sebuah proxy: image resmi nextcloud yang mendengarkan pada loopback, Postgres yang menyimpan seluruh metadata file, Redis yang menyimpan file lock, salinan kedua image Nextcloud yang hanya menjalankan loop cron, serta nginx pada host yang melakukan terminasi TLS di depan semuanya. Instalasinya sendiri membutuhkan waktu dua puluh menit, tetapi bukan itu bagian yang penting. Dua keputusan yang dibuat pada jam pertama menentukan apakah file Anda masih tersedia setahun kemudian: menggunakan database sungguhan, bukan SQLite, serta membuat backup yang menangkap direktori data, database, dan config.php sebagai satu set yang konsisten.
Panduan ini mengasumsikan Ubuntu 24.04 LTS atau Debian 13, Docker Engine dengan plugin Compose v2 yang diinstal dari repositori resmi Docker, serta record DNS A (ditambah AAAA jika Anda menggunakan IPv6) yang sudah mengarah cloud.example.com ke VPS. Semua ini memerlukan server yang Anda kendalikan. Tidak ada cara untuk melakukan terminasi TLS dan dump database pada SaaS milik pihak lain.
Sizing: apa yang sebenarnya menggunakan memori
Penggunaan memori Nextcloud terutama ditentukan oleh tiga hal, dan tidak satu pun dari ketiganya adalah "Nextcloud" itu sendiri.
Worker PHP. Image -apache melayani setiap permintaan bersamaan melalui proses worker yang memuat interpreter PHP. Setiap worker dapat menggunakan hingga PHP_MEMORY_LIMIT sebelum PHP menghentikan permintaan tersebut. Perkiraan memori resident dalam kondisi terburuk adalah jumlah permintaan bersamaan × batas memori, dan client sinkronisasi desktop membuka beberapa koneksi paralel untuk setiap pengguna. Batasnya ditentukan oleh konkurensi, bukan jumlah pengguna.
Database. Postgres membuat proses backend untuk setiap koneksi dan mempertahankan shared buffer di memori. Working set-nya bertambah berdasarkan jumlah file, bukan jumlah byte: oc_filecache menyimpan satu baris untuk setiap file pada setiap pengguna. Seratus ribu file kecil membebani database lebih besar daripada seratus file besar.
Pembuatan preview. Pembuatan thumbnail mendekode gambar sumber ke memori dalam resolusi penuh. Preview video menjalankan ffmpeg sebagai proses eksternal. Menjalankan occ preview:generate-all melakukan lonjakan penggunaan memori tersebut berulang kali secara berturut-turut, dan merupakan cara yang paling umum untuk mendorong VPS kecil hingga dihentikan oleh OOM killer.
Redis relatif hemat. Apa pun yang Anda tambahkan kemudian, seperti Collabora, pencarian full-text, atau pemindai antivirus, merupakan service resident terpisah dengan penggunaan memorinya sendiri. Masukkan service tersebut ke dalam perencanaan kapasitas sebelum mengaktifkannya.
Jika RAM terbatas, gunakan pengaturan berikut: turunkan PHP_MEMORY_LIMIT, batasi preview_max_x / preview_max_y / preview_max_filesize_image, batasi enabledPreviewProviders hanya pada format yang benar-benar Anda jelajahi, dan atur trashbin_retention_obligation serta versions_retention_obligation agar direktori data tidak diam-diam membesar hingga beberapa kali ukuran file Anda. Tambahkan file swap. Swap berjalan lambat, dan penghentian proses oleh OOM saat upgrade berlangsung dapat menimbulkan masalah yang lebih besar.
Mengapa SQLite bermasalah
Nextcloud mendukung SQLite, dan image resmi akan langsung menggunakannya. Jangan gunakan SQLite. SQLite membuat operasi tulis berjalan secara serial dengan lock di seluruh database: hanya satu proses penulis pada satu waktu untuk seluruh file. Nextcloud terus-menerus melakukan operasi tulis untuk file lock, baris aktivitas, entri cache, dan status job. Satu desktop client yang menyinkronkan pohon direktori juga dapat mengirim banyak request secara paralel. Dalam pola tersebut, Anda akan mendapatkan SQLSTATE[HY000]: General error: 5 database is locked dan HTTP 500. Kegagalan ini muncul tepat ketika instance mulai benar-benar digunakan.
Konversi di kemudian hari dapat dilakukan dengan occ db:convert-type, tetapi prosesnya panjang dan bersifat all-or-nothing pada dataset yang sedang aktif. Gunakan Postgres atau MariaDB sejak awal.
File Compose
Simpan ini di /srv/nextcloud/compose.yaml, dengan secret di file .env yang berada dalam direktori yang sama dan memiliki mode 600.
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:Kunci tag mayor dan periksa tag yang saat ini tersedia di Docker Hub sebelum menyalin 31 secara utuh. latest dapat membawa Anda melewati batas mayor pada docker compose pull mendatang, dan Nextcloud tidak mendukungnya.
Direktori data adalah bind mount, bukan volume bernama, dengan sengaja: path yang dapat langsung digunakan oleh alat pencadangan lebih penting daripada kerapian. Buat direktori tersebut dengan UID image www-data dan permission yang diwajibkan Nextcloud:
sudo mkdir -p /srv/nextcloud/data
sudo chown -R 33:33 /srv/nextcloud/data
sudo chmod 0770 /srv/nextcloud/dataPerhatikan publish port: 127.0.0.1:8080:80. Docker memublikasikan port dengan menulis aturan DNAT yang dievaluasi sebelum paket mencapai chain INPUT milik ufw. 8080:80 tanpa tambahan apa pun akan menempatkan Nextcloud tanpa enkripsi di Internet publik, apa pun konfigurasi ufw. Binding ke loopback membuatnya tidak dapat diakses melalui interface publik. Dengan demikian, firewall hanya perlu mengizinkan proxy. Jika Anda tidak ingin membiarkan SSH terbuka untuk seluruh Internet, mengakses VPS melalui VPN WireGuard yang di-host sendiri memungkinkan Anda menghapus port 22 sepenuhnya dari aturan publik:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enableJalankan dengan docker compose up -d, lalu monitor docker compose logs -f app. Pada boot pertama, seluruh application tree disalin ke volume dan installer dijalankan. Container tidak akan merespons sampai proses tersebut selesai.
TLS dan reverse proxy
Instal nginx dan certbot dari repositori distro, buat server block port 80 biasa dengan server_name yang benar, lalu biarkan certbot menulis ulang konfigurasinya. Mekanisme challenge HTTP-01, timer pembaruan, dan mode kegagalan dibahas lengkap dalam menerbitkan sertifikat Let's Encrypt dengan certbot dan nginx di Ubuntu 24.04:
sudo apt install nginx certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.comCertbot menambahkan baris ssl_certificate serta pengalihan :80 → :443, lalu memasang systemd timer untuk memperbarui sertifikat yang berlaku selama 90 hari. Pastikan timer tersebut ada dengan systemctl list-timers | grep certbot. Timer pembaruan yang tidak pernah diaktifkan menjadi batas waktu 90 hari sebelum sertifikat kedaluwarsa.
Blok proxy itu sendiri:
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;
}
}Pada nginx 1.25 dan versi yang lebih baru, tambahkan http2 on;. Ubuntu 24.04 menggunakan build yang lebih lama, yang padanannya adalah listen 443 ssl http2;. nginx -t akan memberi tahu Anda mana yang didukung oleh build tersebut.
client_max_body_size dan timeout pembacaan yang panjang mencegah upload besar terputus di tengah proses. proxy_request_buffering off meneruskan upload secara langsung, bukan menyimpan seluruh file sementara di disk proxy terlebih dahulu.
nginx pada host merupakan pilihan paling sederhana yang berfungsi untuk satu aplikasi. Jika Nextcloud akan berbagi VPS dengan container lain, menjalankan Traefik sebagai reverse proxy Docker Compose untuk beberapa aplikasi memindahkan routing dan penerbitan sertifikat ke dalam label container. Kekhawatiran yang sama terkait client_max_body_size dan timeout akan muncul kembali sebagai pengaturan middleware dan transport di sana.
trusted_proxies dan overwriteprotocol
Di sinilah sebagian besar instance Nextcloud yang di-host sendiri mengalami masalah, dan gejalanya tampak tidak berkaitan dengan penyebabnya.
X-Forwarded-Proto: https hanya digunakan jika permintaan datang dari alamat yang tercantum dalam trusted_proxies. Jika tidak digunakan, Nextcloud menganggap permintaan tersebut sebagai HTTP biasa dan menghasilkan URL http://; proxy mengalihkan URL tersebut ke HTTPS; browser mengikuti pengalihan itu; lalu Nextcloud kembali menghasilkan http://. Inilah loop pengalihan. OVERWRITEPROTOCOL: https menetapkan skema secara permanen.
Perangkap dalam TRUSTED_PROXIES adalah alamat yang dilihat Nextcloud bukan 127.0.0.1. nginx berjalan pada host dan terhubung ke port yang dipublikasikan, sehingga container melihat gateway bridge Docker, yaitu sesuatu dalam 172.x. Cari subnet yang sebenarnya:
docker network inspect nextcloud_default \
-f '{{range .IPAM.Config}}{{.Subnet}}{{end}}'Masukkan CIDR tersebut (atau 172.16.0.0/12 yang mencakupnya) ke dalam TRUSTED_PROXIES. Jika nilainya terlalu luas, klien mana pun dapat memalsukan X-Forwarded-For; jika nilainya salah, setiap login akan tampak berasal dari alamat gateway, perlindungan terhadap brute-force akan memblokir seluruh instance Anda sekaligus, dan ringkasan admin akan menampilkan "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy."
OVERWRITECLIURL penting bagi container cron, yang tidak memiliki permintaan masuk untuk menentukan hostname. Tanpa pengaturan ini, job latar belakang akan menghasilkan tautan ke localhost dan notifikasi email akan mengirimkan URL yang tidak dapat digunakan.
Pekerjaan latar belakang: cron, bukan AJAX
Job runner default Nextcloud adalah AJAX: pekerjaan dijalankan sebagai efek samping ketika seseorang memuat halaman. Tidak ada yang menjelajah pada pukul 04:00, sehingga kedaluwarsa trash, pembersihan version, preview, dan percobaan ulang federated terhenti. Gejala pertama adalah direktori data yang terus bertambah. Service cron di atas menjalankan loop resmi /cron.sh pada volume yang sama. Beri tahu Nextcloud untuk menggunakannya:
docker compose exec -u www-data app php occ background:cronSetiap perintah occ mengikuti pola tersebut: docker compose exec -u www-data app php occ <command>. Sebaiknya buat alias untuknya.
Backup: tiga hal, atau tidak sama sekali
Backup yang hanya mencakup filesystem akan memulihkan instance yang rusak. Direktori data menyimpan byte; Postgres menyimpan cache file, share, pengguna, dan status aplikasi; config.php menyimpan kredensial database, ID instance, dan salt kata sandi. Jika file dipulihkan tanpa database, Nextcloud tidak dapat melihatnya. Jika database dipulihkan tanpa config.php, database tidak dapat dibuka. Jika database lama dipulihkan ke direktori data yang lebih baru, Anda akan mendapatkan share yang menunjuk ke file yang sudah berpindah.
Backup ketiganya dari instance yang dihentikan sementara:
#!/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/Maintenance mode memastikan dump dan penyalinan file memiliki kondisi yang konsisten. Jika dilewati, pada akhirnya Anda akan mengambil database yang merujuk ke file yang belum selesai disalin oleh rsync. Perhatikan bahwa skrip menyimpan dump database dengan timestamp, tetapi hanya menyimpan satu mirror bergulir untuk direktori data. rsync --delete menimpanya pada setiap proses, sehingga hanya dump terbaru yang sesuai dengan salinan file.
Selanjutnya, salin backup ke luar server. Backup yang berada di VPS yang sama dengan data yang dicadangkannya hanyalah salinan, bukan backup. restic ke object storage atau host kedua biasanya merupakan solusi yang tepat, dan deduplikasinya menangani direktori data jauh lebih baik daripada tarball setiap malam. Konfigurasi lengkap, mulai dari inisialisasi repository hingga timer malam dan latihan pemulihan, tersedia di backup VPS ke luar server dengan restic.
Pemulihan bukan sekadar membalikkan proses backup. Stack yang baru dijalankan akan menjalankan installer dan menulis config.php baru, ID instance baru, serta salt kata sandi baru. Mengimpor dump ke identitas baru tersebut akan menyebabkan session dan token share rusak. Pulihkan identitas lama terlebih dahulu, dengan urutan berikut:
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 menyelaraskan cache file dengan kondisi yang benar-benar ada di disk. Latih prosedur ini sekali pada VPS cadangan sebelum Anda membutuhkannya. Pemisahan yang sama antara byte di disk dan metadata di Postgres berlaku pada aplikasi lain dengan struktur seperti ini. Karena itu, backup Immich yang hanya mencadangkan library tanpa database akan dipulihkan sebagai timeline kosong.
Upgrade: satu versi mayor setiap kali
Nextcloud hanya mendukung upgrade satu versi mayor setiap kali. Langsung berpindah dari 29 ke 31 tidak akan gagal secara tertangani. Proses tersebut gagal dengan Exception: Updates between multiple major versions and downgrades are unsupported. dan membuat Anda berada dalam maintenance mode.
Proses upgrade Docker adalah: buat backup, ubah tag dari 31 menjadi 32 pada service app dan cron, lalu jalankan docker compose pull && docker compose up -d, kemudian docker compose logs -f app. Entry point image mendeteksi kode yang lebih baru dibandingkan data yang ada, lalu menjalankan occ upgrade secara otomatis. Jangan menginterupsi proses tersebut. Setelah log tidak lagi menampilkan aktivitas, jalankan docker compose exec -u www-data app php occ status dan periksa versionstring serta pastikan aplikasi kembali berstatus enabled.
Dua aturan ini membantu mencegah masalah: naikkan satu versi mayor, lakukan verifikasi, lalu naikkan versi berikutnya. Jangan pernah mengubah tag pada service app tanpa mengubah cron agar sama. Dua versi Nextcloud yang berbeda terhadap satu database dapat menyebabkan korupsi data.
Error yang akan benar-benar Anda lihat
"Your data directory is readable by other users. Please change the permissions to 0770." Direktori yang di-bind-mount memiliki bit baca untuk grup atau semua pengguna. sudo chmod 0770 /srv/nextcloud/data dan sudo chown -R 33:33 /srv/nextcloud/data.
"Your data directory is invalid. Ensure there is a file called .ocdata in the root." Bind mount mengarah ke lokasi yang belum pernah diinisialisasi oleh Nextcloud, path berisi kesalahan ketik, atau direktori kosong baru tertukar dengan direktori yang digunakan instance. Periksa apakah path pada host sesuai dengan baris volume.
"Access through untrusted domain." Hostname dalam request tidak tercantum dalam trusted_domains. NEXTCLOUD_TRUSTED_DOMAINS hanya berlaku saat instalasi pertama; setelah itu, atur nilainya secara langsung: occ config:system:set trusted_domains 1 --value=cloud.example.com.
502 Bad Gateway, dengan connect() failed (111: Connection refused) while connecting to upstream di /var/log/nginx/error.log. nginx tidak menemukan apa pun pada 127.0.0.1:8080. Container mungkin masih melakukan inisialisasi (periksa docker compose logs app), telah berhenti (docker compose ps), atau baris publish tidak sesuai dengan port proxy_pass. Konfirmasikan dengan ss -ltnp | grep 8080.
Loop redirect, atau peringatan "insecure" pada ringkasan admin. OVERWRITEPROTOCOL: https belum diatur, atau TRUSTED_PROXIES tidak berisi subnet gateway Docker. Lihat bagian proxy di atas.
LockedException: "files/..." is locked. Jika REDIS_HOST diatur, image mengonfigurasi Redis sebagai backend penguncian sehingga lock yang tersisa jarang terjadi. Tanpa pengaturan tersebut, lock disimpan dalam tabel database oc_file_locks, dan request yang dihentikan di tengah penulisan akan meninggalkan baris. Pastikan Redis benar-benar digunakan; occ config:system:get memcache.locking seharusnya mengembalikan class Redis, sebelum Anda menghapus baris lock secara manual.
"The PHP memory limit is below the recommended value of 512MB." Naikkan PHP_MEMORY_LIMIT lalu buat ulang container. Ingat dampaknya terhadap batas maksimum pada kondisi terburuk.
Hal yang gagal pada skala besar
Batas pertama terjadi ketika direktori data melebihi kapasitas volume. Memperbesar volume pada VPS memerlukan resize dan perluasan filesystem. Proses ini jauh lebih mudah jika dijadwalkan sebelum volume terisi 100%. Aktifkan alert penggunaan disk sekarang, bukan nanti.
Batas kedua adalah oc_filecache. Pencantuman file dan pemindaian sinkronisasi melambat seiring bertambahnya jumlah baris. Solusinya adalah menangani database: gunakan storage cepat untuk Postgres, sediakan shared memory yang memadai, lalu hapus trash dan version menggunakan pengaturan retention, bukan membiarkannya menumpuk tanpa batas.
Batas ketiga adalah proses pembuatan preview yang berebut sumber daya dengan proses lain. Pada server kecil, batasi provider preview dan jangan pernah menjalankan occ preview:generate-all selama jam kerja. Jika sebagian besar data yang Anda simpan berasal dari camera roll ponsel, proses pembuatan thumbnail tersebut sebaiknya dijalankan pada photo server khusus. Perbandingan PhotoPrism dan Immich berdasarkan RAM, aplikasi ponsel, serta perintah backup membahas biaya masing-masing jika digunakan bersama server Nextcloud.
Setelah itu, jawaban yang realistis adalah bahwa layanan tambahan sebaiknya menggunakan mesin sendiri. Collabora dan full-text search merupakan service resident terpisah dengan kebutuhan memory masing-masing. Menempatkannya pada server yang juga menyimpan satu-satunya salinan file Anda memperbesar failure domain tanpa manfaat yang sepadan. Jika pengeditan dokumen melalui browser adalah fitur tambahan yang Anda perlukan, batas minimum RAM vendor dan batas koneksi yang membedakan OnlyOffice dari Collabora menentukan apakah VPS 2 hingga 4 GB dapat menjalankannya. Pindahkan penyimpanan file ke primary storage yang kompatibel dengan S3 ketika volume tidak lagi sesuai dengan kebutuhan. Namun, perlu diketahui bahwa langkah ini membuat backup lebih sulit, bukan lebih mudah: database tetap menyimpan metadata, dan database tersebut harus di-dump bersamaan dengan bucket.
Setelah instance melayani pengguna nyata, tempatkan Uptime Kuma di depannya agar Anda mengetahui downtime sebelum sync client mengetahuinya. Private cloud cocok dipadukan dengan mail server milik Anda sendiri. Jika Anda tidak ingin menghubungkan service secara manual, Cloudron, CasaOS, dan Coolify membandingkan platform yang dapat melakukannya untuk Anda. Jika self-hosted search engine menjadi layanan berikutnya dalam daftar tersebut, bersiaplah menghadapi jenis masalah yang berbeda dari masalah di atas: error 429 pada SearXNG disebabkan oleh rate limiter miliknya sendiri atau oleh upstream engine yang memblokir IP VPS Anda. Log adalah satu-satunya cara untuk mengetahui penyebabnya.
FAQ
Apakah saya dapat menjalankan Nextcloud dengan SQLite, bukan Postgres?
Anda dapat melakukannya, dan image resmi mengizinkannya. Namun, satu client sinkronisasi desktop yang mengirimkan permintaan secara paralel akan mengalami SQLSTATE[HY000]: General error: 5 database is locked dan HTTP 500. SQLite menerapkan write lock pada seluruh database, sedangkan Nextcloud terus-menerus menulis data, seperti file lock, baris aktivitas, dan status job. Mulailah dengan Postgres atau MariaDB. occ db:convert-type tersedia, tetapi prosesnya merupakan migrasi panjang yang harus selesai seluruhnya pada data aktif.
Berapa RAM yang sebenarnya dibutuhkan VPS Nextcloud?
Tentukan kapasitas berdasarkan konkurensi, bukan jumlah pengguna. Penggunaan memori resident dalam kondisi terburuk kira-kira sama dengan jumlah permintaan simultan dikalikan PHP_MEMORY_LIMIT, ditambah shared buffer Postgres, satu backend untuk setiap koneksi, serta lonjakan penggunaan memori akibat pembuatan preview. Server dengan RAM 2 GB dapat menjalankan instance rumah tangga kecil jika pembuatan preview dibatasi dan swap ditambahkan. Jika Anda menambahkan Collabora atau pencarian full-text, Anda perlu menyediakan kapasitas untuk sekumpulan service resident tambahan.
Mengapa upload berukuran besar gagal melalui reverse proxy nginx?
Biasanya, dua pengaturan pada proxy menjadi penyebabnya. client_max_body_size yang masih menggunakan nilai default 1 MB akan memotong request, sedangkan nilai proxy_read_timeout / proxy_send_timeout yang terlalu kecil akan menghentikan transfer panjang di tengah jalan. Atur keduanya dengan nilai yang cukup besar, ubah proxy_request_buffering off agar melakukan streaming, bukan spool, dan naikkan PHP_UPLOAD_LIMIT pada container aplikasi agar sesuai.
Mengapa Nextcloud melakukan redirect dalam loop atau menampilkan peringatan tentang reverse proxy?
Container tidak melihat nginx pada 127.0.0.1. Container melihat gateway bridge Docker, di suatu alamat dalam 172.x. Jika alamat tersebut tidak dicantumkan dalam TRUSTED_PROXIES, header X-Forwarded-Proto: https akan diabaikan. Nextcloud kemudian menghasilkan URL http://, dan proxy mengarahkan URL tersebut kembali. Atur TRUSTED_PROXIES ke subnet bridge yang sebenarnya dan tetapkan OVERWRITEPROTOCOL: https.
Apakah saya dapat meng-upgrade Nextcloud langsung dari 29 ke 31?
Tidak. Nextcloud mendukung satu versi mayor untuk setiap upgrade. Jika versi dilewati, proses akan berhenti dengan Updates between multiple major versions and downgrades are unsupported. dan instance tetap berada dalam maintenance mode. Buat cadangan, naikkan tag satu versi mayor pada service app dan cron, jalankan docker compose pull && docker compose up -d, verifikasi dengan occ status, lalu ulangi proses tersebut.