loading...

19.08.2021

Гайд по установке Nextcloud 22 на сервер Ubuntu 20/Debian 10

В этой статье описывается установка, настройка и защита, мониторинг и некоторые возможности расширения Nextcloud на Ubuntu Server 20.04.2-21 LTS или Debian Server 10-11 . Установка основана на компонентах nginx 1.21.x mainline, Let’s Encrypt TLS 1.3, MariaDB 10.5.x, PHP 8.x, Redis, Fail2ban, ufw и Netdata.

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

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

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

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

Установочный образ для сервера Linux ищи тут:

  1. Ubuntu 20 — http://releases.ubuntu.com/20.04/
  2. Debian 10 — https://www.debian.org/CD/netinst/

Debian и Ubuntu Server:

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

sudo -s

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

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.akuvuk.ru
# 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.akuvuk.ru

Укажи имя сервера в файле hostname, замени на свой домен:

nano /etc/hostname

Имя сервера указано как полное доменное имя:

cloud.akuvuk.ru

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

nano /etc/systemd/timesyncd.conf

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

NTP=ntp1.stratum2.ru ntp4.stratum2.ru

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

systemctl restart systemd-timesyncd

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

reboot now

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

sudo -s

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

Только для сервера на 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.5/ubuntu $(lsb_release -cs) main" | tee mariadb.list

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

КЛЮЧ PHP(UBUNTU):
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.5/debian $(lsb_release -cs) main" | tee mariadb.list

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

КЛЮЧ PHP (DEBIAN):
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 && apt upgrade -y
make-ssl-cert generate-default-snakeoil -y

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

apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages
systemctl stop apache2.service && systemctl disable apache2.service

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

apt install nginx -y
systemctl enable nginx.service

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

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, Sie können das eigene Subnetz ergänzen, bspw.:
# set_real_ip_from 192.168.1.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 && apt install -y php8.0-fpm php8.0-gd php8.0-mysql php8.0-curl php8.0-xml php8.0-zip php8.0-intl php8.0-mbstring php8.0-bz2 php8.0-ldap php8.0-apcu php8.0-bcmath php8.0-gmp php8.0-imagick php8.0-igbinary php8.0-redis php8.0-smbclient php8.0-cli php8.0-common php8.0-opcache php8.0-readline imagemagick
#Необязательно (для запланированного использования общих ресурсов Samba и/или CIFS или подключения LDAP(s):
apt install 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

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

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 = 240/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/pm.start_servers =.*/pm.start_servers = 30/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/pm.min_spare_servers =.*/pm.min_spare_servers = 10/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/pm.max_spare_servers =.*/pm.max_spare_servers = 200/" /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.


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

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

apt update && apt install mariadb-server -y

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

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

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

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

Поменяй на свои значения!
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloud@localhost identified by 'nextcloud'; GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost; FLUSH privileges; quit;

Убедись, что уровень изоляции (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='nextcloud'"

В выходных данных отобразится «READ-COMMITTED» и «utf8mb4_general_c все настроено правильно, приступаем к установке Redis.


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

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

apt update && apt install 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 по умолчанию 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, даже при последующих обновлениях веб-сервера.

Создай файл http.conf , чтобы постоянно перенаправлять 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.akuvuk.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.akuvuk.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 5120M;
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;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
root /var/www/nextcloud;
index index.php index.html /index.php$request_uri;
expires 1m;
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            { return 301 /index.php/$uri; }
try_files $uri $uri/ =404;
}
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;
}
location ~ .(?:css|js|svg|gif)$ {
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 / {
try_files $uri $uri/ /index.php$request_uri;
}
}

Сохрани и закрой файл nextcloud.conf, а затем расширь безопасность сервера и системы, разрешив безопасный обмен ключами с помощью ключа Диффи-Хеллмана (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.akuvuk.ru своим доменом:

acme.sh --issue -d cloud.akuvuk.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.akuvuk.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"

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

exit

Cоздай сценарий, который проверяет и исправляет разрешения (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

Удали ранее использованные SSL-сертификаты из 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
crontab -l -u acmeuser

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

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

sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextcloud" --database-user "nextcloud" --database-pass "nextcloud" --admin-user "YourNamecloudAdmin" --admin-pass "YourNextcloudAdminPasssword" --data-dir "/var/nc_data"
  1. database-name «nextcloud» : имя базы данных из Главы 3
  2. —database-user «nextcloud«: пользователь базы данных из Главы 3
  3. database-pass «nextcloud» : пароль пользователя базы данных из главы 3
  4. admin-user «YourNamecloudAdmin«: придумываем имя админа для облака
  5. admin-pass «YourNextcloudAdminPasssword» : придумываем пароль админа

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

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

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

2. Установи свой домен как overwrite.cli.url, изменив cloud.akuvuk.ru:

sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://cloud.akuvuk.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 => 'OCPreviewPNG',
1 => 'OCPreviewJPEG',
2 => 'OCPreviewGIF',
3 => 'OCPreviewBMP',
4 => 'OCPreviewXBitmap',
5 => 'OCPreviewMovie',
6 => 'OCPreviewPDF',
7 => 'OCPreviewMP3',
8 => 'OCPreviewTXT',
9 => 'OCPreviewMarkDown',
),
'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' => 'OCMemcacheAPCu',
'memcache.locking' => 'OCMemcacheRedis',
'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' => '/Freigaben',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF

Измени «.user.ini» и настрой Nextcloud в качестве пользовательских www-data :

sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
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» с помощью интерфейса командной строки Nextcloud:

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

6. Защита сервера NextCloud (fail2ban и ufw).

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

apt update && apt install fail2ban -y
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

Теперь создай новый файл изоляции:

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 

Перезапусти 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 ufw -y
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22/tcp

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

Замени (192.168.2.0/24) на свой ip!

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

Установи для брандмауэра значение «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 && apt upgrade -y && apt install -y postfix mailutils

Создай конфигурацию почты, используя мой пример ниже: сначала выбери конфу, затем введи домен (cloud.akuvuk.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.akuvuk.ru
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, cloud.akuvuk.ru, localhost.akuvuk.ru, localhost
relayhost = smtp.akuvuk.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
Posted in iT, Linux, ГайдыTaggs:
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
guest
1 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Даня
Даня
Гость
1 месяц назад

Спасибо за подробную инструкцию ,всё получилось с первого раза настроить.

1
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x