Установка Nextcloud Hub II на Ubuntu

Print Friendly, PDF & Email

Задача:

Установить и настроить nextcloud на сервер Ubuntu (nginx, Let’s Encrypt TLS 1.3, MariaDB, PHP 8.x (php-fpm), Redis, Fail2ban, ufw) в виртуальной среде Proxmox

---------------------------------------------------------------

Устанавливать буду в виртуальной среде Proxmox, скажу сразу, что рассматривал несколько вариантов установки. Думал выделить отдельно сервер базы данных в контейнере LXC и рассматривал вариант полностью разметить все в контейнере, так же был вариант использовать виртуальную машину KVM. В итоге приведу свои доводы почему я выбрал именно контейнер LXC:

  • Скорость запуска LXC на порядок выше, чем KVM (при использовании SATA SSD, mSATA SSD или SSD M.2, будет не критично)
  • На форумах встречается, что live migration не возможна или работает костылями (не пробовал, надо проверять)
  • Обеспечение безопасности (контейнеры не обладают привилегированностью, ресурсы ограничиваются и так далее.)
  • LXC позволяет больше запустить экземпляров, а это критично при малом количестве RAM
  • В LXD меньше латентность (более низкая задержка в гостевых средах) чем KVM

Если у вас нет времени для развертывания и настройки с нуля, можно воспользоваться готовым Proxmox CT Template”debian-10-turnkey-nextcloud_16.1-1_amd64.tar.gz” (я не тестировал, возможно позже появится отдельный пост)

Особенности TurnKey Nextcloud (из официальной документации) :

  • nextcloud устанавливается из официального архива с отключенными автоматическими обновлениями
  • поддержка SSL из коробки
  • интерфейс администрирования MySQL на порту 12322 с поддержкой SSL
  • Postfix MTA для отправки электронной почты (например, для восстановления пароля)
  • Модули Webmin для настройки Apache2, PHP, MySQL и Postfix

переходим к установке

Создаём контейнер proxmox для nextcloud

Особо описывать нечего. Для хранения файлов пользователей, будет монтирован отдельный диск. Ради приличия, скриншоты создания контейнера

Использовал template “ubuntu-20.04-standard_20.04-1_amd64.tar.gz”. Указанный на картинке темплейт, не подойдёт, так как у MariaDB поддержка только LTS версий Ubuntu

По умолчанию предлагается размер диска 8 ГБ, я создал 20 ГБ. Мало или много, не знаю. Исхожу и занимаемого места в системе FreeBSD.

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

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

Указываем имя будущего сервера в файле hosts, так и в имени хоста:

nano /etc/hosts

содержимое /etc/hosts

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
# --- BEGIN PVE ---
192.168.17.131 nc.osbsd.local nc
# --- END PVE ---
# --- Begin my config ---
127.0.0.1       nc.osbsd.com nc
::1             nc.osbsd.com nc
WAN IPv4 Static nc.osbsd.com
WAN IPv6 Static nc.osbsd.com
# --- End my config---

Редактируем имя сервера в файле /etc/hostname

nano /etc/hostname

Содержимое /etc/hostname

nc.osbsd.com

Проверяем файл /etc/systemd/timesyncd.conf, что для службы сервера времени настроена хотя бы одна конечная точка. Если нет, добавляем указанные мной или свои

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it under the
#  terms of the GNU Lesser General Public License as published by the Free
#  Software Foundation; either version 2.1 of the License, or (at your option)
#  any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file, or by creating "drop-ins" in
# the timesyncd.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
# my config
NTP=0.europe.pool.ntp.org 1.europe.pool.ntp.org

Перезапускаем сервер времени:

root@nc:~# systemctl restart systemd-timesyncd
root@nc:~# 

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

root@nc:~# systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Created symlink /etc/systemd/system/suspend.target -> /dev/null.
Created symlink /etc/systemd/system/hibernate.target -> /dev/null.
Created symlink /etc/systemd/system/hybrid-sleep.target -> /dev/null.
root@nc:~# reboot now

Проверяем, что пакет ubuntu-keyring установлен:

root@nc:~# apt install -y ubuntu-keyring
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ubuntu-keyring is already the newest version (2021.03.26).
0 upgraded, 0 newly installed, 0 to remove and 21 not upgraded.
root@nc:~# 

Добавьте ключ nginx:

root@nc:~# curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1561  100  1561    0     0   6670      0 --:--:-- --:--:-- --:--:--  6670
root@nc:~# 

Затем исходники программного обеспечения для nginx и PHP:

root@nc:~# echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu impish nginx
root@nc:~# 

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

root@nc:~# add-apt-repository -y ppa:ondrej/php
Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease
Hit:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease
Get:3 http://ppa.launchpad.net/ondrej/php/ubuntu focal InRelease [23.9 kB]
Hit:4 http://archive.ubuntu.com/ubuntu focal-security InRelease                                   
Get:5 http://nginx.org/packages/mainline/ubuntu focal InRelease [3596 B]                          
Get:6 http://nginx.org/packages/mainline/ubuntu focal/nginx amd64 Packages [37.2 kB]
Get:7 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main amd64 Packages [102 kB]
Get:8 http://ppa.launchpad.net/ondrej/php/ubuntu focal/main Translation-en [33.6 kB]
Fetched 200 kB in 1s (351 kB/s)                     
Reading package lists... Done
root@nc:~# 

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

