0

Owncloud на CentOS 7 и NGINX

Настало время потихоньку погружаться в RedHat/CentOs 7. Я поставлю на него owncloud 8.

Ранее я уже описывал установку owncloud7 на CentOS6. Эти заметки во многом повторяются.
Я постараюсь уделить больше внимания новому.

Подотовка

Подготовлю свежеустановленный CentOS7.

Hostname

Первым делом поменяю имя машины. Cейчас у меня uname -n говорит:

localhost.localdomain

Я попробовал прописать hostname в /etc/sysconfig/network, но это не принесло жалаемого результата. systemd — такой systemd.
Самое время обратиться к документации.

В документации сказано, что для установки hostname нужно выполнить:
# hostnamectl set-hostname www.jnotes.ru

И действительно, hostname установлен и после ребута все хорошо.

Можно приступать к установке owncloud.

Установка owncloud

Подключение репозитария

# vi /etc/yum.repos.d/owncloud.repo

[isv_ownCloud_community]
name=Latest stable community release of ownCloud (CentOS_CentOS-7)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/isv:/ownCloud:/community/CentOS_CentOS-7/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/isv:/ownCloud:/community/CentOS_CentOS-7/repodata/repomd.xml.key
enabled=1

# yum install owncloud

nginx

На этот раз в качестве веб сервера буду использовать nginx.

Поэтому перетаскиваю owncloud на nginx. Для этого устанавливаю php-fpm и сам nginx:
# yum install epel-release
# yum install php-fpm nginx
# systemctl enable nginx.service
# systemctl enable php-fpm.service
# systemctl stop httpd.service
# systemctl disable httpd.service

Подготавливаю конфиг для nginx,в соответствии с документацией owncloud — /etc/nginx/conf.d/owncloud.conf:

upstream php-handler {
  server 127.0.0.1:9000;
  #server unix:/var/run/php5-fpm.sock;
}
server {
  listen 80;
  server_name owncloud.jnotes.ru;
  # enforce https
  return 301 https://$server_name$request_uri;
}
server {
  listen 443 ssl;
  server_name owncloud.example.com;

  ssl_certificate /etc/ssl/nginx/owncloud.jnotes.ru.crt;
  ssl_certificate_key /etc/ssl/nginx/owncloud.jnotes.ru.key;

  # Path to the root of your installation
  root /var/www/html/owncloud/;
  # set max upload size
  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 ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
  }

  location / {
    # The following 2 rules are only needed with webfinger
    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 ^/.well-known/carddav /remote.php/carddav/ redirect;
    rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

    rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

    try_files $uri $uri/ /index.php;
  }

  location ~ \.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;
    fastcgi_pass php-handler;
  }

  # Optional: set long EXPIRES header on static assets
  location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
    expires 30d;
    # Optional: Don't log access to assets
    access_log off;
  }
}

SSL сертификат

Создаю самоподписанный сертификат:
# mkdir /etc/ssl/nginx
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/nginx/owncloud.jnotes.ru.key -out /etc/ssl/nginx/owncloud.jnotes.ru.crt

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Ulyanovsk
Locality Name (eg, city) []:Ulyanovsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:jnotes.ru
Organizational Unit Name (eg, section) []:jnotes.ru
Common Name (e.g. server FQDN or YOUR name) []:jnotes.ru
Email Address []:

Установка MySQL

OwnCloud может работать SQLite, MySQL, PostgreSQL и Oracle. По умолчанию будет исполщоваться SQLite.
Однако:

SQLite will be used as database.
For larger installations we recommend to choose a different database backend.
Особенно вызывает сомнение использование SQLite при синхронизации файлов с использование клиента для ПК.

Я буду пользовать mariadb.

# yum install mariadb-server php-mysql
# systemctl enable mariadb
# service mariadb start

Создаю базу данных и пользователя для owncloud:
# service mariadb start
# mysql
MariaDB [(none)]> create database owncloud;
MariaDB [(none)]> create user 'owncloud'@'localhost' identified by 'password0';
MariaDB [(none)]> grant all privileges on owncloud.* to 'owncloud'@'localhost';
MariaDB [(none)]> flush privileges;

Не забыть установить пароль на root базы данных:
mysqladmin -u root password 'password0'

SELinux

В SELinux дать разрешения на запись в следующие директории:

  • /var/www/html/owncloud/data
  • /var/www/html/owncloud/config
  • /var/www/html/owncloud/apps

Для этого делаю следующее:
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/data' && restorecon '/var/www/html/owncloud/data'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/config' && restorecon '/var/www/html/owncloud/config'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/apps' && restorecon '/var/www/html/owncloud/apps'

Приятно, что semanage в дистрибутиве есть. Ранее приходилось каждый раз ставить.

firewalld

Настало время открыть firewall и продолжить установку через web интерфейс.
Для понимания как работает и что умеет firewalld я прочитал документацию у RedHat.
Кроме того, оставлю еще одну ссылку по firewalld

В итоге на скорую руку не удалось вкурить как ограничить ssh с одного хоста.
Простой, легкий в освоении, логичный firewalld после прочтения man’а и нескольких статей требует более глубокого изучения. В итоге я просто разрешил своему хосту подключаться по всем портам к серверу.

# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="x.x.x.x" accept'
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="x.x.x.x" accept' --permanent

Запуск

После этого можно запустить php-fpm и nginx:
# chown -R apache:apache /var/www/html/owncloud
# service php-fpm start
# service nginx start

Завершение установки

Завершающим этапом прописываю хост в DNS и иду на http://owncloud.jnotes.ru, где происываю:

  • логин/пароль администратора
  • каталог для хранения данных
  • тип базы данных — MySQL/MariaDB
  • авторизационные данные для подключения к базе данных

На этом установка завершена, возвращаюсь к firewalld.

Нужно разрешить доступ к серверу с любого адреса по портам 80 и 443.

firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --reload

Проверяю:
# firewall-cmd --list-all --permanent

public (default)
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
      rule family="ipv4" source address="x.x.x.x" accept

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.