Устанавливаем Nextcloud на платформе Docker, настраиваем обратный прокси для HTTPS-доступа, выполняем интеграцию с Active Directory, подключаем SMB-ресурсы
Замечание: после копирования файлов в контейнеры необходимо проверять права доступа к ним, а также их владельцев
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, и проверяем, что он был успешно подключен
Привет, а какой адрес базы данных указывать при настройке nextcloud?
Доброго дня! В качестве имени хоста БД нужно использовать имя сервиса БД, которое указано в файле docker-compose.yml (т.е. "db")
Добрый день.
сразу при первых установках
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.
Ступил !!!
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
Доброго дня! Ошибка появляется при инициализации NextCloud при первом входе в веб-интерфейс? Какое имя хоста БД указываете?
Доброго, пробовал и db и mysql и localhost и порт тоже указывал который nextcoud рекомендует.
хост БД из контейнера приложения пингуется?
при первой настройке
Ошибка:
Невозможно создать или записать в каталог данных /var/lib/mysql
зашел в контейнер с базой сделал chmod 777 /var/lib/mysql
<>
не помогло
хост базы указал как в docker-compose.ym - db
Разобрался. Правильно оставить папку для данных по умолчанию /var/www/html/data