В 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
Нам бы этот файл отредактировать, но лучше внести переменные в уже имеющийся у нас .env файл от Seafile 12.
https://internet-lab.ru/seafile_10_to_12
Напомню что бы там делали.
Создаём файл .env в каталоге conf.
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
Проверим:
docker ps
netstat -plntu | grep 8083
Что-то стартануло.

В логах:
[INFO] notification server started
Попробуем пингануть:
curl http://localhost:8083/ping
Успешно.
Настроим конфиг 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
Успешно.
Перезагружаю всё и в логах своего клиента 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
Говорят, тогда в контейнере начинает слушаться правильный порт.
Ещё не забываем вебсокеты активировать на прокси, если он есть.

Служба 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
