diff --git a/.github/workflows/containers.yml b/.github/workflows/containers.yml index 93a3c5d0..3854d976 100644 --- a/.github/workflows/containers.yml +++ b/.github/workflows/containers.yml @@ -15,6 +15,7 @@ on: paths: - '.github/workflows/containers.yml' - 'docker/build-container.sh' + - 'docker/*.Containerfile' jobs: build-and-push: diff --git a/docker/build-container.sh b/docker/build-container.sh index 3998644d..19b96b3e 100755 --- a/docker/build-container.sh +++ b/docker/build-container.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -euo pipefail + cd $(dirname "$0") # use this to test locally, example: @@ -8,6 +10,9 @@ cd $(dirname "$0") # the scopes: gist, read:org, repo, write:packages # then: gh auth login (and copy/paste the new token) +LOG_DEBUG=${LOG_DEBUG:-0} +DEBUG_ABORT_BUILD=${DEBUG_ABORT_BUILD:-} + log_debug() { if [ "$LOG_DEBUG" = "1" ]; then echo "[DEBUG] $*" @@ -31,7 +36,7 @@ if [[ ! " ${ALLOWED_ARCHS[@]} " =~ " ${ARCH} " ]]; then fi # Check if GITHUB_TOKEN is set and not empty -if [[ -z "$GITHUB_TOKEN" ]]; then +if [[ -z "${GITHUB_TOKEN:-}" ]]; then log_info "Error: GITHUB_TOKEN is not set or is empty." exit 1 fi @@ -39,6 +44,7 @@ fi # Set llama.cpp base image, customizable using the BASE_LLAMACPP_IMAGE environment # variable, this permits testing with forked llama.cpp repositories BASE_IMAGE=${BASE_LLAMACPP_IMAGE:-ghcr.io/ggml-org/llama.cpp} +SD_IMAGE=${BASE_SDCPP_IMAGE:-ghcr.io/leejet/stable-diffusion.cpp} # Set llama-swap repository, automatically uses GITHUB_REPOSITORY variable # to enable easy container builds on forked repos @@ -105,6 +111,8 @@ else BASE_TAG=server-${ARCH}-${LCPP_TAG} fi +SD_TAG=master-${ARCH} + # Abort if LCPP_TAG is empty. if [[ -z "$LCPP_TAG" ]]; then log_info "Abort: Could not find llama-server container for arch: $ARCH" @@ -137,6 +145,18 @@ for CONTAINER_TYPE in non-root root; do docker build -f llama-swap.Containerfile --build-arg BASE_TAG=${BASE_TAG} --build-arg LS_VER=${LS_VER} --build-arg UID=${USER_UID} \ --build-arg LS_REPO=${LS_REPO} --build-arg GID=${USER_GID} --build-arg USER_HOME=${USER_HOME} -t ${CONTAINER_TAG} -t ${CONTAINER_LATEST} \ --build-arg BASE_IMAGE=${BASE_IMAGE} . + + # For architectures with stable-diffusion.cpp support, layer sd-server on top + case "$ARCH" in + "musa" | "vulkan") + log_info "Adding sd-server to $CONTAINER_TAG" + docker build -f llama-swap-sd.Containerfile \ + --build-arg BASE=${CONTAINER_TAG} \ + --build-arg SD_IMAGE=${SD_IMAGE} --build-arg SD_TAG=${SD_TAG} \ + --build-arg UID=${USER_UID} --build-arg GID=${USER_GID} \ + -t ${CONTAINER_TAG} -t ${CONTAINER_LATEST} . ;; + esac + if [ "$PUSH_IMAGES" == "true" ]; then docker push ${CONTAINER_TAG} docker push ${CONTAINER_LATEST} diff --git a/docker/config.example.yaml b/docker/config.example.yaml index 9f5f23ba..ee8bce58 100644 --- a/docker/config.example.yaml +++ b/docker/config.example.yaml @@ -15,4 +15,19 @@ models: cmd: > /app/llama-server -hf bartowski/SmolLM2-135M-Instruct-GGUF:Q4_K_M - --port 9999 \ No newline at end of file + --port 9999 + + z-image: + checkEndpoint: / + cmd: | + /app/sd-server + --listen-port 9999 + --diffusion-fa + --diffusion-model /models/z_image_turbo-Q8_0.gguf + --vae /models/ae.safetensors + --llm /models/qwen3-4b-instruct-2507-q8_0.gguf + --offload-to-cpu + --cfg-scale 1.0 + --height 512 --width 512 + --steps 8 + aliases: [gpt-image-1,dall-e-2,dall-e-3,gpt-image-1-mini,gpt-image-1.5] \ No newline at end of file diff --git a/docker/llama-swap-sd.Containerfile b/docker/llama-swap-sd.Containerfile new file mode 100644 index 00000000..0bcc7e2b --- /dev/null +++ b/docker/llama-swap-sd.Containerfile @@ -0,0 +1,11 @@ +ARG SD_IMAGE=ghcr.io/leejet/stable-diffusion.cpp +ARG SD_TAG=master-vulkan +ARG BASE=llama-swap:latest + +FROM ${SD_IMAGE}:${SD_TAG} AS sd-source +FROM ${BASE} + +ARG UID=10001 +ARG GID=10001 + +COPY --from=sd-source --chown=${UID}:${GID} /sd-server /app/sd-server