From 747d0904c0bc232ea88920eda4138a8bb1a79424 Mon Sep 17 00:00:00 2001 From: hoholms Date: Thu, 11 Dec 2025 22:24:54 +0200 Subject: [PATCH 001/129] 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 002/129] 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 003/129] 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 cadb58e7b3382587e53e7154c1014cb667791205 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Dec 2025 08:36:59 +0000 Subject: [PATCH 004/129] Add NetBird scripts with correct ProxmoxVED source URL Fix the build.func source URL to use ProxmoxVED instead of ProxmoxVE, allowing the scripts to actually run in this repository. --- ct/netbird.sh | 48 ++++++++ frontend/public/json/netbird.json | 50 ++++++++ install/netbird-install.sh | 193 ++++++++++++++++++++++++++++++ 3 files changed, 291 insertions(+) create mode 100644 ct/netbird.sh create mode 100644 frontend/public/json/netbird.json create mode 100644 install/netbird-install.sh diff --git a/ct/netbird.sh b/ct/netbird.sh new file mode 100644 index 000000000..7ad572a45 --- /dev/null +++ b/ct/netbird.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: TechHutTV +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://netbird.io/ + +APP="NetBird" +var_tags="network;vpn" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="13" +var_unprivileged="1" +var_tun="${var_tun:-yes}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { +header_info +check_container_storage +check_container_resources + +if [[ ! -f /etc/netbird/config.json ]]; then +msg_error "No ${APP} Installation Found!" +exit +fi + +msg_info "Updating ${APP}" +$STD apt update +$STD apt -y upgrade +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 NetBird by entering the container and running:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}netbird up${CL}" diff --git a/frontend/public/json/netbird.json b/frontend/public/json/netbird.json new file mode 100644 index 000000000..7fcefd128 --- /dev/null +++ b/frontend/public/json/netbird.json @@ -0,0 +1,50 @@ +{ + "name": "NetBird", + "slug": "netbird", + "categories": [4], + "date_created": "2025-12-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://docs.netbird.io/", + "website": "https://netbird.io/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@master/webp/netbird.webp", + "config_path": "/etc/netbird/config.json", + "description": "NetBird is an open-source VPN management platform that creates secure peer-to-peer networks using WireGuard. It enables secure connectivity between devices anywhere in the world without complex firewall configurations or port forwarding. NetBird offers features like zero-configuration networking, SSO integration, access control policies, and a centralized management dashboard. It's designed to be simple to deploy and manage, making it ideal for connecting remote teams, securing IoT devices, or building secure infrastructure networks.", + "install_methods": [ + { + "type": "default", + "script": "ct/netbird.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The NetBird client (agent) allows a peer to join a pre-existing NetBird deployment. If a NetBird deployment is not yet available, there are both managed and self-hosted options available.", + "type": "info" + }, + { + "text": "After installation, enter the container and run `netbird` to to view the commands.", + "type": "info" + }, + { + "text": "Use a Setup Key from your NetBird dashboard or SSO login to authenticate during setup or in the container.", + "type": "info" + }, + { + "text": "Check connection status with `netbird status`.", + "type": "info" + } + ] +} diff --git a/install/netbird-install.sh b/install/netbird-install.sh new file mode 100644 index 000000000..0bbff962f --- /dev/null +++ b/install/netbird-install.sh @@ -0,0 +1,193 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: TechHutTV +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://netbird.io/ + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +echo "" +echo ' _ _ _____ _____ ____ _ _ _____ ____ ' +echo '| \ | ||_ _| ____| _ \| | | | ____| _ \' +echo '| \| | _ | | | _| |_| |_ _ __ __ _| | | \' +echo '| . ` |/ _ \ | | |_ | __ <| | \'__/ _` | | | \' +echo '| |\ | __/ |_| |__| |_) | | | | (__ | |_| |' +echo '|_| \_|\___|\___|\__|____/|_|_| \___|\_____/' +echo "" + +msg_info "Installing Dependencies" +$STD apt install -y \ +curl \ +ca-certificates \ +gnupg +msg_ok "Installed Dependencies" + +msg_info "Setting up NetBird Repository" +curl -sSL https://pkgs.netbird.io/debian/public.key \ +| gpg --dearmor -o /usr/share/keyrings/netbird-archive-keyring.gpg +chmod 0644 /usr/share/keyrings/netbird-archive-keyring.gpg +echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' \ +| tee /etc/apt/sources.list.d/netbird.list > /dev/null +$STD apt update +msg_ok "Set up NetBird Repository" + +msg_info "Installing NetBird" +$STD apt install -y netbird +msg_ok "Installed NetBird" + +msg_info "Enabling NetBird Service" +$STD netbird service install 2>/dev/null || true +$STD netbird service start 2>/dev/null || true +$STD systemctl enable netbird +msg_ok "Enabled NetBird Service" + +# NetBird Deployment Type Selection + +echo "" +echo -e "${BL}NetBird Deployment Type${CL}" +echo "─────────────────────────────────────────" +echo "Are you using NetBird Managed or Self-Hosted?" +echo "" +echo " 1) NetBird Managed (default) - Use NetBird's managed service" +echo " 2) Self-Hosted - Use your own NetBird management server" +echo "" + +read -rp "Select deployment type [1]: " DEPLOYMENT_TYPE +DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}" + +NETBIRD_MGMT_URL="" +case "$DEPLOYMENT_TYPE" in +1) +msg_info "Using NetBird Managed service" +;; +2) +echo "" +echo -e "${BL}Self-Hosted Configuration${CL}" +echo "─────────────────────────────────────────" +echo "Enter your NetBird management server URL." +echo "Example: https://management.example.com" +echo "" +read -rp "Management URL: " NETBIRD_MGMT_URL + +if [[ -z "$NETBIRD_MGMT_URL" ]]; then +msg_warn "No management URL provided. Run 'netbird up --management-url ' within the container to connect." +else +# Ensure URL doesn't end with trailing slash +NETBIRD_MGMT_URL="${NETBIRD_MGMT_URL%/}" +msg_info "Management URL configured: ${GN}${NETBIRD_MGMT_URL}${CL}" +fi +;; +*) +msg_warn "Invalid selection. Using NetBird Managed service." +;; +esac + +# NetBird Connection Setup + +echo "" +echo -e "${BL}NetBird Connection Setup${CL}" +echo "─────────────────────────────────────────" +echo "Choose how to connect to your NetBird network:" +echo "" +echo " 1) Setup Key (default) - Use a pre-generated setup key" +echo " 2) SSO Login - Authenticate via browser with your identity provider" +echo " 3) Skip - Configure later with 'netbird up'" +echo "" + +read -rp "Select authentication method [1]: " AUTH_METHOD +AUTH_METHOD="${AUTH_METHOD:-1}" + +case "$AUTH_METHOD" in +1) +# Setup Key authentication +echo "" +echo "Enter your NetBird setup key from the NetBird dashboard." +echo "" +read -rp "Setup key: " NETBIRD_SETUP_KEY +echo "" + +if [[ -z "$NETBIRD_SETUP_KEY" ]]; then +if [[ -n "$NETBIRD_MGMT_URL" ]]; then +msg_warn "No setup key provided. Run 'netbird up -k --management-url $NETBIRD_MGMT_URL' within the container to connect." +else +msg_warn "No setup key provided. Run 'netbird up -k ' within the container to connect." +fi +else +echo -e "Setup key: ${GN}${NETBIRD_SETUP_KEY}${CL}" +read -rp "Press Enter to continue or Ctrl+C to cancel..." + +msg_info "Connecting to NetBird with setup key" +if [[ -n "$NETBIRD_MGMT_URL" ]]; then +if netbird up -k "$NETBIRD_SETUP_KEY" --management-url "$NETBIRD_MGMT_URL"; then +msg_ok "Connected to NetBird" +else +msg_warn "Connection failed. Run 'netbird up -k --management-url $NETBIRD_MGMT_URL' within the container to retry." +fi +else +if netbird up -k "$NETBIRD_SETUP_KEY"; then +msg_ok "Connected to NetBird" +else +msg_warn "Connection failed. Run 'netbird up -k ' within the container to retry." +fi +fi +fi +;; +2) +# SSO authentication +echo "" +echo -e "${BL}SSO Authentication${CL}" +echo "─────────────────────────────────────────" +echo "A login URL will appear below." +echo "Copy the URL and open it in your browser to authenticate." +echo "" + +msg_info "Starting SSO login" +if [[ -n "$NETBIRD_MGMT_URL" ]]; then +netbird login --management-url "$NETBIRD_MGMT_URL" 2>&1 || true +else +netbird login 2>&1 || true +fi +echo "" + +msg_info "Connecting to NetBird" +if [[ -n "$NETBIRD_MGMT_URL" ]]; then +if netbird up --management-url "$NETBIRD_MGMT_URL"; then +msg_ok "Connected to NetBird" +else +msg_warn "Connection failed. Run 'netbird up --management-url $NETBIRD_MGMT_URL' within the container to retry." +fi +else +if netbird up; then +msg_ok "Connected to NetBird" +else +msg_warn "Connection failed. Run 'netbird up' within the container to retry." +fi +fi +;; +3) +msg_info "Skipping NetBird connection" +if [[ -n "$NETBIRD_MGMT_URL" ]]; then +msg_ok "Run 'netbird up --management-url $NETBIRD_MGMT_URL' within the container to connect." +else +msg_ok "Run 'netbird up' within the container to connect." +fi +;; +*) +msg_warn "Invalid selection. Run 'netbird up' within the container to connect." +;; +esac + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt -y autoremove +$STD apt -y autoclean +msg_ok "Cleaned" From 00a837b623d562da4774048e7751fd25fbff35a3 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Dec 2025 08:50:30 +0000 Subject: [PATCH 005/129] Fix ASCII banner syntax error in netbird-install.sh Use heredoc instead of echo statements to avoid backslash escaping issues that caused bash parsing errors. --- install/netbird-install.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 0bbff962f..95612de20 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -13,14 +13,15 @@ setting_up_container network_check update_os -echo "" -echo ' _ _ _____ _____ ____ _ _ _____ ____ ' -echo '| \ | ||_ _| ____| _ \| | | | ____| _ \' -echo '| \| | _ | | | _| |_| |_ _ __ __ _| | | \' -echo '| . ` |/ _ \ | | |_ | __ <| | \'__/ _` | | | \' -echo '| |\ | __/ |_| |__| |_) | | | | (__ | |_| |' -echo '|_| \_|\___|\___|\__|____/|_|_| \___|\_____/' -echo "" +cat <<'EOF' + + _ _ _ ____ _ _ +| \ | | ___| |_| __ )(_)_ __ __| | +| \| |/ _ \ __| _ \| | '__/ _` | +| |\ | __/ |_| |_) | | | | (_| | +|_| \_|\___|\__|____/|_|_| \__,_| + +EOF msg_info "Installing Dependencies" $STD apt install -y \ From a810fa2718fd13463b285d52d4fce81d267e181a Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Dec 2025 08:58:35 +0000 Subject: [PATCH 006/129] Simplify NetBird service enablement --- install/netbird-install.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 95612de20..675225bbd 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -44,9 +44,7 @@ $STD apt install -y netbird msg_ok "Installed NetBird" msg_info "Enabling NetBird Service" -$STD netbird service install 2>/dev/null || true -$STD netbird service start 2>/dev/null || true -$STD systemctl enable netbird +$STD systemctl enable --now netbird msg_ok "Enabled NetBird Service" # NetBird Deployment Type Selection From b9534031c38c75ef65af41cb942e75c604e2ca41 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 10:07:52 +0100 Subject: [PATCH 007/129] 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 7f5f7f4c1fcce828f8edc4d569c6d81cc1a26059 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Dec 2025 09:13:46 +0000 Subject: [PATCH 008/129] Simplify NetBird scripts for proper container setup - Use ${var:-default} pattern for all variables to enable advanced mode - Remove interactive prompts that blocked automated installs - Use cleanup_lxc instead of manual apt cleanup - Users configure NetBird with 'netbird up' after container creation --- ct/netbird.sh | 14 +-- install/netbird-install.sh | 172 +++---------------------------------- 2 files changed, 17 insertions(+), 169 deletions(-) diff --git a/ct/netbird.sh b/ct/netbird.sh index 7ad572a45..4b5714756 100644 --- a/ct/netbird.sh +++ b/ct/netbird.sh @@ -7,13 +7,13 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV # Source: https://netbird.io/ APP="NetBird" -var_tags="network;vpn" -var_cpu="1" -var_ram="512" -var_disk="4" -var_os="debian" -var_version="13" -var_unprivileged="1" +var_tags="${var_tags:-network;vpn}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" var_tun="${var_tun:-yes}" header_info "$APP" diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 675225bbd..8c2b12ec8 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://netbird.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,180 +13,28 @@ setting_up_container network_check update_os -cat <<'EOF' - - _ _ _ ____ _ _ -| \ | | ___| |_| __ )(_)_ __ __| | -| \| |/ _ \ __| _ \| | '__/ _` | -| |\ | __/ |_| |_) | | | | (_| | -|_| \_|\___|\__|____/|_|_| \__,_| - -EOF - msg_info "Installing Dependencies" -$STD apt install -y \ -curl \ -ca-certificates \ -gnupg +$STD apt-get install -y \ + curl \ + ca-certificates \ + gnupg msg_ok "Installed Dependencies" msg_info "Setting up NetBird Repository" -curl -sSL https://pkgs.netbird.io/debian/public.key \ -| gpg --dearmor -o /usr/share/keyrings/netbird-archive-keyring.gpg +curl -sSL https://pkgs.netbird.io/debian/public.key | gpg --dearmor -o /usr/share/keyrings/netbird-archive-keyring.gpg chmod 0644 /usr/share/keyrings/netbird-archive-keyring.gpg -echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' \ -| tee /etc/apt/sources.list.d/netbird.list > /dev/null -$STD apt update +echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' | tee /etc/apt/sources.list.d/netbird.list >/dev/null +$STD apt-get update msg_ok "Set up NetBird Repository" msg_info "Installing NetBird" -$STD apt install -y netbird +$STD apt-get install -y netbird msg_ok "Installed NetBird" msg_info "Enabling NetBird Service" $STD systemctl enable --now netbird msg_ok "Enabled NetBird Service" -# NetBird Deployment Type Selection - -echo "" -echo -e "${BL}NetBird Deployment Type${CL}" -echo "─────────────────────────────────────────" -echo "Are you using NetBird Managed or Self-Hosted?" -echo "" -echo " 1) NetBird Managed (default) - Use NetBird's managed service" -echo " 2) Self-Hosted - Use your own NetBird management server" -echo "" - -read -rp "Select deployment type [1]: " DEPLOYMENT_TYPE -DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}" - -NETBIRD_MGMT_URL="" -case "$DEPLOYMENT_TYPE" in -1) -msg_info "Using NetBird Managed service" -;; -2) -echo "" -echo -e "${BL}Self-Hosted Configuration${CL}" -echo "─────────────────────────────────────────" -echo "Enter your NetBird management server URL." -echo "Example: https://management.example.com" -echo "" -read -rp "Management URL: " NETBIRD_MGMT_URL - -if [[ -z "$NETBIRD_MGMT_URL" ]]; then -msg_warn "No management URL provided. Run 'netbird up --management-url ' within the container to connect." -else -# Ensure URL doesn't end with trailing slash -NETBIRD_MGMT_URL="${NETBIRD_MGMT_URL%/}" -msg_info "Management URL configured: ${GN}${NETBIRD_MGMT_URL}${CL}" -fi -;; -*) -msg_warn "Invalid selection. Using NetBird Managed service." -;; -esac - -# NetBird Connection Setup - -echo "" -echo -e "${BL}NetBird Connection Setup${CL}" -echo "─────────────────────────────────────────" -echo "Choose how to connect to your NetBird network:" -echo "" -echo " 1) Setup Key (default) - Use a pre-generated setup key" -echo " 2) SSO Login - Authenticate via browser with your identity provider" -echo " 3) Skip - Configure later with 'netbird up'" -echo "" - -read -rp "Select authentication method [1]: " AUTH_METHOD -AUTH_METHOD="${AUTH_METHOD:-1}" - -case "$AUTH_METHOD" in -1) -# Setup Key authentication -echo "" -echo "Enter your NetBird setup key from the NetBird dashboard." -echo "" -read -rp "Setup key: " NETBIRD_SETUP_KEY -echo "" - -if [[ -z "$NETBIRD_SETUP_KEY" ]]; then -if [[ -n "$NETBIRD_MGMT_URL" ]]; then -msg_warn "No setup key provided. Run 'netbird up -k --management-url $NETBIRD_MGMT_URL' within the container to connect." -else -msg_warn "No setup key provided. Run 'netbird up -k ' within the container to connect." -fi -else -echo -e "Setup key: ${GN}${NETBIRD_SETUP_KEY}${CL}" -read -rp "Press Enter to continue or Ctrl+C to cancel..." - -msg_info "Connecting to NetBird with setup key" -if [[ -n "$NETBIRD_MGMT_URL" ]]; then -if netbird up -k "$NETBIRD_SETUP_KEY" --management-url "$NETBIRD_MGMT_URL"; then -msg_ok "Connected to NetBird" -else -msg_warn "Connection failed. Run 'netbird up -k --management-url $NETBIRD_MGMT_URL' within the container to retry." -fi -else -if netbird up -k "$NETBIRD_SETUP_KEY"; then -msg_ok "Connected to NetBird" -else -msg_warn "Connection failed. Run 'netbird up -k ' within the container to retry." -fi -fi -fi -;; -2) -# SSO authentication -echo "" -echo -e "${BL}SSO Authentication${CL}" -echo "─────────────────────────────────────────" -echo "A login URL will appear below." -echo "Copy the URL and open it in your browser to authenticate." -echo "" - -msg_info "Starting SSO login" -if [[ -n "$NETBIRD_MGMT_URL" ]]; then -netbird login --management-url "$NETBIRD_MGMT_URL" 2>&1 || true -else -netbird login 2>&1 || true -fi -echo "" - -msg_info "Connecting to NetBird" -if [[ -n "$NETBIRD_MGMT_URL" ]]; then -if netbird up --management-url "$NETBIRD_MGMT_URL"; then -msg_ok "Connected to NetBird" -else -msg_warn "Connection failed. Run 'netbird up --management-url $NETBIRD_MGMT_URL' within the container to retry." -fi -else -if netbird up; then -msg_ok "Connected to NetBird" -else -msg_warn "Connection failed. Run 'netbird up' within the container to retry." -fi -fi -;; -3) -msg_info "Skipping NetBird connection" -if [[ -n "$NETBIRD_MGMT_URL" ]]; then -msg_ok "Run 'netbird up --management-url $NETBIRD_MGMT_URL' within the container to connect." -else -msg_ok "Run 'netbird up' within the container to connect." -fi -;; -*) -msg_warn "Invalid selection. Run 'netbird up' within the container to connect." -;; -esac - motd_ssh customize - -msg_info "Cleaning up" -$STD apt -y autoremove -$STD apt -y autoclean -msg_ok "Cleaned" +cleanup_lxc From 012aa28a5508a73273ff5a2857b75689ea32e821 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Dec 2025 09:20:13 +0000 Subject: [PATCH 009/129] Restore interactive NetBird setup prompts - Add deployment type selection (Managed vs Self-Hosted) - Add authentication method selection (Setup Key, SSO, Skip) - Interactive prompts work in production when run through build.func - Proper indentation and cleanup_lxc usage --- install/netbird-install.sh | 127 +++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 8c2b12ec8..a3b99fd87 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -35,6 +35,133 @@ msg_info "Enabling NetBird Service" $STD systemctl enable --now netbird msg_ok "Enabled NetBird Service" +# NetBird Deployment Type Selection +echo "" +echo -e "${BL}NetBird Deployment Type${CL}" +echo "─────────────────────────────────────────" +echo "Are you using NetBird Managed or Self-Hosted?" +echo "" +echo " 1) NetBird Managed (default) - Use NetBird's managed service" +echo " 2) Self-Hosted - Use your own NetBird management server" +echo "" + +read -r -p "Select deployment type [1]: " DEPLOYMENT_TYPE +DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}" + +NETBIRD_MGMT_URL="" +case "$DEPLOYMENT_TYPE" in + 1) + msg_ok "Using NetBird Managed service" + ;; + 2) + echo "" + echo -e "${BL}Self-Hosted Configuration${CL}" + echo "─────────────────────────────────────────" + echo "Enter your NetBird management server URL." + echo "Example: https://management.example.com" + echo "" + read -r -p "Management URL: " NETBIRD_MGMT_URL + + if [[ -z "$NETBIRD_MGMT_URL" ]]; then + msg_warn "No management URL provided. Run 'netbird up --management-url ' to connect." + else + NETBIRD_MGMT_URL="${NETBIRD_MGMT_URL%/}" + msg_ok "Management URL configured: ${NETBIRD_MGMT_URL}" + fi + ;; + *) + msg_warn "Invalid selection. Using NetBird Managed service." + ;; +esac + +# NetBird Connection Setup +echo "" +echo -e "${BL}NetBird Connection Setup${CL}" +echo "─────────────────────────────────────────" +echo "Choose how to connect to your NetBird network:" +echo "" +echo " 1) Setup Key (default) - Use a pre-generated setup key" +echo " 2) SSO Login - Authenticate via browser with your identity provider" +echo " 3) Skip - Configure later with 'netbird up'" +echo "" + +read -r -p "Select authentication method [1]: " AUTH_METHOD +AUTH_METHOD="${AUTH_METHOD:-1}" + +case "$AUTH_METHOD" in + 1) + echo "" + echo "Enter your NetBird setup key from the NetBird dashboard." + echo "" + read -r -p "Setup key: " NETBIRD_SETUP_KEY + echo "" + + if [[ -z "$NETBIRD_SETUP_KEY" ]]; then + if [[ -n "$NETBIRD_MGMT_URL" ]]; then + msg_warn "No setup key provided. Run 'netbird up -k --management-url $NETBIRD_MGMT_URL' to connect." + else + msg_warn "No setup key provided. Run 'netbird up -k ' to connect." + fi + else + msg_info "Connecting to NetBird with setup key" + if [[ -n "$NETBIRD_MGMT_URL" ]]; then + if $STD netbird up -k "$NETBIRD_SETUP_KEY" --management-url "$NETBIRD_MGMT_URL"; then + msg_ok "Connected to NetBird" + else + msg_warn "Connection failed. Run 'netbird up -k --management-url $NETBIRD_MGMT_URL' to retry." + fi + else + if $STD netbird up -k "$NETBIRD_SETUP_KEY"; then + msg_ok "Connected to NetBird" + else + msg_warn "Connection failed. Run 'netbird up -k ' to retry." + fi + fi + fi + ;; + 2) + echo "" + echo -e "${BL}SSO Authentication${CL}" + echo "─────────────────────────────────────────" + echo "A login URL will appear below." + echo "Copy the URL and open it in your browser to authenticate." + echo "" + + msg_info "Starting SSO login" + if [[ -n "$NETBIRD_MGMT_URL" ]]; then + netbird login --management-url "$NETBIRD_MGMT_URL" 2>&1 || true + else + netbird login 2>&1 || true + fi + echo "" + + msg_info "Connecting to NetBird" + if [[ -n "$NETBIRD_MGMT_URL" ]]; then + if $STD netbird up --management-url "$NETBIRD_MGMT_URL"; then + msg_ok "Connected to NetBird" + else + msg_warn "Connection failed. Run 'netbird up --management-url $NETBIRD_MGMT_URL' to retry." + fi + else + if $STD netbird up; then + msg_ok "Connected to NetBird" + else + msg_warn "Connection failed. Run 'netbird up' to retry." + fi + fi + ;; + 3) + if [[ -n "$NETBIRD_MGMT_URL" ]]; then + msg_ok "Skipped. Run 'netbird up --management-url $NETBIRD_MGMT_URL' to connect." + else + msg_ok "Skipped. Run 'netbird up' to connect." + fi + ;; + *) + msg_warn "Invalid selection. Run 'netbird up' to connect." + ;; +esac + 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 010/129] 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 a7ef3c18148c22b22777cee1b325cd3479adf036 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Dec 2025 09:35:31 +0000 Subject: [PATCH 011/129] Add app variable for cleanup_lxc compatibility --- install/netbird-install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index a3b99fd87..0d6fa9e27 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -6,6 +6,7 @@ # Source: https://netbird.io/ source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +app="netbird" color verb_ip6 catch_errors From 5b85d87041852d249d80f42145d1778fdce701c6 Mon Sep 17 00:00:00 2001 From: MintHCM-admin Date: Thu, 18 Dec 2025 10:37:57 +0100 Subject: [PATCH 012/129] 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 013/129] 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 014/129] .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 015/129] 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 016/129] 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 017/129] 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 018/129] 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 019/129] 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 020/129] 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 021/129] 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 022/129] 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 023/129] 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 024/129] 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 025/129] 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 026/129] 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 027/129] 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 028/129] 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 029/129] 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 18f23497b440b032814a753510a826b75b4a4f42 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Fri, 26 Dec 2025 14:01:14 +0100 Subject: [PATCH 030/129] add tor-snowflake script --- ct/tor-snowflake.sh | 78 +++++++++++++++++++++++++ frontend/public/json/tor-snowflake.json | 35 +++++++++++ install/tor-snowflake-install.sh | 69 ++++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 ct/tor-snowflake.sh create mode 100644 frontend/public/json/tor-snowflake.json create mode 100644 install/tor-snowflake-install.sh diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh new file mode 100644 index 000000000..004cc5547 --- /dev/null +++ b/ct/tor-snowflake.sh @@ -0,0 +1,78 @@ +#!/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: KernelSailor +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://snowflake.torproject.org/ + +APP="tor-snowflake" +var_tags="privacy;proxy;tor" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="13" +var_unprivileged="1" +var_nesting="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/snowflake ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if ! id snowflake &>/dev/null; then + msg_error "snowflake user not found!" + exit + fi + + msg_info "Updating Container OS" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated Container OS" + + RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Service" + systemctl stop snowflake-proxy + msg_ok "Stopped Service" + + msg_info "Updating Go" + source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) + setup_go + msg_ok "Updated Go" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt/snowflake || exit + $STD git fetch --all + $STD git checkout "v${RELEASE}" + chown -R snowflake:snowflake /opt/snowflake + $STD sudo -u snowflake go build -o proxy ./proxy + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting Service" + systemctl start snowflake-proxy + msg_ok "Started Service" + msg_ok "Updated successfully!" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}." + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}Tor Snowflake setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Snowflake proxy is running as a systemd service.${CL}" +echo -e "${INFO}${YW} Check status: systemctl status snowflake-proxy${CL}" diff --git a/frontend/public/json/tor-snowflake.json b/frontend/public/json/tor-snowflake.json new file mode 100644 index 000000000..00ed299f9 --- /dev/null +++ b/frontend/public/json/tor-snowflake.json @@ -0,0 +1,35 @@ +{ + "name": "Tor Snowflake", + "slug": "tor-snowflake", + "categories": [ + 4 + ], + "date_created": "2025-12-19", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://community.torproject.org/relay/setup/snowflake/standalone/", + "website": "https://snowflake.torproject.org/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tor.webp", + "config_path": null, + "description": "Snowflake is a pluggable transport that proxies traffic through temporary proxies using WebRTC. Snowflake allows users in censored locations to access the open internet by connecting through volunteer-run proxies. Running a Snowflake proxy helps users circumvent internet censorship by forwarding their traffic through your server.", + "install_methods": [ + { + "type": "default", + "script": "ct/tor-snowflake.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh new file mode 100644 index 000000000..f9a1a56f2 --- /dev/null +++ b/install/tor-snowflake-install.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: KernelSailor +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://snowflake.torproject.org/ + +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 \ + ca-certificates \ + curl \ + git \ + jq +msg_ok "Installed Dependencies" + +setup_go + +msg_info "Creating snowflake user" +useradd -r -s /bin/false -d /opt/snowflake snowflake +msg_ok "Created snowflake user" + +msg_info "Building Snowflake Proxy from Source" +cd /opt || exit +RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') +$STD git clone https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git +cd snowflake || exit +git config --global --add safe.directory /opt/snowflake +$STD git checkout "v${RELEASE}" +chown -R snowflake:snowflake /opt/snowflake +cd proxy || exit +$STD sudo -u snowflake go build -o snowflake-proxy . +cd /opt/snowflake || exit +echo "${RELEASE}" >/opt/tor-snowflake_version.txt +msg_ok "Built Snowflake Proxy v${RELEASE}" + +msg_info "Creating Service" +cat </etc/systemd/system/snowflake-proxy.service +[Unit] +Description=Snowflake Proxy Service +Documentation=https://snowflake.torproject.org/ +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=snowflake +Group=snowflake +WorkingDirectory=/opt/snowflake +ExecStart=/opt/snowflake/proxy/snowflake-proxy -verbose -unsafe-logging +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now snowflake-proxy +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc 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 031/129] 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 032/129] 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 033/129] 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 034/129] 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 8aa09d64dcd41d549f2670147b202516bf3efbba Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Fri, 26 Dec 2025 19:33:12 +0100 Subject: [PATCH 035/129] vars as arguments --- ct/tor-snowflake.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 004cc5547..b0ca17a96 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -6,14 +6,14 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV # Source: https://snowflake.torproject.org/ APP="tor-snowflake" -var_tags="privacy;proxy;tor" -var_cpu="1" -var_ram="512" -var_disk="4" -var_os="debian" -var_version="13" -var_unprivileged="1" -var_nesting="0" +var_tags="${var_tags:-privacy;proxy;tor}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" +var_nesting="${var_nesting:-0}" header_info "$APP" variables From 2dd49e9b433603d00d217841a925a704954bda40 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Fri, 26 Dec 2025 19:34:10 +0100 Subject: [PATCH 036/129] apt use new version --- ct/tor-snowflake.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index b0ca17a96..ca37f19f0 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -34,8 +34,8 @@ function update_script() { fi msg_info "Updating Container OS" - $STD apt-get update - $STD apt-get -y upgrade + $STD apt update + $STD apt upgrade -y msg_ok "Updated Container OS" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') From 85652adee932929dce600599450c524bae528161 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Fri, 26 Dec 2025 19:37:59 +0100 Subject: [PATCH 037/129] download code from release instead of git repo --- ct/tor-snowflake.sh | 25 +++++++++---------------- install/tor-snowflake-install.sh | 21 ++++++--------------- 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index ca37f19f0..62d9501da 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.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 community-scripts ORG # Author: KernelSailor # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE @@ -24,14 +24,6 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -d /opt/snowflake ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - if ! id snowflake &>/dev/null; then - msg_error "snowflake user not found!" - exit - fi msg_info "Updating Container OS" $STD apt update @@ -44,17 +36,18 @@ function update_script() { systemctl stop snowflake-proxy msg_ok "Stopped Service" - msg_info "Updating Go" - source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) setup_go - msg_ok "Updated Go" msg_info "Updating ${APP} to v${RELEASE}" - cd /opt/snowflake || exit - $STD git fetch --all - $STD git checkout "v${RELEASE}" + cd /opt + $STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o snowflake.tar.gz + $STD tar -xzf snowflake.tar.gz + rm -rf snowflake + mv "snowflake-v${RELEASE}" snowflake + rm snowflake.tar.gz chown -R snowflake:snowflake /opt/snowflake - $STD sudo -u snowflake go build -o proxy ./proxy + cd /opt/snowflake/proxy + $STD sudo -u snowflake go build -o snowflake-proxy . echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ${APP} to v${RELEASE}" diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index f9a1a56f2..bd9e7c833 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -13,14 +13,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - ca-certificates \ - curl \ - git \ - jq -msg_ok "Installed Dependencies" - setup_go msg_info "Creating snowflake user" @@ -28,16 +20,15 @@ useradd -r -s /bin/false -d /opt/snowflake snowflake msg_ok "Created snowflake user" msg_info "Building Snowflake Proxy from Source" -cd /opt || exit RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') -$STD git clone https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git -cd snowflake || exit -git config --global --add safe.directory /opt/snowflake -$STD git checkout "v${RELEASE}" +cd /opt +$STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o snowflake.tar.gz +$STD tar -xzf snowflake.tar.gz +mv "snowflake-v${RELEASE}" snowflake +rm snowflake.tar.gz chown -R snowflake:snowflake /opt/snowflake -cd proxy || exit +cd /opt/snowflake/proxy $STD sudo -u snowflake go build -o snowflake-proxy . -cd /opt/snowflake || exit echo "${RELEASE}" >/opt/tor-snowflake_version.txt msg_ok "Built Snowflake Proxy v${RELEASE}" 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 038/129] 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 039/129] 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 040/129] 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 041/129] 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 042/129] 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 043/129] 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 044/129] 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 045/129] 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 046/129] 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 047/129] 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 5c296111c1a013c707ccd40a2eb781b47e34e906 Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Sun, 28 Dec 2025 12:54:29 +0000 Subject: [PATCH 048/129] Add tracearr --- ct/headers/tracearr | 6 + ct/tracearr.sh | 120 +++++++++++++++++++ frontend/public/json/tracearr.json | 35 ++++++ install/tracearr-install.sh | 183 +++++++++++++++++++++++++++++ 4 files changed, 344 insertions(+) create mode 100644 ct/headers/tracearr create mode 100644 ct/tracearr.sh create mode 100644 frontend/public/json/tracearr.json create mode 100644 install/tracearr-install.sh diff --git a/ct/headers/tracearr b/ct/headers/tracearr new file mode 100644 index 000000000..cec64cede --- /dev/null +++ b/ct/headers/tracearr @@ -0,0 +1,6 @@ + ______ + /_ __/________ _________ ____ ___________ + / / / ___/ __ `/ ___/ _ \/ __ `/ ___/ ___/ + / / / / / /_/ / /__/ __/ /_/ / / / / +/_/ /_/ \__,_/\___/\___/\__,_/_/ /_/ + diff --git a/ct/tracearr.sh b/ct/tracearr.sh new file mode 100644 index 000000000..6f98192d3 --- /dev/null +++ b/ct/tracearr.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: durzo +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/connorgallopo/Tracearr + +APP="Tracearr" +var_tags="${var_tags:-media}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +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 [[ ! -f /lib/systemd/system/tracearr.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + NODE_VERSION="22" NODE_MODULE="pnpm@10.24.0" setup_nodejs + + if check_for_gh_release "tracearr" "connorgallopo/Tracearr"; then + msg_info "Stopping Services" + systemctl stop tracearr + systemctl stop postgresql + systemctl stop redis + msg_ok "Stopped Services" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" + + msg_info "Building Tracearr" + export TZ=$(cat /etc/timezone) + cd /opt/tracearr.build + $STD pnpm install --frozen-lockfile --force + $STD pnpm turbo telemetry disable + $STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web + rm -rf /opt/tracearr + mkdir -p /opt/tracearr/{packages/shared,apps/server,apps/web,apps/server/src/db} + cp -rf package.json /opt/tracearr/ + cp -rf pnpm-workspace.yaml /opt/tracearr/ + cp -rf pnpm-lock.yaml /opt/tracearr/ + cp -rf apps/server/package.json /opt/tracearr/apps/server/ + cp -rf apps/server/dist /opt/tracearr/apps/server/dist + cp -rf apps/web/dist /opt/tracearr/apps/web/dist + cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ + cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist + cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations + cp -rf data /opt/tracearr/data + rm -rf /opt/tracearr.build + cd /opt/tracearr + $STD pnpm install --prod --frozen-lockfile + $STD chown -R tracearr:tracearr /opt/tracearr + msg_ok "Built Tracearr" + + msg_info "Configuring Tracearr" + if [ ! -d /data/tracearr ]; then + install -d -m 750 -o tracearr -g tracearr /data/tracearr + fi + + if [ -f /data/tracearr/.jwt_secret ]; then + export JWT_SECRET=$(cat /data/tracearr/.jwt_secret) + else + export JWT_SECRET=$(openssl rand -hex 32) + echo "$JWT_SECRET" > /data/tracearr/.jwt_secret + chmod 600 /data/tracearr/.jwt_secret + fi + if [ -f /data/tracearr/.cookie_secret ]; then + export COOKIE_SECRET=$(cat /data/tracearr/.cookie_secret) + else + export COOKIE_SECRET=$(openssl rand -hex 32) + echo "$COOKIE_SECRET" > /data/tracearr/.cookie_secret + chmod 600 /data/tracearr/.cookie_secret + fi + cat </data/tracearr/.env +DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME} +REDIS_URL=redis://127.0.0.1:6379 +PORT=3000 +HOST=0.0.0.0 +NODE_ENV=production +TZ=${TZ} +LOG_LEVEL=info +JWT_SECRET=$JWT_SECRET +COOKIE_SECRET=$COOKIE_SECRET +APP_VERSION=$(cat /root/.tracearr) +#CORS_ORIGIN=http://localhost:5173 +#MOBILE_BETA_MODE=true +EOF + chmod 600 /data/tracearr/.env + chown -R tracearr:tracearr /data/tracearr + msg_ok "Configured Tracearr" + + msg_info "Starting Services" + systemctl start postgresql + systemctl start redis + systemctl start tracearr + msg_ok "Started Services" + 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}:3000${CL}" diff --git a/frontend/public/json/tracearr.json b/frontend/public/json/tracearr.json new file mode 100644 index 000000000..2544280a4 --- /dev/null +++ b/frontend/public/json/tracearr.json @@ -0,0 +1,35 @@ +{ + "name": "Tracearr", + "slug": "tracearr", + "categories": [ + 13 + ], + "date_created": "2025-12-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/connorgallopo/Tracearr#readme", + "config_path": "", + "website": "https://github.com/connorgallopo/Tracearr", + "logo": "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/apps/web/public/logo-transparent.png", + "description": "Tracearr is a streaming access manager for Plex, Jellyfin and Emby servers. It answers the question every server owner eventually asks: \"Who's actually using my server, and are they sharing their login?\"", + "install_methods": [ + { + "type": "default", + "script": "ct/tracearr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh new file mode 100644 index 000000000..2c2b7512b --- /dev/null +++ b/install/tracearr-install.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: durzo +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/connorgallopo/Tracearr + +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 redis-server +msg_ok "Installed Dependencies" + +NODE_VERSION="22" NODE_MODULE="pnpm@10.24.0" setup_nodejs +PG_VERSION="18" setup_postgresql + +msg_info "Installing TimescaleDB" +setup_deb822_repo \ + "timescaledb" \ + "https://packagecloud.io/timescale/timescaledb/gpgkey" \ + "https://packagecloud.io/timescale/timescaledb/debian" \ + "$(get_os_info codename)" \ + "main" +$STD apt install -y \ + timescaledb-2-postgresql-18 \ + timescaledb-tools \ + timescaledb-toolkit-postgresql-18 +# give timescaledb-tune 50% of total ram in MB +# we need to leave the rest for redis and the webserver. +# We cant use $RAM_SIZE or $var_ram here, which is annoying. +total_ram_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}') +ram_for_tsdb=$((total_ram_kb / 1024 / 2)) +$STD timescaledb-tune -yes -memory "$ram_for_tsdb"MB +$STD systemctl restart postgresql +msg_ok "Installed TimescaleDB" + +msg_info "Creating PostgreSQL Database" +DB_NAME=tracearr +DB_USER=tracearr +DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" +$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" +$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;" +$STD sudo -u postgres psql -d $DB_NAME -c "CREATE EXTENSION IF NOT EXISTS timescaledb;" +$STD sudo -u postgres psql -d $DB_NAME -c "CREATE EXTENSION IF NOT EXISTS timescaledb_toolkit;" +$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" +$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL ON SCHEMA public TO $DB_USER;" +$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';" +$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" +$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" +{ + echo "Dispatcharr Credentials" + echo "Database Name: $DB_NAME" + echo "Database User: $DB_USER" + echo "Database Password: $DB_PASS" + echo "" +} >>~/tracearr.creds +msg_ok "Created PostgreSQL Database" + +fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" + +msg_info "Building Tracearr" +export TZ=$(cat /etc/timezone) +cd /opt/tracearr.build +$STD pnpm install --frozen-lockfile --force +$STD pnpm turbo telemetry disable +$STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web +mkdir -p /opt/tracearr/{packages/shared,apps/server,apps/web,apps/server/src/db} +cp -rf package.json /opt/tracearr/ +cp -rf pnpm-workspace.yaml /opt/tracearr/ +cp -rf pnpm-lock.yaml /opt/tracearr/ +cp -rf apps/server/package.json /opt/tracearr/apps/server/ +cp -rf apps/server/dist /opt/tracearr/apps/server/dist +cp -rf apps/web/dist /opt/tracearr/apps/web/dist +cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ +cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist +cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations +cp -rf data /opt/tracearr/data +rm -rf /opt/tracearr.build +cd /opt/tracearr +$STD pnpm install --prod --frozen-lockfile +msg_ok "Built Tracearr" + +msg_info "Configuring Tracearr" +$STD useradd -r -s /bin/false -U tracearr +$STD chown -R tracearr:tracearr /opt/tracearr +install -d -m 750 -o tracearr -g tracearr /data/tracearr +if [ -f /data/tracearr/.jwt_secret ]; then + export JWT_SECRET=$(cat /data/tracearr/.jwt_secret) +else + export JWT_SECRET=$(openssl rand -hex 32) + echo "$JWT_SECRET" > /data/tracearr/.jwt_secret + chmod 600 /data/tracearr/.jwt_secret +fi + +if [ -f /data/tracearr/.cookie_secret ]; then + export COOKIE_SECRET=$(cat /data/tracearr/.cookie_secret) +else + export COOKIE_SECRET=$(openssl rand -hex 32) + echo "$COOKIE_SECRET" > /data/tracearr/.cookie_secret + chmod 600 /data/tracearr/.cookie_secret +fi +cat </data/tracearr/.env +DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME} +REDIS_URL=redis://127.0.0.1:6379 +PORT=3000 +HOST=0.0.0.0 +NODE_ENV=production +TZ=${TZ} +LOG_LEVEL=info +JWT_SECRET=$JWT_SECRET +COOKIE_SECRET=$COOKIE_SECRET +APP_VERSION=$(cat /root/.tracearr) +#CORS_ORIGIN=http://localhost:5173 +#MOBILE_BETA_MODE=true +EOF +chmod 600 /data/tracearr/.env +chown -R tracearr:tracearr /data/tracearr +msg_ok "Configured Tracearr" + +msg_info "Creating Services" +cat </data/tracearr/prestart.sh +#!/usr/bin/env bash +# ============================================================================= +# Tune PostgreSQL for available resources (runs every startup) +# ============================================================================= +# timescaledb-tune automatically optimizes PostgreSQL settings based on +# available RAM and CPU. Safe to run repeatedly - recalculates if resources change. +if command -v timescaledb-tune &> /dev/null; then + total_ram_kb=\$(grep MemTotal /proc/meminfo | awk '{print \$2}') + ram_for_tsdb=\$((total_ram_kb / 1024 / 2)) + timescaledb-tune -yes -memory "\$ram_for_tsdb"MB --quiet 2>/dev/null \ + || echo "Warning: timescaledb-tune failed (non-fatal)" +fi +# ============================================================================= +# Ensure TimescaleDB decompression limit is set (for existing databases) +# ============================================================================= +# This setting allows migrations to modify compressed hypertable data. +# Without it, bulk UPDATEs on compressed sessions will fail with +# "tuple decompression limit exceeded" errors. +pg_config_file="/etc/postgresql/18/main/postgresql.conf" +if [ -f \$pg_config_file ]; then + if ! grep -q "max_tuples_decompressed_per_dml_transaction" \$pg_config_file; then + echo "" >> \$pg_config_file + echo "# Allow unlimited tuple decompression for migrations on compressed hypertables" >> \$pg_config_file + echo "timescaledb.max_tuples_decompressed_per_dml_transaction = 0" >> \$pg_config_file + fi +fi +systemctl restart postgresql +EOF +chmod +x /data/tracearr/prestart.sh +cat </lib/systemd/system/tracearr.service +[Unit] +Description=Tracearr Web Server +After=network.target postgresql.service redis-server.service + +[Service] +Type=simple +KillMode=control-group +EnvironmentFile=/data/tracearr/.env +WorkingDirectory=/opt/tracearr +ExecStartPre=+/data/tracearr/prestart.sh +ExecStart=node /opt/tracearr/apps/server/dist/index.js +Restart=on-failure +RestartSec=10 +User=tracearr + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now postgresql +systemctl enable -q --now redis-server +systemctl enable -q --now tracearr +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc From 8dc0e3b9628ec816793d8896a8e6369ad8b41369 Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Sun, 28 Dec 2025 16:36:28 +0000 Subject: [PATCH 049/129] PR review feedback --- ct/tracearr.sh | 34 ++++++++++++++++++++++-------- frontend/public/json/tracearr.json | 4 ++-- install/tracearr-install.sh | 22 ++----------------- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index 6f98192d3..535585ea9 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -28,15 +28,13 @@ function update_script() { exit fi - NODE_VERSION="22" NODE_MODULE="pnpm@10.24.0" setup_nodejs - if check_for_gh_release "tracearr" "connorgallopo/Tracearr"; then msg_info "Stopping Services" - systemctl stop tracearr - systemctl stop postgresql - systemctl stop redis + systemctl stop tracearr postgresql redis msg_ok "Stopped Services" + NODE_VERSION="22" NODE_MODULE="pnpm@10.24.0" setup_nodejs + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" msg_info "Building Tracearr" @@ -82,8 +80,28 @@ function update_script() { echo "$COOKIE_SECRET" > /data/tracearr/.cookie_secret chmod 600 /data/tracearr/.cookie_secret fi + if [ ! -f /root/tracearr.creds ]; then + if [ -f /data/tracearr/.env ]; then + PG_DB_NAME=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d'/' -f4) + PG_DB_USER=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d'/' -f3 | cut -d':' -f1) + PG_DB_PASS=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d':' -f3 | cut -d'@' -f1) + { echo "PostgreSQL Credentials" + echo "Database: $PG_DB_NAME" + echo "User: $PG_DB_USER" + echo "Password: $PG_DB_PASS" + } >/root/tracearr.creds + msg_ok "Recreated tracearr.creds file from existing .env" + else + msg_error "No existing tracearr.creds or .env file found. Cannot configure database connection!" + exit 1 + fi + else + PG_DB_NAME=$(grep 'Database:' /root/tracearr.creds | awk '{print $2}') + PG_DB_USER=$(grep 'User:' /root/tracearr.creds | awk '{print $2}') + PG_DB_PASS=$(grep 'Password:' /root/tracearr.creds | awk '{print $2}') + fi cat </data/tracearr/.env -DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME} +DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} REDIS_URL=redis://127.0.0.1:6379 PORT=3000 HOST=0.0.0.0 @@ -101,9 +119,7 @@ EOF msg_ok "Configured Tracearr" msg_info "Starting Services" - systemctl start postgresql - systemctl start redis - systemctl start tracearr + systemctl start postgresql redis tracearr msg_ok "Started Services" msg_ok "Updated successfully!" fi diff --git a/frontend/public/json/tracearr.json b/frontend/public/json/tracearr.json index 2544280a4..0e729d977 100644 --- a/frontend/public/json/tracearr.json +++ b/frontend/public/json/tracearr.json @@ -12,7 +12,7 @@ "documentation": "https://github.com/connorgallopo/Tracearr#readme", "config_path": "", "website": "https://github.com/connorgallopo/Tracearr", - "logo": "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/apps/web/public/logo-transparent.png", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tracearr.webp", "description": "Tracearr is a streaming access manager for Plex, Jellyfin and Emby servers. It answers the question every server owner eventually asks: \"Who's actually using my server, and are they sharing their login?\"", "install_methods": [ { @@ -32,4 +32,4 @@ "password": null }, "notes": [] -} \ No newline at end of file +} diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh index 2c2b7512b..5ed0c9911 100644 --- a/install/tracearr-install.sh +++ b/install/tracearr-install.sh @@ -41,25 +41,7 @@ $STD systemctl restart postgresql msg_ok "Installed TimescaleDB" msg_info "Creating PostgreSQL Database" -DB_NAME=tracearr -DB_USER=tracearr -DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" -$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" -$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;" -$STD sudo -u postgres psql -d $DB_NAME -c "CREATE EXTENSION IF NOT EXISTS timescaledb;" -$STD sudo -u postgres psql -d $DB_NAME -c "CREATE EXTENSION IF NOT EXISTS timescaledb_toolkit;" -$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" -$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL ON SCHEMA public TO $DB_USER;" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" -{ - echo "Dispatcharr Credentials" - echo "Database Name: $DB_NAME" - echo "Database User: $DB_USER" - echo "Database Password: $DB_PASS" - echo "" -} >>~/tracearr.creds +PG_DB_NAME="tracearr" PG_DB_USER="tracearr" PG_DB_EXTENSIONS="timescaledb,timescaledb_toolkit" setup_postgresql_db msg_ok "Created PostgreSQL Database" fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" @@ -106,7 +88,7 @@ else chmod 600 /data/tracearr/.cookie_secret fi cat </data/tracearr/.env -DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@127.0.0.1:5432/${DB_NAME} +DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} REDIS_URL=redis://127.0.0.1:6379 PORT=3000 HOST=0.0.0.0 From 6c01ab9cf406c71e97abff3ca0affea16585d6c2 Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Sun, 28 Dec 2025 22:45:25 +0000 Subject: [PATCH 050/129] Dynamically fetch pnpm version from package.json --- ct/tracearr.sh | 3 ++- install/tracearr-install.sh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index 535585ea9..c25066a3e 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -33,7 +33,8 @@ function update_script() { systemctl stop tracearr postgresql redis msg_ok "Stopped Services" - NODE_VERSION="22" NODE_MODULE="pnpm@10.24.0" setup_nodejs + PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" + NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh index 5ed0c9911..dcbc6e7ad 100644 --- a/install/tracearr-install.sh +++ b/install/tracearr-install.sh @@ -17,7 +17,8 @@ msg_info "Installing Dependencies" $STD apt install -y redis-server msg_ok "Installed Dependencies" -NODE_VERSION="22" NODE_MODULE="pnpm@10.24.0" setup_nodejs +PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" +NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs PG_VERSION="18" setup_postgresql msg_info "Installing TimescaleDB" From 654047e08abf08a3460e07765d3c78c0f46d0646 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 11:45:58 +0100 Subject: [PATCH 051/129] change App location --- ct/tor-snowflake.sh | 23 +++++++++++---------- install/tor-snowflake-install.sh | 34 ++++++++++++++++---------------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 62d9501da..5fea776e9 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -15,6 +15,8 @@ var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" var_nesting="${var_nesting:-0}" +SNOWFLAKEUSER="snowflake" + header_info "$APP" variables color @@ -31,24 +33,21 @@ function update_script() { msg_ok "Updated Container OS" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then - msg_info "Stopping Service" + VERSION_FILE="/home/${SNOWFLAKEUSER}/.${APP}_version" + if [[ ! -f "${VERSION_FILE}" ]] || [[ "${RELEASE}" != "$(cat "${VERSION_FILE}")" ]]; then systemctl stop snowflake-proxy msg_ok "Stopped Service" setup_go msg_info "Updating ${APP} to v${RELEASE}" - cd /opt - $STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o snowflake.tar.gz - $STD tar -xzf snowflake.tar.gz - rm -rf snowflake - mv "snowflake-v${RELEASE}" snowflake - rm snowflake.tar.gz - chown -R snowflake:snowflake /opt/snowflake - cd /opt/snowflake/proxy - $STD sudo -u snowflake go build -o snowflake-proxy . - echo "${RELEASE}" >/opt/${APP}_version.txt + $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" + $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tar -xzf snowflake.tar.gz" + $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && rm snowflake.tar.gz" + $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && rm -rf .${APP}" + $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" + $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." + echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_version >/dev/null" msg_ok "Updated ${APP} to v${RELEASE}" msg_info "Starting Service" diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index bd9e7c833..4db5cb7fe 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -13,23 +13,23 @@ setting_up_container network_check update_os +APP="tor-snowflake" +SNOWFLAKEUSER="snowflake" + setup_go -msg_info "Creating snowflake user" -useradd -r -s /bin/false -d /opt/snowflake snowflake -msg_ok "Created snowflake user" +msg_info "Creating ${SNOWFLAKEUSER} user" +useradd -m -r -s /usr/sbin/nologin -d /home/${SNOWFLAKEUSER} ${SNOWFLAKEUSER} +msg_ok "Created ${SNOWFLAKEUSER} user" -msg_info "Building Snowflake Proxy from Source" +msg_info "Building Snowflake" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') -cd /opt -$STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o snowflake.tar.gz -$STD tar -xzf snowflake.tar.gz -mv "snowflake-v${RELEASE}" snowflake -rm snowflake.tar.gz -chown -R snowflake:snowflake /opt/snowflake -cd /opt/snowflake/proxy -$STD sudo -u snowflake go build -o snowflake-proxy . -echo "${RELEASE}" >/opt/tor-snowflake_version.txt +$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" +$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tar -xzf snowflake.tar.gz" +$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && rm snowflake.tar.gz" +$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" +$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." +echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_version >/dev/null" msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" @@ -42,10 +42,10 @@ Wants=network-online.target [Service] Type=simple -User=snowflake -Group=snowflake -WorkingDirectory=/opt/snowflake -ExecStart=/opt/snowflake/proxy/snowflake-proxy -verbose -unsafe-logging +User=${SNOWFLAKEUSER} +Group=${SNOWFLAKEUSER} +WorkingDirectory=/home/${SNOWFLAKEUSER}/.${APP} +ExecStart=/home/${SNOWFLAKEUSER}/.${APP}/proxy/snowflake-proxy -verbose -unsafe-logging Restart=always RestartSec=10 From 9702978d0c8a10d2597b707031b1a97627597718 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 11:46:51 +0100 Subject: [PATCH 052/129] rename snowflake systemd service --- ct/tor-snowflake.sh | 11 ++++++----- install/tor-snowflake-install.sh | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 5fea776e9..c27e8a3cc 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -35,8 +35,9 @@ function update_script() { RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') VERSION_FILE="/home/${SNOWFLAKEUSER}/.${APP}_version" if [[ ! -f "${VERSION_FILE}" ]] || [[ "${RELEASE}" != "$(cat "${VERSION_FILE}")" ]]; then - systemctl stop snowflake-proxy - msg_ok "Stopped Service" + msg_info "Stopping ${APP} Service" + systemctl stop ${APP} + msg_ok "Stopped ${APP} Service" setup_go @@ -50,9 +51,9 @@ function update_script() { echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_version >/dev/null" msg_ok "Updated ${APP} to v${RELEASE}" - msg_info "Starting Service" - systemctl start snowflake-proxy - msg_ok "Started Service" + msg_info "Starting ${APP} Service" + systemctl start ${APP} + msg_ok "Started ${APP} Service" msg_ok "Updated successfully!" else msg_ok "No update required. ${APP} is already at v${RELEASE}." diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index 4db5cb7fe..f5b917ce5 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -33,7 +33,7 @@ echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_ver msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" -cat </etc/systemd/system/snowflake-proxy.service +cat </etc/systemd/system/${APP}.service [Unit] Description=Snowflake Proxy Service Documentation=https://snowflake.torproject.org/ @@ -52,7 +52,7 @@ RestartSec=10 [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now snowflake-proxy +systemctl enable -q --now ${APP} msg_ok "Created Service" motd_ssh From e22edd600a1bd821d42ed8095cdd4e767f15f822 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 11:47:51 +0100 Subject: [PATCH 053/129] rm info notification at the end of script --- ct/tor-snowflake.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index c27e8a3cc..74ed6be57 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -66,6 +66,3 @@ build_container description msg_ok "Completed Successfully!\n" -echo -e "${CREATING}${GN}Tor Snowflake setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Snowflake proxy is running as a systemd service.${CL}" -echo -e "${INFO}${YW} Check status: systemctl status snowflake-proxy${CL}" From 65838068c4690e59d0e2e13811f2be4dc6ef85ca Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Mon, 29 Dec 2025 08:22:24 -0800 Subject: [PATCH 054/129] Update install/netbird-install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- install/netbird-install.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 0d6fa9e27..c0149c4dd 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -14,12 +14,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - ca-certificates \ - gnupg -msg_ok "Installed Dependencies" msg_info "Setting up NetBird Repository" curl -sSL https://pkgs.netbird.io/debian/public.key | gpg --dearmor -o /usr/share/keyrings/netbird-archive-keyring.gpg From 62fcad52ac077dde30e23261c2b7e5670a73bf61 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Mon, 29 Dec 2025 08:22:40 -0800 Subject: [PATCH 055/129] Update install/netbird-install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- install/netbird-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index c0149c4dd..17415acda 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -6,7 +6,6 @@ # Source: https://netbird.io/ source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -app="netbird" color verb_ip6 catch_errors From 18817d96a5665ca7eaaf314eb8b9156dfcac2972 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Mon, 29 Dec 2025 08:22:51 -0800 Subject: [PATCH 056/129] Update install/netbird-install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- install/netbird-install.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 17415acda..acd33fb6b 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -15,10 +15,11 @@ update_os msg_info "Setting up NetBird Repository" -curl -sSL https://pkgs.netbird.io/debian/public.key | gpg --dearmor -o /usr/share/keyrings/netbird-archive-keyring.gpg -chmod 0644 /usr/share/keyrings/netbird-archive-keyring.gpg -echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' | tee /etc/apt/sources.list.d/netbird.list >/dev/null -$STD apt-get update +setup_deb882_repo \ + "netbird" \ + "https://pkgs.netbird.io/debian/public.key" \ + "https://pkgs.netbird.io/debian" \ + "stable" msg_ok "Set up NetBird Repository" msg_info "Installing NetBird" From 2971329b1b4451b73c008efb680556e5f552c106 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Mon, 29 Dec 2025 08:23:03 -0800 Subject: [PATCH 057/129] Update install/netbird-install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- install/netbird-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index acd33fb6b..d86022444 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -40,7 +40,7 @@ echo " 1) NetBird Managed (default) - Use NetBird's managed service" echo " 2) Self-Hosted - Use your own NetBird management server" echo "" -read -r -p "Select deployment type [1]: " DEPLOYMENT_TYPE +read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}" NETBIRD_MGMT_URL="" From b9bbc3b38a6ac8e10b76d8e3433f3fdb22894aaf Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Mon, 29 Dec 2025 08:43:14 -0800 Subject: [PATCH 058/129] Fix description formatting in netbird.json --- frontend/public/json/netbird.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/netbird.json b/frontend/public/json/netbird.json index 7fcefd128..fe67583b3 100644 --- a/frontend/public/json/netbird.json +++ b/frontend/public/json/netbird.json @@ -11,7 +11,7 @@ "website": "https://netbird.io/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@master/webp/netbird.webp", "config_path": "/etc/netbird/config.json", - "description": "NetBird is an open-source VPN management platform that creates secure peer-to-peer networks using WireGuard. It enables secure connectivity between devices anywhere in the world without complex firewall configurations or port forwarding. NetBird offers features like zero-configuration networking, SSO integration, access control policies, and a centralized management dashboard. It's designed to be simple to deploy and manage, making it ideal for connecting remote teams, securing IoT devices, or building secure infrastructure networks.", + "description": "NetBird is an open source VPN management platform that creates secure peer-to-peer networks using WireGuard. It enables secure connectivity between devices anywhere in the world without complex firewall configurations or port forwarding. NetBird offers features like zero-configuration networking, SSO integration, access control policies, and a centralized management dashboard. It's designed to be simple to deploy and manage, making it ideal for connecting remote teams, securing IoT devices, or building secure infrastructure networks.", "install_methods": [ { "type": "default", From 2e5376c4d61dfc84656390eb56f7e0d2ce7195c1 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 18:18:02 +0100 Subject: [PATCH 059/129] Revert "rename snowflake systemd service" This reverts commit 9702978d0c8a10d2597b707031b1a97627597718. --- ct/tor-snowflake.sh | 11 +++++------ install/tor-snowflake-install.sh | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 74ed6be57..a3d97604d 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -35,9 +35,8 @@ function update_script() { RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') VERSION_FILE="/home/${SNOWFLAKEUSER}/.${APP}_version" if [[ ! -f "${VERSION_FILE}" ]] || [[ "${RELEASE}" != "$(cat "${VERSION_FILE}")" ]]; then - msg_info "Stopping ${APP} Service" - systemctl stop ${APP} - msg_ok "Stopped ${APP} Service" + systemctl stop snowflake-proxy + msg_ok "Stopped Service" setup_go @@ -51,9 +50,9 @@ function update_script() { echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_version >/dev/null" msg_ok "Updated ${APP} to v${RELEASE}" - msg_info "Starting ${APP} Service" - systemctl start ${APP} - msg_ok "Started ${APP} Service" + msg_info "Starting Service" + systemctl start snowflake-proxy + msg_ok "Started Service" msg_ok "Updated successfully!" else msg_ok "No update required. ${APP} is already at v${RELEASE}." diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index f5b917ce5..4db5cb7fe 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -33,7 +33,7 @@ echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_ver msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" -cat </etc/systemd/system/${APP}.service +cat </etc/systemd/system/snowflake-proxy.service [Unit] Description=Snowflake Proxy Service Documentation=https://snowflake.torproject.org/ @@ -52,7 +52,7 @@ RestartSec=10 [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now ${APP} +systemctl enable -q --now snowflake-proxy msg_ok "Created Service" motd_ssh From 9de46cae2d8b5e42181c4360189f1330f3d6f5dd Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 18:19:11 +0100 Subject: [PATCH 060/129] hardcode username instead of var --- ct/tor-snowflake.sh | 25 +++++++++++-------------- install/tor-snowflake-install.sh | 27 +++++++++++++-------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index a3d97604d..1c63c4be5 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -15,8 +15,6 @@ var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" var_nesting="${var_nesting:-0}" -SNOWFLAKEUSER="snowflake" - header_info "$APP" variables color @@ -33,29 +31,28 @@ function update_script() { msg_ok "Updated Container OS" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') - VERSION_FILE="/home/${SNOWFLAKEUSER}/.${APP}_version" - if [[ ! -f "${VERSION_FILE}" ]] || [[ "${RELEASE}" != "$(cat "${VERSION_FILE}")" ]]; then + if [[ ! -f "/home/snowflake/.${APP}_version" ]] || [[ "${RELEASE}" != "$(cat "/home/snowflake/.${APP}_version")" ]]; then systemctl stop snowflake-proxy msg_ok "Stopped Service" setup_go - msg_info "Updating ${APP} to v${RELEASE}" - $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" - $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tar -xzf snowflake.tar.gz" - $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && rm snowflake.tar.gz" - $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && rm -rf .${APP}" - $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" - $STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." - echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_version >/dev/null" - msg_ok "Updated ${APP} to v${RELEASE}" + msg_info "Updating Snowflake" + $STD sudo -H -u snowflake bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" + $STD sudo -H -u snowflake bash -c "cd ~ && tar -xzf snowflake.tar.gz" + $STD sudo -H -u snowflake bash -c "cd ~ && rm snowflake.tar.gz" + $STD sudo -H -u snowflake bash -c "cd ~ && rm -rf .${APP}" + $STD sudo -H -u snowflake bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" + $STD sudo -H -u snowflake bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." + echo "${RELEASE}" | sudo -H -u snowflake bash -c "cd ~ && tee .${APP}_version >/dev/null" + msg_ok "Updated Snowflake to v${RELEASE}" msg_info "Starting Service" systemctl start snowflake-proxy msg_ok "Started Service" msg_ok "Updated successfully!" else - msg_ok "No update required. ${APP} is already at v${RELEASE}." + msg_ok "No update required. Snowflake is already at v${RELEASE}." fi exit } diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index 4db5cb7fe..df2caea6b 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -14,22 +14,21 @@ network_check update_os APP="tor-snowflake" -SNOWFLAKEUSER="snowflake" setup_go -msg_info "Creating ${SNOWFLAKEUSER} user" -useradd -m -r -s /usr/sbin/nologin -d /home/${SNOWFLAKEUSER} ${SNOWFLAKEUSER} -msg_ok "Created ${SNOWFLAKEUSER} user" +msg_info "Creating snowflake user" +useradd -m -r -s /usr/sbin/nologin -d /home/snowflake snowflake +msg_ok "Created snowflake user" msg_info "Building Snowflake" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') -$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" -$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tar -xzf snowflake.tar.gz" -$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && rm snowflake.tar.gz" -$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" -$STD sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." -echo "${RELEASE}" | sudo -H -u ${SNOWFLAKEUSER} bash -c "cd ~ && tee .${APP}_version >/dev/null" +$STD sudo -H -u snowflake bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" +$STD sudo -H -u snowflake bash -c "cd ~ && tar -xzf snowflake.tar.gz" +$STD sudo -H -u snowflake bash -c "cd ~ && rm snowflake.tar.gz" +$STD sudo -H -u snowflake bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" +$STD sudo -H -u snowflake bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." +echo "${RELEASE}" | sudo -H -u snowflake bash -c "cd ~ && tee .${APP}_version >/dev/null" msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" @@ -42,10 +41,10 @@ Wants=network-online.target [Service] Type=simple -User=${SNOWFLAKEUSER} -Group=${SNOWFLAKEUSER} -WorkingDirectory=/home/${SNOWFLAKEUSER}/.${APP} -ExecStart=/home/${SNOWFLAKEUSER}/.${APP}/proxy/snowflake-proxy -verbose -unsafe-logging +User=snowflake +Group=snowflake +WorkingDirectory=/home/snowflake/.${APP} +ExecStart=/home/snowflake/.${APP}/proxy/snowflake-proxy -verbose -unsafe-logging Restart=always RestartSec=10 From 27227e11fbcfad134ebcd9ba72f6b21861c45f44 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 18:51:54 +0100 Subject: [PATCH 061/129] fix: incomplete message block --- ct/tor-snowflake.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 1c63c4be5..155e2163c 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -32,6 +32,7 @@ function update_script() { RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') if [[ ! -f "/home/snowflake/.${APP}_version" ]] || [[ "${RELEASE}" != "$(cat "/home/snowflake/.${APP}_version")" ]]; then + msg_info "Stopping Service" systemctl stop snowflake-proxy msg_ok "Stopped Service" From 8a10af959c40c3424e9e770a6949116c2174aeb1 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Mon, 29 Dec 2025 19:56:08 +0100 Subject: [PATCH 062/129] move app dir back to /opt/tor-snowflake --- ct/tor-snowflake.sh | 17 +++++++++-------- install/tor-snowflake-install.sh | 19 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 155e2163c..929704417 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -31,7 +31,7 @@ function update_script() { msg_ok "Updated Container OS" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') - if [[ ! -f "/home/snowflake/.${APP}_version" ]] || [[ "${RELEASE}" != "$(cat "/home/snowflake/.${APP}_version")" ]]; then + if [[ ! -f "/opt/tor-snowflake/version" ]] || [[ "${RELEASE}" != "$(cat "/opt/tor-snowflake/version")" ]]; then msg_info "Stopping Service" systemctl stop snowflake-proxy msg_ok "Stopped Service" @@ -39,13 +39,14 @@ function update_script() { setup_go msg_info "Updating Snowflake" - $STD sudo -H -u snowflake bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" - $STD sudo -H -u snowflake bash -c "cd ~ && tar -xzf snowflake.tar.gz" - $STD sudo -H -u snowflake bash -c "cd ~ && rm snowflake.tar.gz" - $STD sudo -H -u snowflake bash -c "cd ~ && rm -rf .${APP}" - $STD sudo -H -u snowflake bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" - $STD sudo -H -u snowflake bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." - echo "${RELEASE}" | sudo -H -u snowflake bash -c "cd ~ && tee .${APP}_version >/dev/null" + $STD bash -c "cd /opt && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" + $STD bash -c "cd /opt && tar -xzf snowflake.tar.gz" + $STD rm -rf /opt/snowflake.tar.gz + $STD rm -rf /opt/tor-snowflake + $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake + $STD chown -R snowflake:snowflake /opt/tor-snowflake + $STD sudo -H -u snowflake bash -c "cd /opt/tor-snowflake/proxy && go build -o snowflake-proxy ." + echo "${RELEASE}" >/opt/tor-snowflake/version msg_ok "Updated Snowflake to v${RELEASE}" msg_info "Starting Service" diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index df2caea6b..97f3fab95 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -13,8 +13,6 @@ setting_up_container network_check update_os -APP="tor-snowflake" - setup_go msg_info "Creating snowflake user" @@ -23,12 +21,13 @@ msg_ok "Created snowflake user" msg_info "Building Snowflake" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') -$STD sudo -H -u snowflake bash -c "cd ~ && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" -$STD sudo -H -u snowflake bash -c "cd ~ && tar -xzf snowflake.tar.gz" -$STD sudo -H -u snowflake bash -c "cd ~ && rm snowflake.tar.gz" -$STD sudo -H -u snowflake bash -c "cd ~ && mv snowflake-v${RELEASE} .${APP}" -$STD sudo -H -u snowflake bash -c "cd ~/.${APP}/proxy && go build -o snowflake-proxy ." -echo "${RELEASE}" | sudo -H -u snowflake bash -c "cd ~ && tee .${APP}_version >/dev/null" +$STD bash -c "cd /opt && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" +$STD bash -c "cd /opt && tar -xzf snowflake.tar.gz" +$STD rm -rf /opt/snowflake.tar.gz +$STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake +$STD chown -R snowflake:snowflake /opt/tor-snowflake +$STD sudo -H -u snowflake bash -c "cd /opt/tor-snowflake/proxy && go build -o snowflake-proxy ." +echo "${RELEASE}" >/opt/tor-snowflake/version msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" @@ -43,8 +42,8 @@ Wants=network-online.target Type=simple User=snowflake Group=snowflake -WorkingDirectory=/home/snowflake/.${APP} -ExecStart=/home/snowflake/.${APP}/proxy/snowflake-proxy -verbose -unsafe-logging +WorkingDirectory=/opt/tor-snowflake/proxy +ExecStart=/opt/tor-snowflake/proxy/snowflake-proxy -verbose -unsafe-logging Restart=always RestartSec=10 From f948688dda6963c9eced1eb06203e7d0b105b856 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Mon, 29 Dec 2025 22:43:58 +0100 Subject: [PATCH 063/129] 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 7b20b0fead9d955829be475635121221ff5c2533 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Tue, 30 Dec 2025 10:23:28 +0100 Subject: [PATCH 064/129] simplify download commands --- ct/tor-snowflake.sh | 4 ++-- install/tor-snowflake-install.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 929704417..cbfa18f13 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -39,8 +39,8 @@ function update_script() { setup_go msg_info "Updating Snowflake" - $STD bash -c "cd /opt && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" - $STD bash -c "cd /opt && tar -xzf snowflake.tar.gz" + $STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o /opt/snowflake.tar.gz + $STD tar -xzf /opt/snowflake.tar.gz -C /opt $STD rm -rf /opt/snowflake.tar.gz $STD rm -rf /opt/tor-snowflake $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index 97f3fab95..145580e82 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -21,8 +21,8 @@ msg_ok "Created snowflake user" msg_info "Building Snowflake" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') -$STD bash -c "cd /opt && curl -fsSL 'https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz' -o snowflake.tar.gz" -$STD bash -c "cd /opt && tar -xzf snowflake.tar.gz" +$STD curl -fsSL "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/archive/v${RELEASE}/snowflake-v${RELEASE}.tar.gz" -o /opt/snowflake.tar.gz +$STD tar -xzf /opt/snowflake.tar.gz -C /opt $STD rm -rf /opt/snowflake.tar.gz $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake $STD chown -R snowflake:snowflake /opt/tor-snowflake From c4e5ce623d7ae965e25d42388f13109b091e85b9 Mon Sep 17 00:00:00 2001 From: KernelSailor Date: Tue, 30 Dec 2025 10:33:45 +0100 Subject: [PATCH 065/129] change version file location to /opt/tor-snowflake_version.txt --- ct/tor-snowflake.sh | 4 ++-- install/tor-snowflake-install.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index cbfa18f13..ae5086ef2 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -31,7 +31,7 @@ function update_script() { msg_ok "Updated Container OS" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') - if [[ ! -f "/opt/tor-snowflake/version" ]] || [[ "${RELEASE}" != "$(cat "/opt/tor-snowflake/version")" ]]; then + if [[ ! -f "/opt/tor-snowflake_version.txt" ]] || [[ "${RELEASE}" != "$(cat "/opt/tor-snowflake_version.txt")" ]]; then msg_info "Stopping Service" systemctl stop snowflake-proxy msg_ok "Stopped Service" @@ -46,7 +46,7 @@ function update_script() { $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake $STD chown -R snowflake:snowflake /opt/tor-snowflake $STD sudo -H -u snowflake bash -c "cd /opt/tor-snowflake/proxy && go build -o snowflake-proxy ." - echo "${RELEASE}" >/opt/tor-snowflake/version + echo "${RELEASE}" >/opt/tor-snowflake_version.txt msg_ok "Updated Snowflake to v${RELEASE}" msg_info "Starting Service" diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index 145580e82..8ccb7f999 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -27,7 +27,7 @@ $STD rm -rf /opt/snowflake.tar.gz $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake $STD chown -R snowflake:snowflake /opt/tor-snowflake $STD sudo -H -u snowflake bash -c "cd /opt/tor-snowflake/proxy && go build -o snowflake-proxy ." -echo "${RELEASE}" >/opt/tor-snowflake/version +echo "${RELEASE}" >/opt/tor-snowflake_version.txt msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" From 03e2c209638eec6a64be23aae3c133a73fd21c5b Mon Sep 17 00:00:00 2001 From: Marc Went Date: Tue, 30 Dec 2025 15:46:38 +0100 Subject: [PATCH 066/129] 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 067/129] 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 6dd0011ed1396d9aadb20e4f1454614239539ba2 Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Thu, 1 Jan 2026 13:32:15 +0000 Subject: [PATCH 068/129] fix update script app check --- ct/tracearr.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index c25066a3e..39142d781 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -23,7 +23,7 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -f /lib/systemd/system/tracearr.service ]]; then + if [[ ! -f /etc/systemd/system/tracearr.service ]]; then msg_error "No ${APP} Installation Found!" exit fi From d61b83163b71ffb3713199f421e07f9db413363e Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Thu, 1 Jan 2026 14:16:48 +0000 Subject: [PATCH 069/129] import build changes from upstream --- ct/tracearr.sh | 15 ++++++++------- install/tracearr-install.sh | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index 39142d781..124d9f265 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -56,9 +56,10 @@ function update_script() { cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations cp -rf data /opt/tracearr/data + mkdir -p /opt/tracearr/data/image-cache rm -rf /opt/tracearr.build cd /opt/tracearr - $STD pnpm install --prod --frozen-lockfile + $STD pnpm install --prod --frozen-lockfile --ignore-scripts $STD chown -R tracearr:tracearr /opt/tracearr msg_ok "Built Tracearr" @@ -87,9 +88,9 @@ function update_script() { PG_DB_USER=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d'/' -f3 | cut -d':' -f1) PG_DB_PASS=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d':' -f3 | cut -d'@' -f1) { echo "PostgreSQL Credentials" - echo "Database: $PG_DB_NAME" - echo "User: $PG_DB_USER" - echo "Password: $PG_DB_PASS" + echo "Database Name: $PG_DB_NAME" + echo "Database User: $PG_DB_USER" + echo "Database Password: $PG_DB_PASS" } >/root/tracearr.creds msg_ok "Recreated tracearr.creds file from existing .env" else @@ -97,9 +98,9 @@ function update_script() { exit 1 fi else - PG_DB_NAME=$(grep 'Database:' /root/tracearr.creds | awk '{print $2}') - PG_DB_USER=$(grep 'User:' /root/tracearr.creds | awk '{print $2}') - PG_DB_PASS=$(grep 'Password:' /root/tracearr.creds | awk '{print $2}') + PG_DB_NAME=$(grep 'Database Name:' /root/tracearr.creds | awk '{print $3}') + PG_DB_USER=$(grep 'Database User:' /root/tracearr.creds | awk '{print $3}') + PG_DB_PASS=$(grep 'Database Password:' /root/tracearr.creds | awk '{print $3}') fi cat </data/tracearr/.env DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh index dcbc6e7ad..bc5dd6ee6 100644 --- a/install/tracearr-install.sh +++ b/install/tracearr-install.sh @@ -64,9 +64,10 @@ cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations cp -rf data /opt/tracearr/data +mkdir -p /opt/tracearr/data/image-cache rm -rf /opt/tracearr.build cd /opt/tracearr -$STD pnpm install --prod --frozen-lockfile +$STD pnpm install --prod --frozen-lockfile --ignore-scripts msg_ok "Built Tracearr" msg_info "Configuring Tracearr" From 0e76224d4a57e464e8cccd4e0d32fbd18d1deb6b Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 16:31:58 +0100 Subject: [PATCH 070/129] 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 071/129] 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 072/129] 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 80579a457ce74a2a4395a386c7b9e44627d48c5c Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Thu, 1 Jan 2026 20:11:17 +0000 Subject: [PATCH 073/129] remove all .env regeneration logic to satisfy review --- ct/tracearr.sh | 52 ------------------------------------- install/tracearr-install.sh | 17 ++---------- 2 files changed, 2 insertions(+), 67 deletions(-) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index 124d9f265..1a72c2a32 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -64,58 +64,6 @@ function update_script() { msg_ok "Built Tracearr" msg_info "Configuring Tracearr" - if [ ! -d /data/tracearr ]; then - install -d -m 750 -o tracearr -g tracearr /data/tracearr - fi - - if [ -f /data/tracearr/.jwt_secret ]; then - export JWT_SECRET=$(cat /data/tracearr/.jwt_secret) - else - export JWT_SECRET=$(openssl rand -hex 32) - echo "$JWT_SECRET" > /data/tracearr/.jwt_secret - chmod 600 /data/tracearr/.jwt_secret - fi - if [ -f /data/tracearr/.cookie_secret ]; then - export COOKIE_SECRET=$(cat /data/tracearr/.cookie_secret) - else - export COOKIE_SECRET=$(openssl rand -hex 32) - echo "$COOKIE_SECRET" > /data/tracearr/.cookie_secret - chmod 600 /data/tracearr/.cookie_secret - fi - if [ ! -f /root/tracearr.creds ]; then - if [ -f /data/tracearr/.env ]; then - PG_DB_NAME=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d'/' -f4) - PG_DB_USER=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d'/' -f3 | cut -d':' -f1) - PG_DB_PASS=$(grep 'DATABASE_URL=' /data/tracearr/.env | cut -d':' -f3 | cut -d'@' -f1) - { echo "PostgreSQL Credentials" - echo "Database Name: $PG_DB_NAME" - echo "Database User: $PG_DB_USER" - echo "Database Password: $PG_DB_PASS" - } >/root/tracearr.creds - msg_ok "Recreated tracearr.creds file from existing .env" - else - msg_error "No existing tracearr.creds or .env file found. Cannot configure database connection!" - exit 1 - fi - else - PG_DB_NAME=$(grep 'Database Name:' /root/tracearr.creds | awk '{print $3}') - PG_DB_USER=$(grep 'Database User:' /root/tracearr.creds | awk '{print $3}') - PG_DB_PASS=$(grep 'Database Password:' /root/tracearr.creds | awk '{print $3}') - fi - cat </data/tracearr/.env -DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} -REDIS_URL=redis://127.0.0.1:6379 -PORT=3000 -HOST=0.0.0.0 -NODE_ENV=production -TZ=${TZ} -LOG_LEVEL=info -JWT_SECRET=$JWT_SECRET -COOKIE_SECRET=$COOKIE_SECRET -APP_VERSION=$(cat /root/.tracearr) -#CORS_ORIGIN=http://localhost:5173 -#MOBILE_BETA_MODE=true -EOF chmod 600 /data/tracearr/.env chown -R tracearr:tracearr /data/tracearr msg_ok "Configured Tracearr" diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh index bc5dd6ee6..7a3f72277 100644 --- a/install/tracearr-install.sh +++ b/install/tracearr-install.sh @@ -74,21 +74,8 @@ msg_info "Configuring Tracearr" $STD useradd -r -s /bin/false -U tracearr $STD chown -R tracearr:tracearr /opt/tracearr install -d -m 750 -o tracearr -g tracearr /data/tracearr -if [ -f /data/tracearr/.jwt_secret ]; then - export JWT_SECRET=$(cat /data/tracearr/.jwt_secret) -else - export JWT_SECRET=$(openssl rand -hex 32) - echo "$JWT_SECRET" > /data/tracearr/.jwt_secret - chmod 600 /data/tracearr/.jwt_secret -fi - -if [ -f /data/tracearr/.cookie_secret ]; then - export COOKIE_SECRET=$(cat /data/tracearr/.cookie_secret) -else - export COOKIE_SECRET=$(openssl rand -hex 32) - echo "$COOKIE_SECRET" > /data/tracearr/.cookie_secret - chmod 600 /data/tracearr/.cookie_secret -fi +export JWT_SECRET=$(openssl rand -hex 32) +export COOKIE_SECRET=$(openssl rand -hex 32) cat </data/tracearr/.env DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} REDIS_URL=redis://127.0.0.1:6379 From 61ef62b67d381ba5c51f62a06750ab1170c83fb1 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Thu, 1 Jan 2026 21:11:49 +0100 Subject: [PATCH 074/129] 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 075/129] 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 076/129] 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 077/129] 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 078/129] 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 079/129] 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 080/129] 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 081/129] 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 aca555c06863da0d2caa1c47b7d71e43f6bcdbf3 Mon Sep 17 00:00:00 2001 From: tremor021 Date: Wed, 7 Jan 2026 19:23:25 +0100 Subject: [PATCH 082/129] 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 083/129] 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 084/129] 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 085/129] 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 086/129] 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 087/129] 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 088/129] 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 089/129] 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 090/129] 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 091/129] 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 From 8c551c881ddc3132676a20a6c8cc4e26689c7efd Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:20:52 +0100 Subject: [PATCH 092/129] Clean up comments in tracearr-install.sh Removed comments about RAM allocation for timescaledb-tune. --- install/tracearr-install.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh index 7a3f72277..57c71d715 100644 --- a/install/tracearr-install.sh +++ b/install/tracearr-install.sh @@ -32,9 +32,6 @@ $STD apt install -y \ timescaledb-2-postgresql-18 \ timescaledb-tools \ timescaledb-toolkit-postgresql-18 -# give timescaledb-tune 50% of total ram in MB -# we need to leave the rest for redis and the webserver. -# We cant use $RAM_SIZE or $var_ram here, which is annoying. total_ram_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}') ram_for_tsdb=$((total_ram_kb / 1024 / 2)) $STD timescaledb-tune -yes -memory "$ram_for_tsdb"MB From bed6e8bc983115c619593ad89a5548fa35eeda5b Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:34:35 +0100 Subject: [PATCH 093/129] Update release version output location --- install/tor-snowflake-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tor-snowflake-install.sh b/install/tor-snowflake-install.sh index 8ccb7f999..24c4a564a 100644 --- a/install/tor-snowflake-install.sh +++ b/install/tor-snowflake-install.sh @@ -27,7 +27,7 @@ $STD rm -rf /opt/snowflake.tar.gz $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake $STD chown -R snowflake:snowflake /opt/tor-snowflake $STD sudo -H -u snowflake bash -c "cd /opt/tor-snowflake/proxy && go build -o snowflake-proxy ." -echo "${RELEASE}" >/opt/tor-snowflake_version.txt +echo "${RELEASE}" >~/.tor-snowflake msg_ok "Built Snowflake Proxy v${RELEASE}" msg_info "Creating Service" From b26566d8f93f854fe3e6b6031005557f825b68a7 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:36:26 +0100 Subject: [PATCH 094/129] Update snowflake version storage location --- ct/tor-snowflake.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index ae5086ef2..2125380b5 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -31,7 +31,7 @@ function update_script() { msg_ok "Updated Container OS" RELEASE=$(curl -fsSL https://gitlab.torproject.org/api/v4/projects/tpo%2Fanti-censorship%2Fpluggable-transports%2Fsnowflake/releases | jq -r '.[0].tag_name' | sed 's/^v//') - if [[ ! -f "/opt/tor-snowflake_version.txt" ]] || [[ "${RELEASE}" != "$(cat "/opt/tor-snowflake_version.txt")" ]]; then + if [[ ! -f "~/.tor-snowflake" ]] || [[ "${RELEASE}" != "$(cat "~/.tor-snowflake")" ]]; then msg_info "Stopping Service" systemctl stop snowflake-proxy msg_ok "Stopped Service" @@ -46,7 +46,7 @@ function update_script() { $STD mv /opt/snowflake-v${RELEASE} /opt/tor-snowflake $STD chown -R snowflake:snowflake /opt/tor-snowflake $STD sudo -H -u snowflake bash -c "cd /opt/tor-snowflake/proxy && go build -o snowflake-proxy ." - echo "${RELEASE}" >/opt/tor-snowflake_version.txt + echo "${RELEASE}" >~/.tor-snowflake msg_ok "Updated Snowflake to v${RELEASE}" msg_info "Starting Service" From 0f5ea21f0a2cbdd75777f8256d83dc8cf3f3b691 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:42:59 +0100 Subject: [PATCH 095/129] refactor --- ct/tracearr.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index 1a72c2a32..cf77b25ec 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -35,7 +35,6 @@ function update_script() { PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" msg_info "Building Tracearr" @@ -80,7 +79,7 @@ start build_container description -msg_ok "Completed Successfully!\n" +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}:3000${CL}" From 902ed1a2705f26f41d23f305ebe4cd1f608c67e6 Mon Sep 17 00:00:00 2001 From: Tobias Date: Fri, 9 Jan 2026 14:09:20 +0100 Subject: [PATCH 096/129] yubal fix env --- ct/yubal.sh | 8 -------- install/yubal-install.sh | 6 +++--- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/ct/yubal.sh b/ct/yubal.sh index ad57ca984..8be7de01d 100644 --- a/ct/yubal.sh +++ b/ct/yubal.sh @@ -34,16 +34,8 @@ function update_script() { systemctl stop yubal msg_ok "Stopped Services" - msg_info "Backing up" - cp /opt/yubal/.env /opt/yubal.env - msg_ok "Backed up" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "yubal" "guillevc/yubal" "tarball" "latest" "/opt/yubal" - msg_info "Restoring Backup" - mv /opt/yubal.env /opt/yubal/.env - msg_ok "Restored Backup" - msg_info "Building Frontend" cd /opt/yubal/web $STD bun install --frozen-lockfile diff --git a/install/yubal-install.sh b/install/yubal-install.sh index 4e2b9d2eb..c007e0317 100644 --- a/install/yubal-install.sh +++ b/install/yubal-install.sh @@ -57,9 +57,9 @@ $STD uv sync --no-dev --frozen msg_ok "Installed Python Dependencies" msg_info "Creating Service" -cat </opt/yubal/.env +cat </opt/yubal.env YUBAL_HOST=0.0.0.0 -YUBAL_PORT=8000 +YUBAL_PORT=8001 YUBAL_DATA_DIR=/opt/yubal_data YUBAL_BEETS_DIR=/opt/yubal/beets YUBAL_YTDLP_DIR=/opt/yubal/ytdlp @@ -74,7 +74,7 @@ After=network.target Type=simple User=root WorkingDirectory=/opt/yubal -EnvironmentFile=/opt/yubal/.env +EnvironmentFile=/opt/yubal.env Environment="PATH=/opt/yubal/.venv/bin:/usr/local/bin:/usr/bin:/bin" ExecStart=/opt/yubal/.venv/bin/python -m yubal Restart=always From ca1203753cd327429cddef1d3a3e9a3e78dcfe95 Mon Sep 17 00:00:00 2001 From: vhsdream Date: Fri, 9 Jan 2026 08:13:51 -0500 Subject: [PATCH 097/129] nextExplorer: add Collabora integration options --- install/nextexplorer-install.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install/nextexplorer-install.sh b/install/nextexplorer-install.sh index 355221cb4..1d7b40dd3 100644 --- a/install/nextexplorer-install.sh +++ b/install/nextexplorer-install.sh @@ -91,6 +91,12 @@ SESSION_SECRET="${SECRET}" # ONLYOFFICE_FORCE_SAVE= # ONLYOFFICE_FILE_EXTENSIONS= +# COLLABORA_URL= +# COLLABORA_DISCOVERY_URL= +# COLLABORA_SECRET= +# COLLABORA_LANG= +# COLLABORA_FILE_EXTENSIONS= + SHOW_VOLUME_USAGE=true # USER_DIR_ENABLED= # SKIP_HOME= From b14bb9158e7d31b50fc7652e99d467429d7c740e Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 9 Jan 2026 14:28:56 +0100 Subject: [PATCH 098/129] Add workflow to create/update issues on New script merge --- .github/workflows/update_issue.yml | 165 +++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 .github/workflows/update_issue.yml diff --git a/.github/workflows/update_issue.yml b/.github/workflows/update_issue.yml new file mode 100644 index 000000000..38b339057 --- /dev/null +++ b/.github/workflows/update_issue.yml @@ -0,0 +1,165 @@ +name: Update Issue on PR Merge + +on: + pull_request: + types: [closed] + branches: + - main + +permissions: + issues: write + pull-requests: read + +jobs: + update_issues: + if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVED' + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Extract Script Names from Changed Files + id: extract_scripts + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + CHANGED_FILES=$(gh pr diff ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --name-only) + + SCRIPT_NAMES=() + + while IFS= read -r FILE; do + if [[ $FILE =~ ^ct/(.+)\.sh$ ]]; then + SCRIPT_NAME="${BASH_REMATCH[1]}" + if [[ ! " ${SCRIPT_NAMES[@]} " =~ " ${SCRIPT_NAME} " ]]; then + SCRIPT_NAMES+=("$SCRIPT_NAME") + fi + elif [[ $FILE =~ ^install/(.+)-install\.sh$ ]]; then + SCRIPT_NAME="${BASH_REMATCH[1]}" + if [[ ! " ${SCRIPT_NAMES[@]} " =~ " ${SCRIPT_NAME} " ]]; then + SCRIPT_NAMES+=("$SCRIPT_NAME") + fi + fi + done <<< "$CHANGED_FILES" + + if [ ${#SCRIPT_NAMES[@]} -eq 0 ]; then + echo "No script files found in PR" + echo "script_names=[]" >> $GITHUB_OUTPUT + exit 0 + fi + + JSON_NAMES=$(printf '%s\n' "${SCRIPT_NAMES[@]}" | jq -R . | jq -s .) + echo "script_names=$JSON_NAMES" >> $GITHUB_OUTPUT + echo "Found script names: ${SCRIPT_NAMES[*]}" + + - name: Process Each Script + if: steps.extract_scripts.outputs.script_names != '[]' + uses: actions/github-script@v7 + env: + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + SCRIPT_NAMES: ${{ steps.extract_scripts.outputs.script_names }} + with: + script: | + const scriptNames = JSON.parse(process.env.SCRIPT_NAMES); + const prAuthor = process.env.PR_AUTHOR; + const message = `@${prAuthor} This PR got merged now and is in the testing phase, it will be migrated to ProxmoxVE when testing is completed`; + const labelName = 'Ready For Testing'; + + for (const scriptName of scriptNames) { + console.log(`Processing script: ${scriptName}`); + + const { data: issues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + per_page: 100 + }); + + const scriptNameLower = scriptName.toLowerCase(); + let existingIssue = issues.find(issue => + !issue.pull_request && issue.title.toLowerCase() === scriptNameLower + ); + + if (!existingIssue) { + const { data: searchResults } = await github.rest.search.issuesAndPullRequests({ + q: `repo:${context.repo.owner}/${context.repo.repo} is:issue is:open ${scriptName}`, + per_page: 100 + }); + + existingIssue = searchResults.items.find(issue => + issue.title.toLowerCase() === scriptNameLower + ); + } + + if (existingIssue) { + console.log(`Found existing issue #${existingIssue.number}: ${existingIssue.title}`); + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: existingIssue.number, + body: message + }); + + const { data: labels } = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: existingIssue.number + }); + + const hasLabel = labels.some(label => label.name === labelName); + + if (!hasLabel) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: existingIssue.number, + labels: [labelName] + }); + console.log(`Added "${labelName}" label to issue #${existingIssue.number}`); + } else { + console.log(`Issue #${existingIssue.number} already has "${labelName}" label`); + } + } else { + console.log(`No existing issue found for "${scriptName}", creating new issue`); + + const scriptType = 'CT (LXC Container)'; + + const formattedName = scriptName + .split(/[-_]/) + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(' '); + + const issueBody = `# 🛠️ **New Script** +Create an Issue when you want to merge a new Script. The name of the Issue must be the same as your APP.sh file. (Example: SnipeIT, snipeit.sh; Alpine-Docker, alpine-docker.sh) + +### Name of the Script + +${formattedName} + +### Script Type + +${scriptType} + +### 📋 Script Details + +This script has been merged and is ready for testing. ${message}`; + + const { data: newIssue } = await github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: scriptName, + body: issueBody, + labels: ['task', labelName] + }); + + console.log(`Created new issue #${newIssue.number}: ${newIssue.title}`); + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: newIssue.number, + body: message + }); + } + } + From e73c618c4f63eaff077f2890b7a118539cf86737 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 9 Jan 2026 14:38:51 +0100 Subject: [PATCH 099/129] Add workflow to create/update issues on New script merge --- .github/workflows/update_issue.yml | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/.github/workflows/update_issue.yml b/.github/workflows/update_issue.yml index 38b339057..20d1ac678 100644 --- a/.github/workflows/update_issue.yml +++ b/.github/workflows/update_issue.yml @@ -129,20 +129,14 @@ jobs: .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) .join(' '); - const issueBody = `# 🛠️ **New Script** -Create an Issue when you want to merge a new Script. The name of the Issue must be the same as your APP.sh file. (Example: SnipeIT, snipeit.sh; Alpine-Docker, alpine-docker.sh) - -### Name of the Script - -${formattedName} - -### Script Type - -${scriptType} - -### 📋 Script Details - -This script has been merged and is ready for testing. ${message}`; + const issueBody = '# 🛠️ **New Script**\n' + + 'Create an Issue when you want to merge a new Script. The name of the Issue must be the same as your APP.sh file. (Example: SnipeIT, snipeit.sh; Alpine-Docker, alpine-docker.sh)\n\n' + + '### Name of the Script\n\n' + + formattedName + '\n\n' + + '### Script Type\n\n' + + scriptType + '\n\n' + + '### 📋 Script Details\n\n' + + 'This script has been merged and is ready for testing. ' + message; const { data: newIssue } = await github.rest.issues.create({ owner: context.repo.owner, From 986700fe4c1907b91fe1dbca3b8c9797a046506f Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 9 Jan 2026 14:46:38 +0100 Subject: [PATCH 100/129] Add workflow to create/update issues on New script merge --- .github/workflows/update_issue.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_issue.yml b/.github/workflows/update_issue.yml index 20d1ac678..569c808c8 100644 --- a/.github/workflows/update_issue.yml +++ b/.github/workflows/update_issue.yml @@ -47,7 +47,7 @@ jobs: exit 0 fi - JSON_NAMES=$(printf '%s\n' "${SCRIPT_NAMES[@]}" | jq -R . | jq -s .) + JSON_NAMES=$(printf '%s\n' "${SCRIPT_NAMES[@]}" | jq -R . | jq -s -c .) echo "script_names=$JSON_NAMES" >> $GITHUB_OUTPUT echo "Found script names: ${SCRIPT_NAMES[*]}" From b326c65fb42d024c7e50c1149b1f7219ba08a206 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 9 Jan 2026 14:50:26 +0100 Subject: [PATCH 101/129] test Workflow --- ct/test.sh | 0 install/test-install.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ct/test.sh create mode 100644 install/test-install.sh diff --git a/ct/test.sh b/ct/test.sh new file mode 100644 index 000000000..e69de29bb diff --git a/install/test-install.sh b/install/test-install.sh new file mode 100644 index 000000000..e69de29bb From 36f749cba2971605454439f08d3f4d4747e75a88 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 9 Jan 2026 14:52:51 +0100 Subject: [PATCH 102/129] Update Workflow --- .github/workflows/update_issue.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_issue.yml b/.github/workflows/update_issue.yml index 569c808c8..6f0cc64bb 100644 --- a/.github/workflows/update_issue.yml +++ b/.github/workflows/update_issue.yml @@ -136,14 +136,14 @@ jobs: '### Script Type\n\n' + scriptType + '\n\n' + '### 📋 Script Details\n\n' + - 'This script has been merged and is ready for testing. ' + message; + 'This script has been merged and is ready for testing. '; const { data: newIssue } = await github.rest.issues.create({ owner: context.repo.owner, repo: context.repo.repo, title: scriptName, body: issueBody, - labels: ['task', labelName] + labels: [labelName] }); console.log(`Created new issue #${newIssue.number}: ${newIssue.title}`); From 24081cf2057662d1532011d129aa2b1b02e45640 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:55:40 +0100 Subject: [PATCH 103/129] Delete ct/test.sh --- ct/test.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ct/test.sh diff --git a/ct/test.sh b/ct/test.sh deleted file mode 100644 index e69de29bb..000000000 From bdf39953786b6af0d6dd720484da0a5f9724ac68 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:57:03 +0100 Subject: [PATCH 104/129] Delete install/test-install.sh --- install/test-install.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 install/test-install.sh diff --git a/install/test-install.sh b/install/test-install.sh deleted file mode 100644 index e69de29bb..000000000 From 041fef02b04a4c8143884f73aec9f4df02964f9e Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 15:16:05 +0100 Subject: [PATCH 105/129] Export PHP_VERSION for setup_php --- install/investbrain-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/investbrain-install.sh b/install/investbrain-install.sh index 119972787..58c8fb8e8 100644 --- a/install/investbrain-install.sh +++ b/install/investbrain-install.sh @@ -27,7 +27,8 @@ $STD apt install -y \ libpq-dev msg_ok "Installed Dependencies" -PHP_VERSION="8.4" PHP_FPM=YES PHP_MODULE="gd,zip,intl,pdo,pgsql,pdo-pgsql,bcmath,opcache,mbstring,redis" setup_php +export PHP_VERSION="8.4" +PHP_FPM=YES PHP_MODULE="gd,zip,intl,pdo,pgsql,pdo-pgsql,bcmath,opcache,mbstring,redis" setup_php setup_composer NODE_VERSION="22" setup_nodejs PG_VERSION="17" setup_postgresql From 0121cb15a804381fbdb58ae642571ea4bf6b97d4 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 15:26:12 +0100 Subject: [PATCH 106/129] Fix composer install command path --- install/investbrain-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/investbrain-install.sh b/install/investbrain-install.sh index 58c8fb8e8..375499948 100644 --- a/install/investbrain-install.sh +++ b/install/investbrain-install.sh @@ -93,7 +93,7 @@ MAIL_FROM_ADDRESS="investbrain@${LOCAL_IP}" VITE_APP_NAME=Investbrain EOF export COMPOSER_ALLOW_SUPERUSER=1 -$STD composer install --no-interaction --no-dev --optimize-autoloader +$STD /usr/local/bin/composer install --no-interaction --no-dev --optimize-autoloader $STD npm install $STD npm run build mkdir -p /opt/investbrain/storage/{framework/cache,framework/sessions,framework/views,app,logs} From 46d36537c9c421014eba3e5d43b78e22c8d17891 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 15:27:35 +0100 Subject: [PATCH 107/129] fix --- ct/investbrain.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ct/investbrain.sh b/ct/investbrain.sh index 4539f8a94..ea5f3f48c 100644 --- a/ct/investbrain.sh +++ b/ct/investbrain.sh @@ -33,7 +33,7 @@ function update_script() { PHP_VERSION="8.4" msg_info "Stopping Services" systemctl stop nginx php${PHP_VERSION}-fpm - supervisorctl stop all + $STD supervisorctl stop all msg_ok "Services Stopped" PHP_FPM=YES PHP_MODULE="gd,zip,intl,pdo,pgsql,pdo-pgsql,bcmath,opcache,mbstring,redis" setup_php @@ -56,7 +56,7 @@ function update_script() { cp /opt/.env.backup /opt/investbrain/.env cp -r /opt/investbrain_backup/ /opt/investbrain/storage export COMPOSER_ALLOW_SUPERUSER=1 - $STD composer install --no-interaction --no-dev --optimize-autoloader + $STD /usr/local/bin/composer install --no-interaction --no-dev --optimize-autoloader $STD npm install $STD npm run build $STD php artisan storage:link @@ -74,7 +74,7 @@ function update_script() { msg_info "Starting Services" systemctl start php${PHP_VERSION}-fpm nginx - supervisorctl start all + $STD supervisorctl start all msg_ok "Services Started" msg_ok "Updated Successfully!" fi From 36682d2728fe4fe6720da471cdbc747bc49c30dd Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 20:36:27 +0100 Subject: [PATCH 108/129] Update package installation to use noninteractive mode --- misc/tools.func | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/misc/tools.func b/misc/tools.func index 1a58ab825..69155a0f0 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -184,7 +184,10 @@ install_packages_with_retry() { local retry=0 while [[ $retry -le $max_retries ]]; do - if $STD apt install -y "${packages[@]}" 2>/dev/null; then + if DEBIAN_FRONTEND=noninteractive $STD apt install -y \ + -o Dpkg::Options::="--force-confdef" \ + -o Dpkg::Options::="--force-confold" \ + "${packages[@]}" 2>/dev/null; then return 0 fi @@ -211,8 +214,10 @@ upgrade_packages_with_retry() { local retry=0 while [[ $retry -le $max_retries ]]; do - if $STD apt install --only-upgrade -y "${packages[@]}" 2>/dev/null; then - return 0 + if DEBIAN_FRONTEND=noninteractive $STD apt install --only-upgrade -y \ + -o Dpkg::Options::="--force-confdef" \ + -o Dpkg::Options::="--force-confold" \ + "${packages[@]}" 2>/dev/null; then fi retry=$((retry + 1)) From 6ef806710f7bf924a1915b462d75e60edbb3a2cb Mon Sep 17 00:00:00 2001 From: Tom Frenzel Date: Fri, 9 Jan 2026 21:41:55 +0100 Subject: [PATCH 109/129] kutt: fix default domain --- install/kutt-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/kutt-install.sh b/install/kutt-install.sh index b2330fe0f..3482fbb50 100644 --- a/install/kutt-install.sh +++ b/install/kutt-install.sh @@ -47,7 +47,7 @@ msg_info "Configuring Kutt" cd /opt/kutt cp .example.env ".env" sed -i "s|JWT_SECRET=|JWT_SECRET=$(openssl rand -base64 32)|g" ".env" -sed -i "s|DEFAULT_DOMAIN=.*|DEFAULT_DOMAIN=https://$DEFAULT_HOST|g" ".env" +sed -i "s|DEFAULT_DOMAIN=.*|DEFAULT_DOMAIN=$DEFAULT_HOST|g" ".env" $STD npm install $STD npm run migrate msg_ok "Configured Kutt" From 6df299a13a65e1273c6211f134c901431bd2e976 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Fri, 9 Jan 2026 22:38:16 +0100 Subject: [PATCH 110/129] Fix return statement in package installation function --- misc/tools.func | 1 + 1 file changed, 1 insertion(+) diff --git a/misc/tools.func b/misc/tools.func index 69155a0f0..f38e3e268 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -218,6 +218,7 @@ upgrade_packages_with_retry() { -o Dpkg::Options::="--force-confdef" \ -o Dpkg::Options::="--force-confold" \ "${packages[@]}" 2>/dev/null; then + return 0 fi retry=$((retry + 1)) From c93788cf8942d8dabf59e802e3cd70b7a908f91d Mon Sep 17 00:00:00 2001 From: MickLesk Date: Fri, 9 Jan 2026 22:42:21 +0100 Subject: [PATCH 111/129] fix ente --- ct/ente.sh | 28 ++++----- install/ente-install.sh | 134 +++++++++++++--------------------------- 2 files changed, 56 insertions(+), 106 deletions(-) diff --git a/ct/ente.sh b/ct/ente.sh index 7e71a7303..b2043bf9f 100644 --- a/ct/ente.sh +++ b/ct/ente.sh @@ -8,10 +8,10 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxV APP="Ente" var_tags="${var_tags:-photos}" var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-10}" +var_ram="${var_ram:-6144}" +var_disk="${var_disk:-20}" var_os="${var_os:-debian}" -var_version="${var_version:-12}" +var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" @@ -20,18 +20,18 @@ color catch_errors function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d /var ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - msg_info "Updating Ente LXC" - $STD apt-get update - $STD apt-get -y upgrade - msg_ok "Updated Ente LXC" + header_info + check_container_storage + check_container_resources + if [[ ! -d /var ]]; then + msg_error "No ${APP} Installation Found!" exit + fi + msg_info "Updating Ente LXC" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated Ente LXC" + exit } start diff --git a/install/ente-install.sh b/install/ente-install.sh index fa77381d8..7b78adabe 100644 --- a/install/ente-install.sh +++ b/install/ente-install.sh @@ -14,19 +14,22 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ +$STD apt install -y \ libsodium23 \ libsodium-dev \ pkg-config \ caddy \ - gcc \ - curl \ - jq + gcc msg_ok "Installed Dependencies" PG_VERSION="17" setup_postgresql +PG_DB_NAME="ente_db" PG_DB_USER="ente" setup_postgresql_db setup_go NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs +RUST_CRATES="wasm-pack" setup_rust +$STD rustup target add wasm32-unknown-unknown +import_local_ip + ENTE_CLI_VERSION=$(curl -s https://api.github.com/repos/ente-io/ente/releases | jq -r '[.[] | select(.tag_name | startswith("cli-v"))][0].tag_name') fetch_and_deploy_gh_release "ente-server" "ente-io/ente" "tarball" "latest" "/opt/ente" fetch_and_deploy_gh_release "ente-cli" "ente-io/ente" "prebuild" "$ENTE_CLI_VERSION" "/usr/local/bin" "ente-$ENTE_CLI_VERSION-linux-amd64.tar.gz" @@ -45,28 +48,15 @@ endpoint: EOF msg_ok "Configured Ente CLI" -msg_info "Setting up PostgreSQL" -DB_NAME="ente_db" -DB_USER="ente" -DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" -$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" -$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" +msg_info "Saving Ente Credentials" { - echo "Ente Credentials" - echo "Database Name: $DB_NAME" - echo "Database User: $DB_USER" - echo "Database Password: $DB_PASS" - echo "" echo "Important Configuration Notes:" - echo "- Frontend is built with IP: $(hostname -I | awk '{print $1}')" + echo "- Frontend is built with IP: $LOCAL_IP" echo "- If IP changes, run: /opt/ente/rebuild-frontend.sh" - echo "- Museum API: http://$(hostname -I | awk '{print $1}'):8080" - echo "- Photos UI: http://$(hostname -I | awk '{print $1}'):3000" - echo "- Accounts UI: http://$(hostname -I | awk '{print $1}'):3001" - echo "- Auth UI: http://$(hostname -I | awk '{print $1}'):3003" + echo "- Museum API: http://$LOCAL_IP:8080" + echo "- Photos UI: http://$LOCAL_IP:3000" + echo "- Accounts UI: http://$LOCAL_IP:3001" + echo "- Auth UI: http://$LOCAL_IP:3003" echo "" echo "Post-Installation Steps Required:" echo "1. Create your first user account via the web UI" @@ -78,7 +68,7 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" echo "" echo "Note: Email verification requires manual intervention since SMTP is not configured" } >>~/ente.creds -msg_ok "Set up PostgreSQL" +msg_ok "Saved Ente Credentials" msg_info "Building Museum (server)" cd /opt/ente/server @@ -105,14 +95,13 @@ SECRET_JWT=$(go run tools/gen-random-keys/main.go 2>/dev/null | grep "jwt" | awk msg_ok "Generated Secrets" msg_info "Creating museum.yaml" -CONTAINER_IP=$(hostname -I | awk '{print $1}') cat </opt/ente/server/museum.yaml db: host: 127.0.0.1 port: 5432 - name: $DB_NAME - user: $DB_USER - password: $DB_PASS + name: $PG_DB_NAME + user: $PG_DB_USER + password: $PG_DB_PASS s3: are_local_buckets: true @@ -125,9 +114,9 @@ s3: bucket: ente-dev apps: - public-albums: http://${CONTAINER_IP}:3002 - cast: http://${CONTAINER_IP}:3004 - accounts: http://${CONTAINER_IP}:3001 + public-albums: http://${LOCAL_IP}:3002 + cast: http://${LOCAL_IP}:3004 + accounts: http://${LOCAL_IP}:3001 key: encryption: $SECRET_ENC @@ -149,26 +138,24 @@ msg_ok "Created museum.yaml" read -r -p "Enter the public URL for Ente backend (e.g., https://api.ente.yourdomain.com or http://192.168.1.100:8080) leave empty to use container IP: " backend_url if [[ -z "$backend_url" ]]; then - LOCAL_IP=$(hostname -I | awk '{print $1}') - ENTE_BACKEND_URL="http://$LOCAL_IP:8080" - msg_info "No URL provided" - msg_ok "using local IP: $ENTE_BACKEND_URL\n" + ENTE_BACKEND_URL="http://$LOCAL_IP:8080" + msg_info "No URL provided" + msg_ok "using local IP: $ENTE_BACKEND_URL\n" else - ENTE_BACKEND_URL="$backend_url" - msg_info "URL provided" - msg_ok "Using provided URL: $ENTE_BACKEND_URL\n" + ENTE_BACKEND_URL="$backend_url" + msg_info "URL provided" + msg_ok "Using provided URL: $ENTE_BACKEND_URL\n" fi read -r -p "Enter the public URL for Ente albums (e.g., https://albums.ente.yourdomain.com or http://192.168.1.100:3002) leave empty to use container IP: " albums_url if [[ -z "$albums_url" ]]; then - LOCAL_IP=$(hostname -I | awk '{print $1}') - ENTE_ALBUMS_URL="http://$LOCAL_IP:3002" - msg_info "No URL provided" - msg_ok "using local IP: $ENTE_ALBUMS_URL\n" + ENTE_ALBUMS_URL="http://$LOCAL_IP:3002" + msg_info "No URL provided" + msg_ok "using local IP: $ENTE_ALBUMS_URL\n" else - ENTE_ALBUMS_URL="$albums_url" - msg_info "URL provided" - msg_ok "Using provided URL: $ENTE_ALBUMS_URL\n" + ENTE_ALBUMS_URL="$albums_url" + msg_info "URL provided" + msg_ok "Using provided URL: $ENTE_ALBUMS_URL\n" fi export NEXT_PUBLIC_ENTE_ENDPOINT=$ENTE_BACKEND_URL @@ -177,6 +164,7 @@ export NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=$ENTE_ALBUMS_URL msg_info "Building Web Applications" cd /opt/ente/web export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +source "$HOME/.cargo/env" $STD yarn install $STD yarn build $STD yarn build:accounts @@ -188,7 +176,6 @@ cp -r apps/accounts/out /var/www/ente/apps/accounts cp -r apps/auth/out /var/www/ente/apps/auth cp -r apps/cast/out /var/www/ente/apps/cast -# Save build configuration for future rebuilds cat </opt/ente/rebuild-frontend.sh #!/usr/bin/env bash # Rebuild Ente frontend @@ -219,6 +206,8 @@ export NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=\$ENTE_ALBUMS_URL echo "Building Web Applications\n" +# Ensure Rust/wasm-pack is available for WASM build +source "\$HOME/.cargo/env" cd /opt/ente/web yarn build yarn build:accounts @@ -253,7 +242,6 @@ systemctl enable -q --now ente-museum msg_ok "Created Museum Service" msg_info "Configuring Caddy" -CONTAINER_IP=$(hostname -I | awk '{print $1}') cat </etc/caddy/Caddyfile # Ente Photos - Main Application :3000 { @@ -334,18 +322,15 @@ EOF systemctl reload caddy msg_ok "Configured Caddy" -motd_ssh -customize - msg_info "Creating helper scripts" -cat <<'HELPER_EOF' >/usr/local/bin/ente-get-verification +cat <<'EOF' >/usr/local/bin/ente-get-verification #!/usr/bin/env bash echo "Searching for verification codes in museum logs..." journalctl -u ente-museum --no-pager | grep -i "verification\|verify\|code" | tail -20 -HELPER_EOF +EOF chmod +x /usr/local/bin/ente-get-verification -cat <<'HELPER_EOF' >/usr/local/bin/ente-upgrade-subscription +cat <<'EOF' >/usr/local/bin/ente-upgrade-subscription #!/usr/bin/env bash if [ -z "$1" ]; then echo "Usage: ente-upgrade-subscription " @@ -355,46 +340,11 @@ fi EMAIL="$1" echo "Upgrading subscription for: $EMAIL" ente admin update-subscription -a "$EMAIL" -u "$EMAIL" --no-limit -HELPER_EOF +EOF chmod +x /usr/local/bin/ente-upgrade-subscription msg_ok "Created helper scripts" -msg_info "Cleaning up" -$STD apt -y autoremove -$STD apt -y autoclean -msg_ok "Cleaned" - -# Final setup summary -CONTAINER_IP=$(hostname -I | awk '{print $1}') -echo -e "\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo -e " ${GN}Ente Installation Complete!${CL}" -echo -e "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo -e "\n${BL}Access URLs:${CL}" -echo -e " Photos: http://${CONTAINER_IP}:3000" -echo -e " Accounts: http://${CONTAINER_IP}:3001" -echo -e " Albums: ${ENTE_ALBUMS_URL}" -echo -e " Auth: http://${CONTAINER_IP}:3003" -echo -e " API: ${ENTE_BACKEND_URL}" -echo -e "\n${YW}⚠️ Important Post-Installation Steps:${CL}" -echo -e "\n${BL}1. Create your first account:${CL}" -echo -e " • Open http://${CONTAINER_IP}:3000 in your browser" -echo -e " • Click 'Sign Up' and create an account" -echo -e "\n${BL}2. Verify your email (required):${CL}" -echo -e " • Run: ${GN}ente-get-verification${CL}" -echo -e " • Look for the verification code in the output" -echo -e " • Enter the code in the web UI to complete registration" -echo -e "\n${BL}3. Remove storage limit:${CL}" -echo -e " • After email verification is complete" -echo -e " • Run: ${GN}ente-upgrade-subscription your@email.com${CL}" -echo -e " • This removes the 10GB limit" -echo -e "\n${BL}4. If IP changes:${CL}" -echo -e " • Run: ${GN}/opt/ente/rebuild-frontend.sh${CL}" -echo -e " • This rebuilds the frontend with the new IP" -echo -e "\n${YW}Known Limitations:${CL}" -echo -e " • Email verification requires checking logs (no SMTP configured)" -echo -e " • Account creation must be done manually via web UI" -echo -e " • Subscription upgrade requires CLI after account creation" -echo -e " • Frontend must be rebuilt if container IP changes" -echo -e "\n${BL}Credentials saved to:${CL} ~/ente.creds" -echo -e "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +motd_ssh +customize +cleanup_lxc From 9c05bf6a3134c108733073926c8d8f32f216a672 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Fri, 9 Jan 2026 22:47:04 +0100 Subject: [PATCH 112/129] finish messsage --- ct/ente.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ct/ente.sh b/ct/ente.sh index b2043bf9f..c234048b7 100644 --- a/ct/ente.sh +++ b/ct/ente.sh @@ -38,5 +38,7 @@ start build_container description -msg_ok "Completed successfully!" -msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!" +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}:3000${CL}" From cfbfe827f9115d6f83acb78a19a6264297fa9033 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Fri, 9 Jan 2026 22:59:31 +0100 Subject: [PATCH 113/129] fix awk eof --- install/ente-install.sh | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/install/ente-install.sh b/install/ente-install.sh index 7b78adabe..cd252832a 100644 --- a/install/ente-install.sh +++ b/install/ente-install.sh @@ -176,38 +176,38 @@ cp -r apps/accounts/out /var/www/ente/apps/accounts cp -r apps/auth/out /var/www/ente/apps/auth cp -r apps/cast/out /var/www/ente/apps/cast -cat </opt/ente/rebuild-frontend.sh +cat <<'EOF' >/opt/ente/rebuild-frontend.sh #!/usr/bin/env bash # Rebuild Ente frontend # Prompt for backend URL read -r -p "Enter the public URL for Ente backend (e.g., https://api.ente.yourdomain.com or http://192.168.1.100:8080) leave empty to use container IP: " backend_url -if [[ -z "\$backend_url" ]]; then +if [[ -z "$backend_url" ]]; then LOCAL_IP=$(hostname -I | awk '{print $1}') - ENTE_BACKEND_URL="http://\$LOCAL_IP:8080" - echo "No URL provided, using local IP: \$ENTE_BACKEND_URL\n" + ENTE_BACKEND_URL="http://$LOCAL_IP:8080" + echo "No URL provided, using local IP: $ENTE_BACKEND_URL" else - ENTE_BACKEND_URL="\$backend_url" - echo "Using provided URL: \$ENTE_BACKEND_URL\n" + ENTE_BACKEND_URL="$backend_url" + echo "Using provided URL: $ENTE_BACKEND_URL" fi # Prompt for albums URL read -r -p "Enter the public URL for Ente albums (e.g., https://albums.ente.yourdomain.com or http://192.168.1.100:3002) leave empty to use container IP: " albums_url -if [[ -z "\$albums_url" ]]; then - LOCAL_IP=\$(hostname -I | awk '{print $1}') - ENTE_ALBUMS_URL="http://\$LOCAL_IP:3002" - echo "No URL provided, using local IP: \$ENTE_ALBUMS_URL\n" +if [[ -z "$albums_url" ]]; then + LOCAL_IP=$(hostname -I | awk '{print $1}') + ENTE_ALBUMS_URL="http://$LOCAL_IP:3002" + echo "No URL provided, using local IP: $ENTE_ALBUMS_URL" else - ENTE_ALBUMS_URL="\$albums_url" - echo "Using provided URL: \$ENTE_ALBUMS_URL\n" + ENTE_ALBUMS_URL="$albums_url" + echo "Using provided URL: $ENTE_ALBUMS_URL" fi -export NEXT_PUBLIC_ENTE_ENDPOINT=\$ENTE_BACKEND_URL -export NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=\$ENTE_ALBUMS_URL +export NEXT_PUBLIC_ENTE_ENDPOINT=$ENTE_BACKEND_URL +export NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=$ENTE_ALBUMS_URL -echo "Building Web Applications\n" +echo "Building Web Applications..." # Ensure Rust/wasm-pack is available for WASM build -source "\$HOME/.cargo/env" +source "$HOME/.cargo/env" cd /opt/ente/web yarn build yarn build:accounts @@ -220,7 +220,7 @@ cp -r apps/auth/out /var/www/ente/apps/auth cp -r apps/cast/out /var/www/ente/apps/cast systemctl reload caddy echo "Frontend rebuilt successfully!" -REBUILD_EOF +EOF chmod +x /opt/ente/rebuild-frontend.sh msg_ok "Built Web Applications" From fa68ef5b8673201cbe49d05257683e75f423c58b Mon Sep 17 00:00:00 2001 From: Jordan Tomkinson Date: Fri, 9 Jan 2026 22:11:14 +0000 Subject: [PATCH 114/129] tracearr: write APP_VERSION to .env on update --- ct/tracearr.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ct/tracearr.sh b/ct/tracearr.sh index cf77b25ec..050477041 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -63,6 +63,7 @@ function update_script() { msg_ok "Built Tracearr" msg_info "Configuring Tracearr" + sed -i "s/^APP_VERSION=.*/APP_VERSION=$(cat /root/.tracearr)/" /data/tracearr/.env chmod 600 /data/tracearr/.env chown -R tracearr:tracearr /data/tracearr msg_ok "Configured Tracearr" From 0b01f9387d2eb19df9a847f46795ee5ebbdd0dec Mon Sep 17 00:00:00 2001 From: MickLesk Date: Fri, 9 Jan 2026 23:32:33 +0100 Subject: [PATCH 115/129] test without cleanup --- install/ente-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/ente-install.sh b/install/ente-install.sh index cd252832a..a6028e3cb 100644 --- a/install/ente-install.sh +++ b/install/ente-install.sh @@ -347,4 +347,4 @@ msg_ok "Created helper scripts" motd_ssh customize -cleanup_lxc +#cleanup_lxc From 2d40a0a1125520a243b2917f35625dbdf52a33c8 Mon Sep 17 00:00:00 2001 From: Marc Went Date: Sat, 10 Jan 2026 11:15:36 +0100 Subject: [PATCH 116/129] fix update cp restore --- ct/wishlist.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 2285ef6f3..5a48d1121 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -36,8 +36,8 @@ function update_script() { 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 + cp -a /opt/wishlist/uploads /opt/wishlist-backup + cp -a /opt/wishlist/data /opt/wishlist-backup CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist" false) @@ -55,8 +55,8 @@ function update_script() { $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 + cp -a /opt/wishlist-backup/uploads /opt/wishlist + cp -a /opt/wishlist-backup/data /opt/wishlist msg_ok "Updated Wishlist" msg_info "Starting Service" systemctl start wishlist From 23e1910b55ac51c244c38be5907c512c585d41ea Mon Sep 17 00:00:00 2001 From: Marc Went Date: Sat, 10 Jan 2026 11:25:43 +0100 Subject: [PATCH 117/129] clean up remove backup folder --- ct/wishlist.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 5a48d1121..02154d795 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -57,6 +57,7 @@ function update_script() { cp /opt/wishlist-backup/.env /opt/wishlist/.env cp -a /opt/wishlist-backup/uploads /opt/wishlist cp -a /opt/wishlist-backup/data /opt/wishlist + rm -rf /opt/wishlist-backup msg_ok "Updated Wishlist" msg_info "Starting Service" systemctl start wishlist From 77d67f983c3fc9c63bdb49e544379cb9e270c690 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:02:57 -0800 Subject: [PATCH 118/129] Update frontend/public/json/netbird.json Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- frontend/public/json/netbird.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/netbird.json b/frontend/public/json/netbird.json index fe67583b3..b30180fb8 100644 --- a/frontend/public/json/netbird.json +++ b/frontend/public/json/netbird.json @@ -35,7 +35,7 @@ "type": "info" }, { - "text": "After installation, enter the container and run `netbird` to to view the commands.", + "text": "After installation, enter the container and run `netbird` to view the commands.", "type": "info" }, { From 296ca948cf1d8a8a4572b82a47650901351aed83 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:03:06 -0800 Subject: [PATCH 119/129] Update install/netbird-install.sh Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- install/netbird-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index d86022444..555dac6fd 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -23,7 +23,7 @@ setup_deb882_repo \ msg_ok "Set up NetBird Repository" msg_info "Installing NetBird" -$STD apt-get install -y netbird +$STD apt install -y netbird msg_ok "Installed NetBird" msg_info "Enabling NetBird Service" From 09556aa6ac22ce2ce60c82d50d322934be774866 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:03:24 -0800 Subject: [PATCH 120/129] Update install/netbird-install.sh Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- install/netbird-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 555dac6fd..8fc0beb1f 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -27,7 +27,7 @@ $STD apt install -y netbird msg_ok "Installed NetBird" msg_info "Enabling NetBird Service" -$STD systemctl enable --now netbird +$STD systemctl enable -q --now netbird msg_ok "Enabled NetBird Service" # NetBird Deployment Type Selection From 04bb146fc471e6f4a39567f28e787ce47d5a90ed Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:03:47 -0800 Subject: [PATCH 121/129] Update install/netbird-install.sh Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- install/netbird-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 8fc0beb1f..0e904a3dd 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -30,7 +30,7 @@ msg_info "Enabling NetBird Service" $STD systemctl enable -q --now netbird msg_ok "Enabled NetBird Service" -# NetBird Deployment Type Selection +echo "" echo "" echo -e "${BL}NetBird Deployment Type${CL}" echo "─────────────────────────────────────────" From 6f27868a49a5001f5217b7ddd159be9e8d150356 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:03:57 -0800 Subject: [PATCH 122/129] Update install/netbird-install.sh Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- install/netbird-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 0e904a3dd..1a4bcbba5 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -69,7 +69,7 @@ case "$DEPLOYMENT_TYPE" in ;; esac -# NetBird Connection Setup +echo "" echo "" echo -e "${BL}NetBird Connection Setup${CL}" echo "─────────────────────────────────────────" From 2d86a4199ebc279bf0ea88653175fa23db83b778 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:13:47 -0800 Subject: [PATCH 123/129] Update frontend/public/json/netbird.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- frontend/public/json/netbird.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/netbird.json b/frontend/public/json/netbird.json index b30180fb8..2fc4b72eb 100644 --- a/frontend/public/json/netbird.json +++ b/frontend/public/json/netbird.json @@ -9,7 +9,7 @@ "interface_port": null, "documentation": "https://docs.netbird.io/", "website": "https://netbird.io/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@master/webp/netbird.webp", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/netbird.webp", "config_path": "/etc/netbird/config.json", "description": "NetBird is an open source VPN management platform that creates secure peer-to-peer networks using WireGuard. It enables secure connectivity between devices anywhere in the world without complex firewall configurations or port forwarding. NetBird offers features like zero-configuration networking, SSO integration, access control policies, and a centralized management dashboard. It's designed to be simple to deploy and manage, making it ideal for connecting remote teams, securing IoT devices, or building secure infrastructure networks.", "install_methods": [ From 57646838f2b841bb81ec75d1b1725c5f3decc9c6 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:14:00 -0800 Subject: [PATCH 124/129] Update install/netbird-install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- install/netbird-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 1a4bcbba5..72edecbc1 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 community-scripts ORG +# Copyright (c) 2021-2026 community-scripts ORG # Author: TechHutTV # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://netbird.io/ From 1504a65bfb0eedbe3ae0fbf1a51ffdf43d8d1823 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:14:10 -0800 Subject: [PATCH 125/129] Update ct/netbird.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- ct/netbird.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/netbird.sh b/ct/netbird.sh index 4b5714756..e7fde16af 100644 --- a/ct/netbird.sh +++ b/ct/netbird.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2025 community-scripts ORG +# Copyright (c) 2021-2026 community-scripts ORG # Author: TechHutTV # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://netbird.io/ From 452bb94233f5a8e246246d36448328ca223402d8 Mon Sep 17 00:00:00 2001 From: Brandon Hopkins <76761586+TechHutTV@users.noreply.github.com> Date: Sat, 10 Jan 2026 16:26:20 -0800 Subject: [PATCH 126/129] Update ct/netbird.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- ct/netbird.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/netbird.sh b/ct/netbird.sh index e7fde16af..aaa1cdb26 100644 --- a/ct/netbird.sh +++ b/ct/netbird.sh @@ -33,7 +33,7 @@ fi msg_info "Updating ${APP}" $STD apt update -$STD apt -y upgrade +$STD apt upgrade -y msg_ok "Updated Successfully" exit } From bd4f1f8f7a6c13a9942ec1e1c4d587b62609022c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sun, 11 Jan 2026 01:59:06 +0100 Subject: [PATCH 127/129] Apply suggestion from @tremor021 --- install/netbird-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/netbird-install.sh b/install/netbird-install.sh index 72edecbc1..bd0078521 100644 --- a/install/netbird-install.sh +++ b/install/netbird-install.sh @@ -13,7 +13,6 @@ setting_up_container network_check update_os - msg_info "Setting up NetBird Repository" setup_deb882_repo \ "netbird" \ From 07261d16f977197aee65beb3192db5ddf1ef1b8e Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Sun, 11 Jan 2026 12:56:38 +0100 Subject: [PATCH 128/129] refactor --- ct/netbird.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ct/netbird.sh b/ct/netbird.sh index aaa1cdb26..8495258d1 100644 --- a/ct/netbird.sh +++ b/ct/netbird.sh @@ -22,27 +22,27 @@ color catch_errors function update_script() { -header_info -check_container_storage -check_container_resources + header_info + check_container_storage + check_container_resources -if [[ ! -f /etc/netbird/config.json ]]; then -msg_error "No ${APP} Installation Found!" -exit -fi + if [[ ! -f /etc/netbird/config.json ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi -msg_info "Updating ${APP}" -$STD apt update -$STD apt upgrade -y -msg_ok "Updated Successfully" -exit + msg_info "Updating Netbird" + $STD apt update + $STD apt upgrade -y + msg_ok "Updated successfully!" + exit } start build_container description -msg_ok "Completed Successfully!\n" +msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW} Access NetBird by entering the container and running:${CL}" echo -e "${TAB}${GATEWAY}${BGN}netbird up${CL}" From bbfb5bdebe8820f8a4058fdccc153d6a376b4272 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:46:52 +0100 Subject: [PATCH 129/129] Update GitHub stars requirement in PR template --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3a9225cb6..1425c8037 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -46,5 +46,5 @@ Link: # > PRs that do not meet these requirements may be closed without review. - [ ] The application is **at least 6 months old** - [ ] The application is **actively maintained** -- [ ] The application has **200+ GitHub stars** +- [ ] The application has **600+ GitHub stars** - [ ] Official **release tarballs** are published