Restore GitGudLab Unraid deployment path
| @@ -21,7 +21,7 @@ build-image: | |||
| 21 | - docker info >/dev/null | 21 | - docker info >/dev/null |
| 22 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" | 22 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" |
| 23 | - docker pull "$CI_REGISTRY_IMAGE:latest" || true | 23 | - docker pull "$CI_REGISTRY_IMAGE:latest" || true |
| 24 | - docker build --cache-from "$CI_REGISTRY_IMAGE:latest" -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$CI_REGISTRY_IMAGE:latest" . | 24 | - docker build --cache-from "$CI_REGISTRY_IMAGE:latest" --label "org.opencontainers.image.source=$CI_PROJECT_URL" --label "org.opencontainers.image.revision=$CI_COMMIT_SHA" --label "org.opencontainers.image.created=$CI_JOB_STARTED_AT" -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$CI_REGISTRY_IMAGE:latest" . |
| 25 | - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" | 25 | - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" |
| 26 | - docker push "$CI_REGISTRY_IMAGE:latest" | 26 | - docker push "$CI_REGISTRY_IMAGE:latest" |
| 27 | 27 | ||
| @@ -9,6 +9,30 @@ changing one, update both (scp to the NAS path + commit here). | |||
| 9 | | `whisper-lazy-proxy.py` | `/mnt/user/appdata/whisper-lazy/proxy.py` (container `whisper-lazy`, :10300) | Wyoming lazy proxy: answers HA availability checks from cache, starts `faster-whisper` on demand, stops it after 15 min idle (frees GPU VRAM). | | 9 | | `whisper-lazy-proxy.py` | `/mnt/user/appdata/whisper-lazy/proxy.py` (container `whisper-lazy`, :10300) | Wyoming lazy proxy: answers HA availability checks from cache, starts `faster-whisper` on demand, stops it after 15 min idle (frees GPU VRAM). | |
| 10 | | `runpod-lazy-proxy.py` | `/mnt/user/appdata/runpod-lazy/proxy.py` (container `runpod-lazy`, :8189) | ComfyUI-compatible on-demand proxy for a volumeless RunPod GPU pod: only `/lazy/warmup` starts or provisions, while cold ComfyUI requests return 503 for provider failover. `/lazy/ping` records 20-second frontend heartbeats; the proxy owns the 60-second upstream keepalive cadence and continues it through browser timer pauses up to a 5-minute lease. A NAS-side idle timer terminates the pod 15 minutes after keepalives and other activity stop. Model-set changes requested by Warm up download in place via the worker image's model-manager (port 8189, LRU disk eviction); pods are only recreated when none exists or the image predates the manager. | | 10 | | `runpod-lazy-proxy.py` | `/mnt/user/appdata/runpod-lazy/proxy.py` (container `runpod-lazy`, :8189) | ComfyUI-compatible on-demand proxy for a volumeless RunPod GPU pod: only `/lazy/warmup` starts or provisions, while cold ComfyUI requests return 503 for provider failover. `/lazy/ping` records 20-second frontend heartbeats; the proxy owns the 60-second upstream keepalive cadence and continues it through browser timer pauses up to a 5-minute lease. A NAS-side idle timer terminates the pod 15 minutes after keepalives and other activity stop. Model-set changes requested by Warm up download in place via the worker image's model-manager (port 8189, LRU disk eviction); pods are only recreated when none exists or the image predates the manager. | |
| 11 | | `runpod-pod.sh` | `/boot/config/runpod-pod.sh` | CLI for the runpod-lazy control API (`status|warmup|shutdown|ping|watch`). | | 11 | | `runpod-pod.sh` | `/boot/config/runpod-pod.sh` | CLI for the runpod-lazy control API (`status|warmup|shutdown|ping|watch`). | |
| 12 | | `unraid/my-sillytavern.xml` | `/boot/config/plugins/dockerMan/templates-user/my-sillytavern.xml` | Unraid template for the GitGudLab `:latest` image and persistent config/data/plugin mounts. | | ||
| 13 | | `unraid/bootstrap-sillytavern.sh` | `/boot/config/bootstrap-sillytavern.sh` | Recovery bootstrap used when the container or DockerMan template is absent. | | ||
| 14 | | `unraid/redeploy-sillytavern.sh` | `/boot/config/redeploy-sillytavern.sh` | Recreates the container through Unraid's own updater so template and update-state bookkeeping stay authoritative. | | ||
| 15 | |||
| 16 | ## SillyTavern image deployment | ||
| 17 | |||
| 18 | Every push to `main` builds the complete customized source tree in GitGudLab CI | ||
| 19 | and publishes both the commit tag and | ||
| 20 | `git.nas.home.htl-sky.net/permissionbrick/sillytavern:latest`. The image carries | ||
| 21 | OCI source, revision, and build-time labels so a running container can be tied | ||
| 22 | back to the exact commit. | ||
| 23 | |||
| 24 | On Unraid, Community Applications Auto Update has `sillytavern` enabled. A | ||
| 25 | shared registry poller additionally checks the GitGudLab tag every two minutes | ||
| 26 | and invokes `redeploy-sillytavern.sh` when its image ID changes. Do not point | ||
| 27 | the DockerMan template at a different image while leaving that poller enabled: | ||
| 28 | the poller and template would otherwise continually disagree and recreate the | ||
| 29 | container. | ||
| 30 | |||
| 31 | The persistent UI extensions live below | ||
| 32 | `data/default-user/extensions` and are discovered through the data mount. Do | ||
| 33 | not restore the obsolete `/home/node/app/public/scripts/extensions/third-party` | ||
| 34 | bind mount. `config.yaml` is a single-file bind mounted at | ||
| 35 | `/home/node/app/config`; plugins remain mounted at `/home/node/app/plugins`. | ||
| 12 | 36 | ||
| 13 | Related: the RunPod worker image (ComfyUI + custom nodes + boot-time model | 37 | Related: the RunPod worker image (ComfyUI + custom nodes + boot-time model |
| 14 | downloader) is built from github.com/permissionBRICK/comfyui-runpod-worker | 38 | downloader) is built from github.com/permissionBRICK/comfyui-runpod-worker |
| @@ -0,0 +1,22 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Raw recovery bootstrap. Normal updates go through redeploy-sillytavern.sh. | ||
| 3 | set -eu | ||
| 4 | |||
| 5 | REF=git.nas.home.htl-sky.net/permissionbrick/sillytavern:latest | ||
| 6 | |||
| 7 | docker pull "$REF" | ||
| 8 | docker rm -f sillytavern >/dev/null 2>&1 || true | ||
| 9 | docker run -d --name sillytavern \ | ||
| 10 | --restart unless-stopped \ | ||
| 11 | -p 8000:8000 \ | ||
| 12 | -e HOST_CONTAINERNAME=sillytavern \ | ||
| 13 | -e NODE_ENV=production \ | ||
| 14 | -e FORCE_COLOR=1 \ | ||
| 15 | -e SILLYTAVERN_HEARTBEATINTERVAL=30 \ | ||
| 16 | -e TZ=Europe/Berlin \ | ||
| 17 | -l net.unraid.docker.managed=dockerman \ | ||
| 18 | -l 'net.unraid.docker.webui=http://nas.home.htl-sky.net:8000/' \ | ||
| 19 | -v /mnt/user/appdata/sillytavern/config.yaml:/home/node/app/config \ | ||
| 20 | -v /mnt/user/appdata/sillytavern/data:/home/node/app/data \ | ||
| 21 | -v /mnt/user/appdata/sillytavern/plugins:/home/node/app/plugins \ | ||
| 22 | "$REF" | ||
| @@ -0,0 +1,35 @@ | |||
| 1 | <?xml version="1.0"?> | ||
| 2 | <Container version="2"> | ||
| 3 | <Name>sillytavern</Name> | ||
| 4 | <Repository>git.nas.home.htl-sky.net/permissionbrick/sillytavern:latest</Repository> | ||
| 5 | <Registry>https://git.nas.home.htl-sky.net/permissionBRICK/SillyTavern</Registry> | ||
| 6 | <Network>bridge</Network> | ||
| 7 | <MyIP/> | ||
| 8 | <MyMAC/> | ||
| 9 | <Shell>sh</Shell> | ||
| 10 | <Privileged>false</Privileged> | ||
| 11 | <Support>https://github.com/SillyTavern/SillyTavern/issues</Support> | ||
| 12 | <Project>https://git.nas.home.htl-sky.net/permissionBRICK/SillyTavern</Project> | ||
| 13 | <ReadMe>https://git.nas.home.htl-sky.net/permissionBRICK/SillyTavern</ReadMe> | ||
| 14 | <Overview>Full permissionBRICK SillyTavern build from GitGudLab, including RunPod/ComfyUI workflows, image references, OpenRouter per-chat session stickiness, and custom features not yet extracted as extensions. Public third-party extensions remain installed in the persistent user data directory. GitGudLab CI publishes :latest and Unraid automatically pulls and redeploys it.</Overview> | ||
| 15 | <Category>Tools:</Category> | ||
| 16 | <WebUI>http://nas.home.htl-sky.net:8000/</WebUI> | ||
| 17 | <TemplateURL/> | ||
| 18 | <Icon/> | ||
| 19 | <ExtraParams>--restart unless-stopped</ExtraParams> | ||
| 20 | <PostArgs/> | ||
| 21 | <CPUset/> | ||
| 22 | <DateInstalled>1784478110</DateInstalled> | ||
| 23 | <DonateText/> | ||
| 24 | <DonateLink/> | ||
| 25 | <Requires/> | ||
| 26 | <Config Name="HTTP Port" Target="8000" Default="8000" Mode="tcp" Description="SillyTavern web UI port" Type="Port" Display="always" Required="true" Mask="false">8000</Config> | ||
| 27 | <Config Name="Config" Target="/home/node/app/config" Default="/mnt/user/appdata/sillytavern/config.yaml" Mode="rw" Description="Persistent SillyTavern configuration file" Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/sillytavern/config.yaml</Config> | ||
| 28 | <Config Name="Data" Target="/home/node/app/data" Default="/mnt/user/appdata/sillytavern/data" Mode="rw" Description="User data: settings, characters, chats, secrets, and UI extensions" Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/sillytavern/data</Config> | ||
| 29 | <Config Name="Plugins" Target="/home/node/app/plugins" Default="/mnt/user/appdata/sillytavern/plugins" Mode="rw" Description="Server plugins" Type="Path" Display="always" Required="false" Mask="false">/mnt/user/appdata/sillytavern/plugins</Config> | ||
| 30 | <Config Name="NODE_ENV" Target="NODE_ENV" Default="production" Mode="" Description="" Type="Variable" Display="advanced" Required="false" Mask="false">production</Config> | ||
| 31 | <Config Name="FORCE_COLOR" Target="FORCE_COLOR" Default="1" Mode="" Description="" Type="Variable" Display="advanced" Required="false" Mask="false">1</Config> | ||
| 32 | <Config Name="SILLYTAVERN_HEARTBEATINTERVAL" Target="SILLYTAVERN_HEARTBEATINTERVAL" Default="30" Mode="" Description="Heartbeat for healthcheck" Type="Variable" Display="advanced" Required="false" Mask="false">30</Config> | ||
| 33 | <Config Name="TZ" Target="TZ" Default="Europe/Berlin" Mode="" Description="Container timezone" Type="Variable" Display="advanced" Required="false" Mask="false">Europe/Berlin</Config> | ||
| 34 | <TailscaleStateDir/> | ||
| 35 | </Container> | ||
| @@ -0,0 +1,12 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Update through DockerMan so the Unraid template remains authoritative. | ||
| 3 | set -eu | ||
| 4 | |||
| 5 | TEMPLATE=/boot/config/plugins/dockerMan/templates-user/my-sillytavern.xml | ||
| 6 | UPDATER=/usr/local/emhttp/plugins/dynamix.docker.manager/scripts/update_container | ||
| 7 | |||
| 8 | if docker inspect sillytavern >/dev/null 2>&1 && [ -f "$TEMPLATE" ]; then | ||
| 9 | exec "$UPDATER" sillytavern | ||
| 10 | fi | ||
| 11 | |||
| 12 | exec sh /boot/config/bootstrap-sillytavern.sh | ||