Flarum是我用过的众多论坛程序里最有“现代感”的一个,轻量、优雅、扩展机制清晰,社区活跃度也一直在线。之前我在一台旧服务器上部署了它,用了大概两年多,数据和附件积累了不少,后来因为机房迁移和配置升级,不得不把整套环境搬到新机器上。当时就想着,与其手动装一遍PHP、Nginx、MySQL再慢慢调,不如直接走Docker,把构建、部署、迁移全部变成可复现的流程。这趟折腾下来,踩了一些坑,也总结出一套还算顺手的方案,今天把这套搭建加迁移的完整过程记录下来,给同样打算用Flarum建站、或者正在愁怎么搬家的人做个参考。
1. Flarum项目整体情况与Docker选型思路
1.1 Flarum本身是什么,它适合怎样的使用场景
Flarum是下一代论坛软件,国内用户喜欢叫它“流光论坛”,它的界面风格偏向Discourse那种现代扁平设计,但比Discourse轻得多。官方定位是“简洁、快速、响应式”,不追求大而全的功能堆砌,而是通过扩展机制来按需加功能。它基于PHP和MySQL/MariaDB,后端用了Laravel框架,前端是Mithril组件化的SPA架构,所以实际用起来会有一种很流畅的单页应用体验,切换版块、加载帖子的体感要比传统论坛舒服很多。
它的组织形式和传统论坛类似,有版块(Tags)、讨论帖(Discussions)、回复(Posts),但交互和权限设计更现代。适合的场景包括:技术社区、兴趣小组、企业内部交流平台、开源项目的用户论坛。如果你之前用过phpBB或Discuz,再来看Flarum,会觉得它是“现代化的那一种”。
我当初选它的原因主要有三个。第一,界面原生支持中文,不需要汉化包,而且对中文搜索的支持比很多轻量论坛好。第二,扩展机制非常成熟,从登录方式到SEO优化,从编辑器增强到数据统计,官方和社区都有大量现成插件。第三,它本身就推荐Composer来管理代码和扩展,这意味着整个站点可以用纯代码描述出来,配合Docker就能做到极致的可移植性。
1.2 为什么用Docker来跑Flarum,而不是直接在宿主机上装
很多人在接触Docker之前都会问一个问题:我直接apt install php-nginx mysql不就好了吗?为什么非要绕一层容器?我当时的答案是:因为你迟早要迁移、要升级、要重装系统,而Docker把这些都变成了“恢复备份再启动容器”这种简单的操作。
具体到Flarum这个项目,用Docker跑的优势非常明显。Flarum对运行环境不是没有要求,它需要PHP 8.1以上、需要pdo_mysql、gd、fileinfo、exif等一批扩展;需要Composer来管理核心代码和第三方扩展;需要Nginx或Apache做伪静态。如果你手动装,一套环境折腾下来少说也要一两个小时,而且不同Linux发行版的PHP包结构还有差异。而用Docker镜像,比如我用的flarum社区镜像,或自己基于php:8.1-fpm-alpine构建,这些依赖关系在镜像里就锁定了,宿主机只要装好Docker和Compose就行。
另外,Docker在迁移场景里更是把复杂度收敛了。旧服务器的数据库、附件、环境配置,迁移时只需要导出数据库、打包assets目录、把compose文件和nginx配置带过去,新服务器上执行两条命令就能恢复。这不只省时间,还减少了“手动装环境时漏了一个扩展导致论坛白屏”这类低级事故。
1.3 整体架构设计:哪些服务放进容器,哪些不放进容器
我的Flarum部署架构很简单,一共三个容器:Nginx负责HTTP服务和伪静态解析,PHP-FPM容器跑Flarum代码,MySQL容器存数据。另外加了一个Redis容器做缓存,以及一个Cron容器用来执行定时任务。
这里展开说说为什么这样拆。Nginx和PHP分离是PHP应用的标准做法,Flarum的请求流程是Nginx把PHP请求转发给FPM,PHP执行Laravel框架并访问MySQL,最终返回HTML或JSON。把Nginx单独放一个容器,方便独立改配置和调SSL证书。php-fpm容器单独放,是因为Flarum的PHP扩展要求比较特殊,装在一个容器里避免影响宿主机PHP版本。
MySQL用Docker跑有一个好处是数据目录用Volume挂载出来,备份时直接复制文件或者用mysqldump都能搞定。Redis在这里主要承担两件事:一是接管Flarum的缓存数据,二是给Session提供存储。Flarum官方支持Redis作为缓存驱动,配置好之后,页面响应速度会有明显提升。
Cron容器则是用来跑Flarum的定时任务的,这个很多人容易忽略。Flarum有些扩展依赖定时任务,比如邮件队列、搜索引擎索引更新。如果你不启动Cron,这些功能就会悄悄失效。
code复制容器服务结构:
- nginx(端口80/443,挂载站点目录与证书)
- php-fpm(运行Flarum代码与PHP扩展)
- mysql(数据持久化,挂载数据目录)
- redis(缓存与session)
- cron(定期任务)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker化部署Flarum的完整实操过程
2.1 准备目录结构与docker-compose配置
部署的第一步,我先在服务器上建好目录骨架。这个看起来不起眼,但目录结构设计得好,后面迁移和排查会省很多事。我的建议是按“应用名/服务名”来分,类似这样:
bash复制/data/flarum
├── compose.yaml
├── nginx/
│ ├── conf.d/
│ │ └── flarum.conf
│ └── ssl/ # 证书存放
├── php-fpm/
│ └── php.ini # 自定义PHP配置
├── app/ # Flarum代码
├── db/
│ └── data/ # MySQL数据卷
├── redis/
│ └── data/ # Redis持久化
└── backups/ # 备份输出目录
compose.yaml是整套Docker部署的核心文件。这里我选用了一个比较稳定的镜像组合:PHP用php:8.1-fpm-alpine作为基础镜像,Flarum代码通过Composer安装在app目录里。Nginx直接用官方镜像,MySQL用mysql:8.0,Redis用redis:7-alpine。
yaml复制services:
nginx:
image: nginx:1.27-alpine
container_name: flarum-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./app:/var/www/flarum:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
