IvyLabs Wiki
語言: 繁體中文

用 Helm 部署到 Kubernetes

爬山虎的 Helm chart 包含伺服器(API、MCP、CalDAV 和背景工作)、在同一個網址提供服務的 BostonIvy Web,以及方便入門的內建 PostgreSQL。伺服器每次發布新版本時都會發布新的 chart,位址是 oci://ghcr.io/ivylabsapp/charts/bostonivy。

開始之前

安裝

  1. 建立命名空間,以及拉取私有映像檔用的密鑰:

    kubectl create namespace bostonivy
    kubectl -n bostonivy create secret docker-registry ghcr \
      --docker-server=ghcr.io --docker-username=<你的 GitHub 使用者名稱> --docker-password=<具有 read:packages 的權杖>
    
  2. 讓 Helm 登入映像檔儲存庫,這樣它才能下載 chart:

    echo "$GITHUB_TOKEN" | helm registry login ghcr.io -u <你的 GitHub 使用者名稱> --password-stdin
    
  3. 把設定寫進一個檔案,例如 values.yaml。url 必填,郵件裡的連結、分享連結、OAuth 和 OIDC 回呼都用它。

    url: https://tasks.example.com
    imagePullSecrets:
      - name: ghcr
    ingress:
      enabled: true
      className: nginx
      annotations:
        # 即時更新走 /api/v1/realtime 上的長連線 WebSocket;上傳上限 64 MiB
        nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
        nginx.ingress.kubernetes.io/proxy-body-size: 64m
      tls:
        - secretName: bostonivy-tls
          hosts: [tasks.example.com]
    

    bostonivy-tls 是你網域的憑證:自行建立的 TLS Secret,或由 cert-manager 產生。

  4. 安裝:

    helm install ivy oci://ghcr.io/ivylabsapp/charts/bostonivy --version 0.7.0 -n bostonivy -f values.yaml
    

    本頁範例中的 release 叫 ivy,所以各資源名稱為 ivy-bostonivy-…。有 bostonivy-os 的簽出時,也可以從 deploy/helm/bostonivy 安裝。

建立第一個管理員

安裝完成後 Helm 也會印出這些步驟。輸入密碼時不會顯示:

printf 'Password: '; read -rs PW; echo
printf '%s\n' "$PW" | kubectl -n bostonivy exec -i deploy/ivy-bostonivy-server -- bostonivy admin create-user <使用者名稱> <電子郵件> --admin
unset PW

備份伺服器金鑰

伺服器金鑰和內建資料庫的密碼在安裝時產生,每次升級都會保留,存放在 Secret ivy-bostonivy-secrets 裡,解除安裝時 Helm 也不會刪除它。所有簽章和加密金鑰都由伺服器金鑰衍生:一旦遺失,所有人都要重新登入,加密儲存的 TOTP 和 webhook 密鑰也無法再讀取。現在就把它複製到安全的地方:

kubectl -n bostonivy get secret ivy-bostonivy-secrets -o jsonpath='{.data.auth-secret}' | base64 -d

想用自己的金鑰,可以設定 auth.secret,或者把它放進你自己管理的 Secret 的 auth-secret 鍵下,再設定 auth.existingSecret。

不用 Ingress 試用

保持 ingress.enabled 關閉,設定 auth.cookieSecure=false,然後把網頁服務轉送到本機:

kubectl -n bostonivy port-forward svc/ivy-bostonivy-web 8080:80

再開啟 http://localhost:8080。一旦改為透過 HTTPS 提供服務,就要把 auth.cookieSecure 改回 true。

設定項目

設定項目 預設值 作用
url 必填 使用者連到爬山虎的網址;連結、OAuth 和 OIDC 回呼都用它
imagePullSecrets [] 拉取私有映像檔用的密鑰
auth.secret、auth.existingSecret 自動產生 伺服器金鑰,直接提供或取自你自己的 Secret(鍵為 auth-secret)
auth.cookieSecure true 使用 HTTPS 時保持開啟;只有在純 http 上試用時才關閉
database.url、database.existingSecret 內建 外部的 PostgreSQL 16 或更新版本;留空則使用內建的
postgresql.enabled true 叢集內的單一 PostgreSQL,適合試用和小規模
mail.smtpUrl、mail.from 空 例如 smtp://user:password@host:587,或 log;留空表示不寄信
config 空 以 TOML 撰寫的額外伺服器設定,例如 [[auth.oidc]] 登入提供者
server.env、server.envFrom [] 其他任何 BOSTONIVY_<區段>__<鍵> 設定
server.replicas 1 多於一個時需要 S3 儲存和 worker.separate
worker.separate、worker.replicas false、1 把背景工作(郵件、webhook、提醒、維護)放到獨立的 Pod 執行
persistence.* 10Gi,ReadWriteOnce 本機儲存時的附件和頭像
web.image.tag 0.2.0 要提供的 BostonIvy Web 版本
ingress.* 關閉 主機名稱預設取自 url;要允許 WebSocket 長時間讀取,即時更新才能運作

資料庫

內建的 PostgreSQL 只有一個 Pod,適合試用和小規模部署。正式環境請使用託管資料庫或 operator,並讓爬山虎指向它:

postgresql:
  enabled: false
database:
  url: postgres://bostonivy:<密碼>@db.example.com:5432/bostonivy

也可以把位址放進你自己的 Secret,再設定 database.existingSecret。爬山虎需要 PostgreSQL 16 或更新版本。

郵件、登入和其他設定

擴充

除了本機儲存的檔案,伺服器本身不保存狀態。要執行多個副本:

server:
  replicas: 3
  env:
    - name: BOSTONIVY_STORAGE__KIND
      value: s3
    # 再加上 bostonivy.example.toml 裡 [storage] 區段的儲存桶設定
worker:
  separate: true
persistence:
  enabled: false

升級與備份

用新版本的 chart 升級:

helm upgrade ivy oci://ghcr.io/ivylabsapp/charts/bostonivy --version <新版本> -n bostonivy -f values.yaml

伺服器 Pod 會滾動更新,新版本啟動時自動遷移資料庫。遷移只增不刪,搭配備份可以退回。

需要備份三樣東西: