Гайд по установке Nextcloud включая Nextcloud Office на Ubuntu 20.04-22.04 или Debian 11 с nginx, MariaDB, PHP 8.1, Let's Encrypt, Redis, Fail2ban и ufw

В этом руководстве по установке Nextcloud 26 (Hub 4) описывается установка, настройка и усиление, мониторинг и некоторые параметры расширения Nextcloud 26 на сервере Ubuntu 20.04 LTS focal, 22.04 LTS jammy (x86-64) или Debian Server 11 bullseye (x86-64).

Установка основана на компонентах nginx 1.23, Let’s Encrypt TLS 1.3, MariaDB 10.8, PHP 8.1 (php-fpm), Redis, Fail2ban, ufw и Netdata и, наконец, получает рейтинг безопасности A+ как от Nextcloud, так и от Qualys SSL Labs. В ходе этого руководства вам нужно ввести только значения: x.domain.ru и 192.168.2.x с соответствующими значениями вашей системы.


Системные требования со стороны Nextcloud

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


1. Подготовка и установка веб-сервера nginx

Текущий установочный носитель для базового сервера Linux можно найти здесь:

Установка сервера Ubuntu 22.04

Установка сервера Debian 11.x

Ubuntu 22.04.x LTS Загрузить

Debian 11.x Загрузить

Сервер Debian:

su -
apt install -y sudo
usermod -aG sudo <Ihr aktueller Benutzer>
exit

Debian и Ubuntu Server:

Переключение в режим привилегированного пользователя

sudo -s

Установить следующие программные пакеты в качестве необходимой основы для работы сервера:

apt install -y \
apt-transport-https bash-completion bzip2 ca-certificates cron curl dialog \
dirmngr ffmpeg ghostscript git gpg gnupg gnupg2 htop jq libfile-fcntllock-perl \
libfontconfig1 libfuse2 locate lsb-release net-tools rsyslog screen smbclient \
socat software-properties-common ssl-cert tree unzip wget zip

Введите имя будущего сервера как в файл hosts, так и в файл имени хоста (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/hosts):

nano /etc/hosts

Настройте красные значения в соответствии с вашей средой, в примере мы предполагаем, что домен называется «x.domain.ru»:

127.0.0.1 localhost
127.0.1.1 x
::1       ihre ip6-localhost ip6-loopback
[...]

Укажите правильное имя сервера в файле имени хоста и замените значение на свое:

nano /etc/hostname

Имя сервера должно быть указано как FQDN, т.е. полностью:

x.domain.ru

Убедитесь, что служба сервера времени настроена по крайней мере с одной конечной точкой.

nano /etc/systemd/timesyncd.conf

