使用 infisical 管理和同步环境变量

繁琐的叭叭

在我过往的工作中,管理和共享 .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,体验友好不少。

自托管部署

自托管部署 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

  1. 在终端中输入

    infisical login

  2. 选择 Infisical 的运行版本(可选公共服务和自托管)

scss 复制代码
(base) aurora@MacBook-Pro ~ % infisical login
Use the arrow keys to navigate: ↓ ↑ → ← 
? Select your hosting option: 
  ▸ Infisical Cloud
    Self Hosting
  1. 输入自托管的 Infisical 域名
scss 复制代码
(base) aurora@MacBook-Pro ~ % infisical login
✔ Override current logged in user
✔ Self Hosting
✗ Domain: example - https://my-self-hosted-instance.com
  1. 输入账号密码或直接在浏览器中登陆(默认)
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 检查,可以使用两个包

相关推荐
Myli_ing2 分钟前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
dr李四维19 分钟前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
Iced_Sheep36 分钟前
干掉 if else 之策略模式
后端·设计模式
雯0609~40 分钟前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ44 分钟前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z1 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
XINGTECODE1 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
彭世瑜1 小时前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript