Инструменты пользователя

Инструменты сайта


service:nextcloud

Содержание

Nextcloud

По ходу инсталляции, будут настроены «pretty URLs» (ссылки без index.php в составе), кэш и настройка аутентификации через LDAP. Fail2ban (утилита против брутфорса) рассматривается в отдельной статье.

Установка и настройка системы и необходимых компонентов

Во время установки Ubuntu Server, отметить для установки SSH Server и LAMP. Выбрать автоустановку обновлений безопасности.

# Войти в режим рута
sudo -i
# Задать статический IP:
nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.7
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
dns-search workgroup

Перезагрузиться.

Зайти в систему по SSH и обновить систему целиком:

sudo -i
apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get autoremove

Установить все необходимые компоненты и, в данном случае, механизм кэширования APCu + Redis и компоненты для автогенерации favicon:

apt-get install php-zip php-xml php-gd php-json php-curl php-mbstring php-bz2 php-intl php-mcrypt php-apcu redis-server php-redis php-imagick libmagickcore-6.q16-6-extra -y
# Обновление PHP на 8.2
apt install php8.2 php8.2-fpm php8.2-bcmath php8.2-bz2 php8.2-curl php8.2-gd php8.2-gmp php8.2-igbinary php8.2-imagick \
php8.2-intl php8.2-ldap php8.2-mbstring php8.2-mcrypt php8.2-mysql php8.2-redis php8.2-simplexml php8.2-smbclient php8.2-xml php8.2-xsl php8.2-zip

Если нужен SMB client (для подключения внешних накопителей в Nextcloud), LDAP и Midnight Commander:

apt-get install smbclient php-ldap mc -y

Клиент

https://nextcloud.com/install/#install-clients

# WebDAV
https://bva.dyndns.info/cloud/remote.php/dav/files/<username>

Установка Nextcloud

# Скачать последнюю версию
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# Распаковать архив в корневую папку веб-сервера
tar xjf latest.tar.bz2 --strip=1 -C /var/www/html
# Удалить исходный архив (если нужно)
rm latest.tar.bz2
# Создать папку для пользовательских данных
mkdir /var/nextcloud-data
# Дать права владельца веб-серверу:
chown -R www-data:www-data /var/www/html /var/nextcloud-data
# Перезапустить Apache:
systemctl restart apache2
# Создать базу MySQL с именем "nextcloud":
mysql -u root -p -e "create database nextcloud";

Открыть браузер, зайти на веб-интерфейс (здесь: 192.168.1.7), задать логин и пароль админа, путь к папке с данными пользователей (здесь: /var/nextcloud-data) и имя БД (здесь: nextcloud). Либо настроить из командной строки:
FIXME - уточнить, можно ли тут обойтись без паролей

sudo -u www-data php /var/www/html/occ maintenance:install --database "mysql" --data-dir "/var/nextcloud-data" --database-name "nextcloud" --database-user "root" --database-pass "password" --admin-user "admin" --admin-pass "password"

Настройка

# Убрать закрывающую строку из конфига и заменить строку overwrite.cli.url на нужную.
# В sed экранирование апострофа безумное - '"'"'
sed -i '
/);/d
/overwrite.cli.url/c \'"'"'overwrite.cli.url\'"'"' => \'"'"'https://192.168.1.7\'"'"',' /var/www/html/config/config.php
 
# Настроить конфиг - "pretty URLs", кэширование, часовой пояс для логов и их ротацию (100 МБ)
echo "'htaccess.RewriteBase' => '/',
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
 'redis' => array(
      'host' => 'localhost',
      'port' => 6379,
       ),
'logtimezone' => 'Europe/Moscow',
'log_rotate_size' => 104857600,
);" >> /var/www/html/config/config.php
 
