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 进行认证