NextCloud: установка сервера на Debian с NGINX и PHP-FPM, и клиента на Arch Linux

Автор: | 17/03/2019

После новости о том, что Dropbox вводит ограничение на 3 устройства – я таки созрел для установки NextCloud.

Огорчил не сам лимит – у меня три устройства и используются, плюс оно повлияет только на новых пользователей (старые будут ограничены их текущим количеством устройств, а вот за дополнительные – придётся платить), сколько вообще введение подобных ограничений.

Когда компании начинают менять правила игры, потому что им захотелось больше денег – в этом приятного мало.

Кроме того – спокойнее хранить данные у себя, чем доверять их третьим лицам.

Потому – сейчас выполним быструю установку и настройку NexCloud вручную – просто, что бы посмотреть на то, как оно всё будет работать, а в следующий раз – внесём его в имеющуюся автоматизацию для RTFM (для примера – см. Prometheus: мониторинг для RTFM — Grafana, Loki и promtail) – NextCloud будет располагаться на том же сервере, в отдельном виртуалхосте и использовать отдельный Digital Ocean Block Storage (aka Volumes).

Digital Ocean имеет так же Object Storage, налог AWS S3, и, в принципе, это было бы более подходящим решением, но это дополнительные 5 уе. Кроме того – со Spaces в DO я ещё не работал, и пока тратить время на знакомство с ними не хочу.

Документация по хранилищам Digital Ocean – тут>>>.

В любом случае – потом можно будет просто перенести данные.

Кстати – никто не мешает держать сервер в DO, а для хранения данных – подключать к нему AWS S3.

Официальная документация NexСloud доступна тут>>>.

NexСloud vs ownCloud

NextCloud (появился в 2016) является форком ownCloud (появился в 2010).

Хорошие сравнения можно почитать тут:

Диски Digital Ocean дроплета

Запускаем виртуальную машину, и подключаем к ней дополнительный Volume.

Тут детально описывать процесс не буду, см. пост DigitalOcean: знакомство — Droplet, Floating IP, Firewall.

При создании Volume выбираем тип Manually Format & Mount:

Подключаемся:

[simterm]

$ ssh [email protected] -i do-rtfm-dev-droplet

[/simterm]

Проверяем диски:

[simterm]

root@nextcloud-testing:~# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    1G  0 disk 
vda    254:0    0   25G  0 disk 
└─vda1 254:1    0   25G  0 part /
vdb    254:16   0  434K  1 disk

[/simterm]

/dev/sda – диск для NextCloud.

Создаём новый каталог:

[simterm]

root@nextcloud-testing:~# mkdir -p /data/nextcloud

[/simterm]

Создаём раздел на /dev/sda:

[simterm]

root@nextcloud-testing:~# fdisk /dev/sda
...
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xc5322339.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-2097151, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151): 

Created a new partition 1 of type 'Linux' and of size 1023 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[/simterm]

Форматируем раздел /dev/sda1:

[simterm]

root@nextcloud-testing:~# mkfs.ext4 /dev/sda1

[/simterm]

Монтируем его в /data/nextcloud/:

[simterm]

root@nextcloud-testing:~# mount /dev/sda1  /data/nextcloud/

[/simterm]

Получаем UUID раздела:

[simterm]

root@nextcloud-testing:~# blkid /dev/sda1
/dev/sda1: UUID="37e8697e-e51e-4a91-83d5-79efe61fe91b" TYPE="ext4" PARTUUID="c5322339-01"

[/simterm]

Добавляем в fstab с опцией nofail:

UUID="37e8697e-e51e-4a91-83d5-79efe61fe91b"     /data/nextcloud/        ext4    nofail 0 0

Отмонтируем:

[simterm]

root@nextcloud-testing:~# umount /data/nextcloud

[/simterm]

И монтируем через /etc/fstab, что бы проверить, что всё корректно записано:

[simterm]

root@nextcloud-testing:~# mount -a
root@nextcloud-testing:~# lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    1G  0 disk
└─sda1   8:1    0 1023M  0 part /data/nextcloud

[/simterm]

С этим всё.

Можно ещё перезагрузить машину, что бы проверить, что всё работает.

NGINX и PHP

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

[simterm]

root@nextcloud-testing:~# apt update && apt -y upgrade && apt -y install nginx

[/simterm]

Устанавливаем PHP и PHP-FPM:

[simterm]

root@nextcloud-testing:~# apt install php php-xml php-curl php-gd php-zip php-mysql php-mbstring php-fpm wget unzip -y

[/simterm]

Создаём конфиг виртуалхоста.

Тут для примера будем использовать nextcloud-testing.setevoy.org.ua.

Сейчас всё делаем без TLS, конфиг будет выглядеть так:

server {

    listen 80;
    listen [::]:80;

    server_name nextcloud-testing.setevoy.org.ua;

    root /var/www/html/nextcloud-testing.setevoy.org.ua;

    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 / {
        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 unix:/run/php/php7.0-fpm.sock;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    location ~ \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=15778463";
        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 ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }

}

Документация по настройке NGINX для NextCloud смотрите тут>>>.

UPD: сетапил по этому гайду через полгода, наткнулся на fastcgi_pass unix:/run/php/php7.0-fpm.sock – проверьте вашу текущую версию РНР, т.к. путь к сокету будет другим, например /run/php/php7.3-fpm.sock

Проверяем, перезапускаем:

[simterm]

root@nextcloud-testing:~# nginx -t && service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[/simterm]

Создаём для теста файл с phpinfo():

[simterm]

root@nextcloud-testing:~# mkdir /var/www/html/nextcloud-testing.setevoy.org.ua/
root@nextcloud-testing:~# echo "<?php phpinfo(); ?>" > /var/www/html/nextcloud-testing.setevoy.org.ua/phptest.php

[/simterm]

Проверяем его:

Меняем владельца каталога:

[simterm]

root@nextcloud-testing:~# chown -R www-data:www-data /var/www/html/

[/simterm]

И каталога /data/nextcloud:

[simterm]

root@nextcloud-testing:~# chown -R www-data:www-data /data/nextcloud

[/simterm]

MariaDB

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

[simterm]

root@nextcloud-testing:~# apt install -y mariadb-server

[/simterm]

Т.к. это тестовая установка – то можно пропустить шаг, но на реальном сервере, если делается с нуля – выполняем mysql_secure_installation:

[simterm]

root@nextcloud-testing:~# mysql_secure_installation

[/simterm]

Пока – просто подключаемся, создаём базу для NextCloud – тут он будет хранить свои настройки, пользователей и т.д:

[simterm]

root@nextcloud-testing:~# mysql
...
MariaDB [(none)]>

[/simterm]

Создаём базу:

[simterm]

MariaDB [(none)]> create database nextcloud;
Query OK, 1 row affected (0.00 sec)

[/simterm]

Пользователя и его права на эту базу:

[simterm]

MariaDB [(none)]> grant all privileges on nextcloud.* to 'nextcloud'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

[/simterm]

Выходим, проверяем:

[simterm]

root@nextcloud-testing:~# mysql -u nextcloud -ppassword -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| nextcloud          |
+--------------------+

[/simterm]

Установка NextCloud

Загружаем инсталятор:

[simterm]

root@nextcloud-testing:~# cd  /var/www/html/nextcloud-testing.setevoy.org.ua/
root@nextcloud-testing:/var/www/html/nextcloud-testing.setevoy.org.ua# wget https://download.nextcloud.com/server/installer/setup-nextcloud.php
--2019-03-17 12:36:14--  https://download.nextcloud.com/server/installer/setup-nextcloud.php
...
2019-03-17 12:36:14 (4.90 MB/s) - ‘setup-nextcloud.php’ saved [148203/148203]

[/simterm]

Открываем файл setup-nextcloud.php в браузере:

Начинаем установку – тут задаём точку, что бы установить в текущий каталог:

Проверяем файлы:

[simterm]

root@nextcloud-testing:/var/www/html/nextcloud-testing.setevoy.org.ua# ls -l
total 444
drwxr-xr-x 32 www-data www-data   4096 Mar 17 12:41 3rdparty
drwxr-xr-x 38 www-data www-data   4096 Mar 17 12:41 apps
-rw-r--r--  1 www-data www-data  12063 Mar 17 12:41 AUTHORS
...
drwxr-xr-x  2 www-data www-data   4096 Mar 17 12:41 updater
-rw-r--r--  1 www-data www-data    362 Mar 17 12:41 version.php

[/simterm]

Создаём первого  пользователя, указываем каталог для хранения данных (/data/nextcloud) и настройки подключения к базе данных:

Готово:

Клиент NextCloud на Arch Linux

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

[simterm]

$ sudo pacman -S nextcloud-client

[/simterm]

Или альтернативная из AUR (разницы не заметил):

[simterm]

$ yay -S nextcloud-client-git

[/simterm]

Запускаем – nextcloud:

Подключаемся – Log in:

Настраиваем параметры синхронизации:

Жмём Connect:

И открываем каталог Nextcloud в домашней директории:

Он же в WebUI:

Мобильный клиент NextCloud

На Android устанавливаем из Google Play:

И далее те же шаги – авторизуемся, попадаем в каталог с данными:

Календарь и прочие возможности мне не нужны будут – только синхронизация данных.

Данные на сервере будут в каталоге /data/nextcloud/%USERNAME%/files:

[simterm]

root@nextcloud-testing:~# find /data/ -name Nextcloud.png
/data/nextcloud/admin/files/Nextcloud.png

[/simterm]

Готово.