root@nc:~# wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup--2022-01-22 17:02:52--  https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
Resolving downloads.mariadb.com (downloads.mariadb.com)... 104.18.135.24, 104.17.191.14, 2606:4700::6811:bf0e, ...
Connecting to downloads.mariadb.com (downloads.mariadb.com)|104.18.135.24|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 27889 (27K) [application/octet-stream]
Saving to: 'mariadb_repo_setup.2'

mariadb_repo_setup                       100%[=======================================================================================>]  27.24K  --.-KB/s    in 0.003s  

2022-01-22 17:02:52 (10.1 MB/s) - 'mariadb_repo_setup' saved [27889/27889]

root@nc:~# 
root@nc:~# 
root@nc:~# echo "fd3f41eefff54ce144c932100f9e0f9b1d181e0edd86a6f6b8f2a0212100c32c mariadb_repo_setup" | sha256sum -c -
mariadb_repo_setup: OK
root@nc:~#
root@nc:~# chmod +x mariadb_repo_setup
root@nc:~# 
root@nc:~# 
root@nc:~# ./mariadb_repo_setup --mariadb-server-version="mariadb-10.6"
[info] Checking for script prerequisites.
[info] Repository file successfully written to /etc/apt/sources.list.d/mariadb.list
[info] Adding trusted package signing keys...
[info] Running apt-get update...
[info] Done adding trusted package signing keys
root@nc:~# apt update -q4
root@nc:~# make-ssl-cert generate-default-snakeoil -y
root@nc:~# 

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

root@nc:~# apt remove nginx nginx-extras nginx-common nginx-full -y --allow-change-held-packages
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'nginx-common' is not installed, so not removed
Package 'nginx-extras' is not installed, so not removed
Package 'nginx-full' is not installed, so not removed
Package 'nginx' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 148 not upgraded.
root@nc:~# systemctl stop apache2.service && systemctl disable apache2.service
Failed to stop apache2.service: Unit apache2.service not loaded.
root@nc:~# 

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

root@nc:~# apt install -y nginx
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  nginx
0 upgraded, 1 newly installed, 0 to remove and 148 not upgraded.
Need to get 886 kB of archives.
After this operation, 3135 kB of additional disk space will be used.
Get:1 http://nginx.org/packages/mainline/ubuntu focal/nginx amd64 nginx amd64 1.21.5-1~focal [886 kB]
Fetched 886 kB in 0s (2852 kB/s)
Selecting previously unselected package nginx.
(Reading database ... 23689 files and directories currently installed.)
Preparing to unpack .../nginx_1.21.5-1~focal_amd64.deb ...
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* https://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* https://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* https://nginx.com/products/

----------------------------------------------------------------------
Unpacking nginx (1.21.5-1~focal) ...
Setting up nginx (1.21.5-1~focal) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service -> /lib/systemd/system/nginx.service.
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3) ...
root@nc:~# 

Делаем резервную копию nginx.conf и редактируем

root@nc:~# mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak && touch /etc/nginx/nginx.conf
root@nc:~# nano /etc/nginx/nginx.conf

содержимое конфига 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;
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;
}

Сохраняем файл nginx.conf и перезапускаем веб-сервер nginx:

root@nc:~# systemctl enable nginx.service
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
root@nc:~#
root@nc:~# service nginx start
root@nc:~#

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

root@nc:~# mkdir -p /var/log/nextcloud /mnt/data/nc_files /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs
root@nc:~# 
root@nc:~# chown -R www-data:www-data /mnt/data/nc_files /var/www /var/log/nextcloud
root@nc:~# 

/mnt/data/nc_files – это папка где будут храниться файлы пользователей, можно назначить и другой путь

  • /var/www/nextcloud/data/ – стандартная папка для хранения файлов пользователей
  • /mnt/data/nc_files – для данных я использую отдельный диск, который примонтировал в /mnt/data
  • /var/nc_data – если у вас нет отдельного диска для данных и всё расположено на одном, то в любом случае советую располагать данные пользователей в другой директории

Устанавливаем php8.0

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

если вы планируете использовать общие ресурсы Samba, CIFS или LDAP:

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

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

timedatectl set-timezone Europe/Berlin

сделаем резервную копию файлов конфигурации:

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

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

root@nc:~# AvailableRAM=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo) 
root@nc:~# echo $AvailableRAM
8077
root@nc:~# AverageFPM=$(ps --no-headers -o 'rss,cmd' -C php-fpm8.0 | awk '{ sum+=$1 } END { printf ("%d\n", sum/NR/1024,"M") }') 
root@nc:~# echo $AverageFPM  
25
root@nc:~# FPMS=$((AvailableRAM/AverageFPM)) 
root@nc:~# echo $FPMS
323
root@nc:~# PMaxSS=$((FPMS*2 /3)) 
root@nc:~# echo $PMaxSS
215
root@nc:~# PMinSS=$((PMaxSS/2)) 
root@nc:~# echo $PMinSS
107
root@nc:~# PStartS=$(((PMaxSS+PMinSS)/2))
root@nc:~# echo $PStartS
161
root@nc:~# 

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

sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_children =.*/pm.max_children = '$FPMS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = '$PStartS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = '$PMinSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = '$PMaxSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.0/fpm/php.ini
#
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.0/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.0/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /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\/\Berlin/" /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:

root@nc:~# service php8.0-fpm restart
root@nc:~# service nginx restart
root@nc:~# 

устанавливаем MariaDB:

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

Настроим сервер базы данных с помощью «mysql_secure_installation». При первоначальной установке пароль root отсутствует, поэтому запрос можно подтвердить нажатием ENTER. 

root@nc:~# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
root@nc:~# 

Остановим сервер базы данных, сохраним конфигурацию по умолчанию и настроим конфигурационный файл my.cnf:

service mysql stop
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
nano /etc/mysql/my.cnf

Содержимое my.cnf

[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
bulk_insert_buffer_size = 16M
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
concurrent_insert = 2
connect_timeout = 5
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
general_log = 0
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 4000
innodb_flush_method = O_DIRECT
innodb_read_only_compressed=OFF
#ab MariaDB 10.6 notwendig, s. Link
key_buffer_size = 128M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_allowed_packet = 16M
max_binlog_size = 100M
max_connections = 200
max_heap_table_size = 64M
myisam_recover_options = BACKUP
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 2M
query_cache_size = 64M
query_cache_type = 1
query_cache_min_res_unit = 2k
read_buffer_size = 2M
read_rnd_buffer_size = 1M
skip-external-locking
skip-name-resolve
slow_query_log_file = /var/log/mysql/mariadb-slow.log
slow-query-log = 1
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 4M
table_open_cache = 400
thread_cache_size = 128
tmp_table_size = 64M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
#unix_socket=OFF
user = mysql
wait_timeout = 600
[mysqldump]
max_allowed_packet = 16M
quick
quote-names
[isamchk]
key_buffer = 16M

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

root@nc:~# service mysql restart
root@nc:~# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.6.5-MariaDB-1:10.6.5+maria~focal-log mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

В нашем примере, 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;

должно получиться

MariaDB [(none)]> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 
cloud'; 
GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost; 
FLUSH privileges; quit;Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> CREATE USER nextcloud@localhost identified by 'nextcloud'; 
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost; 
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> FLUSH privileges; quit;
Query OK, 0 rows affected (0.000 sec)

Bye
root@nc:~# quit;

Если вывод показывает “READ-COMMITTED” и “utf8mb4_general_ci”, все настроено правильно, и мы можем приступить к установке Redis.

root@nc:~# 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'"
Enter password: 
+----------------+
| @@TX_ISOLATION |
+----------------+
| READ-COMMITTED |
+----------------+
+-----------+---------+--------------------+
| database  | charset | collation          |
+-----------+---------+--------------------+
| nextcloud | utf8mb4 | utf8mb4_general_ci |
+-----------+---------+--------------------+
root@nc:~# 

Устанавливаем Redis

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

Создаём резервную копию и настраиваем конфигурацию Redis:

cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i "s/port 6379/port 0/" /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i "s/unixsocketperm 700/unixsocketperm 770/" /etc/redis/redis.conf
sed -i "s/# maxclients 10000/maxclients 512/" /etc/redis/redis.conf
usermod -aG redis www-data
#
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf

Рекомендую перезагрузить сервер:

root@nc:~# reboot now
Hangup
root@nc:~# logout

Теперь настроим файлы vhost, то есть файлы конфигурации сервера.

[ -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
nano /etc/nginx/conf.d/http.conf

Содержимое файла http.conf (конфиг настрое на домен nc.osbsd.com)

upstream php-handler {
server unix:/run/php/php8.0-fpm.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name nc.osbsd.com;
root /var/www;
location ^~ /.well-known/acme-challenge {
default_type text/plain;
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}

Редактируем nextcloud.conf

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

Содержимое файла nextcloud.conf (конфиг настрое на домен nc.osbsd.com)

server {
listen 443      ssl http2;
listen [::]:443 ssl http2;
server_name nc.osbsd.com;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
client_max_body_size 10G;
client_body_timeout 3600s;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
add_header Strict-Transport-Security            "max-age=15768000; includeSubDomains; preload;" always;
add_header Permissions-Policy                   "interest-cohort=()";
add_header Referrer-Policy                      "no-referrer"   always;
add_header X-Content-Type-Options               "nosniff"       always;
add_header X-Download-Options                   "noopen"        always;
add_header X-Frame-Options                      "SAMEORIGIN"    always;
add_header X-Permitted-Cross-Domain-Policies    "none"          always;
add_header X-Robots-Tag                         "none"          always;
add_header X-XSS-Protection                     "1; mode=block" always;
fastcgi_hide_header X-Powered-By;
root /var/www/nextcloud;
index index.php index.html /index.php$request_uri;
location = / {
if ( $http_user_agent ~ ^DavClnt ) {
return 302 /remote.php/webdav/$is_args$args;
}
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /apps/rainloop/app/data {
deny all;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav  { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
return 301 /index.php$request_uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }
location ~ \.php(?:$|/) {
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
}
location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite)$ {
try_files $uri /index.php$request_uri;
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;
}
}

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

root@nc:~# openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Generating DSA parameters, 4096 bit long prime
.............+...+.....+....+........+.....+...............+....+......................+.....+...............+..........+.............+.................................+......+.......+...+.......................................+..+...+.+....................+....+......+...+........................+..+..+...............+..+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
.......+..........+.........................+.+..........+.......+...................+..........+.........+................+.......................+.........................+....+.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
root@nc:~# 

В зависимости от производительности системы генерация может занять несколько минут. Когда генерация будет завершена, мы перезапускаем веб-сервер.

service nginx restart

Теперь приступаем к установке Nextcloud и настраиваем SSL-сертификаты от Let’s Encrypt с помощью acme . Переходим в каталог src и скачиваем последнюю версию nextcloud и файл проверки md5

root@nc:~# cd /usr/local/src
root@nc:/usr/local/src# wget https://download.nextcloud.com/server/releases/latest.tar.bz2
--2022-01-18 00:27:29--  https://download.nextcloud.com/server/releases/latest.tar.bz2
Resolving download.nextcloud.com (download.nextcloud.com)... 95.217.64.181, 2a01:4f9:2a:3119::181
Connecting to download.nextcloud.com (download.nextcloud.com)|95.217.64.181|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 138156149 (132M) [application/x-bzip2]
Saving to: 'latest.tar.bz2'

latest.tar.bz2                             100%[=======================================================================================>] 131.76M  7.06MB/s    in 19s     

2022-01-18 00:27:48 (7.08 MB/s) - 'latest.tar.bz2' saved [138156149/138156149]

root@nc:/usr/local/src# wget https://download.nextcloud.com/server/releases/latest.tar.bz2.md5
--2022-01-18 00:27:49--  https://download.nextcloud.com/server/releases/latest.tar.bz2.md5
Resolving download.nextcloud.com (download.nextcloud.com)... 95.217.64.181, 2a01:4f9:2a:3119::181
Connecting to download.nextcloud.com (download.nextcloud.com)|95.217.64.181|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 49 [application/x-bzip2]
Saving to: 'latest.tar.bz2.md5'

latest.tar.bz2.md5                         100%[=======================================================================================>]      49  --.-KB/s    in 0s      

2022-01-18 00:27:49 (28.9 MB/s) - 'latest.tar.bz2.md5' saved [49/49]

root@nc:/usr/local/src# md5sum -c latest.tar.bz2.md5 < latest.tar.bz2
latest.tar.bz2: OK
root@nc:/usr/local/src# 

Проверяем скаченный файл.

root@nc:/usr/local/src# md5sum -c latest.tar.bz2.md5 < latest.tar.bz2
latest.tar.bz2: OK
root@nc:/usr/local/src# 

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

root@nc:/usr/local/src# tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm -f latest.tar.bz2
root@nc:/usr/local/src# 
root@nc:/usr/local/src# rm -f latest.tar.bz2.md5
root@nc:/usr/local/src# 

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

root@nc:/usr/local/src# adduser --disabled-login acmeuser
Adding user `acmeuser' ...
Adding new group `acmeuser' (1000) ...
Adding new user `acmeuser' (1000) with group `acmeuser' ...
Creating home directory `/home/acmeuser' ...
Copying files from `/etc/skel' ...
Changing the user information for acmeuser
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] y
root@nc:/usr/local/src# usermod -a -G www-data acmeuser
root@nc:/usr/local/src# 

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

visudo

Добавляем строчку как на картинке ниже

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

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

root@nc:/usr/local/src# su - acmeuser
acmeuser@nc:~$ 
acmeuser@nc:~$ curl https://get.acme.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   937    0   937    0     0   4570      0 --:--:-- --:--:-- --:--:--  4570
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  205k  100  205k    0     0   609k      0 --:--:-- --:--:-- --:--:--  607k
[Tue Jan 18 00:33:22 CET 2022] Installing from online archive.
[Tue Jan 18 00:33:22 CET 2022] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Tue Jan 18 00:33:22 CET 2022] Extracting master.tar.gz
[Tue Jan 18 00:33:22 CET 2022] Installing to /home/acmeuser/.acme.sh
[Tue Jan 18 00:33:22 CET 2022] Installed to /home/acmeuser/.acme.sh/acme.sh
[Tue Jan 18 00:33:22 CET 2022] Installing alias to '/home/acmeuser/.bashrc'
[Tue Jan 18 00:33:22 CET 2022] OK, Close and reopen your terminal to start using acme.sh
[Tue Jan 18 00:33:22 CET 2022] Installing cron job
no crontab for acmeuser
no crontab for acmeuser
[Tue Jan 18 00:33:22 CET 2022] Good, bash is found, so change the shebang to use bash as preferred.
[Tue Jan 18 00:33:22 CET 2022] OK
[Tue Jan 18 00:33:22 CET 2022] Install success!
acmeuser@nc:~$ exit
logout
root@nc:/usr/local/src#  

Настраиваем соответствующие разрешения, чтобы иметь возможность хранить новые сертификаты:

root@nc:/usr/local/src# chmod -R 775 /var/www/letsencrypt && chmod -R 770 /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt
root@nc:/usr/local/src# su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"
[Tue Jan 18 00:33:47 CET 2022] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory
root@nc:/usr/local/src# su - acmeuser
acmeuser@nc:~$ 

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

root@nc:/usr/local/src# su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"
[Sat Jan 22 19:38:09 CET 2022] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory
root@nc:/usr/local/src# 

Переключаемся обратно в оболочку нового пользователя и запрашиваем SSL-сертификаты от Let’s Encrypt (настроено для домена nc.osbsd.com):

su - acmeuser

acme.sh --issue -d nc.osbsd.com --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 nc.osbsd.com --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

Если всё хорошо, в консоли сервера увидим

acmeuser@nc:~$ acme.sh --issue -d nc.osbsd.com --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"
[Mon Jan 24 20:02:35 CET 2022] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Mon Jan 24 20:02:35 CET 2022] Single domain='nc.osbsd.com'
[Mon Jan 24 20:02:35 CET 2022] Getting domain auth token for each domain
[Mon Jan 24 20:02:37 CET 2022] Getting webroot for domain='nc.osbsd.com'
[Mon Jan 24 20:02:37 CET 2022] Verifying: nc.osbsd.com
[Mon Jan 24 20:02:37 CET 2022] Pending, The CA is processing your order, please just wait. (1/30)
[Mon Jan 24 20:02:40 CET 2022] Success
[Mon Jan 24 20:02:40 CET 2022] Verify finished, start to sign.
[Mon Jan 24 20:02:40 CET 2022] Lets finalize the order.
[Mon Jan 24 20:02:40 CET 2022] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/37590390/5812380020'
[Mon Jan 24 20:02:41 CET 2022] Downloading cert.
[Mon Jan 24 20:02:41 CET 2022] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/04b4fbd2626aa1a9129a0ddbf8090'
[Mon Jan 24 20:02:41 CET 2022] Cert success.
-----BEGIN CERTIFICATE-----
MIIEcTCCA1mgAwIBAgISBLT70mJqoSrmSvqRKaDdv4CQMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjAxMjQxODAyNDBaFw0yMjA0MjQxODAyMzlaMBgxFjAUBgNVBAMT
DXhheGEuZGRucy5uZXQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARwaphn0hgjndX0
n7RxvD/yNKuvsiSRIpbv0meIdYktXcYVXQPJ+LhcY9q2OOncmy1oJ6L4d5d2A44V
XEGaYf55WVwAadAnp4P+Ng25Cgx9Gg29nGC2XpevyWAObwBF/0CjggJHMIICQzAO
BgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG
A1UdEwEB/wQCMAAwHQYDVR0OBBYEFHT3G1NGOspjx/Ivd/t8rF3N7tHGMB8GA1Ud
IwQYMBaAFBQusxe3WFbLrlAJQwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYa
aHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEDBgorBgEEAdZ5AgQCBIH0BIHx
AO8AdgBByMqx3yJGShDGoToJQodeTjGLGwPr60vHaPCQYpYG9gAAAX6NeAjVAAAE
AwBHMEUCIEFtZywMOzJSdc+2UnEoHpwIG82mmg5mKsRfCo49oE9yAiEAipmPzvrA
zaRJpLaErowjX6PioEoWAwcHKgfACLxPqJ0AdQBGpVXrdfqRIDC1oolp9PN9ESxB
dL79SbiFq/L8cP5tRwAAAX6NeAjoAAAEAwBGMEQCIEbkytU0WiiFIL/WJY+SoZn8
16neZvMt4pWNMl9qlLM/AiBHB1c+yDSC+UhsMQVpwUHK6mWkBh/JPzudfyFau5KM
azANBgkqhkiG9w0BAQsFAAOCAQEAaYLyuvP7nLx/JMuvOolUt5MzcNVLcynnrc/4
M2cQBWXzfr0zxEJ4B7MTfE/2Aj3+VY5BxhfNxJsSyBDJcMjX1p39DEJGanzylu2G
zrLUNzLLjQswRqHnjFv6g9tB8ytHvkB5aXrPwqhFPRc6z8GSSnY4+WB6/KNktn2F
SZ3WUx4Ry1SwRAIe2WZuXHg7s+htX1GR7qDI7tqW6o505MUTyTowfqo+oZxxbat9
83decuACjkZEBpthKJJQu6CVHTy+EXX0JeWD6YnHrOuUIBjwVnlorzOk1iBBkn4r
Yf1vqoz2LsunJzywi7olx2E2TjHjPvgznAzF7QsD70+MZISx0A==
-----END CERTIFICATE-----
[Mon Jan 24 20:02:41 CET 2022] Your cert is in: /home/acmeuser/.acme.sh/nc.osbsd.com_ecc/nc.osbsd.com.cer
[Mon Jan 24 20:02:41 CET 2022] Your cert key is in: /home/acmeuser/.acme.sh/nc.osbsd.com_ecc/nc.osbsd.com.key
[Mon Jan 24 20:02:41 CET 2022] The intermediate CA cert is in: /home/acmeuser/.acme.sh/nc.osbsd.com_ecc/ca.cer
[Mon Jan 24 20:02:41 CET 2022] And the full chain certs is there: /home/acmeuser/.acme.sh/nc.osbsd.com_ecc/fullchain.cer
[Mon Jan 24 20:02:42 CET 2022] Installing cert to: /etc/letsencrypt/ecc-certs/cert.pem
[Mon Jan 24 20:02:42 CET 2022] Installing CA to: /etc/letsencrypt/ecc-certs/chain.pem
[Mon Jan 24 20:02:42 CET 2022] Installing key to: /etc/letsencrypt/ecc-certs/privkey.pem
[Mon Jan 24 20:02:42 CET 2022] Installing full chain to: /etc/letsencrypt/ecc-certs/fullchain.pem
[Mon Jan 24 20:02:42 CET 2022] Run reload cmd: sudo /bin/systemctl reload nginx.service
[Mon Jan 24 20:02:42 CET 2022] Reload success
acmeuser@nc:~$
acmeuser@nc:~$ acme.sh --issue -d nc.osbsd.com --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"
[Mon Jan 24 20:02:45 CET 2022] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Mon Jan 24 20:02:45 CET 2022] Single domain='nc.osbsd.com'
[Mon Jan 24 20:02:45 CET 2022] Getting domain auth token for each domain
[Mon Jan 24 20:02:47 CET 2022] Getting webroot for domain='nc.osbsd.com'
[Mon Jan 24 20:02:47 CET 2022] nc.osbsd.com is already verified, skip http-01.
[Mon Jan 24 20:02:47 CET 2022] Verify finished, start to sign.
[Mon Jan 24 20:02:47 CET 2022] Lets finalize the order.
[Mon Jan 24 20:02:47 CET 2022] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/37590390/581403820'
[Mon Jan 24 20:02:48 CET 2022] Downloading cert.
[Mon Jan 24 20:02:48 CET 2022] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/04bfd6ba7b55a330dc3b96e7ecb96009'
[Mon Jan 24 20:02:49 CET 2022] Cert success.
-----BEGIN CERTIFICATE-----
MIIGITCCBQmgAwIBAgISBL/WuntVoN0TMNw7lufsuWAJMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjAxMjQxODAyNDhaFw0yMjA0MjQxODAyNDdaMBgxFjAUBgNVBAMT
DXhheGEuZGRucy5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
3a7dNL9ZWK7u0KfpasV6KB0Vdr1egQPuwrE+GLtAPK/WR+tW0Jo2exyM52/yOOts
EFOKqvbgB9TiC0w6k0tQYR7Ou1QziXUCtz/gpOIfNnxX3+8P6gGIcXH6FJD85a+9
FhOSizknpHMnT62XG8u/9DzHM5TT/hTMGTIGycJqN8TsZlSc0eVlw1k4q7oDAVp6
JcIIswwc4/wi4/JNIk6Iy1Z4G2b5Surx/6OGXUI5cRZXDEPYgI33t/gs5o+dvq4s
nvtBGZtFsUJyl0sV9imYS2mcM30+5ey4DVwpmDoRawQq0AHOfq3knqG/uigKBss
ccFanBSGqTuCACTSXSLGacUHVCpPG9I0B+OlHQVRcrF6yw4z9hAX8MP85mucGfNl
sW7wDzjOGSt9CnHXwKjbdzNp+9yZzAiBggrBgEFBQcwAoYWaHR0cDov
L3IzLmkubGVuY3Iub3JnLzAYBgNVHREEETAPgg14YXhhLmRkbnMubmV0MEwGA1Ud
IARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0
dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDx
AHcAb1N2rDHwMRnYmQCkURX/dxUcEdkCwQApBo2yCJo32RMAAAF+jXglLQAABAMA
SDBGAiEA8H7/HJYrjz5kPzRP/JEWgR2iCcK/2PpjCoFLsWCu4QgCIQCHOy2qDN7s
55+d77nxIPXtLapz5dF2NddO4y3wr1TD8gB2AEalVet1+pEgMLWiiWn0830RLEF0
vv1JuIWr8vxw/m1HAAABfo14JSUAAAQDAEcwRQIhANI37uYLWoE9BgPX0nBL8/p3
1m5CHaR7orz9HV+/WQCqAiBBZtBpJ0uU0/KmPFRzeZAVceOGI5/bMmywsICmAuFG
ajANBgkqhkiG9w0BAQsFAAOCAQEAmJBnQCTf3OQqGAVDUFeGJy52cq5/5JzHlIui
aod4pbbgjAd6zdB/Yokznq56BlnrAfGmNZQNIzQwk1kO1BJSYUiJBlkkOE+mz3q1
hwW/r9F7DGCc1VBvzELpJDsd/nw3o81eJiOAOtS8ky/DqKsn2OAe8ZttS9aRXMBQ
dYZKefwkWbZnxj79vZi3nNQsVCB9nj8JPbHYeParRf1qLhloE3nCitfagO433CUO
j9Snle0HoiPq4/I0bXQnKVQzpWm++/0ok2Y6+x5019/TUHtI1x6fC8PqBPiV8ErR
jRUwSQ4CzCymjsbg0n71fw4VGUzmA9SboWbQEm+OMCy3LE6dhA==
-----END CERTIFICATE-----
[Mon Jan 24 20:02:49 CET 2022] Your cert is in: /home/acmeuser/.acme.sh/nc.osbsd.com/nc.osbsd.com.cer
[Mon Jan 24 20:02:49 CET 2022] Your cert key is in: /home/acmeuser/.acme.sh/nc.osbsd.com/nc.osbsd.com.key
[Mon Jan 24 20:02:49 CET 2022] The intermediate CA cert is in: /home/acmeuser/.acme.sh/nc.osbsd.com/ca.cer
[Mon Jan 24 20:02:49 CET 2022] And the full chain certs is there: /home/acmeuser/.acme.sh/nc.osbsd.com/fullchain.cer
[Mon Jan 24 20:02:49 CET 2022] Installing cert to: /etc/letsencrypt/rsa-certs/cert.pem
[Mon Jan 24 20:02:49 CET 2022] Installing CA to: /etc/letsencrypt/rsa-certs/chain.pem
[Mon Jan 24 20:02:49 CET 2022] Installing key to: /etc/letsencrypt/rsa-certs/privkey.pem
[Mon Jan 24 20:02:49 CET 2022] Installing full chain to: /etc/letsencrypt/rsa-certs/fullchain.pem
[Mon Jan 24 20:02:49 CET 2022] Run reload cmd: sudo /bin/systemctl reload nginx.service
[Mon Jan 24 20:02:49 CET 2022] Reload success
acmeuser@nc:~$ exit
logout
root@nc:~#

