Restore GitGudLab Unraid deployment path

cfd8d91797947158e3ecd47c1d0b28a0e5a8d42e

permissionBRICK <40219477+permissionBRICK@users.noreply.github.com>

5 files changed, +94 -1Ignore whitespace
.gitlab-ci.yml+1 -1
@@ -21,7 +21,7 @@ build-image:
21 - docker info >/dev/null21 - 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" || true23 - 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"
2727
homelab/README.md+24 -0
@@ -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
18Every push to `main` builds the complete customized source tree in GitGudLab CI
19and publishes both the commit tag and
20`git.nas.home.htl-sky.net/permissionbrick/sillytavern:latest`. The image carries
21OCI source, revision, and build-time labels so a running container can be tied
22back to the exact commit.
23
24On Unraid, Community Applications Auto Update has `sillytavern` enabled. A
25shared registry poller additionally checks the GitGudLab tag every two minutes
26and invokes `redeploy-sillytavern.sh` when its image ID changes. Do not point
27the DockerMan template at a different image while leaving that poller enabled:
28the poller and template would otherwise continually disagree and recreate the
29container.
30
31The persistent UI extensions live below
32`data/default-user/extensions` and are discovered through the data mount. Do
33not restore the obsolete `/home/node/app/public/scripts/extensions/third-party`
34bind mount. `config.yaml` is a single-file bind mounted at
35`/home/node/app/config`; plugins remain mounted at `/home/node/app/plugins`.
1236
13Related: the RunPod worker image (ComfyUI + custom nodes + boot-time model37Related: the RunPod worker image (ComfyUI + custom nodes + boot-time model
14downloader) is built from github.com/permissionBRICK/comfyui-runpod-worker38downloader) is built from github.com/permissionBRICK/comfyui-runpod-worker
homelab/unraid/bootstrap-sillytavern.sh+22 -0
@@ -0,0 +1,22 @@
1#!/bin/sh
2# Raw recovery bootstrap. Normal updates go through redeploy-sillytavern.sh.
3set -eu
4
5REF=git.nas.home.htl-sky.net/permissionbrick/sillytavern:latest
6
7docker pull "$REF"
8docker rm -f sillytavern >/dev/null 2>&1 || true
9docker 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"
homelab/unraid/my-sillytavern.xml+35 -0
@@ -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>
homelab/unraid/redeploy-sillytavern.sh+12 -0
@@ -0,0 +1,12 @@
1#!/bin/sh
2# Update through DockerMan so the Unraid template remains authoritative.
3set -eu
4
5TEMPLATE=/boot/config/plugins/dockerMan/templates-user/my-sillytavern.xml
6UPDATER=/usr/local/emhttp/plugins/dynamix.docker.manager/scripts/update_container
7
8if docker inspect sillytavern >/dev/null 2>&1 && [ -f "$TEMPLATE" ]; then
9 exec "$UPDATER" sillytavern
10fi
11
12exec sh /boot/config/bootstrap-sillytavern.sh