Restore GitGudLab Unraid deployment path
| @@ -21,7 +21,7 @@ build-image: | ||
| 21 | 21 | - docker info >/dev/null |
| 22 | 22 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" |
| 23 | 23 | - docker pull "$CI_REGISTRY_IMAGE:latest" || true |
| 24 | 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 | 25 | - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" |
| 26 | 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 | 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 | 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 | 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 | 37 | Related: the RunPod worker image (ComfyUI + custom nodes + boot-time model |
| 14 | 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 | |