Установка Nextcloud 18. Ubuntu 19.04 NGINX+PHP-FPM.

  1. Установка ОС, установка ssh сервера, первичная настройка.
  2. Установка Web сервера Nginx, PHP-FPM, Mariadb.
  3. Завершение установки Nextcloud, устранение ошибок, заключительная настройка.
  4. Fail2ban, Postfix, дополнительный софт

Установка ОС

Для домашнего сервера выделяю 2 ядра и 4 Гб памяти, ОС ставлю на SSD. Для каталога с данными лучше подключить отдельный
емкий диск или raid массив (в этой инструкции подключение не рассмотрено - можно посмотреть здесь).



Выбираем язык, раскладку и прочее. Выбираем разметку диска вручную.


Начинается установка, прокси не вводим, ничего из списка не устанавливаем, соглашаемся на установку загрузчика

Установка закончена, перезагружаемся.

Установим ssh сервер:

terminal
root@test:/home/user# apt update
root@test:/home/user# apt install openssh-server

Смотрим какой ip получила сетевая карта:

terminal
root@test:/home/user# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:ed:68:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.185/24 brd 192.168.0.255 scope global dynamic ens160

Подключаемся по ssh. Отредактируем конфигурацию ssh, добавим или раскоментируем строки:

terminal
root@test:/home/user# nano /etc/ssh/sshd_config
Port 2222
Protocol 2
PermitRootLogin no
root@test:/home/user# systemctl restart sshd

Следующим шагом проверим фаервол:

terminal
root@test:/home/user# ufw status
Состояние: неактивен
root@test:/home/user#

Добавим правила для ssh, http, https и включим фаервол:
terminal
root@test:/home/user# ufw allow 2222/tcp
Правила обновлены
Правила обновлены (v6)
root@test:/home/user# ufw allow 80/tcp
Правила обновлены
Правила обновлены (v6)
root@test:/home/user# ufw allow 443/tcp
Правила обновлены
Правила обновлены (v6)
root@test:/home/user#
root@test:/home/user# sudo ufw enable
Команда может разорвать существующие соединения ssh. Продолжить операцию (y|n)? y
Межсетевой экран включён и будет запускаться при запуске системы
root@test:/home/user#

Перезагружаем фаервол и ssh сервер если соединение не разорвалось, подключаемся по новому порту (2222):
terminal
root@test:/home/user# systemctl restart sshd
root@test:/home/user# systemctl restart ufw
root@test:/home/user#

Настроим статический ip адрес (Конфигурация Netplan)
root@test:~# nano /etc/netplan/01-netcfg.yaml

Видим примерно следующее:

terminal
# This file describes the network interfaces available on your system
# For more information, see netplan(5).

network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: true

Приводим к данному виду, соблюдаем смещение - (пробелы )

terminal
# This file describes the network interfaces available on your system
# For more information, see netplan(5).

network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
    dhcp4: no
    dhcp6: no
    addresses: [192.168.0.110/24]
    gateway4: 192.168.0.1
    nameservers:
       addresses: [192.168.0.1,8.8.8.8]


Сохраняем командой ctrl+o, enter. ctrl+x — выход. Понадобится заново подключится по новому адресу.

Проверим корректность даты, времени

terminal
root@test:~# date
Сб авг 17 21:08:26 MSK 2019
root@test:~#

Обновляемся и устанавливаем веб сервер nginx:

terminal
root@test:~# apt update
root@test:~# apt upgrade
root@test:~# apt install nginx
root@test:~# nginx -V
nginx version: nginx/1.15.9 (Ubuntu)
built with OpenSSL 1.1.1b 26 Feb 2019
root@test:~# systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
root@test:~# systemctl start nginx

Далее устанавливаем PHP-FPM и остальные модули - в репозиториях ubuntu только версия 7.2, актуальная версия 7.3:

terminal
root@test:~# add-apt-repository ppa:ondrej/php
root@test:~# apt update
root@test:~# apt install php7.3-fpm

