效果图
现代审美界面:
人工智能自动回复:
功能强大的后台管理:
其他一些基本功能不再举例:注册、登录、发帖、富文本。。。。
服务器购买
最低配置 | 推荐配置 | 测试环境 | |
---|---|---|---|
系统 | 基于 Linux 的发行版 | Debian 11/Ubuntu 20+ | Debian 11 |
处理器 | 1 vCPU | 2 vCPU | 8 vCPU |
内存 | 2 GB | 4 GB | 32 GB |
储存 | 10 GB | 20 GB | 240 GB |
网络 | 1 Mbps | 30 Mbps | 10 Gbps |
各大云主机运营商首次注册都有优惠,首先是注册了腾讯云可以免费用1个月服务器,但是由于调用 OpenAI服务需要翻墙,后面又用到了 docker 技术,在查了很多资料后依旧没有成功。诚然,在某些特定的设置下 docker 容器是可以翻墙的,但是如果遇到约束较多的生产场景时,这些简陋的设置很难找到理想化的环境。
多数 docker 容器使用宿主机代理时,常常设置网络连接方式为
host
,但是这个论坛项目约束网络连接方式必须基于bridge
,使用bridge
网络实现宿主机代理较为困难。
如果不使用代理,最简单的方式是直接租一个海外服务器。于是又新注册了 DigitalOcean 的账号,有 200$ 的额度。租了一个新加坡的服务器,与北京的服务器相比有些许延迟,不过问题不大。
服务器配置如上图,一个月大约 14$
搭建网站
如何安装PHP、MySQL等服务见上面参考,在这里简单介绍一下安装的服务和架构。构建了三个 docker 容器:
- OpenResty Web 平台。网络连接方式为
host
- MySQL 数据库。网络连接方式为
bridge
- PHP 环境 + 网站。网络连接方式为
bridge
- 其实 1Panel 面板也是容器化的,但是与论坛关系不大,故略
OpenResty 容器以 host 网络模式运行,并且该容器监听了服务器的所有网络接口(包括外部网络接口),那么外部用户就可以通过服务器的 IP 地址和端口 80 访问到该容器提供的服务。即使网站容器并没有直接暴露端口 80,但 OpenResty 容器仍然可以代理请求到网站容器内部运行的网站。
在这种情况下,OpenResty 容器充当了反向代理服务器的角色,它接收来自外部的 HTTP 请求,并根据配置将这些请求转发到网站容器内部运行的网站。因此,外部用户可以通过访问服务器的 IP 地址和端口 80,间接访问到网站容器内部的网站。
正向代理:
反向代理:
OpenResty
OpenResty Web 平台,主要包含两方面的技术:
- Nginx:一款轻量级、高性能、高并发的Web服务器。
- Lua:一种轻量、小巧、可移植、快速的脚本语言;LuaJIT 即时编译器会将频繁执行的Lua代码编译成本地机器码交给CPU直接执行,执行效率更高,OpenResty会默认启用 LuaJIT。
工作原理如图所示,Nginx使用了管理进程+工作进程的设计。管理进程为工作进程的父进程,负责外部指令的接收,工作进程状态的监管,负载均衡等。工作进程负责客户端请求的处理和响应。OpenResty本质上是将LuaJIT的虚拟机嵌入到Nginx的管理进程和工作进程中,同一个进程内的所有协程都会共享这个虚拟机,并在虚拟机中执行Lua代码。
OpenResty中的核心技术cosocket将Lua协程和Nginx的事件机制结合在一起,最终实现了非阻塞网络IO。不仅和HTTP客户端之间的网络通信是非阻塞的,与MySQL、Memcached以及Redis等众多后端之间的网络通信也是非阻塞的。在OpenResty中调用一个cosocket相关的网络函数,内部关键实现如图所示:
如图,用户的Lua脚本每触发一个网络操作,都会有协程的yield和resume。当遇到网络IO时,Lua协程会交出控制权(yield),把网络事件注册到Nginx监听列表中,并把运行权限交给Nginx。当有Nginx注册网络事件到达触发条件时,便唤醒(resume)对应的协程继续处理。这样就可以实现全异步的Nginx机制,不会影响Nginx的高并发处理性能。
此外,基于Nginx使用的多模块设计思想,Nginx将HTTP请求的处理过程划分为多个阶段。这样可以使一个HTTP请求的处理过程由很多模块参与处理,每个模块只专注于一个独立而简单的功能处理,可以使性能更好、更稳定,同时拥有更好的扩展性。OpenResty在HTTP处理阶段基础上分别在Rewrite/Access阶段、Content阶段、Log阶段注册了自己的handler,加上系统初始阶段master的两个阶段,共11个阶段为Lua脚本提供处理介入的能力。
PHP
论坛网站基于 PHP 搭建。PHP(全称:PHP: Hypertext Preprocessor,即”PHP:超文本预处理器”)是一种通用开源脚本语言。脚本在服务器上执行。可免费下载使用。
PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码。PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器,PHP 文件的默认文件扩展名是 .php
。
- PHP 可以生成动态页面内容
- PHP 可以创建、打开、读取、写入、关闭服务器上的文件
- PHP 可以收集表单数据
- PHP 可以发送和接收 cookies
- PHP 可以添加、删除、修改您的数据库中的数据
- PHP 可以限制用户访问您的网站上的一些页面
- PHP 可以加密数据
通过 PHP,您不再限于输出 HTML。您可以输出图像、PDF 文件,甚至 Flash 电影。您还可以输出任意的文本,比如 XHTML 和 XML。
MySQL
数据库设计(软件为Navicat):
其他设置
Flarum论坛的邮件服务主要用于新用户注册后激活链接邮件的发送。需要自己配置邮件服务。
语言插件:Flarum 简体中文语言包
好看的主题:Asirem
更多插件:Awesome Flarum
智能助手配置
现成的ChatGPT插件有两个:
遗憾的是,第一个没有配置成功,在这个项目中使用了第二个插件。第二个插件仍在测试中,没有正式发布,可以使用它的dev
版本,在网站容器的网站index目录中安装:
1
composer require flarum/ai-toolkit:dev-main
然后配置同目录的extend.php
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
use Flarum\Extend;
return [
(new \Flarum\Ai\Extend\Ai(
// unique identifier
key: 'gandalf',
// username or user Id of User to represent
represents: 'gandalf',
// Chat GPT Model to use. Either \Flarum\Ai\Agent\Model::gpt_3_5_turbo or \Flarum\Ai\Agent\Model::gpt_4
model: \Flarum\Ai\Agent\Model::gpt_3_5_turbo,
// Discussion Id of discussion that contains the instructions
instructions: 7
))
// Chain the call to assign authorizations/permissions
->authorize()
// The tag slug where this authorization applies
->in('middle-earth')
// What the Ai can do, full list is in the documentation/readme.
->can(
replyToPosts: true,
respondToMentions: true
)
// Conclude this autorization
->activate()
// Chain another authorization after activate() that applies to this Ai
->authorize()
->in('another-tag')
->can(respondToMentions: true)
->activate(),
];
- key:唯一标识符
- represents: ChatGPT 使用的用户名,用户必须已存在
- instructions: 包含指令的 discussion 编号,discussion 需要已存在
- in:已存在的 tag slug
- 此外记得在网站的后台管理页面填上 OpenAI 密钥。如何注册和获取密钥见其他教程。
如果在同一 tag 上创建两个AI,他们将开始互相交谈!