如何整合Python配置框架Stela和Dotenvx,实现配置项的加密?
· 2 min read
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来保护敏感数据了。