Skip to content
Merged
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
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ criterion = { version = "0.5", default-features = false }
[profile.release]
debug = 1 # Include line tables for better stack traces in profiling

# Maximally-optimised release build — use `cargo build --profile release-lto`.
# CI sticks with the default `release` profile for faster builds.
# Optimised release build — use `cargo build --profile release-lto`.
# All official Dockerfiles use this profile for the skit binary.
[profile.release-lto]
inherits = "release"
lto = "thin" # Parallel cross-crate LTO — nearly as effective as "fat" but links much faster
Expand Down
23 changes: 12 additions & 11 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ RUN mkdir -p ui/dist && echo '<!DOCTYPE html><html><body>Building...</body></htm
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/build/target \
cargo build --locked --release -p streamkit-server --bin skit --features "moq" && \
cargo build --locked --profile release-lto -p streamkit-server --bin skit --features "moq" && \
# Copy compiled artifacts out of cache mount so they persist in the layer
mkdir -p /build/target-out && \
cp -r /build/target/release /build/target-out/
cp -r /build/target/release-lto /build/target-out/

# Stage 2: Build UI
FROM oven/bun:1.3.5-alpine AS ui-builder
Expand Down Expand Up @@ -94,22 +94,23 @@ COPY --from=ui-builder /build/ui/dist ./ui/dist
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/build/target \
--mount=type=bind,from=rust-deps,source=/build/target-out/release,target=/build/target-init \
--mount=type=bind,from=rust-deps,source=/build/target-out/release-lto,target=/build/target-init \
bash -c '\
# Copy pre-built dependencies if target is empty (first build) \
if [ ! -d "/build/target/release/deps" ]; then \
if [ ! -d "/build/target/release-lto/deps" ]; then \
echo "Initializing target from cache..."; \
cp -r /build/target-init/* /build/target/release/ || true; \
mkdir -p /build/target/release-lto; \
cp -r /build/target-init/* /build/target/release-lto/ || true; \
fi; \
# Remove server binary to force rebuild with new UI \
rm -rf /build/target/release/skit \
/build/target/release/skit.d \
/build/target/release/deps/streamkit_server-* \
/build/target/release/.fingerprint/streamkit-server-*; \
rm -rf /build/target/release-lto/skit \
/build/target/release-lto/skit.d \
/build/target/release-lto/deps/streamkit_server-* \
/build/target/release-lto/.fingerprint/streamkit-server-*; \
# Build only the server binary \
cargo build --locked --release --features "moq" --bin skit; \
cargo build --locked --profile release-lto --features "moq" --bin skit; \
# Copy final binary out of cache mount \
mkdir -p /build/bin && cp /build/target/release/skit /build/bin/skit \
mkdir -p /build/bin && cp /build/target/release-lto/skit /build/bin/skit \
'

# Runtime stage - minimal image with server + samples
Expand Down
76 changes: 40 additions & 36 deletions Dockerfile.demo
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@ RUN mkdir -p ui/dist && echo '<!DOCTYPE html><html><body>Building...</body></htm
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/build/target \
cargo build --release -p streamkit-server --bin skit --features "moq" && \
cargo build --profile release-lto -p streamkit-server --bin skit --features "moq" && \
# Copy compiled artifacts out of cache mount so they persist in the layer
mkdir -p /build/target-out && \
cp -r /build/target/release /build/target-out/
cp -r /build/target/release-lto /build/target-out/

# Stage 2: Build UI
FROM oven/bun:1.3.5-alpine AS ui-builder
Expand Down Expand Up @@ -97,22 +97,23 @@ COPY --from=ui-builder /build/ui/dist ./ui/dist
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/build/target \
--mount=type=bind,from=rust-deps,source=/build/target-out/release,target=/build/target-init \
--mount=type=bind,from=rust-deps,source=/build/target-out/release-lto,target=/build/target-init \
bash -c '\
# Copy pre-built dependencies if target is empty (first build) \
if [ ! -d "/build/target/release/deps" ]; then \
if [ ! -d "/build/target/release-lto/deps" ]; then \
echo "Initializing target from cache..."; \
cp -r /build/target-init/* /build/target/release/ || true; \
mkdir -p /build/target/release-lto; \
cp -r /build/target-init/* /build/target/release-lto/ || true; \
fi; \
# Remove server binary to force rebuild with new UI \
rm -rf /build/target/release/skit \
/build/target/release/skit.d \
/build/target/release/deps/streamkit_server-* \
/build/target/release/.fingerprint/streamkit-server-*; \
rm -rf /build/target/release-lto/skit \
/build/target/release-lto/skit.d \
/build/target/release-lto/deps/streamkit_server-* \
/build/target/release-lto/.fingerprint/streamkit-server-*; \
# Build only the server binary \
cargo build --release --features "moq" --bin skit; \
cargo build --profile release-lto --features "moq" --bin skit; \
# Copy final binary out of cache mount \
mkdir -p /build/bin && cp /build/target/release/skit /build/bin/skit \
mkdir -p /build/bin && cp /build/target/release-lto/skit /build/bin/skit \
'

