稍后阅读和书签管理类开源应用转了一圈,各有各的好和问题,最后还是选择了Omnivore。它的主要问题是私有化部署支持并不理想。
为了解决这个问题,最为核心的就是要想办法替换强依赖的GCS组件,同时要尽可能减少源代码的改动,以便后续更新升级。因此,就写了一个适配器组件gs-s3-adapter,大致如下:
基于minio-js实现的google/storage部分接口。主要用于Omnivore的私有部署场景,用来替换项目中使用的@google-cloud/storage包,从而尽可能避免修改代码直接部署使用。
使用
需要修改Omnivore项目的packages/api/Dockerfile和packages/content-fetch/Dockerfile文件,此处以api为例
1.打开packages/api/Dockerfile文件 2.找到:
RUN yarn install --pure-lockfile --production
3.在这之后添加替换代码
RUN yarn install --pure-lockfile --production
# Replace @google-cloud/storage with gcs-s3-adapter
RUN yarn add --ignore-workspace-root-check gcs-s3-adapter
RUN rm -rf /app/node_modules/@google-cloud/storage
RUN ln -s /app/node_modules/gcs-s3-adapter /app/node_modules/@google-cloud/storage
4.修改docker-compose.yml,添加S3相关环境变量
environment:
- S3_HOST=192.168.x.x
- S3_PORT=xxxx
# optional
- S3_ACCESS_KEY=xxx
- S3_SECRET_KEY=xxx
...
5.构建并启动
docker-compose build api
docker-compose up -d
content-fetch与此类似
其它相关问题
存储问题解决后依然还有一些其它的问题需要,有的必须要处理,有的则是可选项
message queue(必须)
content-fetch服务在抓取内容结束后,通过queue通知api服务。api服务需要启动一个queue processor来处理content-fetch的返回,否则会一直block。目前已知的方式有两种:
•修改packages/api/server.ts
...
import { createWorker } from './queue-processor'
...
const main = async (): Promise<void> => {
...
// redis is optional for the API server
if (env.redis.cache.url) {
await redisDataSource.initialize()
}
// create queue processor
let worker
if (redisDataSource.workerRedisClient) {
worker = createWorker(redisDataSource.workerRedisClient)
}
...
}
•修改docker-compose.yml,添加新的服务,配置与api基本一致,增加command参数
services:
...
queue:
build:
context: .
dockerfile: ./packages/api/Dockerfile
container_name: "omnivore-queue"
command: ["yarn", "workspace", "@omnivore/api", "start_queue_processor"]
...
请注意:此方法未测试,请自行修改尝试
最后,以上两种方式,都需要添加redis相关的环境变量:
services:
...
api:
environment:
- REDIS_URL=redis://redis:6379
image proxy(可选)
默认,docker-compose里是没有部署image proxy的,如需要相关功能需要自行添加部署:
services:
imageproxy:
build:
context: ./imageproxy
dockerfile: ./Dockerfile
container_name: "omnivore-image-proxy"
ports:
- "4001:8080"
environment:
- AWS_ACCESS_KEY_ID=xxx
- AWS_SECRET_KEY=xxxx
- IMAGE_PROXY_SECRET=some-secret
- MEM_CACHE_SIZE_MB=100
- GCS_IMAGES_PATH=s3://fake-region/omnivore-image/imgs?endpoint=<ip>:<port>&disableSSL=1&s3ForcePathStyle=1
请注意,AWS_ACCESS_KEY_ID与AWS_SECRET_KEY必须赋值,即使你的S3无加密。
Starting puppeteer browser
启动puppeteer时会一直卡在这里,或者报个连接错误。
原因是puppeteer-extra-plugin-adblocker会在启动时到Github上下载一个list文件,因为众所周知的原因需要特殊处理一下。
目前没有找到特别好的办法,采用修改hosts方式,重新映射Github IP来解决的。
如果有更好的办法,希望不吝赐教。