【免费下载链接】freehire
freehire — the open-source search engine for job seekers
freehire 是一个开源的工作搜索引擎(job search engine),从数百个 ATS 招聘平台持续抓取职位,提供面状筛选、申请跟踪与 AI 分析能力。这篇指南帮助新贡献者从零搭起本地开发环境:涵盖最实用的make命令速查、sqlc代码再生成流程,以及一套与 CI 完全对齐的 pre-commit 检查清单。
一、安装前置依赖
在动手之前,先确认本机具备以下工具(详见 CONTRIBUTING.md 与 AGENTS.md):
| 工具 | 用途 | 说明 |
|---|---|---|
| Go 1.26+ | 后端编译与测试 | go.mod 声明go 1.26.9 |
| Docker 或 Podman | 启动本地全套服务 | Makefile 会自动探测,docker 缺失时回退 podman,也可用make DOCKER=podman up手动指定 |
| Node.js + pnpm | 前端(web/、design-system/)构建与检查 | 浏览器扩展extension/使用 npm |
| lefthook、golangci-lint、gitleaks | pre-commit 钩子 | govulncheck可选,缺失时仅告警 |
克隆仓库并进入根目录:
git clone https://gitcode.com/gh_mirrors/fr/freehire cd freehire💡 约定俗成的第一条规则:你必须理解自己提交的代码。小 PR 评审最快;架构级改动建议先开 issue 对齐方案。
二、make up 一键启动本地环境
freehire 的所有本地服务(Postgres + Meilisearch + Redis + S3 + API + 前端)都由 docker-compose.yml 编排,一条命令即可拉起:
make up # 等价于 docker compose up --build -d curl localhost:8080/health curl localhost:8080/api/v1/jobs各服务与端口一览:
| 服务 | 镜像 | 默认端口 |
|---|---|---|
| db(Postgres 18 + pgvector) | pgvector/pgvector:pg18 | 5432 |
| meilisearch(全文/面状搜索) | getmeili/meilisearch:v1.49.0 | 7700 |
| redis(限流) | redis:7-alpine | 6379 |
| s3(简历存储 mock) | adobe/s3mock:5.2.3 | 9000 |
| app(Go API) | 本地构建 | 8080 |
| web(SvelteKit SSR) | 本地构建 | 8090 |
首次初始化卷时,migrations/目录会挂载进/docker-entrypoint-initdb.d,全部迁移自动执行。启动成功后,本地职位列表页面长这样:
两个高频运维命令:
make down # 停止并移除容器 make logs # 跟踪应用日志(compose logs -f app)⚠️注意:修改已存在的迁移文件不会重新应用到已有卷上。需要重置数据库时执行docker compose down -v && make up,或对已有卷手动补跑make migrate。
三、两种本地开发模式
- 全 Docker 模式:
make up,前后端全部跑在容器里,适合快速验证功能。 - 宿主机进程模式:数据库仍用容器,服务器跑在宿主机上,调试体验更好:
docker compose up -d db # 只启动数据库 make run # 宿主机上运行 server,读取 DATABASE_URL宿主机模式下,把 .env.example 复制为.env按需调整——JWT_SECRET是必填项(缺失或不足 32 字节时服务器直接拒绝启动);OAuth 与 LLM 凭据均为可选项,不配置时对应功能自动降级为禁用。
如果服务器跑在宿主机上,部分功能还需要这些可执行文件在PATH中:
| 二进制 | 包 | 用途 |
|---|---|---|
pdftotext | poppler-utils | CV 文本提取,缺失时上传会报模糊的 "invalid PDF" |
typst(0.15.0) | 静态发行版 | CV 的 PDF 导出,缺失时 PDF 端点返回 501 |
google-chrome/chromium | 可选 | 仅自动投递等无头浏览器场景需要 |
启动整套服务后,你可以像真实用户一样体验 freehire 的面状筛选与保存过滤器:
四、Make 命令速查表
Makefile 提供了完整开发工作流,执行make help可随时查看全部命令:
| 命令 | 作用 |
|---|---|
make up/make down | 启动 / 停止全套容器 |
make run | 在宿主机运行 API 服务器 |
make build | 编译出bin/hire二进制 |
make sqlc | 通过容器从 SQL 再生成数据库代码(无需本地安装 sqlc) |
make reindex | 从 Postgres 全量重建 Meilisearch 职位索引 |
make psql | 直接进入数据库容器的 psql |
make migrate | 对已有卷手动补跑迁移 |
make tidy | go mod tidy整理依赖 |
make mail-preview | 渲染全部出站邮件并在浏览器打开预览 |
make gen-contracts | 从 Go 契约类型再生成web/src/lib/generated/contracts.ts |
make gen-cities | 从 GeoNames 数据再生成城市表 |
make cv-previews | 从 CV 模板再生成 SVG 预览(需 typst) |
make cover/cover-html | 单元测试覆盖率报告 |
make cover-integration | 集成标签测试覆盖率(需 Docker testcontainers) |
五、sqlc 代码再生成流程
freehire 用 sqlc 实现"类型安全的数据库访问":你不写 ORM,你写 SQL,Go 代码由 sqlc 生成。关键路径:
- 查询源文件:internal/platform/db/queries/(每个领域一张
.sql文件) - 模式来源:migrations/
- 生成物(已提交入库):internal/platform/db/
sqlc.yaml 将模式指向migrations、查询指向internal/platform/db/queries,输出到internal/platform/db,驱动为pgx/v5。
贡献者的铁律:
- 永远编辑
queries/*.sql,不要手改internal/platform/db/下的生成代码; - 每次修改查询或迁移后,立即执行
make sqlc并提交再生成结果——该命令通过容器运行固定版本(1.31.1)的 sqlc,团队之间零版本漂移; - 永远不要修改已应用的迁移,一律新增迁移文件(expand/contract 策略)。
make sqlc # 一行完成:docker run sqlc generatepre-commit 阶段有专门的sqlc-drift钩子替你兜底:它会重新执行make sqlc,如果发现 internal/platform/db/ 下出现未暂存的漂移(包括从未提交的新文件),直接拦截提交——"改了查询却没再生成"这种事故在本地就会被拦下。
六、安装 pre-commit 钩子(lefthook)
钩子配置集中在 lefthook.yml,每个克隆只需安装一次:
go install github.com/evilmartians/lefthook@latest lefthook install主要检查项按职责分组:
| 钩子 | 检查内容 | 特点 |
|---|---|---|
go-fmt/go-vet | 暂存的 Go 文件格式与静态检查 | 基础卫生 |
golangci-lint | 静态分析 | 棘轮模式:只对本次改动引入的新问题失败,历史欠债不阻塞 |
govulncheck | Go 标准库/依赖漏洞 | 当前仅告警(warn-only) |
sqlc-drift | 生成代码是否过期 | 自动再生成并比对 |
sql-migrations | 新增迁移的 squawk 检查 | 由 scripts/check-migrations.mjs 执行,只查本次新增的迁移 |
doc-links | 全仓库相对 Markdown 链接可达性 | scripts/check-doc-links.mjs,防止文档链接悄悄失效 |
gitleaks | 暂存区密钥扫描 | 唯一"预防"而非"报告"的钩子:未安装时直接失败,拒绝假装扫描过 |
web-lint/extension-lint | 前端 eslint | 分别覆盖web/与extension/ |
design-system-* | 设计系统 lint / check / test / dist / tokens | 对齐design-systemCI 的快速检查 |
💡 棘轮策略与 CI 完全一致,所以本地通过 ≈ CI 通过;gitleaks与 CI 的gitleaksworkflow 是"两道闸门、两个时刻",--no-verify跳过本地钩子后,CI 仍会扫描全部历史。
七、提交前自检清单(与 CI 对齐)
改完代码、推送之前,把这组命令跑一遍(摘自 CONTRIBUTING.md):
gofmt -l . # 必须无输出 go build ./... go vet ./... go test ./... # 单元测试(无外部依赖) go vet -tags=integration ./... # 廉价守卫:编译带 integration 标签的文件,秒级如果改动涉及 Docker 依赖行为(查询、schema、handler),再跑完整集成套件:
go test -tags=integration ./... # 需要 Docker(testcontainers)⚠️
go test ./...不会编译任何//go:build integration文件——只改签名也能骗过前三条命令,vet -tags=integration是防漏网的最便宜保险,建议每次推送前都执行。
前端改动(web/)则按顺序构建,design-system 必须先于消费方:
cd design-system && pnpm install && pnpm build cd ../web && pnpm install && pnpm run check && pnpm run build提交前再生成清单——源变了,产物必须一起提交:
- 改了
internal/platform/db/queries/*.sql或migrations/→ 执行make sqlc - 改了 Go 契约类型 → 执行
make gen-contracts
八、常见问题速答
- 8080 端口被占用?换宿主机端口再启动:
HIRE_HOST_PORT=8090 make up(DB_HOST_PORT、MEILI_HOST_PORT同理)。 - 改了迁移但数据库没生效?已初始化的卷不会重放迁移:
docker compose down -v && make up重置,或make migrate手动补跑。 - 钩子报 "Generated code was stale"?说明
make sqlc刚替你修好了漂移,把结果git add进本次提交即可。 - 能用
--no-verify跳过钩子吗?能,但 CI 会重新检查并扫描完整历史——本地跳过只是让红色结果来得更早一点。
环境就绪后,从一个小 PR 开始:修一个 typo、补一个测试、给 cmd/ 下某个 worker 加文档,都是被欢迎的贡献方式。祝提交顺利 🚀
【免费下载链接】freehire
freehire — the open-source search engine for job seekers
相关推荐
Tuist生成器开发环境搭建:贡献者指南
Tuist生成器开发环境搭建:贡献者指南 作为一款用于管理Xcode项目的开源工具,Tuist(发音为"toist")已经被多家知名企业采用,包括Monday.
开发工具CLI后端云原生Citra 3DS 模拟器教程:从安装到调参,图形后端怎么选一次讲清
Citra 3DS 模拟器教程:从安装到调参,图形后端怎么选一次讲清 Citra 是一款免费开源的 3DS 模拟器,能把 .cia、.3ds 游戏文件完整搬到
向Autoprompt贡献代码:开发环境搭建、契约再生成与PR流程完全指南
向Autoprompt贡献代码:开发环境搭建、契约再生成与PR流程完全指南 Autoprompt 是一个 coding agent skill,能将 agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考