waline独立部署踩坑实录

985 字
5 分钟
waline独立部署踩坑实录

也算是这个小破站的第一篇文章

也是随手做了这个博客,感觉评论很有意思,虽然不会有人评论,但是就想搞一哈,万一呢

这个是waline的官方文档,超级简单,也是我踩坑的源头

docker部署(最后放弃了)#

首先在虚拟机上安装了docker,然后创建目录/app/waline,创建docker-compose.yml文件

docker-compose.yml
version: '3'
services:
waline:
container_name: waline
image: lizheming/waline:latest
restart: always
ports:
- 8360:8360
volumes:
- ${PWD}/data:/app/data
environment:
TZ: 'Asia/Shanghai'
SQLITE_PATH: '/app/data'
JWT_TOKEN: 'Your token'
SITE_NAME: 'Your site name'
SITE_URL: 'https://example.com'
SECURE_DOMAINS: 'example.com'
AUTHOR_EMAIL: 'mail@example.com'

里面的环境变量改了一下,执行docker compose up -d发现没问题,开开心心去到页面评论一下,waline的接口直接500

docker compose logs查看日志

waline | [2026-07-13T16:37:50.094] [1] [INFO] - Server running at http://127.0.0.1:8360
waline | [2026-07-13T16:37:50.097] [1] [INFO] - ThinkJS version: 4.0.0
waline | [2026-07-13T16:37:50.097] [1] [INFO] - Environment: production
waline | [2026-07-13T16:37:50.097] [1] [INFO] - Workers: 1
waline |
waline | TypeError: fetch failed
waline |

这种日志我是真的没办法看出是哪里出问题了,所以在官网尝试找到Debug日志在哪里配,最后没找到

所以,我直接放弃

虚拟机部署(可以参照这个)#

TIP

系统为Rocky 9.7

目录介绍:
/app/blog/dist (博客build产物)
/app/waline (waline)

数据库部署及配置#

首先安装mysql

Terminal window
dnf install mysql-server

设置mysql端口不在公网暴露

/etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
bind-address=127.0.0.1
mysqlx-bind-address=127.0.0.1

启动mysql

Terminal window
systemctl enable mysqld --now

初始化数据库

CREATE DATABASE waline DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;
CREATE USER waline IDENTIFIED BY 'waline';
GRANT ALL PRIVILEGES ON waline.* TO waline;
ALTER USER 'waline'@'%' IDENTIFIED WITH mysql_native_password BY 'waline';
FLUSH PRIVILEGES;
USE dbwaline;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
# Dump of table wl_Comment
DROP TABLE IF EXISTS `wl_Comment`;
# ------------------------------------------------------------
CREATE TABLE `wl_Comment` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`comment` text,
`insertedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`ip` varchar(100) DEFAULT '',
`link` varchar(255) DEFAULT NULL,
`mail` varchar(255) DEFAULT NULL,
`nick` varchar(255) DEFAULT NULL,
`pid` int(11) DEFAULT NULL,
`rid` int(11) DEFAULT NULL,
`sticky` boolean DEFAULT NULL,
`status` varchar(50) NOT NULL DEFAULT '',
`like` int(11) DEFAULT NULL,
`ua` text,
`url` varchar(255) DEFAULT NULL,
`createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_comment_url` (`url`),
INDEX `idx_comment_user_id` (`user_id`),
INDEX `idx_comment_status` (`status`),
INDEX `idx_comment_pid_rid` (`pid`, `rid`),
INDEX `idx_comment_created_at` (`createdAt`),
INDEX `idx_comment_updated_at` (`updatedAt`),
INDEX `idx_comment_sticky` (`sticky`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# Dump of table wl_Counter
DROP TABLE IF EXISTS `wl_Counter`;
# ------------------------------------------------------------
CREATE TABLE `wl_Counter` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`time` int(11) DEFAULT NULL,
`reaction0` int(11) DEFAULT NULL,
`reaction1` int(11) DEFAULT NULL,
`reaction2` int(11) DEFAULT NULL,
`reaction3` int(11) DEFAULT NULL,
`reaction4` int(11) DEFAULT NULL,
`reaction5` int(11) DEFAULT NULL,
`reaction6` int(11) DEFAULT NULL,
`reaction7` int(11) DEFAULT NULL,
`reaction8` int(11) DEFAULT NULL,
`url` varchar(255) NOT NULL DEFAULT '',
`createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_counter_url` (`url`),
INDEX `idx_counter_time` (`time`),
INDEX `idx_counter_created_at` (`createdAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# Dump of table wl_Users
DROP TABLE IF EXISTS `wl_Users`;
# ------------------------------------------------------------
CREATE TABLE `wl_Users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`display_name` varchar(255) NOT NULL DEFAULT '',
`email` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`type` varchar(50) NOT NULL DEFAULT '',
`label` varchar(255) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`github` varchar(255) DEFAULT NULL,
`twitter` varchar(255) DEFAULT NULL,
`facebook` varchar(255) DEFAULT NULL,
`google` varchar(255) DEFAULT NULL,
`weibo` varchar(255) DEFAULT NULL,
`qq` varchar(255) DEFAULT NULL,
`oidc` varchar(255) DEFAULT NULL,
`huawei` varchar(255) DEFAULT NULL,
`2fa` varchar(32) DEFAULT NULL,
`createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `idx_user_email` (`email`),
INDEX `idx_user_type` (`type`),
INDEX `idx_user_created_at` (`createdAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

waline部署#

安装nodejs 24

Terminal window
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
\. "$HOME/.nvm/nvm.sh"
nvm install 24

安装waline

Terminal window
mkdir -p /app/waline && cd $_
npm install @waline/vercel

使用systemd管理,请自行修改第5行node的路径

/etc/systemd/system/waline.service
[Unit]
Description=A simple comment system with backend support fork from Valine.
[Service]
ExecStart=/root/.nvm/versions/node/v24.18.0/bin/node /app/waline/node_modules/@waline/vercel/vanilla.js
Restart=always
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
Environment=MYSQL_HOST=127.0.0.1
Environment=MYSQL_PORT=3306
Environment=MYSQL_DB=waline
Environment=MYSQL_USER=waline
Environment=MYSQL_PASSWORD=waline
WorkingDirectory=/app/waline
Environment=SMTP_SERVICE=QQ
Environment=SMTP_USER=你的qq邮箱
Environment=SMTP_PASS=你的qq邮箱密码(不是登录密码)
Environment=SMTP_SECURE=true
Environment=SITE_NAME=邮件中的博客的名字
Environment=SITE_URL=博客地址
Environment=AUTHOR_EMAIL=你的qq邮箱
[Install]
WantedBy=multi-user.target

启动waline

Terminal window
systemctl enable waline --now

nginx配置#

添加对应的路由

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name blog.miraclesses.top;
ssl_certificate /etc/letsencrypt/live/blog.miraclesses.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.miraclesses.top/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
access_log logs/blog_access.log;
location ~ ^/(api|ui|verification) {
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;
proxy_no_cache 1;
proxy_cache_bypass 1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
location / {
root /app/blog/dist ;
index index.html index.htm;
}
}

至此,就算搞定了

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

waline独立部署踩坑实录
https://blog.miraclesses.top/posts/station/waline/
作者
Miracle
发布于
2026-07-13
许可协议
CC BY-NC-SA 4.0
随机文章随机推荐

评论区

Profile Image of the Author
Miracle
不倒点垃圾再走吗
分类
标签
站点统计
文章
2
分类
2
标签
5
总字数
832
运行时长
0
最后活动
0 天前

文章目录