当前位置: 首页 > news >正文

部署 Waline 评论系统到自己的服务器完全指南 (保姆级教程 2026)

转载自 我的个人博客

部署 Waline 评论系统到自己的服务器完全指南 (保姆级教程 2026)

简介

Waline 是一个自托管的静态博客评论系统。基于 Node.js,内置管理后台,数据存 SQLite —— 意味着不需要单独装数据库,一个 Docker 容器就跑了。前端是 Web Component(Vue),原生支持暗黑模式、浏览量统计、表情包、Markdown 渲染、数学公式。

这篇教程假设你有一台服务器和一个域名,带你从零把 Waline 跑起来,每一步都有解释。

为什么选 Waline 而不是 Twikoo

对比WalineTwikoo
数据库SQLite(无需额外容器)MongoDB(必须)
管理后台内置/ui,注册即用访问/#/login设置密码
垃圾过滤Akismet + IP 频率 + 关键词 + 相似度检测仅 IP 频率限制
浏览量统计内置,一行配置不支持
前端框架Web Component(Vue)传统 JS
暗黑模式dark: 'auto'自适应需手动适配
登录方式注册 + GitHub OAuth仅密码
镜像体积~150MB(含 SQLite)需额外 MongoDB 镜像

结论:新项目直接用 Waline,更轻量、功能更全、部署更简单。


第一步:准备工作

你需要这些

东西说明
一台服务器1c1g 足够。能 SSH 上去、能装 Docker
一个域名前端 HTTPS 页面无法请求 HTTP 后端,所以必须有域名配 SSL
一个子域名给 Waline 专用,比如comment.你的域名.com
15 分钟从零到评论可用

没有域名怎么办

如果你还没有域名,先去任意域名注册商买一个(Namesilo / Cloudflare / 阿里云 都行)。最便宜的.xyz一年几块钱。

买完后,在你的 DNS 管理页面添加一条 A 记录,把子域名指向服务器 IP:

类型: A 主机记录: comment (表示 comment.你的域名.com) 记录值: 123.456.789.0 (你的服务器公网 IP) TTL: 600

DNS 生效可能需要几分钟。验证一下:

nslookupcomment.example.com

第二步:安装 Docker

如果你的服务器还没装 Docker,先装上。

# 官方一键安装脚本curl-fsSLhttps://get.docker.com|sudosh# 把当前用户加入 docker 组,以后不用每次加 sudosudousermod-aGdocker$USER# 退出 SSH 重新登录,让用户组生效exit

重新登录后验证:

docker--versiondockerrun--rmhello-world

如果docker pull特别慢或被墙,参考文末「常见问题」配镜像加速。


第三步:生成配置值

部署 Waline 前,先把要填的值准备好。以下 5 个值需要你替换成自己的:

3.1 JWT_TOKEN —— 管理员密钥

这是 Waline 内部用来签发登录凭证的密钥,必须设,必须保密

openssl rand-hex32

输出类似a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6a7b8c9d0e1f2a3b4c5d6e1f2a3b4c5d6把这个字符串记下来,后面要用。

不要用你别的密码,用openssl rand生成的随机值。

3.2 SITE_NAME —— 网站名称

随便写,会显示在管理后台和邮件通知里。比如「XX 的博客」。

3.3 SITE_URL —— 博客地址

你的博客完整地址,带上https://

3.4 SECURE_DOMAINS —— 安全域名

你的域名,不带https://。Waline 评论框允许嵌入的域名白名单。多个域名用逗号分隔。

3.5 AUTHOR_EMAIL —— 你的邮箱

收到新评论时会往这个邮箱发通知(需要配 SMTP,见后面)。

填完后的参考

变量
JWT_TOKENa1b2c3d4...(openssl rand 那串)
SITE_NAME我的博客
SITE_URLhttps://blog.example.com
SECURE_DOMAINSblog.example.com
AUTHOR_EMAILuser@example.com

第四步:部署 Waline 后端

终于要开始部署了。以下操作全部在服务器上执行。

4.1 拉取镜像

dockerpull lizheming/waline:latest

镜像大约 150MB,半分钟到一分钟能拉完。

4.2 创建数据目录

mkdir-p/opt/waline/data

4.3 启动容器

把 3.1~3.5 准备好的值填进去,执行:

dockerrun-d\--namewaline\--restart=unless-stopped\-p127.0.0.1:8360:8360\-v/opt/waline/data:/app/data\-eTZ=Asia/Shanghai\-eSQLITE_PATH=/app/data\-eJWT_TOKEN=a1b2c3d4...\-e"SITE_NAME=我的博客"\-eSITE_URL=https://blog.example.com\-eSECURE_DOMAINS=blog.example.com\-eAUTHOR_EMAIL=user@example.com\lizheming/waline:latest

每个参数的含义:

参数作用
-d后台运行
--restart=unless-stopped服务器重启后自动启动容器
-p 127.0.0.1:8360:8360只监听本机 8360 端口(不暴露公网,安全)
-v /opt/waline/data:/app/data数据持久化
-e JWT_TOKEN=...管理员登录密钥
-e SITE_NAME/URL/DOMAINS站点信息
-e AUTHOR_EMAIL博主邮箱

关键提示:bash 续行符\必须是该行最后一个字符,后面不能跟任何东西(包括空格和注释)。如果SITE_NAME&等特殊字符,要用双引号包住整个-e "SITE_NAME=xxx"

4.4 验证容器状态

dockerps|grepwaline

看到Up字样说明容器在运行。也可以看日志:

dockerlogs waline--tail20

正常的话最后一行类似ThinkJS 3.x is running at http://127.0.0.1:8360

4.5 使用 Docker Compose(可选但推荐)

新建docker-compose.yml

mkdir-p/opt/waline&&cd/opt/waline
# docker-compose.ymlversion:'3'services:waline:container_name:walineimage:lizheming/waline:latestrestart:alwaysports:-127.0.0.1:8360:8360volumes:-./data:/app/dataenvironment:TZ:Asia/ShanghaiSQLITE_PATH:/app/dataJWT_TOKEN:a1b2c3d4...# ← 替换SITE_NAME:"我的博客"# ← 替换SITE_URL:https://blog.example.com# ← 替换SECURE_DOMAINS:blog.example.com# ← 替换AUTHOR_EMAIL:user@example.com# ← 替换IPQPS:5AKISMET_KEY:"false"

启动:

dockerstop waline&&dockerrmwalinedocker-composeup-d

第五步:Nginx 反代 + HTTPS

Waline 只监听了127.0.0.1:8360,外部访问不到。需要用 Nginx 反代到公网,并配上 HTTPS。

5.1 安装 Nginx 和 Certbot

sudoaptupdatesudoaptinstall-ynginx certbot python3-certbot-nginx

5.2 创建临时 HTTP 站点

sudotee/etc/nginx/sites-available/waline<<'EOF' server { listen 80; server_name comment.example.com; # ← 替换:你的子域名 location / { proxy_pass http://127.0.0.1:8360; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header REMOTE-HOST $remote_addr; } } EOFsudoln-sf/etc/nginx/sites-available/waline /etc/nginx/sites-enabled/sudonginx-t&&sudosystemctl reload nginx

5.3 Certbot 自动获取 SSL 证书

sudocertbot--nginx-dcomment.example.com

Certbot 会自动申请证书、改 Nginx 配置、加 HTTP→HTTPS 跳转。证书 90 天有效,到期前自动续期。

5.4 验证

curlhttps://comment.example.com

应该返回一段 JSON:

{"name":"Waline","version":"x.x.x",...}

第六步:注册管理员

这一步必须立刻做,免得被别人抢注。

浏览器打开:

https://comment.example.com/ui/register

输入邮箱和密码,点击注册。第一个注册的用户自动成为管理员

注册后登录管理后台:

https://comment.example.com/ui

第七步:前端接入

在你想显示评论框的位置加入以下代码:

<divid="waline"></div><scripttype="module">import{init}from'https://unpkg.com/@waline/client@v3/dist/waline.mjs';init({el:'#waline',serverURL:'https://comment.example.com',// ← 替换dark:'auto',lang:'zh-CN',wordLimit:500,pageview:true,emoji:['https://unpkg.com/@waline/emojis@1.2.0/qq','https://unpkg.com/@waline/emojis@1.2.0/tieba',],});</script>

浏览量统计

阅读量:<spanclass="waline-pageview-count"data-path="/posts/hello-world"></span>

Waline 自动查找页面上所有.waline-pageview-count元素并填入计数。

常见博客框架接入

框架在哪加代码
Hugolayouts/_default/single.html
Hexo主题的layout/_partial/comments.ejs
Jekyll_layouts/post.html
VuePress.vuepress/config.js
纯 HTML每篇文章底部直接贴

第八步:邮件通知(可选但建议配)

不配邮件的话,有人评论你不知道。QQ 邮箱为例:

  1. QQ 邮箱 → 设置 → 账户 → POP3/IMAP/SMTP 服务 → 开启 SMTP → 获取授权码
  2. 添加环境变量:
-eSMTP_SERVICE=QQ\-eSMTP_USER=你的QQ号@qq.com\-eSMTP_PASS=授权码\-eSENDER_NAME=Waline通知\

重启容器生效:

dockerrestart waline

日常维护

# 升级dockercompose pull&&dockercompose up-d# Compose 方式dockerpull lizheming/waline:latest&&dockerstop waline&&dockerrmwaline# run 方式# 备份(SQLite 就是一个文件)cp-r/opt/waline/data /opt/backup/waline-$(date+%F)# 查看日志dockerlogs waline--tail50

实战踩坑记录

  1. bash 续行符\后不能跟注释\必须是行末最后一个字符
  2. SITE_NAME 含&必须加引号-e "SITE_NAME=Code & Flower",否则&被 bash 解析为后台运行符
  3. SECURE_DOMAINS 必须包含管理后台域名— 只写博客域名的话,管理后台 API 返回 403
  4. SQLite 文件需要预初始化— 空文件不会自动建表,需要下载官方种子数据库
  5. 社交登录在国内可能 403— 用的代理服务不稳定,用邮箱注册就好

常见问题

评论一直转圈→ 99% 是serverURL填错了或 HTTPS 证书有问题。浏览器 F12 → Console 看报错。

管理后台打不开→ URL 路径是/ui,不是/ui/。首次访问应该去/ui/register注册。

Docker pull 太慢→ 配镜像加速:

sudotee/etc/docker/daemon.json<<-'EOF' { "registry-mirrors": [ "https://docker.xuanyuan.me", "https://docker.1ms.run", "https://docker.m.daocloud.io" ] } EOFsudosystemctl daemon-reload&&sudosystemctl restartdocker

Waline 是我用过最省心的自建评论系统——一个容器、一个 SQLite 文件、几行配置就全搞定了。有问题欢迎在评论区交流,博客地址见主页。

http://www.jsqmd.com/news/939122/

相关文章:

  • Ubuntu 20.04 下遇到 ‘System has not been booted with systemd‘ 报错?别慌,这可能是你的 WSL 或 Docker 环境在捣鬼
  • Veo 2提示词失效真相大揭秘:底层token映射机制拆解+动态权重调优公式(附Python校验脚本)
  • 2026年Q2精益设备管理服务评测:精益设备管理变革/精益财务变革/精益财务管理/精益质量管理变革/精益仓储变革/选择指南 - 优质品牌商家
  • 终极OpenCore配置指南:如何用OpCore-Simplify快速构建Hackintosh系统
  • 如何快速部署AI量化交易平台:TradingAgents-CN专业投资者的完整指南
  • 2026年苏园再生费用排名,源头工厂价更实惠 - mypinpai
  • 6种现代压缩算法加持,7-Zip-zstd如何让文件处理效率提升300%
  • 终极免费Mac鼠标指针定制指南:告别单调光标的快速解决方案
  • 2026上海瓷砖空鼓修复哪家靠谱?本地7家免砸砖注浆维修公司推荐 - 苏易修缮
  • OpenEuler欧拉系统X86版,保姆级YUM源配置教程(含离线/内网场景)
  • 终极神界原罪2模组管理器:告别模组冲突,享受流畅游戏体验
  • 中文医疗对话数据集的战略价值:构建下一代AI医疗基础设施的核心资产
  • 如何快速掌握163MusicLyrics:免费音乐歌词提取终极指南
  • 工业吸尘器品牌哪家好?杰力科清洁设备怎么样? - mypinpai
  • 2026模具干冰清洗机技术分享:干冰喷射清洗机/干冰清洗机多少钱/干冰清洗设备/模具干冰清洗机/水冷不锈钢组件去毛刺/选择指南 - 优质品牌商家
  • 进阶利器与最佳实践——成为团队里的 Git 高手
  • android app自动化 已经能从评论区截屏中获取到OCR结果
  • 基于AVR IoT GW的智能病床灯:远程生命体征监测系统设计与实现
  • 基于Arduino与TEA5767的FM收音机DIY:从I2C通信到系统调试全解析
  • 2026最新!写会议纪要总熬夜加班?这5款免费实用神器,亲测10分钟搞定好用到哭!
  • 2026年6月各大token费用比较------无缓存命中版本
  • Python量化投资终极指南:如何免费获取通达信实时行情数据
  • QKeyMapper:打破设备壁垒,重塑Windows输入体验
  • 2026年软质高速自复位拉链门好用吗? - mypinpai
  • 2026年新发布陕西礼品盒公司专业度解析:郑州敏捷包装制品有限公司深度评测 - 2026年企业资讯
  • 基于树莓派与光电传感器的智能曲棍球桌自动计分系统设计与实现
  • APP内调用AI基本架构
  • 抖音下载器完整指南:3分钟学会批量下载无水印视频与封面
  • 单片机内存实验
  • 别再手动查漏洞了!用OWASP DependencyCheck给你的Maven项目做个自动化安全体检(附Jenkins集成)