# Stage 4: Build Whisper plugin
Expand Down Expand Up @@ -552,42 +553,44 @@ COPY --from=kokoro-builder /usr/local/lib/*.so* /usr/local/lib/
RUN ldconfig

# Copy whisper plugin and models
COPY --from=whisper-builder /build/plugins /opt/streamkit/plugins
COPY --from=whisper-builder /build/models /opt/streamkit/models
# IMPORTANT: Use --chown=app:app on every COPY to avoid a bulk `chown -R` later
# which would duplicate every file in a new layer (~12GB waste).
COPY --chown=app:app --from=whisper-builder /build/plugins /opt/streamkit/plugins
COPY --chown=app:app --from=whisper-builder /build/models /opt/streamkit/models

# Copy kokoro plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=kokoro-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=kokoro-builder /build/models/kokoro-multi-lang-v1_1 /opt/streamkit/models/kokoro-multi-lang-v1_1
COPY --chown=app:app --from=kokoro-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=kokoro-builder /build/models/kokoro-multi-lang-v1_1 /opt/streamkit/models/kokoro-multi-lang-v1_1

# Copy piper plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=piper-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=piper-builder /build/models/vits-piper-en_US-libritts_r-medium /opt/streamkit/models/vits-piper-en_US-libritts_r-medium
COPY --from=piper-builder /build/models/vits-piper-es_MX-claude-high /opt/streamkit/models/vits-piper-es_MX-claude-high
COPY --chown=app:app --from=piper-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=piper-builder /build/models/vits-piper-en_US-libritts_r-medium /opt/streamkit/models/vits-piper-en_US-libritts_r-medium
COPY --chown=app:app --from=piper-builder /build/models/vits-piper-es_MX-claude-high /opt/streamkit/models/vits-piper-es_MX-claude-high

# Copy sensevoice plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=sensevoice-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=sensevoice-builder /build/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09 /opt/streamkit/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09
COPY --chown=app:app --from=sensevoice-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=sensevoice-builder /build/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09 /opt/streamkit/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09

# Copy helsinki plugin and models
COPY --from=helsinki-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=helsinki-builder /build/models/opus-mt-en-es /opt/streamkit/models/opus-mt-en-es
COPY --from=helsinki-builder /build/models/opus-mt-es-en /opt/streamkit/models/opus-mt-es-en
COPY --chown=app:app --from=helsinki-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=helsinki-builder /build/models/opus-mt-en-es /opt/streamkit/models/opus-mt-en-es
COPY --chown=app:app --from=helsinki-builder /build/models/opus-mt-es-en /opt/streamkit/models/opus-mt-es-en

# Copy vad plugin and model (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=vad-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=vad-builder /build/models/ten-vad.onnx /opt/streamkit/models/ten-vad.onnx
COPY --chown=app:app --from=vad-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=vad-builder /build/models/ten-vad.onnx /opt/streamkit/models/ten-vad.onnx

# Copy matcha plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=matcha-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=matcha-builder /build/models/matcha-icefall-en_US-ljspeech /opt/streamkit/models/matcha-icefall-en_US-ljspeech
COPY --chown=app:app --from=matcha-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=matcha-builder /build/models/matcha-icefall-en_US-ljspeech /opt/streamkit/models/matcha-icefall-en_US-ljspeech

# Copy pocket-tts plugin and models
COPY --from=pocket-tts-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=pocket-tts-builder /build/models/pocket-tts /opt/streamkit/models/pocket-tts
COPY --chown=app:app --from=pocket-tts-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=pocket-tts-builder /build/models/pocket-tts /opt/streamkit/models/pocket-tts

# Copy supertonic plugin and models
COPY --from=supertonic-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=supertonic-builder /build/models/supertonic-v2-onnx /opt/streamkit/models/supertonic-v2-onnx
COPY --chown=app:app --from=supertonic-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=supertonic-builder /build/models/supertonic-v2-onnx /opt/streamkit/models/supertonic-v2-onnx

# Copy sample pipelines + small bundled audio samples (Opus/Ogg only)
COPY --chown=app:app samples/pipelines /opt/streamkit/samples/pipelines
Expand All @@ -606,15 +609,16 @@ RUN find /opt/streamkit/samples/pipelines -type f \( -name '*.yml' -o -name '*.y
/opt/streamkit/samples/pipelines/oneshot/speech_to_text_translate.yml \
/opt/streamkit/samples/pipelines/oneshot/gain_filter_rust.yml \
/opt/streamkit/samples/pipelines/dynamic/speech-translate-en-es.yaml \
/opt/streamkit/samples/pipelines/dynamic/speech-translate-es-en.yaml
/opt/streamkit/samples/pipelines/dynamic/speech-translate-es-en.yaml && \
chown -R app:app /opt/streamkit/samples/pipelines

# Copy demo configuration
RUN mkdir -p /opt/streamkit/config
COPY --chown=app:app docker-skit-demo.toml /opt/streamkit/config/skit.toml

# Ensure runtime-writable directories exist, and keep /app/* as compatibility symlinks.
RUN mkdir -p /opt/streamkit/.plugins /opt/streamkit/logs && \
chown -R app:app /opt/streamkit && \
# Create runtime-writable directories and compatibility symlinks.
# No bulk chown needed — all COPY instructions above use --chown=app:app.
RUN mkdir -p /opt/streamkit/.plugins /opt/streamkit/logs /opt/streamkit/config /opt/streamkit/demo && \
chown app:app /opt/streamkit/.plugins /opt/streamkit/logs /opt/streamkit/config /opt/streamkit/demo && \
mkdir -p /app && \
ln -sfn /opt/streamkit/config/skit.toml /opt/streamkit/skit.toml && \
ln -sfn /opt/streamkit/plugins /app/plugins && \
Expand Down
62 changes: 32 additions & 30 deletions Dockerfile.full
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ RUN mkdir -p ui/dist && echo '<!DOCTYPE html><html><body>Building...</body></htm
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/build/target \
cargo build --release -p streamkit-server --bin skit --features "moq" && \
cargo build --profile release-lto -p streamkit-server --bin skit --features "moq" && \
# Copy compiled artifacts out of cache mount so they persist in the layer
mkdir -p /build/target-out && \
cp -r /build/target/release /build/target-out/
cp -r /build/target/release-lto /build/target-out/

# Stage 2: Build UI
FROM oven/bun:1.3.5-alpine AS ui-builder
Expand Down Expand Up @@ -99,22 +99,23 @@ COPY --from=ui-builder /build/ui/dist ./ui/dist
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/build/target \
--mount=type=bind,from=rust-deps,source=/build/target-out/release,target=/build/target-init \
--mount=type=bind,from=rust-deps,source=/build/target-out/release-lto,target=/build/target-init \
bash -c '\
# Copy pre-built dependencies if target is empty (first build) \
if [ ! -d "/build/target/release/deps" ]; then \
if [ ! -d "/build/target/release-lto/deps" ]; then \
echo "Initializing target from cache..."; \
cp -r /build/target-init/* /build/target/release/ || true; \
mkdir -p /build/target/release-lto; \
cp -r /build/target-init/* /build/target/release-lto/ || true; \
fi; \
# Remove server binary to force rebuild with new UI \
rm -rf /build/target/release/skit \
/build/target/release/skit.d \
/build/target/release/deps/streamkit_server-* \
/build/target/release/.fingerprint/streamkit-server-*; \
rm -rf /build/target/release-lto/skit \
/build/target/release-lto/skit.d \
/build/target/release-lto/deps/streamkit_server-* \
/build/target/release-lto/.fingerprint/streamkit-server-*; \
# Build only the server binary \
cargo build --release --features "moq" --bin skit; \
cargo build --profile release-lto --features "moq" --bin skit; \
# Copy final binary out of cache mount \
mkdir -p /build/bin && cp /build/target/release/skit /build/bin/skit \
mkdir -p /build/bin && cp /build/target/release-lto/skit /build/bin/skit \
'

# Stage 4: Build Whisper plugin
Expand Down Expand Up @@ -474,53 +475,54 @@ COPY --from=kokoro-builder /usr/local/lib/*.so* /usr/local/lib/
RUN ldconfig

# Copy whisper plugin and models
COPY --from=whisper-builder /build/plugins /opt/streamkit/plugins
COPY --from=whisper-builder /build/models /opt/streamkit/models
# IMPORTANT: Use --chown=app:app on every COPY to avoid a bulk `chown -R` later
# which would duplicate every file in a new layer (~12GB waste).
COPY --chown=app:app --from=whisper-builder /build/plugins /opt/streamkit/plugins
COPY --chown=app:app --from=whisper-builder /build/models /opt/streamkit/models

# Copy kokoro plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=kokoro-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=kokoro-builder /build/models/kokoro-multi-lang-v1_1 /opt/streamkit/models/kokoro-multi-lang-v1_1
COPY --chown=app:app --from=kokoro-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=kokoro-builder /build/models/kokoro-multi-lang-v1_1 /opt/streamkit/models/kokoro-multi-lang-v1_1

# Copy piper plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=piper-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=piper-builder /build/models/vits-piper-en_US-libritts_r-medium /opt/streamkit/models/vits-piper-en_US-libritts_r-medium
COPY --chown=app:app --from=piper-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=piper-builder /build/models/vits-piper-en_US-libritts_r-medium /opt/streamkit/models/vits-piper-en_US-libritts_r-medium

# Copy sensevoice plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=sensevoice-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=sensevoice-builder /build/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09 /opt/streamkit/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09
COPY --chown=app:app --from=sensevoice-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=sensevoice-builder /build/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09 /opt/streamkit/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2025-09-09

# Copy CTranslate2 libraries from nllb-builder
COPY --from=nllb-builder /usr/local/lib/libctranslate2.so* /usr/local/lib/
RUN ldconfig

# Copy nllb plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=nllb-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=nllb-builder /build/models/nllb-200-distilled-600M-ct2-int8 /opt/streamkit/models/nllb-200-distilled-600M-ct2-int8
COPY --chown=app:app --from=nllb-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=nllb-builder /build/models/nllb-200-distilled-600M-ct2-int8 /opt/streamkit/models/nllb-200-distilled-600M-ct2-int8

# Copy vad plugin and model (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=vad-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=vad-builder /build/models/ten-vad.onnx /opt/streamkit/models/ten-vad.onnx
COPY --chown=app:app --from=vad-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=vad-builder /build/models/ten-vad.onnx /opt/streamkit/models/ten-vad.onnx

# Copy matcha plugin and models (merge into /opt/streamkit/plugins and /opt/streamkit/models)
COPY --from=matcha-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --from=matcha-builder /build/models/matcha-icefall-en_US-ljspeech /opt/streamkit/models/matcha-icefall-en_US-ljspeech
COPY --chown=app:app --from=matcha-builder /build/plugins/native/* /opt/streamkit/plugins/native/
COPY --chown=app:app --from=matcha-builder /build/models/matcha-icefall-en_US-ljspeech /opt/streamkit/models/matcha-icefall-en_US-ljspeech

# Copy sample pipelines
COPY --chown=app:app samples /opt/streamkit/samples

# Copy official Docker configuration (no dependency on private demo assets)
RUN mkdir -p /opt/streamkit/config
COPY --chown=app:app docker-skit.toml /opt/streamkit/config/skit.toml
COPY --chown=app:app docker-skit-gpu.toml /opt/streamkit/config/skit-gpu.toml

# Copy demo configurations used by `demo/launcher`
RUN mkdir -p /opt/streamkit/demo
COPY --chown=app:app demo/skit.toml /opt/streamkit/demo/skit.toml
COPY --chown=app:app demo/skit-gpu.toml /opt/streamkit/demo/skit-gpu.toml

# Ensure runtime-writable directories exist, and keep /app/* as compatibility symlinks.
RUN mkdir -p /opt/streamkit/.plugins /opt/streamkit/logs && \
chown -R app:app /opt/streamkit && \
# Create runtime-writable directories and compatibility symlinks.
# No bulk chown needed — all COPY instructions above use --chown=app:app.
RUN mkdir -p /opt/streamkit/.plugins /opt/streamkit/logs /opt/streamkit/config /opt/streamkit/demo && \
chown app:app /opt/streamkit/.plugins /opt/streamkit/logs /opt/streamkit/config /opt/streamkit/demo && \
mkdir -p /app && \
ln -sfn /opt/streamkit/config/skit.toml /opt/streamkit/skit.toml && \
ln -sfn /opt/streamkit/config/skit-gpu.toml /opt/streamkit/skit-gpu.toml && \
Expand Down
Loading
Loading