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

Задача:
---------------------------------------------------------------Установить и настроить 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“
Свежие комментарии