Передовые виртуальные и выделенные серверы для проектов любой сложности и структуры.
 Подписывайтесь на Telegram канал!

Создадим своё облачное хранилище NextCloud под управление Nginx на базе дистрибутива CSS от Calculate Linux. Принцип установки и настройки подойдет для любого другого дистрибутива Linux. Совместная работа с файлами с любого браузера.

Введение

Ранее я описывал как настраивать NGINX на web сервер CentOS 7 и LEMP сервер на Calculate Linux на основе последнего материала произведу настройку NextCloud. Обновление облачного хранилища производится средствами самого ресурса и поэтому выполним установку из исходных файлов с сайта разработчика. NextCloud будет работать в локальной сети. Для удобства работы откроем доступ с сети интернет и подключим свободный сертификат SSL от компании Let`s Encrypt. В качестве базы данных будем использовать PostgreSQL.

Ошибка при установке на MariaBD

При попытке установки на базу данных MariaDB вы получите ошибку:

«General error: 1665 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED»

Для избавления от этой ошибки необходимо отредактировать конфигурационный файл /etc/mysql/my.cnf отвечающий за настройки базы.

/etc/mysql/my.cnf
= необходимые параметры =
[mysqld]
binlog-format=MIXED
innodb_large_prefix=on
innodb_file_format=barracuda
innodb_file_per_table=true

После перезагрузки MariaDB установка пройдёт без ошибок.

Установка и настройка PostgreSQL

В будущем я напишу более детальную статью о том как работать с PostgreSQL. Ниже я лишь опишу основные моменты которые необходимы для работы NextCloud с этой базой данных.

Установим базу данных PostgreSQL командой:

emerge --ask dev-db/postgresql

Настроим базу выполнив команду:

emerge --config =dev-db/postgresql-9.6.6
= вывод команды =

Configuring pkg...

* You can modify the paths and options passed to initdb by editing:
 * /etc/conf.d/postgresql-9.6
 * 
 * Information on options that can be passed to initdb are found at:
 * http://www.postgresql.org/docs/9.6/static/creating-cluster.html
 * http://www.postgresql.org/docs/9.6/static/app-initdb.html
 * 
 * PG_INITDB_OPTS is currently set to:
 * --encoding=UTF8
 * 
 * Configuration files will be installed to:
 * /etc/postgresql-9.6/
 * 
 * The database cluster will be created in:
 * /var/lib/postgresql/9.6/data
 * 
 * Continuing initialization in 5 seconds (Control-C to cancel) ... [ ok ]
 * Creating the data directory ...
 * Initializing the database ...
Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres".
От его имени также будет запускаться процесс сервера.

Кластер баз данных будет инициализирован со следующими параметрами локали:
 COLLATE: ru_RU.utf8
 CTYPE: ru_RU.utf8
 MESSAGES: ru_RU.utf8
 MONETARY: ru_RU.utf8
 NUMERIC: C
 TIME: ru_RU.utf8
Выбрана конфигурация текстового поиска по умолчанию "russian".

Контроль целостности страниц данных отключён.

исправление прав для существующего каталога /var/lib/postgresql/9.6/data... ок
создание подкаталогов... ок
выбирается значение max_connections... 100
выбирается значение shared_buffers... 128MB
выбор реализации динамической разделяемой памяти ... posix
создание конфигурационных файлов... ок
выполняется подготовительный скрипт ... ок
выполняется заключительная инициализация ... ок
сохранение данных на диске... ок

ПРЕДУПРЕЖДЕНИЕ: используется проверка подлинности "trust" для локальных подключений.
Другой метод можно выбрать, отредактировав pg_hba.conf или используя ключи -A,
--auth-local или --auth-host при следующем выполнении initdb.

Готово. Теперь вы можете запустить сервер баз данных:

/usr/lib64/postgresql-9.6/bin/pg_ctl -D /var/lib/postgresql/9.6/data -l logfile start

* The autovacuum function, which was in contrib, has been moved to the main
 * PostgreSQL functions starting with 8.1, and starting with 8.4 is now enabled
 * by default. You can disable it in the cluster's:
 * /etc/postgresql-9.6/postgresql.conf
 * 
 * The PostgreSQL server, by default, will log events to:
 * /var/lib/postgresql/9.6/data/postmaster.log
 * 
 * You should use the '/etc/init.d/postgresql-9.6' script to run PostgreSQL
 * instead of 'pg_ctl'.

В выводе указана вся основная информация.

Запустим сервис PostgreSQL:

/etc/init.d/postgresql-9.6 start
= вывод команды =
postgresql-9.6 | * /run/postgresql: creating directory
postgresql-9.6 | * /run/postgresql: correcting owner
postgresql-9.6 | * Starting PostgreSQL 9.6 ...

Добавим в автозагрузку:

rc-update add postgresql-9.6 default
= вывод команды =
 * service postgresql-9.6 added to runlevel default

Создадим пароль для пользователя posgres:

psql -U postgres
psql (9.6.6)
Введите "help", чтобы получить справку.

postgres=# \password
Введите новый пароль: вводим пароль
Повторите его: повторяем пароль
postgres=# \q

Настройка доступа к базам PostgreSQL

Настройки ниже необходимы если вы планируйте подключатся к базам данных с других компьютеров в локальной сети посредством программы pgAdmin 4 версии.

За доступ отвечают параметры в файле /etc/postgresql-9.6/pg_hba.conf. В моем случае мне необходимо чтобы доступ был разрешен только с моего компьютера в локальной сети. Произведем корректировку файла:

vim /etc/postgresql-9.6/pg_hba.conf
= часть вывода команды с необходимым дополнением =
# IPv4 local connections: 
host    all             all             127.0.0.1/32            trust 
host    all             all             192.168.0.3/24          trust

Помимо того что надо добавить доступ в iptables для 5432 необходимо внести изменения в файл /etc/hosts. Добавим нужные данные с учетом что ip адрес сервера 192.168.0.141:

vim /etc/hosts
= часть вывода команды с необходимым добавлением =
127.0.0.1 lempcss.sevo44.loc lempcss localhost
192.168.0.141 lempcss.sevo44.loc lempcss localhost

Перезагрузим сервис баз данных:

/etc/init.d/postgresql-9.6 restart 
postgresql-9.6    | * Stopping PostgreSQL 9.6 (this can take up to 92 seconds) ...  [ ok ] 
postgresql-9.6    | * /run/postgresql: correcting mode 
postgresql-9.6    | * Starting PostgreSQL 9.6 ...                     [ ok ]

Проверим какие порты работают:

netstat -an 
= часть вывода команды =
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.0.141:5432      0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN

Достаточно указать в pgAdmin4 сервер 192.168.0.141, порт 5432, данные пользователя posgres для подключения и удобно работать с базами данных.

Добавление базы PosgreSQL

Добавим базу и пользователя для облачного ресурса NextCloud:

Перейдем под пользователя posgres
su - postgres
Создадим базу nextcloud
postgres@lempcss ~ $ createdb nextcloud
Подключимся к консоли Postgres
psql -U postgres
psql (9.6.6)
Введите "help", чтобы получить справку.
Выведем список всех баз
postgres=# \l 
Список баз данных 
    Имя    | Владелец | Кодировка | LC_COLLATE |  LC_CTYPE  |     Права доступа      
-----------+----------+-----------+------------+------------+----------------------- 
 nextcloud | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | postgres=CTc/postgres+ 
           |          |           |            |            | 
 postgres  | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 |  
 template0 | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | =c/postgres          + 
           |          |           |            |            | postgres=CTc/postgres 
 template1 | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | =c/postgres          + 
           |          |           |            |            | postgres=CTc/postgres 
(4 строки)
Добавим роль (пользователя) nextcloud с правами на вход
postgres=# CREATE ROLE nextcloud WITH LOGIN;
CREATE ROLE
Посмотрим список ролей (пользователей)
postgres=# \du 
                                           Список ролей 
 Имя роли  |                                Атрибуты                                 | Член ролей  
-----------+-------------------------------------------------------------------------+------------ 
 nextcloud |                                                                         | {} 
 oc_admin  | Создаёт БД                                                              | {} 
 postgres  | Суперпользователь, Создаёт роли, Создаёт БД, Репликация, Пропускать RLS | {}
Добавим пароль пользователю nextcloud
postgres=# \password nextcloud
Введите новый пароль: вводим пароль
Повторите его: повторяем пароль
Назначим полные права на базу nextcloud пользователю ntxtcloud
postgres=# grant connect, create on database nextcloud to nextcloud;
GRANT
Выведем информацию о базе nextcloud
postgres=# \l nextcloud 
                                 Список баз данных 
    Имя    | Владелец | Кодировка | LC_COLLATE |  LC_CTYPE  |     Права доступа      
-----------+----------+-----------+------------+------------+----------------------- 
 nextcloud | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | postgres=CTc/postgres+ 
           |          |           |            |            | nextcloud=Cc/postgres 
(1 строка)
Выйдем из консоли PostgresQL
postgres=# \q

Всё хорошо. Необходимая база и пользователь созданы. Осталось проверить подключение к базе выполнив команду:

psql -U nextcloud -d nextcloud -h 127.0.0.1 -W
= вывод команды =
Пароль пользователя nextcloud: 
psql (9.6.6)
Введите "help", чтобы получить справку.


nextcloud-> \q

Базу данных настроили можно переходить к дальнейшим этапам установки свободного облачного сервиса Nextcloud.

Установка NextCloud

Установка с исходных кодов с сайта разработчика производится в три этапа:

  1. Создание необходимых путей и загрузка файлов,
  2. Создание фала конфигурации Nginx для работы облачного ресурса,
  3. Внесение необходимых поправок в конфигурацию сервисов  для корректной работы NextCloud.

Предварительная подготовка

Создадим необходимые папки:

mkdir -p /var/www/nextcloud/{logs,upload,save}

Перейдем в папку и скачаем последнюю версию NextCloud:

cd /var/www/nextcloud
wget https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zip

Распакуем:

unzip /var/www/nextcloud/nextcloud-12.0.3.zip -d /var/www/nextcloud

Переименуем:

mv /var/www/nextcloud/nextcloud /var/www/nextcloud/htdocs

Назначим необходимые права:

chown -R nginx:nginx /var/www/nextcloud

Настройка Nginx для Nextcloud

Создадим файл для работы NextCloud под управлением сервиса Nginx:

В моем случае название ресурса будет cloud.sevo44.ru

vim /etc/nginx/conf.d/nextcloud.conf  
= необходимый код с пояснениями =
# nc.sevo44.ru 
    upstream php-handler { 
    #server 127.0.0.1:9000; 
    server unix:/run/php-fpm.socket; 
} 

server { 
    listen 80; 
    server_name cloud.sevo44.ru; 
    # Path to the root of your installation 
    root /var/www/nextcloud/htdocs/; 
    #Logs 
    access_log /var/www/nextcloud/logs/access.log main; 
    error_log /var/www/nextcloud/logs/error.log; 
 
    #Max upload size 
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K; 
 
    # Enable gzip but do not remove ETag headers 
    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 applicati
on/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json applic
ation/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vca
rd text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
   
    # Add headers to serve security related headers 
    # Before enabling Strict-Transport-Security headers please read into this 
    # topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    # includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
    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; 
     
    location = /robots.txt { 
        allow all; 
        log_not_found off; 
        access_log off; 
    } 
 
    #Для получения сертификата ssl 
    location ~ /.well-known { 
               allow all; 
    } 
 
    # The following 2 rules are only needed for the user_webfinger app. 
    # Uncomment it if you're planning to use this app. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json 
    # last; 
 
    location = /.well-known/carddav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
    location = /.well-known/caldav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
 
    location / { 
        rewrite ^ /index.php$uri; 
    } 
 
    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/.+|ocs-provider/.+)\.php(?:$|/) { 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    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; 
    fastcgi_param front_controller_active true; 
    fastcgi_pass php-handler; 
    fastcgi_intercept_errors on; 
    fastcgi_request_buffering off; 
    } 
 
    location ~ ^/(?:updater|ocs-provider)(?:$|/) { 
    try_files $uri/ =404; 
    index index.php; 
    } 
 
    # Adding the cache control header for js and css files 
    # Make sure it is BELOW the PHP block 
    location ~ \.(?:css|js|woff|svg|gif)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    add_header Cache-Control "public, max-age=15778463"; 
    # Add headers to serve security related headers (It is intended to 
    # have those duplicated to the ones above) 
    # Before enabling Strict-Transport-Security headers please read into 
    # this topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    #  includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    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; 
    # Optional: Don't log access to assets 
    access_log off; 
    } 
 
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    # Optional: Don't log access to other assets 
    access_log off; 
    } 
}

Запрос getenv(«PATH») для NextCloud

Для избежания ошибки в последующем после установки NextCloud сразу внесем необходимое изменение. 

Определим пути в системе:

printenv PATH
= вывод команды =
/usr/x86_64-pc-linux-gnu/gcc-bin/5.4.0:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin

Отредактируем файл www.conf:

vim /etc/php/fpm-php7.0/fpm.d/www.conf
= необходимое изменение =
; При значении 5 на небольшой нагрузке можно получить ошибку 504
; в моем случае ошибка появлялась при просмотре фильмов
pm.max_children = 20
= необходимое дополнение =
;PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
;/PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.

Параметры PHP OPcache для Nextcloud

Для избежания ошибки в последующем после установки NextCloud сразу внесем необходимое изменение. 

Внесем изменения в файл php.ini:

vim /etc/php/fpm-php7.0/php.ini
= необходимые дополнения =
[opcache] 
! В моём случае все параметры этого блока были отключены!
opcache.enable=1 
opcache.enable_cli=1 
opcache.interned_strings_buffer=8 
opcache.max_accelerated_files=10000 
opcache.memory_consumption=128 
opcache.save_comments=1 
opcache.revalidate_freq=1

После всех настроек перед непосредственном запуском установки NextCloud необходимо проверить, перезапустить Nginx и Php-fpm:

nginx -t
= вывод команды = 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 

/etc/init.d/nginx reload
= вывод команды =
nginx | * Checking nginx' configuration ...                [ ok ]
nginx | * Refreshing nginx' configuration ...              [ ok ]

/etc/init.d/php-fpm restart  
= вывод команды =
php-fpm | * Stopping PHP FastCGI Process Manager ...       [ ok ]
php-fpm | * Testing PHP FastCGI Process Manager config ... [ ok ]
php-fpm | * Starting PHP FastCGI Process Manager ...       [ ok ]

Запуск установки NextCloud

Перед запуском установки необходимо прописать имя ресурса cloud.sevo44.ru работающего на ip адресе 192.168.0.141 в DNS сервер локальной сети или внести необходимые изменения в необходимый файл локальной машины для доступа к ресурсу. Для систем Linux дополнение вносятся в файл /etc/hosts:

vim /etc/hosts
= необходимое дополнение =
192.168.0.141 cloud.sevo44.ru

NextCloud sevo44_setup

Получение SSL от Let`s Encrypt

