在 CentOS 上安装 Firefly-iii

Firefly-iii 是什么

A free and open source personal finance manager

开源免费的个人理财管理系统,支持多币种账户、银行账户导入、图表等功能。

官网似乎存在对大陆 IP 的封禁,需要如图所示办法来访问相关文档:

wall

Github - 帮助文档 - 官网

安装方法

安装帮助文档

官方的帮助文档对安装步骤有较为详细的介绍,有条件的可以直接进行参考👆

1. Docker

官方也提供了 docker-compose, 直接安装等方式,本文将介绍如何在 Docker 下进行安装,并进行如下配置:

  • 指定镜像:应对大陆网络环境
  • 数据库:使用自定义的数据库连接
  • 反向代理:Nginx 配置,启用 SSL

当然,如果没有 docker,需要首先安装,以下是一种方法:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

2. 获取 Firefly-iii

通常,可以使用 docker search xxx 搜索可用镜像,并使用 docker pull xxx 进行拉取,但如果在大陆的网络环境下,首先需要配置镜像,或者指定镜像拉取。

这里直接指定 docker.rainbond.cc 代理镜像拉取:

docker pull docker.rainbond.cc/fireflyiii/core:latest

镜像的可用性会随时间发生变化,如果文中的镜像已不可用,则可以寻找其他可用的镜像替代,替换掉指令中的 docker.rainbond.cc 即可。成文时,可以拉到的最新版本为 6.1.22

3. 准备

  • 创建一个上传文件目录,用于挂载到 firefly 的上传文件目录。
  • 生成一个 32 位长度的随机字符串,用于作为 APP_KEY,比如使用如下指令进行生成:
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
  • 准备好数据库,这里以 MySQL/MariaDB 为例(使用 PostgreSQL 的情况,需要在启动命令中指定 -e DB_CONNECTION=pgsql

4. 启动

按需修改并执行下述指令:

docker run -d \
-v /上传文件目录:/var/www/html/storage/upload \
--name firefly \
-p 19716:8080 \
-e APP_KEY=32位随机字符串 \
-e DB_HOST=数据库IP \
-e DB_PORT=数据库端口 \
-e DB_CONNECTION=mysql \
-e DB_DATABASE=库名 \
-e DB_USERNAME=用户名 \
-e DB_PASSWORD=密码 \
-e DEFAULT_LANGUAGE=zh_CN \
-e TZ=Asia/Shanghai \
-e APP_URL=firefly的外网访问路径,如https://xxx.com \
-e TRUSTED_PROXIES=* \
docker.rainbond.cc/fireflyiii/core:latest

其中,APP_URL, TRUSTED_PROXIES 参数是为了配合 Nginx 配置反向代理使用的,不需要可以不进行配置。

此时可以使用 docker logs -f firefly 跟踪程序启动日志,通常看到下面信息说明正常启动了:

...
  [!] User #1 (cxlm@cxlm.work) has account #5 ("Cash account") which has no transactions.
      Now executing firefly-iii:report-sum
  [✓] Amount integrity OK for user #1
      Now executing firefly-iii:upgrade-group-information
  [i] Encryption keys exist already.
  [i] Updated version.
  [✓] No security alerts for version 6.1.22

              ______ _           __ _            _____ _____ _____  
             |  ____(_)         / _| |          |_   _|_   _|_   _| 
             | |__   _ _ __ ___| |_| |_   _       | |   | |   | |   
             |  __| | | '__/ _ \  _| | | | |      | |   | |   | |   
             | |    | | | |  __/ | | | |_| |     _| |_ _| |_ _| |_  
             |_|    |_|_|  \___|_| |_|\__, |    |_____|_____|_____| 
                                       __/ |                        
                                      |___/                         

+------------------------------------------------------------------------------+
|                                                                              |
| Thank you for installing Firefly III, v6.1.22!                               |
| This version of Firefly III requires PHP8.3.                                 |
|                                                                              |
+------------------------------------------------------------------------------+
...

此时通过 ip:19716 可以正常访问 Firefly 服务,并被要求注册、登录、设置银行卡等。完成后,应该看到如下的欢迎页面:

after_init.webp

至此必要步骤已全部完成,可以正常使用。但仍可通过后续步骤完成反向代理配置、定时任务等内容。

5. Nginx 反向代理配置(可选)

为什么配置?

  1. 复用端口:使用公共端口(如 80、443)提供服务,在访问时无需指定端口,无需开放额外端口
  2. 开启 Https:对外提供服务统一由 Nginx 处理 SSL,Nginx 解密后转发请求到 Docker 的 Firefly 服务

配置方法:

  • 启动指令中按照第四步正确指定 APP_URL, TRUSTED_PROXIES 参数
  • 配置 Nginx 反向代理,示例如下:
    server {
        listen      443 ssl http2;
        server_name xxx.com;
        ssl_certificate  /root/ssl/xxx.com.pem;
        ssl_certificate_key  /root/ssl/xxx.com.key;
        ssl_session_cache  shared:SSL:1m;
    
        location / {
            
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            client_max_body_size 64M;
            proxy_read_timeout 300s;
            proxy_pass  http://内网IP:19716;
            add_header Content-Security-Policy "upgrade-insecure-requests";
        }
    }

常见问题:

  1. 页面排版错乱,表单功能异常

https_error1.webp

解决办法:检查配置

  • Nginx 中是否指定了:add_header Content-Security-Policy "upgrade-insecure-requests";
  • Nginx 中是否正确设置了 proxy_set_header 的相关配置
  • docker 启动指令是否指定了 TRUSTED_PROXIES=*

如果仍没有解决问题,可以在 Github 中继续这个问题的讨论

  1. Nginx 报错 502,但是 IP:端口 可以正常使用

解决办法:检查 proxy_pass http://内网IP:19716; 配置项,是否在转发后继续使用了 https,Firefly 本身不处理 SSL,因此 502。

6. Cron 定时任务配置(可选)

在使用“自动化 > 定期交易”功能时,可能会得到如下提示:

no_cron.webp

说明定时任务尚未开启,无法使用自动化功能,如果需要使用这项功能,则可以通过下面的方法开启:

  1. 获取令牌:

cmd_token.webp

  1. 配置定时任务

可以在 CentOS 上直接配置定时任务(crontab -e 后添加下列任务):

0 3 * * * curl https://xxx.com/api/v1/cron/[token]

如果使用 docker,也可以通过下面的指令,每天定时发送请求到 firefly 通知执行定时任务:

docker create --name=FireflyIII-Cronjob alpine \
    sh -c "echo \"0 3 * * * wget -qO- https://xxx.com/api/v1/cron/[TOKEN]\" | crontab - && crond -f -L /dev/stdout"

甚至可以使用任何定时管理工具,每天向 https://xxx.com/api/v1/cron/[TOKEN] 发送请求,你甚至可以在浏览器手动请求这个链接完成通知:

cron_req.jpg

当请求成功执行后,定期交易中的提醒会消失,Firefly 将依赖定时的请求来完成自动化任务