Установка и настройка Nextcloud на Ubuntu 26 с Nginx и HTTPS

Рабочее пространство с установкой и настройкой Nextcloud на Ubuntu.

Полная пошаговая инструкция по развёртыванию production-ready облачного хранилища. Включает все нюансы Ubuntu 26, исправление типичных предупреждений и тонкую настройку сервера.

Nginx + Let’s Encrypt + MariaDB 11.8 + PHP 8.5-FPM + Redis + APCu + TOTP 2FA + Cron

Содержание
  1. Требования
  2. Обновление системы
  3. Установка MariaDB
  4. Ответы при настройке безопасности
  5. Создание базы данных
  6. Установка PHP 8.5
  7. Параметры PHP
  8. OPcache и переменные окружения
  9. Поддержка SVG в Imagick
  10. Nginx и файрвол
  11. Скачивание Nextcloud
  12. SSL-сертификат Let’s Encrypt
  13. Конфигурация Nginx
  14. Установка Nextcloud через CLI
  15. Настройка системных параметров
  16. Cron для фоновых задач
  17. Миграция MIME-типов
  18. Проверка установки
  19. Redis и кэширование
  20. Двухфакторная аутентификация
  21. Устранение типичных проблем
  22. Сервер не может подключиться к себе (JavaScript .mjs, шрифты .otf)
  23. Файлы .mjs обслуживаются без MIME-типа JavaScript
  24. Разрешение /ocm-provider/ и /ocs-provider/ (404 или 403)
  25. /.well-known/webfinger не работает
  26. PHP getenv(«PATH») возвращает пустой результат
  27. OPcache: буфер встроенных строк почти заполнен
  28. Imagick не поддерживает SVG
  29. Окно обслуживания не настроено
  30. Предупреждение: не найдена папка бэкапов обновлятора
  31. Сервис развертывания AppAPI не установлен
  32. ID сервера конфигурации не настроен
  33. Параметры SMTP не заданы
  34. Проверка curl изнутри сервера
  35. ✓ Установка завершена

Требования

Перед началом убедитесь, что выполнены следующие условия:

  • Сервер с Ubuntu 26 LTS — минимум 2 vCPU, 2 GB RAM, 20 GB диск
  • Доменное имя с A-записью, указывающей на IP сервера
  • Открытые порты: 22 (SSH), 80 (HTTP), 443 (HTTPS)
  • Root или sudo-доступ по SSH

Проверьте DNS до начала установки: dig +short ваш.домен должен вернуть IP сервера. Если DNS не распространился — Let’s Encrypt не выдаст сертификат.

Ubuntu 26 поставляется с PHP 8.5 — не пытайтесь установить PHP 8.3, его нет в репозиториях. Все команды в этом руководстве рассчитаны на PHP 8.5.

Обновление системы

Обновляем все пакеты до актуальных версий:

sudo apt update && sudo apt upgrade -y

Установка MariaDB

sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb
mariadb-secure-installation

В Ubuntu 26 утилита называется mariadb-secure-installation, а не mysql_secure_installation. При первом запросе пароля root просто нажмите Enter — пароль пустой.

Ответы при настройке безопасности

ВопросОтвет
Switch to unix_socket authenticationn
Change the root passwordy — задайте надёжный пароль
Remove anonymous usersy
Disallow root login remotelyy
Remove test databasey
Reload privilege tablesy

Создание базы данных

sudo mariadb -u root -p

CREATE DATABASE nextcloud
  CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CREATE USER 'nextcloud'@'localhost'
  IDENTIFIED BY 'НАДЁЖНЫЙ_ПАРОЛЬ';

GRANT ALL PRIVILEGES ON nextcloud.*
  TO 'nextcloud'@'localhost';

FLUSH PRIVILEGES;
EXIT;

Запишите пароль пользователя nextcloud — он потребуется при установке Nextcloud. Пароли со спецсимволами ! [ ] оборачивайте в одинарные кавычки в командной строке.

Установка PHP 8.5

sudo apt install -y php8.5-fpm php8.5-mysql php8.5-xml \
  php8.5-zip php8.5-mbstring php8.5-curl php8.5-gd \
  php8.5-intl php8.5-bcmath php8.5-gmp \
  php8.5-imagick php8.5-apcu php8.5-redis

Параметры PHP

sudo sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/8.5/fpm/php.ini
sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 16G/" /etc/php/8.5/fpm/php.ini
sudo sed -i "s/post_max_size = .*/post_max_size = 16G/" /etc/php/8.5/fpm/php.ini
sudo sed -i "s/max_execution_time = .*/max_execution_time = 360/" /etc/php/8.5/fpm/php.ini
sudo sed -i "s/;date.timezone.*/date.timezone = Europe\/Moscow/" /etc/php/8.5/fpm/php.ini

OPcache и переменные окружения

Добавляем в конец /etc/php/8.5/fpm/php.ini:

sudo bash -c 'cat >> /etc/php/8.5/fpm/php.ini' << 'EOF'

; Nextcloud OPcache
opcache.enable=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
EOF

Исправляем getenv PATH — в файле /etc/php/8.5/fpm/pool.d/www.conf:

