Add stack Update, ComfyUI model manager, and slim ComfyUI stack.

Server UI gains Update on stack cards, ComfyUI Models tab with workflow
scan and downloads, and centralized comfyui_config. Model catalog and
download scripts move from stacks/comfyui to server-ui so ComfyUI stays a
minimal Docker wrapper for easier image updates.
This commit is contained in:
tomasz-syn-grzegorza
2026-07-05 18:45:17 +00:00
parent 359afb3a59
commit 73e4fc005e
33 changed files with 3604 additions and 307 deletions
+30 -16
View File
@@ -38,24 +38,26 @@ Na serwerze produkcyjnym (systemd):
## 3. Wyświetl klucz na serwerze
Zaloguj się na serwer (SSH) i wpisz:
**Polecane** — klucz + link + weryfikacja live:
```bash
bash ~/cursor/ubuntu-bare-metal/stacks/server-ui/scripts/show-api-key.sh
```
Skrypt czyta **`/opt/control-plane/.env`** (produkcja), weryfikuje klucz na działającym `server-ui` i pokazuje `Weryfikacja live: OK` lub `FAIL`.
Tylko klucz (ręcznie):
```bash
sudo grep ^API_KEY= /opt/control-plane/.env
```
Przykład wyniku:
```
API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
Skopiuj **tylko** część po `=` (bez słowa `API_KEY=`).
Alternatywa — gotowa instrukcja z linkiem:
Diagnostyka (exit 0 = OK):
```bash
bash ~/cursor/ubuntu-bare-metal/stacks/server-ui/scripts/show-api-key.sh
bash ~/cursor/ubuntu-bare-metal/stacks/server-ui/scripts/verify-api-key.sh
```
---
@@ -75,7 +77,7 @@ Przykład: `http://192.168.100.90:8091/`
### Krok B — wklej klucz
1. U góry strony znajdź pole **API Key**
2. Wklej skopiowany klucz
2. Wklej skopiowany klucz (bez spacji na końcach)
3. Kliknij **Zapisz**
### Krok C — sprawdź
@@ -84,6 +86,8 @@ Przykład: `http://192.168.100.90:8091/`
2. Powinno pojawić się: **Klucz poprawny** (zielony tekst)
3. Dopiero teraz używaj Start/Stop, CLI itd.
Jeśli klucz jest zły: kliknij **Wyczyść klucz**, wklej ponownie ze skryptu z kroku 3.
---
## 5. Szybsza metoda — gotowy link
@@ -94,7 +98,7 @@ Zamiast kroków BC możesz otworzyć od razu:
http://<IP-serwera>:8091/?api_key=TWÓJ_KLUCZ_Z_KROKU_3
```
Klucz zapisze się w przeglądarce automatycznie. Nadal kliknij **Sprawdź klucz** dla pewności.
Klucz zapisze się w przeglądarce i **automatycznie** zweryfikuje (status „Klucz poprawny”).
---
@@ -111,10 +115,18 @@ Klucz zapisze się w przeglądarce automatycznie. Nadal kliknij **Sprawdź klucz
| # | Sprawdź | Co zrobić |
|---|---------|-----------|
| 1 | Kliknąłeś **Zapisz**? | Wklej klucz → **Zapisz****Sprawdź klucz** |
| 2 | Stary klucz w przeglądarce? | F12 → Application → Local Storage → usuń `server-ui-api-key`, odśwież stronę |
| 3 | Klucz z właściwego pliku? | Tylko `sudo grep ^API_KEY= /opt/control-plane/.env` |
| 4 | Panel po restarcie? | `sudo systemctl restart server-ui` |
| 5 | Właściwy proces na porcie? | `ss -tlnp \| grep 8091` — powinno być `/opt/server-ui` |
| 2 | Stary klucz w przeglądarce? | Kliknij **Wyczyść klucz** w panelu, lub F12 → Local Storage → usuń `server-ui-api-key` |
| 3 | Klucz z właściwego pliku? | `bash stacks/server-ui/scripts/show-api-key.sh` (nie dev ręcznie) |
| 4 | Klucz działa na serwerze? | `bash stacks/server-ui/scripts/verify-api-key.sh` |
| 5 | Panel po aktualizacji? | `sudo systemctl restart server-ui` |
| 6 | Właściwy proces na porcie? | `ss -tlnp \| grep 8091` — powinno być `/opt/server-ui` |
Sync prod ↔ dev (gdy klucze się rozjechały):
```bash
sudo bash ~/cursor/ubuntu-bare-metal/stacks/server-ui/scripts/setup-control-plane-env.sh
sudo systemctl restart server-ui
```
---
@@ -133,8 +145,10 @@ bash ~/cursor/ubuntu-bare-metal/stacks/server-ui/scripts/show-api-key.sh
| Pytanie | Odpowiedź |
|---------|-----------|
| Gdzie klucz? | `/opt/control-plane/.env``API_KEY` |
| Jak wyświetlić? | `sudo grep ^API_KEY= /opt/control-plane/.env` |
| Jak wyświetlić? | `bash stacks/server-ui/scripts/show-api-key.sh` |
| Jak zweryfikować? | `bash stacks/server-ui/scripts/verify-api-key.sh` |
| Jak wpisać w UI? | Pole API Key → Zapisz → Sprawdź klucz |
| Stary klucz? | **Wyczyść klucz** w toolbarze |
| Gotowy link? | `http://IP:8091/?api_key=KLUCZ` |
Powrót: [08 — Server UI](08-server-ui-install.md) · [README](README.md)
+25 -3
View File
@@ -210,15 +210,37 @@ cd ../localai && docker compose --profile localai start localai
---
## 10. Modele (później)
## 10. Modele
Compose **nie pobiera** modeli automatycznie.
Opcje:
### Server UI (zalecane)
1. **ComfyUI-Manager** w UI — instalacja węzłów i modeli
1. Panel **Server UI** (`http://<IP>:8091`) → zakładka **ComfyUI Modele**
2. Wpisz API Key (rozdział 08) → wybierz model → **Pobierz**
3. Pliki lądują w `/data/apps/comfyui/models/` (bind mount — przetrwają restart kontenera)
**Sekcja „Wymagane przez workflow”** skanuje `/data/apps/comfyui/workflows/*.json` i pokazuje brakujące pliki (checkpoint, LoRA, VAE itd.). URL pobierania jest brany z ComfyUI-Manager, gdy model nie ma wpisu w `stacks/server-ui/comfyui-models.catalog.yaml`. Zapis workflow w ComfyUI (`:8188`) automatycznie aktualizuje listę po odświeżeniu Server UI.
Przykład testowy: `cp manual-tutorial/examples/comfyui/example-sdxl-refiner.api.json /data/apps/comfyui/workflows/`
### Skrypty CLI
```bash
cd stacks/server-ui/scripts/comfyui
./list-models.sh
./download-model.sh <catalog-id>
```
Katalog: `stacks/server-ui/comfyui-models.catalog.yaml`
### Inne opcje
1. **ComfyUI-Manager** w UI ComfyUI (`:8188`) — modele spoza katalogu repo
2. Ręcznie — pliki `.safetensors` / `.ckpt` do `/data/apps/comfyui/models/checkpoints/`
Opcjonalnie w `.env`: `HF_TOKEN`, `CIVITAI_TOKEN` (dla wybranych wpisów katalogu).
Szacunki VRAM (przy zatrzymanym LocalAI):
| Model | VRAM (orientacyjnie) |
+8 -3
View File
@@ -76,8 +76,11 @@ sudo ls /root
| Co | Wyjaśnienie |
|----|-------------|
| Nie jesteś rootem | Panel działa jako Twój użytkownik — jak zwykłe SSH |
| Nowa sesja po reconnect | Zamknięcie zakładki / **Połącz ponownie** = nowy bash |
| Limit sesji | Domyślnie max 5 równoległych terminali (wszystkie karty) |
| Sesja żyje między zakładkami | Przełączenie na Stacki/Pliki **nie** zabija basha |
| F5 w tej samej karcie | Sesja wraca (cwd, procesy) — przez `sessionStorage` |
| Nowa sesja celowo | **Połącz ponownie** = świeży bash |
| Limit sesji | Domyślnie max 5 równoległych bashów (wszystkie karty) |
| Wygaśnięcie | Po zamknięciu karty bash żyje ~5 min (`CLI_SESSION_TTL`), potem wygasa |
| Wyłączenie CLI | Admin może ustawić `CLI_ENABLED=0` w `/opt/control-plane/.env` |
---
@@ -98,7 +101,9 @@ sudo ls /root
2. `echo test-cli-ok` → widzisz `test-cli-ok`
3. `docker ps` → lista kontenerów
4. Zmień rozmiar okna — prompt nie „łamie się” dziwnie
5. Przełącz na **Stacki** i wróć do **CLI**nowa sesja (to normalne)
5. Uruchom `sleep 60`, przełącz na **Stacki**, wróć do **CLI**`sleep` nadal działa
6. `cd /tmp`, odśwież stronę (F5) — po **Przywrócono sesję** jesteś w `/tmp`
7. **Połącz ponownie** — nowy bash (np. `pwd` → katalog domowy)
---
@@ -0,0 +1,50 @@
{
"3": {
"inputs": {
"seed": 42,
"steps": 20,
"cfg": 8,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["5", 0]
},
"class_type": "KSampler",
"_meta": { "title": "KSampler" }
},
"4": {
"inputs": {
"ckpt_name": "sd_xl_refiner_1.0_0.9vae.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": { "title": "Load Checkpoint" }
},
"5": {
"inputs": { "width": 1024, "height": 1024, "batch_size": 1 },
"class_type": "EmptyLatentImage",
"_meta": { "title": "Empty Latent Image" }
},
"6": {
"inputs": { "text": "a scenic landscape", "clip": ["4", 1] },
"class_type": "CLIPTextEncode",
"_meta": { "title": "CLIP Text Encode (Prompt)" }
},
"7": {
"inputs": { "text": "text, watermark", "clip": ["4", 1] },
"class_type": "CLIPTextEncode",
"_meta": { "title": "CLIP Text Encode (Prompt)" }
},
"8": {
"inputs": { "samples": ["3", 0], "vae": ["4", 2] },
"class_type": "VAEDecode",
"_meta": { "title": "VAE Decode" }
},
"9": {
"inputs": { "filename_prefix": "ComfyUI", "images": ["8", 0] },
"class_type": "SaveImage",
"_meta": { "title": "Save Image" }
}
}