关于记账
说实话,我曾经尝试过许多记账软件,无论是免费的还是付费的(比如 MoneyWiz),但最终都选择放弃。主要问题在于需要手动录入,而懒惰似乎是人类的本能,所以嘛…… 然而,转眼来北京两年了,过完元旦仔细检查账目时,我惊讶地发现居然有 7 万元的开销我搞不清楚到底花在哪了!这也太恐怖了!因此,无论多么困难,我也得养成记账的习惯,不能再这样草率地花钱了,必须将支出记录下来。于是乎,我又登陆了 VPS,准备部署一下记账软件 Firefly III(为什么要说 “又”,因为之前已经部署过,并卸载过 N 次了(🏃♂️逃))。
环境准备
之前部署的时候是手动安装的 LNMP(Linux + Nginx + MySQL + PHP)。一旦出了问题,解决起来相对麻烦,因为我对 PHP 不熟。所以这次我决定利用 Docker 进行部署,同时通过 Docker Compose 管理镜像,以提高效率。
关于安装 Docker & Compose、Nginx 证书自签的方法,可以参考我之前的文章,这里就不做赘述了。传送门如下:
Docker 镜像配置
docker-compose.yml 配置
Docker 部署实例非常方便,首先创建一个工程文件夹,然后新建 docker-compose.yml 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| version: '3.3'
services:
app:
image: fireflyiii/core:latest
hostname: app
container_name: firefly_iii_core
restart: always
volumes:
- firefly_iii_upload:/var/www/html/storage/upload
env_file: .env
networks:
- firefly_iii
ports:
- 127.0.0.1:8080:8080
depends_on:
- db
db:
image: mariadb
hostname: db
container_name: firefly_iii_db
restart: always
env_file: .db.env
networks:
- firefly_iii
volumes:
- firefly_iii_db:/var/lib/mysql
cron:
image: alpine
restart: always
container_name: firefly_iii_cron
command: sh -c "echo \"0 3 * * * wget -qO- http://app:8080/api/v1/cron/REPLACEME\" | crontab - && crond -f -L /dev/stdout"
networks:
- firefly_iii
volumes:
firefly_iii_upload:
firefly_iii_db:
networks:
firefly_iii:
driver: bridge
|
这里特别需要注意的是 app 和 db 的 env_file
,我们需要在这些文件中详细配置应用和数据库的设置。
.env 配置
在上文创建的工程目录中新建 .env 文件,以配置 Firefly APP 环境变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| # 推荐默认
APP_ENV=local
APP_DEBUG=false
# 根据情况自定义
SITE_OWNER=mail@example.com
# 一定要保证 32 个字符
APP_KEY=SomeRandomStringOf32CharsExactly
# 语言
DEFAULT_LANGUAGE=zh_CH
DEFAULT_LOCALE=equal
# 时区
TZ=Asia/Shanghai
# 反向代理一定要开!!
TRUSTED_PROXIES=**
# 日志相关,尽量减少日志
LOG_CHANNEL=stack
APP_LOG_LEVEL=emergency
AUDIT_LOG_LEVEL=emergency
# 数据库配置,这里选择 MySQL 数据库
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=firefly-db # 自定义
DB_USERNAME=firefly-user
DB_PASSWORD=强密码
MYSQL_USE_SSL=false
# Cookie 设置
COOKIE_PATH="/"
COOKIE_SECURE=false
COOKIE_SAMESITE=lax
SEND_ERROR_MESSAGE=true
SEND_REPORT_JOURNALS=true
ENABLE_EXTERNAL_MAP=false
ENABLE_EXTERNAL_RATES=false
# Firefly III authentication settings
AUTHENTICATION_GUARD=web
AUTHENTICATION_GUARD_HEADER=REMOTE_USER
DISABLE_FRAME_HEADER=false
# 防止 XSS 攻击,保持默认
DISABLE_CSP_HEADER=false
ALLOW_WEBHOOKS=false
DKR_BUILD_LOCALE=false
# 不用 sqllite
DKR_CHECK_SQLITE=false
# 安全相关,保持默认
DKR_RUN_MIGRATION=true
DKR_RUN_UPGRADE=true
DKR_RUN_VERIFY=true
DKR_RUN_REPORT=true
DKR_RUN_PASSPORT_INSTALL=true
# APP 配置,不要乱改
APP_NAME=FireflyIII
BROADCAST_DRIVER=log
QUEUE_DRIVER=sync
CACHE_PREFIX=firefly
FIREFLY_III_LAYOUT=v1
|
以上 .env 仅展示了必要的配置,其他自定义配置可以参考官方文档:.env.example。
踩过的坑
使用 Nginx 反向代理时必须配置环境变量 TRUSTED_PROXIES=**
,否则在登录时 form 表单会请求 http 地址,导致请求失败!
(这个坑也是我写这篇博文的原因,当时翻了将近半小时的 Github 才找到原因……)
.db.env 配置
.db.env 用于配置数据库用户信息,需要与上文 .env 中的配置保持一致:
1
2
3
4
| MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=firefly-db
MYSQL_USER=firefly-user
MYSQL_PASSWORD=强密码
|
docker-compose 启动镜像
上述三个文件配置完成后,在工程目录下运行该命令启动服务:
执行 docker ps
命令:
1
2
3
4
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b143b1fafa7 fireflyiii/core:latest "/usr/local/bin/entr…" About a minute ago Up About a minute (healthy) 127.0.0.1:8080->8080/tcp firefly_iii_core
daf67ec26566 alpine "sh -c 'echo \"0 3 * …" About a minute ago Up About a minute firefly_iii_cron
4a660f98647f mariadb "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp firefly_iii_db
|
如果 fireflyiii/core
容器的状态为 (healthy)
,则表明部署成功。
Nginx 反向代理配置
证书相关的配置上文的传送门中有讲,这里就不再赘述了,这里直接给出反向代理的部分:
1
2
3
4
5
6
7
8
9
10
| location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
client_max_body_size 64M;
proxy_pass http://127.0.0.1:8080$uri$is_args$args;
proxy_read_timeout 300s;
}
|
注册并使用
在这一步,Firefly III 已经成功部署。只需登录 Nginx 配置的域名,即可注册账号并开始使用,enjoy it ~
![install success](images/firefly-iii-install.webp)
参考资料: