前言
最近想给自己的博客添加评论系统,于是找到了Waline,在自己的服务器上部署,测试了nodejs,也试过了docker部署
Waline 是一款简洁、强大的评论系统,非常适合集成到个人博客中。
但是不管怎么折腾,都遇到同一个问题,就是部署好后去https://my_server_name/waline/ui 去注册的时候,都会提示500 Not Initialized。
并且有报错如下:
500: SQLITE_ERROR: no such table: wl_Users\
并且我还测试过不同的数据库:MongoDB,SQLite,MySQL,都是一样的结果。
最后发现其实是一个问题:没有使用初始化文件
一、准备工作
1. 服务器环境
- 一台运行 Linux 的服务器(推荐 Ubuntu)。
- 确保已安装 Docker 和 Docker Compose。
- 以下教程采用SQLite数据库,如果你喜欢其他数据库,可以自行替换。
如果没有安装docker, 使用以下命令安装:
# 找个合适的位置,先运行这个
curl -fsSL https://get.docker.com -o get-docker.sh
# 再运行这个
sudo sh get-docker.sh
注意: 如果是24.03版以上的docker,自带compose,且不用-连接,直接使用docker compose命令。
2. 准备项目目录
创建一个专门用于存放 Waline 配置和数据的目录,比如:
mkdir -p ~/waline/data
cd ~/waline
二、部署 Waline 服务
1. 编写 docker-compose.yml
在 ~/waline 目录下创建并编辑 docker-compose.yml 文件:
vim docker-compose.yml
如果没有vim,可以使用vi命令。
vi docker-compose.yml
粘贴以下内容,务必根据您的实际情况修改配置项(标记为 # 替换... 的部分):
注意:此时这个文件位于~/waline/docker-compose.yml。
version: '3'
services:
waline:
container_name: waline
image: lizheming/waline:latest
restart: always
ports:
- 8360:8360 # 主机端口:容器端口。可调整主机端口(如 3000:8360)
volumes:
- ${PWD}/data:/app/data # 将当前目录下的 data 映射到容器数据目录
environment:
TZ: 'Asia/Shanghai' # 设置时区
# SQLite 数据库配置
SQLITE_PATH: '/app/data' # SQLite 数据库文件路径
JWT_TOKEN: 'your_jwt_token' # [!]用于 API 认证,务必设置为复杂且安全的字符串
# 站点基础配置
SITE_NAME: 'your_blog_name' # [!]替换为你的博客名称
SITE_URL: 'https://your-domain.com' # [!]替换为你的博客 URL
SECURE_DOMAINS: 'your-domain.com' # [!]替换为你的域名
# 站长邮箱 (可选,用于后台找回密码等)
AUTHOR_EMAIL: 'your-email@example.com' # [!]替换为你的邮箱
# 邮件通知配置 (用于评论通知,如果不需要可不配置)
# SMTP_SERVICE: '163' # SMTP 服务商 (如 Gmail, 163)
# SMTP_USER: 'your-email@163.com' # 发件邮箱
# SMTP_PASS: 'your-smtp-password' # SMTP 密码或授权码
保存并退出编辑器。
2.下载初始 SQLite 文件(重要!)
Waline 使用 SQLite 时,需要一个预初始化的数据库文件来创建表结构。(我就是在这一步卡了很久)
我为您准备的下载链接:点击下载默认初始化waline.sqlite文件
如果你是在linux系统中下载的,可以使用以下命令:
wget https://linhanping.com/share/waline/waline.sqlite
将下载的 waline.sqlite 文件移动到您创建的 data 目录下:
mv ./waline.sqlite data/waline.sqlite
此时,你的~/waline目录下应该有:
~/waline/
├── docker-compose.yml
├── data/
└── waline.sqlite
注意: 如果没有这个初始文件,Waline 启动时会因为找不到表(如
no such table: wl_Users)而报错。
3. 启动 Waline 服务
在 ~/waline 目录下运行 Docker Compose 启动服务:
docker compose up -d
4. 检查服务状态
检查容器是否正常运行,你应该能看到一个名为 waline 的容器正在运行。
docker ps
使用docker日志查看
docker logs waline
如果看到类似 Server running at http://0.0.0.0:8360 的消息,说明启动成功。
5. 配置Nginx服务
配置Nginx可以使得你更方便访问Waline后台
在你的nginx的conf中配置
server {
listen 443 ssl http2;
server_name your-domain.com;
root /var/www/your-domain.com;
index index.html index.htm;
# ...以上是你自己的nginx配置...
# ======================================
# Waline 反向代理(必须放在最前面)
# ======================================
# Waline UI
location /waline/ {
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-Proto https;
proxy_set_header X-Forwarded-Host $host;
}
# Waline API
location /api/ {
proxy_pass http://127.0.0.1:8360/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
}
# ================================
# 其他 server 块
# ================================
# ...以下是你自己的nginx配置...
# ...
}
保存并退出编辑器。然后重启nginx。
systemctl restart nginx
三、客户端配置以及初次使用
1. 配置博客的客户端配置文件
# 以 Hugo 配置为例(通常是 config.yaml 或 hugo.yaml)
params:
comments: # 评论系统配置
enabled: true # 启用评论功能
provider: waline # 使用 Waline 作为评论提供者
waline: # Waline 配置
serverURL: https://你的服务域名或IP:端口/ # !!! 替换为你的 Waline 服务地址 !!!
lang: zh-cn
# 其他可选配置...
部署好后,进入https://your-domain.com/waline/ui 进行注册,注册的第一个用户将自动成为 管理员。
如果填写完信息并成功注册,没有报错500,恭喜你,部署成功了!
如果有报错,前往服务器使用docker logs waline,查看日志,根据日志提示解决问题。
2. 前端集成 (通用)
如果主题不支持,您需要手动在博客的页面模板(如
layouts/partials/footer.html或文章页模板)中添加 Waline 客户端代码:
示例代码不一定适用于你的情况,可单独查阅合理放置位置
{{- if .Site.Params.waline.serverURL }}
<div id="waline"></div>
<script type="module">
import { init } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';
// 调试函数:检查 dark 模式状态
function debugWalineTheme() {
const isDark = document.body.classList.contains('dark');
const prefTheme = localStorage.getItem('pref-theme');
console.log('[Waline Debug]', {
'body.dark class': isDark,
'localStorage pref-theme': prefTheme,
'dark selector': 'body.dark'
});
return isDark;
}
// 初始化 Waline
// dark 选项设置为 CSS 选择器,Waline 会自动检测 body.dark 类并切换主题
const walineInstance = init({
el: '#waline',
serverURL: '{{ .Site.Params.waline.serverURL }}',
lang: '{{ .Site.Params.waline.lang }}',
// Dark 模式配置:使用 CSS 选择器自动检测 body.dark 类
dark: 'body.dark',
// 表情包配置
emoji: [
'https://unpkg.com/@waline/emojis@latest/weibo',
'https://unpkg.com/@waline/emojis@latest/qq',
],
});
// 调试:初始化时输出状态
console.log('[Waline] 评论组件已初始化,Dark 模式:', debugWalineTheme());
// 监听主题切换(用于调试)
const themeToggle = document.getElementById('theme-toggle');
if (themeToggle) {
themeToggle.addEventListener('click', () => {
setTimeout(() => {
console.log('[Waline] 主题切换后,Dark 模式:', debugWalineTheme());
}, 200);
});
}
</script>
{{- else }}
<!-- Waline评论未配置:请在hugo.yaml中配置params.waline.serverURL -->
{{- end }}