跳至主要內容

Waline 服务端一键独立部署解决方案

Loclink开发教程js后端nodejswaline原创大约 8 分钟约 2358 字

Waline 服务端一键独立部署解决方案

概述

walineopen in new window 是一款简洁、安全的评论系统,该系统包含了客户端与服务端。本文一方面是为了解决服务端在独立部署时所遇到的问题,另一方面是为了优化独立部署的过程,使其具备后台运行且实时监控的能力。

提示

如果你并不想一步步按照本文操作,而是希望直接使用成品,那么你可以直接前往 一键部署, 该章节将告诉你如何使用我的完整版本,直接体验一键独立部署 Waline 服务端并可监控式后台运行。

  • 最近也是从Giscus转到Waline了,看文档上说可以独立部署,所以果断选择独立部署,结果照着文档一通操作完,接口立马报 500 并返回了一个 not initialize,仔细思考了一下,得出的结论是数据库没连上导致拿不到数据,而文档中对这一块的描述确实不够清晰,如果是一个没有足够开发的经验的小白照着文档去做的话,的确容易出现很多问题,本文也是对官方文档做一个补充,帮助准备使用独立部署或者已经被独立部署劝退的同学,希望大家在看完此文后能购有所收获。
  • 本文将手把手教你如何独立部署一个方便配置以及后台运行实时记录日志的waline服务端。但在部署之前,你需要满足这几个条件:
    1. 准备一个装有数据库的服务器或本地计算机或云数据库并已创建好数据库与数据表,具体内容请查看:多数据库服务支持open in new window
    2. 已安装nodejs开发环境。

配置环境变量

其实文档中是给出了一系列数据库相关配置的说明的,我们只需要对应自己数据库的真实配置,将这些变量写入至环境变量中即可。我使用的是mysql,所以对应的是以下配置:

环境变量必填默认值备注
MYSQL_HOST127.0.0.1MySQL 服务的地址
MYSQL_PORT3306MySQL 服务的端口
MYSQL_DBMySQL 数据库库名
MYSQL_USERMySQL 数据库的用户名
MYSQL_PASSWORDMySQL 数据库的密码
MYSQL_PREFIXwl_MySQL 数据表的表前缀
MYSQL_CHARSETutf8mb4MySQL 数据表的字符集
MYSQL_SSL是否使用 SSL MYSQL 连接数据库

更多数据库配置请参考:多数据库服务支持open in new window,下面的内容均以mysql为例,其他数据库的配置除环境变量有区别外,其余基本相似。

方案一(不推荐):

如果你的服务器是linux操作系统的话,那么就可以通过修改属主目录下的.bashrc文件,并写入以下内容:

export MYSQL_HOST=12.12.12.12
export MYSQL_PORT=3306
export MYSQL_DB=waline
# more.... 以这三个为例,更多请对照参数表一一填写即可

填写完成后保存文件并执行以下命令刷新:

source ~/.bashrc

之后我们就可以通过以下命令启动服务了:

npm install @waline/vercel
node node_modules/@waline/vercel/vanilla.js

该方法是直接导出系统级的环境变量,使waline服务端可以从process.env对象中顺利读取到,而这样定义的全局环境变量存在一个弊端,就是会污染到全局,可能会干预到其他项目,而且windowslinux的配置方法各不相同。所以这里并不推荐,而是更推荐使用方案二。

方案二(强烈推荐):

我们需要了解的是,在nodejs中,通过process.env对象可以拿到全局的环境变量,而有这么一个第三方库,可以做到既不污染全局环境变量,也能实现代码与配置分开管理:dotenvopen in new window。该库支持将环境变量写入到一个在项目根目录下的.env文件中,并在代码中通过dotenv.config()方法将变量合并至process.env对象中,每个项目的.env文件都是一个独立的作用域,在项目结束运行时,.env文件中的全局变量将被销毁,我们可以通过这个方法,编写一个javascript脚本,我们只需要调用dotenv.config()方法写入全局变量,之后引入并执行@waline/vercel/vanilla.js这个文件即可。

那么废话不多说,我们直接开始实现:

  1. 创建文件夹:waline-service

image

  1. 使用 vscode 打开文件夹,并调出终端,执行初始化项目命令生成package.json

    npm init -y
    

    image

  2. 在当前项目中安装dotenv

    npm install dotenv
    
  3. 安装Waline服务端:

    npm install @waline/vercel
    
  4. 创建目录结构src/main.js,并在项目根目录下创建.env文件:

    image

    提示

    此目录结构仅个人习惯,main.js 作为执行入口。

  5. .env文件中写入环境变量(''#''为注释符):

    MYSQL_HOST=127.0.0.1 # 数据库连接地址
    MYSQL_PORT=3306 # 数据库连接端口号
    MYSQL_DB=waline # 数据库名
    MYSQL_USER=root # 连接数据库用户名
    MYSQL_PASSWORD=tj991118 # 连接密码
    
  6. main.js文件中编写代码:

    const dotenv = require('dotenv'); // 引入dotenv
    dotenv.config(); // 调用config方法合并.env环境变量
    require('@waline/vercel/vanilla.js'); // 引入并执行该文件
    
  7. 安装pm2项目运行管理器:

    npm install pm2
    
  8. 在根目录中创建ecosystem.config.js文件:

    image

    写入配置:

    module.exports = {
      apps: [
        {
          name: 'waline-service', // 项目名称
          script: './src/main.js', // 执行入口
          cwd: './', // 工作路径
          watch: true, // 是否开启监听
          ignore_watch: ['logs', '.git', 'node_modules'], // 监听器忽略文件目录
          out_file: './logs/waline_info.log', // 日志输出路径
          error_file: './logs/waline_err.log', // 报错日志输出路径
          log_date_format: 'YYYY-MM-DD HH:mm', // 日志时间格式 会在每一行日志的前面加上该格式的时间戳
          merge_logs: true, // 合并日志文件名称
          restart_delay: 1000, // 崩溃重启服务时间间隔
          max_restarts: 3 // 崩溃后重启次数
        }
      ]
    };
    
  9. 之后我们就可以通过pm2管理器对项目进行性能监控和后台运行了,修改package.json文件的scripts选项:

    {
      ...more
      "scripts": {
        "start": "pm2 start ./ecosystem.config.js",
        "stop": "pm2 stop waline-service",
        "log": "pm2 log waline-service",
        "status": "pm2 status"
      },
    }
    
  10. 最后我们在终端的项目根目录下尝试执行以下命令:

    npm run start   # 启动服务 启动后默认服务端口号为8360
    npm run stop    # 停止服务
    npm run log     # 查看服务日志
    npm run status  # 查看服务运行状态
    

    image

    statusonline表示已经成功在后台运行,更多有关pm2的内容请查阅:pm2open in new window。成功运行后pm2会自动帮你创建logs文件夹,其中包含两个日志文件,一个记录执行过程中的标准输出,一个记录报错信息:

    image

    至此,我们以及基本实现了waline服务端一键部署的封装,如果你在上述过程中遇到任何问题,都可以添加我的微信:coder7915,随时帮你解答。

    我在上述过程中又做了进一步的扩展,实现了自动初始化数据库并创建表,你无需再手动去创建数据库和数据表,详情请阅览一键部署

一键部署

提示

在部署waline-serviceopen in new window前你需要准备好已安装数据库的服务器或云数据库(并在服务器中执行以下操作,该项目支持所有 waline 所支持的数据库,参考:多数据库服务支持open in new window。但npm run init:db命令当前仅支持 mysql

拉取仓库:

git clone https://github.com/loclink/waline-service.git

安装依赖:

cd waline-service
npm install

初始化.env文件:

默认情况下,你clone下来的仓库是没有.env文件的,你可以手动在根目录中创建,并修改为自己的配置:

MYSQL_HOST=127.0.0.1 # 数据库连接地址
MYSQL_PORT=3306 # 数据库连接端口号
MYSQL_DB=waline # 数据库名
MYSQL_USER=root # 连接数据库用户名
MYSQL_PASSWORD=tj991118 # 连接密码

如果你嫌麻烦,还可以直接通过执行命令的方式创建.env文件,然后再进行修改:

npm run init:env

初始化数据库:

当你配置好一切之后,你可以直接通过命令的形式,自动创建名称与MYSQL_DB值相同的数据库,并在此数据库中自动为你创建waline所需要的数据表:

注意

该命令当前只支持 mysql,这意味着:如果你使用的是其他类型的数据库,需要自己手动创建数据库和数据表。

npm run init:db

image

image

启动项目:

npm run start

image

其他操作命令:

npm run dev # 开发时前台启动服务并保持代码热更新
npm run stop # 停止运行
npm run log # 查看日志
npm run status # 查看运行状态

服务反向代理:

请查阅:https://waline.js.org/guide/server/vps-deploy.htmlopen in new window

关于:

仓库地址:https://github.com/loclink/waline-serviceopen in new window,如果你觉得还不错的话,就留下一个 star 吧~

主要依赖:walineopen in new window

更多waline配置请查阅:https://waline.js.org/open in new window