在使用Nginx、Gunicorn和systemd部署Django应用时,如何使用getpass向Django应用提供给予输入?

7dl7o3gd  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(123)

我有一个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它在启动主进程之前提示输入密钥。

j13ufse2

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"...)

相关问题