使用 Docker 搭建 Seafile 私有云流程记录

前言

自之前的那篇静态文章 “Docker 安装 Seafile 私有云记录” 丢失后就一直搁置,这之间因为各种原因在服务器和本地都来回重装了几次,那么今天就简单来聊下这个私有云的搭建流程,也当做个记录了(@一下催更本文的Ying酱/滑稽)

私有云

一般来说,线上网盘用的最多的是百度云盘,不过限速的尿性大家都知道,然后其他比较良心的要不就没得赚开不了几天,要不就用户少直接没了,总之线上网盘市场早就被百度垄断了。那么后续就衍生出了私人 nas 存储系统,市面上常见的 nas 服务商有群晖(synology)威联通等,用户可以购买他们的硬件设备及硬盘后使用他们提供的 nas 软件存储服务,市场上是比较认可的。

另外还有一些比如坚果云,oneDrive、ownCloud、Syncthing、Seafile、Nextcloud 这类云储存服务商,提供付费计划及开发私有部署支持,这里我选的是 Seafile 作为私人网盘来使用。

Seafile

作为一款开源的企业云盘,首先 seafile 提供了各平台客户端(Windows, Mac, Linux, iOS, Android)以便在任意环境中搭建使用,而在云存储服务方面提供了文件实时同步、支持多人协同工作、以及类似微软 onedrive 的挂载盘等特性(更多特性查看官网:Seafile – 开源的企业私有网盘 私有云存储软件 企业维基 知识管理)

ok,切回正题。

搭建 Seafile 环境

在 seafile 官方文档 中,seafile可在 windows(已过时) Linux 环境下部署,建议在 linux 环境下搭建 seafile,但如果你像我一样有在 windows 下搭建 seafile 的需求,那么可以在 windows 下的 WSL(windows subsystem for linux)环境下进行搭建(此环境下需安装 docker desktop 客户端,详见:Windows Docker 安装)。因为我是在 wsl2 中使用 docker 进行搭建的,其他搭建环境请在 seafile 官方文档中查阅。

docker 部署

seafile 分为 社区开源版 及 付费专业版,选择需要的版本后再进行安装。首先安装 docker

代码语言:javascript
复制
# for CentOS
yum -y install docker
# for Ubuntu
apt-get install docker -y

设置开机自动启动

代码语言:javascript
复制
# for CentOS
systemctl start docker
systemctl enable docker

安装 docker-compose 管理依赖

代码语言:javascript
复制
# for CentOS
yum install docker-compose -y
# for Ubuntu
apt-get install docker-compose -y

下载并修改 docker-compose.yml (此处演示 9.0 社区版,其他版本 yml 配置下载在 用Docker部署Seafile.md 文档中查阅)一般情况只需要修改 seafile 中的 ports(seafile服务访问端口)、SEAFILE_ADMIN_EMAIL (默认管理员邮箱)、SEAFILE_ADMIN_PASSWORD (默认管理员密码)即可。

注意:如需搭建专业版,此处需提前注册 seafile 并在用户中心查看密码后通过 docker login docker.seadrive.org 登入 seafile 后使用 docker 选择并拉取最新专业版镜像:docker pull docker.seadrive.org/seafileltd/seafile-pro-mc:latest

代码语言:javascript
复制
version: '2.0'
services:
  db:
    image: mariadb:10.5
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=db_dev  # Requested, set the root's password of MySQL service.
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /opt/seafile-mysql/db:/var/lib/mysql  # Requested, specifies the path to MySQL data persistent store.
    networks:
      - seafile-net

memcached:
image: memcached:1.6
container_name: seafile-memcached
entrypoint: memcached -m 256
networks:
- seafile-net

seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "9527:80" # 自定义 80 访问端口

- "443:443" # If https is enabled, cancel the comment.

volumes:
  - /opt/seafile-data:/shared   # Requested, specifies the path to Seafile data persistent store.
environment:
  - DB_HOST=db
  - DB_ROOT_PASSWD=db_dev  # Requested, the value shuold be root's password of MySQL service.

- TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone.

  - SEAFILE_ADMIN_EMAIL=me@example.com # Specifies Seafile admin user, default is 'me@example.com'.
  - SEAFILE_ADMIN_PASSWORD=asecret     # Specifies Seafile admin password, default is 'asecret'.
  - SEAFILE_SERVER_LETSENCRYPT=false   # Whether use letsencrypt to generate cert.
  - SEAFILE_SERVER_HOSTNAME=seafile.example.com # Specifies your host name.
depends_on:
  - db
  - memcached
networks:
  - seafile-net

networks:
seafile-net:

修改完 docker-compose.yml 配置文件后,将其放入需要安装 seafile 的文件夹路径中(此处为 /opt )后启动 Seafile 服务:

注意 seafile 9.0 专业版 需要手动在宿主机上创建 elasticsearch 的映射路径,并且给 777 权限,否则 elasticsearch 启动会报路径权限问题:mkdir -p /opt/seafile-elasticsearch/data && chmod 777 -R /opt/seafile-elasticsearch/data这个很坑,会导致 seafile 专业版搜索服务自动停止,需要多尝试几次

代码语言:javascript
复制
cd /opt  # 定位 docker-compose.yml 所在路径
docker-compose up -d  # 启动 seafile 服务