Редактируем конфиг nginx

root@nc:~#
root@nc:~# nano /etc/nginx/conf.d/nextcloud.conf
root@nc:~#

меняем комментарии на строках

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

перезапускаем nginx

root@nc:~# 
root@nc:~# service nginx restart
root@nc:~#

или можно выполнить при помощи команды sed

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

до выполнения команды sed

после выполнения

Создаём скрипт, который в будущем будет проверять и исправлять разрешения:

nano /root/nextcloud.sh

Содержимое файла (/mnt/data/nc_files – папка хранения файлов пользователей)

#!/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 /mnt/data/nc_files
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0

Помечаем скрипт как исполняемый, а затем запустите его:

root@nc:~# 
root@nc:~# chmod +x /root/nextcloud.sh
root@nc:~# /root/nextcloud.sh
root@nc:~#

Проверяем cron пользователя acmeuser. В процессе установки, должно было добавиться правило

root@nc:~# crontab -l -u acmeuser
21 0 * * * "/home/acmeuser/.acme.sh"/acme.sh --cron --home "/home/acmeuser/.acme.sh" > /dev/null
root@nc:~#

Ранее я расматривал установку nextcloud через веб интерфейс

Теперь рассмотрим тихую установку nextcloud

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextcloud" --database-user "nextcloud" --database-pass "nextcloud" --admin-user "nextcloud" --admin-pass "nextcloud" --data-dir "/mnt/data/nc_files"
Nextcloud was successfully installed
root@nc:~#

