Перейти к основному содержанию

Seafile 12 — сервер уведомлений

Seafile

В 10-й версии Seafile появился новый сервер уведомлений, который через вебсокеты моментально сообщает Seafile диску или клиенту об изменениях на сервере. При этом:

  • Сокращается время синхронизации изменений с локальными папками.
  • Уменьшается нагрузка на сервер. При 1000+ клиентов это заметно.

В Seafile 12 ситуация несколько изменилась. Сам Seafile ещё поддерживает бинарную версию (не в докере), а сервер уведомлений теперь работает только в виде контейнера.

https://manual.seafile.com/12.0/extension/notification-server/

Обзор сервера уведомлений

В настоящее время обновления статуса файлов и библиотек на клиенте и в веб-интерфейсе основаны на опросе сервера. Из-за задержек при опросе последние изменения не могут отображаться на клиенте в реальном времени. Клиенту необходимо периодически обновлять информацию об изменениях в библиотеках, статусе блокировок файлов, правах доступа к подкаталогам и другие данные, что создает дополнительную нагрузку на сервер.

Когда каталог открывается в веб-интерфейсе, статус блокировки файлов не может обновляться в реальном времени, и для этого требуется обновить страницу.

Сервер уведомлений использует протокол WebSocket и поддерживает двустороннее соединение с клиентом или веб-интерфейсом. Когда происходят описанные выше изменения, seaf-server уведомляет об этом сервер уведомлений. Затем сервер уведомлений может в реальном времени сообщать о изменениях клиенту или веб-интерфейсу. Это не только улучшает оперативность обновлений, но и снижает нагрузку на сервер.

Поддерживаемые типы уведомлений об обновлениях:

  • Библиотека была обновлена.
  • Изменение статуса блокировки файлов в библиотеке.
  • Изменение прав доступа к каталогам в библиотеке.

Установка сервера уведомлений

Нам понадобится Docker и Docker Compose.

Установка Docker в Ubuntu 22.04

Создадим директорию для хранения настроек сервера уведомлений:

cd /opt
mkdir notification-server

Скачаем YML файл:

cd ./notification-server/
wget https://manual.seafile.com/12.0/repo/docker/notification-server.yml
seafile

Нам бы этот файл отредактировать, но лучше внести переменные в уже имеющийся у нас .env файл от Seafile 12.

https://internet-lab.ru/seafile_10_to_12

Напомню что бы там делали.

Создаём файл .env в каталоге conf.

seafile

conf/.env:

TIME_ZONE=UTC
JWT_PRIVATE_KEY=xxx
SEAFILE_SERVER_PROTOCOL=https
SEAFILE_SERVER_HOSTNAME=seafile.example.com
SEAFILE_MYSQL_DB_HOST=db # your MySQL host
SEAFILE_MYSQL_DB_PORT=3306
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=<your MySQL password>
SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db

Указываем собственные настройки согласно описанию изменений конфигурации выше.

JWT_PRIVATE_KEY — случайная строка длиной не менее 32 символов, может быть сгенерирована с помощью:

pwgen -s 40 1

Или так:

openssl rand -base64 32

Добавляем в .env файл переменные сервера уведомлений:

# Notification server settings
NOTIFICATION_SERVER_IMAGE=seafileltd/notification-server:12.0-latest
NOTIFICATION_SERVER_VOLUME=/opt/notification-data
NOTIFICATION_SERVER_LOG_LEVEL=info
SEAFILE_LOG_TO_STDOUT=false

Добавляем рабочие папки:

mkdir /opt/notification-data
mkdir /opt/notification-data/logs

Редактируем ранее загруженный файл /opt/notification-server/notification-server.yml. В нём много лишнего, получим нечто вроде:

services:
 notification-server:
   image: ${NOTIFICATION_SERVER_IMAGE}
   container_name: notification-server
   restart: always
   volumes:
     - ${NOTIFICATION_SERVER_VOLUME}:/shared
     - ${NOTIFICATION_SERVER_VOLUME}/logs:/shared/logs
   ports:
     - "8083:8083"
   environment:
     - SEAFILE_MYSQL_DB_HOST=${SEAFILE_MYSQL_DB_HOST}
     - SEAFILE_MYSQL_DB_PORT=${SEAFILE_MYSQL_DB_PORT}
     - SEAFILE_MYSQL_DB_USER=${SEAFILE_MYSQL_DB_USER}
     - SEAFILE_MYSQL_DB_PASSWORD=${SEAFILE_MYSQL_DB_PASSWORD}
     - SEAFILE_MYSQL_DB_CCNET_DB_NAME=${SEAFILE_MYSQL_DB_CCNET_DB_NAME}
     - SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME}
     - JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY}
     - SEAFILE_LOG_TO_STDOUT=${SEAFILE_LOG_TO_STDOUT}
     - NOTIFICATION_SERVER_LOG_LEVEL=${NOTIFICATION_SERVER_LOG_LEVEL}
   labels:
     caddy: ${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}
     caddy.@ws.0_header: "Connection *Upgrade*"
     caddy.@ws.1_header: "Upgrade websocket"
     caddy.0_reverse_proxy: "@ws {{upstreams 8083}}"
     caddy.1_handle_path: "/notification*"
     caddy.1_handle_path.0_rewrite: "* {uri}"
     caddy.1_handle_path.1_reverse_proxy: "{{upstreams 8083}}"
   networks:
     - seafile-net