# Настроить максимальный размер файла на закачку в PHP и лимит памяти
# Проверить версию PHP и путь к используемым php.ini (php --ini), например, он может быть
# /etc/php/7.3/fpm/php.ini. Есть ещё
# /etc/php/7.3/cli/php.ini.
sed -i '
/upload_max_filesize =/c upload_max_filesize = 4G
/post_max_size =/c post_max_size = 4G
/memory_limit =/c memory_limit = 512M' /etc/php82/php.ini
 
# Настроить параметры opcache
sed -i '
/opcache.enable=/c opcache.enable=1
/opcache.enable_cli=/c opcache.enable_cli=1
/opcache.memory_consumption=/c opcache.memory_consumption=128
/opcache.interned_strings_buffer=/c opcache.interned_strings_buffer=8
/opcache.max_accelerated_files=/c opcache.max_accelerated_files=10000
/opcache.revalidate_freq=/c opcache.revalidate_freq=1
/opcache.save_comments=/c opcache.save_comments=1
/opcache.interned_strings_buffer=/c opcache.interned_strings_buffer=16
' /etc/php82/php.ini

Список часовых поясов для PHP

SSL, mod_env и mod_rewrite для pretty URLs

a2enmod ssl headers env rewrite && a2ensite default-ssl

Включить Strict transport security, Referrer Policy и Forward secrecy:

echo "<IfModule mod_headers.c>
 Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"
 Header always set Referrer-Policy "no-referrer-when-downgrade"
</IfModule>
 
# Set Forward Secrecy
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder on
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
" >> /etc/apache2/sites-available/default-ssl.conf

Перенаправить HTTP на HTTPS

nano /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
ServerName www.yourdomain.com
Redirect / https://www.yourdomain.com/
</VirtualHost>
systemctl restart apache2

Настроить Pretty URLs

nano /etc/apache2/apache2.conf
 
# В разделе <Directory /var/www> изменить параметр AllowOverride None на AllowOverride All
# Выйти из редактора.
 
# Обновить файл .htaccess:
sudo -u www-data php /var/www/html/occ maintenance:update:htaccess
 
# Перезапустить Apache:
systemctl restart apache2

Переключить фоновые задачи на выполнение кроном

echo "# Nextcloud cron schedule" >> /etc/crontab
echo "*/15  *  *  *  * www-data php -f /var/www/html/cron.php" >> /etc/crontab
 
sudo -u www-data php /var/www/html/occ background:cron

https://docs.nextcloud.com/server/13/admin_manual/configuration_server/background_jobs_configuration.html

Выключить ненужные ссылки

config/config.php:

# Выключить ссылку на сброс пароля
'lost_password_link' => 'disabled',
# Remove link “Get your own free account”
'simpleSignUpLink.shown' => false,

Настроить аутентификацию через LDAP

Для работы этого типа аутентификации необходимо установить компонент php-ldap, если он не был установлен ранее:

apt-get install php-ldap -y

Далее настройка производится в веб-интерфейсе админа.

Онлайн-офис

# Collabora (довольно тормозной вариант)
sudo -u www-data php /var/www/html/occ app:install richdocumentscode richdocuments
 
# OnlyOffice (ограничение в 20 соединений в бесплатной версии)
sudo -u www-data php /var/www/html/occ app:install documentserver_community onlyoffice

Для OnlyOffice, добавить в /var/www/html/config/config.php:

  'onlyoffice' =>
  array (
    'verify_peer_off' => true,
  ),
  'allow_local_remote_servers' => true,

OnlyOffice - работа через прокси: https://helpcenter.onlyoffice.com/ru/installation/docs-community-proxy.aspx

«Неизвестная ошибка» при открытии документа - нужно в конфиге Nextcloud

'overwriteprotocol' => 'https', (add)
'overwrite.cli.url' => 'https' (change)

https://github.com/nextcloud/docker/issues/975

Внешние хранилища

S3

Способ доступа - Access key
Bucket - каталог в облаке, например, Media
Hostname - s3.cloud.mts.ru
Port - 443
Region - пусто
✔ Enable SSL
✔ Enable path style

