发表日期:2022年3月11日 · 更新于 2022年3月12日
作者:nextleaf | 黄昭鸿
[TOC]
适用范围
本教程基于在Ubuntu Server 20.04 LTS
上使用Docker部署Firefly III
v5.6.16
的实践,在其他平台或其他Linux
未做测试。官方文档中还有使用Composer
安装的教程,但笔者使用该方法未成功。本文中的MySQL
也在Docker容器
中运行,如需连接到宿主机的数据库或其他远程数据库,请查阅Docker官方文档自行配置。
先决条件
本教程默认读者具有一定Linux
和Docker
基础,例如Linux用户管理、Linux文件管理、Linux权限管理、数据库命令行操作、Docker容器等。
开始之前,请使用一个非root用户登录到Linux,并且由该用户执行本文正文所有的操作,如果你还没有普通用户,可使用root用户创建普通用户,创建普通用户命令如下:
# 新建小明用户,-m选项表示自动创建用户的主目录
useradd -m Xiaoming
# 设置小明的密码
passwd Xiaoming
# 授予小明sudo权限
usermod -a -G sudo Xiaoming
正文
Firefly III简介
Firefly III是一个个人财务的管理器。它是自我托管和开源的。这意味着它是免费的,没有广告,没有跟踪。它可以帮助你跟踪支出、收入、预算和两者之间的一切。它支持信用卡、共享家庭账户和储蓄账户。它还有许多整洁的财务报告可用。通过记录你的支出和收入,你可以做出相应的预算并节省资金。花里胡哨的。
先安装docker引擎
为什么先安装Docker Engine?参见本文的“适用范围”。
本节参考自Install Docker Engine on Ubuntu | Docker Documentation
步骤(共4个):
-
卸载旧的
Docker
如果安装了旧版本的
Docker
,请卸载它们,在终端执行:sudo apt-get remove docker docker-engine docker.io containerd runc
此命令如果报告未安装这些包,则没关系。
-
通过设置
Docker存储库
并从中进行安装,以便安装和升级(官方推荐的方法)2.1. 设置存储库,终端执行以下两条命令。
# 第一条,更新包索引 sudo apt-get update # 第二条,设置Docker存储库 sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
2.2. 添加 Docker 的官方 GPG 密钥,终端执行:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
2.3. 在终端使用以下命令设置稳定存储库:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
安装Docker引擎,终端执行以下两条命令:
# 第一条 sudo apt-get update # 第二条 sudo apt-get install docker-ce docker-ce-cli containerd.io
-
安装后的配置,以非root用户身份管理Docker,终端执行:
# 在此之前,请不要使用sudo来执行docker命令 # 将用户添加到组,$USER指向当前用户 sudo usermod -aG docker $USER # 激活对组的更改,完成这两个命令后请注销登录,再重新登录使之生效 newgrp docker # 开机启动docker sudo systemctl enable docker.service sudo systemctl enable containerd.service
如果要更新Docker引擎,请参考官方文档。
使用Docker部署MySQL服务器
本节参考Basic Steps for MySQL Server Deployment with Docker以及Mysql - Official Image | Docker Hub
步骤(共3个):
-
拉取镜像,其中
latest
标签是用来指定最新版本的(目前是8.0.28),执行:docker pull mysql/mysql-server:latest
要显示已下载的镜像,请在终端执行:
docker images
上图可以看到,拉取的MySQL镜像名为
mysql/mysql-server
。 -
从镜像启动MySQL容器并初始化该容器
创建卷给MySQL容器使用,终端执行:
docker volume create mysql-data
要启动新的Docker容器,可在终端执行(方法1):
docker run --name=给容器起个名 -v mysql-data:/var/lib/mysql --restart on-failure -d 镜像名:标签
例如:
docker run --name=mysql666 -v mysql-data:/var/lib/mysql --restart on-failure -d mysql/mysql-server:latest
如果你不小心敲错命令了,停止该容器并删除该容器,然后重新创建新的容器。
终端使用docker ps
命令,显示在正在运行的容器列表:
停止指定容器:docker stop mysql666
;删除指定容器:docker rm mysql666
除了上面的方法启动容器,你也可以在启动新的容器的适合指定数据库root用户的密码(方法2),命令格式如下:
docker run --name 给容器起个名 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=你的密码 -d 镜像名:标签
例如:
docker run --name mysql666 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=.22pT*Z\&cO1 -d mysql/mysql-server:latest
要监视容器的日志输出,可执行命令docker logs mysql666
。
在方法1中,启动后 容器初始化可能需要一些时间,在docker ps
命令的输出中,容器的STATUS
为含有healthy
时,表明服务器准备就绪可供使用(上面图3),初始化过程中MySQL为root
用户生成的随机密码,等它初始化完成后,使用以下命令查看生成的密码:
docker logs mysql666 2>&1 | grep GENERATED
在将mysql
客户端连接到服务器(见下面)后,必须通过发出以下语句来重置服务器root
密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '您的新密码';
附:可以使用 docker exec -it
命令在容器内启动 bash
shell,例如
docker exec -it mysql666 bash
附:删除容器命令docker rm 容器名
(要先停止它再删除),如果希望同时删除服务器数据目录的数据卷
,请将-v
选项添加到docker rm
命令中。
-
启动
MySQL
客户端并将其连接到MySQL
服务器,执行后它会提示输入密码,输入上述生成的那个即可。docker exec -it mysql666 mysql -uroot -p
输入密码连接后,马上更改
root
用户初始密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'pqyry;Bl8C7A32B~kHUD';
"Query OK"表明更改成功。
Firefly III
不建议使用数据库的root
用户连接,下面将创建新的MySQL
用户、新的数据库,给Firefly III
使用:-- 创建数据库firefly CREATE DATABASE IF NOT EXISTS firefly DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 创建数据库用户fireflyuser,密码为xW9CoF8A666 CREATE USER 'fireflyuser'@'%' IDENTIFIED BY 'xW9CoF8A666'; -- 授权 grant all on firefly.* to "fireflyuser"@"%";
然后exit
返回终端,测试fireflyuser
能不能连接:docker exec -it mysql666 mysql -ufireflyuser -p
到此数据库准备工作结束,接下来安装
Firefly III
。
使用Docker部署Firefly III
本节参考Firefly III 官方文档 (firefly-iii.org)
步骤(共4个):
-
创建用于持久存储上传的文件和导出的数据的
卷
。docker volume create firefly_iii_upload
-
使用命令
docker ps
查看MySQL
容器的id
。
查看
MySQL
容器的IP
docker inspect MySQL容器的id | grep IPAddress
将此ip记住或复制下来备用,我这里是
172.17.0.2
。在终端执行以下命令,生成一串32个字符的随机字符串备用。
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
每次执行都不一样,我这里是
AgXj2E9M0PGhRqhzoMtycqDRkNwIRHjO
。 -
启动
Firefly III
容器下面命令将拉取
Firefly III
最新版镜像并启动Firefly III
容器,请小心填写所需值,如不小心填错后执行,请停止并删除错误的容器,然后重试。# docker pull fireflyiii/core:latest docker run -d \ -v firefly_iii_upload:/var/www/html/storage/upload \ -p 80:8080 \ -e APP_KEY=你的32位随机字符串 \ -e DB_HOST=MySQL容器的IP \ -e DB_PORT=3306 \ -e DB_CONNECTION=mysql \ -e DB_DATABASE=firefly所使用的数据库名 \ -e DB_USERNAME=firefly所使用的数据库用户 \ -e DB_PASSWORD=该数据库用户的密码 \ fireflyiii/core:latest
例如我的:
docker run -d \ -v firefly_iii_upload:/var/www/html/storage/upload \ -p 80:8080 \ -e APP_KEY=AgXj2E9M0PGhRqhzoMtycqDRkNwIRHjO \ -e DB_HOST=172.17.0.2 \ -e DB_PORT=3306 \ -e DB_CONNECTION=mysql \ -e DB_DATABASE=firefly \ -e DB_USERNAME=fireflyuser \ -e DB_PASSWORD=xW9CoF8A666 \ fireflyiii/core:latest
执行
docker ps
以查看正在运行的容器。
-
初始化
Firefly III
的数据库进入容器的
shell
,并切换到Firefly III
所在目录。命令格式:
docker exec -it 容器名 bash
。例如我的:
docker exec -it zen_noether bash
可以看到,进入后就是Firefly III
项目根目录,在容器里的shell
中执行以下3条命令初始化数据库:
php artisan migrate:refresh --seed
php artisan firefly-iii:upgrade-database
php artisan passport:install
部分截图:
执行exit
返回终端。
此时可以访问服务器地址查看
http://服务器IP/
或
http://服务器IP/firefly-iii/
如图
结语
笔者刚接触Docker
,并不很了解Docker
。但了解到Docker容器
的启动顺序很重要:默认情况下Docker
会为每个容器分配一个172.17.0.x的IP地址(内网),先启动的容器先分配地址,因此容器启动顺序将影响其IP地址。
而本文中Firefly III
的启动命令包含了数据库主机地址(DB_HOST),这个写死的,读者可以尝试更改Firefly III
配置,使其连接宿主机的数据库或远程的数据库,而不必安装MySQL容器
,笔者也将学习Docker Networking
的知识,以便进行这方面的尝试。
Firefly III
教程的安装部分到这里便告一段落了,Firefly III
的教程的使用部分正在编写,敬请期待。
最后,原创不易,请规范转载。