sudo sed -i 's/^;clear_env.*/clear_env = no/' /etc/php/8.5/fpm/pool.d/www.conf
sudo systemctl restart php8.5-fpm

Поддержка SVG в Imagick

sudo apt install -y libmagickcore-7.q16-10-extra
sudo systemctl restart php8.5-fpm

В Ubuntu 26 пакет называется libmagickcore-7.q16-10-extra (не -6-). Именно он добавляет поддержку SVG в модуль imagick.

Nginx и файрвол

sudo apt install -y nginx
sudo systemctl enable --now nginx

# Открываем порты
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Скачивание Nextcloud

sudo apt install -y bzip2
cd /tmp

wget https://download.nextcloud.com/server/releases/latest.tar.bz2
wget https://download.nextcloud.com/server/releases/latest.tar.bz2.sha256
sha256sum -c latest.tar.bz2.sha256  # должно быть OK

sudo tar -xjf latest.tar.bz2 -C /var/www/
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chmod -R 750 /var/www/nextcloud

# Папка данных вне web-root
sudo mkdir -p /data/nextcloud
sudo chown -R www-data:www-data /data/nextcloud

Предупреждение latest.metadata: No such file or directory — нормально, игнорируйте. Главное чтобы строка latest.tar.bz2: OK присутствовала.

bzip2 в Ubuntu 26 не установлен по умолчанию. Без него tar -xjf завершится ошибкой.

SSL-сертификат Let’s Encrypt

Сначала создаём временный конфиг Nginx для прохождения ACME-проверки:

sudo bash -c 'cat > /etc/nginx/sites-available/nextcloud' << 'EOF'
server {
    listen 80;
    server_name ВАШ.ДОМЕН;
    root /var/www/nextcloud;
    location ~ /.well-known/acme-challenge { allow all; }
    location / { try_files $uri $uri/ /index.php; }
}
EOF

sudo ln -s /etc/nginx/sites-available/nextcloud \
           /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Получаем сертификат:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d ВАШ.ДОМЕН

Certbot автоматически создаёт systemd-таймер для обновления сертификата дважды в день. Сертификат обновляется за 30 дней до истечения без вашего участия. Проверить: systemctl status certbot.timer

Конфигурация Nginx

После получения сертификата заменяем временный конфиг на полный production-конфиг. Он учитывает все особенности Nextcloud 33, включая корректную обработку .mjs файлов, .well-known редиректы и ocm-provider.

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

server {
    listen 80;
    server_name ВАШ.ДОМЕН;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;  # директива http2 on — правильный синтаксис для Nginx 1.25+
    server_name ВАШ.ДОМЕН;

    ssl_certificate     /etc/letsencrypt/live/ВАШ.ДОМЕН/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ВАШ.ДОМЕН/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    root /var/www/nextcloud;
    index index.php index.html;
    client_max_body_size 16G;
    fastcgi_buffers 64 4K;

    # Security headers
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" 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;
    add_header X-XSS-Protection "1; mode=block" always;

    location = /robots.txt { allow all; log_not_found off; access_log off; }

    # .well-known — CalDAV, CardDAV, WebFinger, NodeInfo
    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 /index.php$request_uri; }
        location /.well-known/pki-validation    { try_files $uri /index.php$request_uri; }
        return 301 /index.php$request_uri;
    }

    # OCM и OCS провайдеры
    location ~ ^/ocm-provider { return 301 /index.php$request_uri; }
    location ~ ^/ocs-provider { try_files $uri $uri/ /index.php$request_uri; }

    location / { rewrite ^ /index.php; }

    # Запрет доступа к служебным директориям
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { deny all; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)         { deny all; }

    # PHP-обработчик
    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|oc[ms]-provider/.+)\.php(?:$|/) {
        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 off;
    }

    location ~ ^/(?:updater|oc[ms]-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    # .mjs файлы — обязательно указывать MIME-тип явно
    location ~ \.mjs$ {
        try_files $uri /index.php$request_uri;
        types { }
        default_type application/javascript;
        add_header Cache-Control "public, max-age=15778463";
        expires 6M;
        access_log off;
    }

    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        expires 6M;
        access_log off;
    }

    # Статика — включая .otf шрифты
    location ~ \.(?:png|html|ttf|otf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
        try_files $uri /index.php$request_uri;
        access_log off;
    }
}
sudo nginx -t && sudo systemctl reload nginx

В Nginx 1.25+ директива listen 443 ssl http2 устарела. Используйте listen 443 ssl + отдельную директиву http2 on; — именно так написан конфиг выше.

Установка Nextcloud через CLI

sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
  --database      "mysql"           \
  --database-host "localhost"       \
  --database-name "nextcloud"       \
  --database-user "nextcloud"       \
  --database-pass 'ПАРОЛЬ_БД'       \
  --data-dir      "/data/nextcloud" \
  --admin-user    "admin"           \
  --admin-pass    'ПАРОЛЬ_ADMIN'

Настройка системных параметров

# Доверенный домен
sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set trusted_domains 0 --value="ВАШ.ДОМЕН"