SMB (CIFS)

Host - [IP address]
Share - Files (имя общего ресурса)
Remote subfolder - Отдел продаж\Группа впаривания\Обмен
Domain - example.com

Обновление

# Автоматически:
sudo -u www-data php /var/www/html/updater/updater.phar
 
# Вручную:
# Скачать последний релиз
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# Распаковать скачанный архив в папку установки
tar xjf latest.tar.bz2 --strip=1 -C /var/www/html
# Дать права владельца веб-серверу:
chown -R www-data:www-data /var/www/html
# Включить режим обслуживания
sudo -u www-data php /var/www/html/occ maintenance:mode --on
# Запустить процесс обновления
sudo -u www-data php /var/www/html/occ upgrade
# Выключить режим обслуживания
sudo -u www-data php /var/www/html/occ maintenance:mode --off

https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html

Экспресс-обновление со сменой шлюза

ip route change default via 192.168.1.254 dev eth0
apt update && apt upgrade -y && apt autoremove -y
sudo -u www-data php /var/www/html/updater/updater.phar --no-interaction
ip route change default via 192.168.1.1 dev eth0

Обновление на след. мажорный релиз

# Нужно переключиться на бета-канал обновлений, обновляться, а затем переключиться обратно.
sudo -u www-data php /var/www/html/cloud/occ config:system:set updater.release.channel --value=beta
sudo -u www-data php /var/www/html/cloud/updater/updater.phar --no-interaction
sudo -u www-data php /var/www/html/cloud/occ config:system:set updater.release.channel --value=stable

В Докере

docker exec nc-php sudo -u www-data php /var/www/html/cloud/occ config:system:set updater.release.channel --value=beta
docker exec nc-php sudo -u www-data php /var/www/html/cloud/updater/updater.phar --no-interaction
docker exec nc-php sudo -u www-data php /var/www/html/cloud/occ config:system:set updater.release.channel --value=stable

Обновление всех приложений

sudo -u www-data php /var/www/html/cloud/occ app:update --all
# docker
docker exec -uwww-data nc-php php /var/www/html/cloud/occ app:update --all

Настройка кэширования через сервер Redis

Как-то раз произошла ситуация - невозможно было стереть файл с сервера или обновить его, файл был заблокирован:

file is locked
Error transferring bva.dyndns.info/cloud/remote.php/dav/files/user/123.txt - server replied: Locked («123.txt» is locked)

В соответствующем howto советуют обнулить таблицу блокировок в базе mysql, а чтобы ситуация не повторялась, рекомендуют поставить кэширующий сервис Redis. Так как у меня уже был APCu, было решено поставить Redis для блокировок, а APCu оставить для локального кэша.

В Ubuntu это ставится просто, а в Armbian в репозитории отсутствуют соответствующие пакеты, так что пришлось их собирать из исходников.

Установить Redis

Информация устарела, в репозиториях для процессоров ARM появились собранные пакеты.
Теперь достаточно выполнить команду
apt-get install redis-server php-redis

Сборка из исходников

Настройка Nextcloud и разблокировка файлов

Конфиг Nextcloud в части кэширования нужно привести к следующему виду:

'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
 'redis' => array(
      'host' => 'localhost',
      'port' => 6379,
       ),
# Перевести Nextcloud в режим обслуживания:
sudo -u www-data php /var/www/html/occ maintenance:mode --on
# Зайти в базу "cloud" и очистить блокировки:
mysql -u root -p cloud
DELETE FROM oc_file_locks WHERE 1;
quit
# Вывести Nextcloud из режима обслуживания:
sudo -u www-data php /var/www/html/occ maintenance:mode --off
# Перезапустить Apache:
systemctl restart apache2

Дополнительные материалы

Сертификаты

