359afb3a59
Infrastructure configs for GMKtec K11 (Docker, vLLM, LocalAI, ComfyUI, control-plane, gpu-fan agent, Server UI with CLI/file explorer/GPU fan curve). Co-authored-by: Cursor <cursoragent@cursor.com>
107 lines
3.1 KiB
Bash
Executable File
107 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Setup 1TB data disk on GMKtec K11
|
|
# nvme0n1 = 1TB data | nvme1n1 = 128GB system
|
|
set -euo pipefail
|
|
|
|
DATA_DISK=/dev/nvme0n1
|
|
DATA_PART=/dev/nvme0n1p1
|
|
MOUNT_POINT=/data
|
|
|
|
echo "=== Sprawdzam dyski ==="
|
|
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL
|
|
|
|
# Safety: refuse if DATA_DISK has mountpoints (system disk)
|
|
if lsblk -n -o MOUNTPOINT "$DATA_DISK" | grep -q '/'; then
|
|
echo "BŁĄD: $DATA_DISK ma partycje zamontowane — przerwanie!"
|
|
exit 1
|
|
fi
|
|
|
|
# Create partition if missing
|
|
if ! lsblk -n "$DATA_PART" &>/dev/null; then
|
|
echo "=== Partycjonowanie $DATA_DISK ==="
|
|
parted -s "$DATA_DISK" mklabel gpt
|
|
parted -s "$DATA_DISK" mkpart primary ext4 0% 100%
|
|
partprobe "$DATA_DISK"
|
|
sleep 2
|
|
fi
|
|
|
|
# Format if no filesystem
|
|
if ! blkid -o value -s TYPE "$DATA_PART" 2>/dev/null | grep -q ext4; then
|
|
echo "=== Formatowanie $DATA_PART (ext4) ==="
|
|
mkfs.ext4 -F -L data1tb "$DATA_PART"
|
|
fi
|
|
|
|
UUID=$(blkid -o value -s UUID "$DATA_PART")
|
|
echo "UUID=$UUID"
|
|
|
|
# Mount point
|
|
mkdir -p "$MOUNT_POINT"
|
|
if ! mountpoint -q "$MOUNT_POINT"; then
|
|
echo "=== Montowanie $DATA_PART -> $MOUNT_POINT ==="
|
|
mount "$DATA_PART" "$MOUNT_POINT"
|
|
fi
|
|
|
|
# fstab
|
|
FSTAB_LINE="UUID=${UUID} ${MOUNT_POINT} ext4 defaults,noatime 0 2"
|
|
if ! grep -q "$MOUNT_POINT" /etc/fstab; then
|
|
echo "=== Dodaję wpis do /etc/fstab ==="
|
|
cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d%H%M%S)
|
|
echo "$FSTAB_LINE" >> /etc/fstab
|
|
else
|
|
echo "=== fstab już zawiera $MOUNT_POINT ==="
|
|
fi
|
|
|
|
mount -a
|
|
df -h "$MOUNT_POINT"
|
|
|
|
# Directory structure
|
|
echo "=== Tworzę strukturę katalogów ==="
|
|
mkdir -p "$MOUNT_POINT/docker"
|
|
mkdir -p "$MOUNT_POINT/apps/vllm/huggingface"
|
|
mkdir -p "$MOUNT_POINT/apps/gguf/"{qwen3.6-27b,gemma-4-12b}
|
|
mkdir -p "$MOUNT_POINT/apps/localai/"{models,backends,configuration,images,data}
|
|
mkdir -p "$MOUNT_POINT/apps/comfyui/storage"
|
|
mkdir -p "$MOUNT_POINT/apps/comfyui/cache/"{hf-hub,torch-hub}
|
|
mkdir -p "$MOUNT_POINT/apps/comfyui/"{models,input,output,custom_nodes,workflows}
|
|
chown -R tomasz-syn-grzegorza:tomasz-syn-grzegorza "$MOUNT_POINT/apps"
|
|
|
|
# Docker data-root migration
|
|
echo "=== Migracja Docker data-root ==="
|
|
systemctl stop docker docker.socket 2>/dev/null || true
|
|
|
|
if [ -d /var/lib/docker ] && [ "$(ls -A /var/lib/docker 2>/dev/null)" ]; then
|
|
echo "Kopiuję /var/lib/docker -> $MOUNT_POINT/docker ..."
|
|
rsync -aHAX /var/lib/docker/ "$MOUNT_POINT/docker/"
|
|
fi
|
|
|
|
mkdir -p "$MOUNT_POINT/docker"
|
|
|
|
python3 <<'PYEOF'
|
|
import json
|
|
from pathlib import Path
|
|
p = Path("/etc/docker/daemon.json")
|
|
cfg = json.loads(p.read_text()) if p.exists() else {}
|
|
cfg["data-root"] = "/data/docker"
|
|
p.write_text(json.dumps(cfg, indent=2) + "\n")
|
|
print(p.read_text())
|
|
PYEOF
|
|
|
|
systemctl start docker
|
|
sleep 2
|
|
|
|
echo "=== Weryfikacja ==="
|
|
docker info | grep "Docker Root Dir"
|
|
df -h / "$MOUNT_POINT"
|
|
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL
|
|
|
|
echo "=== Test Docker ==="
|
|
docker run --rm hello-world
|
|
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
|
|
|
|
echo ""
|
|
echo "=== GOTOWE ==="
|
|
echo "Dysk danych: $MOUNT_POINT ($UUID)"
|
|
echo "Docker Root: /data/docker"
|
|
echo "Modele vLLM: /data/apps/vllm/huggingface"
|
|
echo "LocalAI: /data/apps/localai/models"
|