Ubuntu: устанавливаем и настраиваем Nextcloud

Nextcloud Ubuntu

С 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.
Ubuntu: устанавливаем и настраиваем 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, запретим удаленные подключения:

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

Ubuntu: устанавливаем и настраиваем Nextcloud
Нажимаем NEXT:)

 

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

 

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

 

Ubuntu: устанавливаем и настраиваем Nextcloud
Устанавливаем имя пользователя и пароль. Заполняем данные для соединения с базой Снизу убрать галку — установить дополнительные компоненты Нажимаем последний 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 ],
 ],

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

Ubuntu: устанавливаем и настраиваем Nextcloud
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

Собственно все:)
Ubuntu: устанавливаем и настраиваем Nextcloud

P.S. Написал небольшое дополнение о переносе хранилища в другое место.

Рейтинг
( 5 оценок, среднее 4.6 из 5 )
Понравилась статья? Поделиться с друзьями:
Комментарии: 6
  1. ANDREY

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

    1. Vladimir (автор)

      Спасибо за проявленный интерес, набросал заметку на вашу тему.

  2. Алексей

    1) Просьба подсказать, IP 192.168.168.7 — это IP вашего ПК, с которого разрешается удаленно заходить на сервер Nextcloud для настройки? Или это внутренний IP самого сервера NextCloud?

    2) «Обращаем внимание на location /setup-nextcloud.php в котором прописываем свой IP адрес для доступа к установщику.
    После установки этот блок можно удалить:»

    Я правильно понимаю, что можно позже удалить вот эту часть конфига?:

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

    1. Vladimir (автор)

      Да, совершенно верно.

  3. Владимир

    Вот с этим не понятно:

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

    Куда эту запись добавлять? Никак не удаётся сделать, чтобы nslookup видел этот домен.

  4. Vladimir

    Пути для установки настроек неверные.
    Нужные значение для PHP удалось применить только после указания их в файле: /etc/php/8.3/apache2/php.ini

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

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.