From 152e7e6e02bd0d5a80dadfe98465e4b2d190c86b Mon Sep 17 00:00:00 2001 From: Haro Date: Tue, 21 Jul 2026 16:28:52 +0000 Subject: [PATCH] [UPDATE][fishspeechv3][1.1.9] --- fishspeechv3/Chart.yaml | 2 +- fishspeechv3/OlaresManifest.yaml | 22 +++-- fishspeechv3/i18n/en-US/OlaresManifest.yaml | 10 ++- fishspeechv3/i18n/zh-CN/OlaresManifest.yaml | 10 ++- fishspeechv3/templates/server.yaml | 96 ++++++++++++++------- 5 files changed, 99 insertions(+), 41 deletions(-) diff --git a/fishspeechv3/Chart.yaml b/fishspeechv3/Chart.yaml index c06917dcb..ca4e64ad4 100644 --- a/fishspeechv3/Chart.yaml +++ b/fishspeechv3/Chart.yaml @@ -3,4 +3,4 @@ appVersion: 'webui-cuda-cu129-20260422' description: Fish Speech - Open-Source Multilingual Text-to-Speech with Voice Cloning name: fishspeechv3 type: application -version: 1.1.8 +version: '1.1.9' \ No newline at end of file diff --git a/fishspeechv3/OlaresManifest.yaml b/fishspeechv3/OlaresManifest.yaml index 222c1ad3f..0657be62f 100644 --- a/fishspeechv3/OlaresManifest.yaml +++ b/fishspeechv3/OlaresManifest.yaml @@ -7,7 +7,7 @@ metadata: description: SOTA Open Source TTS appid: fishspeechv3 title: Fish Speech - version: '1.1.8' + version: '1.1.9' categories: - AI @@ -74,12 +74,20 @@ spec: - GUI Inference: Offers a PyQt6 graphical interface that works seamlessly with the API server. Supports Linux, Windows, and macOS. upgradeDescription: | - Switched model provisioning to the shared llm-init downloader. + Storage: durable volumes moved from `appCache` to `appData`. On first start after upgrade, initContainers copy legacy appCache contents into appData when the destination is empty (marker: `.migration_from_appcache_done`). Old appCache data is left intact for rollback. + + Drop legacy `sysVersion >= 1.12.3` appCache path branching; Olares minimum is now 1.12.6. + + `HF_TOKEN` / `HF_ENDPOINT` now map from `OLARES_SYSTEM_HUGGINGFACE_TOKEN` / `OLARES_SYSTEM_HUGGINGFACE_SERVICE` (system-level), not user-level Hugging Face env. + + Bump downloader image to `beclab/llm-init:v1.3.1`. + + User data root moved from appCache to appData; compile-cache stays on appCache. **What's Changed** - **Download architecture**: replaced the bespoke `harveyff-hf-downloader` - Job with an `llm-init:v1.2.4` download-only Deployment + Job with an `llm-init:v1.3.1` download-only Deployment (`fishspeechv3download`). The fishaudio/s2-pro checkpoint now lands in the shared cross-app Hugging Face cache (App Common, `/cache/hf/hub`) instead of a per-app App Data copy, so it is de-duplicated across apps and survives @@ -123,15 +131,15 @@ spec: limitedDisk: 50Gi envs: - envName: HF_TOKEN - required: true + required: false applyOnChange: true valueFrom: - envName: OLARES_USER_HUGGINGFACE_TOKEN + envName: OLARES_SYSTEM_HUGGINGFACE_TOKEN - envName: HF_ENDPOINT - required: true + required: false applyOnChange: true valueFrom: - envName: OLARES_USER_HUGGINGFACE_SERVICE + envName: OLARES_SYSTEM_HUGGINGFACE_SERVICE options: shared: true diff --git a/fishspeechv3/i18n/en-US/OlaresManifest.yaml b/fishspeechv3/i18n/en-US/OlaresManifest.yaml index 3137a591b..e8eb64d53 100644 --- a/fishspeechv3/i18n/en-US/OlaresManifest.yaml +++ b/fishspeechv3/i18n/en-US/OlaresManifest.yaml @@ -31,4 +31,12 @@ spec: - GUI Inference: Offers a PyQt6 graphical interface that works seamlessly with the API server. Supports Linux, Windows, and macOS. upgradeDescription: | - Switched model provisioning to the shared llm-init downloader: replaced the bespoke downloader Job with an `llm-init:v1.2.4` download-only Deployment (`fishspeechv3download`) that fetches fishaudio/s2-pro into the shared cross-app Hugging Face cache (App Common, `/cache/hf/hub`); the WebUI now waits on the downloader's `/readyz` and symlinks `checkpoints/s2-pro` to the HF snapshot. The `fishspeechclient` nginx entrance serves the download dashboard and auto-reloads into the Gradio WebUI when ready. Added the `appCommon` permission. Previously migrated Fish Speech to the apiVersion v3 shared app pattern (fishspeechv2 → fishspeechv3). + Storage: durable volumes moved from `appCache` to `appData`. On first start after upgrade, initContainers copy legacy appCache contents into appData when the destination is empty (marker: `.migration_from_appcache_done`). Old appCache data is left intact for rollback. + + Drop legacy `sysVersion >= 1.12.3` appCache path branching; Olares minimum is now 1.12.6. + + `HF_TOKEN` / `HF_ENDPOINT` now map from `OLARES_SYSTEM_HUGGINGFACE_TOKEN` / `OLARES_SYSTEM_HUGGINGFACE_SERVICE` (system-level), not user-level Hugging Face env. + + Bump downloader image to `beclab/llm-init:v1.3.1`. + + User data root moved from appCache to appData; compile-cache stays on appCache. diff --git a/fishspeechv3/i18n/zh-CN/OlaresManifest.yaml b/fishspeechv3/i18n/zh-CN/OlaresManifest.yaml index c62397ada..18eec143f 100644 --- a/fishspeechv3/i18n/zh-CN/OlaresManifest.yaml +++ b/fishspeechv3/i18n/zh-CN/OlaresManifest.yaml @@ -26,4 +26,12 @@ spec: - 部署友好: 轻松设置推理服务器,原生支持 Linux、Windows(MacOS 即将推出),最小化速度损失。 upgradeDescription: | - 将模型下载切换为共享的 llm-init 下载器:以 `llm-init:v1.2.4` 下载专用 Deployment(`fishspeechv3download`)替换原有的下载器 Job,将 fishaudio/s2-pro 下载到跨应用共享的 Hugging Face 缓存(App Common,`/cache/hf/hub`);WebUI 改为等待下载器的 `/readyz`,并将 `checkpoints/s2-pro` 软链到 HF 快照。`fishspeechclient` nginx 入口在下载期间展示下载进度页,就绪后自动跳转到 Gradio WebUI。新增 `appCommon` 权限。此前已将 Fish Speech 迁移到 apiVersion v3 共享应用模式(fishspeechv2 → fishspeechv3)。 + 存储:持久卷从 `appCache` 迁移到 `appData`。升级后首次启动时,若 appData 为空,initContainer 会将旧 appCache 内容复制到 appData(标记文件:`.migration_from_appcache_done`);旧 appCache 数据保留以便回滚。 + + 移除针对 Olares < 1.12.3 的 appCache 路径分支逻辑;当前最低支持版本为 1.12.6。 + + `HF_TOKEN` / `HF_ENDPOINT` 改为从系统级 `OLARES_SYSTEM_HUGGINGFACE_TOKEN` / `OLARES_SYSTEM_HUGGINGFACE_SERVICE` 获取,不再使用用户级 Hugging Face 环境变量。 + + 下载器镜像升级为 `beclab/llm-init:v1.3.1`。 + + 用户数据根目录从 appCache 迁移到 appData;compile-cache 仍保留在 appCache。 diff --git a/fishspeechv3/templates/server.yaml b/fishspeechv3/templates/server.yaml index 5356ca5ea..5da2c7e2d 100644 --- a/fishspeechv3/templates/server.yaml +++ b/fishspeechv3/templates/server.yaml @@ -24,31 +24,62 @@ spec: io.kompose.service: fishspeech spec: initContainers: - - name: init-chmod-data - image: 'docker.io/beclab/aboveos-busybox:1.37.0' - command: - - sh - - '-c' - - | - chown -R 1000:1000 /app-checkpoints /app-references /app-data-root /tmp-gradio /app-cache - chmod -R 755 /app-checkpoints /app-references /app-data-root /tmp-gradio /app-cache - resources: {} - volumeMounts: - - name: checkpoints - mountPath: /app-checkpoints - - name: references - mountPath: /app-references - - name: data - mountPath: /app-data-root - - name: output - mountPath: /tmp-gradio - - name: app-cache - mountPath: /app-cache - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - imagePullPolicy: IfNotPresent - securityContext: - runAsUser: 0 + - name: migrate-appcache-to-appdata + image: "docker.io/beclab/busybox:1.37" + imagePullPolicy: IfNotPresent + command: ["sh", "-c"] + args: + - | + set -e + SOURCE=/old-data + DEST=/new-data + MARKER="${DEST}/.migration_from_appcache_done" + if [ -f "$MARKER" ]; then echo "[migrate] marker present, skip."; exit 0; fi + if [ -n "$(ls -A "$DEST" 2>/dev/null | grep -v '^\.migration_from_appcache_done$' || true)" ]; then + echo "[migrate] appData already has data, skip." + echo "skipped existing dest at $(date -Iseconds 2>/dev/null || date)" > "$MARKER" + exit 0 + fi + if [ -n "$(ls -A "$SOURCE" 2>/dev/null || true)" ]; then + echo "[migrate] copying appCache -> appData..." + cp -a "$SOURCE"/. "$DEST"/ + echo "migrated from appCache at $(date -Iseconds 2>/dev/null || date)" > "$MARKER" + echo "[migrate] done; legacy appCache left intact for rollback." + else + echo "[migrate] no legacy data, fresh install." + echo "fresh install at $(date -Iseconds 2>/dev/null || date)" > "$MARKER" + fi + volumeMounts: + - name: data-legacy + mountPath: /old-data + readOnly: true + - name: data + mountPath: /new-data + - name: init-chmod-data + image: 'docker.io/beclab/aboveos-busybox:1.37.0' + command: + - sh + - '-c' + - | + chown -R 1000:1000 /app-checkpoints /app-references /app-data-root /tmp-gradio /app-cache + chmod -R 755 /app-checkpoints /app-references /app-data-root /tmp-gradio /app-cache + resources: {} + volumeMounts: + - name: checkpoints + mountPath: /app-checkpoints + - name: references + mountPath: /app-references + - name: data + mountPath: /app-data-root + - name: output + mountPath: /tmp-gradio + - name: app-cache + mountPath: /app-cache + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + imagePullPolicy: IfNotPresent + securityContext: + runAsUser: 0 containers: - name: fishspeech image: "docker.io/beclab/harveyff-fishaudio-fish-speech:webui-cuda-cu129-20260422" @@ -184,6 +215,10 @@ spec: - hostPath: path: '{{ .Values.userspace.appCache }}/data' type: DirectoryOrCreate + name: data-legacy + - hostPath: + path: '{{ .Values.userspace.appData }}/data' + type: DirectoryOrCreate name: data # checkpoints/s2-pro is now an ephemeral symlink into the shared HF cache, # rebuilt on every start; the real model bytes live in hf-cache below. @@ -269,17 +304,16 @@ spec: runAsUser: 0 containers: - name: llm-init - # v1.2.4: nullengine download-only, default LFS (hf_xet off unless + # v1.3.1: nullengine download-only, default LFS (hf_xet off unless # HF_ENABLE_XET=true) for stable download memory. - image: docker.io/beclab/llm-init:v1.2.4 + image: docker.io/beclab/llm-init:v1.3.1 imagePullPolicy: IfNotPresent env: # Empty ENGINE_KIND selects download-only mode (nullengine). - name: ENGINE_KIND value: "" - # TEMPORARY (llm-init v1.2.4 image): download-only still requires - # MODEL_NAME + MODEL_MODE placeholders; the repo to fetch comes - # entirely from MODEL_SOURCE. Drop both once the make-optional patch ships. + # Download-only still requires MODEL_NAME + MODEL_MODE placeholders; + # the repo to fetch comes entirely from MODEL_SOURCE. - name: MODEL_NAME value: "fishaudio/s2-pro" - name: MODEL_MODE @@ -294,7 +328,7 @@ spec: - name: HF_TOKEN value: "{{ $hfToken }}" {{- end }} - # Keep concurrency low; LFS is the image default in v1.2.4. + # Keep concurrency low; LFS is the image default. - name: MAX_CONCURRENT_DOWNLOADS value: "1" - name: RUN_DIR