Полная пошаговая инструкция по развёртыванию production-ready облачного хранилища. Включает все нюансы Ubuntu 26, исправление типичных предупреждений и тонкую настройку сервера.
Nginx + Let’s Encrypt + MariaDB 11.8 + PHP 8.5-FPM + Redis + APCu + TOTP 2FA + Cron
- Требования
- Обновление системы
- Установка MariaDB
- Ответы при настройке безопасности
- Создание базы данных
- Установка PHP 8.5
- Параметры PHP
- OPcache и переменные окружения
- Поддержка SVG в Imagick
- Nginx и файрвол
- Скачивание Nextcloud
- SSL-сертификат Let’s Encrypt
- Конфигурация Nginx
- Установка Nextcloud через CLI
- Настройка системных параметров
- Cron для фоновых задач
- Миграция MIME-типов
- Проверка установки
- Redis и кэширование
- Двухфакторная аутентификация
- Устранение типичных проблем
- Сервер не может подключиться к себе (JavaScript .mjs, шрифты .otf)
- Файлы .mjs обслуживаются без MIME-типа JavaScript
- Разрешение /ocm-provider/ и /ocs-provider/ (404 или 403)
- /.well-known/webfinger не работает
- PHP getenv(«PATH») возвращает пустой результат
- OPcache: буфер встроенных строк почти заполнен
- Imagick не поддерживает SVG
- Окно обслуживания не настроено
- Предупреждение: не найдена папка бэкапов обновлятора
- Сервис развертывания AppAPI не установлен
- ID сервера конфигурации не настроен
- Параметры SMTP не заданы
- Проверка curl изнутри сервера
- ✓ Установка завершена
Требования
Перед началом убедитесь, что выполнены следующие условия:
- Сервер с 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 authentication | n |
| Change the root password | y — задайте надёжный пароль |
| Remove anonymous users | y |
| Disallow root login remotely | y |
| Remove test database | y |
| Reload privilege tables | y |
Создание базы данных
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








