Установка своего облачного хранилища Nextcloud на web сервере NGINX на Ubuntu 22.04

Nextcloud это open source программа, с помощью которой можно организовать собственное облачное хранилище. Это почти как Dropbox, Яндекс Диск или iCloud, но с возможностью контролировать место и условия хранения ваших файлов. Также можно в Nextcloud можно интегрировать различные офисные программы такие как callabora или onlyoffice. Есть свой встроенный мессенджер Talk и многое другое.

Для установки Nextcloud потребуется предустановленная операционная система linux

Для начало переводим пользователя в сессию под root-ом

user@nextcloud:~$ sudo -i

Добавим репозитории для PHP и NGINX “на момент написания статьи последняя версия php 8.3

root@nextcloud:~# add-apt-repository ppa:ondrej/php

И обновим все пакеты

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

Настроим синхронизацию времени соответствующую Вашему часовому поясу

root@nextcloud:~# apt install chrony -y

root@nextcloud:~# timedatectl set-timezone Europe/Moscow

root@nextcloud:~# systemctl enable chrony

Установим сервер базы данных

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

Далее запустим его и добавим в автозагрузку

root@nextcloud:~# systemctl start mariadb

root@nextcloud:~# systemctl enable mariadb

Задаем пароль для суперпользователя mysql:

root@nextcloud:~# mysqladmin -u root password

Подключаемся к MariaDB, создаем базу данных и пользователя:

root@nextcloud:~# mysql -uroot -p

MariaDB [(none)]> CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud@localhost IDENTIFIED BY 'password';

CREATE DATABASE nextcloud это название Вашей базы данных

IDENTIFIED BY ‘password‘ это Ваш пароль от базы данных, замените его на свой. В дальнейшей установке он Вам понадобится

MariaDB [(none)]> FLUSH PRIVILEGES;

MariaDB [(none)]> exit

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

Для удобства дальнейшей настройки создадим переменную для PHP

root@nextcloud:~# export PHP_VER=8.3

Установим необходимые модули для PHP

root@nextcloud:~# apt install -y php${PHP_VER}-fpm php${PHP_VER}-common php${PHP_VER}-zip php${PHP_VER}-xml php${PHP_VER}-intl php${PHP_VER}-gd php${PHP_VER}-mysql php${PHP_VER}-mbstring php${PHP_VER}-curl php${PHP_VER}-imagick php${PHP_VER}-gmp php${PHP_VER}-bcmath libmagickcore-6.q16-6-extra

Настраиваем php-fpm 

Откроем для редактирования файл www.conf

root@nextcloud:~# nano /etc/php/${PHP_VER}/fpm/pool.d/www.conf

Снимем комментарий со строки (Удалим перед строкой знак ;)

;env[PATH] = /usr/local/bin:/usr/bin:/bin

Настраиваем php.ini

Откроем для редактирования файл php.ini

root@nextcloud:~# nano /etc/php/${PHP_VER}/fpm/php.ini

И отредактируем следующие строчки и также уберем комментарии:

;opcache.enable_cli=1
;opcache.interned_strings_buffer=32
;opcache.revalidate_freq=1

Добавим в автозагрузку и перезапустим  php-fpm

root@nextcloud:~# systemctl enable php${PHP_VER}-fpm

root@nextcloud:~# systemctl restart php${PHP_VER}-fpm

Установка и настройка веб-сервера NGINX

Установим сам веб-сервер NGINX:

root@nextcloud:~# apt install nginx -y

Настроим работу NGINX под Ваш домен

Создадим файл nextcloud.conf и отредактируем его

root@nextcloud:~# nano /etc/nginx/sites-enabled/nextcloud.conf

 

server {
        listen 80;
        listen 443 ssl;
        server_name cloud.my-domain.com; # Ваш домен

        if ($scheme = 'http') {
            return 301 https://$host$request_uri;
        }

        ssl_certificate /etc/nginx/ssl/cert.pem; # Путь с сертификату
        ssl_certificate_key /etc/nginx/ssl/cert.key; # Путь с сертификату

        root /var/www/nextcloud;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 = /core/templates/403.php;
        error_page 404 = /core/templates/404.php;

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

        location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
                deny all;
        }

        location ^~ /.well-known {
                location = /.well-known/carddav { return 301 /remote.php/dav/; }
                location = /.well-known/caldav  { return 301 /remote.php/dav/; }
                location = /.well-known/webfinger  { return 301 /index.php/.well-known/webfinger; }
                location = /.well-known/nodeinfo  { return 301 /index.php/.well-known/nodeinfo; }
                location ^~ /.well-known{ return 301 /index.php/$uri; }
                try_files $uri $uri/ =404;
        }

        location / {
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
                try_files $uri $uri/ index.php;
        }

        location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 = 404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_param HTTPS on;
                fastcgi_pass unix:/run/php/php8.3-fpm.sock; # Версия php
        }

        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires modified +30d;
                access_log off;
        }
}

Создаем каталог для хранения сертификатов и переходим в него:

root@nextcloud:~# mkdir /etc/nginx/ssl

root@nextcloud:~# cd /etc/nginx/ssl

Сгенерируем само отписанный сертификат сразу на 4 года

Для упрощения создадим переменную для домена (заменим cloud.my-domain.com на свой домен)

root@nextcloud:~# DOMAIN=$cloud.my-domain.com

root@nextcloud:~# openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=$DOMAIN"

Проверим конфигурацию NGINX и перезапустим его

root@nextcloud:~# nginx -t

root@nextcloud:~# systemctl restart nginx

Если устанавливаете nextcloud на физической машине или на ветруалке которая находится у Вас дома, в офисе или в дата-центре и перед сервером стоит Ваш маршрутизатор, то для безопасности и упрощения в дальнейшем перевыпуски (бесплатного) ssl сертификата Let’s Encrypt рекомендую использовать прокси сервер (nginx proxy manager), чтобы машина не смотрела (🤭 известным местом 🤭) в интернет. Ну и конечно необходимо прокинуть порты 80 и 443 на nginx proxy manager.

Установка Nextcloud

Установим утилиту unzip

root@nextcloud:~# apt install unzip -y

Перейдем в директорию tmp и скачаем последнюю версию nextcloud

root@nextcloud:~# cd /tmp

root@nextcloud:~# wget https://download.nextcloud.com/server/releases/latest.zip

Распакуем и перенесем содержимое архива в директорию  /var/www

root@nextcloud:~# unzip latest.zip

root@nextcloud:~# mv nextcloud /var/www

Задаем права доступа к директории  /var/www/nextcloud для www-data

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