Adds the comfyui service (yurisasc/comfyui-rocm7.1, gfx1201-tuned for the R9700) on the ai-stack network, published on host port 8138 for a planned external nginx route to comfy.home. Resolves PUID/PGID/VIDEO_GID/RENDER_GID from the host in scripts/update.sh, same pattern as SEARXNG_LAN_IP. OmniRoute provider registration (http://comfyui:8188) is still the same manual dashboard/POST-/api/providers flow already used for llama-server — not scripted, per docs/proxy-key-onboarding.md. Part of wayfinder map #38. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zCwaWJQuKgXDUfRPBqDS7
108 lines
4.3 KiB
Bash
Executable File
108 lines
4.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# The one command to run after any change to this repo (compose file, .env,
|
|
# or a git pull) to bring the running stack in sync. Ensures secrets/keys
|
|
# exist, pulls, validates, rebuilds/re-pulls images, and recreates only what
|
|
# changed — safe to run any time, including with nothing to do.
|
|
#
|
|
# omniroute's own routing/provider config (llama-server, search) lives in
|
|
# its dashboard, not a checked-in file like the old litellm-config.yaml —
|
|
# see issue #31 and docs/proxy-key-onboarding.md.
|
|
#
|
|
# ponytail: no rollback/backup logic — this is a single-user homelab box,
|
|
# not a fleet. If a bad config lands, `git revert` + re-run is the recovery
|
|
# path, not this script.
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
|
|
[ -f .env ] || cp .env.example .env
|
|
|
|
# Handles all three cases: the KEY=value line is missing entirely (.env
|
|
# predates that var being added to .env.example — sed can't fix what isn't
|
|
# there, so this appends it), present but blank, or already set.
|
|
set_if_blank() {
|
|
local key="$1" value="$2"
|
|
if grep -qE "^${key}=.*[^[:space:]]" .env; then
|
|
echo "${key}: already set, skipping."
|
|
elif grep -qE "^${key}=" .env; then
|
|
sed -i "s|^${key}=.*|${key}=${value}|" .env
|
|
echo "${key}: set."
|
|
else
|
|
echo "${key}=${value}" >> .env
|
|
echo "${key}: added (was missing from .env)."
|
|
fi
|
|
}
|
|
|
|
echo "==> filling in missing secrets"
|
|
# Random values — safe to re-run, never overwrites what's already set.
|
|
# OMNIROUTE_STORAGE_ENCRYPTION_KEY especially: never change it after first
|
|
# run, existing encrypted data becomes unreadable if you do (same caveat as
|
|
# LiteLLM's old LITELLM_SALT_KEY).
|
|
set_if_blank OMNIROUTE_INITIAL_PASSWORD "$(openssl rand -hex 16)"
|
|
set_if_blank OMNIROUTE_JWT_SECRET "$(openssl rand -base64 48)"
|
|
set_if_blank OMNIROUTE_API_KEY_SECRET "$(openssl rand -hex 32)"
|
|
set_if_blank OMNIROUTE_STORAGE_ENCRYPTION_KEY "$(openssl rand -hex 32)"
|
|
set_if_blank OMNIROUTE_MACHINE_ID_SALT "$(openssl rand -hex 16)"
|
|
set_if_blank OMNIROUTE_CLI_SALT "$(openssl rand -hex 16)"
|
|
set_if_blank OMNIROUTE_WS_BRIDGE_SECRET "$(openssl rand -hex 32)"
|
|
|
|
echo "==> resolving SEARXNG_LAN_IP"
|
|
# search.home is a LAN mDNS/local-DNS name — resolvable from this host, just
|
|
# not from inside the omniroute container (see docs/research/litellm-searxng-search.md,
|
|
# still the relevant background even though omniroute replaced litellm — see issue #31).
|
|
searxng_ip="$(getent hosts search.home 2>/dev/null | awk '{print $1}' | head -1)"
|
|
if [ -n "$searxng_ip" ]; then
|
|
set_if_blank SEARXNG_LAN_IP "$searxng_ip"
|
|
else
|
|
echo "SEARXNG_LAN_IP: couldn't resolve search.home from this host, set it manually if still blank."
|
|
fi
|
|
|
|
echo "==> resolving ComfyUI host GID/UID"
|
|
# yurisasc/comfyui-rocm7.1 wants these as env vars, not just group_add in
|
|
# compose — resolve from this host, same pattern as SEARXNG_LAN_IP.
|
|
set_if_blank COMFYUI_PUID "$(id -u)"
|
|
set_if_blank COMFYUI_PGID "$(id -g)"
|
|
video_gid="$(getent group video 2>/dev/null | cut -d: -f3)"
|
|
render_gid="$(getent group render 2>/dev/null | cut -d: -f3)"
|
|
if [ -n "$video_gid" ]; then
|
|
set_if_blank COMFYUI_VIDEO_GID "$video_gid"
|
|
else
|
|
echo "COMFYUI_VIDEO_GID: no 'video' group on this host, set it manually if still blank."
|
|
fi
|
|
if [ -n "$render_gid" ]; then
|
|
set_if_blank COMFYUI_RENDER_GID "$render_gid"
|
|
else
|
|
echo "COMFYUI_RENDER_GID: no 'render' group on this host, set it manually if still blank."
|
|
fi
|
|
|
|
echo "==> git pull"
|
|
git pull --ff-only
|
|
|
|
echo "==> validating compose config"
|
|
docker compose config -q
|
|
|
|
echo "==> pulling images"
|
|
docker compose pull --ignore-buildable
|
|
|
|
echo "==> rebuilding local-build services"
|
|
docker compose build --pull
|
|
|
|
echo "==> ensuring models are downloaded (skips already-present files)"
|
|
docker compose --profile tools run --rm downloader
|
|
|
|
echo "==> bringing up omniroute"
|
|
docker compose up -d --wait omniroute
|
|
|
|
# ponytail: no scripted key-minting yet, unlike the old LiteLLM /key/generate
|
|
# flow — omniroute's POST /api/keys needs a dashboard login session
|
|
# (ManagementSessionAuth), not a static bearer key, and that flow hasn't
|
|
# been verified against a live instance (see issue #37). No in-stack
|
|
# workload needs a key right now (nothing left calls the gateway besides
|
|
# coding CLIs, which mint their own by hand per docs/proxy-key-onboarding.md)
|
|
# — revisit this script once that flow is automatable.
|
|
|
|
echo "==> recreating changed services"
|
|
docker compose up -d --remove-orphans
|
|
|
|
echo "==> status"
|
|
docker compose ps
|