在 CentOS 上安装 Firefly-iii
Firefly-iii 是什么
开源免费的个人理财管理系统,支持多币种账户、银行账户导入、图表等功能。
官网似乎存在对大陆 IP 的封禁,需要如图所示办法来访问相关文档:

安装方法
官方的帮助文档对安装步骤有较为详细的介绍,有条件的可以直接进行参考👆
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 服务,并被要求注册、登录、设置银行卡等。完成后,应该看到如下的欢迎页面:

至此必要步骤已全部完成,可以正常使用。但仍可通过后续步骤完成反向代理配置、定时任务等内容。
5. Nginx 反向代理配置(可选)
为什么配置?
- 复用端口:使用公共端口(如 80、443)提供服务,在访问时无需指定端口,无需开放额外端口
 - 开启 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";
        }
    }
常见问题:
- 页面排版错乱,表单功能异常
 

解决办法:检查配置
- Nginx 中是否指定了:
add_header Content-Security-Policy "upgrade-insecure-requests"; - Nginx 中是否正确设置了 
proxy_set_header的相关配置 - docker 启动指令是否指定了 
TRUSTED_PROXIES=* 
如果仍没有解决问题,可以在 Github 中继续这个问题的讨论
- Nginx 报错 502,但是 IP:端口 可以正常使用
 
解决办法:检查 proxy_pass  http://内网IP:19716; 配置项,是否在转发后继续使用了 https,Firefly 本身不处理 SSL,因此 502。
6. Cron 定时任务配置(可选)
在使用“自动化 > 定期交易”功能时,可能会得到如下提示:

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

- 配置定时任务
 
可以在 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] 发送请求,你甚至可以在浏览器手动请求这个链接完成通知:

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