Список нужных модулей на странице официальной документации Nextcloud

terminal
root@test:~# apt install php7.3-mysql php7.3 php7.3-curl php7.3-gd php7.3-json php7.3-mbstring php7.3-common php7.3-xml php7.3-zip php7.3-opcache php-apcu php-imagick

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

terminal
root@test:~# apt install mariadb-server
root@test:~# systemctl enable mariadb
root@test:~# systemctl start mariadb

Запуск сценария безопасности:

terminal
root@test:~# mysql_secure_installation

Жмем enter
Задаем пароль root пользователя, отвечаем "Y", два раза вводим пароль, на остальные вопросы отвечаем "Y".

terminal
Set root password? [Y/n] y
New password:
... Success!
Remove anonymous users? [Y/n] y
... Success!
Disallow root login remotely? [Y/n] y
... Success!
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
... Success!

Создаем базу данных для Nextcloud:
terminal
root@test:~# mysql -u root -p
Enter password:

Вводим данные ниже, не забываем 'password' - сменить на свой пароль. Не забываем эти данные
terminal
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Скачиваем Nextcloud c официального сайта, копируем адрес ссылки на zip архив:

terminal

root@test:~# cd /home/user/
root@test:/home/user# wget https://download.nextcloud.com/server/releases/nextcloud-18.0.3.zip
--2019-08-18 11:44:09-- https://download.nextcloud.com/server/releases/nextcloud-18.0.3.zip
Распознаётся download.nextcloud.com (download.nextcloud.com)… 176.9.217.52, 2a01:4f8:130:32f1::52
Подключение к download.nextcloud.com (download.nextcloud.com)|176.9.217.52|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 79793414 (76M) [application/zip]
Сохранение в: «nextcloud-16.0.3.zip»

nextcloud-16.0.3.zip 100%[=============================================>] 76,10M 8,75MB/s за 18s

2019-08-18 11:44:28 (4,19 MB/s) - «nextcloud-16.0.3.zip» сохранён [79793414/79793414]

root@test:/home/user#


Распаковываем в корень, меняем владельца директории:
terminal
root@test:/home/user# apt install zip
root@test:/home/user# ls
nextcloud-16.0.3.zip
root@test:/home/user#
root@test:/home/user# unzip nextcloud-16.0.3.zip
root@test:/home/user# cp -R nextcloud /var/www/html/
root@test:/var/www/html# cd /var/www/html/
root@test:/var/www/html# chown -R www-data:www-data nextcloud/
root@test:/var/www/html#
root@test:/var/www/html# ls -l
итого 8
-rw-r--r-- 1 root root 612 авг 17 21:28 index.nginx-debian.html
drwxr-xr-x 14 www-data www-data 4096 авг 18 11:50 nextcloud
root@test:/var/www/html#

Далее нам потребуется зарегистрировать домен - cloud.mydomain.ru, если у вас еще его нет, и получить сертификат от Letsencrypt. Настроим доступ к сайту сразу по https.
Регистрация домена и управление dns рассматривалось в предыдущей инструкции
Получение сертификата от Letsencrypt  в пред инструкции   но для веб сервера Apache, вам нужно скрипт заменить на свой - для веб сервера Nginx- здесь подробная инструкция для установки этого скрипта - получит сертификат и пропишет путь до него в конфиг вашего виртуального хоста. Останется только добавить в cron задание для автопродления.

После регистрации домена и получения сертификата приступаем к созданию виртуального хоста Nextcloud, конфигурация так же есть в официальной документации:
Для начала отредактируем nginx.conf:

terminal

root@test:/etc/nginx# nano nginx.conf

