AkuvuK

сетевик затейник

Руководство по установке Nextcloud на Ubuntu Server 20.04 focal fossa или Debian 11

Это руководство по установке Nextcloud описывает установку по шагам, (установку облака вывезет даже конченный ламер), настройку и защиту, мониторинг и некоторые варианты расширения Nextcloud на Ubuntu Server 20.04.x LTS Focal Fossa или Debian Server 11. Установка основана на компонентах nginx 1.21.x mainline, Let’s Encrypt TLS 1.3, MariaDB 10.6.x, PHP 8.x, Redis, Fail2ban, ufw,Netdata и получает рейтинг безопасности A+ от Nextcloud и Qualys SSL Labs.

В этом руководстве вам нужно только заменить значения, отмеченные красным цветом, такие как cloud.domain.ru или 192.168.2.x, соответствующими значениями вашей системы.

Содержание

  1. Подготовка и установка веб-сервера nginx
  2. Установка и настройка PHP 8.0
  3. Установка и настройка сервера базы данных MariaDB 10.6
  4. Установка Redis-сервера («базы данных в памяти»)
  5. Установка и оптимизация Nextcloud (в т.ч. SSL)
  6. Усиление системы (fail2ban и ufw)
  7. Системная почта через postfix
    • Уведомления fail2ban
    • Уведомления apticron
    • Уведомления ssh
  8. Оптимизация и обновление Nextcloud с помощью скрипта
  9. Мониторинг системы с помощью netdata. [ необязательно ]
  10. Развернуть/переместить хранилище Nextcloud [ необязательно ]
    • через NAS
    • с помощью другого HDD/SSD
    • использование приложения внешнего хранилища Nextcloud
  11. Высокопроизводительный сервер Nextcloud для файлов [ необязательно ]
  12. bash_alias для php occ и рекомендуемые настройки (config.php) [ необязательно ]

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

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

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

Свежий установочный носитель для сервера Linux можно найти здесь:

Ubuntu 20.04.3 LTS (Focal Fossa)

Debian 11.x

Debian и Ubuntu Server:

Переключение в привилегированный пользовательский режим:

sudo -s

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

apt update -q4 && apt install -y curl gnupg2 git lsb-release ssl-cert ca-certificates apt-transport-https tree locate software-properties-common dirmngr screen htop net-tools zip unzip bzip2 ffmpeg ghostscript libfile-fcntllock-perl libfontconfig1 libfuse2 socat

Введи имя будущего сервера как в файле hosts, так и в файле hostname:

nano /etc/hosts

Замени значения красного цвета на свои :

127.0.0.1 localhost
127.0.1.1 cloud.domain.ru cloud
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
<externe IP> cloud.domain.ru

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

nano /etc/hostname

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

cloud.domain.ru

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

nano /etc/systemd/timesyncd.conf

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

NTP=ntp1.stratum2.ru ntp3.stratum2.ru

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

systemctl restart systemd-timesyncd

Перезагрузите сервер

reboot now

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

sudo -s

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

cd /etc/apt/sources.list.d

Только для сервера Ubuntu (AMD64 и ARM64):

При необходимости сначала исправь разрешение DNS:

rm -f /etc/resolv.conf
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved.service

Введи исходные файлы программного обеспечения для nginx, PHP и MariaDB:

echo "deb http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | tee nginx.list

echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu $(lsb_release -cs) main" | tee php.list

echo "deb http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.6/ubuntu $(lsb_release -cs) main" | tee mariadb.list

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

Ключ PHP:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 4F4EA0AAE5267A6C

Только сервера Debian (AMD64):

Добавь исходные файлы программного обеспечения для nginx, PHP и MariaDB:

echo "deb [arch=amd64] http://nginx.org/packages/mainline/debian $(lsb_release -cs) nginx" | tee nginx.list

echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee php.list

echo "deb [arch=amd64] http://mirror2.hs-esslingen.de/mariadb/repo/10.6/debian $(lsb_release -cs) main" | tee mariadb.list

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

Ключ PHP:

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

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

