Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

Ubuntu

В этой статье описывается установка, настройка, усиление защиты, мониторинг и некоторые возможности расширений Nextcloud 24 установленных на Ubuntu Server 20.04.x ​​LTS focal, 22.04 LTS jammy (x86-64) или 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. В ходе выполнения этих инструкций вам нужно только заменить значения, отмеченные красным, например ваш_доменили 192.168.2.x, соответствующими значениями вашей системы.

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

Образы для развёртывания сервера Linux доступны здесь:

При развертывании сервера потребуется указать установку дополнительных пакетов SSH.

Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

После установки операционной системы необходимо подключиться к серверу по ssh.

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

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 ubuntu-keyring unzip wget zip

Добавьте строку в файл hosts с именем вашего будущего сервера:

nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 доменное_имя_вашего_сервера 
# Для хостов с поддержкой IPv6 желательны следующие строки 

::1     доменное_имя_вашего_сервера ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
<внешний IP адрес> доменное_имя_вашего_сервера

Измените значения в файле hostname введя доменное имя вашего сервера:

nano /etc/hostname

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

example.ru

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

nano /etc/systemd/timesyncd.conf

Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

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

ntp1.stratum2.ru ntp3.stratum2.ru

Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

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

systemctl restart systemd-timesyncd

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

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

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

reboot now

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

sudo -s

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

cd /etc/apt/sources.list.d

Только для сервера на Ubuntu (x86_64):

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

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

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

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

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

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

Только для Debian 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
echo "deb [arch=amd64] https://packages.sury.org/php/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/php.list

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

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

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

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

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

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

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

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

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

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

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 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;
  }

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

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.1 (fpm)

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

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

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

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

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

timedatectl set-timezone Europe/Moscow

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

cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/www.conf.bak
cp /etc/php/8.1/fpm/php-fpm.conf /etc/php/8.1/fpm/php-fpm.conf.bak
cp /etc/php/8.1/cli/php.ini /etc/php/8.1/cli/php.ini.bak
cp /etc/php/8.1/fpm/php.ini /etc/php/8.1/fpm/php.ini.bak
cp /etc/php/8.1/fpm/php-fpm.conf /etc/php/8.1/fpm/php-fpm.conf.bak
cp /etc/php/8.1/mods-available/apcu.ini /etc/php/8.1/mods-available/apcu.ini.bak
cp /etc/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.1 | awk '{ sum+=$1 } END { printf ("%d\n", sum/NR/1024,"M") }')
FPMS=$((AvailableRAM/AverageFPM))
PMaxSS=$((FPMS*2/3))
PMinSS=$((PMaxSS/2))
PStartS=$(((PMaxSS+PMinSS)/2))

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

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.max_children =.*/pm.max_children = '$FPMS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = '$PStartS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = '$PMinSS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = '$PMaxSS'/' /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.1/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.1/fpm/php.ini

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

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

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

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

sed -i "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:

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

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

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

Установка 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> или введите пароль
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
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

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

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_read_only_compressed=OFF
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 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 и его пароль:

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

Примечание:

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

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

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

Проверим настроен ли правильно сервер баз данных, выполнив команду

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='nextdb'"

Вывод после выполнения команды, должен быть таким

Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

если все настроено правильно и мы можем приступить к установке Redis.

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

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

apt update && 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 10240/" /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.

Установка и оптимизация 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.1-fpm.sock;
}
map $arg_v $asset_immutable {
"" "";
default "immutable";
}
server {
listen 80;
listen [::]:80;
server_name ваше_доменное_имя;
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 ваше_доменное_имя;
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;
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                         "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;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, $asset_immutable";
expires 6M;
access_log off;
location ~ \.wasm$ {
default_type application/wasm;
}
}
location ~ \.woff2?$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}

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

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 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

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

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

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

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

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

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

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

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

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

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

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

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

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

su - acmeuser

Теперь запросим SSL-сертификаты от Let’s Encrypt, замените имя_вашего_домена вашим реальным доменным именем:

acme.sh --issue -d имя_вашего_домена --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 имя_вашего_домена --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
systemctl restart nginx.service

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

crontab -l -u acmeuser

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

sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextdb" --database-user "nextdbuser" --database-pass "nextdbpass" --admin-user "Админ_облака" --admin-pass "Админ_облака_пароль" --data-dir "/var/nc_data"

Примечание:

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

пользователь базы данных «nextdbuser» : Пользователь базы данных из главы 3

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

admin-user «Админ_облака» : задаётся Вами

admin-pass «Админ_облака_пароль» : задаётся Вами

data-dir «/var/nc_data»: каталог хранения пользовательских файлов

Дождитесь завершения установки Nextcloud, а затем настройте главный конфигурационный файл nextcloud как Webuser www-data:

Добавьте свой домен в качестве доверенного домена, изменив имя_вашего_домена вашим реальным доменным именем:

sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=имя_вашего_домена

Установите свой домен как overwrite.cli.url, изменив имя_вашего_домена вашим реальным доменным именем:

sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://имя_вашего_домена

Настало время расширить конфигурацию 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,
'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' => 'RU',
'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',
'maintenance' => false,
'maintenance_window_start' => 1,
'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,
'timeout' => 0.5,
'dbindex' => 1,
),
'quota_include_external_storage' => false,
'share_folder' => '/Releases',
'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 в качестве пользовательских

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:

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

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

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

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

crontab -u www-data -e

Вставим эту строку в конец файла

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

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

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

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

Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.
Картинка кликабельна

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

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

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

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

После обновления рекомендую снова поставить их на «исключение».

Усиление защиты (fail2ban и ufw)

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

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

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

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

Как установить Nextcloud 24 на Ubuntu Server 20.04 или Debian 11 используя nginx, MariaDB, PHP 8 fpm, Let’s Encrypt (acme), Redis, ufw, Fail2ban.

Теперь создайте новый файл блокировки:

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, что соответствует 10 часов), IP потенциального злоумышленника блокируется на срок 3600 секунд (bantime, что эквивалентно 1 часу).

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

systemctl restart fail2ban.service
fail2ban-client status nextcloud

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

fail2ban-client status nextcloud

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

fail2ban-client set nextcloud unbanip <ip-адрес>

Теперь, мы установим брандмауэр, так называемый 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.1.0/24 to any port 22 comment "SSH on my local network"

Замените ip адрес из примера (192.168.1.0/24) на используемую сеть!

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

ufw logging medium
ufw default deny incoming

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

ufw enable
systemctl restart ufw.service

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

Оцените статью
DailyNet