Мне также нужно было применить минимальную защиту к fava. То, что я сделал, это служил fava через FastCGI вместо его встроенного http-сервера. Вот очень минимальная оболочка:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
def main():
try:
# In case you're running Python 2.x: (untested with fava)
from flup.server.fcgi import WSGIServer
except ImportError:
# For Python 3.x:
from flipflop import WSGIServer
from fava.application import app, load_file
app.config['BEANCOUNT_FILES'] = ['/path/to/your/ledger.beancount',]
load_file()
WSGIServer(app).run()
if __name__ == '__main__':
import sys as _sys
_sys.exit(main())
Вам, конечно, понадобится триггер для Python 3.x или флип для Python 2.x.
Чтобы заставить Apache загрузить это, у вас есть много вариантов. Вот 2:
- Сохраните файл как «fava.fcgi», сделайте его исполняемым с помощью идентификатора пользователя Apache и настройте Apache для обслуживания файлов .fcgi. Я этого не делал, потому что мне не нравится, что расширение .fcgi присутствует в моих URL-адресах, и я не хотел беспокоиться о (IMHO) громоздких правилах переписывания.
Мой более простой подход: сохраните файл как "fava", сделайте его исполняемым Apache и добавьте следующие строки в .htaccess для другого файла конфигурации сервера:
<Files fava>
# Use this with Debian package libapache2-mod-fastcgi
SetHandler fastcgi-script
# Or this with Debian package libapache2-mod-fcgid
#SetHandler fcgid-script
</Files>
Вам может потребоваться запустить a2enmod fastcgi
или a2enmod fcgid
зависимости от того, какой модуль Apache FastCGI вы решите использовать.
И самое главное, установите какой-то механизм паролей, и вы, вероятно, захотите использовать SSL. Например: (может быть более элегантный способ объединить этот раздел Directory
с вышеупомянутым разделом Files
...)
# Set this to whatever directory contains fava:
<Directory /path/to/dir/containing/fava/>
Options +ExecCGI
SSLOptions +StrictRequire
SSLRequireSSL
AuthType Basic
AuthName "Mr. Coffee"
AuthBasicProvider file
AuthUserFile /etc/apache2/htpasswd.whatever
Require valid-user
</Directory>
Заключительные замечания: вместо FastCGI могут работать и другие механизмы, такие как WSGI, но вам нужно будет изменить (или упростить?) мой скрипт-обертка