Установка NextCloud на Ubuntu 16.04 (Apache2, MariaDB)

Для небольшой компании установил NextCloud в качестве точки обмена со сторонней бухгалтерией и бизнес-партнерами. До этого они обменивались документами по электронной почте, что, учитывая требования GDPR, создавало сложности.
Установка почти полностью делалась по статье “Install NextCloud On Ubuntu 16.04 LTS With Apache2, MariaDB, PHP 7.1 And Let’s Encrypt SSL/TLS”, за мелкими исключениями.
В моем случае сервер находится на нестандартном порту (порт прокидывается за NAT, 8443->443), поэтому использовать сертификат Let’s Encrypt не получится, для запроса сертификата веб-сайт должен быть доступен извне по портам 80/tcp и 443/tcp. Использовался самоподписанный сертификат SSL/TLS.
В сети много инструкций по настройке NextCloud в связке с Nginx, но я несколько недолюбливаю этот отличный веб-сервер за его головоломные файлы конфигурации.
Сам сервер развернут в виде LXC-контейнера для повышения уровня изоляции данных. В качестве базы данных – MariaDB.

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install apache2

Сразу отключим листинг директорий:
$ sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/apache2/apache2.conf
$ sudo systemctl stop apache2.service
$ sudo systemctl start apache2.service
$ sudo systemctl enable apache2.service

База данных:
$ sudo apt-get install mariadb-server mariadb-client
$ sudo mysql_secure_installation

When prompted, answer the questions below by following the guide.

Enter current password for root (enter for none): Just press the Enter
Set root password? [Y/n]: Y
New password: Enter password
Re-enter new password: Repeat password
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

Рестартуем сервер MariaDB:
$ sudo systemctl restart mysql.service

PHP 7.1 не входит в поставку Ubuntu 16.04, ставим из стороннего репозитория:
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install php7.1 libapache2-mod-php7.1 php7.1-common libapache2-mod-php7.1 php7.1-mbstring php7.1-xmlrpc php7.1-soap php-apcu php-smbclient php7.1-ldap php-redis php7.1-gd php7.1-xml php7.1-intl php7.1-json php-imagick php7.1-mysql php7.1-cli php7.1-mcrypt php7.1-ldap php7.1-zip php7.1-curl

Немного правим дефолтные параметры PHP-FPM:
$ sudo vim /etc/php/7.1/apache2/php.ini
file_uploads = On
allow_url_fopen = On
memory_limit = 512M
upload_max_filesize = 256M
max_execution_time = 360
date.timezone = Europe/Riga

Настройка базы:
$ sudo mysql -u root -p
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'new_password_here';
GRANT ALL ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY 'user_password_here' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Скачиваем и устанавливаем NextCloud:
$ wget https://download.nextcloud.com/server/releases/latetst.zip
$ unzip latest.zip
$ sudo mv nextcloud /var/www/html/nextcloud/
$ sudo chown -R www-data:www-data /var/www/html/nextcloud/
$ sudo chmod -R 755 /var/www/html/nextcloud/

Конфиг нового виртуального хоста, нужен только для начальной отладки:
$ sudo vim /etc/apache2/sites-available/nextcloud.conf

<VirtualHost *:80>
ServerAdmin admin@domain.tld
DocumentRoot /var/www/html/nextcloud/
ServerName office.domain.tld
ServerAlias doc.domain.tld
Alias /nextcloud "/var/www/html/nextcloud/"
<Directory /var/www/html/nextcloud/>
Options +FollowSymlinks
AllowOverride All
Require all granted
<IfModule mod_dav.c>
Dav off
</IfModule>
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Включим необходимые модули и рестартуем Apache:
$ sudo a2ensite nextcloud.conf
$ sudo a2enmod rewrite
$ sudo a2enmod headers
$ sudo a2enmod env
$ sudo a2enmod dir
$ sudo a2enmod mime
$ sudo systemctl restart apache2.service

Генерируем сертификат RSA со сроком 10 лет:
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Подробная информация по параметрам в статье на Digital Ocean: “How To Create a Self-Signed SSL Certificate for Apache in Ubuntu 16.04”.

Создаем рабочий конфиг виртуального хоста:
$ sudo vim /etc/apache2/sites-available/nextcloud-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin admin@domain.tld
DocumentRoot /var/www/html/nextcloud/
ServerName office.domain.tld
ServerAlias doc.domain.tld

Alias /nextcloud "/var/www/html/nextcloud/"

<Directory /var/www/html/nextcloud/>
Options +FollowSymlinks
AllowOverride All
Require all granted
<IfModule mod_dav.c>
Dav off
</IfModule>
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

</VirtualHost>
</IfModule>

Рестартуем Apache, заходим через веб на сервер, заканчиваем настройку:
$ sudo systemctl restart apache2.service

После первоначальной настройки необходимо сделать еще несколько полезных вещей:
1. Настроить SMTP-сервер для отправки почты:
Settings -> Administration -> Basic settings -> Email server

2. Включить кеширование данных, для небольшого сервера достаточно APCu:
$ sudo vim /var/www/html/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',

3. Отключить быстрый набор контактов, это повышает приватность данных:
Settings -> Administration -> Sharing -> [ ]Allow username autocompletion in share dialog…

4. Ускорить чистку удаленных файлов.
Дело в том, что по умолчанию удаленные файлы хранятся как минимум 30 дней и удаляются из “корзины” только если в систем осталось мало места на диске. Нам это совсем не нужно, пусть удаляются через 35 дней:
$ sudo vim /var/www/html/nextcloud/config/config.php
'trashbin_retention_obligation' => '30, 35',

Enjoy!

Leave a comment

Your comment