#!/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