在 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 将依赖定时的请求来完成自动化任务