Найти в Дзене
Типичный Админ

Nextcloud. Включить загрузку 100-гигабайтных файлов

Коллега на работе пожаловался, что не может загрузить большой 100-гиговый файл на корпоративный Nextcloud. А я напомню, что рабочий сервер я обновлял и настраивал по этой статье: https://typical-admin.ru/item/99-nextcloud-update-18-to-30 Чтобы можно было загружать такие большие файлы на Nextcloud, требуется изменить несколько конфигов. Начну с необязательного. В /var/www/html/nextcloud/config/config.php рекомендуется добавить вот такую строчку: 'max_chunk_size' => 104857600, По умолчанию клиенты Nextcloud (и сам сервер) обычно и так используют чанки ~100 MiB, поэтому ручная установка в 100 MiB часто просто дублирует поведение по умолчанию. Но плюс явной установки в том, что гарантируется одинаковое поведение для всех клиентов (браузер, desktop, WebDAV) и предотвращаются ситуации, когда клиент решит отправлять слишком большие чанки (и тогда может сработать upload_max_filesize или post_max_size). Далее будут уже обязательные изменения конфигов. В /etc/php/8.3/fpm/php.ini нужно поправить

Коллега на работе пожаловался, что не может загрузить большой 100-гиговый файл на корпоративный Nextcloud. А я напомню, что рабочий сервер я обновлял и настраивал по этой статье:

https://typical-admin.ru/item/99-nextcloud-update-18-to-30

Чтобы можно было загружать такие большие файлы на Nextcloud, требуется изменить несколько конфигов. Начну с необязательного. В /var/www/html/nextcloud/config/config.php рекомендуется добавить вот такую строчку:

'max_chunk_size' => 104857600,

По умолчанию клиенты Nextcloud (и сам сервер) обычно и так используют чанки ~100 MiB, поэтому ручная установка в 100 MiB часто просто дублирует поведение по умолчанию. Но плюс явной установки в том, что гарантируется одинаковое поведение для всех клиентов (браузер, desktop, WebDAV) и предотвращаются ситуации, когда клиент решит отправлять слишком большие чанки (и тогда может сработать upload_max_filesize или post_max_size).

Далее будут уже обязательные изменения конфигов. В /etc/php/8.3/fpm/php.ini нужно поправить вот эти параметры:

max_execution_time = 43200
max_input_time = 43200
upload_max_filesize = 1024M
post_max_size = 1024M

Nextcloud НЕ грузит 100 ГБ одним файлом, он режет его на чанки (chunked upload). Поэтому нужно увеличить время на обработку загрузки. max_execution_time — параметр в PHP, который задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, работа скрипта завершается. max_input_time — директива в PHP, которая задаёт максимальное время в секундах, в течение которого скрипт должен разобрать все входные данные, переданные запросами вроде POST или GET. upload_max_filesize — директива в PHP, которая определяет максимальный размер загружаемых файлов на сервер. post_max_size — директива в PHP, которая устанавливает максимальный размер данных, отправленных методом POST, включая размер загружаемых файлов.

Далее пойдут настройки Apache под большие загрузки. Создаю для этого отдельный конфиг:

nano /etc/apache2/conf-available/nextcloud-large-upload.conf

Его содержимое будет таким:

Timeout 43200
ProxyTimeout 43200
LimitRequestBody 214748364800
RequestReadTimeout header=20-40,MinRate=500 body=3600,MinRate=500

Timeout — общий сетевой таймаут, который определяет, как долго Apache готов ждать завершения блокирующих операций сети там, где нет отдельных переопределений. ProxyTimeout — директива, которая настраивает время ожидания для прокси-запросов. Позволяет установить время, в течение которого сервер будет ждать ответа от бэкенд-сервера, к которому он проксирует запросы. LimitRequestBody позволяет задавать максимально допустимый размер тела клиентского запроса. В Apache 2.4.54+ по умолчанию стоит 1 GiB, что прерывает запросы файлов >1 GB. Нужно увеличить этот лимит, 214748364800 = 200 GiB. RequestReadTimeout — директива в Apache HTTP Server, которая устанавливает лимиты времени на чтение заголовков (headers) и тела (body) запроса. header=20-40,MinRate=500 — даёт 20 сек на начальное чтение заголовков, расширяет до 40 сек с учётом минимальной скорости передачи 500 B/s; это защищает от очень медленных/подозрительных клиентов. body=3600,MinRate=500 — на чтение тела даётся до 3600 с с минимальной скоростью передачи (MinRate) 500 bytes/sec; медленные соединения будут прерваны, но нормальные — пройдут.

Теперь нужно включить этот конфиг:

a2enconf nextcloud-large-upload

и перезапустить apache и php-fpm:

service php8.3-fpm restart
service apache2 restart

В целом, тут можно было бы и закончить. Но, в моём случае, загрузка таких больших файлов требуется очень редко, поэтому руководитель сказал, что будем включать эту возможность вручную по мере необходимости, а в остальное время настройки пускай остаются прежними. И, чтобы упростить процесс включения/отключения, я попросил у chatgpt скрипт для этого. Прикладываю этот скрипт сюда же:

https://disk.yandex.ru/d/duGEwspnTtRc4A

Инструкции:

Сохранить содержимое в /usr/local/bin/gigafiles.

Сделать исполняемым:

chmod +x /usr/local/bin/gigafiles.

Запускать из-под root:

Включить режим для больших файлов:

gigafiles on

Выключить:

gigafiles off

Что делает скрипт:

создаёт бэкап php.ini с временной меткой;
заменяет или добавляет четыре директивы в /etc/php/8.3/fpm/php.ini;
перезагружает php8.3-fpm;
включает/отключает конфигурацию Apache через a2enconf / a2disconf;
проверяет apachectl configtest и — если OK — перезагружает Apache. Если configtest падает, скрипт откатывает php.ini из бэкапа и прекращает (с сообщением об ошибке).

Безопасность/ограничения:

Скрипт предполагает, что файл /etc/apache2/conf-available/nextcloud-large-upload.conf корректен и готов к включению.
Скрипт сохраняет один бэкап при каждом запуске (с временной меткой).
Скрипт не правит другие файлы (pool.d/www.conf и т.п.).

В консоли отработка скрипта выглядит так:

Донаты принимаются на кошельки:

Yoomoney:
4100118091867315

Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077

Карта Альфа-Банк:
2200 1539 1357 2013

-2