Flarum|从零开始的同人女赛博营地盖房指南

aka 教你手把手给你 CP 搭一个现代化的论坛,给各位同人女站长以及有心当站长的同志参考

Flarum|从零开始的同人女赛博营地盖房指南

!Warning
Flarum已发布正式版,本文档已经更新至正式版本,请移步:2021年版

折腾完又到了写文档的时候……啊,我不想写文档(但还是要写不然下次就忘掉了)。

一些说明(纯叨逼叨,可跳过)

事情的起因是因为 LOFTER 死了(死得好,混账LOFTER把我家被吞的两千TAG还给我!),虽然 LOFTER 不值得,但是我圈老师们还是值得的,本着自力更生艰苦奋斗才是唯一的出路的原则,球都不会的我纯靠求爷爷告奶奶请广大程序媛朋友救命东一榔头西一棒子搞完了。

我这种球都不会的废物都能搞成,说明当站长也没有那么难,有心思给自家圈子盖房子的朋友们可以参考这篇文章搞搞看看,这种事情就是一路踩坑,踩坑踩多了就懂了(不是)。

注意:本篇适合想开个新站的站长观看,如果你是一个 Discuz 框架的老站长,需求是更换一个更现代化的框架,在安装框架以外你可能需要迁移数据,这部分内容之后慕鹅搞完后会出个文档,届时请移步参考。

一个站长需要具备的基本条件

  • 有租服务器和域名的钱——根据我这一个月的折腾,服务器在大陆境内的网站,个人身份已经不允许备案交互式网站了,所以你的服务器最好搞到香港或者北美去。(虽然北美有另一个风险就是搞不好哪天美帝发个疯把中国的访问墙了咱就傻了……)
  • 知道网页运作起来是有前端和后端两个东西的,交互展示等等是一块,数据库是另一块。
  • 会敲命令行。会谷歌搜索。最好没有英文阅读障碍。
  • 有好记性不如烂笔头的好习惯。——非常重要,因为搞不好两三个星期后你就忘了你数据库密码了

当然最好还有个出了事可以求爷爷告奶奶的攻城狮朋友,不管她是Web攻城狮还是架构攻城狮,总之有她在你就可以随便作。

在这年头有点搞头的论坛框架考察

首先要明确:作为一个同人站,应该有什么样的基本功能?

  • 发帖功能(理所当然),发帖最好还有一个比较简单好用的排版方式
  • 分版块设置浏览权限
  • 多 Tag/分类功能(因为会有一篇文里不止一对儿的情况)
  • 单独的 Tag/分类的分区页面(方便查找单独某一对儿)
  • 关注功能,不管是关注用户还是关注 Tag
  • (根据论坛性质决定是否必须)以限制方式进行注册(如邀请码注册、验证问题注册、人工审核注册)
  • (非必须)点赞功能,或类似的以更低的成本(不需要发表回复)表达态度的功能
  • (非必须)屏蔽 Tag —— Tag 检索的进阶,如果分类分得好靠标题标注自主规避也行
  • (非必须)屏蔽用户——关注功能的进阶,没有就得靠自主规避

除此以外的其他功能我感觉都不太重要……当然,作为站长还要考虑一些别的要素:

  • 框架的易用性——好不好装,以及遇到问题好不好找解决办法(后者视乎站长本人水平高低,如果你已经是靠写代码吃饭的人了,选择你熟悉的语言写的东西也许会更上手)
  • 框架与自己服务器的兼容性——比如吃不吃内存,自己服务器内存可能不太够
  • 框架的稳定性和加载速度——决定了站子的使用体验
  • 框架的扩展性——决定了当有新的需求时能否通过扩展方式满足
  • 数据库稳定性——决定了站子的安全性,作为快乐老家的站子数据是绝对不能丢失的
  • 前端流畅性与美观性——决定了你要不要自己从头写一套前端(……)
  • Tag 是站长自行设置还是用户自主添加——前者有利于集中分类(不会有同一个 CP 因为叫法不同打了两个 CP 无法集中检索的情况);后者不会有某 CP 不在现有分类中的尴尬,采用哪种看站长的想法

面对这种需求,有两种类型的框架可以选择。

一种是老古董,比如:

  • Discuz
  • PHPwind

老古董的意思就是在现在二十岁以上的人眼里,这些框架跟他们的网络冲浪历史几乎是重叠的。特别是我们同人女,啊,早年谁的浏览器书签里没有几个 Discuz 框架的论坛,随缘居,是吧,纵横道,是吧……当然现在说起来都是时代的眼泪了,36大院都倒了。

