Add managed Gitea updates and server installer

This commit is contained in:
maxim
2026-07-31 22:16:51 +03:00
parent 22f40f3830
commit 3f881a59e5
10 changed files with 274 additions and 2 deletions

104
scripts/proxmox-dashboard-update Executable file
View File

@@ -0,0 +1,104 @@
#!/bin/sh
set -eu
CONFIG_FILE=${DASHBOARD_UPDATE_CONFIG:-/etc/proxmox-dashboard/update.env}
STATUS_FILE=${DASHBOARD_UPDATE_STATUS_PATH:-/var/lib/proxmox-dashboard/update-status.json}
BINARY_PATH=${DASHBOARD_BINARY_PATH:-/usr/local/bin/proxmox-cpu-dashboard}
if [ -f "$CONFIG_FILE" ]; then
# shellcheck disable=SC1090
. "$CONFIG_FILE"
fi
GITEA_URL=${GITEA_URL:-https://git.myown.center}
GITEA_REPOSITORY=${GITEA_REPOSITORY:-maxim/ProxmoxDash}
GITEA_TOKEN=${GITEA_TOKEN:-}
UPDATE_MODE=${UPDATE_MODE:-notify}
ASSET_NAME=${ASSET_NAME:-proxmox-dashboard-linux-amd64}
mkdir -p "$(dirname "$STATUS_FILE")"
tmp_dir=$(mktemp -d /tmp/proxmox-dashboard-update.XXXXXX)
trap 'rm -rf "$tmp_dir"' EXIT INT TERM
auth_header=""
if [ -n "$GITEA_TOKEN" ]; then
auth_header="Authorization: token $GITEA_TOKEN"
fi
api_get() {
if [ -n "$auth_header" ]; then
curl --fail --silent --show-error --location --header "$auth_header" "$1"
else
curl --fail --silent --show-error --location "$1"
fi
}
write_status() {
python3 - "$STATUS_FILE" "$1" "$2" "$3" "$4" "$5" "$6" <<'PY'
import datetime, json, os, sys, tempfile
path, current, available, state, mode, message, release_url = sys.argv[1:]
payload = {
"currentVersion": current,
"availableVersion": available,
"state": state,
"mode": mode,
"message": message,
"releaseUrl": release_url,
"checkedAt": datetime.datetime.now(datetime.timezone.utc).isoformat(),
}
fd, temporary = tempfile.mkstemp(dir=os.path.dirname(path), prefix=".update-status-")
with os.fdopen(fd, "w") as stream:
json.dump(payload, stream)
os.chmod(temporary, 0o644)
os.replace(temporary, path)
PY
}
current_version=$($BINARY_PATH -version 2>/dev/null || printf 'dev')
release_json=$(api_get "$GITEA_URL/api/v1/repos/$GITEA_REPOSITORY/releases/latest")
printf '%s' "$release_json" > "$tmp_dir/release.json"
release_data=$(python3 - "$tmp_dir/release.json" "$ASSET_NAME" <<'PY'
import json, sys
release = json.load(open(sys.argv[1]))
asset_name = sys.argv[2]
assets = {item.get("name"): item.get("browser_download_url") for item in release.get("assets", [])}
binary = assets.get(asset_name, "")
checksum = assets.get(asset_name + ".sha256", "")
print(release.get("tag_name", ""))
print(release.get("html_url", ""))
print(binary)
print(checksum)
PY
)
latest_version=$(printf '%s\n' "$release_data" | sed -n '1p')
release_url=$(printf '%s\n' "$release_data" | sed -n '2p')
binary_url=$(printf '%s\n' "$release_data" | sed -n '3p')
checksum_url=$(printf '%s\n' "$release_data" | sed -n '4p')
if [ -z "$latest_version" ] || [ -z "$binary_url" ]; then
write_status "$current_version" "$latest_version" error "$UPDATE_MODE" "В свежем релизе не найден бинарник $ASSET_NAME." "$release_url"
exit 1
fi
newest=$(printf '%s\n%s\n' "$current_version" "$latest_version" | sort -V | tail -n 1)
if [ "$current_version" = "$latest_version" ] || [ "$newest" = "$current_version" ]; then
write_status "$current_version" "$latest_version" current "$UPDATE_MODE" "Установлена свежая версия." "$release_url"
exit 0
fi
if [ "$UPDATE_MODE" != "auto" ]; then
write_status "$current_version" "$latest_version" available "$UPDATE_MODE" "Доступна новая версия $latest_version." "$release_url"
exit 0
fi
api_get "$binary_url" > "$tmp_dir/$ASSET_NAME"
if [ -n "$checksum_url" ]; then
api_get "$checksum_url" > "$tmp_dir/$ASSET_NAME.sha256"
(cd "$tmp_dir" && sha256sum -c "$ASSET_NAME.sha256")
fi
chmod 0755 "$tmp_dir/$ASSET_NAME"
file "$tmp_dir/$ASSET_NAME" | grep -q 'ELF 64-bit'
cp -p "$BINARY_PATH" "$BINARY_PATH.previous"
install -m 0755 "$tmp_dir/$ASSET_NAME" "$BINARY_PATH"
write_status "$latest_version" "$latest_version" updated "$UPDATE_MODE" "Обновление $latest_version установлено." "$release_url"
systemctl restart proxmox-cpu-dashboard.service