From 747d0904c0bc232ea88920eda4138a8bb1a79424 Mon Sep 17 00:00:00 2001 From: hoholms Date: Thu, 11 Dec 2025 22:24:54 +0200 Subject: [PATCH 01/65] Add loki (ct) --- ct/alpine-loki.sh | 71 ++++++++++++++++++++++++++++++++++ ct/headers/alpine-loki | 6 +++ ct/headers/loki | 5 +++ ct/loki.sh | 58 +++++++++++++++++++++++++++ frontend/public/json/loki.json | 44 +++++++++++++++++++++ install/alpine-loki-install.sh | 41 ++++++++++++++++++++ install/loki-install.sh | 37 ++++++++++++++++++ 7 files changed, 262 insertions(+) create mode 100644 ct/alpine-loki.sh create mode 100644 ct/headers/alpine-loki create mode 100644 ct/headers/loki create mode 100644 ct/loki.sh create mode 100644 frontend/public/json/loki.json create mode 100644 install/alpine-loki-install.sh create mode 100644 install/loki-install.sh diff --git a/ct/alpine-loki.sh b/ct/alpine-loki.sh new file mode 100644 index 000000000..99528206d --- /dev/null +++ b/ct/alpine-loki.sh @@ -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" diff --git a/ct/headers/alpine-loki b/ct/headers/alpine-loki new file mode 100644 index 000000000..ca154285e --- /dev/null +++ b/ct/headers/alpine-loki @@ -0,0 +1,6 @@ + ___ __ _ __ __ _ + / | / /___ (_)___ ___ / / ____ / /__(_) + / /| | / / __ \/ / __ \/ _ \______/ / / __ \/ //_/ / + / ___ |/ / /_/ / / / / / __/_____/ /___/ /_/ / ,< / / +/_/ |_/_/ .___/_/_/ /_/\___/ /_____/\____/_/|_/_/ + /_/ diff --git a/ct/headers/loki b/ct/headers/loki new file mode 100644 index 000000000..38b3c722b --- /dev/null +++ b/ct/headers/loki @@ -0,0 +1,5 @@ + __ __ _ + / / ____ / /__(_) + / / / __ \/ //_/ / + / /___/ /_/ / ,< / / +/_____/\____/_/|_/_/ diff --git a/ct/loki.sh b/ct/loki.sh new file mode 100644 index 000000000..ac4b9629e --- /dev/null +++ b/ct/loki.sh @@ -0,0 +1,58 @@ +#!/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 + + if [[ -f /etc/apt/sources.list.d/grafana.list ]] || [[ ! -f /etc/apt/sources.list.d/grafana.sources ]]; then + setup_deb822_repo \ + "grafana" \ + "https://apt.grafana.com/gpg.key" \ + "https://apt.grafana.com" \ + "stable" \ + "main" + fi + + msg_info "Updating Loki LXC" + $STD apt update + $STD apt --only-upgrade install -y loki + $STD apt --only-upgrade install -y promtail + msg_ok "Updated successfully!" + 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}" diff --git a/frontend/public/json/loki.json b/frontend/public/json/loki.json new file mode 100644 index 000000000..fa3362a86 --- /dev/null +++ b/frontend/public/json/loki.json @@ -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": [] +} diff --git a/install/alpine-loki-install.sh b/install/alpine-loki-install.sh new file mode 100644 index 000000000..cc5dbfdee --- /dev/null +++ b/install/alpine-loki-install.sh @@ -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 diff --git a/install/loki-install.sh b/install/loki-install.sh new file mode 100644 index 000000000..0edc93282 --- /dev/null +++ b/install/loki-install.sh @@ -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 From 2798c23dca7542c04a99c410c23d1e1b828dcdfc Mon Sep 17 00:00:00 2001 From: hoholms Date: Fri, 12 Dec 2025 02:11:57 +0200 Subject: [PATCH 02/65] Address review comments, stop/start loki and promtail services during update --- ct/loki.sh | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/ct/loki.sh b/ct/loki.sh index ac4b9629e..707b2fb46 100644 --- a/ct/loki.sh +++ b/ct/loki.sh @@ -29,20 +29,24 @@ function update_script() { exit 1 fi - if [[ -f /etc/apt/sources.list.d/grafana.list ]] || [[ ! -f /etc/apt/sources.list.d/grafana.sources ]]; then - setup_deb822_repo \ - "grafana" \ - "https://apt.grafana.com/gpg.key" \ - "https://apt.grafana.com" \ - "stable" \ - "main" - fi + msg_info "Stopping Loki" + systemctl stop loki + systemctl stop promtail + msg_ok "Stopped Loki" - msg_info "Updating Loki LXC" + msg_info "Updating Loki" $STD apt update $STD apt --only-upgrade install -y loki $STD apt --only-upgrade install -y promtail - msg_ok "Updated successfully!" + msg_ok "Updated Loki" + + msg_info "Starting Loki" + systemctl start loki + systemctl start promtail + msg_ok "Started Loki" + + msg_ok "Update Successful" + exit } From a827025d1ef87d5a530a60fdfe095a12e856087b Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Wed, 17 Dec 2025 10:38:53 +0100 Subject: [PATCH 03/65] added ct minthcm --- ct/minthcm.sh | 44 +++++++ frontend/public/json/minthcm.json | 35 ++++++ install/minthcm-install.sh | 190 ++++++++++++++++++++++++++++++ 3 files changed, 269 insertions(+) create mode 100644 ct/minthcm.sh create mode 100644 frontend/public/json/minthcm.json create mode 100644 install/minthcm-install.sh diff --git a/ct/minthcm.sh b/ct/minthcm.sh new file mode 100644 index 000000000..522b97086 --- /dev/null +++ b/ct/minthcm.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/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 "$APP" + check_container_storage + check_container_resources + + INSTALL_DIR="/var/www/MintHCM" + + if [[ ! -d "${INSTALL_DIR}" ]] || [[ ! -d "${INSTALL_DIR}/.git" ]]; then + msg_error "No ${APP} installation found in ${INSTALL_DIR}!" + 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 (after DB & installer are completed):${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/frontend/public/json/minthcm.json b/frontend/public/json/minthcm.json new file mode 100644 index 000000000..226f802cb --- /dev/null +++ b/frontend/public/json/minthcm.json @@ -0,0 +1,35 @@ +{ + "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://minthcm.org/wp-content/uploads/2021/03/minthcm-logo.svg", + "description": "MintCHM is a free and open-source tool for Human Capital Management.\n\nMain features:\nrecruitment\ntime management\nonboarding & offboarding\ncalendar\nleave management\nresources booking\ntravel & expenses\nworkplace management\nanalytics\nroles & permissions management\njob descriptions\nemployer branding\nemployee profiles\ncompetences & skills\nemployment history\nemployee evaluations\niOS & Android mobile apps\nMint based on two popular, well-known business applications: SugarCRM Community Edition and SuiteCRM. This is why we often say that MintHCM is CRM reinvented.", + "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": [] +} diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh new file mode 100644 index 000000000..8a169a58e --- /dev/null +++ b/install/minthcm-install.sh @@ -0,0 +1,190 @@ +#!/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 + +APP_NAME="MintHCM" +MINT_REPO="https://github.com/minthcm/minthcm.git" +MINT_DIR="/var/www/MintHCM" +PHP_VERSION="8.2" + +# Install base packages required for MintHCM and system management +msg_info "Installing base packages" +$STD apt-get install -y git curl cron +msg_ok "Base packages installed" + +# PHP + Apache +msg_info "Setting up PHP ${PHP_VERSION}" +PHP_APACHE="YES" PHP_VERSION="${PHP_VERSION}" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php +msg_ok "PHP ${PHP_VERSION} and required extensions installed" + +msg_info "Setting up Composer" +setup_composer || msg_error "Failed to setup Composer" +msg_ok "Composer setup completed" + +msg_info "Enabling Apache modules (rewrite, headers)" +$STD a2enmod rewrite +$STD a2enmod headers +msg_ok "Apache2 with rewrite and headers modules configured" + +# MintHCM configuration files +msg_info "Downloading PHP configuration for MintHCM" +PHP_MODS_DIR="/etc/php/${PHP_VERSION}/mods-available" +PHP_MINTHCM_INI="${PHP_MODS_DIR}/php-minthcm.ini" + +mkdir -p "${PHP_MODS_DIR}" + +curl -fsSL \ + "https://raw.githubusercontent.com/minthcm/minthcm/master/docker/config/php-minthcm.ini" \ + -o "${PHP_MINTHCM_INI}" \ + || msg_error "Failed to download php-minthcm.ini" + +mkdir -p "/etc/php/${PHP_VERSION}/cli/conf.d" "/etc/php/${PHP_VERSION}/apache2/conf.d" + +if [[ ! -e "/etc/php/${PHP_VERSION}/cli/conf.d/20-minthcm.ini" ]]; then + ln -s "${PHP_MINTHCM_INI}" "/etc/php/${PHP_VERSION}/cli/conf.d/20-minthcm.ini" \ + || msg_error "Failed to create CLI symlink for php-minthcm.ini" +fi + +if [[ ! -e "/etc/php/${PHP_VERSION}/apache2/conf.d/20-minthcm.ini" ]]; then + ln -s "${PHP_MINTHCM_INI}" "/etc/php/${PHP_VERSION}/apache2/conf.d/20-minthcm.ini" \ + || msg_error "Failed to create Apache symlink for php-minthcm.ini" +fi + +msg_ok "PHP configuration for MintHCM applied" + +# Apache VirtualHost configuration for MintHCM +msg_info "Downloading Apache VirtualHost configuration for MintHCM" +curl -fsSL \ + "https://raw.githubusercontent.com/minthcm/minthcm/master/docker/config/000-default.conf" \ + -o "/etc/apache2/sites-available/000-default.conf" \ + || msg_error "Failed to download 000-default.conf" +msg_ok "Apache VirtualHost configuration updated for MintHCM" + +# Clone MintHCM repository into the target directory +msg_info "Cloning MintHCM repository" +if [[ -d "${MINT_DIR}" ]]; then + msg_warn "Directory ${MINT_DIR} already exists, skipping clone" +else + mkdir -p "$(dirname "${MINT_DIR}")" + $STD git clone --depth=1 "${MINT_REPO}" "${MINT_DIR}" || msg_error "Failed to clone MintHCM repository" +fi +msg_ok "MintHCM repository available at ${MINT_DIR}" + +# Set ownership and permissions for MintHCM directory +msg_info "Setting ownership and permissions for MintHCM directory" +git config --global --add safe.directory "${MINT_DIR}" +chown -R www-data:www-data "${MINT_DIR}" +find "${MINT_DIR}" -type d -exec chmod 755 {} \; +find "${MINT_DIR}" -type f -exec chmod 644 {} \; +msg_ok "Ownership and permissions for MintHCM directory set" + +# Restart Apache2 to apply all new configuration +msg_info "Restarting Apache2 with new configuration" +$STD systemctl restart apache2 || msg_error "Failed to restart Apache2" +msg_ok "Apache2 restarted" + +# Elasticsearch +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 || msg_error "Failed to install Elasticsearch" + +echo "-Xms2g" >>/etc/elasticsearch/jvm.options +echo "-Xmx2g" >>/etc/elasticsearch/jvm.options + +$STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment -b \ + || msg_error "Failed to install Elasticsearch ingest-attachment plugin" + +systemctl enable -q elasticsearch +systemctl restart -q elasticsearch +msg_ok "Elasticsearch setup completed" + +# MariaDB +msg_info "Setting up MariaDB" +setup_mariadb || msg_error "Failed to setup MariaDB" +$STD mariadb -u root -e "SET GLOBAL sql_mode=''"; +msg_ok "MariaDB setup completed" + +msg_info "Configuring database for MintHCM" +DB_USER="minthcm" +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) + +$STD mariadb -u root -e "CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';" + +$STD mariadb -u root -e "GRANT ALL ON *.* TO '${DB_USER}'@'localhost'; FLUSH PRIVILEGES;" + +msg_ok "Configured MariaDB for MintHCM" + +#MintHCM config generate +msg_info "Downloading generate_config.php script" +mkdir -p /var/www/script + +curl -fsSL \ + "https://raw.githubusercontent.com/minthcm/minthcm/master/docker/script/generate_config.php" \ + -o "/var/www/script/generate_config.php" \ + || msg_error "Failed to download generate_config.php" + +chown -R www-data:www-data /var/www/script +msg_ok "generate_config.php script downloaded" + +export DB_HOST=localhost +export DB_NAME=minthcm +export DB_PORT=3306 +export DB_USER=minthcm +export DB_PASS=$DB_PASS +export MINT_URL=localhost +export MINT_USER=admin +export MINT_PASS=minthcm +export ELASTICSEARCH_HOST=localhost + +{ + echo "MintHCM DB Credentials" + echo "MariaDB User: $DB_USER" + echo "MariaDB Password: $DB_PASS" +} >>~/minthcm.creds + +msg_info "Generating MintHCM configuration file (configMint4)" +php /var/www/script/generate_config.php || msg_error "Failed to execute generate_config.php" + +if [[ ! -f /var/www/MintHCM/configMint4 ]]; then + msg_error "Error: Failed to generate configMint4 - please check the configuration" + exit 1 +fi +msg_ok "configMint4 generated" +#MintHCM installation +msg_info "Starting MintHCM installation..." +cd /var/www/MintHCM && su -s /bin/bash -c 'php /var/www/MintHCM/MintCLI install < /var/www/MintHCM/configMint4' www-data + +if [[ $? -ne 0 ]]; then + msg_error "Error: MintHCM installation failed - please check logs" +else + msg_ok "MintHCM installation completed!" + msg_info "Configuring cron for MintHCM" + printf "* * * * * cd /var/www/MintHCM/legacy; php -f cron.php > /dev/null 2>&1\n" > /var/spool/cron/crontabs/www-data \ + || msg_error "Failed to configure cron for www-data" + service cron start || msg_error "Failed to start cron service" + rm -f /var/www/MintHCM/configMint4 +fi + + +msg_ok "${APP_NAME} has been installed. Make sure to configure the database and other parameters according to the MintHCM documentation." + +motd_ssh +customize +cleanup_lxc From b9534031c38c75ef65af41cb942e75c604e2ca41 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 10:07:52 +0100 Subject: [PATCH 04/65] fix --- ct/minthcm.sh | 14 ++-- install/minthcm-install.sh | 145 +++++++++++-------------------------- 2 files changed, 46 insertions(+), 113 deletions(-) diff --git a/ct/minthcm.sh b/ct/minthcm.sh index 522b97086..c6f4c689f 100644 --- a/ct/minthcm.sh +++ b/ct/minthcm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +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 @@ -18,16 +18,12 @@ header_info "$APP" variables color catch_errors - function update_script() { - header_info "$APP" + header_info check_container_storage check_container_resources - - INSTALL_DIR="/var/www/MintHCM" - - if [[ ! -d "${INSTALL_DIR}" ]] || [[ ! -d "${INSTALL_DIR}/.git" ]]; then - msg_error "No ${APP} installation found in ${INSTALL_DIR}!" + 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}." @@ -40,5 +36,5 @@ 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 (after DB & installer are completed):${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 8a169a58e..b4e99ffcd 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -13,88 +13,43 @@ setting_up_container network_check update_os -APP_NAME="MintHCM" MINT_REPO="https://github.com/minthcm/minthcm.git" -MINT_DIR="/var/www/MintHCM" -PHP_VERSION="8.2" -# Install base packages required for MintHCM and system management -msg_info "Installing base packages" -$STD apt-get install -y git curl cron -msg_ok "Base packages installed" - -# PHP + Apache -msg_info "Setting up PHP ${PHP_VERSION}" -PHP_APACHE="YES" PHP_VERSION="${PHP_VERSION}" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php -msg_ok "PHP ${PHP_VERSION} and required extensions installed" +msg_info "Setting up PHP 8.2" +PHP_APACHE="YES" PHP_VERSION="8.2" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php +msg_ok "Set up PHP 8.2" msg_info "Setting up Composer" -setup_composer || msg_error "Failed to setup Composer" -msg_ok "Composer setup completed" +setup_composer +msg_ok "Set up Composer" msg_info "Enabling Apache modules (rewrite, headers)" $STD a2enmod rewrite $STD a2enmod headers -msg_ok "Apache2 with rewrite and headers modules configured" +msg_ok "Enabled Apache modules (rewrite, headers)" -# MintHCM configuration files -msg_info "Downloading PHP configuration for MintHCM" -PHP_MODS_DIR="/etc/php/${PHP_VERSION}/mods-available" -PHP_MINTHCM_INI="${PHP_MODS_DIR}/php-minthcm.ini" +fetch_and_deploy_gh_release "MintHCM" "minthcm/minthcm" "tarball" "latest" "/var/www/MintHCM" -mkdir -p "${PHP_MODS_DIR}" +msg_info "Configuring PHP and Apache2 for MintHCM" +mkdir -p /etc/php/8.2/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/8.2/mods-available/php-minthcm.ini +mkdir -p "/etc/php/8.2/cli/conf.d" "/etc/php/8.2/apache2/conf.d" +ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/cli/conf.d/20-minthcm.ini" +ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/apache2/conf.d/20-minthcm.ini" +msg_ok "Configured PHP and Apache2 for MintHCM" -curl -fsSL \ - "https://raw.githubusercontent.com/minthcm/minthcm/master/docker/config/php-minthcm.ini" \ - -o "${PHP_MINTHCM_INI}" \ - || msg_error "Failed to download php-minthcm.ini" - -mkdir -p "/etc/php/${PHP_VERSION}/cli/conf.d" "/etc/php/${PHP_VERSION}/apache2/conf.d" - -if [[ ! -e "/etc/php/${PHP_VERSION}/cli/conf.d/20-minthcm.ini" ]]; then - ln -s "${PHP_MINTHCM_INI}" "/etc/php/${PHP_VERSION}/cli/conf.d/20-minthcm.ini" \ - || msg_error "Failed to create CLI symlink for php-minthcm.ini" -fi - -if [[ ! -e "/etc/php/${PHP_VERSION}/apache2/conf.d/20-minthcm.ini" ]]; then - ln -s "${PHP_MINTHCM_INI}" "/etc/php/${PHP_VERSION}/apache2/conf.d/20-minthcm.ini" \ - || msg_error "Failed to create Apache symlink for php-minthcm.ini" -fi - -msg_ok "PHP configuration for MintHCM applied" - -# Apache VirtualHost configuration for MintHCM -msg_info "Downloading Apache VirtualHost configuration for MintHCM" -curl -fsSL \ - "https://raw.githubusercontent.com/minthcm/minthcm/master/docker/config/000-default.conf" \ - -o "/etc/apache2/sites-available/000-default.conf" \ - || msg_error "Failed to download 000-default.conf" -msg_ok "Apache VirtualHost configuration updated for MintHCM" - -# Clone MintHCM repository into the target directory -msg_info "Cloning MintHCM repository" -if [[ -d "${MINT_DIR}" ]]; then - msg_warn "Directory ${MINT_DIR} already exists, skipping clone" -else - mkdir -p "$(dirname "${MINT_DIR}")" - $STD git clone --depth=1 "${MINT_REPO}" "${MINT_DIR}" || msg_error "Failed to clone MintHCM repository" -fi -msg_ok "MintHCM repository available at ${MINT_DIR}" - -# Set ownership and permissions for MintHCM directory msg_info "Setting ownership and permissions for MintHCM directory" -git config --global --add safe.directory "${MINT_DIR}" -chown -R www-data:www-data "${MINT_DIR}" -find "${MINT_DIR}" -type d -exec chmod 755 {} \; -find "${MINT_DIR}" -type f -exec chmod 644 {} \; -msg_ok "Ownership and permissions for MintHCM directory set" +git config --global --add safe.directory /var/www/MintHCM +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 {} \; +msg_ok "Set up ownership and permissions for MintHCM directory" -# Restart Apache2 to apply all new configuration -msg_info "Restarting Apache2 with new configuration" -$STD systemctl restart apache2 || msg_error "Failed to restart Apache2" -msg_ok "Apache2 restarted" +msg_info "Restarting Apache2" +$STD systemctl restart apache2 +msg_ok "Restarted Apache2" -# Elasticsearch msg_info "Setting up Elasticsearch" setup_deb822_repo \ "elasticsearch" \ @@ -103,55 +58,39 @@ setup_deb822_repo \ "stable" \ "main" -$STD apt install -y elasticsearch || msg_error "Failed to install Elasticsearch" +$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 \ - || msg_error "Failed to install Elasticsearch ingest-attachment plugin" +$STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment -b -systemctl enable -q elasticsearch -systemctl restart -q elasticsearch -msg_ok "Elasticsearch setup completed" +systemctl enable -q --now elasticsearch +msg_ok "Set up Elasticsearch" -# MariaDB msg_info "Setting up MariaDB" -setup_mariadb || msg_error "Failed to setup MariaDB" +setup_mariadb $STD mariadb -u root -e "SET GLOBAL sql_mode=''"; -msg_ok "MariaDB setup completed" +msg_ok "Set up MariaDB" msg_info "Configuring database for MintHCM" -DB_USER="minthcm" + DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) - -$STD mariadb -u root -e "CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';" - -$STD mariadb -u root -e "GRANT ALL ON *.* TO '${DB_USER}'@'localhost'; FLUSH PRIVILEGES;" - +$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;" msg_ok "Configured MariaDB for MintHCM" -#MintHCM config generate msg_info "Downloading generate_config.php script" mkdir -p /var/www/script - -curl -fsSL \ - "https://raw.githubusercontent.com/minthcm/minthcm/master/docker/script/generate_config.php" \ - -o "/var/www/script/generate_config.php" \ - || msg_error "Failed to download generate_config.php" - +cp /var/www/MintHCM/docker/script/generate_config.php /var/www/script/generate_config.php chown -R www-data:www-data /var/www/script -msg_ok "generate_config.php script downloaded" +msg_ok "Downloading generate_config.php script" -export DB_HOST=localhost -export DB_NAME=minthcm -export DB_PORT=3306 -export DB_USER=minthcm -export DB_PASS=$DB_PASS -export MINT_URL=localhost -export MINT_USER=admin -export MINT_PASS=minthcm -export ELASTICSEARCH_HOST=localhost +cp /var/www/MintHCM/docker/.env /var/www/script/.env +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 { echo "MintHCM DB Credentials" @@ -166,8 +105,8 @@ if [[ ! -f /var/www/MintHCM/configMint4 ]]; then msg_error "Error: Failed to generate configMint4 - please check the configuration" exit 1 fi -msg_ok "configMint4 generated" -#MintHCM installation +msg_ok "Generated MintHCM configuration file (configMint4)" + msg_info "Starting MintHCM installation..." cd /var/www/MintHCM && su -s /bin/bash -c 'php /var/www/MintHCM/MintCLI install < /var/www/MintHCM/configMint4' www-data @@ -183,8 +122,6 @@ else fi -msg_ok "${APP_NAME} has been installed. Make sure to configure the database and other parameters according to the MintHCM documentation." - motd_ssh customize cleanup_lxc From 1bde893dd9b9b3304b70f498d4434ed6e3021fa5 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 10:31:19 +0100 Subject: [PATCH 05/65] change urls for testing purposes --- ct/minthcm.sh | 2 +- install/minthcm-install.sh | 2 -- misc/build.func | 8 ++++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ct/minthcm.sh b/ct/minthcm.sh index c6f4c689f..353473586 100644 --- a/ct/minthcm.sh +++ b/ct/minthcm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +source <(curl -fsSL https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/build.func) # Copyright (c) 2021-2025 minthcm # Author: MintHCM # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index b4e99ffcd..660a6dc55 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -13,8 +13,6 @@ setting_up_container network_check update_os -MINT_REPO="https://github.com/minthcm/minthcm.git" - msg_info "Setting up PHP 8.2" PHP_APACHE="YES" PHP_VERSION="8.2" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php msg_ok "Set up PHP 8.2" diff --git a/misc/build.func b/misc/build.func index 7ce994d1e..5427067ec 100644 --- a/misc/build.func +++ b/misc/build.func @@ -91,7 +91,7 @@ variables() { # FUNC_DIR="/usr/local/community-scripts/core" # mkdir -p "$FUNC_DIR" -# BUILD_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func" +# BUILD_URL="https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/build.func" # BUILD_REV="$FUNC_DIR/build.rev" # DEVMODE="${DEVMODE:-no}" @@ -116,7 +116,7 @@ variables() { # update_func_file() { # local file="$1" -# local url="https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/$file" +# local url="https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/$file" # local local_path="$FUNC_DIR/$file" # echo "⬇️ Downloading $file ..." @@ -3199,7 +3199,7 @@ EOF' set +Eeuo pipefail # Disable ALL error handling temporarily trap - ERR # Remove ERR trap completely - lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/install/${var_install}.sh)" + lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/install/${var_install}.sh)" local lxc_exit=$? set -Eeuo pipefail # Re-enable error handling @@ -3286,7 +3286,7 @@ EOF' if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}" if pct exec "$CTID" -- bash -c " - source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/install.func) + source <(curl -fsSL https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/install.func) declare -f motd_ssh >/dev/null 2>&1 && motd_ssh || true " >/dev/null 2>&1; then local ct_ip=$(pct exec "$CTID" ip a s dev eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1) From 5b85d87041852d249d80f42145d1778fdce701c6 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 10:37:57 +0100 Subject: [PATCH 06/65] sqlmode fix + no git --- install/minthcm-install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 660a6dc55..c67365baf 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -38,7 +38,6 @@ ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/apache2/conf.d msg_ok "Configured PHP and Apache2 for MintHCM" msg_info "Setting ownership and permissions for MintHCM directory" -git config --global --add safe.directory /var/www/MintHCM 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 {} \; @@ -68,7 +67,7 @@ msg_ok "Set up Elasticsearch" msg_info "Setting up MariaDB" setup_mariadb -$STD mariadb -u root -e "SET GLOBAL sql_mode=''"; +$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 for MintHCM" From e0dee3885270a204646f6db892646999c3813263 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 10:46:42 +0100 Subject: [PATCH 07/65] fix variables --- install/minthcm-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index c67365baf..29b0fe382 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -91,7 +91,7 @@ sed -i 's/^ELASTICSEARCH_HOST=.*/ELASTICSEARCH_HOST=localhost/' /var/www/script/ { echo "MintHCM DB Credentials" - echo "MariaDB User: $DB_USER" + echo "MariaDB User: minthcm" echo "MariaDB Password: $DB_PASS" } >>~/minthcm.creds From cf4e39ad1079b40220e4009a69dad94bcdbd98ff Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 11:02:57 +0100 Subject: [PATCH 08/65] .env file --- install/minthcm-install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 29b0fe382..77b879ece 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -96,6 +96,9 @@ sed -i 's/^ELASTICSEARCH_HOST=.*/ELASTICSEARCH_HOST=localhost/' /var/www/script/ } >>~/minthcm.creds msg_info "Generating MintHCM configuration file (configMint4)" +set -a +source /var/www/script/.env +set +a php /var/www/script/generate_config.php || msg_error "Failed to execute generate_config.php" if [[ ! -f /var/www/MintHCM/configMint4 ]]; then From a525cada4c5b4b002c18db8488979b1cd7f1087f Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 11:15:34 +0100 Subject: [PATCH 09/65] revert urls change --- ct/minthcm.sh | 2 +- misc/build.func | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ct/minthcm.sh b/ct/minthcm.sh index 353473586..c6f4c689f 100644 --- a/ct/minthcm.sh +++ b/ct/minthcm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/build.func) +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 diff --git a/misc/build.func b/misc/build.func index 5427067ec..7ce994d1e 100644 --- a/misc/build.func +++ b/misc/build.func @@ -91,7 +91,7 @@ variables() { # FUNC_DIR="/usr/local/community-scripts/core" # mkdir -p "$FUNC_DIR" -# BUILD_URL="https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/build.func" +# BUILD_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func" # BUILD_REV="$FUNC_DIR/build.rev" # DEVMODE="${DEVMODE:-no}" @@ -116,7 +116,7 @@ variables() { # update_func_file() { # local file="$1" -# local url="https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/$file" +# local url="https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/$file" # local local_path="$FUNC_DIR/$file" # echo "⬇️ Downloading $file ..." @@ -3199,7 +3199,7 @@ EOF' set +Eeuo pipefail # Disable ALL error handling temporarily trap - ERR # Remove ERR trap completely - lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/install/${var_install}.sh)" + lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/install/${var_install}.sh)" local lxc_exit=$? set -Eeuo pipefail # Re-enable error handling @@ -3286,7 +3286,7 @@ EOF' if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}" if pct exec "$CTID" -- bash -c " - source <(curl -fsSL https://raw.githubusercontent.com/minthcm/ProxmoxVED/feature/minthcm/misc/install.func) + source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/install.func) declare -f motd_ssh >/dev/null 2>&1 && motd_ssh || true " >/dev/null 2>&1; then local ct_ip=$(pct exec "$CTID" ip a s dev eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1) From 671a7f12c93f45981ebb68e8d018c57d8bb8347c Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 13:56:16 +0100 Subject: [PATCH 10/65] add note --- frontend/public/json/minthcm.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/public/json/minthcm.json b/frontend/public/json/minthcm.json index 226f802cb..680212e52 100644 --- a/frontend/public/json/minthcm.json +++ b/frontend/public/json/minthcm.json @@ -31,5 +31,10 @@ "username": "admin", "password": "minthcm" }, - "notes": [] + "notes": [ + { + "text": "Database credentials are stored in ~/minthcm.creds", + "type": "info" + } + ] } From 36814cb0fbfab78c45f967e9f60e6c586260e671 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Mon, 22 Dec 2025 08:11:35 +0100 Subject: [PATCH 11/65] removed msg_info, fix description --- frontend/public/json/minthcm.json | 2 +- install/minthcm-install.sh | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/frontend/public/json/minthcm.json b/frontend/public/json/minthcm.json index 680212e52..a901a7cb3 100644 --- a/frontend/public/json/minthcm.json +++ b/frontend/public/json/minthcm.json @@ -13,7 +13,7 @@ "config_path": "/var/www/MintHCM", "website": "https://minthcm.org/", "logo": "https://minthcm.org/wp-content/uploads/2021/03/minthcm-logo.svg", - "description": "MintCHM is a free and open-source tool for Human Capital Management.\n\nMain features:\nrecruitment\ntime management\nonboarding & offboarding\ncalendar\nleave management\nresources booking\ntravel & expenses\nworkplace management\nanalytics\nroles & permissions management\njob descriptions\nemployer branding\nemployee profiles\ncompetences & skills\nemployment history\nemployee evaluations\niOS & Android mobile apps\nMint based on two popular, well-known business applications: SugarCRM Community Edition and SuiteCRM. This is why we often say that MintHCM is CRM reinvented.", + "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, iOS & Android mobile apps. Mint based on two popular, well-known business applications: SugarCRM Community Edition and SuiteCRM. This is why we often say that MintHCM is CRM reinvented.", "install_methods": [ { "type": "default", diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 77b879ece..b7e0c4c4c 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -13,13 +13,9 @@ setting_up_container network_check update_os -msg_info "Setting up PHP 8.2" PHP_APACHE="YES" PHP_VERSION="8.2" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php -msg_ok "Set up PHP 8.2" -msg_info "Setting up Composer" setup_composer -msg_ok "Set up Composer" msg_info "Enabling Apache modules (rewrite, headers)" $STD a2enmod rewrite From 93dc41e30bf517a80eae4a8511694c1ef275eb79 Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Mon, 22 Dec 2025 08:12:02 +0100 Subject: [PATCH 12/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index b7e0c4c4c..621c86343 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -15,6 +15,7 @@ update_os PHP_APACHE="YES" PHP_VERSION="8.2" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php +setup_composer setup_composer msg_info "Enabling Apache modules (rewrite, headers)" From 8732ffd8e6868b23a220c53a8095fcf61d86c887 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Mon, 22 Dec 2025 08:12:41 +0100 Subject: [PATCH 13/65] fix 2 composers --- install/minthcm-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 621c86343..b7e0c4c4c 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -15,7 +15,6 @@ update_os PHP_APACHE="YES" PHP_VERSION="8.2" PHP_MODULE="mysql,cli,redis" PHP_FPM="YES" setup_php -setup_composer setup_composer msg_info "Enabling Apache modules (rewrite, headers)" From a84a1bc467a6e7c9b4ae4311db1ae434736a5370 Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Tue, 23 Dec 2025 08:49:42 +0100 Subject: [PATCH 14/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index b7e0c4c4c..42143428f 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -14,7 +14,6 @@ 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)" From dbfaeb7f4fa60e59f0c632bd8a144066801f6179 Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Tue, 23 Dec 2025 08:52:17 +0100 Subject: [PATCH 15/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 42143428f..6b727e1f0 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -49,7 +49,6 @@ setup_deb822_repo \ "https://artifacts.elastic.co/packages/7.x/apt" \ "stable" \ "main" - $STD apt install -y elasticsearch echo "-Xms2g" >>/etc/elasticsearch/jvm.options From 41e9b03a424606afc4f937ce51855ab42875a700 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Tue, 23 Dec 2025 08:54:07 +0100 Subject: [PATCH 16/65] remove msg_error --- install/minthcm-install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 6b727e1f0..25976cb8d 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -110,8 +110,7 @@ else msg_ok "MintHCM installation completed!" msg_info "Configuring cron for MintHCM" printf "* * * * * cd /var/www/MintHCM/legacy; php -f cron.php > /dev/null 2>&1\n" > /var/spool/cron/crontabs/www-data \ - || msg_error "Failed to configure cron for www-data" - service cron start || msg_error "Failed to start cron service" + service cron start rm -f /var/www/MintHCM/configMint4 fi From bd4fc92ac42cf8f5c4753697832c3ab748010e70 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Tue, 23 Dec 2025 08:56:27 +0100 Subject: [PATCH 17/65] remove error checks --- install/minthcm-install.sh | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 25976cb8d..4f5a2de20 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -94,25 +94,17 @@ set -a source /var/www/script/.env set +a php /var/www/script/generate_config.php || msg_error "Failed to execute generate_config.php" - -if [[ ! -f /var/www/MintHCM/configMint4 ]]; then - msg_error "Error: Failed to generate configMint4 - please check the configuration" - exit 1 -fi msg_ok "Generated MintHCM configuration file (configMint4)" msg_info "Starting MintHCM installation..." cd /var/www/MintHCM && su -s /bin/bash -c 'php /var/www/MintHCM/MintCLI install < /var/www/MintHCM/configMint4' www-data -if [[ $? -ne 0 ]]; then - msg_error "Error: MintHCM installation failed - please check logs" -else - msg_ok "MintHCM installation completed!" - msg_info "Configuring cron for MintHCM" - 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 -fi +msg_ok "MintHCM installation completed!" +msg_info "Configuring cron for MintHCM" +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 + motd_ssh From 410bcdfa47bc77f7fc2991c2e0ca76366e3e6037 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Tue, 23 Dec 2025 08:57:07 +0100 Subject: [PATCH 18/65] remove msg_error --- install/minthcm-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 4f5a2de20..e8cd964a4 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -93,7 +93,7 @@ msg_info "Generating MintHCM configuration file (configMint4)" set -a source /var/www/script/.env set +a -php /var/www/script/generate_config.php || msg_error "Failed to execute generate_config.php" +php /var/www/script/generate_config.php msg_ok "Generated MintHCM configuration file (configMint4)" msg_info "Starting MintHCM installation..." From b49ba6163f314cdce680a2de6870171bf76f114f Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Tue, 23 Dec 2025 09:01:45 +0100 Subject: [PATCH 19/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 6b727e1f0..be34fab5d 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -53,9 +53,7 @@ $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" From 46c4adfa67828d692e4be501c35134c18919b397 Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Tue, 23 Dec 2025 09:04:51 +0100 Subject: [PATCH 20/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index be34fab5d..ec7e8d2b5 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -23,20 +23,17 @@ msg_ok "Enabled Apache modules (rewrite, headers)" fetch_and_deploy_gh_release "MintHCM" "minthcm/minthcm" "tarball" "latest" "/var/www/MintHCM" -msg_info "Configuring PHP and Apache2 for MintHCM" +msg_info "Configuring MintHCM" mkdir -p /etc/php/8.2/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/8.2/mods-available/php-minthcm.ini mkdir -p "/etc/php/8.2/cli/conf.d" "/etc/php/8.2/apache2/conf.d" ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/cli/conf.d/20-minthcm.ini" ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/apache2/conf.d/20-minthcm.ini" -msg_ok "Configured PHP and Apache2 for MintHCM" - -msg_info "Setting ownership and permissions for MintHCM directory" 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 {} \; -msg_ok "Set up ownership and permissions for MintHCM directory" +msg_ok "Configured MintHCM" msg_info "Restarting Apache2" $STD systemctl restart apache2 From 9e2c7a3a0e95ed53aa68e3ed2600bdc5f294849c Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Tue, 23 Dec 2025 09:05:20 +0100 Subject: [PATCH 21/65] move mariadbsetup --- install/minthcm-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index e8cd964a4..756cfd31b 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -59,8 +59,8 @@ $STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment systemctl enable -q --now elasticsearch msg_ok "Set up Elasticsearch" -msg_info "Setting up MariaDB" 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" From 650e7bfb194c304415a9cbd65ec78e7dd038303d Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Tue, 23 Dec 2025 09:14:22 +0100 Subject: [PATCH 22/65] php version variable --- install/minthcm-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index a65b959b2..90531d06e 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -24,12 +24,12 @@ 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/8.2/mods-available +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/8.2/mods-available/php-minthcm.ini -mkdir -p "/etc/php/8.2/cli/conf.d" "/etc/php/8.2/apache2/conf.d" -ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/cli/conf.d/20-minthcm.ini" -ln -s "/etc/php/8.2/mods-available/php-minthcm.ini" "/etc/php/8.2/apache2/conf.d/20-minthcm.ini" +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 {} \; From db5ca9ee255521411ea91777d35a73b82ee1e210 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Tue, 23 Dec 2025 09:29:42 +0100 Subject: [PATCH 23/65] move few config lines --- install/minthcm-install.sh | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 90531d06e..3ddceaba9 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -33,6 +33,10 @@ ln -s "/etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini" "/etc/php/${PHP_V 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" @@ -60,24 +64,15 @@ $STD mariadb -u root -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DAT msg_ok "Set up MariaDB" msg_info "Configuring database for MintHCM" - 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;" msg_ok "Configured MariaDB for MintHCM" -msg_info "Downloading generate_config.php script" -mkdir -p /var/www/script -cp /var/www/MintHCM/docker/script/generate_config.php /var/www/script/generate_config.php -chown -R www-data:www-data /var/www/script -msg_ok "Downloading generate_config.php script" - -cp /var/www/MintHCM/docker/.env /var/www/script/.env 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 - { echo "MintHCM DB Credentials" echo "MariaDB User: minthcm" From cf80bb6e5fca26751cba9445fb04eedd0304a33a Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 00:22:24 +0700 Subject: [PATCH 24/65] add fladder --- ct/fladder.sh | 86 +++++++++++++++++++++++++++++++ frontend/public/json/fladder.json | 35 +++++++++++++ install/fladder-install.sh | 59 +++++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 ct/fladder.sh create mode 100644 frontend/public/json/fladder.json create mode 100644 install/fladder-install.sh diff --git a/ct/fladder.sh b/ct/fladder.sh new file mode 100644 index 000000000..5eb2d3a51 --- /dev/null +++ b/ct/fladder.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/wendyliga/ProxmoxVE/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 + # Get latest version from GitHub + RELEASE=$(curl -fsSL https://api.github.com/repos/DonutWare/Fladder/releases/latest | \ + grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') + if [[ -z "$RELEASE" ]]; then + msg_error "Failed to fetch latest release version from GitHub" + exit 1 + fi + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; 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" + elif [[ -f /opt/fladder/data/flutter_assets/config/config.json ]]; then + cp /opt/fladder/data/flutter_assets/config/config.json /tmp/fladder_config.json.bak + msg_ok "Configuration backed up" + fi + + msg_info "Updating ${APP} to ${RELEASE}" + cd /opt + wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" + rm -rf /opt/fladder + unzip -q "Fladder-Web-${RELEASE#v}.zip" -d fladder + rm -f "Fladder-Web-${RELEASE#v}.zip" + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to ${RELEASE}" + + 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!" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + 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}" diff --git a/frontend/public/json/fladder.json b/frontend/public/json/fladder.json new file mode 100644 index 000000000..99a8ffd81 --- /dev/null +++ b/frontend/public/json/fladder.json @@ -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/homarr-labs/dashboard-icons/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": [] +} diff --git a/install/fladder-install.sh b/install/fladder-install.sh new file mode 100644 index 000000000..beb848ca5 --- /dev/null +++ b/install/fladder-install.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: wendyliga +# License: MIT | https://github.com/wendyliga/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-get install -y \ + wget \ + unzip \ + nginx +msg_ok "Installed Dependencies" + +msg_info "Installing ${APPLICATION}" +# Get latest version from GitHub +RELEASE=$(curl -fsSL https://api.github.com/repos/DonutWare/Fladder/releases/latest | \ + grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') +cd /opt +$STD wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" +$STD unzip -o "Fladder-Web-${RELEASE#v}.zip" -d fladder + +rm -f "Fladder-Web-${RELEASE#v}.zip" +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Installed ${APPLICATION}" + +msg_info "Configuring Nginx" +cat </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 From f2784d025a023f9dec806f301686d55d1195e57d Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 00:27:30 +0700 Subject: [PATCH 25/65] fix: update source URL for build functions in fladder script --- ct/fladder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/fladder.sh b/ct/fladder.sh index 5eb2d3a51..1c827dd8a 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/wendyliga/ProxmoxVE/main/misc/build.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2025 community-scripts ORG # Author: wendyliga # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE From 714307d9f3ac0a2316b4167626a11ff9bf1cfea4 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 00:28:37 +0700 Subject: [PATCH 26/65] fix: correct license URL in fladder installation script --- install/fladder-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/fladder-install.sh b/install/fladder-install.sh index beb848ca5..0ddf937f4 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2025 community-scripts ORG # Author: wendyliga -# License: MIT | https://github.com/wendyliga/ProxmoxVE/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/DonutWare/Fladder source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" From 400dfeb8a0f083296adeae81bc954c0f3285fb6c Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 00:31:43 +0700 Subject: [PATCH 27/65] fix: update license URL in fladder scripts --- ct/fladder.sh | 4 ++-- install/fladder-install.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ct/fladder.sh b/ct/fladder.sh index 1c827dd8a..5349f194c 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +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 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://github.com/DonutWare/Fladder APP="Fladder" diff --git a/install/fladder-install.sh b/install/fladder-install.sh index 0ddf937f4..6146e0c7c 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2025 community-scripts ORG # Author: wendyliga -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://github.com/DonutWare/Fladder source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" From 5698870c63aa1072713739745825be8f3b40e4be Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 20:49:54 +0700 Subject: [PATCH 28/65] fix review --- ct/fladder.sh | 70 ++++++++++++++----------------- frontend/public/json/fladder.json | 2 +- install/fladder-install.sh | 9 ++-- 3 files changed, 38 insertions(+), 43 deletions(-) diff --git a/ct/fladder.sh b/ct/fladder.sh index 5349f194c..3339da735 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -24,55 +24,49 @@ function update_script() { check_container_storage check_container_resources - if [[ ! -d /opt/fladder ]]; then + if [[ ! -f ~/.fladder ]]; then msg_error "No ${APP} Installation Found!" exit fi + # Get latest version from GitHub - RELEASE=$(curl -fsSL https://api.github.com/repos/DonutWare/Fladder/releases/latest | \ - grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') + RELEASE=$(get_latest_github_release "DonutWare/Fladder") if [[ -z "$RELEASE" ]]; then msg_error "Failed to fetch latest release version from GitHub" exit 1 fi - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; 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" - elif [[ -f /opt/fladder/data/flutter_assets/config/config.json ]]; then - cp /opt/fladder/data/flutter_assets/config/config.json /tmp/fladder_config.json.bak - msg_ok "Configuration backed up" - fi + msg_info "Stopping Service" + systemctl stop nginx + msg_ok "Stopped Service" - msg_info "Updating ${APP} to ${RELEASE}" - cd /opt - wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" - rm -rf /opt/fladder - unzip -q "Fladder-Web-${RELEASE#v}.zip" -d fladder - rm -f "Fladder-Web-${RELEASE#v}.zip" - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP} to ${RELEASE}" - - 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!" - else - msg_ok "No update required. ${APP} is already at ${RELEASE}" + 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 + + msg_info "Updating ${APP} to ${RELEASE}" + cd /opt + wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" + rm -rf /opt/fladder + unzip -q "Fladder-Web-${RELEASE#v}.zip" -d fladder + rm -f "Fladder-Web-${RELEASE#v}.zip" + echo "${RELEASE}" > ~/.fladder + msg_ok "Updated ${APP} to ${RELEASE}" + + 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!" exit } diff --git a/frontend/public/json/fladder.json b/frontend/public/json/fladder.json index 99a8ffd81..9ee69b853 100644 --- a/frontend/public/json/fladder.json +++ b/frontend/public/json/fladder.json @@ -11,7 +11,7 @@ "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/homarr-labs/dashboard-icons/webp/fladder.webp", + "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": [ diff --git a/install/fladder-install.sh b/install/fladder-install.sh index 6146e0c7c..1514dbdab 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -14,22 +14,23 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ +$STD apt install -y \ wget \ unzip \ nginx msg_ok "Installed Dependencies" msg_info "Installing ${APPLICATION}" + # Get latest version from GitHub -RELEASE=$(curl -fsSL https://api.github.com/repos/DonutWare/Fladder/releases/latest | \ - grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') +RELEASE=$(get_latest_github_release "DonutWare/Fladder") + cd /opt $STD wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" $STD unzip -o "Fladder-Web-${RELEASE#v}.zip" -d fladder rm -f "Fladder-Web-${RELEASE#v}.zip" -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +echo "${RELEASE}" > ~/.fladder msg_ok "Installed ${APPLICATION}" msg_info "Configuring Nginx" From d85e518d9f211c10bc6ed3839967262f500b9888 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 20:55:22 +0700 Subject: [PATCH 29/65] improve update script --- ct/fladder.sh | 62 +++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/ct/fladder.sh b/ct/fladder.sh index 3339da735..fad8c5d14 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -29,44 +29,32 @@ function update_script() { exit fi - # Get latest version from GitHub - RELEASE=$(get_latest_github_release "DonutWare/Fladder") - if [[ -z "$RELEASE" ]]; then - msg_error "Failed to fetch latest release version from GitHub" - exit 1 + 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 - - 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 - - msg_info "Updating ${APP} to ${RELEASE}" - cd /opt - wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" - rm -rf /opt/fladder - unzip -q "Fladder-Web-${RELEASE#v}.zip" -d fladder - rm -f "Fladder-Web-${RELEASE#v}.zip" - echo "${RELEASE}" > ~/.fladder - msg_ok "Updated ${APP} to ${RELEASE}" - - 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!" exit } From 383cb7f5a46398d6ac7362423dfdc0e77a9feec0 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:00:18 +0700 Subject: [PATCH 30/65] use fetch_and_deploy_gh_release --- install/fladder-install.sh | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/install/fladder-install.sh b/install/fladder-install.sh index 1514dbdab..d186ff2a3 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -21,17 +21,7 @@ $STD apt install -y \ msg_ok "Installed Dependencies" msg_info "Installing ${APPLICATION}" - -# Get latest version from GitHub -RELEASE=$(get_latest_github_release "DonutWare/Fladder") - -cd /opt -$STD wget -q "https://github.com/DonutWare/Fladder/releases/download/${RELEASE}/Fladder-Web-${RELEASE#v}.zip" -$STD unzip -o "Fladder-Web-${RELEASE#v}.zip" -d fladder - -rm -f "Fladder-Web-${RELEASE#v}.zip" -echo "${RELEASE}" > ~/.fladder -msg_ok "Installed ${APPLICATION}" +fetch_and_deploy_gh_release "Fladder" "DonutWare/Fladder" "prebuild" "latest" "/opt/fladder" "Fladder-Web-*.zip" msg_info "Configuring Nginx" cat </etc/nginx/conf.d/fladder.conf From 3c4a18f969db6ba0961d5494a3649855e773c364 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:01:07 +0700 Subject: [PATCH 31/65] fix: remove checks --- ct/fladder.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ct/fladder.sh b/ct/fladder.sh index fad8c5d14..b849d3ccb 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -24,11 +24,6 @@ function update_script() { check_container_storage check_container_resources - if [[ ! -f ~/.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 From 03f028ad26315eb438bff339690319324d5e4654 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:01:59 +0700 Subject: [PATCH 32/65] Update install/fladder-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/fladder-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/fladder-install.sh b/install/fladder-install.sh index d186ff2a3..a965f9c0c 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -20,7 +20,6 @@ $STD apt install -y \ nginx msg_ok "Installed Dependencies" -msg_info "Installing ${APPLICATION}" fetch_and_deploy_gh_release "Fladder" "DonutWare/Fladder" "prebuild" "latest" "/opt/fladder" "Fladder-Web-*.zip" msg_info "Configuring Nginx" From 75db01ae9047b06dc830c79595fd9bd01e493547 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:02:10 +0700 Subject: [PATCH 33/65] Update install/fladder-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/fladder-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/fladder-install.sh b/install/fladder-install.sh index a965f9c0c..ac22c3dc1 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2025 community-scripts ORG # Author: wendyliga -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/DonutWare/Fladder source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" From f2ed885a7fef7588bd7374932d03c07357227827 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:02:18 +0700 Subject: [PATCH 34/65] Update ct/fladder.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- ct/fladder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/fladder.sh b/ct/fladder.sh index b849d3ccb..c133d3f95 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -2,7 +2,7 @@ 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/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/DonutWare/Fladder APP="Fladder" From e83b46ead99fc8106800d6a2c8deda3dea3a45ea Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:02:38 +0700 Subject: [PATCH 35/65] fix: remove unnecessary dependency installations --- install/fladder-install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/fladder-install.sh b/install/fladder-install.sh index d186ff2a3..189431a9d 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -15,8 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt install -y \ - wget \ - unzip \ nginx msg_ok "Installed Dependencies" From 7803001474db068f5eadb16b33614a3861a0a3d2 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:03:06 +0700 Subject: [PATCH 36/65] fix: remove multiline --- install/fladder-install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install/fladder-install.sh b/install/fladder-install.sh index cdc6d7da6..11c42392b 100644 --- a/install/fladder-install.sh +++ b/install/fladder-install.sh @@ -14,8 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt install -y \ - nginx +$STD apt install -y nginx msg_ok "Installed Dependencies" fetch_and_deploy_gh_release "Fladder" "DonutWare/Fladder" "prebuild" "latest" "/opt/fladder" "Fladder-Web-*.zip" From 7733532441c686795efc8de585d52dc1176f1414 Mon Sep 17 00:00:00 2001 From: Wendy Liga <16457495+wendyliga@users.noreply.github.com> Date: Sat, 27 Dec 2025 21:05:14 +0700 Subject: [PATCH 37/65] revert and improve --- ct/fladder.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ct/fladder.sh b/ct/fladder.sh index c133d3f95..39ce55c9b 100644 --- a/ct/fladder.sh +++ b/ct/fladder.sh @@ -24,6 +24,11 @@ function update_script() { 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 From f948688dda6963c9eced1eb06203e7d0b105b856 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Mon, 29 Dec 2025 22:43:58 +0100 Subject: [PATCH 38/65] Add wishlist app --- ct/headers/wishlist | 6 +++ ct/wishlist.sh | 78 ++++++++++++++++++++++++++++++ frontend/public/json/wishlist.json | 33 +++++++++++++ install/wishlist-install.sh | 68 ++++++++++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 ct/headers/wishlist create mode 100644 ct/wishlist.sh create mode 100644 frontend/public/json/wishlist.json create mode 100644 install/wishlist-install.sh diff --git a/ct/headers/wishlist b/ct/headers/wishlist new file mode 100644 index 000000000..9571bf8fe --- /dev/null +++ b/ct/headers/wishlist @@ -0,0 +1,6 @@ + _ ___ __ ___ __ +| | / (_)____/ /_ / (_)____/ /_ +| | /| / / / ___/ __ \/ / / ___/ __/ +| |/ |/ / (__ ) / / / / (__ ) /_ +|__/|__/_/____/_/ /_/_/_/____/\__/ + diff --git a/ct/wishlist.sh b/ct/wishlist.sh new file mode 100644 index 000000000..7ab5807f9 --- /dev/null +++ b/ct/wishlist.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# 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 + + NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs + + if check_for_gh_release "wishlist" "cmintey/wishlist"; then + msg_info "Stopping Service" + systemctl stop wishlist + msg_ok "Service Stopped" + + cp /opt/wishlist/.env /opt/ + cp -R /opt/wishlist/uploads /opt/ + cp -R /opt/wishlist/data /opt/ + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" + LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") + + + msg_info "Updating ${APP}" + cd /opt/wishlist || exit + + $STD pnpm install + $STD pnpm svelte-kit sync + $STD pnpm prisma generate + $STD 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 + $STD chmod +x /opt/wishlist/entrypoint.sh + + mv /opt/.env /opt/wishlist/.env + mv /opt/uploads /opt/wishlist/uploads + mv /opt/data /opt/wishlist/data + + msg_ok "Updated ${APP}" + + 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}" diff --git a/frontend/public/json/wishlist.json b/frontend/public/json/wishlist.json new file mode 100644 index 000000000..fe802a0cf --- /dev/null +++ b/frontend/public/json/wishlist.json @@ -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": null, + "config_path": "/opt/wishlist/.env", + "website": "https://github.com/cmintey/wishlist", + "logo": "https://github.com/cmintey/wishlist/blob/main/static/android-chrome-512x512.png?raw=true", + "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": [] +} diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh new file mode 100644 index 000000000..a9f35ddaf --- /dev/null +++ b/install/wishlist-install.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 tteck +# 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 git 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") + +msg_info "Installing Wishlist" +cd /opt/wishlist || exit +cat </opt/wishlist/.env + NODE_ENV=production + BODY_SIZE_LIMIT=5000000 + ORIGIN="http://0.0.0.0:3280" # The URL your users will be connecting to + TOKEN_TIME=72 # hours until signup and password reset tokens expire + DEFAULT_CURRENCY=EUR + MAX_IMAGE_SIZE=5000000 # 5 megabytes +EOF +$STD pnpm install +$STD pnpm svelte-kit sync +$STD pnpm prisma generate +$STD 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 +$STD chmod +x /opt/wishlist/entrypoint.sh +msg_ok "Installed Wishlist" + +mkdir -p /opt/wishlist/uploads +mkdir -p /opt/wishlist/data + +msg_info "Creating Service" +cat </etc/systemd/system/wishlist.service +[Unit] +Description=Wishlist Service +After=network.target + +[Service] +WorkingDirectory=/opt/wishlist +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 +echo "Edit /opt/wishlist/.env to customize settings" From 03e2c209638eec6a64be23aae3c133a73fd21c5b Mon Sep 17 00:00:00 2001 From: Marc Went Date: Tue, 30 Dec 2025 15:46:38 +0100 Subject: [PATCH 39/65] implement review suggestions by @CrazyWolf13 --- ct/headers/wishlist | 6 ------ ct/wishlist.sh | 19 +++++++++---------- frontend/public/json/wishlist.json | 11 ++++++++--- install/wishlist-install.sh | 15 +++++++++------ 4 files changed, 26 insertions(+), 25 deletions(-) delete mode 100644 ct/headers/wishlist diff --git a/ct/headers/wishlist b/ct/headers/wishlist deleted file mode 100644 index 9571bf8fe..000000000 --- a/ct/headers/wishlist +++ /dev/null @@ -1,6 +0,0 @@ - _ ___ __ ___ __ -| | / (_)____/ /_ / (_)____/ /_ -| | /| / / / ___/ __ \/ / / ___/ __/ -| |/ |/ / (__ ) / / / / (__ ) /_ -|__/|__/_/____/_/ /_/_/_/____/\__/ - diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 7ab5807f9..963a68537 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +source <(curl -fsSL https://raw.githubusercontent.com/Dunky13/ProxmoxVE/refs/heads/feature/wishlist/misc/build.func) # Copyright (c) 2021-2025 tteck # Author: Dunky13 # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE @@ -27,34 +27,33 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs - 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 "Service Stopped" + msg_ok "Stopped Service" - cp /opt/wishlist/.env /opt/ + cp /opt/wishlist/.env /opt/wishlist.env cp -R /opt/wishlist/uploads /opt/ cp -R /opt/wishlist/data /opt/ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") - msg_info "Updating ${APP}" - cd /opt/wishlist || exit + cd /opt/wishlist $STD pnpm install $STD pnpm svelte-kit sync $STD pnpm prisma generate - $STD sed -i 's|/usr/src/app/|/opt/wishlist/|g' $(grep -rl '/usr/src/app/' /opt/wishlist) + 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 - $STD chmod +x /opt/wishlist/entrypoint.sh + chmod +x /opt/wishlist/entrypoint.sh - mv /opt/.env /opt/wishlist/.env + mv /opt/wishlist.env /opt/wishlist/.env mv /opt/uploads /opt/wishlist/uploads mv /opt/data /opt/wishlist/data diff --git a/frontend/public/json/wishlist.json b/frontend/public/json/wishlist.json index fe802a0cf..ce1e351a9 100644 --- a/frontend/public/json/wishlist.json +++ b/frontend/public/json/wishlist.json @@ -7,10 +7,10 @@ "updateable": true, "privileged": false, "interface_port": 3280, - "documentation": null, + "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://github.com/cmintey/wishlist/blob/main/static/android-chrome-512x512.png?raw=true", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/cmintey-wishlist.png", "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": [ { @@ -29,5 +29,10 @@ "username": null, "password": null }, - "notes": [] + "notes": [ + { + "text": "Edit /opt/wishlist/.env in the LXC container to customize settings. Restart the container after making changes.", + "type": "info" + } + ] } diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index a9f35ddaf..e0c09ede9 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -22,7 +22,8 @@ fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") msg_info "Installing Wishlist" -cd /opt/wishlist || exit +cd /opt/wishlist + cat </opt/wishlist/.env NODE_ENV=production BODY_SIZE_LIMIT=5000000 @@ -31,19 +32,21 @@ cat </opt/wishlist/.env DEFAULT_CURRENCY=EUR MAX_IMAGE_SIZE=5000000 # 5 megabytes EOF + $STD pnpm install $STD pnpm svelte-kit sync $STD pnpm prisma generate -$STD 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}" +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 -$STD chmod +x /opt/wishlist/entrypoint.sh -msg_ok "Installed Wishlist" +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 </etc/systemd/system/wishlist.service From c80b5c4f51ab8217a7b8509d64648a68c8fa0ded Mon Sep 17 00:00:00 2001 From: Marc Went Date: Tue, 30 Dec 2025 15:59:30 +0100 Subject: [PATCH 40/65] forgotten one echo, cleaned up --- install/wishlist-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index e0c09ede9..44cb20954 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -68,4 +68,3 @@ msg_ok "Created Service" motd_ssh customize cleanup_lxc -echo "Edit /opt/wishlist/.env to customize settings" From 0e76224d4a57e464e8cccd4e0d32fbd18d1deb6b Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 16:31:58 +0100 Subject: [PATCH 41/65] Load in .env on startup, app doesn't use dotenv apparently --- install/wishlist-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index 44cb20954..d6dbea7ba 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -56,7 +56,7 @@ After=network.target [Service] WorkingDirectory=/opt/wishlist -ExecStart=/usr/bin/env sh -c './entrypoint.sh' +ExecStart=/usr/bin/env bash -c '[ -f /opt/wishlist/.env ] && { set -a; . /opt/wishlist/.env || true; set +a;}; ./entrypoint.sh' Restart=on-failure [Install] From 5a987efb62dd2b99b483ea5a260d6a8899f8a985 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 20:35:40 +0100 Subject: [PATCH 42/65] all but one request changed - testing last one --- ct/wishlist.sh | 16 +++++++++------- frontend/public/json/wishlist.json | 2 +- install/wishlist-install.sh | 22 ++++++++++++---------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 963a68537..1255759e0 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/Dunky13/ProxmoxVE/refs/heads/feature/wishlist/misc/build.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) # Copyright (c) 2021-2025 tteck # Author: Dunky13 # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE @@ -34,9 +34,11 @@ function update_script() { systemctl stop wishlist msg_ok "Stopped Service" - cp /opt/wishlist/.env /opt/wishlist.env - cp -R /opt/wishlist/uploads /opt/ - cp -R /opt/wishlist/data /opt/ + 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") @@ -53,9 +55,9 @@ function update_script() { $STD pnpm prune --prod chmod +x /opt/wishlist/entrypoint.sh - mv /opt/wishlist.env /opt/wishlist/.env - mv /opt/uploads /opt/wishlist/uploads - mv /opt/data /opt/wishlist/data + mv /opt/wishlist-backup/.env /opt/wishlist/.env + mv /opt/wishlist-backup/uploads /opt/wishlist/uploads + mv /opt/wishlist-backup/data /opt/wishlist/data msg_ok "Updated ${APP}" diff --git a/frontend/public/json/wishlist.json b/frontend/public/json/wishlist.json index ce1e351a9..e9b7dba80 100644 --- a/frontend/public/json/wishlist.json +++ b/frontend/public/json/wishlist.json @@ -10,7 +10,7 @@ "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/png/cmintey-wishlist.png", + "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": [ { diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index d6dbea7ba..6282d269d 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -14,7 +14,12 @@ network_check update_os msg_info "Installing dependencies" -$STD apt install -y build-essential python3 openssl git caddy +$STD apt install -y \ + build-essential \ + python3 \ + openssl \ + git \ + caddy msg_ok "Installed dependencies" NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs @@ -23,21 +28,18 @@ LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") msg_info "Installing Wishlist" cd /opt/wishlist - cat </opt/wishlist/.env - NODE_ENV=production - BODY_SIZE_LIMIT=5000000 - ORIGIN="http://0.0.0.0:3280" # The URL your users will be connecting to - TOKEN_TIME=72 # hours until signup and password reset tokens expire - DEFAULT_CURRENCY=EUR - MAX_IMAGE_SIZE=5000000 # 5 megabytes +NODE_ENV=production +BODY_SIZE_LIMIT=5000000 +ORIGIN="http://0.0.0.0:3280" # The URL your users will be connecting to +TOKEN_TIME=72 # hours until signup and password reset tokens expire +DEFAULT_CURRENCY=EUR +MAX_IMAGE_SIZE=5000000 # 5 megabytes EOF - $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 From 0def93e9d8b42f45cc2c0747f8e375d7fe77010b Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 20:56:56 +0100 Subject: [PATCH 43/65] fix env file loading --- install/wishlist-install.sh | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index 6282d269d..09cde7218 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -28,14 +28,8 @@ LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") msg_info "Installing Wishlist" cd /opt/wishlist -cat </opt/wishlist/.env -NODE_ENV=production -BODY_SIZE_LIMIT=5000000 -ORIGIN="http://0.0.0.0:3280" # The URL your users will be connecting to -TOKEN_TIME=72 # hours until signup and password reset tokens expire -DEFAULT_CURRENCY=EUR -MAX_IMAGE_SIZE=5000000 # 5 megabytes -EOF +cp .env.example .env +echo "NODE_ENV=production" >> /opt/wishlist/.env $STD pnpm install $STD pnpm svelte-kit sync $STD pnpm prisma generate @@ -58,7 +52,8 @@ After=network.target [Service] WorkingDirectory=/opt/wishlist -ExecStart=/usr/bin/env bash -c '[ -f /opt/wishlist/.env ] && { set -a; . /opt/wishlist/.env || true; set +a;}; ./entrypoint.sh' +EnvironmentFile=/opt/wishlist/.env +ExecStart=/usr/bin/env sh -c './entrypoint.sh' Restart=on-failure [Install] From 61ef62b67d381ba5c51f62a06750ab1170c83fb1 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 21:11:49 +0100 Subject: [PATCH 44/65] next round of review implementation --- ct/wishlist.sh | 6 +++--- install/wishlist-install.sh | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 1255759e0..9a304d5ec 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -55,9 +55,9 @@ function update_script() { $STD pnpm prune --prod chmod +x /opt/wishlist/entrypoint.sh - mv /opt/wishlist-backup/.env /opt/wishlist/.env - mv /opt/wishlist-backup/uploads /opt/wishlist/uploads - mv /opt/wishlist-backup/data /opt/wishlist/data + 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 ${APP}" diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index 09cde7218..38a75eb5b 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -18,7 +18,6 @@ $STD apt install -y \ build-essential \ python3 \ openssl \ - git \ caddy msg_ok "Installed dependencies" From faafa260611e935a5650a541233b05d88c418634 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 21:20:19 +0100 Subject: [PATCH 45/65] fix styling --- ct/wishlist.sh | 7 ++----- install/wishlist-install.sh | 1 - 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 9a304d5ec..63e9e2db4 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -42,7 +42,7 @@ function update_script() { CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") - msg_info "Updating ${APP}" + msg_info "Updating Wishlist" cd /opt/wishlist $STD pnpm install @@ -54,13 +54,10 @@ function update_script() { $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 ${APP}" - + msg_ok "Updated Wishlist" msg_info "Starting Service" systemctl start wishlist msg_ok "Started Service" diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index 38a75eb5b..b60b1e13c 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -38,7 +38,6 @@ export SHA="${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" From 9693c9c3e88094fff25baab9f91406c5915d31fc Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:10:09 +0100 Subject: [PATCH 46/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 3ddceaba9..ff93662e4 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -95,8 +95,6 @@ printf "* * * * * cd /var/www/MintHCM/legacy; php -f cron.php > service cron start rm -f /var/www/MintHCM/configMint4 - - motd_ssh customize cleanup_lxc From 5eec7b6a3feae411cd0962b01c90ebae7cc1cf47 Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:10:22 +0100 Subject: [PATCH 47/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index ff93662e4..5d27c613f 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -51,7 +51,6 @@ setup_deb822_repo \ "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 From 52ee636f29063fffd3c3e245ad23094e7fcd98ed Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:10:52 +0100 Subject: [PATCH 48/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 5d27c613f..8a2342187 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -62,16 +62,15 @@ 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 for MintHCM" +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;" -msg_ok "Configured MariaDB for MintHCM" - 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" From 4b364470899985cec4c209020dd9a8bbe2746b90 Mon Sep 17 00:00:00 2001 From: MintHCM <51930758+MintHCM-admin@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:11:21 +0100 Subject: [PATCH 49/65] Update install/minthcm-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/minthcm-install.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh index 8a2342187..a6eed1129 100644 --- a/install/minthcm-install.sh +++ b/install/minthcm-install.sh @@ -77,21 +77,19 @@ msg_ok "Configured MariaDB" echo "MariaDB Password: $DB_PASS" } >>~/minthcm.creds -msg_info "Generating MintHCM configuration file (configMint4)" +msg_info "Generating configuration file" set -a source /var/www/script/.env set +a php /var/www/script/generate_config.php -msg_ok "Generated MintHCM configuration file (configMint4)" +msg_ok "Generated configuration file" -msg_info "Starting MintHCM installation..." +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 - -msg_ok "MintHCM installation completed!" -msg_info "Configuring cron for MintHCM" 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 From a1eabc37118eac77ef065602b437b7e06c9dcdc0 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Wed, 7 Jan 2026 12:50:59 +0100 Subject: [PATCH 50/65] logo change --- frontend/public/json/minthcm.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/minthcm.json b/frontend/public/json/minthcm.json index a901a7cb3..8658ac9ca 100644 --- a/frontend/public/json/minthcm.json +++ b/frontend/public/json/minthcm.json @@ -12,7 +12,7 @@ "documentation": "https://wiki.minthcm.org/", "config_path": "/var/www/MintHCM", "website": "https://minthcm.org/", - "logo": "https://minthcm.org/wp-content/uploads/2021/03/minthcm-logo.svg", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/minthcm.svg", "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, iOS & Android mobile apps. Mint based on two popular, well-known business applications: SugarCRM Community Edition and SuiteCRM. This is why we often say that MintHCM is CRM reinvented.", "install_methods": [ { From dc5a033f44368f8958d1e0bc0c04189929d65fb4 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Wed, 7 Jan 2026 15:02:42 +0100 Subject: [PATCH 51/65] minor tweak, not stripping v from version --- ct/wishlist.sh | 2 +- install/wishlist-install.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 63e9e2db4..866a7fb2c 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -40,7 +40,7 @@ function update_script() { 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") + LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false) msg_info "Updating Wishlist" cd /opt/wishlist diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index b60b1e13c..9e6683e9b 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -23,7 +23,7 @@ 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") +LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false) msg_info "Installing Wishlist" cd /opt/wishlist @@ -33,8 +33,8 @@ $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}" +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 From 2c348d4d94fc7b61568cd5fe16e2e12dc6337bf1 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:23:36 +0100 Subject: [PATCH 52/65] Automate VM provisioning via serial console Replaces SSH-based installation with serial console automation using a new send_line_to_vm function. The script now logs in, installs Podman, downloads and installs UniFi OS Server, and retrieves the VM IP address directly via the console. This simplifies the process and removes SSH and sshpass dependencies. --- vm/unifi-os-server-vm.sh | 239 ++++++++++++++++++++------------------- 1 file changed, 122 insertions(+), 117 deletions(-) diff --git a/vm/unifi-os-server-vm.sh b/vm/unifi-os-server-vm.sh index 7ea19eb4f..134a8b9ad 100644 --- a/vm/unifi-os-server-vm.sh +++ b/vm/unifi-os-server-vm.sh @@ -107,6 +107,77 @@ function cleanup_vmid() { fi } +function send_line_to_vm() { + local line="$1" + echo -e "${DGN}Sending: ${YW}${line}${CL}" + 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 +300,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 +309,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 /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 "") - + 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 - 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" + if [ -n "$VM_IP" ]; then + msg_ok "VM IP Address: ${VM_IP}" else - echo "⚠ Service status:" - systemctl status unifi-os-server --no-pager || true + msg_info "IP address will be shown in VM console" + send_line_to_vm "ip -4 addr show | grep inet | grep -v 127.0.0.1" 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://: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 From 6173f5316e96f6a37ac4cbd4b91aec74cafa71ea Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:35:58 +0100 Subject: [PATCH 53/65] Update unifi-os-server-vm.sh --- vm/unifi-os-server-vm.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/vm/unifi-os-server-vm.sh b/vm/unifi-os-server-vm.sh index 134a8b9ad..c3ed0369f 100644 --- a/vm/unifi-os-server-vm.sh +++ b/vm/unifi-os-server-vm.sh @@ -109,7 +109,6 @@ function cleanup_vmid() { function send_line_to_vm() { local line="$1" - echo -e "${DGN}Sending: ${YW}${line}${CL}" for ((i = 0; i < ${#line}; i++)); do character=${line:i:1} case $character in From e4c30ebca5003b9bbdba0ae363e0f8645f94890b Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:53:40 +0100 Subject: [PATCH 54/65] ip --- vm/unifi-os-server-vm.sh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/vm/unifi-os-server-vm.sh b/vm/unifi-os-server-vm.sh index c3ed0369f..33aa1619b 100644 --- a/vm/unifi-os-server-vm.sh +++ b/vm/unifi-os-server-vm.sh @@ -787,11 +787,20 @@ if [ "$START_VM" == "yes" ]; then sleep 300 msg_ok "UniFi OS Server installed" - # Step 4: Get IP address for final message + # 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" - sleep 5 VM_IP="" - for i in {1..30}; do + 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 @@ -802,8 +811,7 @@ if [ "$START_VM" == "yes" ]; then if [ -n "$VM_IP" ]; then msg_ok "VM IP Address: ${VM_IP}" else - msg_info "IP address will be shown in VM console" - send_line_to_vm "ip -4 addr show | grep inet | grep -v 127.0.0.1" + msg_info "Could not detect IP - check VM console" fi echo "" From b09d6de6819f3517c91b8de0fa722b5954c64adb Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 7 Jan 2026 17:54:29 +0100 Subject: [PATCH 55/65] ram --- vm/unifi-os-server-vm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/unifi-os-server-vm.sh b/vm/unifi-os-server-vm.sh index 33aa1619b..bce838602 100644 --- a/vm/unifi-os-server-vm.sh +++ b/vm/unifi-os-server-vm.sh @@ -341,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="" From aca555c06863da0d2caa1c47b7d71e43f6bcdbf3 Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 19:23:25 +0100 Subject: [PATCH 56/65] add GWN Manager script --- ct/gwn-manager.sh | 42 +++++++++++++++++++++++++++ install/gwn-manager-install.sh | 52 ++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 ct/gwn-manager.sh create mode 100644 install/gwn-manager-install.sh diff --git a/ct/gwn-manager.sh b/ct/gwn-manager.sh new file mode 100644 index 000000000..73d0938b8 --- /dev/null +++ b/ct/gwn-manager.sh @@ -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_info "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}" diff --git a/install/gwn-manager-install.sh b/install/gwn-manager-install.sh new file mode 100644 index 000000000..6e3bd6f73 --- /dev/null +++ b/install/gwn-manager-install.sh @@ -0,0 +1,52 @@ +#!/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" +RELEASE=$(curl -s https://www.grandstream.com/support/tools#gwntools \ + | grep -oP 'https://firmware\.grandstream\.com/GWN_Manager-[^"]+-Ubuntu\.tar\.gz') +download_with_progress "$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 </etc/systemd/system/gwnmanager.service +[Unit] +Description=GWN Manager +After=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 --now gwnmanager +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 2d0131288d5b9b9a482e1b10ba0e38bccb3cf59d Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 19:30:50 +0100 Subject: [PATCH 57/65] update GWN Manager --- ct/gwn-manager.sh | 2 +- frontend/public/json/gwn-manager.json | 35 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 frontend/public/json/gwn-manager.json diff --git a/ct/gwn-manager.sh b/ct/gwn-manager.sh index 73d0938b8..03c9a086d 100644 --- a/ct/gwn-manager.sh +++ b/ct/gwn-manager.sh @@ -5,7 +5,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV # 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" +APP="GWN-Manager" var_tags="${var_tags:-network;management}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-6144}" diff --git a/frontend/public/json/gwn-manager.json b/frontend/public/json/gwn-manager.json new file mode 100644 index 000000000..1a78754de --- /dev/null +++ b/frontend/public/json/gwn-manager.json @@ -0,0 +1,35 @@ +{ + "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": "", + "description": "GWN Manager is a web-based management interface for GrandStream GWN series devices.", + "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": [] +} From 58381e11dee90b01a72ca01e431e068cf0d4aa7e Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 20:03:02 +0100 Subject: [PATCH 58/65] finish GWN Manager script --- frontend/public/json/gwn-manager.json | 7 ++++++- install/gwn-manager-install.sh | 7 ++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/public/json/gwn-manager.json b/frontend/public/json/gwn-manager.json index 1a78754de..83d86b9ba 100644 --- a/frontend/public/json/gwn-manager.json +++ b/frontend/public/json/gwn-manager.json @@ -31,5 +31,10 @@ "username": null, "password": null }, - "notes": [] + "notes": [ + { + "text": "Gentoo compiles packages from source. Initial setup may take time.", + "type": "warning" + } + ] } diff --git a/install/gwn-manager-install.sh b/install/gwn-manager-install.sh index 6e3bd6f73..72b5b7603 100644 --- a/install/gwn-manager-install.sh +++ b/install/gwn-manager-install.sh @@ -19,10 +19,10 @@ $STD apt install -y \ fontconfig msg_ok "Installed Dependencies" -msg_info "Setting up GWN Manager" +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_with_progress "$RELEASE" "/tmp/gwnmanager.tar.gz" +download_file "$RELEASE" "/tmp/gwnmanager.tar.gz" cd /tmp tar -xzf gwnmanager.tar.gz --strip-components=1 $STD ./install @@ -33,6 +33,7 @@ cat </etc/systemd/system/gwnmanager.service [Unit] Description=GWN Manager After=network.target +Requires=network.target [Service] Type=simple @@ -44,7 +45,7 @@ RestartSec=10 [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now gwnmanager +systemctl enable -q gwnmanager msg_ok "Created Service" motd_ssh From 619015e68f00493c5be7a937d75141b665ca790a Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 20:36:02 +0100 Subject: [PATCH 59/65] finish GWN Manager script --- ct/gwn-manager.sh | 2 +- frontend/public/json/gwn-manager.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ct/gwn-manager.sh b/ct/gwn-manager.sh index 03c9a086d..3c63e2c68 100644 --- a/ct/gwn-manager.sh +++ b/ct/gwn-manager.sh @@ -28,7 +28,7 @@ function update_script() { exit fi - msg_info "Application is updated via the web interface!" + msg_ok "Application is updated via the web interface!" exit } diff --git a/frontend/public/json/gwn-manager.json b/frontend/public/json/gwn-manager.json index 83d86b9ba..39f0f53ae 100644 --- a/frontend/public/json/gwn-manager.json +++ b/frontend/public/json/gwn-manager.json @@ -12,8 +12,8 @@ "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": "", - "description": "GWN Manager is a web-based management interface for GrandStream GWN series devices.", + "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", @@ -33,8 +33,8 @@ }, "notes": [ { - "text": "Gentoo compiles packages from source. Initial setup may take time.", - "type": "warning" + "text": "Installation package is pulled from GrandStream website. Installation may take a while.", + "type": "info" } ] } From 5d03b3cedcfad8066c8524d71fe59008e763afa3 Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 21:29:30 +0100 Subject: [PATCH 60/65] fix RoMM release fetching --- install/romm-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/romm-install.sh b/install/romm-install.sh index 654099eaf..1f442c10f 100644 --- a/install/romm-install.sh +++ b/install/romm-install.sh @@ -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 From a8fcd742b5033146cb1301e65e92aebb9abbd596 Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 21:32:39 +0100 Subject: [PATCH 61/65] add cronmaster ct --- ct/cronmaster.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 ct/cronmaster.sh diff --git a/ct/cronmaster.sh b/ct/cronmaster.sh new file mode 100644 index 000000000..2c95f9afd --- /dev/null +++ b/ct/cronmaster.sh @@ -0,0 +1,46 @@ +#!/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:-4}" +var_ram="${var_ram:-8192}" +var_disk="${var_disk:-20}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" +var_gpu="${var_gpu:-yes}" +#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!" From 386a13d727955316ba93a7eb1b1af8d82258a10b Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 21:33:38 +0100 Subject: [PATCH 62/65] add cronmaster ct --- ct/cronmaster.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ct/cronmaster.sh b/ct/cronmaster.sh index 2c95f9afd..7a2e0ac50 100644 --- a/ct/cronmaster.sh +++ b/ct/cronmaster.sh @@ -7,13 +7,12 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxV APP="CRONMASTER" var_tags="${var_tags:-}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-8192}" -var_disk="${var_disk:-20}" +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_gpu="${var_gpu:-yes}" #var_fuse="${var_fuse:-no}" #var_tun="${var_tun:-no}" From f3a5fa89282bfcd69af7b324114dd0544cbfafe6 Mon Sep 17 00:00:00 2001 From: Tom Frenzel Date: Thu, 8 Jan 2026 09:51:36 +0100 Subject: [PATCH 63/65] kutt: fix build.func and config location --- ct/kutt.sh | 2 +- frontend/public/json/kutt.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/kutt.sh b/ct/kutt.sh index f1bc257bf..79b1c2671 100644 --- a/ct/kutt.sh +++ b/ct/kutt.sh @@ -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 diff --git a/frontend/public/json/kutt.json b/frontend/public/json/kutt.json index f4c8186c7..1200e34ae 100644 --- a/frontend/public/json/kutt.json +++ b/frontend/public/json/kutt.json @@ -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.", From 77096ad62bdb3405cac16b800083977ea2eceac9 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 8 Jan 2026 10:18:40 +0100 Subject: [PATCH 64/65] shorten description and change to webp --- frontend/public/json/minthcm.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/public/json/minthcm.json b/frontend/public/json/minthcm.json index 8658ac9ca..dcc1527ef 100644 --- a/frontend/public/json/minthcm.json +++ b/frontend/public/json/minthcm.json @@ -12,8 +12,8 @@ "documentation": "https://wiki.minthcm.org/", "config_path": "/var/www/MintHCM", "website": "https://minthcm.org/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/minthcm.svg", - "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, iOS & Android mobile apps. Mint based on two popular, well-known business applications: SugarCRM Community Edition and SuiteCRM. This is why we often say that MintHCM is CRM reinvented.", + "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", From 0b73dfe1b2271a13a4a07cb227ff9f4d7b02df3a Mon Sep 17 00:00:00 2001 From: Marc Went Date: Fri, 9 Jan 2026 10:11:03 +0100 Subject: [PATCH 65/65] fix review --- ct/wishlist.sh | 2 +- frontend/public/json/wishlist.json | 7 +------ install/wishlist-install.sh | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 866a7fb2c..2285ef6f3 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2025 tteck +# 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 diff --git a/frontend/public/json/wishlist.json b/frontend/public/json/wishlist.json index e9b7dba80..3024b6e72 100644 --- a/frontend/public/json/wishlist.json +++ b/frontend/public/json/wishlist.json @@ -29,10 +29,5 @@ "username": null, "password": null }, - "notes": [ - { - "text": "Edit /opt/wishlist/.env in the LXC container to customize settings. Restart the container after making changes.", - "type": "info" - } - ] + "notes": [] } diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh index 9e6683e9b..3c5b9025d 100644 --- a/install/wishlist-install.sh +++ b/install/wishlist-install.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 tteck +# 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