Мы дополняем недостающие ключи для nginx и MariaDB, обновляем систему и затем генерируем так называемые самозаверяющих сертификаты, которые впоследствии заменяются полноценными сертификатами от Let’s Encrypt.

Ключ NGINX:

curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -

Ключ MariaDB:

apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 0xF1656F24C74CD1D8

apt update -q4

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

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

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 1024;
multi_accept on; use epoll;
}
http {
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
set_real_ip_from 127.0.0.1;
#optional bspw.:
# set_real_ip_from 192.168.2.0/24;
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;
}

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

service nginx restart

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

mkdir -p /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

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

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

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

apt update -q4 && apt install -y php8.0-{fpm,gd,mysql,curl,xml,zip,intl,mbstring,bz2,ldap,apcu,bcmath,gmp,imagick,igbinary,redis,smbclient,cli,common,opcache,readline} imagemagick

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

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

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

timedatectl set-timezone Europe/Moscow

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

cp /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/www.conf.bak
cp /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
cp /etc/php/8.0/cli/php.ini /etc/php/8.0/cli/php.ini.bak
cp /etc/php/8.0/fpm/php.ini /etc/php/8.0/fpm/php.ini.bak
cp /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
cp /etc/php/8.0/mods-available/apcu.ini /etc/php/8.0/mods-available/apcu.ini.bak
cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak

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

AvailableRAM=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
AverageFPM=$(ps --no-headers -o 'rss,cmd' -C php-fpm8.0 | 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))

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

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_children =.*/pm.max_children = '$FPMS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = '$PStartS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = '$PMinSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = '$PMaxSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.0/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.0/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.0/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Moscow/" /etc/php/8.0/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php/8.0/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.0/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.0/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Moscow/" /etc/php/8.0/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.0/fpm/php.ini
sed -i "s|;emergency_restart_threshold.*|emergency_restart_threshold = 10|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i "s|;emergency_restart_interval.*|emergency_restart_interval = 1m|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i "s|;process_control_timeout.*|process_control_timeout = 10|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i '$aapc.enable_cli=1' /etc/php/8.0/mods-available/apcu.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

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

service php8.0-fpm restart

service nginx restart

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

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

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

apt update -q4 && 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

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

service mysql stop

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 = 1024M
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
#ab MariaDB 10.6 notwendig, s. Link
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 = 200
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 и его пароль:

service mysql restart
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;

Пояснение:

Имя базы данных: nextclouddb

Пользователь базы данных: nextclouddbuser

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

Убедись, что уровень изоляции (read commit) и кодировка (utf8mb4) установлены правильно:

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.

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

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

apt update -q4 && apt install -y redis-server

Настрой конфигурацию Redis, выполнив резервное и настройку конфигурации, выполнив следующие команды:

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 512/" /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, т.е. файлы конфигурации сервера, и постоянно изменяем файл 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.0-fpm.sock;
}
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 http2;
listen [::]:443 ssl http2;
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;
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/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                         "none"          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 ^~ /apps/rainloop/app/data {
deny all;
}
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;
}
location ~ \.(?:css|js|svg|gif|png|jpg|ico)$ {
try_files $uri /index.php$request_uri;
expires 6M;
access_log off;
}
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;
}
}

Сохрани и закрой этот файл, а затем расширь безопасность сервера и системы, разрешив безопасный обмен ключами с помощью ключа Диффи-Хеллмана (dhparam.pem):

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

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

service nginx restart

Теперь мы начинаем «фактическую» установку программного обеспечения 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

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

visudo

В середине файла, ниже

[..]
User privilege specification
root ALL=(ALL:ALL) ALL
[...]

введи следующую строку:

acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service

Используйте сочетание клавиш CTRL+X, а затем y для сохранения и выхода из этого файла.

