Пришла пора обновить своё домашнее облако Seafile с 10 версии на 11.
Seafile — это личное хранилище для хранения данных в стиле Dropbox. Seafile — замечательный инструмент для создания личного, семейного или корпоративного файлового хранилища. Не очень сложен в установке и настройке.
Исходный стенд:
- Ubuntu 12.04 LTS
- Seafile 10.0.1
Подготовка к обновлению
Прошлый раз с обновлением у меня возникли трудности. Поэтому, сейчас я решил идти по другому пути.
Seafile 9 — переход на Seafile 10
Начал я с операционной системы. Текущая версия, на которой сейчас крутится Seafile: Ubuntu 18.
Я уже ранее устанавливал Seafile 11 с нуля, и делал это на Ubuntu 22.
Установка Seafile 11 на Ubuntu 22
Так что мысль обновить Ubuntu до 22 версии не самая плохая. Есть, правда, подозрение, что после перехода на Ubuntu 22 перестанет работать Seafile 10, проверим.
Обновляем операционную систему. Апгрейдим Ubuntu Server 20.04 до версии 22.04. Апгрейд версии Ubuntu обычно не представляет сложности. Проблем может доставить несовместимость вашего софта с новой ОС. Поэтому, перед апгрейдом нужно подготовиться.
- Если у вас есть возможность сделать бэкап сервера — сделайте бэкап. Проверьте что бэкап восстанавливается.
- Если у вас виртуальная среда — сделайте снапшот сервера, чтобы откатиться обратно в случае сбоя.
- Проведите тестирования вашего ПО на той версии ОС, на которую собираетесь обновляться.
- Убедитесь что на сервере есть доступ в Интернет для загрузки новых пакетов. Или работает прокси.
- Рассчитывайте время, апгрейд может занять несколько часов. Я обновлял 2.5 часа, ещё больше часа потратил на то, чтобы мой софт нормально заработал.
- Ну чего я вас учу, соломки надо подстелить, пивас взять.
У меня всё не так страшно, я буду обновлять домашний сервер, так что обойдусь снапшотом.
Ubuntu Server 20.04 — апгрейд до версии 22.04
Обновление завершено.
Seafile 10, как и ожидалось, перестал работать.
Обновление Seafile 10 до последней версии
Теперь подтянем Seafile с версии 10 до версии 11. Доступна версия Seafile 11.0.12.
Seafile сервер для Linux — 11.0.12
Инструкция по обновлению имеется.
https://manual.seafile.com/upgrade/upgrade_notes_for_11.0.x/
https://manual.seafile.com/upgrade/upgrade/
Не забывайте перед обновлением делать резервные копии. Работаем под рутом.
Если у вас используется LDAP аутентификация, то придётся внести изменения в конфигурацию, читайте подробности в инструкции. У меня LDAP не используется.
Обращаем внимание на то, что SQLite больше не поддерживается.
Чтобы избавиться от проблем с защитой CSRF, добавляем в конфиг seahub_settings.py:
CSRF_TRUSTED_ORIGINS = ["https://<your-domain>"]
Библиотеки стоит обновить.
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools python3-pip libmysqlclient-dev ldap-utils libldap2-dev
sudo apt-get install -y memcached libmemcached-dev
sudo pip3 install --timeout=3600 django==4.2.* future==0.18.* mysqlclient==2.1.* \
pymysql pillow==10.2.* pylibmc captcha==0.5.* markupsafe==2.0.1 jinja2 sqlalchemy==2.0.18 \
psd-tools django-pylibmc django_simple_captcha==0.6.* djangosaml2==1.5.* pysaml2==7.2.* pycryptodome==3.16.* cffi==1.15.1 lxml python-ldap==3.4.3
Останавливаем сервисы:
service seafile stop
service seahub stop
service nginx stop
Работаем под пользователем сервиса.
sudo -u sf -i
cd /opt
Скачиваем и распаковываем новый релиз.
wget https://download.seadrive.org/seafile-server_11.0.12_x86-64.tar.gz
tar -xf seafile-server_11.0.12_x86-64.tar.gz
Переходим в папку релиза, смотрим скрипты обновления:
cd seafile-server-11.0.12/
ls upgrade/
Для обновления Seafile Server до версии 11 нужно использовать скрипт upgrade_10.0_11.0.sh.
cd ./upgrade/
./upgrade_10.0_11.0.sh
И ловим ошибки:
[INFO] You are using MySQL
[INFO] updating seahub 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 `share_uploadlinkshare_expire_date` (`expire_date`)' at line 1")
[WARNING] Failed to execute sql: (1054, "Unknown column 'domain' in 'org_saml_config'")
[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 `dns_txt` varchar(64) NULL' at line 1")
[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 `domain_verified` TINYINT(1) NOT NULL DEFAULT 0' at line 1")
[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 `org_saml_config_domain_verified_398065b9` (`domain_verified`)' at line 1")
[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 `idp_certificate` longtext DEFAULT NULL' at line 1")
[WARNING] Failed to execute sql: (1054, "Unknown column 'domain_verified' in 'where clause'")
[INFO] updating seafevents database...
Done
Я уже сталкивался с такими, проблема в том, что в MySQL нет конструкции 'IF NOT EXISTS'. Индексы будем создавать вручную. И другие правки тоже.
Посмотрим что делает скрипт обновления /upgrade/sql/11.0.0/mysql.
Находим проблемное место, где начались проблемы. Не выполнился скрипт.
ALTER TABLE `share_uploadlinkshare` ADD INDEX IF NOT EXISTS `share_uploadlinkshare_expire_date` (`expire_date`);
Проверим, есть ли индекс share_uploadlinkshare_expire_date в таблице share_uploadlinkshare.
SHOW INDEX FROM share_uploadlinkshare;
Логично что индекса нет. Добавим.
ALTER TABLE share_uploadlinkshare ADD INDEX share_uploadlinkshare_expire_date (expire_date);
SHOW INDEX FROM share_uploadlinkshare;
Продолжаем править баги.
ALTER TABLE `org_saml_config` CHANGE domain domain varchar(255) DEFAULT NULL;
ALTER TABLE `org_saml_config` ADD COLUMN IF NOT EXISTS `dns_txt` varchar(64) NULL;
ALTER TABLE `org_saml_config` ADD COLUMN IF NOT EXISTS `domain_verified` TINYINT(1) NOT NULL DEFAULT 0;
ALTER TABLE `org_saml_config` ADD INDEX IF NOT EXISTS `org_saml_config_domain_verified_398065b9` (`domain_verified`);
ALTER TABLE `org_saml_config` ADD COLUMN IF NOT EXISTS `idp_certificate` longtext DEFAULT NULL;
UPDATE `org_saml_config` SET domain_verified=1 WHERE domain_verified=0;
Тут тоже ничего не работало, правим:
ALTER TABLE `org_saml_config` ADD COLUMN `domain` varchar(255) NULL;
ALTER TABLE `org_saml_config` ADD COLUMN `dns_txt` varchar(64) NULL;
ALTER TABLE `org_saml_config` ADD COLUMN `domain_verified` TINYINT(1) NOT NULL DEFAULT 0;
SHOW INDEX FROM org_saml_config;
ALTER TABLE `org_saml_config` ADD INDEX `org_saml_config_domain_verified_398065b9` (`domain_verified`);
ALTER TABLE `org_saml_config` ADD COLUMN `idp_certificate` longtext DEFAULT NULL;
UPDATE `org_saml_config` SET domain_verified=1 WHERE domain_verified=0;
Перезагружаем сервер.
sudo reboot
Все службы поднялись. Вот только у меня не запустилась служба seafile-fuse. Однако, в логах написано как чинить.
Чиним, вот теперь порядок.