Nextcloud, включая Nextcloud Office на Ubuntu 22.04 LTS или Debian 12.x с nginx, MariaDB, PHP 8.2, Let’s Encrypt, Redis, Fail2ban и ufw.

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

Установка основана на компонентах nginx 1.25, Let’s Encrypt TLS 1.3, MariaDB 10.11, PHP 8.2 (php-fpm), Redis, Fail2ban, ufw и Netdata и, наконец, получает рейтинг безопасности A+ от Nextcloud и Qualys SSL Labs. В этом руководстве вам нужно использовать только значения, отмеченные перечеркнутым текстом, например: cloud.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.x LTS
Get Ubuntu Server Ubuntu

Debian 12.1.x

Debian — скачать с официального сайта

Только для сервера 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, так и в файл hostname:

nano /etc/hosts

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

127.0.0.1 localhost
127.0.1.1  cloud
::1        cloud ip6-localhost ip6-loopback
[...]

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

nano /etc/hostname

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

cloud.domain.ru

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

nano /etc/systemd/timesyncd.conf

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

NTP=ntp1.ntp-servers.net ntp0.ntp-servers.net

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

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
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx
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.11/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 Server (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

sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

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

curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

Только для Debian 11: MariaDB – Репозитории


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

С этого момента он продолжается снова для обеих серверных операционных систем (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.

Установка и настройка PHP 8.2 (fpm)

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

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

Опционально (для использования общих папок Samba, cifs или LDAP-соединения):

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

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

timedatectl set-timezone Europe/Moscow

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

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

С помощью этого скрипта можно определить, в том числе, следующие параметры.
» Кодеберг: https://codeberg.org/criegerde/nextcloud/raw/branch/master/skripte/phpcalc.sh

Выполните следующие команды:

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

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

sed -i 's/pm.max_children =.*/pm.max_children = 200/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = 100/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = 60/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = 140/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.2/fpm/php.ini

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

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

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

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

sed -i 's/opcache.jit=off/; opcache.jit=off/' /etc/php/8.2/mods-available/opcache.ini
sed -i '$aopcache.jit=1255' /etc/php/8.2/mods-available/opcache.ini
sed -i '$aopcache.jit_buffer_size=256M' /etc/php/8.2/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.2/mods-available/mysqli.ini
sed -i '$amysql.allow_local_infile=On' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.allow_persistent=On' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.cache_size=2000' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.max_persistent=-1' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.max_links=-1' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.default_port=3306' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.connect_timeout=60' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.trace_mode=Off' /etc/php/8.2/mods-available/mysqli.ini

Перезапустите оба сервиса, nginx и PHP:

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

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

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

Чтобы установить MariaDB, используйте следующую команду:

apt update && apt install -y mariadb-server

Теперь давайте укрепим сервер базы данных с помощью прилагаемого инструмента «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

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

systemctl stop mysql
mkdir -p /var/log/mysql
chown -R mysql:mysql /var/log/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]
# performance_schema=ON
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 512M
innodb_read_only_compressed=OFF
join_buffer_size = 2M
key_buffer_size = 512M
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_connections = 100
max_heap_table_size = 64M
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 0
query_cache_size = 0 
read_buffer_size = 2M
read_rnd_buffer_size = 2M
skip-name-resolve
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 2M
table_open_cache = 400
table_definition_cache = 800
tmp_table_size = 32M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
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

Отрегулируйте перенастройку, сохранив и настроив конфигурацию, выполнив следующие команды

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)

Теперь мы настраиваем различные vhosts, т.е. конфигурационные файлы swegeter, и постоянно модифицируем файл 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

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

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

upstream php-handler {
server unix:/run/php/php8.2-fpm.sock;
}
map $arg_v $asset_immutable {
"" "";
default "immutable";
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name cloud.domain.ru;
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 и отрегулируйте перечёркнутые значения в соответствии с вашей системой

server {
listen 443      ssl default_server;
listen [::]:443 ssl default_server;
http2 on;
server_name cloud.domain.ru;
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;
include mime.types;
types {
text/javascript mjs;
}
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|mjs|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;
}
}