此时,在浏览器中访问 localhost(或你的服务器外网域名)+ docker-compose.yml 配置文件中绑定的 80 端口即可访问 seafile 服务(默认管理员邮件及密码均在 docker-compose.yml 中),如果需要以域名方式访问服务,可以使用 nginx 反代()或配置本地路由ddns转发(tplink支持tpddns免费域名)

记得登录后在 系统管理 中设置 SERVICE_URLFILE_SERVER_ROOT 为实际域名路径,否则将影响文件上下载等问题。

到这里如果是搭建在云服务器上就已经搭建完成了,但如果用作本地 nas 存储则还需要在本地路由上将 seafile 配置文件中的端口转发到本机ip内外网端口上(如绑定端口9527,本机ip为192.168.0.108,则在路由上设置如下:

外部端口

内部端口

IP地址

协议类型

9527

9527

192.168.0.108

ALL

另外如需在内网环境下访问时速度最大化,需要路由器支持 端口回流Nat Loopback) 功能,或做内网穿透)另外为防止开关机后本机 ip 变动,还需将本机 ip 与 mac 地址进行绑定(类似tp路由上的 IP与MAC绑定

部署 onlyOffice

搭建完 seafile 服务后,如需使用 office 在线协同编辑功能,需要另外部署 onlyoffice 免费版,以下

代码语言:javascript
复制
docker pull onlyoffice/documentserver  # 使用 docker 拉取 onlyoffice 镜像

安装 onlyoffice

cd /opt
mkdir seafile-onlyoffice
cd seafile-onlyoffice
mkdir log
mkdir data
mkdir lib
mkdir db

初始化 onlyoffice(默认8088端口,可选 -p 8088:443)

docker run -i -t -d -p 8088:80 --name onlyoffice --restart=always -v /opt/seafile-onlyoffice/log:/var/log/onlyoffice -v /opt/seafile-onlyoffice/data:/var/www/onlyoffice/Data -v /opt/seafile-onlyoffice/lib:/var/lib/onlyoffice -v /opt/seafile-onlyoffice/db:/var/lib/postgresql onlyoffice/documentserver

完成之后在浏览器输入 localhost+绑定端口(8088)即可查看其是否正常运行,之后在 /opt/seafile-data/seafile/conf 中编辑 seahub_settings.py 配置文件,在其末尾添加如下代码以启用 onlyoffice(其中需要修改 ONLYOFFICE_APIJS_URL 中的 localhost 为绑定域名)

代码语言:javascript
复制
# Enable Only Office
ENABLE_ONLYOFFICE = True
VERIFY_ONLYOFFICE_CERTIFICATE = False
ONLYOFFICE_APIJS_URL = 'http://localhost:8088/web-apps/apps/api/documents/api.js'
ONLYOFFICE_FILE_EXTENSION = ('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'odt', 'fodt', 'odp', 'fodp', 'ods', 'fods')
ONLYOFFICE_EDIT_FILE_EXTENSION = ('docx', 'pptx', 'xlsx')

完成后 cd /opt 使用 docker-compose restart 命令重启 seafile 服务即可。需要注意的是,其 8088 端口也需在路由器设置端口转发,如下

外部端口

内部端口

IP地址

协议类型

8088

8088

192.168.0.108

ALL

其他事项

基本上配置完成就能满足个人使用了,因为专业版免费用户 3 个,社区开源版则无限制(功能上有些区别,可上官网查看),如果需要开放用户注册,管理员身份登录后在后台设置中勾选 允许用户注册发送激活邮件,发送邮件需在 seahub_settings.py 配置文件中添加如下 smtp 内容(示例为腾讯企业邮箱)

代码语言:javascript
复制
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.exmail.qq.com' # 服务商 host
EMAIL_HOST_USER = 'admin@example.com' # 邮件地址
EMAIL_HOST_PASSWORD = 'smtppassword' # smtp邮件密码
EMAIL_PORT = 465
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER

保存后执行同样执行 docker-compose restart 命令重启 seafile 服务即可生效。

专业版搜索问题

专业版需要设置 elasticsearch 目录的 777 权限,我设置过好几次,有时候不生效,有时候又可以,问题就是导致其搜索服务一直返回错误(开源版则没有这个问题)seafile 论坛基本已经没人了,提了几个问题都没有人回答。

配置默认用户容量大小在 seafile.conf 中配置,其他配置项参考:seafile.conf 配置

代码语言:javascript
复制
[quota]
default = 5

最后附带一些常用的 seahub_settings.py 配置项,其他配置项参考:Seahub 配置(注意修改后执行 docker-compose restart 重启 seafile 生效

代码语言:javascript
复制
# 在线预览的文件大小上限,默认为 30M.
FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024

缩略图

ENABLE_THUMBNAIL = True
THUMBNAIL_IMAGE_SIZE_LIMIT = 300
THUMBNAIL_ROOT = '/opt/seahub-data/thumbnail/thumb/'
THUMBNAIL_SIZE_FOR_ORIGINAL = 1024

Disable Admin Dashboard Controls

ENABLE_SETTINGS_VIA_WEB = False

Enable Admin view any repo but encrypted

ENABLE_SYS_ADMIN_VIEW_REPO = True

垃圾回收

docker gc:docker exec seafile /scripts/gc.sh

代码语言:javascript
复制
[history]
keep_days = 7

[library_trash]
expire_days = 30