Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion fishspeechv3/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
22 changes: 15 additions & 7 deletions fishspeechv3/OlaresManifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 9 additions & 1 deletion fishspeechv3/i18n/en-US/OlaresManifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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.
10 changes: 9 additions & 1 deletion fishspeechv3/i18n/zh-CN/OlaresManifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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。
96 changes: 65 additions & 31 deletions fishspeechv3/templates/server.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down