Ubuntu: устанавливаем и настраиваем Nextcloud Альтернатива коммерческим облачным хранилищам

Всем привет!
С Nextcloud я знаком достаточно давно, еще когда был только owncloud.
У меня было две инсталляции под FreeBSD, все хорошо работало, обновлялось и т.п.
В силу обстоятельств, Covid-19 и часть сотрудников на удаленке, решил поставить на Nextcloud OnlyOffice и узнал, что OnlyOffice только для Linux:)

Community document server is not supported for this instance, please setup and configure an external document server
only linux based servers are supported
В общем было два пути решения проблемы:

  1.  Установить где-то на Linux  ONLYOFFICE Document Server и с помощью плагина ONLYOFFICE подключить его
  2. Раз в любом случае нужен Linux – мигрировать с FreeBSD на Linux

Я выбрал второй вариант, т.к. я знаком с Ubuntu, будем использовать ее.
Описанная установка будет происходить на свежеустановленный дистрибутив Ubuntu 20.04.

При установке системы, инсталлятор предложил “из коробки” установить Nextcloud.

От данного предложения я отказался, т.к. установка будет произведена в контейнер LXD, что на мой взгляд мне не очень подходит.
Поэтому поставим все руками:

  • PHP с нужными библиотеками и php-fpm
  • NGINX – как веб-сервер
  • mariadb-server – как сервер базы данных
  • Certbot – для получения сертификата от Let’s Encrypt
  • Nextcloud – для чего все затевалось, так же установим поддержку ONLYOFFICE

Перед установкой добавим в DNS запись про наш хост cloud.mydomain.ru:

cloud   IN    A    111.111.111.111

Для начала установим обновления:

sudo apt-get update
sudo apt-get dist-upgrade

Установим все кроме Nextcloud такой командой:

sudo apt-get install nginx mariadb-server python3-certbot memcached php-memcached php-apcu php7.4-gd php7.4-json php7.4-mysql php7.4-curl php7.4-mbstring php7.4-intl php-imagick php7.4-xml php7.4-zip php7.4-fpm php7.4-bcmath php7.4-gmp

Настроим параметры php – добавим временную зону, увеличим время выполнения, добавим размер загружаемых файлов:

sudo vi /etc/php/7.4/fpm/php.ini
date.timezone = Europe/Moscow
memory_limit = 512M
max_execution_time = 90
upload_max_filesize = 200M
post_max_size = 300M

Внесем изменения в php-fpm, раскомментировав 5 строк:

sudo vi /etc/php/7.4/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

Перезапустим php-fpm:

sudo service php7.4-fpm restart

Займемся базой данных – установим пароль для пользователя root, запретим удаленные подключения и создадим базу для Nextcloud:

sudo mysql_secure_installation
Enter current password for root (enter for none):
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Создадим базу для Nextcloud, пользователя для этой базы – nextcloud с паролем mypassword:

# mysql -u root -p
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'mypassword';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on nextcloud.* to 'nextcloud'@'localhost';
FLUSH privileges;
\q

Очередь NGINX, создадим конфигурационный файл виртуального хоста.
Создадим root директорию для Nextcloud:

sudo mkdir /var/www/nextcloud
chown www-data:www-data /var/www/nextcloud

Создадим временный конфиг для виртуального хоста cloud.mydomain.ru:

sudo vi /etc/nginx/sites-available/cloud.mydomain.ru
server {
    listen 80;
    server_name cloud.mydomain.ru;
    root /var/www/nextcloud;
}

Создадим симлинк для подключения данного конфига:

sudo ln -s /etc/nginx/sites-available/cloud.mydomain.ru /etc/nginx/sites-enabled/

Проверим корректность конфигурационного файла nginx:

sudo nginx -t
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапустим NGINX:

sudo nginx -s reload

Проверим распространилась наша DNS запись на google DNS:

nslookup
> server 8.8.8.8
Default server: 8.8.8.8
Address: 8.8.8.8#53
> cloud.mydomain.ru
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   cloud.mydomain.ru
Address: 111.111.111.111
exit

Видим, что наш хост корректно резольвится, получим сертификаты от Let’s Encrypt:

sudo certbot certonly -w /var/www/nextcloud/ -d cloud.mydomain.ru
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): vladimir@mydomain.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-v02.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 our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for cloud.mydomain.ru
Using the webroot path /var/www/nextcloud for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/cloud.mydomain.ru/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/cloud.mydomain.ru/privkey.pem
   Your cert will expire on 2020-09-21. 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

Видим, что сертификат мы получили:
/etc/letsencrypt/live/cloud.mydomain.ru/fullchain.pem
/etc/letsencrypt/live/cloud.mydomain.ru/privkey.pem

Т.к. сертификаты выдаются на 3 месяца, настроим их автоматическое обновление:
certbot добавляет задание в сron, добавим к нему перезагрузку nginx:

sudo crontab -u root -e
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * /usr/bin/certbot -q renew && nginx -s reload

Изменим конфигурационный файл виртульного хоста NGINX, обращаем внимание на location /setup-nextcloud.php в котром прописываем свой IP адрес для доступа к установщику, после установки этот блок можно удалить :

sudo vi /etc/nginx/sites-available/cloud.mydomain.ru
upstream php-handler {
        server unix:/var/run/php/php7.4-fpm.sock;
}

server {
    listen 80;
    server_name cloud.mydomain.ru;
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    server_name ccloud.mydomain.ru;

    ssl_certificate /etc/letsencrypt/live/cloud.mydomain.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.mydomain.ru/privkey.pem;
    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload;" always;
    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;

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

        location = /setup-nextcloud.php {
        allow 192.168.168.7;
        deny all;
        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;
    }

    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 200M;
    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/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;

    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\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
        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;
    }

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

     location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        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;
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
        try_files $uri /index.php$request_uri;
        access_log off;
    }
}

Передергиваем NGINX:

sudo nginx -s reload

Скачиваем установщик Nextcloud:

cd /var/www/nextcloud
sudo -u www-data wget https://download.nextcloud.com/server/installer/setup-nextcloud.php

Заходим через браузер по адресу: https://cloud.mydomain.ru/setup-nextcloud.php

Нажимаем NEXT:)

В поле ставим точку, чтобы не создалась еще директория nextcloud И нажимаем Next

 

Дистрибутив загружен, нажимаем Next

 

Устанавливаем имя пользователя и пароль. Заполняем данные для соединения с базой Снизу убрать галку – установить дополнительные компоненты Нажимаем последний Next

Заходим в Настройки -> Общие сведения
Получаем сообщение:

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

vi /var/www/nextcloud/config/config.php
  'memcache.local' => '\OC\Memcache\APCu',
  'memcache.distributed' => '\OC\Memcache\Memcached',
  'memcached_servers' => [
     [ '127.0.0.1', 11211 ],
 ],

Рефрешим страницу настроек:

Bingo!

 

Ну и до кучи, давайте установим решения от ONLYOFFICE (команда выполняется долго, т.к. сачивается больше 300 мегабайт):

cd /var/www/nextcloud
sudo -u www-data php occ app:install documentserver_community
sudo -u www-data php occ app:install onlyoffice

Собственно все:)

 

5 1 голосовать
Рейтинг статьи
Подписаться
Уведомление о
guest
2 Комментарий
Oldest
Newest Most Voted
Встроенные отзывы
Просмотр всех комментариев
ANDREY
ANDREY
6 дней назад

Интересно бы было узнать как при установке поменять место хранения файлов nextcloud, а именно систему я поставил к примеру на SSD но есть аппаратный RAID 10 как на него перенести место хранение файлов nextcloud?