Найти в Дзене

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

В 10-й версии Seafile появился новый сервер уведомлений, который через вебсокеты моментально сообщает Seafile диску или клиенту об изменениях на сервере. При этом: В Seafile 12 ситуация несколько изменилась. Сам Seafile ещё поддерживает бинарную версию (не в докере), а сервер уведомлений теперь работает только в виде контейнера. https://manual.seafile.com/12.0/extension/notification-server/ В настоящее время обновления статуса файлов и библиотек на клиенте и в веб-интерфейсе основаны на опросе сервера. Из-за задержек при опросе последние изменения не могут отображаться на клиенте в реальном времени. Клиенту необходимо периодически обновлять информацию об изменениях в библиотеках, статусе блокировок файлов, правах доступа к подкаталогам и другие данные, что создает дополнительную нагрузку на сервер. Когда каталог открывается в веб-интерфейсе, статус блокировки файлов не может обновляться в реальном времени, и для этого требуется обновить страницу. Сервер уведомлений использует протокол
Оглавление

В 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
-2

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

https://internet-lab.ru/seafile_10_to_12

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

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

-3

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
-4

Проверим:

docker ps
netstat -plntu | grep 8083
-5

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

-6

В логах:

[INFO] notification server started

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

curl http://localhost:8083/ping
-7

Успешно.

Настроим конфиг 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
-8

Успешно.

Перезагружаю всё и в логах своего клиента 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

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

Источник:

Seafile 12 — сервер уведомлений | internet-lab.ru

Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.