#Сделать папочку для сертификатов
mkdir /etc/ssl/certs/nextcloud
# самоподписанный сертификат на 10 лет без запроса пароля
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/nextcloud/nextcloud.key -out /etc/ssl/certs/nextcloud/nextcloud.crt
nano /etc/apache2/sites-available/default-ssl.conf
SSLCertificateKeyFile /etc/ssl/certs/nextcloud/nextcloud.key
SSLCertificateFile /etc/ssl/certs/nextcloud/nextcloud.crt
#SSLCACertificateFile /etc/ssl/certs/nextcloud/nextcloud-int.crt

FIXME

sed -i '
/SSLCertificateKeyFile/c SSLCertificateKeyFile /etc/ssl/certs/nextcloud/nextcloud.key
/SSLCertificateFile/c SSLCertificateFile /etc/ssl/certs/nextcloud/nextcloud.crt' /etc/apache2/sites-available/default-ssl.conf

Импорт контактов из файла vcf

Проблема: выгруженный файл vcf с мобильника на Android 4.4 не загружается в приложение «Контакты» в Nextcloud.

Решение:

  1. Открыть файл в программе tcode (в Windows), чтобы строки с кодировкой Quoted Printable перекодировались в нормальный русский текст. Это можно сделать и из командной строки:
    tcode input.vcf /auto output.vcf
  2. Убрать из всего файла строки ;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE
  3. Строки VERSION:2.1 заменить на VERSION:3.0
  4. Сохранить файл в кодировке UTF-8.

Ссылка на выгруженные контакты мобильным приложением

https://path-to-nextcloud-site.com/apps/files/?dir=/.Contacts-Backup

Полезные плагины

Плагин для Outlook

Версия 3: https://download.sendent.nl/addin/latest/Free/Free.zip

Устаревший (версии 2)

Автоудаление файлов

  1. Install Automated Tagging and Retention app.
  2. Create a retention-parent tag and tag the /tmp directory with it.
  3. Create tags like auto-delete-two-weeks and use those for the retention settings (Admin>Workflow>File retention)
  4. Create an automation tagging rule which tags files with eg. auto-delete-two-weeks. As a condition choose that they must be tagged with retention-parent (files created inside the /tmp directory will have this retention-parent tag).
  5. Test it by uploading a file to /tmp and check whether auto-delete-two-weeks has been attached to it.

https://www.maxi-muth.de/3236/allgemeines/auto-delete-files-in-a-directory-after-a-certain-time-in-nextcloud/

В автотэге не работает выбор плагина Outlook - метки не назначаются. Если сделать по старинке через regex, то всё нормально (для старой версии плагина Outlook, для новой работает).

Request user agent - matches - ((Mozilla\/).*( \().*(\))( Nextcloud-Outlook v).*)

https://nextcloud.com/blog/controlling-file-retention-on-files-uploaded-with-the-outlook-add-in/

Снежок

https://nextcloud.com/blog/holiday-fun-with-jsloader/

Установить плагин JSLoader, загрузить туда следующий код:

snow.js

Полезные команды

Включить превью офисных форматов:

nano /var/www/html/config/config.php
'preview_libreoffice_path' => '/usr/bin/libreoffice',

Перемещение файлов от одного пользователя к другому

sudo -u www-data php /var/www/html/occ files:transfer-ownership --move user-from user-to

https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/occ_command.html#transfer

Удалить пользователя username:

sudo -u www-data php /var/www/html/occ user:delete username

Почистить корзину у всех пользователей

sudo -u www-data php /var/www/html/cloud/occ trashbin:cleanup --all-users

Решение проблем

Failed to connect to www.nextcloud.com

В логах куча сообщений:
GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect to www.nextcloud.com port 80: Connection timed out

Сайт nexcloud.com реально бывает недоступен. Workaround - отключить проверку на наличие интернета:

echo "'has_internet_connection' => false," >> /var/www/html/config/config.php

Или не обращать внимания.

Some files have not passed the integrity check

