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
Letakkan konfigurasi ini di /srv/nextcloud/compose.yaml, dengan secret di file .env yang berada pada 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: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:Tetapkan tag major dan periksa tag yang tersedia saat ini di Docker Hub sebelum menyalin 35 secara verbatim. Per 21 October 2026, Nextcloud memelihara versi 33, 34, dan 35. Version 31 mencapai akhir masa dukungan pada February 2026 dan version 32 pada September 2026. Karena itu, tag yang disalin dari panduan lama akan memasang release yang tidak lagi menerima perbaikan. latest akan membawa Anda melewati batas major pada docker compose pull mendatang, dan Nextcloud tidak mendukung tindakan tersebut.
Direktori data sengaja menggunakan bind mount, bukan named volume. Path yang dapat langsung digunakan oleh tool backup lebih penting daripada kerapian konfigurasi. 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 port publish: 127.0.0.1:8080:80. Docker memublikasikan port dengan menulis aturan DNAT yang dievaluasi sebelum paket mencapai chain INPUT milik ufw. Nilai 8080:80 tanpa konfigurasi lain akan menempatkan Nextcloud tanpa enkripsi di Internet publik, apa pun konfigurasi ufw. Binding ke loopback mencegah akses 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 sesuai, lalu biarkan certbot menulis ulang konfigurasinya. Mekanisme HTTP-01 challenge, renewal timer, dan kondisi kegagalannya 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 redirect :80 → :443, lalu memasang systemd timer untuk memperbarui sertifikat yang berlaku selama 90 hari. Pastikan timer tersebut ada dengan systemctl list-timers | grep certbot. Renewal timer yang tidak pernah diaktifkan akan menjadi batas waktu 90 hari yang tidak dapat diperpanjang.
Konfigurasi 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.1 dan versi yang lebih baru, tambahkan http2 on;. Directive tersebut tidak tersedia di 1.25.0, dan nginx tidak akan start jika menemukannya di sana. Ubuntu 24.04 menyediakan build yang lebih lama, dengan padanan listen 443 ssl http2;. nginx -t akan menunjukkan directive mana yang diterima oleh build Anda.
Jika client_max_body_size terlalu kecil, nginx langsung menolak upload besar dengan error 413. Jika read timeout terlalu singkat, upload terhenti di tengah proses. Nilai di atas mencegah kedua masalah tersebut. proxy_request_buffering off meneruskan upload secara streaming, bukan menyimpan seluruh file terlebih dahulu pada disk proxy.
nginx pada host adalah 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 di sana sebagai pengaturan middleware dan transport.
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 mendukung upgrade tepat satu versi mayor setiap kali. Dengan image Docker resmi, lompatan dari 29 ke 31 tidak pernah mencapai proses upgrade. Entrypoint membandingkan versi mayor sebelum menjalankan occ upgrade, mencetak Can't start Nextcloud because upgrading from <installed version> to <image version> is not supported. diikuti It is only possible to upgrade one major version at a time., lalu keluar. Container menolak untuk start (dengan restart: unless-stopped, container terus melakukan restart dan mencetak baris yang sama), maintenance mode tidak pernah diaktifkan, serta data dan database tetap tidak berubah. Ubah tag ke versi mayor berikutnya, lalu start kembali.
Proses upgrade Docker adalah: buat backup, edit tag naik satu versi mayor pada service app dan cron (dari 35 ke 36 setelah 36 dirilis, yang direncanakan Nextcloud pada Februari 2027), lalu jalankan docker compose pull && docker compose up -d, kemudian docker compose logs -f app. Entrypoint image mendeteksi kode yang lebih baru terhadap data yang ada dan menjalankan occ upgrade secara otomatis. Jangan menghentikannya. Setelah log tidak lagi menampilkan pesan, jalankan docker compose exec -u www-data app php occ status, lalu periksa versionstring dan pastikan aplikasi kembali aktif.
Dua aturan yang membantu: naikkan satu versi mayor, lakukan verifikasi, lalu naikkan versi berikutnya. Jangan pernah mengedit tag pada service app tanpa menyesuaikan cron, karena dua versi Nextcloud yang berbeda terhadap satu database dapat menyebabkan korupsi.
Error yang benar-benar akan Anda lihat
"Direktori data Anda dapat dibaca oleh pengguna lain. Ubah permission menjadi 0770 agar direktori tidak dapat dicantumkan oleh pengguna lain." Digit terakhir pada mode direktori, yaitu digit untuk pengguna lain, bukan 0. Bit read, write, atau execute apa pun untuk pengguna lain akan memicu error ini. Bit group tidak pernah diperiksa karena 0770 sendiri memberikan akses penuh kepada group. Nextcloud terlebih dahulu mencoba chmod 0770 secara internal dan hanya menampilkan peringatan jika upaya tersebut gagal. Pada bind mount, hal ini biasanya berarti direktori tidak dimiliki oleh UID 33. sudo chown -R 33:33 /srv/nextcloud/data dan sudo chmod 0770 /srv/nextcloud/data.
"Direktori data Anda tidak valid. Pastikan ada file bernama ".ncdata" di root direktori data." Bind mount mengarah ke lokasi yang belum pernah diinisialisasi oleh Nextcloud, path berisi typo, atau direktori kosong baru tertukar pada instance yang sedang berjalan. Periksa apakah host path sesuai dengan baris volume.
"Akses melalui domain yang tidak tepercaya." Hostname dalam request tidak tercantum di trusted_domains. NEXTCLOUD_TRUSTED_DOMAINS hanya berlaku saat instalasi pertama. Setelah itu, ubah nilainya secara langsung dengan 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), sudah 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 ikhtisar admin. OVERWRITEPROTOCOL: https belum dikonfigurasi, atau TRUSTED_PROXIES tidak mencakup subnet gateway Docker. Lihat bagian proxy di atas.
LockedException: "files/..." is locked. Jika REDIS_HOST dikonfigurasi, image menggunakan Redis sebagai backend locking dan stale lock jarang terjadi. Tanpa konfigurasi tersebut, lock disimpan dalam tabel database oc_file_locks, dan request yang dihentikan saat proses write dapat meninggalkan baris. Pastikan Redis benar-benar digunakan. occ config:system:get memcache.locking seharusnya mengembalikan class Redis sebelum Anda menghapus baris lock secara manual.
"Batas memori PHP berada di bawah nilai rekomendasi 512 MB." Tingkatkan 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
Dapatkah saya menjalankan Nextcloud pada SQLite, bukan Postgres?
Bisa. Image resmi mengizinkannya. Namun, satu klien sinkronisasi desktop yang mengirimkan request secara paralel akan mengalami SQLSTATE[HY000]: General error: 5 database is locked dan HTTP 500. SQLite menggunakan write lock pada seluruh database, sedangkan Nextcloud terus-menerus menulis data, termasuk file lock, baris aktivitas, dan status job. Gunakan Postgres atau MariaDB sejak awal. occ db:convert-type tersedia, tetapi migrasi pada data aktif ini panjang dan harus diselesaikan seluruhnya.
Berapa banyak RAM yang sebenarnya dibutuhkan VPS Nextcloud?
Tentukan kapasitas berdasarkan konkurensi, bukan jumlah pengguna. Penggunaan memori resident dalam kondisi terburuk kira-kira merupakan jumlah request bersamaan dikalikan PHP_MEMORY_LIMIT, ditambah shared buffer Postgres, satu backend untuk setiap koneksi, serta lonjakan penggunaan akibat pembuatan preview. Server dengan RAM 2 GB dapat menjalankan instance untuk rumah tangga kecil jika pembuatan preview dibatasi dan swap ditambahkan. Jika Collabora atau pencarian full-text ditambahkan, Anda perlu menghitung kebutuhan memori resident untuk layanan tambahan tersebut.
Mengapa upload besar gagal di belakang reverse proxy nginx?
Biasanya, dua pengaturan pada proxy menjadi penyebabnya. Jika client_max_body_size dibiarkan pada nilai default 1 MB, nginx langsung menolak request yang lebih besar dengan error 413 (Request Entity Too Large). Error ini muncul di error log nginx, bukan sebagai file yang hanya terunggah sebagian. Nilai proxy_read_timeout / proxy_send_timeout yang terlalu singkat menghentikan transfer panjang di tengah proses. Tetapkan keduanya dengan nilai yang cukup besar, ubah proxy_request_buffering off agar melakukan streaming, bukan menyimpan data sementara, lalu naikkan PHP_UPLOAD_LIMIT pada container aplikasi agar sesuai.
Mengapa Nextcloud melakukan redirect berulang atau menampilkan peringatan tentang reverse proxy?
Container tidak melihat nginx pada 127.0.0.1. Container melihat gateway bridge Docker, biasanya pada 172.x. Jika alamat tersebut tidak dicantumkan dalam TRUSTED_PROXIES, header X-Forwarded-Proto: https diabaikan. Nextcloud kemudian menghasilkan URL http://, dan proxy mengarahkannya kembali. Tetapkan TRUSTED_PROXIES ke subnet bridge yang sebenarnya dan tetapkan OVERWRITEPROTOCOL: https secara eksplisit.
Dapatkah saya meng-upgrade Nextcloud langsung dari 29 ke 31?
Tidak. Nextcloud mendukung satu versi mayor untuk setiap upgrade. Pada image Docker resmi, entrypoint memeriksa versi mayor sebelum menjalankan occ upgrade, menampilkan It is only possible to upgrade one major version at a time., lalu keluar. Akibatnya, container tidak start dan data serta database tetap seperti sebelumnya. Tetapkan tag ke 30. Buat backup, 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.