Удельта

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

14. Выполните итоговые проверки

Запустите встроенные проверки 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

Разворачиваем не демонстрационный сервер, а управляемый рабочий контур с понятной архитектурой, безопасным доступом и планом восстановления.