Переключи в оболочку нового пользователя (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
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
service nginx restart

Для автоматического обновления 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» : Имя базы данных

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

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

admin-user»YourNextcloudAdmin«: поменяй на свой

admin-pass «YourNextcloudAdminPasssword» : поменяй на свой

Дождитесь завершения установки Nextcloud, а затем настройте центральный конфигурационный файл Nextcloud «config.php» как webuser 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

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

sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://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 sed -i 's/^[ ]*//' /var/www/nextcloud/config/config.php

sudo -u www-data sed -i '/);/d' /var/www/nextcloud/config/config.php
sudo -u www-data cat <<EOF >>/var/www/nextcloud/config/config.php
'activity_expire_days' => 14,
'auth.bruteforce.protection.enabled' => true,
'blacklisted_files' => 
array (
0 => '.htaccess',
1 => 'Thumbs.db',
2 => 'thumbs.db',
),
'cron_log' => true,
'default_phone_region' => 'DE',
'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/nc_data/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Moscow',
'log_rotate_size' => 104857600,
'maintenance' => false,
'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,
'redis' => 
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'timeout' => 0.0,
),
'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 теперь полностью работоспособен, оптимизирован и защищен. Перезапустите все соответствующие службы:

service nginx stop
service php8.0-fpm stop
service mysql restart
service php8.0-fpm restart
service redis-server restart
service nginx restart

Настройте 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

6. Безопасность (fail2ban и ufw)

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

apt update -q4 && apt install -y fail2ban

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

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

Подтверди с помощью для заполнения файла.

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

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

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/nc_data/nextcloud.log

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

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

service fail2ban restart
fail2ban-client status nextcloud

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

fail2ban-client status nextcloud

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

fail2ban-client set nextcloud unbanip <ip-adresse>

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

apt install -y ufw
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22/tcp

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

ufw allow proto tcp from 192.168.2.0/24 to any port 22

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

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

ufw logging medium
ufw default deny incoming
ufw enable
service ufw restart

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

  • www.nextcloud.com, www.startpage.com, www.eff.org www.edri.org проверка подключения к

    Интернету
  • apps.nextcloud.com
    доступных приложений / AppStore
  • updates.nextcloud.com обновления
    Netxcloud
  • lookup.nextcloud.com
    Обновление федеративных облаков/служб
  • push-notifications.nextcloud.com
    push-сообщений для мобильных клиентов
  • surveyserver.nextcloud.com
    опросы – только в том случае, если администратор дал согласие на отправку АНОНИМНЫХ ДАННЫХ
  • Любой «удаленный» интегрированный сервер Nextcloud

Источник: Nextcloud, 30 июня 2021 г.

7. Отправка системных писем через postfix

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

apt update -q4 && apt install -y postfix mailutils

Создай конфигурацию почты, используя мой пример ниже: сначала выберите спутниковую систему, затем введите ее домен (cloudmail.domain.ru) и, наконец, 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.domain.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 cloudmail.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
service postfix restart

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

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

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

tail -f /var/log/mail.log

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

nano /etc/php/8.0/fpm/php.ini

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

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

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

service php8.0-fpm restart

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

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

7.1 Настройка уведомлений о почте fail2ban (необязательно)

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

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

Замени красные значения:

...
destemail = cloud@mailadresse.ru
...
sender = cloud@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

service fail2ban restart

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

7.2 Установка Apticron, включая уведомления по почте. (необязательно)

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

apt update -q4 && apt install -y apticron

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

Только для Ubuntu 18.04.+:

cp /etc/apticron/apticron.conf /etc/apticron/apticron.conf.bak
nano /etc/apticron/apticron.conf

Только для Ubuntu 20.04+ и Debian 10.5+:

cp /usr/lib/apticron/apticron.conf /etc/apticron/apticron.conf
nano /etc/apticron/apticron.conf

Отсюда продолжаем снова для всех операционных систем:

...
EMAIL="cloud@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

Теперь сразу же получи уведомление по электронной почте о текущем состоянии системы. Наконец, отрегулируй 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 a.m. по электронной почте о вашем уровне актуальности системы.

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}'`" cloud@mailadresse.ru
fi

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

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

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