описание параметров:

  • –database-name – имя базы данных
  • –database-user – имя пользователя базы данных
  • –database-pass – пароль пользователя базы данных
  • –admin-user – имя администратора nextcloud (создастся при установке)
  • –admin-pass – пароль администратора nextcloud (создастся при установке)
  • –data-dir – директория пользователей

Если открыть браузер и попробовать зайти, получим ошибку

Доступ через недоверенный домен
Обратитесь к администратору. Если вы являетесь администратором этого сервера, отредактируйте параметр «trusted_domains» в файле «config/config.php». Пример настройки можно найти в файле «config/config.sample.php».

Дополнительная информация как это настроить может быть найдена в документации

можно поправить конфиг config/config.sample.php или выполнить команду

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=nc.osbsd.com
System config value trusted_domains => 0 set to string nc.osbsd.com
root@nc:~#

Так же стоит добавить свой домен как overwrite.cli.url:

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://nc.osbsd.com
System config value overwrite.cli.url set to string https://nc.osbsd.com
root@nc:~#

Посмотрим какой получился конфиг после настройки

root@nc:~# cat /var/www/nextcloud/config/config.php
<?php
$CONFIG = array (
  'instanceid' => 'ocnw8wp3s2j',
  'passwordsalt' => 'zkRXcOGRN8fakHdkmpjmhLbm9P26',
  'secret' => '8OHVcX/VjI92jmLiDnbENdHY5ADqvCrzDf8B1510sBJIR',
  'trusted_domains' =>
  array (
    0 => 'nc.osbsd.com',
  ),
  'datadirectory' => '/mnt/data/nc_files',
  'dbtype' => 'mysql',
  'version' => '23.0.0.10',
  'overwrite.cli.url' => 'https://nc.osbsd.com',
  'dbname' => 'nextcloud',
  'dbhost' => 'localhost',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud',
  'dbpassword' => 'nextcloud',
  'installed' => true,
);
root@nc:~#

