Устанавливаем Nextcloud на платформе Docker, настраиваем обратный прокси для HTTPS-доступа, выполняем интеграцию с Active Directory, подключаем сетевые ресурсы DFS

Замечание: после копирования файлов в контейнеры необходимо проверять права доступа к ним, а также их владельцев


Установка Docker Engine — Community


устанавливаем необходимые пакеты

yum install yum-utils device-mapper-persistent-data lvm2

устанавливаем репозиторий

yum-config-manager —add-repo https://download.docker.com/linux/centos/docker-ce.repo

устанавливаем Docker Engine — Community

yum install docker-ce docker-ce-cli containerd.io

создаем файл /etc/docker/daemon.json для настройки подсети bridge-интерфейса

{
  "bip": "192.168.100.1/24"
}

запускаем Docker

systemctl start docker

запускаем для проверки установки контейнер hello-world

docker run hello-world


Установка Docker Compose


скачиваем последнюю версию Docker Compose

curl -L «https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)» -o /usr/local/bin/docker-compose

разрешаем выполнение скачанного файла

chmod +x /usr/local/bin/docker-compose

проверяем работу утилиты

docker-compose —version


Установка Nextcloud


создаем папку для хранения параметров развертывания контейнеров

mkdir /etc/docker/nc

создаем файл с параметрами развертывания контейнеров /etc/docker/nc/docker-compose.yml

version: '3'
 
networks:
  net:
    ipam:
      config:
        - subnet: 192.168.101.1/24
 
volumes:
  db:
  app:
 
services:
  db:
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always
 
  app:
    depends_on:
      - db
    image: nextcloud
    networks:
      - net
    ports:
      - 80:80
    volumes:
      - app:/var/www/html
    restart: always

запускаем контейнеры

docker-compose -f /etc/docker/nc/docker-compose.yml up -d

находим в журнале контейнера MySQL автоматически сгенерированный пароль пользователя root

docker logs nc_db_1

подключаемся к консоли MySQL контейнера базы данных

docker exec -t -i nc_db_1 mysql -u root -p

изменяем пароль администратора

alter user ‘root’@’localhost’ identified by ‘some_root_pass’;

создаем базу данных для nextcloud

create database nextcloud;

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

create user ‘nextcloud’@’%’ identified with mysql_native_password by ‘some_user_pass’;

предоставляем пользователю права полного доступа к базе данных

grant all privileges on nextcloud.* to ‘nextcloud’@’%’;

отключаемся от консоли MySQL

quit;

проходим в браузере по ссылке http://cloud.domain.com и выполняем начальную настройку сервиса


Настройка HTTPS-доступа


останавливаем контейнеры

docker-compose -f /etc/docker/nc/docker-compose.yml stop

добавляем в файл конфигурации контейнеров /etc/docker/nc/docker-compose.yml определение контейнера с Apache HTTP Server и подключаемого к нему раздела, а также удаляем перенаправление порта 80 в контейнер приложения. В результате файл конфигурации должен принять следующий вид

version: '3'
 
networks:
  net:
    ipam:
      config:
        - subnet: 192.168.101.1/24
 
volumes:
  db:
  app:
  proxy:
 
services:
  db:
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always
 
  app:
    depends_on:
      - db
    image: nextcloud
    networks:
      - net
    volumes:
      - app:/var/www/html
    restart: always
 
  proxy:
    depends_on:
      - db
      - app
    image: httpd
    networks:
      - net
    ports:
      - 80:80
      - 443:443
    volumes:
      - proxy:/usr/local/apache2
    restart: always

запускаем контейнеры

копируем из контейнера приложения на хост файл конфигурации Nextcloud

docker cp nc_app_1:/var/www/html/config/config.php ~/config.php

вносим в файл конфигурации изменения

'trusted_domains' =>
  array (
    0 => 'app',
  ),
'overwrite.cli.url' => 'https://cloud.domain.com',
'overwritehost' => 'cloud.domain.com',
'overwriteprotocol' => 'https',
'trusted_proxies' =>
  array (
    0 => '192.168.101.0/24',
  ),

копируем файл конфигурации обратно в контейнер

docker cp ~/config.php nc_app_1:/var/www/html/config/config.php

копируем из контейнера прокси на хост файл конфигурации Apache

docker cp nc_proxy_1:/usr/local/apache2/conf/httpd.conf ~/httpd.conf

вносим в файл конфигурации изменения

включаем необходимые модули

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Include conf/extra/httpd-ssl.conf

запрещаем доступ к автоматически создаваемой папке веб-содержимого, для чего удаляем директивы

DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">...</Directory>
<Directory "/usr/local/apache2/cgi-bin">...</Directory>

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

<VirtualHost *:80>
  Redirect permanent / https://cloud.domain.com/
</VirtualHost>
 
<VirtualHost *:443>
  SSLEngine on
  SSLCertificateKeyFile   /usr/local/apache2/conf/private.key
  SSLCertificateFile      /usr/local/apache2/conf/public.cer
  SSLCertificateChainFile /usr/local/apache2/conf/root.cer
  Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
  ProxyPass / http://app/
  ProxyPassReverse / http://app/
</VirtualHost>

отключаем функционал прямого прокси-сервера

ProxyRequests off

указываем контакты администратора

ServerAdmin [email protected]

