
<details> <summary>小声BB</summary> :grinning:Serv00上部署Artalk并连接NotionNext
1、解决外部NotionNext连接serv00数据库问题 2、实现同步博客评论 </details>
<details> <summary>📂 serv00部署教程</summary>
<details> <summary>Go安装</summary>
# 创建安装目录
mkdir -p ~/local/soft && cd ~/local/soft
# 下载编译好的 go1.22.7 的程序包
wget https://dl.google.com/go/go1.22.7.freebsd-amd64.tar.gz
# 解压下载的程序包
tar -xzvf go1.22.7.freebsd-amd64.tar.gz
# 删除压缩文件以节省空间
rm go1.22.7.freebsd-amd64.tar.gz
# 将Go的bin目录添加到PATH环境变量中
echo 'export PATH=~/local/soft/go/bin:$PATH' >> ~/.profile
# 使.profile的修改立即生效
source ~/.profile
</details>
#进入创建域名的`public_html` 文件下
cd domains/这里创建.域名绑定端口.com/public_html
#拉取artalk官方最新项目
git clone https://github.com/ArtalkJS/Artalk.git
不想自行构建的可以直接下载 ~Release下载地址-artalk
#进入项目文件夹
cd Artalk
#编译项目
##这里构建项目时间较长,不要使用webssh会断线,使用正常SSH软件
go build
构建完成后在serv00的File Manager中可以看到一个名叫 artalk 的文件

#依然在Artalk文件夹中
wget -O artalk.yml https://raw.githubusercontent.com/ArtalkJS/Artalk/master/conf/artalk.example.zh-CN.yml
获取后在serv00的File Manager中可以看到一个名叫 artalk.yml 的文件

点击 MySQL :point_right: :heavy_plus_sign:Add database
输入Database name(数据库名)、Username(用户名)、Password(密码)、Confirm password(确认密码)
:exclamation::exclamation::exclamation:注意:输入完成后先不要添加+Add:exclamation::exclamation::exclamation:
新手可以像我一样,统一设置成 m12634_Artalk,以防止后面配置文件出错

点击 :small_red_triangle_down:Advanced settings :point_right: Collation 选择 utf8mb4_general_ci

点击 :heavy_plus_sign:Add 即可完成新建 MySQL数据库
进入对应域名项目 Artalk 文件夹,右击 artalk.yml 选择 View/Eidt→Choose other… →Source Eidtor 打开文件

根据自己配置修改配置文件
详细参考官方配置方法

