Nextcloud на Ubuntu 24.04: пошаговая установка
Установка Nextcloud на Ubuntu 24.04 занимает минут сорок, и три четверти будущих проблем закладываются именно в эти сорок минут: каталог данных внутри веб-корня, база не в той кодировке, кэша нет, cron не отработал ни разу. Ниже — сборка на nginx + PHP-FPM 8.3 + PostgreSQL 16 + Redis: команды по порядку, куски конфигов и дословные тексты ошибок там, где обычно спотыкаются.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что понадобится до первой команды
Ubuntu 24.04 (noble) удобна тем, что весь стек берётся из штатного репозитория — без PPA от Ondřej Surý и сборок из исходников:
| Компонент | Версия в noble | Роль |
|---|---|---|
nginx | 1.24.0 | фронт, TLS |
php8.3-fpm | 8.3.6 | приложение |
postgresql-16 | 16.x | метаданные: файлы, шары, пользователи |
redis-server | 7.0.15 | блокировки файлов и кэш |
certbot | 2.9.0 | сертификат Let's Encrypt |
Почему PostgreSQL, а не MariaDB. Поддерживаются оба, но с MySQL-семейством обязательны два ритуала: база строго в utf8mb4 (иначе эмодзи в имени файла роняют загрузку) и transaction_isolation = READ-COMMITTED, без которого на oc_filecache ловятся дедлоки при синхронизации с нескольких клиентов. В PostgreSQL этого не нужно. Минус честный: дампы свои, mysqldump не подойдёт — см. бэкап Nextcloud.
Подготовьте заранее: сервер с чистой Ubuntu 24.04 LTS и root-доступом от 4 ГБ RAM; домен с A-записью (dig +short cloud.example.com должен совпасть с curl -s ifconfig.me); открытые 80 и 443 — 80 нужен именно для сертификата. И сразу решите, где лежат данные: дефолт /var/www/nextcloud/data плохой, кладите вне веб-корня, например в /var/ncdata.
Метаданные Nextcloud держит в базе, файлы — обычными файлами на ФС. Корзина и версии включены по умолчанию, так что места закладывайте полтора-два объёма от полезных данных. На 4 ГБ RAM добавьте своп (fallocate -l 2G /swapfile, mkswap, swapon), иначе первая генерация превью даст Out of memory: Killed process в dmesg.
Шаг 1. Пакеты, расширения PHP и фаервол
Весь стек ставится одной командой:
apt update && apt -y full-upgrade
apt -y install nginx postgresql redis-server unzip \
php8.3-fpm php8.3-pgsql php8.3-gd php8.3-xml php8.3-mbstring php8.3-curl \
php8.3-zip php8.3-intl php8.3-bcmath php8.3-gmp php8.3-bz2 \
php-imagick php-apcu php-redis
Первая грабля — разнобой в именах. Расширения из ядра PHP идут с версией (php8.3-gd), а PECL-модули версию в имени не имеют: только php-imagick, php-apcu, php-redis, собранные под 8.3. Попытка поставить php8.3-apcu закончится коротким E: Unable to locate package php8.3-apcu.
Без php8.3-pgsql команда occ отвечает PHP module pgsql not installed; gmp и bcmath нужны для шифрования и WebAuthn, intl — для сортировки имён по локали, иначе русские названия идут в порядке байтов UTF-8. С php-imagick сюрприз: даже с установленным пакетом появляется The PHP module "imagick" in this instance has no SVG support — поддержка SVG лежит в libmagickcore-6.q16-6-extra. Проверка: php -m | grep -cE 'gd|gmp|bcmath|intl|imagick|apcu|redis|zip|pgsql' должно вернуть 9.
Фаервол закрываем сразу: ufw allow 22/tcp, ufw allow 80/tcp, ufw allow 443/tcp, ufw --force enable. PostgreSQL и Redis наружу не выставляем: ss -lntp | grep -E '5432|6379' должен показывать 127.0.0.1.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть NextcloudШаг 2. PostgreSQL 16: база, схема public и peer-авторизация
Кластер main создаётся при установке пакета, поднимать вручную ничего не нужно:
sudo -u postgres psql -c "CREATE USER nextcloud WITH PASSWORD 'ДЛИННЫЙ_ПАРОЛЬ';"
sudo -u postgres psql -c "CREATE DATABASE nextcloud OWNER nextcloud TEMPLATE template0 ENCODING 'UTF8';"
OWNER nextcloud обязателен. С PostgreSQL 15 обычный пользователь не может создавать объекты в схеме public чужой базы, и установка упадёт на первой миграции: SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for schema public. Чинится без пересоздания — GRANT ALL ON SCHEMA public TO nextcloud;. А TEMPLATE template0 спасает при неюникодной локали кластера, иначе будет new encoding (UTF8) is incompatible with the encoding of the template database.
Дальше авторизация. pg_hba.conf из коробки содержит local all all peer и host all all 127.0.0.1/32 scram-sha-256: по TCP пароль работает, через unix-сокет — нет. Оставите хост пустым — PHP пойдёт в сокет и получит
SQLSTATE[08006] [7] connection to server on socket "/var/run/postgresql/.s.PGSQL.5432"
failed: FATAL: Peer authentication failed for user "nextcloud"
Системного пользователя nextcloud в ОС нет, и peer его не пропустит: правильный ответ — явно указать --database-host=127.0.0.1, а не править pg_hba.conf.
Дефолты кластера рассчитаны на очень скромную машину, поэтому в /etc/postgresql/16/main/conf.d/nextcloud.conf пропишите shared_buffers = 512MB, effective_cache_size = 2GB, work_mem = 8MB и random_page_cost = 1.1. Последняя — не суеверие: дефолтная четвёрка написана под механические диски, и на NVMe планировщик берёт seq scan вместо индекса.
Шаг 3. Пул PHP-FPM, OPcache и APCu
Nextcloud держим в отдельном пуле, а не в общем www, — /etc/php/8.3/fpm/pool.d/nextcloud.conf:
[nextcloud]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm-nextcloud.sock
listen.owner = www-data
pm = dynamic
pm.max_children = 12
php_admin_value[memory_limit] = 512M
php_value[max_execution_time] = 3600
env[PATH] = /usr/local/bin:/usr/bin:/bin
memory_limit = 512M — то значение, ниже которого «Обзор» выводит The PHP memory limit is below the recommended value of 512MB. Блок env[PATH] нужен потому, что FPM не наследует окружение: без него не найдутся ffmpeg для превью видео и smbclient для внешних хранилищ. А pm.max_children считайте по факту — воркер занимает 70–110 МБ RSS, померить можно так:
ps --no-headers -o rss -C php-fpm8.3 | awk '{s+=Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть Nextcloud
Шаг 2. PostgreSQL 16: база, схема public и peer-авторизация
Кластер main создаётся при установке пакета, поднимать вручную ничего не нужно:
sudo -u postgres psql -c "CREATE USER nextcloud WITH PASSWORD 'ДЛИННЫЙ_ПАРОЛЬ';"
sudo -u postgres psql -c "CREATE DATABASE nextcloud OWNER nextcloud TEMPLATE template0 ENCODING 'UTF8';"
OWNER nextcloud обязателен. С PostgreSQL 15 обычный пользователь не может создавать объекты в схеме public чужой базы, и установка упадёт на первой миграции: SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for schema public. Чинится без пересоздания — GRANT ALL ON SCHEMA public TO nextcloud;. А TEMPLATE template0 спасает при неюникодной локали кластера, иначе будет new encoding (UTF8) is incompatible with the encoding of the template database.
Дальше авторизация. pg_hba.conf из коробки содержит local all all peer и host all all 127.0.0.1/32 scram-sha-256: по TCP пароль работает, через unix-сокет — нет. Оставите хост пустым — PHP пойдёт в сокет и получит
SQLSTATE[08006] [7] connection to server on socket "/var/run/postgresql/.s.PGSQL.5432"
failed: FATAL: Peer authentication failed for user "nextcloud"
Системного пользователя nextcloud в ОС нет, и peer его не пропустит: правильный ответ — явно указать --database-host=127.0.0.1, а не править pg_hba.conf.
Дефолты кластера рассчитаны на очень скромную машину, поэтому в /etc/postgresql/16/main/conf.d/nextcloud.conf пропишите shared_buffers = 512MB, effective_cache_size = 2GB, work_mem = 8MB и random_page_cost = 1.1. Последняя — не суеверие: дефолтная четвёрка написана под механические диски, и на NVMe планировщик берёт seq scan вместо индекса.
Шаг 3. Пул PHP-FPM, OPcache и APCu
Nextcloud держим в отдельном пуле, а не в общем www, — /etc/php/8.3/fpm/pool.d/nextcloud.conf:
[nextcloud]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm-nextcloud.sock
listen.owner = www-data
pm = dynamic
pm.max_children = 12
php_admin_value[memory_limit] = 512M
php_value[max_execution_time] = 3600
env[PATH] = /usr/local/bin:/usr/bin:/bin
memory_limit = 512M — то значение, ниже которого «Обзор» выводит The PHP memory limit is below the recommended value of 512MB. Блок env[PATH] нужен потому, что FPM не наследует окружение: без него не найдутся ffmpeg для превью видео и smbclient для внешних хранилищ. А pm.max_children считайте по факту — воркер занимает 70–110 МБ RSS, померить можно так:
ps --no-headers -o rss -C php-fpm8.3 | awk '{s+=$1} END {print s/NR/1024" MB avg,", NR" workers"}'
На 8 ГБ рядом с PostgreSQL и Redis честный потолок — 12–16 воркеров. Поставите 40, как в примерах для мощных машин, — первая параллельная загрузка выбьет систему в OOM.
Кэш кода — в /etc/php/8.3/fpm/conf.d/99-nextcloud.ini: opcache.enable=1, opcache.memory_consumption=192, opcache.interned_strings_buffer=32, opcache.max_accelerated_files=20000. Дефолтные 10 000 слотов малы: find /var/www/nextcloud -name '*.php' | wc -l даёт около 17 тысяч файлов, и появляется The OPcache interned strings buffer is nearly full. Включите APCu и для консоли — echo 'apc.enable_cli=1' > /etc/php/8.3/cli/conf.d/99-apcu-cli.ini, иначе occ упадёт с Memcache \OC\Memcache\APCu not available for local cache. Дальше — почему Nextcloud медленно работает.
Шаг 4. Код Nextcloud и установка через occ
Скачиваем архив с контрольной суммой и подписью — полминуты страховки от битой загрузки:
cd /tmp && for e in "" .asc .sha256; do curl -fLO https://download.nextcloud.com/server/releases/latest.zip$e; done
sha256sum -c latest.zip.sha256
curl -fsSL https://nextcloud.com/nextcloud.asc | gpg --import && gpg --verify latest.zip.asc latest.zip
unzip -q latest.zip -d /var/www/ && mkdir -p /var/ncdata
chown -R www-data:www-data /var/www/nextcloud /var/ncdata && chmod 750 /var/ncdata
Ждём latest.zip: OK и Good signature from "Nextcloud Security <security@nextcloud.com>"; WARNING: This key is not certified with a trusted signature — норма. Архив весит около 230 МБ, распакованный каталог — 850 МБ. Права 750 обязательны: при 755 в «Обзоре» повиснет Your data directory is readable by other users, а файлы всех пользователей лежат там открытым текстом.
Отличие от гайдов с веб-установщиком: ставьте через occ, а не через браузер. Веб-установщик работает в обычном HTTP-запросе, на медленном диске упирается в таймаут, отдаёт 504 и оставляет наполовину созданную базу:
sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
--database=pgsql --database-host=127.0.0.1 --database-name=nextcloud \
--database-user=nextcloud --database-pass='ДЛИННЫЙ_ПАРОЛЬ' \
--admin-user=ncadmin --admin-pass='ВРЕМЕННЫЙ_ПАРОЛЬ' --data-dir=/var/ncdata
Честный минус: пароли на секунду видны в ps aux и оседают в истории шелла — админский ставьте временный и сразу меняйте через occ user:resetpassword ncadmin. Успех — строка Nextcloud was successfully installed, после чего occ status печатает installed: true и версию вида 33.0.2.1. Проверьте и ls -a /var/ncdata: там должен быть маркер .ncdata. Он теряется при переносе каталога через cp без -a, и тогда Nextcloud встречает страницей Your data directory is invalid. Ensure there is a file called ".ncdata"....
Шаг 5. nginx с TLS, Redis и фоновые задачи
Официальный конфиг длинный; специфичны для Nextcloud вот эти строки внутри блока server в /etc/nginx/sites-available/nextcloud.conf:
root /var/www/nextcloud;
client_max_body_size 16G;
location ^~ /.well-known/acme-challenge/ { root /var/www/html; allow all; }
location = /.well-known/carddav { return 301 /remote.php/dav; }
location = /.well-known/caldav { return 301 /remote.php/dav; }
location / { try_files $uri $uri/ /index.php$request_uri; }
location ~ ^/(?:\.|autotest|occ|db_|console) { deny all; }
location ~ \.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param front_controller_active true;
fastcgi_pass unix:/run/php/php8.3-fpm-nextcloud.sock;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
}
acme-challenge стоит выше редиректов .well-known осознанно: с общим location ^~ /.well-known certbot упрётся в Invalid response ...: 404 — челлендж уйдёт в Nextcloud вместо файла. Два редиректа на /remote.php/dav снимают предупреждение «Обзора» про CalDAV и CardDAV, а за крупные загрузки отвечают fastcgi_request_buffering off и client_max_body_size (разбор лимитов).
ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default && nginx -t && systemctl reload nginx
apt -y install certbot python3-certbot-nginx
certbot --nginx -d cloud.example.com --agree-tos -m admin@example.com --redirect
cd /var/www/nextcloud && sudo -u www-data php occ config:system:set overwriteprotocol --value=https
sudo -u www-data php occ config:system:set trusted_domains 1 --value=cloud.example.com
Certbot сам допишет 443-й сервер и редирект. Последняя строка обязательна, иначе браузер встретит страницей Access through untrusted domain — защита от подмены заголовка Host, а не поломка.
Redis убирает классическое file is locked: свежая установка блокирует файлы через базу. Раскомментируйте в /etc/redis/redis.conf строки unixsocket /run/redis/redis-server.sock и unixsocketperm 770, затем usermod -aG redis www-data и рестарт обоих сервисов — членство в группе подхватывается только при рестарте FPM, иначе в nextcloud.log посыплется RedisException: Permission denied. В config.php — 'memcache.local' => '\OC\Memcache\APCu', 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => ['host' => '/run/redis/redis-server.sock', 'port' => 0].
Фоновые задачи — на systemd-таймер, а не на crontab: он переживает смену версии PHP и не стартует во время апгрейда. В nextcloudcron.service: User=www-data, ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e, ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php; рядом таймер с OnUnitActiveSec=5min. Финал — systemctl enable --now nextcloudcron.timer, затем occ background:cron, occ db:add-missing-indices и occ setupchecks. Последняя печатает те же пункты, что «Обзор»: список должен быть пустым, а первая отрисовка страницы файлов — уложиться в 250–350 мс против 1,2–1,5 с без OPcache и APCu.
Какой сервер под Nextcloud взять в MAATRIX
Nextcloud почти не считает: он перекладывает файлы и ходит в базу. Процессор нужен для превью, память с диском расходуются предсказуемо.
- Минимум: 2 vCPU / 4 ГБ RAM / 80 ГБ NVMe — на 3–5 человек. PostgreSQL с
shared_buffers 512M занимает 600–800 МБ RSS, Redis — 15 МБ, воркер FPM — 70–110 МБ, плюс система. На 2 ГБ Nextcloud работает в одиночку, но синхронизация с двух ноутбуков упирается в своп, а превью фотоархива убивают базу по OOM. - Комфортный вариант: 4 vCPU / 8 ГБ RAM / 200 ГБ и больше — десять-двадцать пользователей и запас под Collabora или OnlyOffice: каждый офисный сервер просит ещё около 2 ГБ и пару ядер. Подробнее — сколько RAM нужно для Nextcloud.
- Диск — с коэффициентом 1,5–2: корзина и версии включены по умолчанию, и 15 человек по 20 ГБ данных дают ближе к 500 ГБ, а не 300. Аппетит урезается сразу:
occ config:system:set trashbin_retention_obligation --value="30, 60".
Все команды выше можно не выполнять вовсе: Nextcloud есть в каталоге apps.maatrix.io и разворачивается автоматически при заказе сервера. Автоустановка работает на Ubuntu и Debian, включая 24.04 LTS; адрес, логин и пароль ждут в личном кабинете, раздел «Доступ».
Локация по умолчанию — Лондон: привычный контрагентам режим GDPR, пинг из Москвы 45–60 мс против 110–130 мс до Нью-Йорка, а для коллег в ЕС — единицы миллисекунд. На WebDAV это заметно: клиент синхронизации шлёт сотни мелких запросов подряд. Оговорка честная: юрлицам с персональными данными российских граждан 152-ФЗ предписывает держать первичную базу в России — тогда берите RU-локацию, установка не изменится ни на строчку. Выбрать конфигурацию можно сразу под задачу, оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть Nextcloud} END {print s/NR/1024" MB avg,", NR" workers"}'
На 8 ГБ рядом с PostgreSQL и Redis честный потолок — 12–16 воркеров. Поставите 40, как в примерах для мощных машин, — первая параллельная загрузка выбьет систему в OOM.
Кэш кода — в /etc/php/8.3/fpm/conf.d/99-nextcloud.ini: opcache.enable=1, opcache.memory_consumption=192, opcache.interned_strings_buffer=32, opcache.max_accelerated_files=20000. Дефолтные 10 000 слотов малы: find /var/www/nextcloud -name '*.php' | wc -l даёт около 17 тысяч файлов, и появляется The OPcache interned strings buffer is nearly full. Включите APCu и для консоли — echo 'apc.enable_cli=1' > /etc/php/8.3/cli/conf.d/99-apcu-cli.ini, иначе occ упадёт с Memcache \OC\Memcache\APCu not available for local cache. Дальше — почему Nextcloud медленно работает.
Шаг 4. Код Nextcloud и установка через occ
Скачиваем архив с контрольной суммой и подписью — полминуты страховки от битой загрузки:
cd /tmp && for e in "" .asc .sha256; do curl -fLO https://download.nextcloud.com/server/releases/latest.zip$e; done
sha256sum -c latest.zip.sha256
curl -fsSL https://nextcloud.com/nextcloud.asc | gpg --import && gpg --verify latest.zip.asc latest.zip
unzip -q latest.zip -d /var/www/ && mkdir -p /var/ncdata
chown -R www-data:www-data /var/www/nextcloud /var/ncdata && chmod 750 /var/ncdata
Ждём latest.zip: OK и Good signature from "Nextcloud Security <security@nextcloud.com>"; WARNING: This key is not certified with a trusted signature — норма. Архив весит около 230 МБ, распакованный каталог — 850 МБ. Права 750 обязательны: при 755 в «Обзоре» повиснет Your data directory is readable by other users, а файлы всех пользователей лежат там открытым текстом.
Отличие от гайдов с веб-установщиком: ставьте через occ, а не через браузер. Веб-установщик работает в обычном HTTP-запросе, на медленном диске упирается в таймаут, отдаёт 504 и оставляет наполовину созданную базу:
sudo -u www-data php /var/www/nextcloud/occ maintenance:install \
--database=pgsql --database-host=127.0.0.1 --database-name=nextcloud \
--database-user=nextcloud --database-pass='ДЛИННЫЙ_ПАРОЛЬ' \
--admin-user=ncadmin --admin-pass='ВРЕМЕННЫЙ_ПАРОЛЬ' --data-dir=/var/ncdata
Честный минус: пароли на секунду видны в ps aux и оседают в истории шелла — админский ставьте временный и сразу меняйте через occ user:resetpassword ncadmin. Успех — строка Nextcloud was successfully installed, после чего occ status печатает installed: true и версию вида 33.0.2.1. Проверьте и ls -a /var/ncdata: там должен быть маркер .ncdata. Он теряется при переносе каталога через cp без -a, и тогда Nextcloud встречает страницей Your data directory is invalid. Ensure there is a file called ".ncdata"....
Шаг 5. nginx с TLS, Redis и фоновые задачи
Официальный конфиг длинный; специфичны для Nextcloud вот эти строки внутри блока server в /etc/nginx/sites-available/nextcloud.conf:
root /var/www/nextcloud;
client_max_body_size 16G;
location ^~ /.well-known/acme-challenge/ { root /var/www/html; allow all; }
location = /.well-known/carddav { return 301 /remote.php/dav; }
location = /.well-known/caldav { return 301 /remote.php/dav; }
location / { try_files $uri $uri/ /index.php$request_uri; }
location ~ ^/(?:\.|autotest|occ|db_|console) { deny all; }
location ~ \.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param front_controller_active true;
fastcgi_pass unix:/run/php/php8.3-fpm-nextcloud.sock;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
}
acme-challenge стоит выше редиректов .well-known осознанно: с общим location ^~ /.well-known certbot упрётся в Invalid response ...: 404 — челлендж уйдёт в Nextcloud вместо файла. Два редиректа на /remote.php/dav снимают предупреждение «Обзора» про CalDAV и CardDAV, а за крупные загрузки отвечают fastcgi_request_buffering off и client_max_body_size (разбор лимитов).
ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default && nginx -t && systemctl reload nginx
apt -y install certbot python3-certbot-nginx
certbot --nginx -d cloud.example.com --agree-tos -m admin@example.com --redirect
cd /var/www/nextcloud && sudo -u www-data php occ config:system:set overwriteprotocol --value=https
sudo -u www-data php occ config:system:set trusted_domains 1 --value=cloud.example.com
Certbot сам допишет 443-й сервер и редирект. Последняя строка обязательна, иначе браузер встретит страницей Access through untrusted domain — защита от подмены заголовка Host, а не поломка.
Redis убирает классическое file is locked: свежая установка блокирует файлы через базу. Раскомментируйте в /etc/redis/redis.conf строки unixsocket /run/redis/redis-server.sock и unixsocketperm 770, затем usermod -aG redis www-data и рестарт обоих сервисов — членство в группе подхватывается только при рестарте FPM, иначе в nextcloud.log посыплется RedisException: Permission denied. В config.php — 'memcache.local' => '\OC\Memcache\APCu', 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => ['host' => '/run/redis/redis-server.sock', 'port' => 0].
Фоновые задачи — на systemd-таймер, а не на crontab: он переживает смену версии PHP и не стартует во время апгрейда. В nextcloudcron.service: User=www-data, ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e, ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php; рядом таймер с OnUnitActiveSec=5min. Финал — systemctl enable --now nextcloudcron.timer, затем occ background:cron, occ db:add-missing-indices и occ setupchecks. Последняя печатает те же пункты, что «Обзор»: список должен быть пустым, а первая отрисовка страницы файлов — уложиться в 250–350 мс против 1,2–1,5 с без OPcache и APCu.
Какой сервер под Nextcloud взять в MAATRIX
Nextcloud почти не считает: он перекладывает файлы и ходит в базу. Процессор нужен для превью, память с диском расходуются предсказуемо.
- Минимум: 2 vCPU / 4 ГБ RAM / 80 ГБ NVMe — на 3–5 человек. PostgreSQL с
shared_buffers 512Mзанимает 600–800 МБ RSS, Redis — 15 МБ, воркер FPM — 70–110 МБ, плюс система. На 2 ГБ Nextcloud работает в одиночку, но синхронизация с двух ноутбуков упирается в своп, а превью фотоархива убивают базу по OOM. - Комфортный вариант: 4 vCPU / 8 ГБ RAM / 200 ГБ и больше — десять-двадцать пользователей и запас под Collabora или OnlyOffice: каждый офисный сервер просит ещё около 2 ГБ и пару ядер. Подробнее — сколько RAM нужно для Nextcloud.
- Диск — с коэффициентом 1,5–2: корзина и версии включены по умолчанию, и 15 человек по 20 ГБ данных дают ближе к 500 ГБ, а не 300. Аппетит урезается сразу:
occ config:system:set trashbin_retention_obligation --value="30, 60".
Все команды выше можно не выполнять вовсе: Nextcloud есть в каталоге apps.maatrix.io и разворачивается автоматически при заказе сервера. Автоустановка работает на Ubuntu и Debian, включая 24.04 LTS; адрес, логин и пароль ждут в личном кабинете, раздел «Доступ».
Локация по умолчанию — Лондон: привычный контрагентам режим GDPR, пинг из Москвы 45–60 мс против 110–130 мс до Нью-Йорка, а для коллег в ЕС — единицы миллисекунд. На WebDAV это заметно: клиент синхронизации шлёт сотни мелких запросов подряд. Оговорка честная: юрлицам с персональными данными российских граждан 152-ФЗ предписывает держать первичную базу в России — тогда берите RU-локацию, установка не изменится ни на строчку. Выбрать конфигурацию можно сразу под задачу, оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть NextcloudОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Ставить из архива или взять snap либо Docker?
Архив с nginx и FPM даёт контроль над версиями PHP и базы и обновляется штатным occ upgrade. Snap проще, но конфиг PHP там свой и лимиты правятся неудобно. Docker хорош, если у вас уже есть compose-стек и решён бэкап томов.
Можно ли поставить то же самое на MariaDB?
Да, поменяются три вещи: пакет php8.3-mysql вместо php8.3-pgsql, флаг --database=mysql в occ maintenance:install и обязательные transaction_isolation = READ-COMMITTED с базой в utf8mb4 — иначе дедлоки на oc_filecache и ошибка does not support 4-byte characters.
После установки в «Обзоре» жёлтые предупреждения, хотя всё работает.
Это рекомендации, а не поломка: обычно не хватает заголовков безопасности, индексов базы или прогретого кэша. Пройдитесь по выводу occ setupchecks и occ db:add-missing-indices — там те же пункты с точными формулировками.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.