После обновления - ошибка подписи файлов:
Some files have not passed the integrity check. Further information on how to resolve this issue can be found in the documentation. (List of invalid files… / Rescan…)

Помимо выполнения рекомендаций, убедиться, что core/signature.json актуальный.

Поломались "красивые" ссылки (без index.php)

Обновить файл .htaccess:

sudo -u www-data php /var/www/html/occ maintenance:update:htaccess

https://docs.nextcloud.com/server/14/admin_manual/installation/source_installation.html#pretty-urls

Specified key was too long; max key length is 767 bytes

При обновлении Nexcloud ошибка:
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ENGINE = InnoDB ROW_FORMAT = compressed': SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Решение:

mysql -u root -p cloud
 
MariaDB [cloud]> set global innodb_large_prefix=on;
MariaDB [cloud]> set global innodb_file_format=Barracuda;
quit
 
sudo -u www-data php /var/www/html/occ maintenance:repair
sudo -u www-data php /var/www/html/occ upgrade

The database is missing some indexes

Проверка в админке пишет: The database is missing some indexes

Решение:

sudo -u www-data php /var/www/html/occ db:add-missing-indices
# В докере:
docker exec -u www-data nc php occ db:add-missing-indices

Обновление прошло неуспешно, PHP грузит систему на 100%, сайт в неотключаемом maintenance mode

Отключить регулярную задачу в crontab.

# Проверить, включен ли apc cli:
php -i | grep apc.enable
  apc.enable_cli => Off => Off
  apc.enabled => On => On
# Если нет, то включить
echo "apc.enable_cli=1" >> /etc/php/7.4/cli/php.ini
# Перейти в каталог NC (обязательно!) и запустить апгрейд заново
cd /var/www/html/cloud
sudo -u www-data php occ upgrade

Включить регулярную задачу в crontab.

https://help.nextcloud.com/t/nextcloud-21-update-needed/108714/25

Your installation has no default phone region set

sudo -u www-data php /var/www/html/occ config:system:set default_phone_region --value="RU"
# Докер
docker exec -u www-data nc php occ config:system:set default_phone_region --value="RU"

Last background job execution ran 15 hours ago. Something seems wrong

Запустить принудительно

sudo -u www-data php -f /var/www/html/cloud/cron.php

PHP Fatal error: Out of memory (allocated 3533701120) (tried to allocate 36864 bytes) in /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php on line 133

При выполнении PHP cron.

I had APCu activated in the nextcloud config.php. It seems I didn’t have apc.enable_cli=1 in /etc/php/8.0/cli/conf.d/20-apcu.ini. After I added that line to the file occ worked and there was no segmentation error anymore.

https://help.nextcloud.com/t/solved-occ-command-php-fatal-error-allowed-memory-size-of-xxx-bytes-exhausted/108521/16

Docker - The reverse proxy header configuration is incorrect

Warning: The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If not, this is a security issue and can allow an attacker to spoof their IP address as visible to the Nextcloud. Further information can be found in the documentation.

docker exec -uwww-data nc-php php /var/www/html/cloud/occ config:system:set forwarded_for_headers 0 --value="X-Forwarded-For"
# docker exec -uwww-data nc-php php /var/www/html/cloud/occ config:system:set forwarded_for_headers 1 --value="HTTP_X_FORWARDED_FOR"
docker exec -uwww-data nc-php php /var/www/html/cloud/occ config:system:set trusted_proxies 0 --value=reverse-proxy
# docker exec -uwww-data nc-php php /var/www/html/cloud/occ config:system:set trusted_proxies 1 --value="172.16.0.0/12"

https://github.com/nextcloud/docker/issues/800
https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html

Docker - exec: "php": executable file not found in $PATH

После обновления контейнера PHP с версии 7.4 на 8.0 при попытке выполнить команду php occ внутри контейнера выдаётся ошибка:
OCI runtime exec failed: exec failed: unable to start container process: exec: «php»: executable file not found in $PATH: unknown

