FlecBlog 是一个三端分离的博客系统,围绕内容创作这件事,做了相对完整的一套产品闭环。
把前台博客、后台管理、后端服务拆分成清晰的三个部分,让内容系统既能保持表现力,也能维持长期可维护性。
| 模块 | 技术栈 | 定位 |
|---|---|---|
server |
Go 1.25 / Gin / GORM / PostgreSQL | 后端服务、认证、接口、数据与定时任务 |
admin |
Vue 3 / Element Plus / Vite | 内容管理、仪表盘、编辑器、运营后台 |
blog |
Nuxt 4.3.1 / Vue 3.5 / SCSS | 博客前台、SSR、SEO、阅读体验 |
为什么选择 FlecBlog
- 有完整工程结构,而不是只做出一个页面展示
- 管理端与博客端解耦,前后台体验更纯粹
- 支持文章、评论、友链、统计等博客常见能力
- 适合个人品牌博客,也适合继续扩展成内容型产品
| 博客首页 | 文章详情 |
|---|---|
| 后台仪表盘 | 后台编辑器 |
|---|---|
- 语言: Go 1.25
- 框架: Gin
- ORM: GORM
- 数据库: PostgreSQL
- 认证: JWT (JSON Web Tokens), OAuth2, Goth
- API 文档: Swagger
- 定时任务: Cron
- 其他: User-Agent 解析, 飞书 SDK, 微信公众号
- 框架: Vue 3 + Vite
- UI 组件: Element Plus
- 状态管理: VueUse
- Markdown 编辑器: CodeMirror 6
- 图表: ECharts, echarts-wordcloud
- 其他: TypeScript, Vue Router, Axios, dayjs, SCSS
- 框架: Nuxt 4 - Vue.js 全栈框架
- 文章渲染: markdown-it, Highlight.js, Mermaid
- 样式: SCSS
- SEO: @nuxtjs/seo, Sitemap, Atom Feed
- PWA: @vite-pwa/nuxt
- 其他: TypeScript, VueUse, dayjs, Lenis, medium-zoom, APlayer
FlecBlog 提供了交互式安装器 flecb,支持一键安装、升级、备份和配置管理。
安装方式:
curl -fsSL https://install.flec.top | sudo bash主要功能:
flecb install- 交互式安装 FlecBlogflecb upgrade- 升级到最新版本flecb reconfig- 修改配置(端口、API地址等)flecb backup- 备份和恢复数据flecb uninstall- 卸载 FlecBlogflecb version- 查看版本信息
安装流程:
- 运行安装命令
curl -fsSL https://install.flec.top | sudo bash - 选择部署方式(Docker 部署)
- 配置端口(Server、Blog、Admin)
- 确认配置后自动拉取镜像并启动服务
- 访问管理端创建管理员账户
特点:
- 全交互式引导,无需手动编辑配置文件
- 自动检测端口冲突
- 支持一键升级和回滚
- 内置数据备份和恢复功能
适合需要自定义配置或已有 Docker 环境的用户。
- 创建
.env文件:
# Database Configuration
DB_PASSWORD=your_database_password
# JWT Configuration
JWT_SECRET=your_jwt_secret_key
# Site Configuration
API_URL=https://api.yourdomain.com/api/v1- 创建
docker-compose.yml文件:
services:
server:
image: talen8/flec-server:latest
container_name: flec_server
restart: unless-stopped
environment:
DB_HOST: localhost
DB_PORT: 5432
DB_NAME: postgres
DB_USER: postgres
DB_PASSWORD: ${DB_PASSWORD}
JWT_SECRET: ${JWT_SECRET}
ports:
- "8080:8080"
volumes:
- /srv/flecblog:/app/data
networks:
- flec-network
blog:
image: talen8/flec-blog:latest
container_name: flec_blog
restart: unless-stopped
environment:
NUXT_PUBLIC_API_URL: ${API_URL}
ports:
- "3000:3000"
networks:
- flec-network
depends_on:
- server
admin:
image: talen8/flec-admin:latest
container_name: flec_admin
restart: unless-stopped
environment:
API_URL: ${API_URL}
ports:
- "4000:4000"
networks:
- flec-network
depends_on:
- server
networks:
flec-network:
driver: bridge包含 PostgreSQL 的完整配置(点击展开)
services:
postgres:
image: postgres:15-alpine
container_name: flec_postgres
restart: unless-stopped
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- flec-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
server:
image: talen8/flec-server:latest
container_name: flec_server
restart: unless-stopped
environment:
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: postgres
DB_USER: postgres
DB_PASSWORD: ${DB_PASSWORD}
JWT_SECRET: ${JWT_SECRET}
ports:
- "8080:8080"
volumes:
- /srv/flecblog:/app/data
networks:
- flec-network
depends_on:
postgres:
condition: service_healthy
blog:
image: talen8/flec-blog:latest
container_name: flec_blog
restart: unless-stopped
environment:
NUXT_PUBLIC_API_URL: ${API_URL}
ports:
- "3000:3000"
networks:
- flec-network
depends_on:
- server
admin:
image: talen8/flec-admin:latest
container_name: flec_admin
restart: unless-stopped
environment:
API_URL: ${API_URL}
ports:
- "4000:4000"
networks:
- flec-network
depends_on:
- server
networks:
flec-network:
driver: bridge
volumes:
postgres_data:- 启动服务:
docker-compose up -d| 服务 | 地址 |
|---|---|
| 博客端 | http://localhost:3000 |
| 管理端 | http://localhost:4000 |
| API 文档 | http://localhost:8080/swagger/index.html |
- Node.js 20+ (admin, blog)
- Go 1.25 (server)
- PostgreSQL 12+ (server)
需要先安装并配置 PostgreSQL 数据库(12+),创建数据库和用户。
应用会在首次启动时自动执行 pkg/database/sql/init_database.sql 初始化数据库,包括创建表结构和初始数据。
⚠️ PostgreSQL 15+ 权限配置:如果使用 PostgreSQL 15 或更高版本,且数据库用户不是postgres(超级用户),需要额外配置 schema 权限:sudo -i -u postgres psql -U postgres -d <数据库名> -c "GRANT CREATE ON SCHEMA public TO <用户名>;"PostgreSQL 15+ 默认限制了普通用户在 public schema 上的创建权限,上述命令会授予必要的权限。
cd server
go mod download
cp .env.example .env
# 编辑 .env 配置数据库连接
go run cmd/main.gocd admin
npm install
cp .env.example .env
# 编辑 .env 配置 API 地址
npm run devcd blog
npm install
cp .env.example .env
# 编辑 .env 配置 API 地址
npm run devServer 环境变量
# JWT 配置
JWT_SECRET=your_jwt_secret_key
# 服务器配置
SERVER_PORT=8080
SERVER_ALLOW_ORIGINS=*
# 数据库配置
DB_HOST=localhost
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PASSWORD=your_database_passwordAdmin 环境变量
VITE_API_URL=https://api.yourdomain.com/api/v1Blog 环境变量
NUXT_PUBLIC_API_URL=https://api.yourdomain.com/api/v1Blog 端采用 Nuxt 4 的 SSR 模式,提供:
- 更好的 SEO 优化,搜索引擎可直接抓取完整内容
- 更快的首屏加载速度
- 更好的用户体验
集成完整的 SEO 功能:
- 动态 sitemap.xml
- robots.txt
- Atom Feed 订阅
- Open Graph 标签
- 结构化数据
服务启动后,访问以下地址查看 API 文档:
http://localhost:8080/swagger/index.html
server/
├── api/ # API 定义
│ ├── middleware/ # 中间件 (认证、CORS、日志、限流、RBAC等)
│ ├── router/ # 路由配置
│ └── v1/ # API v1 版本接口
├── cmd/ # 应用入口
│ └── main.go
├── config/ # 配置管理
├── docs/ # Swagger 生成的文档
├── internal/ # 内部业务逻辑
│ ├── dto/ # 数据传输对象
│ ├── model/ # 数据模型
│ ├── repository/ # 数据访问层
│ └── service/ # 业务逻辑层
├── pkg/ # 可复用的包
├── templates/ # 模板文件
├── Dockerfile
└── go.mod
admin/
├── src/
│ ├── api/ # API 接口
│ ├── assets/ # 静态资源
│ ├── components/ # 公共组件
│ ├── layouts/ # 页面布局
│ ├── router/ # 路由配置
│ ├── types/ # TypeScript 类型定义
│ ├── utils/ # 工具函数
│ ├── views/ # 页面组件
│ ├── App.vue # 根组件
│ └── main.ts # 入口文件
├── public/ # 公共文件
├── index.html # HTML 模板
├── vite.config.ts # Vite 配置
├── nginx.conf # Nginx 配置
└── Dockerfile # Docker 配置
blog/
├── app/ # 应用主目录
│ ├── assets/ # 静态资源
│ ├── components/ # Vue 组件
│ ├── composables/ # 组合式函数
│ ├── layouts/ # 页面布局
│ ├── pages/ # 页面路由
│ ├── plugins/ # Nuxt 插件
│ ├── utils/ # 工具函数
│ └── app.vue # 根组件
├── public/ # 公共文件
├── server/ # 服务端代码
│ ├── plugins/ # 服务端插件
│ └── routes/ # API 路由
├── types/ # TypeScript 类型定义
├── nuxt.config.ts # Nuxt 配置
└── Dockerfile # Docker 配置
FlecBlog 想做的不是“更复杂”,而是“更完整”。
简约,不是把内容做空。 高级,也不是故作夸张。
它更像一个安静但可靠的内容容器, 适合长期写作,也适合慢慢生长出自己的品牌风格。
欢迎提交 Issue 和 Pull Request!
如有问题,请通过以下方式联系:
- Email: talen2004@163.com
- Issues: GitHub Issues