Sari la conținut
servervps.roPanou client

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
  1. 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.

  2. 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)
  3. 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:
  4. 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
    }
  5. 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
  6. 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
  7. 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.