重要声明: Firecrawl 采用 AGPL 协议,默认不允许商业化使用。LangChat Pro 仅提供接入支持,用户需自行处理版权和许可证问题,LangChat 团队不承担任何相关责任。在使用前请仔细阅读相关许可证条款。
Firecrawl 简介: Firecrawl 是一个强大的网页爬虫服务,支持 JavaScript 渲染、内容提取和结构化数据抓取,为 LangChat Pro 提供网页内容获取功能。
快速部署
使用 Docker Compose 部署
LangChat Pro 项目根目录提供了完整的 Firecrawl 部署配置,位于 docs/docker/firecrawl/ 目录下。
进入部署目录
cd docs/docker/firecrawl/
配置环境变量
创建或修改 .env 文件:# 基础配置
PORT=3002
INTERNAL_PORT=3002
REDIS_URL=redis://redis:6379
# AI模型配置
OPENAI_API_KEY=your_openai_api_key
OPENAI_BASE_URL=https://api.openai.com/v1
MODEL_NAME=gpt-3.5-turbo
MODEL_EMBEDDING_NAME=text-embedding-ada-002
# 可选:Ollama本地模型
OLLAMA_BASE_URL=http://localhost:11434
# 搜索引擎配置
SEARXNG_ENDPOINT=http://localhost:8081
SEARXNG_ENGINES=google,bing,duckduckgo
SEARXNG_CATEGORIES=general
# 代理配置(可选)
PROXY_SERVER=
PROXY_USERNAME=
PROXY_PASSWORD=
# 日志级别
LOGGING_LEVEL=info
启动服务
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f api
验证部署
# 检查API服务是否正常运行
curl http://localhost:3002/health
# 检查Playwright服务
curl http://localhost:3000/scrape
服务架构
组件说明
Firecrawl 由以下核心组件组成:
主要功能: 提供 RESTful API 接口,处理爬虫请求和响应配置:
- 端口:3002(外部)
- 依赖:Redis、Playwright Service
- 环境:生产模式
特点:
- 支持并发请求处理
- 提供健康检查接口
- 集成 AI 模型处理
主要功能: 后台任务处理,执行异步爬虫任务配置:
- 无外部端口暴露
- 依赖:Redis、Playwright Service、API
- 环境:本地模式
特点:
- 处理长时间运行的爬虫任务
- 支持任务队列管理
- 提供任务状态监控
主要功能: 网页渲染和内容提取配置:
- 端口:3000(内部)
- 环境:TypeScript 版本
- 支持:JavaScript 渲染
特点:
- 基于 Playwright 引擎
- 支持现代网页渲染
- 可配置代理和媒体屏蔽
主要功能: 缓存和任务队列管理配置:
- 端口:6379(内部)
- 镜像:redis:alpine
- 网络:backend
特点:
配置详解
Docker Compose 配置
项目提供的 docker-compose.yml 文件包含了完整的 Firecrawl 部署配置:
name: firecrawl
x-common-service: &common-service
build: apps/api
ulimits:
nofile:
soft: 65535
hard: 65535
networks:
- backend
extra_hosts:
- "host.docker.internal:host-gateway"
services:
playwright-service:
build: apps/playwright-service-ts
environment:
PORT: 3000
PROXY_SERVER: ${PROXY_SERVER}
PROXY_USERNAME: ${PROXY_USERNAME}
PROXY_PASSWORD: ${PROXY_PASSWORD}
BLOCK_MEDIA: ${BLOCK_MEDIA}
networks:
- backend
api:
<<: *common-service
environment:
HOST: "0.0.0.0"
PORT: ${INTERNAL_PORT:-3002}
FLY_PROCESS_GROUP: app
ENV: local
depends_on:
- redis
- playwright-service
ports:
- "${PORT:-3002}:${INTERNAL_PORT:-3002}"
command: [ "pnpm", "run", "start:production" ]
worker:
<<: *common-service
environment:
FLY_PROCESS_GROUP: worker
ENV: local
depends_on:
- redis
- playwright-service
- api
command: [ "pnpm", "run", "workers" ]
redis:
image: redis:alpine
networks:
- backend
command: redis-server --bind 0.0.0.0
networks:
backend:
driver: bridge
环境变量配置
| 变量名 | 说明 | 默认值 | 必需 |
PORT | 外部访问端口 | 3002 | 否 |
INTERNAL_PORT | 内部服务端口 | 3002 | 否 |
REDIS_URL | Redis 连接地址 | redis://redis:6379 | 否 |
LOGGING_LEVEL | 日志级别 | info | 否 |
| 变量名 | 说明 | 默认值 | 必需 |
OPENAI_API_KEY | OpenAI API 密钥 | - | 是 |
OPENAI_BASE_URL | OpenAI API 地址 | https://api.openai.com/v1 | 否 |
MODEL_NAME | 使用的模型名称 | gpt-3.5-turbo | 否 |
MODEL_EMBEDDING_NAME | 嵌入模型名称 | text-embedding-ada-002 | 否 |
OLLAMA_BASE_URL | Ollama 服务地址 | - | 否 |
| 变量名 | 说明 | 默认值 | 必需 |
SEARXNG_ENDPOINT | SearXNG 服务地址 | - | 否 |
SEARXNG_ENGINES | 搜索引擎列表 | google,bing,duckduckgo | 否 |
SEARXNG_CATEGORIES | 搜索分类 | general | 否 |
| 变量名 | 说明 | 默认值 | 必需 |
PROXY_SERVER | 代理服务器地址 | - | 否 |
PROXY_USERNAME | 代理用户名 | - | 否 |
PROXY_PASSWORD | 代理密码 | - | 否 |
BLOCK_MEDIA | 是否屏蔽媒体 | - | 否 |
LangChat Pro 集成
配置 Firecrawl 服务
在 LangChat Pro 的配置文件中添加 Firecrawl 服务配置:
langchat:
firecrawl:
enabled: true
url: http://127.0.0.1:3002
timeout: 30
max_retries: 3
api_key: your_firecrawl_api_key
| 参数 | 说明 | 默认值 |
enabled | 是否启用 Firecrawl 服务 | true |
url | Firecrawl API 服务地址 | http://127.0.0.1:3002 |
timeout | 请求超时时间(秒) | 30 |
max_retries | 最大重试次数 | 3 |
api_key | API 访问密钥 | - |
Firecrawl 在 LangChat Pro 中的应用:
- 网页内容抓取:获取网页的完整内容和结构化数据
- 实时信息更新:抓取最新的网页内容进行信息更新
- 内容分析:结合 AI 模型对网页内容进行分析和总结
- 知识库构建:自动抓取网页内容构建知识库
- 数据收集:收集特定网站的数据用于训练和分析
API 使用
基础爬虫接口
# 基础网页抓取
curl -X POST http://localhost:3002/scrape \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"pageOptions": {
"waitFor": 2000,
"screenshot": false
}
}'
响应示例:{
"success": true,
"data": {
"markdown": "# 页面标题\n\n页面内容...",
"html": "<html>...</html>",
"screenshot": null,
"metadata": {
"title": "页面标题",
"description": "页面描述"
}
}
}
# 批量网页抓取
curl -X POST http://localhost:3002/scrape/bulk \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://example1.com",
"https://example2.com"
],
"pageOptions": {
"waitFor": 2000
}
}'
# 提取结构化数据
curl -X POST http://localhost:3002/scrape \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"pageOptions": {
"waitFor": 2000
},
"extractors": {
"title": "h1",
"content": ".main-content",
"links": "a[href]"
}
}'
服务管理
常用命令
# 启动所有服务
docker-compose up -d
# 仅启动特定服务
docker-compose up -d api worker
# 启动并查看日志
docker-compose up api
# 停止所有服务
docker-compose down
# 停止并删除数据卷
docker-compose down -v
# 停止特定服务
docker-compose stop api
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs api
# 实时查看日志
docker-compose logs -f worker
# 查看资源使用
docker stats firecrawl-api-1
# 重新构建镜像
docker-compose build
# 重新创建容器
docker-compose up -d --force-recreate
# 完整更新流程
docker-compose down
docker-compose build --no-cache
docker-compose up -d
故障排查
常见问题
# 检查端口占用
netstat -tlnp | grep 3002
# 检查 Docker 服务状态
docker ps -a | grep firecrawl
# 查看详细错误日志
docker-compose logs api
常见原因:
- 端口 3002 被占用
- 环境变量配置错误
- 源码构建失败
- 网络连接问题
# 检查 Playwright 服务
curl http://localhost:3000/scrape
# 检查 Redis 连接
docker exec firecrawl-redis-1 redis-cli ping
# 查看爬虫日志
docker-compose logs playwright-service
排查步骤:
- 确认所有服务正在运行
- 检查网络连接
- 验证环境变量配置
- 查看详细错误日志
# 检查资源使用
docker stats
# 检查 Redis 内存使用
docker exec firecrawl-redis-1 redis-cli info memory
# 查看任务队列状态
docker-compose logs worker
优化建议:
- 增加 Redis 内存限制
- 调整并发连接数
- 优化爬虫策略
- 使用代理服务
性能优化
资源配置
services:
api:
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 1G
worker:
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
playwright-service:
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
services:
api:
environment:
- MAX_CONCURRENT_REQUESTS=10
- REQUEST_TIMEOUT=30000
worker:
environment:
- WORKER_CONCURRENCY=5
- TASK_TIMEOUT=60000
services:
redis:
command: redis-server --bind 0.0.0.0 --maxmemory 1gb --maxmemory-policy allkeys-lru
volumes:
- redis-data:/data
安全配置
访问控制
# 在 .env 文件中设置
API_KEY=your_secure_api_key
AUTH_ENABLED=true
在 API 请求中使用:curl -X POST http://localhost:3002/scrape \
-H "Authorization: Bearer your_secure_api_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
services:
api:
networks:
- backend
ports:
- "127.0.0.1:3002:3002" # 仅允许本地访问
# 在 .env 文件中配置代理
PROXY_SERVER=socks5://proxy.example.com:1080
PROXY_USERNAME=username
PROXY_PASSWORD=password
监控和维护
健康检查
services:
api:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3002/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
worker:
healthcheck:
test: ["CMD", "pgrep", "-f", "workers"]
interval: 30s
timeout: 10s
retries: 3
日志管理
services:
api:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
worker:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
备份策略
#!/bin/bash
# backup-firecrawl.sh
BACKUP_DIR="/opt/backups/firecrawl"
DATE=$(date +%Y%m%d_%H%M%S)
# 备份 Redis 数据
docker exec firecrawl-redis-1 redis-cli BGSAVE
sleep 5
docker cp firecrawl-redis-1:/data/dump.rdb $BACKUP_DIR/redis_$DATE.rdb
# 备份配置文件
tar -czf $BACKUP_DIR/config_$DATE.tar.gz .env docker-compose.yml
# 清理旧备份(保留30天)
find $BACKUP_DIR -name "*.rdb" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
许可证说明
AGPL 许可证重要提醒:
- 开源要求:使用 AGPL 软件时,如果通过网络提供服务,必须开源整个应用程序
- 商业限制:AGPL 对商业使用有严格限制,需要仔细评估
- 合规责任:用户需自行确保许可证合规,LangChat 不承担相关责任
- 替代方案:考虑使用其他许可证的替代方案
建议:
- 在商业环境中使用前,请咨询法律专家
- 考虑使用 MIT 或 Apache 许可证的替代工具
- 确保理解并遵守 AGPL 的所有条款