如何利用 Docker & Nginx 在 VPS 上部署 Firefly III 记账软件

1 关于记账

说实话,我曾经尝试过许多记账软件,无论是免费的还是付费的(比如 MoneyWiz),但最终都选择放弃。主要问题在于需要手动录入,而懒惰似乎是人类的本能,所以嘛…… 然而,转眼来北京两年了,过完元旦仔细检查账目时,我惊讶地发现居然有 7 万元的开销我搞不清楚到底花在哪了!这也太恐怖了!因此,无论多么困难,我也得养成记账的习惯,不能再这样草率地花钱了,必须将支出记录下来。于是乎,我又登陆了 VPS,准备部署一下记账软件 Firefly III(为什么要说 “又”,因为之前已经部署过,并卸载过 N 次了(🏃‍♂️逃))。

2 环境准备

之前部署的时候是手动安装的 LNMP(Linux + Nginx + MySQL + PHP)。一旦出了问题,解决起来相对麻烦,因为我对 PHP 不熟。所以这次我决定利用 Docker 进行部署,同时通过 Docker Compose 管理镜像,以提高效率。

关于安装 Docker & Compose、Nginx 证书自签的方法,可以参考我之前的文章,这里就不做赘述了。传送门如下:

3 Docker 镜像配置

3.1 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,我们需要在这些文件中详细配置应用和数据库的设置。

3.2 .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 才找到原因……)

3.3 .db.env 配置

.db.env 用于配置数据库用户信息,需要与上文 .env 中的配置保持一致:

1
2
3
4
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=firefly-db
MYSQL_USER=firefly-user
MYSQL_PASSWORD=强密码

3.4 docker-compose 启动镜像

上述三个文件配置完成后,在工程目录下运行该命令启动服务:

1
docker-compose up -d

执行 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),则表明部署成功。

4 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;
}

5 注册并使用

在这一步,Firefly III 已经成功部署。只需登录 Nginx 配置的域名,即可注册账号并开始使用,enjoy it ~

install success

参考资料:


欢迎关注我的公众号,第一时间获取文章更新:

微信公众号

相关内容