#Пользователь, от которого будет работать php-fpm
user  www-data;
#Число ядер процессора
worker_processes  2;
worker_cpu_affinity auto;
include /etc/nginx/modules-enabled/*.conf;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

 

terminal

root@test:/etc/nginx#mkdir /etc/nginx/sites-available
root@test:/etc/nginx#mkdir /etc/nginx/sites-enabled
root@test:/etc/nginx# systemctl restart nginx
root@test:/etc/nginx#
root@test:/var/www/html# cd /etc/nginx/sites-available/
root@test:/etc/nginx/sites-available# nano nextcloud.conf

upstream php-handler {
   server 127.0.0.1:9000;
   # server unix:/var/run/php/php7.3-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name cloud.mydomain.ru;
    # принудительное использование https 
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name cloud.mydomain.ru;

    # Используйте рекомендации Mozilla для настроек SSL / TLS 
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/ 
    # ПРИМЕЧАНИЕ: некоторые настройки ниже могут быть избыточными 
    ssl_certificate      /etc/letsencrypt/live/cloud.mydomen/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/cloud.mydomen/privkey.pem;

    # Добавьте заголовки для обслуживания заголовков, связанных с безопасностью 
    # Перед включением заголовков Strict-Transport-Security, пожалуйста, сначала прочтите эту тему. 
    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; 
    # 
    # ПРЕДУПРЕЖДЕНИЕ. Добавляйте параметр предварительной загрузки только после того, как вы прочитали о 
    # последствиях на https://hstspreload.org/. Этот вариант
    # добавит домен в жестко закодированный список, который 
    # поставляется во всех основных браузерах и удаление из этого списка 
    # может занять несколько месяцев. 
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

    # Удалить X-Powered-By, который является утечкой информации 
    fastcgi_hide_header X-Powered-By;

    # Путь к корню вашей инсталляции
    root /var/www/html/nextcloud;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Следующие 2 правила нужны только для приложения user_webfinger. 
    # Раскомментируйте, если вы планируете использовать это приложение. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # Следующее правило необходимо только для приложения Social. 
    # Раскомментируйте, если вы планируете использовать это приложение.
    #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

    location = /.well-known/carddav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }

    # установить максимальный размер загрузки
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Включите gzip, но не удаляйте заголовки ETag 
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json 
application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json
application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard
text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Раскомментируйте, если ваш сервер собран с модулем ngx_pagespeed 
    # Этот модуль в настоящее время не поддерживается. 
    #pagespeed off; 

    location / {
        rewrite ^ /index.php;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        try_files $fastcgi_script_name =404;        
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        # Enable pretty urls
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Добавление заголовка управления кэшем для JS, CSS и карта файлов 
    # Убедитесь , что это НИЖЕ PHP блок 
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        #Добавьте заголовки для обслуживания заголовков, связанных с безопасностью (предполагается, 
        # чтобы они дублировались к указанным выше) 
        # Перед включением заголовков Strict-Transport-Security, пожалуйста, 
        #сначала 
        #прочтите # эту тему. #add_header Strict-Transport-Security "max-age = 15768000; includeSubDomains; preload;"; 
        # 
        # ПРЕДУПРЕЖДЕНИЕ. Добавляйте параметр предварительной загрузки только после того, как вы прочитали о 
        # последствиях на https://hstspreload.org/. 
        # Эта опция добавит домен в жестко закодированный список, который 
        # поставляется во всех основных браузерах и удаление из этого списка может занять несколько месяцев. 
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        add_header Referrer-Policy no-referrer;

         # Необязательно: не регистрировать доступ к ресурсам 
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$request_uri;
        # Необязательно: не регистрировать доступ к другим ресурсам
        access_log off;
    }
}

root@test:/etc/nginx/sites-available#

Понадобится отредактировать так же конфигурацию PHP-FPM:

terminal
root@test:~# nano /etc/php/7.3/fpm/pool.d/www.conf

Закомментируем строку :
terminal
;listen = /run/php/php7.3-fpm.sock

Добавим вместо нее:
terminal
listen = 127.0.0.1:9000

Проверяем строки:
terminal
listen.owner = www-data
listen.group = www-data
root@test:~# systemctl restart php7.3-fpm

Включаем наш хост:
terminal
root@test:~# ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/nextcloud.conf
root@test:~# systemctl restart nginx

 

Переходим по адресу нашего сервера, заполняем поля, заканчиваем установку

Далее переходим в "Настройки " > "Общие сведения" проверяем ошибки. (При установке на прежние версии ОС, могут возникнуть дополнительные ошибки связанные с прежней версией БД - MariaDB)

1. Исправление ошибки php-fpm getenv("PATH")

terminal
root@test:~# nano /etc/php/7.3/fpm/pool.d/www.conf
Раскоментируем строки:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
root@test:~# systemctl restart php7.3-fpm

2. Разрешённое PHP максимальное значение использования памяти ниже рекомендуемого значения в 512 МБ

terminal
root@test:~# nano /etc/php/7.3/fpm/php.ini
upload_max_filesize = 3500M
memory_limit = 512M
root@test:~# systemctl restart php7.3-fpm

3. Заголовок HTTP «Strict-Transport-Security» должен быть настроен как минимум на «15552000» секунд. Для улучшения безопасности рекомендуется включить HSTS согласно нашим подсказкам по безопасности.

terminal
root@test:~# nano /etc/nginx/sites-available/nextcloud.conf

Раскоментируем строку:
terminal
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
root@test:~# systemctl restart nginx

4. Не настроена система кеширования. Для увеличения производительности сервера, по возможности, настройте memcache. Более подробная информация доступна в документации.

terminal
root@test:~# nano /var/www/html/nextcloud/config/config.php
Добавляем в конце строку, перед конечной скобкой:
'memcache.local' => '\\OC\\Memcache\\APCu',
);
root@test:~#
root@test:~# systemctl restart nginx

5. В системе не установлены рекомендуемые модули PHP. Для улучшения производительности и совместимости рекомендуется установить эти модули.
-intl

terminal
root@test:~# apt update
root@test:~# apt install php7.3-intl
root@test:~# systemctl restart nginx


Все проверки пройдены.

Перейдите в пункт "Настройки" > "Личная информация" - Заполните поле "Адрес эл.почты"
Переходим в пункт "Основные параметры"
В разделе "Фоновые задания" - жмем "Cron"
Создадим задание в планировщике, предложит выбрать редактор, укажите цифру:

terminal
root@test:~# crontab -e -u www-data
no crontab for www-data - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/mcedit
4. /usr/bin/vim.tiny
5. /bin/ed
Choose 1-5 [1]: 1

Добавьте строку:

terminal
*/15 * * * * php -f /var/www/html/nextcloud/cron.php
root@test:~#

