Nextcloud, включая Nextcloud Office на Ubuntu 22.04 LTS или Debian 12.x с nginx, MariaDB, PHP 8.2, Let’s Encrypt, Redis, Fail2ban и ufw.
В этом руководстве по установке Nextcloud 27.1 (Hub 6) описывается установка, настройка и усиление защиты, мониторинг и некоторые параметры расширения Nextcloud 27.1 на сервере Ubuntu 20.04 LTS focal, 22.04 LTS jammy (x86-64) или Debian Server 11 bullseye (x86-64), Debian 12 bookworm (x86-64).
Установка основана на компонентах nginx 1.25, Let’s Encrypt TLS 1.3, MariaDB 10.11, PHP 8.2 (php-fpm), Redis, Fail2ban, ufw и Netdata и, наконец, получает рейтинг безопасности A+ от Nextcloud и Qualys SSL Labs. В этом руководстве вам нужно использовать только значения, отмеченные перечеркнутым текстом, например: cloud.domain.ru или 192.168.2.x с соответствующими значениями вашей системы.
Системные требования со стороны Nextcloud
https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server
1. Подготовка и установка веб-сервера nginx
Актуальный установочный носитель для базового сервера Linux можно найти здесь:
Ubuntu 22.04.x LTS
Get Ubuntu Server Ubuntu
Debian 12.1.x
Debian — скачать с официального сайта
Только для сервера Debian:
su -
apt install -y sudo
usermod -aG sudo <Ihr aktueller Benutzer>
exit
С этого момента оба: Debian и Ubuntu Server
Переключение в режим привилегированного пользователя
sudo -s
Установить следующие программные пакеты в качестве необходимой основы для работы сервера:
apt install -y \
apt-transport-https bash-completion bzip2 ca-certificates cron curl dialog \
dirmngr ffmpeg ghostscript git gpg gnupg gnupg2 htop jq libfile-fcntllock-perl \
libfontconfig1 libfuse2 locate lsb-release net-tools rsyslog screen smbclient \
socat software-properties-common ssl-cert tree unzip wget zip
Введите имя будущего сервера как в файл hosts, так и в файл hostname:
nano /etc/hosts
Настройте перечёркнутые значения в соответствии с вашей средой, в примере мы предполагаем, что домен называется «cloud.domain.ru«:
127.0.0.1 localhost
127.0.1.1 cloud
::1 cloud ip6-localhost ip6-loopback
[...]
Укажите правильное имя сервера в файле hostname и замените перечёркнутое значение на свое:
nano /etc/hostname
Имя сервера должно быть указано как FQDN, т.е. полностью:
cloud.domain.ru
Убедитесь, что служба сервера времени настроена по крайней мере с одной конечной точкой.
nano /etc/systemd/timesyncd.conf
Если строка NTP закомментирована (#NTP=), удалите знак ‘#’ перед NTP и добавьте, например эти два сервера времени:
NTP=ntp1.ntp-servers.net ntp0.ntp-servers.net
Сохраните этот файл и перезапустите сервер времени:
systemctl restart systemd-timesyncd
Теперь убедитесь, что сервер не может переключиться в «режим энергосбережения»:
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Перезапустите сервер
reboot now
а затем снова войдите на сервер с правами привилегированного пользователя:
sudo -s
Добавьте в систему дополнительные репозитории программного обеспечения (источники программного обеспечения), чтобы иметь возможность устанавливать последние выпуски соответствующих пакетов.
Только Ubuntu Server (X86_64):
Добавьте в систему репозиторий NGINX и MariaDB, а также PPA PHP на Ubuntu 20.04:
apt install -y ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
wget -O- https://mariadb.org/mariadb_release_signing_key.asc \
| gpg --dearmor | sudo tee /usr/share/keyrings/mariadb-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/mariadb-keyring.gpg] \
https://mirror.kumi.systems/mariadb/repo/10.11/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mariadb.list
Только Ubuntu 20.04 LTS – PHP-репозитории:
add-apt-repository -y ppa:ondrej/php
Только для Debian Server (X86_64):
Убедитесь, что у вас установлен пакет debian-archive-keyring:
apt install -y debian-archive-keyring
Добавьте ключ nginx на свой сервер:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Добавьте исходные коды программного обеспечения для nginx и PHP:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Для того, чтобы иметь возможность доверять исходным кодам PHP, мы также добавляем этот ключ:
curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
Только для Debian 11: MariaDB – Репозитории
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup && ./mariadb_repo_setup --mariadb-server-version="mariadb-10.11"
С этого момента он продолжается снова для обеих серверных операционных систем (Ubuntu и Debian):
Сейчас мы обновляем систему и генерируем временные «самоподписанные» сертификаты, которые в дальнейшем будут заменены полноценными сертификатами от Let’s Encrypt.
Обновление сервера:
apt update && make-ssl-cert generate-default-snakeoil -y
Чтобы убедиться, что никакие реликвии предыдущих установок не мешают работе веб-сервера, удаляем эти:
apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages
Кроме того, мы следим за тем, чтобы аналог (Apache2) веб-сервера nginx не был ни активен, ни установлен.
systemctl stop apache2.service
systemctl disable apache2.service
Теперь подготовка к установке веб-сервера завершена, и мы можем установить его с помощью следующей команды
apt install -y nginx
и сервис будет запускаться автоматически после перезагрузки системы с помощью
systemctl enable nginx.service
устраивать. С учетом последующих корректировок конфигурация по умолчанию сохраняется и открывается новый конфигурационный файл (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/nginx.conf):
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
touch /etc/nginx/nginx.conf && nano /etc/nginx/nginx.conf
Скопируйте в файл все следующее содержимое:
user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
multi_accept on; use epoll;
}
http {
log_format criegerde escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log criegerde;
error_log /var/log/nginx/error.log warn;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
send_timeout 3600;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=500 inactive=10m;
open_file_cache_errors on;
keepalive_timeout 65;
reset_timedout_connection on;
server_tokens off;
resolver 127.0.0.53 valid=30s;
resolver_timeout 5s;
include /etc/nginx/conf.d/*.conf;
}
Если вы управляете Nextcloud за обратным прокси-сервером, замените IP-адрес параметра «set_real_ip_from 127.0.0.1» на IP-адрес обратного прокси-сервера («set_real_ip_from w.x.y.z»).
Сохраните файл и закройте его, чтобы перезапустить веб-сервер:
systemctl restart nginx.service
При подготовке к SSL-сертификатам и веб-каталогам мы создадим четыре папки и установим правильные разрешения:
mkdir -p /var/log/nextcloud /var/nc_data /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
chown -R www-data:www-data /var/nc_data /var/www /var/log/nextcloud
Установка веб-сервера завершена, и мы продолжаем установку и настройку PHP.
Установка и настройка PHP 8.2 (fpm)
PHP-репозиторий уже был настроен и активирован в предыдущей главе, поэтому мы можем сразу приступить к его установке.
apt update && apt install -y php-common \
php8.2-{fpm,gd,curl,xml,zip,intl,mbstring,bz2,ldap,apcu,bcmath,gmp,imagick,igbinary,mysql,redis,smbclient,cli,common,opcache,readline} \
imagemagick libmagickcore-6.q16-6-extra --allow-change-held-packages
Опционально (для использования общих папок Samba, cifs или LDAP-соединения):
apt install -y ldap-utils nfs-common cifs-utils
Установите правильный формат даты, чтобы включить правильное ведение журнала:
timedatectl set-timezone Europe/Moscow
Прежде чем мы начнем с оптимизации PHP, давайте создадим резервную копию конфигурационных файлов:
cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/www.conf.bak
cp /etc/php/8.2/fpm/php-fpm.conf /etc/php/8.2/fpm/php-fpm.conf.bak
cp /etc/php/8.2/cli/php.ini /etc/php/8.2/cli/php.ini.bak
cp /etc/php/8.2/fpm/php.ini /etc/php/8.2/fpm/php.ini.bak
cp /etc/php/8.2/mods-available/apcu.ini /etc/php/8.2/mods-available/apcu.ini.bak
cp /etc/php/8.2/mods-available/opcache.ini /etc/php/8.2/mods-available/opcache.ini.bak
cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak
systemctl restart php8.2-fpm.service
С помощью этого скрипта можно определить, в том числе, следующие параметры.
» Кодеберг: https://codeberg.org/criegerde/nextcloud/raw/branch/master/skripte/phpcalc.sh
Выполните следующие команды:
sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.2/fpm/pool.d/www.conf
# Хелпик:
# Следующая строка необязательная и рекомендуется только при мониторинге:
# sed -i 's/pm = dynamic/pm = static/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.max_children =.*/pm.max_children = 200/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = 100/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = 60/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = 140/' /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.2/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = Off/" /etc/php/8.2/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.2/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.2/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.2/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.2/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Moscow/" /etc/php/8.2/cli/php.ini
sed -i "s/;cgi.fix_pathinfo.*/cgi.fix_pathinfo=0/" /etc/php/8.2/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1G/" /etc/php/8.2/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = Off/" /etc/php/8.2/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.2/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.2/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10G/" /etc/php/8.2/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10G/" /etc/php/8.2/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Moscow/" /etc/php/8.2/fpm/php.ini
sed -i "s/;cgi.fix_pathinfo.*/cgi.fix_pathinfo=0/" /etc/php/8.2/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.validate_timestamps=.*/opcache.validate_timestamps=1/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=256/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=64/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=100000/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=0/" /etc/php/8.2/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.2/fpm/php.ini
sed -i "s|;emergency_restart_threshold.*|emergency_restart_threshold = 10|g" /etc/php/8.2/fpm/php-fpm.conf
sed -i "s|;emergency_restart_interval.*|emergency_restart_interval = 1m|g" /etc/php/8.2/fpm/php-fpm.conf
sed -i "s|;process_control_timeout.*|process_control_timeout = 10|g" /etc/php/8.2/fpm/php-fpm.conf
sed -i '$aapc.enable_cli=1' /etc/php/8.2/mods-available/apcu.ini
sed -i 's/opcache.jit=off/; opcache.jit=off/' /etc/php/8.2/mods-available/opcache.ini
sed -i '$aopcache.jit=1255' /etc/php/8.2/mods-available/opcache.ini
sed -i '$aopcache.jit_buffer_size=256M' /etc/php/8.2/mods-available/opcache.ini
sed -i "s/rights=\"none\" pattern=\"PS\"/rights=\"read|write\" pattern=\"PS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"EPS\"/rights=\"read|write\" pattern=\"EPS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"PDF\"/rights=\"read|write\" pattern=\"PDF\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"XPS\"/rights=\"read|write\" pattern=\"XPS\"/" /etc/ImageMagick-6/policy.xml
Давайте оптимизируем PHP для MariaDB:
sed -i '$a[mysql]' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.allow_local_infile=On' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.allow_persistent=On' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.cache_size=2000' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.max_persistent=-1' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.max_links=-1' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.default_port=3306' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.connect_timeout=60' /etc/php/8.2/mods-available/mysqli.ini
sed -i '$amysql.trace_mode=Off' /etc/php/8.2/mods-available/mysqli.ini
Перезапустите оба сервиса, nginx и PHP:
systemctl restart php8.2-fpm.service nginx.service
PHP теперь также установлен и оптимизирован для Nextcloud. Теперь начнем с установки и настройки сервера базы данных MariaDB.
3. Установка и настройка MariaDB 10.11
Чтобы установить MariaDB, используйте следующую команду:
apt update && apt install -y mariadb-server
Теперь давайте укрепим сервер базы данных с помощью прилагаемого инструмента «mysql_secure_installation». Пароль root для первой установки отсутствует, поэтому вы можете подтвердить запрос с помощью ENTER. Рекомендуется установить пароль напрямую, соответствующий диалог появится автоматически:
mysql_secure_installation
Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Теперь остановите сервер базы данных, а затем сохраните конфигурацию по умолчанию, чтобы иметь возможность вносить изменения сразу после этого
systemctl stop mysql
mkdir -p /var/log/mysql
chown -R mysql:mysql /var/log/mysql
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf
Скопируйте все следующие строки в пустой файл:
[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
# performance_schema=ON
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 512M
innodb_read_only_compressed=OFF
join_buffer_size = 2M
key_buffer_size = 512M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_connections = 100
max_heap_table_size = 64M
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 0
query_cache_size = 0
read_buffer_size = 2M
read_rnd_buffer_size = 2M
skip-name-resolve
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 2M
table_open_cache = 400
table_definition_cache = 800
tmp_table_size = 32M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M
Сохраните и закройте файл, затем перезапустите сервер базы данных, чтобы настроить базу данных Nextcloud, пользователя Nextcloud и его пароль:
systemctl restart mysql.service
mysql -uroot -p
CREATE DATABASE nextclouddb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextclouddbuser@localhost identified by 'nextclouddbpassword'; GRANT ALL PRIVILEGES on nextclouddb.* to nextclouddbuser@localhost; FLUSH privileges; quit;
Пояснение
Database имя: nextclouddb
Пользователь базы данных: nextclouddbuser
Пароль пользователя базы данных: nextclouddbpassword
mysql -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='nextclouddb'"
Появляется в выходных данных (результирующем наборе) «READ-COMMITTED» и «utf8mb4_general_ci» все настроено правильно и можно приступать к установке Redis.
4. Установка и настройка Redis
Устанавливаем сервер Redis для повышения производительности Nextcloud, так как Redis снижает нагрузку на базу данных MariaDB Nextcloud:
apt update && apt install -y redis-server
Отрегулируйте перенастройку, сохранив и настроив конфигурацию, выполнив следующие команды
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i 's/port 6379/port 0/' /etc/redis/redis.conf
sed -i s/#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i 's/unixsocketperm 700/unixsocketperm 770/' /etc/redis/redis.conf
sed -i 's/# maxclients 10000/maxclients 10240/' /etc/redis/redis.conf
sed -i 's/# requirepass foobared/requirepass BitteAendern/' /etc/redis/redis.conf
usermod -aG redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf
Исходя из достаточного опыта установки, рекомендую один раз перезагрузить весь сервер:
reboot now
Поздравляем, сервер уже установлен и настроен, поэтому теперь можно приступать к настройке Nextcloud.
5. Установка и оптимизация Nextcloud (в т.ч. SSL)
Теперь мы настраиваем различные vhosts, т.е. конфигурационные файлы swegeter, и постоянно модифицируем файл vhost по умолчанию. Так как система была перезагружена ранее, мы снова переключаемся в режим привилегированного пользователя, делаем резервную копию файла vhost по умолчанию default.conf и создаем пустые файлы vHost для настройки.
sudo -s
[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
touch /etc/nginx/conf.d/default.conf
touch /etc/nginx/conf.d/http.conf
touch /etc/nginx/conf.d/nextcloud.conf
Таким образом, пустой файл «default.conf» гарантирует, что эта конфигурация по умолчанию не повлияет на работу Nextcloud даже при последующих обновлениях веб-сервера.
Создайте глобальный файл vhost, чтобы постоянно перенаправлять http-запросы по умолчанию на https, а также включить связь с SSL-сертификатом с Let’sEncrypt
nano /etc/nginx/conf.d/http.conf
Скопируйте все следующие строки в файл http.conf и отрегулируйте перечернкнутые значения в соответствии с вашей системой:
upstream php-handler {
server unix:/run/php/php8.2-fpm.sock;
}
map $arg_v $asset_immutable {
"" "";
default "immutable";
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name cloud.domain.ru;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
Сохраните и закройте этот файл. Теперь отредактируйте актуальный файл Nextcloud vHost nextcloud.conf, который содержит все конфигурации для работы Nextcloud.
nano /etc/nginx/conf.d/nextcloud.conf
Скопируйте все следующие строки в файл nextcloud.conf и отрегулируйте перечёркнутые значения в соответствии с вашей системой
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
http2 on;
server_name cloud.domain.ru;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
client_max_body_size 10G;
client_body_timeout 3600s;
client_body_buffer_size 512k;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Permissions-Policy "interest-cohort=()";
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
fastcgi_hide_header X-Powered-By;
include mime.types;
types {
text/javascript mjs;
}
root /var/www/nextcloud;
index index.php index.html /index.php$request_uri;
location = / {
if ( $http_user_agent ~ ^DavClnt ) {
return 302 /remote.php/webdav/$is_args$args;
}
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
return 301 /index.php$request_uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
location ~ \.php(?:$|/) {
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463, $asset_immutable";
expires 6M;
access_log off;
location ~ \.wasm$ {
default_type application/wasm;
}
}
location ~ \.woff2?$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
Сохраните и закройте этот файл, а затем расширьте безопасность сервера и системы возможностью безопасного обмена ключами с помощью ключа Диффи-Хеллмана
openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Пожалуйста, наберитесь терпения! В зависимости от производительности системы его создание может занять несколько минут. Только после завершения генерации мы перезапускаем веб-сервер.
systemctl restart nginx.service
Теперь мы приступаем к «фактической» установке программного обеспечения Nextcloud и настройке SSL-сертификатов Let’s Encrypt с помощью acme. Для этого переключитесь в рабочую директорию
cd /usr/local/src
и скачайте последнюю версию Nextcloud:
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
wget https://download.nextcloud.com/server/releases/latest.tar.bz2.md5
Проверьте файлы:
md5sum -c latest.tar.bz2.md5 < latest.tar.bz2
Только в том случае, если тест подтвердится «ОК», мы продолжим!
Распакуйте программное обеспечение Nextcloud в веб-каталог (var/www), затем установите соответствующие разрешения и удалите загружаемый файл:
tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm -f latest.tar.bz2
Пожалуйста, убедитесь, что ваш сервер доступен извне через порт 80/TCP и порт 443/TCP. Создание и обновление сертификатов Let’s Encrypt является обязательным по http и порту 80! Для работы с сертификатами мы создадим выделенного пользователя и добавим его в группу www-data:
adduser acmeuser --gecos "" --disabled-password
usermod -aG www-data acmeuser
Мы также предоставляем этому техническому пользователю необходимые разрешения, чтобы иметь возможность инициировать необходимый запуск веб-сервера в случае обновления сертификата.
touch /etc/sudoers.d/acmeuser
cat <<EOF >/etc/sudoers.d/acmeuser
acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service
EOF
Переключитесь в оболочку нового пользователя (acmeuser) для установки программного обеспечения сертификата и выйдите из этой оболочки сразу после этого:
su - acmeuser
curl https://get.acme.sh | sh
exit
Настройте соответствующие права доступа к файлам и каталогам, чтобы иметь возможность хранить в них новые сертификаты:
chmod -R 775 /var/www/letsencrypt && chmod -R 770 /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt
Установите Let’s Encrypt в качестве центра сертификации по умолчанию для вашего сервера
su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"
, а затем переключитесь обратно на оболочку нового пользователя
su - acmeuser
Теперь подайте заявку на получение SSL-сертификатов Let’s Encrypt, заменив cloud.domain.ru своим реальным доменом:
acme.sh --issue -d cloud.domain.ru --server letsencrypt --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d cloud.domain.ru --server letsencrypt --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
Выйдите из оболочки нового пользователя
exit
а затем создать сценарий, который будет проверять и исправлять разрешения в будущем (permissions.sh):
nano /root/permissions.sh
Скопируйте все строки в файл:
#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
if [ -d "/var/www/nextcloud/apps/notify_push" ]; then
chmod ug+x /var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push
fi
chmod -R 775 /var/www/letsencrypt
chmod -R 770 /etc/letsencrypt
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /var/nc_data
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0
Пометьте скрипт как исполняемый, а затем запустите его напрямую:
chmod +x /root/permissions.sh
/root/permissions.sh
Удалите ранее использованные самоподписанные сертификаты из nginx и активируйте новые, полноценные и уже действующие SSL-сертификаты от Let’s Encrypt. Затем перезапустите веб-сервер:
sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/nextcloud.conf
sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/nextcloud.conf
systemctl restart nginx.service
Для автоматического обновления SSL-сертификатов, а также для инициирования необходимого перезапуска веб-сервера было автоматически создано задание cron.
crontab -l -u acmeuser
Теперь мы можем приступить к настройке Nextcloud. Для этого воспользуйтесь следующей командой «тихой» установки:
sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextclouddb" --database-user "nextclouddbuser" --database-pass "nextclouddbpassword" --admin-user "YourNextcloudAdmin" --admin-pass "YourNextcloudAdminPasssword" --data-dir "/var/nc_data"
Пояснения:
имя-базы данных «nextclouddb» : имя базы данных из главы 3
database-user «nextclouddbuser» : Пользователи базы данных из главы 3
database-pass «nextclouddbpassword» : Пароль пользователя базы данных из главы 3
admin-user «YourNextcloudAdmin» : свободно выбирается вами
admin-pass «YourNextcloudAdminPasssword» : свободно выбирается вами
Подождите, пока установка Nextcloud будет завершена, а затем настройте центральный конфигурационный файл Nextcloud «config.php» в качестве www-data веб-пользователя:
1. Добавьте свой домен в качестве доверенного, дополнив cloud.domain.ru выделенным доменом:
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=cloud.domain.ru
2. Установите свой домен как overwrite.cli.url и overwritehost, добавив cloud.domain.ru к вашему выделенному домену:
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://cloud.domain.ru
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwritehost --value=cloud.domain.ru
Наконец, давайте расширим конфигурацию Nextcloud. Для этого сначала сохраните существующий конфигурационный .php, а затем выполните следующие строки в блоке:
sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.bak
sudo -u www-data touch /var/www/nextcloud/config/tweaks.config.php
sudo -u www-data cat <<EOF >>/var/www/nextcloud/config/tweaks.config.php
<?php
\$CONFIG = array (
'activity_expire_days' => 14,
'allow_local_remote_servers' => true,
'auth.bruteforce.protection.enabled' => true,
'blacklisted_files' =>
array (
0 => '.htaccess',
1 => 'Thumbs.db',
2 => 'thumbs.db',
),
'cron_log' => true,
'default_phone_region' => 'DE',
'defaultapp' => 'files,dashboard',
'enable_previews' => true,
'enabledPreviewProviders' =>
array (
0 => 'OC\Preview\PNG',
1 => 'OC\Preview\JPEG',
2 => 'OC\Preview\GIF',
3 => 'OC\Preview\BMP',
4 => 'OC\Preview\XBitmap',
5 => 'OC\Preview\Movie',
6 => 'OC\Preview\PDF',
7 => 'OC\Preview\MP3',
8 => 'OC\Preview\TXT',
9 => 'OC\Preview\MarkDown',
),
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'htaccess.RewriteBase' => '/',
'integrity.check.disabled' => false,
'knowledgebaseenabled' => false,
'logfile' => '/var/log/nextcloud/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Moscow',
'log_rotate_size' => '104857600',
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 768,
'preview_max_scale_factor' => 1,
'profile.enabled' => false,
'redis' =>
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'password' => 'Password',
'timeout' => 0.5,
'dbindex' => 1,
),
'quota_include_external_storage' => false,
'share_folder' => '/shara',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF
Измените файл «.user.ini»
sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
и адаптировать приложения Nextcloud в качестве пользовательских www-данных
sudo -u www-data php /var/www/nextcloud/occ app:disable survey_client
sudo -u www-data php /var/www/nextcloud/occ app:disable firstrunwizard
sudo -u www-data php /var/www/nextcloud/occ app:enable admin_audit
sudo -u www-data php /var/www/nextcloud/occ app:enable files_pdfviewer
Опционально Nextcloud Office:
sudo -u www-data /usr/bin/php /var/www/nextcloud/occ app:install richdocuments
sudo -u www-data /usr/bin/php /var/www/nextcloud/occ app:install richdocumentscode
Nextcloud теперь полностью работоспособен, оптимизирован и безопасен. Перезапустите все соответствующие службы:
systemctl stop nginx.service
systemctl stop php8.2-fpm.service
systemctl restart mysql.service
systemctl restart php8.2-fpm.service
systemctl restart redis-server.service
systemctl restart nginx.service
Настройте задание cron для Nextcloud от имени пользователя «www-data»:
crontab -u www-data -e
Вставьте эту строку
*/5 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1
Затем сохраните и закройте файл и перенастройте задание Nextcloud с «Ajax» на «Cron» с помощью интерфейса командной строки Nextclouds:
sudo -u www-data php /var/www/nextcloud/occ background:cron
Пожалуйста, уделите некоторое время, чтобы проверить состояние безопасности вашего сервера.
Цель также должна состоять в том, чтобы получить по крайней мере следующие результаты «А+» в тестах:
https://www.ssllabs.com/ssltest/index.html
и https://observatory.mozilla.org/
Чтобы избежать трудностей, которые могут возникнуть в результате обновления используемых компонентов, соответствующие пакеты могут быть исключены из обновления с помощью «apt-mark hold»:
apt-mark hold nginx*
apt-mark hold redis*
apt-mark hold mysql*
apt-mark hold galera*
apt-mark hold mariadb*
apt-mark hold php*
Чтобы снова включить эти пакеты в контекст обновлений, необходимо снять только «hold»:
apt-mark unhold nginx*
apt-mark unhold redis*
apt-mark unhold mysql*
apt-mark unhold galera*
apt-mark unhold mariadb*
apt-mark unhold php*
После обновления мы рекомендуем снова установить его в ‘hold’.
6. Усиление защиты системы (fail2ban (альтернатива «crowdsec IPS») и ufw)
Во-первых, мы устанавливаем fail2ban (альтернатива crowdsec IPS) для защиты сервера от атак методом перебора и ошибочных попыток входа в систему:
apt update && apt install -y fail2ban && systemctl enable fail2ban.service
Создайте новый файл фильтра и заполните его, как описано ниже
touch /etc/fail2ban/filter.d/nextcloud.conf
Скопируйте все из «cat…» до «… EOF» в буфер обмена, а затем вставьте его в оболочку:
cat <<EOF >/etc/fail2ban/filter.d/nextcloud.conf
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
EOF
Подтвердите нажатием <ENTER> для заполнения файла. Результат следующий:
cat /etc/fail2ban/filter.d/nextcloud.conf
Теперь создадим новый файл jail
nano /etc/fail2ban/jail.d/nextcloud.local
Скопируйте и вставьте в него все следующие строки:
[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 5
bantime = 3600
findtime = 36000
logpath = /var/log/nextcloud/nextcloud.log
При указанных выше параметрах после 5 неудачных попыток входа (maxretry) в течение последних 36000 секунд (findtime, что соответствует 10h) IP потенциального злоумышленника блокируется на срок 3600 секунд (bantime, соответствует 1h).
Перезапустите fail2ban и проверьте статус fail2ban:
systemctl restart fail2ban.service
fail2ban-client status nextcloud
С этого момента IP-адреса, на которых было 5 и более неудачных попыток входа в течение последних 10 часов, будут заблокированы на 1 час, а ваш сервер будет защищен от дальнейших атак. Если вы хотите протестировать блокировку вручную и разблокировать получившийся блок вашего IP или уже заблокированных IP-адресов, сначала выполните эту команду,
fail2ban-client status nextcloud
для просмотра заблокированных IP-адресов. Вы можете разблокировать отображаемые IP-адреса с помощью следующей команды:
fail2ban-client set nextcloud unbanip <ip-adresse>
Наконец, мы устанавливаем брандмауэр, так называемый uncomplicated firewall (ufw):
Если вы ранее поменяли порт SSH с 22 на другой порт, вам нужно будет заменить порт 22 соответствующим образом!
apt install -y ufw
ufw allow 80/tcp comment "LetsEncrypt (http)"
ufw allow 443/tcp comment "LetsEncrypt (https)"
ufw allow 22/tcp comment "SSH"
Если вы не хотите делиться SSH с внешним миром (рекомендуется!) и используете его только из внутренней сети, замените последнюю команду ufw (ufw allow 22/tcp) на эту:
ufw allow proto tcp from 192.168.2.0/24 to any port 22 comment "SSH nur aus dem LAN"
Замените пример сети (192.168.2.0/24) на сеть, которую вы используете!
Установите для ведения журнала брандмауэра значение «medium» и предотвратите неопределенные входящие соединения.
ufw logging medium
ufw default deny incoming
Включите и перезапустите брандмауэр:
ufw enable
systemctl restart ufw.service
Nextcloud связывается с различными удаленными серверами для того, чтобы иметь возможность обрабатывать, обмениваться и предоставлять определенную информацию:
- www.nextcloud.com, www.startpage.com, www.eff.org www.edri.org для проверки интернет-соединения
- apps.nextcloud.com доступных приложений
- updates.nextcloud.com для обновлений Nextcloud
- lookup.nextcloud.com Для обновления и поиска в адресной книге федеративного общего доступа
- push-notifications.nextcloud.com отправки push-уведомлений мобильным клиентам
- surveyserver.nextcloud.com, согласился ли администратор поделиться анонимными данными
- Любой удаленный сервер Nextcloud, подключенный к федеративному общему доступу
7. Отправляйте системные письма через postfix
Обновите сервер и установите postfix. Это дает вам возможность получать информацию от fail2ban, apticron и, в случае регистрации SSH, по электронной почте:
apt update && apt install -y postfix mailutils
Создайте конфигурацию почты, используя мой пример ниже: сначала выберите Satellite System, затем введите свой домен (bspw.domain.de) и, наконец, smtp-сервер.
Теперь настройте конфигурацию постфикса:
nano /etc/postfix/main.cf
Замените перечёркнутые значения:
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = cloud.domain.ru
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, cloud.domain.ru, localhost.domain.ru, localhost
relayhost = smtp.mailserver.ru:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
#Bei Problemen mit IPv6 stellen Sie die Zeile wie nachfolgend um
#inet_protocols = ipv4
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_use_tls = yes
smtp_enforce_tls = yes
Теперь введите данные доступа для отправки электронных писем:
nano /etc/postfix/sasl_passwd
Введите данные следующим образом и замените зачёркнутые значения на свои:
smtp.domain.ru cloud@domain.ru:passwort
Так как пароль в этом файле написан открытым текстом, мы установили права доступа к файлу на 600
chmod 600 /etc/postfix/sasl_passwd
Теперь пропишите домен в файле mailname:
nano /etc/mailname
Замените на свой домен:
domain.ru
Наконец, мы определяем, как пользователи относятся к адресам электронной почты. Откройте файл
nano /etc/postfix/sender_canonical
и определите там пользователей и адреса электронной почты:
root mail@domain.ru
<Ihr Benu> mail@domain.ru
www-data mail@domain.ru
default mail@domain.ru
Теперь скомпилируйте конфигурацию и перезапустите Postfix:
postmap /etc/postfix/sasl_passwd
postmap /etc/postfix/sender_canonical
systemctl restart postfix.service
Теперь протестируйте отправку электронного письма через Postfix
echo "Dies ist eine Testmail" | mailx -s "Test" cloud@domain.ru
Если почта не приходит, пожалуйста, проверьте журнал (mail.log):
tail -f /var/log/mail.log
Настройте конфигурацию PHP так, чтобы она также отправляла письма PHP через postfix:
nano /etc/php/8.2/fpm/php.ini
Установите sendmail_path следующим образом:
sendmail_path = "/usr/sbin/sendmail -t -i"
а затем перезапустите PHP:
systemctl restart php8.2-fpm.service
Теперь вы также можете соответствующим образом настроить Nextcloud
Теперь ваш почтовый сервер готов к использованию, и теперь вы можете настроить дальнейшую системную почту (например, из fail2ban и apticron):
(необязательно) 7.1 Настройка почтовых уведомлений fail2ban
В конфигурации fail2ban замените следующие параметры на свои, чтобы получать уведомления о неправильных попытках входа в систему и банах. Для этого сохраните исходную конфигурацию fail2ban, а затем отредактируйте ее:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
nano /etc/fail2ban/jail.conf
Замените красные значения:
...
destemail = user@mailadresse.ru
...
sender = user@mailadresse.ru
...
mta = mail
...
# action = %(action_)s
action = %(action_mwl)s
...
Чтобы подавить сообщения fail2ban во время перезагрузки сервера, настройте следующий файл:
nano /etc/fail2ban/action.d/mail-buffered.local
Скопируйте содержимое в:
[Definition]
actionstart =
actionstop =
Затем создайте фиктивные файлы, выполнив следующие команды:
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois-lines.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-buffered.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-common.local
Перезапустите службу fail2ban
systemctl restart fail2ban.service
и с этого момента вы будете (только) проинформированы о банах, т.е. о новых заблокированных IP-адресах, которые были замечены при неправильных попытках входа в систему.
(необязательно) 7.2 Установка Apticron, включая уведомления по почте
Apticron уведомляет вас о доступных системных обновлениях или даже о том, что ваша система «up2date». Установите apticron из стандартных программных источников Ubuntu:
apt update && apt install -y apticron
Теперь давайте настроим apticron и изменим следующие параметры:
cp /usr/lib/apticron/apticron.conf /etc/apticron/apticron.conf
nano /etc/apticron/apticron.conf
...
EMAIL="user@mailadresse.ru"
...
SYSTEM="cloud.domain.ru"
...
NOTIFY_HOLDS="1"
...
NOTIFY_NO_UPDATES="1"
...
CUSTOM_SUBJECT='$SYSTEM: $NUM_PACKAGES package update(s)'
...
CUSTOM_NO_UPDATES_SUBJECT='$SYSTEM: no updates available'
...
CUSTOM_FROM="cloud@mailadresse.ru"
...
Проверьте apticron и доставку почты, которую вы только что настроили, вызвав apticron:
apticron
Теперь вы сразу же получите уведомление по электронной почте о текущем состоянии вашей системы. Наконец, настройте задание cron так, чтобы получать уведомления регулярно и автоматически:
cp /etc/cron.d/apticron /etc/cron.d/apticron.bak
nano /etc/cron.d/apticron
30 7 * * * root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi
Используя приведенный выше пример, Apticron будет информировать вас по электронной почте каждое утро в 7:30 утра об обновлении вашей системы.
(необязательно) 7.3 Почтовые уведомления для подключения по SSH
Настройте файл профиля и добавьте следующие строки в конце:
nano /etc/profile
if [ -n "$SSH_CLIENT" ]; then
echo 'Login on' `hostname` `date` `who -m` | mail -s "Login on `hostname` from `echo $SSH_CLIENT |
awk '{print $1}'`" ihre@mailadresse.de
fi
С этого момента вы будете активно получать уведомления о каждом успешном подключении по SSH.
8. Опционально: мониторинг системы с помощью netdata
Во-первых, загрузите дополнительные программные компоненты, а затем установите Netdata из git:
cd /usr/local/src
apt install apache2-utils zlib1g-dev uuid-dev libuv1-dev liblz4-dev libssl-dev libelf-dev libmnl-dev libprotobuf-dev protobuf-compiler gcc g++ make git autoconf autoconf-archive autogen automake pkg-config curl python cmake
git clone https://github.com/netdata/netdata.git --depth=100 --recursive
Для защиты мониторинга используем Apache2-utils и устанавливаем паролем защиту от Netdata:
htpasswd -c /etc/nginx/netdata-access IhrName
Теперь начнется установка
cd /usr/local/src/netdata
./netdata-installer.sh --disable-telemetry -u
Через несколько секунд Netdata уже полностью установлена и готова к работе, но необходимо выполнить всего несколько конфигураций:
nano /etc/netdata/netdata.conf
Измените значение для «history» на, например: 14400 (сохраняются данные за последние 4 часа, требуется ок. 60 МБ ОЗУ) в диапазоне [global]:
history = 14400
Кроме того, настройте область [web] так, чтобы Netdata прослушивала только localhost:
bind to = 127.0.0.1
Для того, чтобы иметь возможность использовать веб-интерфейс, существующий файл vHost (nextcloud.conf) расширяется:
nano /etc/nginx/conf.d/nextcloud.conf
Добавьте красные линии:
[...]
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location /netdata {
return 301 /netdata/;
}
location ~ /netdata/(?<ndpath>.*) {
auth_basic "Bitte Zugangsdaten eingeben";
auth_basic_user_file /etc/nginx/netdata-access;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Connection "keep-alive";
proxy_store off;
proxy_pass http://netdata/$ndpath$is_args$args;
gzip on;
gzip_proxied any;
gzip_types *;
}
[...]
Расширьте возможности веб-сервера nginx с помощью встроенных функций status – создайте новый vHost (/etc/nginx/conf.d/stub_status.conf)
touch /etc/nginx/conf.d/stub_status.conf && nano /etc/nginx/conf.d/stub_status.conf
и копируем в него все строки:
server { listen 127.0.0.1:80 default_server; server_name 127.0.0.1; location /stub_status { stub_status on; allow 127.0.0.1; deny all; } }
Наконец, конфигурация веб-сервера (/etc/nginx/nginx.conf) расширена красными линиями, так что Netdata может быть вызвана на существующем веб-сервере:
nano /etc/nginx/nginx.conf
[...]
http {
server_names_hash_bucket_size 64;
upstream netdata {
server 127.0.0.1:19999;
keepalive 64;
}
[...]
После окончательного перезапуска служб Netdata и веб-сервера
systemctl restart netdata.service nginx.service
Вы уже можете использовать Netdata и анализировать свою систему:
https://cloud.domain.ru/netdata
Netdata — это универсальное решение для мониторинга, созданное с помощью молниеносного ядра C, окруженного сотнями сборщиков. Обладая комплексной информационной панелью с тысячами показателей, высочайшей производительностью и настраиваемостью, он является идеальным инструментом мониторинга одного узла […]
Чтобы обновить Netdata, просто выполните следующий сценарий
/usr/libexec/netdata/netdata-updater.sh
Текущая версия будет проверена и, при необходимости, обновлена до актуальной
9. Дополнительно: расширение/перемещение хранилища Nextcloud
Хранилище данных Nextcloud относительно легко расширяется. Возможные варианты: NFS (или Samba (cifs)), HHD/SD и приложение внешнего хранилища Nextcloud. В следующих примерах подробно описано, как это работает:
9.1 Расширение хранилища Nextcloud через NAS (nfs):
Сначала устанавливаем необходимые модули
apt install -y nfs-common
, а затем расширьте fstab
cp /etc/fstab /etc/fstab.bak
nano /etc/fstab
Чтобы постоянно монтировать диск в систему, выполните следующие действия.
<IP-NFS-SERVER>:/<Freigabename> /<ihr>/<mountpoint> nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
После успешного знакомства с помощью
chown -R www-data:www-data /<ihr>/<mountpoint>
mount /<ihr>/<mountpoint>
и базовый процесс копирования как конфигурационный .php все еще должен быть адаптирован, так и индекс Nextcloud должен быть перестроен. Для этого сначала остановите Nextcloud
systemctl stop php8.2-fpm.service nginx.service
а затем отредактируйте файл config.php относительно нового каталога данных:
sudo -u www-data nano /var/www/nextcloud/config/config.php
[...]
'datadirectory' =>'/<ihr>/<mountpoint>',
[...]
Теперь скопируйте предыдущий каталог данных в новый каталог:
rsync -av --progress --stats /<altes Datenverzeichnis>/ /<ihr>/<mountpoint>
Как только это копирование будет завершено, индекс Nextcloud будет перестроен:
systemctl stop nginx.service php8.2-fpm.service
redis-cli -s /var/run/redis/redis-server.sock
FLUSHALL
quit
sudo -u www-data php /var/www/nextcloud/occ files:scan --all -v
sudo -u www-data php /var/www/nextcloud/occ files:scan-app-data -v
systemctl start php8.2-fpm.service nginx.service
После успешного перестроения индекса Nextcloud
данные уже доступны вам с помощью NFS Share. Если вы планируете иметь возможность редактировать данные непосредственно через Nextcloud, а также через Share, вам следует установить параметр
'filesystem_check_changes' => 1,
в конфиге .php. Это гарантирует, что независимо от того, где данные были отредактированы в последний раз, файловое приложение Nextcloud всегда синхронизировано с NFS (т.е. обновлено).
9.2 Расширьте хранилище Nextcloud с помощью дополнительного жесткого диска/твердотельного накопителя
Допустим, новый жесткий диск может быть смонтирован в папке ‘/dev/sda’ для Nextcloud. Мы форматируем этот HDD/SSD с файловой системой ‘ext4’ и постоянно монтируем его в систему (/etc/fstab). Давайте сначала запустим и остановим сервер Nextcloud:
systemctl stop nginx.service php8.2-fpm.service redis-server.service mysql.service stop
Теперь проверим наличие нового диска на сервере
fdisk -l
и разделите его следующим
образом (предполагая, что новый диск доступен по адресу /dev/sda):
fdisk /dev/sda
- Нажмите ‘o‘, чтобы создать новую таблицу секционирования
- Выберите ‘n‘, чтобы создать новый раздел
- Выберите ‘p‘ (тип первичного раздела), т.е. основной раздел
- Наберите номер раздела: 1
- Дальнейшие записи могут быть переданы с помощью клавиши ENTER без дополнительной информации, т.е. со значениями по умолчанию <Enter>
- Установите конфигурацию: ‘w‘ и нажмите <ENTER>
Новый раздел ‘/dev/sda1’ уже создан и его нужно только отформатировать:
mkfs.ext4 /dev/sda1
fdisk -s /dev/sda1
Теперь давайте создадим новый каталог ‘/nc_data’ и смонтируем новый раздел ‘/dev/sda1’:
mkdir -p /nc_data
chown -R www-data:www-data /nc_data
Личное вложение делается в fstab:
cp /etc/fstab /etc/fstab.hd.bak
nano /etc/fstab
Добавьте следующую строку в конце:
/dev/sda1 /nc_data ext4 defaults 0 1
Теперь давайте выполним следующую команду для монтирования диска:
mount -a
Взглянув на файловую систему, мы увидим новый диск в системе:
df -Th
Теперь переносим данные инвентаризации в новый каталог
(предполагая: ваши данные Nextcloud ранее находились в /var/nc_data):
rsync -av /var/nc_data/ /nc_data
и настройте конфигурацию Nextcloud .php с учетом нового каталога данных:
sudo -u www-data nano /var/www/nextcloud/config/config.php
Измените его следующим образом:
[...]
'datadirectory' =>'/nc_data',
[...]
Наконец, мы перезапускаем ранее прерванные службы и выполняем прогон индексации:
systemctl start mysql.service php8.2-fpm.service redis-server.service
cd /var/www/nextcloud
redis-cli -s /var/run/redis/redis-server.sock
FLUSHALL
quit
sudo -u www-data php occ files:scan --all -v
sudo -u www-data php occ files:scan-app-data -v
systemctl restart php8.2-fpm.service nginx.service
С этого момента вся емкость нового жесткого диска доступна для вашего Nextcloud.
Примечание: Если данные из предыдущего каталога были успешно скопированы, исходный каталог может быть удален навсегда:
rm -Rf /var/nc_data/
9.3 Расширение хранилища Nextcloud с помощью приложения «Внешнее хранилище»
В дополнение к главам 10.1 и 10.2, хранилище Nextcloud также может быть расширено с помощью собственного приложения Nextcloud «внешнее хранилище».
Это позволяет без сложностей получить доступ к различным носителям информации:
- Файлы могут быть воссозданы, отредактированы и удалены «из коробки» — как внутри, так и за пределами Nextcloud — и всегда синхронизированы.
- Вы можете предоставить дополнительные диски и общие ресурсы в качестве дополнительного хранилища Nextcloud,
- Вы можете разрешить пользователям использовать свои собственные устройства в качестве внешнего хранилища.
Дополнительную документацию об этом приложении можно найти здесь.
10. Высокопроизводительный бэкенд Nextcloud для файлов
Начинаем с настройки высокопроизводительного бэкенда для файлов и переходим для этого в Nextcloud App Store. В категории «Инструменты» вы найдете приложение Client Push.
Кроме того, вы можете установить приложение из командной строки:
sudo -u www-data php /var/www/nextcloud/occ app:enable notify_push
После установки и активации через App Store действия в интерфейсе Nextcloud уже завершены. Продолжайте здесь в командной строке сервера.Прежде всего, виртуальный хост для Nextcloud нуждается в небольшом расширении
nano /etc/nginx/conf.d/nextcloud.conf
В конце файла добавляем желтые строки
[...]
location / {
try_files $uri $uri/ /index.php$request_uri;
}
location ^~ /push/ {
proxy_pass http://127.0.0.1:7867/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Перезапустите веб-сервер:
systemctl restart nginx.service
Настройка высокопроизводительного бэкенда для файлов затем вызывается через OCC:
cd /var/www/nextcloud
sudo -u www-data php occ notify_push:setup
Если конфигурация верна, отображаются дальнейшие инструкции по созданию модуля systemd для высокопроизводительного бэкенда Nextcloud для файлов.
Для этого открываем еще одну, дополнительную SSH-сессию и создаем сервис:
nano /etc/systemd/system/notify_push.service
[Unit]
Description = Push daemon for Nextcloud clients
After=nginx.service php8.2-fpm.service mariadb.service redis-server.service
[Service]
Environment=PORT=7867
Environment=NEXTCLOUD_URL=https://cloud.domain.ru
ExecStart=/var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push /var/www/nextcloud/config/config.php
User=www-data
[Install]
WantedBy = multi-user.target
После этого услуга активируется и запускается:
systemctl daemon-reload
systemctl enable --now notify_push
При условии, что сервис запущен правильно
Вернемся к первой SSH-сессии и подтвердим диалог нажатием клавиши ENTER:
При поступлении обновлений приложения потребуется перезапуск службы.
systemctl restart notify_push.service
Проверить конфигурацию можно следующим образом:
sudo -u www-data php occ notify_push:setup https://cloud.domain.ru/push
Чтобы проверить работоспособность Nextcloud HPB на наличие файлов, скачайте «test_client» Nextcloud
wget https://github.com/nextcloud/notify_push/releases/download/v0.6.3/test_client
и запустите его, а затем укажите свой домен, пользователя и его пароль. Если 2FA уже активна, используйте пароль приложения.
chmod +x test_client
./test_client https://<cloud.domain.ru> <Nextcloud-Benutzername> <(App-)Passwort>
и загрузить, например, Загрузите файл в облако.
Затем посмотрите действия в testclient, вот как работает Nextcloud HPB для файлов. Таким образом, настройка высокопроизводительного бэкенда для файлов была успешно завершена.
11. bash_aliases и рекомендуемые настройки (config.php)
Настройте файл /root/bash_aliases, чтобы иметь возможность запускать набор инструментов Nextcloud occ напрямую через nocc
Убунту
if [ ! -f /root/.bash_aliases ]; then touch /root/.bash_aliases; fi
cat <<EOF >> /root/.bash_aliases
alias nocc="sudo -u www-data php /var/www/nextcloud/occ"
EOF
source /root/.bash_aliases
Debian
if [ ! -f /root/.bashrc ]; then touch /root/.bashrc; fi
cat <<EOF >> /root/.bashrc
alias nocc="sudo -u www-data /usr/bin/php /var/www/nextcloud/occ"
EOF
source /root/.bashrc
Отныне, как привилегированный пользователь (sudo -s), вы можете использовать инструменты Nextcloud occ напрямую через «nocc … «, например:
nocc app:list
Просматривайте все включенные и отключенные приложения на Nexctloud. Мы рекомендуем установить следующие параметры:
nocc config:system:set remember_login_cookie_lifetime --value="1800"
nocc config:system:set log_rotate_size --value="104857600"
nocc config:system:set trashbin_retention_obligation --value="auto, 7"
nocc config:system:set versions_retention_obligation --value="auto, 365"
nocc config:system:set simpleSignUpLink.shown --type=bool --value=false
nocc config:system:set upgrade.disable-web --type=bool --value=true
nocc config:app:set text workspace_available --value=0
nocc config:system:set loglevel --value="2"
nocc config:app:set settings profile_enabled_by_default --value="0"
nocc app:enable admin_audit
nocc config:app:set admin_audit logfile --value="/var/log/nextcloud/audit.log"
nocc config:system:set log.condition apps 0 --value admin_audit
Установите размер чанка или отключите его с помощью ‘0’
nocc config:app:set files max_chunk_size --value="104857600"
oder
nocc config:app:set files max_chunk_size --value 0
Обзор настроек можно найти здесь.
Установка и резервное копирование вашего сервера Nextcloud были успешно завершены, поэтому я желаю вам приятного времяпрепровождения с вашими данными в вашем частном облаке.
Это то что я искал! Четко, верно, без воды!
есть вопрос )) подключил пользователей из ldap, а войти они не могут.
The root directory of the user’s files is missing
Помогите пожалуйста!
ldap не использую , подсказать не смогу, судя по ошибке папки пользователей не создаются , на сколько помню там для юзеров руками раньше папки создавали и пути прописывали, есть официальная инструкция по лдап https://docs.nextcloud.com/server/stable/admin_manual/configuration_user/user_auth_ldap.html