В этой инструкции запускаю следующий стек:
При необходимости меняем теги на нужные и монтируем хранилища для MariaDB и NextCloud.
Предполагается, что у Вас уже зарегистрированы домены nextcloud.example.ru и nextcloud-ds.example.ru, или какие вы себе подобрали )
Также предполагается наличие настроенного реверсивного прокси-сервера для доступа по https (пример конфигурации для NginX приведу ниже)
Домен nextcloud.example.ru:
server {
listen [::]:443 ssl;
server_name nextcloud.example.ru;
include ssl/ssl.conf;
client_max_body_size 100M;
location / {
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
proxy_pass http://HOST-IP:8080;
include proxy.conf;
}
}
Домен nextcloud-ds.example.ru - OnlyOffice Document Server:
upstream docservice {
server HOST-IP:8082;
}
map $http_host $this_host {
"" $host;
default $http_host;
}
map $http_x_forwarded_proto $the_scheme {
default $http_x_forwarded_proto;
"" $scheme;
}
map $http_x_forwarded_host $the_host {
default $http_x_forwarded_host;
"" $this_host;
}
map $http_upgrade $proxy_connection {
default upgrade;
"" close;
}
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Forwarded-Host $the_host;
proxy_set_header X-Forwarded-Proto $the_scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
server {
listen [::]:443 ssl http2;
server_name nextcloud-ds.example.ru;
server_tokens off;
include ssl/ssl.conf;
ssl_session_cache builtin:1000 shared:SSL:10m;
add_header Strict-Transport-Security max-age=31536000;
add_header X-Content-Type-Options nosniff;
location / {
proxy_pass http://docservice;
proxy_http_version 1.1;
}
}
proxy.conf:
# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
# Proxy Connection Settings
proxy_buffers 32 4k;
proxy_connect_timeout 240;
proxy_headers_hash_bucket_size 128;
proxy_headers_hash_max_size 1024;
proxy_http_version 1.1;
proxy_read_timeout 240;
proxy_redirect http:// $scheme://;
proxy_send_timeout 240;
# Proxy Cache and Cookie Settings
proxy_cache_bypass $cookie_session;
#proxy_cookie_path / "/; Secure"; # enable at your own risk, may break certain apps
proxy_no_cache $cookie_session;
# Proxy Header Settings
proxy_set_header Connection $connection_upgrade;
proxy_set_header Early-Data $ssl_early_data;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Real-IP $remote_addr;
Ставлю докер:
apt update && apt install -y ca-certificates curl gnupg lsb-release && \
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io
Заблаговременно поправим пару системных параметров для Redis:
echo "net.core.somaxconn=8192" >> /etc/sysctl.conf && echo "vm.overcommit_memory=1" >> /etc/sysctl.conf && reboot now
После перезагрузки продолжим.
Перед запуском меняем следующие параметры (остальные на Ваше усмотрение):
mkdir nextcloud && cd nextcloud && nano docker-compose.yaml
version: '3.6'
services:
mariadb:
image: mariadb:11.1.2
container_name: mariadb
command:
--transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- mariadb:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=2c%%6qT4XmC9
- MYSQL_PASSWORD=2c%%6qT4XmC9
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
healthcheck:
test: ["CMD", "mysqladmin", "ping", "--silent"]
networks:
ncnet:
ipv4_address: 172.18.5.22
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: always
ports:
- 8080:80
volumes:
- nextcloud:/var/www/html
- config:/var/www/html/config
- data:/var/www/html/data
environment:
- NEXTCLOUD_ADMIN_USER=admin
- NEXTCLOUD_ADMIN_PASSWORD=admin_password
- MYSQL_HOST=172.18.5.22
- REDIS_HOST=172.18.5.24
- REDIS_HOST_PORT=6379
- REDIS_HOST_PASSWORD=*D##cX88Mcc
- MYSQL_PASSWORD=2c%%6qT4XmC9
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
networks:
ncnet:
ipv4_address: 172.18.5.21
depends_on:
- mariadb
- redis
- elastic
redis:
image: redis:7.2-alpine
restart: always
container_name: redis
command: redis-server --requirepass "*D##cX88Mcc"
volumes:
- /redis/redis_conf:/usr/local/etc/redis/redis.conf
- /redis/redis_data:/data
ports:
- 6379:6379
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 1s
timeout: 3s
retries: 30
networks:
ncnet:
ipv4_address: 172.18.5.24
elastic:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.13-amd64
restart: always
container_name: elastic
volumes:
- elasticsearch:/etc/elasticsearch/
ports:
- 9200:9200
- 9300:9300
environment:
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- discovery.type=single-node
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 30s
retries: 3
networks:
ncnet:
ipv4_address: 172.18.5.23
documentserver:
image: tiotimolin/ds:latest
restart: always
container_name: ds
ports:
- 8082:80
environment:
- JWT_SECRET=BgJdkR54ks9
- JWT_HEADER=AuthorizationJwt
networks:
ncnet:
ipv4_address: 172.18.5.25
networks:
ncnet:
ipam:
driver: default
config:
- subnet: 172.18.5.0/24
name: ncnet
volumes:
mariadb:
nextcloud:
config:
data:
redis_conf:
redis_data:
elasticsearch:
Сохраняем и запускаем:
docker-compose up -d
Далее идём по адресу http://HOST_IP:8080
Вносим изменения в файл /var/lib/docker/volumes/nextcloud_config/_data/config.php:
nano /var/lib/docker/volumes/nextcloud_config/_data/config.php
Добавляем до последней строчки, содержащей );
'trusted_domains' =>
array (
0 => 'HOST_IP',
1 => 'nextcloud.example.ru',
),
'trusted_proxies' =>
array (
0 => 'REVERSE_PROXY_IP',
),
'overwriteprotocol' => 'https',
'allow_local_remote_servers' => 'true',
'defaultapp' => 'files',
'log_rotate_size' => '10485760',
'logtimezone' => 'Europe/Moscow',
'default_phone_region' => 'RU',
'maintenance' => false,
'onlyoffice' =>
array (
'jwt_secret' => 'BgJdkR54ks9',
'jwt_header' => 'AuthorizationJwt',
'verify_peer_off' => true,
),
Заменяем
'overwrite.cli.url' => 'http://localhost',
на
'overwrite.cli.url' => 'http://HOST_IP:8080',
Меняем на свои данные:
HOST_IP - адрес ВМ со стеком
nextcloud.example.ru - Ваш домен/субдомен для NextCloud
REVERSE_PROXY_IP - IP-адрес реверсивного прокси
Europe/Moscow - часовой пояс
http://HOST_IP:8080 - адрес ВМ со стеком
Перезапускаем стек:
docker-compose restart
И наконец переходим по адресу https://nextcloud.example.ru
устанавливаем приложение OnlyOffice.
Далее в ПАРАМЕТРЫ СЕРВЕРА -> OnlyOffice и заполняем по аналогии:
Проверяем возможность редактирования документов.
В зависимости от кол-ва данных индексирование может выполняться очень долго.
docker exec -u www-data nextcloud php -d memory_limit=-1 /var/www/html/occ fulltextsearch:reset
docker exec -u www-data nextcloud php -d memory_limit=-1 /var/www/html/occ fulltextsearch:index
Добавляем в крон индексирование раз в неделю:
nano /etc/crontab
Добавляем строку:
0 22 * * 0 root docker exec -u www-data nextcloud php -d memory_limit=-1 /var/www/html/occ fulltextsearch:index
Ставим приложения по списку:
В настройках полнотекстового поиска в web-интерфейсе NextCloud по образцу:
Проводить или нет поиск по содержимому файла решайте сами. У меня все галки проставлены.
Устанавливаем приложение LDAP user and group backend
Создаём в домене пользователя для облака.
Далее ПАРАМЕТРЫ СЕРВЕРА -> LDAP/AD интеграция
Создал пользователя mctest, домен domain.loc
Заполняем по образцу и жмакаем ОПРЕДЕЛИТЬ ПОРТ.
Затем ОПРЕДЕЛИТЬ БАЗУ ПОИСКА.
На следующей вкладке выбираем классы объектов USER и группы, которым будет предоставлен доступ в облако, аналогично в последней вкладке.
Проверяем возможность авторизации. Имя пользователя при авторизации вводится без указания домена!!!
Очистка предыдущих версий файлов (команда доступна если приложение “Versions” app (files_versions) установлено и доступно):
docker exec -u www-data nextcloud /var/www/html/occ versions:cleanup
Очистка корзины всех пользователей:
docker exec -u www-data nextcloud /var/www/html/occ trashbin:cleanup --all-users
Удаление неиспользуемых докером образов :
docker image prune -a
Если слетают права после обновления и пропадает возможность, создавать/удалять файлы у пользователей:
cd /var/lib/docker/volumes/data/ && chown -R www-data:www-data _data/
Остановка индексирования, сброс и повторное индексирование:
docker exec --user www-data -it nextcloud /bin/bash
php -d memory_limit=-1 /var/www/html/occ fulltextsearch:stop
php -d memory_limit=-1 /var/www/html/occ fulltextsearch:reset
exit
docker exec -u www-data nextcloud php -d memory_limit=-1 /var/www/html/occ fulltextsearch:index
Удалить все контейнеры можно с помощью следующей команды:
docker rm -f $(docker ps -a -q)
Удалить все тома можно с помощью следующей команды:
docker volume rm $(docker volume ls -q)