diff --git a/.github/CONTRIBUTOR_GUIDE/ct/AppName.md b/.github/CONTRIBUTOR_GUIDE/ct/AppName.md
new file mode 100644
index 000000000..20d28d869
--- /dev/null
+++ b/.github/CONTRIBUTOR_GUIDE/ct/AppName.md
@@ -0,0 +1,288 @@
+# **AppName.sh Scripts**
+
+ `AppName.sh` scripts found in the `/ct` directory. These scripts are responsible for the installation of the desired application. For this guide we take `/ct/snipeit.sh` as example.
+
+## Table of Contents
+
+- [**AppName.sh Scripts**](#appnamesh-scripts)
+ - [Table of Contents](#table-of-contents)
+ - [1. **File Header**](#1-file-header)
+ - [1.1 **Shebang**](#11-shebang)
+ - [1.2 **Import Functions**](#12-import-functions)
+ - [1.3 **Metadata**](#13-metadata)
+ - [2 **Variables and function import**](#2-variables-and-function-import)
+ - [2.1 **Default Values**](#21-default-values)
+ - [2.2 **π App output \& base settings**](#22--app-output--base-settings)
+ - [2.3 **π Core functions**](#23--core-functions)
+ - [3 **Update function**](#3-update-function)
+ - [3.1 **Function Header**](#31-function-header)
+ - [3.2 **Check APP**](#32-check-app)
+ - [3.3 **Check version**](#33-check-version)
+ - [3.4 **Verbosity**](#34-verbosity)
+ - [3.5 **Backups**](#35-backups)
+ - [3.6 **Cleanup**](#36-cleanup)
+ - [3.7 **No update function**](#37-no-update-function)
+ - [4 **End of the script**](#4-end-of-the-script)
+ - [5. **Contribution checklist**](#5-contribution-checklist)
+
+## 1. **File Header**
+
+### 1.1 **Shebang**
+
+- Use `#!/usr/bin/env bash` as the shebang.
+
+```bash
+#!/usr/bin/env bash
+```
+
+### 1.2 **Import Functions**
+
+- Import the build.func file.
+- When developing your own script, change the URL to your own repository.
+
+> [!CAUTION]
+> Before opening a Pull Request, change the URL to point to the community-scripts repo.
+
+Example for development:
+
+```bash
+source <(curl -s https://raw.githubusercontent.com/[USER]/[REPO]/refs/heads/[BRANCH]/misc/build.func)
+```
+
+Final script:
+
+```bash
+source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+```
+
+### 1.3 **Metadata**
+
+- Add clear comments for script metadata, including author, copyright, and license information.
+
+Example:
+
+```bash
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: [YourUserName]
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: [SOURCE_URL]
+```
+
+> [!NOTE]:
+>
+> - Add your username and source URL
+> - For existing scripts, add "| Co-Author [YourUserName]" after the current author
+
+---
+
+## 2 **Variables and function import**
+>
+> [!NOTE]
+> You need to have all this set in your script, otherwise it will not work!
+
+### 2.1 **Default Values**
+
+- This section sets the default values for the container.
+- `APP` needs to be set to the application name and must be equal to the filenames of your scripts.
+- `var_tags`: You can set Tags for the CT wich show up in the Proxmox UI. DonΒ΄t overdo it!
+
+>[!NOTE]
+>Description for all Default Values
+>
+>| Variable | Description | Notes |
+>|----------|-------------|-------|
+>| `APP` | Application name | Must match ct\AppName.sh |
+>| `TAGS` | Proxmox display tags without Spaces, only ; | Limit the number |
+>| `var_cpu` | CPU cores | Number of cores |
+>| `var_ram` | RAM | In MB |
+>| `var_disk` | Disk capacity | In GB |
+>| `var_os` | Operating system | alpine, debian, ubuntu |
+>| `var_version` | OS version | e.g., 3.20, 11, 12, 20.04 |
+>| `var_unprivileged` | Container type | 1 = Unprivileged, 0 = Privileged |
+
+Example:
+
+```bash
+APP="SnipeIT"
+var_tags="asset-management;foss"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+```
+
+## 2.2 **π App output & base settings**
+
+```bash
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+```
+
+- `header_info`: Generates ASCII header for APP
+- `base_settings`: Allows overwriting variable values
+
+## 2.3 **π Core functions**
+
+```bash
+# Core
+variables
+color
+catch_errors
+```
+
+- `variables`: Processes input and prepares variables
+- `color`: Sets icons, colors, and formatting
+- `catch_errors`: Enables error handling
+
+---
+
+## 3 **Update function**
+
+### 3.1 **Function Header**
+
+- If applicable write a function that updates the application and the OS in the container.
+- Each update function starts with the same code:
+
+```bash
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+```
+
+### 3.2 **Check APP**
+
+- Before doing anything update-wise, check if the app is installed in the container.
+
+Example:
+
+```bash
+if [[ ! -d /opt/snipe-it ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+```
+
+### 3.3 **Check version**
+
+- Befoer updating, check if a new version exists.
+ - We use the `${APPLICATION}_version.txt` file created in `/opt` during the install to compare new versions against the currently installed version.
+
+Example with a Github Release:
+
+```bash
+ RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP} to v${RELEASE}"
+ #DO UPDATE
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+```
+
+### 3.4 **Verbosity**
+
+- Use the appropriate flag (**-q** in the examples) for a command to suppress its output.
+Example:
+
+```bash
+wget -q
+unzip -q
+```
+
+- If a command does not come with this functionality use `&>/dev/null` to suppress it's output.
+
+Example:
+
+```bash
+php artisan migrate --force &>/dev/null
+php artisan config:clear &>/dev/null
+```
+
+### 3.5 **Backups**
+
+- Backup user data if necessary.
+- Move all user data back in the directory when the update is finished.
+
+>[!NOTE]
+>This is not meant to be a permanent backup
+
+Example backup:
+
+```bash
+ mv /opt/snipe-it /opt/snipe-it-backup
+```
+
+Example config restore:
+
+```bash
+ cp /opt/snipe-it-backup/.env /opt/snipe-it/.env
+ cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/
+ cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads
+```
+
+### 3.6 **Cleanup**
+
+- Do not forget to remove any temporary files/folders such as zip-files or temporary backups.
+Example:
+
+```bash
+ rm -rf /opt/v${RELEASE}.zip
+ rm -rf /opt/snipe-it-backup
+```
+
+### 3.7 **No update function**
+
+- In case you can not provide a update function use the following code to provide user feedback.
+
+```bash
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/snipeit ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "Ther is currently no automatic update function for ${APP}."
+ exit
+}
+```
+
+---
+
+## 4 **End of the script**
+
+- `start`: Launches Whiptail dialogue
+- `build_container`: Collects and integrates user settings
+- `description`: Sets LXC container description
+- With `echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"` you can point the user to the IP:PORT/folder needed to access the app.
+
+```bash
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
+```
+
+---
+
+## 5. **Contribution checklist**
+
+- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
+- [ ] Correct link to *build.func*
+- [ ] Metadata (author, license) is included at the top.
+- [ ] Variables follow naming conventions.
+- [ ] Update function exists.
+- [ ] Update functions checks if app is installed an for new version.
+- [ ] Update function up temporary files.
+- [ ] Script ends with a helpful message for the user to reach the application.
diff --git a/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh b/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
new file mode 100644
index 000000000..bf28d113a
--- /dev/null
+++ b/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
@@ -0,0 +1,93 @@
+#!/usr/bin/env bash
+source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2024 community-scripts ORG
+# Author: [YourUserName]
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: [SOURCE_URL]
+
+# App Default Values
+APP="[APP_NAME]"
+# Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
+TAGS="[TAGS]"
+# Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp)
+var_cpu="[CPU]"
+# Number of cores (1-X) (e.g. 4) - default are 2
+var_ram="[RAM]"
+# Amount of used RAM in MB (e.g. 2048 or 4096)
+var_disk="[DISK]"
+# Amount of used disk space in GB (e.g. 4 or 10)
+var_os="[OS]"
+# Default OS (e.g. debian, ubuntu, alpine)
+var_version="[VERSION]"
+# Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine)
+var_unprivileged="[UNPRIVILEGED]"
+# 1 = unprivileged container, 0 = privileged container
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ # Check if installation is present | -f for file, -d for folder
+ if [[ ! -f [INSTALLATION_CHECK_PATH] ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ # Crawling the new version and checking whether an update is required
+ RELEASE=$(curl -fsSL [RELEASE_URL] | [PARSE_RELEASE_COMMAND])
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Updating $APP"
+
+ # Stopping Services
+ msg_info "Stopping $APP"
+ systemctl stop [SERVICE_NAME]
+ msg_ok "Stopped $APP"
+
+ # Creating Backup
+ msg_info "Creating Backup"
+ tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" [IMPORTANT_PATHS]
+ msg_ok "Backup Created"
+
+ # Execute Update
+ msg_info "Updating $APP to v${RELEASE}"
+ [UPDATE_COMMANDS]
+ msg_ok "Updated $APP to v${RELEASE}"
+
+ # Starting Services
+ msg_info "Starting $APP"
+ systemctl start [SERVICE_NAME]
+ sleep 2
+ msg_ok "Started $APP"
+
+ # Cleaning up
+ msg_info "Cleaning Up"
+ rm -rf [TEMP_FILES]
+ msg_ok "Cleanup Completed"
+
+ # Last Action
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Update Successful"
+ 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}${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}:[PORT]${CL}"
diff --git a/.github/CONTRIBUTOR_GUIDE/install/AppName-install.md b/.github/CONTRIBUTOR_GUIDE/install/AppName-install.md
new file mode 100644
index 000000000..241cd99ac
--- /dev/null
+++ b/.github/CONTRIBUTOR_GUIDE/install/AppName-install.md
@@ -0,0 +1,353 @@
+
+# **AppName-install.sh Scripts**
+
+ `AppName-install.sh` scripts found in the `/install` directory. These scripts are responsible for the installation of the application. For this guide we take `/install/snipeit-install.sh` as example.
+
+## Table of Contents
+
+- [**AppName-install.sh Scripts**](#appname-installsh-scripts)
+ - [Table of Contents](#table-of-contents)
+ - [1. **File header**](#1-file-header)
+ - [1.1 **Shebang**](#11-shebang)
+ - [1.2 **Comments**](#12-comments)
+ - [1.3 **Variables and function import**](#13-variables-and-function-import)
+ - [2. **Variable naming and management**](#2-variable-naming-and-management)
+ - [2.1 **Naming conventions**](#21-naming-conventions)
+ - [3. **Dependencies**](#3-dependencies)
+ - [3.1 **Install all at once**](#31-install-all-at-once)
+ - [3.2 **Collapse dependencies**](#32-collapse-dependencies)
+ - [4. **Paths to application files**](#4-paths-to-application-files)
+ - [5. **Version management**](#5-version-management)
+ - [5.1 **Install the latest release**](#51-install-the-latest-release)
+ - [5.2 **Save the version for update checks**](#52-save-the-version-for-update-checks)
+ - [6. **Input and output management**](#6-input-and-output-management)
+ - [6.1 **User feedback**](#61-user-feedback)
+ - [6.2 **Verbosity**](#62-verbosity)
+ - [7. **String/File Manipulation**](#7-stringfile-manipulation)
+ - [7.1 **File Manipulation**](#71-file-manipulation)
+ - [8. **Security practices**](#8-security-practices)
+ - [8.1 **Password generation**](#81-password-generation)
+ - [8.2 **File permissions**](#82-file-permissions)
+ - [9. **Service Configuration**](#9-service-configuration)
+ - [9.1 **Configuration files**](#91-configuration-files)
+ - [9.2 **Credential management**](#92-credential-management)
+ - [9.3 **Enviroment files**](#93-enviroment-files)
+ - [9.4 **Services**](#94-services)
+ - [10. **Cleanup**](#10-cleanup)
+ - [10.1 **Remove temporary files**](#101-remove-temporary-files)
+ - [10.2 **Autoremove and autoclean**](#102-autoremove-and-autoclean)
+ - [11. **Best Practices Checklist**](#11-best-practices-checklist)
+ - [Example: High-Level Script Flow](#example-high-level-script-flow)
+
+## 1. **File header**
+
+### 1.1 **Shebang**
+
+- Use `#!/usr/bin/env bash` as the shebang.
+
+```bash
+#!/usr/bin/env bash
+```
+
+### 1.2 **Comments**
+
+- Add clear comments for script metadata, including author, copyright, and license information.
+- Use meaningful inline comments to explain complex commands or logic.
+
+Example:
+
+```bash
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: [YourUserName]
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: [SOURCE_URL]
+```
+
+> [!NOTE]:
+>
+> - Add your username
+> - When updating/reworking scripts, add "| Co-Author [YourUserName]"
+
+### 1.3 **Variables and function import**
+
+- This sections adds the support for all needed functions and variables.
+
+```bash
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+```
+
+---
+
+## 2. **Variable naming and management**
+
+### 2.1 **Naming conventions**
+
+- Use uppercase names for constants and environment variables.
+- Use lowercase names for local script variables.
+
+Example:
+
+```bash
+DB_NAME=snipeit_db # Environment-like variable (constant)
+db_user="snipeit" # Local variable
+```
+
+---
+
+## 3. **Dependencies**
+
+### 3.1 **Install all at once**
+
+- Install all dependencies with a single command if possible
+
+Example:
+
+```bash
+$STD apt-get install -y \
+ curl \
+ composer \
+ git \
+ sudo \
+ mc \
+ nginx
+```
+
+### 3.2 **Collapse dependencies**
+
+Collapse dependencies to keep the code readable.
+
+Example:
+Use
+
+```bash
+php8.2-{bcmath,common,ctype}
+```
+
+instead of
+
+```bash
+php8.2-bcmath php8.2-common php8.2-ctype
+```
+
+---
+
+## 4. **Paths to application files**
+
+If possible install the app and all necessary files in `/opt/`
+
+---
+
+## 5. **Version management**
+
+### 5.1 **Install the latest release**
+
+- Always try and install the latest release
+- Do not hardcode any version if not absolutely necessary
+
+Example for a git release:
+
+```bash
+RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"
+```
+
+### 5.2 **Save the version for update checks**
+
+- Write the installed version into a file.
+- This is used for the update function in **AppName.sh** to check for if a Update is needed.
+
+Example:
+
+```bash
+echo "${RELEASE}" >"/opt/AppName_version.txt"
+```
+
+---
+
+## 6. **Input and output management**
+
+### 6.1 **User feedback**
+
+- Use standard functions like `msg_info`, `msg_ok` or `msg_error` to print status messages.
+- Each `msg_info` must be followed with a `msg_ok` before any other output is made.
+- Display meaningful progress messages at key stages.
+
+Example:
+
+```bash
+msg_info "Installing Dependencies"
+$STD apt-get install -y ...
+msg_ok "Installed Dependencies"
+```
+
+### 6.2 **Verbosity**
+
+- Use the appropiate flag (**-q** in the examples) for a command to suppres its output
+Example:
+
+```bash
+wget -q
+unzip -q
+```
+
+- If a command dose not come with such a functionality use `$STD` (a custom standard redirection variable) for managing output verbosity.
+
+Example:
+
+```bash
+$STD apt-get install -y nginx
+```
+
+---
+
+## 7. **String/File Manipulation**
+
+### 7.1 **File Manipulation**
+
+- Use `sed` to replace placeholder values in configuration files.
+
+Example:
+
+```bash
+sed -i -e "s|^DB_DATABASE=.*|DB_DATABASE=$DB_NAME|" \
+ -e "s|^DB_USERNAME=.*|DB_USERNAME=$DB_USER|" \
+ -e "s|^DB_PASSWORD=.*|DB_PASSWORD=$DB_PASS|" .env
+```
+
+---
+
+## 8. **Security practices**
+
+### 8.1 **Password generation**
+
+- Use `openssl` to generate random passwords.
+- Use only alphanumeric values to not introduce unknown behaviour.
+
+Example:
+
+```bash
+DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+```
+
+### 8.2 **File permissions**
+
+Explicitly set secure ownership and permissions for sensitive files.
+
+Example:
+
+```bash
+chown -R www-data: /opt/snipe-it
+chmod -R 755 /opt/snipe-it
+```
+
+---
+
+## 9. **Service Configuration**
+
+### 9.1 **Configuration files**
+
+Use `cat </etc/nginx/conf.d/snipeit.conf
+server {
+ listen 80;
+ root /opt/snipe-it/public;
+ index index.php;
+}
+EOF
+```
+
+### 9.2 **Credential management**
+
+Store the generated credentials in a file.
+
+Example:
+
+```bash
+USERNAME=username
+PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+{
+ echo "Application-Credentials"
+ echo "Username: $USERNAME"
+ echo "Password: $PASSWORD"
+} >> ~/application.creds
+```
+
+### 9.3 **Enviroment files**
+
+Use `cat </path/to/.env
+VARIABLE="value"
+PORT=3000
+DB_NAME="${DB_NAME}"
+EOF
+```
+
+### 9.4 **Services**
+
+Enable affected services after configuration changes and start them right away.
+
+Example:
+
+```bash
+systemctl enable -q --now nginx
+```
+
+---
+
+## 10. **Cleanup**
+
+### 10.1 **Remove temporary files**
+
+Remove temporary files and downloads after use.
+
+Example:
+
+```bash
+rm -rf /opt/v${RELEASE}.zip
+```
+
+### 10.2 **Autoremove and autoclean**
+
+Remove unused dependencies to reduce disk space usage.
+
+Example:
+
+```bash
+apt-get -y autoremove
+apt-get -y autoclean
+```
+
+---
+
+## 11. **Best Practices Checklist**
+
+- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
+- [ ] Metadata (author, license) is included at the top.
+- [ ] Variables follow naming conventions.
+- [ ] Sensitive values are dynamically generated.
+- [ ] Files and services have proper permissions.
+- [ ] Script cleans up temporary files.
+
+---
+
+### Example: High-Level Script Flow
+
+1. Dependencies installation
+2. Database setup
+3. Download and configure application
+4. Service configuration
+5. Final cleanup
diff --git a/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh b/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh
new file mode 100644
index 000000000..a1d0f8a2d
--- /dev/null
+++ b/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2024 community-scripts ORG
+# Author: [YourUserName]
+# License: MIT
+# Source: [SOURCE_URL]
+
+# Import Functions und Setup
+source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+# Installing Dependencies with the 3 core dependencies (curl;sudo;mc)
+msg_info "Installing Dependencies"
+$STD apt-get install -y \
+ curl \
+ sudo \
+ mc \
+ [PACKAGE_1] \
+ [PACKAGE_2] \
+ [PACKAGE_3]
+msg_ok "Installed Dependencies"
+
+# Template: MySQL Database
+msg_info "Setting up Database"
+DB_NAME=[DB_NAME]
+DB_USER=[DB_USER]
+DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
+$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
+$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
+{
+ echo "${APPLICATION} Credentials"
+ echo "Database User: $DB_USER"
+ echo "Database Password: $DB_PASS"
+ echo "Database Name: $DB_NAME"
+} >> ~/$APP_NAME.creds
+msg_ok "Set up Database"
+
+# Temp
+
+# Setup App
+msg_info "Setup ${APPLICATION}"
+RELEASE=$(curl -s https://api.github.com/repos/[REPO]/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+wget -q "https://github.com/[REPO]/archive/refs/tags/${RELEASE}.zip"
+unzip -q ${RELEASE}.zip
+mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION}
+#
+#
+#
+echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
+msg_ok "Setup ${APPLICATION}"
+
+# Creating Service (if needed)
+msg_info "Creating Service"
+cat </etc/systemd/system/${APPLICATION}.service
+[Unit]
+Description=${APPLICATION} Service
+After=network.target
+
+[Service]
+ExecStart=[START_COMMAND]
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now ${APPLICATION}.service
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+# Cleanup
+msg_info "Cleaning up"
+rm -f ${RELEASE}.zip
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
+
+motd_ssh
+customize
diff --git a/.github/CONTRIBUTOR_GUIDE/json/AppName.json b/.github/CONTRIBUTOR_GUIDE/json/AppName.json
new file mode 100644
index 000000000..622f370a4
--- /dev/null
+++ b/.github/CONTRIBUTOR_GUIDE/json/AppName.json
@@ -0,0 +1,34 @@
+{
+ "name": "AppName",
+ "slug": "appname",
+ "categories": [
+ 0
+ ],
+ "date_created": "DATE CREATED",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": DEFAULT-PORT,
+ "documentation": null,
+ "website": "LINK TO WEBSITE",
+ "logo": "LINK TO LOGO",
+ "description": "Deescription of the app",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/AppName.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 4,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": []
+}
\ No newline at end of file
diff --git a/.github/CONTRIBUTOR_GUIDE/json/AppName.md b/.github/CONTRIBUTOR_GUIDE/json/AppName.md
new file mode 100644
index 000000000..5b61f5e91
--- /dev/null
+++ b/.github/CONTRIBUTOR_GUIDE/json/AppName.md
@@ -0,0 +1,13 @@
+# **AppName.json Files**
+
+ `AppName.json` files found in the `/json` directory. These files are used to provide informations for the website. For this guide we take `/json/snipeit.json` as example.
+
+## Table of Contents
+
+- [**AppName.json Files**](#appnamejson-files)
+ - [Table of Contents](#table-of-contents)
+ - [1. JSON Generator](#1-json-generator)
+
+## 1. JSON Generator
+
+Use the [JSON Generator](https://community-scripts.github.io/ProxmoxVE/json-editor) to create this file for your application.
diff --git a/.github/workflows/App_Header_Merge_Into_main.yaml b/.github/workflows/App_Header_Merge_Into_main.yaml
new file mode 100644
index 000000000..0c9f53320
--- /dev/null
+++ b/.github/workflows/App_Header_Merge_Into_main.yaml
@@ -0,0 +1,66 @@
+name: Auto Update .app-headers and Create PR
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - 'ct/**.sh'
+
+jobs:
+ update-app-headers:
+ runs-on: ubuntu-latest
+ steps:
+ # Step 1: Checkout the repository
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ # Step 2: Set up Git user for committing changes
+ - name: Set up Git
+ run: |
+ git config --global user.name "GitHub Actions"
+ git config --global user.email "actions@github.com"
+
+ # Step 3: Ensure .app-headers file exists
+ - name: Ensure .app-headers file exists
+ run: |
+ if [ ! -f ct/.app-headers ]; then
+ echo "Creating .app-headers file."
+ touch ct/.app-headers
+ fi
+
+ # Step 4: Process the ct/*.sh files and update .app-headers
+ - name: Update .app-headers with figlet output
+ run: |
+ echo "Updating .app-headers with figlet output."
+ for script in ct/*.sh; do
+ if grep -q 'APP=' "$script"; then
+ APP_NAME=$(grep -oP 'APP=\K\w+' "$script")
+ echo "Processing $script for APP: \"$APP_NAME\""
+ figlet "$APP_NAME" >> ct/.app-headers
+ fi
+ done
+
+ # Step 5: Check out and merge main into the update-app-headers branch without committing
+ - name: Merge main into update-app-headers
+ run: |
+ git fetch origin
+ git checkout update-app-headers
+ git merge origin/main --no-ff --no-commit -m "Merge main into update-app-headers"
+ echo "Merge complete. Please review and commit the changes manually."
+
+ # Step 6: Check if a PR exists and create one if it doesn't
+ - name: Create Pull Request if not exists
+ run: |
+ PR_EXISTS=$(gh pr list --head "update-app-headers" --json number --jq '.[].number')
+
+ if [ -z "$PR_EXISTS" ]; then
+ echo "Creating a new PR."
+ PR_URL=$(gh pr create --title "[core]: update .app-headers to latest version" \
+ --body "This PR automatically updates the .app-headers file." \
+ --head update-app-headers \
+ --base main)
+ echo "PR created: $PR_URL"
+ else
+ echo "PR already exists."
+ fi
diff --git a/.github/workflows/App_Header_Merge_update .app-headers_in_update-app-headers b/.github/workflows/App_Header_Merge_update .app-headers_in_update-app-headers
new file mode 100644
index 000000000..e93b2abc3
--- /dev/null
+++ b/.github/workflows/App_Header_Merge_update .app-headers_in_update-app-headers
@@ -0,0 +1,34 @@
+name: Update .app-headers with figlet output
+
+on:
+ workflow_run:
+ workflows: ["Merge main into update-app-headers"]
+ types:
+ - completed
+
+jobs:
+ update-app-headers:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ - name: Ensure .app-headers file exists silently
+ run: |
+ if [ ! -f ct/.app-headers ]; then
+ touch ct/.app-headers
+ fi
+
+ - name: Update .app-headers with figlet output silently
+ run: |
+ for script in ct/*.sh; do
+ if grep -q 'APP=' "$script"; then
+ APP_NAME=$(grep -oP 'APP=\K\w+' "$script")
+ if [ ! -z "$APP_NAME" ]; then
+ echo "Adding $APP_NAME to .app-headers"
+ figlet "$APP_NAME" >> ct/.app-headers 2>/dev/null || echo "figlet failed for $APP_NAME"
+ fi
+ fi
+ done
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/check_and_update_json_date.yml b/.github/workflows/check_and_update_json_date.yml
new file mode 100644
index 000000000..696c60257
--- /dev/null
+++ b/.github/workflows/check_and_update_json_date.yml
@@ -0,0 +1,45 @@
+name: Check and Update JSON Date
+
+on:
+ pull_request:
+ types: [synchronize, opened, reopened, edited]
+ paths:
+ - "json/*.json"
+
+jobs:
+ update-date:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: 3.12
+
+ - name: Install dependencies
+ run: pip install jq
+
+ - name: Find and Update JSON files in /json folder
+ run: |
+ TODAY=$(date +%Y-%m-%d)
+ for file in $(git diff --diff-filter=A --name-only HEAD | grep '^json/.*\.json$'); do
+ if jq -e '.date_created' $file > /dev/null 2>&1; then
+ echo "Updating date_created in $file"
+ jq --arg date "$TODAY" '.date_created = $date' $file > temp.json && mv temp.json $file
+ git add $file
+ fi
+ done
+
+ - name: Commit changes
+ run: |
+ git config user.name "GitHub Action"
+ git config user.email "action@github.com"
+ git commit -m "Update date_created in new JSON files" || echo "No changes to commit"
+
+ - name: Push changes
+ uses: ad-m/github-push-action@v0.6.0
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/generate-app-headers.sh b/.github/workflows/generate-app-headers.sh
new file mode 100644
index 000000000..c548b0fca
--- /dev/null
+++ b/.github/workflows/generate-app-headers.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+
+output_file="./misc/.app-headers"
+> "$output_file" # Clear or create the file
+
+current_date=$(date +"%m-%d-%Y")
+# Header with date
+{
+ echo "### Generated on $current_date"
+ echo "##################################################"
+ echo
+} >> "$output_file"
+
+# Find only regular .sh files in ./ct, sort them alphabetically
+find ./ct -type f -name "*.sh" | sort | while read -r script; do
+ # Extract the APP name from the APP line
+ app_name=$(grep -oP '^APP="\K[^"]+' "$script" 2>/dev/null)
+
+ if [[ -n "$app_name" ]]; then
+ # Generate figlet output
+ figlet_output=$(figlet -f slant "$app_name")
+ {
+ echo "### $(basename "$script")"
+ echo "APP=$app_name"
+ echo "$figlet_output"
+ echo
+ } >> "$output_file"
+ else
+ echo "No APP name found in $script, skipping."
+ fi
+done
+
+echo "Generated combined file at $output_file"
diff --git a/.github/workflows/merge-main.yml b/.github/workflows/merge-main.yml
new file mode 100644
index 000000000..fa8a984ba
--- /dev/null
+++ b/.github/workflows/merge-main.yml
@@ -0,0 +1,29 @@
+name: Merge main into update-app-headers
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - 'ct/**.sh'
+
+jobs:
+ merge-main:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ - name: Set up Git
+ run: |
+ git config --global user.name "GitHub Actions"
+ git config --global user.email "actions@github.com"
+
+ - name: Merge main into update-app-headers silently
+ run: |
+ git fetch origin
+ git checkout update-app-headers
+ git merge origin/main --allow-unrelated-histories --no-commit -m "Merge main into update-app-headers"
+ git push origin update-app-headers > /dev/null 2>&1 || true
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 000000000..1949e6fc5
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,8 @@
+{
+ "recommendations": [
+ "bmalehorn.shell-syntax",
+ "timonwong.shellcheck",
+ "foxundermoon.shell-format"
+ ],
+ "unwantedRecommendations": []
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 94a28fe1e..ce0ebc224 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,60 @@ All LXC instances created using this repository come pre-installed with Midnight
> [!IMPORTANT]
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
+## 2025-01-10
+
+### Changed
+
+### β¨ New Scripts
+
+- New script : Ghost [@fabrice1236](https://github.com/fabrice1236) ([#1361](https://github.com/community-scripts/ProxmoxVE/pull/1361))
+
+### π Updated Scripts
+
+- Update Prometheus + Alertmanager: Unify scripts for easier maintenance [@andygrunwald](https://github.com/andygrunwald) ([#1402](https://github.com/community-scripts/ProxmoxVE/pull/1402))
+- Update komodo.sh: Fix broken paths in update_script(). [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1403](https://github.com/community-scripts/ProxmoxVE/pull/1403))
+- Fix: ActualBudget Update-Function [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1376](https://github.com/community-scripts/ProxmoxVE/pull/1376))
+- Fix: bookstack.sh - Ignore empty folder [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1388](https://github.com/community-scripts/ProxmoxVE/pull/1388))
+- Fix: checkmk-install.sh: Version crawling. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1385](https://github.com/community-scripts/ProxmoxVE/pull/1385))
+
+### π Website
+
+- Change Website-Category of nzbget [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1379](https://github.com/community-scripts/ProxmoxVE/pull/1379))
+
+### π§° Maintenance
+
+- Update check_and_update_json_date.yml: Change path to /json [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1399](https://github.com/community-scripts/ProxmoxVE/pull/1399))
+- Visual Studio Code: Set Workspace recommended extensions [@andygrunwald](https://github.com/andygrunwald) ([#1398](https://github.com/community-scripts/ProxmoxVE/pull/1398))
+- [core]: add support for custom tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1384](https://github.com/community-scripts/ProxmoxVE/pull/1384))
+- [core]: check json date of new prs & update it [@MickLesk](https://github.com/MickLesk) ([#1395](https://github.com/community-scripts/ProxmoxVE/pull/1395))
+- Add initial PR for Contributing & Coding Standard [@MickLesk](https://github.com/MickLesk) ([#920](https://github.com/community-scripts/ProxmoxVE/pull/920))
+- [Core] add Github Action for Generate AppHeaders (figlet remove part 1) [@MickLesk](https://github.com/MickLesk) ([#1382](https://github.com/community-scripts/ProxmoxVE/pull/1382))
+
+## 2025-01-09
+
+### Changed
+
+### π₯ Breaking Changes
+
+- Removal calibre-server (no Headless Support) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1362](https://github.com/community-scripts/ProxmoxVE/pull/1362))
+
+### β¨ New Scripts
+
+- New Script: Prometheus Alertmanager [@andygrunwald](https://github.com/andygrunwald) ([#1272](https://github.com/community-scripts/ProxmoxVE/pull/1272))
+- New script: ps5-mqtt [@liecno](https://github.com/liecno) ([#1198](https://github.com/community-scripts/ProxmoxVE/pull/1198))
+
+### π Updated Scripts
+
+- Fix: AdventureLog: unzip to /opt/ [@JesperDramsch](https://github.com/JesperDramsch) ([#1370](https://github.com/community-scripts/ProxmoxVE/pull/1370))
+- Fix: Stirling-PDF > LibreOffice/unoconv Integration Issues [@m6urns](https://github.com/m6urns) ([#1322](https://github.com/community-scripts/ProxmoxVE/pull/1322))
+- Fix: AdventureLog - update script bug [@JesperDramsch](https://github.com/JesperDramsch) ([#1334](https://github.com/community-scripts/ProxmoxVE/pull/1334))
+- Install/update ActualBudget based on releases, not latest master [@SpyrosRoum](https://github.com/SpyrosRoum) ([#1254](https://github.com/community-scripts/ProxmoxVE/pull/1254))
+- Fix Checkmk: Version grep broken [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1341](https://github.com/community-scripts/ProxmoxVE/pull/1341))
+
+### π§° Maintenance
+
+- fix: only validate scripts in validate-scripts workflow [@se-bastiaan](https://github.com/se-bastiaan) ([#1344](https://github.com/community-scripts/ProxmoxVE/pull/1344))
+
## 2025-01-08
### Changed
diff --git a/ct/actualbudget.sh b/ct/actualbudget.sh
index e848f7569..7aee9bd65 100644
--- a/ct/actualbudget.sh
+++ b/ct/actualbudget.sh
@@ -32,13 +32,28 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
+ if ! command -v jq >/dev/null 2>&1; then
+ echo "Installing jq..."
+ apt-get install -y jq >/dev/null 2>&1
+ echo "Installed jq..."
+ fi
+
msg_info "Updating ${APP}"
- systemctl stop actualbudget.service
+ systemctl stop actualbudget
+ RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name')
+ TEMPD="$(mktemp -d)"
+ cd "${TEMPD}"
+ wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz
+ mv /opt/actualbudget /opt/actualbudget_bak
+ mv actualbudget-actual-server-*/* /opt/actualbudget/
+ mv /opt/actualbudget_bak/.env /opt/actualbudget
+ mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files
cd /opt/actualbudget
- git pull &>/dev/null
yarn install &>/dev/null
- systemctl start actualbudget.service
- msg_ok "Successfully Updated ${APP}"
+ systemctl start actualbudget
+ msg_ok "Successfully Updated ${APP} to ${RELEASE}"
+ rm -rf "${TEMPD}"
+ rm -rf /opt/actualbudget_bak
exit
}
@@ -49,4 +64,4 @@ 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}:5006${CL}"
\ No newline at end of file
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5006${CL}"
diff --git a/ct/adventurelog.sh b/ct/adventurelog.sh
index 889a40cc9..03d6704ad 100644
--- a/ct/adventurelog.sh
+++ b/ct/adventurelog.sh
@@ -40,19 +40,20 @@ function update_script() {
msg_ok "Services Stopped"
msg_info "Updating ${APP} to ${RELEASE}"
- cp /opt/adventurelog/backend/server/.env /opt/server.env
- cp /opt/adventurelog/frontend/.env /opt/frontend.env
- wget -q "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
- unzip -q v${RELEASE}.zip
- mv AdventureLog-${RELEASE} /opt/adventurelog
- mv /opt/server.env /opt/adventurelog/backend/server/.env
+ mv /opt/adventurelog/ /opt/adventurelog-backup/
+ wget -qO /opt/v${RELEASE}.zip "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q /opt/v${RELEASE}.zip -d /opt/
+ mv /opt/AdventureLog-${RELEASE} /opt/adventurelog
+
+ mv /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
+ mv /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
cd /opt/adventurelog/backend/server
pip install --upgrade pip &>/dev/null
pip install -r requirements.txt &>/dev/null
python3 manage.py collectstatic --noinput &>/dev/null
python3 manage.py migrate &>/dev/null
- mv /opt/frontend.env /opt/adventurelog/frontend/.env
+ mv /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
cd /opt/adventurelog/frontend
pnpm install &>/dev/null
pnpm run build &>/dev/null
@@ -65,7 +66,8 @@ function update_script() {
msg_ok "Started Services"
msg_info "Cleaning Up"
- rm -rf v${RELEASE}.zip
+ rm -rf /opt/v${RELEASE}.zip
+ rm -rf /opt/adventurelog-backup
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
@@ -81,4 +83,4 @@ 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}"
\ No newline at end of file
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/bookstack.sh b/ct/bookstack.sh
index 63d2eb387..2c3e89df0 100644
--- a/ct/bookstack.sh
+++ b/ct/bookstack.sh
@@ -44,9 +44,9 @@ function update_script() {
unzip -q /opt/v${RELEASE}.zip -d /opt
mv /opt/BookStack-${RELEASE} /opt/bookstack
cp /opt/bookstack-backup/.env /opt/bookstack/.env
- cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/
- cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/
- cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/
+ cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ 2>/dev/null || true
+ cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ 2>/dev/null || true
+ cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ 2>/dev/null || true
cd /opt/bookstack
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev &>/dev/null
php artisan migrate --force &>/dev/null
diff --git a/ct/checkmk.sh b/ct/checkmk.sh
index 7a29d056b..f22e5edce 100644
--- a/ct/checkmk.sh
+++ b/ct/checkmk.sh
@@ -29,7 +29,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
- RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | grep -v "*-rc" | tail -n +2 | head -n 1)
+ RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to v${RELEASE}"
omd stop monitoring &>/dev/null
diff --git a/ct/ghost.sh b/ct/ghost.sh
new file mode 100644
index 000000000..29f748c09
--- /dev/null
+++ b/ct/ghost.sh
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: fabrice1236
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://ghost.org/
+
+# App Default Values
+APP="Ghost"
+var_tags="cms;blog"
+var_cpu="2"
+var_ram="1024"
+var_disk="5"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ msg_info "Updating ${APP} LXC"
+
+ if command -v ghost &> /dev/null; then
+ current_version=$(ghost version | grep 'Ghost-CLI version' | awk '{print $3}')
+ latest_version=$(npm show ghost-cli version)
+ if [ "$current_version" != "$latest_version" ]; then
+ msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
+ npm install -g ghost-cli@latest &> /dev/null
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "${APP} is already at v${current_version}"
+ fi
+ else
+ msg_error "No ${APP} Installation Found!"
+ exit
+ 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}:2368${CL}"
\ No newline at end of file
diff --git a/ct/komodo.sh b/ct/komodo.sh
index e385e2a7e..ad267e9d4 100644
--- a/ct/komodo.sh
+++ b/ct/komodo.sh
@@ -34,9 +34,9 @@ function update_script() {
fi
msg_info "Updating ${APP}"
COMPOSE_FILE=""
- for file in *.compose.yaml; do
+ for file in /opt/komodo/*.compose.yaml; do
if [[ "$file" != "compose.env" ]]; then
- COMPOSE_FILE="$file"
+ COMPOSE_FILE="${file#/opt/komodo/}"
break
fi
done
@@ -47,15 +47,15 @@ function update_script() {
fi
BACKUP_FILE="${COMPOSE_FILE}.bak_$(date +%Y%m%d_%H%M%S)"
- mv "$COMPOSE_FILE" "$BACKUP_FILE" || {
+ mv "/opt/komodo/$COMPOSE_FILE" "/opt/komodo/$BACKUP_FILE" || {
msg_error "Failed to create backup of $COMPOSE_FILE!"
exit 1
}
- GITHUB_URL="https://raw.githubusercontent.com/mbecker20/komodo/main/compose/$COMPOSE_FILE"
- wget -q -O "$COMPOSE_FILE" "$GITHUB_URL" || {
- msg_error "Failed to download $COMPOSE_FILE from GitHub!"
- mv "$BACKUP_FILE" "$COMPOSE_FILE"
+ GITHUB_URL="https://raw.githubusercontent.com/mbecker20/komodo/main/compose/${COMPOSE_FILE}"
+ wget -q -O "/opt/komodo/${COMPOSE_FILE}" "$GITHUB_URL" || {
+ msg_error "Failed to download ${COMPOSE_FILE} from GitHub!"
+ mv "/opt/komodo/${BACKUP_FILE}" "/opt/komodo/${COMPOSE_FILE}"
exit 1
}
diff --git a/ct/prometheus-alertmanager.sh b/ct/prometheus-alertmanager.sh
new file mode 100755
index 000000000..adcd77a46
--- /dev/null
+++ b/ct/prometheus-alertmanager.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Andy Grunwald (andygrunwald)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://prometheus.io/
+
+# App Default Values
+APP="Prometheus-Alertmanager"
+var_tags="monitoring;alerting"
+var_cpu="1"
+var_ram="1024"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/prometheus-alertmanager.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop prometheus-alertmanager
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ wget -q https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz
+ tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz
+ cp -rf alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/
+ rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start prometheus-alertmanager
+ msg_ok "Started ${APP}"
+ 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}${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}:9093${CL}"
\ No newline at end of file
diff --git a/ct/prometheus.sh b/ct/prometheus.sh
index c1b053317..e8f872a90 100644
--- a/ct/prometheus.sh
+++ b/ct/prometheus.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2025 tteck
+# Copyright (c) 2021-2025 community-scripts ORG
# Author: tteck (tteckster)
# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
# Source: https://prometheus.io/
@@ -38,22 +38,21 @@ function update_script() {
systemctl stop prometheus
msg_ok "Stopped ${APP}"
- msg_info "Updating ${APP} to ${RELEASE}"
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz
- cd prometheus-${RELEASE}.linux-amd64
- cp -rf prometheus promtool /usr/local/bin/
- cd ~
+ cp -rf prometheus-${RELEASE}.linux-amd64/prometheus prometheus-${RELEASE}.linux-amd64/promtool /usr/local/bin/
rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz
echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting ${APP}"
systemctl start prometheus
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}
diff --git a/ct/ps5-mqtt.sh b/ct/ps5-mqtt.sh
new file mode 100644
index 000000000..98e751e4f
--- /dev/null
+++ b/ct/ps5-mqtt.sh
@@ -0,0 +1,76 @@
+#!/usr/bin/env bash
+source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: liecno
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/FunkeyFlo/ps5-mqtt/
+
+# App Default Values
+APP="PS5-MQTT"
+var_tags="smarthome;automation"
+var_cpu="1"
+var_ram="512"
+var_disk="3"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -d /opt/ps5-mqtt ]]; then
+ msg_error "No ${APP} installation found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/FunkeyFlo/ps5-mqtt/releases/latest | jq -r '.tag_name')
+
+ if [[ "${RELEASE}" != "$(cat /opt/ps5-mqtt_version.txt)" ]]; then
+ msg_info "Stopping service"
+ systemctl stop ps5-mqtt
+ msg_ok "Stopped service"
+
+ msg_info "Updating PS5-MQTT to ${RELEASE}"
+ wget -P /tmp -q https://github.com/FunkeyFlo/ps5-mqtt/archive/refs/tags/${RELEASE}.tar.gz
+ rm -rf /opt/ps5-mqtt
+ tar zxf /tmp/${RELEASE}.tar.gz -C /opt
+ mv /opt/ps5-mqtt-* /opt/ps5-mqtt
+ rm /tmp/${RELEASE}.tar.gz
+ echo ${RELEASE} > /opt/ps5-mqtt_version.txt
+ msg_ok "Updated PS5-MQTT"
+
+ msg_info "Building new PS5-MQTT version"
+ cd /opt/ps5-mqtt/ps5-mqtt/
+ npm install &>/dev/null
+ npm run build &>/dev/null
+ msg_ok "Built new PS5-MQTT version"
+
+ msg_info "Starting service"
+ systemctl start ps5-mqtt
+ msg_ok "Started service"
+ 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 URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8645${CL}"
diff --git a/ct/tianji.sh b/ct/tianji.sh
index d7e9ff761..362c5ba88 100644
--- a/ct/tianji.sh
+++ b/ct/tianji.sh
@@ -36,7 +36,8 @@ function update_script() {
msg_info "Stopping ${APP} Service"
systemctl stop tianji
msg_ok "Stopped ${APP} Service"
- msg_info "Updating ${APP} to ${RELEASE}"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
cd /opt
cp /opt/tianji/src/server/.env /opt/.env
mv /opt/tianji /opt/tianji_bak
@@ -54,10 +55,12 @@ function update_script() {
cd src/server
pnpm db:migrate:apply >/dev/null 2>&1
echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
msg_info "Starting ${APP}"
systemctl start tianji
msg_ok "Started ${APP}"
+
msg_info "Cleaning up"
rm -R /opt/v${RELEASE}.zip
rm -rf /opt/tianji_bak
@@ -67,7 +70,7 @@ function update_script() {
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
- msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
fi
exit
}
@@ -79,4 +82,4 @@ 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}:12345${CL}"
\ No newline at end of file
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:12345${CL}"
diff --git a/ct/wastebin.sh b/ct/wastebin.sh
index eb166f432..bd3575193 100644
--- a/ct/wastebin.sh
+++ b/ct/wastebin.sh
@@ -55,7 +55,7 @@ function update_script() {
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}
@@ -67,4 +67,4 @@ 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}:8088${CL}"
\ No newline at end of file
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8088${CL}"
diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh
index 4141f4d8e..f8ca7f61c 100644
--- a/install/actualbudget-install.sh
+++ b/install/actualbudget-install.sh
@@ -14,12 +14,16 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt-get install -y curl
-$STD apt-get install -y sudo
-$STD apt-get install -y mc
-$STD apt-get install -y gpg
-$STD apt-get install -y git
-$STD apt-get install -y openssh-server
+$STD apt-get install -y \
+ curl \
+ sudo \
+ mc \
+ gpg \
+ git \
+ jq \
+ build-essential \
+ wget \
+ openssh-server
msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository"
@@ -34,13 +38,18 @@ $STD apt-get install -y nodejs
$STD npm install --global yarn
msg_ok "Installed Node.js"
-msg_info "Installing Actual Budget"
-$STD git clone https://github.com/actualbudget/actual-server.git /opt/actualbudget
+RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name')
+msg_info "Installing Actual Budget $RELEASE"
+wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz
+mv actualbudget-actual-server-* /opt/actualbudget
mkdir -p /opt/actualbudget/server-files
+mkdir -p /opt/actualbudget-data
chown -R root:root /opt/actualbudget/server-files
chmod 755 /opt/actualbudget/server-files
cat < /opt/actualbudget/.env
ACTUAL_UPLOAD_DIR=/opt/actualbudget/server-files
+ACTUAL_DATA_DIR=/opt/actualbudget-data
+ACTUAL_SERVER_FILES_DIR=/opt/actualbudget/server-files
PORT=5006
EOF
cd /opt/actualbudget
diff --git a/install/checkmk-install.sh b/install/checkmk-install.sh
index f271815bf..0b8839fe0 100644
--- a/install/checkmk-install.sh
+++ b/install/checkmk-install.sh
@@ -24,7 +24,7 @@ $STD apt-get install -y \
msg_ok "Installed Dependencies"
msg_info "Install Checkmk"
-RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | grep -v "*-rc" | tail -n +2 | head -n 1)
+RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | head -n 1)
wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_arm64.deb -O /opt/checkmk.deb
$STD apt-get install -y /opt/checkmk.deb
echo "${RELEASE}" >"/opt/checkmk_version.txt"
diff --git a/install/ghost-install.sh b/install/ghost-install.sh
new file mode 100644
index 000000000..9bc6829af
--- /dev/null
+++ b/install/ghost-install.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: fabrice1236
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://ghost.org/
+
+# Import Functions und Setup
+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 \
+ curl \
+ sudo \
+ mc \
+ nginx \
+ mariadb-server \
+ ca-certificates \
+ gnupg
+msg_ok "Installed Dependencies"
+
+
+msg_info "Configuring Database"
+DB_NAME=ghost
+DB_USER=ghostuser
+DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+mariadb -u root -e "CREATE DATABASE $DB_NAME;"
+mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
+mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
+
+{
+ echo "Ghost-Credentials"
+ echo "Ghost Database User: $DB_USER"
+ echo "Ghost Database Password: $DB_PASS"
+ echo "Ghost Database Name: $DB_NAME"
+} >> ~/ghost.creds
+msg_ok "Configured MySQL"
+
+msg_info "Setting up Node.js Repository"
+mkdir -p /etc/apt/keyrings
+curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+msg_ok "Set up Node.js Repository"
+
+msg_info "Setup Node.js"
+$STD apt-get update
+$STD apt-get install -y nodejs
+msg_ok "Setup Node.js"
+
+msg_info "Installing Ghost CLI"
+$STD npm install ghost-cli@latest -g
+msg_ok "Installed Ghost CLI"
+
+msg_info "Creating Service"
+$STD adduser --disabled-password --gecos "Ghost user" ghost-user
+$STD usermod -aG sudo ghost-user
+echo "ghost-user ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/ghost-user
+mkdir -p /var/www/ghost
+chown -R ghost-user:ghost-user /var/www/ghost
+chmod 775 /var/www/ghost
+sudo -u ghost-user -H sh -c "cd /var/www/ghost && ghost install --db=mysql --dbhost=localhost --dbuser=$DB_USER --dbpass=$DB_PASS --dbname=ghost --url=http://localhost:2368 --no-prompt --no-setup-nginx --no-setup-ssl --no-setup-mysql --enable --start --ip 0.0.0.0"
+rm /etc/sudoers.d/ghost-user
+msg_ok "Creating Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
diff --git a/install/prometheus-alertmanager-install.sh b/install/prometheus-alertmanager-install.sh
new file mode 100755
index 000000000..3ce9dc0a0
--- /dev/null
+++ b/install/prometheus-alertmanager-install.sh
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Andy Grunwald (andygrunwald)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://prometheus.io/
+
+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 \
+ curl \
+ sudo \
+ mc
+msg_ok "Installed Dependencies"
+
+msg_info "Installing Prometheus Alertmanager"
+RELEASE=$(curl -s https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+mkdir -p /etc/alertmanager
+mkdir -p /var/lib/alertmanager
+wget -q https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz
+tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz
+mv alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/
+mv alertmanager-${RELEASE}.linux-amd64/alertmanager.yml /etc/alertmanager/alertmanager.yml
+echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
+msg_ok "Installed Prometheus Alertmanager"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/prometheus-alertmanager.service
+echo "[Unit]
+Description=Prometheus Alertmanager
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+User=root
+Restart=always
+Type=simple
+ExecStart=/usr/local/bin/alertmanager \
+ --config.file=/etc/alertmanager/alertmanager.yml \
+ --storage.path=/var/lib/alertmanager/ \
+ --web.listen-address=0.0.0.0:9093
+ExecReload=/bin/kill -HUP \$MAINPID
+
+[Install]
+WantedBy=multi-user.target"
+EOF
+systemctl enable -q --now prometheus-alertmanager
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz
+msg_ok "Cleaned"
diff --git a/install/prometheus-install.sh b/install/prometheus-install.sh
index 4ab8f274f..3b6c2139a 100644
--- a/install/prometheus-install.sh
+++ b/install/prometheus-install.sh
@@ -1,9 +1,9 @@
#!/usr/bin/env bash
-# Copyright (c) 2021-2024 tteck
+# Copyright (c) 2021-2025 community-scripts ORG
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://prometheus.io/
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
color
@@ -14,11 +14,12 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt-get install -y curl
-$STD apt-get install -y sudo
-$STD apt-get install -y mc
-$STD apt-get install -y wget
-$STD apt-get install -y openssh-server
+$STD apt-get install -y \
+ curl \
+ sudo \
+ mc \
+ wget \
+ openssh-server
msg_ok "Installed Dependencies"
msg_info "Installing Prometheus"
@@ -27,14 +28,13 @@ mkdir -p /etc/prometheus
mkdir -p /var/lib/prometheus
wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-arm64.tar.gz
tar -xf prometheus-${RELEASE}.linux-arm64.tar.gz
-cd prometheus-${RELEASE}.linux-arm64
-mv prometheus promtool /usr/local/bin/
-mv prometheus.yml /etc/prometheus/prometheus.yml
+mv prometheus-${RELEASE}.linux-arm64/prometheus prometheus-${RELEASE}.linux-arm64/promtool /usr/local/bin/
+mv prometheus-${RELEASE}.linux-arm64/prometheus.yml /etc/prometheus/prometheus.yml
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed Prometheus"
msg_info "Creating Service"
-service_path="/etc/systemd/system/prometheus.service"
+cat </etc/systemd/system/prometheus.service"
echo "[Unit]
Description=Prometheus
Wants=network-online.target
@@ -50,7 +50,8 @@ ExecStart=/usr/local/bin/prometheus \
--web.listen-address=0.0.0.0:9090
[Install]
-WantedBy=multi-user.target" >$service_path
+WantedBy=multi-user.target"
+EOF
systemctl enable -q --now prometheus
msg_ok "Created Service"
@@ -60,5 +61,5 @@ customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
-rm -rf ../prometheus-${RELEASE}.linux-arm64 ../prometheus-${RELEASE}.linux-arm64.tar.gz
+rm -rf prometheus-${RELEASE}.linux-arm64 prometheus-${RELEASE}.linux-arm64.tar.gz
msg_ok "Cleaned"
diff --git a/install/ps5-mqtt-install.sh b/install/ps5-mqtt-install.sh
new file mode 100644
index 000000000..be880e463
--- /dev/null
+++ b/install/ps5-mqtt-install.sh
@@ -0,0 +1,111 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: liecno
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/FunkeyFlo/ps5-mqtt/
+
+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 \
+ curl \
+ sudo \
+ mc \
+ jq \
+ ca-certificates \
+ gnupg
+msg_ok "Installed Dependencies"
+
+msg_info "Setting up Node.js Repository"
+mkdir -p /etc/apt/keyrings
+curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+msg_ok "Set up Node.js Repository"
+
+msg_info "Installing Node.js"
+$STD apt-get update
+$STD apt-get install -y nodejs
+$STD npm i -g playactor
+msg_ok "Installed Node.js"
+
+
+msg_info "Installing PS5-MQTT"
+RELEASE=$(curl -s https://api.github.com/repos/FunkeyFlo/ps5-mqtt/releases/latest | jq -r '.tag_name')
+wget -P /tmp -q https://github.com/FunkeyFlo/ps5-mqtt/archive/refs/tags/${RELEASE}.tar.gz
+tar zxf /tmp/${RELEASE}.tar.gz -C /opt
+mv /opt/ps5-mqtt-* /opt/ps5-mqtt
+cd /opt/ps5-mqtt/ps5-mqtt/
+$STD npm install
+$STD npm run build
+echo ${RELEASE} > /opt/ps5-mqtt_version.txt
+msg_ok "Installed PS5-MQTT"
+
+msg_info "Creating Service"
+mkdir -p /opt/.config/ps5-mqtt/
+mkdir -p /opt/.config/ps5-mqtt/playactor
+cat < /opt/.config/ps5-mqtt/config.json
+{
+ "mqtt": {
+ "host": "",
+ "port": "",
+ "user": "",
+ "pass": "",
+ "discovery_topic": "homeassistant"
+ },
+
+ "device_check_interval": 5000,
+ "device_discovery_interval": 60000,
+ "device_discovery_broadcast_address": "",
+
+ "include_ps4_devices": false,
+
+ "psn_accounts": [
+ {
+ "username": "",
+ "npsso":""
+ }
+ ],
+
+ "account_check_interval": 5000,
+
+ "credentialsStoragePath": "/opt/.config/ps5-mqtt/credentials.json",
+ "frontendPort": "8645"
+}
+EOF
+cat </etc/systemd/system/ps5-mqtt.service
+[Unit]
+Description=PS5-MQTT Daemon
+After=syslog.target network.target
+
+[Service]
+WorkingDirectory=/opt/ps5-mqtt/ps5-mqtt
+Environment="CONFIG_PATH=/opt/.config/ps5-mqtt/config.json"
+Environment="DEBUG='@ha:ps5:*'"
+Restart=always
+RestartSec=5
+Type=simple
+ExecStart=node server/dist/index.js
+KillMode=process
+SyslogIdentifier=ps5-mqtt
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now ps5-mqtt
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+rm /tmp/${RELEASE}.tar.gz
+msg_ok "Cleaned"
diff --git a/install/stirling-pdf-install.sh b/install/stirling-pdf-install.sh
index d7be36b60..f597005d3 100644
--- a/install/stirling-pdf-install.sh
+++ b/install/stirling-pdf-install.sh
@@ -38,7 +38,11 @@ msg_info "Installing LibreOffice Components"
$STD apt-get install -y \
libreoffice-writer \
libreoffice-calc \
- libreoffice-impress
+ libreoffice-impress \
+ libreoffice-core \
+ libreoffice-common \
+ libreoffice-base-core \
+ python3-uno
msg_ok "Installed LibreOffice Components"
msg_info "Installing Python Dependencies"
@@ -77,8 +81,8 @@ msg_ok "Installed Language Packs"
msg_info "Installing Stirling-PDF (Additional Patience)"
RELEASE=$(curl -s https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-wget -q https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz
-tar -xzf v$RELEASE.tar.gz
+wget -q https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v${RELEASE}.tar.gz
+tar -xzf v${RELEASE}.tar.gz
cd Stirling-PDF-$RELEASE
chmod +x ./gradlew
$STD ./gradlew build
@@ -88,37 +92,66 @@ mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/
mv scripts /opt/Stirling-PDF/
ln -s /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar /opt/Stirling-PDF/Stirling-PDF.jar
ln -s /usr/share/tesseract-ocr/5/tessdata/ /usr/share/tessdata
-msg_ok "Installed Stirling-PDF v$RELEASE"
+msg_ok "Installed Stirling-PDF"
msg_info "Creating Service"
-cat </etc/systemd/system/stirlingpdf.service
+# Create LibreOffice listener service
+cat </etc/systemd/system/libreoffice-listener.service
[Unit]
-Description=Stirling-PDF service
-After=syslog.target network.target
+Description=LibreOffice Headless Listener Service
+After=network.target
[Service]
-SuccessExitStatus=143
-
+Type=simple
User=root
Group=root
-
-Type=simple
-EnvironmentFile=/opt/Stirling-PDF/.env
-WorkingDirectory=/opt/Stirling-PDF
-ExecStart=/usr/bin/java -jar Stirling-PDF.jar
-ExecStop=/bin/kill -15 %n
+ExecStart=/usr/lib/libreoffice/program/soffice --headless --invisible --nodefault --nofirststartwizard --nolockcheck --nologo --accept="socket,host=127.0.0.1,port=2002;urp;StarOffice.ComponentContext"
+Restart=always
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now stirlingpdf.service
+
+# Set up environment variables
+cat </opt/Stirling-PDF/.env
+PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/libreoffice/program
+UNO_PATH=/usr/lib/libreoffice/program
+PYTHONPATH=/usr/lib/python3/dist-packages:/usr/lib/libreoffice/program
+LD_LIBRARY_PATH=/usr/lib/libreoffice/program
+EOF
+
+cat </etc/systemd/system/stirlingpdf.service
+[Unit]
+Description=Stirling-PDF service
+After=syslog.target network.target libreoffice-listener.service
+Requires=libreoffice-listener.service
+
+[Service]
+SuccessExitStatus=143
+Type=simple
+User=root
+Group=root
+EnvironmentFile=/opt/Stirling-PDF/.env
+WorkingDirectory=/opt/Stirling-PDF
+ExecStart=/usr/bin/java -jar Stirling-PDF.jar
+ExecStop=/bin/kill -15 %n
+Restart=always
+RestartSec=10
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+# Enable and start services
+systemctl enable -q --now libreoffice-listener
+systemctl enable -q --now stirlingpdf
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
-rm -rf v$RELEASE.tar.gz /zulu-repo_1.0.0-3_all.deb
+rm -rf v${RELEASE}.tar.gz /zulu-repo_1.0.0-3_all.deb
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
diff --git a/json/ghost.json b/json/ghost.json
new file mode 100644
index 000000000..45db52080
--- /dev/null
+++ b/json/ghost.json
@@ -0,0 +1,41 @@
+{
+ "name": "Ghost",
+ "slug": "ghost",
+ "categories": [
+ 12
+ ],
+ "date_created": "2025-01-10",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 2368,
+ "documentation": "https://ghost.org/docs/",
+ "website": "https://ghost.org",
+ "logo": "https://raw.githubusercontent.com/TryGhost/Ghost/b6fe724b577e84f7dd174646d0323dabdcdf576e/apps/shade/src/assets/images/ghost-orb.svg",
+ "description": "Ghost is a powerful app for professional publishers to create, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/ghost.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 1024,
+ "hdd": 5,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "To run Ghost-CLI commands, first set a password for the ghost-user by running `sudo passwd ghost-user`. Then, switch to the ghost-user with `sudo -su ghost-user`.",
+ "type": "info"
+ }
+ ]
+}
+
+
diff --git a/json/nzbget.json b/json/nzbget.json
index d01693f54..d644efdd2 100644
--- a/json/nzbget.json
+++ b/json/nzbget.json
@@ -2,7 +2,7 @@
"name": "NZBGet",
"slug": "nzbget",
"categories": [
- 0
+ 16
],
"date_created": "2024-10-31",
"type": "ct",
diff --git a/json/prometheus-alertmanager.json b/json/prometheus-alertmanager.json
new file mode 100644
index 000000000..d6b0cda58
--- /dev/null
+++ b/json/prometheus-alertmanager.json
@@ -0,0 +1,34 @@
+{
+ "name": "Prometheus Alertmanager",
+ "slug": "prometheus-alertmanager",
+ "categories": [
+ 7
+ ],
+ "date_created": "2025-01-09",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 9093,
+ "documentation": "https://prometheus.io/docs/alerting/latest/overview/",
+ "website": "https://prometheus.io/",
+ "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/prometheus.svg",
+ "description": "Alerting with Prometheus is separated into two parts. Alerting rules in Prometheus servers send alerts to an Alertmanager. The Alertmanager then manages those alerts, including silencing, inhibition, aggregation and sending out notifications via methods such as email, on-call notification systems, and chat platforms.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/prometheus-alertmanager.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 2,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": []
+}
diff --git a/json/ps5-mqtt.json b/json/ps5-mqtt.json
new file mode 100644
index 000000000..6151a7486
--- /dev/null
+++ b/json/ps5-mqtt.json
@@ -0,0 +1,39 @@
+{
+ "name": "PS5-MQTT",
+ "slug": "ps5-mqtt",
+ "categories": [
+ 3
+ ],
+ "date_created": "2025-01-09",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 8645,
+ "documentation": null,
+ "website": "https://github.com/FunkeyFlo/",
+ "logo": "https://github.com/FunkeyFlo/ps5-mqtt/blob/main/add-ons/ps5-mqtt/logo.png?raw=true",
+ "description": "Integrate your Sony Playstation 5 devices with Home Assistant using MQTT.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/ps5-mqtt.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 512,
+ "hdd": 3,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "After installation, the MQTT endpoint must be configured. The configuration file is located within the LXC container at: `/opt/.config/ps5-mqtt/config.json`",
+ "type": "info"
+ }
+ ]
+}
diff --git a/misc/.app-headers b/misc/.app-headers
new file mode 100644
index 000000000..f43befdab
--- /dev/null
+++ b/misc/.app-headers
@@ -0,0 +1,2013 @@
+### Generated on 01-10-2025
+##################################################
+
+### 2fauth.sh
+APP=2FAuth
+ ___ _________ __ __
+ |__ \ / ____/ | __ __/ /_/ /_
+ __/ // /_ / /| |/ / / / __/ __ \
+ / __// __/ / ___ / /_/ / /_/ / / /
+/____/_/ /_/ |_\__,_/\__/_/ /_/
+
+
+### 5etools.sh
+APP=5etools
+ ______ __ __
+ / ____/__ / /_____ ____ / /____
+ /___ \/ _ \/ __/ __ \/ __ \/ / ___/
+ ____/ / __/ /_/ /_/ / /_/ / (__ )
+/_____/\___/\__/\____/\____/_/____/
+
+
+### actualbudget.sh
+APP=Actual Budget
+ ___ __ __ ____ __ __
+ / | _____/ /___ ______ _/ / / __ )__ ______/ /___ ____ / /_
+ / /| |/ ___/ __/ / / / __ `/ / / __ / / / / __ / __ `/ _ \/ __/
+ / ___ / /__/ /_/ /_/ / /_/ / / / /_/ / /_/ / /_/ / /_/ / __/ /_
+/_/ |_\___/\__/\__,_/\__,_/_/ /_____/\__,_/\__,_/\__, /\___/\__/
+ /____/
+
+### adguard.sh
+APP=Adguard
+ ___ __ __
+ / | ____/ /___ ___ ______ __________/ /
+ / /| |/ __ / __ `/ / / / __ `/ ___/ __ /
+ / ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
+/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
+ /____/
+
+### adventurelog.sh
+APP=AdventureLog
+ ___ __ __ __
+ / | ____/ / _____ ____ / /___ __________ / / ____ ____ _
+ / /| |/ __ / | / / _ \/ __ \/ __/ / / / ___/ _ \/ / / __ \/ __ `/
+ / ___ / /_/ /| |/ / __/ / / / /_/ /_/ / / / __/ /___/ /_/ / /_/ /
+/_/ |_\__,_/ |___/\___/_/ /_/\__/\__,_/_/ \___/_____/\____/\__, /
+ /____/
+
+### agentdvr.sh
+APP=AgentDVR
+ ___ __ ____ _ ______
+ / | ____ ____ ____ / /_/ __ \ | / / __ \
+ / /| |/ __ `/ _ \/ __ \/ __/ / / / | / / /_/ /
+ / ___ / /_/ / __/ / / / /_/ /_/ /| |/ / _, _/
+/_/ |_\__, /\___/_/ /_/\__/_____/ |___/_/ |_|
+ /____/
+
+### alpine-docker.sh
+APP=Alpine-Docker
+ ___ __ _ ____ __
+ / | / /___ (_)___ ___ / __ \____ _____/ /_____ _____
+ / /| | / / __ \/ / __ \/ _ \______/ / / / __ \/ ___/ //_/ _ \/ ___/
+ / ___ |/ / /_/ / / / / / __/_____/ /_/ / /_/ / /__/ ,< / __/ /
+/_/ |_/_/ .___/_/_/ /_/\___/ /_____/\____/\___/_/|_|\___/_/
+ /_/
+
+### alpine-grafana.sh
+APP=Alpine-Grafana
+ ___ __ _ ______ ____
+ / | / /___ (_)___ ___ / ____/________ _/ __/___ _____ ____ _
+ / /| | / / __ \/ / __ \/ _ \______/ / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/
+ / ___ |/ / /_/ / / / / / __/_____/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
+/_/ |_/_/ .___/_/_/ /_/\___/ \____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
+ /_/
+
+### alpine-nextcloud.sh
+APP=Alpine-Nextcloud
+ ___ __ _ _ __ __ __
+ / | / /___ (_)___ ___ / | / /__ _ __/ /______/ /___ __ __
+ / /| | / / __ \/ / __ \/ _ \______/ |/ / _ \| |/_/ __/ ___/ / __ \/ / / /
+ / ___ |/ / /_/ / / / / / __/_____/ /| / __/> /_/ /__/ / /_/ / /_/ /
+/_/ |_/_/ .___/_/_/ /_/\___/ /_/ |_/\___/_/|_|\__/\___/_/\____/\__,_/
+ /_/
+ __
+ ____/ /
+ / __ /
+/ /_/ /
+\__,_/
+
+
+### alpine-vaultwarden.sh
+APP=Alpine-Vaultwarden
+ ___ __ _ _ __ ____
+ / | / /___ (_)___ ___ | | / /___ ___ __/ / /__ ______ _
+ / /| | / / __ \/ / __ \/ _ \_____| | / / __ `/ / / / / __/ | /| / / __ `/
+ / ___ |/ / /_/ / / / / / __/_____/ |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ /
+/_/ |_/_/ .___/_/_/ /_/\___/ |___/\__,_/\__,_/_/\__/ |__/|__/\__,_/
+ /_/
+ __
+ _________/ /__ ____
+ / ___/ __ / _ \/ __ \
+ / / / /_/ / __/ / / /
+/_/ \__,_/\___/_/ /_/
+
+
+### alpine-zigbee2mqtt.sh
+APP=Alpine-Zigbee2MQTT
+ ___ __ _ _____ _ __ ___ __ ___
+ / | / /___ (_)___ ___ /__ / (_)___ _/ /_ ___ ___ |__ \ / |/ /
+ / /| | / / __ \/ / __ \/ _ \______/ / / / __ `/ __ \/ _ \/ _ \__/ // /|_/ /
+ / ___ |/ / /_/ / / / / / __/_____/ /__/ / /_/ / /_/ / __/ __/ __// / / /
+/_/ |_/_/ .___/_/_/ /_/\___/ /____/_/\__, /_.___/\___/\___/____/_/ /_/
+ /_/ /____/
+ ____ ____________
+ / __ \/_ __/_ __/
+ / / / / / / / /
+/ /_/ / / / / /
+\___\_\/_/ /_/
+
+
+### alpine.sh
+APP=Alpine
+ ___ __ _
+ / | / /___ (_)___ ___
+ / /| | / / __ \/ / __ \/ _ \
+ / ___ |/ / /_/ / / / / / __/
+/_/ |_/_/ .___/_/_/ /_/\___/
+ /_/
+
+### apache-cassandra.sh
+APP=Apache-Cassandra
+ ___ __ ______
+ / | ____ ____ ______/ /_ ___ / ____/___ _______________ _____
+ / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / / __ `/ ___/ ___/ __ `/ __ \
+ / ___ |/ /_/ / /_/ / /__/ / / / __/_____/ /___/ /_/ (__ |__ ) /_/ / / / /
+/_/ |_/ .___/\__,_/\___/_/ /_/\___/ \____/\__,_/____/____/\__,_/_/ /_/
+ /_/
+ __
+ ____/ /________ _
+ / __ / ___/ __ `/
+/ /_/ / / / /_/ /
+\__,_/_/ \__,_/
+
+
+### apache-couchdb.sh
+APP=Apache-CouchDB
+ ___ __ ______ __ ____
+ / | ____ ____ ______/ /_ ___ / ____/___ __ _______/ /_ / __ \
+ / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / / __ \/ / / / ___/ __ \/ / / /
+ / ___ |/ /_/ / /_/ / /__/ / / / __/_____/ /___/ /_/ / /_/ / /__/ / / / /_/ /
+/_/ |_/ .___/\__,_/\___/_/ /_/\___/ \____/\____/\__,_/\___/_/ /_/_____/
+ /_/
+ ____
+ / __ )
+ / __ |
+ / /_/ /
+/_____/
+
+
+### apache-guacamole.sh
+APP=Apache-Guacamole
+ ___ __ ______
+ / | ____ ____ ______/ /_ ___ / ____/_ ______ __________ _
+ / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / __/ / / / __ `/ ___/ __ `/
+ / ___ |/ /_/ / /_/ / /__/ / / / __/_____/ /_/ / /_/ / /_/ / /__/ /_/ /
+/_/ |_/ .___/\__,_/\___/_/ /_/\___/ \____/\__,_/\__,_/\___/\__,_/
+ /_/
+ __
+ ____ ___ ____ / /__
+ / __ `__ \/ __ \/ / _ \
+ / / / / / / /_/ / / __/
+/_/ /_/ /_/\____/_/\___/
+
+
+### apt-cacher-ng.sh
+APP=Apt-Cacher-NG
+ ___ __ ______ __ _ ________
+ / | ____ / /_ / ____/___ ______/ /_ ___ _____ / | / / ____/
+ / /| | / __ \/ __/_____/ / / __ `/ ___/ __ \/ _ \/ ___/_____/ |/ / / __
+ / ___ |/ /_/ / /_/_____/ /___/ /_/ / /__/ / / / __/ / /_____/ /| / /_/ /
+/_/ |_/ .___/\__/ \____/\__,_/\___/_/ /_/\___/_/ /_/ |_/\____/
+ /_/
+
+### archivebox.sh
+APP=ArchiveBox
+ ___ __ _ ____
+ / | __________/ /_ (_) _____ / __ )____ _ __
+ / /| | / ___/ ___/ __ \/ / | / / _ \/ __ / __ \| |/_/
+ / ___ |/ / / /__/ / / / /| |/ / __/ /_/ / /_/ /> <
+/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_|
+
+
+### aria2.sh
+APP=Aria2
+ ___ _ ___
+ / | _____(_)___ |__ \
+ / /| | / ___/ / __ `/_/ /
+ / ___ |/ / / / /_/ / __/
+/_/ |_/_/ /_/\__,_/____/
+
+
+### audiobookshelf.sh
+APP=audiobookshelf
+ ___ __ __ __ ______
+ ____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/
+ / __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_
+/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/
+\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/
+
+
+### authentik.sh
+APP=Authentik
+ ___ __ __ __ _ __
+ / | __ __/ /_/ /_ ___ ____ / /_(_) /__
+ / /| |/ / / / __/ __ \/ _ \/ __ \/ __/ / //_/
+ / ___ / /_/ / /_/ / / / __/ / / / /_/ / ,<
+/_/ |_\__,_/\__/_/ /_/\___/_/ /_/\__/_/_/|_|
+
+
+### autobrr.sh
+APP=Autobrr
+ ___ __ __
+ / | __ __/ /_____ / /_ __________
+ / /| |/ / / / __/ __ \/ __ \/ ___/ ___/
+ / ___ / /_/ / /_/ /_/ / /_/ / / / /
+/_/ |_\__,_/\__/\____/_.___/_/ /_/
+
+
+### bazarr.sh
+APP=Bazarr
+ ____
+ / __ )____ _____ ____ ___________
+ / __ / __ `/_ / / __ `/ ___/ ___/
+ / /_/ / /_/ / / /_/ /_/ / / / /
+/_____/\__,_/ /___/\__,_/_/ /_/
+
+
+### blocky.sh
+APP=Blocky
+ ____ __ __
+ / __ )/ /___ _____/ /____ __
+ / __ / / __ \/ ___/ //_/ / / /
+ / /_/ / / /_/ / /__/ ,< / /_/ /
+/_____/_/\____/\___/_/|_|\__, /
+ /____/
+
+### bookstack.sh
+APP=Bookstack
+ ____ __ __ __
+ / __ )____ ____ / /_______/ /_____ ______/ /__
+ / __ / __ \/ __ \/ //_/ ___/ __/ __ `/ ___/ //_/
+ / /_/ / /_/ / /_/ / ,< (__ ) /_/ /_/ / /__/ ,<
+/_____/\____/\____/_/|_/____/\__/\__,_/\___/_/|_|
+
+
+### bunkerweb.sh
+APP=BunkerWeb
+ ____ __ _ __ __
+ / __ )__ ______ / /_____ ____| | / /__ / /_
+ / __ / / / / __ \/ //_/ _ \/ ___/ | /| / / _ \/ __ \
+ / /_/ / /_/ / / / / ,< / __/ / | |/ |/ / __/ /_/ /
+/_____/\__,_/_/ /_/_/|_|\___/_/ |__/|__/\___/_.___/
+
+
+### caddy.sh
+APP=Caddy
+ ______ __ __
+ / ____/___ _____/ /___/ /_ __
+ / / / __ `/ __ / __ / / / /
+/ /___/ /_/ / /_/ / /_/ / /_/ /
+\____/\__,_/\__,_/\__,_/\__, /
+ /____/
+
+### calibre-web.sh
+APP=Calibre-Web
+ ______ ___ __ _ __ __
+ / ____/___ _/ (_) /_ ________ | | / /__ / /_
+ / / / __ `/ / / __ \/ ___/ _ \_____| | /| / / _ \/ __ \
+/ /___/ /_/ / / / /_/ / / / __/_____/ |/ |/ / __/ /_/ /
+\____/\__,_/_/_/_.___/_/ \___/ |__/|__/\___/_.___/
+
+
+### casaos.sh
+APP=CasaOS
+ ______ ____ _____
+ / ____/___ __________ _/ __ \/ ___/
+ / / / __ `/ ___/ __ `/ / / /\__ \
+/ /___/ /_/ (__ ) /_/ / /_/ /___/ /
+\____/\__,_/____/\__,_/\____//____/
+
+
+### changedetection.sh
+APP=Change Detection
+ ________
+ / ____/ /_ ____ _____ ____ ____
+ / / / __ \/ __ `/ __ \/ __ `/ _ \
+/ /___/ / / / /_/ / / / / /_/ / __/
+\____/_/ /_/\__,_/_/ /_/\__, /\___/
+ /____/
+ ____ __ __ _
+ / __ \___ / /____ _____/ /_(_)___ ____
+ / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \
+ / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / /
+/_____/\___/\__/\___/\___/\__/_/\____/_/ /_/
+
+
+### channels.sh
+APP=Channels
+ ________ __
+ / ____/ /_ ____ _____ ____ ___ / /____
+ / / / __ \/ __ `/ __ \/ __ \/ _ \/ / ___/
+/ /___/ / / / /_/ / / / / / / / __/ (__ )
+\____/_/ /_/\__,_/_/ /_/_/ /_/\___/_/____/
+
+
+### checkmk.sh
+APP=checkmk
+ __ __ __
+ _____/ /_ ___ _____/ /______ ___ / /__
+ / ___/ __ \/ _ \/ ___/ //_/ __ `__ \/ //_/
+/ /__/ / / / __/ /__/ ,< / / / / / / ,<
+\___/_/ /_/\___/\___/_/|_/_/ /_/ /_/_/|_|
+
+
+### cloudflared.sh
+APP=Cloudflared
+ ________ ________ __
+ / ____/ /___ __ ______/ / __/ /___ _________ ____/ /
+ / / / / __ \/ / / / __ / /_/ / __ `/ ___/ _ \/ __ /
+/ /___/ / /_/ / /_/ / /_/ / __/ / /_/ / / / __/ /_/ /
+\____/_/\____/\__,_/\__,_/_/ /_/\__,_/_/ \___/\__,_/
+
+
+### cockpit.sh
+APP=Cockpit
+ ______ __ _ __
+ / ____/___ _____/ /______ (_) /_
+ / / / __ \/ ___/ //_/ __ \/ / __/
+/ /___/ /_/ / /__/ ,< / /_/ / / /_
+\____/\____/\___/_/|_/ .___/_/\__/
+ /_/
+
+### commafeed.sh
+APP=CommaFeed
+ ______ ______ __
+ / ____/___ ____ ___ ____ ___ ____ _/ ____/__ ___ ____/ /
+ / / / __ \/ __ `__ \/ __ `__ \/ __ `/ /_ / _ \/ _ \/ __ /
+/ /___/ /_/ / / / / / / / / / / / /_/ / __/ / __/ __/ /_/ /
+\____/\____/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \___/\___/\__,_/
+
+
+### cronicle.sh
+APP=Cronicle
+ ______ _ __
+ / ____/________ ____ (_)____/ /__
+ / / / ___/ __ \/ __ \/ / ___/ / _ \
+/ /___/ / / /_/ / / / / / /__/ / __/
+\____/_/ \____/_/ /_/_/\___/_/\___/
+
+
+### daemonsync.sh
+APP=Daemon Sync
+ ____ _____
+ / __ \____ ____ ____ ___ ____ ____ / ___/__ ______ _____
+ / / / / __ `/ _ \/ __ `__ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/
+ / /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__
+/_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/
+ /____/
+
+### dashy.sh
+APP=Dashy
+ ____ __
+ / __ \____ ______/ /_ __ __
+ / / / / __ `/ ___/ __ \/ / / /
+ / /_/ / /_/ (__ ) / / / /_/ /
+/_____/\__,_/____/_/ /_/\__, /
+ /____/
+
+### debian.sh
+APP=Debian
+ ____ __ _
+ / __ \___ / /_ (_)___ _____
+ / / / / _ \/ __ \/ / __ `/ __ \
+ / /_/ / __/ /_/ / / /_/ / / / /
+/_____/\___/_.___/_/\__,_/_/ /_/
+
+
+### deconz.sh
+APP=deCONZ
+ __ __________ _ _______
+ ____/ /__ / ____/ __ \/ | / /__ /
+ / __ / _ \/ / / / / / |/ / / /
+/ /_/ / __/ /___/ /_/ / /| / / /__
+\__,_/\___/\____/\____/_/ |_/ /____/
+
+
+### deluge.sh
+APP=Deluge
+ ____ __
+ / __ \___ / /_ ______ ____
+ / / / / _ \/ / / / / __ `/ _ \
+ / /_/ / __/ / /_/ / /_/ / __/
+/_____/\___/_/\__,_/\__, /\___/
+ /____/
+
+### docker.sh
+APP=Docker
+ ____ __
+ / __ \____ _____/ /_____ _____
+ / / / / __ \/ ___/ //_/ _ \/ ___/
+ / /_/ / /_/ / /__/ ,< / __/ /
+/_____/\____/\___/_/|_|\___/_/
+
+
+### dockge.sh
+APP=Dockge
+ ____ __
+ / __ \____ _____/ /______ ____
+ / / / / __ \/ ___/ //_/ __ `/ _ \
+ / /_/ / /_/ / /__/ ,< / /_/ / __/
+/_____/\____/\___/_/|_|\__, /\___/
+ /____/
+
+### emby.sh
+APP=Emby
+ ______ __
+ / ____/___ ___ / /_ __ __
+ / __/ / __ `__ \/ __ \/ / / /
+ / /___/ / / / / / /_/ / /_/ /
+/_____/_/ /_/ /_/_.___/\__, /
+ /____/
+
+### emqx.sh
+APP=EMQX
+ ________ _______ _ __
+ / ____/ |/ / __ \ | |/ /
+ / __/ / /|_/ / / / / | /
+ / /___/ / / / /_/ / / |
+/_____/_/ /_/\___\_\/_/|_|
+
+
+### ersatztv.sh
+APP=ErsatzTV
+ ______ __ _______ __
+ / ____/_____________ _/ /_____/_ __/ | / /
+ / __/ / ___/ ___/ __ `/ __/_ / / / | | / /
+ / /___/ / (__ ) /_/ / /_ / /_/ / | |/ /
+/_____/_/ /____/\__,_/\__/ /___/_/ |___/
+
+
+### esphome.sh
+APP=ESPHome
+ ___________ ____ __ __
+ / ____/ ___// __ \/ / / /___ ____ ___ ___
+ / __/ \__ \/ /_/ / /_/ / __ \/ __ `__ \/ _ \
+ / /___ ___/ / ____/ __ / /_/ / / / / / / __/
+/_____//____/_/ /_/ /_/\____/_/ /_/ /_/\___/
+
+
+### evcc.sh
+APP=evcc
+
+ ___ _ ____________
+ / _ \ | / / ___/ ___/
+/ __/ |/ / /__/ /__
+\___/|___/\___/\___/
+
+
+### fenrus.sh
+APP=Fenrus
+ ______
+ / ____/__ ____ _______ _______
+ / /_ / _ \/ __ \/ ___/ / / / ___/
+ / __/ / __/ / / / / / /_/ (__ )
+/_/ \___/_/ /_/_/ \__,_/____/
+
+
+### fhem.sh
+APP=FHEM
+ ________ __________ ___
+ / ____/ / / / ____/ |/ /
+ / /_ / /_/ / __/ / /|_/ /
+ / __/ / __ / /___/ / / /
+/_/ /_/ /_/_____/_/ /_/
+
+
+### firefly.sh
+APP=Firefly
+ _______ ______
+ / ____(_)_______ / __/ /_ __
+ / /_ / / ___/ _ \/ /_/ / / / /
+ / __/ / / / / __/ __/ / /_/ /
+/_/ /_/_/ \___/_/ /_/\__, /
+ /____/
+
+### flaresolverr.sh
+APP=FlareSolverr
+ ________ _____ __
+ / ____/ /___ _________ / ___/____ / / _____ __________
+ / /_ / / __ `/ ___/ _ \\__ \/ __ \/ / | / / _ \/ ___/ ___/
+ / __/ / / /_/ / / / __/__/ / /_/ / /| |/ / __/ / / /
+/_/ /_/\__,_/_/ \___/____/\____/_/ |___/\___/_/ /_/
+
+
+### flowiseai.sh
+APP=FlowiseAI
+ ________ _ ___ ____
+ / ____/ /___ _ __(_)_______ / | / _/
+ / /_ / / __ \ | /| / / / ___/ _ \/ /| | / /
+ / __/ / / /_/ / |/ |/ / (__ ) __/ ___ |_/ /
+/_/ /_/\____/|__/|__/_/____/\___/_/ |_/___/
+
+
+### forgejo.sh
+APP=Forgejo
+ ______ _
+ / ____/___ _________ ____ (_)___
+ / /_ / __ \/ ___/ __ `/ _ \ / / __ \
+ / __/ / /_/ / / / /_/ / __/ / / /_/ /
+/_/ \____/_/ \__, /\___/_/ /\____/
+ /____/ /___/
+
+### frigate.sh
+APP=Frigate
+ ______ _ __
+ / ____/____(_)___ _____ _/ /____
+ / /_ / ___/ / __ `/ __ `/ __/ _ \
+ / __/ / / / / /_/ / /_/ / /_/ __/
+/_/ /_/ /_/\__, /\__,_/\__/\___/
+ /____/
+
+### gitea.sh
+APP=Gitea
+ _______ __
+ / ____(_) /____ ____ _
+ / / __/ / __/ _ \/ __ `/
+/ /_/ / / /_/ __/ /_/ /
+\____/_/\__/\___/\__,_/
+
+
+### glance.sh
+APP=Glance
+ ________
+ / ____/ /___ _____ ________
+ / / __/ / __ `/ __ \/ ___/ _ \
+/ /_/ / / /_/ / / / / /__/ __/
+\____/_/\__,_/_/ /_/\___/\___/
+
+
+### glpi.sh
+APP=GLPI
+ ________ ____ ____
+ / ____/ / / __ \/ _/
+ / / __/ / / /_/ // /
+/ /_/ / /___/ ____// /
+\____/_____/_/ /___/
+
+
+### go2rtc.sh
+APP=go2rtc
+ ___ __
+ ____ _____ |__ \ _____/ /______
+ / __ `/ __ \__/ // ___/ __/ ___/
+ / /_/ / /_/ / __// / / /_/ /__
+ \__, /\____/____/_/ \__/\___/
+/____/
+
+### gokapi.sh
+APP=Gokapi
+ ______ __ _
+ / ____/___ / /______ _____ (_)
+ / / __/ __ \/ //_/ __ `/ __ \/ /
+/ /_/ / /_/ / ,< / /_/ / /_/ / /
+\____/\____/_/|_|\__,_/ .___/_/
+ /_/
+
+### gotify.sh
+APP=Gotify
+ ______ __ _ ____
+ / ____/___ / /_(_) __/_ __
+ / / __/ __ \/ __/ / /_/ / / /
+/ /_/ / /_/ / /_/ / __/ /_/ /
+\____/\____/\__/_/_/ \__, /
+ /____/
+
+### grafana.sh
+APP=Grafana
+ ______ ____
+ / ____/________ _/ __/___ _____ ____ _
+ / / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/
+/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
+\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
+
+
+### grist.sh
+APP=Grist
+ ______ _ __
+ / ____/____(_)____/ /_
+ / / __/ ___/ / ___/ __/
+/ /_/ / / / (__ ) /_
+\____/_/ /_/____/\__/
+
+
+### grocy.sh
+APP=grocy
+
+ ____ __________ _______ __
+ / __ `/ ___/ __ \/ ___/ / / /
+ / /_/ / / / /_/ / /__/ /_/ /
+ \__, /_/ \____/\___/\__, /
+/____/ /____/
+
+### headscale.sh
+APP=Headscale
+ __ __ __ __
+ / / / /__ ____ _____/ /_____________ _/ /__
+ / /_/ / _ \/ __ `/ __ / ___/ ___/ __ `/ / _ \
+ / __ / __/ /_/ / /_/ (__ ) /__/ /_/ / / __/
+/_/ /_/\___/\__,_/\__,_/____/\___/\__,_/_/\___/
+
+
+### heimdall-dashboard.sh
+APP=Heimdall-Dashboard
+ __ __ _ __ ____ ____ __ __
+ / / / /__ (_)___ ___ ____/ /___ _/ / / / __ \____ ______/ /_ / /_
+ / /_/ / _ \/ / __ `__ \/ __ / __ `/ / /_____/ / / / __ `/ ___/ __ \/ __ \
+ / __ / __/ / / / / / / /_/ / /_/ / / /_____/ /_/ / /_/ (__ ) / / / /_/ /
+/_/ /_/\___/_/_/ /_/ /_/\__,_/\__,_/_/_/ /_____/\__,_/____/_/ /_/_.___/
+
+ __
+ ____ ____ __________/ /
+ / __ \/ __ `/ ___/ __ /
+/ /_/ / /_/ / / / /_/ /
+\____/\__,_/_/ \__,_/
+
+
+### hivemq.sh
+APP=HiveMQ
+ __ ___ __ _______
+ / / / (_) _____ / |/ / __ \
+ / /_/ / / | / / _ \/ /|_/ / / / /
+ / __ / /| |/ / __/ / / / /_/ /
+/_/ /_/_/ |___/\___/_/ /_/\___\_\
+
+
+### hoarder.sh
+APP=Hoarder
+ __ __ __
+ / / / /___ ____ __________/ /__ _____
+ / /_/ / __ \/ __ `/ ___/ __ / _ \/ ___/
+ / __ / /_/ / /_/ / / / /_/ / __/ /
+/_/ /_/\____/\__,_/_/ \__,_/\___/_/
+
+
+### homarr.sh
+APP=Homarr
+ __ __
+ / / / /___ ____ ___ ____ ___________
+ / /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/
+ / __ / /_/ / / / / / / /_/ / / / /
+/_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/
+
+
+### homeassistant-core.sh
+APP=Home Assistant-Core
+ __ __
+ / / / /___ ____ ___ ___
+ / /_/ / __ \/ __ `__ \/ _ \
+ / __ / /_/ / / / / / / __/
+/_/ /_/\____/_/ /_/ /_/\___/
+
+ ___ _ __ __ ______
+ / | __________(_)____/ /_____ _____ / /_ / ____/___ ________
+ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/_____/ / / __ \/ ___/ _ \
+ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_/_____/ /___/ /_/ / / / __/
+/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____/\____/_/ \___/
+
+
+### homeassistant.sh
+APP=Home Assistant
+ __ __ ___ _ __ __
+ / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_
+ / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/
+ / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
+/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
+
+
+### homebox.sh
+APP=HomeBox
+ __ __ ____
+ / / / /___ ____ ___ ___ / __ )____ _ __
+ / /_/ / __ \/ __ `__ \/ _ \/ __ / __ \| |/_/
+ / __ / /_/ / / / / / / __/ /_/ / /_/ /> <
+/_/ /_/\____/_/ /_/ /_/\___/_____/\____/_/|_|
+
+
+### homebridge.sh
+APP=Homebridge
+ __ __ __ _ __
+ / / / /___ ____ ___ ___ / /_ _____(_)___/ /___ ____
+ / /_/ / __ \/ __ `__ \/ _ \/ __ \/ ___/ / __ / __ `/ _ \
+ / __ / /_/ / / / / / / __/ /_/ / / / / /_/ / /_/ / __/
+/_/ /_/\____/_/ /_/ /_/\___/_.___/_/ /_/\__,_/\__, /\___/
+ /____/
+
+### homepage.sh
+APP=Homepage
+ __ __
+ / / / /___ ____ ___ ___ ____ ____ _____ ____
+ / /_/ / __ \/ __ `__ \/ _ \/ __ \/ __ `/ __ `/ _ \
+ / __ / /_/ / / / / / / __/ /_/ / /_/ / /_/ / __/
+/_/ /_/\____/_/ /_/ /_/\___/ .___/\__,_/\__, /\___/
+ /_/ /____/
+
+### homer.sh
+APP=Homer
+ __ __
+ / / / /___ ____ ___ ___ _____
+ / /_/ / __ \/ __ `__ \/ _ \/ ___/
+ / __ / /_/ / / / / / / __/ /
+/_/ /_/\____/_/ /_/ /_/\___/_/
+
+
+### hyperhdr.sh
+APP=HyperHDR
+ __ __ __ ______ ____
+ / / / /_ ______ ___ _____/ / / / __ \/ __ \
+ / /_/ / / / / __ \/ _ \/ ___/ /_/ / / / / /_/ /
+ / __ / /_/ / /_/ / __/ / / __ / /_/ / _, _/
+/_/ /_/\__, / .___/\___/_/ /_/ /_/_____/_/ |_|
+ /____/_/
+
+### hyperion.sh
+APP=Hyperion
+ __ __ _
+ / / / /_ ______ ___ _____(_)___ ____
+ / /_/ / / / / __ \/ _ \/ ___/ / __ \/ __ \
+ / __ / /_/ / /_/ / __/ / / / /_/ / / / /
+/_/ /_/\__, / .___/\___/_/ /_/\____/_/ /_/
+ /____/_/
+
+### influxdb.sh
+APP=InfluxDB
+ ____ ______ ____ ____
+ / _/___ / __/ /_ ___ __/ __ \/ __ )
+ / // __ \/ /_/ / / / / |/_/ / / / __ |
+ _/ // / / / __/ / /_/ /> /_/ / /_/ /
+/___/_/ /_/_/ /_/\__,_/_/|_/_____/_____/
+
+
+### inspircd.sh
+APP=InspIRCd
+ ____ ________ ______ __
+ / _/___ _________ / _/ __ \/ ____/___/ /
+ / // __ \/ ___/ __ \ / // /_/ / / / __ /
+ _/ // / / (__ ) /_/ // // _, _/ /___/ /_/ /
+/___/_/ /_/____/ .___/___/_/ |_|\____/\__,_/
+ /_/
+
+### iobroker.sh
+APP=ioBroker
+ _ ____ __
+ (_)___ / __ )_________ / /_____ _____
+ / / __ \/ __ / ___/ __ \/ //_/ _ \/ ___/
+ / / /_/ / /_/ / / / /_/ / ,< / __/ /
+/_/\____/_____/_/ \____/_/|_|\___/_/
+
+
+### iventoy.sh
+APP=iVentoy
+ _ _ __ __
+ (_) | / /__ ____ / /_____ __ __
+ / /| | / / _ \/ __ \/ __/ __ \/ / / /
+ / / | |/ / __/ / / / /_/ /_/ / /_/ /
+/_/ |___/\___/_/ /_/\__/\____/\__, /
+ /____/
+
+### jackett.sh
+APP=Jackett
+ __ __ __ __
+ / /___ ______/ /_____ / /_/ /_
+ __ / / __ `/ ___/ //_/ _ \/ __/ __/
+/ /_/ / /_/ / /__/ ,< / __/ /_/ /_
+\____/\__,_/\___/_/|_|\___/\__/\__/
+
+
+### jellyfin.sh
+APP=Jellyfin
+ __ ____ _____
+ / /__ / / /_ __/ __(_)___
+ __ / / _ \/ / / / / / /_/ / __ \
+/ /_/ / __/ / / /_/ / __/ / / / /
+\____/\___/_/_/\__, /_/ /_/_/ /_/
+ /____/
+
+### jellyseerr.sh
+APP=Jellyseerr
+ __ ____
+ / /__ / / /_ __________ ___ __________
+ __ / / _ \/ / / / / / ___/ _ \/ _ \/ ___/ ___/
+/ /_/ / __/ / / /_/ (__ ) __/ __/ / / /
+\____/\___/_/_/\__, /____/\___/\___/_/ /_/
+ /____/
+
+### jenkins.sh
+APP=Jenkins
+ __ __ _
+ / /__ ____ / /__(_)___ _____
+ __ / / _ \/ __ \/ //_/ / __ \/ ___/
+/ /_/ / __/ / / / ,< / / / / (__ )
+\____/\___/_/ /_/_/|_/_/_/ /_/____/
+
+
+### kavita.sh
+APP=Kavita
+ __ __ _ __
+ / //_/___ __ __(_) /_____ _
+ / ,< / __ `/ | / / / __/ __ `/
+ / /| / /_/ /| |/ / / /_/ /_/ /
+/_/ |_\__,_/ |___/_/\__/\__,_/
+
+
+### keycloak.sh
+APP=Keycloak
+ __ __ __ __
+ / //_/__ __ _______/ /___ ____ _/ /__
+ / ,< / _ \/ / / / ___/ / __ \/ __ `/ //_/
+ / /| / __/ /_/ / /__/ / /_/ / /_/ / ,<
+/_/ |_\___/\__, /\___/_/\____/\__,_/_/|_|
+ /____/
+
+### kimai.sh
+APP=Kimai
+ __ __ _ _
+ / //_/(_)___ ___ ____ _(_)
+ / ,< / / __ `__ \/ __ `/ /
+ / /| |/ / / / / / / /_/ / /
+/_/ |_/_/_/ /_/ /_/\__,_/_/
+
+
+### komga.sh
+APP=Komga
+ __ __
+ / //_/___ ____ ___ ____ _____ _
+ / ,< / __ \/ __ `__ \/ __ `/ __ `/
+ / /| / /_/ / / / / / / /_/ / /_/ /
+/_/ |_\____/_/ /_/ /_/\__, /\__,_/
+ /____/
+
+### komodo.sh
+APP=Komodo
+ __ __ __
+ / //_/___ ____ ___ ____ ____/ /___
+ / ,< / __ \/ __ `__ \/ __ \/ __ / __ \
+ / /| / /_/ / / / / / / /_/ / /_/ / /_/ /
+/_/ |_\____/_/ /_/ /_/\____/\__,_/\____/
+
+
+### kubo.sh
+APP=Kubo
+ __ __ __
+ / //_/_ __/ /_ ____
+ / ,< / / / / __ \/ __ \
+ / /| / /_/ / /_/ / /_/ /
+/_/ |_\__,_/_.___/\____/
+
+
+### lazylibrarian.sh
+APP=LazyLibrarian
+ __ __ _ __ _
+ / / ____ _____ __ __/ / (_) /_ _________ ______(_)___ _____
+ / / / __ `/_ / / / / / / / / __ \/ ___/ __ `/ ___/ / __ `/ __ \
+ / /___/ /_/ / / /_/ /_/ / /___/ / /_/ / / / /_/ / / / / /_/ / / / /
+/_____/\__,_/ /___/\__, /_____/_/_.___/_/ \__,_/_/ /_/\__,_/_/ /_/
+ /____/
+
+### lidarr.sh
+APP=Lidarr
+ __ _ __
+ / / (_)___/ /___ ___________
+ / / / / __ / __ `/ ___/ ___/
+ / /___/ / /_/ / /_/ / / / /
+/_____/_/\__,_/\__,_/_/ /_/
+
+
+### linkwarden.sh
+APP=Linkwarden
+ __ _ __ __
+ / / (_)___ / /___ ______ __________/ /__ ____
+ / / / / __ \/ //_/ | /| / / __ `/ ___/ __ / _ \/ __ \
+ / /___/ / / / / ,< | |/ |/ / /_/ / / / /_/ / __/ / / /
+/_____/_/_/ /_/_/|_| |__/|__/\__,_/_/ \__,_/\___/_/ /_/
+
+
+### listmonk.sh
+APP=listmonk
+ ___ __ __
+ / (_)____/ /_____ ___ ____ ____ / /__
+ / / / ___/ __/ __ `__ \/ __ \/ __ \/ //_/
+ / / (__ ) /_/ / / / / / /_/ / / / / ,<
+/_/_/____/\__/_/ /_/ /_/\____/_/ /_/_/|_|
+
+
+### lldap.sh
+APP=lldap
+ ____ __
+ / / /___/ /___ _____
+ / / / __ / __ `/ __ \
+ / / / /_/ / /_/ / /_/ /
+/_/_/\__,_/\__,_/ .___/
+ /_/
+
+### lubelogger.sh
+APP=LubeLogger
+ __ __ __
+ / / __ __/ /_ ___ / / ____ ____ _____ ____ _____
+ / / / / / / __ \/ _ \/ / / __ \/ __ `/ __ `/ _ \/ ___/
+ / /___/ /_/ / /_/ / __/ /___/ /_/ / /_/ / /_/ / __/ /
+/_____/\__,_/_.___/\___/_____/\____/\__, /\__, /\___/_/
+ /____//____/
+
+### mafl.sh
+APP=Mafl
+ __ ___ ______
+ / |/ /___ _/ __/ /
+ / /|_/ / __ `/ /_/ /
+ / / / / /_/ / __/ /
+/_/ /_/\__,_/_/ /_/
+
+
+### magicmirror.sh
+APP=MagicMirror
+ __ ___ _ __ ____
+ / |/ /___ _____ _(_)____/ |/ (_)_____________ _____
+ / /|_/ / __ `/ __ `/ / ___/ /|_/ / / ___/ ___/ __ \/ ___/
+ / / / / /_/ / /_/ / / /__/ / / / / / / / / /_/ / /
+/_/ /_/\__,_/\__, /_/\___/_/ /_/_/_/ /_/ \____/_/
+ /____/
+
+### mariadb.sh
+APP=MariaDB
+ __ ___ _ ____ ____
+ / |/ /___ ______(_)___ _/ __ \/ __ )
+ / /|_/ / __ `/ ___/ / __ `/ / / / __ |
+ / / / / /_/ / / / / /_/ / /_/ / /_/ /
+/_/ /_/\__,_/_/ /_/\__,_/_____/_____/
+
+
+### matterbridge.sh
+APP=Matterbridge
+ __ ___ __ __ __ _ __
+ / |/ /___ _/ /_/ /____ _____/ /_ _____(_)___/ /___ ____
+ / /|_/ / __ `/ __/ __/ _ \/ ___/ __ \/ ___/ / __ / __ `/ _ \
+ / / / / /_/ / /_/ /_/ __/ / / /_/ / / / / /_/ / /_/ / __/
+/_/ /_/\__,_/\__/\__/\___/_/ /_.___/_/ /_/\__,_/\__, /\___/
+ /____/
+
+### mediamtx.sh
+APP=MediaMTX
+ __ ___ ___ __ __________ __
+ / |/ /__ ____/ (_)___ _/ |/ /_ __/ |/ /
+ / /|_/ / _ \/ __ / / __ `/ /|_/ / / / | /
+ / / / / __/ /_/ / / /_/ / / / / / / / |
+/_/ /_/\___/\__,_/_/\__,_/_/ /_/ /_/ /_/|_|
+
+
+### medusa.sh
+APP=Medusa
+ __ ___ __
+ / |/ /__ ____/ /_ ___________ _
+ / /|_/ / _ \/ __ / / / / ___/ __ `/
+ / / / / __/ /_/ / /_/ (__ ) /_/ /
+/_/ /_/\___/\__,_/\__,_/____/\__,_/
+
+
+### memos.sh
+APP=Memos
+ __ ___
+ / |/ /__ ____ ___ ____ _____
+ / /|_/ / _ \/ __ `__ \/ __ \/ ___/
+ / / / / __/ / / / / / /_/ (__ )
+/_/ /_/\___/_/ /_/ /_/\____/____/
+
+
+### meshcentral.sh
+APP=MeshCentral
+ __ ___ __ ______ __ __
+ / |/ /__ _____/ /_ / ____/__ ____ / /__________ _/ /
+ / /|_/ / _ \/ ___/ __ \/ / / _ \/ __ \/ __/ ___/ __ `/ /
+ / / / / __(__ ) / / / /___/ __/ / / / /_/ / / /_/ / /
+/_/ /_/\___/____/_/ /_/\____/\___/_/ /_/\__/_/ \__,_/_/
+
+
+### metube.sh
+APP=MeTube
+ __ ___ ______ __
+ / |/ /__/_ __/_ __/ /_ ___
+ / /|_/ / _ \/ / / / / / __ \/ _ \
+ / / / / __/ / / /_/ / /_/ / __/
+/_/ /_/\___/_/ \__,_/_.___/\___/
+
+
+### mongodb.sh
+APP=MongoDB
+ __ ___ ____ ____
+ / |/ /___ ____ ____ _____ / __ \/ __ )
+ / /|_/ / __ \/ __ \/ __ `/ __ \/ / / / __ |
+ / / / / /_/ / / / / /_/ / /_/ / /_/ / /_/ /
+/_/ /_/\____/_/ /_/\__, /\____/_____/_____/
+ /____/
+
+### motioneye.sh
+APP=Motioneye
+ __ ___ __ _
+ / |/ /___ / /_(_)___ ____ ___ __ _____
+ / /|_/ / __ \/ __/ / __ \/ __ \/ _ \/ / / / _ \
+ / / / / /_/ / /_/ / /_/ / / / / __/ /_/ / __/
+/_/ /_/\____/\__/_/\____/_/ /_/\___/\__, /\___/
+ /____/
+
+### mqtt.sh
+APP=MQTT
+ __ _______ ____________
+ / |/ / __ \/_ __/_ __/
+ / /|_/ / / / / / / / /
+ / / / / /_/ / / / / /
+/_/ /_/\___\_\/_/ /_/
+
+
+### mylar3.sh
+APP=Mylar3
+ __ ___ __ _____
+ / |/ /_ __/ /___ _____|__ /
+ / /|_/ / / / / / __ `/ ___//_ <
+ / / / / /_/ / / /_/ / / ___/ /
+/_/ /_/\__, /_/\__,_/_/ /____/
+ /____/
+
+### myspeed.sh
+APP=MySpeed
+ __ ___ _____ __
+ / |/ /_ __/ ___/____ ___ ___ ____/ /
+ / /|_/ / / / /\__ \/ __ \/ _ \/ _ \/ __ /
+ / / / / /_/ /___/ / /_/ / __/ __/ /_/ /
+/_/ /_/\__, //____/ .___/\___/\___/\__,_/
+ /____/ /_/
+
+### mysql.sh
+APP=MySQL
+ __ ___ _____ ____ __
+ / |/ /_ __/ ___// __ \ / /
+ / /|_/ / / / /\__ \/ / / / / /
+ / / / / /_/ /___/ / /_/ / / /___
+/_/ /_/\__, //____/\___\_\/_____/
+ /____/
+
+### n8n.sh
+APP=n8n
+ ____
+ ____ ( __ )____
+ / __ \/ __ / __ \
+ / / / / /_/ / / / /
+/_/ /_/\____/_/ /_/
+
+
+### navidrome.sh
+APP=Navidrome
+ _ __ _ __
+ / | / /___ __ __(_)___/ /________ ____ ___ ___
+ / |/ / __ `/ | / / / __ / ___/ __ \/ __ `__ \/ _ \
+ / /| / /_/ /| |/ / / /_/ / / / /_/ / / / / / / __/
+/_/ |_/\__,_/ |___/_/\__,_/_/ \____/_/ /_/ /_/\___/
+
+
+### neo4j.sh
+APP=Neo4j
+ _ __ __ __ _
+ / | / /__ ____ / // / (_)
+ / |/ / _ \/ __ \/ // /_/ /
+ / /| / __/ /_/ /__ __/ /
+/_/ |_/\___/\____/ /_/_/ /
+ /___/
+
+### netbox.sh
+APP=NetBox
+ _ __ __ ____
+ / | / /__ / /_/ __ )____ _ __
+ / |/ / _ \/ __/ __ / __ \| |/_/
+ / /| / __/ /_/ /_/ / /_/ /> <
+/_/ |_/\___/\__/_____/\____/_/|_|
+
+
+### nextcloudpi.sh
+APP=NextCloudPi
+ _ __ __ ________ ______ _
+ / | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_)
+ / |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / /
+ / /| / __/> /_/ /___/ / /_/ / /_/ / /_/ / ____/ /
+/_/ |_/\___/_/|_|\__/\____/_/\____/\__,_/\__,_/_/ /_/
+
+
+### nextpvr.sh
+APP=NextPVR
+ _ __ __ ____ _ ______
+ / | / /__ _ __/ /_/ __ \ | / / __ \
+ / |/ / _ \| |/_/ __/ /_/ / | / / /_/ /
+ / /| / __/> /_/ ____/| |/ / _, _/
+/_/ |_/\___/_/|_|\__/_/ |___/_/ |_|
+
+
+### nginxproxymanager.sh
+APP=Nginx Proxy Manager
+ _ __ _ ____
+ / | / /___ _(_)___ _ __ / __ \_________ _ ____ __
+ / |/ / __ `/ / __ \| |/_/ / /_/ / ___/ __ \| |/_/ / / /
+ / /| / /_/ / / / / /> < / ____/ / / /_/ /> /_/ /
+/_/ |_/\__, /_/_/ /_/_/|_| /_/ /_/ \____/_/|_|\__, /
+ /____/ /____/
+ __ ___
+ / |/ /___ _____ ____ _____ ____ _____
+ / /|_/ / __ `/ __ \/ __ `/ __ `/ _ \/ ___/
+ / / / / /_/ / / / / /_/ / /_/ / __/ /
+/_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/
+ /____/
+
+### nocodb.sh
+APP=NocoDB
+ _ __ ____ ____
+ / | / /___ _________ / __ \/ __ )
+ / |/ / __ \/ ___/ __ \/ / / / __ |
+ / /| / /_/ / /__/ /_/ / /_/ / /_/ /
+/_/ |_/\____/\___/\____/_____/_____/
+
+
+### node-red.sh
+APP=Node-Red
+ _ __ __ ____ __
+ / | / /___ ____/ /__ / __ \___ ____/ /
+ / |/ / __ \/ __ / _ \______/ /_/ / _ \/ __ /
+ / /| / /_/ / /_/ / __/_____/ _, _/ __/ /_/ /
+/_/ |_/\____/\__,_/\___/ /_/ |_|\___/\__,_/
+
+
+### notifiarr.sh
+APP=Notifiarr
+ _ __ __ _ _____
+ / | / /___ / /_(_) __(_)___ ___________
+ / |/ / __ \/ __/ / /_/ / __ `/ ___/ ___/
+ / /| / /_/ / /_/ / __/ / /_/ / / / /
+/_/ |_/\____/\__/_/_/ /_/\__,_/_/ /_/
+
+
+### ntfy.sh
+APP=ntfy
+ __ ____
+ ____ / /_/ __/_ __
+ / __ \/ __/ /_/ / / /
+ / / / / /_/ __/ /_/ /
+/_/ /_/\__/_/ \__, /
+ /____/
+
+### nzbget.sh
+APP=NZBGet
+ _ _______ ____ ______ __
+ / | / /__ / / __ )/ ____/__ / /_
+ / |/ / / / / __ / / __/ _ \/ __/
+ / /| / / /__/ /_/ / /_/ / __/ /_
+/_/ |_/ /____/_____/\____/\___/\__/
+
+
+### octoprint.sh
+APP=OctoPrint
+ ____ __ ____ _ __
+ / __ \_____/ /_____ / __ \_____(_)___ / /_
+ / / / / ___/ __/ __ \/ /_/ / ___/ / __ \/ __/
+/ /_/ / /__/ /_/ /_/ / ____/ / / / / / / /_
+\____/\___/\__/\____/_/ /_/ /_/_/ /_/\__/
+
+
+### ollama.sh
+APP=Ollama
+ ____ ____
+ / __ \/ / /___ _____ ___ ____ _
+ / / / / / / __ `/ __ `__ \/ __ `/
+/ /_/ / / / /_/ / / / / / / /_/ /
+\____/_/_/\__,_/_/ /_/ /_/\__,_/
+
+
+### omada.sh
+APP=Omada
+ ____ __
+ / __ \____ ___ ____ _____/ /___ _
+ / / / / __ `__ \/ __ `/ __ / __ `/
+/ /_/ / / / / / / /_/ / /_/ / /_/ /
+\____/_/ /_/ /_/\__,_/\__,_/\__,_/
+
+
+### ombi.sh
+APP=Ombi
+ ____ __ _
+ / __ \____ ___ / /_ (_)
+ / / / / __ `__ \/ __ \/ /
+/ /_/ / / / / / / /_/ / /
+\____/_/ /_/ /_/_.___/_/
+
+
+### omv.sh
+APP=OMV
+ ____ __ ____ __
+ / __ \/ |/ / | / /
+ / / / / /|_/ /| | / /
+/ /_/ / / / / | |/ /
+\____/_/ /_/ |___/
+
+
+### onedev.sh
+APP=OneDev
+ ____ ____
+ / __ \____ ___ / __ \___ _ __
+ / / / / __ \/ _ \/ / / / _ \ | / /
+/ /_/ / / / / __/ /_/ / __/ |/ /
+\____/_/ /_/\___/_____/\___/|___/
+
+
+### openhab.sh
+APP=openHAB
+ __ _____ ____
+ ____ ____ ___ ____ / / / / | / __ )
+ / __ \/ __ \/ _ \/ __ \/ /_/ / /| | / __ |
+/ /_/ / /_/ / __/ / / / __ / ___ |/ /_/ /
+\____/ .___/\___/_/ /_/_/ /_/_/ |_/_____/
+ /_/
+
+### openobserve.sh
+APP=OpenObserve
+ ____ ____ __
+ / __ \____ ___ ____ / __ \/ /_ ________ ______ _____
+ / / / / __ \/ _ \/ __ \/ / / / __ \/ ___/ _ \/ ___/ | / / _ \
+/ /_/ / /_/ / __/ / / / /_/ / /_/ (__ ) __/ / | |/ / __/
+\____/ .___/\___/_/ /_/\____/_.___/____/\___/_/ |___/\___/
+ /_/
+
+### openwebui.sh
+APP=Open WebUI
+ ____ _ __ __ __ ______
+ / __ \____ ___ ____ | | / /__ / /_ / / / / _/
+ / / / / __ \/ _ \/ __ \ | | /| / / _ \/ __ \/ / / // /
+/ /_/ / /_/ / __/ / / / | |/ |/ / __/ /_/ / /_/ // /
+\____/ .___/\___/_/ /_/ |__/|__/\___/_.___/\____/___/
+ /_/
+
+### overseerr.sh
+APP=Overseerr
+ ____
+ / __ \_ _____ _____________ ___ __________
+ / / / / | / / _ \/ ___/ ___/ _ \/ _ \/ ___/ ___/
+/ /_/ /| |/ / __/ / (__ ) __/ __/ / / /
+\____/ |___/\___/_/ /____/\___/\___/_/ /_/
+
+
+### owncast.sh
+APP=Owncast
+ ____ __
+ / __ \_ ______ _________ ______/ /_
+ / / / / | /| / / __ \/ ___/ __ `/ ___/ __/
+/ /_/ /| |/ |/ / / / / /__/ /_/ (__ ) /_
+\____/ |__/|__/_/ /_/\___/\__,_/____/\__/
+
+
+### pairdrop.sh
+APP=PairDrop
+ ____ _ ____
+ / __ \____ _(_)____/ __ \_________ ____
+ / /_/ / __ `/ / ___/ / / / ___/ __ \/ __ \
+ / ____/ /_/ / / / / /_/ / / / /_/ / /_/ /
+/_/ \__,_/_/_/ /_____/_/ \____/ .___/
+ /_/
+
+### paperless-ngx.sh
+APP=Paperless-ngx
+ ____ __
+ / __ \____ _____ ___ _____/ /__ __________ ____ ____ __ __
+ / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ __ \/ __ `/ |/_/
+ / ____/ /_/ / /_/ / __/ / / / __(__ |__ )_____/ / / / /_/ /> <
+/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ /_/\__, /_/|_|
+ /_/ /____/
+
+### part-db.sh
+APP=Part-DB
+ ____ __ ____ ____
+ / __ \____ ______/ /_ / __ \/ __ )
+ / /_/ / __ `/ ___/ __/_____/ / / / __ |
+ / ____/ /_/ / / / /_/_____/ /_/ / /_/ /
+/_/ \__,_/_/ \__/ /_____/_____/
+
+
+### pbs.sh
+APP=PBS
+ ____ ____ _____
+ / __ \/ __ ) ___/
+ / /_/ / __ \__ \
+ / ____/ /_/ /__/ /
+/_/ /_____/____/
+
+
+### peanut.sh
+APP=PeaNUT
+ ____ _ ____ ________
+ / __ \___ ____ _/ | / / / / /_ __/
+ / /_/ / _ \/ __ `/ |/ / / / / / /
+ / ____/ __/ /_/ / /| / /_/ / / /
+/_/ \___/\__,_/_/ |_/\____/ /_/
+
+
+### petio.sh
+APP=Petio
+ ____ __ _
+ / __ \___ / /_(_)___
+ / /_/ / _ \/ __/ / __ \
+ / ____/ __/ /_/ / /_/ /
+/_/ \___/\__/_/\____/
+
+
+### pf2etools.sh
+APP=Pf2eTools
+ ____ _______ ______ __
+ / __ \/ __/__ \ ___/_ __/___ ____ / /____
+ / /_/ / /_ __/ // _ \/ / / __ \/ __ \/ / ___/
+ / ____/ __// __// __/ / / /_/ / /_/ / (__ )
+/_/ /_/ /____/\___/_/ \____/\____/_/____/
+
+
+### photoprism.sh
+APP=PhotoPrism
+ ____ __ __ ____ _
+ / __ \/ /_ ____ / /_____ / __ \_____(_)________ ___
+ / /_/ / __ \/ __ \/ __/ __ \/ /_/ / ___/ / ___/ __ `__ \
+ / ____/ / / / /_/ / /_/ /_/ / ____/ / / (__ ) / / / / /
+/_/ /_/ /_/\____/\__/\____/_/ /_/ /_/____/_/ /_/ /_/
+
+
+### pialert.sh
+APP=PiAlert
+ ____ _ ___ __ __
+ / __ \(_) | / /__ _____/ /_
+ / /_/ / / /| | / / _ \/ ___/ __/
+ / ____/ / ___ |/ / __/ / / /_
+/_/ /_/_/ |_/_/\___/_/ \__/
+
+
+### pihole.sh
+APP=Pihole
+ ____ _ __ __
+ / __ \(_) /_ ____ / /__
+ / /_/ / / __ \/ __ \/ / _ \
+ / ____/ / / / / /_/ / / __/
+/_/ /_/_/ /_/\____/_/\___/
+
+
+### pingvin.sh
+APP=Pingvin
+ ____ _ _
+ / __ \(_)___ ____ __ __(_)___
+ / /_/ / / __ \/ __ `/ | / / / __ \
+ / ____/ / / / / /_/ /| |/ / / / / /
+/_/ /_/_/ /_/\__, / |___/_/_/ /_/
+ /____/
+
+### plex.sh
+APP=Plex
+ ____ __
+ / __ \/ /__ _ __
+ / /_/ / / _ \| |/_/
+ / ____/ / __/> <
+/_/ /_/\___/_/|_|
+
+
+### pocketbase.sh
+APP=Pocketbase
+ ____ __ __ __
+ / __ \____ _____/ /_____ / /_/ /_ ____ _________
+ / /_/ / __ \/ ___/ //_/ _ \/ __/ __ \/ __ `/ ___/ _ \
+ / ____/ /_/ / /__/ ,< / __/ /_/ /_/ / /_/ (__ ) __/
+/_/ \____/\___/_/|_|\___/\__/_.___/\__,_/____/\___/
+
+
+### podman-homeassistant.sh
+APP=Podman-Home Assistant
+ ____ __ __ __
+ / __ \____ ____/ /___ ___ ____ _____ / / / /___ ____ ___ ___
+ / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \______/ /_/ / __ \/ __ `__ \/ _ \
+ / ____/ /_/ / /_/ / / / / / / /_/ / / / /_____/ __ / /_/ / / / / / / __/
+/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/ /_/ /_/\____/_/ /_/ /_/\___/
+
+ ___ _ __ __
+ / | __________(_)____/ /_____ _____ / /_
+ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/
+ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
+/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
+
+
+### podman.sh
+APP=Podman
+ ____ __
+ / __ \____ ____/ /___ ___ ____ _____
+ / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \
+ / ____/ /_/ / /_/ / / / / / / /_/ / / / /
+/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/
+
+
+### postgresql.sh
+APP=PostgreSQL
+ ____ __ _____ ____ __
+ / __ \____ _____/ /_____ _________ / ___// __ \ / /
+ / /_/ / __ \/ ___/ __/ __ `/ ___/ _ \\__ \/ / / / / /
+ / ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___
+/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/
+ /____/
+
+### prometheus-alertmanager.sh
+APP=Prometheus-Alertmanager
+ ____ __ __ ___ __
+ / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ / | / /
+ / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /| | / /
+ / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )_____/ ___ |/ /
+/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ /_/ |_/_/
+
+ __
+ ___ _____/ /_____ ___ ____ _____ ____ _____ ____ _____
+ / _ \/ ___/ __/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \/ ___/
+/ __/ / / /_/ / / / / / /_/ / / / / /_/ / /_/ / __/ /
+\___/_/ \__/_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/
+ /____/
+
+### prometheus.sh
+APP=Prometheus
+ ____ __ __
+ / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______
+ / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/
+ / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )
+/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/
+
+
+### prowlarr.sh
+APP=Prowlarr
+ ____ __
+ / __ \_________ _ __/ /___ ___________
+ / /_/ / ___/ __ \ | /| / / / __ `/ ___/ ___/
+ / ____/ / / /_/ / |/ |/ / / /_/ / / / /
+/_/ /_/ \____/|__/|__/_/\__,_/_/ /_/
+
+
+### proxmox-datacenter-manager.sh
+APP=proxmox-datacenter-manager
+ __ __
+ ____ _________ _ ______ ___ ____ _ __ ____/ /___ _/ /_____ _
+ / __ \/ ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ __ / __ `/ __/ __ `/
+ / /_/ / / / /_/ /> / / / / / /_/ /> <
+/____/\__,_/_.___/_.___/_/_/|_|
+
+
+### zammad.sh
+APP=Zammad
+ _____ __
+/__ / ____ _____ ___ ____ ___ ____ _____/ /
+ / / / __ `/ __ `__ \/ __ `__ \/ __ `/ __ /
+ / /__/ /_/ / / / / / / / / / / / /_/ / /_/ /
+/____/\__,_/_/ /_/ /_/_/ /_/ /_/\__,_/\__,_/
+
+
+### zigbee2mqtt.sh
+APP=Zigbee2MQTT
+ _____ _ __ ___ __ _______ ____________
+/__ / (_)___ _/ /_ ___ ___ |__ \ / |/ / __ \/_ __/_ __/
+ / / / / __ `/ __ \/ _ \/ _ \__/ // /|_/ / / / / / / / /
+ / /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / /
+/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/
+ /____/
+
+### zipline.sh
+APP=Zipline
+ _____ _ ___
+/__ / (_)___ / (_)___ ___
+ / / / / __ \/ / / __ \/ _ \
+ / /__/ / /_/ / / / / / / __/
+/____/_/ .___/_/_/_/ /_/\___/
+ /_/
+
+### zoraxy.sh
+APP=Zoraxy
+ _____
+/__ / ____ _________ __ ____ __
+ / / / __ \/ ___/ __ `/ |/_/ / / /
+ / /__/ /_/ / / / /_/ /> /_/ /
+/____/\____/_/ \__,_/_/|_|\__, /
+ /____/
+
+### zwave-js-ui.sh
+APP=Zwave-JS-UI
+ _____ _______ __ ______
+/__ /_ ______ __ _____ / / ___/ / / / / _/
+ / /| | /| / / __ `/ | / / _ \________ / /\__ \______/ / / // /
+ / /_| |/ |/ / /_/ /| |/ / __/_____/ /_/ /___/ /_____/ /_/ // /
+/____/__/|__/\__,_/ |___/\___/ \____//____/ \____/___/
+
+
diff --git a/misc/build.func b/misc/build.func
index 472ddeb70..cba92e8bb 100644
--- a/misc/build.func
+++ b/misc/build.func
@@ -625,6 +625,17 @@ advanced_settings() {
exit_script
fi
+ if ADV_TAGS=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Custom Tags?[If you remove all, there will be no tags!]" 8 58 ${TAGS} --title "Advanced Tags" 3>&1 1>&2 2>&3); then
+ if [ -n "${ADV_TAGS}" ]; then
+ ADV_TAGS=${ADV_TAGS:-""}
+ ADV_TAGS=$(echo "$ADV_TAGS" | tr -d '[:space:]')
+ TAGS="community-script;${ADV_TAGS}"
+ fi
+ echo -e "${NETWORK}${BOLD}${DGN}Tags: ${BGN}$TAGS${CL}"
+ else
+ exit_script
+ fi
+
if [[ "$PW" == -password* ]]; then
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
SSH="yes"