这些老古董框架的优点是久经沙场,承受住了十几年互联网各种硬件软件变化的考验,稳定,十分稳定。而且因为久经沙场,所以教程啊各种问题怎么解决啊都很齐全,中文文档满地都是,几乎没有解决不了的问题。球都不懂的站长从零开始安装运行完全没有问题。

如果你圈人特别多,巨多,比如要建成随缘那种大站,对稳定有超绝严格的要求,然后你对自己折腾的能力也没什么信心,还是可以考虑这种老古董框架的。

至少,各家还在运行的、以及新开的论坛,据我观察,一半以上都还是 Discuz。包括云²论坛啊,直的第十区啊,300 啊,都用的是 Discuz X3.4 的框架,确实很稳定。我一开始也选的 Discuz。

但这些老古董框架的缺点也非常单纯:丑,功能不全。

你不要指望 Web 时代过来的产品有多好看……

而功能不全主要体现在它的分类逻辑依然停留在一个萝卜一个坑的分类逻辑上,不适应一个帖子对应多个属性的 Tag 式分类逻辑,非常难用,虽然版块内部可以通过分类检索,但是同样一篇文章只能归属于唯一的分类。当然其他功能是基本不具备的,不过注册审核的功能倒是集成得很好,大概是久经沙场适应各种使用场景的积累。

当然另一个缺点更要命一点:手机访问极端不友好,功能几乎是残废的

这点 Discuz 比 PHPwind 更残疾,手机访问的时候看不到版内的标签,对综合论坛来说是个巨大的硬伤。PHPwind 倒是做了相应的移动端适配,但就是丑,没别的。丑是原罪。另外这类框架随着时间的发展更新换代,代码越来越臃肿越来越臃肿,你想魔改都没地方下手。

而且好多奇奇怪怪的适应当年论坛的功能已经过时了,比如 Discuz 集成的家园、空间、好友这些重功能都没有必要,从同人站的角度来说并不需要那么臃肿的功能。

如果你是一个新站长,我非常不建议从老古董框架开始……因为未来三五年内肯定没法忍受它的功能残疾,到时候已经积累了一定的数据量再来换框架风险会更大,早换数据量小真有一两个错误还能手动修改,数据量大了都不知道上哪儿查迁数据的时候什么地方出了岔子,从数据安全的角度来说,很麻烦。

那么新一代搭论坛都可以用什么轮子呢?

基本上我考察了一圈感觉比较有戏的就这三个轻论坛框架:

  • discourse,基于 Ruby
  • nodeBB,基于 nodejs
  • Flarum(现在最新更新到 beta 13 版,也就是还没有推出正式发行版),基于 PHP

首先它们共同的优点是都对移动端友好,手机浏览器自适应做得很好,看上去怎么都比较像人类写的东西。当然前端好看程度和丝滑程度略有差别,但都比老古董们强。

下面分述一下这三个框架的优缺点:

discourse,啥都很好,我已经看到有站长用这个框架了。可以验证问题注册,原生框架是一级分类(版块)加上标签系统的模式,标签似乎是由用户自己添加,没有二级版块。标签屏蔽功能可以实现,但实现是原生自带还是通过扩展我没试过,前端界面挺干净的,有兴趣的话可以深入了解一下,我记得 Atom 编辑器的论坛就是用的它,还挺好看。

缺点是后端比较臃肿,吃性能,服务器内存要求 2G 起,不然可能运行的时候会崩——但是我自己服务器总共就 2G 内存所以……

框架基于 Ruby ,中文文档没多少,出了问题可能比较难找到解决方案,要自力更生解决。扩展性似乎比较一般。

数据库不知道用的啥。

nodeBB,我差点就用它了,因为我自己写 CSS 没问题,但是 PHP 和 Ruby 我是真的都不熟,基于nodejs还是很适合我的。中文文档也还算比较齐全——虽然他们中文社区站长已经含泪跑路了,但好像还有 QQ 群(?)存活,出了问题找人问还是有地方问的。采用一级版块——二级版块——自由标签的模式进行分类,标签由用户自行添加。验证问题注册、屏蔽标签都可以通过插件实现。

它甚至还可以建立群组聊天……但我没试过这个功能。

缺点就是前端真是丑,我就很疑惑,你一个 nodejs 开发的框架,怎么都是前端人写的吧,怎么能丑成这样!这个配色这个 icon 样式太令人无语了!不过如果你也是一个前端人,可以自己魔改他们的模板,这个模板的 html 语法是他们魔改过的,基本上是套娃式引入别的模块,模板代码写得巨难看,找得很晕,不过看还是能看的,就是要耐心。

