中文文档 | English
一个简单的博客服务器。基于 Node.js、Next.js 和 SQLite。
项目名称尚未确定,也许你可以给我一些建议?
- 支持 WebFinger, ActivityPub 联邦宇宙协议的评论系统(默认关闭)
- 支持 GFM (GitHub Flavored Markdown)
- 在线编辑文章
- React Server Components
- 多语言支持 (基于
next-intel
) - Docker 快速部署
- 后台定制网站
- 在线上传自定义封面
- 全局搜索
项目还有很多功能未实现,但已经达到了正常使用的程度。欢迎提出建议和贡献代码。 数据库部分应该不会出现不向前兼容的情况,但配置文件和环境变量可能会有变化。
注意: master 分支是开发分支,可能出现 无法运行、数据库不兼容修改等,请使用 Release 版本。
关于内存占用,由于使用 Node.js 且没有进行特殊优化(懒+不会+为了部署简单),和编译型语言自然比不了。空载状态下约 220MB,渲染一篇 3W 字的包含大量数学公式的文章额外使用约 20MB (仅首次渲染时,持续小于1秒),因此流量不大的博客一般使用 300MB。 经过几次激进的渲染逻辑的优化,内存占用和渲染速度都有了明显的提升,即时渲染产生的损耗已经可以忽略不计。
下载 docker-compose.yml
到本地
wget https://raw.githubusercontent.com/skyone-wzw/blog-server/master/docker-compose.yml
编辑环境变量(如为本地测试无需修改)
DATABASE_URL
: 数据库文件路径,默认为file:./data/data.db
DATA_DIR
: 数据目录,默认为./data
SECRET_KEY
: AES 加密密钥,必填,长度为 32 的字符串SECRET_IV
: AES 加密向量,必填,长度为 16 的字符串AUTH_EMAIL
: 后台登录邮箱,必填AUTH_PASSWORD
: 后台登录密码,必填
docker-compose up -d
打开浏览器访问 http://localhost:3000
。
从 Release 下载最新版本的预编译版。解压至任意目录,同步数据库并启动服务器:
npm prisma generate
npm run start
打开浏览器访问 http://localhost:3000
。
Note
已知构建时可能出现内存泄漏(eslint@8 依赖库问题),正在等待修复,运行时不会出现问题。
若要本地构建,至少需要 2GB 内存。
首先克隆这个仓库并安装依赖
git clone https://github.com/skyone-wzw/blog-server.git --depth=1
cd blog-server
npm install
构建程序
npx prisma generate
npm run run patch-font
npm run build
创建运行目录并拷贝构建产物
cp -r .next/standalone build
cp -r .next/static build/.next/static
cp -r public build/public
后续步骤与 从 Release 下载预编译版 相同,执行目录位于 build
。
有两个配置文件:.env
和 data/config.json
。其他自定义内容(如网站标题、Logo、作者等)可以在网站后台设置。
在 .env
(位于项目根目录)文件中,你可以设置数据目录和数据库文件的路径,写入该文件的环境变量会被自动加载,当然直接设置环境变量也是可以的。
# Required
DATABASE_URL="file:./data/data.db"
# Optional, default is ./data
DATA_DIR=./data
# Optional, you can set it in data/config.json
SECRET_KEY="12345678123456781234567812345678"
SECRET_IV="1234567812345678"
AUTH_EMAIL[email protected]
AUTH_PASSWORD=123456
data/config.json
(data 目录由环境变量 DATA_DIR
指定)文件是环境变量的代替方案。如果你不想使用环境变量,也可以选择配置文件。但无论如何,你必须设置 DATABASE_URL
环境变量。
注意:环境变量优先级高于配置文件。
参考下面的示例,所有选项均为可选:
{
"auth": {
"email": "",
"password": ""
},
"secret": {
"key": "",
"iv": ""
},
"dir": {
"data": "./data",
"image": "./data/post",
"cover": "./data/cover",
"random": "./data/cover/random",
"custom": "./data/custom",
"cache": "./data/cache"
}
}
环境变量优先级高于配置文件,且环境变量在加载配置文件之后读取,但
DATA_DIR
例外,因为配置文件的位置也由DATA_DIR
确定。简而言之,配置文件位于
$DATA_DIR/config.json
,环境变量优先级高于配置文件。
环境变量中:
DATA_DIR
: 数据目录DATABASE_URL
: 数据库文件路径,格式为file:/path/to/database.db
SECRET_KEY
: AES 加密密钥SECRET_IV
: AES 加密向量AUTH_EMAIL
: 后台登录邮箱AUTH_PASSWORD
: 后台登录密码
配置文件中:
auth.email
: 后台登录邮箱auth.password
: 后台登录密码secret.key
: AES 加密密钥secret.iv
: AES 加密向量dir.data
: 数据目录,建议使用环境变量DATA_DIR
dir.image
: 文章图片目录,不建议修改dir.cover
: 文章封面背景图目录,不建议修改dir.random
: 文章封面背景图随机目录,不建议修改dir.custom
: 自定义文件目录,不建议修改dir.cache
: 缓存目录,不建议修改
目前尚未实现前端上传功能,你可以通过 FTP 或其他方式上传图片到服务器。
默认情况下,文章封面背景图是随机的。你可以在 data/cover/random
目录下放置你的图片。路径为 data/cover/[slig].(jpg|png|webp)
的图片会被对应文章的封面使用。具体匹配规则如下:
- 查找
data/cover/[slug].(jpg|png|webp)
,如果存在则使用,存在多个格式则随机选择一个 - 查找
data/cover/random/
,如果存在则随机选择一个 - 若程序启动时未找到任何图片,则创建
data/cover/random/default.webp
作为默认图片