Merge branch 'main' of https://github.com/community-scripts/ProxmoxVED
This commit is contained in:
commit
bd7d84c901
71
ct/alpine-loki.sh
Normal file
71
ct/alpine-loki.sh
Normal file
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: hoholms
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/grafana/loki
|
||||
|
||||
APP="Alpine-Loki"
|
||||
var_tags="${var_tags:-alpine;monitoring}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-256}"
|
||||
var_disk="${var_disk:-1}"
|
||||
var_os="${var_os:-alpine}"
|
||||
var_version="${var_version:-3.22}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
if ! apk -e info newt >/dev/null 2>&1; then
|
||||
apk add -q newt
|
||||
fi
|
||||
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||
while true; do
|
||||
CHOICE=$(
|
||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \
|
||||
"1" "Check for Loki Updates" \
|
||||
"2" "Allow 0.0.0.0 for listening" \
|
||||
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
|
||||
)
|
||||
exit_status=$?
|
||||
if [ $exit_status == 1 ]; then
|
||||
clear
|
||||
exit-script
|
||||
fi
|
||||
header_info
|
||||
case $CHOICE in
|
||||
1)
|
||||
$STD apk -U upgrade
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
;;
|
||||
2)
|
||||
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/loki
|
||||
service loki restart
|
||||
msg_ok "Allowed listening on all interfaces!"
|
||||
exit
|
||||
;;
|
||||
3)
|
||||
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/loki
|
||||
service loki restart
|
||||
msg_ok "Allowed listening only on ${LXCIP}!"
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
exit 0
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${APP} should be reachable by going to the following URL.
|
||||
${BL}http://${IP}:3100${CL} \n"
|
||||
echo -e "Promtail should be reachable by going to the following URL.
|
||||
${BL}http://${IP}:9080${CL} \n"
|
||||
45
ct/cronmaster.sh
Normal file
45
ct/cronmaster.sh
Normal file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source:
|
||||
|
||||
APP="CRONMASTER"
|
||||
var_tags="${var_tags:-}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
#var_fuse="${var_fuse:-no}"
|
||||
#var_tun="${var_tun:-no}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/cronmaster ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating Debian LXC"
|
||||
$STD apt update
|
||||
$STD apt upgrade -y
|
||||
msg_ok "Updated Debian LXC"
|
||||
cleanup_lxc
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!"
|
||||
msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
|
||||
68
ct/fladder.sh
Normal file
68
ct/fladder.sh
Normal file
@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: wendyliga
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/DonutWare/Fladder
|
||||
|
||||
APP="Fladder"
|
||||
var_tags="${var_tags:-media}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/fladder ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "Fladder" "DonutWare/Fladder"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop nginx
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up configuration"
|
||||
if [[ -f /opt/fladder/assets/config/config.json ]]; then
|
||||
cp /opt/fladder/assets/config/config.json /tmp/fladder_config.json.bak
|
||||
msg_ok "Configuration backed up"
|
||||
fi
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Fladder" "DonutWare/Fladder" "prebuild" "latest" "/opt/fladder" "Fladder-Web-*.zip"
|
||||
|
||||
msg_info "Restoring configuration"
|
||||
if [[ -f /tmp/fladder_config.json.bak ]]; then
|
||||
mkdir -p /opt/fladder/assets/config
|
||||
cp /tmp/fladder_config.json.bak /opt/fladder/assets/config/config.json
|
||||
rm -f /tmp/fladder_config.json.bak
|
||||
msg_ok "Configuration restored"
|
||||
fi
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start nginx
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
42
ct/gwn-manager.sh
Normal file
42
ct/gwn-manager.sh
Normal file
@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://www.grandstream.com/products/networking-solutions/wi-fi-management/product/gwn-manager
|
||||
|
||||
APP="GWN-Manager"
|
||||
var_tags="${var_tags:-network;management}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-6144}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /gwn ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_ok "Application is updated via the web interface!"
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}"
|
||||
6
ct/headers/alpine-loki
Normal file
6
ct/headers/alpine-loki
Normal file
@ -0,0 +1,6 @@
|
||||
___ __ _ __ __ _
|
||||
/ | / /___ (_)___ ___ / / ____ / /__(_)
|
||||
/ /| | / / __ \/ / __ \/ _ \______/ / / __ \/ //_/ /
|
||||
/ ___ |/ / /_/ / / / / / __/_____/ /___/ /_/ / ,< / /
|
||||
/_/ |_/_/ .___/_/_/ /_/\___/ /_____/\____/_/|_/_/
|
||||
/_/
|
||||
5
ct/headers/loki
Normal file
5
ct/headers/loki
Normal file
@ -0,0 +1,5 @@
|
||||
__ __ _
|
||||
/ / ____ / /__(_)
|
||||
/ / / __ \/ //_/ /
|
||||
/ /___/ /_/ / ,< / /
|
||||
/_____/\____/_/|_/_/
|
||||
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: tomfrenzel
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
|
||||
62
ct/loki.sh
Normal file
62
ct/loki.sh
Normal file
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: hoholms
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/grafana/loki
|
||||
|
||||
APP="Loki"
|
||||
var_tags="${var_tags:-monitoring;logs}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if ! dpkg -s loki >/dev/null 2>&1; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
msg_info "Stopping Loki"
|
||||
systemctl stop loki
|
||||
systemctl stop promtail
|
||||
msg_ok "Stopped Loki"
|
||||
|
||||
msg_info "Updating Loki"
|
||||
$STD apt update
|
||||
$STD apt --only-upgrade install -y loki
|
||||
$STD apt --only-upgrade install -y promtail
|
||||
msg_ok "Updated Loki"
|
||||
|
||||
msg_info "Starting Loki"
|
||||
systemctl start loki
|
||||
systemctl start promtail
|
||||
msg_ok "Started Loki"
|
||||
|
||||
msg_ok "Update Successful"
|
||||
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3100${CL}\n"
|
||||
echo -e "${INFO}${YW} Access promtail using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9080${CL}"
|
||||
40
ct/minthcm.sh
Normal file
40
ct/minthcm.sh
Normal file
@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 minthcm
|
||||
# Author: MintHCM
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/minthcm/minthcm
|
||||
|
||||
APP="MintHCM"
|
||||
var_tags="${var_tags:-hcm}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_cpu="${var_cpu:-4}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /var/www/MintHCM ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
76
ct/wishlist.sh
Normal file
76
ct/wishlist.sh
Normal file
@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Dunky13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/cmintey/wishlist
|
||||
|
||||
APP="Wishlist"
|
||||
var_tags="${var_tags:-sharing}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/wishlist ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "wishlist" "cmintey/wishlist"; then
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop wishlist
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
mkdir -p /opt/wishlist-backup
|
||||
cp /opt/wishlist/.env /opt/wishlist-backup/.env
|
||||
cp -R /opt/wishlist/uploads /opt/wishlist-backup/uploads
|
||||
cp -R /opt/wishlist/data /opt/wishlist-backup/data
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
|
||||
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false)
|
||||
|
||||
msg_info "Updating Wishlist"
|
||||
cd /opt/wishlist
|
||||
|
||||
$STD pnpm install
|
||||
$STD pnpm svelte-kit sync
|
||||
$STD pnpm prisma generate
|
||||
sed -i 's|/usr/src/app/|/opt/wishlist/|g' $(grep -rl '/usr/src/app/' /opt/wishlist)
|
||||
export VERSION="${LATEST_APP_VERSION}"
|
||||
export SHA="${LATEST_APP_VERSION}"
|
||||
$STD pnpm run build
|
||||
$STD pnpm prune --prod
|
||||
chmod +x /opt/wishlist/entrypoint.sh
|
||||
cp /opt/wishlist-backup/.env /opt/wishlist/.env
|
||||
cp -R /opt/wishlist-backup/uploads /opt/wishlist/uploads
|
||||
cp -R /opt/wishlist-backup/data /opt/wishlist/data
|
||||
msg_ok "Updated Wishlist"
|
||||
msg_info "Starting Service"
|
||||
systemctl start wishlist
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3280${CL}"
|
||||
35
frontend/public/json/fladder.json
Normal file
35
frontend/public/json/fladder.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Fladder",
|
||||
"slug": "fladder",
|
||||
"categories": [
|
||||
14
|
||||
],
|
||||
"date_created": "2025-12-26",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://github.com/DonutWare/Fladder/blob/develop/INSTALL.md#ubuntudebian",
|
||||
"website": "https://github.com/DonutWare/Fladder",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/fladder.webp",
|
||||
"config_path": "/opt/fladder/assets/config/config.json",
|
||||
"description": "Fladder is a simple Jellyfin frontend built on top of Flutter. It provides a modern interface to stream and sync content locally, manage libraries, support multiple profiles, and offers direct, transcode and offline playback with media segments skipping.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/fladder.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 4,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
40
frontend/public/json/gwn-manager.json
Normal file
40
frontend/public/json/gwn-manager.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "GWN Manager",
|
||||
"slug": "gwn-manager",
|
||||
"categories": [
|
||||
9
|
||||
],
|
||||
"date_created": "2025-12-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8443,
|
||||
"documentation": "https://documentation.grandstream.com/article-categories/gwn-mgmt/",
|
||||
"website": "https://www.grandstream.com/products/networking-solutions/wi-fi-management/product/gwn-manager",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/gwn-manager.webp",
|
||||
"config_path": "/gwn/conf/gwn.conf",
|
||||
"description": "GWN Manager is a free on-premise enterprise-grade, management platform for Grandstream GWN series devices. Typically deployed on a customer’s private network, this flexible, scalable solution offers simplified configuration and management.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/gwn-manager.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 6144,
|
||||
"hdd": 8,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Installation package is pulled from GrandStream website. Installation may take a while.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -10,7 +10,7 @@
|
||||
"privileged": false,
|
||||
"interface_port": 443,
|
||||
"documentation": "https://github.com/thedevs-network/kutt/",
|
||||
"config_path": "/etc/kutt-data/.env",
|
||||
"config_path": "/opt/kutt/.env",
|
||||
"website": "https://kutt.it",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kutt.webp",
|
||||
"description": "Kutt is a modern URL shortener with support for custom domains. Create and edit links, view statistics, manage users, and more.",
|
||||
|
||||
44
frontend/public/json/loki.json
Normal file
44
frontend/public/json/loki.json
Normal file
@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "Loki",
|
||||
"slug": "loki",
|
||||
"categories": [9],
|
||||
"date_created": "2025-12-10",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3100,
|
||||
"documentation": "https://grafana.com/docs/loki/latest/",
|
||||
"website": "https://github.com/grafana/loki",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@master/webp/loki.webp",
|
||||
"config_path": "Debian: /etc/loki/config.yml | Alpine: /etc/loki/loki-local-config.yaml",
|
||||
"description": "Grafana Loki is a set of open source components that can be composed into a fully featured logging stack. A small index and highly compressed chunks simplifies the operation and significantly lowers the cost of Loki.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/loki.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 512,
|
||||
"hdd": 2,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "alpine",
|
||||
"script": "ct/alpine-loki.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 256,
|
||||
"hdd": 1,
|
||||
"os": "alpine",
|
||||
"version": "3.22"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
40
frontend/public/json/minthcm.json
Normal file
40
frontend/public/json/minthcm.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "MintHCM",
|
||||
"slug": "minthcm",
|
||||
"categories": [
|
||||
25
|
||||
],
|
||||
"date_created": "2025-12-12",
|
||||
"type": "ct",
|
||||
"updateable": false,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://wiki.minthcm.org/",
|
||||
"config_path": "/var/www/MintHCM",
|
||||
"website": "https://minthcm.org/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/minthcm.webp",
|
||||
"description": "MintCHM is a free and open-source tool for Human Capital Management. Main features: recruitment, time management, onboarding & offboarding, calendar, leave management, resources booking, travel & expenses, workplace management, analytics, roles & permissions management, job descriptions, employer branding, employee profiles, competences & skills, employment history, employee evaluations.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/minthcm.sh",
|
||||
"resources": {
|
||||
"cpu": 4,
|
||||
"ram": 4096,
|
||||
"hdd": 20,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": "minthcm"
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Database credentials are stored in ~/minthcm.creds",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
33
frontend/public/json/wishlist.json
Normal file
33
frontend/public/json/wishlist.json
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "Wishlist",
|
||||
"slug": "wishlist",
|
||||
"categories": [0],
|
||||
"date_created": "2025-12-29",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3280,
|
||||
"documentation": "https://github.com/cmintey/wishlist/blob/main/README.md#getting-started",
|
||||
"config_path": "/opt/wishlist/.env",
|
||||
"website": "https://github.com/cmintey/wishlist",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cmintey-wishlist.webp",
|
||||
"description": "Wishlist is a self-hosted wishlist application that you can share with your friends and family. You no longer have to wonder what to get your family for the holidays, simply check their wishlist and claim any available item!",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/wishlist.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 5,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
41
install/alpine-loki-install.sh
Normal file
41
install/alpine-loki-install.sh
Normal file
@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: hoholms
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/grafana/loki
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Loki"
|
||||
$STD apk add loki
|
||||
$STD sed -i '/http_addr/s/127.0.0.1/0.0.0.0/g' /etc/conf.d/loki
|
||||
$STD rc-service loki start
|
||||
$STD rc-update add loki default
|
||||
$STD mkdir /tmp/loki/
|
||||
$STD chown -R loki:grafana /tmp/loki/
|
||||
$STD mkdir /var/log/loki/
|
||||
$STD chown -R loki:grafana /var/log/loki/
|
||||
$STD chmod 755 /etc/loki/loki-local-config.yaml
|
||||
$STD sed -i '/^querier:/,/enable_multi_variant_queries: false/ s/^/#/' /etc/loki/loki-local-config.yaml
|
||||
$STD echo "output_log=\"\${output_log:-/var/log/loki/output.log}\"" >> /etc/init.d/loki
|
||||
$STD echo "error_log=\"\${error_log:-/var/log/loki/error.log}\"" >> /etc/init.d/loki
|
||||
$STD echo "start_stop_daemon_args=\"\${SSD_OPTS} -1 \${output_log} -2 \${error_log}\"" >> /etc/init.d/loki
|
||||
$STD rc-service loki restart
|
||||
msg_ok "Installed Loki"
|
||||
|
||||
msg_info "Installing Promtail"
|
||||
$STD apk add loki-promtail
|
||||
$STD sed -i '/http_addr/s/127.0.0.1/0.0.0.0/g' /etc/conf.d/loki
|
||||
$STD rc-service loki-promtail start
|
||||
$STD rc-update add loki-promtail default
|
||||
msg_ok "Installed Promtail"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
46
install/fladder-install.sh
Normal file
46
install/fladder-install.sh
Normal file
@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: wendyliga
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/DonutWare/Fladder
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "Fladder" "DonutWare/Fladder" "prebuild" "latest" "/opt/fladder" "Fladder-Web-*.zip"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
cat <<EOF >/etc/nginx/conf.d/fladder.conf
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
|
||||
server_name _;
|
||||
|
||||
root /opt/fladder;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files \$uri \$uri/ /index.html;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
rm -f /etc/nginx/sites-available/default
|
||||
systemctl enable -q --now nginx
|
||||
systemctl reload nginx
|
||||
msg_ok "Configured Nginx"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
53
install/gwn-manager-install.sh
Normal file
53
install/gwn-manager-install.sh
Normal file
@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://www.grandstream.com/products/networking-solutions/wi-fi-management/product/gwn-manager
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
xfonts-utils \
|
||||
fontconfig
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up GWN Manager (Patience)"
|
||||
RELEASE=$(curl -s https://www.grandstream.com/support/tools#gwntools \
|
||||
| grep -oP 'https://firmware\.grandstream\.com/GWN_Manager-[^"]+-Ubuntu\.tar\.gz')
|
||||
download_file "$RELEASE" "/tmp/gwnmanager.tar.gz"
|
||||
cd /tmp
|
||||
tar -xzf gwnmanager.tar.gz --strip-components=1
|
||||
$STD ./install
|
||||
msg_ok "Setup GWN Manager"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/gwnmanager.service
|
||||
[Unit]
|
||||
Description=GWN Manager
|
||||
After=network.target
|
||||
Requires=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/gwn
|
||||
ExecStart=/gwn/gwn start
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q gwnmanager
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
37
install/loki-install.sh
Normal file
37
install/loki-install.sh
Normal file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: hoholms
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/grafana/loki
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Setting up Grafana Repository"
|
||||
setup_deb822_repo \
|
||||
"grafana" \
|
||||
"https://apt.grafana.com/gpg.key" \
|
||||
"https://apt.grafana.com" \
|
||||
"stable" \
|
||||
"main"
|
||||
msg_ok "Grafana Repository setup sucessfully"
|
||||
|
||||
msg_info "Installing Loki"
|
||||
$STD apt install -y loki
|
||||
systemctl enable -q --now loki
|
||||
msg_ok "Installed Loki"
|
||||
|
||||
msg_info "Installing Promtail"
|
||||
$STD apt install -y promtail
|
||||
systemctl enable -q --now promtail
|
||||
msg_ok "Installed Promtail"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
96
install/minthcm-install.sh
Normal file
96
install/minthcm-install.sh
Normal file
@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 minthcm
|
||||
# Author: MintHCM
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/minthcm/minthcm
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
PHP_APACHE="YES" PHP_VERSION="8.2" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php
|
||||
setup_composer
|
||||
|
||||
msg_info "Enabling Apache modules (rewrite, headers)"
|
||||
$STD a2enmod rewrite
|
||||
$STD a2enmod headers
|
||||
msg_ok "Enabled Apache modules (rewrite, headers)"
|
||||
|
||||
fetch_and_deploy_gh_release "MintHCM" "minthcm/minthcm" "tarball" "latest" "/var/www/MintHCM"
|
||||
|
||||
msg_info "Configuring MintHCM"
|
||||
mkdir -p /etc/php/${PHP_VERSION}/mods-available
|
||||
cp /var/www/MintHCM/docker/config/000-default.conf /etc/apache2/sites-available/000-default.conf
|
||||
cp /var/www/MintHCM/docker/config/php-minthcm.ini /etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini
|
||||
mkdir -p "/etc/php/${PHP_VERSION}/cli/conf.d" "/etc/php/${PHP_VERSION}/apache2/conf.d"
|
||||
ln -s "/etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini" "/etc/php/${PHP_VERSION}/cli/conf.d/20-minthcm.ini"
|
||||
ln -s "/etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini" "/etc/php/${PHP_VERSION}/apache2/conf.d/20-minthcm.ini"
|
||||
chown -R www-data:www-data /var/www/MintHCM
|
||||
find /var/www/MintHCM -type d -exec chmod 755 {} \;
|
||||
find /var/www/MintHCM -type f -exec chmod 644 {} \;
|
||||
mkdir -p /var/www/script
|
||||
cp /var/www/MintHCM/docker/script/generate_config.php /var/www/script/generate_config.php
|
||||
cp /var/www/MintHCM/docker/.env /var/www/script/.env
|
||||
chown -R www-data:www-data /var/www/script
|
||||
msg_ok "Configured MintHCM"
|
||||
|
||||
msg_info "Restarting Apache2"
|
||||
$STD systemctl restart apache2
|
||||
msg_ok "Restarted Apache2"
|
||||
|
||||
msg_info "Setting up Elasticsearch"
|
||||
setup_deb822_repo \
|
||||
"elasticsearch" \
|
||||
"https://artifacts.elastic.co/GPG-KEY-elasticsearch" \
|
||||
"https://artifacts.elastic.co/packages/7.x/apt" \
|
||||
"stable" \
|
||||
"main"
|
||||
$STD apt install -y elasticsearch
|
||||
echo "-Xms2g" >>/etc/elasticsearch/jvm.options
|
||||
echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
|
||||
$STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment -b
|
||||
systemctl enable -q --now elasticsearch
|
||||
msg_ok "Set up Elasticsearch"
|
||||
|
||||
setup_mariadb
|
||||
msg_info "Setting up MariaDB"
|
||||
$STD mariadb -u root -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'";
|
||||
msg_ok "Set up MariaDB"
|
||||
|
||||
msg_info "Configuring Database"
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
$STD mariadb -u root -e "CREATE USER 'minthcm'@'localhost' IDENTIFIED BY '${DB_PASS}';"
|
||||
$STD mariadb -u root -e "GRANT ALL ON *.* TO 'minthcm'@'localhost'; FLUSH PRIVILEGES;"
|
||||
sed -i 's/^DB_HOST=.*/DB_HOST=localhost/' /var/www/script/.env
|
||||
sed -i 's/^DB_USER=.*/DB_USER=minthcm/' /var/www/script/.env
|
||||
sed -i "s/^DB_PASS=.*/DB_PASS=${DB_PASS}/" /var/www/script/.env
|
||||
sed -i 's/^ELASTICSEARCH_HOST=.*/ELASTICSEARCH_HOST=localhost/' /var/www/script/.env
|
||||
msg_ok "Configured MariaDB"
|
||||
{
|
||||
echo "MintHCM DB Credentials"
|
||||
echo "MariaDB User: minthcm"
|
||||
echo "MariaDB Password: $DB_PASS"
|
||||
} >>~/minthcm.creds
|
||||
|
||||
msg_info "Generating configuration file"
|
||||
set -a
|
||||
source /var/www/script/.env
|
||||
set +a
|
||||
php /var/www/script/generate_config.php
|
||||
msg_ok "Generated configuration file"
|
||||
|
||||
msg_info "Installing MintHCM"
|
||||
cd /var/www/MintHCM && su -s /bin/bash -c 'php /var/www/MintHCM/MintCLI install < /var/www/MintHCM/configMint4' www-data
|
||||
printf "* * * * * cd /var/www/MintHCM/legacy; php -f cron.php > /dev/null 2>&1\n" > /var/spool/cron/crontabs/www-data
|
||||
service cron start
|
||||
rm -f /var/www/MintHCM/configMint4
|
||||
msg_ok "Installed MintHCM"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@ -120,7 +120,7 @@ CONFIGEOF
|
||||
chmod 644 /var/lib/romm/config/config.yml
|
||||
msg_ok "Created configuration file"
|
||||
|
||||
fetch_and_deploy_gh_release "RetroAchievements" "RetroAchievements/RALibretro" "prebuild" "latest" "/opt/RALibretro" "RAHasher-x64-Linux.zip"
|
||||
fetch_and_deploy_gh_release "RetroAchievements" "RetroAchievements/RALibretro" "prebuild" "latest" "/opt/RALibretro" "RAHasher-x64-Linux-*.zip"
|
||||
|
||||
msg_info "Building RAHasher (RetroAchievements)"
|
||||
cd /opt/RALibretro
|
||||
|
||||
65
install/wishlist-install.sh
Normal file
65
install/wishlist-install.sh
Normal file
@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Dunky13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/cmintey/wishlist
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing dependencies"
|
||||
$STD apt install -y \
|
||||
build-essential \
|
||||
python3 \
|
||||
openssl \
|
||||
caddy
|
||||
msg_ok "Installed dependencies"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
|
||||
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false)
|
||||
|
||||
msg_info "Installing Wishlist"
|
||||
cd /opt/wishlist
|
||||
cp .env.example .env
|
||||
echo "NODE_ENV=production" >> /opt/wishlist/.env
|
||||
$STD pnpm install
|
||||
$STD pnpm svelte-kit sync
|
||||
$STD pnpm prisma generate
|
||||
sed -i 's|/usr/src/app/|/opt/wishlist/|g' $(grep -rl '/usr/src/app/' /opt/wishlist)
|
||||
export VERSION="v${LATEST_APP_VERSION}"
|
||||
export SHA="v${LATEST_APP_VERSION}"
|
||||
$STD pnpm run build
|
||||
$STD pnpm prune --prod
|
||||
chmod +x /opt/wishlist/entrypoint.sh
|
||||
mkdir -p /opt/wishlist/uploads
|
||||
mkdir -p /opt/wishlist/data
|
||||
msg_ok "Installed Wishlist"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/wishlist.service
|
||||
[Unit]
|
||||
Description=Wishlist Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/wishlist
|
||||
EnvironmentFile=/opt/wishlist/.env
|
||||
ExecStart=/usr/bin/env sh -c './entrypoint.sh'
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now wishlist
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@ -107,6 +107,76 @@ function cleanup_vmid() {
|
||||
fi
|
||||
}
|
||||
|
||||
function send_line_to_vm() {
|
||||
local line="$1"
|
||||
for ((i = 0; i < ${#line}; i++)); do
|
||||
character=${line:i:1}
|
||||
case $character in
|
||||
" ") character="spc" ;;
|
||||
"-") character="minus" ;;
|
||||
"=") character="equal" ;;
|
||||
",") character="comma" ;;
|
||||
".") character="dot" ;;
|
||||
"/") character="slash" ;;
|
||||
"'") character="apostrophe" ;;
|
||||
";") character="semicolon" ;;
|
||||
'\') character="backslash" ;;
|
||||
'\`') character="grave_accent" ;;
|
||||
"[") character="bracket_left" ;;
|
||||
"]") character="bracket_right" ;;
|
||||
"_") character="shift-minus" ;;
|
||||
"+") character="shift-equal" ;;
|
||||
"?") character="shift-slash" ;;
|
||||
"<") character="shift-comma" ;;
|
||||
">") character="shift-dot" ;;
|
||||
'"') character="shift-apostrophe" ;;
|
||||
":") character="shift-semicolon" ;;
|
||||
"|") character="shift-backslash" ;;
|
||||
"~") character="shift-grave_accent" ;;
|
||||
"{") character="shift-bracket_left" ;;
|
||||
"}") character="shift-bracket_right" ;;
|
||||
"A") character="shift-a" ;;
|
||||
"B") character="shift-b" ;;
|
||||
"C") character="shift-c" ;;
|
||||
"D") character="shift-d" ;;
|
||||
"E") character="shift-e" ;;
|
||||
"F") character="shift-f" ;;
|
||||
"G") character="shift-g" ;;
|
||||
"H") character="shift-h" ;;
|
||||
"I") character="shift-i" ;;
|
||||
"J") character="shift-j" ;;
|
||||
"K") character="shift-k" ;;
|
||||
"L") character="shift-l" ;;
|
||||
"M") character="shift-m" ;;
|
||||
"N") character="shift-n" ;;
|
||||
"O") character="shift-o" ;;
|
||||
"P") character="shift-p" ;;
|
||||
"Q") character="shift-q" ;;
|
||||
"R") character="shift-r" ;;
|
||||
"S") character="shift-s" ;;
|
||||
"T") character="shift-t" ;;
|
||||
"U") character="shift-u" ;;
|
||||
"V") character="shift-v" ;;
|
||||
"W") character="shift-w" ;;
|
||||
"X") character="shift-x" ;;
|
||||
"Y") character="shift-y" ;;
|
||||
"Z") character="shift-z" ;;
|
||||
"!") character="shift-1" ;;
|
||||
"@") character="shift-2" ;;
|
||||
"#") character="shift-3" ;;
|
||||
'$') character="shift-4" ;;
|
||||
"%") character="shift-5" ;;
|
||||
"^") character="shift-6" ;;
|
||||
"&") character="shift-7" ;;
|
||||
"*") character="shift-8" ;;
|
||||
"(") character="shift-9" ;;
|
||||
")") character="shift-0" ;;
|
||||
esac
|
||||
qm sendkey $VMID "$character"
|
||||
done
|
||||
qm sendkey $VMID ret
|
||||
}
|
||||
|
||||
function cleanup() {
|
||||
popd >/dev/null
|
||||
post_update_to_api "done" "none"
|
||||
@ -229,7 +299,7 @@ function select_os() {
|
||||
OS_DISPLAY="Ubuntu 24.04 LTS"
|
||||
;;
|
||||
esac
|
||||
echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}${OS_DISPLAY}${CL}"
|
||||
#echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}${OS_DISPLAY}${CL}"
|
||||
else
|
||||
exit-script
|
||||
fi
|
||||
@ -238,14 +308,14 @@ function select_os() {
|
||||
function select_cloud_init() {
|
||||
# UniFi OS Server ALWAYS requires Cloud-Init for automated installation
|
||||
USE_CLOUD_INIT="yes"
|
||||
echo -e "${CLOUD}${BOLD}${DGN}Cloud-Init: ${BGN}yes (required for UniFi OS)${CL}"
|
||||
#echo -e "${CLOUD}${BOLD}${DGN}Cloud-Init: ${BGN}yes (required for UniFi OS)${CL}"
|
||||
}
|
||||
|
||||
function get_image_url() {
|
||||
local arch=$(dpkg --print-architecture)
|
||||
case $OS_TYPE in
|
||||
debian)
|
||||
# Always use generic (Cloud-Init) variant for UniFi OS
|
||||
# Always use <ic (Cloud-Init) variant for UniFi OS
|
||||
echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-generic-${arch}.qcow2"
|
||||
;;
|
||||
ubuntu)
|
||||
@ -271,7 +341,7 @@ function default_settings() {
|
||||
HN="unifi-server-os"
|
||||
CPU_TYPE=" -cpu host"
|
||||
CORE_COUNT="2"
|
||||
RAM_SIZE="4096"
|
||||
RAM_SIZE="6144"
|
||||
BRG="vmbr0"
|
||||
MAC="$GEN_MAC"
|
||||
VLAN=""
|
||||
@ -679,138 +749,80 @@ if [ "$START_VM" == "yes" ]; then
|
||||
qm start $VMID
|
||||
msg_ok "Started UniFi OS VM"
|
||||
|
||||
msg_info "Waiting for VM to boot and Cloud-Init to complete (60-90 seconds)"
|
||||
sleep 60
|
||||
msg_info "Waiting for VM to boot and Cloud-Init to complete (this takes ~90 seconds)"
|
||||
sleep 90
|
||||
msg_ok "VM boot complete"
|
||||
|
||||
# Login via serial console
|
||||
msg_info "Logging into VM via serial console"
|
||||
send_line_to_vm "root"
|
||||
sleep 2
|
||||
send_line_to_vm "${CLOUDINIT_PASSWORD}"
|
||||
sleep 3
|
||||
msg_ok "Logged into VM"
|
||||
|
||||
# Step 1: Update and install Podman
|
||||
msg_info "Installing Podman and dependencies (this takes 2-3 minutes)"
|
||||
send_line_to_vm "export DEBIAN_FRONTEND=noninteractive"
|
||||
sleep 1
|
||||
send_line_to_vm "apt-get update -qq"
|
||||
sleep 30
|
||||
send_line_to_vm "apt-get install -y podman uidmap slirp4netns curl wget -qq"
|
||||
sleep 120
|
||||
msg_ok "Podman installed"
|
||||
|
||||
# Step 2: Download UniFi OS Server installer
|
||||
msg_info "Downloading UniFi OS Server ${UOS_VERSION}"
|
||||
send_line_to_vm "cd /opt"
|
||||
sleep 1
|
||||
send_line_to_vm "wget -q ${UOS_URL} -O unifi-os-server.bin"
|
||||
sleep 60
|
||||
send_line_to_vm "chmod +x unifi-os-server.bin"
|
||||
sleep 2
|
||||
msg_ok "Downloaded UniFi OS Server installer"
|
||||
|
||||
# Step 3: Install UniFi OS Server (with auto-yes)
|
||||
msg_info "Installing UniFi OS Server (this takes 3-5 minutes)"
|
||||
send_line_to_vm "echo y | ./unifi-os-server.bin"
|
||||
sleep 300
|
||||
msg_ok "UniFi OS Server installed"
|
||||
|
||||
# Step 4: Start Guest Agent for IP detection
|
||||
msg_info "Starting QEMU Guest Agent"
|
||||
send_line_to_vm "systemctl start qemu-guest-agent"
|
||||
sleep 3
|
||||
msg_ok "Guest Agent started"
|
||||
|
||||
# Logout from VM console
|
||||
send_line_to_vm "exit"
|
||||
sleep 2
|
||||
|
||||
# Get IP from outside via Guest Agent
|
||||
msg_info "Detecting VM IP address"
|
||||
VM_IP=""
|
||||
for i in {1..30}; do
|
||||
VM_IP=$(qm guest cmd $VMID network-get-interfaces 2>/dev/null | jq -r '.[1]["ip-addresses"][]? | select(.["ip-address-type"] == "ipv4") | .["ip-address"]' 2>/dev/null | grep -v "127.0.0.1" | head -1 || echo "")
|
||||
for i in {1..15}; do
|
||||
VM_IP=$(qm guest cmd $VMID network-get-interfaces 2>/dev/null | jq -r '.[] | select(.name != "lo") | .["ip-addresses"][]? | select(.["ip-address-type"] == "ipv4") | .["ip-address"]' 2>/dev/null | head -1 || echo "")
|
||||
if [ -n "$VM_IP" ]; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
if [ -n "$VM_IP" ]; then
|
||||
msg_ok "VM IP Address: ${VM_IP}"
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
if [ -z "$VM_IP" ]; then
|
||||
msg_error "Could not detect VM IP address"
|
||||
echo -e "${TAB}${INFO}${YW}Use Proxmox Console to login with Cloud-Init credentials${CL}"
|
||||
echo -e "${TAB}${INFO}${YW}User: ${BGN}${CLOUDINIT_USER:-root}${CL} / Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wait for SSH to be ready
|
||||
msg_info "Waiting for SSH to be ready"
|
||||
SSH_READY=0
|
||||
for i in {1..30}; do
|
||||
if timeout 5 sshpass -p "${CLOUDINIT_PASSWORD}" ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
|
||||
"${CLOUDINIT_USER:-root}@${VM_IP}" "echo 'SSH Ready'" >/dev/null 2>&1; then
|
||||
SSH_READY=1
|
||||
msg_ok "SSH connection ready"
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
if [ $SSH_READY -eq 0 ]; then
|
||||
msg_error "SSH connection failed"
|
||||
echo -e "${TAB}${INFO}${YW}Manual login - User: ${BGN}${CLOUDINIT_USER:-root}${CL} / Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if sshpass is installed
|
||||
if ! command -v sshpass &>/dev/null; then
|
||||
msg_info "Installing sshpass for automated SSH"
|
||||
apt-get update -qq >/dev/null 2>&1
|
||||
apt-get install -y sshpass -qq >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
# Execute UniFi OS installation directly via SSH
|
||||
msg_info "Installing UniFi OS Server ${UOS_VERSION} (takes 4-6 minutes)"
|
||||
|
||||
# Create installation script
|
||||
INSTALL_SCRIPT=$(
|
||||
cat <<'EOFINSTALL'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
echo "[1/5] Updating system packages..."
|
||||
apt-get update -qq
|
||||
apt-get install -y curl wget ca-certificates podman uidmap slirp4netns iptables -qq
|
||||
|
||||
echo "[2/5] Configuring Podman..."
|
||||
loginctl enable-linger root
|
||||
|
||||
echo "[3/5] Downloading UniFi OS Server installer..."
|
||||
cd /root
|
||||
curl -fsSL "UNIFI_URL" -o unifi-installer.bin
|
||||
chmod +x unifi-installer.bin
|
||||
|
||||
echo "[4/5] Installing UniFi OS Server (this takes 3-5 minutes)..."
|
||||
./unifi-installer.bin install
|
||||
|
||||
echo "[5/5] Starting UniFi OS Server..."
|
||||
sleep 15
|
||||
|
||||
if systemctl list-unit-files | grep -q unifi-os-server; then
|
||||
systemctl enable unifi-os-server
|
||||
systemctl start unifi-os-server
|
||||
sleep 10
|
||||
|
||||
if systemctl is-active --quiet unifi-os-server; then
|
||||
echo "✓ UniFi OS Server is running"
|
||||
else
|
||||
echo "⚠ Service status:"
|
||||
systemctl status unifi-os-server --no-pager || true
|
||||
msg_info "Could not detect IP - check VM console"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Installation completed!"
|
||||
EOFINSTALL
|
||||
)
|
||||
|
||||
# Replace URL placeholder
|
||||
INSTALL_SCRIPT="${INSTALL_SCRIPT//UNIFI_URL/$UOS_URL}"
|
||||
|
||||
# Execute installation via SSH (with output streaming)
|
||||
if sshpass -p "${CLOUDINIT_PASSWORD}" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
|
||||
"${CLOUDINIT_USER:-root}@${VM_IP}" "bash -s" <<<"$INSTALL_SCRIPT" 2>&1 | while IFS= read -r line; do
|
||||
echo -e "${TAB}${DGN}${line}${CL}"
|
||||
done; then
|
||||
msg_ok "UniFi OS Server installed successfully"
|
||||
else
|
||||
msg_error "Installation failed"
|
||||
echo -e "${TAB}${INFO}${YW}Check logs: ${BL}ssh ${CLOUDINIT_USER:-root}@${VM_IP}${CL}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wait for UniFi OS web interface
|
||||
msg_info "Waiting for UniFi OS web interface (port 11443)"
|
||||
PORT_OPEN=0
|
||||
for i in {1..60}; do
|
||||
if timeout 2 bash -c ">/dev/tcp/${VM_IP}/11443" 2>/dev/null; then
|
||||
PORT_OPEN=1
|
||||
msg_ok "UniFi OS Server web interface is ready"
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo ""
|
||||
if [ $PORT_OPEN -eq 1 ]; then
|
||||
echo -e "${TAB}${GATEWAY}${BOLD}${GN}✓ UniFi OS Server is ready!${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BOLD}${GN}✓ UniFi OS Server installation complete!${CL}"
|
||||
if [ -n "$VM_IP" ]; then
|
||||
echo -e "${TAB}${GATEWAY}${BOLD}${GN}✓ Access at: ${BGN}https://${VM_IP}:11443${CL}"
|
||||
else
|
||||
echo -e "${TAB}${INFO}${YW}UniFi OS is installed but web interface not yet available${CL}"
|
||||
echo -e "${TAB}${INFO}${YW}Access at: ${BGN}https://${VM_IP}:11443${CL} ${YW}(may take 1-2 more minutes)${CL}"
|
||||
echo -e "${TAB}${INFO}${YW}Access via: ${BGN}https://<VM-IP>:11443${CL}"
|
||||
fi
|
||||
|
||||
echo -e "${TAB}${INFO}${DGN}SSH Access: ${BL}ssh ${CLOUDINIT_USER:-root}@${VM_IP}${CL}"
|
||||
echo -e "${TAB}${INFO}${DGN}Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}"
|
||||
echo -e "${TAB}${INFO}${DGN}Console login - User: ${BGN}root${CL} / Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}"
|
||||
echo -e "${TAB}${INFO}${YW}Note: UniFi OS may take 1-2 more minutes to fully start${CL}"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user