делаем резервную копию конфига

root@nc:~#
root@nc:~# sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.backup
root@nc:~#

Удаляем пробелы из конфига

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',
'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/Berlin',
'log_rotate_size' => 104857600,
'maintenance' => false,
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 768,
'preview_max_scale_factor' => 1,
'redis' => 
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'timeout' => 0.0,
),
'quota_include_external_storage' => false,
'share_folder' => '/Freigaben',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF

Изменяем .user.ini

root@nc:~#
root@nc:~# sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
root@nc:~# cat /var/www/nextcloud/.user.ini
mbstring.func_overload=0
always_populate_raw_post_data=-1
default_charset='UTF-8'
output_buffering=0
root@nc:~#

настраиваем приложения Nextcloud, но для начала сморим что установлено по-умолчанию

root@nc:~# sudo -u www-data php /var/www/nextcloud/occ app:list
Enabled:
  - accessibility: 1.9.0
  - activity: 2.15.0
  - bruteforcesettings: 2.3.0
  - circles: 23.0.0
  - cloud_federation_api: 1.6.0
  - comments: 1.13.0
  - contactsinteraction: 1.4.0
  - dashboard: 7.3.0
  - dav: 1.21.0
  - federatedfilesharing: 1.13.0
  - federation: 1.13.0
  - files: 1.18.0
  - files_pdfviewer: 2.4.0
  - files_rightclick: 1.2.0
  - files_sharing: 1.15.0
  - files_trashbin: 1.13.0
  - files_versions: 1.16.0
  - files_videoplayer: 1.12.0
  - firstrunwizard: 2.12.0
  - logreader: 2.8.0
  - lookup_server_connector: 1.11.0
  - nextcloud_announcements: 1.12.0
  - notifications: 2.11.1
  - oauth2: 1.11.0
  - password_policy: 1.13.0
  - photos: 1.5.0
  - privacy: 1.7.0
  - provisioning_api: 1.13.0
  - recommendations: 1.2.0
  - serverinfo: 1.13.0
  - settings: 1.5.0
  - sharebymail: 1.13.0
  - support: 1.6.0
  - survey_client: 1.11.0
  - systemtags: 1.13.0
  - text: 3.4.0
  - theming: 1.14.0
  - twofactor_backupcodes: 1.12.0
  - updatenotification: 1.13.0
  - user_status: 1.3.1
  - viewer: 1.7.0
  - weather_status: 1.3.0
  - workflowengine: 2.5.0
