NextCloud + MariaDB + ElasticSearch + Redis + DocumentServer + LDAP

Debian 12

В этой инструкции запускаю следующий стек:

  • NextCloud - latest
  • MariaDB - 11.1.2
  • ElasticSearch - 7.17.13
  • Redis - 7.2
  • DocumentServer Unlimited - 7.5.0

При необходимости меняем теги на нужные и монтируем хранилища для MariaDB и NextCloud.

Предполагается, что у Вас уже зарегистрированы домены nextcloud.example.ru и nextcloud-ds.example.ru, или какие вы себе подобрали )

Также предполагается наличие настроенного реверсивного прокси-сервера для доступа по https (пример конфигурации для NginX приведу ниже)

Настройки NginX reverse proxy

Домен 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;
Установка docker & docker-compose

Ставлю докер:

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
docker-compose.yaml

После перезагрузки продолжим.

Перед запуском меняем следующие параметры (остальные на Ваше усмотрение):

  • MYSQL_ROOT_PASSWORD - пароль рута от БД
  • MYSQL_PASSWORD - пароль пользователя nextcloud
  • NEXTCLOUD_ADMIN_USER - имя администратора NextCloud
  • NEXTCLOUD_ADMIN_PASSWORD - пароль администратора NextCloud
  • REDIS_HOST_PASSWORD и в строке command: redis-server --requirepass - пароль доступа к серверу Redis
  • JWT_SECRET и JWT_HEADER - реквизиты доступа к серверу документов
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
NextCloud

Далее идём по адресу 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 и заполняем по аналогии:

Проверяем возможность редактирования документов.

Elastic

В зависимости от кол-ва данных индексирование может выполняться очень долго.

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 по образцу:

Проводить или нет поиск по содержимому файла решайте сами. У меня все галки проставлены.

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

Устанавливаем приложение 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)

Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.