Ранее я описывал более подробно про получение и продление бесплатный трехмесячных сертификатов SSL. Ниже я лишь опишу получение и продление сертификатов со спецификой для дистрибутивов на базе Gentoo.

Установка Let`s Encrypt для Calculate и Gentoo

Установим сам certbot обеспечивающий работу с сертификатами от Let`s Encrypt:

emerge --ask app-crypt/certbot

Установим расширения для получения сертификатов средствами nginx:

emerge --ask app-crypt/certbot-nginx

После успешной установки получим сертификат для нашего домена cloud.sevo44.ru:

Внимание! В моем варианте облачное хранилище уже настроено так чтобы доступ к ресурсу был как с локальной сети так и с интернета!Первый раз раз можно получить сертификат, используя временный веб сервер самого certbot (пункт 2), но после начала работы сайта придется повторить действие по получению сертификата для перенастройки файла отвечающего за автоматическое продление сертификата!

certbot certonly 
= вывод команды с пояснениями =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Nginx Web Server plugin - Alpha (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): info@sevo44.ru

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): cloud.sevo44.ru --- доменное имя на которое получаем
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for cloud.sevo44.ru

Select the webroot for cloud.sevo44.ru:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for cloud.sevo44.ru: (Enter 'c' to cancel): /var/www/nextcloud/htdocs/ --- путь до корневой папки ресурса
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
 /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem
 Your key file has been saved at:
 /etc/letsencrypt/live/cloud.sevo44.ru/privkey.pem
 Your cert will expire on 2018-02-19. To obtain a new or tweaked
 version of this certificate in the future, simply run certbot
 again. To non-interactively renew *all* of your certificates, run
 "certbot renew"
 - If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
 Donating to EFF: https://eff.org/donate-le

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

Hello,

Your certificate (or certificates) for the names listed below will expire in
19 days (on 15 Dec 17 11:21 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.

webinar.sevo44.ru

В результате успешной установки мы получим необходимые файлы которые необходимо прописать в файл настройки Nginx для сайта. Ниже я расскажу что и как прописать в файл настройки сайта а сейчас остановлюсь на автоматической продлении и основных моментах работы этого сервиса.

Расположение файлов для работы SSL от Let’s Encrypt

Перейдем в папку с сервисом и выведем информацию о тот что находится в папке:

cd /etc/letsencrypt/ 
ls 
= вывод команды =
accounts  csr   live   renewal ssl-dhparams.pem 
archive  keys  options-ssl-nginx.conf  renewal-hooks

Назначение папок и файлов:

  • live — в этой папке находятся все необходимые файлы для работы ssl разбитые папками на каждый ресурс для которого получались ключи,
  • renewal — параметры которые будут использованы при продлении сертификата,
  • options-ssl-nginx.conf — необходимые параметры которые необходимо указать в файле настройки nginx,
  • ssl-dhparams.pem файл параметров Диффи-Хеллмана необходимый для лучшей безопасности при работе сайта с SSL.

Внимание! В случае если вам необходимо сменить тип получения сертификата необходимо запустить заново команду «certbot certonly» и указать необходимые параметры для нужного домена и файл отвечающий за параметры продления сертификата будет обновлен в папке renewal!

Автоматическое продление сертификатов Let’s Encrypt

Ручное обновление всех сертификатов сводится к вводу в командной строке команды:

certbot renew

Для проверки работы сервиса но без обновления сертификатов достаточно указать команду:

certbot renew --dry-run

В случае успешной проверки нам достаточно создать файл в необходимой папке и указать необходимый код:

vim /etc/cron.d/cartboot
= вывод команды с необходимыми изменениями = 
# Получение сертификатов
30 4 * * 1 root /usr/bin/certbot renew >> /var/log/cron-renew.log
35 4 * * 1 root /etc/init.d/nginx reload

Согласно этого кода в 4.30 каждый понедельник будет производится получение новых ssl сертификатов взамен старым, если их пора обновлять, с записью лога в файл и последующая перезагрузка сервиса Nginx.

Файл лога будет выглядеть:

cat /var/log/cron-renew.log
= часть вывода команды =
--------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/cloud.sevo44.ru.conf
--------------------------------------------------------------------

--------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/office.sevo44.ru.conf
--------------------------------------------------------------------

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

The following certs are not due for renewal yet:
 /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem (skipped)
 /etc/letsencrypt/live/office.sevo44.ru/fullchain.pem (skipped)
No renewals were attempted.

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

Файл настройки NextCloud для работы с SSL Nginx

Исходя из всего сказанного выше мой файл настройки получил такой вид:

vim /etc/nginx/conf.d/nextcloud.conf
= вывод команды c пояснениями =
# cloud.sevo44.ru 443 http2
    upstream php-handler { 
    #server 127.0.0.1:9000; 
    server unix:/run/php-fpm.socket; 
} 

server { 
    listen 80; 
    server_name cloud.sevo44.ru; 
    rewrite ^ https://$server_name$request_uri? permanent; 
} 
 
server { 
    # Работа сайта на ssl c включением протокола http2
    listen 443 ssl http2; 
    server_name cloud.sevo44.ru; 
    # Path to the root of your installation 
    root /var/www/nextcloud/htdocs/; 
    #Logs 
    access_log /var/www/nextcloud/logs/access.log main; 
    error_log /var/www/nextcloud/logs/error.log; 
 
    #Max upload size 
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K; 
 
    # Enable gzip but do not remove ETag headers 
    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 appl
ication/ld+json application/manifest+json application/rss+xml application/vnd.ge
o+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-ap
p-manifest+json application/xhtml+xml application/xml font/opentype image/bmp im
age/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; 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
     
    #Если самоподписной ssl 
    #ssl_certificate /etc/ssl/nginx/cloud.sevo44.loc.crt; 
    #ssl_certificate_key /etc/ssl/nginx/cloud.sevo44.loc.key; 
     
    #Для ssl 
    ssl_certificate /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/cloud.sevo44.ru/privkey.pem; 
    ssl_session_cache shared:le_nginx_SSL:1m; 
    ssl_session_timeout 1440m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_prefer_server_ciphers on; 
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE
-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA3
84:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA3
84:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDH
E-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-A
ES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-
AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA
:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-S
HA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
     
    # Add headers to serve security related headers 
    # Before enabling Strict-Transport-Security headers please read into this 
    # topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    # includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
    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; 
     
    location = /robots.txt { 
        allow all; 
        log_not_found off; 
        access_log off; 
    } 
 
    #Для получения сертификата ssl 
    location ~ /.well-known { 
               allow all; 
    } 
 
    # The following 2 rules are only needed for the user_webfinger app. 
    # Uncomment it if you're planning to use this app. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json 
    # last; 
 
    location = /.well-known/carddav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
    location = /.well-known/caldav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
 
    location / { 
        rewrite ^ /index.php$uri; 
    } 
 
    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]|u
pdater/.+|ocs-provider/.+)\.php(?:$|/) { 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    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; 
    fastcgi_param front_controller_active true; 
    fastcgi_pass php-handler; 
    fastcgi_intercept_errors on; 
    fastcgi_request_buffering off; 
    } 
 
    location ~ ^/(?:updater|ocs-provider)(?:$|/) { 
    try_files $uri/ =404; 
    index index.php; 
    } 
 
    # Adding the cache control header for js and css files 
    # Make sure it is BELOW the PHP block 
    location ~ \.(?:css|js|woff|svg|gif)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    add_header Cache-Control "public, max-age=15778463"; 
    # Add headers to serve security related headers (It is intended to 
    # have those duplicated to the ones above) 
    # Before enabling Strict-Transport-Security headers please read into 
    # this topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    #  includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    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; 
    # Optional: Don't log access to assets 
    access_log off; 
    } 
 
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    # Optional: Don't log access to other assets 
    access_log off; 
    } 
}