При наличии почтового сервера или регистрации в Яндекс по пред инструкции из раздела - регистрации домена, то заполняем поле "Почтовый сервер".

Жмем отправить сообщение. Проверяем доставку, письмо пришло.

Включим двухфакторную аутентификацию
Переходим в раздел "Приложения" > "Безопасность" > "Two-Factor TOTP Provider" устанавливаем. Переходим в раздел Настройки > Администрирование > Безопасность>Двухфакторная аутентификация > Требовать двухфакторную аутентификацию > Сохранить. Переходим в Личное > Безопасность > Включить TOTP. Далее на смартфон скачиваем Google Authenticator из него сканируем штрих-код. Теперь при входе необходима ввести дополнительный код из google authenticator.

Установку и настройку Fail2ban можно посмотреть здесь.

Настройка Postfix для отправки уведомлений о блокировке fail2ban через smtp серверы яндекса - здесь

Утилиты которые могут пригодиться в процессе обслуживания:
htop — диспетчер процессов.
iftop — показывает активные сетевые соединения
lm_sensors — температура процессора
lsof — выводит информацию о файлах которые ипользуются процессами.
Traceroute (tracepath)— маршрут до узла.
Nmap — сканер портов
wget — менеджер закачки
bzip2 — архиватор
whois — сервис предоставляющий информацию о доменах, ip адресах
mc — файловый менеджер

На этом основная настройка выполнена.