Eu também precisava aplicar proteção mínima à fava. O que eu fiz foi para servir fava sobre FastCGI em vez de seu servidor http embutido. Aqui está um wrapper muito minimalista:
#!/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())
Você certamente precisará do flipflop para o Python 3.x ou flup para o Python 2.x.
Para fazer com que o Apache carregue isso, você tem muitas opções. Aqui está 2:
- Salve o arquivo como "fava.fcgi", torne-o executável pelo ID do usuário do Apache e configure o Apache para servir arquivos .fcgi. Eu não fiz isso, porque eu não gosto que a extensão .fcgi esteja presente em meus URLs, e eu não queria me incomodar com regras de reescrita complicadas (IMHO).
-
Minha abordagem mais simples: Salve o arquivo como "fava", torne-o executável pelo Apache e adicione essas linhas a um .htaccess para outro arquivo de configuração do servidor:
<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>
Pode ser necessário executar a2enmod fastcgi
ou a2enmod fcgid
dependendo de qual módulo do Apache FastCGI você decidir usar.
E o mais importante, defina algum tipo de mecanismo de senha e você provavelmente precisará de SSL. Por exemplo: (pode haver uma maneira mais elegante de combinar essa seção Directory
com a seção Files
acima ...)
# 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>
Notas finais: Em vez de FastCGI, outros mecanismos podem funcionar também, como WSGI , mas você precisará alterar (ou simplificar?) o meu script wrapper.