在 Kubernetes 上部署 Karakeep:基于 Kustomize 的完整安装、配置与 HTTPS 暴露指南

在 Kubernetes 上部署 Karakeep:基于 Kustomize 的完整安装、配置与 HTTPS 暴露指南 在 Kubernetes 上部署 Karakeep基于 Kustomize 的完整安装、配置与 HTTPS 暴露指南【免费下载链接】hoarderA self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search项目地址: https://gitcode.com/GitHub_Trending/ho/hoarderKarakeep原 Hoarder是一款自托管的收藏一切应用支持链接、笔记与图片的集中管理并提供基于 AI 的自动标签与全文搜索能力。本文以项目仓库自带的 kubernetes 目录为蓝本完整讲解如何在 Kubernetes 集群上通过 Kustomize 清单部署 Karakeep从环境变量与密钥配置、OpenAI 自动标签接入到 LoadBalancer / Ingress / HTTPS 三种服务暴露方式再到版本升级策略。读完本文你将能够在一台任意规模的 K8s 集群上快速落地一套可对外提供服务、可持续升级的 Karakeep 实例。前置要求在开始之前请确认你的环境中具备以下条件一个可用的Kubernetes 集群本地 Minikube / kind、云厂商托管集群或自建集群均可已安装并配置好kubectl且能够访问目标集群已安装kustomizeKubernetes 1.14 也内置了kubectl kustomize子命令可直接使用。仓库在kubernetes目录下提供了全套部署清单Deployment、Service、PVC、Namespace、Ingress 示例以及配套的Makefile和 Kustomize 配置部署过程本质上就是拷贝目录 → 填配置 →make deploy三步。1. 获取部署清单Karakeep 的 Kubernetes 部署清单集中存放在仓库根目录的 kubernetes 目录下。你既可以克隆整个仓库后使用该目录也可以只把kubernetes目录拷贝到你自己的配置仓库或任意工作目录中方便后续按需修改git clone https://gitcode.com/GitHub_Trending/ho/hoarder.git cp -r kubernetes /path/to/your/k8s-configs/karakeep该目录下的文件与职责如下对应 kubernetes/kustomization.yaml 中resources的引用顺序文件类型职责namespace.yamlNamespace创建名为karakeep的独立命名空间所有资源默认部署在其中web-deployment.yamlDeploymentKarakeep 主应用API Web 界面 后台 Worker监听 3000 端口web-service.yamlService默认以LoadBalancer类型暴露 3000 端口chrome-deployment.yamlDeployment无头 Chrome 浏览器容器供爬虫执行 JS、截图使用chrome-service.yamlServiceClusterIP类型在集群内部以 9222 端口暴露 Chrome 调试接口meilisearch-deployment.yamlDeploymentMeilisearch 全文搜索引擎v1.41.0meilisearch-service.yamlServiceClusterIP类型在集群内部以 7700 端口暴露 Meilisearchmeilisearch-pvc.yamlPersistentVolumeClaimMeilisearch 索引数据的持久卷默认 1Gidata-pvc.yamlPersistentVolumeClaim主应用数据SQLite 数据库与本地资产的持久卷默认 1Giingress_sample.yamlIngress示例 Ingress主机名为karakeep.example.com从清单结构可以看出一套最小的 Karakeep 部署由三个工作负载组成主应用web、无头浏览器chrome和搜索引擎meilisearch。它们通过 Kubernetes 内置 DNS服务名meilisearch:7700、chrome:9222在集群内部互相通信外部流量则统一经由web服务进入。2. 配置环境变量与密钥Karakeep 的主应用主要通过环境变量进行配置全部可用变量以 packages/shared/config.ts 为准。在 Kubernetes 部署场景中这些变量被拆分为两类由 Kustomize 自动注入普通配置KARAKEEP_VERSION、NEXTAUTH_URL、OPENAI_API_KEY等写入.env文件由configMapGenerator生成 ConfigMap敏感密钥NEXTAUTH_SECRET、MEILI_MASTER_KEY等写入.secrets文件由secretGenerator生成 Secret。2.1 生成配置文件在kubernetes目录下执行cp .env_sample .env然后编辑.env。仓库自带的 kubernetes/.env_sample 内容如下# Put your configuration options here NEXTAUTH_URLhttp://localhost:3000 KARAKEEP_VERSIONrelease其中NEXTAUTH_URL必填必须改为你服务器的实际访问地址。它用于 NextAuth 生成正确的回调与跳转地址如果设置错误登出等场景会被重定向到错误地址。例如通过 Ingress 以https://karakeep.example.com访问时应设置为NEXTAUTH_URLhttps://karakeep.example.com。KARAKEEP_VERSION镜像版本标签。默认值release表示拉取最新稳定版如果想控制升级节奏建议固定到具体版本号如KARAKEEP_VERSION0.10.0。该值不只会写入 ConfigMap还会通过 Kustomize 的replacements机制覆盖webDeployment 的镜像 tag详见下文 2.3 节。2.2 配置密钥Karakeep 的密钥同样通过示例文件初始化cp .secrets_sample .secretskubernetes/.secrets_sample 的内容如下NEXTAUTH_SECRETgenerated_secret MEILI_MASTER_KEYgenerated_secret NEXT_PUBLIC_SECRETmy-super-duper-secret-string你应当替换这些示例值尤其是面向公网的部署。仓库官方建议使用以下命令生成随机字符串openssl rand -base64 36各密钥的作用NEXTAUTH_SECRET用于对 JWT 会话令牌签名的随机字符串是认证安全的基础MEILI_MASTER_KEYMeilisearch 的主密钥。由于 Karakeep 与 Meilisearch 部署在同一集群内网生产环境必须显式设置否则搜索功能可能因缺少鉴权而无法工作开发环境则不需要NEXT_PUBLIC_SECRET前端公开环境变量中的自定义密钥同样建议替换为强随机串。2.3 Kustomize 如何把配置注入 Podkubernetes/kustomization.yaml 完整展示了注入机制apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: karakeep secretGenerator: - envs: - .secrets name: karakeep-secrets configMapGenerator: - envs: - .env name: karakeep-configuration resources: - namespace.yaml - web-deployment.yaml - web-service.yaml - chrome-deployment.yaml - chrome-service.yaml - meilisearch-deployment.yaml - meilisearch-service.yaml - meilisearch-pvc.yaml ->envFrom: - secretRef: name: karakeep-secrets - configMapRef: name: karakeep-configurationreplacements块是这里的关键它从 ConfigMap 的KARAKEEP_VERSION字段取值以:为分隔符替换webDeployment 镜像 tag 部分即ghcr.io/karakeep-app/karakeep:tag。这意味着你只需修改.env中的KARAKEEP_VERSIONkustomize build 后镜像版本会自动同步无需直接编辑 Deployment 文件。另外web-deployment.yaml 中还预设了几个容器级环境变量它们不来自.env而是与集群内部服务绑定env: - name: MEILI_ADDR value: http://meilisearch:7700 - name: BROWSER_WEB_URL value: http://chrome:9222 - name: DATA_DIR value: /dataMEILI_ADDRMeilisearch 地址指向集群内 DNS 名BROWSER_WEB_URL无头 Chrome 的调试地址爬虫通过它驱动浏览器执行 JS 与截图DATA_DIR持久数据目录SQLite 数据库所在地资产默认也存储于其下对应挂载的data-pvc卷。2.4 常用环境变量速查除了上文必填项Karakeep 还支持大量可选配置。以下摘录自 docs/versioned_docs/version-v0.32.0/03-configuration/01-environment-variables.md是 Kubernetes 部署中最常用的一组名称必填默认值说明DATA_DIR是未设置持久数据目录数据库存放于此NEXTAUTH_URL是未设置服务器对外地址NEXTAUTH_SECRET是未设置签名 JWT 的随机串用openssl rand -base64 36生成MEILI_ADDR否未设置Meilisearch 地址未设置则搜索被禁用MEILI_MASTER_KEY生产环境必填未设置Meilisearch 主密钥OPENAI_API_KEY否未设置自动标签所需的 OpenAI 密钥DISABLE_SIGNUPS否false设为true禁止新用户注册LOG_LEVEL否debug日志级别生产环境建议notice或warningMAX_ASSET_SIZE_MB否50允许上传的最大资产体积MBDB_WAL_MODE否false启用 SQLite WAL 模式可提升数据库性能RATE_LIMITING_ENABLED否false开启 API 限流WORKERS_ENABLED_WORKERS否未设置逗号分隔的启用的 Worker 列表crawler、inference、search 等WORKERS_DISABLED_WORKERS否未设置逗号分隔的禁用的 Worker 列表优先级高于前者这些变量全部可以直接追加到.env文件中。完整清单含资产存储 S3 后端、OAuth、SMTP、代理、监控等请查阅上面的环境变量文档。3. 配置 OpenAI自动标签Karakeep 的 AI 自动标签功能需要推理后端。最直接的方式是使用 OpenAI在 OpenAI 平台获取 API Key在.env中添加OPENAI_API_KEYkey该密钥会被注入主应用容器inferenceWorker 据此调用 OpenAI 完成对书签内容的标签生成。若你的网络环境需要代理还可以补充OPENAI_PROXY_URL、OPENAI_TIMEOUT_SEC等参数见环境变量文档的 Inference 配置一节。关于调用 OpenAI 的成本估算可参考 docs/versioned_docs/version-v0.32.0/06-administration/03-openai.md。如果你想使用其他 AI 提供方比如通过Ollama 在本地跑推理无需外网、无按量计费只需在.env中设置OLLAMA_BASE_URLhttp://ollama-service:11434并调整INFERENCE_TEXT_MODEL等模型参数。完整的多提供方接入说明参见 docs/versioned_docs/version-v0.32.0/03-configuration/02-different-ai-providers.md。注意自动标签是可选但强烈推荐的功能。如果不配置任何推理后端既无OPENAI_API_KEY也无OLLAMA_BASE_URLKarakeep 仍可正常保存与管理书签只是跳过自动标签环节。4. 部署服务配置完成后在kubernetes目录下直接执行make deploy来看 kubernetes/Makefile 到底做了什么OUTPUT_FILE : _manifest.yaml KUSTOMIZE_BUILD : kustomize build . $(OUTPUT_FILE): $(KUSTOMIZE_BUILD) $(OUTPUT_FILE) build: clean $(OUTPUT_FILE) deploy: $(OUTPUT_FILE) kubectl apply -f $(OUTPUT_FILE) clean: rm -f $(OUTPUT_FILE)流程等价于两条命令kustomize build . _manifest.yaml kubectl apply -f _manifest.yaml即先把kustomization.yaml中声明的所有资源含生成的 Secret、ConfigMap 以及replacements后的镜像 tag渲染成一份聚合清单_manifest.yaml再一次性apply到集群。make deploy依赖$(OUTPUT_FILE)会自动先完成 build。如果你没有安装独立的kustomize二进制也可以使用 kubectl 内置支持kubectl kustomize . | kubectl apply -f -部署完成后可以用以下命令确认各资源状态kubectl -n karakeep get pods,svc,pvc5. 访问服务清单默认将web服务暴露为LoadBalancer类型见 kubernetes/web-service.yaml你还可以按需改用 Ingress并为其配置 TLS。5.1 方式一通过 LoadBalancer IP 访问默认配置下运行kubectl get services在输出中找到web服务对应的 LoadBalancer IP云厂商集群通常会自动分配公网 IP本地集群则可能是 NodePort 映射或 pending 状态然后访问http://loadbalancer-ip:3000如果一切正常你会看到 Karakeep 的Sign In登录页面首次使用可注册账号。提示根据你的集群环境可能更希望用 Ingress 或其他方式暴露服务LoadBalancer 只是默认选项。5.2 方式二通过 Ingress 访问仓库提供了示例 Ingress kubernetes/ingress_sample.yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: karakeep-web-ingress namespace: karakeep spec: rules: - host: karakeep.example.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 3000使用步骤把host改为你自己的 DNS 域名由于 Ingress 需要流量先经过入口控制器而 Service 默认是LoadBalancer类型需要把web服务改为ClusterIP使其仅集群内部可达。如果已经用默认配置部署过直接执行kubectl -n karakeep patch service web -p {spec:{type:ClusterIP}}应用 Ingresskubectl apply -f ingress_sample.yaml之后即可通过你设定的域名访问 Karakeep。5.3 为服务配置 HTTPS要让 Karakeep 以 HTTPS 对外提供服务可以在 Ingress 上挂载预置的 TLS 证书。前提是你已经拥有证书文件.crt与.key。首先在karakeep命名空间中创建 TLS Secretsecret 名称可自定义但必须与 Ingress 中的secretName一致kubectl --namespace karakeep create secret tls karakeep-web-tls --cert/path/to/crt --key/path/to/key然后在 Ingress 的spec中加入tls块spec: tls: - hosts: - karakeep.example.com secretName: karakeep-web-tls注意tls中的hosts必须与 HTTP 规则中的host完全一致否则证书匹配会失败。完整示例如下apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: karakeep-web-ingress namespace: karakeep spec: tls: - hosts: - karakeep.example.com secretName: karakeep-web-tls rules: - host: karakeep.example.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 3000如果你的集群部署了 cert-manager 等证书自动签发组件也可以让 Ingress 自动管理证书而不必手工创建 Secret。6. [可选] 配置快捷收藏扩展部署完成后为了让日常收藏更顺手可以安装配套的移动端 App 与浏览器扩展。详细步骤参见 docs/versioned_docs/version-v0.32.0/04-using-karakeep/quick-sharing.md。扩展需要填写你的服务器地址即第 2 节配置的NEXTAUTH_URL之后即可在浏览器或手机上快速把链接、笔记、图片投喂进你的 Karakeep 实例。7. 升级与更新Karakeep 的升级策略围绕KARAKEEP_VERSION展开非常简单编辑 kubernetes/kustomization.yaml 对应源即.env文件中的KARAKEEP_VERSION变量重新构建并应用make clean deploymake clean会删除上次生成的_manifest.yaml确保重新渲染的清单携带最新镜像 tag。如果你选择KARAKEEP_VERSIONrelease始终跟随最新稳定版还有一个便捷做法由于 web-deployment.yaml 中设置了imagePullPolicy: AlwaysPod 每次创建都会强制从镜像仓库拉取最新镜像。因此只需销毁 web Pod 即可触发拉取新版本kubectl -n karakeep delete pod -l appkarakeep-webDeployment 会自动重建 Pod并拉取最新的release镜像。两种方式可以按需组合希望精确控制版本就固定 tag希望自动跟随最新版就保持release并配合imagePullPolicy: Always重建 Pod。升级前建议先备份数据Karakeep 的数据SQLite 数据库与资产持久化在data-pvc声明的卷中可通过快照、Velero 或卷克隆等方式在集群层面备份。结语Karakeep 的 Kubernetes 部署路径非常正统全套清单基于 Kustomize 组织配置与密钥分离ConfigMap / Secret镜像版本通过replacements自动注入服务暴露支持 LoadBalancer、Ingress 与 TLS 三种方式。无论是单机测试还是生产集群都可以按本文步骤落地。若需进一步微调所有可配置项都集中在.env/.secrets两个文件中完整变量清单见 docs/versioned_docs/version-v0.32.0/03-configuration/01-environment-variables.md底层配置解析实现可参考 packages/shared/config.ts。【免费下载链接】hoarderA self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search项目地址: https://gitcode.com/GitHub_Trending/ho/hoarder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考