在 Ubuntu 22.04 上部署 fava(beancount 记账软件的 Web版本)
主要参考资料:How To Serve Flask Applications with Gunicorn and Nginx on Ubuntu 22.04 | DigitalOcean
fava 本质是一个 Flask 应用,所以可以按照 Flask 应用的部署方式来。
1. 更新系统环境,并安装依赖 {#1-dot-更新系统环境-并安装依赖}
1 sudo apt update
2 sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools python3-venv
2. 创建虚拟环境 {#2-dot-创建虚拟环境}
1 mkdir ~/fava-site && cd $_
2 python3 -m venv venv --upgrade-deps
3 . venv/bin/activate
3. 安装 Python 依赖 {#3-dot-安装-python-依赖}
1 pip install wheel
2 pip install gunicorn fava
4. 配置 fava {#4-dot-配置-fava}
1 vim app.py
2 sudo ufw allow 5000
3 sudo vim /etc/systemd/system/fava-site.service
4 sudo systemctl start fava-site
5 sudo systemctl enable fava-site
6 sudo systemctl status fava-site
app.py
1 """fava wsgi application"""
2 from __future__ import annotations
3
4 from fava.application import app as application
5
6 application.config["BEANCOUNT_FILES"] = [
7 "ABSOLUTE_PATH_TO_BEANCOUNT_FILE",
8 ]
fava-site.service
[Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=user Group=www-data WorkingDirectory=/home/user/fava-site Environment="PATH=/home/user/fava-site/venv/bin" ExecStart=/home/user/fava-site/venv/bin/gunicorn --workers 3 --bind unix:fava-site.sock -m 007 app [Install] WantedBy=multi-user.target
5. Nginx 配置反向代理 {#5-dot-nginx-配置反向代理}
1 sudo apt update
2 sudo apt install nginx
3 sudo ufw app list
4 sudo ufw allow 'Nginx HTTP'
5
6 sudo vim /etc/nginx/sites-available/fava-site
7 sudo ln -s /etc/nginx/sites-available/fava-site /etc/nginx/sites-enabled
8 sudo nginx -t # 检查是否运行正常
9 sudo systemctl restart nginx
10
11 sudo ufw delete allow 5000
12 sudo ufw allow 'Nginx Full'
一个注意事项:
如果 Nginx 无法获取 gunicorn 的 socket 文件,会返回 HTTP 502 网关错误。这通常是因为用户的家目录不允许其他用户访问里面的文件。如果 socket 文件位于家目录,确保家目录的权限号码至少为 755。如果不是,修改方法:
1 sudo chmod 755 /home/user
fava-site
server { listen 80; server_name your_domain www.your_domain; location / { include proxy_params; proxy_pass http://unix:/home/user/fava-site/fava-site.sock; } }
6. 支持 HTTPS {#6-dot-支持-https}
1 sudo apt install python3-certbot-nginx
2
3 sudo certbot --nginx -d your_domain
4
5 sudo ufw delete allow 'Nginx HTTP'