使用 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 检查,可以使用两个包

相关推荐
shawxlee15 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
腾讯云云开发15 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
后端
星栈15 小时前
从装一堆工具到看懂 Node 工程化思维:我的项目复盘记录
后端·node.js
用户0595401744615 小时前
把记忆存储的回归测试从手工换成 Playwright + GitHub Actions,线上缺陷降低 80%
前端·css
触底反弹15 小时前
🚀 从 DOM0 级到 React 合成事件:前端事件监听的 20 年演进史
前端·react.js·面试
65岁退休Coder15 小时前
LangChain v1.3.4 笔记 - 05 Agent 上下文记忆
后端
kyriewen15 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
颜酱15 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
JaneConan15 小时前
鸿蒙 韶非 UI 系列:能力调用 startAbilityForResult,跳能力拿回参,鸿蒙能力路由入门
后端·harmonyos
晴空了无痕16 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes