Waline 服务端一键独立部署解决方案
Waline 服务端一键独立部署解决方案
概述
waline 是一款简洁、安全的评论系统,该系统包含了客户端与服务端。本文一方面是为了解决服务端在独立部署时所遇到的问题,另一方面是为了优化独立部署的过程,使其具备后台运行且实时监控的能力。
提示
如果你并不想一步步按照本文操作,而是希望直接使用成品,那么你可以直接前往 一键部署, 该章节将告诉你如何使用我的完整版本,直接体验一键独立部署 Waline 服务端并可监控式后台运行。
- 最近也是从
Giscus
转到Waline
了,看文档上说可以独立部署,所以果断选择独立部署,结果照着文档一通操作完,接口立马报 500 并返回了一个not initialize
,仔细思考了一下,得出的结论是数据库没连上导致拿不到数据,而文档中对这一块的描述确实不够清晰,如果是一个没有足够开发的经验的小白照着文档去做的话,的确容易出现很多问题,本文也是对官方文档做一个补充,帮助准备使用独立部署或者已经被独立部署劝退的同学,希望大家在看完此文后能购有所收获。 - 本文将手把手教你如何独立部署一个方便配置以及后台运行实时记录日志的
waline
服务端。但在部署之前,你需要满足这几个条件:- 准备一个装有数据库的服务器或本地计算机或云数据库并已创建好数据库与数据表,具体内容请查看:多数据库服务支持;
- 已安装
nodejs
开发环境。
配置环境变量
其实文档中是给出了一系列数据库相关配置的说明的,我们只需要对应自己数据库的真实配置,将这些变量写入至环境变量中即可。我使用的是mysql
,所以对应的是以下配置:
环境变量 | 必填 | 默认值 | 备注 |
---|---|---|---|
MYSQL_HOST | 127.0.0.1 | MySQL 服务的地址 | |
MYSQL_PORT | 3306 | MySQL 服务的端口 | |
MYSQL_DB | ✅ | MySQL 数据库库名 | |
MYSQL_USER | ✅ | MySQL 数据库的用户名 | |
MYSQL_PASSWORD | ✅ | MySQL 数据库的密码 | |
MYSQL_PREFIX | wl_ | MySQL 数据表的表前缀 | |
MYSQL_CHARSET | utf8mb4 | MySQL 数据表的字符集 | |
MYSQL_SSL | 是否使用 SSL MYSQL 连接数据库 |
更多数据库配置请参考:多数据库服务支持,下面的内容均以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
服务端可以从p
对象中顺利读取到,而这样定义的全局环境变量存在一个弊端,就是会污染到全局,可能会干预到其他项目,而且windows
与linux
的配置方法各不相同。所以这里并不推荐,而是更推荐使用方案二。
方案二(强烈推荐):
我们需要了解的是,在nodejs
中,通过p
对象可以拿到全局的环境变量,而有这么一个第三方库,可以做到既不污染全局环境变量,也能实现代码与配置分开管理:dotenv。该库支持将环境变量写入到一个在项目根目录下的.env
文件中,并在代码中通过dotenv.config()
方法将变量合并至p
对象中,每个项目的.env
文件都是一个独立的作用域,在项目结束运行时,.env
文件中的全局变量将被销毁,我们可以通过这个方法,编写一个javascript
脚本,我们只需要调用dotenv.config()
方法写入全局变量,之后引入并执行@waline/vercel/vanilla.js
这个文件即可。
那么废话不多说,我们直接开始实现:
- 创建文件夹:
waline-service
使用 vscode 打开文件夹,并调出终端,执行初始化项目命令生成
package.json
:npm init -y
在当前项目中安装
dotenv
:npm install dotenv
安装
Waline
服务端:npm install @waline/vercel
创建目录结构
src/main.js
,并在项目根目录下创建.env
文件:提示
此目录结构仅个人习惯,main.js 作为执行入口。
在
.env
文件中写入环境变量(''#''为注释符):MYSQL_HOST=127.0.0.1 # 数据库连接地址 MYSQL_PORT=3306 # 数据库连接端口号 MYSQL_DB=waline # 数据库名 MYSQL_USER=root # 连接数据库用户名 MYSQL_PASSWORD=tj991118 # 连接密码
在
main.js
文件中编写代码:const dotenv = require('dotenv'); // 引入dotenv dotenv.config(); // 调用config方法合并.env环境变量 require('@waline/vercel/vanilla.js'); // 引入并执行该文件
安装
pm2
项目运行管理器:npm install pm2
在根目录中创建
ecosystem.config.js
文件:写入配置:
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 // 崩溃后重启次数 } ] };
之后我们就可以通过
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" }, }
最后我们在终端的项目根目录下尝试执行以下命令:
npm run start # 启动服务 启动后默认服务端口号为8360 npm run stop # 停止服务 npm run log # 查看服务日志 npm run status # 查看服务运行状态
status
为online
表示已经成功在后台运行,更多有关pm2
的内容请查阅:pm2。成功运行后pm2
会自动帮你创建logs
文件夹,其中包含两个日志文件,一个记录执行过程中的标准输出,一个记录报错信息:至此,我们以及基本实现了
waline
服务端一键部署的封装,如果你在上述过程中遇到任何问题,都可以添加我的微信:coder7915,随时帮你解答。我在上述过程中又做了进一步的扩展,实现了自动初始化数据库并创建表,你无需再手动去创建数据库和数据表,详情请阅览一键部署。
一键部署
提示
在部署waline-service前你需要准备好已安装数据库的服务器或云数据库(并在服务器中执行以下操作,该项目支持所有 waline 所支持的数据库,参考:多数据库服务支持。但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
启动项目:
npm run start
其他操作命令:
npm run dev # 开发时前台启动服务并保持代码热更新
npm run stop # 停止运行
npm run log # 查看日志
npm run status # 查看运行状态
服务反向代理:
请查阅:https://waline.js.org/guide/server/vps-deploy.html
关于:
仓库地址:https://github.com/loclink/waline-service,如果你觉得还不错的话,就留下一个 star 吧~
主要依赖:waline
更多waline
配置请查阅:https://waline.js.org/