Сохраните и закройте этот файл, а затем расширьте безопасность сервера и системы возможностью безопасного обмена ключами с помощью ключа Диффи-Хеллмана

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 acmeuser --gecos "" --disabled-password
usermod -aG 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, заменив cloud.domain.ru своим реальным доменом:

acme.sh --issue -d cloud.domain.ru --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 cloud.domain.ru --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-сертификатов, а также для инициирования необходимого перезапуска веб-сервера было автоматически создано задание cron.

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"

Пояснения:

имя-базы данных «nextclouddb» : имя базы данных из главы 3

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

database-pass «nextclouddbpassword» : Пароль пользователя базы данных из главы 3

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

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

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

1. Добавьте свой домен в качестве доверенного, дополнив cloud.domain.ru выделенным доменом:

sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=cloud.domain.ru

2. Установите свой домен как overwrite.cli.url и overwritehost, добавив cloud.domain.ru к вашему выделенному домену:

sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://cloud.domain.ru
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwritehost --value=cloud.domain.ru

Наконец, давайте расширим конфигурацию Nextcloud. Для этого сначала сохраните существующий конфигурационный .php, а затем выполните следующие строки в блоке:

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/Moscow',
'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' => 'Password',
'timeout' => 0.5,
'dbindex' => 1,
),
'quota_include_external_storage' => false,
'share_folder' => '/shara',
'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.2-fpm.service
systemctl restart mysql.service
systemctl restart php8.2-fpm.service
systemctl restart redis-server.service
systemctl restart nginx.service

Настройте задание cron для 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

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

Проверка прошла успешно

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

https://www.ssllabs.com/ssltest/index.html

и https://observatory.mozilla.org/

Чтобы избежать трудностей, которые могут возникнуть в результате обновления используемых компонентов, соответствующие пакеты могут быть исключены из обновления с помощью «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*

Чтобы снова включить эти пакеты в контекст обновлений, необходимо снять только «hold»:

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

После обновления мы рекомендуем снова установить его в ‘hold’.

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

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

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

Создайте новый файл фильтра и заполните его, как описано ниже

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

Скопируйте все из «cat…» до «… 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

Подтвердите нажатием <ENTER> для заполнения файла. Результат следующий:

cat /etc/fail2ban/filter.d/nextcloud.conf
Для управления: cat /etc/fail2ban/filter.d/nextcloud.conf

Теперь создадим новый файл jail

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 

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

Перезапустите 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 firewall (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) на сеть, которую вы используете!

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

ufw logging medium
ufw default deny incoming

Включите и перезапустите брандмауэр:

ufw enable
systemctl restart ufw.service

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

  • www.nextcloud.com, www.startpage.com, www.eff.org www.edri.org для проверки интернет-соединения
  • apps.nextcloud.com доступных приложений
  • updates.nextcloud.com для обновлений Nextcloud
  • lookup.nextcloud.com Для обновления и поиска в адресной книге федеративного общего доступа
  • push-notifications.nextcloud.com отправки push-уведомлений мобильным клиентам
  • surveyserver.nextcloud.com, согласился ли администратор поделиться анонимными данными
  • Любой удаленный сервер Nextcloud, подключенный к федеративному общему доступу

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 = cloud.domain.ru
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, cloud.domain.ru, localhost.domain.ru, localhost
relayhost = smtp.mailserver.ru: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.ru cloud@domain.ru:passwort

Так как пароль в этом файле написан открытым текстом, мы установили права доступа к файлу на 600

chmod 600 /etc/postfix/sasl_passwd

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

nano /etc/mailname

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

domain.ru

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

nano /etc/postfix/sender_canonical

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

root mail@domain.ru
<Ihr Benu> mail@domain.ru
www-data mail@domain.ru
default mail@domain.ru

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

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

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

echo "Dies ist eine Testmail" | mailx -s "Test" cloud@domain.ru

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

tail -f /var/log/mail.log

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

nano /etc/php/8.2/fpm/php.ini

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

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

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

systemctl restart php8.2-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 = user@mailadresse.ru
...
sender = user@mailadresse.ru
...
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

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

