文/杜佳骏 蔡荣 吴芳
上世纪末至本世纪初,互联网在高校普及,水木清华站、北大未名站、饮水思源站、日月光华站等高校BBS论坛,成为当时师生获取信息和交流思想的重要渠道。然而,随着移动互联网和社交网络的快速发展,传统的Firebird BBS系统逐步退出历史舞台,高校线上社区功能已逐渐被即时通讯软件或其他社交平台所替代。
2019年4月,上海交通大学基于开源的Discourse论坛系统构建了新的校内论坛——水源社区。三年来,水源社区在促进校内信息交流、推动学校科学治理等方面发挥了巨大作用,成为校园网络文化建设的重要阵地。特别是2022年3月9日以来,上海交通大学因疫情防控要求进入封闭管理状态,水源社区为广大师生提供了高效的信息交流渠道,平均每日活跃用户过万人,在实现校内师生互助、消除信息更新不及时、缓解学生焦虑等方面发挥了至关重要的作用,成为学校师生的精神家园。
本文将重点介绍Discourse论坛系统的特点、选择的原因、安装与维护的细节,以及水源社区的运营经验。
如图1所示,Discourse是开源的新一代论坛框架,其部署门槛低、界面优雅可定制、移动端体验友好、插件丰富、管理方便,与传统的论坛软件相比,有了明显进步,具体从以下六个方面进行说明:
图1 GitHub上的Discourse开源项目
1.在技术架构方面,Discourse为前后端分离的Web架构。在技术选型上,前端使用Ember.js框架,后端API使用了Ruby on Rails框架,使用PostgreSQL数据库和Redis缓存,使用Sidekiq作为后台作业系统。
2.在用户界面方面,Discourse对桌面端和移动端浏览器均进行了适配,并且支持用户自定义主题。虽然没有开发原生Android和iOS客户端,但支持PWA(渐进式Web App),用户在手机浏览器上即可感受到类似App的沉浸式体验。
3.在内容编辑方面,Discourse支持Markdown、HTML代码和Emoji表情,不仅能上传图片、视频、文档等各类文件,还可通过插件支持LaTeX代码,允许用户进行学术讨论。Discourse同时支持Wiki模式,允许用户协同编辑创作。
4.在二次开发方面,Discourse提供了完备的API接口并支持WebHook,可以较为简单地部署相应监测、自动化服务等功能。Discourse利用Rails的插件体系结构进行功能插件的开发,可新增或者覆盖原有代码,快速对接学校SSO实现一键登录。
5.在内容分类方面,Discourse采用扁平化的分类模式,避免过深层级带来的阅读困难和上下文信息分割,同时提供标签,与板块形成二维分类模式。可以针对板块分类做出不同设定,设置发帖和审核要求,并且为不同板块分配不同的审核站务。Discourse支持用户特别关注或者屏蔽任何板块、标签和用户。
6.在内容管理方面,Discourse提供了系统管理员、站务、用户等不同角色。用户能够及时通过举报机制反馈问题;站务能够审核用户的内容并且做出隐藏、删除、封号等不同响应操作;系统管理员在站务权限基础上,允许管理论坛的各项配置。
1. 为什么不选微信?
微信是实时聊天软件,群聊内容很容易被淹没,不方便长期存留。朋友圈则是建立在好友关系上,消息分散且受众有限。公众号存在操作门槛高、发布次数受限、仅能由所有者主动发布、评论区难以相互讨论等问题。
2. 为什么不选云文档?
金山文档、腾讯文档均提供共享文档,允许多用户查看和协同编辑,但云文档用户权限划分较粗,很难判定信息的发布者,内容还可能被用户恶意修改。此外,云文档由商业公司维护,学校缺乏监管手段。
3. 为什么不选Discuz?
Discuz也是比较优秀的社区论坛系统,但其界面老旧,移动端显示效果不佳,无法满足广大师生随时随地进行便捷信息交流的需求。
Discourse提供了Docker镜像和易用的安装维护脚本,降低了安装和运维门槛。
水源社区目前运行在上海交通大学网络信息中心提供的jCloud私有云服务器上,其配置为32核64G内存和1.3T高性能云盘,并可根据需要进行垂直扩展,甚至在未来单机性能达到极限时,将服务进行水平横向扩展。虽然目前尚未使用对象存储服务(OSS),但已计划未来将用户上传文件转入OSS。由于安装与更新会自动从代码仓库下载依赖和代码,因此服务器需保障能够畅通访问Docker Hub、GitHub、NPM、Ruby Gems等服务。
登录服务器,将Discourse维护仓库(https://github.com/discourse/discourse_docker)克隆到本地工作目录(下面例子将以/var/discourse作为工作目录进行演示)。然后切换到选择的工作目录中,运行./discourse-setup 进行初始化,按命令行提示对应操作,结束后会在./containers/目录下生成App.yml 文件。可直接使用这个默认配置文件,也可根据需要再编辑自定义调整。执行./launcher rebuild App即可开始全自动部署论坛,具体分为以下环节(仅介绍过程,实际无需人工操作):
1. 更新/var/discourse路径的discourse_docker代码;
2. 拉取官方提前构建好的镜像(会访问Docker Hub),该镜像包含软件依赖但不包含代码;
3. 下载最新的Discourse代码和插件代码(会访问GitHub);
4. 下载后端(会访问Ruby Gems仓库)和前端(会访问NPM仓库)的依赖,更新已安装的主题(会访问GitHub);
5. 本地构建前端的生产版代码;
6. 本地数据库版本迁移;
7. 生成本地的Docker镜像;
8. 使用步骤7中构建好的镜像加上读取containers/App.yml中的运行参数启动论坛容器应用。
此后若需要更新Discourse版本,可以重新执行./launcher rebuild App,自动生成新的镜像和容器,而数据不会丢失。
Discourse官方论坛为https://meta.discourse.org,可在官方论坛中获取更多支持及来自全球开发团队和其他运营者的经验。为方便升级以及解决兼容性问题,水源社区不对Discourse代码本身做任何修改,而是采用其提供的插件接口开发需要的功能。相关插件代码均托管在代码平台上,并按照普通插件安装的方式进行维护。
水源社区由上海交通大学网信办指导运营、学校师生团队提供技术支持;并由在校学生组成站务委员会实施管理,充分调动社区活跃用户,以推动论坛自治和健康发展。水源社区首页如图2所示,具体运营经验如下:
图2 水源社区首页
1.在用户管理方面,水源社区仅能通过学校统一身份认证jAccount登录,且所有用户均已完成实名制认证。水源社区站务委员会成员拥有站务权限,站务委员会制定水源社区管理规范,在标准清晰、责任明确的情况下审核社区内容和用户行为,站务委员会成员上岗前均被要求学习国家互联网相关规定。社区所有用户均可主动举报不当内容,并由站务委员会及时处理。
2.在内容分类方面,水源社区采取精简分类的设计思路。目前,一级板块数量为14个,二级板块若干,并可通过帖子标签进行二维分类。对愿意入驻的职能部门和学生团体,为其单独开设二级分类。入驻社区的部分学生团体还可承包运营部分兴趣类板块。水源社区主动开设了独立的广告板块,避免渗透非广告板块,用户也可自行选择是否屏蔽广告板块。社区内的活跃用户有权限调整错误分类的主题帖。
3.在用户教程方面,水源社区号召活跃用户撰写了水源教程,包括论坛介绍、使用说明等各个方面。新用户教程还介绍了水源社区的基本情况、帖子编辑方法等,教程内容在新用户主页置顶,供新用户学习参考,方便其更快地融入社区。
4.在处理矛盾方面,水源社区引导用户形成共识,鼓励活跃用户自治。社区建议观点不同、容易引发矛盾的用户之间,主动采用黑名单机制避免继续争吵。在争吵激烈的帖子中,可以启用慢速模式,让每位用户在一定时间之内只能发言一次,限制用户发言频率。
5.在活跃用户方面,水源社区积极组织各种线上线下活动,通过派发虚拟徽章、社区IP实物、其他各类奖品等方式,鼓励用户参与活动。为鼓励优质内容发布,提升社区内容质量,水源社区还创建了精品内容板块,用以统一整理用户创作的精品内容,并为创作精品内容的用户颁发可以外显的“精品作者”徽章,进行激励。