由于以前部署的 Seafile 的宿主机年久失修,Seafile 也停留在 7.0.x 版本,因此在这次切换到托管在 MyLoc 的服务器以后,决定完全迁移重建,下面是过程的记录。
Contents
备份数据
由于我使用 Seafile 后端是 S3 OSS,因此需要备份的只有 Seafile 数据库,配置文件。 S3 OSS 部分直接使用 Rclone 同步到 MyLoc 的 MINIO 中。
Seafile的配置文件均位于 seafile/conf
中,包含 ccnet.conf
,gunicorn.conf.py
, seafdav.conf
,seafevents.conf
,seafile.conf
,seahub_settings.py
。这些文件包含了原始的数据库配置信息,稍后需要根据情况进行修改。
迁移到 Docker
初始化 Docker 环境
由于 Seafile Pro 7.0.x 的依赖是 4 年前的,Python依赖已经 EOL,因此我选择将数据全部迁移到 Docker 环境,并依次升级。首先是将非 Docker 的配置和数据迁移到 Docker 中。为此我们需要与原始环境相同版本的 Seafile Docker,幸运的是 Seafile Pro 的 Regisrty 提供从 7.0 开始的各种镜像。运行如下指令即可获取 Docker Regisrty 全部可用的版本号:
~# curl -u seafile:zjkmid6rQibdZ=uJMuWS -X GET https://docker.seadrive.org/v2/seafileltd/seafile-pro-mc/tags/list
得到如下列表:
{ "name": "seafileltd/seafile-pro-mc", "tags": [ "10.0-latest", "10.0.10", "10.0.10-arm", "10.0.11", "10.0.11-arm", "10.0.12", "10.0.12-arm", "10.0.13", "10.0.13-arm", "10.0.14", "10.0.14-arm", "10.0.15", "10.0.15-arm", "10.0.16", "10.0.16-arm", "10.0.4", "10.0.5", "10.0.6", "10.0.7", "10.0.8", "10.0.9", "10.0.9-arm", "11.0-latest", "11.0.2-testing", "11.0.4", "11.0.4-arm", "11.0.5", "11.0.5-arm", "11.0.6", "11.0.6-arm", "11.0.7", "11.0.7-arm", "11.0.8", "11.0.8-arm", "11.0.9", "11.0.9-arm", "7.0.13", "7.0.7", "7.1.14", "7.1.17", "7.1.22", "8.0.10", "8.0.11", "8.0.12", "8.0.14", "8.0.16", "8.0.17", "9.0.10", "9.0.11", "9.0.12", "9.0.13", "9.0.14", "9.0.15", "9.0.16", "9.0.4", "9.0.5", "9.0.6", "9.0.7", "9.0.8", "9.0.9", "latest" ] }
那么,导入数据就从 7.0.13 版本开始。官方提供了迁移指南,但是为了不在宿主系统安装额外的数据库,方便维护,因此我依据官方提供的 docker-compose.yml
将服务全部转移到 Docker 环境中。
在开始之前需要登录 Docker Regisrty:
~# docker login docker.seadrive.org
下载 docker-compose.yml
样例:
mkdir /opt/seafile cd /opt/seafile # Seafile PE 7.1 and 8.0 wget -O "docker-compose.yml" "https://manual.seafile.com/docker/docker-compose/pro/7.1_8.0/docker-compose.yml"
修改配置文件,配置 MariaDB 的 ROOT 密码,Seafile 的默认用户等。随后为数据持久化创建所需文件夹:
~# mkdir /opt/seafile-data ~# mkdir /opt/seafile-mysql ~# mkdir -p /opt/seafile-elasticsearch/data ~# chmod 777 -R /opt/seafile-elasticsearch/data
随后运行一次 Docker,生成相应的配置文件,同时可以直接访问80端口确认服务是否运行正常。确认功能正常后,即可停止 Docker:
~# cd /opt/seafile-data ~# docker compose up -d ~# docker compose down # Stop after verified
导入数据库
由于前一步生成的数据库在后续步骤中不会被用到,因此可以通过删除持久化数据库文件 rm -rf /opt/seafile-mysql/*
或者 DROP 数据表实现。仅启动 MySQL:
~# docker compose up -d db
根据在 docker-compose.yml
中预设的 Root 密码登录,并导入备份的数据库:
~# docker exec -i seafile-mysql mysql -u root -p$Password < backup.sql
随后登入该数据库,创建数据库用户并赋予权限:
~# docker exec -it seafile-mysql mysql -u root -p # Login SQL to modify database MariaDB [(none)]> CREATE USER 'seafile'@'%.%.%.%' IDENTIFIED BY 'your_password'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON `ccnet`.* TO 'seafile'@'%.%.%.%'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON `seafile-db`.* TO 'seafile'@'%.%.%.%'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON `seahub-db`.* TO 'seafile'@'%.%.%.%'; MariaDB [(none)]> FLUSH PRIVILEGES;
修改完成后使用 seafile 用户登录检查数据库,确保能够正常连接。
修改配置文件
完成数据库导入后即可修改 Seafile 的配置文件适配该数据库内容。需要修改 ccnet.conf
, seafevents.conf
, seafile.conf
, seahub_settings.py
,只需要修改数据库的名称,用户名,密码即可。在我的配置中,还有 S3 OSS 的 backend 以及 memcached 需要依据新的环境修改配置。通常在修改配置文件,使之与数据库配置对应以后即可正常运行。
若环境中 S3 使用的是自签证书,则还需要修改配置文件,添加自签 CA 证书。比较简单的方式是在宿主系统中添加 CA,使用 CURL 等工具确认已加入信任后,将整个 /etc/ssl/certs
以只读方式挂载到 seafile 服务的容器中,即修改 volumes 挂载:
volumes: - /opt/seafile-data:/shared # Required, specifies the path to Seafile data persistent store. - /etc/ssl/certs:/etc/ssl/certs:ro # Server Certs
随后启动 Docker:
~# docker compose up -d[/bash]
此时迁移工作已经完成,通常可以通过浏览器访问 Seafile 文件。如果需要求改反向代理,也可以直接修改 /opt/seafile-data/nginx/conf/seafile.nginx.conf
以适配环境。
升级 Seafile
这个步骤中 Docker 的好处会更为明显,在修改 Docker 镜像版本,适配 compose 配置以后,即可升级 Seafile 版本。升级路径可以查看官方文档。
根据说明内容,依次将版本号升级为:7.0->7.1->8.0->9.0->10.0->11.0
只需要使用每个 Major 版本的最后一个 patch release 即可。
其中 7.0→8.0 之间无需修改 docker-compose.yml
,只要升级完成能够访问 Seafile 网页即可视为完成升级。
在 8.0→9.0 的升级中,需要升级依赖:
- mariadb 的版本升级到 10.6,添加环境变量
MARIADB_AUTO_UPGRADE=1
; - memcached 升级到 1.6.18;
- elasticsearch 切换到官方镜像 7.16.2;
在 9.0→10.0 的升级中需要升级依赖:
- mariadb 的版本升级到 10.11;
- elasticsearch 依次升级为 7.17.5 和 8.6.2,并添加环境变量
"xpack.security.enabled=false"
,若直接升级 8.6.2 则会遇到“log.level”:“ERROR”, “message”:“fatal exception while booting Elasticsearch”, “ecs.version”: “1.2.0”,“service.name”:“ES_ECS” …
升级到最新的 v11 无需修改其他配置。
参考内容
https://manual.seafile.com/docker/non_docker_to_docker/
https://manual.seafile.com/upgrade/upgrade_docker/
https://manual.seafile.com/docker/pro-edition/deploy_seafile_pro_with_docker/