cp /usr/lib/apticron/apticron.conf /etc/apticron/apticron.conf
nano /etc/apticron/apticron.conf
...
EMAIL="user@mailadresse.ru"
...
SYSTEM="cloud.domain.ru"
...
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="cloud@mailadresse.ru"
...

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

apticron

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

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 будет информировать вас по электронной почте каждое утро в 7: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. Опционально: мониторинг системы с помощью netdata

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

cd /usr/local/src

apt install apache2-utils zlib1g-dev uuid-dev libuv1-dev liblz4-dev libssl-dev libelf-dev libmnl-dev libprotobuf-dev protobuf-compiler gcc g++ make git autoconf autoconf-archive autogen automake pkg-config curl python cmake

git clone https://github.com/netdata/netdata.git --depth=100 --recursive

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

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

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

cd /usr/local/src/netdata

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

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

nano /etc/netdata/netdata.conf

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

history = 14400

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

bind to = 127.0.0.1

Для того, чтобы иметь возможность использовать веб-интерфейс, существующий файл vHost (nextcloud.conf) расширяется:

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

Добавьте красные линии:

[...]
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 с помощью встроенных функций status – создайте новый 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://cloud.domain.ru/netdata

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

Чтобы обновить Netdata, просто выполните следующий сценарий

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

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


9. Дополнительно: расширение/перемещение хранилища Nextcloud

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

9.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.2-fpm.service nginx.service

а затем отредактируйте файл config.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.2-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.2-fpm.service nginx.service

После успешного перестроения индекса Nextcloud

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

'filesystem_check_changes' => 1,

в конфиге .php. Это гарантирует, что независимо от того, где данные были отредактированы в последний раз, файловое приложение Nextcloud всегда синхронизировано с NFS (т.е. обновлено).

9.2 Расширьте хранилище Nextcloud с помощью дополнительного жесткого диска/твердотельного накопителя

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

systemctl stop nginx.service php8.2-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

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

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

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

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

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

systemctl start mysql.service php8.2-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.2-fpm.service nginx.service

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

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

rm -Rf /var/nc_data/ 

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

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

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

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

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


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

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

Кроме того, вы можете установить приложение из командной строки:

sudo -u www-data php /var/www/nextcloud/occ app:enable notify_push

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

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

В конце файла добавляем желтые строки

[...]
location / {
try_files $uri $uri/ /index.php$request_uri;
}
location ^~ /push/ {
    proxy_pass http://127.0.0.1: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 для файлов.

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

nano /etc/systemd/system/notify_push.service
[Unit]
Description = Push daemon for Nextcloud clients
After=nginx.service php8.2-fpm.service mariadb.service redis-server.service

[Service]
Environment=PORT=7867
Environment=NEXTCLOUD_URL=https://cloud.domain.ru
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 daemon-reload
systemctl enable --now notify_push

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

Вернемся к первой SSH-сессии и подтвердим диалог нажатием клавиши ENTER:

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

systemctl restart notify_push.service

Проверить конфигурацию можно следующим образом:

sudo -u www-data php occ notify_push:setup https://cloud.domain.ru/push

Чтобы проверить работоспособность Nextcloud HPB на наличие файлов, скачайте «test_client» Nextcloud

wget https://github.com/nextcloud/notify_push/releases/download/v0.6.3/test_client 

и запустите его, а затем укажите свой домен, пользователя и его пароль. Если 2FA уже активна, используйте пароль приложения.

chmod +x test_client
./test_client https://<cloud.domain.ru> <Nextcloud-Benutzername> <(App-)Passwort>

и загрузить, например, Загрузите файл в облако.

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


11. 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 были успешно завершены, поэтому я желаю вам приятного времяпрепровождения с вашими данными в вашем частном облаке.

Visited 191 times, 1 visit(s) today
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Роман
Роман
3 месяцев назад

Это то что я искал! Четко, верно, без воды!
есть вопрос )) подключил пользователей из ldap, а войти они не могут.
The root directory of the user’s files is missing
Помогите пожалуйста!