另外似乎也没有比较好用的 API 手册?要从默认模板上找对应的 API。

另一个更严肃一点的问题是安装,在大陆服务器上测试以及在本地计算机上测试的时候 npm 卡死了跑不动,而且每次卡住的 package 还不一样,明明已经换成了国内的源了,就很疑惑,不知道是哪里出了问题。测试服务器已经试过了 CentOS 和 Ubuntu 18.04,问题都很大,折腾了一天没成。如果你的服务器机房在境外的话,可以试一试,也许问题能少一点儿。

数据库用的 mongoDB 或者 Redis ,推荐操作系统是 Ubuntu 18.04。

Flarum,哎,结果我最终还是选了它……

esoTalk 和 FluxBB 的继任者,优点是好看,对,就特别好看,明明是 PHP 写的结果前端是三个里头最好看的。分类逻辑是一级节点——二级节点加上自由标签的模式,不过标签都需要管理员手动设定。权限设定可以根据用户组也可以根据标签,一个账户所属的用户组可以不止一个,不同用户组可以有不同权限,不过我很好奇权限冲突的时候它是怎么处理的,暂时还没去研究,因为我没那么多用户组。

暂时没有屏蔽功能,关注也只能关注单个帖子,将来也许会有人写插件,但目前做不到。

限制注册目前只能通过插件实现邀请码注册,我自己的需求本来是人工审核注册的,现在看来只能用替代方案来限制注册了:通过邮件申请发放邀请码。

另一个优点是中文社区蛮活跃的,包括中文分支也有在更新。

然后安装比较省心,用的是 PHP 的包管理安装(Composer),没遇到什么问题。

缺点是还在 beta 版本,不太稳定,都四五年了还在 beta ,可见开发团队非常龟毛(不是)也不知道啥时候能放出发行版(应该快了,都 beta 13 了!)。还在 beta 也就意味着每一次更新迭代你的插件可能都会失效,需要等待插件作者进行维护。

另一个缺点是原生系统用户名仅允许英文注册,这点可以通过更改核心代码支持,但也意味着以后每一次升级这个修改都会被覆盖,需要你重新修改。

这三个框架一个共同特点是由于都是外国的框架,所以中文搜索非常拉胯,基本不要指望中文搜索……有一些可以通过扩展的方式提升中文搜索准确度(比如 Flarum),但建议大家还是不要太指望搜索功能比较好,标签检索应该成为主要的检索方式。

看完上面那段你应该对自己要用什么框架心里有数了,总之基于种种需求我最终是选择了 Flarum,下面就直接讲怎么安装以及怎么配置 Nginx 吧。

Flarum beta 13 安装

先说一下我的服务器配置,仅供参考:

  • 2G 内存
  • Ubuntu 18.04 操作系统
  • Nginx 服务器

环境配置

Flarum 要求的环境:

  • PHP 7.1 以上版本,需开启 PHP 扩展:fileinfo, curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, exif, zip
  • 支持 SSH 并可以运行 Composer
  • MySQL 5.6 以上版本,或 MariaDB 10.0.5 以上版本(本文以 MySQL 为示范)
  • 支持重写 mod_rewrite 的 Apache,或 Nginx(本文以 Nginx 为示范)

注意:请在普通用户下进行安装。在 root 用户下进行安装是有风险的行为。

如果你的终端前缀是 root@xxxx,那么你正在 root 用户下。

如果你正在 root 用户下,请依次执行下面的命令新建一个用户:

adduser username --gecos "New User"
usermod -aG sudo username
su - username

上面的 username 替换为你自己的用户名,New User 随便写(不是)。

执行完 su 以后你应该就在普通用户下了。

安装 PHP 7.2 及其扩展

截止目前,PHP 最高版本是 7.2,所以就先从 PHP 7.2 以及它的扩展开始。

执行:

sudo apt install -y php7.2 php7.2-cli php7.2-fpm php7.2-common php7.2-curl php7.2-xml php7.2-gd php7.2-json php7.2-mysql php7.2-mbstring php7.2-zip

开启 PHP openssl 扩展,依次执行:

sudo apt install openssl
sudo apt install libcurl4-openssl-dev
sudo apt install libssl-dev

查看 PHP 版本,执行:

php --version

安装好了的话,应该返回:

PHP 7.2.24-0ubuntu0.18.04.6 (cli) (built: May 26 2020 13:09:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.24-0ubuntu0.18.04.6, Copyright (c) 1999-2018, by Zend Technologies

安装 Composer

直接按照 Composer 的官方下载指引,依次执行:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '8a6138e2a05a8c28539c9f0fb361159823655d7ad2deecb371b04a83966c61223adc522b0189079e3e9e277cd72b8897') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

因为源在境外,所以拉取的时候可能会有点慢,请耐心等待。

下载完毕后,配置 Composer,执行:

sudo mv composer.phar /usr/local/bin/composer

检查安装。执行:

composer --version

如果成功安装,应返回:

Composer version 1.10.10 2020-08-03 11:35:19

安装 MySQL

执行:

sudo apt install -y mysql-server

检查安装。执行:

mysql --version

如果安装成功,应返回:

mysql  Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using  EditLine wrapper

进行一些安全配置,执行:

sudo mysql_secure_installation

根据自己的需要选择 yesno,设置完成后登录检查。执行:

sudo mysql -u root -p

键入你刚才设置的密码,就进了 MySQL 的命令行界面。

新建一个数据库用于存放论坛数据,依次执行:

mysql> CREATE DATABASE dbname;
mysql> GRANT ALL ON dbname.* TO 'username' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
mysql> quit

其中 dbname 替换为你的数据库名称,username 替换为你的数据库用户名,password 替换为你的数据库密码。

注意:这里的设置,包括上面你的 MySQL root 账号的密码,最好抄到一个你三五年后都还能查到的地方,你换电脑换手机都能找到的那种地方,以防将来有什么需要迁移数据的事情结果你把数据库密码忘记了……那就不知道该上哪里哭了……

安装 Nginx

执行:

sudo apt install -y nginx

检查安装。执行:

nginx -v

如果安装成功,应返回:

nginx version: nginx/1.14.0 (Ubuntu)

配置 Nginx 的事情我们等安装完 Flarum 后再说,先放着。

安装 Flarum

然后就到了真正的安装步骤了,这部分倒是不怎么出问题,因为是直接 Composer 拉取下来安装的。

新建一个文件夹安放你的网站:

sudo mkdir -p /var/www/flarum

给这个文件夹赋予当前用户读写文件夹的权限:

sudo chown -R username:username /var/www/flarum

这个 username 就是你现在所在的 Ubuntu 系统下的用户名。

赋予当前用户权限后,到这个文件夹里去:

cd /var/www/flarum

如果你的服务器在中国大陆境内,可能会因为 Composer 的源在国外而拉取速度感人,这种情况的朋友可以把 Composer 的源更换为国内镜像(此处为阿里云镜像):

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

如果服务器机房在境外,请忽略此步(因为说不定会变得更慢)。

在线安装 Flarum,执行:

composer create-project flarum/flarum . --stability=beta

中间可能会出现这种报错:

[Error Exception]
proc_open(): fork failed - Cannot allocate memory

这是内存炸了,可以通过增加虚拟内存解决。

依次执行:

free -m
sudo dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo mkswap /var/swap.1
sudo swapon /var/swap.1

完了以后再重新执行:

composer create-project flarum/flarum . --stability=beta

这次应该就没问题了。

配置 Nginx

Flarum 安装好后,需要配置 Nginx 让它能够访问。这部分的详细解说直接去看鼠师傅的文章《配置flarum: 一次 php & nginx 踩坑录》,这里只说操作。

如果你还没有装文本编辑器……算了装一个吧,编辑器很多种,我最爱用的还是 vim。

sudo apt install -y vim

有编辑器的跳过这步。

vim 打开以后,保持英文输入状态,按 i 进入编辑模式,按esc 退出编辑模式,按顺序输入:wq 保存并退出,其他的命令大家自己去搜吧网上一搜一大把。

修改 /etc/nginx/sites-available/default

sudo vim /etc/nginx/sites-available/default

找到 rootserver_name 对应的两行,把这部分更改为

root /var/www/flarum/public;
server_name 你的公网IP;

并加入以下内容:

include /var/www/flarum/.nginx.conf;
location  ~* \.php$ {
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_index index.php;
                    include /etc/nginx/fastcgi.conf;
                    }

其中,/var/www/flarum 的部分,如果你的 Flarum 安装在别的目录下,则改为你的安装目录。

修改 /etc/php/7.2/fpm/php-fpm.conf,执行:

sudo vim /etc/php/7.2/fpm/php-fpm.conf

找到监听 listen 对应的行,修改为:

listen = 127.0.0.1:9000

重启 Nginx,执行:

sudo nginx -t
sudo systemctl reload nginx.service

然后访问你的公网域名,应该就能见到 Flarum 的安装界面啦。