<details> <summary>主要配置参考</summary>
# 第5行
# 服务器端口(改成自己的)
port: 23366
# 第8行
# 加密密钥(设置成自己喜欢的)
app_key: ""
# 第20行
# 默认站点名(如果你没改过NotionNext配置,填入 NotionNext,
# 改过请将其他配置好后去NotionNext博客前端查看会有提示)
site_default: 默认站点
# 第28-47行
# 数据库
db:
# 数据库类型 ["sqlite", "mysql", "pgsql", "mssql"]
type: mysql # 把这里改成mysql
# 数据库文件 (仅 SQLite 数据库需填写)
file: ./data/artalk.db
# 数据库名称
name: m12634_Chat #填入刚才新建的m12634_Chat
# 数据库地址
host: localhost
# 数据库端口
port: 3306
# 数据库账户
user: m12634_Chat #填入刚才新建的m12634_Chat
# 数据库密码
password: "m12634_Chat" #引号中填入刚才新建的m12634_Chat
# 编码格式
charset: utf8mb4
# 表前缀 (例如:"atk_")
table_prefix: "atk_" #引号中填入atk_
# 第92行
# 可信域名
# -- 例如:["https://artalk.example.com:23366"] --
trusted_domains: [“https://www.example①.com”,“https://www.example②.com”] # 填入你的博客域名
# 第111行
# 管理员账户 # 也可以通过命令行创建管理员
# --
# - name: "admin"
# email: "[email protected]"
# password: "" # 支持 bcrypt 或 md5 加密,如:"(bcrypt)$2y$10$ti4vZYIrxVN8rLcYXVgXCO.GJND0dyI49r7IoF3xqIx8bBRmIBZRm"
# badge_name: "管理员"
# badge_color: "#0083FF"
# -- # 记得删除中括号[]哦!!
admin_users:
- name: admin
email: [email protected]
password: admin
badge_name: 管理员
badge_color: '#0083FF'
- name: admin2
email: [email protected]
password: admin2
badge_name: 小管理员
badge_color: '#0083FF'
</details>
# 进入项目文件夹
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk
# 赋权 artalk文件和 artalk.yml配置文件
chmod +x artalk artalk.yml
如果你没有在配置文件中创建管理员也可以通过命令行创建管理员。
# 执行命令并根据命令行提示快速创建管理员。
./artalk admin
# 启动命令并指定配置文件artalk.yml,指定配置文件必须使用绝对路径(二选一)
./artalk server -c ~/domains/这里创建.域名绑定端口.com/public_html/Artalk/artalk.yml
# 也可以使用这个绝对路径命令(二选一)
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk && ./artalk server -c ~/domains/这里创建.域名绑定端口.com/public_html/Artalk/artalk.yml
可以看到启动成功了,先不要Ctrl+C关闭!

<details> <summary> Vercel部署的NotionNext看这里</summary>
serv00免费账户不支持远程连接数据库,只能从本地连接数据库,所以需要创建一个PHP中间件,代替我们访问数据库!
回到serv00主页,创建域名,默认的PHP网站类型
进入File Manager →进入刚刚创建的PHP网站 public_html文件夹

右键点击 New floder 新建一个名为api的文件夹(名称随意)

进入 api 文件夹,创建 proxy.php

打开 proxy.php,粘贴以下代码并保存或者直接下载~Release下载地址-proxy.php
<?php
header('Access-Control-Allow-Origin: *'); // 允许所有来源的请求访问资源,如需精准指定前端域名把 * ,改为域名即可
header('Access-Control-Allow-Methods: *'); // 允许所有的 HTTP 方法,可将 * 替换成这些(全部替换):GET, POST, PUT, DELETE, OPTIONS
header('Access-Control-Allow-Headers: *'); // 允许所有的请求头,可将 * 替换成这些(全部替换):Content-Type, Authorization, X-Requested-With
header('Access-Control-Allow-Credentials: true'); // 允许跨域请求携带 Cookie
// 如果是 OPTIONS 请求(浏览器发送的预检请求)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200); // 返回状态码 200
exit; // 返回 200 状态码,且终止脚本执行
}
// 获取请求的 URI,去除代理脚本部分,得到实际的 API 路径
$requestUri = $_SERVER['REQUEST_URI'];
$apiPath = preg_replace('/^\/[^\/]+\/proxy\.php/', '', $requestUri); // 去掉任意前缀的 '/proxy.php',,得到实际请求路径
// 初始化 cURL 请求
$ch = curl_init();
$targetUrl = 'http://localhost:20638' . $apiPath; // 设置目标 URL,即 Artalk 后端 API 的地址,修改端口即可,其他不要动!
curl_setopt($ch, CURLOPT_URL, $targetUrl);
//存储响应头的变量
$responseHeaders = [];
curl_setopt($ch, CURLOPT_HEADERFUNCTION,
function($curl, $header) use (&$responseHeaders) {
$len = strlen($header);
$header = explode(':', $header, 2);
if (count($header) < 2) return $len;
$name = strtolower(trim($header[0]));
$value = trim($header[1]);
if ($name === 'content-type') { // 捕获 Content-Type
$responseHeaders['content-type'] = $value;
}
return $len;
}
);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']); // 设置 HTTP 方法,使用客户端的请求方法(GET, POST, PUT, DELETE 等)
// 处理文件上传(multipart/form-data)
if (!empty($_FILES)) {
$postData = [];
foreach ($_FILES as $key => $file) {
$postData[$key] = new CURLFile($file['tmp_name'], $file['type'], $file['name']);
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
} else {
// 处理普通 JSON 请求
$input = file_get_contents('php://input');
curl_setopt($ch, CURLOPT_POSTFIELDS, $input);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: ' . ($_SERVER['HTTP_AUTHORIZATION'] ?? '')
]);
}
curl_setopt($ch, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE'] ?? ''); // 传递客户端(前端评论插件)的 Cookie 到后端
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置 cURL 返回结果,而不是直接输出
$response = curl_exec($ch); // 执行 cURL 请求并获取响应
/* //可选功能(没啥用)
检查 cURL 请求是否成功
if ($response === false) {
// 如果请求失败,返回错误信息
$error = curl_error($ch);
http_response_code(500); // 设置服务器错误状态码
echo json_encode(['error' => 'cURL error: ' . $error]);
curl_close($ch);
exit;
}
*/ //如需使用删除两头(/*和*/)
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 获取 HTTP 响应码
// 自动设置 Content-Type
if (isset($responseHeaders['content-type'])) {
header('Content-Type: ' . $responseHeaders['content-type']);
}
// 返回响应内容和相应的 HTTP 状态码
http_response_code($httpCode);
echo $response;
// 关闭 cURL 资源
curl_close($ch);
?>
# 第92行
# 可信域名
# -- 例如:["https://artalk.example.com:23366"] --
trusted_domains: [“https://www.刚刚创建的PHP网站.com/api/proxy.php”] # 填入这个PHP中间件代理域名
# Vercel配置环境变量
NEXT_PUBLIC_COMMENT_ARTALK_SERVER=https://www.刚刚创建的PHP网站.com/api/proxy.php
去博客测试评论插件

管理员登录(如果完全按照我的方式):账户:admin ,邮箱:[email protected],密码:admin
</details>
<details> <summary>serv00部署的NotionNext看这里</summary>
serv00部署需要修改好代码后自行构建
将 .env.exampl 文件重命名为 .env.local 并修改代码
# 修改.env.local代码
NEXT_PUBLIC_COMMENT_ARTALK_JS=https://unpkg.com/[email protected]/dist/Artalk.js
NEXT_PUBLIC_COMMENT_ARTALK_CSS=https://unpkg.com/[email protected]/dist/Artalk.css
NEXT_PUBLIC_COMMENT_ARTALK_SERVER=https://www.这里直接填Artalk评论插件的域名.com
修改好打包完成后上传至serv00对应博客域名文件夹
:exclamation::exclamation::exclamation:注意,记得在Artalk评论插件的 artalk.yml 环境配置文件添加信任你的博客域名,并重启Artalk
进入对应博客域名文件夹解压打包的文件并启动
# 进入博客域名文件夹
cd ~/domains/这里创建.博客的域名.com/public_html
# 解压打包好的NotionNext
unzip NotionNext.zip
# 进入博客项目文件夹
cd NotionNext
# 指定端口启动
yarn start -p 博客端口
</details>
# 使用绝对路径
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk && ./artalk server -c ~/domains/这里创建.域名绑定端口.com/public_html/Artalk/artalk.yml
# 进入Artalk项目文件夹
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk
# 赋权start.sh
chmod +x start.sh
# 配置Cron job
/usr/home/你的serv00名字/domains/这里创建.域名绑定端口.com/public_html/Artalk/start.sh
因为刚刚 go build 构建占用了一些内存,所以将四个文件下载下来 artalk、 artalk.yml、 proxy.php、start.sh 先保存到自己电脑上
使用重置命令清空一下系统
重置完成后,重新创建域名,并在域名 public_html 文件夹下新建名叫 Artalk 文件夹
将四个文件上传到 Artalk 文件夹中即可 (Artalk进程可能还活着,记得重启一下
</details>