Проблема в том, что в дистрибутиве Alpine автоматически не создаётся символическая ссылка php8 → php, т. к. для php8 не готовы все пакеты. Решение: добавить в Dockerfile

ln -sf /usr/bin/php8 /usr/bin/php # -f - перезаписывать, если она уже есть (после предыдущего создания)

https://scan.nextcloud.com: The __Host prefix mitigates cookie injection vulnerabilities within potential third-party software sharing the same second level domain. It is an additional hardening on top of 'normal' same-site cookies.

Предположительное решение: https://github.com/DoTheEvo/selfhosted-apps-docker/issues/7

Клиент виснет после начала синхронизации

Ситуация - виснет клиент практически сразу после запуска, нагружает процессор, настройки открыть невозможно, в логах ничего внятного, переустановка на разные версии, удаление служебных файлов в каталоге синхронизации ничего не даёт.

Решение:

# убить процесс
Get-Process nextcloud |kill
# запустить синхронизацию с помощью nextcloudcmd
"$env:programfiles\Nextcloud\nextcloudcmd.exe" --silent `
"$env:userprofile\Nextcloud" https://bva.dyndns.info/cloud

Затем запустить клиента, зайти в Настройки → Сеть и убрать ограничения на скорость загрузки/передачи.

https://docs.nextcloud.com/desktop/latest/advancedusage.html#nextcloud-command-line-client

Операция не разрешена модулем контроля доступа

Operation is blocked by access control

Симптом - маленькие файлы грузятся, а больше примерно 10 МБ - нет. Решение - разрешить на реверс-прокси url c /.

https://help.nextcloud.com/t/nextcloud-17-nginx-unable-to-upload-files-larger-than-unknown-size/67624/2

X-Robots-Tag HTTP header is not set

The «X-Robots-Tag» HTTP header is not set to «noindex, nofollow». This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.

Поменять опцию в nginx/conf.d/default.conf

add_header X-Robots-Tag  "none"               always;
# на
add_header X-Robots-Tag  "noindex, nofollow"  always;

Because “none” is indeed equivalent to “noindex, nofollow” for Google, but seems to be not supported by Bing and probably other search engines. (https://help.nextcloud.com/t/x-robots-tag-http-header-not-configured-with-noindex-nofollow-since-nc-26-0-0/158300)

OPcache interned strings buffer is nearly full

The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply opcache.interned_strings_buffer to your PHP configuration with a value higher than 8.

sed -i '/opcache.interned_strings_buffer =/c opcache.interned_strings_buffer = 16/' /etc/php/8.2/fpm/php.ini
systemctl restart php-fpm

OnlyOffice не работает после обновления Nextcloud на версию 28

В логе

Exception array_merge(): Argument #2 must be of type array, null given in file '[...]/lib/public/AppFramework/Http/Response.php' line 273

Временное решение: в файле lib/public/AppFramework/Http/Response.php в строке 273:

return array_merge($mergeWith, $this->headers);
# заменить на
return array_merge($mergeWith, $this->headers?? []);
sed -i '273s/headers.*/headers?? []);/' /var/www/html/lib/public/AppFramework/Http/Response.php

Could not check for JavaScript support

Could not check for JavaScript support. Please check manually if your webserver serves `.mjs` files using the JavaScript MIME type.

https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html

Server has no maintenance window start time configured

Server has no maintenance window start time configured. This means resource intensive daily background jobs will also be executed during your main usage time. We recommend to set it to a time of low usage, so users are less impacted by the load caused from these heavy tasks.

A value of 1 e.g. will only run these background jobs between 01:00am UTC and 05:00am UTC.

'maintenance_window_start' => 1,

https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html#maintenance-window-start
https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html

Ссылки

service/nextcloud.txt · Последнее изменение: 28.02.2024 06:51 — viacheslav

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki