kolezka/facebook-eye

GitHub: kolezka/facebook-eye

一款针对 Facebook 的全栈 OSINT 爬虫,集 API、仪表盘和自动化爬虫于一体,使用 Postgres 和 Neo4j 分别管理状态与社交图谱数据。

Stars: 0 | Forks: 0

# facebook-eye Facebook 爬虫 — 由 Postgres(运行状态)和 Neo4j(图数据)提供支持的三个可部署单元(api + web + crawler)。 ## 目录结构 ``` apps/ api/ Hono on Bun — REST endpoints, webhook dispatcher, serves SPA web/ React + Vite — dashboard SPA crawler/ Node 24 LTS — Trigger.dev tasks running Playwright (Local | Browserbase) packages/ db/ Drizzle schemas + migrations (Postgres) graph/ Neo4j driver + Cypher schema + repository fns browser/ BrowserDriver interface + Local + Browserbase impls crypto/ AES-GCM session encryption shared/ Zod schemas, types, URL parsers ``` ## 技术 - Runtime:`api` 和 `web` 使用 Bun;`crawler` 使用 Node 24 LTS(出于 Playwright 的可靠性) - API:Hono,具有结构化日志记录 (pino)、请求 ID、速率限制和优雅停机功能 - 前端:React + Vite + TanStack Query + Tailwind,包含错误边界和 toast 提示 - Job 编排:Trigger.dev v4(自托管于 `trigger.raqz.link`) - 数据库:Postgres 16,Neo4j 5 - ORM:Drizzle (Postgres) + neo4j-driver (Neo4j) ## 快速开始(开发模式 — 应用运行在宿主机) ``` cp .env.example .env # Generate a 32-byte hex key for SESSION_ENCRYPTION_KEY: openssl rand -hex 32 # Set APP_SECRET to anything reasonably long. bun install bun run dev:db # postgres + neo4j via docker compose bun --filter @fbeye/db migrate # apply schema bun run dev:api # :3000 bun run dev:web # :5173 (proxies /api → :3000) bun run dev:crawler # trigger.dev local dev ``` Postgres 运行在 `:5434` 端口(避免与 `:5432` 系统服务和 `:5433` mtcuteweb 冲突)。Neo4j 运行在 `:7474`/`:7687` 端口。 ## 开发模式 — 完全容器化(与生产环境保持一致) `docker-compose.dev.yml` 包含一个 `app` 配置,使用其 `dev` 目标构建 `Dockerfile.api`/`Dockerfile.crawler`,并绑定挂载源码以实现热重载(Bun `--watch`、Vite HMR、Trigger.dev `dev`)。 ``` # DBs only (default, identical to bun run dev:db): docker compose -f docker-compose.dev.yml up -d # Full stack with hot reload: docker compose -f docker-compose.dev.yml --profile app up # api → http://localhost:3000 # web → http://localhost:5173 # crawler logs in foreground; trigger.dev dev needs `npx trigger.dev login` # at least once on the host (creds are mounted via your shell's home). ``` 每个容器化的工作区都有自己独立的 `*-node-modules` 命名卷,这样宿主机的绑定挂载就不会覆盖容器内已安装的依赖项。 ## 生产环境部署 本仓库提供了三个多目标 Dockerfile 和一个生产环境的 `docker-compose.yml`,用于编排 postgres → migrate(一次性运行) → api → 可选的 crawler-runner,全部带有健康状态检查门控。CI 会在每次推送到 `main` 分支时将镜像推送到 GHCR: - `ghcr.io//facebook-eye-api:{latest,}` — Hono API + 打包好的 SPA(Bun 运行时,非 root 用户) - `ghcr.io//facebook-eye-migrate:{latest,}` — 一次性 Drizzle 迁移器 - (`ghcr.io//facebook-eye-crawler:{latest,}` — Node 24 + Playwright + Trigger.dev SDK;在本地构建,在生产环境中可选) ### 1. 准备一台已安装 docker compose 的主机。 ### 2. 生成密钥。 ``` openssl rand -hex 32 # SESSION_ENCRYPTION_KEY (must be 32 bytes hex / 64 chars) openssl rand -hex 24 # APP_SECRET openssl rand -hex 24 # INTERNAL_API_SECRET ``` ### 3. 配置环境变量。 ``` cp .env.compose.example .env.compose # Fill in everything; required vars use ${VAR:?required} so compose will fail # fast if any are missing. ``` ### 4. 初始化 Trigger.dev 项目。 ``` cd apps/crawler npx trigger.dev@latest login --api-url https://trigger.raqz.link npx trigger.dev@latest init --project-ref # Paste the ref into TRIGGER_PROJECT_ID in .env.compose, and the secret key # from the Trigger.dev dashboard into TRIGGER_SECRET_KEY. ``` ### 5. 启动技术栈。 ``` # Pull pre-built images from GHCR (or omit `pull` to build locally): docker compose --env-file .env.compose pull docker compose --env-file .env.compose up -d docker compose --env-file .env.compose logs -f api ``` api 将会: - 阻塞等待 postgres 健康检查通过 - 等待一次性 migrate 容器成功退出 - 暴露 `/health`(始终返回 200)和 `/ready`(仅在数据库可达时返回 200) 要在同一台主机上运行自托管的 Trigger.dev runner(例如,当这台主机具有您希望爬虫流量来源的住宅 IP 时),请启用 `crawler-runner` 配置: ``` docker compose --env-file .env.compose --profile crawler-runner up -d ``` ### 6. 部署 crawler 任务。 ``` cd apps/crawler npx trigger.dev@latest deploy ``` 在具有您希望爬虫使用的住宅 IP 的任意主机上运行自托管的 Trigger.dev runner;它会自动接收 `crawl-target` 任务。 ## 运维 - **健康/就绪状态**:`GET /health`(进程运行中),`GET /ready`(数据库可达) - **日志**:pino JSON 格式;本地可通过管道传输给 `pino-pretty` - **认证**:仪表盘发送 `x-app-secret` 请求头(存储在 localStorage 中)。Worker→api 回调使用 `x-internal-secret`。 - **速率限制**:`/api/*` 路由限制为每个 IP 每分钟 120 次请求(内存存储;若横向扩展请替换为 redis) - **幂等性**:每个目标只能有一个待处理/运行中的抓取任务;第二次 `POST /api/crawl-runs` 将返回 `409` 以及现有任务的 id - **取消卡住的任务**:`POST /api/crawl-runs/:id/cancel` ## CI 推送/PR 时的 GitHub Actions: 1. `verify`:格式检查(Prettier)、Lint(ESLint)、类型检查(`tsc`)、测试(`bun test`)、web 构建 2. `docker`(仅限 main 分支):构建并推送 `ghcr.io//facebook-eye-{api,migrate}:{latest,}` ## 脚本 ``` bun run typecheck # tsc across all workspaces bun run lint # eslint bun run format # prettier --write bun run format:check # prettier --check (CI) bun test # bun:test, all *.test.ts files bun run build # build every workspace bun run dev:db # docker compose up -d (postgres + neo4j) bun run dev:db:down bun run dev:api / dev:web / dev:crawler ```
标签:API框架, Bun, Docker, Drizzle ORM, Facebook OSINT, GNU通用公共许可证, Hono, MITM代理, Neo4j, Node.js, Playwright, Postgres, React, REST API, SPA, Syscalls, Trigger.dev, TypeScript, URL抓取, Vite, 代码示例, 单页应用, 安全插件, 安全监控, 安全防御评估, 数据分析, 数据抓取, 浏览器自动化, 特征检测, 目标画像, 社交媒体图谱, 社交媒体监控, 自动化攻击, 请求拦截