cd /root
nano update.sh
#!/bin/bash
apt update -q4
apt upgrade -V
apt autoremove -y
apt autoclean -y
chown -R www-data:www-data /var/www/nextcloud
find /var/www/nextcloud/ -type d -exec chmod 750 {} \;
find /var/www/nextcloud/ -type f -exec chmod 640 {} \;
/usr/sbin/service nginx stop
sudo -u www-data php /var/www/nextcloud/updater/updater.phar
sudo -u www-data php /var/www/nextcloud/occ status
sudo -u www-data php /var/www/nextcloud/occ -V
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-primary-keys
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-columns
sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint
sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
chown -R www-data:www-data /var/www/nextcloud
redis-cli -s /var/run/redis/redis-server.sock <<EOF
FLUSHALL
quit
EOF
sudo -u www-data php /var/www/nextcloud/occ files:scan --all
sudo -u www-data php /var/www/nextcloud/occ files:scan-app-data
sudo -u www-data php /var/www/nextcloud/occ app:update --all
/usr/sbin/service php8.0-fpm restart
/usr/sbin/service nginx restart
exit 0

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

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

Установка и резервное копирование nextcloud-server были успешно завершены!

9. Опционально: Мониторинг системы с помощью netdata.

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

cd /usr/local/src
apt install -y apache2-utils autoconf automake cmake git gcc 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 Cloudname

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

./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 ^~ /apps/rainloop/app/data {
deny all;
}
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 и Web-сервера

service netdata restart && service nginx restart

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

https://cloud.domain.ru/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>:/<shara> /<cloud>/<mountpoint> nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

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

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

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

service php8.0-fpm stop && service nginx stop

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

sudo -u www-data nano /var/www/nextcloud/config/config.php
[...]
'datadirectory' =>'/<cloud>/<mountpoint>',
'logfile' => '/<cloud>/<mountpoint>/nextcloud.log',
[...]

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

rsync -av --progress --stats /<filesnextcloud>/ /<cloud>/<mountpoint>

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

service nginx stop && service php8.0-fpm stop
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
service php8.0-fpm start && service nginx start

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

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

'filesystem_check_changes' => 1,

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

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

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

service nginx stop
service php8.0-fpm stop
service redis-server stop
service mysql 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_diskdata’ и смонтируем новый раздел ‘/dev/sda1’:

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

Персональное монтирование происходит в fstab:

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

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

/dev/sda1     /nc_data     ext4     defaults     0     1

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

mount -a

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

df -h

Теперь мы передаем данные инвентаризации в новый каталог(предполагая, что ваши данные 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',
...
[...]
'datadirectory' =>'/nc_data',
'logfile' => '/nc_data/nextcloud.log',
[...]

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

service php8.0-fpm start
service redis-server start
service mysql start
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
service nginx restart

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

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

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

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

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

Мы начнем с настройки высокопроизводительного бэкэнда для файлов и переключимся на Nextcloud App Store для этого. В категории инструменты найди приложение Client 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://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;
}
}

Проверь конфигурацию и перезапусти веб-сервер

nginx -t && service nginx restart

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

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

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

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

nano /etc/systemd/system/notify_push.service
[Unit]
Description = Push daemon for Nextcloud clients
[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 enable --now notify_push
Если служба запущена правильно

давай вернемся к первому сеансу SSH и подтвердим диалог с помощью ENTER:

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

service notify_push restart

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

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

Настрой файл /root/bash_aliases для запуска occ набора инструментов Nextcloud непосредственно с помощью 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

Выйди из текущего сеанса и снова войди в систему. Отныне, как привилегированный пользователь (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:system:set loglevel --value="2"

Все гайд закончен! Если есть вопросы пиши в комментариях.

12 Comments

  1. Виктор

    супер! давно искал подробную инструкцию по установке некстклоуд и дополнений к нему

    Reply
  2. Михалыч

    Благодарствую сильно помог гайдом! +ВКарму

    Reply
  3. Monica

    Получилось поставить облако только с 3го раза.)))))

    Reply
  4. Василий Алексеевич

    Автор, спасибо Вам большое, за такую подробную и понятную инструкцию!

    Reply
  5. Клитарчук

    ппц, нафиг эта инструкция?) nextcloud любой шкальник с закрытыми глазами развернёт! Тупо для дибилов!

    Reply
  6. Mara

    а под фряху есть подобная гже либо инструкция ?

    Reply
    1. AkuvuK

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

      Reply

DROP A COMMENT

Ваш адрес email не будет опубликован. Обязательные поля помечены *