いくつかの暗号化コンポーネントを含む Flask アプリがあります。具体的には、暗号化されたキーがディスク上にあり、Flask アプリのプロセス中に使用するためにメモリ内で暗号化を解除する必要があります。キーの暗号化を解除するために、ユーザーはアプリケーションの実行時に getpass を使用してパスフレーズを入力するよう求められます。
これはapp.run()
、単一のフォアグラウンド Flask WSGI サーバーでうまく機能します。私たちが直面している問題は、uWSGI を使用してデプロイする場合、uWSGI コントローラーが stdin を許可しないことです。
理想的には、SSL を使用して Apache や Nginx を再起動または開始したときと同様のことが起こりたいと考えています。つまり、サービスがフォークする前に、stdin でパスワードの入力を求めるプロンプトが表示されます。
どんな助けでも大歓迎です!
アップデート
私たちはまだ 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 に関してコメントをいただければ幸いです。