На работе дали большое задание, которое заключалось в следующем. Имеется:
- Боевой, но устаревший сервер Nextcloud версии 18.0.3 с большим количеством пользователей.
- На этом сервере используется встроенный Onlyoffice Community Document Server версии 0.1.5 и коннектор версии 4.1.4.
Требуется:
- Настроить и подключить внешний сервер Onlyoffice Docs Community Edition свежей актуальной версии.
- Обновить Nextcloud до свежей актуальной версии, сохранив всех пользователей и их данные.
- Имеющийся сервер работает на Ubuntu 18, а сервер с актуальным Nextcloud должен быть на Debian 12. Onlyoffice Docs Community Edition тоже должен быть на Debian 12.
Этап 1. Настройка Onlyoffice Docs Community.
Сперва приступлю к настройке внешнего сервера Onlyoffice Docs Community Edition, и вот эти статьи будут мне в помощь:
Оф.документация:
https://helpcenter.onlyoffice.com/ru/installation/docs-community-install-ubuntu.aspx
Оф.документация по включению https:
https://helpcenter.onlyoffice.com/ru/installation/docs-community-https-linux.aspx
Статья от Жаконды по установке на Debian 12:
https://jakondo.ru/ustanovka-onlyoffice-docs-community-edition-na-debian-12/
Статья от Дмитрия Моска:
https://www.dmosk.ru/miniinstruktions.php?mini=onlyoffice-nextcloud-ubuntu&ysclid=m69122592220496542
Как упомянуто выше, установка и настройка будет производиться на чистый Dedian 12.
Сначала нужно подключить доп.репозиторий для установки некоторых пакетов по зависимостям. В файле /etc/apt/sources.list модифицирую эти строчки:
deb http://deb.debian.org/debian/ bookworm main non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main non-free-firmware
на вот такие:
deb https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb-src https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
Затем:
apt update
И теперь запускаю предварительную установку зависимостей:
apt install libcurl4 libxml2 curl gnupg2 libstdc++6 fonts-dejavu fonts-liberation ttf-mscorefonts-installer fonts-crosextra-carlito fonts-takao-gothic fonts-opensymbol nginx-extras
Для работы Onlyoffice Docs требуется RabbitMQ – это брокер сообщений с открытым исходным кодом, который служит посредником для обмена информацией между различными системами. Он осуществляет передачу сообщений посредством очередей.
apt install rabbitmq-server
Каких-то дополнительных настроек RabbitMQ в документации не указано.
Также, для работы Onlyoffice Docs требуется PostgreSQL:
apt install postgresql
После этого лучше перезагрузить сервер, т.к. много пакетов установлено, и что-то может работать некорректно.
После установки PostgreSQL надо создать базу данных и пользователя. Пользователь базы данных должен называться onlyoffice. Пароль можно задать любой:
sudo -i -u postgres psql -c "CREATE USER onlyoffice WITH PASSWORD 'psqlpassword';"
sudo -i -u postgres psql -c "CREATE DATABASE onlyoffice OWNER onlyoffice;"
Также рекомендуется сменить пароль пользователя postgres:
sudo -i -u postgres psql -c "alter user postgres with password 'psqlrootpassword'; "
Теперь надо подключить репозиторий Onlyoffice Docs.
Добавление GPG-ключа:
mkdir -p -m 700 ~/.gnupg
curl -fsSL https://download.onlyoffice.com/GPG-KEY-ONLYOFFICE | gpg --no-default-keyring --keyring gnupg-ring:/tmp/onlyoffice.gpg --import
chmod 644 /tmp/onlyoffice.gpg
chown root:root /tmp/onlyoffice.gpg
mv /tmp/onlyoffice.gpg /usr/share/keyrings/onlyoffice.gpg
Добавляю репозиторий Onlyoffice Docs:
echo "deb [signed-by=/usr/share/keyrings/onlyoffice.gpg] https://download.onlyoffice.com/repo/debian squeeze main" | sudo tee /etc/apt/sources.list.d/onlyoffice.list
Хотя данный пакет APT собран для дистрибутива Debian Squeeze, он совместим с рядом производных Debian (включая Ubuntu), а значит можно использовать один репозиторий для всех этих дистрибутивов — так сказано в документации.
Теперь установка Onlyoffice Docs:
apt update
apt install onlyoffice-documentserver
В ходе установки будет запрошен пароль для пользователя onlyoffice в PostgreSQL. Нужно ввести пароль, который был задан при настройке PostgreSQL. (у меня это psqlpassword )
Однако, при установке я получил ошибку:
ERROR: can't connect to postgressql database
dpkg: ошибка при обработке пакета onlyoffice-documentserver (--configure):
подпроцесс из пакета onlyoffice-documentserver установлен сценарий post-installation возвратил код ошибки 1
При обработке следующих пакетов произошли ошибки:
onlyoffice-documentserver
E: Sub-process /usr/bin/dpkg returned an error code (1)
Где-то рука дрогнула при вводе пароля… Ещё раз пробую установить тот же самый пароль на пользователя onlyoffice:
sudo -i -u postgres psql -c "alter user onlyoffice with password 'psqlpassword';"
Затем посылаю команду, чтобы пакет onlyoffice-documentserver закончил свой post-installation:
dpkg --configure -a
Получаю сообщение об успешной установке:
Настраиваетсяпакет onlyoffice-documentserver (8.3.0-94) …
Generating WOPI private key...Done
Generating WOPI public key...Done
Generating AllFonts.js, please wait...Done
Generating presentation themes, please wait...Done
Generating js caches, please wait...Done
Installing plugins, please wait...Done
Congratulations, the onlyoffice documentserver has been installed successfully!
После этого Onlyoffice Docs будет запущен как процесс. Пакет будет обновляться, как любой другой deb-пакет.
Можно зайти по адресу http://docsrv.mydomain.ru и увидеть, что сервер заработал:
Теперь нужно настроить работу по HTTPS. В моём случае, сертификат куплен и уже имеется, поэтому генерация самоподписанного или Let’s Encrypt мне не нужна. Размещу эти сертификаты в каталоге /etc/pki.
mkdir /etc/pki
chown -R root:root /etc/pki
Теперь надо переконфигурировать Onlyoffice Docs. Использую для этого ssl-шаблон, копирую его заместо конфига:
service nginx stop
cp -f /etc/onlyoffice/documentserver/nginx/ds-ssl.conf.tmpl /etc/onlyoffice/documentserver/nginx/ds.conf
Затем в этом файле указываю путь к моему сертификату и ключу. Заполняю вот эти строчки:
ssl_certificate /etc/pki/mydomain.ru.fullchain;
ssl_certificate_key /etc/pki/mydomain.ru.key;
После этого запускаю обратно вэб-сервер и специальный скрипт из комплекта Onlyoffice Docs:
service nginx start
bash /usr/bin/documentserver-update-securelink.sh
Пробую снова зайти по адресу http://docsrv.mydomain.ru и уже вижу, что соединение переключилось на HTTPS:
Теперь надо подключить Onlyoffice Docs к Nextcloud. Сначала нужно узнать секретный ключ Onlyoffice Docs, который сгенерировался в одном из конфигов при установке:
cat /etc/onlyoffice/documentserver/local.json | grep string
В моём случае вывод был таким:
"string": "ib69tldqpgbdst657lrfyvg268thdtThgjNy"
ib69tldqpgbdst657lrfyvg268thdtThgjNy – это и есть секретный ключ. Нужно в настройках зайти в пункт Onlyoffice. Сейчас там указан встроенный Community Document Server без секрета:
В поле «Адрес службы редактирования документов» надо вставить https://docsrv.mydomain.ru, а в поле «Секретный ключ» вставить ib69tldqpgbdst657lrfyvg268thdtThgjNy:
При сохранении если выпадает ошибка «При попытке соединения возникла ошибка (Возникла ошибка в службе документов: Error while downloading the document file to be converted.)», то причины могут быть в кривом сертификате или настройке DNS-сервера. Для корректного подключения Nextcloud к Onlyoffice Docs условия должны быть такие:
- оба сервера резолвят друг друга по FQDN.
- пользовательский комп резолвит оба сервера по FQDN.
- SSL-сертификат Onlyoffice Docs должен быть валидным и доверенным для Nextcloud и пользовательского компа.
- SSL-сертификат Nextcloud должен быть валидным и доверенным для Onlyoffice Docs и пользовательского компа.
Если настройки применились, то нужно проверить редактирование документов. У меня вылезло два окна с ошибками «Не удаётся сохранить документ. Проверьте параметры подключения или обратитесь к вашему администратору…» и «Загрузка не удалась…»:
Так и не понял, чем вызвана эта проблема, но помогает перезагрузка всего сервера Onlyoffice Docs и web-сервера Apache на машине с Nextcloud.
Некоторая оптимизация сервера Onlyoffice Docs.
В документации Onlyoffice Docs я не нашёл информации, как можно оптимизировать производительность. Однако, зная, что Onlyoffice Docs работает на Nginx и Postgresql, можно оптимизировать хотя бы этих двух товарищей.
У Nginx я решил сделать следующее:
- Включить epoll. Использование метода epoll позволяет более эффективно обрабатывать соединения. Он использует подход «управляемое фронтом уведомление», который позволяет серверу обрабатывать новые соединения только когда они доступны, а не постоянно проверять их наличие.
- Включить multi_accept. Позволяет принимать максимально возможное количество соединений. Иначе процесс Nginx за один раз будет принимать только одно новое соединение. У меня много пользователей, поэтому пригодится.
- Включить HTTP/2. Это современный протокол, который является преемником HTTP 1.x. Разработан для улучшения производительности и устранения ограничений HTTP 1.x
В конфиге /etc/onlyoffice/documentserver/nginx/ds.conf нахожу секцию:
server {
listen 0.0.0.0:443 ssl;
listen [::]:443 ssl default_server;
И правлю до такого вида:
server {
listen 0.0.0.0:443 ssl http2;
listen [::]:443 ssl http2 default_server;
Так включается HTTP/2.
Затем в конфиге /etc/nginx/nginx.conf нахожу секцию:
events {
worker_connections 768;
# multi_accept on;
}
И правлю до такого вида:
events {
worker_connections 768;
multi_accept on;
use epoll;
}
Так включается multi_accept и epoll.
Чтобы применить настройки, посылаю команды:
nginx -t && nginx -s reload
bash /usr/bin/documentserver-update-securelink.sh
Теперь можно пооптимизировать Postgresql. Буду делать по примеру оптимизации из своей статьи, где Postgresql используется в связке с 1С:
https://typical-admin.ru/item/91-1c-8-3-centos9
У меня на сервере 6Гб ОЗУ, и я затрудняюсь сказать, насколько сильно Onlyoffice Docs нагружает Postgresql, поэтому тюнинг будет умеренный. В конфиге /etc/postgresql/15/main/postgresql.conf настраиваю под себя вот эти параметры:
shared_buffers = 768MB
temp_buffers = 48MB
work_mem = 192MB
maintenance_work_mem = 768MB
bgwriter_delay = 20ms
bgwriter_lru_maxpages = 200
max_wal_size = 4GB
min_wal_size = 1024MB
random_page_cost = 2.0
effective_cache_size = 4GB
autovacuum = on
autovacuum_naptime = 30s
Описание каждого параметра в статье выше. Да и «Яндекс поиск с нейро» очень понятно может пояснить по каждому параметру. Перезапуск Postgresql:
systemctl restart postgresql
Дальше перехожу к следующему этапу.
Этап 2. Обновление имеющегося сервера до максимально возможного релиза.
Моя текущая установка – это Ubuntu 18 + mysql5.7 + php7.2 + Nextcloud-18.0.3. Также установлен и настроен Redis server 4.0.9 для улучшения производительности. Если обратиться к официальной документации, то можно узнать, что на такой конфигурации можно обновиться до версии Nextcloud-20.0.14:
https://docs.nextcloud.com/server/20/admin_manual/installation/system_requirements.html
А следующий релиз уже требует минимальный php7.3 и MySQL уже 8-ой версии:
https://docs.nextcloud.com/server/21/admin_manual/installation/system_requirements.html
Обновление буду делать ручным методом, описанном в оф.документации:
https://docs.nextcloud.com/server/latest/admin_manual/maintenance/manual_upgrade.html
Ссылки на bz2-архивы с релизами буду брать с этой страницы:
https://nextcloud.com/changelog-unsupported/
Из приложений для Nextcloud мне нужно сохранить и обновить только коннектор Onlyoffice. Ссылки на gz-архивы с релизами этого приложения буду брать с этой страницы:
https://apps.nextcloud.com/apps/onlyoffice/releases
В документации имеется строгое предупреждение (дословно) :
Вы не можете перейти более чем на одну основную версию вперёд за один раз (т. е. 27->28 допустимо, но 27->29 — нет).
Значит порядок обновления будет порелизный, т.е. это: 18.0.3 -> 18.0.14 -> 19.0.13 -> 20.0.14. И для каждого релиза будет своя версия коннектора Onlyoffice.
Сперва-наперво нужно написать скриптик для бэкапа рабочего каталога nextcloud и его mysql-базы. Написан на коленке, но рабочий:
#!/bin/bash
#Тут переменная, в которой надо указать каталог для бэкапов.
KUDA="/home/myuser/back-nextcloud"
#Расположение вэб-каталога с nextcloud.
#Если файлы лежат в каталоге /var/www/html/nextcloud/
#то путь с расположением каталога будет /var/www/html
RASPOL="/var/www/html"
#Пароль рута на MySQL
passmy=MySQLrootpass
#------------------------------------------------------------------------------------------------
#Текущая дата и время
now=$(date +'%Y-%m-%d_%H-%M')
#Ивлечь номер текущей версии nextcloud
nomer=$(cat $RASPOL/nextcloud/version.php | grep VersionString | awk '{print $3}' | awk '{print substr($0,2,length($0)-3)}')
#итоговый каталог для бэкапа
ITOG="$KUDA/Ver-$nomer"
#создать каталог для бэкапа, если его нет.
if [ ! -d $ITOG ]; then
mkdir -p $ITOG
fi
echo "Стопорим апач..."
systemctl stop apache2
echo "[OK]"
echo "Бэкапим каталог без data..."
tar --exclude='data' -zcf $ITOG/nextcloud-DIRbkp_$now.tar.gz -C $RASPOL nextcloud
echo "[OK]"
echo "Выгружаем базу..."
mysqldump --single-transaction --default-character-set=utf8mb4 -h localhost -u root -p$passmy nextcloud > $ITOG/nextcloud-SQLbkp_$now.bak
echo "Жмём выгруженную базу..."
gzip $ITOG/nextcloud-SQLbkp_$now.bak
echo "[OK]"
echo "Запускаем обратно апач..."
systemctl start apache2
echo "[OK]"
exit
Скачать скрипт тут:
https://disk.yandex.ru/d/bmnBKFyw57tWHw
После бэкапа текущей версии закачиваю на сервер архивы для обновления на следующий релиз:
wget https://download.nextcloud.com/server/releases/nextcloud-18.0.14.tar.bz2
wget https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v6.2.0/onlyoffice.tar.gz
Перед всеми манипуляциями надо остановить Apache:
systemctl stop apache2
и временно убрать (закомментировать) задание в кроне:
crontab -u www-data -e
т.к. у меня запускается системное cron-задание для обслуживания Nextcloud. Такой метод обслуживание рекомендует сам Nextcloud:
Строчка с заданием выглядит так:
*/5 * * * * php -f /var/www/html/nextcloud/cron.php
Её надо закомментировать и сохранить изменения.
Затем отстёгиваю каталог data, в котором хранятся все пользовательские файлы. К этому каталогу у меня примонтирован отдельный диск:
umount /var/www/html/nextcloud/data
либо так, по названию диска:
umount /dev/sdb1
Далее, переименовываю старый каталог, удалять его рано:
mv /var/www/html/nextcloud /var/www/html/nextcloud-18.0.3
Распаковываю архив со скачанным релизом на место старого каталога:
tar -xjf nextcloud-18.0.14.tar.bz2 -C /var/www/html
Потом распаковываю архив с коннектором Onlyoffice в каталог приложений:
tar -xf onlyoffice.tar.gz -C /var/www/html/nextcloud/apps
Потом нужно создать каталог data:
mkdir /var/www/html/nextcloud/data
И скопировать конфиг Nextcloud из старого каталога в новый:
cp /var/www/html/nextcloud-18.0.3/config/config.php /var/www/html/nextcloud/config/config.php
Теперь, как сказано в документации, надо назначить верные права на только что извлечённый каталог. Находясь в каталоге /var/www/html нужно выполнить команды:
chown -R www-data:www-data nextcloud
find nextcloud/ -type d -exec chmod 750 {} \;
find nextcloud/ -type f -exec chmod 640 {} \;
После назначения прав надо обратно пристегнуть каталог с данными пользователей. Поскольку монтирование этого каталога у меня прописано в fstab, то можно просто дать команду:
mount -a
Эта команда примонтирует всё, что задано в fstab, но не примонтировано в данный момент, т.е. это как раз мой отдельный диск в каталог /var/www/html/nextcloud/data.
Теперь можно давать команду обновления. Но пока не спешу этого делать, поскольку на этой странице документации сказано, что есть ещё некие длительные этапы миграции, которые надо запускать после обновления:
https://docs.nextcloud.com/server/latest/admin_manual/maintenance/upgrade.html
Поэтому я решил сделать маленький скриптик, который сразу будет и обновлять, и запускать дополнительные действия после обновления:
#!/bin/bash
sudo -u www-data php ./nextcloud/occ upgrade
sudo -u www-data php ./nextcloud/occ db:add-missing-columns
sudo -u www-data php ./nextcloud/occ db:add-missing-indices
sudo -u www-data php ./nextcloud/occ db:add-missing-primary-keys
Этот скрипт нужно запускать, находясь в каталоге /var/www/html. Запускаю и вижу, как пошёл процесс:
Дожидаюсь окончания процесса, после чего перезапускаю php-fpm(на всякий случай) и запускаю apache:
service php7.2-fpm restart
service apache2 restart
Ну и пробою заходить на вэб-интерфейс Nextcloud, смотрю, что получилось, пробую открыть офисные документы через Onlyoffice. Должно быть всё хорошо. Но ещё один штрих есть, если снова обратиться к этой странице:
https://docs.nextcloud.com/server/latest/admin_manual/maintenance/upgrade.html
то вот цитата:
Дождитесь завершения фоновых миграций после крупных обновлений . После обновления до новой основной версии некоторые миграции запланированы для запуска в качестве фонового задания. Если вы планируете выполнить обновление непосредственно до другой основной версии (например, 24 -> 25 -> 26), вам необходимо убедиться, что эти миграции были выполнены до начала следующего обновления. Для этого вам следует запустить cron.php файл 2-3 раза, например:
sudo -u www-data php -f /var/www/html/nextcloud/cron.php
Собственно, именно эту команду и выполняет задание в cron, которое я отключил перед обновлением. И обратно включать я его пока не буду, т.к. нужно сразу ставить следующий релиз. Я буду запускать cron вручную, с помощью команды выше, перед и после каждого обновления.
Ну и теперь осталось накатить релизы 19.0.13 и 20.0.14, один за другим. Скачивается релиз и актуальный для него коннектор Onlyoffice, а дальше всё делается также по вышеизложенному описанию. Главное быть аккуратным с копи-пастом и не напутать с версией релиза.
В 20-ом релизе добавили страницу с виджетами. И, дойдя до него, обнаружилось, что именно виджеты открываются при входе в Nextcloud:
Это неудобно и, чтобы исправить, нужно в конфиг Nextcloud /var/www/html/nextcloud/config/config.php добавить строчку:
'defaultapp' => 'files',
Тогда будет открываться страница с файлами, а не виджеты.
Этап 3. Настройка промежуточного сервера для обновления с релиза 20.0.14 до 29.0.12.
Этот сервер будет на Debian 11. В родных репозиториях у него php7.4, которого хватит для наката нескольких релизов, затем придётся ставить php8.0 и php8.2. MySQL будет уже 8.0. Но, обо всём по порядку…
Итак, имеется чистый и обновлённый Debian 11. Сначала подключу репозиторий MySQL, для этого скачиваю и устанавливаю конфигурационный пакет:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb
apt install gnupg
dpkg -i mysql-apt-config_0.8.22-1_all.deb
При установке конфигурационного пакеты появится окно, в котором всё оставляю по умолчанию, ибо мне как раз и нужен MySQL8.0 и его коннекторы:
Затем пробую apt update и получаю эту ошибку:
http://repo.mysql.com/apt/debian bullseye InRelease
Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY B7B3B788A8D3785C
Чтение списков пакетов… Готово
W: Ошибка GPG: http://repo.mysql.com/apt/debian bullseye InRelease: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY B7B3B788A8D3785C
E: Репозиторий «http://repo.mysql.com/apt/debian bullseye InRelease» не подписан.
Устанавливаю ключ подписи:
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB7B3B788A8D3785C' | sudo apt-key add –
После этого обновляю сведения о пакетах и ставлю MySQL:
apt update
apt install mysql-server
В процессе установки будет попрошено указать пароль для мускульного рута:
И затем выбрать метод аутентификации. По умолчанию стоит «use strong», его и оставляю:
После установки MySQL запускаюmysql_secure_installation. Он заблокирует доступ к MySQL по умолчанию и удалённые подключения администратора, удалит некоторые небезопасные тестовые базы данных:
Сразу создам базу данных и пользователя для Nextcloud:
mysql -h localhost -u root -pMySQLrootpass -e "CREATE USER 'oc_Admin'@'localhost' IDENTIFIED BY 'NextcloudMySQLpass'"
mysql -h localhost -u root -pMySQLrootpass -e "CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -h localhost -u root -pMySQLrootpass -e "GRANT ALL PRIVILEGES ON nextcloud.* TO 'oc_Admin'@'localhost'"
mysql -h localhost -u root -pMySQLrootpass -e "FLUSH PRIVILEGES"
Где MySQLrootpass — пароль мускульного рута.
Название БД, имя пользователя и его пароль делаю те же, что и на старом сервере. Взял их из конфига Nextcloud: /var/www/html/nextcloud/config/config.php
Следующим шагом будет установка и настройка Redis сервера. Ставлю:
apt install redis-server
В Debian 11 уже идёт версия 6.0.16. Что касается настройки, то я просто перекинул конфиг со старого сервера, он лежит тут: /etc/redis/redis.conf. Но ещё не забыть сделать верные права на этот конфиг:
chown redis:redis /etc/redis/redis.conf
chmod 640 /etc/redis/redis.conf
Возможно, на промежуточном сервере и вовсе можно было обойтись без редиски, но тогда пришлось бы немного переделывать конфиг Nextcloud. А поскольку redis спокойно заработал с конфигом из старого сервера, то пусть будет. Настроек Redis я коснусь в заключительной части, когда буду заниматься оптимизацией уже конечного сервера с самой свежей версией Nextcloud.
Теперь ставлю все необходимые пакеты для Nextcloud, включая Apache и php:
apt install apache2 libapache2-mod-php php php-gd php-mysql php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip php-apcu memcached libmemcached-tools php-memcached php-redis php-fpm libmagickcore-6.q16-6-extra librsvg2-bin
После этого, сразу включаю нужные модули Апача, которые ещё не включены:
a2enmod headers proxy proxy_fcgi rewrite socache_shmcb ssl
И включаю php-fpm для Апача:
a2enconf php7.4-fpm
Напомню, что пока у меня только php7.4, потом рядом встанут остальные версии.
Далее нужно перетащить конфиг апача со старого сервера. У меня всё прописано в файле /etc/apache2/sites-available/000-default.conf, поскольку на сервере только Nextcloud и больше ничего. Конфигурация выглядит так:
<VirtualHost *:80>
ServerName cloud1.mydomain.ru
ServerAdmin dl@mydomain.ru
DocumentRoot /var/www/html/nextcloud/
Redirect permanent / https://cloud1.mydomain.ru/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName cloud1.mydomain.ru
DocumentRoot /var/www/html/nextcloud/
RewriteEngine On
SSLEngine on
SSLCertificateFile /etc/pki/mydomain.ru.fullchain
SSLCertificateKeyFile /etc/pki/mydomain.ru.key
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
</VirtualHost>
<Directory /var/www/html/nextcloud/>
Options +FollowSymlinks
AllowOverride All
<IfModule mod_dav.c>
Dav off
</IfModule>
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>
Т.е. я перекидываю этот конфиг со старого сервера на промежуточный, но меняю в нём строчки с доменом, т.к у промежуточного сервера другое имя:
ServerName cloud2.mydomain.ru
Redirect permanent /https://cloud2.mydomain.ru/
И не забываю положить сертификат и ключ в папку, указанную в конфиге: /etc/pki
Т.к. сервер промежуточный, то оптимизировать и конфигурировать PHP не буду, за исключением строго рекомендованной настройки:
memory_limit = 512M
Этот параметр надо поправить в файлах:
/etc/php/7.4/apache2/php.ini
/etc/php/7.4/fpm/php.ini
По умолчанию там стоит лишь 128M.
Также нужно в файл /etc/php/7.4/mods-available/apcu.ini добавить вот такую строчку:
apc.enable_cli = 1
Иначе будет вылазить ошибка при попытке запустить обновлялку:
Memcache \OC\Memcache\APCu not available for local cache (Is the matching PHP module installed and enabled?)
Остальных настроек по умолчанию хватит, чтобы просто накатывать обновления и проверять работоспособность. После внесённых изменений в конфиги не забываю перезапустить:
service php7.4-fpm restart
service apache2 restart
Теперь, когда всё готово для Nextcloud, надо сначала попробовать его чистую установку, и если что-то где-то не так, то грубые ошибки сразу вылезут. Скачиваю 21-й релиз:
wget https://download.nextcloud.com/server/releases/nextcloud-21.0.9.tar.bz2
Распаковываю в нужный каталог:
tar -xjf nextcloud-21.0.9.tar.bz2 -C /var/www/html
Находясь в каталоге /var/www/html выполняю команды для назначения верных прав:
chown -R www-data:www-data nextcloud
find nextcloud/ -type d -exec chmod 750 {} \;
find nextcloud/ -type f -exec chmod 640 {} \;
И пробую зайти по адресу https://cloud2.mydomain.ru. Вижу вот такую картинку:
Заполняю поля. Название БД, пользователя БД и его пароль вписываю те самые, что заводил выше при создании MySQL базы данных. И жму «Установить»:
И если всё прошло успешно, то откроется интерфейс Nextcloud. А это значит, что грубых ошибок при настройке сервера не допущено, и можно пробовать переносить Nextcloud со старого сервера на промежуточный и дальше ставить обновления.
А со старого сервера нужен будет диск с данными пользователей, который монтируется в /var/www/html/nextcloud/data, нужен конфиг /var/www/html/nextcloud/config/config.php и MySQL база данных. В документации написано, как её выгрузить и восстановить:
https://docs.nextcloud.com/server/latest/admin_manual/maintenance/backup.html
https://docs.nextcloud.com/server/latest/admin_manual/maintenance/restore.html
Но выше я писал скрипт по бэкапированию каталога и БД Nextcloud, поэтому просто воспользуюсь им. С машины на машину архив с БД можно перенести через WinSCP например. Ну и диск с данными пользователей я просто отстегну от одной виртуальной машины и пристегну к другой. Затем узнаю UUID раздела командой:
blkid
И затем в /etc/fstab добавлю строчку:
UUID=f98765a3-fc90-4567-a678-d789100a0cd4 /var/www/html/nextcloud/data ext4 defaults 0 2
Теперь нужно затереть БД, в которую залилась чистая установка Nextcloud и залить на её место архив БД со старого сервера. Но сначала надо её разжать:
gunzip nextcloud-SQLbkp_2025-02-25_13-23.bak.gz
И после этого залить на место. Делаю это так:
mysql -h localhost -u root -pMySQLrootpass -e "FLUSH TABLES"
mysql -h localhost -u root -pMySQLrootpass -e "DROP DATABASE nextcloud"
mysql -h localhost -u root -pMySQLrootpass -e "CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -h localhost -u root -pMySQLrootpass -e "GRANT ALL PRIVILEGES ON nextcloud.* TO 'oc_Admin'@'localhost'"
mysql -h localhost -u root -pMySQLrootpass -e "FLUSH PRIVILEGES"
mysql -h localhost -u oc_Admin -pNextcloudMySQLpass nextcloud < nextcloud-SQLbkp_2025-02-25_13-23.bak
Этими командами сделал:
- закрыл все открытые или используемые таблицы и сбрасил кэш.
- удалил БД nextcloud
- создал пустую БД nextcloud
- дал на эту БД полные права пользователю oc_Admin
- и уже под пользователем oc_Admin залил в эту пустую БД архив, выгруженный со старого сервера.
Есть ещё один нюанс, который нужно не забыть: в конфиге /var/www/html/nextcloud/config/config.php со старого сервера нужно поправить строчки:
'trusted_domains' =>
array (
0 => 'cloud2.mydomain.ru',
),
'overwrite.cli.url' => 'https://cloud2.mydomain.ru',
И затем обновляюсь по прежней схеме: 20.0.14 -> 21.0.9 -> 22.2.10 -> 23.0.12 -> 24.0.12. Но, дойдя до релиза 21.0.9 и проверяя работоспособность, я зашёл в параметры и увидел там вот такое сообщение:
Поэтому перехожу в каталог /var/www/html/nextcloud и выполняю такие команды:
sudo -u www-data php occ maintenance:mode --on
sudo -u www-data php occ db:convert-filecache-bigint
sudo -u www-data php occ maintenance:mode --off
Преобразование прошло быстро, хоть в сообщении и было написано о продолжительном времени.
В итоге дошёл до релиза 24.0.12, и дальше нужно php8.0. Чтобы его поставить, нужно подключить доп.репозиторий. Подключаю:
echo "deb https://packages.sury.su/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list
Добавляю ключ для этого репозитория:
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB188E2B695BD4743' | sudo apt-key add -
Тут стоит обратить внимание, что адрес репозитория packages.sury.su, а не packages.sury.org. Причина описана тут:
Ставлю php8.0 и необходимые расширения:
apt install libapache2-mod-php8.0 php8.0 php8.0-gd php8.0-mysql php8.0-curl php8.0-mbstring php8.0-intl php8.0-gmp php8.0-bcmath php8.0-xml php8.0-imagick php8.0-zip php8.0-apcu php8.0-memcached php8.0-redis php8.0-fpm
Останавливаю вэб-сервер и php7.4-fpm
service apache2 stop
service php7.4-fpm stop
Теперь выбираю, какой PHP использовать по умолчанию:
update-alternatives --config php
Когда установлено много разных версий, то это будет выглядеть так:
Нужно указать цифру, соответствующую нужной версии.
Не забываю про параметры memory_limit = 512M и apc.enable_cli = 1 которые я правил в php7.4 — теперь их нужно прописать уже в конфигах php8.0. Это уже соответственно:
/etc/php/8.0/apache2/php.ini
/etc/php/8.0/fpm/php.ini
/etc/php/8.0/mods-available/apcu.ini
Теперь надо у Апача отключить php7.4-fpm и включить php8.0-fpm. Это делается командами:
a2disconf php7.4-fpm
a2enconf php8.0-fpm
Всё, теперь запускаю Apache и php8.0-fpm
service php8.0-fpm start
service apache2 start
И потом захожу в интерфейс Nextcloud, в его параметры, в меню «Система». И вижу там php8.0, значит всё хорошо.
Перейдя на php8.0 продолжаю накатывать релиз за релизом: 24.0.12 -> 25.0.13 -> 26.0.13 -> 27.1.11
И вот, дойдя до релиза 27.1.11 пора снова обновлять PHP. Делаю всё, как при обновлении до 8.0: останавливаю Apache и php8.0-fpm, и ставлю пакеты уже версии 8.2:
apt install libapache2-mod-php8.2 php8.2 php8.2-gd php8.2-mysql php8.2-curl php8.2-mbstring php8.2-intl php8.2-gmp php8.2-bcmath php8.2-xml php8.2-imagick php8.2-zip php8.2-apcu php8.2-memcached php8.2-redis php8.2-fpm
Как и в прошлый раз, выбираю 8.2 по умолчанию, правлю конфиги php для 8.2, отключаю у Апача php8.0-fpm и включаю php8.2-fpm – всё абсолютно аналогично, как делал при обновлении до 8.0.
Обновляюсь далее: 27.1.11 -> 28.0.14 -> 29.0.12
Этап 4. Конечный сервер для актуального релиза.
И вот пришло время, чтобы настроить сервер для размещения последнего актуального релиза Nextcloud. Здесь уже будет MySQL 8.4 и php8.3 в соответствии с рекомендациями:
https://docs.nextcloud.com/server/30/admin_manual/installation/system_requirements.html
Во многом настройка этого сервера будет совпадать с настройкой сервера на предыдущем этапе, поэтому буду краток в тех местах, которые уже затрагивались.
Подключение репозитория MySQL:
apt install gnupg
wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
dpkg -i mysql-apt-config_0.8.33-1_all.deb
Тут ничего не меняю, нужный мне вариант выбран по умолчанию:
Ставлю MySQL сервер:
apt update
apt install mysql-server
В процессе установки будет запрос на создание рутового пароля для MySQL. После установки MySQL запускаю mysql_secure_installation.
Базу данных пока не создаю – сделаю это, когда буду переносить архив БД с промежуточного сервера.
Ставлю Redis:
apt install redis-server
Переношу конфиг с промежуточного сервера и даю верные права на него:
chown redis:redis /etc/redis/redis.conf
chmod 640 /etc/redis/redis.conf
Пробую запустить/перезапустить redis сервер:
systemctl restart redis-server
и иду смотреть, всё ли в порядке в его логе /var/log/redis/redis-server.log. А там есть занятный момент:
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328.
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
Ну тут всё понятно. Делаю что он просит:
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
и перезапускаю redis-server.
Теперь подключаю репозиторий PHP:
echo "deb [signed-by=/etc/apt/keyrings/php.gpg] https://packages.sury.su/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB188E2B695BD4743' | sudo apt-key add -
apt-key export 95BD4743 | gpg --dearmour -o /etc/apt/keyrings/php.gpg
Обновляю данные о пакетах и ставлю всё необходимое для Nextcloud:
apt update
apt install apache2 libapache2-mod-php8.3 php8.3 php8.3-gd php8.3-mysql php8.3-curl php8.3-mbstring php8.3-intl php8.3-gmp php8.3-bcmath php8.3-xml php8.3-imagick php8.3-zip php8.3-apcu memcached libmemcached-tools php8.3-memcached php8.3-redis php8.3-fpm libmagickcore-6.q16-6-extra librsvg2-bin
Включаю нужные модули апачу:
a2enmod headers proxy proxy_fcgi rewrite socache_shmcb ssl
Включить конфу php-fpm в апаче:
a2enconf php8.3-fpm
На этом моменте можно перезагрузить сервер.
После загрузки переношу конфиг /etc/apache2/sites-available/000-default.conf с промежуточного сервера. Не забываю там поправить строчки:
ServerName cloud3.mydomain.ru
Redirect permanent /https://cloud3.mydomain.ru/
Не забываю поправить права на этот файл, если они изменились в процессе переноса:
chown root:root /etc/apache2/sites-available/000-default.conf
А ещё, не забываю положить сертификат и ключ в папку, указанную в конфиге: /etc/pki. Напомню, что сертификат у меня уже был куплен. На этот каталог и его содержимое тоже не забыть сделать права:
chown -R root:root /etc/pki
Проверяю, что php8.3 у меня выбран по умолчанию в системе:
update-alternatives --config php
В конфиги php вношу обязательные параметры memory_limit = 512M и apc.enable_cli = 1 которые я правил в конфигах всех прежних php. Теперь это уже конфиги php8.3:
/etc/php/8.3/apache2/php.ini
/etc/php/8.3/fpm/php.ini
/etc/php/8.3/mods-available/apcu.ini
Перезапускаю php-fpm и apache:
service php8.3-fpm restart
service apache2 restart
Что ж, теперь переношу БД с промежуточного сервера и заливаю её на место:
gunzip nextcloud-SQLbkp_2025-02-26_13-30.bak.gz
mysql -h localhost -u root -pMySQLrootpass -e "CREATE USER 'oc_Admin'@'localhost' IDENTIFIED BY 'NextcloudMySQLpass'"
mysql -h localhost -u root -pMySQLrootpass -e "CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -h localhost -u root -pMySQLrootpass -e "GRANT ALL PRIVILEGES ON nextcloud.* TO 'oc_Admin'@'localhost'"
mysql -h localhost -u root -pMySQLrootpass -e "FLUSH PRIVILEGES"
mysql -h localhost -u oc_Admin -pNextcloudMySQLpass nextcloud < nextcloud-SQLbkp_2025-02-26_13-30.bak
Скачиваю и распаковываю архив с последним релизом на своё место:
wget https://download.nextcloud.com/server/releases/nextcloud-30.0.6.tar.bz2
tar -xjf nextcloud-30.0.6.tar.bz2 -C /var/www/html
Скачиваю и распаковываю архив с коннектором Onlyoffice в каталог приложений:
wget https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v9.6.0/onlyoffice.tar.gz
tar -xf onlyoffice.tar.gz -C /var/www/html/nextcloud/apps
Создаю каталог data:
mkdir /var/www/html/nextcloud/data
Копирую конфиг Nextcloud из предыдущего релиза:
cp /home/myuser/distrib/config.php /var/www/html/nextcloud/config/config.php
Не забываю поправить строчки в этом конфиге:
'trusted_domains' =>
array (
0 => 'cloud3.mydomain.ru',
),
'overwrite.cli.url' => 'https://cloud3.mydomain.ru',
Назначаю верные права. Находясь в каталоге /var/www/html нужно выполнить команды:
chown -R www-data:www-data nextcloud
find nextcloud/ -type d -exec chmod 750 {} \;
find nextcloud/ -type f -exec chmod 640 {} \;
После назначения прав надо пристегнуть диск с данными пользователей. Его я отключил от промежуточного сервера и подключил к этому. Как и в прошлый раз, сразу прописываю его в fstab:
UUID=f98765a3-fc90-4567-a678-d789100a0cd4 /var/www/html/nextcloud/data ext4 defaults 0 2
И монтирую:
mount -a
И, находясь в каталоге /var/www/html, запускаю команды обновления:
sudo -u www-data php ./nextcloud/occ upgrade
sudo -u www-data php ./nextcloud/occ db:add-missing-columns
sudo -u www-data php ./nextcloud/occ db:add-missing-indices
sudo -u www-data php ./nextcloud/occ db:add-missing-primary-keys
Пробую зайти после обновления, смотрю данные в меню «Система»:
Заключительный штрих – это включение задание cron для nextcloud:
crontab -u www-data -e
в открывшемся файле надо добавить строчку:
*/5 * * * * php -f /var/www/html/nextcloud/cron.php
и сохранить изменения.
После обновления есть один подвох. Например, пока я обновлял сервер, кто-то мог редактировать/удалять/добавлять файлы локально. Имеется ввиду те файлы, которые синхронизируются через desktop клиента. Вот что по этому поводу сказано в документации:
По умолчанию сервер Nextcloud считается авторитетным источником данных. Если данные на сервере и клиенте различаются, клиенты по умолчанию будут извлекать данные с сервера. Но состояние клиентов может быть более актуальным, чем состояние сервера. В этом случае также обязательно запустите команду maintenance:data-fingerprint после этого. Она изменяет логику алгоритма синхронизации, чтобы попытаться восстановить как можно больше данных. Поэтому файлы, отсутствующие на сервере, восстанавливаются с клиентов, и в случае разного контента пользователи будут опрошены.
Поэтому, до подключения всех клиентов, находясь в каталоге /var/www/html/nextcloud посылаю команду:
sudo -u www-data php occ maintenance:data-fingerprint
И если конфликтующие версии файлов есть, то клиент выдаст такое предупреждение:
После нажатия кнопки «Разрешить конфликты», будет предложен выбор о том, какую версию файла сохранить:
Оптимизация и тюнинг.
Если пользователей более 1000, то при входе в Nextcloud всплывает сообщение:
Используется сборка Nextcloud для сообщества. Данная сборка не поддерживается и имеет ограниченный функционал push-уведомлений.
Вот здесь подсказали, как обойти проблему:
https://help.nextcloud.com/t/hide-disable-community-warning/135199/4
В файле /var/www/html/nextcloud/lib/private/Notification/Manager.php нужно поиском по “countSeenUsers” найти строку:
$isFairUse = $this->subscription->delegateHasValidSubscription() || $this->userManager->countSeenUsers() < 1000;
И увеличить значение 1000 на большее, например на 10000.
Теперь про оптимизацию производительности. Для этого есть отдельная страница в документации:
https://docs.nextcloud.com/server/30/admin_manual/installation/server_tuning.html
Что касается кэширования, то Memcached и Redis у меня установлены. А чтобы их задействовать, в конфиге /var/www/html/nextcloud/config/config.php есть такие строчки:
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => '127.0.0.1',
'port' => 6379,
),
'memcache.locking' => '\\OC\\Memcache\\Redis',
Сжатие на веб-сервере для файлов JavaScript, CSS и SVG уже включено, за это отвечает модуль deflate. Если он не включен, то включить можно так:
a2enmod deflate
Также предлагается включить HTTP/2 для более быстрой загрузки. Чтобы включить HTTP/2 в Apache 2.4.62, можно следовать таким шагам: отключить старые модули, если они были установлены:
a2dismod php8.3
a2dismod mpm_itk
a2dismod mpm_prefork
Включить новые модули:
a2enconf php8.3-fpm
a2enmod proxy_fcgi setenvif
a2enmod mpm_event
a2enmod http2
Затем перезапуск php-fpm и apache:
service php8.3-fpm restart
service apache2 restart
Дальше предлагается воспользоваться калькулятором и рассчитать оптимальные параметры для php-fpm:
https://spot13.com/pmcalculator/
Тут будет у каждого своё, но в итоге, у себя вношу вот такие изменения в файл /etc/php/8.3/fpm/pool.d/www.conf:
pm = dynamic
pm.max_children = 1024
pm.start_servers = 32
pm.min_spare_servers = 32
pm.max_spare_servers = 1024
php_admin_value[memory_limit] = 1024M
Помимо этого, можно под себя настроить параметры memory_limit, upload_max_filesize и max_file_uploads (максимально разрешённое количество одновременно закачиваемых файлов). Я у себя в конфигах /etc/php/8.3/apache2/php.ini и /etc/php/8.3/fpm/php.ini сделал так:
memory_limit = 1024M
upload_max_filesize = 500M
Далее сказано включить PHP OPcache и сохранение комментариев кода в opcode. Эти параметры включены в php по умолчанию, но проверить лишним не будет. Это параметры:
opcache.enable = 1
opcache.save_comments = 1
в конфигах /etc/php/8.3/apache2/php.ini и /etc/php/8.3/fpm/php.ini.
Вот здесь идёт обсуждение, что значения по умолчанию для параметра opcache.interned_strings_buffer может не хватать:
https://help.nextcloud.com/t/nextcloud-23-02-opcache-interned-strings-buffer/134007
Поэтому нахожу этот параметр в двух вышеупомянутых файлах и ставлю значение 32:
opcache.interned_strings_buffer=32
PHP 8.0 и выше поставляются с JIT-компилятором. Это технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы. Чтобы включить, нужно в файле /etc/php/8.3/mods-available/opcache.ini убрать строчку:
opcache.jit=off
и добавить строчки:
opcache.jit=1255
opcache.jit_buffer_size=16M
После внесения изменений нужно снова перезапустить php-fpm и apache:
service php8.3-fpm restart
service apache2 restart
Когда сервер поработает пару дней, можно приступить к оптимизации MySQL с помощью скрипта MySQLTuner - он анализирует работу MySQL и выводит рекомендации по его оптимизации. MySQLTuner оценивает статистику работы, конфигурацию MySQL и предлагает изменения параметров для повышения производительности и стабильности сервера. Официальная страница тут:
https://github.com/major/MySQLTuner-perl
И на ней одно из указаний следующее: Важно подождать не менее 24 часов безотказной работы, чтобы получить точные результаты. Фактически, запуск mysqltuner на только что запущенном сервере совершенно бесполезен.
Итак, скачиваю скрипт:
wget http://mysqltuner.pl/ -O mysqltuner.pl
затем запускаю:
perl mysqltuner.pl
после запуска он попросит пользователя и пароль на MySQL. Я ему ввёл рутовый логин и пароль. Скрипт выдаст много всяких параметров, связанных с MySQL для ознакомления, а в конце будет секция "Recommendations", название которой говорит само за себя. В моём случае их было немного, да и не все нужно безукоснительно соблюдать. Я обратил внимание лишь на эти:
innodb_buffer_pool_size (>= 1.4G) if possible.
innodb_redo_log_capacity should be (=32M) if possible, so InnoDB Redo log Capacity equals 25% of buffer pool size.
innodb_log_buffer_size (> 64M)
Я так понял, что эти параметры были мне предложены, исходя из ресурсов сервера (16 логических ядер CPU и 48Gb ОЗУ). Поэтому в файле /etc/mysql/mysql.conf.d/mysqld.cnf добавляю строчки в секцию [mysqld]:
innodb_buffer_pool_size = 1450M
innodb_redo_log_capacity = 32M
innodb_log_buffer_size = 64M
Но перед перезапуском демона mysql сначала включу режим обслуживания у Nextcloud - это на всякий случай, для перестраховки. Находясь в каталоге /var/www/html/nextcloud выполняю команду:
sudo -u www-data php occ maintenance:mode --on
И уже после этого передёргиваю mysqld:
service mysql restart
затем отключаю режим обслуживания у Nextcloud
sudo -u www-data php occ maintenance:mode --off
Вообще, включать режим обслуживания у самого Nextcloud перед изменениями чего-либо, от чего он зависит - это признак хорошего тона.
На этом пока всё. Статья будет дополняться (возможно).
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077
Карта Альфа-Банк:
2200 1539 1357 2013