Замечание: для некоторых приложений, использующих протоколы CalDAV и CardDAV (например, Calendar или Contacts), необходимо добавить в конфигурацию дополнительные правила перезаписи заголовков. Подробнее можно прочитать здесь

копируем файл конфигурации обратно в контейнер

docker cp /root/httpd.conf nc_proxy_1:/usr/local/apache2/conf/httpd.conf

копируем из контейнера прокси на хост файл конфигурации модуля mod_ssl

docker cp nc_proxy_1:/usr/local/apache2/conf/extra/httpd-ssl.conf ~/httpd-ssl.conf

удаляем из файла конфигурации директиву

<VirtualHost>...</VirtualHost>

копируем файл конфигурации обратно в контейнер

docker cp ~/httpd-ssl.conf nc_proxy_1:/usr/local/apache2/conf/extra/httpd-ssl.conf

копируем сертификат ЦС, сертификат сервера и закрытый ключ сервера в контейнер прокси


docker cp ~/private.key nc_proxy_1:/usr/local/apache2/conf/private.key
docker cp ~/public.cer nc_proxy_1:/usr/local/apache2/conf/public.cer
docker cp ~/root.cer nc_proxy_1:/usr/local/apache2/conf/root.cer

перезапускаем контейнеры

docker-compose -f /etc/docker/nc/docker-compose.yml restart

проходим в браузере по ссылке https://cloud.domain.com


Интеграция с Active Directory


добавляем в файл конфигурации контейнеров /etc/docker/nc/docker-compose.yml в параметры контейнера приложения дополнительный раздел для хранения конфигурации LDAP. В результате файл конфигурации должен принять вид

version: '3'
 
networks:
  net:
    ipam:
      config:
        - subnet: 192.168.101.1/24
 
volumes:
  db:
  app:
  ldap:
  proxy:
 
services:
  db:
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always
 
  app:
    depends_on:
      - db
    image: nextcloud
    networks:
      - net
    volumes:
      - app:/var/www/html
      - ldap:/etc/ldap
    restart: always
 
  proxy:
    depends_on:
      - db
      - app
    image: httpd
    networks:
      - net
    ports:
      - 80:80
      - 443:443
    volumes:
      - proxy:/usr/local/apache2
    restart: always

копируем из контейнера LDAP на хост файл конфигурации LDAP

docker cp nc_app_1:/etc/ldap/ldap.conf ~/ldap.conf

указываем в файле конфигурации путь к файлу с сертификатом центра сертификации, выпустившего сертификат для LDAPS-сервера

TLS_CACERT /etc/ldap/root.cer

копируем файл конфигурации обратно в контейнер

docker cp ~/ldap.conf nc_app_1:/etc/ldap/ldap.conf

копируем в контейнер сертификат центра сертификации

docker cp ~/root.cer nc_app_1:/etc/ldap/root.cer

запускаем контейнеры

в консоли администратора в меню «Приложения» включаем приложение «LDAP user and group backend»

в настройках интеграции LDAP/AD добавляем сервер аутентификации

вкладка «Сервер»

сервер — ldaps://dc.domain.com

порт — 636

учетная запись — CN=nextcloud,CN=users,DC=domain,DC=com

база поиска — CN=users,DC=domain,DC=com

ввести фильтры LDAP вручную — включено

вкладка «Пользователи»

запрос LDAP — (&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=пользователи nextcloud,CN=users,DC=domain,DC=com))

вкладка «Учетные данные»

(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=пользователи nextcloud,CN=users,DC=domain,DC=pro)(samaccountname=%uid))

проходим в браузере по ссылке https://cloud.domain.com и выполняем аутентификацию посредством учетной записи Active Directory


Подключение SMB-ресурсов


останавливаем контейнеры

создаем файл /etc/docker/nc/dockerfile-app с параметрами построения образа контейнера приложения

FROM nextcloud
RUN apt-get update && apt-get install -y smbclient && rm -rf /var/lib/apt/lists/*

редактируем файл /etc/docker/nc/docker-compose для использования собственного образа контейнера приложения. В результате файл конфигурации должен принять вид

version: '3'
 
networks:
  net:
    ipam:
      config:
        - subnet: 192.168.101.1/24
 
volumes:
  db:
  app:
  ldap:
  proxy:
 
services:
  db:
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always
 
  app:
    depends_on:
      - db
    build:
      context: .
      dockerfile: dockerfile-app
    networks:
      - net
    volumes:
      - app:/var/www/html
      - ldap:/etc/ldap
    restart: always
 
  proxy:
    depends_on:
      - db
      - app
    image: httpd
    networks:
      - net
    ports:
      - 80:80
      - 443:443
    volumes:
      - proxy:/usr/local/apache2
    restart: always

Замечание: параметр «context» определяет путь к папке, содержащей файл параметров построения контейнера. Символ «.» означает текущий каталог

запускаем контейнеры

в консоли администратора в меню «Приложения» включаем приложение «External storage support»

в настройках внешнего хранилища добавляем хранилище (на примере DFS-ресурса //domain.pro/dfs/shared)

тип — SMB/CIFS

способ авторизации — учетные данные хранить в сессии

имя сервера — domain.com

общие ресурс — dfs

подкаталог — shared

домен — domain

проходим в браузере по ссылке https://cloud.domain.com, выполняем аутентификацию посредством учетной записи Active Directory, имеющей доступ к сетевому ресурсу //domain.com/dfs/shared, и проверяем, что он был успешно подключен

Добавить комментарий