Устанавливаем 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, и проверяем, что он был успешно подключен

У этой записи 10 комментариев

  1. Влад

    Привет, а какой адрес базы данных указывать при настройке nextcloud?

    1. Alexander

      Доброго дня! В качестве имени хоста БД нужно использовать имя сервиса БД, которое указано в файле docker-compose.yml (т.е. «db»)

  2. Дмитрий

    Добрый день.
    сразу при первых установках
    systemctl start docker
    Job for docker.service failed because the control process exited with error code.
    See «systemctl status docker.service» and «journalctl -xe» for details.

    unable to configure the Docker daemon with file /etc/docker/daemon.json: EOF
    Sep 30 12:58:46 nextcloud systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
    Sep 30 12:58:46 nextcloud systemd[1]: docker.service: Failed with result ‘exit-code’.
    Sep 30 12:58:46 nextcloud systemd[1]: Failed to start Docker Application Container Engine.

  3. Дмитрий

    Error while trying to create admin user: Failed to connect to the database: An exception occurred in driver: SQLSTATE[HY000] [2002] No route to host

    1. Alexander

      Доброго дня! Ошибка появляется при инициализации NextCloud при первом входе в веб-интерфейс? Какое имя хоста БД указываете?

  4. Дмитрий

    Доброго, пробовал и db и mysql и localhost и порт тоже указывал который nextcoud рекомендует.

    1. Alexander

      хост БД из контейнера приложения пингуется?

  5. Максим

    при первой настройке
    Ошибка:
    Невозможно создать или записать в каталог данных /var/lib/mysql

    зашел в контейнер с базой сделал chmod 777 /var/lib/mysql

    <>
    не помогло
    хост базы указал как в docker-compose.ym — db

    1. Максим

      Разобрался. Правильно оставить папку для данных по умолчанию /var/www/html/data

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