networks:
 seafile-net:
   name: seafile-net

Вижу хардкод "8083", но это к разработчикам.

В seafile.conf добавляем, если ранее не добавляли:

[notification]
enabled = true
# the listen IP of notification server. (Do not modify the host when using Nginx or Apache, as Nginx or Apache will proxy the requests to this address)
host = 127.0.0.1
# the port of notification server
port = 8083
# the log level of notification server
log_level = info
# jwt_private_key is used to generate jwt token and authenticate seafile server
jwt_private_key = M@O8VWUb81YvmtWLHGB2I_V7di5-@0p(MF*GrE!sIws23F

Здесь jwt_private_key тот же, что и в .env. По некоторым данным host = 0.0.0.0 может исправить часть проблем, этот момент я ещё исследую.

Запустим контейнер:

docker compose -f notification-server.yml --env-file /opt/conf/.env up -d
seafile

Проверим:

docker ps
netstat -plntu | grep 8083
seafile

Что-то стартануло.

seafile

В логах:

[INFO] notification server started

Попробуем пингануть:

curl http://localhost:8083/ping
seafile

Успешно.

Настроим конфиг Nginx. Ранее я настраивал его уже, но проверим.

server {
   ...
   location /notification/ping {
       proxy_pass http://127.0.0.1:8083/ping;
       access_log      /var/log/nginx/notification.access.log seafileformat;
       error_log       /var/log/nginx/notification.error.log;
   }
   location /notification {
       proxy_pass http://127.0.0.1:8083/;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       access_log      /var/log/nginx/notification.access.log seafileformat;
       error_log       /var/log/nginx/notification.error.log;
   }
   ...
}

Если у нас Apache, до настроек seahub:

ProxyPass /notification/ping  http://127.0.0.1:8083/ping/
ProxyPassReverse /notification/ping  http://127.0.0.1:8083/ping/

ProxyPass /notification  ws://127.0.0.1:8083/
ProxyPassReverse /notification ws://127.0.0.1:8083/

Проверим снаружи:

https://{server}/notification/ping
seafile

Успешно.

Перезагружаю всё и в логах своего клиента SeaDrive вижу:

Notification server is enabled on the remote server https://мой_сервер

Вот только клиент такое писал и при отсутствии сервера уведомлений, достаточно было настройки nginx. И это не позволяет нормально продиагностировать то, что уведомлений нормально работают. Но загруженные через web и клиент файлы моментально отобразились на всех клиентах. Ещё, как выше было сказано, я указал в seafile.conf другой host:

[notification]
host = 0.0.0.0

Применил этот вариант согласно:

https://forum.seafile.com/t/notification-server-used-by-clients/18149/26

Говорят, тогда в контейнере начинает слушаться правильный порт.

Ещё не забываем вебсокеты активировать на прокси, если он есть.

seаfile

Служба notification-server

Для контроля состояния и автозапуска создадим службу.

vim /etc/systemd/system/seafile-notification.service

Внутри:

[Unit]
Description=Seafile Notification Server
Requires=docker.service
After=docker.service network.target
Wants=seafile.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/notification-server
EnvironmentFile=/opt/conf/.env
ExecStart=/usr/bin/docker compose -f notification-server.yml --env-file /opt/conf/.env up -d
ExecStop=/usr/bin/docker compose -f notification-server.yml --env-file /opt/conf/.env down
ExecReload=/usr/bin/docker compose -f notification-server.yml --env-file /opt/conf/.env restart
Restart=on-failure
RestartSec=10
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Проверим:

systemctl daemon-reload
systemctl enable seafile-notification
systemctl start seafile-notification
docker ps
systemctl stop seafile-notification
docker ps
systemctl start seafile-notification
systemctl restart seafile-notification
docker ps
systemctl status seafile-notification
seafile

Теги

 

Похожие материалы