Ghid · 40 de minute · Debian · Ubuntu
Nextcloud pe VPS, cu Postgres și Redis
Nextcloud instalat din imaginea implicită merge. Nextcloud instalat ca la carte merge și după ce ajungi la câteva zeci de mii de fișiere. Diferența stă în patru decizii luate la început: baza de date, cache-ul, felul în care rulează sarcinile de fundal și limitele PHP.
Ai nevoie de
- Un VPS securizat, cu porturile 80 și 443 deschise
- Un domeniu cu înregistrare A către IP-ul serverului
- Docker și Docker Compose instalate
- Spațiu pe disc cât ai de stocat, plus marjă: Nextcloud păstrează și versiuni, și coș de gunoi
- 01
Alege baza de date înainte, nu după
SQLite e implicit și e potrivit doar pentru încercat. La mai mulți utilizatori sau la sincronizare din mai multe dispozitive, scrierile concurente devin problema principală, iar migrarea ulterioară către Postgres e o operațiune pe care nu vrei s-o faci cu date reale înăuntru.
Postgres de la început. Costă zero efort în plus acum.
- 02
Scrie configurația
Trei parole, generate, nu inventate. Fișierul rămâne pe server, cu permisiuni restrânse.
.env DOMENIU=cloud.domeniul-tau.ro POSTGRES_PASSWORD=$(openssl rand -base64 24) NEXTCLOUD_ADMIN_USER=admin NEXTCLOUD_ADMIN_PASSWORD=$(openssl rand -base64 24) - 03
Compune serviciile
Redis nu e opțional în practică. Nextcloud îl folosește pentru blocarea tranzacțională a fișierelor; fără el, sincronizarea din mai multe dispozitive produce conflicte și mesaje despre fișiere blocate.
NEXTCLOUD_TRUSTED_DOMAINS trebuie să conțină domeniul real. Dacă lipsește, primești ecranul „Access through untrusted domain" și nimic altceva.
docker-compose.yml services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: nextcloud POSTGRES_USER: nextcloud POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: [db:/var/lib/postgresql/data] healthcheck: test: ["CMD-SHELL", "pg_isready -U nextcloud"] interval: 10s retries: 5 redis: image: redis:alpine restart: unless-stopped command: redis-server --save "" --appendonly no app: image: nextcloud:apache restart: unless-stopped environment: POSTGRES_HOST: db POSTGRES_DB: nextcloud POSTGRES_USER: nextcloud POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} REDIS_HOST: redis NEXTCLOUD_ADMIN_USER: ${NEXTCLOUD_ADMIN_USER} NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD} NEXTCLOUD_TRUSTED_DOMAINS: ${DOMENIU} OVERWRITEPROTOCOL: https PHP_MEMORY_LIMIT: 1G PHP_UPLOAD_LIMIT: 10G volumes: [nc:/var/www/html] depends_on: db: {condition: service_healthy} # Sarcinile de fundal rulează din container separat, nu din interfață. cron: image: nextcloud:apache restart: unless-stopped entrypoint: /cron.sh volumes: [nc:/var/www/html] depends_on: db: {condition: service_healthy} caddy: image: caddy:alpine restart: unless-stopped ports: ["80:80", "443:443"] volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy:/data depends_on: [app] volumes: db: nc: caddy: - 04
Configurează reverse proxy-ul, cu redirecturile cerute de Nextcloud
Nextcloud cere două redirecturi pentru descoperirea CalDAV și CardDAV. Fără ele, verificarea de configurare din interfață îți arată avertismente, iar unele clienți de calendar nu se conectează.
Caddyfile {$DOMENIU} { redir /.well-known/carddav /remote.php/dav 301 redir /.well-known/caldav /remote.php/dav 301 reverse_proxy app:80 } - 05
Pornește și treci sarcinile de fundal pe cron
Implicit, Nextcloud rulează sarcinile de fundal prin AJAX, adică doar când cineva are pagina deschisă. Curățarea coșului, previzualizările și indexarea rămân în urmă și se adună.
Containerul cron din configurația de mai sus rulează sarcinile la fiecare cinci minute. Trebuie doar să-i spui lui Nextcloud să folosească cron.
docker compose up -d docker compose logs -f app # așteaptă terminarea instalării # comenzile occ se rulează ca utilizatorul www-data docker compose exec -u www-data app php occ background:cron docker compose exec -u www-data app php occ config:system:get memcache.locking - 06
Verifică ce-ți spune Nextcloud despre el însuși
Pagina de administrare are o secțiune de verificări de configurare. E singura listă care contează: îți arată exact ce lipsește, de la anteturi de securitate până la indecși de bază de date care nu s-au creat.
Indecșii lipsă sunt frecvenți după actualizări și încetinesc vizibil listarea directoarelor mari.
docker compose exec -u www-data app php occ db:add-missing-indices docker compose exec -u www-data app php occ db:add-missing-columns docker compose exec -u www-data app php occ status - 07
Fă backup la toate cele trei părți
Nextcloud are trei lucruri de salvat, iar o copie care conține doar fișierele nu se poate restaura: baza de date, directorul de date și fișierul de configurare.
Pune instanța în modul de mentenanță în timpul copiei, altfel baza de date și fișierele pot ajunge desincronizate.
/usr/local/bin/backup-nextcloud.sh #!/usr/bin/env bash set -euo pipefail cd /srv/nextcloud docker compose exec -T -u www-data app php occ maintenance:mode --on trap 'docker compose exec -T -u www-data app php occ maintenance:mode --off' EXIT docker compose exec -T db pg_dump -U nextcloud nextcloud | gzip > /var/backups/nc-db-$(date +%F).sql.gz docker run --rm -v nextcloud_nc:/data -v /var/backups:/out alpine \ tar czf /out/nc-files-$(date +%F).tar.gz -C /data .AtențieFără maintenance:mode, un utilizator care încarcă un fișier în timpul copiei produce o bază de date care pomenește un fișier inexistent în arhivă. Descoperi asta la restaurare.
Întrebări frecvente
+Ce VPS îmi trebuie pentru Nextcloud?
Pentru câțiva utilizatori, 4 GB de memorie acoperă Nextcloud, Postgres, Redis și reverse proxy-ul. Resursa care se termină prima e discul, nu memoria: Nextcloud păstrează versiuni de fișiere, previzualizări și coș de gunoi, deci socotește peste dimensiunea datelor tale.
+De ce nu merge urcarea fișierelor mari?
De obicei limitele PHP. PHP_UPLOAD_LIMIT din configurație le stabilește, dar reverse proxy-ul poate avea și el o limită proprie de dimensiune a cererii. Verifică-le pe amândouă. Clienții de desktop urcă în bucăți, deci se lovesc mai rar de asta decât interfața web.
+Primesc „Access through untrusted domain".
Domeniul din adresă nu e în lista de domenii de încredere. Adaugă-l cu occ config:system:set trusted_domains 1 --value=cloud.domeniul-tau.ro sau corectează NEXTCLOUD_TRUSTED_DOMAINS și repornește.
+Merită Nextcloud AIO în loc de configurația asta?
AIO e mai simplu de pornit și își administrează singur actualizările și backup-ul, dar îți dă mai puțin control asupra reverse proxy-ului și a serviciilor din jur. Dacă vrei să pui Nextcloud lângă alte aplicații pe același server, configurația explicită de aici se integrează mai ușor.