Если строка NTP закомментирована (#NTP=), удалите знак «#» перед NTP и добавьте, например: Добавьте эти два сервера времени:

NTP=ntp1.dismail.ru ntp2.dismail.ru

Сохраните этот файл и перезапустите сервер времени:

systemctl restart systemd-timesyncd

Теперь убедитесь, что сервер не может перейти в «спящий режим»:

systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

Наконец, перезагрузите сервер

reboot now

А затем снова войдите на сервер с правами привилегированного пользователя:

sudo -s

Добавьте в систему дополнительные репозитории программного обеспечения (исходные тексты программного обеспечения), чтобы иметь возможность устанавливать последние выпуски соответствующих пакетов.

Ubuntu Server (только X86_64:

Добавьте в систему репозиторий NGINX и MariaDB, а также PPA PHP на Ubuntu 20.04:

apt install -y ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
     | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
     http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
     | sudo tee /etc/apt/sources.list.d/nginx.list
wget -O- https://mariadb.org/mariadb_release_signing_key.asc \
     | gpg --dearmor | sudo tee /usr/share/keyrings/mariadb-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/mariadb-keyring.gpg] \
     https://mirror.kumi.systems/mariadb/repo/10.8/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mariadb.list

Только Ubuntu 20.04 LTS – PHP-репозитории:

add-apt-repository -y ppa:ondrej/php

Сервер Debian (только X86_64:

Убедитесь, что пакет “debian-archive-keyring” установлен:

apt install -y debian-archive-keyring

Добавьте ключ nginx на свой сервер:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Добавьте исходные тексты программного обеспечения для nginx и PHP:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/php.list

Чтобы иметь возможность доверять исходным кодам PHP, мы также добавляем этот ключ:

wget -qO - https://packages.sury.org/php/apt.gpg | apt-key add -

Подготовка сервера баз данных MariaDB:

wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup && ./mariadb_repo_setup --mariadb-server-version="mariadb-10.8"

Далее он снова продолжается для обеих серверных операционных систем (Ubuntu и Debian):

Сейчас мы обновляем систему и генерируем временные «самоподписанные» сертификаты, которые в дальнейшем будут заменены полноценными сертификатами от Let’s Encrypt.

Обновление сервера:

apt update && make-ssl-cert generate-default-snakeoil -y

Чтобы убедиться, что никакие реликвии предыдущих установок не мешают работе веб-сервера, мы удаляем их:

apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages

Кроме того, мы следим за тем, чтобы аналог (Apache2) веб-сервера nginx не был ни активен, ни установлен.

systemctl stop apache2.service
systemctl disable apache2.service

Теперь подготовка к установке веб-сервера завершена, и мы можем установить его с помощью следующей команды:

apt install -y nginx

и служба, которая будет запускаться автоматически после перезагрузки системы с помощью

systemctl enable nginx.service

устраивать. С учетом последующих корректировок сохраняется конфигурация по умолчанию и открывается новый конфигурационный файл (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/nginx.conf):

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
touch /etc/nginx/nginx.conf && nano /etc/nginx/nginx.conf

Скопируйте в файл все следующее содержимое:

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
  worker_connections 2048;
  multi_accept on; use epoll;
  }
http {
  log_format criegerde escape=json
  '{'
    '"time_local":"$time_local",'
    '"remote_addr":"$remote_addr",'
    '"remote_user":"$remote_user",'
    '"request":"$request",'
    '"status": "$status",'
    '"body_bytes_sent":"$body_bytes_sent",'
    '"request_time":"$request_time",'
    '"http_referrer":"$http_referer",'
    '"http_user_agent":"$http_user_agent"'
  '}';
  server_names_hash_bucket_size 64;
  access_log /var/log/nginx/access.log criegerde;
  error_log /var/log/nginx/error.log warn;
  set_real_ip_from 127.0.0.1;
  real_ip_header X-Forwarded-For;
  real_ip_recursive on;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  sendfile on;
  send_timeout 3600;
  tcp_nopush on;
  tcp_nodelay on;
  open_file_cache max=500 inactive=10m;
  open_file_cache_errors on;
  keepalive_timeout 65;
  reset_timedout_connection on;
  server_tokens off;
  resolver 127.0.0.53 valid=30s;
  resolver_timeout 5s;
  include /etc/nginx/conf.d/*.conf;
  }

Если вы запускаете Nextcloud за обратным прокси-сервером, замените IP-адрес параметра «set_real_ip_from 127.0.0.1» IP-адресом обратного прокси-сервера («set_real_ip_from w.x.y.z»).

Сохраните файл и закройте его, чтобы перезапустить веб-сервер:

systemctl restart nginx.service

При подготовке к SSL-сертификатам и веб-каталогам мы создаем четыре папки и устанавливаем правильные разрешения:

mkdir -p /var/log/nextcloud /var/nc_data /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
chown -R www-data:www-data /var/nc_data /var/www /var/log/nextcloud

Таким образом, установка веб-сервера уже завершена, и мы приступаем к установке и настройке PHP.


2. Установка и настройка PHP 8.1 (fpm)

Репозиторий PHP уже настроен и активирован в предыдущей главе, поэтому мы можем сразу приступить к его установке.

apt update && apt install -y php-common \
php8.1-{fpm,gd,curl,xml,zip,intl,mbstring,bz2,ldap,apcu,bcmath,gmp,imagick,igbinary,mysql,redis,smbclient,cli,common,opcache,readline} \
imagemagick --allow-change-held-packages

Опционально (для планируемого использования общих ресурсов Samba и/или cifs или подключения LDAP(s)):

apt install -y ldap-utils nfs-common cifs-utils

Установите правильный формат даты, чтобы включить правильное ведение журнала:

timedatectl set-timezone Europe/Moscow

Прежде чем мы приступим к оптимизации PHP, давайте сделаем резервную копию конфигурационных файлов:

cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/www.conf.bak
cp /etc/php/8.1/fpm/php-fpm.conf /etc/php/8.1/fpm/php-fpm.conf.bak
cp /etc/php/8.1/cli/php.ini /etc/php/8.1/cli/php.ini.bak
cp /etc/php/8.1/fpm/php.ini /etc/php/8.1/fpm/php.ini.bak
cp /etc/php/8.1/fpm/php-fpm.conf /etc/php/8.1/fpm/php-fpm.conf.bak
cp /etc/php/8.1/mods-available/apcu.ini /etc/php/8.1/mods-available/apcu.ini.bak
cp /etc/php/8.1/mods-available/opcache.ini /etc/php/8.1/mods-available/opcache.ini.bak
cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak
systemctl restart php8.1-fpm.service

Чтобы адаптировать PHP к вашей системе, вычисляются некоторые параметры, просто выполните следующие строки:

AvailableRAM=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
AverageFPM=$(ps --no-headers -o 'rss,cmd' -C php-fpm8.1 | awk '{ sum+=$1 } END { printf ("%d\n", sum/NR/1024,"M") }')
FPMS=$((AvailableRAM/AverageFPM))
PMaxSS=$((FPMS*2/3))
PMinSS=$((PMaxSS/2))
PStartS=$(((PMaxSS+PMinSS)/2))

Теперь выполните все оптимизации ниже, вы также можете найти эти файлы по адресу
» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/php/8.1/fpm/php.ini
» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/php/8.1/fpm/pool.d/www.conf

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.1/fpm/pool.d/www.conf

# Примечание:
# # Следующая строка является необязательной и рекомендуется только при мониторинге::
sed -i 's/pm = dynamic/pm = static/' /etc/php/8.1/fpm/pool.d/www.conf
#

sed -i 's/pm.max_children =.*/pm.max_children = '$FPMS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = '$PStartS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = '$PMinSS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = '$PMaxSS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.1/fpm/php.ini

sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.1/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.1/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.1/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.1/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.1/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Moscow/" /etc/php/8.1/cli/php.ini
sed -i "s/;cgi.fix_pathinfo.*/cgi.fix_pathinfo=0/" /etc/php/8.1/cli/php.ini

sed -i "s/memory_limit = 128M/memory_limit = 1G/" /etc/php/8.1/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.1/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.1/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.1/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10G/" /etc/php/8.1/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10G/" /etc/php/8.1/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Moscow/" /etc/php/8.1/fpm/php.ini
sed -i "s/;cgi.fix_pathinfo.*/cgi.fix_pathinfo=0/" /etc/php/8.1/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.validate_timestamps=.*/opcache.validate_timestamps=1/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=256/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=64/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=100000/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=0/" /etc/php/8.1/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.1/fpm/php.ini

sed -i "s|;emergency_restart_threshold.*|emergency_restart_threshold = 10|g" /etc/php/8.1/fpm/php-fpm.conf
sed -i "s|;emergency_restart_interval.*|emergency_restart_interval = 1m|g" /etc/php/8.1/fpm/php-fpm.conf
sed -i "s|;process_control_timeout.*|process_control_timeout = 10|g" /etc/php/8.1/fpm/php-fpm.conf

sed -i '$aapc.enable_cli=1' /etc/php/8.1/mods-available/apcu.ini

sed -i '$aopcache.jit=1255' /etc/php/8.1/mods-available/opcache.ini
sed -i '$aopcache.jit_buffer_size=256M' /etc/php/8.1/mods-available/opcache.ini

sed -i "s/rights=\"none\" pattern=\"PS\"/rights=\"read|write\" pattern=\"PS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"EPS\"/rights=\"read|write\" pattern=\"EPS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"PDF\"/rights=\"read|write\" pattern=\"PDF\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"XPS\"/rights=\"read|write\" pattern=\"XPS\"/" /etc/ImageMagick-6/policy.xml

Оптимизируем PHP для MariaDB

sed -i '$a[mysql]' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.allow_local_infile=On' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.allow_persistent=On' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.cache_size=2000' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.max_persistent=-1' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.max_links=-1' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.default_port=3306' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.connect_timeout=60' /etc/php/8.1/mods-available/mysqli.ini
sed -i '$amysql.trace_mode=Off' /etc/php/8.1/mods-available/mysqli.ini

Теперь перезапустите обе службы, nginx и PHP:

systemctl restart php8.1-fpm.service nginx.service

PHP теперь также уже установлен и оптимизирован для Nextcloud. Чтобы узнать больше об оптимизации PHP, ознакомьтесь с этой статьей, чтобы узнать больше о возможностях настройки. Теперь начнем с установки и настройки сервера баз данных MariaDB.


3. Установка и настройка MariaDB 10.8

Установка MariaDB выполняется с помощью этой команды:

apt update && apt install -y mariadb-server

Обратите внимание на следующее:
(1) противодействуйте
потенциальным проблемам с помощью apt-mark hold(2) ручного обновления сервера базы данных(3) рекомендации поставщика по обновлению с MariaDB v. 10.6 до v. 10.7 или обновлению
с MariaDB v. 10.7 до v. 10.8

Теперь давайте укрепим сервер базы данных с помощью прилагаемого инструмента «mysql_secure_installation». Для первоначальной установки пароль root отсутствует, поэтому вы можете подтвердить запрос с помощью ENTER. Рекомендуется устанавливать пароль напрямую, соответствующий диалог появится автоматически:

mysql_secure_installation
Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Теперь остановите сервер базы данных, а затем сохраните конфигурацию по умолчанию, чтобы сразу после этого можно было внести коррективы (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/mysql/my.cnf):

systemctl stop mysql
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Скопируйте все следующие строки в пустой файл:

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_read_only_compressed=OFF
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 2000
max_heap_table_size = 64M
myisam_recover_options = BACKUP
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_cache_min_res_unit = 2k
read_buffer_size = 2M
read_rnd_buffer_size = 1M
skip-external-locking
skip-name-resolve
slow_query_log_file = /var/log/mysql/mariadb-slow.log
slow-query-log = 1
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 4M
table_open_cache = 400
thread_cache_size = 128
tmp_table_size = 64M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
#unix_socket=OFF
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M

Сохраните и закройте файл, затем перезапустите сервер базы данных, чтобы настроить базу данных Nextcloud, пользователя Nextcloud и пароль:

systemctl restart mysql.service
mysql -uroot -p
CREATE DATABASE nextclouddb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextclouddbuser@localhost identified by 'nextclouddbpassword'; GRANT ALL PRIVILEGES on nextclouddb.* to nextclouddbuser@localhost; FLUSH privileges; quit;

Объяснение: Database имя: nextclouddb Пользователь базы данных: nextclouddbuser

Пароль пользователя базы данных:
nextclouddbpassword

mysql -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='nextclouddb'"

Если в выходных данных (результирующем наборе) появляются «READ-COMMITTED» и «utf8mb4_general_ci», все настроено правильно, и мы можем приступить к установке Redis.


4. Установка и настройка Redis

Устанавливаем сервер Redis, чтобы повысить производительность Nextcloud, так как Redis снижает нагрузку на базу данных MariaDB Nextcloud:

apt update && apt install -y redis-server

Настройте конфигурацию Redis, создав резервную копию и изменив конфигурацию, выполнив следующие команды (» codeberg: nextcloud/etc/redis/redis.conf at master - criegerde/nextcloud - Codeberg.org):

cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i 's/port 6379/port 0/' /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i 's/unixsocketperm 700/unixsocketperm 770/' /etc/redis/redis.conf
sed -i 's/# maxclients 10000/maxclients 10240/' /etc/redis/redis.conf
sed -i 's/# requirepass foobared/requirepass BitteAendern/' /etc/redis/redis.conf
usermod -aG redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf

Основываясь на достаточном опыте установки, я рекомендую вам перезагрузить весь сервер один раз:

reboot now

Поздравляем, сервер уже установлен и настроен, так что теперь вы можете приступить к настройке Nextcloud.


5. Установка и оптимизация Nextcloud (в т.ч. SSL)

Теперь мы настраиваем различные конфигурационные файлы vhost, т.е. swegeterver, и постоянно модифицируем файл vhost по умолчанию. Поскольку система была ранее перезагружена, мы переключаемся обратно в режим привилегированного пользователя, создаем резервную копию файла vhost по умолчанию с именем default.conf и создаем пустые файлы vHost для настройки.

sudo -s
[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
touch /etc/nginx/conf.d/default.conf
touch /etc/nginx/conf.d/http.conf
touch /etc/nginx/conf.d/nextcloud.conf

Таким образом, пустой файл «default.conf» гарантирует, что эта конфигурация по умолчанию не повлияет на работу Nextcloud даже при более поздних обновлениях веб-сервера.

Создайте глобальный файл vhost, чтобы постоянно перенаправлять стандартные http-запросы на https, а также включить связь SSL-сертификата с Let’sEncrypt (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/conf.d/http.conf):

nano /etc/nginx/conf.d/http.conf

Скопируйте все следующие строки в файл http.conf и настройте значения, отмеченные красным цветом, в соответствии с вашей системой:

upstream php-handler {
server unix:/run/php/php8.1-fpm.sock;
}
map $arg_v $asset_immutable {
"" "";
default "immutable";
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ihre.domain.de;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}

Сохраните и закройте этот файл. Теперь отредактируйте фактический файл Nextcloud vHost nextcloud.conf, который содержит все конфигурации для работы Nextcloud.

nano /etc/nginx/conf.d/nextcloud.conf

Скопируйте все следующие строки в файл nextcloud.conf и настройте значения, отмеченные красным цветом, в соответствии с вашей системой (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/conf.d/nextcloud.conf):

server {
listen 443      ssl http2;
listen [::]:443 ssl http2;
server_name ihre.domain.de;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
client_max_body_size 10G;
client_body_timeout 3600s;
client_body_buffer_size 512k;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
add_header Strict-Transport-Security            "max-age=15768000; includeSubDomains; preload;" always;
add_header Permissions-Policy                   "interest-cohort=()";
add_header Referrer-Policy                      "no-referrer"   always;
add_header X-Content-Type-Options               "nosniff"       always;
add_header X-Download-Options                   "noopen"        always;
add_header X-Frame-Options                      "SAMEORIGIN"    always;
add_header X-Permitted-Cross-Domain-Policies    "none"          always;
add_header X-Robots-Tag                         "noindex, nofollow" always;
add_header X-XSS-Protection                     "1; mode=block" always;
fastcgi_hide_header X-Powered-By;
root /var/www/nextcloud;
index index.php index.html /index.php$request_uri;
location = / {
if ( $http_user_agent ~ ^DavClnt ) {
return 302 /remote.php/webdav/$is_args$args;
}
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav  { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
return 301 /index.php$request_uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }
location ~ \.php(?:$|/) {
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, $asset_immutable";
expires 6M;
access_log off;
location ~ \.wasm$ {
default_type application/wasm;
}
}
location ~ \.woff2?$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}

Сохраните и закройте этот файл, а затем расширьте безопасность сервера и системы за счет возможности безопасного обмена ключами с помощью ключа Диффи-Хеллмана (» git: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/ssl/certs/dhparam.pem):

openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Пожалуйста, наберитесь терпения! Создание может занять несколько минут, в зависимости от производительности системы. Только когда генерация завершена, мы снова перезапускаем веб-сервер.

systemctl restart nginx.service

Теперь мы начинаем «фактическую» установку программного обеспечения Nextcloud и настраиваем SSL-сертификаты Let’s Encrypt с помощью acme. Для этого перейдите в рабочую директорию

cd /usr/local/src

и загрузите последнюю версию Nextcloud:

wget https://download.nextcloud.com/server/releases/latest.tar.bz2
wget https://download.nextcloud.com/server/releases/latest.tar.bz2.md5

Проверьте файлы:

md5sum -c latest.tar.bz2.md5 < latest.tar.bz2

Только если тест подтвердится «ОК», мы продолжим!

Распакуйте программное обеспечение Nextcloud в веб-каталог (var/www), затем установите соответствующее разрешение и удалите загружаемый файл:

tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm -f latest.tar.bz2

Пожалуйста, убедитесь, что ваш сервер доступен извне через порт 80/TCP и порт 443/TCP. Создание и обновление сертификатов Let’s Encrypt является обязательным через http и порт 80! Для работы с сертификатами мы создаем выделенного пользователя и добавляем его в группу www-data:

adduser --disabled-login acmeuser
usermod -a -G www-data acmeuser

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

touch /etc/sudoers.d/acmeuser
cat <<EOF >/etc/sudoers.d/acmeuser
acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service
EOF

Переключитесь на оболочку нового пользователя (acmeuser), чтобы установить программное обеспечение сертификата, и сразу же выйдите из этой оболочки:

su - acmeuser
curl https://get.acme.sh | sh
exit

Настройте соответствующие разрешения для файлов и каталогов, чтобы иметь возможность хранить в них новые сертификаты:

chmod -R 775 /var/www/letsencrypt && chmod -R 770 /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt

Установите Let’s Encrypt в качестве ЦС по умолчанию для вашего сервера

su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"

А затем вернитесь в оболочку нового пользователя

su - acmeuser

Теперь подайте заявку на SSL-сертификаты Let’s Encrypt, заменив ihre.domain.de своим реальным доменом:

acme.sh --issue -d ihre.domain.de --server letsencrypt --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d ihre.domain.de --server letsencrypt --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"

Выход из оболочки нового пользователя

exit

А затем создайте скрипт, который будет проверять и исправлять разрешения в будущем (permissions.sh):

nano /root/permissions.sh

Скопируйте все строки в файл:

#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
if [ -d "/var/www/nextcloud/apps/notify_push" ]; then
chmod ug+x /var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push
fi
chmod -R 775 /var/www/letsencrypt
chmod -R 770 /etc/letsencrypt 
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /var/nc_data
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0

Пометьте сценарий как исполняемый, а затем запустите его напрямую:

chmod +x /root/permissions.sh
/root/permissions.sh

Удалите ранее использовавшиеся самоподписанные сертификаты из nginx и активируйте новые, полноценные и уже действующие SSL-сертификаты из Let’s Encrypt. Затем перезапустите веб-сервер:

sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/nextcloud.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/nextcloud.conf
systemctl restart nginx.service

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

crontab -l -u acmeuser

Теперь мы можем приступить к настройке Nextcloud. Для этого воспользуйтесь следующей командой «тихой» установки:

sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextclouddb" --database-user "nextclouddbuser" --database-pass "nextclouddbpassword" --admin-user "YourNextcloudAdmin" --admin-pass "YourNextcloudAdminPasssword" --data-dir "/var/nc_data"

Пояснения:

database-name “nextclouddb” : имя базы данных из главы 3

database-user “nextclouddbuser” : Пользователь базы данных из главы 3

Database-pass “nextclouddbpassword”: пароль пользователя базы данных из главы 3

admin-user “YourNextcloudAdmin”: свободно выбирается вами

admin-pass “YourNextcloudAdminPasssword”: свободно выбирается вами

Дождитесь завершения установки Nextcloud, а затем настройте центральный конфигурационный файл Nextcloud «config.php» в качестве веб-пользователя www-data:

  1. Добавьте свой домен в качестве доверенного, добавив ihre.domain.de с выделенным доменом:
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=ihre.domain.de
  1. Установите свой домен как overwrite.cli.url и overwritehost, дополнив ihre.domain.de выделенным доменом:
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://ihre.domain.de
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwritehost --value=ihre.domain.de

Наконец, давайте расширим конфигурацию Nextcloud. Для этого сначала создайте резервную копию существующего .php конфигурации, а затем выполните следующие строки в блоке (» codeberg: nextcloud/var/www/nextcloud/config/config.php at master - criegerde/nextcloud - Codeberg.org и nextcloud/var/www/nextcloud/config/tweaks.config.php at master - criegerde/nextcloud - Codeberg.org):

sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.bak 
sudo -u www-data touch /var/www/nextcloud/config/tweaks.config.php
sudo -u www-data cat <<EOF >>/var/www/nextcloud/config/tweaks.config.php
<?php
\$CONFIG = array (
'activity_expire_days' => 14,
'allow_local_remote_servers' => true,
'auth.bruteforce.protection.enabled' => true,
'blacklisted_files' => 
array (
0 => '.htaccess',
1 => 'Thumbs.db',
2 => 'thumbs.db',
),
'cron_log' => true,
'default_phone_region' => 'DE',
'defaultapp' => 'files,dashboard',
'enable_previews' => true,
'enabledPreviewProviders' => 
array (
0 => 'OC\Preview\PNG',
1 => 'OC\Preview\JPEG',
2 => 'OC\Preview\GIF',
3 => 'OC\Preview\BMP',
4 => 'OC\Preview\XBitmap',
5 => 'OC\Preview\Movie',
6 => 'OC\Preview\PDF',
7 => 'OC\Preview\MP3',
8 => 'OC\Preview\TXT',
9 => 'OC\Preview\MarkDown',
),
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'htaccess.RewriteBase' => '/',
'integrity.check.disabled' => false,
'knowledgebaseenabled' => false,
'logfile' => '/var/log/nextcloud/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Berlin',
'log_rotate_size' => '104857600',
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 768,
'preview_max_scale_factor' => 1,
'profile.enabled' => false,
'redis' => 
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'password' => 'BitteAendern',
'timeout' => 0.5,
'dbindex' => 1,
),
'quota_include_external_storage' => false,
'share_folder' => '/Freigaben',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF

Измените “.user.ini”

sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini

и настроить приложения Nextcloud как пользовательские www-данные

sudo -u www-data php /var/www/nextcloud/occ app:disable survey_client
sudo -u www-data php /var/www/nextcloud/occ app:disable firstrunwizard
sudo -u www-data php /var/www/nextcloud/occ app:enable admin_audit
sudo -u www-data php /var/www/nextcloud/occ app:enable files_pdfviewer

Дополнительный Nextcloud Office:

sudo -u www-data /usr/bin/php /var/www/nextcloud/occ app:install richdocuments
sudo -u www-data /usr/bin/php /var/www/nextcloud/occ app:install richdocumentscode

Nextcloud теперь полностью работоспособен, оптимизирован и защищен. Перезапустите все соответствующие службы:

systemctl stop nginx.service
systemctl stop php8.1-fpm.service
systemctl restart mysql.service
systemctl restart php8.1-fpm.service
systemctl restart redis-server.service
systemctl restart nginx.service

Настройте cronjob для Nextcloud в качестве пользователя «www-data»:

crontab -u www-data -e

Вставьте эту строку

*/5 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1

Затем сохраните и закройте файл и перенастройте задание Nextcloud с «Ajax» на «Cron» с помощью интерфейса командной строки Nextclouds:

sudo -u www-data php /var/www/nextcloud/occ background:cron

Пожалуйста, найдите время, чтобы проверить состояние безопасности вашего сервера.

Верификация прошла успешно

Офис Nextcloud

Цель также должна состоять в том, чтобы достичь, по крайней мере, следующего результата «А+» в тестах:

Во избежание сложностей, которые могут возникнуть при обновлении используемых компонентов, соответствующие пакеты могут быть исключены из обновления с помощью “apt-mark hold”:

apt-mark hold nginx*
apt-mark hold redis*
apt-mark hold mysql*
apt-mark hold galera*
apt-mark hold mariadb*
apt-mark hold php*

Для того, чтобы снова учесть эти пакеты в контексте обновлений, необходимо удалить только «удержание»:

apt-mark unhold nginx*
apt-mark unhold redis*
apt-mark unhold mysql*
apt-mark unhold galera*
apt-mark unhold mariadb*
apt-mark unhold php*

После обновления мы рекомендуем снова установить его в положение «удержание».


6. Усиление защиты системы (fail2ban (альтернативно «crowdsec IPS») и ufw)

Во-первых, мы устанавливаем fail2ban (в качестве альтернативы crowdsec IPS) для защиты сервера от атак грубой силы и неправильных попыток входа в систему:

apt update && apt install -y fail2ban && systemctl enable fail2ban.service

Создайте новый файл фильтра и заполните его, как описано ниже (» codeberg: nextcloud/etc/fail2ban/filter.d/nextcloud.conf at master - criegerde/nextcloud - Codeberg.org):

touch /etc/fail2ban/filter.d/nextcloud.conf

Скопировать все из “кота…” к "… EOF» в буфер обмена, а затем вставьте его в оболочку:

cat <<EOF >/etc/fail2ban/filter.d/nextcloud.conf
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
EOF

Подтвердите нажатием чтобы заполнить файл. Результат выглядит следующим образом:

cat /etc/fail2ban/filter.d/nextcloud.conf

Для проверки: cat /etc/fail2ban/filter.d/nextcloud.conf

Теперь создайте новый файл тюрьмы (» codeberg: nextcloud/etc/fail2ban/jail.d/nextcloud.local at master - criegerde/nextcloud - Codeberg.org):

nano /etc/fail2ban/jail.d/nextcloud.local

Скопируйте в него все следующие строки:

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 5
bantime = 3600
findtime = 36000
logpath = /var/log/nextcloud/nextcloud.log 

При указанных выше параметрах IP-адрес потенциального злоумышленника блокируется на срок 5 секунд (bantime, соответствует 36000 часу) после 10 неправильных попыток входа в систему (maxretry) в течение последних 3600 секунд (findtime, что соответствует 1 часам).

Перезапустите fail2ban и проверьте статус fail2ban:

systemctl restart fail2ban.service
fail2ban-client status nextcloud

С этого момента IP-адреса, с которых было совершено 5 или более неправильных попыток входа в течение последних 10 часов, будут заблокированы на 1 час, и, таким образом, ваш сервер будет защищен от дальнейших атак. Если вы хотите протестировать блокировку вручную и хотите разблокировать результирующий блок вашего IP-адреса или IP-адресов, которые уже были заблокированы, сначала выполните эту команду,

fail2ban-client status nextcloud

для отображения заблокированных IP-адресов. Вы можете разблокировать отображаемые IP-адреса с помощью следующей команды:

fail2ban-client set nextcloud unbanip <ip-adresse>

Наконец, мы устанавливаем брандмауэр, так называемый uncomplicated firew all(ufw):

Если вы ранее изменили порт SSH с 22 на другой порт, вы должны заменить порт 22 соответствующим образом!

apt install -y ufw
ufw allow 80/tcp comment "LetsEncrypt (http)"
ufw allow 443/tcp comment "LetsEncrypt (https)"
ufw allow 22/tcp comment "SSH"

Если вы не хотите совместно использовать SSH извне (рекомендуется!) и использовать его только из внутренней сети, замените последнюю команду ufw (ufw allow 22 /tcp) на эту:

ufw allow proto tcp from 192.168.2.0/24 to any port 22 comment "SSH nur aus dem LAN"

Замените пример сети (192.168.2.0/24) на сеть, которую вы используете!

Установите ведение журнала брандмауэра на «средний» и предотвратите неопределенные входящие соединения.

ufw logging medium
ufw default deny incoming

Активируйте брандмауэр и перезапустите его:

ufw enable
systemctl restart ufw.service

Nextcloud взаимодействует с различными удаленными серверами, чтобы иметь возможность обрабатывать, обмениваться и предоставлять определенную информацию:

Источник: Nextcloud, 12 марта 2023 г.


7. Отправляйте системные письма через postfix

Обновите сервер и установите postfix. Это дает вам возможность получать информацию по fail2ban, apticron и, в случае входа по SSH, по электронной почте:

apt update && apt install -y postfix mailutils

Создайте конфигурацию почты, используя мой пример ниже: Сначала выберите Satellite System, затем введите свой домен (bspw.domain.de) и, наконец, SMTP-сервер.

Теперь настройте конфигурацию постфикса:

nano /etc/postfix/main.cf

Замените места, отмеченные красным цветом:

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = ihre.domain.de
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, ihre.domain.de, localhost.domain.de, localhost
relayhost = smtp.mailserver.de:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
#Bei Problemen mit IPv6 stellen Sie die Zeile wie nachfolgend um
#inet_protocols = ipv4
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps =  hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_use_tls = yes
smtp_enforce_tls = yes

Теперь введите данные доступа для отправки электронных писем:

nano /etc/postfix/sasl_passwd

Введите данные следующим образом и замените красные значения своими:

smtp.domain.de ihremail@domain.de:passwort

Поскольку пароль в этом файле находится в виде обычного текста, мы устанавливаем права доступа к файлу равными 600

chmod 600 /etc/postfix/sasl_passwd

Теперь запишите домен в файл mailname:

nano /etc/mailname

Замените значение своим доменом:

domain.de

Наконец, мы определяем отношения между пользователями и адресами электронной почты. Откройте файл

nano /etc/postfix/sender_canonical

и определите там пользователей и адреса электронной почты:

root mail@domain.de
<Ihr Benutzer> mail@domain.de
www-data mail@domain.de
default mail@domain.de

Теперь конфигурация скомпилирована и Postfix перезапущен:

postmap /etc/postfix/sasl_passwd
postmap /etc/postfix/sender_canonical
systemctl restart postfix.service

Теперь протестируйте отправку электронного письма через ваш Postfix

echo "Dies ist eine Testmail" | mailx -s "Test" ihremail@domain.de

Если почта не пришла, пожалуйста, проверьте журнал (почту.log ):

tail -f /var/log/mail.log

Настройте конфигурацию PHP, чтобы также отправлять письма PHP через postfix:

nano /etc/php/8.1/fpm/php.ini

Установите sendmail_path следующим образом:

sendmail_path = "/usr/sbin/sendmail -t -i"

а затем перезапустите PHP:

systemctl restart php8.1-fpm.service

Теперь вы также можете соответствующим образом настроить Nextcloud

Теперь ваш почтовый сервер готов к использованию, и теперь вы можете настроить дополнительные системные письма (например, из fail2ban и apticron):

7.1 Настройка почтовых уведомлений fail2ban

(необязательно)
В конфигурации fail2ban замените следующие параметры на свои, чтобы получать уведомления в случае неправильных попыток входа и банов. Для этого сохраните исходную конфигурацию fail2ban, а затем отредактируйте ее:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
nano /etc/fail2ban/jail.conf

Замените значения на свои:

...
destemail = ihre@mailadresse.de
...
sender = ihre@mailadresse.de
...
mta = mail
...
# action = %(action_)s
action = %(action_mwl)s
...

Чтобы подавить почту fail2ban при перезапуске сервера, настройте следующий файл:

nano /etc/fail2ban/action.d/mail-buffered.local

Скопируйте в него содержимое:

[Definition]
actionstart =
actionstop =

Затем создайте фиктивные файлы, выполнив следующие команды:

cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois-lines.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-buffered.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-common.local

Перезапустите службу fail2ban

systemctl restart fail2ban.service

и с этого момента вы будете проинформированы (только) о банах, т.е. о вновь заблокированных IP-адресах, которые были замечены при неправильных попытках входа в систему.

7.2 Установка Apticron, включая почтовые уведомления

Apticron информирует вас о доступных обновлениях системы или даже о том, является ли ваша система «up2date». Установите apticron из источников программного обеспечения Ubuntu по умолчанию:

apt update && apt install -y apticron

Теперь давайте настроим аптикрон и изменим как минимум следующие параметры:

cp /usr/lib/apticron/apticron.conf /etc/apticron/apticron.conf
nano /etc/apticron/apticron.conf
...
EMAIL="ihre@mailadresse.de"
...
SYSTEM="ihre.domain.de"
...
NOTIFY_HOLDS="1"
...
NOTIFY_NO_UPDATES="1"
...
CUSTOM_SUBJECT='$SYSTEM: $NUM_PACKAGES package update(s)'
...
CUSTOM_NO_UPDATES_SUBJECT='$SYSTEM: no updates available'
...
CUSTOM_FROM="ihre@mailadresse.de"
...

Проверьте apticron и доставку почты, которую вы только что настроили, вызвав apticron:

apticron

Теперь вы сразу же получите уведомление по электронной почте о текущем состоянии вашей системы. Наконец, настройте cronjob так, чтобы он регулярно и автоматически получал уведомления:

cp /etc/cron.d/apticron /etc/cron.d/apticron.bak
nano /etc/cron.d/apticron
30 7 * * * root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi

Используя приведенный выше пример, Apticron будет информировать вас по электронной почте каждое утро в 07:30 утра о том, что ваша система обновлена.

7.3 Почтовые уведомления для подключения по SSH

Настройте файл профиля и добавьте следующие строки в конце:

nano /etc/profile
if [ -n "$SSH_CLIENT" ]; then
        echo 'Login on' `hostname` `date` `who -m` | mail -s "Login on `hostname` from `echo $SSH_CLIENT |
        awk '{print $1}'`" ihre@mailadresse.de
fi

С этого момента при каждом успешном подключении по SSH вы будете получать активные уведомления.


8. Оптимизируйте и обновите Nextcloud с помощью скрипта

Создайте скрипт для обновления и оптимизации сервера, Nextcloud и активированных приложений:

cd /root
wget -q https://codeberg.org/criegerde/nextcloud/raw/branch/master/skripte/update.sh

Кроме того , также доступен сценарий обновления, включающий обновление Nextcloud Office Docker.

wget -q https://codeberg.org/criegerde/nextcloud/src/branch/master/skripte/update-nc-office.sh 

Пометьте сценарий как исполняемый и регулярно запускайте его от имени привилегированного пользователя.

chmod +x /root/update.sh
/root/update.sh


Дополнительная информация о производителе:


Установка и защита вашего сервера Nextcloudserver были успешно завершены, поэтому я желаю вам много удовольствия от ваших данных в вашем частном облаке.


9. Мониторинг системы с помощью netdata

Сначала загрузите дополнительные программные компоненты, а затем установите Netdata из git:

cd /usr/local/src
apt install -y apache2-utils autoconf automake cmake git gcc g++ libssl-dev libuv1-dev make libtool libjson-c-dev libelf-dev libjson-c-dev pkg-config uuid-dev zlib1g-dev
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata

Для защиты мониторинга мы используем утилиту Apache2-utils и устанавливаем защиту паролем от Netdata:

htpasswd -c /etc/nginx/netdata-access IhrName

Теперь начнется установка

./netdata-installer.sh --disable-telemetry -u

Через несколько секунд Netdata уже полностью установлен и исполняется, но требуется всего несколько конфигураций:

nano /etc/netdata/netdata.conf

Измените значение слова «история» на, например: 14400 (данные за последние 4 часа сохраняются, требуется ок. 60 МБ ОЗУ) в [глобальном] диапазоне:

history = 14400

Кроме того, настройте раздел [web] так, чтобы Netdata прослушивал только локальный хост:

bind to = 127.0.0.1

Кроме того, настройте раздел [web] так, чтобы Netdata прослушивал только локальный хост:

nano /etc/nginx/conf.d/nextcloud.conf

Добавьте линии proxy_set_header Connection и auth_basic :

[...]
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location /netdata {
return 301 /netdata/;
}
location ~ /netdata/(?<ndpath>.*) {
auth_basic "Bitte Zugangsdaten eingeben";
auth_basic_user_file /etc/nginx/netdata-access;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Connection "keep-alive";
proxy_store off;
proxy_pass http://netdata/$ndpath$is_args$args;
gzip on;
gzip_proxied any;
gzip_types *;
}
[...]

Расширьте веб-сервер nginx с его встроенными функциями состояния, создав новый vHost (/etc/nginx/conf.d/stub_status.conf)

touch /etc/nginx/conf.d/stub_status.conf && nano /etc/nginx/conf.d/stub_status.conf

и скопируйте в него все строки:

server { listen 127.0.0.1:80 default_server; server_name 127.0.0.1; location /stub_status { stub_status on; allow 127.0.0.1; deny all; } }

Наконец, конфигурация веб-сервера (/etc/nginx/nginx.conf) расширена красными линиями, так что Netdata может быть вызван на существующем веб-сервере:

nano /etc/nginx/nginx.conf
[...]
http {
server_names_hash_bucket_size 64;
upstream netdata {
server 127.0.0.1:19999;
keepalive 64;
}
[...]

После окончательного перезапуска служб Netdata и веб-сервера

systemctl restart netdata.service nginx.service

Вы уже можете использовать Netdata и анализировать свою систему:

https://ihre.domain.de/netdata

Netdata: Netdata - это универсальное решение для мониторинга, искусно созданное с молниеносным ядром C, окруженное сотнями сборщиков. Обладая всеобъемлющей приборной панелью с тысячами показателей, высочайшей производительностью и настраиваемостью, это идеальный инструмент мониторинга с одним узлом []

Для обновления Netdata достаточно выполнить следующий скрипт:

/usr/libexec/netdata/netdata-updater.sh

Текущая версия проверяется и, при необходимости, обновляется до текущей


10.Расширение/перемещение хранилища Nextcloud

Хранилище данных Nextcloud можно относительно легко расширить. Возможны NFS (или Samba (cifs)), HHD/SD и приложение внешнего хранилища Nextcloud. В следующих примерах подробно описано, как это работает:

10.1 Увеличьте хранилище Nextcloud с помощью NAS (nfs):

Сначала устанавливаем необходимые модули

apt install -y nfs-common

А затем расширьте fstab

cp /etc/fstab /etc/fstab.bak
nano /etc/fstab

Чтобы постоянно вмонтировать диск в систему, выполните следующие действия.

<IP-NFS-SERVER>:/<Freigabename> /<ihr>/<mountpoint> nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

После успешного монтажа с помощью

chown -R www-data:www-data /<ihr>/<mountpoint>
mount /<ihr>/<mountpoint>

и базовый процесс копирования, как .php конфигурации, все еще должны быть настроены, так и индекс Nextcloud должен быть перестроен. Для этого сначала остановите Nextcloud

systemctl stop php8.1-fpm.service nginx.service

А затем отредактируйте .php конфигурации в отношении нового каталога данных:

sudo -u www-data nano /var/www/nextcloud/config/config.php

[...]
'datadirectory' =>'/<ihr>/<mountpoint>',
[...]

Теперь скопируйте предыдущий каталог данных в новый каталог:

rsync -av --progress --stats /<altes Datenverzeichnis>/ /<ihr>/<mountpoint>

Как только этот процесс копирования будет завершен, индекс Nextcloud будет перестроен:

systemctl stop nginx.service php8.1-fpm.service
redis-cli -s /var/run/redis/redis-server.sock
FLUSHALL
quit
sudo -u www-data php /var/www/nextcloud/occ files:scan --all -v
sudo -u www-data php /var/www/nextcloud/occ files:scan-app-data -v
systemctl start php8.1-fpm.service nginx.service

Как только этот процесс копирования будет завершен, индекс Nextcloud будет перестроен:

данные уже доступны для использования общего ресурса NFS. Если вы планируете иметь возможность редактировать данные напрямую через Nextcloud, а также через общий ресурс, вам следует использовать параметр

'filesystem_check_changes' => 1,

данные уже доступны для использования общего ресурса NFS. Если вы планируете иметь возможность редактировать данные напрямую через Nextcloud, а также через общий ресурс, вам следует использовать параметр

10.2 Расширьте хранилище Nextcloud с помощью дополнительных жестких дисков / твердотельных накопителей

Предположим, что новый диск может быть смонтирован под ‘/dev/sda’ для Nextcloud. Мы форматируем этот жесткий диск/твердотельный накопитель с файловой системой «ext4» и постоянно монтируем его в систему (/etc/fstab). Давайте начнем и сначала остановим сервер Nextcloud:

systemctl stop nginx.service php8.1-fpm.service redis-server.service mysql.service stop

Теперь проверим наличие нового накопителя на сервере

fdisk -l

и разбейте его на разделы следующим образом
(при условии, что новый диск доступен в /dev/sda ):

fdisk /dev/sda
  1. Выберите ‘o’, чтобы создать новую таблицу разделов
  2. Выберите ‘n’, чтобы создать новый раздел.
  3. Выберите ‘p’ (тип первичного раздела), т.е. первичный раздел
  4. Выберите номер раздела: 1
  5. Дальнейшие записи могут быть сделаны с помощью клавиши ENTER без дополнительной информации, т.е. со значениями по умолчанию <Enter>
  6. Запишите конфигурацию: ‘w’ и нажмите <ENTER>

Новый раздел ‘/dev/sda1’ уже создан, и его нужно только отформатировать:

mkfs.ext4 /dev/sda1
fdisk -s /dev/sda1

Теперь создаем новый каталог ‘/nc_data’ и монтируем новый раздел ‘/dev/sda1’:

mkdir -p /nc_data
chown -R www-data:www-data /nc_data

Персистентный монтаж выполняется в fstab:

cp /etc/fstab /etc/fstab.hd.bak
nano /etc/fstab

Добавьте в конце следующую строку:

/dev/sda1     /nc_data     ext4     defaults     0     1

Теперь мы запускаем следующую команду для монтирования диска:

mount -a

Взгляд на файловую систему уже показывает нам новый диск в системе:

df -Th

Теперь мы переносим данные инвентаризации в новый каталог ( предполагая
, что ваши данные Nextcloud ранее находились в /var/nc_data):

rsync -av /var/nc_data/ /nc_data

и настройте .php конфигурации Nextcloud по отношению к новому каталогу данных:

sudo -u www-data nano /var/www/nextcloud/config/config.php

Измените его следующим образом:

[...]
'datadirectory' =>'/nc_data',
[...]

Наконец, мы перезапускаем ранее остановленные службы и выполняем запуск индексации:

systemctl start mysql.service php8.1-fpm.service redis-server.service
cd /var/www/nextcloud
redis-cli -s /var/run/redis/redis-server.sock 
FLUSHALL
quit
sudo -u www-data php occ files:scan --all -v
sudo -u www-data php occ files:scan-app-data -v

systemctl restart php8.1-fpm.service nginx.service

С этого момента вся емкость нового жесткого диска доступна для вашего Nextcloud.

Примечание: Если данные из предыдущего каталога были успешно скопированы, исходный каталог может быть окончательно удален:

rm -Rf /var/nc_data/ 

10.3 Расширьте хранилище Nextcloud с помощью приложения «Внешнее хранилище»

В дополнение к главам 10.1 и 10.2, хранилище Nextcloud также можно расширить с помощью собственного приложения Nextcloud для «внешнего хранилища».

Это позволяет без проблем получить доступ к различным носителям информации:

  • Файлы могут быть воссозданы, отредактированы и удалены «из коробки» - как внутри, так и за пределами Nextcloud и всегда синхронизируются,
  • Вы можете предоставить дополнительные диски и общие ресурсы в качестве дополнительного хранилища Nextcloud,
  • Вы можете разрешить пользователям использовать свои собственные устройства в качестве внешнего хранилища,

Дополнительную документацию по этому приложению можно найти здесь.


11. Высокопроизводительная серверная часть Nextcloud для файлов

Начинаем с настройки высокопроизводительного бэкенда для файлов и переключаемся на Nextcloud App Store. В категории «Инструменты» вы найдете Application Client Push.

После установки и активации через App Store действия в интерфейсе Nextcloud уже завершены. Мы продолжаем здесь в командной строке сервера.Прежде всего, виртуальный хост для Nextcloud нуждается в небольшом расширении

nano /etc/nginx/conf.d/nextcloud.conf

В конце файла добавляем красные строки (» codeberg: nextcloud/etc/nginx/conf.d/nextcloud-mit-push.conf at master - criegerde/nextcloud - Codeberg.org):

[...]
location / {
try_files $uri $uri/ /index.php$request_uri;
}
location /push/ {
proxy_pass http://localhost:7867/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

Перезапустите веб-сервер:

systemctl restart nginx.service

Настройка высокопроизводительного бэкенда для файлов затем вызывается через OCC:

cd /var/www/nextcloud
sudo -u www-data php occ notify_push:setup

Если конфигурация действительна, отображаются дальнейшие инструкции по созданию модуля systemd для серверной части Nextcloud High Performance для файлов.

Для этого открываем еще одну, дополнительную сессию SSH и создаем сервис:

nano /etc/systemd/system/notify_push.service
[Unit]
Description = Push daemon for Nextcloud clients
After=mariadb.service 

[Service]
Environment=PORT=7867
Environment=NEXTCLOUD_URL=https://ihre.domain.de
ExecStart=/var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push /var/www/nextcloud/config/config.php
User=www-data
[Install]
WantedBy = multi-user.target

Затем служба активируется и запускается:

systemctl enable --now notify_push

При условии, что служба была запущена правильно

переключимся обратно на первую сессию SSH и подтвердим диалог нажатием клавиши ENTER:

Если приходят обновления приложений, требуется перезапуск службы.

systemctl restart notify_push.service

Таким образом, настройка высокопроизводительного бэкенда для файлов успешно завершена.


12. bash_aliases и рекомендуемые настройки (config.php)

Настройте файл /root/bash_aliases, чтобы иметь возможность запускать набор инструментов Nextcloud occ напрямую через nocc

Убунту

if [ ! -f /root/.bash_aliases ]; then touch /root/.bash_aliases; fi
cat <<EOF >> /root/.bash_aliases
alias nocc="sudo -u www-data php /var/www/nextcloud/occ"
EOF
source /root/.bash_aliases

Debian

if [ ! -f /root/.bashrc ]; then touch /root/.bashrc; fi
cat <<EOF >> /root/.bashrc
alias nocc="sudo -u www-data /usr/bin/php /var/www/nextcloud/occ"
EOF
source /root/.bashrc

Отныне, как привилегированный пользователь (sudo -s), вы можете использовать инструменты Nextcloud occ напрямую через «nocc … ", например:

nocc app:list

Чтобы получить, например: , чтобы отобразить все активированные и деактивированные приложения вашего Nexctloud. Мы рекомендуем установить следующие параметры:

nocc config:system:set remember_login_cookie_lifetime --value="1800"
nocc config:system:set log_rotate_size --value="104857600"
nocc config:system:set trashbin_retention_obligation --value="auto, 7"
nocc config:system:set versions_retention_obligation --value="auto, 365"
nocc config:system:set simpleSignUpLink.shown --type=bool --value=false
nocc config:system:set upgrade.disable-web --type=bool --value=true
nocc config:app:set text workspace_available --value=0
nocc config:system:set loglevel --value="2"
nocc config:app:set settings profile_enabled_by_default --value="0"
nocc app:enable admin_audit
nocc config:app:set admin_audit logfile --value="/var/log/nextcloud/audit.log"
nocc config:system:set log.condition apps 0 --value admin_audit

Установите размер фрагмента или деактивируйте его с помощью «0»

nocc config:app:set files max_chunk_size --value="104857600"
oder
nocc config:app:set files max_chunk_size --value 0


Обзор настроек можно найти здесь.
Установка и защита вашего сервера Nextcloud server были успешно завершены!