我有一个包含一些加密组件的 Flask 应用程序。具体来说,磁盘上有一个已加密的密钥,并且必须在内存中未加密才能在 Flask 应用程序进程中使用。为了解密密钥,当应用程序运行时,系统会提示用户使用 getpass 输入密码。
这适用于app.run()
单个前台 Flask WSGI 服务器。我们遇到的问题是,当使用 uWSGI 进行部署时,uWSGI 控制器不允许标准输入。
理想情况下,我们希望发生的情况类似于使用 SSL 重新启动或启动 Apache 或 Nginx - 在服务分叉之前,它会在标准输入上提示输入密码。
任何帮助,将不胜感激!
更新
尽管我们仍然更喜欢使用 uWSGI,但由于 gunicorn 的 pre-fork 选项,我们已经转移到 gunicorn。这个解决方案仍然不理想,尤其是因为我们没有能力添加像 UPSTART 这样的监控服务。本质上,我们有一个之前运行的脚本,用于read
将密码设置为环境变量并将该环境变量传递给 gunicorn 应用程序。
#!/bin/bash
NAME="baz" # Name of the application
APPDIR=/var/apps/baz # Application project directory
SOCKFILE=/var/apps/baz/gunicorn.sock # Using a socket
BIND="127.0.0.1:8000" # Using a port
USER="www-data" # User to run as
GROUP="www-data" # Group to run as
WORKERS=1 # How many worker processes
echo "Starting $NAME"
# Collect the passphrase
read -s -p "Enter $NAME passphrase: " PASSPHRASE
echo ""
# Activate the virtual environment
source /var/venvs/baz/bin/activate
export BAZ_SETTINGS="baz.conf.Config"
export BAZ_PASSPHRASE=$PASSPRHASE
# Start Gunicorn
exec gunicorn $NAME:app \
--user $USER --group $GROUP \
--bind $BIND \
--workers $WORKERS \
--chdir $APPDIR \
--env BAZ_PASSPHRASE=$PASSPHRASE \
--daemon
这或多或少是教程使用 Nginx、Gunicorn、virtualenv、supervisor 和 PostgreSQL 设置 Django中使用的脚本- 为读取密码短语和与 Flask 一起使用而修改。
我们已经检查以确保BAZ_PASSPHRASE
环境变量在任何环境中都不存在,但这仍然感觉有点刺耳,所以我们仍然感谢任何评论,特别是关于 uWSGI。