Przejdź do treści

02 - Deploy Runbook (odtworzenie od zera)

Scenariusz: GX10 padł / kupujesz nowy sprzęt / migrujesz. Ten dokument prowadzi krok po kroku.

Zakładania

  • Nowa maszyna to Linux ARM64 z NVIDIA CUDA (idealnie DGX OS na Grace Blackwell, ale każdy Linux z Docker + NVIDIA runtime działa)
  • Masz SSH access
  • Masz dostęp do konta Cloudflare Konrada (dla tunnel config update, DNS)
  • Masz dostęp do konta GitHub Vallhalen (dla clone repos)
  • Masz HF_TOKEN dla Bielik-11B-v3.0 (gated repo)

Krok 0: Sprzęt + system

# Podstawy: Docker + NVIDIA runtime
sudo apt update && sudo apt install -y docker.io nvidia-container-toolkit git curl
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# relogin

# Test GPU
docker run --rm --gpus all nvidia/cuda:13.0-base-arm64 nvidia-smi

Krok 1: Sklonuj kony-gx10-stack

# SSH key dla git
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ''
cat ~/.ssh/id_ed25519.pub
# Dodaj do GitHub: Settings → SSH keys → New

git clone git@github.com:Vallhalen/kony-gx10-stack.git ~/kony-backup-repo

Krok 2: Podnieś core kontenery

Kolejność ważna: model backends przed kony-brain.

2.1 vllm-bielik (11B FP16)

cd ~/kony-backup-repo/kony-brain  # kony-brain repo ma odniesienia do wszystkich modeli
mkdir -p ~/.cache/huggingface
docker run -d --name vllm-bielik --gpus all --ipc=host --network host \
  --restart unless-stopped \
  -e HF_TOKEN=hf_YOUR_TOKEN \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  ghcr.io/timothystewart6/vllm-gb10:latest \
  vllm serve speakleash/Bielik-11B-v3.0-Instruct \
    --host 0.0.0.0 --port 8000 \
    --max-model-len 32768 \
    --gpu-memory-utilization 0.2 \
    --dtype float16

2.2 vllm-qwen32b (Qwen 32B AWQ + tool calling)

docker run -d --name vllm-qwen32b --gpus all --ipc=host --network host \
  --restart unless-stopped \
  -e HF_TOKEN=hf_YOUR_TOKEN \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  ghcr.io/timothystewart6/vllm-gb10:latest \
  vllm serve Qwen/Qwen2.5-32B-Instruct-AWQ \
    --host 0.0.0.0 --port 8001 \
    --max-model-len 16384 \
    --gpu-memory-utilization 0.42 \
    --enable-auto-tool-choice \
    --tool-call-parser hermes

2.3 kony-vl (Qwen VL 7B AWQ)

docker run -d --name kony-vl --gpus all --ipc=host --network host \
  --restart unless-stopped \
  -e HF_TOKEN=hf_YOUR_TOKEN \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  ghcr.io/timothystewart6/vllm-gb10:latest \
  vllm serve Qwen/Qwen2.5-VL-7B-Instruct-AWQ \
    --host 0.0.0.0 --port 8004 \
    --max-model-len 8192 \
    --gpu-memory-utilization 0.25 \
    --limit-mm-per-prompt image=2

2.4 kony-whisper

docker run -d --name kony-whisper --gpus all --network host \
  --restart unless-stopped \
  -e WHISPER_MODEL=faster-whisper-medium \
  fedirz/faster-whisper-server:latest-cuda

2.5 kony-embed (mmlw + wrapper)

cd ~/kony-backup-repo/kony-embed
docker build -t chwytek-embed:1.0 .

docker run -d --name kony-embed --gpus all --network host \
  --restart unless-stopped \
  -e PORT=8018 \
  chwytek-embed:1.0

2.6 kony-tts-xtts (voice clone)

WAŻNE: bez konrad.wav w reference kontener nie wstanie! Wgraj reference audio 15s Konradowego głosu (naturalny czytany tekst, 22050Hz mono WAV).

cd ~/kony-backup-repo/kony-tts-xtts
mkdir -p reference
# scp gx10-old:~/kony-tts-xtts/reference/konrad.wav reference/
# ALBO: nagraj nowo (mikrofon, 15s naturalnego głosu)

docker build -t kony-tts-xtts:latest .
docker run -d --name kony-tts-xtts --gpus all --network host \
  --restart unless-stopped \
  -v ~/kony-tts-xtts/reference:/app/reference \
  kony-tts-xtts:latest

2.7 bielik-guard

cd ~/kony-backup-repo/bielik-guard
docker build -t bielik-guard:1.0 .
docker run -d --name bielik-guard --gpus all --network host \
  --restart unless-stopped \
  -e SAFETY_THRESHOLD=0.7 \
  bielik-guard:1.0

2.8 kony-bdh

cd ~/kony-backup-repo/kony-bdh

# Pobierz .pt z osobnego repo (58MB nie w git kony-gx10-stack)
git clone git@github.com:Vallhalen/kony-checkpoints.git /tmp/kony-ckpt
cp /tmp/kony-ckpt/*.pt .

docker build -t kony-bdh:latest .  # WYMAGA Dockerfile - jesli brak, patrz TODO
mkdir -p ~/kony-bdh
cp -r . ~/kony-bdh/
docker run -d --name kony-bdh --gpus all --network host \
  --restart unless-stopped \
  -e PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
  -e CHECKPOINT_PATH=/workspace/bdh_kony_v2_checkpoint.pt \
  -e CLASSIFIER_PATH=/workspace/bdh_classifier_v2_checkpoint.pt \
  -e PORT=8020 \
  -v ~/kony-bdh:/workspace \
  kony-bdh:latest

TODO: kony-bdh nie ma Dockerfile w repo (script uruchamiany z ad-hoc container). Do zrobienia: napisać Dockerfile.

2.9 kony-brain (najważniejsze, ostatnie)

cd ~/kony-backup-repo/kony-brain

docker build -t kony-brain:v23 .

docker run -d --name kony-brain --gpus all --network host \
  --restart unless-stopped \
  -e QWEN_URL=http://localhost:8001 \
  -e BIELIK_URL=http://localhost:8000 \
  -e WHISPER_URL=http://localhost:8010 \
  -e TTS_URL=http://localhost:8017 \
  -e EMBED_URL=http://localhost:8018 \
  -e GUARD_URL=http://localhost:8002 \
  -e KONY_HUB_URL=https://crm.chcedointernetu.pl \
  -e KONY_CAPTURE_SECRET=NxFk4yZLH-5hRLzQWsmZ8Bg11Kk96pbGk9BpbgoLlfk \
  -e FLEXY_KEY=Kpj_keBmQ6eCTLo6w0Ye1CBKat_EmhgbgP_WeETyeU8 \
  -e KONY_BRIDGE_URL=https://n8n.chcedointernetu.pl/webhook/kony-bridge \
  kony-brain:v23

Poczekaj 2-3 min - RAG index się backfilluje z Kony Hub (~200 captures = ~30-60s embed).

Verify: curl http://localhost:8000/health i curl http://localhost:8000/rag/status

Krok 3: Update CF Tunnel ingress (jeśli IP się zmieniło)

Sprawdź obecne ingress:

TOKEN=$(cat ~/AppData/Roaming/xdg.config/.wrangler/config/default.toml | grep oauth_token | cut -d'"' -f2)
curl -H "Authorization: Bearer $TOKEN" \
  https://api.cloudflare.com/client/v4/accounts/4e8c2f004007c047121ecb89819fb47e/cfd_tunnel/15f1c70e-da23-4304-9743-d28f9f316c10/configurations \
  | jq '.result.config.ingress'

Jeśli nowa maszyna ma inne IP niż 10.0.0.114, PUT nowe ingress rules z aktualnym IP (playbook w ../reference_cf_tunnel_nas_vallhala.md).

Krok 4: n8n workflows import

Na NAS (Synology DSM → n8n container), zaloguj się do UI. Dla każdego workflow z n8n-workflows/:

  • Kony Bridge: Menu → Import from File → n8n-workflows/kony-bridge.json
  • Kony Faktury → SALDEO: analogicznie
  • DMARC Watchdog: analogicznie
  • AI Desk Lead Flow: analogicznie

Uwaga na credentials: workflow JSONy odnoszą się do credentials po nazwie (Kony Hub Auth, Gmail OAuth2, HA Access Token). Musisz je odtworzyć w n8n Credentials store ręcznie (bo credentials nie eksportujemy do git ze względu na secrets).

Krok 5: Cron backup na nowej maszynie

scp /path/to/old-gx10/kony-daily-backup.sh ~/kony-daily-backup.sh
# ALBO: napisz nowy z ~/kony-backup-repo/README.md wzorca

chmod +x ~/kony-daily-backup.sh
echo "0 3 * * * /home/vallhalen/kony-daily-backup.sh" | crontab -

# n8n key
echo "PASTE_N8N_API_KEY_HERE" > ~/.n8n-api-key.txt
chmod 600 ~/.n8n-api-key.txt

Krok 6: Test end-to-end

# 1. Health
for url in http://localhost:8000/health http://localhost:8004/v1/models http://localhost:8020/health; do
  echo "=== $url ==="; curl -s -m 5 "$url" | head -1
done

# 2. Public endpoints (przez tunel)
curl -A "Mozilla/5.0" https://voice.chcedointernetu.pl/health
curl -A "Mozilla/5.0" https://bdh.chcedointernetu.pl/health

# 3. Capture pipeline (real POST z apki - z telefonu)
# Otworz KonyAI Flutter, wyślij test capture, obserwuj:
#   - Kony Hub API: nowy capture w /api/kony/captures
#   - Ntfy push na telefon

Krok 7: Update Worker jeśli hostname się zmienił

Jeśli musisz zmienić GX10_INTERNAL_URL w Worker:

cd send-to-second-brain/worker
echo "https://qwen-vl.chcedointernetu.pl" | wrangler secret put GX10_INTERNAL_URL

Znane pułapki

  • Kolejność startu: LLM backends przed kony-brain (kony-brain testuje wszystkie endpointy w startup - jeśli któryś nie odpowiada, kony-brain padnie z timeout)
  • HF gated repos: Bielik i Qwen wymagają HF_TOKEN z accepted license
  • VRAM starvation: 6+ modele naraz na 128GB unified może wymagać restart z niższym --gpu-memory-utilization (patrz [[project_local_ai_lab_gx10]] wpis o multi-vLLM tuningu)
  • kony-tts-xtts BEZ reference wav: nie wstanie. Musisz mieć nagranie głosu.
  • BDH bf16 pathway: server_v2.py musi używać with ctx: (autocast bfloat16) w /classify żeby features matched trening
  • CF Tunnel DNS record: jeśli tworzysz nowy hostname, nie zapomnij dodać CNAME w CF dashboard - wrangler OAuth token nie ma zone_dns:write scope

Pokrewne

  • 01-modules.md - szczegóły każdego kontenera
  • 05-troubleshooting.md - znane bugi i fixy
  • ../n8n-workflows/*.json - workflow definitions
  • ../deploy/docker-inspect.txt - komendy startowe z live GX10 (daily backup)