!Warning
Flarum已发布正式版,本文档已经更新至正式版本,请移步:2021年版
折腾完又到了写文档的时候……啊,我不想写文档(但还是要写不然下次就忘掉了)。
事情的起因是因为 LOFTER 死了(死得好,混账LOFTER把我家被吞的两千TAG还给我!),虽然 LOFTER 不值得,但是我圈老师们还是值得的,本着自力更生艰苦奋斗才是唯一的出路的原则,球都不会的我纯靠求爷爷告奶奶请广大程序媛朋友救命东一榔头西一棒子搞完了。
我这种球都不会的废物都能搞成,说明当站长也没有那么难,有心思给自家圈子盖房子的朋友们可以参考这篇文章搞搞看看,这种事情就是一路踩坑,踩坑踩多了就懂了(不是)。
当然最好还有个出了事可以求爷爷告奶奶的攻城狮朋友,不管她是Web攻城狮还是架构攻城狮,总之有她在你就可以随便作。
首先要明确:作为一个同人站,应该有什么样的基本功能?
除此以外的其他功能我感觉都不太重要……当然,作为站长还要考虑一些别的要素:
面对这种需求,有两种类型的框架可以选择。
一种是老古董,比如:
老古董的意思就是在现在二十岁以上的人眼里,这些框架跟他们的网络冲浪历史几乎是重叠的。特别是我们同人女,啊,早年谁的浏览器书签里没有几个 Discuz 框架的论坛,随缘居,是吧,纵横道,是吧……当然现在说起来都是时代的眼泪了,36大院都倒了。
这些老古董框架的优点是久经沙场,承受住了十几年互联网各种硬件软件变化的考验,稳定,十分稳定。而且因为久经沙场,所以教程啊各种问题怎么解决啊都很齐全,中文文档满地都是,几乎没有解决不了的问题。球都不懂的站长从零开始安装运行完全没有问题。
如果你圈人特别多,巨多,比如要建成随缘那种大站,对稳定有超绝严格的要求,然后你对自己折腾的能力也没什么信心,还是可以考虑这种老古董框架的。
至少,各家还在运行的、以及新开的论坛,据我观察,一半以上都还是 Discuz。包括云²论坛啊,直的第十区啊,300 啊,都用的是 Discuz X3.4 的框架,确实很稳定。我一开始也选的 Discuz。
但这些老古董框架的缺点也非常单纯:丑,功能不全。
你不要指望 Web 时代过来的产品有多好看……
而功能不全主要体现在它的分类逻辑依然停留在一个萝卜一个坑的分类逻辑上,不适应一个帖子对应多个属性的 Tag 式分类逻辑,非常难用,虽然版块内部可以通过分类检索,但是同样一篇文章只能归属于唯一的分类。当然其他功能是基本不具备的,不过注册审核的功能倒是集成得很好,大概是久经沙场适应各种使用场景的积累。
当然另一个缺点更要命一点:手机访问极端不友好,功能几乎是残废的。
这点 Discuz 比 PHPwind 更残疾,手机访问的时候看不到版内的标签,对综合论坛来说是个巨大的硬伤。PHPwind 倒是做了相应的移动端适配,但就是丑,没别的。丑是原罪。另外这类框架随着时间的发展更新换代,代码越来越臃肿越来越臃肿,你想魔改都没地方下手。
而且好多奇奇怪怪的适应当年论坛的功能已经过时了,比如 Discuz 集成的家园、空间、好友这些重功能都没有必要,从同人站的角度来说并不需要那么臃肿的功能。
如果你是一个新站长,我非常不建议从老古董框架开始……因为未来三五年内肯定没法忍受它的功能残疾,到时候已经积累了一定的数据量再来换框架风险会更大,早换数据量小真有一两个错误还能手动修改,数据量大了都不知道上哪儿查迁数据的时候什么地方出了岔子,从数据安全的角度来说,很麻烦。
那么新一代搭论坛都可以用什么轮子呢?
基本上我考察了一圈感觉比较有戏的就这三个轻论坛框架:
首先它们共同的优点是都对移动端友好,手机浏览器自适应做得很好,看上去怎么都比较像人类写的东西。当然前端好看程度和丝滑程度略有差别,但都比老古董们强。
下面分述一下这三个框架的优缺点:
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 要求的环境:
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 以及它的扩展开始。
执行:
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 的官方下载指引,依次执行:
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
执行:
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
根据自己的需要选择 yes
或 no
,设置完成后登录检查。执行:
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 账号的密码,最好抄到一个你三五年后都还能查到的地方,你换电脑换手机都能找到的那种地方,以防将来有什么需要迁移数据的事情结果你把数据库密码忘记了……那就不知道该上哪里哭了……
执行:
sudo apt install -y nginx
检查安装。执行:
nginx -v
如果安装成功,应返回:
nginx version: nginx/1.14.0 (Ubuntu)
配置 Nginx 的事情我们等安装完 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
这次应该就没问题了。
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
找到 root
和 server_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 核心代码,如非必要,不建议这么做。
修改 /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);
修改 /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
修改 /vendor/flarum/core/src/Api/Controller/ShowUserController.php
的 52 行,将 getIdForUsername($id)
替换为 getIdForUsername(urldecode($id))
。
保存退出后,在 Flarum 目录下执行:
php flarum cache:clear
这是一个用于设置以邀请码方式注册的插件,如果论坛非完全公开或完全关闭的论坛,需要进行人工审核,需要安装。
项目地址:Doorman By ReFlar
安装 / Installation
composer require reflar/doorman
安装完后在后台插件(Extension)
项目下开启。
这是一个用于在后台页面中显示用户列表并集成发邮件功能(需要配置 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)
项目下把默认语言修改为简体中文
。
参考:
你好呀!我在深圳湾实验室研发PET,刚刚转行,看了你的安装攻略特别受益,可可爱爱的 可以交个朋友吗
@zhao 草,但我代码写的真的很烂……(也不怎么写)
您太强了……初级cs人打算试试看,十分感谢分享!