instruction
Как установить Nextcloud на Ubuntu с Nginx и PostgreSQL
Пошаговая установка Nextcloud Server 35 на Ubuntu 24.04: сервер, Nginx, PostgreSQL, PHP-FPM, Redis, HTTPS, cron и проверка.
Автор
Редакция Удельты
Экспертная проверка
Техническая редакция Удельты
Проверено
22.09.2026
Версии
Nextcloud Server 35, Ubuntu 24.04 LTS; версии PHP и PostgreSQL проверяются по системным требованиям целевого maintenance-релиза.
Результат и границы
Ниже — последовательная установка Nextcloud Server 35 на новый одиночный сервер с Ubuntu 24.04 LTS, Nginx, PHP 8.3, PostgreSQL, Redis и Let's Encrypt. Команды рассчитаны на отдельный домен вида cloud.example.com и выполняются из-под обычного пользователя с правом sudo.
Сценарий подходит для небольшого рабочего контура и по умолчанию использует локальный каталог данных. Отдельный раздел показывает подключение S3 как основного хранилища к новой установке, но не проектирует кластер, отказоустойчивость или выбор провайдера. Не выполняйте инструкцию поверх действующей установки: для миграции нужен отдельный план.
1. Возьмите сервер и определите объём диска
Для старта небольшого контура используйте 4 vCPU, 8 ГБ RAM и NVMe-диск от 100 ГБ. Это не универсальная норма: диск должен вмещать текущие файлы, рост, корзину и версии. Резервная копия хранится вне этого сервера и в его полезный объём не входит.
Подойдёт VPS/VDS или собственная виртуальная машина с публичным IPv4 и чистой Ubuntu 24.04 LTS. Если сервера ещё нет, его можно выбрать, например, в конфигураторе FirstVDS. Панель управления и предустановленный Nextcloud не нужны: инструкция начинается с чистой ОС и полного доступа по SSH.
Если пользователей, приложений или одновременных загрузок много, сначала составьте профиль нагрузки, а не увеличивайте конфигурацию наугад.
2. Привяжите домен и подключитесь по SSH
Создайте DNS-запись типа A: cloud.example.com должна указывать на публичный IPv4 сервера. Для IPv6 добавляйте AAAA только тогда, когда IPv6 действительно настроен и доступен извне. Откройте TCP-порты 22, 80 и 443 в firewall провайдера.
Подключитесь к серверу и задайте значения для своей установки. Домен должен состоять только из латинских букв, цифр, точек и дефисов.
ssh ubuntu@SERVER_IP
export NC_DOMAIN='cloud.example.com'
export LE_EMAIL='admin@example.com'
export NC_ADMIN='ncadmin'
getent ahostsv4 "$NC_DOMAIN"
hostname -IАдрес в выводе getent должен совпасть с публичным IP. Если DNS ещё не обновился, не запускайте Certbot: дождитесь распространения записи.
3. Обновите ОС и включите firewall
Сначала обновите систему. Если обновилось ядро и появился файл /var/run/reboot-required, перезагрузите сервер, снова подключитесь по SSH и повторно задайте переменные из предыдущего шага.
sudo apt update
sudo apt full-upgrade -y
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw statusНе включайте UFW, пока не убедитесь, что правило OpenSSH добавлено: иначе можно потерять удалённый доступ.
4. Установите Nginx, PostgreSQL, Redis и PHP
Ubuntu 24.04 поставляет PHP 8.3, который поддерживается Nextcloud 35. Установите web-сервер, СУБД, кеш, Certbot и обязательные либо рекомендуемые PHP-модули.
sudo apt install -y \
nginx postgresql redis-server bzip2 curl ca-certificates \
certbot python3-certbot-nginx \
php8.3-fpm php8.3-cli php8.3-pgsql php8.3-curl php8.3-gd \
php8.3-mbstring php8.3-intl php8.3-gmp php8.3-xml php8.3-zip \
php8.3-bcmath php8.3-bz2 php-imagick php-apcu php-redis
sudo systemctl enable --now nginx postgresql redis-server php8.3-fpm
sudo systemctl is-active nginx postgresql redis-server php8.3-fpm
php -v
php -m | grep -Ei 'apcu|bcmath|bz2|curl|dom|fileinfo|gd|gmp|intl|mbstring|openssl|pdo_pgsql|redis|xml|zip'Все четыре проверки должны вернуть active. Если пакет с модулем не найден, не подключайте сторонний PHP-репозиторий вслепую: сначала проверьте, что установлена именно Ubuntu 24.04 и включены стандартные репозитории.
5. Настройте PHP для загрузки файлов
Создайте единый дополнительный ini-файл для FPM и CLI. Лимит 10 ГБ — пример; уменьшите его, если пользователям не нужны такие файлы. Память PHP выделяется каждому рабочему процессу, поэтому memory_limit нельзя умножать на большое число процессов без проверки RAM.
sudo tee /etc/php/8.3/mods-available/nextcloud.ini >/dev/null <<'PHPINI'
memory_limit=512M
upload_max_filesize=10G
post_max_size=10G
max_execution_time=3600
max_input_time=3600
output_buffering=0
apc.enable_cli=1
apc.shm_size=128M
opcache.enable=1
opcache.interned_strings_buffer=32
PHPINI
sudo phpenmod nextcloud
sudo systemctl restart php8.3-fpm
php --ini
php -i | grep -E 'memory_limit|upload_max_filesize|apc.enable_cli'6. Создайте роль и базу PostgreSQL
Команда createuser --pwprompt запросит пароль роли дважды и не сохранит его в истории shell. Сохраните пароль в менеджере секретов: он понадобится установщику Nextcloud. Роль не получает прав суперпользователя.
sudo -u postgres createuser --pwprompt nextcloud
sudo -u postgres createdb \
--owner=nextcloud \
--encoding=UTF8 \
--template=template0 \
nextcloud
sudo -u postgres psql -c '\du nextcloud'
sudo -u postgres psql -c '\l nextcloud'7. Скачайте и проверьте Nextcloud 35
Используйте официальный maintenance-релиз ветки 35 и его SHA-256. Команда проверки должна завершиться сообщением latest-35.tar.bz2: OK.
cd /tmp
curl -fLO https://download.nextcloud.com/server/releases/latest-35.tar.bz2
curl -fLO https://download.nextcloud.com/server/releases/latest-35.tar.bz2.sha256
sha256sum --check latest-35.tar.bz2.sha256
sudo tar -xjf latest-35.tar.bz2 -C /var/www
sudo chown -R www-data:www-data /var/www/nextcloud
sudo find /var/www/nextcloud -type d -exec chmod 750 {} \;
sudo find /var/www/nextcloud -type f -exec chmod 640 {} \;Не используйте daily-сборку или архив с постороннего сайта. При повторном запуске не распаковывайте архив поверх уже установленного Nextcloud.
8. Подготовьте отдельный каталог данных
Каталог данных располагается вне web-root. Выберите нужный диск до установки: последующий перенос требует остановки записи и отдельной проверки.
sudo install -d -o www-data -g www-data -m 750 /srv/nextcloud-data
sudo -u www-data test -w /srv/nextcloud-dataЕсли данные находятся на отдельном диске, сначала добавьте его в /etc/fstab, перезагрузите сервер и убедитесь командой findmnt /srv/nextcloud-data, что монтирование переживает reboot.
9. Настройте Nginx
Конфигурация ниже обслуживает Nextcloud в корне отдельного домена и передаёт PHP в стандартный Unix-сокет PHP 8.3. Переменная $uri принадлежит Nginx, поэтому heredoc намеренно заключён в одинарные кавычки.
sudo tee /etc/nginx/sites-available/nextcloud >/dev/null <<'NGINX'
upstream php-handler {
server unix:/run/php/php8.3-fpm.sock;
}
map $arg_v $asset_immutable {
"" "";
default ", immutable";
}
server {
listen 80;
listen [::]:80;
server_name CLOUD_DOMAIN;
root /var/www/nextcloud;
server_tokens off;
client_max_body_size 10G;
client_body_timeout 300s;
fastcgi_buffers 64 4K;
add_header Strict-Transport-Security "max-age=15552000" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "noindex, nofollow" always;
fastcgi_hide_header X-Powered-By;
index index.php index.html /index.php$request_uri;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
return 301 /index.php$request_uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
return 404;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
return 404;
}
location ~ ^/(?:composer\.(?:json|lock)|package(?:-lock)?\.json|core/shipped\.json)$ {
return 404;
}
location ~ \.php(?:$|/) {
rewrite ^/(?!index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|.+/richdocumentscode(_arm64)?/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering on;
}
location ~ \.(?:css|js|mjs|svg|gif|png|jpe?g|webp|ico|wasm|tflite|map|ogg|flac)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463$asset_immutable";
access_log off;
}
location ~ \.(?:woff2?|eot|otf|ttf)$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location /remote { return 301 /remote.php$request_uri; }
location / { try_files $uri $uri/ /index.php$request_uri; }
}
NGINX
sudo sed -i "s/CLOUD_DOMAIN/${NC_DOMAIN}/g" /etc/nginx/sites-available/nextcloud
sudo ln -sfn /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/nextcloud
sudo test ! -e /etc/nginx/sites-enabled/default || sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginxЕсли nginx -t нашёл ошибку, не выполняйте reload: исправьте указанную строку.
10. Получите TLS-сертификат
Certbot проверит домен через порт 80, добавит сертификат в конфигурацию Nginx и включит перенаправление на HTTPS.
sudo certbot --nginx \
--domain "$NC_DOMAIN" \
--email "$LE_EMAIL" \
--agree-tos \
--no-eff-email \
--redirect
sudo nginx -t
sudo systemctl reload nginx
sudo certbot renew --dry-run
curl -I "https://${NC_DOMAIN}/status.php"Не отключайте проверку сертификата ради прохождения следующего шага. Ошибки Certbot обычно означают неверный DNS, закрытый порт 80 или проксирование домена через другой сервис.
Перед шагом 11: настройте S3, если это основное хранилище
Пропустите этот раздел, если файлы будут храниться в /srv/nextcloud-data. Для S3 как основного хранилища создайте отдельный бакет, который не используется другими приложениями, и настройте его до установки и до загрузки любых файлов. Nextcloud хранит имена и структуру каталогов в PostgreSQL, а в бакете — содержимое под внутренними идентификаторами.
Создайте дополнительный конфигурационный файл:
sudoedit /var/www/nextcloud/config/objectstore.config.phpДля S3-совместимого провайдера используйте шаблон, заменив значения своими:
<?php
$CONFIG = [
'objectstore' => [
'class' => '\\OC\\Files\\ObjectStore\\S3',
'arguments' => [
'bucket' => 'nextcloud-production',
'hostname' => 's3.example.com',
'region' => 'default',
'key' => 'ACCESS_KEY',
'secret' => 'SECRET_KEY',
'port' => 443,
'use_ssl' => true,
'use_path_style' => false,
],
],
];Для Amazon S3 обычно указывают bucket, region, key и secret, а hostname не задают. Для совместимого сервиса endpoint берётся у провайдера; use_path_style включается только тогда, когда этого требует сервис. Ограничьте ключ доступом к одному бакету и не публикуйте его в репозитории или тикете.
Защитите файл и только затем выполняйте шаг 11:
sudo chown root:www-data /var/www/nextcloud/config/objectstore.config.php
sudo chmod 640 /var/www/nextcloud/config/objectstore.config.phpПосле установки проверьте итоговую конфигурацию командой sudo -E -u www-data php /var/www/nextcloud/occ config:list system --private и загрузите тестовый файл. Не добавляйте S3 как основное хранилище к действующей установке как обычную настройку: существующие локальные файлы автоматически не переносятся.
11. Выполните установку через occ
Команда интерактивно запросит пароль роли PostgreSQL и новый пароль администратора Nextcloud, поэтому секреты не появятся в shell history и списке процессов. Используйте отдельный пароль администратора, не пароль от сервера.
sudo -E -u www-data php /var/www/nextcloud/occ maintenance:install \
--database pgsql \
--database-host 127.0.0.1 \
--database-name nextcloud \
--database-user nextcloud \
--admin-user "$NC_ADMIN" \
--data-dir /srv/nextcloud-data
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set trusted_domains 1 --value="$NC_DOMAIN"
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set overwrite.cli.url --value="https://${NC_DOMAIN}"
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set default_phone_region --value=RU
sudo -E -u www-data php /var/www/nextcloud/occ statusЗначение default_phone_region замените на код своей страны, если установка предназначена не для России.
12. Подключите APCu и Redis через Unix-сокет
APCu используется как локальный кеш, Redis — как распределённый кеш и backend транзакционных блокировок. Web-пользователь получает доступ только к локальному Unix-сокету Redis.
sudo sed -i -E \
's|^#? *unixsocket .*|unixsocket /run/redis/redis-server.sock|' \
/etc/redis/redis.conf
sudo sed -i -E \
's|^#? *unixsocketperm .*|unixsocketperm 770|' \
/etc/redis/redis.conf
sudo usermod -aG redis www-data
sudo systemctl restart redis-server php8.3-fpm
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set memcache.local --value='\OC\Memcache\APCu'
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set memcache.distributed --value='\OC\Memcache\Redis'
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set memcache.locking --value='\OC\Memcache\Redis'
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set redis host --value=/run/redis/redis-server.sock
sudo -E -u www-data php /var/www/nextcloud/occ \
config:system:set redis port --type=integer --value=0
sudo -u www-data test -S /run/redis/redis-server.sock
sudo -u www-data php -r '$r=new Redis(); $r->connect("/run/redis/redis-server.sock"); echo $r->ping(), PHP_EOL;'Последняя команда должна вернуть ответ Redis. При Permission denied проверьте группу www-data, unixsocketperm и перезапуск PHP-FPM.
13. Включите системный cron
Nextcloud рекомендует запускать cron.php каждые пять минут от имени web-пользователя. Команды ниже не создают второй одинаковый cron при повторном выполнении.
sudo -E -u www-data php /var/www/nextcloud/occ background:cron
(sudo -u www-data crontab -l 2>/dev/null; \
echo '*/5 * * * * php -f /var/www/nextcloud/cron.php') \
| sort -u \
| sudo -u www-data crontab -
sudo -u www-data crontab -l
sudo -u www-data php -f /var/www/nextcloud/cron.php14. Выполните итоговые проверки
Запустите встроенные проверки Nextcloud и проверку целостности кода. Затем откройте административный раздел Overview и устраните оставшиеся предупреждения.
sudo -E -u www-data php /var/www/nextcloud/occ status
sudo -E -u www-data php /var/www/nextcloud/occ setupchecks
sudo -E -u www-data php /var/www/nextcloud/occ integrity:check-core
sudo nginx -t
sudo systemctl --failed
curl -fsS "https://${NC_DOMAIN}/status.php"После входа через браузер проверьте загрузку и скачивание файла, WebDAV либо desktop-клиент, публичную ссылку, корзину и восстановление версии. Настройте SMTP в разделе Basic settings и отправьте тестовое письмо: без рабочей почты пользователи не смогут надёжно восстанавливать доступ.
15. Настройте резервную копию до ввода пользователей
Для локального хранилища минимальный согласованный набор включает /var/www/nextcloud/config, /var/www/nextcloud/custom_apps, /srv/nextcloud-data и дамп PostgreSQL. При использовании S3 как основного хранилища вместо локального каталога в набор входит содержимое бакета, но дамп БД и конфигурация всё равно обязательны. Копия должна храниться вне рабочего контура и его учётной записи. До загрузки рабочих файлов выполните пробное восстановление по инструкции резервного копирования.
Не считайте установку завершённой только потому, что открылась форма входа. Зафиксируйте домен, версии, расположение данных, способ резервирования и порядок обновления. Мониторьте свободное место, HTTPS, PHP-FPM, PostgreSQL, Redis, cron и результат backup-задач.
Если что-то не работает
502 Bad Gateway: сравните сокет в Nginx с выводом grep '^listen =' /etc/php/8.3/fpm/pool.d/www.conf;
ошибка подключения к БД: проверьте пароль командой psql --host=127.0.0.1 --username=nextcloud --dbname=nextcloud;
Permission denied для данных: проверьте владельца командой namei -l /srv/nextcloud-data;
циклический вход или ошибка приложения: смотрите /srv/nextcloud-data/nextcloud.log, /var/log/nginx/error.log и журнал php8.3-fpm;
предупреждение о фоне: проверьте crontab пользователя www-data и время последнего запуска в административном Overview.
Перед применением на другой major-версии ещё раз сверьте системные требования Nextcloud и официальный пример Nginx.
Подходящие системы
Nextcloud для файлов и совместной работы
Платформа для хранения, синхронизации и совместного доступа к рабочим файлам в вашей инфраструктуре — с контролем пользователей и резервных копий.
Связанные услуги
Установка и настройка Nextcloud
Разворачиваем не демонстрационный сервер, а управляемый рабочий контур с понятной архитектурой, безопасным доступом и планом восстановления.