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ększpm.max_childrenw PHP-FPM pool i dodajfastcgi_request_buffering off. - 413 Request Entity Too Large — zwiększ
client_max_body_sizew Nginx iupload_max_filesize/post_max_sizew 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-coreiocc maintenance:repair. - CalDAV/CardDAV nie działa w klientach — sprawdź redirect
/.well-known/carddavi/.well-known/caldavw Nginx.