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>
81 lines
2.4 KiB
Bash
Executable File
81 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
STACK_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
SERVER_UI_DIR="$(cd "${STACK_DIR}/../server-ui" && pwd)"
|
|
INSTALL_DIR="/opt/gpu-fan"
|
|
CONFIG_DIR="/etc/gpu-fan"
|
|
SERVICE_NAME="gpu-fan.service"
|
|
AGENT_PORT=18090
|
|
CONTROL_PLANE_ENV="/opt/control-plane/.env"
|
|
|
|
if [[ "${EUID}" -ne 0 ]]; then
|
|
echo "Run as root: sudo ${SCRIPT_DIR}/install.sh"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== GPU Fan Control — install ==="
|
|
|
|
bash "${SERVER_UI_DIR}/scripts/setup-control-plane-env.sh"
|
|
|
|
apt-get update -qq
|
|
apt-get install -y python3-venv python3-pip
|
|
|
|
mkdir -p "${INSTALL_DIR}" "${CONFIG_DIR}"
|
|
|
|
rsync -a --delete \
|
|
--exclude '.venv' \
|
|
--exclude '.env' \
|
|
--exclude '__pycache__' \
|
|
"${STACK_DIR}/" "${INSTALL_DIR}/"
|
|
|
|
if [[ ! -f "${CONFIG_DIR}/curve.json" ]]; then
|
|
cp "${INSTALL_DIR}/curve.default.json" "${CONFIG_DIR}/curve.json"
|
|
echo "Installed default curve: ${CONFIG_DIR}/curve.json"
|
|
fi
|
|
|
|
python3 -m venv "${INSTALL_DIR}/.venv"
|
|
"${INSTALL_DIR}/.venv/bin/pip" install --upgrade pip -q
|
|
"${INSTALL_DIR}/.venv/bin/pip" install -r "${INSTALL_DIR}/requirements.txt" -q
|
|
|
|
install -m 644 "${INSTALL_DIR}/gpu-fan.service" "/etc/systemd/system/${SERVICE_NAME}"
|
|
systemctl daemon-reload
|
|
systemctl enable "${SERVICE_NAME}"
|
|
systemctl restart "${SERVICE_NAME}"
|
|
sleep 2
|
|
|
|
API_KEY_VAL="$(grep '^API_KEY=' "${CONTROL_PLANE_ENV}" | cut -d= -f2- || true)"
|
|
LAN_IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
|
|
|
|
echo ""
|
|
echo "Installed to ${INSTALL_DIR}"
|
|
echo "Service: $(systemctl is-active "${SERVICE_NAME}" 2>/dev/null || echo unknown)"
|
|
echo "Env: ${CONTROL_PLANE_ENV}"
|
|
echo "Curve config: ${CONFIG_DIR}/curve.json"
|
|
echo "Agent API: 127.0.0.1:${AGENT_PORT} (localhost only)"
|
|
echo ""
|
|
echo "GPU Fan UI (Server UI, LAN):"
|
|
echo " http://${LAN_IP:-<server-ip>}:8091/#gpu-fan"
|
|
echo ""
|
|
echo "API key:"
|
|
echo " grep ^API_KEY= ${CONTROL_PLANE_ENV}"
|
|
echo ""
|
|
|
|
if ss -tlnp 2>/dev/null | grep -q ":${AGENT_PORT}"; then
|
|
echo "Port ${AGENT_PORT}: listening"
|
|
if [[ -n "${API_KEY_VAL}" ]]; then
|
|
STATUS="$(curl -sf "http://127.0.0.1:${AGENT_PORT}/api/status" -H "X-API-Key: ${API_KEY_VAL}" 2>/dev/null | head -c 120 || true)"
|
|
echo "Agent status: ${STATUS}..."
|
|
fi
|
|
else
|
|
echo "WARN: port ${AGENT_PORT} not listening — check: journalctl -u ${SERVICE_NAME} -n 20"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Logs:"
|
|
echo " journalctl -u ${SERVICE_NAME} -f"
|
|
echo ""
|
|
echo "Pełna instalacja (gpu-fan + Server UI):"
|
|
echo " sudo ${SERVER_UI_DIR}/scripts/install-control-plane.sh"
|