Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

Nextcloud na VPS — instalacja z Nginx, PHP-FPM i PostgreSQL

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS

Nextcloud to self-hosted alternatywa dla Google Drive i Dropbox — własna chmura plików z synchronizacją na wszystkich urządzeniach, kalendarzem, kontaktami, edytorem dokumentów online i dziesiątkami aplikacji rozszerzających funkcjonalność. Uruchomienie Nextcloud na własnym VPS daje pełną kontrolę nad danymi, zgodność z RODO i brak limitów przestrzeni poza dyskiem serwera. Ten artykuł pokazuje kompletną instalację produkcyjną z Nginx, PHP-FPM 8.2, PostgreSQL i Redis cache.

Krok 1 — Wymagania wstępne i instalacja zależności

# Ubuntu 22.04 / 24.04
# Aktualizacja systemu
sudo apt update && sudo apt upgrade -y

# PHP 8.2 z wymaganymi rozszerzeniami
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.2-fpm php8.2-gd php8.2-mysql php8.2-pgsql php8.2-curl \
  php8.2-mbstring php8.2-intl php8.2-bcmath php8.2-gmp php8.2-xml \
  php8.2-zip php8.2-bz2 php8.2-redis php8.2-imagick php8.2-apcu \
  php8.2-ldap php8.2-exif php8.2-smbclient php8.2-ffmpeg -y

# Nginx
sudo apt install nginx -y

# PostgreSQL
sudo apt install postgresql postgresql-contrib -y

# Redis
sudo apt install redis-server -y

# Narzędzia
sudo apt install unzip curl wget -y

Krok 2 — Baza danych PostgreSQL

# Wejdz do psql jako postgres
sudo -u postgres psql

-- Utwórz uzytkownika i baze danych
CREATE USER nextcloud WITH PASSWORD 'StrongNCPassword123';
CREATE DATABASE nextcloud OWNER nextcloud ENCODING 'UTF8'
  LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0;
GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
\q

# Sprawdz polaczenie
psql -U nextcloud -h localhost -d nextcloud -c "SELECT version();"

Krok 3 — Pobranie i instalacja Nextcloud

# Pobierz najnowszy Nextcloud (sprawdz aktualna wersje na nextcloud.com)
NC_VERSION="29.0.1"
cd /tmp
wget https://download.nextcloud.com/server/releases/nextcloud-${NC_VERSION}.zip
wget https://download.nextcloud.com/server/releases/nextcloud-${NC_VERSION}.zip.sha256

# Weryfikacja integralnosci
sha256sum -c nextcloud-${NC_VERSION}.zip.sha256

# Wypakuj do /var/www
unzip nextcloud-${NC_VERSION}.zip
sudo mv nextcloud /var/www/

# Utwórz katalog na dane uzytkowników (najlepiej poza webroot)
sudo mkdir -p /mnt/nextcloud-data
sudo chown -R www-data:www-data /var/www/nextcloud /mnt/nextcloud-data
sudo chmod 750 /mnt/nextcloud-data

Krok 4 — Konfiguracja PHP-FPM

# /etc/php/8.2/fpm/pool.d/nextcloud.conf
[nextcloud]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm-nextcloud.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500

# Zmienne srodowiskowe dla PHP
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
# /etc/php/8.2/fpm/conf.d/99-nextcloud.ini
memory_limit = 512M
upload_max_filesize = 16G
post_max_size = 16G
max_execution_time = 3600
max_input_time = 3600
default_charset = UTF-8
output_buffering = Off

; OPcache — kluczowe dla wydajnosci
opcache.enable = 1
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 256
opcache.revalidate_freq = 1
opcache.save_comments = 1

sudo systemctl restart php8.2-fpm

Krok 5 — Konfiguracja Nginx

# /etc/nginx/sites-available/nextcloud

upstream php-handler {
    server unix:/run/php/php8.2-fpm-nextcloud.sock;
}

map $arg_v $asset_immutable {
    ""        "";
    default   ", immutable";
}

