首页 搭一个AIGC支持的现代论坛!
文章
取消

搭一个AIGC支持的现代论坛!

效果图

现代审美界面:

人工智能自动回复:

功能强大的后台管理:

其他一些基本功能不再举例:注册、登录、发帖、富文本。。。。

服务器购买

 最低配置推荐配置测试环境
系统基于 Linux 的发行版Debian 11/Ubuntu 20+Debian 11
处理器1 vCPU2 vCPU8 vCPU
内存2 GB4 GB32 GB
储存10 GB20 GB240 GB
网络1 Mbps30 Mbps10 Gbps

各大云主机运营商首次注册都有优惠,首先是注册了腾讯云可以免费用1个月服务器,但是由于调用 OpenAI服务需要翻墙,后面又用到了 docker 技术,在查了很多资料后依旧没有成功。诚然,在某些特定的设置下 docker 容器是可以翻墙的,但是如果遇到约束较多的生产场景时,这些简陋的设置很难找到理想化的环境。

多数 docker 容器使用宿主机代理时,常常设置网络连接方式为host,但是这个论坛项目约束网络连接方式必须基于bridge,使用bridge网络实现宿主机代理较为困难。

扩展阅读:Docker网络模式Linux - Bridge、Host、None

如果不使用代理,最简单的方式是直接租一个海外服务器。于是又新注册了 DigitalOcean 的账号,有 200$ 的额度。租了一个新加坡的服务器,与北京的服务器相比有些许延迟,不过问题不大。

服务器配置如上图,一个月大约 14$

搭建网站

参考:1Panel 面板安装 Flarum

如何安装PHP、MySQL等服务见上面参考,在这里简单介绍一下安装的服务和架构。构建了三个 docker 容器:

  1. OpenResty Web 平台。网络连接方式为host
  2. MySQL 数据库。网络连接方式为bridge
  3. PHP 环境 + 网站。网络连接方式为bridge
  4. 其实 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,他们将开始互相交谈!

本文由作者按照 CC BY 4.0 进行授权

线性代数的本质

基于WiFi CSI数据检测人体活动