Установка ownCloud 9 на CentOS 7 с Nginx
Содержание
Однажды я подумал о том, что хорошо бы сохранять заметки Org Mode (на случай непредвиденных ситуаций) где-нибудь помимо домашнего компьютера, да и фоточки с телефона бекапить. Для первой задачи использование Git было явным оверкиллом, а с учётом второй задачи в качестве очевидного решения напрашивалась синхронизация через облачный сервис. В качестве "облака" я выбрал ownCloud — многопользовательский self-hosted сервер для хранения, синхронизации и обмена данными с открытым исходным кодом.
Помимо своей основной функциональности ownCloud предлагает:
-
доступ через:
- веб-интерфейс;
- клиенты для синхронизации под основные платформы;
- протокол WebDAV.
- управление пользователями с настраиваемыми правами доступа, квотами и обменом данными (sharing) между пользователями.
-
приложения для расширения базовой функциональности:
- календарь;
- контакты;
- галерея;
- музыкальный проигрыватель;
- новостной агрегатор (Atom & RSS);
- текстовый редактор;
- … и другие.
-
возможность подключения внешних хранилищ:
- Dropbox;
- Amazon S3;
- ownCloud;
- Google Drive;
- FTP;
- … и другие.
- … и многое другое.
В данной статье описана установка ownCloud со следующей конфигурацией ПО:
- CentOS 7.2
- ownCloud 9.0
- PHP 5.6
- Nginx 1.6 (веб-сервер)
- MariaDB 5.5 (СУБД)
- Redis 2.8 (memory cache)
Установка ПО
Нам понадобятся пакеты из репозитория EPEL:
yum install -y epel-release
Установим основные зависимости ownCloud.
$ yum install -y \
mariadb \
mariadb-server \
nginx \
policycoreutils-python \
setroubleshoot \
libxml2 \
redis \
certbot
PHP
Для работы ownCloud и используемых им приложений нам понадобится PHP и некоторые библиотеки для этого языка. В CentOS несколько протухшая версия PHP, поэтому добавим репозитории Remi со свежими сборками:
$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ rpm -Uvh remi-release-7.rpm
Включим нужные нам репозитории (мы будем использовать PHP версии 5.6):
Теперь можно установить сами пакеты:
$ yum install -y \
php \
php-fpm \
php-cli \
php-mcrypt \
php-gd \
php-xml \
php-common \
php-ldap \
php-mbstring \
php-mysqlnd \
php-pdo \
php-pear \
php-process \
php-intl \
php-pecl-redis \
php-pecl-imagick
ownCloud
Следующий шаг — установка самого ownCloud. Мы будем использовать официальный ownCloud для CentOS. Импортируем ключ репозитория:
$ rpm --import https://download.owncloud.org/download/repositories/stable/CentOS_7/repodata/repomd.xml.key
Добавим репозиторий и установим пакет owncloud-files:
$ wget http://download.owncloud.org/download/repositories/stable/CentOS_7/ce:stable.repo \
-O /etc/yum.repos.d/ce:stable.repo
$ yum clean expire-cache
$ yum install owncloud-files -y
При установке из репозитория ownCloud можно воспользоваться двумя опциями:
- owncloud — установить файлы ownCloud со всеми обязательными зависимостями, предлагаемыми по умолчанию — это PHP, веб-сервер Apache и СУБД MySQL (MariaDB);
- owncloud-files — установить только файлы ownCloud; при этом установка зависимостей ложится на плечи пользователя.
Так как мы собираемся использовать Nginx вместо Apache, то мы остановились на втором варианте.
Предварительная настройка
firewalld
Чуть ли не самое первое, что необходимо сделать на свежем сервере — это включить и настроить файервол. Мы будем использовать вариант, предлагаемый по умолчанию в CentOS.
Запускаем firewalld:
$ systemctl start firewalld
$ systemctl enable firewalld
Определяем зону по умолчанию:
$ firewall-cmd --get-default-zone
public
Разрешаем доступ по http и https (порты 80 и 443, соответственно):
$ firewall-cmd --zone=public --add-service=http --permanent
success
$ firewall-cmd --zone=public --add-service=https --permanent
success
$ firewall-cmd --reload
ImageTragick
К моменту написания статьи ([2016-05-23 Mon]) широкую известность приобрело семейство эксплоитов, обнаруженных в наборе библиотек для обработки изображений ImageMagick, получившее ироничное название ImageTragick. Чтобы избавить себя от опасности, отредактируем файл политик в соответствии с рекомендациями:
Права
Для корректной работы ownCloud нужно выставить корректные права и владельца директорий, которые он использует, и настроить для них контекст SELinux (отключать SELinux мы не будем — это малодушный, неспортивный шаг, который заставляет Dan Walsh плакать, ну и вредит безопасности). Кроме того, разрешим вебсерверу создавать TCP-соединения и отправлять почту.
Для этого воспользуемся модифицированным вариантом скрипта, предложенным в документации к ownCloud:
ocpath='/var/www/html/owncloud'
htuser='nginx'
htgroup='nginx'
rootuser='root'
# PHP Session path (on CentOS)
session_path='/var/lib/php/session'
printf "Creating possible missing Directories\n"
mkdir -p $ocpath/data
mkdir -p $ocpath/assets
mkdir -p $ocpath/updater
printf "chmod Files and Directories\n"
find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640
find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750
printf "chown Directories\n"
chown -R ${rootuser}:${htgroup} ${ocpath}/
chown -R ${htuser}:${htgroup} ${ocpath}/apps/
chown -R ${htuser}:${htgroup} ${ocpath}/assets/
chown -R ${htuser}:${htgroup} ${ocpath}/config/
chown -R ${htuser}:${htgroup} ${ocpath}/data/
chown -R ${htuser}:${htgroup} ${ocpath}/themes/
chown -R ${htuser}:${htgroup} ${ocpath}/updater/
chmod +x ${ocpath}/occ
printf "chmod/chown .htaccess\n"
if [ -f ${ocpath}/.htaccess ]
then
chmod 0644 ${ocpath}/.htaccess
chown ${rootuser}:${htgroup} ${ocpath}/.htaccess
fi
if [ -f ${ocpath}/data/.htaccess ]
then
chmod 0644 ${ocpath}/data/.htaccess
chown ${rootuser}:${htgroup} ${ocpath}/data/.htaccess
fi
# Owned by root:apache (by default), need to change this
# to allow the webserver process to access session data
printf "chown PHP session path"
chown -R ${htuser}:${htgroup} ${session_path}
printf "Configuring SELinux\n"
semanage fcontext -a -t httpd_sys_rw_content_t "${ocpath}/data"
restorecon "${ocpath}/data"
semanage fcontext -a -t httpd_sys_rw_content_t "${ocpath}/config"
restorecon "${ocpath}/config"
semanage fcontext -a -t httpd_sys_rw_content_t "${ocpath}/apps"
restorecon "${ocpath}/apps"
# Allow the webserver to create TCP connections
setsebool -P httpd_can_network_connect on
# Allow the webserver to send emails
setsebool -P httpd_can_sendmail on
Nginx
Запустим вебсервер:
$ systemctl start nginx
$ systemctl enable nginx
SSL
Детали получения сертификатов с помощью LetsEncrypt рассмотрены в другой статье, здесь мы кратко опишем выполняемые действия.
Создадим директорию для плагина Webroot:
$ install -o nginx -g nginx -d /var/www/common/letsencrypt
Для того, чтобы обезопасить себя от некоторых атак, направленных против приложений, использующих протоколы HTTPS и TLS (читай, против вебсервера), необходимо сгенерировать безопасные параметры для используемого этими протоколами криптографического алгоритма Diffie-Hellman.
$ openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
В результате получим файл dhparam.pem
с искомыми параметрами, путь которому мы укажем в конфигурации
сервера Nginx.
Удалим дефолтный сервер из /etc/nginx/nginx.conf
, добавим блок для прохождения acme challenge, который
будет перенаправлять остальные запросы на https:
Также мы добавили некоторые опции SSL, включая:
- разрешённые протоколы SSL (
ssl_protocols
), - сгенерированние ранее параметры Diffie-Hellman (
ssl_dhparam
), - whitelist безопасных и blacklist небезопасных серверных шифров (
ssl_ciphers
) - параметры сессии и др.;
Перезагрузим конфигурацию вебсервера:
$ systemctl reload nginx
Создадим скрипт для генерации сертификатов (скрипт принимает в качестве параметра доменное имя, для которого нужно сгенерировать сертификат):
Далее напишем systemd-юнит, который будет запускать непосредственную генерацию сертификата:
Это так называемый template-юнит. Он отличает от обычного тем, что
при запуске (инстацировании) ему передаётся параметр (в нашем случае домен),
который доступен внутри юнита в виде параметра %I
. Например, при инстацировании
шаблонного юнита с помощью команды
$ systemctl start cert@cloud.maximov.space.service
параметром является часть названия юнита от символа @
до суффикса .service
. В
инстацированном юните все вхождения %I
будут заменены на cloud.maximov.space
.
Для периодического обновления сертификатов также напишем шаблонный таймер, при инстацировании которого будет запускаться соответствующий сервис:
Запустим юнит и таймер:
systemctl start cert@cloud.maximov.space.service
systemctl start cert@cloud.maximov.space.timer
systemctl enable cert@cloud.maximov.space.timer
В результате получим сертификат, лежащий в директории /etc/letsencrypt/live/cloud.maximov.space/
.
PHP-FPM
PHP-FPM — это популярная реализация протокола FastCGI для PHP, созданная с упором на производительность.
Нам нужно, чтобы php-fmp запускался от пользователя nginx. Также необходимо задать переменные окружения, которые будут доступны процессу php-fpm (по умолчанию процесс запускается в пустом окружении). Для этого внесём следующие изменения в файл конфигурации php-fpm (остальные настройки трогать не будем).
Запускаем php-fpm:
$ systemctl start php-fpm
$ systemctl enable php-fpm
Конфигурация Nginx для ownCloud
За основу возьмём конфигурацию Nginx, предлагаемую Owncloud (wiki), внеся следующие изменения:
--- owncloud.conf.sample 2016-05-20 09:29:06.232034660 -0400
+++ cloud.maximov.space.conf 2016-05-23 05:09:57.105163202 -0400
@@ -1,25 +1,17 @@
upstream php-handler {
server 127.0.0.1:9000;
- #server unix:/var/run/php5-fpm.sock;
-}
-
-server {
- listen 80;
- server_name cloud.example.com;
- # enforce https
- return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
- server_name cloud.example.com;
+ server_name cloud.maximov.space;
- ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
- ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
+ ssl_certificate /etc/letsencrypt/live/cloud.maximov.space/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/cloud.maximov.space/privkey.pem;
# Add headers to serve security related headers
# Before enabling Strict-Transport-Security headers please read into this topic first.
- #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
+ add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
@@ -28,7 +20,7 @@
add_header X-Permitted-Cross-Domain-Policies none;
# Path to the root of your installation
- root /var/www/owncloud/;
+ root /var/www/html/owncloud/;
location = /robots.txt {
allow all;
@@ -95,7 +87,7 @@
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers (It is intended to have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into this topic first.
- #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
+ add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
Мы изменили:
- имя сервера (
cloud.maximov.space
), - корень сайта (
/var/www/html/owncloud
), - пути к файлам сертификата (
/etc/letsencrypt/live/cloud.maximov.space/*
), - добавили заголовок
Strict-Transport-Security
.
Полный конфиг:
Перезагружаем конфигурацию Nginx:
$ systemctl reload nginx
Mariadb
MariaDB — это совместимый с оригиналом форк СУБД MySQL, рождённый как ответ на невнятную политику владельца MySQL — печально известную корпорацию Oracle. В последнее время форк приобрёл (заслуженно) большую популярность, чем оригинал, что привело к тому, что многие проекты перешли с MySQL на MariaDB, и в большинстве дистрибутивов Linux MariaDB используется по умолчанию вместо MySQL.
Запустим сервер MariaDB.
$ systemctl start mariadb
$ systemctl enable mariadb
Завершим установку Mariadb — установим root-пароль, зададим полезные настройки, связанные с безопасностью:
$ mysql_secure_installation
Redis
Redis — это in-memory-хранилище, используемое как БД, кэш и очередь сообщений. Redis рекомендуемется в документации к ownCloud для использования в качестве memory cache.
Воспользуемся советом из официальной документации Redis и установим
параметр vm.overcommit_memory
:
$ echo 'vm.overcommit_memory=1' > /etc/sysctl.conf
$ sysctl vm.overcommit_memory=1
Запускаем Redis и проверяем, что Nginx может к нему коннектиться:
$ systemctl start redis
$ systemctl enable redis
$ sudo -u nginx redis-cli
Завершение установки Owncloud
Запустим скрипт, который создаст структуру базы данных для ownCloud:
cd /var/www/html/owncloud
sudo -u nginx php occ maintenance:install \
--database mysql --database-name owncloud \
--database-user root --database-pass DB_ROOT_PASS \
--admin-user admin --admin-pass ADMIN_PASS
Установка завершена! Теперь уже можно использовать ownCloud, но для оптимальной работы мы подкорректируем настройки ownCloud вручную:
Конфигурация ownCloud
Добавим cloud.maximov.space
к доверенным доменам (IP-адреса и домены,
которым разрешено подключаться к ownCloud):
Настроем подключение к Redis в конфиге Owncloud для использования в качестве memory cache:
Настроим периодический запуск maintenance-задач для ownCloud:
$ crontab -u nginx -e
*/15 * * * * php -f /var/www/html/owncloud/cron.php
Заменить настройку overwrite.cli.url
на следующее значение (это нужно в том
числе для того, чтобы в письмах генерировался корректный адрес сервера ownCloud):
'overwrite.cli.url' => 'https://cloud.maximov.space',
Установим язык по умолчанию:
'default_language' => 'ru',