server {
    listen 80;
    server_name cloud.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name cloud.example.com;

    ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

    root /var/www/nextcloud;
    index index.php index.html;

    client_max_body_size 16G;
    client_body_timeout 3600s;
    fastcgi_read_timeout 3600s;

    # Nagłówki bezpieczenstwa
    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Permitted-Cross-Domain-Policies none always;
    add_header X-Robots-Tag "noindex, nofollow" always;
    add_header Referrer-Policy "no-referrer" always;

    # Blokuj dostepu do wrazliwych plikow
    location ~ /\. { deny all; }
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { deny all; }
    location ~ ^/(?:autotest|occ|issue|indie|db_|console)\.php { deny all; }

    # CalDAV / CardDAV redirect
    location = /.well-known/carddav {
        return 301 https://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 https://$host/remote.php/dav;
    }

    location / {
        rewrite ^ /index.php;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        include fastcgi_params;
        fastcgi_pass php-handler;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463$asset_immutable";
        access_log off;
    }

    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;
        access_log off;
    }

    location /remote {
        return 301 /remote.php$request_uri;
    }

    location ~* \.(?:env|log)$ { deny all; }
}
# Aktywacja i test
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Krok 6 — Instalacja przez occ CLI (zalecane)

# Instalacja Nextcloud przez CLI (alternatywa dla kreatora web)
sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
  --database="pgsql" \
  --database-name="nextcloud" \
  --database-user="nextcloud" \
  --database-pass="StrongNCPassword123" \
  --database-host="localhost" \
  --admin-user="admin" \
  --admin-pass="AdminPassword789" \
  --data-dir="/mnt/nextcloud-data"

# Dodaj domenę do trusted_domains
sudo -u www-data php /var/www/nextcloud/occ config:system:set \
  trusted_domains 1 --value="cloud.example.com"

# Sprawdz status instalacji
sudo -u www-data php /var/www/nextcloud/occ status

Krok 7 — Redis cache i locking

Redis drastycznie poprawia wydajność Nextcloud — szczególnie przy wielu równoczesnych połączeniach. Edytuj /var/www/nextcloud/config/config.php:

<?php
// Dodaj do tablicy $CONFIG (przed zamykajacym );)

// Redis cache
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => [
  'host' => 'localhost',
  'port' => 6379,
  'timeout' => 0,
  // Opcjonalnie: haslo Redisa jesli skonfigurowane
  // 'password' => 'redis-password',
  // Opcjonalnie: Unix socket (szybszy niz TCP na localhost)
  // 'host' => '/var/run/redis/redis.sock',
  // 'port' => 0,
],

// Wydajnosc — przepisywanie assetow
'htaccess.RewriteBase' => '/',

// Strefa czasowa
'default_phone_region' => 'PL',

// Ukryj wersje Nextcloud w naglowkach
'version' => '29.0.1',

Krok 8 — Cron background jobs

# Ustaw cron (zalecany) zamiast domyslnego AJAX
sudo -u www-data php /var/www/nextcloud/occ background:cron

# Dodaj do crontaba www-data
sudo -u www-data crontab -e
# Wklej:
# */5 * * * * php -f /var/www/nextcloud/cron.php

# Lub przez systemd timer (nowocześniejsze podejście)
sudo tee /etc/systemd/system/nextcloud-cron.service <<'EOF'
[Unit]
Description=Nextcloud cron.php job

[Service]
User=www-data
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
EOF

sudo tee /etc/systemd/system/nextcloud-cron.timer <<'EOF'
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
Requires=nextcloud-cron.service

[Timer]
Unit=nextcloud-cron.service
OnBootSec=5min
OnUnitActiveSec=5min

[Install]
WantedBy=timers.target
EOF

sudo systemctl enable --now nextcloud-cron.timer
sudo systemctl status nextcloud-cron.timer

Aplikacje — Collabora, Calendar, Contacts

# Instalacja aplikacji przez occ
sudo -u www-data php /var/www/nextcloud/occ app:install calendar
sudo -u www-data php /var/www/nextcloud/occ app:install contacts
sudo -u www-data php /var/www/nextcloud/occ app:install tasks
sudo -u www-data php /var/www/nextcloud/occ app:install deck
sudo -u www-data php /var/www/nextcloud/occ app:install notes

# Collabora Online (edytor dokumentow) — wymaga osobnego kontenera
docker pull collabora/code
docker run -d -p 127.0.0.1:9980:9980 \
  -e "domain=cloud\\.example\\.com" \
  -e "DONT_GEN_SSL_CERT=YES" \
  --name collabora \
  --restart always \
  collabora/code