赋予目录读写权限

第一次进到安装页面,可能会见到两三个说该目录缺少读写权限的。

请只赋予 Flarum 向导中指明的需要的文件夹读写权限,以保证数据安全,更改读写权限,执行命令:

sudo chown -R www-data:www-data 请求权限的文件夹名/.

一般而言,只要保证 /var/www/flarum/public/var/www/flarum/storage 两个文件夹有权限就可以了。(如果你的 Flarum 安装在别的目录下,则改为你的安装目录。)

设置数据库

这步就把你前面数据库设置的时候抄下来的数据库信息填进去就好了。

然后管理员用户名现在不能采用中文,不过后面可以自己做修改,先填上自己的用户名(英文)和密码和邮箱。

然后就安装完成啦!

允许中文用户名的修改

注意:这一步需要修改 Flarum 核心代码,如非必要,不建议这么做。

允许注册 CJK 用户名

修改 /vendor/flarum/core/src/User/UserValidator.php 的第47行,将'regex:/^[a-z0-9_-]+$/i' 替换为以下三种方式之一:

// 1. CJK基础上,不允许全数字用户名出现,防止个人主页报错。
'regex:/^[-_a-zA-Z0-9\x7f-\xff]*[-_a-zA-Z\x7f-\xff][-_a-zA-Z0-9\x7f-\xff]*$/i',

// 2. CJK基础上,允许全数字用户名
'regex:/^[-_a-zA-Z0-9\x7f-\xff]+$/i',

// 3. Unicode 用户名
'alpha_dash' 

修改 /vendor/flarum/core/src/Forum/Auth/Registration.php 的 101 行,注释掉 $username = preg_replace('/[^a-z0-9-_]/i', '', $username);

允许 @CJK 用户名

修改 /vendor/flarum/mentions/src/ConfigureMentions.php 的 53 行,将 configureUserMentions 函数中 $config->Preg->match 的正则表达式 /\B@(?<username>[a-z0-9_-]+)(?!#)/i 改为:

/\B@(?<username>[\p{L}\p{N}_-]+)(?!#)/ui

修改同文件的 91 行左右,将 configurePostMentions 函数中 $config->Preg->match 的正则表达式 /\B@(?<username>[a-z0-9_-]+)#(?<id>\d+)/i 改为:

/\B@(?<username>[\p{L}\p{N}_-]+)#(?<id>\d+)/ui

增加 API URL CJK 编码转换支持

修改 /vendor/flarum/core/src/Api/Controller/ShowUserController.php 的 52 行,将 getIdForUsername($id) 替换为 getIdForUsername(urldecode($id))

清除缓存

保存退出后,在 Flarum 目录下执行:

php flarum cache:clear

插件 & 简体中文语言包安装

注意:由于 Flarum 尚在 beta 版阶段,下列插件很可能在框架升级后不再被新版 Flarum 兼容,安装前请一定确认你自己的 Flarum 版本、并到 Flarum 社区论坛确认插件是否兼容当前版本。

Doorman

这是一个用于设置以邀请码方式注册的插件,如果论坛非完全公开或完全关闭的论坛,需要进行人工审核,需要安装。

项目地址:Doorman By ReFlar

安装 / Installation

composer require reflar/doorman

安装完后在后台插件(Extension)项目下开启。

User List

这是一个用于在后台页面中显示用户列表并集成发邮件功能(需要配置 STMP 或其他邮件方式)的插件。

项目地址:VeroZ1 / users-list

安装 / Installation

composer require veroz1/users-list

升级 / Updating

composer update veroz1/users-list
php flarum cache:clear

安装完后在后台插件(Extension)项目下开启。

简体中文语言包

项目地址:Simplified Chinese Language Pack / 简体中文语言包

安装、升级 / Installation, Update

composer require littlegolden/flarum-lang-simplified-chinese

卸载 / Remove

composer remove littlegolden/flarum-lang-simplified-chinese

清理缓存 / Cache Clear

php flarum cache:clear

安装完后在后台插件(Extension)项目下开启。

可以去后台常规(Basics)项目下把默认语言修改为简体中文


参考:

- End -
理工
花式折腾 来点干货 论坛框架 Flarum
6,215字 3,433次阅读
Comments
Write a Comment
  • zhao reply

    你好呀!我在深圳湾实验室研发PET,刚刚转行,看了你的安装攻略特别受益,可可爱爱的 可以交个朋友吗

    • @zhao 草,但我代码写的真的很烂……(也不怎么写)

  • kor reply

    您太强了……初级cs人打算试试看,十分感谢分享!