#!/bin/sh set -eu if [ "$(id -u)" -ne 0 ]; then echo "Запустите команду установки от root." >&2 exit 1 fi if [ -z "${DASHBOARD_URL:-}" ] || [ -z "${ENROLL_TOKEN:-}" ]; then echo "Не заданы DASHBOARD_URL и ENROLL_TOKEN. Создайте команду в настройках Dashboard." >&2 exit 1 fi case "$(uname -m)" in x86_64|amd64) ;; *) echo "Поддерживается Linux amd64 (x86_64)." >&2; exit 1 ;; esac if command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ]; then agent_init=systemd elif command -v rc-service >/dev/null 2>&1 && command -v supervise-daemon >/dev/null 2>&1; then agent_init=openrc else echo "Нужен работающий systemd или OpenRC с supervise-daemon." >&2; exit 1 fi if ! command -v curl >/dev/null 2>&1; then if command -v apk >/dev/null 2>&1; then apk add --no-cache curl ca-certificates; else echo "Установите curl и ca-certificates." >&2; exit 1; fi fi GITEA_URL=${GITEA_URL:-https://git.myown.center} GITEA_REPOSITORY=${GITEA_REPOSITORY:-maxim/ProxmoxDash} VMID=${VMID:-0} AGENT_NAME=${AGENT_NAME:-$(hostname)} case "$DASHBOARD_URL$ENROLL_TOKEN$AGENT_NAME$VMID" in *' '*) echo "Параметры установки не должны содержать переносы строк." >&2; exit 1 ;; esac release_json=$(curl -fsSL "$GITEA_URL/api/v1/repos/$GITEA_REPOSITORY/releases/latest") download_url=$(printf '%s' "$release_json" | sed -n 's/.*"browser_download_url":"\([^"]*\/proxmox-dashboard-linux-amd64\)".*/\1/p' | head -n 1) if [ -z "$download_url" ]; then echo "В последнем релизе не найден Linux-бинарник." >&2 exit 1 fi install -d -m 0700 /var/lib/proxmox-dashboard-agent temporary_binary=$(mktemp /tmp/proxmox-dashboard-agent.XXXXXX) trap 'rm -f "$temporary_binary" "$temporary_binary.sha256"' EXIT curl -fsSL "$download_url" -o "$temporary_binary" curl -fsSL "$download_url.sha256" -o "$temporary_binary.sha256" expected_hash=$(awk 'NR==1 {print $1}' "$temporary_binary.sha256") actual_hash=$(sha256sum "$temporary_binary" | awk '{print $1}') if [ "${#expected_hash}" -ne 64 ] || [ "$expected_hash" != "$actual_hash" ]; then echo "SHA-256 загрузки не совпал." >&2; exit 1; fi install -m 0755 "$temporary_binary" /var/lib/proxmox-dashboard-agent/proxmox-dashboard-agent umask 077 { printf 'DASHBOARD_URL=%s\n' "$DASHBOARD_URL" printf 'ENROLL_TOKEN=%s\n' "$ENROLL_TOKEN" printf 'AGENT_NAME=%s\n' "$AGENT_NAME" printf 'VMID=%s\n' "$VMID" } > /etc/proxmox-dashboard-agent.env if [ "$agent_init" = systemd ]; then cat > /etc/systemd/system/proxmox-dashboard-agent.service <<'UNIT' [Unit] Description=Proxmox Dashboard read-only guest agent After=network-online.target docker.service Wants=network-online.target [Service] Type=simple EnvironmentFile=/etc/proxmox-dashboard-agent.env ExecStart=/var/lib/proxmox-dashboard-agent/proxmox-dashboard-agent --agent --agent-server ${DASHBOARD_URL} --agent-enroll-token ${ENROLL_TOKEN} --agent-name ${AGENT_NAME} --agent-vmid ${VMID} Restart=always RestartSec=5 NoNewPrivileges=true ProtectHome=true PrivateTmp=true ProtectSystem=strict ReadWritePaths=/var/lib/proxmox-dashboard-agent [Install] WantedBy=multi-user.target UNIT systemctl daemon-reload systemctl enable proxmox-dashboard-agent.service systemctl restart proxmox-dashboard-agent.service else mkdir -p /usr/local/sbin /etc/init.d cat > /usr/local/sbin/proxmox-dashboard-agent-run <<'RUN' #!/bin/sh set -eu # Parse literal key=value records, never evaluate configuration as shell code. while IFS='=' read -r key value; do case "$key" in DASHBOARD_URL|ENROLL_TOKEN|AGENT_NAME|VMID|DASHBOARD_NPM_LOG_DIR|DASHBOARD_CROWDSEC_CONTAINER) export "$key=$value" ;; esac done < /etc/proxmox-dashboard-agent.env exec /var/lib/proxmox-dashboard-agent/proxmox-dashboard-agent --agent --agent-server "$DASHBOARD_URL" --agent-enroll-token "$ENROLL_TOKEN" --agent-name "$AGENT_NAME" --agent-vmid "$VMID" RUN chmod 0755 /usr/local/sbin/proxmox-dashboard-agent-run cat > /etc/init.d/proxmox-dashboard-agent <<'OPENRC' #!/sbin/openrc-run description="Proxmox Dashboard guest agent" command="/usr/local/sbin/proxmox-dashboard-agent-run" supervisor="supervise-daemon" respawn_delay=5 respawn_max=0 output_log="/var/log/proxmox-dashboard-agent.log" error_log="/var/log/proxmox-dashboard-agent.log" depend() { need net after docker } start_pre() { checkpath --file --mode 0600 /var/log/proxmox-dashboard-agent.log } OPENRC chmod 0755 /etc/init.d/proxmox-dashboard-agent rc-update add proxmox-dashboard-agent default rc-service proxmox-dashboard-agent restart fi rm -f /usr/local/bin/proxmox-dashboard-agent echo "Агент установлен. Через несколько секунд он появится в Dashboard."