FList

原项目指引:https://github.com/ArtalkJS/Artalk

<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>

1、拉取项目

#进入创建域名的`public_html` 文件下
cd domains/这里创建.域名绑定端口.com/public_html

#拉取artalk官方最新项目
git clone https://github.com/ArtalkJS/Artalk.git

2、编译项目

不想自行构建的可以直接下载 ~Release下载地址-artalk

#进入项目文件夹
cd Artalk
#编译项目
##这里构建项目时间较长,不要使用webssh会断线,使用正常SSH软件
go build

构建完成后在serv00的File Manager中可以看到一个名叫 artalk 的文件 artalk

3、获取配置文件(环境)

#依然在Artalk文件夹中
wget -O artalk.yml https://raw.githubusercontent.com/ArtalkJS/Artalk/master/conf/artalk.example.zh-CN.yml

获取后在serv00的File Manager中可以看到一个名叫 artalk.yml 的文件 image

4、新建MySQL数据库

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

  2. 点击 :small_red_triangle_down:Advanced settings :point_right: Collation 选择 utf8mb4_general_ci image

  3. 点击 :heavy_plus_sign:Add 即可完成新建 MySQL数据库

5、File Manager配置文件(环境)

  1. 进入对应域名项目 Artalk 文件夹,右击 artalk.yml 选择 View/Eidt→Choose other… →Source Eidtor 打开文件 image

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

<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>

6、赋权

# 进入项目文件夹
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk

# 赋权 artalk文件和 artalk.yml配置文件
chmod +x artalk artalk.yml

7、创建管理员

参考官方配置 管理员 × 多站点

如果你没有在配置文件中创建管理员也可以通过命令行创建管理员。

# 执行命令并根据命令行提示快速创建管理员。
./artalk admin

8、启动测试

# 启动命令并指定配置文件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关闭! image

9、连接NotionNext

<details> <summary> Vercel部署的NotionNext看这里</summary>

  1. serv00免费账户不支持远程连接数据库,只能从本地连接数据库,所以需要创建一个PHP中间件,代替我们访问数据库!

  2. 回到serv00主页,创建域名,默认的PHP网站类型

  3. 进入File Manager →进入刚刚创建的PHP网站 public_html文件夹 image

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

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

  6. 打开 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);
?>
  1. :exclamation::exclamation::exclamation:注意,记得在Artalk评论插件的 artalk.yml 环境配置文件添加信任这个代理域名,并重启Artalk,即:
# 第92行
# 可信域名
# -- 例如:["https://artalk.example.com:23366"] --
trusted_domains: [“https://www.刚刚创建的PHP网站.com/api/proxy.php”]  # 填入这个PHP中间件代理域名
  1. 去Vercel配置环境变量,并 Redeploy
# Vercel配置环境变量
NEXT_PUBLIC_COMMENT_ARTALK_SERVER=https://www.刚刚创建的PHP网站.com/api/proxy.php
  1. 去博客测试评论插件 image

  2. 管理员登录(如果完全按照我的方式):账户:admin ,邮箱:[email protected],密码:admin

</details>

<details> <summary>serv00部署的NotionNext看这里</summary>

  1. serv00部署需要修改好代码后自行构建

  2. .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
  1. 修改好打包完成后上传至serv00对应博客域名文件夹

  2. :exclamation::exclamation::exclamation:注意,记得在Artalk评论插件的 artalk.yml 环境配置文件添加信任你的博客域名,并重启Artalk

  3. 进入对应博客域名文件夹解压打包的文件并启动

# 进入博客域名文件夹
cd ~/domains/这里创建.博客的域名.com/public_html

# 解压打包好的NotionNext
unzip NotionNext.zip

# 进入博客项目文件夹
cd NotionNext

# 指定端口启动
yarn start -p 博客端口
  1. 此时稍等片刻便可以看到与Vercel部署的同一篇文章下评论是同步的(Artalk根据站点名来判断)

</details>

10、配置Artalk保活

  1. 在Artalk项目文件夹下创建一个名为start.sh的文件并粘贴以下启动命令
# 使用绝对路径
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk && ./artalk server -c ~/domains/这里创建.域名绑定端口.com/public_html/Artalk/artalk.yml
  1. 赋权start.sh 文件
# 进入Artalk项目文件夹
cd ~/domains/这里创建.域名绑定端口.com/public_html/Artalk

# 赋权start.sh
chmod +x start.sh
  1. 设置Cron job
# 配置Cron job
/usr/home/你的serv00名字/domains/这里创建.域名绑定端口.com/public_html/Artalk/start.sh

11、腾出空间

  1. 因为刚刚 go build 构建占用了一些内存,所以将四个文件下载下来 artalk、 artalk.yml、 proxy.php、start.sh 先保存到自己电脑上

  2. 使用重置命令清空一下系统

  3. 重置完成后,重新创建域名,并在域名 public_html 文件夹下新建名叫 Artalk 文件夹

  4. 将四个文件上传到 Artalk 文件夹中即可 (Artalk进程可能还活着,记得重启一下

</details>