# Регион для номеров телефонов
sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set default_phone_region --value="RU"

# Окно обслуживания — 02:00 ночи
sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set maintenance_window_start --value=2 --type=integer

# Переключаем фоновые задачи на cron
sudo -u www-data php /var/www/nextcloud/occ background:cron

Cron для фоновых задач

(crontab -u www-data -l 2>/dev/null; \
  echo "*/5 * * * * php -f /var/www/nextcloud/cron.php") \
  | crontab -u www-data -

Миграция MIME-типов

sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive

Проверка установки

sudo -u www-data php /var/www/nextcloud/occ status
sudo -u www-data php /var/www/nextcloud/occ check

Если вывод содержит installed: true и команда check не выдаёт ошибок — базовая установка завершена успешно.

Redis и кэширование

sudo apt install -y redis-server
sudo systemctl enable --now redis-server
sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set memcache.local --value='\OC\Memcache\APCu'

sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set memcache.locking --value='\OC\Memcache\Redis'

sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set redis host --value='localhost'

sudo -u www-data php /var/www/nextcloud/occ \
  config:system:set redis port --value='6379' --type=integer

Двухфакторная аутентификация

sudo -u www-data php /var/www/nextcloud/occ app:install twofactor_totp
sudo -u www-data php /var/www/nextcloud/occ app:enable twofactor_totp

# Сделать 2FA обязательным для всех пользователей
sudo -u www-data php /var/www/nextcloud/occ twofactorauth:enforce --on
  • Войдите в Nextcloud → Настройки → Безопасность
  • В разделе «Двухфакторная аутентификация» выберите TOTP
  • Отсканируйте QR-код приложением: Aegis, Google Authenticator или 2FAS
  • Введите сгенерированный код для подтверждения

Сохраните резервные коды, которые покажет Nextcloud при активации TOTP. Они понадобятся если вы потеряете доступ к приложению-аутентификатору.

Устранение типичных проблем

Сервер не может подключиться к себе (JavaScript .mjs, шрифты .otf)

Сервер не резолвит собственный домен. Добавьте запись в /etc/hosts:

echo "127.0.0.1 ВАШ.ДОМЕН" | sudo tee -a /etc/hosts

Файлы .mjs обслуживаются без MIME-типа JavaScript

В конфиге Nginx добавьте отдельный блок для .mjs с default_type application/javascript

он уже включён в конфиг из шага 08.

Разрешение /ocm-provider/ и /ocs-provider/ (404 или 403)

Конфиг Nginx из шага 08 включает корректные блоки для обоих провайдеров. При 301 — это правильное поведение.

/.well-known/webfinger не работает

Блок location ^~ /.well-known в конфиге шага 08 перенаправляет все .well-known запросы на index.php.

PHP getenv(«PATH») возвращает пустой результат

sudo sed -i 's/^;clear_env.*/clear_env = no/' /etc/php/8.5/fpm/pool.d/www.conf

перезапуск php8.5-fpm

OPcache: буфер встроенных строк почти заполнен

Установите opcache.interned_strings_buffer=16 в php.ini — описано в шаге 04.

Imagick не поддерживает SVG

sudo apt install -y libmagickcore-7.q16-10-extra

 (в Ubuntu 26 именно эта версия пакета)

Окно обслуживания не настроено

Установите через occ:

config:system:set maintenance_window_start --value=2

Предупреждение: не найдена папка бэкапов обновлятора

Безобидное предупреждение — папка создаётся при первом обновлении Nextcloud. Игнорируйте.

Сервис развертывания AppAPI не установлен

Нужен только для Docker-приложений (Ex-Apps). Если Docker не используется — игнорируйте.

ID сервера конфигурации не настроен

Нужен только при нескольких PHP-серверах в кластере. Для одного сервера — игнорируйте.

Параметры SMTP не заданы

Настройте в Настройки → Администрирование → Основные настройки когда будут данные почтового сервера.

Проверка curl изнутри сервера

Если Nextcloud не может проверить собственные настройки — проверяйте так:

# Проверка статуса
curl -sk https://ВАШ.ДОМЕН/status.php

# Если пустой ответ — добавьте домен в /etc/hosts
echo "127.0.0.1 ВАШ.ДОМЕН" | sudo tee -a /etc/hosts

# Проверка ocm-provider
curl -sk https://ВАШ.ДОМЕН/ocm-provider/ | head -c 100

# Проверка webfinger
curl -sk https://ВАШ.ДОМЕН/.well-known/webfinger | head -c 100

✓ Установка завершена

  • Nextcloud 33 установлен и работает
  • Nginx с HTTP/2 и security headers
  • SSL Let’s Encrypt с автообновлением
  • MariaDB 11.8 с UTF8MB4
  • PHP 8.5-FPM с OPcache
  • Redis для кэша и блокировок
  • APCu для локального кэша
  • Cron каждые 5 минут
  • TOTP 2FA обязателен для всех
  • Imagick с поддержкой SVG
  • Данные в /data/nextcloud
  • Окно обслуживания в 02:00

Оцените статью
IT-Sierra
Добавить комментарий