不仅是博客,也是全新的内容基础设施。
GrtBlog 是一个面向创作者的博客系统,以纯静态 HTML 分发实现极致首屏速度,通过 WebSocket 实现毫秒级实时更新,并内置联合社交协议让博客不再是孤岛。
联合协议仍在内测和修复中,将在 v2.1.0 正式发布。 旧版已归档至 https://github.com/grtsinry43/grtblog-legacy
特性
- 极速加载 — 页面以纯静态 HTML 分发,首屏 < 0.5s,Go 后端宕机时 Nginx 仍可降级只读服务
- 实时更新 — WebSocket 驱动的内容热更新,修改文章后读者无需刷新即可看到最新内容
- 联合社交 — 自有联合协议 + ActivityPub 兼容,Mastodon 等 Fediverse 平台可关注你的博客
- 丰富内容 — 文章、手记 (Moments)、思考 (Thinking)、友链、时间线,满足多种表达需求
- 管理后台 — 美观且功能完备的 Vue 3 后台,Markdown 实时预览、评论管理、数据统计
- 一键部署 — Docker Compose 一键启动,多架构镜像 (amd64/arm64) 自动打包,方便拉取
架构
┌──────────┐
│ 用户/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)脚本会自动检测环境、选择镜像源、生成密钥、下载配置并启动服务。
手动安装
首次启动会自动拉取镜像、运行数据库迁移。
- 博客首页:
http://your-server-ip - 管理后台:
http://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 rendererNginx 无需重启,自动发现新容器。
本地开发
# 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 开发 |
数据迁移(v1 -> v2)
已提供 API 迁移脚本:scripts/migrate-v1-to-v2.mjs
使用说明见:scripts/migrate-v1-to-v2.md
致谢
本项目的许多设计灵感与交互理念来源于 Innei 的 Shiro,包括布局、文章手记、创作律动等模块的视觉风格与体验设计均深受其启发,万分感谢 Innei 大佬为开源社区带来的优秀作品!
from https://github.com/grtsinry43/grtblog
No comments:
Post a Comment