Cara Pasang Nextcloud di VPS Menggunakan Docker Compose
Ketahui cara memasang Nextcloud pada VPS dengan Docker Compose, Postgres, dan Redis. Panduan ini merangkumi konfigurasi TLS, langkah sandaran data, serta proses naik taraf.
Apa yang sebenarnya anda bina
Panduan ini menjalankan Nextcloud pada VPS menggunakan Docker Compose, meletakkan TLS Let's Encrypt di hadapannya, serta menyediakan sandaran yang benar-benar boleh dipulihkan. Terdapat empat kontena dan satu proksi: imej rasmi nextcloud yang mendengar pada loopback, Postgres yang menyimpan setiap metadata fail, Redis yang memegang kunci fail, salinan kedua imej Nextcloud yang hanya menjalankan gelung cron, dan nginx pada hos yang menamatkan TLS di hadapan kesemuanya. Pemasangan itu sendiri mengambil masa dua puluh minit, dan itu bukanlah bahagian yang paling penting. Dua keputusan yang dibuat dalam jam pertama menentukan sama ada fail anda masih ada dalam tempoh setahun: pangkalan data sebenar dan bukannya SQLite, serta sandaran yang menangkap direktori data, pangkalan data dan config.php sebagai satu set yang konsisten.
Ini mengandaikan Ubuntu 24.04 LTS atau Debian 13, Docker Engine dengan pemalam Compose v2 yang dipasang daripada repositori Docker sendiri, dan rekod DNS A (tambah AAAA jika anda mempunyai IPv6) yang sudah menghalakan cloud.example.com ke VPS tersebut. Kesemuanya memerlukan pelayan yang anda kawal; tiada cara untuk melakukan penamatan TLS dan dump pangkalan data pada SaaS pihak lain.
Saiz: apa yang sebenarnya menggunakan memori
Penggunaan memori Nextcloud didominasi oleh tiga perkara, dan tiada satu pun daripadanya ialah "Nextcloud" itu sendiri.
Pekerja PHP. Imej -apache melayani setiap permintaan serentak daripada proses pekerja yang memegang penterjemah PHP. Setiap pekerja mungkin berkembang sehingga PHP_MEMORY_LIMIT sebelum PHP menamatkan permintaan tersebut. Memori residen kes terburuk anda adalah lebih kurang permintaan serentak × had memori, dan klien penyegerakan desktop membuka beberapa sambungan selari bagi setiap pengguna. Keserentakan, bukan bilangan pengguna, yang menetapkan had maksimum.
Pangkalan data. Postgres melakukan fork pada backend bagi setiap sambungan dan mengekalkan penimbal kongsi (shared buffers) dalam memori. Set kerjanya berskala mengikut bilangan fail, bukan bilangan bait: oc_filecache membawa satu baris bagi setiap fail bagi setiap pengguna. Seratus ribu fail kecil adalah beban pangkalan data yang lebih berat berbanding seratus fail besar.
Penjanaan pratonton. Menjana imej kecil (thumbnail) menyahkod imej sumber ke dalam memori pada resolusi penuh. Pratonton video menggunakan ffmpeg. Menjalankan occ preview:generate-all melakukan lonjakan tersebut berulang kali, berturut-turut, dan merupakan cara paling lazim yang menyebabkan VPS kecil ditamatkan oleh OOM killer.
Redis secara perbandingannya adalah murah. Apa-apa sahaja yang anda tambah kemudian, seperti Collabora, carian teks penuh, pengimbas antivirus, adalah servis residen berasingan dengan jejak memorinya sendiri, dan perlu dimasukkan ke dalam pelan saiz anda sebelum anda mengaktifkannya.
Tuas kawalan, jika anda kekurangan RAM: rendahkan PHP_MEMORY_LIMIT, hadkan preview_max_x / preview_max_y / preview_max_filesize_image, kecilkan enabledPreviewProviders kepada format yang anda benar-benar layari, dan tetapkan trashbin_retention_obligation serta versions_retention_obligation supaya direktori data tidak berkembang secara senyap sehingga beberapa kali ganda saiz fail anda. Tambahkan fail swap. Swap adalah perlahan, tetapi OOM kill semasa naik taraf adalah lebih buruk.
Mengapa SQLite gagal
Nextcloud menyertakan sokongan SQLite dan imej rasmi akan menggunakannya secara lalai. Jangan lakukan ini. SQLite melakukan penulisan secara bersiri dengan kunci (lock) pada keseluruhan pangkalan data: hanya satu proses penulisan dibenarkan pada satu masa untuk keseluruhan fail. Nextcloud sentiasa melakukan penulisan seperti kunci fail, baris aktiviti, entri cache, status tugasan, dan satu klien desktop yang menyegerakkan direktori akan mengeluarkan banyak permintaan selari. Di bawah corak tersebut, anda akan mendapat SQLSTATE[HY000]: General error: 5 database is locked dan ralat HTTP 500, dan kegagalan ini muncul tepat apabila instans tersebut mula digunakan secara aktif.
Penukaran kepada pangkalan data lain boleh dilakukan kemudian menggunakan occ db:convert-type, tetapi ia merupakan migrasi yang panjang dan bersifat "semua atau tiada" (all-or-nothing) pada set data yang sedang berjalan. Mulakan dengan Postgres atau MariaDB.
Fail Compose
Letakkan ini di dalam /srv/nextcloud/compose.yaml, dengan rahsia dalam fail .env sepadan pada mod 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:Tetapkan tag major dan semak versi semasa di Docker Hub sebelum anda menyalin 31 secara verbatim. latest akan menyebabkan anda melintasi sempadan major pada docker compose pull masa hadapan, dan Nextcloud tidak menyokong perkara tersebut.
Direktori data adalah bind mount, bukan named volume, atas tujuan tertentu: laluan yang boleh diakses terus oleh alat sandaran adalah lebih berharga daripada kekemasan. Ciptakannya dengan UID www-data milik imej tersebut dan keizinan yang diperlukan oleh Nextcloud:
sudo mkdir -p /srv/nextcloud/data
sudo chown -R 33:33 /srv/nextcloud/data
sudo chmod 0770 /srv/nextcloud/dataPerhatikan penerbitan port: 127.0.0.1:8080:80. Docker menerbitkan port dengan menulis peraturan DNAT yang dinilai sebelum rantaian INPUT pada ufw melihat paket tersebut; 8080:80 kosong akan meletakkan Nextcloud yang tidak disulitkan di internet awam tanpa mengira apa yang ditetapkan oleh ufw. Melakukan binding kepada loopback akan menghalangnya daripada antaramuka awam. Kemudian, firewall hanya perlu membenarkan proksi, dan jika anda tidak mahu membiarkan SSH terbuka kepada seluruh internet, mencapai VPS melalui WireGuard VPN yang dihoskan sendiri membolehkan anda membuang port 22 daripada peraturan awam sepenuhnya:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enableJalankan dengan docker compose up -d, kemudian pantau docker compose logs -f app. But pertama akan menyalin keseluruhan pepohon aplikasi ke dalam volume dan menjalankan pemasang; kontena tidak akan memberi respons sehingga proses tersebut selesai.
TLS dan reverse proxy
Pasang nginx dan certbot daripada repositori pengedaran, cipta blok pelayan port-80 biasa dengan server_name yang betul, kemudian biarkan certbot menulis semula blok tersebut. Mekanisme cabaran HTTP-01, pemasa pembaharuan dan mod kegagalan diterangkan sepenuhnya dalam mengeluarkan sijil Let's Encrypt dengan certbot dan nginx pada Ubuntu 24.04:
sudo apt install nginx certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.comCertbot menambah baris ssl_certificate serta redirect :80 → :443, dan memasang pemasa systemd yang memperbaharui sijil 90 hari tersebut. Sahkan kewujudannya dengan systemctl list-timers | grep certbot; pemasa pembaharuan yang tidak diaktifkan merupakan bom jangka 90 hari.
Blok proksi 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 lebih baharu, tambah http2 on;. Ubuntu 24.04 membekalkan binaan yang lebih lama di mana setaranya ialah listen 443 ssl http2;. nginx -t akan memberitahu anda binaan mana yang diterima oleh sistem anda.
client_max_body_size dan had masa bacaan (read timeouts) yang panjang adalah perkara yang menghalang muat naik bersaiz besar daripada terputus di tengah jalan. proxy_request_buffering off menstrim muat naik secara terus dan bukannya menyimpan keseluruhan fail ke cakera proksi terlebih dahulu.
nginx pada hos adalah penyelesaian paling ringkas yang berfungsi untuk satu aplikasi. Jika Nextcloud akan berkongsi VPS dengan kontena lain, menjalankan Traefik sebagai reverse proxy Docker Compose untuk berbilang aplikasi memindahkan penghalaan dan pengeluaran sijil ke dalam label kontena, dan kebimbangan yang sama mengenai client_max_body_size serta had masa akan muncul semula di sana sebagai tetapan middleware dan pengangkutan.
trusted_proxies dan overwriteprotocol
Di sinilah kebanyakan pemasangan Nextcloud yang dihoskan sendiri sering mengalami kesilapan, dan simptom yang muncul kelihatan tidak berkaitan dengan punca sebenar.
X-Forwarded-Proto: https hanya dihormati apabila permintaan tiba daripada alamat yang disenaraikan dalam trusted_proxies. Apabila ia tidak dihormati, Nextcloud menganggap permintaan tersebut sebagai HTTP biasa dan mengeluarkan URL http://; proksi mengalihkan permintaan tersebut ke HTTPS; pelayar mengikutinya; Nextcloud mengeluarkan http:// sekali lagi. Inilah gelung pengalihan (redirect loop). OVERWRITEPROTOCOL: https menetapkan skema secara tetap tanpa mengira keadaan.
Perangkap dalam TRUSTED_PROXIES ialah alamat yang dilihat oleh Nextcloud bukan 127.0.0.1. nginx berjalan pada hos dan bersambung ke port yang diterbitkan, jadi kontena melihat gateway jambatan Docker, iaitu sesuatu dalam 172.x. Cari subnet sebenar:
docker network inspect nextcloud_default \
-f '{{range .IPAM.Config}}{{.Subnet}}{{end}}'Masukkan CIDR tersebut (atau 172.16.0.0/12 yang merangkumi) ke dalam TRUSTED_PROXIES. Jika ditetapkan terlalu luas, mana-mana klien boleh memalsukan X-Forwarded-For; jika ditetapkan dengan salah, setiap log masuk akan kelihatan datang daripada alamat gateway, perlindungan brute-force akan menyekat keseluruhan instans anda sekaligus, dan gambaran keseluruhan pentadbir akan memaparkan "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy."
OVERWRITECLIURL penting untuk kontena cron, yang tidak mempunyai permintaan masuk untuk menentukan nama hos. Tanpanya, kerja latar belakang akan menjana pautan ke localhost dan pemberitahuan e-mel akan menghantar URL yang tidak boleh digunakan.
Tugas latar belakang: cron, bukan AJAX
Pelari tugas lalai Nextcloud ialah AJAX: tugas dilaksanakan sebagai kesan sampingan apabila seseorang memuatkan halaman. Tiada sesiapa melayari pada jam 04:00, jadi tamat tempoh sampah, pembersihan versi, pratonton dan percubaan semula bersekutu terhenti, dan simptom pertama ialah direktori data yang tidak berhenti membesar. Perkhidmatan cron di atas menjalankan gelung /cron.sh rasmi terhadap volum yang sama. Beritahu Nextcloud untuk menjangkakannya:
docker compose exec -u www-data app php occ background:cronSetiap arahan occ mengikut bentuk tersebut: docker compose exec -u www-data app php occ <command>. Ia berbaloi untuk dijadikan alias.
Sandaran: tiga perkara, atau tiada langsung
Sandaran sistem fail sahaja akan memulihkan kepada tika yang rosak. Direktori data menyimpan bait; Postgres menyimpan cache fail, perkongsian, pengguna, dan status aplikasi; config.php menyimpan kelayakan pangkalan data, ID tika dan salt kata laluan. Pulihkan fail tanpa pangkalan data dan Nextcloud tidak dapat melihatnya. Pulihkan pangkalan data tanpa config.php dan ia tidak dapat membuka pangkalan data tersebut. Memulihkan pangkalan data lama ke direktori data yang lebih baharu akan menyebabkan perkongsian menghala ke fail yang telah dialihkan.
Sandarkan ketiga-tiganya, daripada tika yang telah dihentikan sementara (quiesced):
#!/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/Mod penyelenggaraan (maintenance mode) memastikan dump dan salinan fail selari antara satu sama lain. Abaikan mod ini dan anda akhirnya akan menangkap pangkalan data yang merujuk kepada fail yang belum dicapai oleh rsync. Ambil perhatian bahawa skrip ini menyimpan dump pangkalan data bertanda masa tetapi hanya satu cermin bergolek (rolling mirror) untuk direktori data, rsync --delete akan menulis ganti setiap kali dijalankan, jadi hanya dump terbaharu yang sepadan dengan salinan fail.
Kemudian, pindahkan sandaran keluar dari pelayan tersebut. Sandaran yang berada pada VPS yang sama dengan data asal hanyalah satu salinan, bukan sandaran. restic ke storan objek atau hos kedua adalah penyelesaian biasa, dan penyahduplikasiannya mengendalikan direktori data dengan jauh lebih baik berbanding tarball harian. Persediaan penuh, daripada inisialisasi repositori hingga pemasa harian dan latihan pemulihan, terdapat dalam sandaran VPS luar pelayan dengan restic.
Pemulihan bukan sekadar proses songsang. Stack yang baru dimulakan akan menjalankan pemasang dan menulis config.php yang baharu, ID tika dan salt kata laluan yang baharu, dan mengimport dump ke atas identiti baharu itu akan menyebabkan sesi dan token perkongsian rosak. Kembalikan identiti lama dahulu, mengikut urutan ini:
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 fail dengan apa yang sebenarnya ada pada cakera. Latih proses ini sekali, pada VPS simpanan, sebelum anda benar-benar memerlukannya. Pemisahan yang sama antara bait pada cakera dan metadata dalam Postgres mengawal setiap aplikasi lain yang seumpamanya, itulah sebabnya sandaran Immich yang menangkap pustaka tetapi bukan pangkalan data akan dipulihkan kepada garis masa yang kosong.
Naik taraf: satu versi utama pada satu masa
Nextcloud hanya menyokong naik taraf tepat satu versi utama pada satu masa. Melompat dari 29 ke 31 tidak akan gagal dengan lancar, ia akan gagal dengan Exception: Updates between multiple major versions and downgrades are unsupported. dan membiarkan anda dalam mod penyelenggaraan (maintenance mode).
Proses naik taraf Docker adalah: buat sandaran (backup), edit tag daripada 31 kepada 32 dalam kedua-dua perkhidmatan app dan cron, kemudian jalankan docker compose pull && docker compose up -d, diikuti dengan docker compose logs -f app. Entrypoint imej akan mengesan kod yang lebih baharu berbanding data sedia ada dan menjalankan occ upgrade secara automatik. Jangan ganggu proses ini. Apabila log menjadi senyap, jalankan docker compose exec -u www-data app php occ status dan semak versionstring serta pastikan aplikasi telah diaktifkan semula.
Dua peraturan yang menyelamatkan anda: naikkan satu versi utama, sahkan, kemudian naikkan versi seterusnya. Dan jangan sesekali edit tag pada perkhidmatan app tanpa mengedit cron supaya sepadan; dua versi Nextcloud yang berbeza terhadap satu pangkalan data adalah laluan kepada kerosakan data.
Ralat yang akan anda temui
"Your data directory is readable by other users. Please change the permissions to 0770." Direktori yang dipasang melalui bind mempunyai bit baca untuk kumpulan atau dunia. 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 menghala ke lokasi yang tidak pernah dimulakan oleh Nextcloud, terdapat kesilapan taip pada laluan, atau direktori kosong baharu telah ditukar di bawah instans yang sedang berjalan. Pastikan laluan hos sepadan dengan baris volum.
"Access through untrusted domain." Nama hos dalam permintaan tiada dalam trusted_domains. NEXTCLOUD_TRUSTED_DOMAINS hanya terpakai semasa pemasangan pertama; selepas itu, tetapkan 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 dalam /var/log/nginx/error.log. nginx tidak dapat mencapai apa-apa pada 127.0.0.1:8080. Sama ada kontena masih dalam proses permulaan (semak docker compose logs app), ia telah keluar (docker compose ps), atau baris publish tidak sepadan dengan port proxy_pass. Sahkan dengan ss -ltnp | grep 8080.
Gelung ubah hala (redirect loop), atau amaran "insecure" dalam gambaran keseluruhan pentadbir. OVERWRITEPROTOCOL: https tiada, atau TRUSTED_PROXIES tidak mengandungi subnet get laluan Docker. Lihat bahagian proksi di atas.
LockedException: "files/..." is locked. Dengan REDIS_HOST ditetapkan, imej mengkonfigurasi Redis sebagai backend penguncian dan kunci basi jarang berlaku. Tanpanya, kunci kekal dalam jadual pangkalan data oc_file_locks dan permintaan yang terhenti di tengah-tengah penulisan akan meninggalkan baris data. Sahkan bahawa Redis benar-benar digunakan, occ config:system:get memcache.locking sepatutnya memulangkan kelas Redis, sebelum anda memadam baris kunci secara manual.
"The PHP memory limit is below the recommended value of 512MB." Tingkatkan PHP_MEMORY_LIMIT dan cipta semula kontena tersebut. Ingat kesan tindakan ini terhadap had maksimum penggunaan memori anda.
Perkara yang tergendala pada skala besar
Halangan pertama ialah direktori data yang melebihi kapasiti storan. Membesarkan volum pada VPS melibatkan proses ubah saiz dan pengembangan sistem fail. Proses ini jauh lebih mudah jika dijadualkan berbanding apabila storan sudah 100% penuh. Tetapkan amaran penggunaan cakera sekarang, bukan kemudian.
Halangan kedua ialah oc_filecache. Penyenaraian fail dan imbasan penyelarasan menjadi perlahan apabila bilangan baris meningkat. Penyelesaiannya melibatkan kerja pangkalan data: pastikan Postgres berada pada storan pantas, benarkan ia menggunakan memori kongsi yang mencukupi, serta bersihkan data sampah dan versi lama menggunakan tetapan pengekalan (retention) dan bukannya membiarkan ia terkumpul selama-lamanya.
Halangan ketiga ialah penjanaan pratonton yang bersaing dengan proses lain. Pada pelayan kecil, hadkan penyedia pratonton dan jangan sesekali menjalankan occ preview:generate-all semasa waktu bekerja. Jika koleksi gambar telefon merupakan sebahagian besar daripada data yang disimpan, kerja penjanaan lakaran kenit (thumbnail) tersebut sepatutnya dilakukan pada pelayan foto khusus. Artikel perbandingan PhotoPrism dan Immich dari segi RAM, aplikasi telefon dan arahan sandaran merangkumi kos penggunaan kedua-dua perisian tersebut berbanding Nextcloud.
Selain itu, hakikatnya ialah perkhidmatan tambahan memerlukan pelayan sendiri. Collabora dan carian teks penuh (full-text search) adalah perkhidmatan residen berasingan dengan profil memori tersendiri. Meletakkannya pada pelayan yang sama dengan satu-satunya salinan fail anda hanya akan meluaskan domain kegagalan tanpa sebarang faedah. Jika penyuntingan dokumen dalam pelayar adalah ciri yang anda perlukan, had RAM dan had sambungan yang membezakan OnlyOffice dengan Collabora menentukan perisian mana yang mampu ditampung oleh VPS bersaiz 2 hingga 4 GB. Pindahkan storan fail ke storan utama yang serasi dengan S3 apabila volum tidak lagi sesuai, dan ambil perhatian bahawa ini menjadikan sandaran lebih sukar, bukan lebih mudah: pangkalan data masih menyimpan metadata, dan ia mesti disandarkan serentak dengan bucket tersebut.
Apabila instans sudah melayani pengguna sebenar, letakkan Uptime Kuma di hadapannya supaya anda mengetahui tentang waktu henti (downtime) sebelum klien penyelarasan menyedarinya. Awan peribadi sangat serasi dengan pelayan e-mel anda sendiri. Jika anda tidak mahu menyambungkan perkhidmatan secara manual, Cloudron, CasaOS dan Coolify membandingkan platform yang menguruskan perkara tersebut untuk anda. Jika enjin carian yang dihoskan sendiri adalah perkara seterusnya dalam senarai anda, jangkakan masalah yang berbeza daripada yang dinyatakan di atas: ralat 429 pada SearXNG berpunca sama ada daripada pengehad kadar (rate limiter) miliknya sendiri atau enjin hulu (upstream) yang menyekat IP VPS anda, dan hanya log yang dapat memberitahu puncanya.
FAQ
Bolehkah saya menjalankan Nextcloud menggunakan SQLite dan bukannya Postgres?
Boleh, dan imej rasmi membenarkannya, tetapi klien penyelarasan desktop tunggal yang menghantar permintaan selari akan menyebabkan SQLSTATE[HY000]: General error: 5 database is locked dan ralat HTTP 500. SQLite menggunakan kunci tulis (write lock) untuk keseluruhan pangkalan data, manakala Nextcloud sentiasa menulis data, kunci fail, baris aktiviti dan status tugasan. Mulakan dengan Postgres atau MariaDB; occ db:convert-type memang wujud tetapi ia merupakan migrasi yang panjang dan berisiko tinggi terhadap data yang sedang digunakan.
Berapakah jumlah RAM yang sebenarnya diperlukan oleh VPS Nextcloud?
Tentukan saiz berdasarkan konkurensi, bukan jumlah pengguna. Memori residen bagi senario terburuk adalah kira-kira jumlah permintaan serentak didarab dengan PHP_MEMORY_LIMIT, ditambah dengan buffer kongsi Postgres dan satu backend bagi setiap sambungan, serta lonjakan penggunaan semasa penjanaan pratonton. Pelayan 2 GB boleh menjalankan instans isi rumah kecil jika anda mengehadkan pratonton dan menambah swap; jika anda menambah Collabora atau carian teks penuh, anda perlu memperuntukkan saiz tambahan untuk set servis residen kedua.
Mengapa muat naik fail besar gagal di sebalik reverse proxy nginx?
Dua tetapan pada proxy biasanya menjadi punca: client_max_body_size yang dibiarkan pada nilai lalai 1 MB akan memotong permintaan, dan nilai proxy_read_timeout / proxy_send_timeout yang singkat akan menamatkan pemindahan fail yang panjang di tengah jalan. Tetapkan kedua-duanya dengan nilai yang mencukupi, tukar proxy_request_buffering off kepada stream dan bukannya spool, serta tingkatkan PHP_UPLOAD_LIMIT pada kontena aplikasi supaya sepadan.
Mengapa Nextcloud mengalami gelung ubah hala (redirect loop) atau memberi amaran tentang reverse proxy?
Kontena tidak melihat nginx pada 127.0.0.1, ia melihat gateway bridge Docker, yang berada di dalam 172.x. Apabila alamat tersebut tiada dalam TRUSTED_PROXIES, header X-Forwarded-Proto: https diabaikan, Nextcloud mengeluarkan URL http://, dan proxy menghantarnya semula. Tetapkan TRUSTED_PROXIES kepada subnet bridge yang sebenar dan tetapkan OVERWRITEPROTOCOL: https.
Bolehkah saya menaik taraf Nextcloud daripada versi 29 terus ke 31?
Tidak. Nextcloud hanya menyokong satu versi utama bagi setiap naik taraf, dan melangkau versi akan menyebabkan Updates between multiple major versions and downgrades are unsupported., yang membiarkan instans dalam mod penyelenggaraan. Lakukan sandaran, naikkan tag satu versi utama pada kedua-dua servis app dan cron, jalankan docker compose pull && docker compose up -d, sahkan dengan occ status, kemudian ulangi proses tersebut.