这是 Dugout 的后端服务,负责论坛数据、用户会话、管理操作和统一 API 输出。
当前实现采用以下技术栈:
- Gin 作为 HTTP 框架
- Huma 作为类型化路由注册和 OpenAPI 输出层
- PostgreSQL 作为唯一持久化数据库,启用 pgvector 和 pg_trgm
- Redis 作为必选缓存
- GORM 作为 ORM
cmd/:服务启动入口internal/config/:配置加载、默认值和校验internal/database/:PostgreSQL 初始化、扩展创建和表结构迁移internal/cache/:Redis 客户端和 JSON 缓存封装internal/handlers/:Huma 路由注册与 HTTP 层参数处理internal/repository/:数据访问层,封装业务读写、缓存失效和事务逻辑internal/models/:API DTO 与 GORM 模型internal/ratelimit/:内存限流器config/:本地配置样例Dockerfile、docker-compose.yml:容器化部署
internal/repository 是仓储层(Repository Layer)。名字里的“仓库”不是指 Git 仓库,而是指“数据仓库/存取仓库”的抽象:
- handler 只关心 HTTP 入参、鉴权和返回值,不直接拼 SQL
- repository 统一处理数据库查询、事务、缓存读写和失效
- 业务规则可以集中放在仓储层,避免散落在路由处理函数里
- 后续如果数据库实现或缓存策略变化,handler 侧通常不需要改动
在这个项目里,repository 主要承担以下职责:
- 初始化种子数据
- 读取和更新站点配置
- 读取和维护板块、标签、帖子、举报、申诉等领域数据
- 维护登录会话和管理操作记录
- 对热点读取结果做 Redis 缓存
- Go 1.26+
- Docker Desktop 或兼容的 Docker 环境
- PostgreSQL 16+,建议使用 pgvector 镜像
- Redis 7+
推荐直接使用仓库内的 Compose 编排:
docker compose up -d --build启动后默认会提供:
- 后端服务:
http://localhost:8080 - PostgreSQL:
localhost:5432 - Redis:
localhost:6379
如果不使用 Compose,需要先准备 PostgreSQL 和 Redis,然后修改 config/config.json:
go run ./cmd服务读取 config/config.json,也支持通过环境变量覆盖部分值。
server.port:HTTP 监听端口database.host:PostgreSQL 地址database.port:PostgreSQL 端口database.user:数据库用户名database.password:数据库密码database.name:数据库名cache.redisUrl:Redis 地址cache.redisPassword:Redis 密码cache.redisDb:Redis 数据库编号cache.defaultTtl:缓存默认过期时间security.adminToken:管理接口的管理员令牌
APP_CONFIG:配置文件路径APP_ENV:运行环境PORT:覆盖服务端口ADMIN_TOKEN:覆盖管理员令牌DB_HOSTDB_PORTDB_USERDB_PASSWORDDB_NAMEREDIS_URLREDIS_PASSWORDREDIS_DB
# 运行服务
go run ./cmd
# 执行测试
go test ./...
# 格式化代码
gofmt -w ./
# 启动容器化环境
docker compose up -d --build
# 查看容器日志
docker compose logs -f server当前测试分为三类:
- 配置测试:验证默认值、环境变量覆盖和必填项校验
- 数据库测试:使用真实 PostgreSQL 容器验证迁移和扩展创建
- 仓储与接口测试:使用真实 PostgreSQL 容器和 Redis 替身验证业务流程、缓存和 HTTP 路由
运行 go test ./... 需要本机可访问 Docker,因为测试会自动拉起临时 PostgreSQL 容器。
GET /health
GET /api/v1/bootstrapGET /api/v1/settingsPATCH /api/v1/settings
GET /api/v1/boardsPOST /api/v1/boardsPATCH /api/v1/boards/{id}DELETE /api/v1/boards/{id}GET /api/v1/tagsGET /api/v1/boards/{id}/tagsPOST /api/v1/tags
GET /api/v1/feedGET /api/v1/boards/{id}/postsGET /api/v1/posts/searchPOST /api/v1/postsGET /api/v1/posts/{id}PATCH /api/v1/posts/{id}GET /api/v1/posts/{id}/commentsPOST /api/v1/posts/{id}/commentsPOST /api/v1/posts/{id}/reactionsPOST /api/v1/posts/{id}/favorites/toggle
POST /api/v1/auth/registerPOST /api/v1/auth/loginGET /api/v1/auth/mePOST /api/v1/reportsGET /api/v1/admin/moderationPOST /api/v1/admin/reports/{id}/resolveGET /api/v1/appealsPOST /api/v1/appealsGET /api/v1/admin/config-changes
仓库根目录提供了可直接使用的容器编排:
Dockerfile:后端生产镜像docker-compose.yml:后端、PostgreSQL 和 Redis 的联动启动
Compose 环境默认使用:
- PostgreSQL 镜像:
pgvector/pgvector:pg16 - Redis 镜像:
redis:7-alpine
- PostgreSQL 是唯一支持的数据库后端,sqlite 不再支持
- Redis 是必选依赖,不是可选增强项
- 如果你修改了配置结构,记得同步更新
config/runtime_config_sample.json