Skip to main content

如何整合Python配置框架Stela和Dotenvx,实现配置项的加密?

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

Stela是Python生态中一个非常流行的配置管理框架,让管理明文和加密的配置变得非常简单。 Stela的一些设计理念还是非常不错的,主要包括:

  • Settings: 非敏感数据,可以提交到代码仓库,如API URL,超时时间等
  • Secrets: 敏感数据,不应该提交到代码仓库,如密码,Token,API Key等
  • Profiles: 环境特定的配置,如开发、测试和生产环境,可以通过不同的Profile来区分

这些和Dotenvx的设计也是一致的,profile优先,.env或者application.properties文件中,未加密的配置项基本都是非敏感数据,如应用名称等, 而加密的主要是敏感数据,如数据库密码等。

Stela的使用也非常简单,uv add stela添加依赖,然后就可以使用了,如下:

import os
from stela import env

def main():
print(env.API_TOKEN)
print(os.environ.get("API_TOKEN"))

那么能否将Stela和Dotenvx结合起来使用呢? 当然Dotenvx负责数据的解密,这样Stela就可以专注于配置的管理了。 让我们看一下如何集成。

  • 首先通过uv安装依赖: uv add "dotenvx-py@https://github.com/linux-china/dotenvx-py.git"
  • .stela文件添加final_loader,接下来我们将通过自定义的final_loader让dotenvx负责配置项的界面,代码如下:
[stela]
environment_variable_name = STELA_ENV
evaluate_data = True
show_logs = False
env_file = .env
config_file_path = .
final_loader = stela_dotenvx_loader.dotenvx_loader

创建stela_dotenvx_loader.py文件,代码如下:

import os
from typing import Any

from dotenvx_py import dotenvx
from stela.config import StelaOptions


def dotenvx_loader(options: StelaOptions, env_data: dict[str, Any]) -> dict[str, Any]:
"""decrypt env data by Dotevx"""
profile = os.environ.get("STELA_ENV")
dotenvx.decrypt_entries(env_data, profile)
return env_data

上述代码中,我们通过dotenvx.decrypt_entries()方法来解密配置项,然后返回解密后的配置项。 这样我们就是可以使用Dotenvx格式的.env文件,包含对应的配置项,样例如下:

# ---
# uuid: 01991965-474d-75f1-bc8e-ee34710d8e57
# name: app_name
# group: group_name
# ---
DOTENV_PUBLIC_KEY=02675acb15cc318ea5dda54cd7b176dc62e7107122fa0a9aac268c99710c54cef6
# Environment variables. MAKE SURE to ENCRYPT them before committing to source control

API_TOKEN=encrypted:BEMs8pbfdw8vtgR3HNT4VWA17DPDSb6wHVkH73+2EVlcVBPGv+QkJUcAbiBJgBMpEklgBpzxxSFv6XFUOvOIRzxkud5diAhauoUce5VNdIXPwNOHxRq0gAdixqNgHZiOdvbvTtPfkQ==

借助这样的方式,我们就可以非常方便的使用Stela来管理配置项,同时又可以使用Dotenvx来保护敏感数据了。