繁琐的叭叭
在我过往的工作中,管理和共享 .env 配置的环境变量依靠的是编写 .env.example 和手动相互同步,不同环境区分环境变量依靠的是 vite 的 .env.[mode],当服务部署到线上时,还需要维护 docker 容器的环境变量。随着环境变量和环境增长,需要维护的内容越来越多,在协作时常出现环境变量配置不统一的问题。
在 Java 同事那边看到了 Nacos,也同步评估过携程的 Apollo,看完之后感觉能用平台进行配置管理和热更新真的太方便了。但是这两个都需要使用专门的 Client,适配到业务里成本可观。项目里使用的 dotenv 有 dotenv-valut ,但服务端是不可自托管的。
综上所述,我想要 适配侵入性低 + 区分环境 + 可自托管 的管理和同步环境变量工具。Infisical 满足了我的需求(绝对没有被产品自适应嗷)
What is Infisical?
What is Infisical? - Infisical
Infisical 是一个开源的密钥管理平台,开发者用它来集中管理他们的应用程序配置和密钥,如 API 密钥和数据库凭证,以及管理内部公钥基础设施(PKI)。此外,开发者使用 Infisical 来防止密钥泄露到 git,并安全地在工程师之间共享密钥。 ------ Infisical Introduction
这是我将配置全部导入 Infisical 之后的样子,将配置进行目录分类,对不同环境应用不同的配置。相比于满屏的 .env,体验友好不少。
自托管部署
- docker-compose 部署文档:Docker Compose - Infisical
- 自托管容器配置说明:Configurations - Infisical
自托管部署 Infisical 需要 PostgreSQL + Redis,我的环境里有专门的 pgsql server,再创建一个 Redis 容器就好。docker-compose 部署文档可以参考 ,我写的 docker-compose 也可以供参考。
SMTP 不是必要配置,但是不配置的话无法发送组织的邀请加入邮件和 MFA 验证码。
ini
version: "3"
services:
infisical:
image: infisical/infisical:latest-postgres
restart: always
ports:
- 80:8080
extra_hosts:
- pgsql:host-gateway
environment:
- ENCRYPTION_KEY=
- AUTH_SECRET=
- SITE_URL=
- DB_CONNECTION_URI=postgresql://username:password@host:port/database
- REDIS_URL=redis://redis:6379/0
- SMTP_HOST=
- SMTP_PORT=587
- SMTP_USERNAME=
- SMTP_ADDRESS=
- SMTP_PASSWORD=
depends_on:
- redis
redis:
image: redis:7.0-alpine
restart: always
一点使用的小 Tips
创建账户时,会下载 Infisical Emergency Kit.pdf
,其中的 SECRET KEY
是账户恢复的必要凭据。如果没有好好保存,就不能找回密码了= =
部署完毕之后就是常规的创建组织 -> 创建项目 -> 管理密钥,点选对应环境下的 Explore
按钮可以对选中环境单独配置(在 Explore 中可以直接导入 .env 文件)
Infisical CLI
这里可以查看 Infisical 支持的框架:infisical.com/docs/integr...
一般情况下在机器上使用 CLI - Infisical 即可完成配置注入,CLI 支持使用账号密码登陆和机器专用部署凭证登陆。
登陆 Infisical
-
在终端中输入
infisical login
-
选择 Infisical 的运行版本(可选公共服务和自托管)
scss
(base) aurora@MacBook-Pro ~ % infisical login
Use the arrow keys to navigate: ↓ ↑ → ←
? Select your hosting option:
▸ Infisical Cloud
Self Hosting
- 输入自托管的 Infisical 域名
scss
(base) aurora@MacBook-Pro ~ % infisical login
✔ Override current logged in user
✔ Self Hosting
✗ Domain: example - https://my-self-hosted-instance.com
- 输入账号密码或直接在浏览器中登陆(默认)
vbnet
✔ Override current logged in user
✔ Self Hosting
Domain: https://my-self-hosted-instance.com
Logging in via browser... To login via interactive mode run [infisical login -i]
>>>> Welcome to Infisical! You are now logged in as example@example.com <<<<
Quick links
- Learn to inject secrets into your application at https://infisical.com/docs/cli/usage
- Stuck? Join our slack for quick support https://infisical.com/slack
如果需要在终端中完成登陆和选择组织,使用
scss
(base) aurora@MacBook-Pro ~ % infisical login -i
✔ Override current logged in user
✔ Self Hosting
Domain: https://my-self-hosted-instance.com
Enter Credentials...
Email: example@example.com
Password: *************************
✔ Example Organization
>>>> Welcome to Infisical! You are now logged in as example@example.com <<<<
Quick links
- Learn to inject secrets into your application at https://infisical.com/docs/cli/usage
- Stuck? Join our slack for quick support https://infisical.com/slack
应用 Infisical
在项目中,第一步需要运行 infisical init
命令,将项目目录与 Infisical 的项目关联。
vbnet
(fastapi-playground) aurora@MacBook-Pro fastapi-playground % infisical init
? Which Infisical organization would you like to select a project from?:
✔ Example Organization
Use the arrow keys to navigate: ↓ ↑ → ←
? Which of your Infisical projects would you like to connect this project to?:
▸ fastapi-playground
在 infisical.com/docs/integr... 可以查找到框架的对应应用方法。通常来说,只需要在 CLI 的 run 参数之后加上原本的项目运行命令即可。
如果在 Infisical 中使用了目录分类管理配置,可以在 CLI 中指定 --path
参数加载对应目录下的配置,也可以使用 --recursive
递归加载目录下的所有配置。
css
# 加载根目录下的所有配置(会递归加载所有子目录中的配置)
infisical run --recursive python app.py
# 如果是 MonoRepo 的话,配合 path 参数使用
infisical run --path "/a-repo" --recursive python app.py
Done,配置就被注入了~ 在原有的项目中仍然以平常使用 env 的方式使用配置即可。
拓展
在 TypeScript 和 Python Typing 中,我当然希望环境变量配置也可以有准确的类型定义和 required 检查,可以使用两个包