У меня есть функция, связанная с приложением для умного дома, над которым я сейчас работаю, и с которой у меня возникают проблемы в «производственной» среде.
requirements:
Flask
gunicorn
python-mpv
Последний представляет собой оболочку Python для аудиоплеера mpv.
У меня есть некоторые функции в моем приложении Flask, например:
STATION_URLS = {
'heart 80s': 'http://media-ice.musicradio.com/Heart80sMP3',
'el sol': 'https://playerservices.streamtheworld.com/api/livestream-redirect/EL_SOL_BOGAAC.aac'
}
stream = mpv.MPV()
def kill_station():
global stream
stream.stop()
def play_radio_station(station):
global stream
print(f'playing {station}')
stream.play(STATION_URLS[station])
@app.route('/music', methods=['GET', 'POST'])
def music():
if request.method == 'POST':
if request.get_json() and request.get_json().get('kill'):
kill_station()
return 'Success', 200
play_radio_station(request.get_json()['station'])
return 'Success', 200
return render_template('radio.html')
Проблема, с которой я сталкиваюсь и на которую не могу найти ответ, заключается в том, почему это представление/функция отлично работает при работе на переднем плане либо с сервером разработки Flask (Werkzeug), либо с Gunicorn, но когда я запускаю его через Supervisor, хотя само приложение в основном работает нормально, оно не может взаимодействовать с mpv, и я не получаю никаких соответствующих журналов ошибок от Supervisor или Gunicorn. Я попробовал последнее с различными вариантами, относящимися к количеству рабочих и рабочих классов, просто чтобы убедиться. Конфигурация моего супервайзера выглядит следующим образом:
[program:smarthome]
directory=/home/me/SmartHome
command=/home/me/SmartHome/gunicorn.sh
user=me
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/smarthome/smarthome.err.log
stdout_logfile=/var/log/smarthome/smarthome.out.log
Как видите, я попытался обойти проблему, запустив сервер Gunicorn с помощью скрипта bash, но без особого удовольствия (дикий удар в темноте, который я нашел здесь). Сценарий bash (и команда Gunicorn):
#!/bin/sh
exec /home/me/.local/bin/gunicorn -c gunicorn.conf.py smarthome2.smarthome_server:app
и мой конфиг Gunicorn выглядит так:
from smarthome2.smarthome_server import heating_init
bind = '0.0.0.0:8080'
workers = 3
worker_class = 'sync' # I have also tried 'gthread' here
loglevel = 'info'
def on_starting(server):
heating_init()
Приложение работает на Raspberry Pi 3B, а НЕ за другим сервером wsgi (Apache2/nginx), а просто через локальную сеть. Pi подключен к динамику Bluetooth, и команды mpv отлично работают из командной строки (и, как упоминалось выше, при работе без Supervisor).
Мои подозрения (возможно, необоснованные) заключаются в том, что пользователь/группа супервизора не может получить доступ ни к mpv, ни к устройству Bluetooth.
Может ли кто-нибудь помочь подтвердить/опровергнуть мои подозрения и указать мне правильное направление для исправления?