项目上线时需要切换生产环境配置信息,这些信息可以直接被保存在项目中吗?如果保存下来,不小心提交到仓库或被破解查看,生产环境岂不是裸奔?那么该如何解决?更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
1.演示环境
本文以 Flask
项目为例说明,简单环境信息:
1) Flask
Flask-RESTful
2) CentOS
2.方案
一般配置信息都保存在指定目录下,分为测试、开发以及生产。其中测试与开发配置文件的保留,问题不大,关键就是生产环境配置信息如何处理。
1) 可以在 .gitignore
文件中添加忽略文件,使其不被提交到仓库。
虽然不在仓库内,但是配置文件仍然在项目中
2) 可以通过添加环境变量的方式解决。推荐指数5颗星 ~
3.方案实施
可以保留项目中开发(测试)环境配置文件,将需要修改的数据库配置项等单独在生产环境配置文件中重写,并配置环境变量(生产配置文件路径)。然后在项目加载默认配置信息后,通过环境变量引入生产配置信息,从而覆盖掉无用配置,隐藏敏感信息。这样我们的生产信息既不在仓库内,也不在项目中,而是在服务器某个角落。项目中的配置信息都是本地配置项,被人知道也无妨,保留后还能造成迷惑。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
3.1 在服务器任意目录下存放生产环境配置信息
生产配置文件 app_deploy.py
中既可以保存 MySQL
、Redis
和 Elasticsearch
数据库集群信息,还可以保存私钥等敏感信息。
比如我们将其存放在如下路径:
代码语言:javascript复制/root/config/app_deploy.py
3.2 配置环境变量
在部署项目的 shell
脚本中添加如下信息:
export TOUTIAO_APP_SETTING=/root/config/app_deploy.py
3.3 设置常量保存环境变量名
在项目如下文件中:
代码语言:javascript复制.../common/utils/constants.py
添加常量信息:
代码语言:javascript复制GLOBAL_SETTING_ENV_NAME = 'TOUTIAO_APP_SETTING'
3.4 在项目初始化文件中加载环境变量
代码语言:javascript复制from flask import Flask
def create_flask_app(config, enable_config_file=False):
"""
创建 Flask 应用
:param config: 配置信息对象
:param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息
:return: Flask 应用
"""
app = Flask(__name__)
app.config.from_object(config)
if enable_config_file:
from utils import constants
app.config.from_envvar(constants.GLOBAL_SETTING_ENV_NAME, silent=True)
return app
以上只是本人在实际项目中的一个小应用,可以类比去设置 Django
项目。当然,如果你有更好方法可以后台给小闫留言,不胜感激。