DT Wiki

Nextcloud

Файлообменный сервер для централизованного хранения персонального контента, в том числе документов и изображений. Весь его функционал реализован с открытым исходным кодом.

Подготовка системы

Выполним предварительную настройку, прежде чем начать развертывание Nextcloud.
Для начала логинимся из под root

su

Обновляем списки пакетов. Актуализируем списки пакетов в репозиториях:

apt update && apt -y upgrade

Устанавливаем утилиту chrony, оболочку Midnight Commander, SUDO для предоставления прав root для пользователя системы, WEB сервер Nginx, сервер баз данных MariaDB, клиента для SMB протокола для подключения к Windows ресурсов и брендмауэр UFW:

apt install -y chrony mc sudo nginx mariadb-server smbclient ufw ca-certificates apt-transport-https software-properties-common wget curl lsb-release

Дадим необходимые права для пользователя

/sbin/usermod -aG sudo username

Где вместо username надо вставить ваше имя пользователя
затем необходимо перелогиниться пользовательской учеткой

su username

Выставляем нужный часовой пояс:

sudo timedatectl set-timezone Europe/Moscow

Разрешаем запуск демона chrony:

sudo systemctl enable chrony

Настройка брандмауэра.

прежде чем запускать UFW неоходимо разрешить подключение по SSH (предполагается, что мы подключены через SSH), а так же все необходимые порты для дальнешего пользования Nextcloud

sudo ufw allow SSH
sudo ufw allow 'NGINX FULL'
sudo ufw allow 'DNS'

Активируем UFW

sudo ufw enable

Эта команда так же добавляет его в автозагрузку

Настройка сервера баз данных

Разрешаем автозапуск и стартуем сервис:

sudo systemctl enable --now mariadb

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

sudo mysqladmin -u root password

Создаем базу данных и пользователя:

sudo mysql -e "CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;"
sudo mysql -e "GRANT ALL PRIVILEGES ON nextcloud.* TO nextadmin@localhost IDENTIFIED BY 'P@$$W0RD';"

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

Посмотреть, какая версия будет установлена из репозитория системы можно командой:

sudo apt search --names-only '^php[.0-9]{3}$'

Рекомендованная версия для испозования 8.1
Подготовим систему для установки PHP версии 8.1

curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
sudo apt update && sudo apt -y upgrade
sudo apt install -y libmagickcore-6.q16-6-extra redis-server memcached php8.1-{fpm,common,zip,xml,intl,gd,mysql,mbstring,curl,imagick,gmp,bcmath,redis,redis,memcached}

Настройка php-fpm

Установка php завершена и можно перейти к ее настройке.

sudo mcedit /etc/php/8.1/fpm/pool.d/www.conf

Снимаем комментарии со следующей строки:

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

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

sudo mcedit /etc/php/8.1/fpm/php.ini

Раскоментируем и поправим следующие строки

memory_limit = 512
opcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.revalidate_freq=1

Разрешаем автозапуск php-fpm и запускаем его:

sudo systemctl enable --now php8.1-fpm

Установка NGINX

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

sudo apt install -y nginx

Создаем виртуальный домен cloud.home.net и настраиваем его для работы с облачным сервисом:

sudo mcedit /etc/nginx/sites-enabled/nextcloud

Добавляем следующее содержимое:

server {
        listen 80;
        listen 443 ssl;
        server_name cloud.home.net;

        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.1-fpm.sock;
        }

        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires modified +30d;
                access_log off;
        }
}
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/nextcloud

Создаём папку для SSL ключа и сертификата и переходим в неё

sudo mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

Генерируем ключ и сертификат:

sudo openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key -subj "/C=RU/ST=MSK/L=DME/O=Flamandia/OU=IT Department/CN=cloud.home.net/CN=nextcloud"

В этом примере запущен nextcloud с использованием самоподписанного сертификата. Для продуктивной среды рекомендуется использовать нормальный сертификат или бесплатный от Let's Encrypt.
После установки php скорее всего установился и запустился apache, поэтому на всякий случай отключаем его:

sudo systemctl stop apache2
sudo systemctl disable apache2

Проверяем конфигурацию nginx и перезапускаем сервис:

sudo nginx -t

Если все succsess перезапускаем веб сервер

sudo nginx -s reload

Установка Nextcloud

Теперь загрузим последнюю версию.

cd ~
wget https://download.nextcloud.com/server/releases/latest.tar.bz2

Распаковываем скачанный архив:

tar -xjvf latest.tar.bz2 -C /var/www 

Задаем права доступа к каталогу с nextcloud:

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

Открываем браузер и переходим по адресу https://cloud.home.net

Задаем логин и пароль для администратора. В качестве базы данных выбираем MySQL/MariaDB (если предлагается выбор) и вводим логин, пароля и имя базы nextcloud которые создали ранее.

Настройка Redis и Memcached

Открываем конфигурационный файл для nextcloud:

sudo mcedit /var/www/nextcloud/config/config.php

И добавим (перед поледней скобкой):

  'memcache.local' => '\\OC\\Memcache\\Redis',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => 
      array (
          'host' => 'localhost',
          'port' => 6379,
        ),
  'memcache.local' => '\\OC\\Memcache\\Memcached',
  'memcache.distributed' => '\\OC\\Memcache\\Memcached',
  'memcached_servers' =>
   array (
     0 =>
     array (
	     0 => 'localhost',
         1 => 11211,
        ),
    ),
sudo systemctl enable --now memcached

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

sudo systemctl restart php8.1-fpm

Готово, пользуемся.