距离写完《使用 Docker 和 Traefik 搭建 Flarum 轻论坛应用》已经过去了十个月。

在上一篇搭建教程中,我描述过这个应用的优劣势,因为缺乏开发者,所以时隔近一年的时间里,软件除了能够保持缓慢前行外,并没有实质的变化。国内相关社区同样因为缺少活力,依旧还在使用陈旧的迭代方案,短期来看,应该不会有太多惊喜出现,不过作为一款轻量社区来讲,flarum 是合格的。

本文将介绍如何使用 Docker 来对 Flarum 最新版 v0.1.0-beta.12 进行容器封装,以及如何搭配 traefik v2 一起使用。

写在前面

这篇“搭建RSS工具”文章的末尾,我提过:

之前写文章总是考虑没有阅读基础的同学,而忽略了一直订阅、关注着我的同学,未来重复的内容,我将会和本文一样,给予简短的指引,不赘述基础建设,只聊主题相关的核心部分。

为了保证内容的简洁,相关资料可以自行从网站历史资料找翻阅,学习这件事只有探索折腾才有意思,不是么?

使用环境

  • Docker: 19.03.8, build afacb8b
  • docker-compose: version 1.25.4, build 8d51620a
  • Flarum: v0.1.0-beta.12 (官方版本)
  • PHP: 7.4 (官方镜像)
  • MySQL: 5.7 (官方镜像)
  • Redis: 5.0.8 (官方镜像)

准备数据库

单机论坛可以考虑使用下面的编排文件,启动项目所需的数据库和缓存服务。

将上面的内容保存为 docker-compose.yml ,然后继续配置 .env 环境变量文件。

两个文件都准备好后,使用 docker-compose up -d,启动数据库和缓存服务即可。

为了让 flarum 支持搜索中文内容,全文检索以配置好,最小搜索长度为 2,如果有特殊需求可以修改 --ngram_token_size=2 为适合你的数值。

如果你不需要使用 Redis Session 功能,可以删除掉 Redis 相关内容。

获取当前版本最新代码

为了项目的可维护性,我们一般需要将应用和其依赖组件进行版本锁定。所以这里建议使用 composer 将代码下载下来后,作为“代码基”使用代码仓库单独管理保存,而非在容器中进行下载构建,这样对于每次软件变更都能做到心中有数。

和之前一样,我们使用下面的命令可以将 flarum 当前最新的 beta 版本下载到本地。

如果长时间不能完成下载,可以在命令行后添加 -vvv,可以辅助判断是因为什么问题导致下载出现异常。

如果是因为网络问题,可以考虑使用下面的方法,将 composer 源修改为阿里云或其他国内 CDN 地址(以阿里云为例):

修改完毕之后,可以使用下面的命令验证修改是否成功。

修改完毕之后,再次执行 create-project 命令即可。

如果是使用 flarum 做线上业务,此处可以考虑使用生产环境的私有 composer 搭配持续集成进行操作,安全性和可靠性会有极大的提升,细节可参考下面两篇文章:《搭建高性能的私有 Composer 镜像服务》《如何搭配 CI 系统使用 Composer》

准备好的 codebase 目录结构如下:

确认 codebase 目录内已经保存了完整的 flarum 程序后,我们开始编写容器镜像配置文件。

封装容器镜像

之前文章中,我使用了当时最新的 PHP 7.3.2,如今 PHP 7.4 已经到来,所以这里将使用最新版本的 PHP 封装 Flarum 的运行环境,我当前选择的版本是:php:7.4-fpm-alpine3.11

Dockerfile 文件内容可参考下面:

上面的配置文件主要做了几件事:

  1. 安装必须的环境依赖;
  2. 编译 PHP 相关插件;
  3. 设置 PHP FPM。

将内容保存为 Dockerfile 后,可以使用下面的命令构建我们所需要的镜像:

如果是在国内网络环境编译,可以使用下面的命令,加速编译构建过程。

准备好运行镜像后,我们就可以准备运行目录和容器编排配置文件了。

准备目录结构

我们提供给 flarum 使用的目录结构如下:

将之前准备好的 “CodeBase” 目录中的以下内容复制到 wwwroot 目录下:

  • extend.php
  • site.php
  • flarum
  • public

考虑到后续会安装/卸载 flarum 插件,这个工作可以交给启动脚本来做,至于启动脚本怎么编写,可以耐心继续往下看。

准备编排文件及 Nginx 配置

因为使用 FPM 模式的 PHP 环境,我们需要借助 Apache / Nginx 的帮助来提供 Web 服务,我这里选择 Nginx。

使用 Nginx,需要分别配置两个文件,先配置 conf/docker-nginx.conf

接着来配置 conf/vhost.conf 文件:

上面配置中的 server_name 需要改为你的目标站点名称。将两个配置文件保存好后,我们继续处理容器编排文件,完整的内容如下:

与之对应的 .env 配置内容:

同样使用 docker-compose up -d 启动服务,然后就能看到久违的安装界面了。

又见面了,熟悉的Flarum安装界面

参考上图和上面的 .env 配置,就能够完成 flarum 的安装了。

安装完毕

安装收尾

默认安装完毕之后,会在 wwwroot/config.php 路径生成配置文件:

为了更好的进行动态配置和代码集中管理,这里可以使用环境变量替换掉 hard code 的内容。

完成 config.php 文件的修改后,便可以将文件同样提交至代码仓库,进行保存管理。

另外,因为程序最初设计未考虑到容器环境,所以对于运行目录并没有单独进行设计,导致简单封装后,需要对目录进行权限调整;以及初次安装完毕后,从远端下载的前端资源文件,如果清理缓存后会导致界面不正常;以及前文提到的反复更新软件相关插件…

所以我们需要准备一个启动脚本:start.sh

支持中日韩文字搜索

其实更好的方案是使用 ELK 插件去做全文检索,但是其实使用 MySQL 开启全文检索,对于访问量不大的站点影响不大。

尤其是在几乎不需要付出额外的成本,使用的机器资源也相对较低的前提下。

随手写一个 PHP 脚本,执行下面两条命令,稍等片刻,flarum 就能够支持中文、日文的索引了。

卸载插件

为了提高可维护性,这里建议对不使用的插件进行卸载,以 flarum/auth-twitter` 和 `flarum/auth-facebook 为例,在 codebase 目录执行:

成功卸载插件,将看到下面的提示。

完成之后,记得重新执行上面的启动脚本,将程序源码做一次新的同步。

支持中文语言包

有一位网友(@csineneo)做的中文语言包,质量相对比较不错,和上面卸载无用插件类似,使用 composer 进行安装:

安装完毕之后,将看到类似日志。

同样的,需要在再次执行启动脚本,同步更新过的代码到flarum运行目录。

最后

除了搭建 Flarum 主体外,完成持续集成的环境也很重要,可以考虑使用之前这篇文章中的方案一个 Git Server,配置自动部署。

或许未来我会聊聊在十个月前,我们是如何对 Flarum 进行调整,使它适合用于多机环境的,以及如何打通微信扫码登录、如何使用更靠谱的附件上传…

至于什么时候写,或许得等到再有群友提问,能激发起我的兴趣的时候吧,:)

–EOF