很是不理解一个注重安全的记账应用为什么HTTPS配置部分做的如此睿智

记录一下折腾整个Firefly的过程,如果不是它是唯一能做到全平台客户端支持的记账应用,我真的早就放弃了。
顺便一提,有个叫多少记账的玩意看起来也不错,可惜好像是死了。
言归正传,从部署讲起。虽然fireflyiii的本地部署方式并不复杂,解压tar再初始化一下数据库,稍微写一点nginx就能用,但这玩意的最新版居然对PHP的最低版本要求是8.3,一方面我的环境不够,另一方面也怕它始终要求最新版PHP,所以我们还是走docker方式。

• 前置:准备一个DB
不管你是本地的还是docker的,总之搞一个db。fireflyiii对数据库的支持比较全面,mysql、PostgreSQL啥的都支持。准备好对应的数据库和账号密码,此处不再详述。

• 安装
https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/ 是官方安装文档,其中给出的docker run命令例子如下:

docker run -d \
-v firefly_iii_upload:/var/www/html/storage/upload \
-p 80:8080 \
-e APP_KEY=CHANGEME_32_CHARS \
-e DB_HOST=CHANGEME \
-e DB_PORT=3306 \
-e DB_CONNECTION=mysql \
-e DB_DATABASE=CHANGEME \
-e DB_USERNAME=CHANGEME \
-e DB_PASSWORD=CHANGEME \
fireflyiii/core:latest

其中包括了基本的数据库配置和文件夹映射,照此配置即可实现基本访问,进入系统后正常设置即可。

• 折磨死人的HTTPS
但作为一个安全性很重要的系统,这玩意原生不支持SSL配置。
文档里的TLS配置教程在此:https://docs.firefly-iii.org/references/faq/install/#how-do-i-set-tls-in-firefly-iii-or-the-data-importer
但照此配置必然会遇到页面元素无法加载的问题,原因是Content-Security-Policy。我们需要在docker run的时候加几条env:

docker run -d \
-v firefly_iii_upload:/var/www/html/storage/upload \
-p 80:8080 \
-e APP_KEY=CHANGEME_32_CHARS \
-e DB_HOST=CHANGEME \
-e DB_PORT=3306 \
-e DB_CONNECTION=mysql \
-e DB_DATABASE=CHANGEME \
-e DB_USERNAME=CHANGEME \
-e DB_PASSWORD=CHANGEME \
-e TZ=Asia/Shanghai \
-e DEFAULT_LANGUAGE=zh_CN \
-e TRUSTED_PROXIES=** \
-e APP_URL=HTTPS_URL_OF_YOUR_SITE \
fireflyiii/core:latest

主要就是TRUSTED_PROXIES=**和APP_URL=两句,之后nginx照官方配置即可,放出我的配置做参考。我们假定你已经拥有了本地SSL cert.

upstream firefly_iii_dev {
    server 127.0.0.1:8080;
}  

server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name https://your_url.com;

        ssl_certificate /your/ssl/cert.pem;
        ssl_certificate_key /your/ssl/key.pem;

        index index.html index.htm index.nginx-debian.html index.php;

        location ~ /.well-known {
        allow all;
        }

        location / {
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Port $server_port;
                client_max_body_size 64M;
                proxy_read_timeout 300s;
                proxy_pass http://127.0.0.1:8080;

        }

}

发表评论