Seafile 是一款开源的企业云盘,注重可靠性和性能,支持全平台客户端。Seafile 内置协同文档 SeaDoc ,让协作撰写、管理和发布文档更便捷。
Authentik 是一个开源的身份管理和访问管理(IAM)平台,旨在帮助企业和开发者简化和安全地管理用户身份和访问控制。
在本教程中,我将讲解如何搭建 Seafile 和 Authentik 服务端并配置单点登录(SSO)
1. 部署 Seafile
本文章使用以下约定:
/opt/seafile-data是 Seafile 的目录,如果您将 Seafile 放在不同的目录中,请相应地调整所有路径。
Seafile 使用两个 Docker 卷来保存其数据库和 Seafile Docker 容器中生成的数据。 卷的主机路径分别是/opt/seafile-mysql和/opt/seafile-data。 不建议更改这些路径。 如果您这样做,请在按照这些说明进行操作时考虑到这一点。
Seafile 和 Nginx 的所有配置和日志文件都存储在 Seafile 容器的卷中。
配置文件
创建一个新目录,例如 seafile,复制以下内容,命名为 docker-compose.yml ,然后根据您的实际环境修改该文件。尤其是以下几项重要配置:
- MySQL root 用户的密码:MYSQL_ROOT_PASSWORD和DB_ROOT_PASSWD(默认为db_dev)
- 默认管理员账号:SEAFILE_ADMIN_EMAIL(默认为me@example.com)
- 默认管理员密码:SEAFILE_ADMIN_PASSWORD(默认为asecret)
| 1 | services: | 
启动 Seafile 服务
执行以下命令启动 Seafile 服务
| 1 | docker compose up -d | 
需要等待几分钟,等容器首次启动时的初始化操作完成后,您就可以在浏览器上访问http://<your_server_ip> 来打开 Seafile 主页。

如果 Seafile 登录提示 CSRF verification failed. Request aborted.,则需要在配置文件中添加信任域名,操作方法如下:
首先运行 docker ps 找到 Seafile 服务端容器,通常为 seafileltd/seafile-mc:11.0-latest ,复制前面的 CONTAINER ID,例如:cf8fe5af1f32

然后执行 docker exec -it <CONTAINER_ID> bash 进入容器内部
接着输入 vim /opt/seafile/conf/seahub_settings.py 编辑配置文件
在文件最末尾添加 CSRF_TRUSTED_ORIGINS = ["https://<DOMAIN>"],并将 SERVICE_URL 和 FILE_SERVER_ROOT 修改为自己的域名,如下图

然后保存退出,执行 docker compose restart 重启容器
2. 部署 Authentik
部署前准备
创建一个新目录,例如 authentik,运行以下命令下载配置文件:
| 1 | wget https://goauthentik.io/docker-compose.yml | 
然后运行以下命令生成数据库密码和 Secret Key 并启用错误报告:
| 1 | echo "PG_PASS=$(openssl rand 36 | base64 -w 0)" >> .env | 
配置邮件服务 (可选但推荐配置)
Authentik 会使用它们来通知您有关警报和配置问题。用户也可使用它们发送验证/恢复邮件。
要配置邮件服务,请将以下配置添加到 .env 文件中:
| 1 | SMTP 服务器配置 | 
修改默认端口 (可选)
Authentik 默认监听 9000 和 9443 端口,如需修改请在 .env 文件中添加如下配置:
| 1 | COMPOSE_PORT_HTTP=80 | 
启动 Authentik
| 1 | docker compose pull | 
启动完成后需要在浏览器打开 http://<your_server_ip>:9000/if/flow/initial-setup/ 进行初始化,默认用户名为 akadmin
如果浏览器打开后提示 Not Found 或直接跳转到了登陆页面,则证明服务端没有初始化完成,请等待1-2分钟后再次尝试

3. 配置 Authentik 和 Seafile
配置 Authentik
登录 Authentik,进入管理员后台,在左侧选择 Applications - Applications ,点击中间的 Create with Wizard
Name 填写 Seafile 的名称,Slug 可以随意写,会展现在认证过程中的 URL,然后点击下一步

在 Provider Type 中 选择 SAML (Security Assertion Markup Language),然后下一步
在 New Application 中
- Name:随便写 不影响
- Authentication flow:选 default-authentication-flow 或不选
- Authorization flow:默认有两个可选- default-provider-authorization-explict-consent:明确同意,要求用户手动点击确认登录
- default-provider-authorization-implict-consent:默示同意,如果已登录则直接登录,无需手动确认
 
- ACS URL:https://<DOMAIN>/saml2/acs/
- Issuer: https://<DOMAIN>/saml2/metadata/
- Service Provider Binding:Post
- Signing Certificate:选择默认的 authentik Self-signed Certificate即可,也可以自己签一个传上来

配置完成后点击 Submit,提示 Your application has been saved 即可
点击左侧 Applications - Providers,找到你刚刚添加的 Provider 点进去,在 Related objects - Metadata 点击 Copy Download URL
点击左侧 System - Certificates ,找到默认生成的证书点击下载证书,无需下载私钥

配置 Seafile
运行 docker ps 找到 Seafile 服务端容器,通常为 seafileltd/seafile-mc:11.0-latest ,复制前面的 CONTAINER ID,例如:cf8fe5af1f32
执行 docker exec -it <CONTAINER_ID> bash 进入容器内部
1. 安装 xmlsec1
| 1 | apt update | 
2. 准备证书文件
| 1 | mkdir -p /opt/seafile/seahub-data/certs | 
- 如果没有自签CA:
	openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout sp.key -out sp.crt
- 如果有内网自签CA/已有自签证书:
	将证书上传至 /opt/seafile/seahub-data/certs 并命名为 sp.key 和 sp.crt
将上一步获取到的 Authentik 证书重命名为 idp.crt,上传至该目录
至此,该目录下应该有 sp.key sp.crt idp.crt 三个文件
3. 配置 Seafile
接着输入 vim /opt/seafile/conf/seahub_settings.py 编辑配置文件
如果 Authentik 访问使用的是自签证书还需要信任自签CA,这里不再赘述
添加以下配置,然后重启 Seafile:
| 1 | ENABLE_ADFS_LOGIN = True | 

4. 链接账户
用原账号密码登录 Seafile,点击右上角头像,进入 Settings, 在最下面找到 Social Login - SAML,选择 Connect 即可跳转到 Authentik 进行认证