现代化博客系统 — 静态先行、实时注水、联合社交
GrtBlog 是一个面向创作者的博客系统,以纯静态 HTML 分发实现极致首屏速度,通过 WebSocket 实现毫秒级实时更新,并内置联合社交协议让博客不再是孤岛。
联合协议仍在内测和修复中,将在 v2.1.0 正式发布。 旧版已归档至 https://github.com/grtsinry43/grtblog-legacy
┌──────────┐
│ 用户/CDN │
└────┬─────┘
│
┌────▼─────┐
│ Nginx │ 静态文件优先,回退到 SSR
└────┬─────┘
│
┌─────────────┼─────────────┐
│ │ │
┌─────▼─────┐ ┌────▼────┐ ┌──────▼──────┐
│ 静态 HTML │ │ Go API │ │ Admin SPA │
│ │ │ :8080 │ │ (Vue 3) │
└───────────┘ └────┬────┘ └─────────────┘
│
┌────────────┼────────────┐
│ │ │
┌─────▼─────┐ ┌───▼───┐ ┌──────▼──────┐
│ PostgreSQL │ │ Redis │ │ SvelteKit │
│ │ │ │ │ Renderer │
└────────────┘ └───────┘ └─────────────┘
三个平面:
| 平面 | 组件 | 职责 |
|---|---|---|
| 控制平面 | Go (Fiber) | API、ISR 调度、WebSocket Hub、联合协议、认证鉴权 |
| 渲染平面 | SvelteKit | SSR 渲染工厂,由 Go 后端驱动生成静态 HTML |
| 数据平面 | Nginx | 静态文件分发、反向代理、降级只读网关 |
ISR (Incremental Static Regeneration): 内容变更时,Go 后端计算受影响路径 → 请求 SvelteKit 渲染 → 原子写入静态文件 → WebSocket 广播实时更新。
| 层 | 技术 |
|---|---|
| 后端 | Go 1.24+, Fiber, GORM, Goose, Casbin, JWT |
| 前台 | SvelteKit, Svelte 5 (Runes), Tailwind CSS v4, TanStack Query |
| 后台 | Vue 3.5, Naive UI, Tailwind CSS, Pinia, Vite |
| 数据库 | PostgreSQL 17 |
| 缓存 | Redis 7 |
| 部署 | Docker Compose, Nginx, GitHub Actions, GHCR / Docker Hub / CNB |
一键安装(推荐):
bash <(curl -fsSL https://raw.githubusercontent.com/grtsinry43/grtblog/main/deploy/install.sh)
# 国内:
bash <(curl -fsSL https://cnb.cool/grtsinry43/grtblog/-/git/raw/main/deploy/install.sh)
脚本会自动检测环境、选择镜像源、生成密钥、下载配置并启动服务。
# 创建部署目录
mkdir -p grtblog && cd grtblog
# 下载部署配置(国际)
BASE_URL="https://raw.githubusercontent.com/grtsinry43/grtblog/main"
# 国内加速:
# BASE_URL="https://cnb.cool/grtsinry43/grtblog/-/git/raw/main"
curl -fsSL "$BASE_URL/deploy/docker-compose.yml" -o docker-compose.yml
curl -fsSL "$BASE_URL/deploy/.env.example" -o .env
mkdir -p nginx
curl -fsSL "$BASE_URL/deploy/nginx/nginx.conf" -o nginx/nginx.conf
# 编辑 .env:设置 IMAGE_REPO_PREFIX、APP_VERSION、密码和密钥
# IMAGE_REPO_PREFIX=ghcr.io/grtsinry43/
# APP_VERSION=2.0.2 # 查看 Releases 页面获取最新版本
# POSTGRES_PASSWORD=<强密码>
# AUTH_SECRET=<openssl rand -hex 32>
# 国内服务器推荐使用 CNB 镜像源:
# IMAGE_REPO_PREFIX=docker.cnb.cool/grtsinry43/grtblog/
# 启动
mkdir -p storage/html storage/uploads storage/geoip
docker compose up -d
首次启动会自动拉取镜像、运行数据库迁移。
http://your-server-iphttp://your-server-ip/admin/git clone https://github.com/grtsinry43/grtblog.git
# 国内加速:
# git clone https://cnb.cool/grtsinry43/grtblog.git
cd grtblog/deploy
cp .env.example .env
# 编辑 .env:设置密码和密钥(IMAGE_REPO_PREFIX 留空)
mkdir -p storage/html storage/uploads storage/geoip
docker compose up -d --build
详细部署说明见 部署文档。
# 修改 .env 中的 APP_VERSION,然后:
docker compose pull server renderer
docker compose up -d server renderer
Nginx 无需重启,自动发现新容器。
# 1. 后端
cd server && cp .env.example .env && make migrate-up && make run # :8080
# 2. 管理后台
cd admin && pnpm i && pnpm dev # :5799
# 3. 前台
cd web && pnpm i && pnpm dev # :5173
详细开发说明见 CONTRIBUTING.md。
grtblog-v2/
├── server/ # Go 后端(控制平面)
├── web/ # SvelteKit 前台(渲染平面)
├── admin/ # Vue 3 管理后台
├── shared/ # 前端共享代码(Markdown 组件等)
├── deploy/ # Docker Compose 部署配置
├── scripts/ # 工具脚本(发布、迁移等)
└── docs/ # 文档(VitePress)
| 文档 | 说明 |
|---|---|
| 项目介绍 | 核心特性与定位 |
| 快速部署 | 部署步骤与配置 |
| 写作指南 | 内容创作与管理 |
| 个性化配置 | 站点设置 |
| 架构总览 | 系统设计与 ISR 机制 |
| 后端架构 | Go 服务端 DDD 架构 |
| 前端架构 | SvelteKit 前台设计 |
| 管理后台 | Vue 3 Admin 开发 |
已提供 API 迁移脚本:scripts/migrate-v1-to-v2.mjs
使用说明见:scripts/migrate-v1-to-v2.md
本项目的许多设计灵感与交互理念来源于 Innei 的 Shiro,包括布局、文章手记、创作律动等模块的视觉风格与体验设计均深受其启发,万分感谢 Innei 大佬为开源社区带来的优秀作品!
本项目包含第三方开源软件,详见 THIRD_PARTY_NOTICES.md。