Ресурсы проверки SSL и Http2 сайта

Проверим сторонними ресурсами как установился наш SSL-сертификат.

  • SSLChecker — cервис проверки настройки SSL,
  • SSLReport — сервис проверки SSL но более детальный.

Проверим работу http2 протокола:

  • HTTP/2 Test — сервис показывающий проверяющий работу http2.

Ротация логов сайта Nginx

Так как логи сайта выведены из стандартного места хранения логов и файл отвечающего за легирование сайтов уже нестроен, согласно предыдущей статьи LEMP сервер на Calculate Linux, то нам достаточно добавить одну строчку:

vim /etc/logrotate.d/sites 
= вывод команды с пояснениями =
# Указываем в каждой строчке необходимый сайт 
/var/www/pma/logs/*log 
/var/www/nextcloud/logs/*log 
{ 
create 0644 nginx nginx 
daily 
rotate 60 
missingok 
notifempty 
compress 
sharedscripts 
postrotate 
test -r /run/nginx.pid && kill -USR1 `cat /run/nginx.pid` 
        endscript 
}

Результат

Установка и работа своего облачного хранилища средствами свободного программного обеспечения была основная задача статьи и она успешно реализована. Было желание описать в этой статье более подробную настройку, но статья стала получатся слишком большая и было решено рассказать про детальную настройку NextCloud в следующей статье. Будет затронуто описанием установки самых популярных расширений для удобной работы облачного ресурса NextCloud.

Понравилась статья? Поделитесь ей с друзьями!
Пожалуйста, оставляйте свои комментарии

Читая их я получаю информацию которая позволяет мне улучшить качество написания статей. Кроме того, оставляя комментарии вы помогаете сайту получить более высокий рейтинг у поисковых систем. Давайте общаться.

4 комментариев для статьи “NextCloud установка на Nginx

  1. Как в целом впечатление о продукте? У меня давно витают мысли перейти с яндекс диска на свое сетевое хранилище. Но всегда смущает, что яндекс работает стабильно и предсказуемо, я всегда могу получить доступ к данным, а опенсорсные программы возможно не обладают такой же стабильностью и надежностью. Но реально я их не проверял еще, руки не доходят.

    1. Начинал я с OwnCloud. После тестирования NextCloud однозначно могу сказать что удобств и расширений в NextCloud больше. Есть нюансы в настройке про которые расскажу в следующей статье. Обновления проходят без проблем… Ну а по функционалу и возможностей мне нравится больше чем Yandex.Disk. Примантировал в NextCloud свои все Yandex диски и все теперь в одном месте 😉 Есть там система видео звонков между пользователей, чат, привязка календарей всех популярных, групповые всякие политики, подключение хоть к LDAP хоть к AD….. А стабильность он в руках пользователя только… с кривыми руками и самые стабильные программы ломаются 🙂

      1. Подключение яндекс дисков к своему хранилищу очень удобно. Не знал об этой возможности. Надо будет попробовать.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *