我有一个Django应用程序,它在磁盘上有一个使用AES Cypher加密的密钥,并且必须在内存中未加密,以便在过程中使用。
我在settings.py
中有这样一行:
AES_CIPHER_KEY = getpass("Enter AES cipher key: (leave blank if you don't need decryption)")
这是我的gunicorn.socket
:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
这是我的gunicorn.service
:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/root/samir/src/samirpy
ExecStart=/root/samir/venv/bin/gunicorn --access-logfile --workers 3 --bind unix:/var/log/gunicorn/samir.sock samir.wsgi:application
[Install]
WantedBy=multi-user.target
这是我的nginx.conf
:
server {
listen 80;
server_name example.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /var/www;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
wsgi.py
:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'samir.settings')
application = get_wsgi_application()
我希望发生的是当我更新代码并使用以下命令重新启动服务时:sudo systemctl restart gunicorn
它在启动主进程之前提示输入密钥。
1条答案
按热度按时间j13ufse21#
一般来说,服务是非交互式的,不会从您的终端接收输入;它们的stdin总是连接到/dev/null。(此外,您已经将服务设置为通过www.example.com在 Boot 时启动multi-user.target;您是否打算在每次服务器引导时通过IPMI/KVM键入密码?)
对于密码,systemd有一个带外方法;请参见
man systemd-ask-password
。如果您的服务在启动期间使用此功能(即在它通知systemd它已经完成启动之前),systemctl将为您显示密码提示-并且在 Boot 期间(当不涉及systemctl时),您仍然可以回答密码提示,而不需要KVM。此外,即使抛开这一点不谈,“settings.py“听起来应该是程序中交互性最差的部分--用户输入提示应该真的去其他地方,而不是常量定义的一部分。(这就像在C中执行
#include "/dev/stdin"
...)