Disabled:
  - admin_audit
  - encryption
  - files_external
  - user_ldap
root@nc:~#

Отключаем отправляет анонимные данные в Nextcloud. С другой стороны, надо помогать улучшать Nextcloud.

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ app:disable survey_client
survey_client 1.11.0 disabled
root@nc:~#

Отключаем всплывающее окно, когда пользователь впервые входит в Nextcloud.

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ app:disable firstrunwizard
firstrunwizard 2.12.0 disabled
root@nc:~#

Включаем ведения журнала для Nextcloud, такие как регистрация доступа к файлам или другие конфиденциальные действия.

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ app:enable admin_audit
admin_audit 1.13.0 enabled
root@nc:~#

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»:

root@nc:~# 
root@nc:~# crontab -u www-data -e 
root@nc:~#

Добавляем строку

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

перенастраиваем заданиz cron в Nextcloud с «Ajax» на «Cron» с помощью интерфейса командной строки

root@nc:~#
root@nc:~# sudo -u www-data php /var/www/nextcloud/occ background:cron
Set mode for background jobs to 'cron'
root@nc:~#

Проверяем настройки сервера nextcloud

Также можно проверить сканером от nextcloud

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

apt-mark hold nginx*
apt-mark hold redis*
apt-mark hold mariadb*
apt-mark hold php*
apt-mark hold php8.0-*

Чтобы снова включить эти пакеты в обновление

apt-mark unhold nginx*
apt-mark unhold redis*
apt-mark unhold mariadb*
apt-mark unhold php*
apt-mark unhold php8.0-*

на последок можно проверить сертификат сервера

Для любителей картинок и прочих медиа файлов, возможно стоит установить “Preview Generator”. Я уже как то описывал его установку “Предварительный просмотр видео в NextCloud

Помогла статья? Есть возможность отблагодарить автора

QR Link:

QR Code

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован.