#!/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:-}: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"