前言
在 K3s 集群中,似乎并没有很好的方法对通用的大段配置进行解耦。
因此换条路走:依赖外部的 Seafile 文件系统进行通用配置文件的保存,并在容器重启时自动下载最新的配置文件,借此实现解耦。
Seafile提供全面的网盘功能,用户可以在Seafile中存储、管理和共享文件。
- 支持全平台客户端,包括 Windows、Mac、Linux、iOS、Android 等。
- ⭐ 支持多人协同在线编辑、文档编辑锁定。
- ⭐ 权限管理。
- 版本控制。
- 事件通知。
- ⭐ 支持通过 API 下载文件。
方案概述
- 安装 Docker 环境
- 确定容器运行参数
- 启动容器
- 证书申请、Nginx 配置等
- 生成带密码保护的共享链接
操作步骤
一、安装 Docker 环境
参考:Ubuntu 20.04 从官方源安装最新的 Docker
二、确定容器运行参数
官方只提供了使用 docker-compose.yml 启动的文档:用 Docker 部署 Seafile 服务
看了下最近的更新日志升级到 11.0.x,弃用了 SQLite 数据库支持,这使得外部的 MySQL 数据库成了必须,同时 Seafile 还依赖 Memcached 缓存系统。
那就没有必要再折腾命令启动了,直接用官方的 docker-compose.yml 吧:11.0/docker-compose.yml
MySQL数据库和Memcached并未暴露到外部,仅Seafile容器的 80 和 443 端口需要做映射供外部访问。
services:
db:
image: mariadb:10.11
container_name: seafile-mysql
environment:
# MySQL 数据库密码
- MYSQL_ROOT_PASSWORD=db_dev # Required, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
# MySQL 数据持久化
- /opt/seafile-mysql/db:/var/lib/mysql # Required, specifies the path to MySQL data persistent store.
networks:
- seafile-net
memcached:
image: memcached:1.6.18
container_name: seafile-memcached
entrypoint: memcached -m 256
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:11.0-latest
container_name: seafile
ports:
# 端口映射
- "80:80"
# - "443:443" # If https is enabled, cancel the comment.
volumes:
# Seafile 数据持久化
- /opt/seafile-data:/shared # Required, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
# 之前设置的 MySQL 数据库密码
- DB_ROOT_PASSWD=db_dev # Required, the value should be root's password of MySQL service.
- TIME_ZONE=Etc/UTC # Optional, default is UTC. Should be uncomment and set to your local time zone.
# Seafile 管理员登录邮箱
- SEAFILE_ADMIN_EMAIL=me@example.com # Specifies Seafile admin user, default is 'me@example.com'.
# Seafile 管理员登录密码
- SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'.
# 不配置 HTTPS,之后用 acme.sh 申请证书并用 Nginx 反代
- SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not.
- SEAFILE_SERVER_HOSTNAME=docs.seafile.com # Specifies your host name if https is enabled.
depends_on:
- db
- memcached
networks:
- seafile-net
networks:
seafile-net:
三、启动容器
我修改完的 docker-compose.yml:
services:
db:
image: mariadb:10.11
container_name: seafile-mysql
environment:
# MySQL 数据库密码
- MYSQL_ROOT_PASSWORD=BZyXMJCF3EbxVt2a9czR
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
# MySQL 数据持久化
- /rab/docker/seafile_mysql/data:/var/lib/mysql
networks:
- seafile-net
memcached:
image: memcached:1.6.18
container_name: seafile-memcached
entrypoint: memcached -m 256
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:11.0-latest
container_name: seafile
ports:
# 端口映射
- "11080:80"
volumes:
# Seafile 数据持久化
- /rab/docker/seafile/data:/shared
environment:
- DB_HOST=db
# 之前设置的 MySQL 数据库密码
- DB_ROOT_PASSWD=BZyXMJCF3EbxVt2a9czR
- TIME_ZONE=Asia/Shanghai
# Seafile 管理员登录邮箱
- SEAFILE_ADMIN_EMAIL=admin@ceshiku.cn
# Seafile 管理员登录密码
- SEAFILE_ADMIN_PASSWORD=nDD3CaMuT9Ay17K62cf4
# 不配置 HTTPS,之后用 acme.sh 申请证书并用 Nginx 反代
- SEAFILE_SERVER_LETSENCRYPT=false
# Seafile 域名
- SEAFILE_SERVER_HOSTNAME=seafile.ceshiku.cn
depends_on:
- db
- memcached
networks:
- seafile-net
networks:
seafile-net:
创建下数据持久化目录:
mkdir -vp /rab/docker/seafile_mysql/data
mkdir -vp /rab/docker/seafile/data
启动服务:
docker compose up -d
之后访问映射的端口看下:

四、证书申请、Nginx 配置等
参考:四、4. 安装最新的 Nginx
配置完 Nginx 重启后 HTTPS 应该就生效了:

五、生成带密码保护的共享链接



各种意外情况
一、Forbidden (403) CSRF verification failed. Request aborted.
如果你和我一样曾出现了下面的错误:
Forbidden (403)
CSRF verification failed. Request aborted.

那么需要进入到 Docker 容器中,修改下 /opt/seafile/conf/seahub_settings.py 文件:
# 进入容器
docker exec -it seafile /bin/bash
在容器中修改配置文件:
# 域名修改为你的
echo "CSRF_TRUSTED_ORIGINS = ['https://seafile.ceshiku.cn']" >> /opt/seafile/conf/seahub_settings.py
# 退出容器
exit
之后重启容器:
docker restart seafile
即可解决问题。
二、上传或预览失败
上传显示网络错误:

或者语言一直处于加载状态。
需要将 系统设置 中 设置 的 SERVICE_URL 和 FILE_SERVER_ROOT 带上 HTTPS:

之后再上传就好了:

预览:
