ZITADEL的Docker私有化部署

如何简单地部署ZITADEL身份验证服务

起因

写这篇教程的原因是,想要在Docker部署一个用于SSO的IDP,但是始终没有找到适合的项目。Auth0似乎没法私有化部署;Logto私有化部署教程乱七八糟,并且无论用任何方式部署镜像连接数据库都报错;Casdoor的界面实在是太繁琐,看的我头疼。于是,我就想试一试ZITADEL。

但我没有想到的是,ZITADEL的文档写的比Logto还烂,具体可以去看我2024/12/7的瞬间,以至于我都怀疑是不是开发商认为把文档写的烂一些就可以使用户被迫购买他们的SaaS服务。既然官方文档不适合人类看,那我就写一个适合小白看的部署文档。

ZITADEL是什么?

来自ChatGPT:

ZITADEL 是一个专注于简化身份验证基础设施的平台,它提供安全的身份验证管理服务,支持自定义和可编程工作流程。ZITADEL 通过易于使用的API和现代认证方法来帮助开发者和企业快速集成安全的身份验证解决方案到他们的应用程序中。

ZITADEL 的特点包括但不限于:

- 提供OAuth2.0, OpenID Connect (OIDC) 和其他标准协议的支持。

- 支持多种认证方式,如密码、多因素认证(MFA)、单点登录(SSO)等。

- 允许用户管理和自定义用户界面,以便更好地适应品牌需求。

- 提供细粒度的授权管理,使得应用可以基于角色或权限进行访问控制。

- 支持API密钥管理,便于开发者安全地访问后端服务。

- 集成幂简,即插即用的特性,减少了开发时间和成本。

ZITADEL 可以被各种规模的企业使用,从初创公司到大型企业,用于保护Web应用、移动应用和其他类型的数字产品。此外,对于需要在多个项目间共享身份验证逻辑的团队来说,ZITADEL 也是一个理想的解决方案,因为它消除了为每个项目单独开发身份验证系统的必要性。

怎么在Docker中部署?

创建数据库

首先,你需要在PostgreSQL16中新建一个数据库。

这里用1panel可以很方便地可视化创建一个:

2024-12-07-wvaahddr.png

拉取镜像

docker pull ghcr.io/zitadel/zitadel:latest

或者,我更建议使用1panle这样的可视化面板拉取。

2024-12-07-rvhkmzlz.png

创建容器

docker run \
  --name zitadel \
  --network db \
  -p 8080:8080 \
  -e ZITADEL_PORT=8080 \
  -e ZITADEL_DATABASE_POSTGRES_HOST=<db_host> \
  -e ZITADEL_DATABASE_POSTGRES_PORT=5432 \
  -e ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel \
  -e ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel \
  -e ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=<your_password> \
  -e ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable \
  -e ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=<your_username> \
  -e ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=<your_password> \
  -e ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable \
  -e ZITADEL_EXTERNALSECURE=true \
  -e ZITADEL_EXTERNALPORT=443 \
  -e ZITADEL_TLS_ENABLED=false \
  -e ZITADEL_EXTERNALDOMAIN=<your.domain> \
  -e ZITADEL_LOGSTORE_ACCESS_STDOUT_ENABLED=true \
  -e ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORDCHANGEREQUIRED=false \
  --restart always \
  ghcr.io/zitadel/zitadel:latest \
  start-from-init \
  --masterkey MasterkeyNeedsToHave32Characters \
  --tlsMode external

请注意,请根据实际情况自行修改上述部署命令中的环境变量参数。

或者,我更建议使用1panel进行可视化部署容器。

  • 名称:zitadel

  • 镜像:刚刚拉取的镜像

  • 端口:8080:8080
    请注意:服务器与容器端口必须相同。若映射端口需要修改则环境变量中容器服务端口也需要修改为相同值。

  • 网络:请选择与数据库容器相同的网络。若数据库安装自1panel应用商店,则为1panel-network

  • Command:'start-from-init' '--masterkey' 'MasterkeyNeedsToHave32Characters' '--tlsMode' 'external'

  • 一直重启

  • 环境变量如下(请根据实际情况修改,复制粘贴请删除注释):

ZITADEL_PORT=8080 //容器服务端口,默认8080
ZITADEL_DATABASE_POSTGRES_HOST=<db_host> //数据库地址
ZITADEL_DATABASE_POSTGRES_PORT=5432 //数据库端口
ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel //数据库名称
ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel //数据库用户名
ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=<your_password> //数据库密码
ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable
ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=<your_username> //数据库管理用户名
ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=<your_password> //数据库管理密码
ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable
ZITADEL_EXTERNALSECURE=true
ZITADEL_EXTERNALPORT=443
ZITADEL_TLS_ENABLED=false
ZITADEL_EXTERNALDOMAIN=<your_domain> //对外访问域名
ZITADEL_LOGSTORE_ACCESS_STDOUT_ENABLED=true
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORDCHANGEREQUIRED=false

部署后查看日志,出现下图字样即为部署成功。

2024-12-07-kpbsvkrh.png

配置反代

这里针对1panel面板环境及OpenResty,其他面板同理,Nginx同理。

  1. 首先创建一个反向代理类型的网站,根据实际情况配置好域名和代理地址。

  2. 申请并配置好域名的证书,启用HTTPS。

  3. 最关键的一步。进入网站配置,编辑配置文件。
    删除掉这一行include /www/sites/<your_domain>/proxy/*.conf; (其中<your_domain> 为你的网站域名)
    然后添加以下这段(记得删注释),保存并重载。

    location ^~ / {
        grpc_pass grpc://127.0.0.1:8080; //若上面修改了端口这里需要修改
        grpc_set_header Host $host;
        grpc_set_header X-Real-IP $remote_addr;
        grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        grpc_set_header X-Forwarded-Host $server_name;
        grpc_set_header X-Forwarded-Proto https;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;  
        add_header X-Cache $upstream_cache_status; 
        add_header Cache-Control no-cache; 
        proxy_ssl_server_name off; 
        proxy_ssl_name $proxy_host; 
        add_header Strict-Transport-Security "max-age=31536000";
    }

部署完成

访问你设置的域名,检查是否能够加载出ZITADEL登陆页面。

使用默认管理员用户名密码登录,检查是否能够正常将进入管理页面。

  • username: zitadel-admin@zitadel.<your_domain> <your_domain>为你的域名)

  • password: Password1!

参考资料

ZITADEL官网:

https://zitadel.com/

ZITADEL文档:

https://zitadel.com/docs/self-hosting/deploy/compose