blog-server/README.md
2024-12-27 21:03:54 +08:00

202 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Blog-Server
![License](https://img.shields.io/github/license/skyone-wzw/blog-server) ![GitHub Release](https://img.shields.io/github/v/release/skyone-wzw/blog-server)
<p align="center">中文文档 | <a href="README.en.md">English</a></p>
<p align="center">一个简单的博客服务器。基于 Node.js、Next.js 和 SQLite。</p>
![preview](previews/preview01.png)
[更多预览](#更多预览)
> 项目名称尚未确定,也许你可以给我一些建议?
## 特点
* [x] 支持 WebFinger, [ActivityPub](https://zh.wikipedia.org/wiki/ActivityPub) [联邦宇宙](https://zh.wikipedia.org/wiki/联邦宇宙)协议的评论系统(默认关闭)
* [x] 支持 GFM (GitHub Flavored Markdown)
* [x] 在线编辑文章
* [x] React Server Components
* [x] 多语言支持 (基于 `next-intel`)
* [x] Docker 快速部署
* [x] 后台定制网站
* [x] 在线上传自定义封面
* [ ] 全局搜索
项目还有很多功能未实现,但已经达到了正常使用的程度。欢迎提出建议和贡献代码。 数据库部分应该不会出现不向前兼容的情况,但配置文件和环境变量可能会有变化。
**注意:** master 分支是开发分支,可能出现 无法运行、数据库不兼容修改等,请使用 Release 版本。
~~关于内存占用,由于使用 Node.js 且没有进行特殊优化(懒+不会+为了部署简单),和编译型语言自然比不了。空载状态下约 220MB渲染一篇 3W 字的包含大量数学公式的文章额外使用约 20MB 仅首次渲染时持续小于1秒因此流量不大的博客一般使用 300MB。~~ 经过几次激进的渲染逻辑的优化,内存占用和渲染速度都有了明显的提升,即时渲染产生的损耗已经可以忽略不计。
## 快速开始
### 使用 Docker 运行
下载 `docker-compose.yml` 到本地
```shell
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`: 后台登录密码,必填
```shell
docker-compose up -d
```
打开浏览器访问 `http://localhost:3000`
### 从 Release 下载预编译版
从 [Release](https://github.com/skyone-wzw/blog-server/releases) 下载最新版本的预编译版。解压至任意目录,同步数据库并启动服务器:
```shell
npm prisma generate
npm run start
```
打开浏览器访问 `http://localhost:3000`
### 从源码构建
> [!NOTE]
> 已知构建时可能出现内存泄漏eslint@8 依赖库问题),正在等待修复,运行时不会出现问题。
>
> 若要本地构建,至少需要 2GB 内存。
首先克隆这个仓库并安装依赖
```bash
git clone https://github.com/skyone-wzw/blog-server.git --depth=1
cd blog-server
npm install
```
构建程序
```shell
npx prisma generate
npm run run patch-font
npm run build
```
创建运行目录并拷贝构建产物
```shell
cp -r .next/standalone build
cp -r .next/static build/.next/static
cp -r public build/public
```
后续步骤与 [从 Release 下载预编译版](#从-release-下载预编译版) 相同,执行目录位于 `build`
## 配置
有两个配置文件:`.env``data/config.json`。其他自定义内容如网站标题、Logo、作者等可以在网站后台设置。
### 环境变量
`.env` (位于项目根目录)文件中,你可以设置数据目录和数据库文件的路径,写入该文件的环境变量会被自动加载,当然直接设置环境变量也是可以的。
```ini
# 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=abc@example.com
AUTH_PASSWORD=123456
```
### 配置文件
`data/config.json` data 目录由环境变量 `DATA_DIR` 指定)文件是环境变量的代替方案。如果你不想使用环境变量,也可以选择配置文件。但无论如何,你必须设置 `DATABASE_URL` 环境变量。
**注意:环境变量优先级高于配置文件。**
参考下面的示例,所有选项均为可选:
```json
{
"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)` 的图片会被对应文章的封面使用。具体匹配规则如下:
1. 查找 `data/cover/[slug].(jpg|png|webp)`,如果存在则使用,存在多个格式则随机选择一个
2. 查找 `data/cover/random/`,如果存在则随机选择一个
3. 若程序启动时未找到任何图片,则创建 `data/cover/random/default.webp` 作为默认图片
## 更多预览
![preview02](previews/preview02.png)
![preview03](previews/preview03.png)
![preview04](previews/preview04.png)
## 开源许可证
[MIT](LICENSE)