Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 85860cdddd | |||
| 01ed2da10e | |||
| d725910e7a | |||
| b599a990f6 | |||
| c403300cd2 | |||
| acf2302755 | |||
| 8fedd3defe | |||
| adda8181a6 | |||
| 789494cc89 | |||
| 561086e940 | |||
| 8442cbca77 | |||
| 102a58a068 | |||
| 4e849d5309 | |||
| 44e92c8bf0 | |||
| 873f5ae51e | |||
| 7ee6b6a96b | |||
| 91381f0850 | |||
| 8c3d022506 | |||
| 18b3b572f0 | |||
| 023e3ff59b | |||
| f516a1cf4c | |||
| b049712cd6 | |||
| 2cdfc60fe1 | |||
| 2739cb0894 | |||
| 3e5ef4fa08 | |||
| a7a010d660 | |||
| efa111e2dd | |||
| 813798ec2b | |||
| 9220dfb7a3 | |||
| 45e7713638 | |||
| 46edd4e3e4 | |||
| 800a18ac60 | |||
| 07384e4d7c | |||
| 1f7bf74970 | |||
| 9e4e0bc24a | |||
| 18687666a6 | |||
| ccb924f8f6 | |||
| 58ac4ee743 | |||
| d515448113 | |||
| ec3de30b14 | |||
| 4837b66089 | |||
| c312cf3d38 | |||
| 46f5af1966 | |||
| 85f98dff9a | |||
| bd56964860 | |||
| 481a653b75 | |||
| f94b59954f |
Executable
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
||||
0024ebd5201dc3b504aaa760b18ff6651338e3cae21e26e3cb8f4cc8b613b04a ProxMenux-1.2.0.AppImage
|
||||
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
@@ -1,670 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==========================================================
|
||||
# ProxMenux Monitor - Beta Program Installer
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Subproject : ProxMenux Monitor Beta
|
||||
# Copyright : (c) 2024-2025 MacRimi
|
||||
# License : GPL-3.0 (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# Version : Beta 1.1
|
||||
# Branch : develop
|
||||
# Last Updated : 2026-03-26
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# This script installs the BETA version of ProxMenux Monitor
|
||||
# from the develop branch on GitHub.
|
||||
#
|
||||
# Beta testers are expected to:
|
||||
# - Report bugs and unexpected behavior via GitHub Issues
|
||||
# - Provide feedback to help improve the final release
|
||||
#
|
||||
# Installs:
|
||||
# • dialog, curl, jq, git (system dependencies)
|
||||
# • ProxMenux core files (/usr/local/share/proxmenux)
|
||||
# • ProxMenux Monitor AppImage (Web dashboard on port 8008)
|
||||
# • Systemd service (auto-start on boot)
|
||||
#
|
||||
# Notes:
|
||||
# - Clones from the 'develop' branch
|
||||
# - Beta version file: beta_version.txt in the repository
|
||||
# - Transition to stable: re-run the official installer
|
||||
# ==========================================================
|
||||
|
||||
# ── Configuration ──────────────────────────────────────────
|
||||
INSTALL_DIR="/usr/local/bin"
|
||||
BASE_DIR="/usr/local/share/proxmenux"
|
||||
CONFIG_FILE="$BASE_DIR/config.json"
|
||||
CACHE_FILE="$BASE_DIR/cache.json"
|
||||
UTILS_FILE="$BASE_DIR/utils.sh"
|
||||
LOCAL_VERSION_FILE="$BASE_DIR/version.txt"
|
||||
BETA_VERSION_FILE="$BASE_DIR/beta_version.txt"
|
||||
MENU_SCRIPT="menu"
|
||||
|
||||
MONITOR_INSTALL_DIR="$BASE_DIR"
|
||||
MONITOR_SERVICE_FILE="/etc/systemd/system/proxmenux-monitor.service"
|
||||
MONITOR_PORT=8008
|
||||
|
||||
REPO_URL="https://github.com/MacRimi/ProxMenux.git"
|
||||
REPO_BRANCH="develop"
|
||||
TEMP_DIR="/tmp/proxmenux-beta-install-$$"
|
||||
|
||||
# ── Colors ─────────────────────────────────────────────────
|
||||
RESET="\033[0m"
|
||||
BOLD="\033[1m"
|
||||
WHITE="\033[38;5;15m"
|
||||
NEON_PURPLE_BLUE="\033[38;5;99m"
|
||||
DARK_GRAY="\033[38;5;244m"
|
||||
ORANGE="\033[38;5;208m"
|
||||
GN="\033[1;92m"
|
||||
YW="\033[33m"
|
||||
YWB="\033[1;33m"
|
||||
RD="\033[01;31m"
|
||||
BL="\033[36m"
|
||||
CL="\033[m"
|
||||
BGN="\e[1;32m"
|
||||
TAB=" "
|
||||
BFR="\\r\\033[K"
|
||||
HOLD="-"
|
||||
BOR=" | "
|
||||
CM="${GN}✓ ${CL}"
|
||||
|
||||
SPINNER_PID=""
|
||||
|
||||
# ── Spinner ────────────────────────────────────────────────
|
||||
spinner() {
|
||||
local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
|
||||
local spin_i=0
|
||||
printf "\e[?25l"
|
||||
while true; do
|
||||
printf "\r ${YW}%s${CL}" "${frames[spin_i]}"
|
||||
spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
|
||||
sleep 0.1
|
||||
done
|
||||
}
|
||||
|
||||
type_text() {
|
||||
local text="$1"
|
||||
local delay=0.04
|
||||
for ((i=0; i<${#text}; i++)); do
|
||||
echo -n "${text:$i:1}"
|
||||
sleep $delay
|
||||
done
|
||||
echo
|
||||
}
|
||||
|
||||
msg_info() {
|
||||
local msg="$1"
|
||||
echo -ne "${TAB}${YW}${HOLD}${msg}"
|
||||
spinner &
|
||||
SPINNER_PID=$!
|
||||
}
|
||||
|
||||
msg_ok() {
|
||||
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null 2>&1; then
|
||||
kill $SPINNER_PID > /dev/null 2>&1
|
||||
SPINNER_PID=""
|
||||
fi
|
||||
printf "\e[?25h"
|
||||
echo -e "${BFR}${TAB}${CM}${GN}${1}${CL}"
|
||||
}
|
||||
|
||||
msg_error() {
|
||||
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null 2>&1; then
|
||||
kill $SPINNER_PID > /dev/null 2>&1
|
||||
SPINNER_PID=""
|
||||
fi
|
||||
printf "\e[?25h"
|
||||
echo -e "${BFR}${TAB}${RD}[ERROR] ${1}${CL}"
|
||||
}
|
||||
|
||||
msg_warn() {
|
||||
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null 2>&1; then
|
||||
kill $SPINNER_PID > /dev/null 2>&1
|
||||
SPINNER_PID=""
|
||||
fi
|
||||
printf "\e[?25h"
|
||||
echo -e "${BFR}${TAB}${YWB}${1}${CL}"
|
||||
}
|
||||
|
||||
msg_title() {
|
||||
echo -e "\n"
|
||||
echo -e "${TAB}${BOLD}${HOLD}${BOR}${1}${BOR}${HOLD}${CL}"
|
||||
echo -e "\n"
|
||||
}
|
||||
|
||||
show_progress() {
|
||||
echo -e "\n${BOLD}${BL}${TAB}Installing ProxMenux Beta: Step ${1} of ${2}${CL}"
|
||||
echo
|
||||
echo -e "${TAB}${BOLD}${YW}${HOLD}${3}${CL}"
|
||||
}
|
||||
|
||||
# ── Cleanup ────────────────────────────────────────────────
|
||||
cleanup() {
|
||||
if [ -d "$TEMP_DIR" ]; then
|
||||
rm -rf "$TEMP_DIR"
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# ── Logo ───────────────────────────────────────────────────
|
||||
show_proxmenux_logo() {
|
||||
clear
|
||||
|
||||
if [[ -z "$SSH_TTY" && -z "$(who am i | awk '{print $NF}' | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}')" ]]; then
|
||||
|
||||
LOGO=$(cat << "EOF"
|
||||
\e[0m\e[38;2;61;61;61m▆\e[38;2;60;60;60m▄\e[38;2;54;54;54m▂\e[0m \e[38;2;0;0;0m \e[0m \e[38;2;54;54;54m▂\e[38;2;60;60;60m▄\e[38;2;61;61;61m▆\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[38;2;61;61;61;48;2;37;37;37m▇\e[0m\e[38;2;60;60;60m▅\e[38;2;56;56;56m▃\e[38;2;37;37;37m▁ \e[38;2;36;36;36m▁\e[38;2;56;56;56m▃\e[38;2;60;60;60m▅\e[38;2;61;61;61;48;2;37;37;37m▇\e[48;2;62;62;62m \e[0m\e[7m\e[38;2;60;60;60m▁\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[7m\e[38;2;61;61;61m▂\e[0m\e[38;2;62;62;62;48;2;61;61;61m┈\e[48;2;62;62;62m \e[48;2;61;61;61m┈\e[0m\e[38;2;60;60;60m▆\e[38;2;57;57;57m▄\e[38;2;48;48;48m▂\e[0m \e[38;2;47;47;47m▂\e[38;2;57;57;57m▄\e[38;2;60;60;60m▆\e[38;2;62;62;62;48;2;61;61;61m┈\e[48;2;62;62;62m \e[48;2;61;61;61m┈\e[0m\e[7m\e[38;2;60;60;60m▂\e[38;2;57;57;57m▄\e[38;2;47;47;47m▆\e[0m \e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[38;2;32;32;32m▏\e[7m\e[38;2;39;39;39m▇\e[38;2;57;57;57m▅\e[38;2;60;60;60m▃\e[0m\e[38;2;40;40;40;48;2;61;61;61m▁\e[48;2;62;62;62m \e[38;2;54;54;54;48;2;61;61;61m┊\e[48;2;62;62;62m \e[38;2;39;39;39;48;2;61;61;61m▁\e[0m\e[7m\e[38;2;60;60;60m▃\e[38;2;57;57;57m▅\e[38;2;38;38;38m▇\e[0m \e[38;2;193;60;2m▃\e[38;2;217;67;2m▅\e[38;2;225;70;2m▇\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[38;2;32;32;32m▏\e[0m \e[38;2;203;63;2m▄\e[38;2;147;45;1m▂\e[0m \e[7m\e[38;2;55;55;55m▆\e[38;2;60;60;60m▄\e[38;2;61;61;61m▂\e[38;2;60;60;60m▄\e[38;2;55;55;55m▆\e[0m \e[38;2;144;44;1m▂\e[38;2;202;62;2m▄\e[38;2;219;68;2m▆\e[38;2;231;72;3;48;2;226;70;2m┈\e[48;2;231;72;3m \e[48;2;225;70;2m▉\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[38;2;32;32;32m▏\e[7m\e[38;2;121;37;1m▉\e[0m\e[38;2;0;0;0;48;2;231;72;3m \e[0m\e[38;2;221;68;2m▇\e[38;2;208;64;2m▅\e[38;2;212;66;2m▂\e[38;2;123;37;0m▁\e[38;2;211;65;2m▂\e[38;2;207;64;2m▅\e[38;2;220;68;2m▇\e[48;2;231;72;3m \e[38;2;231;72;3;48;2;225;70;2m┈\e[0m\e[7m\e[38;2;221;68;2m▂\e[0m\e[38;2;44;13;0;48;2;231;72;3m \e[38;2;231;72;3;48;2;225;70;2m▉\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[38;2;32;32;32m▏\e[0m \e[7m\e[38;2;190;59;2m▅\e[38;2;216;67;2m▃\e[38;2;225;70;2m▁\e[0m\e[38;2;95;29;0;48;2;231;72;3m \e[38;2;231;72;3;48;2;230;71;2m┈\e[48;2;231;72;3m \e[0m\e[7m\e[38;2;225;70;2m▁\e[38;2;216;67;2m▃\e[38;2;191;59;2m▅\e[0m \e[38;2;0;0;0;48;2;231;72;3m \e[38;2;231;72;3;48;2;225;70;2m▉\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[38;2;32;32;32m▏ \e[0m \e[7m\e[38;2;172;53;1m▆\e[38;2;213;66;2m▄\e[38;2;219;68;2m▂\e[38;2;213;66;2m▄\e[38;2;174;54;2m▆\e[0m \e[38;2;0;0;0m \e[0m \e[38;2;0;0;0;48;2;231;72;3m \e[38;2;231;72;3;48;2;225;70;2m▉\e[0m
|
||||
\e[38;2;59;59;59;48;2;62;62;62m▏ \e[0m\e[38;2;32;32;32m▏ \e[0m \e[38;2;0;0;0;48;2;231;72;3m \e[38;2;231;72;3;48;2;225;70;2m▉\e[0m
|
||||
\e[7m\e[38;2;52;52;52m▆\e[38;2;59;59;59m▄\e[38;2;61;61;61m▂\e[0m\e[38;2;31;31;31m▏ \e[0m \e[7m\e[38;2;228;71;2m▂\e[38;2;221;69;2m▄\e[38;2;196;60;2m▆\e[0m
|
||||
EOF
|
||||
)
|
||||
TEXT=(
|
||||
""
|
||||
""
|
||||
"${BOLD}ProxMenux${RESET}"
|
||||
""
|
||||
"${BOLD}${NEON_PURPLE_BLUE}An Interactive Menu for${RESET}"
|
||||
"${BOLD}${NEON_PURPLE_BLUE}Proxmox VE management${RESET}"
|
||||
""
|
||||
"${BOLD}${YW} ★ BETA PROGRAM ★${RESET}"
|
||||
""
|
||||
""
|
||||
)
|
||||
mapfile -t logo_lines <<< "$LOGO"
|
||||
for i in {0..9}; do
|
||||
echo -e "${TAB}${logo_lines[i]} ${WHITE}│${RESET} ${TEXT[i]}"
|
||||
done
|
||||
echo -e
|
||||
|
||||
else
|
||||
|
||||
TEXT=(
|
||||
"" "" "" ""
|
||||
"${BOLD}ProxMenux${RESET}"
|
||||
""
|
||||
"${BOLD}${NEON_PURPLE_BLUE}An Interactive Menu for${RESET}"
|
||||
"${BOLD}${NEON_PURPLE_BLUE}Proxmox VE management${RESET}"
|
||||
""
|
||||
"${BOLD}${YW} ★ BETA PROGRAM ★${RESET}"
|
||||
"" "" ""
|
||||
)
|
||||
LOGO=(
|
||||
"${DARK_GRAY}░░░░ ░░░░${RESET}"
|
||||
"${DARK_GRAY}░░░░░░░ ░░░░░░ ${RESET}"
|
||||
"${DARK_GRAY}░░░░░░░░░░░ ░░░░░░░ ${RESET}"
|
||||
"${DARK_GRAY}░░░░ ░░░░░░ ░░░░░░ ${ORANGE}░░${RESET}"
|
||||
"${DARK_GRAY}░░░░ ░░░░░░░ ${ORANGE}░░▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ░░░ ${ORANGE}░▒▒▒▒▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ${ORANGE}▒▒▒░ ░▒▒▒▒▒▒▒▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ${ORANGE}░▒▒▒▒▒ ▒▒▒▒▒░░ ▒▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ${ORANGE}░░▒▒▒▒▒▒▒░░ ▒▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ${ORANGE}░░░ ▒▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ${ORANGE}▒▒▒▒${RESET}"
|
||||
"${DARK_GRAY}░░░░ ${ORANGE}▒▒▒░${RESET}"
|
||||
"${DARK_GRAY} ░░ ${ORANGE}░░ ${RESET}"
|
||||
)
|
||||
for i in {0..12}; do
|
||||
echo -e "${TAB}${LOGO[i]} │${RESET} ${TEXT[i]}"
|
||||
done
|
||||
echo -e
|
||||
fi
|
||||
}
|
||||
|
||||
# ── Beta welcome message ───────────────────────────────────
|
||||
show_beta_welcome() {
|
||||
local width=62
|
||||
local line
|
||||
line=$(printf '─%.0s' $(seq 1 $width))
|
||||
|
||||
echo -e "${TAB}${BOLD}${YW}┌${line}┐${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}│${CL}${BOLD} Welcome to the ProxMenux Monitor Beta Program ${YW}│${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}└${line}┘${CL}"
|
||||
echo
|
||||
echo -e "${TAB}${WHITE}You are about to install a ${BOLD}pre-release (beta)${RESET}${WHITE} version of${CL}"
|
||||
echo -e "${TAB}${WHITE}ProxMenux Monitor, built from the ${BOLD}develop${RESET}${WHITE} branch.${CL}"
|
||||
echo
|
||||
echo -e "${TAB}${BOLD}${GN}What this means for you:${CL}"
|
||||
echo -e "${TAB} ${GN}•${CL} You'll get the latest features before the official release."
|
||||
echo -e "${TAB} ${GN}•${CL} Some things may not work perfectly — that's expected."
|
||||
echo -e "${TAB} ${GN}•${CL} Your feedback is what makes the final version better."
|
||||
echo
|
||||
echo -e "${TAB}${BOLD}${YW}How to report issues:${CL}"
|
||||
echo -e "${TAB} ${YW}→${CL} Open a GitHub Issue at:"
|
||||
echo -e "${TAB} ${BL}https://github.com/MacRimi/ProxMenux/issues${CL}"
|
||||
echo -e "${TAB} ${YW}→${CL} Describe what happened, what you expected, and any"
|
||||
echo -e "${TAB} error messages you saw. Logs help a lot:"
|
||||
echo -e "${TAB} ${DARK_GRAY}journalctl -u proxmenux-monitor -n 50${CL}"
|
||||
echo
|
||||
echo -e "${TAB}${BOLD}${NEON_PURPLE_BLUE}Thank you for being part of the beta program!${CL}"
|
||||
echo -e "${TAB}${DARK_GRAY}Your help is essential to deliver a stable and polished release.${CL}"
|
||||
echo
|
||||
echo -e "${TAB}${BOLD}${YW}┌${line}┐${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}│${CL} ${YW}│${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}│${CL} Press ${BOLD}${GN}[Enter]${CL} to continue with the beta installation, ${YW}│${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}│${CL} or ${BOLD}${RD}[Ctrl+C]${CL} to cancel and exit. ${YW}│${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}│${CL} ${YW}│${CL}"
|
||||
echo -e "${TAB}${BOLD}${YW}└${line}┘${CL}"
|
||||
echo
|
||||
|
||||
read -r -p ""
|
||||
echo
|
||||
}
|
||||
|
||||
# ── Helpers ────────────────────────────────────────────────
|
||||
get_server_ip() {
|
||||
local ip
|
||||
ip=$(ip route get 1.1.1.1 2>/dev/null | grep -oP 'src \K\S+')
|
||||
[ -z "$ip" ] && ip=$(hostname -I | awk '{print $1}')
|
||||
[ -z "$ip" ] && ip="localhost"
|
||||
echo "$ip"
|
||||
}
|
||||
|
||||
update_config() {
|
||||
local component="$1"
|
||||
local status="$2"
|
||||
local timestamp
|
||||
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||
|
||||
mkdir -p "$(dirname "$CONFIG_FILE")"
|
||||
[ ! -f "$CONFIG_FILE" ] || ! jq empty "$CONFIG_FILE" >/dev/null 2>&1 && echo '{}' > "$CONFIG_FILE"
|
||||
|
||||
local tmp_file
|
||||
tmp_file=$(mktemp)
|
||||
if jq --arg comp "$component" --arg stat "$status" --arg time "$timestamp" \
|
||||
'.[$comp] = {status: $stat, timestamp: $time}' "$CONFIG_FILE" > "$tmp_file" 2>/dev/null; then
|
||||
mv "$tmp_file" "$CONFIG_FILE"
|
||||
else
|
||||
echo '{}' > "$CONFIG_FILE"
|
||||
fi
|
||||
[ -f "$tmp_file" ] && rm -f "$tmp_file"
|
||||
}
|
||||
|
||||
reset_update_flag() {
|
||||
# Reset the update_available flag in config.json after successful update
|
||||
[ ! -f "$CONFIG_FILE" ] && return 0
|
||||
|
||||
local tmp_file
|
||||
tmp_file=$(mktemp)
|
||||
if jq '.update_available.beta = false | .update_available.beta_version = ""' "$CONFIG_FILE" > "$tmp_file" 2>/dev/null; then
|
||||
mv "$tmp_file" "$CONFIG_FILE"
|
||||
fi
|
||||
[ -f "$tmp_file" ] && rm -f "$tmp_file"
|
||||
}
|
||||
|
||||
cleanup_corrupted_files() {
|
||||
if [ -f "$CONFIG_FILE" ] && ! jq empty "$CONFIG_FILE" >/dev/null 2>&1; then
|
||||
rm -f "$CONFIG_FILE"
|
||||
fi
|
||||
if [ -f "$CACHE_FILE" ] && ! jq empty "$CACHE_FILE" >/dev/null 2>&1; then
|
||||
rm -f "$CACHE_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
detect_latest_appimage() {
|
||||
local appimage_dir="$TEMP_DIR/AppImage"
|
||||
[ ! -d "$appimage_dir" ] && return 1
|
||||
local latest
|
||||
latest=$(find "$appimage_dir" -name "ProxMenux-*.AppImage" -type f | sort -V | tail -1)
|
||||
[ -z "$latest" ] && return 1
|
||||
echo "$latest"
|
||||
}
|
||||
|
||||
get_appimage_version() {
|
||||
local filename
|
||||
filename=$(basename "$1")
|
||||
echo "$filename" | grep -oP 'ProxMenux-\K[0-9]+\.[0-9]+\.[0-9]+'
|
||||
}
|
||||
|
||||
# ── Monitor install ────────────────────────────────────────
|
||||
install_proxmenux_monitor() {
|
||||
local appimage_source
|
||||
appimage_source=$(detect_latest_appimage)
|
||||
|
||||
if [ -z "$appimage_source" ] || [ ! -f "$appimage_source" ]; then
|
||||
msg_error "ProxMenux Monitor AppImage not found in $TEMP_DIR/AppImage/"
|
||||
msg_warn "Make sure the AppImage directory exists in the develop branch."
|
||||
update_config "proxmenux_monitor" "appimage_not_found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local appimage_version
|
||||
appimage_version=$(get_appimage_version "$appimage_source")
|
||||
|
||||
systemctl is-active --quiet proxmenux-monitor.service 2>/dev/null && \
|
||||
systemctl stop proxmenux-monitor.service
|
||||
|
||||
local service_exists=false
|
||||
[ -f "$MONITOR_SERVICE_FILE" ] && service_exists=true
|
||||
|
||||
local sha256_file="$TEMP_DIR/AppImage/ProxMenux-Monitor.AppImage.sha256"
|
||||
if [ -f "$sha256_file" ]; then
|
||||
msg_info "Verifying AppImage integrity..."
|
||||
local expected_hash actual_hash
|
||||
expected_hash=$(grep -Eo '^[a-f0-9]+' "$sha256_file" | tr -d '\n')
|
||||
actual_hash=$(sha256sum "$appimage_source" | awk '{print $1}')
|
||||
if [ "$expected_hash" != "$actual_hash" ]; then
|
||||
msg_error "SHA256 verification failed! The AppImage may be corrupted."
|
||||
return 1
|
||||
fi
|
||||
msg_ok "SHA256 verification passed."
|
||||
else
|
||||
msg_warn "SHA256 checksum file not found. Skipping verification."
|
||||
fi
|
||||
|
||||
msg_info "Installing ProxMenux Monitor (beta)..."
|
||||
mkdir -p "$MONITOR_INSTALL_DIR"
|
||||
local target_path="$MONITOR_INSTALL_DIR/ProxMenux-Monitor.AppImage"
|
||||
cp "$appimage_source" "$target_path"
|
||||
chmod +x "$target_path"
|
||||
|
||||
# Copy shutdown-notify.sh script for systemd ExecStop
|
||||
local shutdown_script_src="$TEMP_DIR/scripts/shutdown-notify.sh"
|
||||
local shutdown_script_dst="$MONITOR_INSTALL_DIR/scripts/shutdown-notify.sh"
|
||||
if [ -f "$shutdown_script_src" ]; then
|
||||
cp "$shutdown_script_src" "$shutdown_script_dst"
|
||||
chmod +x "$shutdown_script_dst"
|
||||
msg_ok "Shutdown notification script installed."
|
||||
else
|
||||
msg_warn "Shutdown script not found at $shutdown_script_src"
|
||||
fi
|
||||
msg_ok "ProxMenux Monitor beta v${appimage_version} installed."
|
||||
|
||||
if [ "$service_exists" = false ]; then
|
||||
return 0
|
||||
else
|
||||
# Check if service needs to be updated (missing ExecStop or outdated config)
|
||||
if ! grep -q "ExecStop=" "$MONITOR_SERVICE_FILE" 2>/dev/null; then
|
||||
msg_info "Updating service configuration (adding shutdown notification)..."
|
||||
update_monitor_service
|
||||
fi
|
||||
|
||||
systemctl start proxmenux-monitor.service
|
||||
sleep 2
|
||||
if systemctl is-active --quiet proxmenux-monitor.service; then
|
||||
update_config "proxmenux_monitor" "beta_updated"
|
||||
return 2
|
||||
else
|
||||
msg_warn "Service failed to restart. Check: journalctl -u proxmenux-monitor"
|
||||
update_config "proxmenux_monitor" "failed"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Update existing service file with new configuration
|
||||
update_monitor_service() {
|
||||
local exec_path="$MONITOR_INSTALL_DIR/ProxMenux-Monitor.AppImage"
|
||||
|
||||
cat > "$MONITOR_SERVICE_FILE" << EOF
|
||||
[Unit]
|
||||
Description=ProxMenux Monitor - Web Dashboard (Beta)
|
||||
After=network.target
|
||||
Before=shutdown.target reboot.target halt.target
|
||||
Conflicts=shutdown.target reboot.target halt.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=$MONITOR_INSTALL_DIR
|
||||
ExecStart=$exec_path
|
||||
ExecStop=/bin/bash $MONITOR_INSTALL_DIR/scripts/shutdown-notify.sh
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
Environment="PORT=$MONITOR_PORT"
|
||||
TimeoutStopSec=45
|
||||
KillMode=mixed
|
||||
KillSignal=SIGTERM
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
msg_ok "Service configuration updated."
|
||||
}
|
||||
|
||||
create_monitor_service() {
|
||||
msg_info "Creating ProxMenux Monitor service..."
|
||||
local exec_path="$MONITOR_INSTALL_DIR/ProxMenux-Monitor.AppImage"
|
||||
|
||||
if [ -f "$TEMP_DIR/systemd/proxmenux-monitor.service" ]; then
|
||||
sed "s|ExecStart=.*|ExecStart=$exec_path|g" \
|
||||
"$TEMP_DIR/systemd/proxmenux-monitor.service" > "$MONITOR_SERVICE_FILE"
|
||||
msg_ok "Service file loaded from repository."
|
||||
else
|
||||
cat > "$MONITOR_SERVICE_FILE" << EOF
|
||||
[Unit]
|
||||
Description=ProxMenux Monitor - Web Dashboard (Beta)
|
||||
After=network.target
|
||||
Before=shutdown.target reboot.target halt.target
|
||||
Conflicts=shutdown.target reboot.target halt.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=$MONITOR_INSTALL_DIR
|
||||
ExecStart=$exec_path
|
||||
ExecStop=/bin/bash $MONITOR_INSTALL_DIR/scripts/shutdown-notify.sh
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
Environment="PORT=$MONITOR_PORT"
|
||||
TimeoutStopSec=45
|
||||
KillMode=mixed
|
||||
KillSignal=SIGTERM
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
msg_ok "Default service file created."
|
||||
fi
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable proxmenux-monitor.service > /dev/null 2>&1
|
||||
systemctl start proxmenux-monitor.service > /dev/null 2>&1
|
||||
sleep 3
|
||||
|
||||
if systemctl is-active --quiet proxmenux-monitor.service; then
|
||||
msg_ok "ProxMenux Monitor service started successfully."
|
||||
update_config "proxmenux_monitor" "beta_installed"
|
||||
return 0
|
||||
else
|
||||
msg_warn "ProxMenux Monitor service failed to start."
|
||||
echo -e "${TAB}${DARK_GRAY}Check logs : journalctl -u proxmenux-monitor -n 20${CL}"
|
||||
echo -e "${TAB}${DARK_GRAY}Check status: systemctl status proxmenux-monitor${CL}"
|
||||
update_config "proxmenux_monitor" "failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# ── Main install ───────────────────────────────────────────
|
||||
install_beta() {
|
||||
local total_steps=4
|
||||
local current_step=1
|
||||
|
||||
# ── Step 1: Dependencies ──────────────────────────────
|
||||
show_progress $current_step $total_steps "Installing system dependencies"
|
||||
|
||||
if ! command -v jq > /dev/null 2>&1; then
|
||||
apt-get update > /dev/null 2>&1
|
||||
if apt-get install -y jq > /dev/null 2>&1 && command -v jq > /dev/null 2>&1; then
|
||||
update_config "jq" "installed"
|
||||
else
|
||||
local jq_url="https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64"
|
||||
if wget -q -O /usr/local/bin/jq "$jq_url" 2>/dev/null && chmod +x /usr/local/bin/jq \
|
||||
&& command -v jq > /dev/null 2>&1; then
|
||||
update_config "jq" "installed_from_github"
|
||||
else
|
||||
msg_error "Failed to install jq. Please install it manually and re-run."
|
||||
update_config "jq" "failed"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
update_config "jq" "already_installed"
|
||||
fi
|
||||
|
||||
local BASIC_DEPS=("dialog" "curl" "git")
|
||||
if [ -z "${APT_UPDATED:-}" ]; then
|
||||
apt-get update -y > /dev/null 2>&1 || true
|
||||
APT_UPDATED=1
|
||||
fi
|
||||
|
||||
for pkg in "${BASIC_DEPS[@]}"; do
|
||||
if ! dpkg -l | grep -qw "$pkg"; then
|
||||
if apt-get install -y "$pkg" > /dev/null 2>&1; then
|
||||
update_config "$pkg" "installed"
|
||||
else
|
||||
msg_error "Failed to install $pkg. Please install it manually."
|
||||
update_config "$pkg" "failed"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
update_config "$pkg" "already_installed"
|
||||
fi
|
||||
done
|
||||
|
||||
msg_ok "Dependencies installed: jq, dialog, curl, git."
|
||||
|
||||
# ── Step 2: Clone develop branch ─────────────────────
|
||||
((current_step++))
|
||||
show_progress $current_step $total_steps "Cloning ProxMenux develop branch"
|
||||
|
||||
msg_info "Cloning branch '${REPO_BRANCH}' from repository..."
|
||||
if ! git clone --depth 1 --branch "$REPO_BRANCH" "$REPO_URL" "$TEMP_DIR" 2>/dev/null; then
|
||||
msg_error "Failed to clone branch '$REPO_BRANCH' from $REPO_URL"
|
||||
exit 1
|
||||
fi
|
||||
msg_ok "Repository cloned successfully (branch: ${REPO_BRANCH})."
|
||||
|
||||
# Read beta version if available
|
||||
local beta_version="unknown"
|
||||
if [ -f "$TEMP_DIR/beta_version.txt" ]; then
|
||||
beta_version=$(cat "$TEMP_DIR/beta_version.txt" | tr -d '[:space:]')
|
||||
fi
|
||||
|
||||
cd "$TEMP_DIR"
|
||||
|
||||
# ── Step 3: Files ─────────────────────────────────────
|
||||
((current_step++))
|
||||
show_progress $current_step $total_steps "Creating directories and copying files"
|
||||
|
||||
mkdir -p "$BASE_DIR" "$INSTALL_DIR"
|
||||
[ ! -f "$CONFIG_FILE" ] && echo '{}' > "$CONFIG_FILE"
|
||||
|
||||
# Preserve user/runtime directories that must never be overwritten
|
||||
mkdir -p "$BASE_DIR/oci"
|
||||
|
||||
cp "./scripts/utils.sh" "$UTILS_FILE"
|
||||
cp "./menu" "$INSTALL_DIR/$MENU_SCRIPT"
|
||||
cp "./version.txt" "$LOCAL_VERSION_FILE" 2>/dev/null || true
|
||||
|
||||
# Store beta version marker
|
||||
if [ -f "$TEMP_DIR/beta_version.txt" ]; then
|
||||
cp "$TEMP_DIR/beta_version.txt" "$BETA_VERSION_FILE"
|
||||
else
|
||||
echo "$beta_version" > "$BETA_VERSION_FILE"
|
||||
fi
|
||||
|
||||
cp "./install_proxmenux.sh" "$BASE_DIR/install_proxmenux.sh" 2>/dev/null || true
|
||||
cp "./install_proxmenux_beta.sh" "$BASE_DIR/install_proxmenux_beta.sh" 2>/dev/null || true
|
||||
|
||||
# Wipe the scripts tree before copying so any file removed upstream
|
||||
# (renamed, consolidated, deprecated) disappears from the user install.
|
||||
# Only $BASE_DIR/scripts/ is cleared; config.json, cache.json,
|
||||
# components_status.json, version.txt, beta_version.txt, monitor.db,
|
||||
# smart/, oci/ and the AppImage live outside this path and are preserved.
|
||||
rm -rf "$BASE_DIR/scripts"
|
||||
mkdir -p "$BASE_DIR/scripts"
|
||||
cp -r "./scripts/"* "$BASE_DIR/scripts/"
|
||||
# Only .sh files need the executable bit. Applying +x recursively would
|
||||
# also flag README.md, .json, .py etc. as executable for no reason.
|
||||
find "$BASE_DIR/scripts" -type f -name '*.sh' -exec chmod +x {} +
|
||||
|
||||
if [ -d "./oci" ]; then
|
||||
mkdir -p "$BASE_DIR/oci"
|
||||
cp -r "./oci/"* "$BASE_DIR/oci/" 2>/dev/null || true
|
||||
fi
|
||||
chmod +x "$INSTALL_DIR/$MENU_SCRIPT"
|
||||
[ -f "$BASE_DIR/install_proxmenux.sh" ] && chmod +x "$BASE_DIR/install_proxmenux.sh"
|
||||
[ -f "$BASE_DIR/install_proxmenux_beta.sh" ] && chmod +x "$BASE_DIR/install_proxmenux_beta.sh"
|
||||
|
||||
# Store beta flag in config
|
||||
update_config "beta_program" "active"
|
||||
update_config "beta_version" "$beta_version"
|
||||
update_config "install_branch" "$REPO_BRANCH"
|
||||
|
||||
msg_ok "Files installed. Beta version: ${beta_version}."
|
||||
|
||||
# ── Step 4: Monitor ───────────────────────────────────
|
||||
((current_step++))
|
||||
show_progress $current_step $total_steps "Installing ProxMenux Monitor (beta)"
|
||||
|
||||
install_proxmenux_monitor
|
||||
local monitor_status=$?
|
||||
|
||||
if [ $monitor_status -eq 0 ]; then
|
||||
create_monitor_service
|
||||
elif [ $monitor_status -eq 2 ]; then
|
||||
msg_ok "ProxMenux Monitor beta updated successfully."
|
||||
fi
|
||||
|
||||
# Reset the update indicator flag after successful installation
|
||||
reset_update_flag
|
||||
|
||||
msg_ok "Beta installation completed."
|
||||
}
|
||||
|
||||
# ── Stable transition notice ───────────────────────────────
|
||||
check_stable_available() {
|
||||
# Called if a stable version is detected (future use by update logic)
|
||||
# When main's version.txt > beta_version.txt, the menu/updater can call this
|
||||
echo -e "\n${TAB}${BOLD}${GN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}"
|
||||
echo -e "${TAB}${BOLD}${GN} A stable release is now available!${CL}"
|
||||
echo -e "${TAB}${WHITE} To leave the beta program and switch to the stable version,${CL}"
|
||||
echo -e "${TAB}${WHITE} run the official installer:${CL}"
|
||||
echo -e ""
|
||||
echo -e "${TAB} ${YWB}bash -c \"\$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"${CL}"
|
||||
echo -e ""
|
||||
echo -e "${TAB}${DARK_GRAY} This will cleanly replace your beta install with the stable release.${CL}"
|
||||
echo -e "${TAB}${BOLD}${GN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${CL}\n"
|
||||
}
|
||||
|
||||
# ── Entry point ────────────────────────────────────────────
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo -e "${RD}[ERROR] This script must be run as root.${CL}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cleanup_corrupted_files
|
||||
show_proxmenux_logo
|
||||
show_beta_welcome
|
||||
|
||||
msg_title "Installing ProxMenux Beta — branch: develop"
|
||||
install_beta
|
||||
|
||||
# Load utils if available
|
||||
[ -f "$UTILS_FILE" ] && source "$UTILS_FILE"
|
||||
|
||||
msg_title "ProxMenux Beta installed successfully"
|
||||
|
||||
if systemctl is-active --quiet proxmenux-monitor.service; then
|
||||
local_ip=$(get_server_ip)
|
||||
echo -e "${GN}🌐 ProxMenux Monitor (beta) is running${CL}: ${BL}http://${local_ip}:${MONITOR_PORT}${CL}"
|
||||
echo
|
||||
fi
|
||||
|
||||
echo -ne "${GN}"
|
||||
type_text "To run ProxMenux, execute this command in your terminal:"
|
||||
echo -e "${YWB} menu${CL}"
|
||||
echo
|
||||
echo -e "${TAB}${DARK_GRAY}Report issues at: https://github.com/MacRimi/ProxMenux/issues${CL}"
|
||||
echo
|
||||
exit 0
|
||||
+41
-414
@@ -240,36 +240,6 @@
|
||||
"config_path": "/opt/adventurelog/backend/server/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "AFFiNE",
|
||||
"slug": "affine",
|
||||
"desc": "Open-source, privacy-first workspace for notes, docs, and knowledge management with offline-first design and end-to-end encryption.",
|
||||
"script": "ct/affine.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/affine.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/affine.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00012"
|
||||
],
|
||||
"category_names": [
|
||||
"Documents & Notes"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3010,
|
||||
"website": "https://affine.pro/",
|
||||
"documentation": "https://affine.pro/docs",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/affine.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "/opt/affine/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "AgentDVR",
|
||||
"slug": "agentdvr",
|
||||
@@ -711,11 +681,11 @@
|
||||
"port": 3000,
|
||||
"website": "https://github.com/ZhFahim/anchor",
|
||||
"documentation": "https://github.com/ZhFahim/anchor#readme",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/anchor.webp",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/anchor-notes.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -1155,40 +1125,6 @@
|
||||
"config_path": "/root/aria2.daemon",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "ARM",
|
||||
"slug": "arm",
|
||||
"desc": "Automatic Ripping Machine (ARM) automatically detects and rips Blu-rays, DVDs, and CDs. It identifies disc type, retrieves metadata, and handles transcoding with MakeMKV and HandBrake.",
|
||||
"script": "ct/arm.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/arm.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/arm.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00013"
|
||||
],
|
||||
"category_names": [
|
||||
"Media & Streaming"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 8080,
|
||||
"website": "https://github.com/automatic-ripping-machine/automatic-ripping-machine",
|
||||
"documentation": "https://github.com/automatic-ripping-machine/automatic-ripping-machine/wiki",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/arm.webp",
|
||||
"updateable": true,
|
||||
"privileged": true,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": "password"
|
||||
},
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Asterisk",
|
||||
"slug": "asterisk",
|
||||
@@ -2023,40 +1959,6 @@
|
||||
"config_path": "/etc/caddy/Caddyfile",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "CaddyManager",
|
||||
"slug": "caddymanager",
|
||||
"desc": "Caddy Manager is a free, open source tool to easily manage your Caddy web servers with a modern web interace. Simplify your workflow and focus on what matters.",
|
||||
"script": "ct/caddymanager.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/caddymanager.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/caddymanager.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00021"
|
||||
],
|
||||
"category_names": [
|
||||
"Webservers & Proxies"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 80,
|
||||
"website": "https://caddymanager.online",
|
||||
"documentation": "https://caddymanager.online/#/docs",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/caddymanager.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "/opt/caddymanager/caddymanager.env",
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": "caddyrocks"
|
||||
},
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Calibre-Web",
|
||||
"slug": "calibre-web",
|
||||
@@ -3082,7 +2984,7 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -4483,8 +4385,8 @@
|
||||
"Media & Streaming"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 9000,
|
||||
"website": "https://github.com/ShaneIsrael/fireshare",
|
||||
"port": 80,
|
||||
"website": "https://fireshare.net/",
|
||||
"documentation": "https://github.com/ShaneIsrael/fireshare/blob/develop/README.md",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/fireshare.webp",
|
||||
"updateable": true,
|
||||
@@ -4587,36 +4489,6 @@
|
||||
"config_path": "/opt/flatnotes/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Fleet",
|
||||
"slug": "fleet",
|
||||
"desc": "Fleet is an open-source device management platform for IT and security teams to manage and monitor servers, laptops, and other devices with osquery.",
|
||||
"script": "ct/fleet.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/fleet.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/fleet.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00009"
|
||||
],
|
||||
"category_names": [
|
||||
"Monitoring & Analytics"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 8080,
|
||||
"website": "https://fleetdm.com/",
|
||||
"documentation": "https://fleetdm.com/docs",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/fleet.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "FlowiseAI",
|
||||
"slug": "flowiseai",
|
||||
@@ -4702,7 +4574,7 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -4949,37 +4821,6 @@
|
||||
"config_path": "/etc/garage.toml",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "garmin-grafana",
|
||||
"slug": "garmin-grafana",
|
||||
"desc": "A self-hosted solution to fetch data from Garmin servers and store it in a local InfluxDB database for visualization with Grafana.",
|
||||
"script": "tools/addon/garmin-grafana.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/garmin-grafana.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/tools/addon/garmin-grafana.sh",
|
||||
"type": "addon",
|
||||
"type_id": "88xtxy57q80v38v",
|
||||
"categories": [
|
||||
"scriptcat00009"
|
||||
],
|
||||
"category_names": [
|
||||
"Monitoring & Analytics"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3000,
|
||||
"website": "https://github.com/arpanghosh8453/garmin-grafana",
|
||||
"documentation": "https://github.com/arpanghosh8453/garmin-grafana",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/garmin-grafana.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc",
|
||||
"vm"
|
||||
],
|
||||
"config_path": "/opt/garmin-grafana/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "gatus",
|
||||
"slug": "gatus",
|
||||
@@ -5373,36 +5214,6 @@
|
||||
"config_path": "/opt/go2rtc/go2rtc.yaml",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "GoDoxy",
|
||||
"slug": "godoxy",
|
||||
"desc": "GoDoxy Agent is a lightweight system agent that connects Proxmox nodes and LXC containers to a GoDoxy main server, enabling automatic route binding, LXC lifecycle control, and real-time log streaming.",
|
||||
"script": "ct/godoxy.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/godoxy.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/godoxy.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00021"
|
||||
],
|
||||
"category_names": [
|
||||
"Webservers & Proxies"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 0,
|
||||
"website": "https://github.com/yusing/godoxy",
|
||||
"documentation": "https://docs.godoxy.dev",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/godoxy.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Gogs",
|
||||
"slug": "gogs",
|
||||
@@ -5426,7 +5237,7 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -6148,36 +5959,6 @@
|
||||
"config_path": "/opt/homer/assets/config.yml",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Hoodik",
|
||||
"slug": "hoodik",
|
||||
"desc": "Hoodik is a lightweight, self-hosted cloud storage solution with end-to-end encryption. Files are encrypted on your device before upload using hybrid RSA/AES encryption, ensuring only you can access your data.",
|
||||
"script": "ct/hoodik.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/hoodik.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/hoodik.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00011"
|
||||
],
|
||||
"category_names": [
|
||||
"Files & Downloads"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 5443,
|
||||
"website": "https://github.com/hudikhq/hoodik",
|
||||
"documentation": "https://github.com/hudikhq/hoodik#readme",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/hoodik.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "/opt/hoodik/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "HortusFox",
|
||||
"slug": "hortusfox",
|
||||
@@ -6573,36 +6354,6 @@
|
||||
"config_path": "/opt/investbrain/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Invidious",
|
||||
"slug": "invidious",
|
||||
"desc": "A self-hosted alternative frontend for YouTube",
|
||||
"script": "ct/invidious.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/invidious.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/invidious.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00013"
|
||||
],
|
||||
"category_names": [
|
||||
"Media & Streaming"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3000,
|
||||
"website": "https://invidious.io",
|
||||
"documentation": "https:/docs.invidious.io",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/invidious.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "InvoiceNinja",
|
||||
"slug": "invoiceninja",
|
||||
@@ -9152,7 +8903,7 @@
|
||||
"updateable": false,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -9464,7 +9215,7 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -11285,36 +11036,6 @@
|
||||
"config_path": "/opt/paperless/paperless.conf",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Papermark",
|
||||
"slug": "papermark",
|
||||
"desc": "Papermark is an open-source document sharing alternative to DocSend with built-in analytics, custom domains, and secure shareable links.",
|
||||
"script": "ct/papermark.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/papermark.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/papermark.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00012"
|
||||
],
|
||||
"category_names": [
|
||||
"Documents & Notes"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3000,
|
||||
"website": "https://www.papermark.com/",
|
||||
"documentation": "https://www.papermark.com/docs",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papermark.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Papra",
|
||||
"slug": "papra",
|
||||
@@ -12808,36 +12529,6 @@
|
||||
"config_path": "/etc/pulse",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Puter",
|
||||
"slug": "puter",
|
||||
"desc": "Puter is an open-source personal cloud and web desktop environment that runs in your browser, providing a full desktop experience with file management, app ecosystem, and cloud storage.",
|
||||
"script": "ct/puter.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/puter.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/puter.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00000"
|
||||
],
|
||||
"category_names": [
|
||||
"Miscellaneous"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 4100,
|
||||
"website": "https://puter.com/",
|
||||
"documentation": "https://docs.puter.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/puter.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "PVE Privilege Converter",
|
||||
"slug": "pve-privilege-converter",
|
||||
@@ -13940,6 +13631,36 @@
|
||||
},
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Shlink",
|
||||
"slug": "shlink",
|
||||
"desc": "Shlink is a self-hosted URL shortener built in PHP that provides detailed analytics, a REST API, tags, expiration dates, and integrations via webhooks.",
|
||||
"script": "ct/shlink.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/shlink.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/shlink.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00000"
|
||||
],
|
||||
"category_names": [
|
||||
"Miscellaneous"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3000,
|
||||
"website": "https://shlink.io/",
|
||||
"documentation": "https://shlink.io/documentation/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/shlink.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "SigNoz",
|
||||
"slug": "signoz",
|
||||
@@ -14000,100 +13721,6 @@
|
||||
"config_path": "",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "SimpleLogin",
|
||||
"slug": "simplelogin",
|
||||
"desc": "SimpleLogin is an open-source email alias solution that lets you create anonymous email aliases to protect your real email address from spam, trackers and data breaches.",
|
||||
"script": "ct/simplelogin.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/simplelogin.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/simplelogin.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00006"
|
||||
],
|
||||
"category_names": [
|
||||
"Authentication & Security"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 80,
|
||||
"website": "https://simplelogin.io/",
|
||||
"documentation": "https://github.com/simple-login/app/blob/master/docs/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/simplelogin.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "/opt/simplelogin/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Skylite-UX",
|
||||
"slug": "skylite-ux",
|
||||
"desc": "Skylite-UX is an open-source, self-hosted family management app with calendar, todos, shopping lists, and user management.",
|
||||
"script": "ct/skylite-ux.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/skylite-ux.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/skylite-ux.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00019"
|
||||
],
|
||||
"category_names": [
|
||||
"Automation & Scheduling"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3000,
|
||||
"website": "https://github.com/Wetzel402/Skylite-UX",
|
||||
"documentation": "https://github.com/Wetzel402/Skylite-UX",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/skylite-ux.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "/opt/skylite-ux/.env",
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Slink",
|
||||
"slug": "slink",
|
||||
"desc": "Slink is a self-hosted image sharing platform built with Symfony and SvelteKit. It supports multi-file uploads, image compression, URL shortening, collections, tags, comments, SSO/OIDC, dark mode, and S3 storage.",
|
||||
"script": "ct/slink.sh",
|
||||
"script_url": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/slink.sh",
|
||||
"script_url_mirror": "https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/ct/slink.sh",
|
||||
"type": "lxc",
|
||||
"type_id": "nm9bra8mzye2scg",
|
||||
"categories": [
|
||||
"scriptcat00011"
|
||||
],
|
||||
"category_names": [
|
||||
"Files & Downloads"
|
||||
],
|
||||
"notes": [],
|
||||
"port": 3000,
|
||||
"website": "https://github.com/andrii-kryvoviaz/slink",
|
||||
"documentation": "https://slink.pages.dev",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/slink.webp",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
"config_path": "/opt/slink/services/api/.env",
|
||||
"default_credentials": {
|
||||
"username": "admin@localhost",
|
||||
"password": "auto-generated"
|
||||
},
|
||||
"os": ""
|
||||
},
|
||||
{
|
||||
"name": "Slskd",
|
||||
"slug": "slskd",
|
||||
@@ -17314,7 +16941,7 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
@@ -17880,7 +17507,7 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"has_arm": false,
|
||||
"is_dev": true,
|
||||
"is_dev": false,
|
||||
"execute_in": [
|
||||
"lxc"
|
||||
],
|
||||
|
||||
@@ -1345,4 +1345,4 @@ main() {
|
||||
|
||||
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
|
||||
main
|
||||
fi
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user