Пришла пора обновить своё домашнее облако Seafile с 9 версии на 10. Просто так обновить не получилось, сделал откат, почесал тыковку и пошёл более сложным путём.
Seafile — это личное хранилище для хранения данных в стиле Dropbox. Seafile — замечательный инструмент для создания личного, семейного или корпоративного файлового хранилища. Не очень сложен в установке и настройке.
Исходный стенд:
- Ubuntu 18.04 LTS
- Seafile 9.0.9
Подготовка к обновлению
Процесс подготовки подробно описан в статье:
Seafile 9 — подготовка к переходу на версию 10
Оказалось, что Seafile 10 не хочет нормально работать на Ubuntu 18, сначала требуется обновить операционную систему. В комментариях к установке написано:
# Ubuntu 22.04 (almost the same for Ubuntu 20.04 and Debian 11, Debian 10)
Делать нечего, буду обновлять релиз Ubuntu Server 18.04 до версии 20.04. После этого попробую запустить Seafile 9.0.9 на обновлённой Ubuntu 20.04. Апгрейд Ubuntu вынес в отдельную статью.
Ubuntu Server 18.04 — апгрейд до версии 20.04
Итак, версия Ubuntu обновлена до 20.04.6. Естественно, службы Seafile 9.0.9 не запустились. Чтобы оживить Seafile 9 в Ubuntu 20, нужно немного обновить пакеты.
sudo apt-get update
sudo apt-get install -y python3 python3-setuptools python3-pip libmysqlclient-dev
sudo apt-get install -y memcached libmemcached-dev pkg-config
sudo pip3 install --timeout=3600 django==3.2.* pillow==9.3.* pylibmc captcha jinja2 sqlalchemy==1.4.3 \
django-pylibmc django-simple-captcha python3-ldap mysqlclient pycryptodome==3.12.0 cffi==1.14.0 lxml
Обновление Seafile 9 до последней версии
Теперь подтянем Seafile с версии 9.0.9 до версии 9.0.10. Подробности в статье:
Seafile сервер для Linux — 9.0.10
Заодно применятся изменения:
9.0.10 (2022-12-07)
- API со списком пользователей для администратора теперь возвращает last_login и last_access_time
- [fix] Исправлена ошибка при отображении markdown файла в расшаренной ссылке
- [fix] Исправлена ошибка отправки почтового уведомления на неактивного пользователя
- [fix] Исправлена ошибка сбоя сервера при просмотре файла в старом снапшоте
- [fix] Исправлена ошибка HTTP/500 "Internal server error" при использовании не латинских символов в пароле расшаренной ссылки
- [fix] Исправлена ошибка "document convertion failed” при посещении расшаренного документа в предпросмотре
- [fix] Исправлена утечка памяти при включённом кэшировании блоков
- Включено 'zoom in/out by pinch' для мобильных устройств на странице просмотра pdf файла
- [fix] Запрещено создание библиотек с неверным именем в панели администратора
- Улучшена производительность файлового сервера golang
Выполняем обновление, сервис работает.
Обновление Seafile 9 до Seafile 10
Мы плавно подошли к переходу на новую версию. Релиз 10.0.1 содержит исправления предыдущей версии и выводит 10-й релиз из стадии бета. Помимо исправлений появился и новый функционал, весьма полезный.
10.0.1 (2023-04-11)
- Поддержка генерации множественных ссылок на файлы и папки
- [fix] Исправлена ошибка в golang файловом сервере при скачивании zip папки в зашифрованной библиотеке
- [fix] Исправлена ошибка скрипта апгрейда, когда нет конфигурации для Nginx
- Видео проигрыватель теперь поддерживает изменение скорости воспроизведения
- [fix] Исправлены некоторые ошибки в сервере уведомлений
Будем обновлять Seafile Server с версии 9.0.10 до версии 10.0.1. Инструкция по обновлению имеется.
https://manual.seafile.com/upgrade/upgrade_notes_for_10.0.x/
https://manual.seafile.com/upgrade/upgrade/
Не забывайте перед обновлением делать резервные копии. Работаем под рутом.
Основное нововведение в 10-й версии Seafile — это новый сервер уведомлений, который через вебсокеты моментально сообщает Seafile диску или клиенту об изменениях на сервере. При этом:
- Сокращается время синхронизации изменений с локальными папками.
- Уменьшается нагрузка на сервер. При 1000+ клиентов это заметно.
Настроим сервер уведомлений.
https://manual.seafile.com/config/seafile-conf/#notification-server-configuration
Редактируем seafile.conf, добавляем опции.
# jwt_private_key are required.You should generate it manually.
[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, генерируем новый ключ командой:
# generate jwt_private_key
openssl rand -base64 32
Модифицируем web-сервер. Если у нас 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;
}
...
}
И убедитесь что в начале у вас есть настройка:
log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';
Если у нас Apache:
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/
Обновим пакеты, добавим новые.
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools python3-pip libmysqlclient-dev
sudo apt-get install -y memcached libmemcached-dev pkg-config
sudo pip3 install --upgrade pip
sudo pip3 install launchpadlib setuptools-rust
sudo pip3 install --timeout=3600 pillow==9.3.* pylibmc captcha==0.4 jinja2 sqlalchemy==1.4.3 \
django-pylibmc django-simple-captcha==0.5.* python3-ldap pycryptodome==3.16.* cffi==1.15.1 lxml \
future==0.18.* mysqlclient==2.1.* djangosaml2==1.5.* pysaml2==7.2.*
Останавливаем сервисы:
service seafile stop
service seahub stop
service nginx stop
Я ещё и остальные сервисы останавливаю, которые зависят от seafile.
service minidlna stop
service jellyfin stop
service seafile-fuse stop
Работаем под пользователем сервиса.
sudo -u sf -i
cd /opt
Скачиваем и распаковываем новый релиз.
wget https://download.seadrive.org/seafile-server_10.0.1_x86-64.tar.gz
tar -xf seafile-server_10.0.1_x86-64.tar.gz
Переходим в папку релиза, смотрим скрипты обновления:
cd seafile-server-10.0.1/
ls upgrade/
Для обновления Seafile Server с версии 9.0.9 до версии 10.0.1 нужно использовать скрипт upgrade_9.0_10.0.sh.
cd ./upgrade/
./upgrade_9.0_10.0.sh
Лог скрипта обновления:
-------------------------------------------------------------
This script would upgrade your seafile server from 9.0 to 10.0
Press [ENTER] to contiune
-------------------------------------------------------------
Updating seafile/seahub database ...
[INFO] You are using MySQL
[INFO] updating ccnet database...
[INFO] updating seafile database...
[WARNING] Failed to execute sql: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS `repo_id` (`repo_id`)' at line 1")
[INFO] updating seahub database...
Done
migrating avatars ...
Done
updating /opt/seafile-server-latest symbolic link to /opt/seafile-server-10.0.1 ...
-----------------------------------------------------------------
Upgraded your seafile server successfully.
-----------------------------------------------------------------
И ловим ошибку:
[WARNING] Failed to execute sql: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS `repo_id` (`repo_id`)' at line 1")
https://forum.seafile.com/t/mysql-warning-on-upgrade-9-to-10/17871/3
Если поковырять файлик seafile.sql, то ошибка при создании индекса:
ALTER TABLE `WebUploadTempFiles` ADD INDEX IF NOT EXISTS `repo_id` (`repo_id`);
MySQL не поддерживает конструкцию IF NOT EXISTS для индексов. Вероятно, MariaDB это умеет. А индекс нам нужен, наверное, раз разработчики его хотели создать. Работаем с базой данных вручную:
SHOW INDEX FROM WebUploadTempFiles;
Индекса нет, создадим:
ALTER TABLE WebUploadTempFiles ADD INDEX repo_id (repo_id);
SHOW INDEX FROM WebUploadTempFiles;
Перезагружаем сервер.
sudo reboot
Сервис работает.