# Po instalacji skonfiguruj w Nextcloud:
# Ustawienia → Collabora Online → wpisz https://cloud.example.com:9980

# Lista zainstalowanych aplikacji
sudo -u www-data php /var/www/nextcloud/occ app:list

# Aktualizacja aplikacji
sudo -u www-data php /var/www/nextcloud/occ app:update --all

Przydatne komendy occ

Komenda Działanie
occ files:scan --all Skan i indeksowanie wszystkich plików
occ upgrade Aktualizacja Nextcloud (po podmianie plików)
occ maintenance:mode --on Włącz tryb maintenance (przed aktualizacją)
occ maintenance:repair Naprawa niespójności bazy i plików
occ db:add-missing-indices Dodaj brakujące indeksy DB (po upgrade)
occ user:add --password-from-env username Dodaj użytkownika przez CLI
occ config:system:get trusted_domains Sprawdź dozwolone domeny
occ log:tail Podgląd logów Nextcloud w czasie rzeczywistym

Najczęstsze problemy i rozwiązania

  • Strona wolna, lagi przy dużych plikach — sprawdź czy Redis jest aktywny (occ config:system:get memcache.local), zwiększ pm.max_children w PHP-FPM pool i dodaj fastcgi_request_buffering off.
  • 413 Request Entity Too Large — zwiększ client_max_body_size w Nginx i upload_max_filesize / post_max_size w PHP.
  • Pliki nie widoczne po wgraniu przez FTP/SSH — uruchom occ files:scan --all. Nextcloud nie wykrywa plików dodanych poza jego UI.
  • Błąd "Twoje środowisko uruchomieniowe ma naruszone integralności kodu" — uruchom occ integrity:check-core i occ maintenance:repair.
  • CalDAV/CardDAV nie działa w klientach — sprawdź redirect /.well-known/carddav i /.well-known/caldav w Nginx.

Najczęstsze pytania

Jakie są minimalne wymagania sprzętowe dla Nextcloud na VPS? +
Minimalne wymagania dla Nextcloud dla 1-10 użytkowników: 2 CPU, 2 GB RAM, 20 GB dysk na system (dane trzymaj osobno). Dla 10-50 użytkowników: 4 CPU, 4 GB RAM, SSD. Dla większych instalacji warto rozważyć osobny serwer bazy danych. Nextcloud intensywnie korzysta z PHP opcache i Redis — bez nich wydajność spada drastycznie. Dysk dla plików użytkowników powinien być osobnym wolumenem (łatwiejsza rozbudowa).
Nextcloud z PostgreSQL czy MySQL/MariaDB? +
Obie bazy działają dobrze. PostgreSQL jest oficjalnie rekomendowany przez Nextcloud team i ma lepszą obsługę JSONB (używaną w niektórych aplikacjach). MariaDB jest popularniejsza w dokumentacji społeczności i łatwiejsza w konfiguracji dla początkujących. Jeśli już masz PostgreSQL na serwerze — użyj go. SQLite obsługuje Nextcloud tylko dla instalacji testowych/jednoosobowych.
Jak skonfigurować Redis cache w Nextcloud? +
Redis w Nextcloud pełni dwie role: (1) memcache.local i memcache.distributed — cache metadanych plików, sesji, zapytań DB. (2) Locking backend zamiast domyślnych locków w bazie danych (szybszy przy wielu równoległych żądaniach). Konfiguracja w config.php: dodaj memcache.local = OC\Memcache\Redis, memcache.distributed = OC\Memcache\Redis, memcache.locking = OC\Memcache\Redis oraz blok redis z host i port. Wymagana jest rozszerzenie PHP php-redis.
Czym jest occ w Nextcloud i do czego służy? +
occ (ownCloud Console) to CLI Nextcloud — odpowiednik wp-cli dla WordPressa. Używasz go do: instalacji i aktualizacji aplikacji (occ app:install, occ upgrade), skanowania plików (occ files:scan --all), zarządzania użytkownikami, konfiguracji bez UI (occ config:system:set), naprawy instalacji (occ maintenance:repair), trybu maintenance (occ maintenance:mode --on/off). Zawsze uruchamiaj jako www-data: sudo -u www-data php occ.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.