From 04a473b4a858d3fdcac82ce66e6e5fd3e10f4532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 11 Mar 2025 07:04:09 +0100 Subject: [PATCH 001/258] Additions and amends to the CONTIRBUTOR docs (#2983) * Fixes to the contributor docs * added info about our dev repo * some more clarifications --- .../CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md | 29 +++++++++++++++++-- .github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md | 3 +- .../install/AppName-install.md | 4 +++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md b/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md index f5a46fcd1..ff317425a 100644 --- a/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md +++ b/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md @@ -40,7 +40,7 @@ Before contributing, please ensure that you have the following setup: - [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format) ### Important Notes -- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts. +- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts. Final version of the script (the one you will push for review), must have all comments removed, except the ones in the file header. --- @@ -66,6 +66,12 @@ Start with the [template script](https://github.com/community-scripts/ProxmoxVE/ ## 🀝 Contribution Process +All PR's related to new scripts should be made against our Dev repository first, where we can test the scripts before they are pushed and merged in the official repository. + +**Our Dev repo is `http://www.github.com/community-scripts/ProxmoxVED`** + +You will need to adjust paths mentioned further down this document to match the repo you're pushing the scripts to. + ### 1. Fork the repository Fork to your GitHub account @@ -80,7 +86,24 @@ git switch -c your-feature-branch ``` ### 4. Change paths in build.func install.func and AppName.sh -To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`. +To be able to develop from your own branch you need to change:\ +`https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`\ +to\ +`https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`\ + in following files: + +`misc/build.func`\ +`misc/install.func`\ +`ct/AppName.sh` + +Example: `https://raw.githubusercontent.com/tremor021/PromoxVE/refs/heads/testbranch` + +Also you need to change:\ +`https://github.com/community-scripts/ProxmoxVE/raw/main`\ +to\ +`https://github.com/[USER]/[REPOSITORY]/raw/[BRANCH]`\ +in `misc/install.func` in order for `update` shell command to work.\ +These changes are only while writing and testing your scripts. Before opening a Pull Request, you should change all above mentioned paths in `misc/build.func`, `misc/install.func` and `ct/AppName.sh` to point to the original paths. ### 4. Commit changes (without build.func and install.func!) ```bash @@ -93,7 +116,7 @@ git push origin your-feature-branch ``` ### 6. Create a Pull Request -Open a Pull Request from your feature branch to the main repository branch. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request. +Open a Pull Request from your feature branch to the main branch on the Dev repository. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request. --- diff --git a/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md b/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md index be6c6f848..e3a2b0bc0 100644 --- a/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md +++ b/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md @@ -75,6 +75,7 @@ Example: > > - Add your username and source URL > - For existing scripts, add "| Co-Author [YourUserName]" after the current author +> - Source is a URL of github repo containting source files of the application you're installing (not URL of your homepage or a blog) --- @@ -95,7 +96,7 @@ Example: >| Variable | Description | Notes | >|----------|-------------|-------| >| `APP` | Application name | Must match ct\AppName.sh | ->| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number | +>| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number to 2 | >| `var_cpu` | CPU cores | Number of cores | >| `var_ram` | RAM | In MB | >| `var_disk` | Disk capacity | In GB | diff --git a/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md b/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md index 241cd99ac..d2b65e025 100644 --- a/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md +++ b/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md @@ -67,6 +67,7 @@ Example: > > - Add your username > - When updating/reworking scripts, add "| Co-Author [YourUserName]" +> - Source is a URL of github repo containting source files of the application you're installing (not URL of your homepage or a blog) ### 1.3 **Variables and function import** @@ -177,6 +178,7 @@ echo "${RELEASE}" >"/opt/AppName_version.txt" - 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. +- Taking user input with `read -p` must be outside of `msg_info`...`msg_ok` code block Example: @@ -184,6 +186,8 @@ Example: msg_info "Installing Dependencies" $STD apt-get install -y ... msg_ok "Installed Dependencies" + +read -p "Do you wish to enable HTTPS mode? (y/N): " httpschoice ``` ### 6.2 **Verbosity** From 77fbf68a4346cbd1dcc397bfa0372adcf0070bad Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:01:19 +0100 Subject: [PATCH 002/258] Update CHANGELOG.md (#2989) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11f544567..3a64a39aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-11 + +### 🧰 Maintenance + + - #### πŸ“‚ Github + + - Additions and amends to the CONTIRBUTOR docs [@tremor021](https://github.com/tremor021) ([#2983](https://github.com/community-scripts/ProxmoxVE/pull/2983)) + ## 2025-03-10 ### πŸ†• New Scripts From a9db3283dd40272f901ac02bebb4a008a06ab503 Mon Sep 17 00:00:00 2001 From: Dave Yap Date: Tue, 11 Mar 2025 15:19:28 +0800 Subject: [PATCH 003/258] Seafile (#2987) --- ct/seafile.sh | 43 ++++++ install/seafile-install.sh | 281 +++++++++++++++++++++++++++++++++++++ json/seafile.json | 47 +++++++ 3 files changed, 371 insertions(+) create mode 100644 ct/seafile.sh create mode 100644 install/seafile-install.sh create mode 100644 json/seafile.json diff --git a/ct/seafile.sh b/ct/seafile.sh new file mode 100644 index 000000000..d6d13a737 --- /dev/null +++ b/ct/seafile.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: dave-yap (dave-yap) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://seafile.com/ + +APP="Seafile" +var_tags="documents" +var_cpu="2" +var_ram="2048" +var_disk="20" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +base_settings + +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/seafile.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_ok "No upgrade path available now." + 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}:8000${CL}" \ No newline at end of file diff --git a/install/seafile-install.sh b/install/seafile-install.sh new file mode 100644 index 000000000..3e3776a39 --- /dev/null +++ b/install/seafile-install.sh @@ -0,0 +1,281 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: dave-yap +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://seafile.com/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies (Patience)" +$STD apt-get install -y \ + sudo \ + mc \ + wget \ + expect +msg_ok "Installed Dependencies" + +msg_info "Installing MariaDB" +$STD apt-get install -y mariadb-server +systemctl start mariadb +msg_ok "Installed MariaDB" + +msg_info "Setup MariaDB for Seafile" +CCNET_DB="ccnet_db" +SEAFILE_DB="seafile_db" +SEAHUB_DB="seahub_db" +DB_USER="seafile" +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) +ADMIN_EMAIL="admin@localhost.local" +ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) +sudo -u mysql mysql -s -e "CREATE DATABASE $CCNET_DB CHARACTER SET utf8;" +sudo -u mysql mysql -s -e "CREATE DATABASE $SEAFILE_DB CHARACTER SET utf8;" +sudo -u mysql mysql -s -e "CREATE DATABASE $SEAHUB_DB CHARACTER SET utf8;" +sudo -u mysql mysql -s -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" +sudo -u mysql mysql -s -e "GRANT ALL PRIVILEGES ON $CCNET_DB.* TO '$DB_USER'@localhost;" +sudo -u mysql mysql -s -e "GRANT ALL PRIVILEGES ON $SEAFILE_DB.* TO '$DB_USER'@localhost;" +sudo -u mysql mysql -s -e "GRANT ALL PRIVILEGES ON $SEAHUB_DB.* TO '$DB_USER'@localhost;" +{ + echo "Application Credentials" + echo "CCNET_DB: $CCNET_DB" + echo "SEAFILE_DB: $SEAFILE_DB" + echo "SEAHUB_DB: $SEAHUB_DB" + echo "DB_USER: $DB_USER" + echo "DB_PASS: $DB_PASS" + echo "ADMIN_EMAIL: $ADMIN_EMAIL" + echo "ADMIN_PASS: $ADMIN_PASS" +} >> ~/seafile.creds +msg_ok "MariaDB setup for Seafile" + +msg_info "Installing Seafile Python Dependencies" +$STD apt-get install -y \ + python3 \ + python3-dev \ + python3-setuptools \ + python3-pip \ + libmariadb-dev \ + ldap-utils \ + libldap2-dev \ + libsasl2-dev \ + pkg-config +$STD pip3 install \ + django \ + future \ + mysqlclient \ + pymysql \ + pillow \ + pylibmc \ + captcha \ + markupsafe \ + jinja2 \ + sqlalchemy \ + psd-tools \ + django-pylibmc \ + django_simple_captcha \ + djangosaml2 \ + pysaml2 \ + pycryptodome \ + cffi \ + lxml \ + python-ldap +msg_ok "Installed Seafile Python Dependecies" + +msg_info "Installing Seafile" +IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) +mkdir -p /opt/seafile +useradd seafile +mkdir -p /home/seafile +chown seafile: /home/seafile +chown seafile: /opt/seafile +$STD su - seafile -c "wget -qc https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_11.0.13_x86-64.tar.gz" +$STD su - seafile -c "tar -xzf seafile-server_11.0.13_x86-64.tar.gz -C /opt/seafile/" +$STD su - seafile -c "expect <>/opt/seafile/conf/seahub_settings.py +CACHES = { + 'default': { + 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache', + 'LOCATION': '127.0.0.1:11211', + }, +} +EOF +msg_ok "Memcached Started" + +msg_info "Adjusting Conf files" +sed -i "0,/127.0.0.1/s/127.0.0.1/0.0.0.0/" /opt/seafile/conf/gunicorn.conf.py +sed -i "0,/SERVICE_URL = \"http:\/\/$IP\"/s/SERVICE_URL = \"http:\/\/$IP\"/SERVICE_URL = \"http:\/\/$IP:8000\"/" /opt/seafile/conf/seahub_settings.py +echo -e "\nFILE_SERVER_ROOT = \"http://$IP:8082\"" >> /opt/seafile/conf/seahub_settings.py +echo -e "CSRF_TRUSTED_ORIGINS = ['http://$IP/']" >> /opt/seafile/conf/seahub_settings.py +msg_ok "Conf files adjusted" + +msg_info "Setting up Seafile" +$STD su - seafile -c "bash /opt/seafile/seafile-server-latest/seafile.sh start" +$STD su - seafile -c "expect </etc/systemd/system/seafile.service +[Unit] +Description=Seafile File-hosting +After=network.target mysql.service memcached.service +Wants=mysql.service memcached.service + +[Service] +Type=forking +User=seafile +Group=seafile +WorkingDirectory=/opt/seafile + +ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start +ExecStartPost=/opt/seafile/seafile-server-latest/seahub.sh start +ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop +ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop + +Restart=on-failure +RestartSec=5s + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable --now -q seafile.service +msg_ok "Created Services" + +msg_info "Creating External Storage script" +cat <<'EOF' >~/external-storage.sh +#!/bin/bash +STORAGE_DIR="/path/to/your/external/storage" + +# Move the seafile-data folder to external storage +mv /opt/seafile/seafile-data $STORAGE_DIR/seafile-data + +# Create a symlink for access +ln -s $STORAGE_DIR/seafile-data /opt/seafile/seafile-data +EOF +chmod +x ~/external-storage.sh +msg_ok "Bash Script for External Storage created" + +msg_info "Creating Domain access script" +cat <<'EOF' >~/domain.sh +#!/bin/bash +DOMAIN=$1 +IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) +DOMAIN_NOSCHEME=$(echo $DOMAIN | sed 's|^https://||') + +#Change the CORS to provided domain +sed -i "s|CSRF_TRUSTED_ORIGINS = ['http://$IP:8000/']|CSRF_TRUSTED_ORIGINS = ['$DOMAIN']|g" /opt/seafile/conf/seahub_settings.py +sed -i "s|FILE_SERVER_ROOT = \"http://$IP:8082\"|FILE_SERVER_ROOT = \"$DOMAIN/seafhttp\"|g" /opt/seafile/conf/seahub_settings.py +EOF +chmod +x ~/domain.sh +msg_ok "Bash Script for Domain access created" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf /home/seafile/seafile*.tar.gz +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" \ No newline at end of file diff --git a/json/seafile.json b/json/seafile.json new file mode 100644 index 000000000..a603ac350 --- /dev/null +++ b/json/seafile.json @@ -0,0 +1,47 @@ +{ + "name": "Seafile", + "slug": "Seafile", + "categories": [ + 12 + ], + "date_created": "2025-02-25", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8000, + "documentation": "https://manual.seafile.com/11.0/deploy", + "website": "https://seafile.com", + "logo": "https://manual.seafile.com/11.0/media/seafile-transparent-1024.png", + "description": "Seafile is an open source file sync and share platform, focusing on reliability and performance.", + "install_methods": [ + { + "type": "default", + "script": "ct/seafile.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 20, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Application credentials: `cat ~/seafile.creds`", + "type": "info" + }, + { + "text": "Change STORAGE_DIR value in `external-storage.sh` and run `bash external-storage.sh` to use your defined storage instead of internal.", + "type": "info" + }, + { + "text": "Execute `~/domain.sh ` to enable access to Seafile via your domain", + "type": "info" + } + ] +} \ No newline at end of file From c737473f8b07ba30f7be20ef431e66409e0b734c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:21:22 +0100 Subject: [PATCH 004/258] Update date in json (#2992) --- json/seafile.json | 90 +++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/json/seafile.json b/json/seafile.json index a603ac350..ea7336a60 100644 --- a/json/seafile.json +++ b/json/seafile.json @@ -1,47 +1,47 @@ { - "name": "Seafile", - "slug": "Seafile", - "categories": [ - 12 - ], - "date_created": "2025-02-25", - "type": "ct", - "updateable": false, - "privileged": false, - "interface_port": 8000, - "documentation": "https://manual.seafile.com/11.0/deploy", - "website": "https://seafile.com", - "logo": "https://manual.seafile.com/11.0/media/seafile-transparent-1024.png", - "description": "Seafile is an open source file sync and share platform, focusing on reliability and performance.", - "install_methods": [ - { - "type": "default", - "script": "ct/seafile.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 20, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null + "name": "Seafile", + "slug": "Seafile", + "categories": [ + 12 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8000, + "documentation": "https://manual.seafile.com/11.0/deploy", + "website": "https://seafile.com", + "logo": "https://manual.seafile.com/11.0/media/seafile-transparent-1024.png", + "description": "Seafile is an open source file sync and share platform, focusing on reliability and performance.", + "install_methods": [ + { + "type": "default", + "script": "ct/seafile.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 20, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Application credentials: `cat ~/seafile.creds`", + "type": "info" }, - "notes": [ - { - "text": "Application credentials: `cat ~/seafile.creds`", - "type": "info" - }, - { - "text": "Change STORAGE_DIR value in `external-storage.sh` and run `bash external-storage.sh` to use your defined storage instead of internal.", - "type": "info" - }, - { - "text": "Execute `~/domain.sh ` to enable access to Seafile via your domain", - "type": "info" - } - ] -} \ No newline at end of file + { + "text": "Change STORAGE_DIR value in `external-storage.sh` and run `bash external-storage.sh` to use your defined storage instead of internal.", + "type": "info" + }, + { + "text": "Execute `~/domain.sh ` to enable access to Seafile via your domain", + "type": "info" + } + ] +} From de001f50227f8e8470a99202a6abdea356cfc0f6 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:21:26 +0100 Subject: [PATCH 005/258] Update .app files (#2994) --- ct/headers/seafile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/seafile diff --git a/ct/headers/seafile b/ct/headers/seafile new file mode 100644 index 000000000..5095b635a --- /dev/null +++ b/ct/headers/seafile @@ -0,0 +1,6 @@ + _____ _____ __ + / ___/___ ____ _/ __(_) /__ + \__ \/ _ \/ __ `/ /_/ / / _ \ + ___/ / __/ /_/ / __/ / / __/ +/____/\___/\__,_/_/ /_/_/\___/ + From 35efc4ed8a18260092fb5858f69fc031e9c5bb7a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:21:39 +0100 Subject: [PATCH 006/258] Update CHANGELOG.md (#2993) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a64a39aa..ec0a9f7b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ All LXC instances created using this repository come pre-installed with Midnight ## 2025-03-11 +### πŸ†• New Scripts + + - Seafile [@dave-yap](https://github.com/dave-yap) ([#2987](https://github.com/community-scripts/ProxmoxVE/pull/2987)) + ### 🧰 Maintenance - #### πŸ“‚ Github From 9953d8d662daa2e48b148548ebaf24cf628341f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:35:16 +0100 Subject: [PATCH 007/258] fix update function (#2996) --- ct/teddycloud.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/teddycloud.sh b/ct/teddycloud.sh index 2d427e80e..1e68196dc 100644 --- a/ct/teddycloud.sh +++ b/ct/teddycloud.sh @@ -32,10 +32,10 @@ function update_script() { msg_info "Updating ${APP} to v${VERSION}" cd /opt - mv /opt/teddycloud /opt_teddycloud_bak + mv /opt/teddycloud /opt/teddycloud_bak wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip" unzip -q -d /opt/teddycloud teddycloud.amd64.release_v${VERSION}.zip - cp -R /opt_teddycloud_bak/certs /opt_teddycloud_bak/config /opt_teddycloud_bak/data /opt/teddycloud + cp -R /opt/teddycloud_bak/certs /opt/teddycloud_bak/config /opt/teddycloud_bak/data /opt/teddycloud echo "${VERSION}" >"/opt/${APP}_version.txt" msg_ok "Updated ${APP} to v${VERSION}" From 57350a832444ce7b8830bb2d3d9e3b4784f432d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:35:45 +0100 Subject: [PATCH 008/258] fix updateable (#2991) --- json/jellyseerr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/jellyseerr.json b/json/jellyseerr.json index fc739df86..ba69e327c 100644 --- a/json/jellyseerr.json +++ b/json/jellyseerr.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 5055, "documentation": null, From 96c943a7de55af36fedd7fcc376d498d48ea45af Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 10:45:26 +0100 Subject: [PATCH 009/258] Update CHANGELOG.md (#2995) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec0a9f7b7..8d404595f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,14 @@ All LXC instances created using this repository come pre-installed with Midnight - Seafile [@dave-yap](https://github.com/dave-yap) ([#2987](https://github.com/community-scripts/ProxmoxVE/pull/2987)) +### πŸš€ Updated Scripts + + - Jellyseer not labeled as updateable even though update function exists [@tremor021](https://github.com/tremor021) ([#2991](https://github.com/community-scripts/ProxmoxVE/pull/2991)) + + - #### 🐞 Bug Fixes + + - Teddycloud: fix update function [@tremor021](https://github.com/tremor021) ([#2996](https://github.com/community-scripts/ProxmoxVE/pull/2996)) + ### 🧰 Maintenance - #### πŸ“‚ Github From a0f7643838af5b097418b5f87585ad0e61aa5cda Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 11 Mar 2025 11:08:24 +0100 Subject: [PATCH 010/258] Fix Website - Show correct wget path for alpine (#2998) --- json/alpine-it-tools.json | 2 +- json/alpine.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/json/alpine-it-tools.json b/json/alpine-it-tools.json index ff0587873..7919a585f 100644 --- a/json/alpine-it-tools.json +++ b/json/alpine-it-tools.json @@ -15,7 +15,7 @@ "description": "IT-Tools is a web-based suite of utilities designed to streamline and simplify various IT tasks, providing tools for developers and system administrators to manage their workflows efficiently.", "install_methods": [ { - "type": "default", + "type": "alpine", "script": "ct/alpine-it-tools.sh", "resources": { "cpu": 1, diff --git a/json/alpine.json b/json/alpine.json index 8e68e0a60..ad6e4e110 100644 --- a/json/alpine.json +++ b/json/alpine.json @@ -15,7 +15,7 @@ "description": "A security-oriented, lightweight Linux distribution based on musl and BusyBox.\r\nBy default, the root password is set to alpine. If you choose to use advanced settings, you will need to define a password, autologin is currently unavailable.", "install_methods": [ { - "type": "default", + "type": "alpine", "script": "ct/alpine.sh", "resources": { "cpu": 1, From 293a220719fccbcab6cdd4e1fd82f05ec26af31d Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:01:10 +0100 Subject: [PATCH 011/258] Plant-it (#3000) * Plant-it * update source * fix header * Update json/plant-it.json Co-authored-by: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> * Update plant-it.sh --------- Co-authored-by: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> --- ct/plant-it.sh | 64 ++++++++++++++++ install/plant-it-install.sh | 145 ++++++++++++++++++++++++++++++++++++ json/plant-it.json | 43 +++++++++++ 3 files changed, 252 insertions(+) create mode 100644 ct/plant-it.sh create mode 100644 install/plant-it-install.sh create mode 100644 json/plant-it.json diff --git a/ct/plant-it.sh b/ct/plant-it.sh new file mode 100644 index 000000000..c95e12ba9 --- /dev/null +++ b/ct/plant-it.sh @@ -0,0 +1,64 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plant-it.org/ + +APP="Plant-it" +var_tags="plants;garden" +var_cpu="2" +var_ram="2048" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/plant-it ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -s https://api.github.com/repos/MDeLuise/plant-it/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop plant-it + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + wget -q -O /opt/plant-it/server.jar "https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/server.jar" + cd /opt/plant-it/frontend + wget -q https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/client.tar.gz + tar -xzf client.tar.gz + rm -f client.tar.gz + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start plant-it + msg_ok "Started $APP" + 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}:3000${CL}" diff --git a/install/plant-it-install.sh b/install/plant-it-install.sh new file mode 100644 index 000000000..9083093c8 --- /dev/null +++ b/install/plant-it-install.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plant-it.org/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + mc \ + sudo \ + gnupg2 \ + mariadb-server \ + redis \ + nginx +msg_ok "Installed Dependencies" + +msg_info "Setting up Adoptium Repository" +mkdir -p /etc/apt/keyrings +wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg +echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" >/etc/apt/sources.list.d/adoptium.list +$STD apt-get update +msg_ok "Set up Adoptium Repository" + +msg_info "Installing Temurin JDK 21 (LTS)" +$STD apt-get install -y temurin-21-jdk +msg_ok "Setup Temurin JDK 21 (LTS)" + +msg_info "Setting up MariaDB" +JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=') +DB_NAME=plantit +DB_USER=plantit_usr +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 "Plant-it Credentials" + echo "Plant-it Database User: $DB_USER" + echo "Plant-it Database Password: $DB_PASS" + echo "Plant-it Database Name: $DB_NAME" +} >>~/plant-it.creds +msg_ok "Set up MariaDB" + +msg_info "Setup Plant-it" +RELEASE=$(curl -s https://api.github.com/repos/MDeLuise/plant-it/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') +wget -q https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/server.jar +mkdir -p /opt/plant-it/{backend,frontend} +mkdir -p /opt/plant-it-data +mv -f server.jar /opt/plant-it/backend/server.jar + +cat </opt/plant-it/backend/server.env +MYSQL_HOST=localhost +MYSQL_PORT=3306 +MYSQL_USERNAME=$DB_USER +MYSQL_PSW=$DB_PASS +MYSQL_DATABASE=$DB_NAME +MYSQL_ROOT_PASSWORD=$DB_PASS + +JWT_SECRET=$JWT_SECRET +JWT_EXP=1 + +USERS_LIMIT=-1 +UPLOAD_DIR=/opt/plant-it-data +API_PORT=8080 +FLORACODEX_KEY= +LOG_LEVEL=DEBUG +ALLOWED_ORIGINS=* + +CACHE_TYPE=redis +CACHE_TTL=86400 +CACHE_HOST=localhost +CACHE_PORT=6379 +EOF + +cd /opt/plant-it/frontend +wget -q https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/client.tar.gz +tar -xzf client.tar.gz +echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" +msg_ok "Setup Plant-it" + +msg_info "Creating Service" +cat </etc/systemd/system/plant-it.service +[Unit] +Description=Plant-it Backend Service +After=syslog.target network.target + +[Service] +Type=simple +WorkingDirectory=/opt/plant-it/backend +EnvironmentFile=/opt/plant-it/backend/server.env +ExecStart=/usr/bin/java -jar -Xmx2g server.jar +TimeoutStopSec=20 +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable --now -q plant-it + +cat </etc/nginx/nginx.conf +events { + worker_connections 1024; +} + +http { + server { + listen 3000; + server_name localhost; + + root /opt/plant-it/frontend; + index index.html; + + location / { + try_files \$uri \$uri/ /index.html; + } + + error_page 404 /404.html; + location = /404.html { + internal; + } + } +} +EOF +systemctl restart nginx +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf /opt/plant-it/frontend/client.tar.gz +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/json/plant-it.json b/json/plant-it.json new file mode 100644 index 000000000..41c397bb2 --- /dev/null +++ b/json/plant-it.json @@ -0,0 +1,43 @@ +{ + "name": "Plant-it", + "slug": "plant-it", + "categories": [ + 24 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.plant-it.org/latest/", + "website": "https://plant-it.org/", + "logo": "https://raw.githubusercontent.com/MDeLuise/plant-it/refs/heads/main/images/plant-it-logo.png", + "description": "Plant-it is a self-hosted, open-source app designed to help users manage and track plant care. It allows users to add plants, log activities like watering, fertilizing, and pruning, set reminders, and upload photos for visual tracking. The app includes a database of over 400,000 plant species, offering detailed care information such as optimal growing conditions and maintenance tips.\n\nUsers can organize their plant collection, monitor growth, and share data with others. The app is free to use and works on Android, iOS, and the web.", + "install_methods": [ + { + "type": "default", + "script": "ct/plant-it.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This Script use Adoptium JDK 21 - Sometimes the installation of these takes a while", + "type": "info" + }, + { + "text": "After the initial start, the backend requires approx. 1-2 minutes boot time", + "type": "info" + } + ] +} \ No newline at end of file From 05266b28496e7fa57f9382c14c88f10d54c305f4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:11:49 +0100 Subject: [PATCH 012/258] Update .app files (#3003) Co-authored-by: GitHub Actions --- ct/headers/plant-it | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/plant-it diff --git a/ct/headers/plant-it b/ct/headers/plant-it new file mode 100644 index 000000000..b1008b5ce --- /dev/null +++ b/ct/headers/plant-it @@ -0,0 +1,6 @@ + ____ __ __ _ __ + / __ \/ /___ _____ / /_ (_) /_ + / /_/ / / __ `/ __ \/ __/_____/ / __/ + / ____/ / /_/ / / / / /_/_____/ / /_ +/_/ /_/\__,_/_/ /_/\__/ /_/\__/ + From 48c20bbd6d3f54c8b7cc2e49bb28d1a3b166bc58 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:26:00 +0100 Subject: [PATCH 013/258] Update CHANGELOG.md (#2999) --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d404595f..e1e2e244d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸ†• New Scripts - - Seafile [@dave-yap](https://github.com/dave-yap) ([#2987](https://github.com/community-scripts/ProxmoxVE/pull/2987)) + - Plant-it [@MickLesk](https://github.com/MickLesk) ([#3000](https://github.com/community-scripts/ProxmoxVE/pull/3000)) +- Seafile [@dave-yap](https://github.com/dave-yap) ([#2987](https://github.com/community-scripts/ProxmoxVE/pull/2987)) ### πŸš€ Updated Scripts @@ -34,6 +35,12 @@ All LXC instances created using this repository come pre-installed with Midnight - Additions and amends to the CONTIRBUTOR docs [@tremor021](https://github.com/tremor021) ([#2983](https://github.com/community-scripts/ProxmoxVE/pull/2983)) +### 🌐 Website + + - #### πŸ“ Script Information + + - Fix Website - Show correct wget path for alpine [@MickLesk](https://github.com/MickLesk) ([#2998](https://github.com/community-scripts/ProxmoxVE/pull/2998)) + ## 2025-03-10 ### πŸ†• New Scripts From 5ce76f0a3a8a6f46fc1f72d55a9c22bad7269902 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:27:05 +0100 Subject: [PATCH 014/258] Cleanup Old Files (#3004) --- misc/.app-headers | 2112 ---------------------------------- misc/figlet.tar.xz | Bin 168152 -> 0 bytes misc/images/2025approved.png | Bin 414809 -> 0 bytes misc/images/heimdall.png | Bin 61187 -> 0 bytes misc/images/nocodb.png | Bin 84837 -> 0 bytes misc/images/photoprism.png | Bin 63270 -> 0 bytes misc/images/pimox.png | Bin 23460 -> 0 bytes 7 files changed, 2112 deletions(-) delete mode 100644 misc/.app-headers delete mode 100644 misc/figlet.tar.xz delete mode 100644 misc/images/2025approved.png delete mode 100644 misc/images/heimdall.png delete mode 100644 misc/images/nocodb.png delete mode 100644 misc/images/photoprism.png delete mode 100644 misc/images/pimox.png diff --git a/misc/.app-headers b/misc/.app-headers deleted file mode 100644 index ebdb0ed60..000000000 --- a/misc/.app-headers +++ /dev/null @@ -1,2112 +0,0 @@ -### Generated on 01-24-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 - ___ __ _ _ __ __ __ - / | / /___ (_)___ ___ / | / /__ _ __/ /______/ /___ __ __ - / /| | / / __ \/ / __ \/ _ \______/ |/ / _ \| |/_/ __/ ___/ / __ \/ / / / - / ___ |/ / /_/ / / / / / __/_____/ /| / __/> < -/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_| - - -### aria2.sh -APP=Aria2 - ___ _ ___ - / | _____(_)___ |__ \ - / /| | / ___/ / __ `/_/ / - / ___ |/ / / / /_/ / __/ -/_/ |_/_/ /_/\__,_/____/ - - -### audiobookshelf.sh -APP=audiobookshelf - ___ __ __ __ ______ - ____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/ - / __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_ -/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/ -\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/ - - -### authentik.sh -APP=Authentik - ___ __ __ __ _ __ - / | __ __/ /_/ /_ ___ ____ / /_(_) /__ - / /| |/ / / / __/ __ \/ _ \/ __ \/ __/ / //_/ - / ___ / /_/ / /_/ / / / __/ / / / /_/ / ,< -/_/ |_\__,_/\__/_/ /_/\___/_/ /_/\__/_/_/|_| - - -### autobrr.sh -APP=Autobrr - ___ __ __ - / | __ __/ /_____ / /_ __________ - / /| |/ / / / __/ __ \/ __ \/ ___/ ___/ - / ___ / /_/ / /_/ /_/ / /_/ / / / / -/_/ |_\__,_/\__/\____/_.___/_/ /_/ - - -### bazarr.sh -APP=Bazarr - ____ - / __ )____ _____ ____ ___________ - / __ / __ `/_ / / __ `/ ___/ ___/ - / /_/ / /_/ / / /_/ /_/ / / / / -/_____/\__,_/ /___/\__,_/_/ /_/ - - -### beszel.sh -APP=Beszel - ____ __ - / __ )___ _________ ___ / / - / __ / _ \/ ___/_ / / _ \/ / - / /_/ / __(__ ) / /_/ __/ / -/_____/\___/____/ /___/\___/_/ - - -### 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 - ____ __ - / __ \____ _____/ /______ ____ - / / / / __ \/ ___/ //_/ __ `/ _ \ - / /_/ / /_/ / /__/ ,< / /_/ / __/ -/_____/\____/\___/_/|_|\__, /\___/ - /____/ - -### dotnetaspwebapi.sh -APP=Dotnet ASP Web API - ____ __ __ ___ _____ ____ _ __ __ - / __ \____ / /_____ ___ / /_ / | / ___// __ \ | | / /__ / /_ - / / / / __ \/ __/ __ \/ _ \/ __/ / /| | \__ \/ /_/ / | | /| / / _ \/ __ \ - / /_/ / /_/ / /_/ / / / __/ /_ / ___ |___/ / ____/ | |/ |/ / __/ /_/ / -/_____/\____/\__/_/ /_/\___/\__/ /_/ |_/____/_/ |__/|__/\___/_.___/ - - ___ ____ ____ - / | / __ \/ _/ - / /| | / /_/ // / - / ___ |/ ____// / -/_/ |_/_/ /___/ - - -### 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 - ______ _ __ - / ____/____(_)___ _____ _/ /____ - / /_ / ___/ / __ `/ __ `/ __/ _ \ - / __/ / / / / /_/ / /_/ / /_/ __/ -/_/ /_/ /_/\__, /\__,_/\__/\___/ - /____/ - -### ghost.sh -APP=Ghost - ________ __ - / ____/ /_ ____ _____/ /_ - / / __/ __ \/ __ \/ ___/ __/ -/ /_/ / / / / /_/ (__ ) /_ -\____/_/ /_/\____/____/\__/ - - -### 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 - ____ ______ ____ ____ - / _/___ / __/ /_ ___ __/ __ \/ __ ) - / // __ \/ /_/ / / / / |/_/ / / / __ | - _/ // / / / __/ / /_/ /> < -/_/ |_/\___/\__/_____/\____/_/|_| - - -### nextcloudpi.sh -APP=NextCloudPi - _ __ __ ________ ______ _ - / | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_) - / |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / / - / /| / __/> < / ____/ / / /_/ /> < -/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ /_/\__, /_/|_| - /_/ /____/ - -### 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 - ____ __ __ ____ _ - / __ \/ /_ ____ / /_____ / __ \_____(_)________ ___ - / /_/ / __ \/ __ \/ __/ __ \/ /_/ / ___/ / ___/ __ `__ \ - / ____/ / / / /_/ / /_/ /_/ / ____/ / / (__ ) / / / / / -/_/ /_/ /_/\____/\__/\____/_/ /_/ /_/____/_/ /_/ /_/ - - -### phpipam.sh -APP=phpIPAM - __ ________ ___ __ ___ - ____ / /_ ____ / _/ __ \/ | / |/ / - / __ \/ __ \/ __ \ / // /_/ / /| | / /|_/ / - / /_/ / / / / /_/ // // ____/ ___ |/ / / / - / .___/_/ /_/ .___/___/_/ /_/ |_/_/ /_/ -/_/ /_/ - -### 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 - ____ __ _____ ____ __ - / __ \____ _____/ /_____ _________ / ___// __ \ / / - / /_/ / __ \/ ___/ __/ __ `/ ___/ _ \\__ \/ / / / / / - / ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___ -/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/ - /____/ - -### projectsend.sh -APP=ProjectSend - ____ _ __ _____ __ - / __ \_________ (_)__ _____/ /_/ ___/___ ____ ____/ / - / /_/ / ___/ __ \ / / _ \/ ___/ __/\__ \/ _ \/ __ \/ __ / - / ____/ / / /_/ / / / __/ /__/ /_ ___/ / __/ / / / /_/ / -/_/ /_/ \____/_/ /\___/\___/\__//____/\___/_/ /_/\__,_/ - /___/ - -### 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 - _____ -/__ / ____ _________ __ ____ __ - / / / __ \/ ___/ __ `/ |/_/ / / / - / /__/ /_/ / / / /_/ /> vv0Ng5?tI$b@VijB9y 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

~e-Y#j;6-j>__RZO3%WnU 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�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

j$rwLj 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

c8KL)e&>&lXKdeVf8MP4cS za0Cm$eTiU(nQsQaYCuXrQThy&(~w=3@Vy$R_Oo0N3~Ax5;9OsEN{k7ErV}@3(Ur1C zXb)7nRzJDdPwK{$Qb#$#aU=W*f^~KI#+`);n{v8k!Fr69B%BB)h<0EHRSt z^g7Sc3JQcZjzoGYO+>G#51N?()tHIg>T-@OL~}9VC`$+_dQlr=B>fm{)UYh;00u}@!(ILSMNv@O@Had`pcr+=ap?w-;&?06a$G}E* zl#Ee;KWjD0)=JITAmR)*N3Z)hqArC$e>*snn_x_V;4{pO--ub8K);FNrYv8s$t7RGKKe)3OC7(6#&vK1f zwNz;a#EKy?4zxvhDn7wn78iNhvtM0s<#XbhDh78I0GMDkGNKG>W@U4orKl}g7XN(h zGbkFe>bH@b>{w>xtes-jizl1-*y+dP3IBF0zP8-MRI`Qob_v-}Hw&RwtO=jo9FKk(dpFe&R{&>e8eB$6DzPr-LZaO=1J*xy(ws-UUXx8+aE%SK! zF&ps8ZM*Q%gUi7#`ugRb!+Vt757P3C+16(#gP&-dxs5YV%*@iWpU>M`@R$GozpYsq z+hTq=5%b`oMJz4s!n*zdi| zc$J+iwfj7;yk1^+AmUj7WXYqXvr}O-XV4i{vDd>Oh@o75{0K`E*Y_E$hHy;zf zt6H|n0G@kt#zTS^-cRpE!PaCl7yd!+atyY*`nqKQHNM;1js=@}Ekhh1t)R85p7K0> zinG#GbsDMZ;zXT8f(d4-#lz%n$n7R2l~PV>%o}X$P6L?;vlVc_PmyyM>xcnL@_|k5 zKyGBbNwO%8W6hphikkAqbE8)G1~YNGB1TYgZ7J$Kk=Ey8vk0?9XKp_Xhpz-4k-2E$ z^VLxf$-Zkt2vR$qmr>G|sm?9+5lspYJ=&}gUUD(IZL<^+3JGTECWShr<_IWyJ(Us| z{7E)u2X8TZxCf*bOu2cnii1CG8Ry?s|8A;Sc6|`d-sB}tME*h4lEiquBAyMWc zxsWW&ETRpo@glQ}FsSYpeqMk?0ey8fl@kcH7DMRg7Ol!A7t;ml*vTmqAKyHQ&mLaJ zH~S-OX*O_SyMb@^fln;1h*`RBZW8Y}u!Q}MwgWt$=Y9|WW78y#ZPf9Q9f#1Xu@$=| z8dVyoX3Ij|&{wfrX7|zxzO=E8UJZEW!2!^jMw2$oVbZ2;CpxC=EfRHG+1+xlV*qdl zY8O+tPy0^#zVXL0Z_|caQ_#rCyb2aE*>K;!y)wo+e3&B56j|Oo3RO9>I=%O9-a=5m z|G)xg{+H26fLCwua%;fBkppZo3050?hynvW1prh$3VAF;Mhr zzyOIMC43af2*98+Mm%o;2K?yPwNE!|18kWe;;P3#2J`FI7j$;6+k6rvB#*HJnRREt zO%{|_y70D%U_}O%$7ehLbYLuXQr0gRC|5y4{ypQ&Sj|6@+|;JA{8f~&<-Ot3JJ%Z% z8m)i`S9%Vjq-(8+J*Bf+XYj-qiu z*3|i&mF3|oFimI1qAZ~)o8J4!fLV=m{oD9u4)6y|{3Z?AgF za}5b{@?&z8i4Two7f}n#BZ;l3mm#|bOM|~`w^k4!KiAFnPAgwG*s6>#IeAqWzG{~VXA)d^kS5@jN z>z4$*itCt*m!*h)A8o## z1C!c8`DPtIHlSSKx~|G-jRu-L*VIK+26|ci<80Rhz|!n0N=bQ*!k|j`k`D(Lcucc2 z=*a-ZV{c>oo+aF|cM;3nl-MP~jjPv-iFvex9t6Wcz%Y~-1FvBM1_6bvIg>EEFMvVD zH4QxLnJ>Zv&o~t`Q_DF2)Fvjox8c{{`&U>RtV5S{>}Z5T%U$eW?4hr*LEh?k6`D0_ zZP-p*L*GqwyzqxDnx@^Tk1+qZ}&TSA-70MxM-qy3tnLpuFD4Dp`zv-q3EWxQo|h>6K*bXu)Q zU>NDcWmZ5dgk0HwKVm7;nX!dq5$1Fe2~Z}0Q6K#w%bG6jxnVe77Y}|hM1`-YUAe3=yY26_P^bX-iW|ujJwo%Hr4$z!0O^*bQcd` zW@QDhx$+`h`Q*o-@zBR&VfF; z2sxg5tr1DwBf}uTFv3+=JO*>~>q^!A*ajTZCNc+=1dW%Cdpqx~+X>SZH-=Tk+y(#6 znuny{lcjKGT^b^dJ)0FaBLR#P3qRf52gNceG4p%}wf`$(`!x=n-U~_3bH5dPD(yna zmM6=g&j^OL@bNGuQUNtlx{rg^V-=b`CYg@G<5t*AT9fV1>%rHJ0ka77YuT+TU{Jy> zt7wBPF=o{cId#UAo&dztn#~b^9D^CV2UWn3XibL{n?MG?lHTLyosL+!K9X`$KpL|E z4O)nsoAw>n@N3S_C725niWsJp;t=1ovYWv_FI!lIeMNDlP$pVus+)SU8DZ;OxD*xw zNiW7kz^0(0)RDHC;rCE3G%sG!&9T@`EBja^u!RS~?hFOEeDiohc z%oyxNc$1SMDV)EQEk*r_43Ut>PCCf$~bZ_FtakejPkXQK~x5DW;tB8 za9At8Cu~BKU1B#0zk>oFt^o%S10}U)Ce@I%cOBTX(8czB%j%UEU|8WXMvGUE1E&ZW zl3}1iyC+K2fT8EPBck@VYv{Wt+h7CO9N3X+KXPt`KsU@6yQUe?7yYT71 z`36RfdGv-oEO%GXo*>gw!>}`p$;nA9ul6xD*+Q+qjMddeDaQ9Ml9HqwYEuAVZmN#v zfalRbug~s}9$M{2Q6HU|nT|Oiq;DJYoRDj0ucx5VnP@5F>vSd*aJi9BaI|@ERqLnK zYAD#W+f8NU46>bx4pzE7up@|TW@WW2hKZle``d2Sv9#Ppv))$shu=fNZP!_Pv#HPI z0nlwznNPi;fkc^gv4+i!MP;KZ5FmV9N-1R2|RgbJ>Gg~7yhjcOiy*tW;WYw zU}~x@aN6pyl*jK`<+8!E_5+uogSSks;NWBf>(@<7T+E9|7LUi_pff^u&_$X^>~ zhm6tOiy8~FkMujS36#y$8dzTL>Rx!@TOHFgQ|PX8;GVTWnms~mX?2Iy6!>{vJCkia zM@)n`vVOq()1)y}4ZW4FSRmRob5m?}+E`p(665%pf8C2OfBUXToZV6O^hcb5Q)g?K zo|-@-#tm<1ZNY|m4W~W)!RX)rEG$lJ#Ga{*_~f7eWdRs8fmPi`c6-!>%3v6{HnK~? z8V2eYJPum`RbpeI%_75fKr_S8LLXb^M!5Rw%Vpdo(52@ziiK&lAFL-!u*o812`%>} zvPRZ4B!I|$IjoBdKoMovB6&Mff0Te1Lg`Kb03ZNKL_t&{%hCxB4Dm8jJ9aQxbCT>e zt>eiu1Q%B%uoljT`*FsIN+~2uU)=vJ94{cHK&Svle0x7vQO5-422s6xJPjP@?3bIlikVh*125$ ziZ0*mswLj2)xwXxTYp2u(Z5f zW;3~XD+piASs1OfWc*XngvgJ99uG0sBA6DQmrErcckSMD56*Fkf`(Mt850InqR@v} zSRIOCpa+APg;fUHffxpX0*bNvZm(oXg5pP;HkoOV-X*@@fMJb>VNFRwU{{j?TX^9M ze+nm@a117~h|{)?aNMRoT9e0O*qlLUdeS4wTN7y2Nn<;~(1WJUo))@2vtD`5VaJtg zLPDw$0h)my*&6{z>1LeeNrb7+q5!%4iMm(~%-l#cM3Z2R4{z>k=_sn)GSt+nYqA5t z&rfNwUK0@HAevYrg+NQsisd`8`S3n))RTp*+#uXmn8gc20sdZqP<|gOJ_;Z-8n#TA z6Dkdu*s?Vo3CtW=Si=5;hjHN0k}_+qm#N7%=4PhC8-&-pg)RSlD>e>mIC#~?65#DQ zuz&}B=pQh#u#7K1?{V0$bqhAGTQ87hO@&*kxo#F$SFwNpVI11A8xQ-_zt*++;k7TyYJd!ON^o}fNTLwqm6l-Wwp zQ?U3f%$&*?<*hKhSu=6a8(8M$1KFsf-i$6IE()%5X5;io=#!0XsDwu0aDP?yepunu z*HImV$#vK_u@0a4i@(Bf+ij@V4HlSG5Zrb9WEjHnk)=TmpW<_vqDKP;t_62&d6tBp zi7}%fCuVI7uyuBbCqDTqG^eJV8E5hrW1&;~mBE|;PJf%+Z(ZtiB0gr%p8~`XSTm?O zmXDVpGFfwnKnWm}M9GD-bj~d}>NL9xwn3i})016F4X>T-T!`Af0=slHE}^)~j^!!0 z<0c@fYKqADCC}|+E#s!a&A6CRF@X9qvfKd#GFYc3BlBQiLnn*;9gn4$Vw?vNWHZjt*{0T_6xsvgpnV3R1_Lq`{>mg26ZS2q{u5*o&yB zrpJU9o)ovPIl5!SH+*V(3f-U{y~qM&+E7#1z18ZVySk#ySXpy`p<*Eg*lJ2M5_D~3 zmOMs3xFOi%?`eFKBex3$vz5jxsA0#xWvp_;>h-ZgHlYd_SWE5FxG4bxJtjO$A_0Rl zxNv%`db1xz^k~{0Xw|3ilRx*)-Ql zxv7PdY3Pzw-;VDl*mq$eEyYXFrO>N-w)F>D{LJlz4PJkMrudf66T1Uk^@~>AD1zv{E|P1l83-6bN*n5Ea`?ePY#^{qFsVWv464zEG7DQq)X%HRT9Ev*>mc#_rwfV@nr>5P@b3fezVCw zwggPkND%C{3<)a$BV(=iUB?=A1_wKA5M#EBz|Y+pQDTX41PN$U`E!8 zcJk*rOfeJw+LNC0<8fIm^N~oXa^6AS#L57nTYfqw0OtE@p{Dgltt5{P1~BB8XnEDSiphb z)Y=l_tgNYdsEo5V9s_R>sVfU+lFB<${NzLR!SFq5WeM$z1H6%EzJ`mHL0a@;=to6X z#e8)I8zDtoy1G=r@z`y2X>rWSd~AD6w?+ojc3T^$9)MBUUB}a!LLlBRPY{VC;c*2O zmYNbW6bx2X3N3|~Tq>lKduU+Kp&nLy%tlv5hpW9SIwLfOmwykyz%kbZ49s99{*l!J zS&w@cJ$lxO>-1CYIlSWKuf$BpBedOhVN)w+T@9fJ2Z2W2RJ=k%PDAx>f?+Xm#{Z5^ z;)2QyTpWSLHODNUjlyqU4`^A<^m7rt+WC5C3ULhji~uUCV}>1?_95Nv*j!yF^;VVt z_3wimHb^f5zW**!Zbh{&uvcSitk<+#pAA6cY~q+1+@f0{z=E>7=suFoundE^X_;+P z0FR+ey;Ex~uNK9|tiVf@6VPc}KXHXk`HPJ}nSg;kkUJ2HV<}~G7 z(T1I@TbThDXe&Nfdr+lakac=}ZcL#yD6#rJUKk!L0RV$bB8U+q#^9;@#5y@QakEL@ z+v=LE%HeIfaofSRfqG{e_4z6EJ8gX7lb^=otv8`FJ3zwYC0O8bO56->8-1L#4!G)?E6|#rajSMENg^wfLg^AHl%_!hFq0FL_KHxu zHz|LEI1A{xSM=8SE(G@$8BmrFOsAWTDHFsfd&hI5bEvox>nYN{9RkJB7|C)!?E4AE zcnu@em$5N^;$)X$$j^N4-A(|b3=zp%wW}e$YuvtBvV_(vRePMv&J&-bXIWHP3O)6a z+?k0p^Q}RWU9zJAj-xq2cy!NE0JV(Q)bi&Lo zLaUJjrxFFa9^!2%pT(qJN!b8r|MHkx?7-u%?%t5&Fq6jFpOj8G4a50*@l7 z2Myz6GhLo;TV@KZ`VMpK!WDE(HJb)iIin(K;l+0pG(HzG(WP&oUAeq*r$Dl;Hbu{% zud)L|a@?bT*OYdq?24N zdYfP-!oz}DrJps|8G}f0Sa!5ASk!EmplQh@<@^r`BNM`nFbvAod!>QCLVaN`%xF>N;lqc}xZ`#_{|leT zr%pQ^-#hmltec<3%`N*FeD?f7BDyf`T}J} z&yqv}hW7MK3>(aSk=Mom*`5n!!b3JQE%}qW_m}~8MX>9O-D8nhhVIRAr-lK?hHE0P zk0bYD1@5TR+kDCUW9pg;j2#^e#l9C^f5~z)Ch2z)$FrPe{Rd0SyynWbAwR2{ z)Edx5mmcqJ(VpsHTxtixUO!qVGvMd6Oy7T78F)XA`e3XLer~JD5_Xvh^IB6!!)u&k zd0tm0rU_*8*fS*2<&w{2mO~8II3YQ^1k;xxnCz!NgBpg?PO<<6m3on4dO@FLc9WTH z7-NKUTG0)`wmdp^6|EzFkQB^i?U)zVpREhy?XAd~^11GZVpH2&^qqTyC6aXUkr$NO zgwlP`+h{!B(IVus#C1A z@nk)!lJpddAijIhLFvIh_YL>_#2!PTT5d zu?cRQ%?E!NA~z2%Vb_J}@VsTrdbqFgeEGRNMuHNzJyHA^V#mx@Ri5fg;m%+yO1s%X zuhB-gNAXox?UdTgsA1^Y4w`=-@!V8Hwdk=na!|28^XP!Vu&pY3%%8BHH-+Q3JVex0{pdGZ10QqJ!QUD}S&7qF{H?~j&V z2G@GMrHg9zhm22%P~-TEO-z89n~hyJB@|Qk>3c>~G@c7LM7OumrL!e=L_kJPc)kXF zKilQZau`6n-pVYoZuUs@Qq*7>IGZ#=PCMO_5fl)U(%Mw297#jmrY10IdIFU81A<-( zWtSGQxUdh80Cqr$zu$cmu35MXui0`Yme*~>?BoC?Q5-?EMhj^YF-62}i+4#PU zSW>AEC3xfoAyeksvCo}b%E}5$XEktHdMFe3D@As4U!ZtX9yHRtkTJDp#rpu+6PHf8 zC-L7hN$N^9gXQHFca!OTq`O<_QI^2xr#ZyRfI6fh8vMN85Umq}b-UU!usU#hJ-FWQ|C05TzAMVVy#B>r87;&* zcWJ;pGpEvD;^V7=7(Q2A|7%|7jNe(jORe5ltq)5UEr5E6?2{Sb`epFt=cX?Q*N2^f z`Mb#Cdjm0H?&u5pKO7}xZ=Y@Rl_cBG2TN^Hk|;b=vQwwL?#@XphSVb#ZOsWFsxgMI z&2zJ9p;;G;O3Bv5_0-ur_EPxEHR4d}c$wu4wd%+FO=CD3*RK7s>%=hVVi6f8g=Pk} zsDns=r;`i?X+&dfFySDm4=lt5;XXO+kMJB+0c85Y8|t=7dMl!xD8-HR>LAQGBuBxcRj^ z9fOaUOlD#@>Pu0pvM)nYR=%EA@0RU3uH(7qSevts&6V-=o={M)v0i6)M^Q)NR4MA7 zL7mEbP9+Q$$E;B-24%*9raaT5I8R=7({!OV>*tA0K!wEHiy>Q=%Gt zX?0nfhU#7_RrOHow9%PgFI#A42~?}gn2GgN0foLyn<#da%j1A02~Thw$cN!x07FIe z=m4&57z9K7NG9GaX>bHF1Fr_er~@Es$I)M}Yb8ps?6c;=aqDZ81X8HPcH_uCUB$9pwFIW;BqxUYZ|foKXVNnuhD60&O}D3+RlXgE5G9Gj;d{?VaT-Z=j*= z8G2?*S>DoCVgOfYTH^N-Wkx$`m>UVCg&0lXFP|69f@z2)O4?RgUYOPhKgF@jsg*2Z zdbz|ps6t595@%IvS2YBeQ6G-=%6gW$51m;Xg+%=^xph!SQ4Lh|C zN2_LgxE=?5wwjop7-7S@NzBboW8=mR*sy*BI+IiAOwFJ%F^M6+x6u@9#Vv}@EbG%L zW~7FJpj~3#G;v~EWlXC~z@Yu}ZUBQR>zY8z8OOA6#SNJ9|*J0V( zu3$|dwYsWKma2%mWbM57+Ev!R2xVfGiDg;h$OKUOssOhMcJjDfZYXsW`gwpFgQM}8 z4K6|ZJIri27U-VoUJ?wOeaK@p%boL!BF0wA6}q+wydx`9pbm;k0KWJWF*$9fgGore zL3WlT2vQ4Zon2Mzt}5q8iE>zGr(s`eHFRBKU&?Ng+H;`cxVp1-1yfM|h@aVG-R!pi-o@4uttf z;6`*_7)xX}8~xMr@>T|2inv%lutTM9Y$7!aMN0QC0U&;Vx-RC(?zn+TH41TNuWBG- zni5&B5F(v8uB_n~H|`dIN3lp)=ue_Id^r zeYW(qjqGLmk#$&K=W^CWnt8DNWAP`&Zi%49(5&__L2rSe=T=u&F)=aWvIa8+T7CEX zSXo_F3nDk6tgrDpFf-%^$&6h}eC}bBQO znFJUQ6vt>Dbsd9lF9SbCr4rCiG1H%vSTbQvj|KkrGR@(|KQN zKk=d$kA%<|uu?rt>QozAC}pKX2xLb99d{yCoN0}jib|u)>~r-7=wvmwQrG3ZXQmFp zd#Ez4+%#iLvK~BbmrIIR*}jWqu37mCi(=DvMav8yK@VYZ=H`vSya$hy)U7%%(j+7V zfyx&9{=P(G*-}Uxk}X3jsl<&_Fpj#e5Su7YZ{DW5Xu=Xcasoq1$%TQ5cVW?m#yUpE z)@q~(E9T7$Tv+JHYsc&%(Qb+&bI}P!hB(RYV=*i&zzVN*3-M%R6$bK=W!v4M01S?w^Y>Y7cU`8mYhz1i_B%tshvT%A2 z&kL0}bZ^V9gXH=Ayr*`+Oh|lVgyK>`oj}Q@T_2B*F+hl+MCJXl7aG{bHH@z+^$>nG z%W`0JilnrHj6gsseNhC((3yu=Gg~@i99?lv39jNZ!*idnx_W*Z??3A_T=I?Y;&ztD z>P;Jq@&8Gm;fGacq_OUOY-rT*yQdt7C*F7)+APsjY}4tTAb?dO#Nt`gv%}x&cVrzBsZAVCtgiby6*>W+1d)1(>J}@qptdaM_iY0c{#|Sstwtniw7@I>|0L9zX#% zfl0O{X05#tAZqXS^CNL`lml~LE3B1czs_}?<+2QXzP<)f{#k(aSR7&(!pNu?Cty*I zUQZD#gKvuJl~8q=oY_;N)o{Ydd!$`j<-=-ezg$;kJWN)^EQNFt>gI@~veFuw`*!X- z8SL}tW+p1seQXRN`6$XS*1lCcFv3G6%06s=c1MQU1a+jyfG?+smQKvF2zbd)ym&;> zi`!yK^B~`#p0k)RfslAAs2Y2+8+oJ}Gi&)N%FEg>Z-J<~T1^Wx=~mZi%i2=5!0_DF zAFklzMVJq@k#A&z<<1}q&_j@#=t{5>Oo>pIc| zk(6loJA~jN>fLOQY++$xL76{4BaKk1s@a+8SqaCqNC}h%eW6I5XQ<=trw~)+LKi{- zrH6r85iCbP)gi6B-~+eXTfxlKblJD9?vDXFbL-HUS*OiuMCUx|6s%z&S}%r8@fg%f z$&QJ>GBK7U^h|K`3FD@_0}Ry%Otr&Mp<96-5nn8_L2H_}j6awTdg_db2htq_{-e@D zI2-1=*BVFhJGS*6Jg>nsMl&lJ{$_K4F zDtHk#&@9jAB`&?SeSw$PdJ zrQult#A5B}I|5|-GYtBi802?mrdQg+OIuO^&A8s#A}c0_?~m+JE8RhsObhj2eBPSv z7TV3GX2c1jre@>W9?6Job#=u-r!cg0LTF%9vawrJ{fWZl%*DVdwXpB~Nqh)D;jIRu;qJ-^z!TU%V4|70bXqmF~9;J4-YnKj}+H=-S z_{{x^*OUpHVszz?b!I+qi6Gn7SeOxXr&}@*DvxS>fMXf2G1r*&XrH{d%LT-~*P?aOz(;jbbwl|4%zSw9 zG#l*@VVXM34NEOQYL|>UEUCK?<_NuueFk^hWB$(p&MA$6`kGWUbq9QpEuCPYgL}zv$tr;>5&ThM$6Ct-fPR#3iiX1f! zYO5q;vMgOg0tP=IL;YKsVXUL9A7npuHE3l37<-cRj}-Kk<*V{FnN^omxE|On0%XSQ zixDv`d-^liUK=_i*RQlAA9+lr;HUr)$sT07P(z5fPknRC^i_ z1%O(64Xc5>;0A+%%3Lhl>Bi10jcf{#<7;a3Gn&$P^zsc`X7Q#2hjBx9gm$Z=WTc=z zqnku!mh3%OX>1^g6TepumZ>ixxX9l6qg~``;PysT_`wvz`_zD|P7c1s!@K6iY^2pW8?bWweq z)FoqWlywP1FqD+t5j1YH>!ZYvnkA8KmDXk{DDuBi5;e2n%roydw|3g1pMUB+9{IS- zKuBMMeOQVtxDw=?y=UI;XGg(1jE0zeOifK2bOZ;jAl!1z-PhD?KnCsvp8A|*q$_%_ zyuKN<#puLmXnh3(UhP=WdqQ7OWY{5QEE3-^eX`)$pkC)332ll-#RwB{L}JG8lZAdH z!5OIK{1K&iekVa9uR*oL7;fWu001BWNklANT=>hled z()xLNgA&IxE3;&_%a)$# zWC&55)!8{uJm=nfSc?pbR44OL4BJ+QC@c_;X;m*ODMCdvno41CPZTfKAxao2G}Fb5 z@Rc><;mGJHKbK_%gA#)lu_G1HqleBI5z6f^KtMTr-N#(^&epLK^?NVg&`^YlNP&VK z?cBXl)QT*qN{xlU3RT!D$2j{cYO(seXGWxAKb6N6wsgBI;mhtCpUVNJlXOg)Yhi`5 zzB9ynS-zp5&!#A@^Yg(MvW}l=BVsST)X%gUp43>}ETiysTob&e^K)}Jv~Wn7(9#OC z3>)Z7%&o_0VkR;ltFt{E%su<+lAw~DYeLKrO`PrtFhtgvw7&vM8FWi}xy)>2t(6lx_SMPzYcjz{B z4F)5D&=WDhPffS+iUZ4->r5yERWOWe>`O3SU`aPYons^PIr)@lRpuybAwy~&O9B8h z1-{k=%Mby|KO1LeSTd=;R>iA=5Q$QdnA#FV_&W_a3~tJapwgm*iJkFA7;4dDL30df zjqPDUEq2DV9r!3RFX;A6;B+0V>Ssbjcul&Q$%yQqWeaTw!2}UymqckJEe!(`mM6%i9(rQM8+mBEVKdkWn~(M9O88%w#o;aT1p zW3lCJ<8F;)-Ba+HjI#ERn0es}0Aq7G@mMAQ0CWTfytX{vyx;kKWel+X#*UFK)L!>< zKQnT@+BCIV=?DO#9_5XdmZU~7Y#$N|j!al}n-pvX!WQxg-vI9xt_SkKGpJ<^t7utE z-|;Ylq1g}@ubi|ZpgHI>*qEir5{BDha#Qw3!|y5sVLARY1F9CQs32ze(Z>-8Qb9TC zQ>tq@7d=ch(v+q>F`+ElwcoIC4NXN}GcTwZ{hPDULz&Hmn11&|DrmkXVTYxFjFAp_N(n+GQ5AT|dUR!s zgPao3+!J8X=Z8R2JtrZsYYzvQtN{nVQBIJ;ngkiHg0xg*4p$-tSAh<_=_MZbSoQS(!B z9!&MS$x2c-O0&B-0pIV5118T~ojafI#rUVG`JP}}^X%ltDEKeA?b1jf1 z<<>@RQHsL({1*(ZS{us}nE*q*kB6Rh3@(1urAmajFLAP{O0LOt(r_-yr=Fx3^CYyF zaE6J4`!q`uOYE*<+b#F>p^}c}m1R-uIUUmCY@c>cBzD(An5D%8V==D@Qmbqj6W;L2 z$u&Xnq{+V_UYEEsyOo07Q|2F~;;HFriOmTZvUI{Y#yck{e4YU z0;!ZZRI-S!GA?~HJ*D_j;G|M!sIKQ^3nZkE@|_roDC4WcD!_u92h7OuJS7bXAe0>` z)>1^grD#$bwLFjLB)R@IKR-%TA(2S{2O$-0j9vt+t1*zNJtgS2+`Ll!Xje98s0BS0 z?p;Xd@K=AsftWbg48(@F}CM&d$s6=f`cXjP|gj7&51dF4d3M1`(N z84O8K7YhtOVu&^=Ry7*w4PD_QbYKlqw2}G2e9X~@g z#9(#Q*%4+XNo^50NXHOvj$&3S1H7{5*IgLygb-Os7Jxg2cmASXN%vQN53I*E_28_m zta>6_h(dXPsMKcvxPgVozNQ^&mYv+nMP?)EKF%4i;nnP>%@}khK~1s*seR6nuqjgl z1_A`qpau*yaUx*gec+;wx}HiBg+opx;5Hl5iinAG$u?!CJkB_zL7CYs@44la)FQ}d zmKlaj3O?zAR{X9EY?%$4xz6-5If4in)r>yTVeI(@kkI{!P9&d|fku?6^V}+Ofr4H0 zvzVE30*stoDLJa!{j!t6J4gg(KL<{POQcd(LV|A3Fs=Yy2J~WW#WUpV=#)P*Y`;3d zbNYfXCl1F#KF0!X@ueq}XuEds;cq>SeC51Y;X)fS)qBS6LkYJ;9^bldncO zMb|*4)W29D%%7U5@H+$&VuMb=n#_bBLkrgY9nmGDw%AZ%utP#N-F|-g8Tvb!UfI|L z=u7{c*t}HUlvz^@l!_^$O!m}X$yVcvO?1wZ(Ef8bfI+OJo;$A(9>;Wjh=-qd0?xkZ zVtGfzU65HE15tvqq}CIB_}tBotU143P*jvoEsxXrE{IS+>!e*|vdGmK>CsN4!whu9CP* z)ntI}+h9PDZKPQy$>Y&wEygOiUE8hr!Nf-lw)i@xZVK>wZ^*UG@087dI*J8oa*Xpa zsDz$|VZprQxs<|417@xl2~sO%KC(l#>tFjyEjI=>n*1!jxQ|xv_YG`V(~l zv)49D1uO}WMpv7X>8#x9`JU3CBU(qoUNh@J40>WUWB_7oO^au8aEOmxPLOeMycR^> z^u717)kF_w7s>L{vVlx0b|o$}U?AIJ1R8*-LE4DUTW*oczHf>)bK{Y3f1_?XPaBw# zG8YGf`|64*ylyzUrAduCF^IC+9u$t5F63~-s$+F|3A3{nHA(2$YFiH?mV^(Fr}eQc zK_&O19{4r}0yorU0JEDm1z^xts`v1kQ@5aQ34sOHrbp5+m|@70Lv2U?fgPyK_ZvI_8&5A1H*>%B2WH8Q1n_KCce;1#f zcDnxd=r%CWa6m4>#~4Vcd|m-IA}>$Skij}P^CQb3YZ-#bYVPJ(*B-MYNXeS`^T%nC z;#i8i6rx9sEKlabn;D^|jIDGHbAVGB#PiwC=UlfTspVn=wc%CX&%CC|?j#;5fZ^Kv zIQE(0&{&zB<9P+i(D>dY?Og>Dxwae#N_H#PPxbdIdsHZLl0#~Fmi2taSEBf?@%vUS ze{#Yo8AS#L>O8n7QLmusl))&-3OY3mF-w90UCEH1Kes>UHFM%tK4-i?QvfbKZyhdt z=tI!2c{-{GuUWe$R<6dbg0B8IJu?%XV*Z@okOD~$eB)lo%$=ERw(-$`imsh{ZHNh3 z)>VLxQZuca%|JJ#i=wVT`$@Re(l|@M>v1YpiCp7$&t*iDh9Zk%vx7MB2) zw&jyiIw5$-HghrwOrXS>GEg_0IJB?;ipurymRoOWFV5o@h^YJ_qodMH01TFi zxYtXLz~}5Oum1(50VWbzH4^jv*v;I7A z8H^aY=HfT*cCt|os;OW#D)nnTvmyXVI2NXxqi~KEn7=n?9*BYqb!mb0!caqCMQOgYQ>5Y7CP(M0gaJD!uV$AhjWhauF)|Tf5SOC@Hbrsz~ z2|&uHu?+6n5|w?6MK})VklCuAE8~XZ#EWwq|BlFpi({*90|X;gP*fg!@y&%=KOn~4 z0f*wegC$hCC4={ofMM-*;JPTEX&_inWV`WECH~63Ane=mw~~Y z>oaHO@On`6$=6IxPHF;gOC13YZqy7gfst7p%NgtnaO81f#NV~rPV%C)QjBt8!j#j7 zqh*kKD>A7;$@8=M$L@|UNh~ifhYy4I^ei*D<=ovCOw@R7$+Re;3bUyEjBLGk+j{8p z(nVJLx@TLMEwHdWkIDWR9x$cSL7Z21apW_iggwlocy9%M3SqFFR_BB|I(zQz7FV=YN?Z~&zie>5 zphb6wDU&x|QMUTid|bvrpJ%0E37S zzyw0fj9%cwvQqumWdoNL+?`>TL^UD~9jUMxEIAZNQB=QcM7p6;x_ZmEQ=ZkUnUER0 zcpjsTG-DDaVS!2+y)bg(1I!Jci!^ z2y3b7YHxm)F5&ieB5i2;c@;H6oj(r&%tLMO9 zl-I_Y_R#@D$+SeT_P@8I<8D}$@oSs`r~2Orlo^Zz?3Lin=TK!SN+zcQOd^;b?Yd`@ zLS!%oWhxG+30R8HmThkUhwP+?J;+qJ&%xyr--PVWNbsp+E=m%9y{~@^FN+UJ{YV(;K76N z$o`n!a<^B0qq`fpN1k#l@W_XpjAM^K9m5(+2>iajGI{NpF<*mwO#FW_7|gKE2-}E{ z=P401O_0ElWo20{+)ipo+KX5kae#OEw71%I%Qyj) z0xa$FeXmmZ$M+Gin3+iJgs1rCW!1ik5hgklIDGi9f-QAhv^GyyU@NO=dEg^eDaPO+P??i6)5>ga$}7ND+YP&k>-2?yey-1|MUPeQUVxSu&am zXv?aMaQEx?o^$rzYp=DoUKp~4n2>px?!okyW#~~7he`jO%&iBPq4PIERMNW2PSt%G znHZ@Jan$)2rc)&whP3P`Q<;l33h6Qsi#{hsNUQUs#=;M`ya;cAa0{Z^w6rUe7ZXT5 zAC@ySaXuHyjhSW6&%Ne;Ta6N)1k{?Qj~VfHx&Or)bA%wQcW% zBjM7)*2rW14}6clMiDBH4GKAt8^g{hPa{FO=;{;}vDN;He~`*JPJ#WdMi~MCg+Jqj zBBaTa_b@5E_qprMMpe^<%zQ7-NVhR8Yq!$Oy<`C*b=aKd?^t2w7G^mjBnq@9oJ43s zC5Xb#Tn6mrjWlv@xY9Kr%W_P8o@9nDC)~$Z(t^ddh@T(=PDBX$iU~1nYOoehBCU=-U!DVja=8LY<@|Ax3BszjYlwwv zF)#sFZDGr9xh9et$LJ0b@fR(sPzi94&dw>LAt3n8>N3)?R5ef2Oc^Vb^(Y4F?k4c(s zWwff%fG+D)vPfK!XdsSI2ori--9ZR4IR^H#)gqSEc26;75S7S!js3HeLN>Ir*l4@e z_j*BHGseSuGY<3=XUlQ9x*O+sON4`vX^MUl^}_<33<|^tAwrv9!Z7zQPF|vb59Wpt}}za{LA449}^+%i`)q7^-r>!es*uxBb?64WL{bt;qKaIQP>-ew#oBwkBi~sh&8p~h*$@t-i*D=4mm%$Pog5`3d zbM9Dh_1>M!gN6SQ)RlN#UWVUA8)9yL*6U%c*K5K4QrPLNb1$81n#Gxx^K-FWD4^-j zH9Rp=AA3PKD3b_T`Q=#($8px&Pb21V_O6_W%q=U_GgR^D5#LnTogP`foeT}rI^f=_ zSbH)5!o)#y_&Vs#-8EPD8V{`^(<%$KPQnq8XG8om8dJ+7fNQYXZv7b!K)Oe8JwVSU zr5p24!duWPt~x7n`|d^INA;ypl2gJbv23US zf^nHFmM>bVB#Wb)h^l-pIgDR-I;y!hH~_~qG0e_@#~~d+-tt}Oks6H6XDOL=M*=(O zEAYpIzYkb0U1(o*CcFP>bD$6vWq)b2jlKuh$Ajnt5GT9Py%vrMBii&ixYX}M%A-D$ zr!|r>QgO5JMeGDkh{T1(W3ne%yOWPXN4n{`*Lt>zC+1oh#!?a|nM(+xS=LHQ)H6G7 z2&)|k*fwP0`FT2?-@6Ehl8Hzzt)zIDjM5Mo&!w`Y3_*$ot~eSZquK;tP~h7T5t7$R zCaJz?T;+DV@wDBIpT0bf_xIWOr{DiP9-bb@8|0)h8<(?{D=Y@~Xi?gfNw&yw=ahY~ zP9V^Qv><+wH2nW33{HYh6NYXWpAg61>V#fREPDs8z&ghu_5a~Vd=2+EX#NsGXb<|x zEcb6ZV4VDuz}7@2jqhJ@CQe_$=lLPE~vBnt2r*#9KyOat9(ukLqSoe2~puP=N3J(&V~o+@~Zm$Bb| z9`p6*G2c9l^YzbT_5Nktf0&Qo{PW+8|L%YI@5k)Zx8viV{$@Pv&c@l|cI?(eW0XlU zsBZCK*=*KA0Oa1vpwYQqYxz#%LL_nXbWZ#wAozL2wj5pKtVrO*#|5~ZGeL^G*SE3H z8Oyl_!SMF(&Xu(am*;W4xYiU<1!W=CWi_}h4AGHm!}GyYiCyH0Xem{R{cBYD&v3Sd zN9AY0_qe&fmd^t*f@>qu;IsMOYBvPU=FH|ZbRUvDvPXE|<-(p4HNKnp2T~>Y^Ob6L zCR5rBv~6hjh$j|RQ5AxGo_Gl)RvGV5Vp>(lp?u1&&5i{64%cItt z56Bw&Z~o1n31Q%ux!DTSfh!z;JFd2i(_ZL>>pNUV@J`BWk9-XqGY`ubfu zWK#K-U23(3+twGeua44_Q>oI#^wz#UFOx13q)`*tLRQuNiC=dBP201^E5f}S2Z`SJ zV*qe9t?Dx^2FDz?9eUr|r~5hvIN%9E&}UQ`;@V#@Xke!BG-F=kily9*W~<7i+eB>- zqQg_F&Bnk=h(ivnG(KzdT#2T=A0X>24dG34JGYO-u$C6s22MVueEn=V5+)N}0Rt?( zB{_QDJPK9${D;S}UGK*qfB1R)@Y9dudA%Qxn>SZE^gp>#l8^a0S)O@euE6B;k+JH( zSPuW`grSLogTxg018X09_qJ)BP>3AxMeJRXH<*wv*Z1&@2za7s{U(|YF3hep&VVu3L$N9_SxOjOU zSBIx@bG9F|*Uh+FypEfj^RbvO#y|U$KOG-GeHg#~FTNW$AHEs0)y>#k%*T3mKh`P^ zuE*|Sryz7OW8x?QnBr+Kc>S~=-oi+6BC4_Hr?mnfXNVLFnLopt;9P~Ms5U5Panvp~ z%p>4;iF4-c4mN-?ScZp(TW+$c2UU>^ZfvGW5MEsb%hv!~W%~aF;*c`2wcgUBk0Ou4 z=c*=DpaxQMp``G2bNxsqB@<1%p@ja^Sqz?qL4w8S`Tff$5abV{6COj63$?Qql8khh z*T5>rO?bYzQi9c?QEgN3StNw|o{>;?w>3W1VUznN-i6G;E=B6}SZo_`@j4ZmO!%FK zWL=E2zx&;vztdZqJfsClUZ0T<%l zuyvkBF6;oQ9(^>iCe6g?N!FJ(Kw@=x`r;AF2PJS~Q-dUH%KP3t3}Cu`58a4P-%60T z+QZAQCRT1?IN)}`NVyfY__TjH3vm{`Zv7=9FDfZA?_Y~f&xQySJYdb%t)%bKKEH zU_F`;(I(&+B=f`tQZ0o^EyCr2>^P_%wp%@OGV}fJWqf&j91lPKFxFpw8oS3Y25@>)p%P9^S^&D+ts3Sc80At;VYoirIMKK;fRFO`mfZq&1VN&_Z(x47?`^ znKBCr_`Z@b*4?czxF#P8gN|M5xEw3=$@LW22iJN%_mZ6E%$9r9Ij znKnu4)v2x0n!gT&O?Vw(+s+7#KmFZtO*l18LU7Vn@pni9qV&&5T75sgZWV|i%&ASmzn}P&$Ws87 zK&81hhH?+x0SgD*X{4e`FI?&^DpD>a*W@6T8#VUZ2ao`Uyu8{)%ft~ zn=!k*7~g)nQ`-UJAc6R8b~QHRa$Mbg96vs7#{24i>_wQQMM1^v??~i-e>)q8_g4`S zcbl!og!8;0EiM-*8rDGuEVHG}aC>_&^YK;X(7 z?tu)i+8#O?ir8dEZH{w$NpzpO5O;95vMqBcgrv|8GEvLPUyupZ)D${hu;!VxiVm45*76E%t8w0Gbe(z3!fph!iaEm?yOzAhaP#hO))N zgjf-)FXTSH`Y0zdt0`rS2SmvmY&`XB=&5Knd0G$I+0#w)Ru}YV0}r=8OnNa|l9NDz z&2uF@KD8A*E|>HLwfN%BB?v3uRhe`+ABK)hy6Iu)gd-4pS_XZ9iNs;X9(#1k#^VFe zb=dK)vaVCPDa1p6Ru{5g>(&SFp`T~*$eY~JX+ld_n36gP6-d<+nUGk-Kzi!K+1c~d zhP37&elEFYxr}*m7Rd_>mS+rnC#zQuz*y|oxs$_(EFEu!%eTY0c-f4xdlLEab+eIk z0Qe;n(F_1Hh}#`AhRzC65fY>p>^s^?=fF2>h$!Sgxs zOE9WZ{zKo#92h4g+$@AR6%A#Mw}SRkn;dE`tWW63m3$%p;E_S&~u65o~9 zXNS3&=j6$a1Upr!FTmQIM>a&WXzXpg0(ZY2#`gL1m{TloAIIhUek|CND2H}W<8F01 zu4YeTd5s*A06h~_et&;AZdMoL`|t0y2fz9DqhR&h+Z&zJGa&TW^YOeNV^8vOhASg` z^L&hp#dzM+o;51cp?|VjX1w;A!0r~JdV5jyO1^AY5=w2{FGlp z%(Yl=lD0=tN7A9hPpy3{{Cz)m`K6P!v!O zlltAd7D;nqC5q!vvMU2m9eO2v(U}QkcY)xHm6C8_Crv=DcMb5KlvFXSYvHk(%)&4VVM1Bnc2Q5 zH>=!)%2Bv*O>KmMn@ZUgzx(fkjC8}CIk{hD=f&zzOY&@G=FIdM==JXSbc1d(dj({4RN3OoqCw_o#|6TU;=S* zZ?n*{--YX_%!p?!)FtL7h0=T&dl4Ony%c3~#?FE|<%<{=bGA#uNd{g-NC&9wsV&ph z1W+c_p_YKrd^z{D$^l8}b(~)koDbvj>{W@xe2j6;iMrp61xU{8%h*3}$LnrCb`Ou^ z^XJF0IlPb0k5A+0pFfYsr|0qbycv(r+wu6gmUqL$&ay4cWuOL9NFF37b<}!EU{Z@H z_6U3FmK_lGXOV-l4)k+RX^_lGs*2-C@Orpsmb;~CLOa~UB~aO}+0{TtkQ)Ld(k4;W z`gwQ4;#9>gvQ*Kk#n0U=@N2DJF}xr6I_r~qEU3{CQKnfxXxJCszBnh{YT?2t8(dV<+E2ylv z=Dxmagn%4+XH3Ze8+jjhnCt<{>mY)8?|L|s@;>a7!()+fCm+-;LMk? z$n?as*S(cdK2*jT2m=KW@H$fA&9k1j))v9#YB|o&9ANp(xn|{%lmqAEp*|n8^Sy%m z``C~Bd(YIkT`d&Ue*OKg$A^y}#(3Y2)#_@jZpK*RsXe>avstXJ$M)rXV8Z$`uE%VC zGhW_iWBWcI+js8E>sYOpW4(JFdqL`#!VnAx4FwIIWyAUlcyv-#NU)>C1`d*dKU;AY+F{6w<-KJ=aha+`hG zjhFVpCdrZbS%()T4is5h(^LE2XfNxD&$Rp<6$mXF&mCbu@TV&E%$nf8F}(9R;MM|# zs7{yE8{#*_Ku>6bjPsaLVa^KA1w%g>U}=dSXIb$5rp~~5M{1LxT5VB0`rj=)j|rCK}9pIMtV- zvNWEFD*har+(5D-XIc)d9kE?F+`-J1gnC1P`AY<9>%b}v>q<@B^kQRix*Ep`%ml=e z36)VL;Zf@%q(yNJE+M=42J`wRB?|t^$^z%-db;7vg; zxzTq&Av)=>oV?HzL?RWM20`AY_*`56IH+tI7V_ z30GyX=5*LI!`Zl<^~~My#`mK4?^XZn#KDFne3s--bJBtLaTz!+9*RyjQl)d`&v6N* zH6|%6{k)ekpPh{}h*BA@^?ulmoB8Fqe19E>$A_`Hnvcu3G1d=X#%i&WT=V&v{^@)? zJv>|CGR{;nQITvmJF}HvUImNJuV!QY<;%FfT8_>7X{?{t+OWt?iPUg8e){}nTwkx0 z@I3tV)A)FIH=drKg?#(~NLt^UPK4t-+N>!5Sef+Uyc@%C~y=9lLqX^UD>nn=p; zp>nyLyM2^ue0c>k-SF&^KpkSBl~^#qw;Bnr1XL4bQQ5e9g=mX62SJ3&c%iCuH}3DQ zwe@gV#af&ofm`X~3YWh9xLGY#NYK(*T%C`XnMuo6vug#)9$1JF^7( z`|rOWZ|CphVzCh6kLUFG^fYcn_}geaGs(u!Km0hp`~G{~zkmA2|7ZN>pZ_x>l{{~t z-Tmvh|8OVX)X!gj9QWUSGk*WaKaB5x^`DK+c0cCJ+1Sx`yqK#kcYbv{&Mz0^Y4oJ5!!keaXNG>fM0Oi`$aB~ zYXxVM`uN}7-L3WwuO}hFL3TEG+dyqoB{Du=J5GCkVL~C-F2v%noj7Ge#4l&sC%oS6 zcRN3>pP$Ev`;X&!{S*~~P5ow&O9}Fs3Mvv{TE%=%?ltX%dKB<|#lUfdXOj=(q)rw%oC^5-*0{><-pTAKng{;7Nvjc}DO%D44v$5P!qIdOmg= z;LICA#H>UTu|0jv1qLp_nXhAUaW>9h_hZ5Jyza(sy&V^CuVaBx)f4^Jg_4KcyW8=) z+m44H{y4t<=A(iVjPd{YAO2p??3<6D#*aVzaopbCkM;ATS;zEaQ*~Xhu4M+}tp709 z&zte_!v`^}fB%Oc#&7=gPsR^__@ny8yyl<&@cZ!{R@<*Hbeh^gOy z``vhYdeC4X?&;O)Zk(yo+>XonOxJx4b38I??#ri-pT=RkljQC8=33G;`qLlp@0}2w zp9#MH{N;IN|KWc8@cZ8jYG-|Noll$X`2PFvbil(0 zAmJd`Q27$zWvH{f7Bv0$|M2%pBtCuf&G?W1@DB?9s?J`TPtDAAPT#V<#UdbOV%pGPy*GnZ&5PG>T zzAk4GiRk4F2pZOWp?R+Z0^#cJR%Aui$Zow+Fi?MAydg-$Zk4c=E(w|`xM&Bw?lKSI z47WzRn;_4=4F5~KiE@)-8!Xx2%RxyL&&tJ<+pMb8XXcUAaE>!TZG)?Ys$%h1#@TrI z@_F3d-f1rr)H#zLA0K2T?_pCuyW0}hbm6lhQXWVES3s!04*QO?h4rKXR@Z|S1ZiW;uFN|D6<}>xIR+|y=Cyl!qx-yAt`u}7 zP2`*aVVK(xi8GBv8zff}NEs>_fvO8<(K;-y+tL@B%WHP~X%+~tmm_6;E_!Z@)3A?3 z)TGcF6~cMoXD*)e+RoT;-_b~={2?&ndUNYT5=`1e9w}g@hfxnDEm7mB9j`XaKJKM1 z0^K?Sg);h}HKIaqKhFN{-~Por{S^8$4k*rcWKDU}TdZQBfv^|b%2_u;7k!ar-Kra%}ppuOM{52tCNA$=&=Gw(ni-FD(i z4`u3Kd8Bj~c_b#VMImL@rZdn^v$fOAaC#6KYdR$b(d9}JqQH3UmlclceR+Ln1G$~R zy_hS3F#P6ZuJWv+72eo}@w^erOy>7_t@`uP;@V)uNf^mO?-z-I9mk9kwEt^{E;&IK zX6AI5>mhfJsRhMh%Knug7*bQK=%g1`H2~M5RS=?*eJFTFk-*7E-pL;oAqOJw zTOI)SSQUqc^324U5Rw#Vk?UlE^BR&lnV)35t`82JD}g>a3@}l-RKHpQG2aCwK?#m3 zAFQ+I_LpBS^;w=9zZdF;CY<}qGuC9l!$DQ2ocCg(Exo%O<>u;Pu9mKvs(U7R0zT$Y zqFTAVyBW_<&*N%#rRTtB6GW*FsqAj=Z`G6JdtNWD1SQKS|J)EM*YfoAtlqHXt~vZ< z_(f&IfxF|tT}iID-mb^Z>PE!1uPN ztd=XiZvFH$K7Mo(s4zt*ZMz=$IJE zdeuCbXArozaka|qge#CYPlc47bBZpvBKBHu;`_X@uCKIq^vvRDTW*#d1NU5qnmm)N zk-dcCfdB`hAtd$is`bZxrGi)C^k$A7>sYOBN!n9TlJswOnR~;4z*i*FnSC?$6)LeCNhA!>}CYI9~dcNhvsk1thCrFLaM;wrP_$ zm_4=)V>x;7R7h_ww-Pd2qWx2#cR_|uzZ_^oObJp@LZ<9IIiz{ z9bTe}Hp&gPUqtvef-w0m#8S=@6ceMw1Sb1SdqOfC;NB7n(=re|A5##nQL@9GeHy4Z zB-7%1$(77bU+QsXLZzo+y3)4yIR}Eh5g_VSOU$e4PT8KYdcRr(er`ba<`dX7#U2_a zbSVLJMi9b#lDLxuPMnGyWGs4-X~F_#gA4ruDpq3Uc2@h4MO(CJ<*{&_C!!u7fjT4} zGlb23P$u3{$5W0JS4%;8&hp#h;C-u$RuE@%;$2^pD@aCHa|I~^k&{ugi9xvdJGEKl zNP4MYG7SUDm~?*5=A_>#GG|^R7IB88>F|fdnARQ#8$pTBl8#z7we)O_lqdm#wDkJw zwp=FtQSo4jjhaMEbSfl>oU~B3+j0NlgARF~v#L>uqN<9lh!OgdDUc##B}sVMQGuBF zrQ|E?UGlNjQtc^t0Fr-cT(K)OC9UEna9Q!Q*|qO92I`7^pW4Cn&r8&mUs@DnuzpS$%osrDqJ!%pq#9WOZ%kgTHq9j zKZMT$tpck9%p)Kfq%ZFCiHj4ONDvZi&ogyjyOk#QmE_dH+f{?kp!Cj56x8#_GXXRr zd>FM?wHD1i>+`K7n}qgh{jB7SHOl(_bpJ^Sa>n6K}Ha`m$YHTaic{D%0TNj!RN4ZfoTq$<@j}vXk5spKOETnKnbkUi3T#(&t;xr ziA5`9cY}}ch}B)Ll6f%vE>(eg>L-ZBDHmZvBSHd!aA@^G20;&Z zD3cQc4qvJT4hJ2?i_F?^h3*R8>IDU`z=DP0c!pA`t4-sKy8S8Ji`rV$B%}@uapqoy z3ZFB_JAnf))x4?)uIpsVXA`$((}mooAy^@{wK^!eR5ra@PWkezhuWBG%r?Vr65N!u zrJrW3%!jM8?R*c2bjqrOOewG~=7uw6fy$x2%K>fcY<{L`t5ldA1RDBvp#y*bV0qI< zYp^md4RJ~KE!HxmE?~S@2(y;NabVTxg{neuVZLbj8cYg>6G5faWJ<{jMLg)n#ie_K ztCiX+JxpZ=b91eLFUELeW6Kr2>AivrQnU5uS&}uG*X;M>!~KWxyxC}d36kHewNLn7 zK&_gt7fF_&SXx_fkK)wXLO=;%{WruUuV&p+;^RSS_Vfid!Xim|JTc!x_l812GeM5i z_c)XmtEJW)71-VFjpv5|H(vl5Tl3A{k-5+Lr8q-Mra0hIk!gt}nbY@3yUvK7TZrmu zvj#434WunbH3`~eAW?|{^1i3Ff{Xg>DG0?uG}kmZ=dkh;S}qdQLYX(LRZyP0~397X}>p4COv^o{-pi$R3ciVfv~E#JCR< zSh6yuTso+8 zojgZca_mRj)Sr*#{7NW{ITr*vqmwRRj1;!r;XPoN%lfg1T)8)tFJ28~RmA|$gy1!{ zo%TLd^7Zs6bfzwhYEhBoRk1L?n$#dpE@}+LefErtjsZ|X5%a3H!9CN&g*#^$Z3W*G zBhH;1ZCh-UIQyNoH!?h{Y7G_iiIF0PZa0pD;qmEy3OO_(lf+w!mU62|)@eyNXvLy9 zrc7m{DyypdJGS>XD=z_EQWO%z%cn+Ot}t16>N*lLDxQoR@f z2_>%W4h{?|pO9#D5S_!KH3`U)OKZ*4b`ay!u%VNLNKV2)m5dH4QEWSHF5(3%zX7s+ zWvljr??cdGD$=Dr3kqkGWf%7D0b#f@d<+pBFUB_6q17D6(XC!oW{GoH)W_VCN24!2 zXw6E`FfPe6E#GrOz~;@&bY~Co>36c>L?ddKIHB=uE34#r+JmFgG}~XBpWyo_`4BLB z5-q`C8Xy)VDH0(koMGjMb!-L=(j`|WQX_~|>8eSZ>9o$26$kyWn;f4*C2Uwu3ZEp9 zBuhOgNHjTa2cM%A@J{E=rSK$diFAyA-ncwRH8$h;r3S5i-*m4Z;0cegX&5x z1T@TQ^~6ZVTSon^fK3?-ywkzRVRSY3h*{8$4o&5g1_PZ5dVv)XRR-~X zK+hy#%M8kKB5IhEemyM-5?vuBH>+5EvnJ2&`zW;1sR~tdn zHA{dYpK34d4`a7GjGOC~5mY%OLQEw=HbTL_bKdZNo9$ZdOeF<@!QD=I_4LQgMo=Kn zSbNrk_*kH135Z6#Jf2!|$FvxL+LQlL!A3AG1&mT|6% z$SBgIC-|~YL03S(IFCvGNqU8Bf&g|RX2^$~Qp|pG@=IIgN@u){oUF22a2D-AbgU|2 zAHaE0GA`v?%@jkrpXB&$bcxaw33)tS6(2NX^*zm}%6?(z^V>QJJyrY}gVm z_xnq3$!S&rRW;e^v2Z#WVo`QPENsU=1Yjh9AhIE zB#BI&vEI+HCp9srS!*kPAE{PmsEs0Vbrc3^Su`Olf)LU7BrOxsWV_SiED~d4X}uC$ zt#hh-8k!+=+f@UXm89x>VMz8kN*E~^2Z9%n7bj{5|DMZcAADx>a*wMZag`EJhe+X6 zb#fh2RUG*y$AM$+>2i&18V=d%aO|YCYS-0*F@nVb1n+l zS4$vf2jV6-9_n?3(H7U%dK*f$W$t{wh{s55s9)by5r293GOllKbTF|F2;xBMAY?$v z;yeVIU|p9Xt!h2+u9(;ya3@|33VPXul4-pYh_sNYKK1Bhlk_+kWu+*LuJK>H%KMoRhe z$`CRWv(;9So$rfDn%5*dhe-7xqrQ%t#cJ#i8$CyoD&DB_(Z|hte7e6M4-b#pdk&iB zA#e>Gq~F>y0($Q3K)EX%Cr@ ziF|d&@2cJMBJ-)IhX;;4IT2t%sF$l@AOu*ymjkusnI`u&o1%hes+w<=Hj13f z?1ip-A<3oXIy_iqi6`&xxv4$rsb=;l2^5HunvgQZM1fN3C}TtDMK;zP;F z3a@ij?;yNcyXC-l5WM^TqCof44?pV9A{ZVe3%aqe9P{qZB(?Mvxu19U_d*~{!n_(g zwU!LM8%~4_XotMcIuQw0hd$5Cy>?4~eP5|MS>N63YDd!h4aYuYlq}2Z@k~&{&2PV#{BTKqvv7RX1#T5v$~dVw zGW&wW)Gbw`EK;vUDyep0_$}tQp}fjjt`-nymC5N!mSy?uYf$kOVz!eB$6lk;ZkLLL zjE{&4TBGKcN&382VwV`~dzFMj=c7>qkSe#K;L{vjaDgz?{2}kzST02xq+jlD6f0+c z^SeJU+btEG`_WUy9+MSaR0xh{!n=|wYxYRy$^^(J5UP-mQwCeHw6b-!7cF>jTQT92 zkGL0U&IHMYO^rfmYH$--($KJO4w-!jkm3_W=Gnfi-~2eeQppVFFZ8>ax)w4EiGUug z7Mux%9CYRoxWd@IWtf0G=u;s=%l;RrfgAX8U61aG2E6 zL!+iuJ#71WPsenXD0CrKy!?e0N{E4;=xMa)6isT|hQBjxauV;nG;rnMs(f7+m3BEmvCbQaS(!$2)^( z2s}>!N1Oie^klLk$x8b9g743%E}kajNJ^Ttu1a=d(>giH$XkucR zDFiiG-x)M>b}1eW_l90B-|ZHn*YlGCrS=g@lgkTL0(eJQy|A1n(lu!=iB!Zz*x`~j z+QbZ$gLT3^IuaCvFhot`)|syp^Z|5@bs`d^{QRwtzqs@sQp<2YQ_#gvLSyFRJ)&MO zJ?PzD&!A>J+S75N)7~KojyzgKI;w1X_$YHU{N^xb3&@xr+m1&8-`9C0Y;g{H_x6u! zASUzqFf0elM9K59y7Dj}5)i6V`3uAbc*ZlAk=Lu_kyM#BL30&HQVKDU^N;@Y^E2EQ zl3o(9v{WEqLS9rww{Q|fQi_IM?t_ad5J=i6-;uU}UUbH=mg(nn*0P3#J_xS2!z}N` zq0Zl<%wT=N<02T7X1iBy6DaB<#pD!#8vCZeu)|@#XoKG+NbzWaX2O z0^TPst~3A(awUms2=C%`MXFx0foC+ubPiH8`)!zGCXzgSxwOEoSOV>}A(Y6)+{?fH zYd8!+2=bRf(2^9C2@bwW~aHf;wq0rt}zYxzn2f8D4UHJRhlF&UfgFnNmj(zsy zlu5(>cG2n_g$5`0j;!}pl_JR70j$$E#UBV_(X2@on0&O4l2TKzBdN(~YI#6p21A3V zvUmPEE_@BRERy!jAd#4v?Q7#ubbtG3y)1+Txs;$S9K$T_F*3omd2uV5OLcMlEFYxW z2r-~CO5m!}$cvrRj1KrY!paqEp6W9FE{&FrpF*Ff1GPO9ln|sEZ{N^lNUsBe2OEOT zSKHCDZ|h7}vk@U$v1jETNy$J3GC8H$6v|F>hFaA>Uq35Is{)Q3n1g_WSk=pNIi8;$ z$2T9o8IRA8t_q^WAdu>SK06=Jo3-IO{)8{EAvj!)&GWMoR0uz?w{LENuz^#JPVn#u zCP)^|Bd{Mme4P%Z=>aF-1^gDCpR^(G@9*Us!9Q>oxV93SfR6bb_sL;fyZzPnmRban z*@_GWJPUbpb*)5hzjGykOJ3VfO%6o5%Es3oPz&+G(D3Y1WJb%aW`e0DTkGM+cT|;b z3t;8LkqQ%Z`5x>86dtGGAG70RVs!!GO42V@Fp2tlU7kqA-S<$ z-yx1xMh%B&X6e{`u7HSn5=Rp2VGRlZSxx*98(ryQNd%B;VzhL7=ij@W2@>bo`QvCQ zU=+mrZ&Z!l-(w)O9={sEP-)|21lSfgR)S-pzm(zA!> z#}{aSA0>^G1P21Fr%}srkAOS_?ZgJ2@&j2lVpOGTE%r3=hSTUsjl&gwUoSHX9dgQ9!bCIMQTZZj*d3C%UgGvGZl-)b7^ zEyJcfFSk=N+$AoNwL6}kbsQh5#GQcye|cS0S)(b3fjGGjvfWK`X%xz2Ff-(x2@_1+ zhnuNq*#t$fvkaOn4J3hpvmiK~Y&k<;L>QAs-}0}nXCI308KTcObZMBiY;2FNb<*KB zj1%1+jFn0XicRO2M1X|B{sC_1DWPQ!M=A~uJ?Y>z(GQ}S)g2|W3F22Ji3+G@SSGST z;=`J`*QjZ#fpirN1znnhVAnynU$hoNtdgTEfgwFo@A(T=WF%mcRS9KtfENlF+gSBB zg+Ox1;KQ(&?*OmgZt!Hdaw|vP8}6^xUc6FWo->Gnh`TyNsCL-DBr~W>sQzpo^o)1I zVxdDHh@U$RcRphct(-s(I8A^7Pn@75#a+GrFBZ0w7Kamd*6{GbK=@Lq$Q%OnY-c(YmHW>y&B!wAnRGv$fa7yr^FcSM7 z?iK+qPigIe zhvz6)VR@Yp2zkcdhm47at07r>?rjO7ZU-ONzXEtBMz)0@B=Uev)e`?o)l29s2^>!l zk*aZLl!r~&Lx z5HYJ~Yt@ULh18aBTg8q!Cg!WnNr8nSURok5vM0vE(Q8K}c@^6vQ|93%yVYl({rkWA zt;SooY6TKA>8%HwA#lqI4c+rkTL6XN-FI|<#Vp|Tc@m%Rc`GZ|pXG$et$_5XQ>p9WXE0RN z9ZlMtL>W4^Z$+lIy_h}E^FS`BWG-Y=?gtrxiEvd%I0za_v{wQ@l(~ow0SC&i4-=M* zCiJ>ZK8(J*$&hSj%@nr0F6xTNUBwN^XJ~9M*0Vt=WQr2R$kHThqs5O{Qr$x^bKsR! z^4+j)xgjKeo@alfYb;?^styr=Ox$u6Vyklgbh2R5l@8)mT{dWOB_pMZ4znXi=cpL! z6jN6g5T-1pyphC_09tPgh;N!TAC(J4JF&1O)ufGKS4Gx5Eeira*Qg+LIH+3S-?wWj z0}^^ZJEkp?NX`V~%G4_DAM=og5C&Dx`upq?9lG2Xla=kc0a`}@hZp3ZD^ZQ3o!Ih` zD9dRMOYSq@Pt64o?Aa-_v1iw8nOB)9wUF`oVi!>ZpS%|HAqb+#Gv9RosD#RP_rZ83 zUpwnwjk7bMD!pfB<{OHeg2d8TBMSrJAt-2>;ENm}7Jh%1w%OY?S0GEJ{q2X|(HNE zMq5caOXP&3VO3J6YA)42*jO69ezwtA;+B$x*!j08k=g;p9$qSmJ34=b@El{Xiq?Z$ z3l8w+g4t)m{6Eq1C6~2Vl4HgYx-_-tPbOEgX0%4rlIin5`|H2>v-dhH`Ubie--@2Y zOWBJ8oijrI4#u#PgUnPA|GipB* zt{}F|v>?-!G*>-ow;fDyL{fDrIId(*$yqxYPLL~$*s!4QtGNswS-TmtD{HVhSb?A+ zdh!f~I4poMoluyJh@C6sH9M_I(nMP#{sKKTxB3~$jtNmbBkqqOOmEc6PTSs-1UBYY zt_*#6Uayuyu*8a1V(R2v-tQTy&a+Va28rm55x!XNGMvcrKUZV+(%|2Lg1MyUCzKT? zjMf#;{2SCiN2P$Qys2R7Z_k=N>txqX+%%8L-^+6!l&}fCaBGBRqh32CMhIC-q#Rt- z77%>wz0Mw!JWKF6hc@ju_tV8&U}9v~YT##$rG6&?dhtQ0;aB$DP~w)v)W}r$MYKU) z4pIP7-4m=?lOmvrZ0SKhv`WZ0eWNf9T0m!b;@PrOi4_!Wk?vtlLGC4^fZUQ;Fa>8ZBDW*P_}r2%`D8A;*}a*RcmltdATPC=L+~qvZkW(GPYHRBQ-h2md z0K-~^6Q#GG22iD1OwbomhUss7HoS)@J+w#@6f0d-wj9)lpxs4YRS7{)vc{-Z?C$`y zYPo4;Q6g)~ff96xiVA`gb040@)nYXb3gSN3w8mLB*JnmQRVV#ZRiv?S<$FMGV-5qp z`Rz9XyQ+dpLLdkeiIk+F){V2NaSp@)hkIEEO1(GmxIFL|<7JOA&q00$K;~kFGYAOj z*m9}F22v)xhC;Wj5q<`o%^E9d?wOecAQ-Q%bof1!&PYho1`!R1VBsLrqyX+rTVpC5 z)apBx_|k_Zan8tI^={{J1GF0GmG25Nfooil#1_0t>XyLs9*P9Ro54;B_G*>dP11Yc z@>v;wy(+b|kt?qhIHcOpHCWg=>f$uE2*6_X_ytNu_lfwmg4H)yVrhs0Rg=W1ib`N}{qSYzAgz zQ%P~y{o)G+@glg&)|j=+x{0EK`^x8lQix=SUjXF37&4WYq-leZlZzy2h;vd}k&qkx zaWSB3I(xqfh(;z$b(7X|IBQa}MFG%r%4#v6&qn=X1s+t4b3{dFlw4x^_pC`n2|yo zommLrm}O0-2GII*(UnIqY#k)*SK_iz3WwIs;i zm9f;xF#%P9o|_!jyAKjOB`O0+(5kGltql?ewK4*Ex39zoumfEof6)^4h4tDb4~91* zgN$j=aT8hYIrY@iDo~Qp3@}r`YLL>!(mw?$w+$ffh4F`4UN7jOg{Lv82V!q3Qc4U% zTp1hwRrdL6>sjUq7;dvnPgSYD+phWUdU=}a5heOAG-hP?M+Zxd#@*altNijGay$>W^T@c8TEa}8X+9m%p+;dl%5Wc zVW}IRtHkPngz>~tlkwKkS*w4k$!np^GE9dxqVc;{C>T-j8nNfRD@#QH>xO|p^YQrbq=85#MbgiNkxim;?Csl= zBtvwP1;G%Tb0nOLD?#NuJSad9 zH*G%6eerWQwCU-kqHVr|(5NsM7fEUn@fi3l6g9BzhX*|+fiZs|1mMWz ze zhxNl@E2(I#cPX&gYt{D`vTxhO=bjUco`r2maxd+p5J{ifU`Awkeq5U@hK(<~^%mKk z*4*C7r8zZq05l@Qa~F|S4wg29ax1RwA#;X!4(xZWl_b$9J~)qDj2wp?wMXv?x?C$4 zMs7PYj@l|RURx<7&z60oc3Ni*g=0X_x7#J?h+%ilh>06yrHpD3PKHKCU&XDHM3%n0 zFmrO;u2AxxVytUi3W2mG%CS%ahRP}y$>QB4;V4qkwxk_Tk0yPbPsmfb zepxw(kHNaFLW~v#=ML+X{VF=@GzVnjVGh@`*xuH`IR82|?V>7t-#LleKp}KGMnRf%Uu|vC@4hd5I;|b_CC6k|LD}9>0aogy#_Kp-zG(uaFs4 z`+9u*aIb_xiC)aFsP3r_+>XE&*f1>|0#BB-iUrh4(z^I26pa#TGnEojK+9L{DZ#pt zAr@|jm2kbjT3M2$Q~mFE57a8*md}&FzxE60pCM6kKS+{g6lIj9vqwan-0dfcmt=wJ zpBpyqIQFUH3ZYAhdz}B242t2MeG)r#DtR5mOu3Az2iRZ8Qrej)aL%w;&-ikW-8O8B zM~|Pmd*Yx6>@>I5?9BokO!9F!KnAonU&5vM0oXCnjQRc}sd5r`Cv~ryzW8$RnZzC- z2t&k#Bnior*C68*H2?BG4qI~+b_as^YP{l&5Wf%zR+gGMv3Jqn)?1~`nlG{4SgHx^ ztm+c@*%i9_+K5=!d!-05u7{TSl>CV2@gRt?||Qt17})6 zO7vopUP5(?A;H{18%r{7LN4!_7_ikOufK196j#MgNNvIF`ott^T0Ra+N5;Prs0=Qf z+A}F4`8>D-?cMhr1EC^`af{6elb%Ofpn}qa=B%!mLJ3-8qO}Lm)x*XzVkLq?T`>Q( z-;mKBt0}s+Ox6uqQOT}dT-|~ZPatZsFR7?o+aeM(PmRNP!tiG=k~(1OS@~D z1S@*3uQ^5O*J*S}18bSgCMC zA`Bn7kMEX6)CgphTzu>)Yr`y~k+9^=Lx}NG2yC*ZPMbiat|NCw@7?KMHq7_iI0Usp!2{I^AUt7#X^~%$%*fTcv#K=H?s$@ z6ES~(RpClzj#Eg@2Qm4qq%DFq@67=qDXiAPkr1l;H4Sm`0mtu%kQwd<8&NJ}F%O}C zSzF>FJ=~9eKf$0OhRM=4lOrL_AydN*&2Z-0(pi7h-5@9 z&VwWd8hjJEA@H)%tFtk$RV@AYbL3FRp)%&U9K9s$Lty!qh=ptp%~No&aFXmja&$KI z@3EI^*~`u_l8~vasw_-CHbF8*S#N$XeV^RZ2HYkK{5SiPpF_yR2uoE_f-(17_^i?5KY8#b+Wob6801=U?iWL*xUgXhp&uHr@VUTjcdT>>`^+pLv zRReZJx-`FmHChx*=0I_;R6q^L3|ssI2HyGcYrRJ8;T z0$Jkqcu5i@ghT7h-(42t9P%fzOnK~^SBvbN#th@TKAUP+Npl9aX|tNP({xo?`-d4;Q`CsMkKw||CJ z2(eQQXQh4%P1@{~d-O_B3pvDKAuYQ9M`Wc*YDva57;786sI8VmWc%DRSH2$PM{?R0 zu##)eRbX{0Zt(?h@pNI;qSn%LL+~<1WB8nqO;1>*;xDlt1ZtWuqjBJt6gy8a&&1Z$ zPEus;eD3vbg8iH1&Lr063jJX5cgqc#3sGGL)MAx#&pt&=0?G}lYQ#yzIc@EK%}7$FP_w89Hu z?q-lh;I;a8i&Qd^Jq%lNAr#*t@(32g4%Vh9HUt5p-D(3CN+&2v{w7a&TfEwI#ClMH zOsUY!=(N?P4`VW^c;oYcS7ETG?O}+|8@9d#k_QFK)OTQmYJ;)x9N^m@9GS5^M5 zhC=<{CQ6!gTE&TFWhOo0MAvo@J$p861Dhbjm?4!+1`GdG#%OYrtAh3dN&YPJ+Ur2M zy|o0+fA^w$VOiX6eE#xfeEjCqMCRlK0I_1g6_Uog5BEAy*ziUb%xx$HZqpegS=c)p zCgd>T@KK8fk9)D5LCpxvK=xZ_^075ODndA9E>y*O7?Cy7kZwyNwZ7k#56Q2skWojN z%qT52e4&>ivYyOhE-{HoLK|C?%pgu%V#ekb#Y{CB4bXDx=|bwJQ8@}z`8Gci2a zsnEX&&`7taV8pXIVf?3+)&L^Zi8Te|Tcg55x-BX1mBX37EL;a`&|8UiLZa-Cw;Nr% zomnAYUTB?}Z;?bJ+!CG>-x0$k5(bij%h^H+1Ge86!09U3m_~UR*DH*w%xTepArX0L zub9VC-+rs0DjSXLJJqY_I5_zB{;^K^E^eWEXcj@cz8fl7YL4E~Wth0=p?GplRZPE<*NNle%Q*YXKl_*Ovj0t{dwBICHZ17{ zXEeYlgL_ZT{7SSCWFI#{$z#--aAr^6+QXatMfp=3ATt|U31~87Dw|dje2@+a*@ar4 zTSjO33!XaZiiOXf=B3N-IQFUe9rGkeNIXT*EM8Y>6RWpyP5c#U7g_DVju?o@Ol#L*r&^+LlG#kI^9W)VF@0tg?J*m&Qo(Z$ z^t;!q@$lu#`1adx$B#e$G`{=pyYchSUvz!wuxVY`Gbw4*O!0pR_k~a7pH+sh5$R1$KUazmVU-dh;|E z3y>8{3zcZcu#2Dpq$~c0*!(tYVLft>N{DrGZd8zat@UvN_q$KO8y8nIvTe5s)#G-; zK-=SJ{u5bh&W+O7fnP1h)j0~2C$+x_GA16si6}`RZ;MT>))04vViEYyE>tK% zu9Q)b+Lt6i<`&FjgI*#z{!mJ`HNRl3?=9#zEt?wnaF1CpTrN=SuOcMD&oA z^*$-Q*h|PPIbV(wm4n`hi^6Ba53rP(_=d}(lD(kkDtM$k>wFyZ40SyqhEfT}D}wnm zdnXAVSZB_d4E2PLx`m}Rl_6nj%Y=7F0-@sa@TO~-S{tu>?E@S&NfycW0$J2)wQ6$9^BJpFcz2epO&gv*4F+|0iHNB#(1fHA@y#OJsCCd zcvY^KBtd8hu82WC*fci4@hIuaPk3-jiUQA;ZO=nji$LTx;FnAQsnJInH1i+{N`45om?Mf)~pcA{8!`F)cFd+6!IK z=+^93llx3^t97-N8J(Dzd#3*QyRudml?=4vr>_e5#l5{AcJ$4Ul1ffGOK91!PMn-T zaW7bG9DwTk0-3&eG9KD>F>qz!Yma&NbXQSJUo0E-+c4!`03}L#>WqzGz?0EXf)aG zXoK60Cu1ijOH%D4hk}WmKB6kSpmW?0sVu%cj1Tws(>Q6ML`zH!{T60)uhKnj_q{Cx zWIuH1mDch5o01Ko4Gdx0f;tgc94G|Yf(C_yP=`+kzG&FR#0O?SOHy^L@am<)+U7lx zpL%+qd(f(`ImqyDh{Q`IvJ3)JaS>>f@2E;TBw~WO*A#ow>&Ou3(uZSyz6A>9`4-L% z-${LH`AKm7Ruh?*1PRfkOtnVXw@eykOmp4q@Mh4YzJm;$jFKz{+6=?fE4@ydcw8Ts zIDK|+0r?V)oX{Dev1g0dr>j@>m}A|n{&Nm%OR$~z6d6^Lol)VCDWz&@1&Bf@Mq?y5 z9N4^$#D;stJ*#snNxdgZI^iOA3+`r+8irSME0^jKP;^AxDyfSgNFE7#Bpvvcu$JW8 zB6QNW?6B9*lh5t31qx?I36F>~jQKQ>C@JJJbAt1f z892Podh|18Ya&IcCC^4wxDOiew(?9Hs|ekODxp)vTxPnokgFs# zgQ-kH_V7O!Pi`l&K8+q(F0KS7MFjcPNc{7(IB-cYmZH=$8I`f??w0D&5%739NU``5l&fU_y8;>Hu?n1S#Bg^Ujn)L z1opsZL6>AHC_Nc)|6ShJWMRo##q3XClfR#o2MOZ3iEkXNHqPOO@SOy!MY6;u;T|+Q zmxL=pti3V~k%@(HgBG9d0VzJ{>wxCgf}t`&%`tqDAqKKZZ5sMi4$}3Tw^Yg_w5=NT zeR0;=Sph~)>XK-)CXy-JnGy`W!Q9_!CBSP6kMbJ+y$PPHN&Bb^#Sy9l1P*zK$$)M- zl{h5$^3n;U7Vly)9v;xVyBa8*N@YSut97DaZj?tPE*XKj$Ia`lg?CUl?}LNM*ZA;- z$$l`wy$C1Z ze3070lRuBjfrrP3@$th)c_U!+%vxf1Oi9h8VwvlANErAId>4{kNg-2Z`moIyYq7cA zUUG73J+$OZ1h^&7!S|V@kK~-S%s$dJoS(_rkVIl}HBY7KnFU4YG*3Z6$W>`8D)EnA zhvzL+7A%P_Z5dl&%Tpqw+exrFjF^mv!b81Mp({QNMZN{z&%V?YO(hIIFFfDDq{&XY zWNk@@e`bhuCj`q0gAq29h_Y;KjOkIV`^n@WswS><>Gkubvh~XPx)f_-jJj;No0Mv=-8QWm0)f=Y*)$@g2$2c zkza>nQG0f`7LV&g>oMr3lwNU*HCM<)K69YFXA6z9A3OA|JO=hXYg;a>X&v!d6jMB7 z?TL_pOY}5x@aWwjMCQ^{hSlyMQHhEpN99SfWmOBUzqW#;(o@ghPO()5$iOUwLI-xA zwb%MvN=b3}IJZFjDNyZD$P`SMx}og@Bpc z;29BZ*SHw)xnQoCxl1NTvagJ&5i_O464}$JtIs{VX|iTnM>wGhxeGr-W==spg$xgm z17PiH4gc=9|J%DJDhf)XcV-zEUyK`OyUHuKA>`l{wtdW#>Y~LWF|6&1v&jRbGL!MN zg=~8p9ke|O47Dp5PHu5-L&)JP!%mb?#EaaCi(L`bFYQLn01fp?sU`%wc>~u;Pkma! z`*kF|(&5K7D=}6){(qWm81%7rEl4#VM!|dwo8hd@Oz#^z{1FsvA}3WSsILmmLQ*1 zKWnS1f*>UXMJ6j8fJbX&d;nmGTL3pU`?L*9JLkbF~90L z)f5b_5YNE=2GyUFfKrH%pm50A(?vbp=k>T*v9Aw$E+j47U+!H8L}@02h@ZBjettG$ zc2r|{)(!_efl0p~v=tT3(<5VrJ@-HcXPL`Efxt5bhBid*zCZjMT6*RVc+#s~F0UuM zd?oOE7eC?=%&znr2Q*qSuR5>z9_%^VCQ4*7)|lkULyI=@n-PahNSqNt_7iP1o~Nv( z2`Z_GmDu5jKq7qDJFyps%`&{25K+B?Oo1|15k#ATXKQ(`jqtQr@gB(cVb3a9Zj3w` z729NPgGqkGBYbfh2gH>LjIM$aSf8BY;zEds?B6q@nWUG(;KN;9JrnzkdK{cghDRm> zwZ_?VCOc5`kEXI}47w3G`516t!iy6!OcDwQVYSpV;4CbXT%U)M`9)&g@5e2uPAsoW zjs=O7D{UrD+9KU(xzP{v2X#KsW{na=Nfe2!rfO!e;(Re4GyjI92bWx(sTnF}Nv6rl kDp)wH7mkylTm1R|0ud0aWuGm+Jpcdz07*qoM6N<$f;E(~y8r+H diff --git a/misc/images/heimdall.png b/misc/images/heimdall.png deleted file mode 100644 index 46c6bfb1986dd29d5e39e1c3a007fc88406f3df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61187 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'NiBsWM?m>Fr0G)=WYXtwI`u1_xVftw;` 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 diff --git a/misc/images/photoprism.png b/misc/images/photoprism.png deleted file mode 100644 index 736014d40fc7888c74fbac709be7b580d007980d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63270 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 LNkvXXu0mjf&bHES diff --git a/misc/images/pimox.png b/misc/images/pimox.png deleted file mode 100644 index a6a8baed26745f0954bc3625fdeef795d3df958a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23460 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 X(HY04u5`KO00000NkvXXu0mjfCXXUp From 68936f0eddc81076e819a750f2812dc8816e681e Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 11 Mar 2025 15:32:55 +0100 Subject: [PATCH 015/258] SnipeIT: Harmonize Composer to Dockerfile (#3009) --- install/snipeit-install.sh | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/install/snipeit-install.sh b/install/snipeit-install.sh index f53455772..5976f71c9 100644 --- a/install/snipeit-install.sh +++ b/install/snipeit-install.sh @@ -15,14 +15,14 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - composer \ - git \ - sudo \ - mc \ - nginx \ - php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli} \ - mariadb-server + curl \ + composer \ + git \ + sudo \ + mc \ + nginx \ + php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli} \ + mariadb-server msg_ok "Installed Dependencies" msg_info "Setting up database" @@ -37,12 +37,12 @@ mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVI echo "SnipeIT Database User: $DB_USER" echo "SnipeIT Database Password: $DB_PASS" echo "SnipeIT Database Name: $DB_NAME" -} >> ~/snipeit.creds +} >>~/snipeit.creds msg_ok "Set up database" msg_info "Installing Snipe-IT" temp_file=$(mktemp) -RELEASE=$(curl -s https://api.github.com/repos/snipe/snipe-it/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "v([^"]+).*/\1/') +RELEASE=$(curl -s 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}.tar.gz" -O $temp_file tar zxf $temp_file mv snipe-it-${RELEASE} /opt/snipe-it @@ -51,15 +51,15 @@ cp .env.example .env IPADDRESS=$(hostname -I | awk '{print $1}') sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \ - -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 + -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 chown -R www-data: /opt/snipe-it chmod -R 755 /opt/snipe-it export COMPOSER_ALLOW_SUPERUSER=1 $STD composer update --no-plugins --no-scripts -$STD composer install --no-dev --prefer-source --no-plugins --no-scripts +$STD composer install --no-dev $STD php artisan key:generate --force echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed SnipeIT" @@ -69,13 +69,13 @@ cat </etc/nginx/conf.d/snipeit.conf server { listen 80; root /opt/snipe-it/public; - server_name $IPADDRESS; + server_name $IPADDRESS; index index.php; - + location / { try_files \$uri \$uri/ /index.php?\$query_string; } - + location ~ \.php\$ { include fastcgi.conf; include snippets/fastcgi-php.conf; @@ -90,7 +90,6 @@ EOF systemctl reload nginx msg_ok "Configured Service" - motd_ssh customize From 31d80c3461a82d23573602bdc7133b2d2d824e61 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 15:42:18 +0100 Subject: [PATCH 016/258] Update CHANGELOG.md (#3010) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e2e244d..f0c7837b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - SnipeIT: Harmonize composer install to Project-Dockerfile [@MickLesk](https://github.com/MickLesk) ([#3009](https://github.com/community-scripts/ProxmoxVE/pull/3009)) - Teddycloud: fix update function [@tremor021](https://github.com/tremor021) ([#2996](https://github.com/community-scripts/ProxmoxVE/pull/2996)) ### 🧰 Maintenance From d5f5f1e5de76e2761104d3f416ef1781e65e1f8a Mon Sep 17 00:00:00 2001 From: Cerothen Date: Tue, 11 Mar 2025 12:34:23 -0400 Subject: [PATCH 017/258] Headscale: Re-enable Service after Update (#3012) --- ct/headscale.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ct/headscale.sh b/ct/headscale.sh index cde2e0408..d0257bfec 100644 --- a/ct/headscale.sh +++ b/ct/headscale.sh @@ -41,7 +41,8 @@ function update_script() { msg_ok "Updated $APP to ${RELEASE}" msg_info "Starting ${APP}" - systemctl start headscale + # Temporary fix until headscale project resolves service getting disabled on updates. + systemctl enable -q --now headscale msg_ok "Started ${APP}" msg_ok "Updated Successfully" else @@ -55,4 +56,4 @@ build_container description msg_ok "Completed Successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" \ No newline at end of file +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" From d72d742fbb8e103493c889672837907de0012f55 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 17:43:26 +0100 Subject: [PATCH 018/258] Update CHANGELOG.md (#3013) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0c7837b4..8bf82b27e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Headscale: Re-enable Service after Update [@Cerothen](https://github.com/Cerothen) ([#3012](https://github.com/community-scripts/ProxmoxVE/pull/3012)) - SnipeIT: Harmonize composer install to Project-Dockerfile [@MickLesk](https://github.com/MickLesk) ([#3009](https://github.com/community-scripts/ProxmoxVE/pull/3009)) - Teddycloud: fix update function [@tremor021](https://github.com/tremor021) ([#2996](https://github.com/community-scripts/ProxmoxVE/pull/2996)) From 7f796478f369698722549f75bc75db6c10cf8aaf Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 21:21:32 +0100 Subject: [PATCH 019/258] Update CHANGELOG.md (#3014) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bf82b27e..2cf8905a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,8 +23,6 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - Jellyseer not labeled as updateable even though update function exists [@tremor021](https://github.com/tremor021) ([#2991](https://github.com/community-scripts/ProxmoxVE/pull/2991)) - - #### 🐞 Bug Fixes - Headscale: Re-enable Service after Update [@Cerothen](https://github.com/Cerothen) ([#3012](https://github.com/community-scripts/ProxmoxVE/pull/3012)) @@ -33,6 +31,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### 🧰 Maintenance + - Cleanup Old Project Files (figlet, app-header, images) [@MickLesk](https://github.com/MickLesk) ([#3004](https://github.com/community-scripts/ProxmoxVE/pull/3004)) + - #### πŸ“‚ Github - Additions and amends to the CONTIRBUTOR docs [@tremor021](https://github.com/tremor021) ([#2983](https://github.com/community-scripts/ProxmoxVE/pull/2983)) @@ -41,6 +41,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - Jellyseer not labeled as updateable even though update function exists [@tremor021](https://github.com/tremor021) ([#2991](https://github.com/community-scripts/ProxmoxVE/pull/2991)) - Fix Website - Show correct wget path for alpine [@MickLesk](https://github.com/MickLesk) ([#2998](https://github.com/community-scripts/ProxmoxVE/pull/2998)) ## 2025-03-10 From f6a6ca5e261ed96cc6dbeac848204450572d9260 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 21:23:29 +0100 Subject: [PATCH 020/258] Update CHANGELOG.md (#3015) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cf8905a3..e6ed7dbd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,10 +31,9 @@ All LXC instances created using this repository come pre-installed with Midnight ### 🧰 Maintenance - - Cleanup Old Project Files (figlet, app-header, images) [@MickLesk](https://github.com/MickLesk) ([#3004](https://github.com/community-scripts/ProxmoxVE/pull/3004)) - - #### πŸ“‚ Github + - Cleanup Old Project Files (figlet, app-header, images) [@MickLesk](https://github.com/MickLesk) ([#3004](https://github.com/community-scripts/ProxmoxVE/pull/3004)) - Additions and amends to the CONTIRBUTOR docs [@tremor021](https://github.com/tremor021) ([#2983](https://github.com/community-scripts/ProxmoxVE/pull/2983)) ### 🌐 Website From 6de4a8107ccc70c1160e8c48aafced426abbaae4 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 12 Mar 2025 06:56:12 +0100 Subject: [PATCH 021/258] Feature: Filebrowser: support now alpine (#2997) * Feature: Filebrowser LXC: support now alpine * add alpine bash path to website --- json/filebrowser.json | 13 +++++- misc/filebrowser.sh | 92 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 85 insertions(+), 20 deletions(-) diff --git a/json/filebrowser.json b/json/filebrowser.json index 575c53378..5d16785b4 100644 --- a/json/filebrowser.json +++ b/json/filebrowser.json @@ -24,6 +24,17 @@ "os": null, "version": null } + }, + { + "type": "alpine", + "script": "misc/filebrowser.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } } ], "default_credentials": { @@ -36,4 +47,4 @@ "type": "warning" } ] -} \ No newline at end of file +} diff --git a/misc/filebrowser.sh b/misc/filebrowser.sh index ec57f7ded..711a57675 100644 --- a/misc/filebrowser.sh +++ b/misc/filebrowser.sh @@ -10,10 +10,11 @@ function header_info { _______ __ ____ / ____(_) /__ / __ )_________ _ __________ _____ / /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/ - / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / -/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ + / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / +/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ EOF } + YW=$(echo "\033[33m") GN=$(echo "\033[1;92m") RD=$(echo "\033[01;31m") @@ -25,11 +26,31 @@ INFO="${BL}ℹ️${CL}" APP="FileBrowser" INSTALL_PATH="/usr/local/bin/filebrowser" -SERVICE_PATH="/etc/systemd/system/filebrowser.service" DB_PATH="/usr/local/community-scripts/filebrowser.db" -IP=$(hostname -I | awk '{print $1}') DEFAULT_PORT=8080 +# Get first non-loopback IP & Detect primary network interface dynamically +IFACE=$(ip -4 route | awk '/default/ {print $5; exit}') +IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) + +[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}') +[[ -z "$IP" ]] && IP="127.0.0.1" + + +# Detect OS +if [[ -f "/etc/alpine-release" ]]; then + OS="Alpine" + SERVICE_PATH="/etc/init.d/filebrowser" + PKG_MANAGER="apk add --no-cache" +elif [[ -f "/etc/debian_version" ]]; then + OS="Debian" + SERVICE_PATH="/etc/systemd/system/filebrowser.service" + PKG_MANAGER="apt-get install -y" +else + echo -e "${CROSS} Unsupported OS detected. Exiting." + exit 1 +fi + header_info function msg_info() { @@ -52,8 +73,15 @@ if [ -f "$INSTALL_PATH" ]; then read -r -p "Would you like to uninstall ${APP}? (y/N): " uninstall_prompt if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Uninstalling ${APP}" - systemctl disable -q --now filebrowser.service - rm -f "$INSTALL_PATH" "$DB_PATH" "$SERVICE_PATH" + if [[ "$OS" == "Debian" ]]; then + systemctl disable --now filebrowser.service &>/dev/null + rm -f "$SERVICE_PATH" + else + rc-service filebrowser stop &>/dev/null + rc-update del filebrowser &>/dev/null + rm -f "$SERVICE_PATH" + fi + rm -f "$INSTALL_PATH" "$DB_PATH" msg_ok "${APP} has been uninstalled." exit 0 fi @@ -61,7 +89,8 @@ if [ -f "$INSTALL_PATH" ]; then read -r -p "Would you like to update ${APP}? (y/N): " update_prompt if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Updating ${APP}" - curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null + wget -qO- https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null + chmod +x "$INSTALL_PATH" msg_ok "Updated ${APP}" exit 0 else @@ -76,26 +105,30 @@ PORT=${PORT:-$DEFAULT_PORT} read -r -p "Would you like to install ${APP}? (y/n): " install_prompt if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then - msg_info "Installing ${APP}" - apt-get install -y curl &>/dev/null - curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null + msg_info "Installing ${APP} on ${OS}" + $PKG_MANAGER wget tar curl &>/dev/null + wget -qO- https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null + chmod +x "$INSTALL_PATH" msg_ok "Installed ${APP}" msg_info "Creating FileBrowser directory" mkdir -p /usr/local/community-scripts chown root:root /usr/local/community-scripts chmod 755 /usr/local/community-scripts + touch "$DB_PATH" + chown root:root "$DB_PATH" + chmod 644 "$DB_PATH" msg_ok "Directory created successfully" read -r -p "Would you like to use No Authentication? (y/N): " auth_prompt if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Configuring No Authentication" - cd /usr/local/community-scripts - filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null - filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null - filebrowser config init --auth.method=noauth &>/dev/null - filebrowser config set --auth.method=noauth &>/dev/null - filebrowser users add ID 1 --perm.admin &>/dev/null + cd /usr/local/community-scripts + filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null + filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null + filebrowser config init --auth.method=noauth &>/dev/null + filebrowser config set --auth.method=noauth &>/dev/null + filebrowser users add ID 1 --perm.admin &>/dev/null msg_ok "No Authentication configured" else msg_info "Setting up default authentication" @@ -107,7 +140,8 @@ if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then fi msg_info "Creating service" - cat < "$SERVICE_PATH" + if [[ "$OS" == "Debian" ]]; then + cat < "$SERVICE_PATH" [Unit] Description=Filebrowser After=network-online.target @@ -115,13 +149,33 @@ After=network-online.target [Service] User=root WorkingDirectory=/usr/local/community-scripts -ExecStart=/usr/local/bin/filebrowser -r / -d "$DB_PATH" -p "$PORT" +ExecStartPre=/bin/touch /usr/local/community-scripts/filebrowser.db +ExecStartPre=/usr/local/bin/filebrowser config set -a "0.0.0.0" -p 9000 -d /usr/local/community-scripts/filebrowser.db +ExecStart=/usr/local/bin/filebrowser -r / -d /usr/local/community-scripts/filebrowser.db -p 9000 Restart=always [Install] WantedBy=multi-user.target EOF - systemctl enable -q --now filebrowser.service + systemctl enable -q --now filebrowser + else + cat < "$SERVICE_PATH" +#!/sbin/openrc-run + +command="/usr/local/bin/filebrowser" +command_args="-r / -d $DB_PATH -p $PORT" +command_background=true +pidfile="/var/run/filebrowser.pid" +directory="/usr/local/community-scripts" + +depend() { + need net +} +EOF + chmod +x "$SERVICE_PATH" + rc-update add filebrowser default &>/dev/null + rc-service filebrowser start &>/dev/null + fi msg_ok "Service created successfully" echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" From 3dd67e46c247b35a3290af7dd0c4c6ef8b2fe3f8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 07:11:51 +0100 Subject: [PATCH 022/258] Update CHANGELOG.md (#3018) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6ed7dbd1..68ef17212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-12 + +### πŸš€ Updated Scripts + + - #### ✨ New Features + + - Feature: Filebrowser: support now alpine [@MickLesk](https://github.com/MickLesk) ([#2997](https://github.com/community-scripts/ProxmoxVE/pull/2997)) + ## 2025-03-11 ### πŸ†• New Scripts From fe956f650ddd2a49bf80d4135bc3817758fafbc4 Mon Sep 17 00:00:00 2001 From: Chris <67816022+vhsdream@users.noreply.github.com> Date: Wed, 12 Mar 2025 10:19:07 -0400 Subject: [PATCH 023/258] New Script: Fluid Calendar (#2869) * New Script: Fluid Calendar * Small changes requested * Fluidcal: Adjust resource levels * Fluidcal: remove info from json --- ct/fluid-calendar.sh | 78 +++++++++++++++++++++ install/fluid-calendar-install.sh | 112 ++++++++++++++++++++++++++++++ json/fluid-calendar.json | 40 +++++++++++ 3 files changed, 230 insertions(+) create mode 100644 ct/fluid-calendar.sh create mode 100644 install/fluid-calendar-install.sh create mode 100644 json/fluid-calendar.json diff --git a/ct/fluid-calendar.sh b/ct/fluid-calendar.sh new file mode 100644 index 000000000..7c142f78a --- /dev/null +++ b/ct/fluid-calendar.sh @@ -0,0 +1,78 @@ +#!/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: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://fluidcalendar.com + +APP="fluid-calendar" +var_tags="calendar,tasks" +var_cpu="3" +var_ram="4096" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/fluid-calendar ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -s https://api.github.com/repos/dotnetfactory/fluid-calendar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop fluid-calendar.service + msg_ok "Stopped $APP" + + msg_info "Creating Backup" + $STD tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" /opt/fluid-calendar + msg_ok "Backup Created" + + msg_info "Updating $APP to v${RELEASE}" + tmp_file=$(mktemp) + wget -q "https://github.com/dotnetfactory/fluid-calendar/archive/refs/tags/v${RELEASE}.zip" -O $tmp_file + unzip -q $tmp_file + cp -rf ${APP}-${RELEASE}/* /opt/fluid-calendar + cd /opt/fluid-calendar + export NEXT_TELEMETRY_DISABLED=1 + $STD npm run setup + $STD npm run build + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start fluid-calendar.service + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $tmp_file + rm -rf "/opt/${APP}_backup_$(date +%F).tar.gz" + rm -rf /tmp/${APP}-${RELEASE} + msg_ok "Cleanup Completed" + + 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}:3000${CL}" diff --git a/install/fluid-calendar-install.sh b/install/fluid-calendar-install.sh new file mode 100644 index 000000000..aac13434c --- /dev/null +++ b/install/fluid-calendar-install.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/dotnetfactory/fluid-calendar + +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 \ + zip \ + gnupg \ + postgresql-common +msg_ok "Installed Dependencies" + +msg_info "Installing Additional Dependencies" +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 +echo "YES" | /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh &>/dev/null +$STD apt-get install -y postgresql-17 nodejs +msg_ok "Installed Additional Dependencies" + +msg_info "Setting up Postgresql Database" +DB_NAME="fluiddb" +DB_USER="fluiduser" +DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)" +NEXTAUTH_SECRET="$(openssl rand -base64 44 | tr -dc 'a-zA-Z0-9' | cut -c1-32)" +$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';" +$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;" +$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME to $DB_USER;" +$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;" +{ + echo "${APPLICATION} Credentials" + echo "Database User: $DB_USER" + echo "Database Password: $DB_PASS" + echo "Database Name: $DB_NAME" + echo "NextAuth Secret: $NEXTAUTH_SECRET" +} >> ~/$APPLICATION.creds +msg_ok "Set up Postgresql Database" + +msg_info "Setup ${APPLICATION}" +tmp_file=$(mktemp) +RELEASE=$(curl -s https://api.github.com/repos/dotnetfactory/fluid-calendar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q "https://github.com/dotnetfactory/fluid-calendar/archive/refs/tags/v${RELEASE}.zip" -O $tmp_file +unzip -q $tmp_file +mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION} +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt + +cat </opt/fluid-calendar/.env +DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}" + +# For OAuth integration with Google Calendar +# See https://console.cloud.google.com +GOOGLE_CLIENT_ID="" +GOOGLE_CLIENT_SECRET="" + +# Change the URL below to your external URL +NEXTAUTH_URL="http://localhost:3000" +NEXTAUTH_SECRET="${NEXTAUTH_SECRET}" + +# For optional Outlook Calendar Integration +# Create at https://portal.azure.com +AZURE_AD_CLIENT_ID="" +AZURE_AD_CLIENT_SECRET="" +AZURE_AD_TENANT_ID="" + +# Logging configuration +# Options: debug, none (check logger.js for more details) +LOG_LEVEL="none" +DEBUG_ENABLED=0 +EOF +export NEXT_TELEMETRY_DISABLED=1 +cd /opt/fluid-calendar +$STD npm run setup +$STD npm run build +msg_ok "Setup ${APPLICATION}" + +msg_info "Creating Service" +cat </etc/systemd/system/fluid-calendar.service +[Unit] +Description=Fluid Calendar Application +After=network.target postgresql.service + +[Service] +Restart=always +WorkingDirectory=/opt/fluid-calendar +ExecStart=/usr/bin/npm run start + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now fluid-calendar.service +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f $tmp_file +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/json/fluid-calendar.json b/json/fluid-calendar.json new file mode 100644 index 000000000..87e54311a --- /dev/null +++ b/json/fluid-calendar.json @@ -0,0 +1,40 @@ +{ + "name": "Fluid-Calendar", + "slug": "fluid-calendar", + "categories": [ + 19, + 0 + ], + "date_created": "2025-03-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/dotnetfactory/fluid-calendar/tree/main/docs", + "website": "https://github.com/dotnetfactory/fluid-calendar", + "logo": "https://raw.githubusercontent.com/dotnetfactory/fluid-calendar/refs/heads/main/src/app/favicon.ico", + "description": "The open-source intelligent calendar that adapts to your workflow. Experience seamless task scheduling powered by AI, designed to make your time management effortless.", + "install_methods": [ + { + "type": "default", + "script": "ct/fluid-calendar.sh", + "resources": { + "cpu": 3, + "ram": 4096, + "hdd": 7, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Creds: cat ~/fluid-calendar.creds", + "type": "info" + } + ] +} From f4afe5be9e20a2b7b3afa6a2a1bd304ff8102e2b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 15:40:46 +0100 Subject: [PATCH 024/258] Update .app files (#3024) Co-authored-by: GitHub Actions --- ct/headers/fluid-calendar | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/fluid-calendar diff --git a/ct/headers/fluid-calendar b/ct/headers/fluid-calendar new file mode 100644 index 000000000..02b3d8dc6 --- /dev/null +++ b/ct/headers/fluid-calendar @@ -0,0 +1,6 @@ + ______ _ __ __ __ + / __/ /_ __(_)___/ / _________ _/ /__ ____ ____/ /___ ______ + / /_/ / / / / / __ /_____/ ___/ __ `/ / _ \/ __ \/ __ / __ `/ ___/ + / __/ / /_/ / / /_/ /_____/ /__/ /_/ / / __/ / / / /_/ / /_/ / / +/_/ /_/\__,_/_/\__,_/ \___/\__,_/_/\___/_/ /_/\__,_/\__,_/_/ + From 91bfe2442c38196a8917c00fab5d89351bd61e59 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 15:41:11 +0100 Subject: [PATCH 025/258] Update date in json (#3022) Co-authored-by: GitHub Actions --- json/fluid-calendar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/fluid-calendar.json b/json/fluid-calendar.json index 87e54311a..05f4aa56b 100644 --- a/json/fluid-calendar.json +++ b/json/fluid-calendar.json @@ -5,7 +5,7 @@ 19, 0 ], - "date_created": "2025-03-04", + "date_created": "2025-03-12", "type": "ct", "updateable": true, "privileged": false, From 9ad4dcf8d0fbb4a028602c1d3bbf967c2b6a9336 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:13:40 +0100 Subject: [PATCH 026/258] Update CHANGELOG.md (#3023) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ef17212..834a1405b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ All LXC instances created using this repository come pre-installed with Midnight ## 2025-03-12 +### πŸ†• New Scripts + + - Fluid Calendar [@vhsdream](https://github.com/vhsdream) ([#2869](https://github.com/community-scripts/ProxmoxVE/pull/2869)) + ### πŸš€ Updated Scripts - #### ✨ New Features From 540d80a21cf307601f65403a7d26622806489b26 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:42:49 +0100 Subject: [PATCH 027/258] Update Vaultwarden Source (#3036) --- ct/vaultwarden.sh | 2 +- install/vaultwarden-install.sh | 2 +- json/vaultwarden.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh index 0ac8bf550..3228a398f 100644 --- a/ct/vaultwarden.sh +++ b/ct/vaultwarden.sh @@ -3,7 +3,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m # Copyright (c) 2021-2025 tteck # Author: tteck (tteckster) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://www.vaultwarden.net/ +# Source: https://github.com/dani-garcia/vaultwarden APP="Vaultwarden" var_tags="password-manager" diff --git a/install/vaultwarden-install.sh b/install/vaultwarden-install.sh index 3938e5676..8a2e2c0f1 100644 --- a/install/vaultwarden-install.sh +++ b/install/vaultwarden-install.sh @@ -3,7 +3,7 @@ # Copyright (c) 2021-2025 tteck # Author: tteck (tteckster) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://www.vaultwarden.net/ +# Source: https://github.com/dani-garcia/vaultwarden source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color diff --git a/json/vaultwarden.json b/json/vaultwarden.json index f7436ef17..7c703a602 100644 --- a/json/vaultwarden.json +++ b/json/vaultwarden.json @@ -10,7 +10,7 @@ "privileged": false, "interface_port": 8000, "documentation": null, - "website": "https://www.vaultwarden.net/", + "website": "https://github.com/dani-garcia/vaultwarden/", "logo": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/resources/vaultwarden-icon-white.svg", "description": "Vaultwarden is a self-hosted password manager which provides secure and encrypted password storage. It uses client-side encryption and provides access to passwords through a web interface and mobile apps.", "install_methods": [ From c895fb7809c0be78b5b50af07269646fd791993c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 11:28:57 +0100 Subject: [PATCH 028/258] Update CHANGELOG.md (#3037) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 834a1405b..cf9803be9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-13 + +### πŸš€ Updated Scripts + + - Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) + ## 2025-03-12 ### πŸ†• New Scripts From 4646e10382bdf31612c6130c58f69a3ff1c4a474 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Thu, 13 Mar 2025 13:45:21 +0100 Subject: [PATCH 029/258] Create close_issue_in_dev.yaml (#3042) --- .github/workflows/close_issue_in_dev.yaml | 58 +++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/close_issue_in_dev.yaml diff --git a/.github/workflows/close_issue_in_dev.yaml b/.github/workflows/close_issue_in_dev.yaml new file mode 100644 index 000000000..2bd7e6428 --- /dev/null +++ b/.github/workflows/close_issue_in_dev.yaml @@ -0,0 +1,58 @@ +name: Close Matching Issue on PR Merge +on: + pull_request: + types: + - closed +jobs: + close_issue: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + + steps: + - name: Extract and Process PR Title + id: extract_title + run: | + title=$(echo "${{ github.event.pull_request.title }}" | sed 's/^New Script://g' | tr '[:upper:]' '[:lower:]' | sed 's/ //g' | sed 's/-//g') + echo "Processed Title: $title" + echo "title=$title" >> $GITHUB_ENV + + - name: Search for Issues with Similar Titles + id: find_issue + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + issues=$(gh issue list --repo community-scripts/ProxmoxVED --json number,title --jq '.[] | {number, title}') + + best_match_score=0 + best_match_number=0 + + for issue in $(echo "$issues" | jq -r '. | @base64'); do + _jq() { + echo ${issue} | base64 --decode | jq -r ${1} + } + + issue_title=$(_jq '.title' | tr '[:upper:]' '[:lower:]' | sed 's/ //g' | sed 's/-//g') + issue_number=$(_jq '.number') + + match_score=$(echo "$title" | grep -o "$issue_title" | wc -l) + + if [ "$match_score" -gt "$best_match_score" ]; then + best_match_score=$match_score + best_match_number=$issue_number + fi + done + + if [ "$best_match_number" != "0" ]; then + echo "issue_number=$best_match_number" >> $GITHUB_ENV + else + echo "No matching issue found." + exit 0 + fi + + - name: Comment on the Best-Matching Issue and Close It + if: env.issue_number != '' + env: + GH_TOKEN: ${{ secrets.PAT_MICHEL }} + run: | + gh issue comment $issue_number --repo community-scripts/ProxmoxVED --body "Merged with #${{ github.event.pull_request.number }} in ProxmoxVE" + gh issue close $issue_number --repo community-scripts/ProxmoxVED From 3dbce17fc38324052f563b01caa8169073887d3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 13:58:35 +0100 Subject: [PATCH 030/258] Bump @babel/runtime from 7.26.0 to 7.26.10 in /frontend (#3044) Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.26.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime) --- updated-dependencies: - dependency-name: "@babel/runtime" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3ac30e981..3d73671df 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -370,9 +370,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" From 41ee6adab2fe0f9bf3c67a78fa73d31d38f2ee43 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:35:08 +0100 Subject: [PATCH 031/258] Update CHANGELOG.md (#3043) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf9803be9..7cd664914 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,16 @@ All LXC instances created using this repository come pre-installed with Midnight - Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) +### 🧰 Maintenance + + - #### πŸ“‚ Github + + - New Workflow: Close Issues in DEV Repo when new Script is merged [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3042](https://github.com/community-scripts/ProxmoxVE/pull/3042)) + +### 🌐 Website + + - Bump @babel/runtime from 7.26.0 to 7.26.10 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3044](https://github.com/community-scripts/ProxmoxVE/pull/3044)) + ## 2025-03-12 ### πŸ†• New Scripts From ed93923672114c1b17be4729a4d1f9272c7c1f21 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:18:58 +0100 Subject: [PATCH 032/258] Website: Fix Alpine "undefined" Link (#3048) --- json/alpine.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/json/alpine.json b/json/alpine.json index ad6e4e110..ee78856ad 100644 --- a/json/alpine.json +++ b/json/alpine.json @@ -14,6 +14,17 @@ "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/alpinelinux.svg", "description": "A security-oriented, lightweight Linux distribution based on musl and BusyBox.\r\nBy default, the root password is set to alpine. If you choose to use advanced settings, you will need to define a password, autologin is currently unavailable.", "install_methods": [ + { + "type": "default", + "script": "ct/alpine.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 0.1, + "os": "alpine", + "version": "3.21" + } + }, { "type": "alpine", "script": "ct/alpine.sh", @@ -36,4 +47,4 @@ "type": "info" } ] -} \ No newline at end of file +} From a426e80b83f2e804b833540ce26b480a3e70c70a Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:32:38 +0100 Subject: [PATCH 033/258] NPMplus (NginxProxyManager-plus) (#3051) --- ct/npmplus.sh | 41 ++++++++++++++ install/npmplus-install.sh | 107 +++++++++++++++++++++++++++++++++++++ json/npmplus.json | 54 +++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 ct/npmplus.sh create mode 100644 install/npmplus-install.sh create mode 100644 json/npmplus.json diff --git a/ct/npmplus.sh b/ct/npmplus.sh new file mode 100644 index 000000000..b43129820 --- /dev/null +++ b/ct/npmplus.sh @@ -0,0 +1,41 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/ZoeyVid/NPMplus + +APP="NPMplus" +var_tags="proxy;nginx" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \ + "1" "Check for Alpine Updates" ON \ + 3>&1 1>&2 2>&3) + + header_info + if [ "$UPD" == "1" ]; then + apk update && apk upgrade + exit + fi +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:81${CL}" diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh new file mode 100644 index 000000000..a71a8aa38 --- /dev/null +++ b/install/npmplus-install.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/ZoeyVid/NPMplus + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apk add \ + newt \ + curl \ + openssh \ + tzdata \ + nano \ + gawk \ + yq \ + mc + +msg_ok "Installed Dependencies" + +msg_info "Installing Docker & Compose" +$STD apk add docker +$STD rc-service docker start +$STD rc-update add docker default + +get_latest_release() { + curl -sL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4 +} +DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose") +DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} +mkdir -p $DOCKER_CONFIG/cli-plugins +curl -sSL https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_LATEST_VERSION/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose +chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose +msg_ok "Installed Docker & Compose" + +msg_info "Fetching NPMplus" +cd /opt +wget -q https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/compose.yaml +msg_ok "Fetched NPMplus" + +attempts=0 +while true; do + read -r -p "Enter your TZ Identifier (e.g., Europe/Berlin): " TZ_INPUT + if validate_tz "$TZ_INPUT"; then + break + fi + msg_error "Invalid timezone! Please enter a valid TZ identifier." + + attempts=$((attempts + 1)) + if [[ "$attempts" -ge 3 ]]; then + msg_error "Maximum attempts reached. Exiting." + exit 1 + fi +done + +read -r -p "Enter your ACME Email: " ACME_EMAIL_INPUT + +yq -i " + .services.npmplus.environment |= + (map(select(. != \"TZ=*\" and . != \"ACME_EMAIL=*\")) + + [\"TZ=$TZ_INPUT\", \"ACME_EMAIL=$ACME_EMAIL_INPUT\"]) +" /opt/compose.yaml + +msg_info "Building and Starting NPMplus (Patience)" +$STD docker compose up -d +CONTAINER_ID="" +for i in {1..60}; do + CONTAINER_ID=$(docker ps --filter "name=npmplus" --format "{{.ID}}") + if [[ -n "$CONTAINER_ID" ]]; then + STATUS=$(docker inspect --format '{{.State.Health.Status}}' "$CONTAINER_ID" 2>/dev/null || echo "starting") + if [[ "$STATUS" == "healthy" ]]; then + msg_ok "NPMplus is running and healthy" + break + elif [[ "$STATUS" == "unhealthy" ]]; then + msg_error "NPMplus container is unhealthy! Check logs." + docker logs "$CONTAINER_ID" + exit 1 + fi + fi + sleep 2 + [[ $i -eq 60 ]] && msg_error "NPMplus container did not become healthy within 120s." && docker logs "$CONTAINER_ID" && exit 1 +done +msg_ok "Builded and started NPMplus" + +motd_ssh +customize + +msg_info "Retrieving Default Login (Patience)" +for i in {1..60}; do + PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | awk '/Creating a new user:/ {print; exit}') + if [[ -n "$PASSWORD_LINE" ]]; then + PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}') + echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd + msg_ok "Saved default login to /opt/.npm_pwd" + exit 0 + fi + sleep 2 + [[ $i -eq 60 ]] && msg_error "Failed to retrieve default login credentials." && exit 1 +done diff --git a/json/npmplus.json b/json/npmplus.json new file mode 100644 index 000000000..c3f39124f --- /dev/null +++ b/json/npmplus.json @@ -0,0 +1,54 @@ +{ + "name": "NPMplus", + "slug": "npmplus", + "categories": [ + 21 + ], + "date_created": "2025-03-13", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 81, + "documentation": null, + "website": "https://github.com/ZoeyVid/NPMplus", + "logo": "https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/frontend/app-images/logo-256.png", + "description": "NPMplus is an enhanced version of Nginx Proxy Manager. It simplifies the process of setting up reverse proxies with TLS termination through a user-friendly web interface. Key features include HTTP/3 support, integration with CrowdSec IPS, inclusion of GoAccess for real-time log analysis, and support for ModSecurity with the Core Rule Set.", + "install_methods": [ + { + "type": "default", + "script": "ct/npmplus.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "alpine", + "version": "3.21" + } + }, + { + "type": "alpine", + "script": "ct/npmplus.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "The initial starting process can be take 1-2min. ", + "type": "info" + }, + { + "text": "Application credentials: Β΄cat /opt/.npm_pwdΒ΄", + "type": "info" + } + ] +} From 7aebd12d87b3faf01dacd32b1be5dde0599c9d07 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:34:06 +0100 Subject: [PATCH 034/258] Update .app files (#3054) Co-authored-by: GitHub Actions --- ct/headers/npmplus | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/npmplus diff --git a/ct/headers/npmplus b/ct/headers/npmplus new file mode 100644 index 000000000..9920f2976 --- /dev/null +++ b/ct/headers/npmplus @@ -0,0 +1,6 @@ + _ ______ __ ___ __ + / | / / __ \/ |/ /___ / /_ _______ + / |/ / /_/ / /|_/ / __ \/ / / / / ___/ + / /| / ____/ / / / /_/ / / /_/ (__ ) +/_/ |_/_/ /_/ /_/ .___/_/\__,_/____/ + /_/ From 6953a7779b82a72d62de772b649e9cc09db97834 Mon Sep 17 00:00:00 2001 From: Chris <67816022+vhsdream@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:35:10 -0400 Subject: [PATCH 035/258] Update Fluid Calendar for v1.2.0 (#3053) This commit breaks up the npm commands due to some breaking changes. It also modifies the env file to remove deprecated options and adds new ones. --- ct/fluid-calendar.sh | 6 ++++-- install/fluid-calendar-install.sh | 25 +++++++++---------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/ct/fluid-calendar.sh b/ct/fluid-calendar.sh index 7c142f78a..f6721d547 100644 --- a/ct/fluid-calendar.sh +++ b/ct/fluid-calendar.sh @@ -46,8 +46,10 @@ function update_script() { cp -rf ${APP}-${RELEASE}/* /opt/fluid-calendar cd /opt/fluid-calendar export NEXT_TELEMETRY_DISABLED=1 - $STD npm run setup - $STD npm run build + $STD npm install --legacy-peer-deps + $STD npm run prisma:generate + $STD npm run prisma:migrate + $STD npm run build:os msg_ok "Updated $APP to v${RELEASE}" msg_info "Starting $APP" diff --git a/install/fluid-calendar-install.sh b/install/fluid-calendar-install.sh index aac13434c..5cc70f032 100644 --- a/install/fluid-calendar-install.sh +++ b/install/fluid-calendar-install.sh @@ -59,30 +59,23 @@ echo "${RELEASE}" >/opt/${APPLICATION}_version.txt cat </opt/fluid-calendar/.env DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}" -# For OAuth integration with Google Calendar -# See https://console.cloud.google.com -GOOGLE_CLIENT_ID="" -GOOGLE_CLIENT_SECRET="" - # Change the URL below to your external URL NEXTAUTH_URL="http://localhost:3000" +NEXT_PUBLIC_APP_URL="http://localhost:3000" NEXTAUTH_SECRET="${NEXTAUTH_SECRET}" +NEXT_PUBLIC_SITE_URL="http://localhost:3000" -# For optional Outlook Calendar Integration -# Create at https://portal.azure.com -AZURE_AD_CLIENT_ID="" -AZURE_AD_CLIENT_SECRET="" -AZURE_AD_TENANT_ID="" +NEXT_PUBLIC_ENABLE_SAAS_FEATURES=false -# Logging configuration -# Options: debug, none (check logger.js for more details) -LOG_LEVEL="none" -DEBUG_ENABLED=0 +RESEND_API_KEY= +RESEND_EMAIL= EOF export NEXT_TELEMETRY_DISABLED=1 cd /opt/fluid-calendar -$STD npm run setup -$STD npm run build +$STD npm install --legacy-peer-deps +$STD npm run prisma:generate +$STD npm run prisma:migrate +$STD npm run build:os msg_ok "Setup ${APPLICATION}" msg_info "Creating Service" From d1528d4ba72925d968d7d4caa8bead34e9c820d6 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:40:40 +0100 Subject: [PATCH 036/258] fix copy ` backtick --- json/npmplus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/npmplus.json b/json/npmplus.json index c3f39124f..1d655d5de 100644 --- a/json/npmplus.json +++ b/json/npmplus.json @@ -47,7 +47,7 @@ "type": "info" }, { - "text": "Application credentials: Β΄cat /opt/.npm_pwdΒ΄", + "text": "Application credentials: `cat /opt/.npm_pwd`", "type": "info" } ] From 127390c917e7e383f43e43cd603e9fbddc593482 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:54:50 +0100 Subject: [PATCH 037/258] Alpine-Install (core) add timezone (tz) check (#3057) --- misc/alpine-install.func | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/misc/alpine-install.func b/misc/alpine-install.func index 019c291e5..636be6485 100644 --- a/misc/alpine-install.func +++ b/misc/alpine-install.func @@ -179,6 +179,11 @@ motd_ssh() { fi } +# Validate Timezone for some LXC's +validate_tz() { + [[ -f "/usr/share/zoneinfo/$1" ]] +} + # This function customizes the container and enables passwordless login for the root user customize() { if [[ "$PASSWORD" == "" ]]; then From 0dc526af08b762635e74611ddae2a95388466705 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:56:14 +0100 Subject: [PATCH 038/258] Update CHANGELOG.md (#3052) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cd664914..36747a7da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,9 +16,18 @@ All LXC instances created using this repository come pre-installed with Midnight ## 2025-03-13 +### πŸ†• New Scripts + + - NPMplus [@MickLesk](https://github.com/MickLesk) ([#3051](https://github.com/community-scripts/ProxmoxVE/pull/3051)) + ### πŸš€ Updated Scripts - - Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) + - alpine-Install (core) add timezone (tz) check [@MickLesk](https://github.com/MickLesk) ([#3057](https://github.com/community-scripts/ProxmoxVE/pull/3057)) +- Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) + + - #### 🐞 Bug Fixes + + - Update Fluid Calendar for v1.2.0 [@vhsdream](https://github.com/vhsdream) ([#3053](https://github.com/community-scripts/ProxmoxVE/pull/3053)) ### 🧰 Maintenance @@ -30,6 +39,10 @@ All LXC instances created using this repository come pre-installed with Midnight - Bump @babel/runtime from 7.26.0 to 7.26.10 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3044](https://github.com/community-scripts/ProxmoxVE/pull/3044)) + - #### πŸ“ Script Information + + - Website: Fix Alpine "undefined" Link [@MickLesk](https://github.com/MickLesk) ([#3048](https://github.com/community-scripts/ProxmoxVE/pull/3048)) + ## 2025-03-12 ### πŸ†• New Scripts From c59c79677469bc4836fdd97b2627dce5528a64a1 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:35:03 +0100 Subject: [PATCH 039/258] Update npmplus-install.sh --- install/npmplus-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index a71a8aa38..ed1a52b1c 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -93,7 +93,7 @@ msg_ok "Builded and started NPMplus" motd_ssh customize -msg_info "Retrieving Default Login (Patience)" +echo -e "Retrieving Default Login (Patience)" for i in {1..60}; do PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | awk '/Creating a new user:/ {print; exit}') if [[ -n "$PASSWORD_LINE" ]]; then @@ -103,5 +103,5 @@ for i in {1..60}; do exit 0 fi sleep 2 - [[ $i -eq 60 ]] && msg_error "Failed to retrieve default login credentials." && exit 1 + [[ $i -eq 60 ]] && echo -e "Failed to retrieve default login credentials." && exit 1 done From 09cca741478170d1bba222e1f08a1134306d636e Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:35:37 +0100 Subject: [PATCH 040/258] Update npmplus-install.sh --- install/npmplus-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index ed1a52b1c..8ed55e6a9 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -103,5 +103,5 @@ for i in {1..60}; do exit 0 fi sleep 2 - [[ $i -eq 60 ]] && echo -e "Failed to retrieve default login credentials." && exit 1 + [[ $i -eq 60 ]] && echo -e "Failed to retrieve default login credentials. Please try it manually (docker ps, docker logs)" && exit 1 done From bad18f77cbcc1f2a67854abc312fece14e9ecb0d Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:40:53 +0100 Subject: [PATCH 041/258] Update npmplus-install.sh --- install/npmplus-install.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index 8ed55e6a9..eee851e24 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -93,15 +93,16 @@ msg_ok "Builded and started NPMplus" motd_ssh customize -echo -e "Retrieving Default Login (Patience)" +msg_info "Retrieving Default Login (Patience)" for i in {1..60}; do PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | awk '/Creating a new user:/ {print; exit}') if [[ -n "$PASSWORD_LINE" ]]; then PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}') echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd msg_ok "Saved default login to /opt/.npm_pwd" - exit 0 + return 0 fi sleep 2 - [[ $i -eq 60 ]] && echo -e "Failed to retrieve default login credentials. Please try it manually (docker ps, docker logs)" && exit 1 done +echo -e "Failed to retrieve default login credentials. Please try manually: docker ps, docker logs" +return 1 From efd5f1944bc5c2a00cda15c7db9e56e513fb31e9 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:50:24 +0100 Subject: [PATCH 042/258] Update CHANGELOG.md (#3060) --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36747a7da..9fa6c3b82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,15 +22,16 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - alpine-Install (core) add timezone (tz) check [@MickLesk](https://github.com/MickLesk) ([#3057](https://github.com/community-scripts/ProxmoxVE/pull/3057)) -- Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) - - #### 🐞 Bug Fixes - Update Fluid Calendar for v1.2.0 [@vhsdream](https://github.com/vhsdream) ([#3053](https://github.com/community-scripts/ProxmoxVE/pull/3053)) ### 🧰 Maintenance + - #### πŸ’Ύ Core + + - alpine-Install (core) add timezone (tz) check [@MickLesk](https://github.com/MickLesk) ([#3057](https://github.com/community-scripts/ProxmoxVE/pull/3057)) + - #### πŸ“‚ Github - New Workflow: Close Issues in DEV Repo when new Script is merged [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3042](https://github.com/community-scripts/ProxmoxVE/pull/3042)) @@ -41,6 +42,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) - Website: Fix Alpine "undefined" Link [@MickLesk](https://github.com/MickLesk) ([#3048](https://github.com/community-scripts/ProxmoxVE/pull/3048)) ## 2025-03-12 From b774ad37c167dda8a635e53dc2f8a5785e266afe Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:01:00 +0100 Subject: [PATCH 043/258] Update npmplus-install.sh --- install/npmplus-install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index eee851e24..45fb3abf6 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -104,5 +104,3 @@ for i in {1..60}; do fi sleep 2 done -echo -e "Failed to retrieve default login credentials. Please try manually: docker ps, docker logs" -return 1 From 57b5852f91fd3ba243c9c1b880bb4454bada46eb Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:38:55 +0100 Subject: [PATCH 044/258] Update npmplus-install.sh --- install/npmplus-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index 45fb3abf6..ae84fcc42 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -100,7 +100,6 @@ for i in {1..60}; do PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}') echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd msg_ok "Saved default login to /opt/.npm_pwd" - return 0 fi sleep 2 done From e10574e7246f201f4e2e07f70d5c87ab901eec1e Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:53:27 +0100 Subject: [PATCH 045/258] Update npmplus-install.sh --- install/npmplus-install.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index ae84fcc42..d61d3effd 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -94,12 +94,19 @@ motd_ssh customize msg_info "Retrieving Default Login (Patience)" +PASSWORD_FOUND=0 for i in {1..60}; do - PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | awk '/Creating a new user:/ {print; exit}') + PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | grep -m1 "Creating a new user:") if [[ -n "$PASSWORD_LINE" ]]; then PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}') echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd msg_ok "Saved default login to /opt/.npm_pwd" + PASSWORD_FOUND=1 + break fi sleep 2 done + +if [[ $PASSWORD_FOUND -eq 0 ]]; then + msg_ok "No default login found, use docker ps & docker logs for container password." +fi From 72b35646bb130046587dceaf238c2e29665b0538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Thu, 13 Mar 2025 22:28:49 +0100 Subject: [PATCH 046/258] OpenWebUI check if there are stashed changes before poping (#3064) --- ct/openwebui.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ct/openwebui.sh b/ct/openwebui.sh index 7c6100a37..14a45f5e9 100644 --- a/ct/openwebui.sh +++ b/ct/openwebui.sh @@ -46,7 +46,9 @@ function update_script() { cd ./backend $STD pip install -r requirements.txt -U cp -rf /opt/open-webui-backup/* /opt/open-webui/backend - $STD git stash pop + if git stash list | grep -q 'stash@{'; then + $STD git stash pop + fi systemctl start open-webui.service msg_ok "Updated Successfully" exit From 936a526de30cd579cd3ec4c3724cebbd8f8abbf2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:20:24 +0100 Subject: [PATCH 047/258] Update CHANGELOG.md (#3065) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fa6c3b82..f02d4d4e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - OpenWebUI check if there are stashed changes before poping [@tremor021](https://github.com/tremor021) ([#3064](https://github.com/community-scripts/ProxmoxVE/pull/3064)) - Update Fluid Calendar for v1.2.0 [@vhsdream](https://github.com/vhsdream) ([#3053](https://github.com/community-scripts/ProxmoxVE/pull/3053)) ### 🧰 Maintenance From b95e6ec9cf9dbbec09d18cf55709bbe408386b03 Mon Sep 17 00:00:00 2001 From: Dave Yap Date: Fri, 14 Mar 2025 21:28:26 +0800 Subject: [PATCH 048/258] Seafile - Minor bug fix: domain.sh script fix (#3046) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create zitadel-install.sh * Create zitadel.json * Create zitadel.sh * Update zitadel.sh Edit reference back to upstream build.func * Update zitadel.json Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel.sh Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel.sh Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel.sh Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel.sh Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel.sh * Update zitadel-install.sh Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel-install.sh Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> * Update zitadel.sh Co-authored-by: bvdberg01 <74251551+bvdberg01@users.noreply.github.com> * Update zitadel.json Co-authored-by: bvdberg01 <74251551+bvdberg01@users.noreply.github.com> * Use declared variables in config files * Remove other architectures * Update to fit changes requested Include mc for install; removal of variable ARCH and put into direct links; correct the default resources required * Update zitadel.sh Co-authored-by: bvdberg01 <74251551+bvdberg01@users.noreply.github.com> * Update zitadel-install.sh Co-authored-by: bvdberg01 <74251551+bvdberg01@users.noreply.github.com> * Update zitadel-install.sh Co-authored-by: bvdberg01 <74251551+bvdberg01@users.noreply.github.com> * Made changes to fit suggestions * Update zitadel-install.sh correct version output * Update zitadel-install.sh * Update path for version.txt * Set update part default to our project defaults * Update zitadel.sh, Remove v befor ${RELEASE} * Update zitadel-install.sh * Created Seafile script * Update seafile-install.sh Removed sudo and tarball when cleaning up. * Update seafile-install.sh * Updated script Corrected source and remove comments * Move dependencies Move Python installation and dependencies down to Python block. Fix typos. * Update seafile-install.sh Missing -y * Fix typo * Remove python lib deps version pinning * Update seafile-install.sh * Use generated password instead of plain text * Change reference * Reset reference * Update seafile-install.sh * Update seafile.json * Fix syntax error * Fix uploading files error and broken MOTD * Fix systemd file and corrected domain.sh script * Added better explanation of domain.sh script usage * Edited script creation date --------- Co-authored-by: SlaviΕ‘a AreΕΎina <58952836+tremor021@users.noreply.github.com> Co-authored-by: bvdberg01 <74251551+bvdberg01@users.noreply.github.com> Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com> Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> --- install/seafile-install.sh | 18 +++++--- json/seafile.json | 90 +++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/install/seafile-install.sh b/install/seafile-install.sh index 3e3776a39..48efb0fcc 100644 --- a/install/seafile-install.sh +++ b/install/seafile-install.sh @@ -188,6 +188,8 @@ msg_info "Adjusting Conf files" sed -i "0,/127.0.0.1/s/127.0.0.1/0.0.0.0/" /opt/seafile/conf/gunicorn.conf.py sed -i "0,/SERVICE_URL = \"http:\/\/$IP\"/s/SERVICE_URL = \"http:\/\/$IP\"/SERVICE_URL = \"http:\/\/$IP:8000\"/" /opt/seafile/conf/seahub_settings.py echo -e "\nFILE_SERVER_ROOT = \"http://$IP:8082\"" >> /opt/seafile/conf/seahub_settings.py +echo -e "CSRF_TRUSTED_ORIGINS = [\"http://$IP/\"]" >> /opt/seafile/conf/seahub_settings.py +echo -e "ALLOWED_HOSTS = [\"$IP\"]" >> /opt/seafile/conf/seahub_settings.py echo -e "CSRF_TRUSTED_ORIGINS = ['http://$IP/']" >> /opt/seafile/conf/seahub_settings.py msg_ok "Conf files adjusted" @@ -224,14 +226,15 @@ After=network.target mysql.service memcached.service Wants=mysql.service memcached.service [Service] -Type=forking +Type=oneshot User=seafile Group=seafile WorkingDirectory=/opt/seafile +RemainAfterExit=yes -ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start -ExecStartPost=/opt/seafile/seafile-server-latest/seahub.sh start -ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop +ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start +ExecStart=/opt/seafile/seafile-server-latest/seahub.sh start +ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop Restart=on-failure @@ -265,8 +268,13 @@ IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) DOMAIN_NOSCHEME=$(echo $DOMAIN | sed 's|^https://||') #Change the CORS to provided domain -sed -i "s|CSRF_TRUSTED_ORIGINS = ['http://$IP:8000/']|CSRF_TRUSTED_ORIGINS = ['$DOMAIN']|g" /opt/seafile/conf/seahub_settings.py +sed -i "s|SERVICE_URL = \"http://$IP:8000\"|SERVICE_URL = \"$DOMAIN\"|g" /opt/seafile/conf/seahub_settings.py +sed -i "s|CSRF_TRUSTED_ORIGINS = \[\"http://$IP/\"\]|CSRF_TRUSTED_ORIGINS = \[\"$DOMAIN/\"\]|g" /opt/seafile/conf/seahub_settings.py sed -i "s|FILE_SERVER_ROOT = \"http://$IP:8082\"|FILE_SERVER_ROOT = \"$DOMAIN/seafhttp\"|g" /opt/seafile/conf/seahub_settings.py +sed -i "s|ALLOWED_HOSTS = \[\"$IP\"\]|ALLOWED_HOSTS = \[\"\.$DOMAIN_NOSCHEME\"\]|g" /opt/seafile/conf/seahub_settings.py + +systemctl restart seafile +echo "Seafile server restarted! Access it at $DOMAIN." EOF chmod +x ~/domain.sh msg_ok "Bash Script for Domain access created" diff --git a/json/seafile.json b/json/seafile.json index ea7336a60..c26172013 100644 --- a/json/seafile.json +++ b/json/seafile.json @@ -1,47 +1,47 @@ { - "name": "Seafile", - "slug": "Seafile", - "categories": [ - 12 - ], - "date_created": "2025-03-11", - "type": "ct", - "updateable": false, - "privileged": false, - "interface_port": 8000, - "documentation": "https://manual.seafile.com/11.0/deploy", - "website": "https://seafile.com", - "logo": "https://manual.seafile.com/11.0/media/seafile-transparent-1024.png", - "description": "Seafile is an open source file sync and share platform, focusing on reliability and performance.", - "install_methods": [ - { - "type": "default", - "script": "ct/seafile.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 20, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "Application credentials: `cat ~/seafile.creds`", - "type": "info" + "name": "Seafile", + "slug": "Seafile", + "categories": [ + 12 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8000, + "documentation": "https://manual.seafile.com/11.0/deploy", + "website": "https://seafile.com", + "logo": "https://manual.seafile.com/11.0/media/seafile-transparent-1024.png", + "description": "Seafile is an open source file sync and share platform, focusing on reliability and performance.", + "install_methods": [ + { + "type": "default", + "script": "ct/seafile.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 20, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null }, - { - "text": "Change STORAGE_DIR value in `external-storage.sh` and run `bash external-storage.sh` to use your defined storage instead of internal.", - "type": "info" - }, - { - "text": "Execute `~/domain.sh ` to enable access to Seafile via your domain", - "type": "info" - } - ] -} + "notes": [ + { + "text": "Application credentials: `cat ~/seafile.creds`", + "type": "info" + }, + { + "text": "Change STORAGE_DIR value in `external-storage.sh` and run `bash external-storage.sh` to use your defined storage instead of internal.", + "type": "info" + }, + { + "text": "Execute `~/domain.sh ` to enable access to Seafile via your domain. Example: ~/domain.sh https://seafile.example.com", + "type": "info" + } + ] +} \ No newline at end of file From 66c4d0e03f474ec588354925dbeb8177a9ae73bf Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:30:20 +0100 Subject: [PATCH 049/258] Update CHANGELOG.md (#3076) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f02d4d4e5..a44cc4988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-14 + +### πŸš€ Updated Scripts + + - Seafile - Minor bug fix: domain.sh script fix [@dave-yap](https://github.com/dave-yap) ([#3046](https://github.com/community-scripts/ProxmoxVE/pull/3046)) + ## 2025-03-13 ### πŸ†• New Scripts From 4cc1ab728c2aff70145238ae66a12719f8a26e0c Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Fri, 14 Mar 2025 18:50:27 +0100 Subject: [PATCH 050/258] Memos: Increase RAM Usage and max space (#3072) --- ct/memos.sh | 3 ++- install/memos-install.sh | 3 ++- json/memos.json | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ct/memos.sh b/ct/memos.sh index b19d72690..bb80994a0 100644 --- a/ct/memos.sh +++ b/ct/memos.sh @@ -8,7 +8,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m APP="Memos" var_tags="notes" var_cpu="2" -var_ram="2048" +var_ram="3072" var_disk="7" var_os="debian" var_version="12" @@ -36,6 +36,7 @@ function update_script() { exit fi systemctl stop memos + export NODE_OPTIONS="--max-old-space-size=2048" cd /opt/memos/web $STD pnpm i --frozen-lockfile $STD pnpm build diff --git a/install/memos-install.sh b/install/memos-install.sh index a849ac23c..191843915 100644 --- a/install/memos-install.sh +++ b/install/memos-install.sh @@ -52,7 +52,8 @@ msg_ok "Installed Golang" msg_info "Installing Memos (Patience)" mkdir -p /opt/memos_data -$STD sudo git clone https://github.com/usememos/memos.git /opt/memos +export NODE_OPTIONS="--max-old-space-size=2048" +$STD git clone https://github.com/usememos/memos.git /opt/memos cd /opt/memos/web $STD pnpm i --frozen-lockfile $STD pnpm build diff --git a/json/memos.json b/json/memos.json index 0d6ed537d..84433fd61 100644 --- a/json/memos.json +++ b/json/memos.json @@ -19,7 +19,7 @@ "script": "ct/memos.sh", "resources": { "cpu": 2, - "ram": 2048, + "ram": 3072, "hdd": 7, "os": "debian", "version": "12" @@ -31,4 +31,4 @@ "password": null }, "notes": [] -} \ No newline at end of file +} From 077e49c5c91b4b34b9e48b407dbb704dfdbff84f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:57:24 +0100 Subject: [PATCH 051/258] Update CHANGELOG.md (#3082) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a44cc4988..979ca47a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - Seafile - Minor bug fix: domain.sh script fix [@dave-yap](https://github.com/dave-yap) ([#3046](https://github.com/community-scripts/ProxmoxVE/pull/3046)) + - Memos: Increase RAM Usage and max space [@MickLesk](https://github.com/MickLesk) ([#3072](https://github.com/community-scripts/ProxmoxVE/pull/3072)) +- Seafile - Minor bug fix: domain.sh script fix [@dave-yap](https://github.com/dave-yap) ([#3046](https://github.com/community-scripts/ProxmoxVE/pull/3046)) ## 2025-03-13 From ea05730868d7a9a59a589761c2a5a3ce92d2c92e Mon Sep 17 00:00:00 2001 From: Zhenyu Qi Date: Fri, 14 Mar 2025 14:07:15 -0700 Subject: [PATCH 052/258] Update openwrt.sh (#3084) --- vm/openwrt.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/openwrt.sh b/vm/openwrt.sh index 60192ae7e..ea0474e58 100644 --- a/vm/openwrt.sh +++ b/vm/openwrt.sh @@ -315,7 +315,7 @@ function advanced_settings() { exit-script fi - if LAN_NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a router netmmask" 8 58 $LAN_NETMASK --title "LAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if LAN_NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a router netmask" 8 58 $LAN_NETMASK --title "LAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $LAN_NETMASK ]; then LAN_NETMASK="255.255.255.0" fi From f9c7717719f783cfccb1ab2bcbf9888306dfd829 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:31:29 +0100 Subject: [PATCH 053/258] Update npmplus.json (#3085) --- json/npmplus.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/json/npmplus.json b/json/npmplus.json index 1d655d5de..cb0d5ceb0 100644 --- a/json/npmplus.json +++ b/json/npmplus.json @@ -42,6 +42,10 @@ "password": null }, "notes": [ + { + "text": "This uses Docker under the hood, as this can not easily be installed bare-metal. ", + "type": "info" + }, { "text": "The initial starting process can be take 1-2min. ", "type": "info" From 46016dc3da5f60743a7e76824e0cd46574ac96e7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:37:30 +0100 Subject: [PATCH 054/258] Update CHANGELOG.md (#3088) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 979ca47a1..3e91af36a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,12 @@ All LXC instances created using this repository come pre-installed with Midnight - Memos: Increase RAM Usage and max space [@MickLesk](https://github.com/MickLesk) ([#3072](https://github.com/community-scripts/ProxmoxVE/pull/3072)) - Seafile - Minor bug fix: domain.sh script fix [@dave-yap](https://github.com/dave-yap) ([#3046](https://github.com/community-scripts/ProxmoxVE/pull/3046)) +### 🌐 Website + + - #### πŸ“ Script Information + + - NPM: Add info about docker use. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3085](https://github.com/community-scripts/ProxmoxVE/pull/3085)) + ## 2025-03-13 ### πŸ†• New Scripts From 0a9eb5078ae50c12d8cc19fd626b310b54cfd0fc Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:48:22 +0100 Subject: [PATCH 055/258] Update CHANGELOG.md (#3089) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e91af36a..e39e766d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,11 +21,15 @@ All LXC instances created using this repository come pre-installed with Midnight - Memos: Increase RAM Usage and max space [@MickLesk](https://github.com/MickLesk) ([#3072](https://github.com/community-scripts/ProxmoxVE/pull/3072)) - Seafile - Minor bug fix: domain.sh script fix [@dave-yap](https://github.com/dave-yap) ([#3046](https://github.com/community-scripts/ProxmoxVE/pull/3046)) + - #### 🐞 Bug Fixes + + - openwrt: fix typo netmask [@qzydustin](https://github.com/qzydustin) ([#3084](https://github.com/community-scripts/ProxmoxVE/pull/3084)) + ### 🌐 Website - #### πŸ“ Script Information - - NPM: Add info about docker use. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3085](https://github.com/community-scripts/ProxmoxVE/pull/3085)) + - NPMplus: Add info about docker use. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3085](https://github.com/community-scripts/ProxmoxVE/pull/3085)) ## 2025-03-13 From 0b014d25be308080665bea744b400e32f237473a Mon Sep 17 00:00:00 2001 From: Chris <67816022+vhsdream@users.noreply.github.com> Date: Sat, 15 Mar 2025 04:06:20 -0400 Subject: [PATCH 056/258] Homepage: Bugfix for v1.0.0 (#3092) * (for revert)modify func files * KSS --- ct/homepage.sh | 9 +++++++-- install/homepage-install.sh | 11 +++++++---- json/homepage.json | 8 ++++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ct/homepage.sh b/ct/homepage.sh index 56e587f74..487b8abbd 100644 --- a/ct/homepage.sh +++ b/ct/homepage.sh @@ -8,8 +8,8 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m APP="Homepage" var_tags="dashboard" var_cpu="2" -var_ram="1024" -var_disk="3" +var_ram="4096" +var_disk="6" var_os="debian" var_version="12" var_unprivileged="1" @@ -35,6 +35,7 @@ function update_script() { echo "Installed NPM..." fi fi + LOCAL_IP=$(hostname -I | awk '{print $1}') RELEASE=$(curl -s https://api.github.com/repos/gethomepage/homepage/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then msg_info "Updating Homepage to v${RELEASE} (Patience)" @@ -49,7 +50,11 @@ function update_script() { $STD npx --yes update-browserslist-db@latest export NEXT_PUBLIC_VERSION="v$RELEASE" export NEXT_PUBLIC_REVISION="source" + export NEXT_TELEMETRY_DISABLED=1 $STD pnpm build + if [[ ! -f /opt/homepage/.env ]]; then + echo "HOMEPAGE_ALLOWED_HOSTS=localhost:3000,${LOCAL_IP}:3000" > /opt/homepage/.env + fi systemctl start homepage echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated Homepage to v${RELEASE}" diff --git a/install/homepage-install.sh b/install/homepage-install.sh index b0e086e12..02f3c5f4a 100644 --- a/install/homepage-install.sh +++ b/install/homepage-install.sh @@ -14,10 +14,10 @@ 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 curl \ + sudo \ + mc \ + gpg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -32,6 +32,7 @@ $STD apt-get install -y nodejs $STD npm install -g pnpm msg_ok "Installed Node.js" +LOCAL_IP=$(hostname -I | awk '{print $1}') RELEASE=$(curl -s https://api.github.com/repos/gethomepage/homepage/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') msg_info "Installing Homepage v${RELEASE} (Patience)" wget -q https://github.com/gethomepage/homepage/archive/refs/tags/v${RELEASE}.tar.gz @@ -45,7 +46,9 @@ cp /opt/homepage/src/skeleton/* /opt/homepage/config $STD pnpm install export NEXT_PUBLIC_VERSION="v$RELEASE" export NEXT_PUBLIC_REVISION="source" +export NEXT_TELEMETRY_DISABLED=1 $STD pnpm build +echo "HOMEPAGE_ALLOWED_HOSTS=localhost:3000,${LOCAL_IP}:3000" > /opt/homepage/.env echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed Homepage v${RELEASE}" diff --git a/json/homepage.json b/json/homepage.json index 04ddc3a8d..30002b3de 100644 --- a/json/homepage.json +++ b/json/homepage.json @@ -19,8 +19,8 @@ "script": "ct/homepage.sh", "resources": { "cpu": 2, - "ram": 1024, - "hdd": 3, + "ram": 4096, + "hdd": 6, "os": "debian", "version": "12" } @@ -34,6 +34,10 @@ { "text": "Configuration (bookmarks.yaml, services.yaml, widgets.yaml) path: `/opt/homepage/config/`", "type": "info" + }, + { + "text": "Add additional allowed hosts to `/opt/homepage/.env`", + "type": "info" } ] } From db3ab3c7f9bfd6f9826b3fc1405d51507436979f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 15 Mar 2025 18:30:05 +0100 Subject: [PATCH 057/258] Update CHANGELOG.md (#3095) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e39e766d5..77fd1fb02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-15 + +### πŸš€ Updated Scripts + + - #### πŸ’₯ Breaking Changes + + - Homepage: Bugfix for v1.0.0 [@vhsdream](https://github.com/vhsdream) ([#3092](https://github.com/community-scripts/ProxmoxVE/pull/3092)) + ## 2025-03-14 ### πŸš€ Updated Scripts From 584bf259daeb4f0424839fb5b2d180f6b097ef07 Mon Sep 17 00:00:00 2001 From: Xerovoxx98 Date: Sun, 16 Mar 2025 17:48:16 +1000 Subject: [PATCH 058/258] Fix hardcoded port in Debian service file (#3105) Debian service file contains a hard coded port. Update to use the $PORT variable instead. --- misc/filebrowser.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/filebrowser.sh b/misc/filebrowser.sh index 711a57675..479831c17 100644 --- a/misc/filebrowser.sh +++ b/misc/filebrowser.sh @@ -150,8 +150,8 @@ After=network-online.target User=root WorkingDirectory=/usr/local/community-scripts ExecStartPre=/bin/touch /usr/local/community-scripts/filebrowser.db -ExecStartPre=/usr/local/bin/filebrowser config set -a "0.0.0.0" -p 9000 -d /usr/local/community-scripts/filebrowser.db -ExecStart=/usr/local/bin/filebrowser -r / -d /usr/local/community-scripts/filebrowser.db -p 9000 +ExecStartPre=/usr/local/bin/filebrowser config set -a "0.0.0.0" -p ${PORT} -d /usr/local/community-scripts/filebrowser.db +ExecStart=/usr/local/bin/filebrowser -r / -d /usr/local/community-scripts/filebrowser.db -p ${PORT} Restart=always [Install] From 3d5021b2892b0a28f6b2d16e30b231420bf476e0 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 09:22:21 +0100 Subject: [PATCH 059/258] Update CHANGELOG.md (#3106) --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77fd1fb02..bc40615e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-16 + +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - Filebrowser: Fix hardcoded port in Debian service file [@Xerovoxx98](https://github.com/Xerovoxx98) ([#3105](https://github.com/community-scripts/ProxmoxVE/pull/3105)) + ## 2025-03-15 ### πŸš€ Updated Scripts From 08e0a6322bad444c31b9d371eb9029e3de33c608 Mon Sep 17 00:00:00 2001 From: Andy Grunwald Date: Sun, 16 Mar 2025 11:20:56 +0100 Subject: [PATCH 060/258] Prometheus PVE Exporter: Rightsizing RAM and Disk (#3098) * Prometheus PVE Exporter: Rightsizing RAM and Disk * Raise to 2GB, as setup is not working otherwise * Prometheus PVE Exporter: Set RAM to 512 --- ct/prometheus-pve-exporter.sh | 2 +- json/prometheus-pve-exporter.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/prometheus-pve-exporter.sh b/ct/prometheus-pve-exporter.sh index 4987f816a..78b034aa3 100644 --- a/ct/prometheus-pve-exporter.sh +++ b/ct/prometheus-pve-exporter.sh @@ -8,7 +8,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m APP="Prometheus-PVE-Exporter" var_tags="monitoring" var_cpu="1" -var_ram="1024" +var_ram="512" var_disk="2" var_os="debian" var_version="12" diff --git a/json/prometheus-pve-exporter.json b/json/prometheus-pve-exporter.json index eb4cb30c5..ecaa9df63 100644 --- a/json/prometheus-pve-exporter.json +++ b/json/prometheus-pve-exporter.json @@ -20,7 +20,7 @@ "script": "ct/prometheus-pve-exporter.sh", "resources": { "cpu": 1, - "ram": 1024, + "ram": 512, "hdd": 2, "os": "debian", "version": "12" From e4261b429a0ca3f2a6fd1ebab55459992d75b7ee Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 11:49:46 +0100 Subject: [PATCH 061/258] Update CHANGELOG.md (#3107) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc40615e3..a5ce68bcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts + - Prometheus PVE Exporter: Rightsizing RAM and Disk [@andygrunwald](https://github.com/andygrunwald) ([#3098](https://github.com/community-scripts/ProxmoxVE/pull/3098)) + - #### 🐞 Bug Fixes - Filebrowser: Fix hardcoded port in Debian service file [@Xerovoxx98](https://github.com/Xerovoxx98) ([#3105](https://github.com/community-scripts/ProxmoxVE/pull/3105)) From f84c12ecff5a3f69f0007b98cca5e2884e9a52f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sun, 16 Mar 2025 13:51:13 +0100 Subject: [PATCH 062/258] Add additional information on how to install languages (#3111) --- json/paperless-ngx.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/json/paperless-ngx.json b/json/paperless-ngx.json index ca1a265bf..e79b38fc4 100644 --- a/json/paperless-ngx.json +++ b/json/paperless-ngx.json @@ -34,6 +34,10 @@ { "text": "Show Login Credentials, type `update` in the LXC console", "type": "info" + }, + { + "text": "Script installs English as default OCR language. To install additional languages, use `apt-get install tesseract-ocr-[lang]`, where [lang] is the language code (e.g. `apt-get install tesseract-ocr-ger`).", + "type": "info" } ] } \ No newline at end of file From 9587d482352bcf19022f87ae88b22489c2660f9d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:48:11 +0100 Subject: [PATCH 063/258] Update CHANGELOG.md (#3112) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5ce68bcd..3d9bf349b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - Prometheus PVE Exporter: Rightsizing RAM and Disk [@andygrunwald](https://github.com/andygrunwald) ([#3098](https://github.com/community-scripts/ProxmoxVE/pull/3098)) + - Paperless-NGS: Add additional information to website on how to install OCR languages [@tremor021](https://github.com/tremor021) ([#3111](https://github.com/community-scripts/ProxmoxVE/pull/3111)) +- Prometheus PVE Exporter: Rightsizing RAM and Disk [@andygrunwald](https://github.com/andygrunwald) ([#3098](https://github.com/community-scripts/ProxmoxVE/pull/3098)) - #### 🐞 Bug Fixes From 1397d2dc1615ba8a22e5af856a16ca6fa0406fc9 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:49:18 +0100 Subject: [PATCH 064/258] Update CHANGELOG.md (#3113) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d9bf349b..81e621dfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - Paperless-NGS: Add additional information to website on how to install OCR languages [@tremor021](https://github.com/tremor021) ([#3111](https://github.com/community-scripts/ProxmoxVE/pull/3111)) + - Paperless-ngx: Add additional information to website on how to install OCR languages [@tremor021](https://github.com/tremor021) ([#3111](https://github.com/community-scripts/ProxmoxVE/pull/3111)) - Prometheus PVE Exporter: Rightsizing RAM and Disk [@andygrunwald](https://github.com/andygrunwald) ([#3098](https://github.com/community-scripts/ProxmoxVE/pull/3098)) - #### 🐞 Bug Fixes From 9c9550b446bdad626ae06bfd54938126e9ef784b Mon Sep 17 00:00:00 2001 From: Mathijs Groothuis Date: Sun, 16 Mar 2025 18:30:12 +0100 Subject: [PATCH 065/258] Typo Enviroment > Environment (#3115) --- install/nginxproxymanager-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/nginxproxymanager-install.sh b/install/nginxproxymanager-install.sh index ff5727f69..0cdc99a30 100644 --- a/install/nginxproxymanager-install.sh +++ b/install/nginxproxymanager-install.sh @@ -137,7 +137,7 @@ fi mkdir -p /app/global /app/frontend/images cp -r backend/* /app cp -r global/* /app/global -msg_ok "Set up Enviroment" +msg_ok "Set up Environment" msg_info "Building Frontend" cd ./frontend From 3b2db06fc19db365baceca607dd96373b8c4dde1 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 18:31:57 +0100 Subject: [PATCH 066/258] Update CHANGELOG.md (#3122) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81e621dfb..0e58a0d14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - Paperless-ngx: Add additional information to website on how to install OCR languages [@tremor021](https://github.com/tremor021) ([#3111](https://github.com/community-scripts/ProxmoxVE/pull/3111)) + - Typo Enviroment > Environment [@MathijsG](https://github.com/MathijsG) ([#3115](https://github.com/community-scripts/ProxmoxVE/pull/3115)) +- Paperless-ngx: Add additional information to website on how to install OCR languages [@tremor021](https://github.com/tremor021) ([#3111](https://github.com/community-scripts/ProxmoxVE/pull/3111)) - Prometheus PVE Exporter: Rightsizing RAM and Disk [@andygrunwald](https://github.com/andygrunwald) ([#3098](https://github.com/community-scripts/ProxmoxVE/pull/3098)) - #### 🐞 Bug Fixes From b1b08cd819850deb1ec8efa36e0d8b21095377bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sun, 16 Mar 2025 18:33:23 +0100 Subject: [PATCH 067/258] fix build.func path (#3121) --- ct/wger.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/wger.sh b/ct/wger.sh index 3b017dd76..09f92918f 100644 --- a/ct/wger.sh +++ b/ct/wger.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -s https://raw.githubusercontent.com/tremor021/ProxmoxVE/refs/heads/wger/misc/build.func) +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2025 community-scripts ORG # Author: SlaviΕ‘a AreΕΎina (tremor021) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE From fd77c53503d318dfc9f203c1a6356aec2d68ded9 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 18:53:53 +0100 Subject: [PATCH 068/258] Update CHANGELOG.md (#3123) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e58a0d14..131c98143 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - wger: Fix build.func path [@tremor021](https://github.com/tremor021) ([#3121](https://github.com/community-scripts/ProxmoxVE/pull/3121)) - Filebrowser: Fix hardcoded port in Debian service file [@Xerovoxx98](https://github.com/Xerovoxx98) ([#3105](https://github.com/community-scripts/ProxmoxVE/pull/3105)) ## 2025-03-15 From f6eac663a700b1cb6350f9dbc7d36ada3ad81f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sun, 16 Mar 2025 20:26:14 +0100 Subject: [PATCH 069/258] Fix dependencies (#3125) --- install/jellyseerr-install.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/install/jellyseerr-install.sh b/install/jellyseerr-install.sh index da9499c0b..f36ce5a67 100644 --- a/install/jellyseerr-install.sh +++ b/install/jellyseerr-install.sh @@ -14,11 +14,13 @@ 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 git -$STD apt-get install -y gpg +$STD apt-get install -y \ + curl \ + gnupg \ + mc \ + git \ + sudo \ + build-essential msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" From 82112e06df3e05b74ebd65ccba56099c3862c02a Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Sun, 16 Mar 2025 20:26:50 +0100 Subject: [PATCH 070/258] Website: Fix alpine-it-tools "undefined" Link (#3110) * Update alpine-it-tools.json * Update alpine-it-tools.json * Update alpine-it-tools.json * Update alpine-it-tools.json * Update alpine-it-tools.json * formatting * formatting * formatting --- json/alpine-it-tools.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/json/alpine-it-tools.json b/json/alpine-it-tools.json index 7919a585f..91c042aa2 100644 --- a/json/alpine-it-tools.json +++ b/json/alpine-it-tools.json @@ -14,6 +14,17 @@ "logo": "https://raw.githubusercontent.com/CorentinTh/it-tools/08d977b8cdb7ffb76adfa18ba6eb4b73795ec814/public/safari-pinned-tab.svg", "description": "IT-Tools is a web-based suite of utilities designed to streamline and simplify various IT tasks, providing tools for developers and system administrators to manage their workflows efficiently.", "install_methods": [ + { + "type": "default", + "script": "ct/alpine-it-tools.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 0.2, + "os": "alpine", + "version": "3.21" + } + }, { "type": "alpine", "script": "ct/alpine-it-tools.sh", From a2ad5f12685d7af56c2eea27b7ad1d43daea4a2e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 20:27:46 +0100 Subject: [PATCH 071/258] Update CHANGELOG.md (#3127) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 131c98143..0d07bdb52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,9 +24,16 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Jellyseerr: Fix dependencies [@tremor021](https://github.com/tremor021) ([#3125](https://github.com/community-scripts/ProxmoxVE/pull/3125)) - wger: Fix build.func path [@tremor021](https://github.com/tremor021) ([#3121](https://github.com/community-scripts/ProxmoxVE/pull/3121)) - Filebrowser: Fix hardcoded port in Debian service file [@Xerovoxx98](https://github.com/Xerovoxx98) ([#3105](https://github.com/community-scripts/ProxmoxVE/pull/3105)) +### 🌐 Website + + - #### πŸ“ Script Information + + - Website: Fix alpine-it-tools "undefined" Link [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3110](https://github.com/community-scripts/ProxmoxVE/pull/3110)) + ## 2025-03-15 ### πŸš€ Updated Scripts From 705cad87e2de024f9a982b986d279c31dd85c668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 17 Mar 2025 08:28:37 +0100 Subject: [PATCH 072/258] Add option for multiple accounts and generate JWT secret (#3132) --- install/bytestash-install.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/install/bytestash-install.sh b/install/bytestash-install.sh index 8d4d01b81..51a80eeac 100644 --- a/install/bytestash-install.sh +++ b/install/bytestash-install.sh @@ -33,6 +33,7 @@ $STD apt-get install -y nodejs msg_ok "Installed Node.js" msg_info "Installing ByteStash" +JWT_SECRET=$(openssl rand -base64 32 | tr -d '/+=') temp_file=$(mktemp) RELEASE=$(curl -s https://api.github.com/repos/jordan-dalby/ByteStash/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') wget -q "https://github.com/jordan-dalby/ByteStash/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file @@ -45,6 +46,8 @@ $STD npm install echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed ByteStash" +read -p "Do you want to allow registration of multiple accounts? [y/n]: " allowreg + msg_info "Creating Service" cat </etc/systemd/system/bytestash-backend.service [Unit] @@ -55,10 +58,16 @@ After=network.target WorkingDirectory=/opt/bytestash/server ExecStart=/usr/bin/node src/app.js Restart=always +Environment=JWT_SECRET=$JWT_SECRET [Install] WantedBy=multi-user.target EOF + +if [[ "$allowreg" =~ ^[Yy]$ ]]; then + sed -i '8i\Environment=ALLOW_NEW_ACCOUNTS=true' /etc/systemd/system/bytestash-backend.service +fi + cat </etc/systemd/system/bytestash-frontend.service [Unit] Description=ByteStash Frontend Service @@ -72,6 +81,7 @@ Restart=always [Install] WantedBy=multi-user.target EOF + systemctl enable -q --now bytestash-backend systemctl enable -q --now bytestash-frontend msg_ok "Created Service" From 3fb31522c31211edc9f593893a2eb4c3ade06ff7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 08:47:40 +0100 Subject: [PATCH 073/258] Update CHANGELOG.md (#3135) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d07bdb52..093e52bc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-17 + +### πŸš€ Updated Scripts + + - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) + ## 2025-03-16 ### πŸš€ Updated Scripts From 1cfae51790047c0eb9d647ecb5f1917ce605e0da Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:08:53 +0100 Subject: [PATCH 074/258] Kimai: Fix Permission Issue on new Timerecords (#3136) * Kimai: Fix Permission Issue on new Timerecords * Update kimai-install.sh * Update kimai.sh --- ct/kimai.sh | 3 +-- install/kimai-install.sh | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ct/kimai.sh b/ct/kimai.sh index 63c2f5056..98a7ae86f 100644 --- a/ct/kimai.sh +++ b/ct/kimai.sh @@ -57,9 +57,8 @@ function update_script() { chown -R :www-data . chmod -R g+r . chmod -R g+rw var/ - chmod -R 777 /opt/kimai/var/ + chmod -R 777 /opt/kimai/* chown -R www-data:www-data /opt/kimai - chmod -R 755 /opt/kimai echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ${APP} to ${RELEASE}" diff --git a/install/kimai-install.sh b/install/kimai-install.sh index bb308cd29..469194f2e 100644 --- a/install/kimai-install.sh +++ b/install/kimai-install.sh @@ -75,8 +75,8 @@ chown -R :www-data /opt/* chmod -R g+r /opt/* chmod -R g+rw /opt/* chown -R www-data:www-data /opt/* -chmod -R 755 /opt/* -chmod -R 777 /opt/kimai/var/ +chmod -R 777 /opt/* +chmod -R 777 /opt/kimai/* $STD expect < Date: Mon, 17 Mar 2025 10:55:16 +0100 Subject: [PATCH 075/258] Update kimai-install.sh --- install/kimai-install.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/install/kimai-install.sh b/install/kimai-install.sh index 469194f2e..85767f8a2 100644 --- a/install/kimai-install.sh +++ b/install/kimai-install.sh @@ -71,12 +71,6 @@ $STD composer install --no-dev --optimize-autoloader --no-interaction cp .env.dist .env sed -i "/^DATABASE_URL=/c\DATABASE_URL=mysql://$DB_USER:$DB_PASS@127.0.0.1:3306/$DB_NAME?charset=utf8mb4&serverVersion=$MYSQL_VERSION" /opt/kimai/.env $STD bin/console kimai:install -n -chown -R :www-data /opt/* -chmod -R g+r /opt/* -chmod -R g+rw /opt/* -chown -R www-data:www-data /opt/* -chmod -R 777 /opt/* -chmod -R 777 /opt/kimai/* $STD expect < Date: Mon, 17 Mar 2025 10:55:44 +0100 Subject: [PATCH 076/258] Update kimai.sh --- ct/kimai.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ct/kimai.sh b/ct/kimai.sh index 98a7ae86f..888d9c904 100644 --- a/ct/kimai.sh +++ b/ct/kimai.sh @@ -54,11 +54,6 @@ function update_script() { cd /opt/kimai $STD composer install --no-dev --optimize-autoloader $STD bin/console kimai:update - chown -R :www-data . - chmod -R g+r . - chmod -R g+rw var/ - chmod -R 777 /opt/kimai/* - chown -R www-data:www-data /opt/kimai echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ${APP} to ${RELEASE}" @@ -66,6 +61,14 @@ function update_script() { systemctl start apache2 msg_ok "Started Apache2" + msg_info "Setup Permissions" + chown -R :www-data /opt/* + chmod -R g+r /opt/* + chmod -R g+rw /opt/* + chown -R www-data:www-data /opt/* + chmod -R 777 /opt/* + msg_ok "Setup Permissions" + msg_info "Cleaning Up" rm -rf ${RELEASE}.zip rm -rf "$BACKUP_DIR" From c056163cf9e436c128c8ae118fcd8e774712e37f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:59:24 +0100 Subject: [PATCH 077/258] Update CHANGELOG.md (#3137) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 093e52bc6..0a916772d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ All LXC instances created using this repository come pre-installed with Midnight - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) + - #### 🐞 Bug Fixes + + - Kimai: Fix Permission Issue on new Timerecords [@MickLesk](https://github.com/MickLesk) ([#3136](https://github.com/community-scripts/ProxmoxVE/pull/3136)) + ## 2025-03-16 ### πŸš€ Updated Scripts From bff8879189ddba7515fddaafe938563b17103e2b Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 17 Mar 2025 13:13:49 +0100 Subject: [PATCH 078/258] InfluxDB: Add Ports as Info / Script-End (#3141) * InfluxDB: Add Ports as Info / Script-End * Update influxdb.sh --- ct/influxdb.sh | 2 +- json/influxdb.json | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ct/influxdb.sh b/ct/influxdb.sh index f4bfbbecb..1ef738aca 100644 --- a/ct/influxdb.sh +++ b/ct/influxdb.sh @@ -41,4 +41,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}:8086${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP} and Port 8888 for v1 or Port 8086 (v2)${CL}" diff --git a/json/influxdb.json b/json/influxdb.json index 0c38be749..7fac00d9c 100644 --- a/json/influxdb.json +++ b/json/influxdb.json @@ -30,5 +30,14 @@ "username": null, "password": null }, - "notes": [] -} \ No newline at end of file + "notes": [ + { + "text": "Port for V1: 8888", + "type": "info" + }, + { + "text": "Port for V2: 8086", + "type": "info" + } + ] +} From 07d9a8c85f886e5f369801798694e319ff67745e Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 17 Mar 2025 13:15:59 +0100 Subject: [PATCH 079/258] Tandoor: Switch Repo to new Link (#3140) --- install/tandoor-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/tandoor-install.sh b/install/tandoor-install.sh index 1b7983314..bc42a8e3d 100644 --- a/install/tandoor-install.sh +++ b/install/tandoor-install.sh @@ -54,13 +54,13 @@ $STD npm install -g yarn msg_ok "Installed Node.js" msg_info "Installing Tandoor (Patience)" -$STD git clone https://github.com/vabene1111/recipes.git -b master /opt/tandoor +$STD git clone https://github.com/TandoorRecipes/recipes -b master /opt/tandoor mkdir -p /opt/tandoor/{config,api,mediafiles,staticfiles} $STD pip3 install -r /opt/tandoor/requirements.txt cd /opt/tandoor/vue $STD yarn install $STD yarn build -wget -q https://raw.githubusercontent.com/vabene1111/recipes/develop/.env.template -O /opt/tandoor/.env +wget -q https://raw.githubusercontent.com/TandoorRecipes/recipes/develop/.env.template -O /opt/tandoor/.env DB_NAME=db_recipes DB_USER=tandoor DB_ENCODING=utf8 From 67fa61fad938627089841b76c49b7926abf19b51 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 13:16:18 +0100 Subject: [PATCH 080/258] Update CHANGELOG.md (#3144) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a916772d..1c48e41de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) + - InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) +- ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) - #### 🐞 Bug Fixes From 409f86c7eb08ec71a32843ee24daf888f58938b0 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 13:25:53 +0100 Subject: [PATCH 081/258] Update CHANGELOG.md (#3145) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c48e41de..e79a38587 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Tandoor: Switch Repo to new Link [@MickLesk](https://github.com/MickLesk) ([#3140](https://github.com/community-scripts/ProxmoxVE/pull/3140)) - Kimai: Fix Permission Issue on new Timerecords [@MickLesk](https://github.com/MickLesk) ([#3136](https://github.com/community-scripts/ProxmoxVE/pull/3136)) ## 2025-03-16 From 2f45ae45bf098bbc4dd66c443d2c1bdf05675ee2 Mon Sep 17 00:00:00 2001 From: Daniel Q Date: Mon, 17 Mar 2025 15:00:21 +0100 Subject: [PATCH 082/258] Fixed wrong PHP values to match default part-db size (100M) (#3143) * Fixed wrong PHP values to match default part-db size (100M) The default Uploadsize is 100M but PHP is limited to 2M (Upload) and 8M (Post) by default, this commit fixed that. * Getting current used php-version --- install/part-db-install.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install/part-db-install.sh b/install/part-db-install.sh index d65d7a1e1..fd315d25e 100644 --- a/install/part-db-install.sh +++ b/install/part-db-install.sh @@ -29,6 +29,12 @@ $STD apt-get install -y \ postgresql msg_ok "Installed Dependencies" +msg_info "Setting up PHP" +PHPVER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION . "\n";') +sed -i "s@post_max_size = 8M@post_max_size = 100M@g" /etc/php/${PHPVER}/apache2/php.ini +sed -i "s@upload_max_filesize = 2M@upload_max_filesize = 100M@g" /etc/php/${PHPVER}/apache2/php.ini +msg_ok "Setting up PHP" + msg_info "Setting up PostgreSQL" DB_NAME=partdb DB_USER=partdb From ee9a5e0f511b3173eca24b68f7043f1c3d40e084 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:03:29 +0100 Subject: [PATCH 083/258] Update CHANGELOG.md (#3147) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e79a38587..20dd1bf99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Fixed wrong PHP values to match default part-db size (100M) [@dMopp](https://github.com/dMopp) ([#3143](https://github.com/community-scripts/ProxmoxVE/pull/3143)) - Tandoor: Switch Repo to new Link [@MickLesk](https://github.com/MickLesk) ([#3140](https://github.com/community-scripts/ProxmoxVE/pull/3140)) - Kimai: Fix Permission Issue on new Timerecords [@MickLesk](https://github.com/MickLesk) ([#3136](https://github.com/community-scripts/ProxmoxVE/pull/3136)) From f8f03dbced259922b78013daaf3808e815eb497a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 17 Mar 2025 17:35:14 +0100 Subject: [PATCH 084/258] qBittorrent fix config file (#3150) --- install/qbittorrent-install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/qbittorrent-install.sh b/install/qbittorrent-install.sh index 5e3838909..82860dccf 100644 --- a/install/qbittorrent-install.sh +++ b/install/qbittorrent-install.sh @@ -23,6 +23,9 @@ msg_info "Installing qbittorrent-nox" $STD apt-get install -y qbittorrent-nox mkdir -p /.config/qBittorrent/ cat </.config/qBittorrent/qBittorrent.conf +[LegalNotice] +Accepted=true + [Preferences] WebUI\Password_PBKDF2="@ByteArray(amjeuVrF3xRbgzqWQmes5A==:XK3/Ra9jUmqUc4RwzCtrhrkQIcYczBl90DJw2rT8DFVTss4nxpoRhvyxhCf87ahVE3SzD8K9lyPdpyUCfmVsUg==)" WebUI\Port=8090 From 87999934573be169f41694490f8246fcdd1d6872 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 18:24:39 +0100 Subject: [PATCH 085/258] Update CHANGELOG.md (#3148) --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20dd1bf99..a4a7d400f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,8 +23,9 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes - - Fixed wrong PHP values to match default part-db size (100M) [@dMopp](https://github.com/dMopp) ([#3143](https://github.com/community-scripts/ProxmoxVE/pull/3143)) + - qBittorrent: Accept legal notice in config file [@tremor021](https://github.com/tremor021) ([#3150](https://github.com/community-scripts/ProxmoxVE/pull/3150)) - Tandoor: Switch Repo to new Link [@MickLesk](https://github.com/MickLesk) ([#3140](https://github.com/community-scripts/ProxmoxVE/pull/3140)) + - Fixed wrong PHP values to match default part-db size (100M) [@dMopp](https://github.com/dMopp) ([#3143](https://github.com/community-scripts/ProxmoxVE/pull/3143)) - Kimai: Fix Permission Issue on new Timerecords [@MickLesk](https://github.com/MickLesk) ([#3136](https://github.com/community-scripts/ProxmoxVE/pull/3136)) ## 2025-03-16 From 169c6f6f6cbc1cae1a016aca7b0c11a1bb43373d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 17 Mar 2025 18:30:20 +0100 Subject: [PATCH 086/258] Fix release file name (#3152) --- ct/trilium.sh | 8 ++++---- install/trilium-install.sh | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ct/trilium.sh b/ct/trilium.sh index f9a541ddd..076448089 100644 --- a/ct/trilium.sh +++ b/ct/trilium.sh @@ -40,15 +40,15 @@ function update_script() { mv /opt/trilium/{db,dump-db} /opt/trilium_backup/ rm -rf /opt/trilium cd /tmp - wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz - tar -xf TriliumNextNotes-linux-x64-${RELEASE}.tar.xz - mv trilium-linux-x64-server /opt/trilium + wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz + tar -xf TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz + mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium cp -r /opt/trilium_backup/{db,dump-db} /opt/trilium/ echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated to ${RELEASE}" msg_info "Cleaning up" - rm -rf /tmp/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz + rm -rf /tmp/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz rm -rf /opt/trilium_backup msg_ok "Cleaned" diff --git a/install/trilium-install.sh b/install/trilium-install.sh index 686e1db94..953a509bf 100644 --- a/install/trilium-install.sh +++ b/install/trilium-install.sh @@ -23,9 +23,9 @@ msg_ok "Installed Dependencies" msg_info "Setup TriliumNext" cd /opt RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz -tar -xf TriliumNextNotes-linux-x64-${RELEASE}.tar.xz -mv trilium-linux-x64-server /opt/trilium +wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz +tar -xf TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz +mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Setup TriliumNext" @@ -53,7 +53,7 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf /opt/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz +rm -rf /opt/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" From d6bdc20ae68c80e7b106550b36ff563e360cbc79 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 18:31:50 +0100 Subject: [PATCH 087/258] Update CHANGELOG.md (#3153) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4a7d400f..a8f22d1ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) + - TriliumNext: Fix release file name/path, preventing install and update [@tremor021](https://github.com/tremor021) ([#3152](https://github.com/community-scripts/ProxmoxVE/pull/3152)) +- InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) - #### 🐞 Bug Fixes From 579f83e1bc9f535e020e183d34153c96ddac1351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:11:34 +0100 Subject: [PATCH 088/258] Fix example on website (#3155) --- json/paperless-ngx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/paperless-ngx.json b/json/paperless-ngx.json index e79b38fc4..5c64c7ebf 100644 --- a/json/paperless-ngx.json +++ b/json/paperless-ngx.json @@ -36,7 +36,7 @@ "type": "info" }, { - "text": "Script installs English as default OCR language. To install additional languages, use `apt-get install tesseract-ocr-[lang]`, where [lang] is the language code (e.g. `apt-get install tesseract-ocr-ger`).", + "text": "Script installs English as default OCR language. To install additional languages, use `apt-get install tesseract-ocr-[lang]`, where [lang] is the language code (e.g. `apt-get install tesseract-ocr-deu`).", "type": "info" } ] From 58132fdb1d9a0fd29748d987c2426952ada6f713 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:23:05 +0100 Subject: [PATCH 089/258] Update CHANGELOG.md (#3156) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8f22d1ec..68e6d8e07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,9 +18,10 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - TriliumNext: Fix release file name/path, preventing install and update [@tremor021](https://github.com/tremor021) ([#3152](https://github.com/community-scripts/ProxmoxVE/pull/3152)) -- InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) + - Paperless-ngx: Fix example on website [@tremor021](https://github.com/tremor021) ([#3155](https://github.com/community-scripts/ProxmoxVE/pull/3155)) - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) +- TriliumNext: Fix release file name/path, preventing install and update [@tremor021](https://github.com/tremor021) ([#3152](https://github.com/community-scripts/ProxmoxVE/pull/3152)) +- InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) - #### 🐞 Bug Fixes From 4aa8578b7d78199bbbdb317351382be33c2d9c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 17 Mar 2025 23:34:01 +0100 Subject: [PATCH 090/258] Fix TriliumNotes release handling (#3160) --- ct/trilium.sh | 10 +++++----- install/trilium-install.sh | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ct/trilium.sh b/ct/trilium.sh index 076448089..84103e515 100644 --- a/ct/trilium.sh +++ b/ct/trilium.sh @@ -28,8 +28,8 @@ function update_script() { exit fi if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi - RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "v${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then msg_info "Stopping ${APP}" systemctl stop trilium sleep 1 @@ -40,11 +40,11 @@ function update_script() { mv /opt/trilium/{db,dump-db} /opt/trilium_backup/ rm -rf /opt/trilium cd /tmp - wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz - tar -xf TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz + wget -q https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz + tar -xf TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium cp -r /opt/trilium_backup/{db,dump-db} /opt/trilium/ - echo "${RELEASE}" >/opt/${APP}_version.txt + echo "v${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated to ${RELEASE}" msg_info "Cleaning up" diff --git a/install/trilium-install.sh b/install/trilium-install.sh index 953a509bf..61adc4d34 100644 --- a/install/trilium-install.sh +++ b/install/trilium-install.sh @@ -22,9 +22,9 @@ msg_ok "Installed Dependencies" msg_info "Setup TriliumNext" cd /opt -RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz -tar -xf TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz +RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz +tar -xf TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Setup TriliumNext" From 97d8110a48bcc44efa1009ee5170dff2b51d0bf7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 23:36:43 +0100 Subject: [PATCH 091/258] Update CHANGELOG.md (#3162) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68e6d8e07..f58b79dd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,18 +18,26 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts - - Paperless-ngx: Fix example on website [@tremor021](https://github.com/tremor021) ([#3155](https://github.com/community-scripts/ProxmoxVE/pull/3155)) -- ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) -- TriliumNext: Fix release file name/path, preventing install and update [@tremor021](https://github.com/tremor021) ([#3152](https://github.com/community-scripts/ProxmoxVE/pull/3152)) -- InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) - - #### 🐞 Bug Fixes + - TriliumNotes: Fix release handling [@tremor021](https://github.com/tremor021) ([#3160](https://github.com/community-scripts/ProxmoxVE/pull/3160)) + - TriliumNext: Fix release file name/path, preventing install and update [@tremor021](https://github.com/tremor021) ([#3152](https://github.com/community-scripts/ProxmoxVE/pull/3152)) - qBittorrent: Accept legal notice in config file [@tremor021](https://github.com/tremor021) ([#3150](https://github.com/community-scripts/ProxmoxVE/pull/3150)) - Tandoor: Switch Repo to new Link [@MickLesk](https://github.com/MickLesk) ([#3140](https://github.com/community-scripts/ProxmoxVE/pull/3140)) - Fixed wrong PHP values to match default part-db size (100M) [@dMopp](https://github.com/dMopp) ([#3143](https://github.com/community-scripts/ProxmoxVE/pull/3143)) - Kimai: Fix Permission Issue on new Timerecords [@MickLesk](https://github.com/MickLesk) ([#3136](https://github.com/community-scripts/ProxmoxVE/pull/3136)) + - #### ✨ New Features + + - InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) + - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) + +### 🌐 Website + + - #### πŸ“ Script Information + + - Paperless-ngx: Fix example on website [@tremor021](https://github.com/tremor021) ([#3155](https://github.com/community-scripts/ProxmoxVE/pull/3155)) + ## 2025-03-16 ### πŸš€ Updated Scripts From ecd25a889b3b580a6b7654f50db73a51250f5683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:43:12 +0100 Subject: [PATCH 092/258] GoMFT (#3157) * Add GoMFT script * Update gomft-install.sh * fix missing templ generate * Update --- ct/gomft.sh | 72 +++++++++++++++++++++++++++ install/gomft-install.sh | 102 +++++++++++++++++++++++++++++++++++++++ json/gomft.json | 39 +++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 ct/gomft.sh create mode 100644 install/gomft-install.sh create mode 100644 json/gomft.json diff --git a/ct/gomft.sh b/ct/gomft.sh new file mode 100644 index 000000000..5effb2ed7 --- /dev/null +++ b/ct/gomft.sh @@ -0,0 +1,72 @@ +#!/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: SlaviΕ‘a AreΕΎina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/StarFleetCPTN/GoMFT + +APP="GoMFT" +var_tags="backup" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/gomft" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop gomft + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + rm -f /opt/gomft/gomft + temp_file=$(mktemp) + wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file + tar -xzf $temp_file + cp -rf GoMFT-${RELEASE}/* /opt/gomft + $STD $HOME/go/bin/templ generate + wget -q "https://github.com/StarFleetCPTN/GoMFT/releases/download/v${RELEASE}/gomft-v${RELEASE}-linux-amd64" -O /opt/gomft/gomft + chmod +x /opt/gomft/gomft + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Cleaning Up" + rm -f $temp_file + rm -rf GoMFT-${RELEASE} + msg_ok "Cleanup Complete" + + msg_info "Starting $APP" + systemctl start gomft + msg_ok "Started $APP" + + msg_ok "Update Successful" + 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}:8080${CL}" diff --git a/install/gomft-install.sh b/install/gomft-install.sh new file mode 100644 index 000000000..72f314bdc --- /dev/null +++ b/install/gomft-install.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: SlaviΕ‘a AreΕΎina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/StarFleetCPTN/GoMFT + +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 \ + sqlite3 \ + rclone \ + tzdata \ + ca-certificates +msg_ok "Installed Dependencies" + +msg_info "Setting up Golang" +set +o pipefail +temp_file=$(mktemp) +golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1) +wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file" +tar -C /usr/local -xzf "$temp_file" +ln -sf /usr/local/go/bin/go /usr/local/bin/go +set -o pipefail +msg_ok "Setup Golang" + +msg_info "Setup ${APPLICATION}" +temp_file2=$(mktemp) +RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file2 +tar -xzf $temp_file2 +mv GoMFT-${RELEASE}/ /opt/gomft +cd /opt/gomft +$STD go install github.com/a-h/templ/cmd/templ@latest +wget -q "https://github.com/StarFleetCPTN/GoMFT/releases/download/v${RELEASE}/gomft-v${RELEASE}-linux-amd64" -O gomft +$STD $HOME/go/bin/templ generate +chmod +x gomft +JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=') + +cat </opt/gomft/.env +SERVER_ADDRESS=:8080 +DATA_DIR=/opt/gomft/data/gomft +BACKUP_DIR=/opt/gomft/data/gomft/backups +JWT_SECRET=$JWT_SECRET_KEY +BASE_URL=http://localhost:8080 + +# Email configuration +EMAIL_ENABLED=false +EMAIL_HOST=smtp.example.com +EMAIL_PORT=587 +EMAIL_FROM_EMAIL=gomft@example.com +EMAIL_FROM_NAME=GoMFT +EMAIL_REPLY_TO= +EMAIL_ENABLE_TLS=true +EMAIL_REQUIRE_AUTH=true +EMAIL_USERNAME=smtp_username +EMAIL_PASSWORD=smtp_password +EOF + +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Setup ${APPLICATION}" + +msg_info "Creating Service" +cat </etc/systemd/system/gomft.service +[Unit] +Description=GoMFT Service +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/gomft +ExecStart=/opt/gomft/./gomft +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now gomft +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f $temp_file $temp_file2 +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" + +motd_ssh +customize diff --git a/json/gomft.json b/json/gomft.json new file mode 100644 index 000000000..7fb93be27 --- /dev/null +++ b/json/gomft.json @@ -0,0 +1,39 @@ +{ + "name": "GoMFT", + "slug": "gomft", + "categories": [ + 7 + ], + "date_created": "2025-03-17", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/StarFleetCPTN/GoMFT#configuration", + "website": "https://github.com/StarFleetCPTN/GoMFT", + "logo": "https://github.com/StarFleetCPTN/GoMFT/blob/main/static/img/logo.svg", + "description": "GoMFT is a web-based managed file transfer application built with Go, leveraging rclone for robust file transfer capabilities. It provides a user-friendly interface for configuring, scheduling, and monitoring file transfers across various storage providers.", + "install_methods": [ + { + "type": "default", + "script": "ct/gomft.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@example.com", + "password": "admin" + }, + "notes": [ + { + "text": "For additional configuration options, edit .env file here: `/opt/gomft/.env`. Check the documentation for more details.", + "type": "info" + } + ] +} From 240d40ee0467a57e85c99ab334c8a82fee2abaf0 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:45:35 +0100 Subject: [PATCH 093/258] Update .app files (#3169) Co-authored-by: GitHub Actions --- ct/headers/gomft | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/gomft diff --git a/ct/headers/gomft b/ct/headers/gomft new file mode 100644 index 000000000..7833e25ca --- /dev/null +++ b/ct/headers/gomft @@ -0,0 +1,6 @@ + ______ __ _______________ + / ____/___ / |/ / ____/_ __/ + / / __/ __ \/ /|_/ / /_ / / +/ /_/ / /_/ / / / / __/ / / +\____/\____/_/ /_/_/ /_/ + From 0f36c04f49eb1d6b3942883a89a1403bff1661b7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:46:12 +0100 Subject: [PATCH 094/258] Update CHANGELOG.md (#3167) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f58b79dd1..97ac3b08f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-18 + +### πŸ†• New Scripts + + - GoMFT [@tremor021](https://github.com/tremor021) ([#3157](https://github.com/community-scripts/ProxmoxVE/pull/3157)) + ## 2025-03-17 ### πŸš€ Updated Scripts From 546a6e4563c99d3c30b1a6eeed43ecc4b6988ad4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:49:06 +0100 Subject: [PATCH 095/258] Update date in json (#3168) Co-authored-by: GitHub Actions --- json/gomft.json | 74 ++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/json/gomft.json b/json/gomft.json index 7fb93be27..4788cdf31 100644 --- a/json/gomft.json +++ b/json/gomft.json @@ -1,39 +1,39 @@ { - "name": "GoMFT", - "slug": "gomft", - "categories": [ - 7 - ], - "date_created": "2025-03-17", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8080, - "documentation": "https://github.com/StarFleetCPTN/GoMFT#configuration", - "website": "https://github.com/StarFleetCPTN/GoMFT", - "logo": "https://github.com/StarFleetCPTN/GoMFT/blob/main/static/img/logo.svg", - "description": "GoMFT is a web-based managed file transfer application built with Go, leveraging rclone for robust file transfer capabilities. It provides a user-friendly interface for configuring, scheduling, and monitoring file transfers across various storage providers.", - "install_methods": [ - { - "type": "default", - "script": "ct/gomft.sh", - "resources": { - "cpu": 1, - "ram": 512, - "hdd": 4, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": "admin@example.com", - "password": "admin" - }, - "notes": [ - { - "text": "For additional configuration options, edit .env file here: `/opt/gomft/.env`. Check the documentation for more details.", - "type": "info" - } - ] + "name": "GoMFT", + "slug": "gomft", + "categories": [ + 7 + ], + "date_created": "2025-03-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/StarFleetCPTN/GoMFT#configuration", + "website": "https://github.com/StarFleetCPTN/GoMFT", + "logo": "https://github.com/StarFleetCPTN/GoMFT/blob/main/static/img/logo.svg", + "description": "GoMFT is a web-based managed file transfer application built with Go, leveraging rclone for robust file transfer capabilities. It provides a user-friendly interface for configuring, scheduling, and monitoring file transfers across various storage providers.", + "install_methods": [ + { + "type": "default", + "script": "ct/gomft.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@example.com", + "password": "admin" + }, + "notes": [ + { + "text": "For additional configuration options, edit .env file here: `/opt/gomft/.env`. Check the documentation for more details.", + "type": "info" + } + ] } From ce4f058ec2eb78a7e78ede39ea8cc801b3d7db04 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:49:29 +0100 Subject: [PATCH 096/258] Update CHANGELOG.md (#3170) Co-authored-by: github-actions[bot] From e28f36ec6d1ceec886386e76c8be4c7ad26d32fd Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:03:10 +0100 Subject: [PATCH 097/258] Update Workflow (#3171) --- .github/workflows/close_issue_in_dev.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/close_issue_in_dev.yaml b/.github/workflows/close_issue_in_dev.yaml index 2bd7e6428..14e35e479 100644 --- a/.github/workflows/close_issue_in_dev.yaml +++ b/.github/workflows/close_issue_in_dev.yaml @@ -8,7 +8,14 @@ jobs: if: github.event.pull_request.merged == true runs-on: ubuntu-latest - steps: + steps: + - name: Checkout target repo (main) + uses: actions/checkout@v4 + with: + repository: community-scripts/ProxmoxVE + ref: main + token: ${{ secrets.GITHUB_TOKEN }} + - name: Extract and Process PR Title id: extract_title run: | From b1bcdc3ce832a9c0f011f51b6c1d5295c5579067 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:10:54 +0100 Subject: [PATCH 098/258] Update CHANGELOG.md (#3183) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97ac3b08f..fc622515e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,12 @@ All LXC instances created using this repository come pre-installed with Midnight - GoMFT [@tremor021](https://github.com/tremor021) ([#3157](https://github.com/community-scripts/ProxmoxVE/pull/3157)) +### 🧰 Maintenance + + - #### πŸ“‚ Github + + - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) + ## 2025-03-17 ### πŸš€ Updated Scripts From 35d5507b3800a94ad2ed5c0cd27df8b062850548 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:29:14 +0100 Subject: [PATCH 099/258] Refactor Json Location (#3184) --- .github/autolabeler-config.json | 4 +- .github/workflows/frontend-cicd.yml | 2 - .github/workflows/update-json-date.yml | 6 +- .github/workflows/validate-filenames.yml | 2 +- frontend/public/json | 1 - {json => frontend/public/json}/2fauth.json | 0 .../public/json}/actualbudget.json | 0 .../public/json}/add-lxc-iptag.json | 0 .../public/json}/add-netbird-lxc.json | 0 .../public/json}/add-tailscale-lxc.json | 0 {json => frontend/public/json}/adguard.json | 0 .../public/json}/adventurelog.json | 0 {json => frontend/public/json}/agentdvr.json | 0 .../public/json}/all-templates.json | 0 .../public/json}/alpine-it-tools.json | 0 {json => frontend/public/json}/alpine.json | 0 .../public/json}/apache-cassandra.json | 0 .../public/json}/apache-couchdb.json | 0 .../public/json}/apache-guacamole.json | 0 .../public/json}/apache-tika.json | 0 .../public/json}/apache-tomcat.json | 0 .../public/json}/apt-cacher-ng.json | 0 .../public/json}/archivebox.json | 0 .../public/json}/archlinux-vm.json | 0 {json => frontend/public/json}/aria2.json | 0 .../public/json}/audiobookshelf.json | 0 {json => frontend/public/json}/authelia.json | 0 {json => frontend/public/json}/authentik.json | 0 {json => frontend/public/json}/autobrr.json | 0 {json => frontend/public/json}/baikal.json | 0 .../public/json}/barcode-buddy.json | 0 {json => frontend/public/json}/bazarr.json | 0 {json => frontend/public/json}/beszel.json | 0 {json => frontend/public/json}/blocky.json | 0 {json => frontend/public/json}/boltdiy.json | 0 {json => frontend/public/json}/bookstack.json | 0 {json => frontend/public/json}/bunkerweb.json | 0 {json => frontend/public/json}/bytestash.json | 0 {json => frontend/public/json}/caddy.json | 0 .../public/json}/calibre-web.json | 0 {json => frontend/public/json}/casaos.json | 0 .../public/json}/changedetection.json | 0 {json => frontend/public/json}/channels.json | 0 {json => frontend/public/json}/checkmk.json | 0 .../public/json}/clean-lxcs.json | 0 .../public/json}/clean-orphaned-lvm.json | 0 .../public/json}/cloudflared.json | 0 {json => frontend/public/json}/cockpit.json | 0 .../public/json}/code-server.json | 0 {json => frontend/public/json}/commafeed.json | 0 {json => frontend/public/json}/cosmos.json | 0 .../public/json}/crafty-controller.json | 0 .../public/json}/cron-update-lxcs.json | 0 {json => frontend/public/json}/cronicle.json | 0 .../public/json}/cross-seed.json | 0 {json => frontend/public/json}/crowdsec.json | 0 .../public/json}/daemonsync.json | 0 {json => frontend/public/json}/dashy.json | 0 {json => frontend/public/json}/debian-vm.json | 0 {json => frontend/public/json}/debian.json | 0 {json => frontend/public/json}/deconz.json | 0 {json => frontend/public/json}/deluge.json | 0 {json => frontend/public/json}/docker-vm.json | 0 {json => frontend/public/json}/docker.json | 0 {json => frontend/public/json}/dockge.json | 0 {json => frontend/public/json}/docmost.json | 0 {json => frontend/public/json}/dolibarr.json | 0 .../public/json}/dotnetaspwebapi.json | 0 {json => frontend/public/json}/duplicati.json | 0 .../public/json}/elementsynapse.json | 0 {json => frontend/public/json}/emby.json | 0 {json => frontend/public/json}/emqx.json | 0 {json => frontend/public/json}/ersatztv.json | 0 {json => frontend/public/json}/esphome.json | 0 {json => frontend/public/json}/evcc.json | 0 .../public/json}/excalidraw.json | 0 {json => frontend/public/json}/fenrus.json | 0 {json => frontend/public/json}/fhem.json | 0 .../public/json}/filebrowser.json | 0 {json => frontend/public/json}/firefly.json | 0 .../public/json}/flaresolverr.json | 0 {json => frontend/public/json}/flowiseai.json | 0 .../public/json}/fluid-calendar.json | 0 {json => frontend/public/json}/forgejo.json | 0 {json => frontend/public/json}/freshrss.json | 0 {json => frontend/public/json}/frigate.json | 0 {json => frontend/public/json}/fstrim.json | 0 {json => frontend/public/json}/ghost.json | 0 {json => frontend/public/json}/gitea.json | 0 {json => frontend/public/json}/glance.json | 0 {json => frontend/public/json}/glances.json | 0 {json => frontend/public/json}/glpi.json | 0 {json => frontend/public/json}/go2rtc.json | 0 {json => frontend/public/json}/gokapi.json | 0 {json => frontend/public/json}/gomft.json | 0 {json => frontend/public/json}/gotify.json | 0 {json => frontend/public/json}/grafana.json | 0 {json => frontend/public/json}/graylog.json | 0 {json => frontend/public/json}/grist.json | 0 {json => frontend/public/json}/grocy.json | 0 {json => frontend/public/json}/habitica.json | 0 {json => frontend/public/json}/haos-vm.json | 0 {json => frontend/public/json}/headscale.json | 0 .../public/json}/heimdall-dashboard.json | 0 .../public/json}/hev-socks5-server.json | 0 {json => frontend/public/json}/hivemq.json | 0 {json => frontend/public/json}/hoarder.json | 0 {json => frontend/public/json}/homarr.json | 0 .../public/json}/homeassistant-core.json | 0 .../public/json}/homeassistant.json | 0 {json => frontend/public/json}/homebox.json | 0 .../public/json}/homebridge.json | 0 {json => frontend/public/json}/homepage.json | 0 {json => frontend/public/json}/homer.json | 0 .../public/json}/host-backup.json | 0 {json => frontend/public/json}/hyperhdr.json | 0 {json => frontend/public/json}/hyperion.json | 0 {json => frontend/public/json}/influxdb.json | 0 {json => frontend/public/json}/inspircd.json | 0 {json => frontend/public/json}/inventree.json | 0 {json => frontend/public/json}/iobroker.json | 0 {json => frontend/public/json}/iventoy.json | 0 {json => frontend/public/json}/jackett.json | 0 {json => frontend/public/json}/jellyfin.json | 0 .../public/json}/jellyseerr.json | 0 {json => frontend/public/json}/jenkins.json | 0 .../public/json}/jupyternotebook.json | 0 {json => frontend/public/json}/kavita.json | 0 .../public/json}/kernel-clean.json | 0 .../public/json}/kernel-pin.json | 0 {json => frontend/public/json}/keycloak.json | 0 {json => frontend/public/json}/kimai.json | 0 .../public/json}/koillection.json | 0 {json => frontend/public/json}/kometa.json | 0 {json => frontend/public/json}/komga.json | 78 +++++++++---------- {json => frontend/public/json}/komodo.json | 0 {json => frontend/public/json}/kubo.json | 0 .../public/json}/lazylibrarian.json | 0 {json => frontend/public/json}/lidarr.json | 0 .../public/json}/linkwarden.json | 0 {json => frontend/public/json}/listmonk.json | 0 {json => frontend/public/json}/lldap.json | 0 .../public/json}/lubelogger.json | 0 .../public/json}/lxc-delete.json | 0 {json => frontend/public/json}/mafl.json | 0 .../public/json}/magicmirror.json | 0 {json => frontend/public/json}/mariadb.json | 0 .../public/json}/matterbridge.json | 0 .../public/json}/mattermost.json | 0 {json => frontend/public/json}/mediamtx.json | 0 {json => frontend/public/json}/medusa.json | 0 {json => frontend/public/json}/memos.json | 0 .../public/json}/meshcentral.json | 0 {json => frontend/public/json}/metadata.json | 0 {json => frontend/public/json}/metube.json | 0 {json => frontend/public/json}/microcode.json | 0 .../public/json}/mikrotik-routeros.json | 0 {json => frontend/public/json}/minio.json | 0 {json => frontend/public/json}/mongodb.json | 0 {json => frontend/public/json}/monica.json | 0 .../public/json}/monitor-all.json | 0 {json => frontend/public/json}/motioneye.json | 0 {json => frontend/public/json}/mqtt.json | 0 {json => frontend/public/json}/mylar3.json | 0 {json => frontend/public/json}/myspeed.json | 0 {json => frontend/public/json}/mysql.json | 0 {json => frontend/public/json}/n8n.json | 0 {json => frontend/public/json}/navidrome.json | 0 {json => frontend/public/json}/neo4j.json | 0 {json => frontend/public/json}/netbox.json | 0 {json => frontend/public/json}/netdata.json | 0 .../public/json}/nextcloud-vm.json | 0 .../public/json}/nextcloudpi.json | 0 {json => frontend/public/json}/nextpvr.json | 0 .../public/json}/nginxproxymanager.json | 0 {json => frontend/public/json}/nocodb.json | 0 {json => frontend/public/json}/node-red.json | 0 {json => frontend/public/json}/nodebb.json | 0 {json => frontend/public/json}/notifiarr.json | 0 {json => frontend/public/json}/npmplus.json | 0 {json => frontend/public/json}/ntfy.json | 0 {json => frontend/public/json}/nxwitness.json | 0 {json => frontend/public/json}/nzbget.json | 0 {json => frontend/public/json}/octoprint.json | 0 {json => frontend/public/json}/olivetin.json | 0 {json => frontend/public/json}/omada.json | 0 {json => frontend/public/json}/ombi.json | 0 {json => frontend/public/json}/omv.json | 0 {json => frontend/public/json}/onedev.json | 0 {json => frontend/public/json}/opengist.json | 0 {json => frontend/public/json}/openhab.json | 0 .../public/json}/openobserve.json | 0 {json => frontend/public/json}/openwebui.json | 0 {json => frontend/public/json}/openwrt.json | 0 .../public/json}/opnsense-vm.json | 0 {json => frontend/public/json}/outline.json | 0 {json => frontend/public/json}/overseerr.json | 0 {json => frontend/public/json}/owncast.json | 0 .../public/json}/owncloud-vm.json | 0 {json => frontend/public/json}/pairdrop.json | 0 .../public/json}/paperless-ai.json | 0 .../public/json}/paperless-gpt.json | 0 .../public/json}/paperless-ngx.json | 0 {json => frontend/public/json}/part-db.json | 0 {json => frontend/public/json}/paymenter.json | 0 .../public/json}/pbs-microcode.json | 0 {json => frontend/public/json}/peanut.json | 0 .../public/json}/pelican-panel.json | 0 .../public/json}/pelican-wings.json | 0 {json => frontend/public/json}/petio.json | 0 {json => frontend/public/json}/pf2etools.json | 0 .../public/json}/photoprism.json | 0 {json => frontend/public/json}/phpipam.json | 0 {json => frontend/public/json}/pialert.json | 0 {json => frontend/public/json}/pihole.json | 0 .../public/json}/pimox-haos-vm.json | 0 {json => frontend/public/json}/pingvin.json | 0 {json => frontend/public/json}/plant-it.json | 0 {json => frontend/public/json}/plex.json | 0 .../public/json}/pocketbase.json | 0 {json => frontend/public/json}/pocketid.json | 0 .../public/json}/podman-homeassistant.json | 0 {json => frontend/public/json}/podman.json | 0 .../public/json}/post-pbs-install.json | 0 .../public/json}/post-pmg-install.json | 0 .../public/json}/post-pve-install.json | 0 .../public/json}/postgresql.json | 0 .../public/json}/privatebin.json | 0 .../public/json}/projectsend.json | 0 .../public/json}/prometheus-alertmanager.json | 0 .../prometheus-paperless-ngx-exporter.json | 0 .../public/json}/prometheus-pve-exporter.json | 0 .../public/json}/prometheus.json | 0 {json => frontend/public/json}/prowlarr.json | 0 .../public/json}/proxmox-backup-server.json | 0 .../json}/proxmox-datacenter-manager.json | 0 .../public/json}/proxmox-mail-gateway.json | 78 +++++++++---------- {json => frontend/public/json}/ps5-mqtt.json | 0 .../public/json}/pterodactyl-panel.json | 0 .../public/json}/pterodactyl-wings.json | 0 .../public/json}/qbittorrent.json | 0 {json => frontend/public/json}/rabbitmq.json | 0 {json => frontend/public/json}/radarr.json | 0 {json => frontend/public/json}/radicale.json | 0 {json => frontend/public/json}/rdtclient.json | 0 {json => frontend/public/json}/readarr.json | 0 {json => frontend/public/json}/readeck.json | 0 {json => frontend/public/json}/recyclarr.json | 0 {json => frontend/public/json}/redis.json | 0 {json => frontend/public/json}/revealjs.json | 0 {json => frontend/public/json}/rtsptoweb.json | 0 {json => frontend/public/json}/runtipi.json | 0 .../public/json}/rustdeskserver.json | 0 {json => frontend/public/json}/sabnzbd.json | 0 .../public/json}/scaling-governor.json | 0 {json => frontend/public/json}/seafile.json | 0 {json => frontend/public/json}/searxng.json | 0 {json => frontend/public/json}/seelf.json | 0 {json => frontend/public/json}/semaphore.json | 0 {json => frontend/public/json}/sftpgo.json | 0 {json => frontend/public/json}/shinobi.json | 0 .../public/json}/silverbullet.json | 0 {json => frontend/public/json}/smokeping.json | 0 {json => frontend/public/json}/snipeit.json | 0 {json => frontend/public/json}/sonarr.json | 0 {json => frontend/public/json}/spoolman.json | 0 .../public/json}/sqlserver2022.json | 0 .../public/json}/stirling-pdf.json | 0 .../public/json}/suwayomi-server.json | 0 {json => frontend/public/json}/syncthing.json | 0 {json => frontend/public/json}/tandoor.json | 0 .../public/json}/tasmoadmin.json | 0 .../public/json}/tasmocompiler.json | 0 {json => frontend/public/json}/tautulli.json | 0 {json => frontend/public/json}/tdarr.json | 0 .../public/json}/technitiumdns.json | 0 .../public/json}/teddycloud.json | 0 .../public/json}/the-lounge.json | 78 +++++++++---------- {json => frontend/public/json}/threadfin.json | 0 {json => frontend/public/json}/tianji.json | 0 {json => frontend/public/json}/traccar.json | 0 {json => frontend/public/json}/traefik.json | 0 .../public/json}/transmission.json | 0 {json => frontend/public/json}/trilium.json | 0 {json => frontend/public/json}/turnkey.json | 0 {json => frontend/public/json}/typesense.json | 0 {json => frontend/public/json}/ubuntu.json | 0 .../public/json}/ubuntu2204-vm.json | 0 .../public/json}/ubuntu2404-vm.json | 0 .../public/json}/ubuntu2410-vm.json | 0 {json => frontend/public/json}/umami.json | 0 {json => frontend/public/json}/unbound.json | 0 {json => frontend/public/json}/unifi.json | 0 {json => frontend/public/json}/unmanic.json | 0 .../public/json}/update-lxcs.json | 0 .../public/json}/update-repo.json | 0 .../public/json}/uptimekuma.json | 0 .../public/json}/urbackupserver.json | 0 .../public/json}/vaultwarden.json | 0 .../public/json}/victoriametrics.json | 0 {json => frontend/public/json}/vikunja.json | 0 {json => frontend/public/json}/wallos.json | 0 {json => frontend/public/json}/wastebin.json | 0 {json => frontend/public/json}/watcharr.json | 0 .../public/json}/watchyourlan.json | 0 {json => frontend/public/json}/wavelog.json | 0 {json => frontend/public/json}/web-check.json | 0 {json => frontend/public/json}/webmin.json | 0 {json => frontend/public/json}/wger.json | 0 {json => frontend/public/json}/whisparr.json | 0 {json => frontend/public/json}/whoogle.json | 0 {json => frontend/public/json}/wikijs.json | 0 {json => frontend/public/json}/wireguard.json | 0 {json => frontend/public/json}/wordpress.json | 0 {json => frontend/public/json}/yunohost.json | 0 {json => frontend/public/json}/zabbix.json | 0 {json => frontend/public/json}/zammad.json | 0 .../public/json}/zerotier-one.json | 0 .../public/json}/zigbee2mqtt.json | 0 {json => frontend/public/json}/zipline.json | 0 {json => frontend/public/json}/zitadel.json | 0 {json => frontend/public/json}/zoraxy.json | 0 .../public/json}/zwave-js-ui.json | 0 323 files changed, 123 insertions(+), 126 deletions(-) delete mode 120000 frontend/public/json rename {json => frontend/public/json}/2fauth.json (100%) rename {json => frontend/public/json}/actualbudget.json (100%) rename {json => frontend/public/json}/add-lxc-iptag.json (100%) rename {json => frontend/public/json}/add-netbird-lxc.json (100%) rename {json => frontend/public/json}/add-tailscale-lxc.json (100%) rename {json => frontend/public/json}/adguard.json (100%) rename {json => frontend/public/json}/adventurelog.json (100%) rename {json => frontend/public/json}/agentdvr.json (100%) rename {json => frontend/public/json}/all-templates.json (100%) rename {json => frontend/public/json}/alpine-it-tools.json (100%) rename {json => frontend/public/json}/alpine.json (100%) rename {json => frontend/public/json}/apache-cassandra.json (100%) rename {json => frontend/public/json}/apache-couchdb.json (100%) rename {json => frontend/public/json}/apache-guacamole.json (100%) rename {json => frontend/public/json}/apache-tika.json (100%) rename {json => frontend/public/json}/apache-tomcat.json (100%) rename {json => frontend/public/json}/apt-cacher-ng.json (100%) rename {json => frontend/public/json}/archivebox.json (100%) rename {json => frontend/public/json}/archlinux-vm.json (100%) rename {json => frontend/public/json}/aria2.json (100%) rename {json => frontend/public/json}/audiobookshelf.json (100%) rename {json => frontend/public/json}/authelia.json (100%) rename {json => frontend/public/json}/authentik.json (100%) rename {json => frontend/public/json}/autobrr.json (100%) rename {json => frontend/public/json}/baikal.json (100%) rename {json => frontend/public/json}/barcode-buddy.json (100%) rename {json => frontend/public/json}/bazarr.json (100%) rename {json => frontend/public/json}/beszel.json (100%) rename {json => frontend/public/json}/blocky.json (100%) rename {json => frontend/public/json}/boltdiy.json (100%) rename {json => frontend/public/json}/bookstack.json (100%) rename {json => frontend/public/json}/bunkerweb.json (100%) rename {json => frontend/public/json}/bytestash.json (100%) rename {json => frontend/public/json}/caddy.json (100%) rename {json => frontend/public/json}/calibre-web.json (100%) rename {json => frontend/public/json}/casaos.json (100%) rename {json => frontend/public/json}/changedetection.json (100%) rename {json => frontend/public/json}/channels.json (100%) rename {json => frontend/public/json}/checkmk.json (100%) rename {json => frontend/public/json}/clean-lxcs.json (100%) rename {json => frontend/public/json}/clean-orphaned-lvm.json (100%) rename {json => frontend/public/json}/cloudflared.json (100%) rename {json => frontend/public/json}/cockpit.json (100%) rename {json => frontend/public/json}/code-server.json (100%) rename {json => frontend/public/json}/commafeed.json (100%) rename {json => frontend/public/json}/cosmos.json (100%) rename {json => frontend/public/json}/crafty-controller.json (100%) rename {json => frontend/public/json}/cron-update-lxcs.json (100%) rename {json => frontend/public/json}/cronicle.json (100%) rename {json => frontend/public/json}/cross-seed.json (100%) rename {json => frontend/public/json}/crowdsec.json (100%) rename {json => frontend/public/json}/daemonsync.json (100%) rename {json => frontend/public/json}/dashy.json (100%) rename {json => frontend/public/json}/debian-vm.json (100%) rename {json => frontend/public/json}/debian.json (100%) rename {json => frontend/public/json}/deconz.json (100%) rename {json => frontend/public/json}/deluge.json (100%) rename {json => frontend/public/json}/docker-vm.json (100%) rename {json => frontend/public/json}/docker.json (100%) rename {json => frontend/public/json}/dockge.json (100%) rename {json => frontend/public/json}/docmost.json (100%) rename {json => frontend/public/json}/dolibarr.json (100%) rename {json => frontend/public/json}/dotnetaspwebapi.json (100%) rename {json => frontend/public/json}/duplicati.json (100%) rename {json => frontend/public/json}/elementsynapse.json (100%) rename {json => frontend/public/json}/emby.json (100%) rename {json => frontend/public/json}/emqx.json (100%) rename {json => frontend/public/json}/ersatztv.json (100%) rename {json => frontend/public/json}/esphome.json (100%) rename {json => frontend/public/json}/evcc.json (100%) rename {json => frontend/public/json}/excalidraw.json (100%) rename {json => frontend/public/json}/fenrus.json (100%) rename {json => frontend/public/json}/fhem.json (100%) rename {json => frontend/public/json}/filebrowser.json (100%) rename {json => frontend/public/json}/firefly.json (100%) rename {json => frontend/public/json}/flaresolverr.json (100%) rename {json => frontend/public/json}/flowiseai.json (100%) rename {json => frontend/public/json}/fluid-calendar.json (100%) rename {json => frontend/public/json}/forgejo.json (100%) rename {json => frontend/public/json}/freshrss.json (100%) rename {json => frontend/public/json}/frigate.json (100%) rename {json => frontend/public/json}/fstrim.json (100%) rename {json => frontend/public/json}/ghost.json (100%) rename {json => frontend/public/json}/gitea.json (100%) rename {json => frontend/public/json}/glance.json (100%) rename {json => frontend/public/json}/glances.json (100%) rename {json => frontend/public/json}/glpi.json (100%) rename {json => frontend/public/json}/go2rtc.json (100%) rename {json => frontend/public/json}/gokapi.json (100%) rename {json => frontend/public/json}/gomft.json (100%) rename {json => frontend/public/json}/gotify.json (100%) rename {json => frontend/public/json}/grafana.json (100%) rename {json => frontend/public/json}/graylog.json (100%) rename {json => frontend/public/json}/grist.json (100%) rename {json => frontend/public/json}/grocy.json (100%) rename {json => frontend/public/json}/habitica.json (100%) rename {json => frontend/public/json}/haos-vm.json (100%) rename {json => frontend/public/json}/headscale.json (100%) rename {json => frontend/public/json}/heimdall-dashboard.json (100%) rename {json => frontend/public/json}/hev-socks5-server.json (100%) rename {json => frontend/public/json}/hivemq.json (100%) rename {json => frontend/public/json}/hoarder.json (100%) rename {json => frontend/public/json}/homarr.json (100%) rename {json => frontend/public/json}/homeassistant-core.json (100%) rename {json => frontend/public/json}/homeassistant.json (100%) rename {json => frontend/public/json}/homebox.json (100%) rename {json => frontend/public/json}/homebridge.json (100%) rename {json => frontend/public/json}/homepage.json (100%) rename {json => frontend/public/json}/homer.json (100%) rename {json => frontend/public/json}/host-backup.json (100%) rename {json => frontend/public/json}/hyperhdr.json (100%) rename {json => frontend/public/json}/hyperion.json (100%) rename {json => frontend/public/json}/influxdb.json (100%) rename {json => frontend/public/json}/inspircd.json (100%) rename {json => frontend/public/json}/inventree.json (100%) rename {json => frontend/public/json}/iobroker.json (100%) rename {json => frontend/public/json}/iventoy.json (100%) rename {json => frontend/public/json}/jackett.json (100%) rename {json => frontend/public/json}/jellyfin.json (100%) rename {json => frontend/public/json}/jellyseerr.json (100%) rename {json => frontend/public/json}/jenkins.json (100%) rename {json => frontend/public/json}/jupyternotebook.json (100%) rename {json => frontend/public/json}/kavita.json (100%) rename {json => frontend/public/json}/kernel-clean.json (100%) rename {json => frontend/public/json}/kernel-pin.json (100%) rename {json => frontend/public/json}/keycloak.json (100%) rename {json => frontend/public/json}/kimai.json (100%) rename {json => frontend/public/json}/koillection.json (100%) rename {json => frontend/public/json}/kometa.json (100%) rename {json => frontend/public/json}/komga.json (97%) rename {json => frontend/public/json}/komodo.json (100%) rename {json => frontend/public/json}/kubo.json (100%) rename {json => frontend/public/json}/lazylibrarian.json (100%) rename {json => frontend/public/json}/lidarr.json (100%) rename {json => frontend/public/json}/linkwarden.json (100%) rename {json => frontend/public/json}/listmonk.json (100%) rename {json => frontend/public/json}/lldap.json (100%) rename {json => frontend/public/json}/lubelogger.json (100%) rename {json => frontend/public/json}/lxc-delete.json (100%) rename {json => frontend/public/json}/mafl.json (100%) rename {json => frontend/public/json}/magicmirror.json (100%) rename {json => frontend/public/json}/mariadb.json (100%) rename {json => frontend/public/json}/matterbridge.json (100%) rename {json => frontend/public/json}/mattermost.json (100%) rename {json => frontend/public/json}/mediamtx.json (100%) rename {json => frontend/public/json}/medusa.json (100%) rename {json => frontend/public/json}/memos.json (100%) rename {json => frontend/public/json}/meshcentral.json (100%) rename {json => frontend/public/json}/metadata.json (100%) rename {json => frontend/public/json}/metube.json (100%) rename {json => frontend/public/json}/microcode.json (100%) rename {json => frontend/public/json}/mikrotik-routeros.json (100%) rename {json => frontend/public/json}/minio.json (100%) rename {json => frontend/public/json}/mongodb.json (100%) rename {json => frontend/public/json}/monica.json (100%) rename {json => frontend/public/json}/monitor-all.json (100%) rename {json => frontend/public/json}/motioneye.json (100%) rename {json => frontend/public/json}/mqtt.json (100%) rename {json => frontend/public/json}/mylar3.json (100%) rename {json => frontend/public/json}/myspeed.json (100%) rename {json => frontend/public/json}/mysql.json (100%) rename {json => frontend/public/json}/n8n.json (100%) rename {json => frontend/public/json}/navidrome.json (100%) rename {json => frontend/public/json}/neo4j.json (100%) rename {json => frontend/public/json}/netbox.json (100%) rename {json => frontend/public/json}/netdata.json (100%) rename {json => frontend/public/json}/nextcloud-vm.json (100%) rename {json => frontend/public/json}/nextcloudpi.json (100%) rename {json => frontend/public/json}/nextpvr.json (100%) rename {json => frontend/public/json}/nginxproxymanager.json (100%) rename {json => frontend/public/json}/nocodb.json (100%) rename {json => frontend/public/json}/node-red.json (100%) rename {json => frontend/public/json}/nodebb.json (100%) rename {json => frontend/public/json}/notifiarr.json (100%) rename {json => frontend/public/json}/npmplus.json (100%) rename {json => frontend/public/json}/ntfy.json (100%) rename {json => frontend/public/json}/nxwitness.json (100%) rename {json => frontend/public/json}/nzbget.json (100%) rename {json => frontend/public/json}/octoprint.json (100%) rename {json => frontend/public/json}/olivetin.json (100%) rename {json => frontend/public/json}/omada.json (100%) rename {json => frontend/public/json}/ombi.json (100%) rename {json => frontend/public/json}/omv.json (100%) rename {json => frontend/public/json}/onedev.json (100%) rename {json => frontend/public/json}/opengist.json (100%) rename {json => frontend/public/json}/openhab.json (100%) rename {json => frontend/public/json}/openobserve.json (100%) rename {json => frontend/public/json}/openwebui.json (100%) rename {json => frontend/public/json}/openwrt.json (100%) rename {json => frontend/public/json}/opnsense-vm.json (100%) rename {json => frontend/public/json}/outline.json (100%) rename {json => frontend/public/json}/overseerr.json (100%) rename {json => frontend/public/json}/owncast.json (100%) rename {json => frontend/public/json}/owncloud-vm.json (100%) rename {json => frontend/public/json}/pairdrop.json (100%) rename {json => frontend/public/json}/paperless-ai.json (100%) rename {json => frontend/public/json}/paperless-gpt.json (100%) rename {json => frontend/public/json}/paperless-ngx.json (100%) rename {json => frontend/public/json}/part-db.json (100%) rename {json => frontend/public/json}/paymenter.json (100%) rename {json => frontend/public/json}/pbs-microcode.json (100%) rename {json => frontend/public/json}/peanut.json (100%) rename {json => frontend/public/json}/pelican-panel.json (100%) rename {json => frontend/public/json}/pelican-wings.json (100%) rename {json => frontend/public/json}/petio.json (100%) rename {json => frontend/public/json}/pf2etools.json (100%) rename {json => frontend/public/json}/photoprism.json (100%) rename {json => frontend/public/json}/phpipam.json (100%) rename {json => frontend/public/json}/pialert.json (100%) rename {json => frontend/public/json}/pihole.json (100%) rename {json => frontend/public/json}/pimox-haos-vm.json (100%) rename {json => frontend/public/json}/pingvin.json (100%) rename {json => frontend/public/json}/plant-it.json (100%) rename {json => frontend/public/json}/plex.json (100%) rename {json => frontend/public/json}/pocketbase.json (100%) rename {json => frontend/public/json}/pocketid.json (100%) rename {json => frontend/public/json}/podman-homeassistant.json (100%) rename {json => frontend/public/json}/podman.json (100%) rename {json => frontend/public/json}/post-pbs-install.json (100%) rename {json => frontend/public/json}/post-pmg-install.json (100%) rename {json => frontend/public/json}/post-pve-install.json (100%) rename {json => frontend/public/json}/postgresql.json (100%) rename {json => frontend/public/json}/privatebin.json (100%) rename {json => frontend/public/json}/projectsend.json (100%) rename {json => frontend/public/json}/prometheus-alertmanager.json (100%) rename {json => frontend/public/json}/prometheus-paperless-ngx-exporter.json (100%) rename {json => frontend/public/json}/prometheus-pve-exporter.json (100%) rename {json => frontend/public/json}/prometheus.json (100%) rename {json => frontend/public/json}/prowlarr.json (100%) rename {json => frontend/public/json}/proxmox-backup-server.json (100%) rename {json => frontend/public/json}/proxmox-datacenter-manager.json (100%) rename {json => frontend/public/json}/proxmox-mail-gateway.json (97%) rename {json => frontend/public/json}/ps5-mqtt.json (100%) rename {json => frontend/public/json}/pterodactyl-panel.json (100%) rename {json => frontend/public/json}/pterodactyl-wings.json (100%) rename {json => frontend/public/json}/qbittorrent.json (100%) rename {json => frontend/public/json}/rabbitmq.json (100%) rename {json => frontend/public/json}/radarr.json (100%) rename {json => frontend/public/json}/radicale.json (100%) rename {json => frontend/public/json}/rdtclient.json (100%) rename {json => frontend/public/json}/readarr.json (100%) rename {json => frontend/public/json}/readeck.json (100%) rename {json => frontend/public/json}/recyclarr.json (100%) rename {json => frontend/public/json}/redis.json (100%) rename {json => frontend/public/json}/revealjs.json (100%) rename {json => frontend/public/json}/rtsptoweb.json (100%) rename {json => frontend/public/json}/runtipi.json (100%) rename {json => frontend/public/json}/rustdeskserver.json (100%) rename {json => frontend/public/json}/sabnzbd.json (100%) rename {json => frontend/public/json}/scaling-governor.json (100%) rename {json => frontend/public/json}/seafile.json (100%) rename {json => frontend/public/json}/searxng.json (100%) rename {json => frontend/public/json}/seelf.json (100%) rename {json => frontend/public/json}/semaphore.json (100%) rename {json => frontend/public/json}/sftpgo.json (100%) rename {json => frontend/public/json}/shinobi.json (100%) rename {json => frontend/public/json}/silverbullet.json (100%) rename {json => frontend/public/json}/smokeping.json (100%) rename {json => frontend/public/json}/snipeit.json (100%) rename {json => frontend/public/json}/sonarr.json (100%) rename {json => frontend/public/json}/spoolman.json (100%) rename {json => frontend/public/json}/sqlserver2022.json (100%) rename {json => frontend/public/json}/stirling-pdf.json (100%) rename {json => frontend/public/json}/suwayomi-server.json (100%) rename {json => frontend/public/json}/syncthing.json (100%) rename {json => frontend/public/json}/tandoor.json (100%) rename {json => frontend/public/json}/tasmoadmin.json (100%) rename {json => frontend/public/json}/tasmocompiler.json (100%) rename {json => frontend/public/json}/tautulli.json (100%) rename {json => frontend/public/json}/tdarr.json (100%) rename {json => frontend/public/json}/technitiumdns.json (100%) rename {json => frontend/public/json}/teddycloud.json (100%) rename {json => frontend/public/json}/the-lounge.json (96%) rename {json => frontend/public/json}/threadfin.json (100%) rename {json => frontend/public/json}/tianji.json (100%) rename {json => frontend/public/json}/traccar.json (100%) rename {json => frontend/public/json}/traefik.json (100%) rename {json => frontend/public/json}/transmission.json (100%) rename {json => frontend/public/json}/trilium.json (100%) rename {json => frontend/public/json}/turnkey.json (100%) rename {json => frontend/public/json}/typesense.json (100%) rename {json => frontend/public/json}/ubuntu.json (100%) rename {json => frontend/public/json}/ubuntu2204-vm.json (100%) rename {json => frontend/public/json}/ubuntu2404-vm.json (100%) rename {json => frontend/public/json}/ubuntu2410-vm.json (100%) rename {json => frontend/public/json}/umami.json (100%) rename {json => frontend/public/json}/unbound.json (100%) rename {json => frontend/public/json}/unifi.json (100%) rename {json => frontend/public/json}/unmanic.json (100%) rename {json => frontend/public/json}/update-lxcs.json (100%) rename {json => frontend/public/json}/update-repo.json (100%) rename {json => frontend/public/json}/uptimekuma.json (100%) rename {json => frontend/public/json}/urbackupserver.json (100%) rename {json => frontend/public/json}/vaultwarden.json (100%) rename {json => frontend/public/json}/victoriametrics.json (100%) rename {json => frontend/public/json}/vikunja.json (100%) rename {json => frontend/public/json}/wallos.json (100%) rename {json => frontend/public/json}/wastebin.json (100%) rename {json => frontend/public/json}/watcharr.json (100%) rename {json => frontend/public/json}/watchyourlan.json (100%) rename {json => frontend/public/json}/wavelog.json (100%) rename {json => frontend/public/json}/web-check.json (100%) rename {json => frontend/public/json}/webmin.json (100%) rename {json => frontend/public/json}/wger.json (100%) rename {json => frontend/public/json}/whisparr.json (100%) rename {json => frontend/public/json}/whoogle.json (100%) rename {json => frontend/public/json}/wikijs.json (100%) rename {json => frontend/public/json}/wireguard.json (100%) rename {json => frontend/public/json}/wordpress.json (100%) rename {json => frontend/public/json}/yunohost.json (100%) rename {json => frontend/public/json}/zabbix.json (100%) rename {json => frontend/public/json}/zammad.json (100%) rename {json => frontend/public/json}/zerotier-one.json (100%) rename {json => frontend/public/json}/zigbee2mqtt.json (100%) rename {json => frontend/public/json}/zipline.json (100%) rename {json => frontend/public/json}/zitadel.json (100%) rename {json => frontend/public/json}/zoraxy.json (100%) rename {json => frontend/public/json}/zwave-js-ui.json (100%) diff --git a/.github/autolabeler-config.json b/.github/autolabeler-config.json index 5406bdaa4..50e73e910 100644 --- a/.github/autolabeler-config.json +++ b/.github/autolabeler-config.json @@ -38,7 +38,7 @@ "website": [ { "fileStatus": null, - "includeGlobs": ["frontend/**", "json/**"], + "includeGlobs": ["frontend/**"], "excludeGlobs": [] } ], @@ -59,7 +59,7 @@ "json": [ { "fileStatus": "modified", - "includeGlobs": ["json/**"], + "includeGlobs": ["frontend/public/json/**"], "excludeGlobs": [] } ], diff --git a/.github/workflows/frontend-cicd.yml b/.github/workflows/frontend-cicd.yml index c4f1a6418..ba24a484e 100644 --- a/.github/workflows/frontend-cicd.yml +++ b/.github/workflows/frontend-cicd.yml @@ -7,14 +7,12 @@ on: branches: ["main"] paths: - frontend/** - - json/** pull_request: branches: ["main"] types: [opened, synchronize, reopened, edited] paths: - frontend/** - - json/** workflow_dispatch: diff --git a/.github/workflows/update-json-date.yml b/.github/workflows/update-json-date.yml index 26957e50c..dbf14ce40 100644 --- a/.github/workflows/update-json-date.yml +++ b/.github/workflows/update-json-date.yml @@ -5,7 +5,7 @@ on: branches: - main paths: - - 'json/**.json' + - 'frontend/public/json/**.json' workflow_dispatch: jobs: @@ -49,7 +49,7 @@ jobs: - name: Get Newly Added JSON Files id: new_json_files run: | - git diff --name-only --diff-filter=A ${{ env.prev_commit }} HEAD | grep '^json/.*\.json$' > new_files.txt || true + git diff --name-only --diff-filter=A ${{ env.prev_commit }} HEAD | grep '^frontend/public/json/.*\.json$' > new_files.txt || true echo "New files detected:" cat new_files.txt || echo "No new files." @@ -87,7 +87,7 @@ jobs: - name: Check if there are any changes run: | echo "Checking for changes..." - git add -A # Untracked Dateien aufnehmen + git add -A git status if git diff --cached --quiet; then echo "No changes detected." diff --git a/.github/workflows/validate-filenames.yml b/.github/workflows/validate-filenames.yml index dac806260..ea7c632f6 100644 --- a/.github/workflows/validate-filenames.yml +++ b/.github/workflows/validate-filenames.yml @@ -5,7 +5,7 @@ on: paths: - "ct/*.sh" - "install/*.sh" - - "json/*.json" + - "frontend/public/json/*.json" jobs: check-files: diff --git a/frontend/public/json b/frontend/public/json deleted file mode 120000 index cd8045684..000000000 --- a/frontend/public/json +++ /dev/null @@ -1 +0,0 @@ -../../json \ No newline at end of file diff --git a/json/2fauth.json b/frontend/public/json/2fauth.json similarity index 100% rename from json/2fauth.json rename to frontend/public/json/2fauth.json diff --git a/json/actualbudget.json b/frontend/public/json/actualbudget.json similarity index 100% rename from json/actualbudget.json rename to frontend/public/json/actualbudget.json diff --git a/json/add-lxc-iptag.json b/frontend/public/json/add-lxc-iptag.json similarity index 100% rename from json/add-lxc-iptag.json rename to frontend/public/json/add-lxc-iptag.json diff --git a/json/add-netbird-lxc.json b/frontend/public/json/add-netbird-lxc.json similarity index 100% rename from json/add-netbird-lxc.json rename to frontend/public/json/add-netbird-lxc.json diff --git a/json/add-tailscale-lxc.json b/frontend/public/json/add-tailscale-lxc.json similarity index 100% rename from json/add-tailscale-lxc.json rename to frontend/public/json/add-tailscale-lxc.json diff --git a/json/adguard.json b/frontend/public/json/adguard.json similarity index 100% rename from json/adguard.json rename to frontend/public/json/adguard.json diff --git a/json/adventurelog.json b/frontend/public/json/adventurelog.json similarity index 100% rename from json/adventurelog.json rename to frontend/public/json/adventurelog.json diff --git a/json/agentdvr.json b/frontend/public/json/agentdvr.json similarity index 100% rename from json/agentdvr.json rename to frontend/public/json/agentdvr.json diff --git a/json/all-templates.json b/frontend/public/json/all-templates.json similarity index 100% rename from json/all-templates.json rename to frontend/public/json/all-templates.json diff --git a/json/alpine-it-tools.json b/frontend/public/json/alpine-it-tools.json similarity index 100% rename from json/alpine-it-tools.json rename to frontend/public/json/alpine-it-tools.json diff --git a/json/alpine.json b/frontend/public/json/alpine.json similarity index 100% rename from json/alpine.json rename to frontend/public/json/alpine.json diff --git a/json/apache-cassandra.json b/frontend/public/json/apache-cassandra.json similarity index 100% rename from json/apache-cassandra.json rename to frontend/public/json/apache-cassandra.json diff --git a/json/apache-couchdb.json b/frontend/public/json/apache-couchdb.json similarity index 100% rename from json/apache-couchdb.json rename to frontend/public/json/apache-couchdb.json diff --git a/json/apache-guacamole.json b/frontend/public/json/apache-guacamole.json similarity index 100% rename from json/apache-guacamole.json rename to frontend/public/json/apache-guacamole.json diff --git a/json/apache-tika.json b/frontend/public/json/apache-tika.json similarity index 100% rename from json/apache-tika.json rename to frontend/public/json/apache-tika.json diff --git a/json/apache-tomcat.json b/frontend/public/json/apache-tomcat.json similarity index 100% rename from json/apache-tomcat.json rename to frontend/public/json/apache-tomcat.json diff --git a/json/apt-cacher-ng.json b/frontend/public/json/apt-cacher-ng.json similarity index 100% rename from json/apt-cacher-ng.json rename to frontend/public/json/apt-cacher-ng.json diff --git a/json/archivebox.json b/frontend/public/json/archivebox.json similarity index 100% rename from json/archivebox.json rename to frontend/public/json/archivebox.json diff --git a/json/archlinux-vm.json b/frontend/public/json/archlinux-vm.json similarity index 100% rename from json/archlinux-vm.json rename to frontend/public/json/archlinux-vm.json diff --git a/json/aria2.json b/frontend/public/json/aria2.json similarity index 100% rename from json/aria2.json rename to frontend/public/json/aria2.json diff --git a/json/audiobookshelf.json b/frontend/public/json/audiobookshelf.json similarity index 100% rename from json/audiobookshelf.json rename to frontend/public/json/audiobookshelf.json diff --git a/json/authelia.json b/frontend/public/json/authelia.json similarity index 100% rename from json/authelia.json rename to frontend/public/json/authelia.json diff --git a/json/authentik.json b/frontend/public/json/authentik.json similarity index 100% rename from json/authentik.json rename to frontend/public/json/authentik.json diff --git a/json/autobrr.json b/frontend/public/json/autobrr.json similarity index 100% rename from json/autobrr.json rename to frontend/public/json/autobrr.json diff --git a/json/baikal.json b/frontend/public/json/baikal.json similarity index 100% rename from json/baikal.json rename to frontend/public/json/baikal.json diff --git a/json/barcode-buddy.json b/frontend/public/json/barcode-buddy.json similarity index 100% rename from json/barcode-buddy.json rename to frontend/public/json/barcode-buddy.json diff --git a/json/bazarr.json b/frontend/public/json/bazarr.json similarity index 100% rename from json/bazarr.json rename to frontend/public/json/bazarr.json diff --git a/json/beszel.json b/frontend/public/json/beszel.json similarity index 100% rename from json/beszel.json rename to frontend/public/json/beszel.json diff --git a/json/blocky.json b/frontend/public/json/blocky.json similarity index 100% rename from json/blocky.json rename to frontend/public/json/blocky.json diff --git a/json/boltdiy.json b/frontend/public/json/boltdiy.json similarity index 100% rename from json/boltdiy.json rename to frontend/public/json/boltdiy.json diff --git a/json/bookstack.json b/frontend/public/json/bookstack.json similarity index 100% rename from json/bookstack.json rename to frontend/public/json/bookstack.json diff --git a/json/bunkerweb.json b/frontend/public/json/bunkerweb.json similarity index 100% rename from json/bunkerweb.json rename to frontend/public/json/bunkerweb.json diff --git a/json/bytestash.json b/frontend/public/json/bytestash.json similarity index 100% rename from json/bytestash.json rename to frontend/public/json/bytestash.json diff --git a/json/caddy.json b/frontend/public/json/caddy.json similarity index 100% rename from json/caddy.json rename to frontend/public/json/caddy.json diff --git a/json/calibre-web.json b/frontend/public/json/calibre-web.json similarity index 100% rename from json/calibre-web.json rename to frontend/public/json/calibre-web.json diff --git a/json/casaos.json b/frontend/public/json/casaos.json similarity index 100% rename from json/casaos.json rename to frontend/public/json/casaos.json diff --git a/json/changedetection.json b/frontend/public/json/changedetection.json similarity index 100% rename from json/changedetection.json rename to frontend/public/json/changedetection.json diff --git a/json/channels.json b/frontend/public/json/channels.json similarity index 100% rename from json/channels.json rename to frontend/public/json/channels.json diff --git a/json/checkmk.json b/frontend/public/json/checkmk.json similarity index 100% rename from json/checkmk.json rename to frontend/public/json/checkmk.json diff --git a/json/clean-lxcs.json b/frontend/public/json/clean-lxcs.json similarity index 100% rename from json/clean-lxcs.json rename to frontend/public/json/clean-lxcs.json diff --git a/json/clean-orphaned-lvm.json b/frontend/public/json/clean-orphaned-lvm.json similarity index 100% rename from json/clean-orphaned-lvm.json rename to frontend/public/json/clean-orphaned-lvm.json diff --git a/json/cloudflared.json b/frontend/public/json/cloudflared.json similarity index 100% rename from json/cloudflared.json rename to frontend/public/json/cloudflared.json diff --git a/json/cockpit.json b/frontend/public/json/cockpit.json similarity index 100% rename from json/cockpit.json rename to frontend/public/json/cockpit.json diff --git a/json/code-server.json b/frontend/public/json/code-server.json similarity index 100% rename from json/code-server.json rename to frontend/public/json/code-server.json diff --git a/json/commafeed.json b/frontend/public/json/commafeed.json similarity index 100% rename from json/commafeed.json rename to frontend/public/json/commafeed.json diff --git a/json/cosmos.json b/frontend/public/json/cosmos.json similarity index 100% rename from json/cosmos.json rename to frontend/public/json/cosmos.json diff --git a/json/crafty-controller.json b/frontend/public/json/crafty-controller.json similarity index 100% rename from json/crafty-controller.json rename to frontend/public/json/crafty-controller.json diff --git a/json/cron-update-lxcs.json b/frontend/public/json/cron-update-lxcs.json similarity index 100% rename from json/cron-update-lxcs.json rename to frontend/public/json/cron-update-lxcs.json diff --git a/json/cronicle.json b/frontend/public/json/cronicle.json similarity index 100% rename from json/cronicle.json rename to frontend/public/json/cronicle.json diff --git a/json/cross-seed.json b/frontend/public/json/cross-seed.json similarity index 100% rename from json/cross-seed.json rename to frontend/public/json/cross-seed.json diff --git a/json/crowdsec.json b/frontend/public/json/crowdsec.json similarity index 100% rename from json/crowdsec.json rename to frontend/public/json/crowdsec.json diff --git a/json/daemonsync.json b/frontend/public/json/daemonsync.json similarity index 100% rename from json/daemonsync.json rename to frontend/public/json/daemonsync.json diff --git a/json/dashy.json b/frontend/public/json/dashy.json similarity index 100% rename from json/dashy.json rename to frontend/public/json/dashy.json diff --git a/json/debian-vm.json b/frontend/public/json/debian-vm.json similarity index 100% rename from json/debian-vm.json rename to frontend/public/json/debian-vm.json diff --git a/json/debian.json b/frontend/public/json/debian.json similarity index 100% rename from json/debian.json rename to frontend/public/json/debian.json diff --git a/json/deconz.json b/frontend/public/json/deconz.json similarity index 100% rename from json/deconz.json rename to frontend/public/json/deconz.json diff --git a/json/deluge.json b/frontend/public/json/deluge.json similarity index 100% rename from json/deluge.json rename to frontend/public/json/deluge.json diff --git a/json/docker-vm.json b/frontend/public/json/docker-vm.json similarity index 100% rename from json/docker-vm.json rename to frontend/public/json/docker-vm.json diff --git a/json/docker.json b/frontend/public/json/docker.json similarity index 100% rename from json/docker.json rename to frontend/public/json/docker.json diff --git a/json/dockge.json b/frontend/public/json/dockge.json similarity index 100% rename from json/dockge.json rename to frontend/public/json/dockge.json diff --git a/json/docmost.json b/frontend/public/json/docmost.json similarity index 100% rename from json/docmost.json rename to frontend/public/json/docmost.json diff --git a/json/dolibarr.json b/frontend/public/json/dolibarr.json similarity index 100% rename from json/dolibarr.json rename to frontend/public/json/dolibarr.json diff --git a/json/dotnetaspwebapi.json b/frontend/public/json/dotnetaspwebapi.json similarity index 100% rename from json/dotnetaspwebapi.json rename to frontend/public/json/dotnetaspwebapi.json diff --git a/json/duplicati.json b/frontend/public/json/duplicati.json similarity index 100% rename from json/duplicati.json rename to frontend/public/json/duplicati.json diff --git a/json/elementsynapse.json b/frontend/public/json/elementsynapse.json similarity index 100% rename from json/elementsynapse.json rename to frontend/public/json/elementsynapse.json diff --git a/json/emby.json b/frontend/public/json/emby.json similarity index 100% rename from json/emby.json rename to frontend/public/json/emby.json diff --git a/json/emqx.json b/frontend/public/json/emqx.json similarity index 100% rename from json/emqx.json rename to frontend/public/json/emqx.json diff --git a/json/ersatztv.json b/frontend/public/json/ersatztv.json similarity index 100% rename from json/ersatztv.json rename to frontend/public/json/ersatztv.json diff --git a/json/esphome.json b/frontend/public/json/esphome.json similarity index 100% rename from json/esphome.json rename to frontend/public/json/esphome.json diff --git a/json/evcc.json b/frontend/public/json/evcc.json similarity index 100% rename from json/evcc.json rename to frontend/public/json/evcc.json diff --git a/json/excalidraw.json b/frontend/public/json/excalidraw.json similarity index 100% rename from json/excalidraw.json rename to frontend/public/json/excalidraw.json diff --git a/json/fenrus.json b/frontend/public/json/fenrus.json similarity index 100% rename from json/fenrus.json rename to frontend/public/json/fenrus.json diff --git a/json/fhem.json b/frontend/public/json/fhem.json similarity index 100% rename from json/fhem.json rename to frontend/public/json/fhem.json diff --git a/json/filebrowser.json b/frontend/public/json/filebrowser.json similarity index 100% rename from json/filebrowser.json rename to frontend/public/json/filebrowser.json diff --git a/json/firefly.json b/frontend/public/json/firefly.json similarity index 100% rename from json/firefly.json rename to frontend/public/json/firefly.json diff --git a/json/flaresolverr.json b/frontend/public/json/flaresolverr.json similarity index 100% rename from json/flaresolverr.json rename to frontend/public/json/flaresolverr.json diff --git a/json/flowiseai.json b/frontend/public/json/flowiseai.json similarity index 100% rename from json/flowiseai.json rename to frontend/public/json/flowiseai.json diff --git a/json/fluid-calendar.json b/frontend/public/json/fluid-calendar.json similarity index 100% rename from json/fluid-calendar.json rename to frontend/public/json/fluid-calendar.json diff --git a/json/forgejo.json b/frontend/public/json/forgejo.json similarity index 100% rename from json/forgejo.json rename to frontend/public/json/forgejo.json diff --git a/json/freshrss.json b/frontend/public/json/freshrss.json similarity index 100% rename from json/freshrss.json rename to frontend/public/json/freshrss.json diff --git a/json/frigate.json b/frontend/public/json/frigate.json similarity index 100% rename from json/frigate.json rename to frontend/public/json/frigate.json diff --git a/json/fstrim.json b/frontend/public/json/fstrim.json similarity index 100% rename from json/fstrim.json rename to frontend/public/json/fstrim.json diff --git a/json/ghost.json b/frontend/public/json/ghost.json similarity index 100% rename from json/ghost.json rename to frontend/public/json/ghost.json diff --git a/json/gitea.json b/frontend/public/json/gitea.json similarity index 100% rename from json/gitea.json rename to frontend/public/json/gitea.json diff --git a/json/glance.json b/frontend/public/json/glance.json similarity index 100% rename from json/glance.json rename to frontend/public/json/glance.json diff --git a/json/glances.json b/frontend/public/json/glances.json similarity index 100% rename from json/glances.json rename to frontend/public/json/glances.json diff --git a/json/glpi.json b/frontend/public/json/glpi.json similarity index 100% rename from json/glpi.json rename to frontend/public/json/glpi.json diff --git a/json/go2rtc.json b/frontend/public/json/go2rtc.json similarity index 100% rename from json/go2rtc.json rename to frontend/public/json/go2rtc.json diff --git a/json/gokapi.json b/frontend/public/json/gokapi.json similarity index 100% rename from json/gokapi.json rename to frontend/public/json/gokapi.json diff --git a/json/gomft.json b/frontend/public/json/gomft.json similarity index 100% rename from json/gomft.json rename to frontend/public/json/gomft.json diff --git a/json/gotify.json b/frontend/public/json/gotify.json similarity index 100% rename from json/gotify.json rename to frontend/public/json/gotify.json diff --git a/json/grafana.json b/frontend/public/json/grafana.json similarity index 100% rename from json/grafana.json rename to frontend/public/json/grafana.json diff --git a/json/graylog.json b/frontend/public/json/graylog.json similarity index 100% rename from json/graylog.json rename to frontend/public/json/graylog.json diff --git a/json/grist.json b/frontend/public/json/grist.json similarity index 100% rename from json/grist.json rename to frontend/public/json/grist.json diff --git a/json/grocy.json b/frontend/public/json/grocy.json similarity index 100% rename from json/grocy.json rename to frontend/public/json/grocy.json diff --git a/json/habitica.json b/frontend/public/json/habitica.json similarity index 100% rename from json/habitica.json rename to frontend/public/json/habitica.json diff --git a/json/haos-vm.json b/frontend/public/json/haos-vm.json similarity index 100% rename from json/haos-vm.json rename to frontend/public/json/haos-vm.json diff --git a/json/headscale.json b/frontend/public/json/headscale.json similarity index 100% rename from json/headscale.json rename to frontend/public/json/headscale.json diff --git a/json/heimdall-dashboard.json b/frontend/public/json/heimdall-dashboard.json similarity index 100% rename from json/heimdall-dashboard.json rename to frontend/public/json/heimdall-dashboard.json diff --git a/json/hev-socks5-server.json b/frontend/public/json/hev-socks5-server.json similarity index 100% rename from json/hev-socks5-server.json rename to frontend/public/json/hev-socks5-server.json diff --git a/json/hivemq.json b/frontend/public/json/hivemq.json similarity index 100% rename from json/hivemq.json rename to frontend/public/json/hivemq.json diff --git a/json/hoarder.json b/frontend/public/json/hoarder.json similarity index 100% rename from json/hoarder.json rename to frontend/public/json/hoarder.json diff --git a/json/homarr.json b/frontend/public/json/homarr.json similarity index 100% rename from json/homarr.json rename to frontend/public/json/homarr.json diff --git a/json/homeassistant-core.json b/frontend/public/json/homeassistant-core.json similarity index 100% rename from json/homeassistant-core.json rename to frontend/public/json/homeassistant-core.json diff --git a/json/homeassistant.json b/frontend/public/json/homeassistant.json similarity index 100% rename from json/homeassistant.json rename to frontend/public/json/homeassistant.json diff --git a/json/homebox.json b/frontend/public/json/homebox.json similarity index 100% rename from json/homebox.json rename to frontend/public/json/homebox.json diff --git a/json/homebridge.json b/frontend/public/json/homebridge.json similarity index 100% rename from json/homebridge.json rename to frontend/public/json/homebridge.json diff --git a/json/homepage.json b/frontend/public/json/homepage.json similarity index 100% rename from json/homepage.json rename to frontend/public/json/homepage.json diff --git a/json/homer.json b/frontend/public/json/homer.json similarity index 100% rename from json/homer.json rename to frontend/public/json/homer.json diff --git a/json/host-backup.json b/frontend/public/json/host-backup.json similarity index 100% rename from json/host-backup.json rename to frontend/public/json/host-backup.json diff --git a/json/hyperhdr.json b/frontend/public/json/hyperhdr.json similarity index 100% rename from json/hyperhdr.json rename to frontend/public/json/hyperhdr.json diff --git a/json/hyperion.json b/frontend/public/json/hyperion.json similarity index 100% rename from json/hyperion.json rename to frontend/public/json/hyperion.json diff --git a/json/influxdb.json b/frontend/public/json/influxdb.json similarity index 100% rename from json/influxdb.json rename to frontend/public/json/influxdb.json diff --git a/json/inspircd.json b/frontend/public/json/inspircd.json similarity index 100% rename from json/inspircd.json rename to frontend/public/json/inspircd.json diff --git a/json/inventree.json b/frontend/public/json/inventree.json similarity index 100% rename from json/inventree.json rename to frontend/public/json/inventree.json diff --git a/json/iobroker.json b/frontend/public/json/iobroker.json similarity index 100% rename from json/iobroker.json rename to frontend/public/json/iobroker.json diff --git a/json/iventoy.json b/frontend/public/json/iventoy.json similarity index 100% rename from json/iventoy.json rename to frontend/public/json/iventoy.json diff --git a/json/jackett.json b/frontend/public/json/jackett.json similarity index 100% rename from json/jackett.json rename to frontend/public/json/jackett.json diff --git a/json/jellyfin.json b/frontend/public/json/jellyfin.json similarity index 100% rename from json/jellyfin.json rename to frontend/public/json/jellyfin.json diff --git a/json/jellyseerr.json b/frontend/public/json/jellyseerr.json similarity index 100% rename from json/jellyseerr.json rename to frontend/public/json/jellyseerr.json diff --git a/json/jenkins.json b/frontend/public/json/jenkins.json similarity index 100% rename from json/jenkins.json rename to frontend/public/json/jenkins.json diff --git a/json/jupyternotebook.json b/frontend/public/json/jupyternotebook.json similarity index 100% rename from json/jupyternotebook.json rename to frontend/public/json/jupyternotebook.json diff --git a/json/kavita.json b/frontend/public/json/kavita.json similarity index 100% rename from json/kavita.json rename to frontend/public/json/kavita.json diff --git a/json/kernel-clean.json b/frontend/public/json/kernel-clean.json similarity index 100% rename from json/kernel-clean.json rename to frontend/public/json/kernel-clean.json diff --git a/json/kernel-pin.json b/frontend/public/json/kernel-pin.json similarity index 100% rename from json/kernel-pin.json rename to frontend/public/json/kernel-pin.json diff --git a/json/keycloak.json b/frontend/public/json/keycloak.json similarity index 100% rename from json/keycloak.json rename to frontend/public/json/keycloak.json diff --git a/json/kimai.json b/frontend/public/json/kimai.json similarity index 100% rename from json/kimai.json rename to frontend/public/json/kimai.json diff --git a/json/koillection.json b/frontend/public/json/koillection.json similarity index 100% rename from json/koillection.json rename to frontend/public/json/koillection.json diff --git a/json/kometa.json b/frontend/public/json/kometa.json similarity index 100% rename from json/kometa.json rename to frontend/public/json/kometa.json diff --git a/json/komga.json b/frontend/public/json/komga.json similarity index 97% rename from json/komga.json rename to frontend/public/json/komga.json index cd3a8a448..79a077983 100644 --- a/json/komga.json +++ b/frontend/public/json/komga.json @@ -1,39 +1,39 @@ -{ - "name": "Komga", - "slug": "komga", - "categories": [ - 13 - ], - "date_created": "2024-11-15", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 25600, - "documentation": "https://komga.org/docs/introduction", - "website": "https://komga.org/", - "logo": "https://raw.githubusercontent.com/gotson/komga/25a1cfa8660c57335313c244e41c248371ffd9d6/komga-webui/src/assets/logo.svg", - "description": "A media server for your comics, mangas, BDs, magazines and eBooks. Organize your CBZ, CBR, PDF and EPUB files in different libraries, collections or reading lists. Use the integrated Webreader, the Mihon extension, any OPDS reader, or other integrations. Edit metadata for your series and books.", - "install_methods": [ - { - "type": "default", - "script": "ct/komga.sh", - "resources": { - "cpu": 1, - "ram": 2048, - "hdd": 4, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "Starting Komga (Web UI) may take up to 2 minutes after a restart or fresh installation.", - "type": "info" - } - ] -} +{ + "name": "Komga", + "slug": "komga", + "categories": [ + 13 + ], + "date_created": "2024-11-15", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 25600, + "documentation": "https://komga.org/docs/introduction", + "website": "https://komga.org/", + "logo": "https://raw.githubusercontent.com/gotson/komga/25a1cfa8660c57335313c244e41c248371ffd9d6/komga-webui/src/assets/logo.svg", + "description": "A media server for your comics, mangas, BDs, magazines and eBooks. Organize your CBZ, CBR, PDF and EPUB files in different libraries, collections or reading lists. Use the integrated Webreader, the Mihon extension, any OPDS reader, or other integrations. Edit metadata for your series and books.", + "install_methods": [ + { + "type": "default", + "script": "ct/komga.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Starting Komga (Web UI) may take up to 2 minutes after a restart or fresh installation.", + "type": "info" + } + ] +} diff --git a/json/komodo.json b/frontend/public/json/komodo.json similarity index 100% rename from json/komodo.json rename to frontend/public/json/komodo.json diff --git a/json/kubo.json b/frontend/public/json/kubo.json similarity index 100% rename from json/kubo.json rename to frontend/public/json/kubo.json diff --git a/json/lazylibrarian.json b/frontend/public/json/lazylibrarian.json similarity index 100% rename from json/lazylibrarian.json rename to frontend/public/json/lazylibrarian.json diff --git a/json/lidarr.json b/frontend/public/json/lidarr.json similarity index 100% rename from json/lidarr.json rename to frontend/public/json/lidarr.json diff --git a/json/linkwarden.json b/frontend/public/json/linkwarden.json similarity index 100% rename from json/linkwarden.json rename to frontend/public/json/linkwarden.json diff --git a/json/listmonk.json b/frontend/public/json/listmonk.json similarity index 100% rename from json/listmonk.json rename to frontend/public/json/listmonk.json diff --git a/json/lldap.json b/frontend/public/json/lldap.json similarity index 100% rename from json/lldap.json rename to frontend/public/json/lldap.json diff --git a/json/lubelogger.json b/frontend/public/json/lubelogger.json similarity index 100% rename from json/lubelogger.json rename to frontend/public/json/lubelogger.json diff --git a/json/lxc-delete.json b/frontend/public/json/lxc-delete.json similarity index 100% rename from json/lxc-delete.json rename to frontend/public/json/lxc-delete.json diff --git a/json/mafl.json b/frontend/public/json/mafl.json similarity index 100% rename from json/mafl.json rename to frontend/public/json/mafl.json diff --git a/json/magicmirror.json b/frontend/public/json/magicmirror.json similarity index 100% rename from json/magicmirror.json rename to frontend/public/json/magicmirror.json diff --git a/json/mariadb.json b/frontend/public/json/mariadb.json similarity index 100% rename from json/mariadb.json rename to frontend/public/json/mariadb.json diff --git a/json/matterbridge.json b/frontend/public/json/matterbridge.json similarity index 100% rename from json/matterbridge.json rename to frontend/public/json/matterbridge.json diff --git a/json/mattermost.json b/frontend/public/json/mattermost.json similarity index 100% rename from json/mattermost.json rename to frontend/public/json/mattermost.json diff --git a/json/mediamtx.json b/frontend/public/json/mediamtx.json similarity index 100% rename from json/mediamtx.json rename to frontend/public/json/mediamtx.json diff --git a/json/medusa.json b/frontend/public/json/medusa.json similarity index 100% rename from json/medusa.json rename to frontend/public/json/medusa.json diff --git a/json/memos.json b/frontend/public/json/memos.json similarity index 100% rename from json/memos.json rename to frontend/public/json/memos.json diff --git a/json/meshcentral.json b/frontend/public/json/meshcentral.json similarity index 100% rename from json/meshcentral.json rename to frontend/public/json/meshcentral.json diff --git a/json/metadata.json b/frontend/public/json/metadata.json similarity index 100% rename from json/metadata.json rename to frontend/public/json/metadata.json diff --git a/json/metube.json b/frontend/public/json/metube.json similarity index 100% rename from json/metube.json rename to frontend/public/json/metube.json diff --git a/json/microcode.json b/frontend/public/json/microcode.json similarity index 100% rename from json/microcode.json rename to frontend/public/json/microcode.json diff --git a/json/mikrotik-routeros.json b/frontend/public/json/mikrotik-routeros.json similarity index 100% rename from json/mikrotik-routeros.json rename to frontend/public/json/mikrotik-routeros.json diff --git a/json/minio.json b/frontend/public/json/minio.json similarity index 100% rename from json/minio.json rename to frontend/public/json/minio.json diff --git a/json/mongodb.json b/frontend/public/json/mongodb.json similarity index 100% rename from json/mongodb.json rename to frontend/public/json/mongodb.json diff --git a/json/monica.json b/frontend/public/json/monica.json similarity index 100% rename from json/monica.json rename to frontend/public/json/monica.json diff --git a/json/monitor-all.json b/frontend/public/json/monitor-all.json similarity index 100% rename from json/monitor-all.json rename to frontend/public/json/monitor-all.json diff --git a/json/motioneye.json b/frontend/public/json/motioneye.json similarity index 100% rename from json/motioneye.json rename to frontend/public/json/motioneye.json diff --git a/json/mqtt.json b/frontend/public/json/mqtt.json similarity index 100% rename from json/mqtt.json rename to frontend/public/json/mqtt.json diff --git a/json/mylar3.json b/frontend/public/json/mylar3.json similarity index 100% rename from json/mylar3.json rename to frontend/public/json/mylar3.json diff --git a/json/myspeed.json b/frontend/public/json/myspeed.json similarity index 100% rename from json/myspeed.json rename to frontend/public/json/myspeed.json diff --git a/json/mysql.json b/frontend/public/json/mysql.json similarity index 100% rename from json/mysql.json rename to frontend/public/json/mysql.json diff --git a/json/n8n.json b/frontend/public/json/n8n.json similarity index 100% rename from json/n8n.json rename to frontend/public/json/n8n.json diff --git a/json/navidrome.json b/frontend/public/json/navidrome.json similarity index 100% rename from json/navidrome.json rename to frontend/public/json/navidrome.json diff --git a/json/neo4j.json b/frontend/public/json/neo4j.json similarity index 100% rename from json/neo4j.json rename to frontend/public/json/neo4j.json diff --git a/json/netbox.json b/frontend/public/json/netbox.json similarity index 100% rename from json/netbox.json rename to frontend/public/json/netbox.json diff --git a/json/netdata.json b/frontend/public/json/netdata.json similarity index 100% rename from json/netdata.json rename to frontend/public/json/netdata.json diff --git a/json/nextcloud-vm.json b/frontend/public/json/nextcloud-vm.json similarity index 100% rename from json/nextcloud-vm.json rename to frontend/public/json/nextcloud-vm.json diff --git a/json/nextcloudpi.json b/frontend/public/json/nextcloudpi.json similarity index 100% rename from json/nextcloudpi.json rename to frontend/public/json/nextcloudpi.json diff --git a/json/nextpvr.json b/frontend/public/json/nextpvr.json similarity index 100% rename from json/nextpvr.json rename to frontend/public/json/nextpvr.json diff --git a/json/nginxproxymanager.json b/frontend/public/json/nginxproxymanager.json similarity index 100% rename from json/nginxproxymanager.json rename to frontend/public/json/nginxproxymanager.json diff --git a/json/nocodb.json b/frontend/public/json/nocodb.json similarity index 100% rename from json/nocodb.json rename to frontend/public/json/nocodb.json diff --git a/json/node-red.json b/frontend/public/json/node-red.json similarity index 100% rename from json/node-red.json rename to frontend/public/json/node-red.json diff --git a/json/nodebb.json b/frontend/public/json/nodebb.json similarity index 100% rename from json/nodebb.json rename to frontend/public/json/nodebb.json diff --git a/json/notifiarr.json b/frontend/public/json/notifiarr.json similarity index 100% rename from json/notifiarr.json rename to frontend/public/json/notifiarr.json diff --git a/json/npmplus.json b/frontend/public/json/npmplus.json similarity index 100% rename from json/npmplus.json rename to frontend/public/json/npmplus.json diff --git a/json/ntfy.json b/frontend/public/json/ntfy.json similarity index 100% rename from json/ntfy.json rename to frontend/public/json/ntfy.json diff --git a/json/nxwitness.json b/frontend/public/json/nxwitness.json similarity index 100% rename from json/nxwitness.json rename to frontend/public/json/nxwitness.json diff --git a/json/nzbget.json b/frontend/public/json/nzbget.json similarity index 100% rename from json/nzbget.json rename to frontend/public/json/nzbget.json diff --git a/json/octoprint.json b/frontend/public/json/octoprint.json similarity index 100% rename from json/octoprint.json rename to frontend/public/json/octoprint.json diff --git a/json/olivetin.json b/frontend/public/json/olivetin.json similarity index 100% rename from json/olivetin.json rename to frontend/public/json/olivetin.json diff --git a/json/omada.json b/frontend/public/json/omada.json similarity index 100% rename from json/omada.json rename to frontend/public/json/omada.json diff --git a/json/ombi.json b/frontend/public/json/ombi.json similarity index 100% rename from json/ombi.json rename to frontend/public/json/ombi.json diff --git a/json/omv.json b/frontend/public/json/omv.json similarity index 100% rename from json/omv.json rename to frontend/public/json/omv.json diff --git a/json/onedev.json b/frontend/public/json/onedev.json similarity index 100% rename from json/onedev.json rename to frontend/public/json/onedev.json diff --git a/json/opengist.json b/frontend/public/json/opengist.json similarity index 100% rename from json/opengist.json rename to frontend/public/json/opengist.json diff --git a/json/openhab.json b/frontend/public/json/openhab.json similarity index 100% rename from json/openhab.json rename to frontend/public/json/openhab.json diff --git a/json/openobserve.json b/frontend/public/json/openobserve.json similarity index 100% rename from json/openobserve.json rename to frontend/public/json/openobserve.json diff --git a/json/openwebui.json b/frontend/public/json/openwebui.json similarity index 100% rename from json/openwebui.json rename to frontend/public/json/openwebui.json diff --git a/json/openwrt.json b/frontend/public/json/openwrt.json similarity index 100% rename from json/openwrt.json rename to frontend/public/json/openwrt.json diff --git a/json/opnsense-vm.json b/frontend/public/json/opnsense-vm.json similarity index 100% rename from json/opnsense-vm.json rename to frontend/public/json/opnsense-vm.json diff --git a/json/outline.json b/frontend/public/json/outline.json similarity index 100% rename from json/outline.json rename to frontend/public/json/outline.json diff --git a/json/overseerr.json b/frontend/public/json/overseerr.json similarity index 100% rename from json/overseerr.json rename to frontend/public/json/overseerr.json diff --git a/json/owncast.json b/frontend/public/json/owncast.json similarity index 100% rename from json/owncast.json rename to frontend/public/json/owncast.json diff --git a/json/owncloud-vm.json b/frontend/public/json/owncloud-vm.json similarity index 100% rename from json/owncloud-vm.json rename to frontend/public/json/owncloud-vm.json diff --git a/json/pairdrop.json b/frontend/public/json/pairdrop.json similarity index 100% rename from json/pairdrop.json rename to frontend/public/json/pairdrop.json diff --git a/json/paperless-ai.json b/frontend/public/json/paperless-ai.json similarity index 100% rename from json/paperless-ai.json rename to frontend/public/json/paperless-ai.json diff --git a/json/paperless-gpt.json b/frontend/public/json/paperless-gpt.json similarity index 100% rename from json/paperless-gpt.json rename to frontend/public/json/paperless-gpt.json diff --git a/json/paperless-ngx.json b/frontend/public/json/paperless-ngx.json similarity index 100% rename from json/paperless-ngx.json rename to frontend/public/json/paperless-ngx.json diff --git a/json/part-db.json b/frontend/public/json/part-db.json similarity index 100% rename from json/part-db.json rename to frontend/public/json/part-db.json diff --git a/json/paymenter.json b/frontend/public/json/paymenter.json similarity index 100% rename from json/paymenter.json rename to frontend/public/json/paymenter.json diff --git a/json/pbs-microcode.json b/frontend/public/json/pbs-microcode.json similarity index 100% rename from json/pbs-microcode.json rename to frontend/public/json/pbs-microcode.json diff --git a/json/peanut.json b/frontend/public/json/peanut.json similarity index 100% rename from json/peanut.json rename to frontend/public/json/peanut.json diff --git a/json/pelican-panel.json b/frontend/public/json/pelican-panel.json similarity index 100% rename from json/pelican-panel.json rename to frontend/public/json/pelican-panel.json diff --git a/json/pelican-wings.json b/frontend/public/json/pelican-wings.json similarity index 100% rename from json/pelican-wings.json rename to frontend/public/json/pelican-wings.json diff --git a/json/petio.json b/frontend/public/json/petio.json similarity index 100% rename from json/petio.json rename to frontend/public/json/petio.json diff --git a/json/pf2etools.json b/frontend/public/json/pf2etools.json similarity index 100% rename from json/pf2etools.json rename to frontend/public/json/pf2etools.json diff --git a/json/photoprism.json b/frontend/public/json/photoprism.json similarity index 100% rename from json/photoprism.json rename to frontend/public/json/photoprism.json diff --git a/json/phpipam.json b/frontend/public/json/phpipam.json similarity index 100% rename from json/phpipam.json rename to frontend/public/json/phpipam.json diff --git a/json/pialert.json b/frontend/public/json/pialert.json similarity index 100% rename from json/pialert.json rename to frontend/public/json/pialert.json diff --git a/json/pihole.json b/frontend/public/json/pihole.json similarity index 100% rename from json/pihole.json rename to frontend/public/json/pihole.json diff --git a/json/pimox-haos-vm.json b/frontend/public/json/pimox-haos-vm.json similarity index 100% rename from json/pimox-haos-vm.json rename to frontend/public/json/pimox-haos-vm.json diff --git a/json/pingvin.json b/frontend/public/json/pingvin.json similarity index 100% rename from json/pingvin.json rename to frontend/public/json/pingvin.json diff --git a/json/plant-it.json b/frontend/public/json/plant-it.json similarity index 100% rename from json/plant-it.json rename to frontend/public/json/plant-it.json diff --git a/json/plex.json b/frontend/public/json/plex.json similarity index 100% rename from json/plex.json rename to frontend/public/json/plex.json diff --git a/json/pocketbase.json b/frontend/public/json/pocketbase.json similarity index 100% rename from json/pocketbase.json rename to frontend/public/json/pocketbase.json diff --git a/json/pocketid.json b/frontend/public/json/pocketid.json similarity index 100% rename from json/pocketid.json rename to frontend/public/json/pocketid.json diff --git a/json/podman-homeassistant.json b/frontend/public/json/podman-homeassistant.json similarity index 100% rename from json/podman-homeassistant.json rename to frontend/public/json/podman-homeassistant.json diff --git a/json/podman.json b/frontend/public/json/podman.json similarity index 100% rename from json/podman.json rename to frontend/public/json/podman.json diff --git a/json/post-pbs-install.json b/frontend/public/json/post-pbs-install.json similarity index 100% rename from json/post-pbs-install.json rename to frontend/public/json/post-pbs-install.json diff --git a/json/post-pmg-install.json b/frontend/public/json/post-pmg-install.json similarity index 100% rename from json/post-pmg-install.json rename to frontend/public/json/post-pmg-install.json diff --git a/json/post-pve-install.json b/frontend/public/json/post-pve-install.json similarity index 100% rename from json/post-pve-install.json rename to frontend/public/json/post-pve-install.json diff --git a/json/postgresql.json b/frontend/public/json/postgresql.json similarity index 100% rename from json/postgresql.json rename to frontend/public/json/postgresql.json diff --git a/json/privatebin.json b/frontend/public/json/privatebin.json similarity index 100% rename from json/privatebin.json rename to frontend/public/json/privatebin.json diff --git a/json/projectsend.json b/frontend/public/json/projectsend.json similarity index 100% rename from json/projectsend.json rename to frontend/public/json/projectsend.json diff --git a/json/prometheus-alertmanager.json b/frontend/public/json/prometheus-alertmanager.json similarity index 100% rename from json/prometheus-alertmanager.json rename to frontend/public/json/prometheus-alertmanager.json diff --git a/json/prometheus-paperless-ngx-exporter.json b/frontend/public/json/prometheus-paperless-ngx-exporter.json similarity index 100% rename from json/prometheus-paperless-ngx-exporter.json rename to frontend/public/json/prometheus-paperless-ngx-exporter.json diff --git a/json/prometheus-pve-exporter.json b/frontend/public/json/prometheus-pve-exporter.json similarity index 100% rename from json/prometheus-pve-exporter.json rename to frontend/public/json/prometheus-pve-exporter.json diff --git a/json/prometheus.json b/frontend/public/json/prometheus.json similarity index 100% rename from json/prometheus.json rename to frontend/public/json/prometheus.json diff --git a/json/prowlarr.json b/frontend/public/json/prowlarr.json similarity index 100% rename from json/prowlarr.json rename to frontend/public/json/prowlarr.json diff --git a/json/proxmox-backup-server.json b/frontend/public/json/proxmox-backup-server.json similarity index 100% rename from json/proxmox-backup-server.json rename to frontend/public/json/proxmox-backup-server.json diff --git a/json/proxmox-datacenter-manager.json b/frontend/public/json/proxmox-datacenter-manager.json similarity index 100% rename from json/proxmox-datacenter-manager.json rename to frontend/public/json/proxmox-datacenter-manager.json diff --git a/json/proxmox-mail-gateway.json b/frontend/public/json/proxmox-mail-gateway.json similarity index 97% rename from json/proxmox-mail-gateway.json rename to frontend/public/json/proxmox-mail-gateway.json index b09f1bed9..55b7ea51a 100644 --- a/json/proxmox-mail-gateway.json +++ b/frontend/public/json/proxmox-mail-gateway.json @@ -1,39 +1,39 @@ -{ - "name": "Promox Mail Gateway", - "slug": "proxmox-mail-gateway", - "categories": [ - 1 - ], - "date_created": "2025-02-04", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8006, - "documentation": "https://pmg.proxmox.com/pmg-docs/pmg-admin-guide.html", - "website": "https://www.proxmox.com/en/products/proxmox-mail-gateway/overview", - "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", - "description": "Proxmox Mail Gateway is the leading open-source email security solution helping you to protect your mail server against all email threats from the moment they emerge.", - "install_methods": [ - { - "type": "default", - "script": "ct/proxmox-mail-gateway.sh", - "resources": { - "cpu": 2, - "ram": 4096, - "hdd": 10, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": "root", - "password": null - }, - "notes": [ - { - "text": "Set a root password if using autologin. This will be the PMG password. `passwd root`", - "type": "warning" - } - ] -} +{ + "name": "Promox Mail Gateway", + "slug": "proxmox-mail-gateway", + "categories": [ + 1 + ], + "date_created": "2025-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8006, + "documentation": "https://pmg.proxmox.com/pmg-docs/pmg-admin-guide.html", + "website": "https://www.proxmox.com/en/products/proxmox-mail-gateway/overview", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "Proxmox Mail Gateway is the leading open-source email security solution helping you to protect your mail server against all email threats from the moment they emerge.", + "install_methods": [ + { + "type": "default", + "script": "ct/proxmox-mail-gateway.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "Set a root password if using autologin. This will be the PMG password. `passwd root`", + "type": "warning" + } + ] +} diff --git a/json/ps5-mqtt.json b/frontend/public/json/ps5-mqtt.json similarity index 100% rename from json/ps5-mqtt.json rename to frontend/public/json/ps5-mqtt.json diff --git a/json/pterodactyl-panel.json b/frontend/public/json/pterodactyl-panel.json similarity index 100% rename from json/pterodactyl-panel.json rename to frontend/public/json/pterodactyl-panel.json diff --git a/json/pterodactyl-wings.json b/frontend/public/json/pterodactyl-wings.json similarity index 100% rename from json/pterodactyl-wings.json rename to frontend/public/json/pterodactyl-wings.json diff --git a/json/qbittorrent.json b/frontend/public/json/qbittorrent.json similarity index 100% rename from json/qbittorrent.json rename to frontend/public/json/qbittorrent.json diff --git a/json/rabbitmq.json b/frontend/public/json/rabbitmq.json similarity index 100% rename from json/rabbitmq.json rename to frontend/public/json/rabbitmq.json diff --git a/json/radarr.json b/frontend/public/json/radarr.json similarity index 100% rename from json/radarr.json rename to frontend/public/json/radarr.json diff --git a/json/radicale.json b/frontend/public/json/radicale.json similarity index 100% rename from json/radicale.json rename to frontend/public/json/radicale.json diff --git a/json/rdtclient.json b/frontend/public/json/rdtclient.json similarity index 100% rename from json/rdtclient.json rename to frontend/public/json/rdtclient.json diff --git a/json/readarr.json b/frontend/public/json/readarr.json similarity index 100% rename from json/readarr.json rename to frontend/public/json/readarr.json diff --git a/json/readeck.json b/frontend/public/json/readeck.json similarity index 100% rename from json/readeck.json rename to frontend/public/json/readeck.json diff --git a/json/recyclarr.json b/frontend/public/json/recyclarr.json similarity index 100% rename from json/recyclarr.json rename to frontend/public/json/recyclarr.json diff --git a/json/redis.json b/frontend/public/json/redis.json similarity index 100% rename from json/redis.json rename to frontend/public/json/redis.json diff --git a/json/revealjs.json b/frontend/public/json/revealjs.json similarity index 100% rename from json/revealjs.json rename to frontend/public/json/revealjs.json diff --git a/json/rtsptoweb.json b/frontend/public/json/rtsptoweb.json similarity index 100% rename from json/rtsptoweb.json rename to frontend/public/json/rtsptoweb.json diff --git a/json/runtipi.json b/frontend/public/json/runtipi.json similarity index 100% rename from json/runtipi.json rename to frontend/public/json/runtipi.json diff --git a/json/rustdeskserver.json b/frontend/public/json/rustdeskserver.json similarity index 100% rename from json/rustdeskserver.json rename to frontend/public/json/rustdeskserver.json diff --git a/json/sabnzbd.json b/frontend/public/json/sabnzbd.json similarity index 100% rename from json/sabnzbd.json rename to frontend/public/json/sabnzbd.json diff --git a/json/scaling-governor.json b/frontend/public/json/scaling-governor.json similarity index 100% rename from json/scaling-governor.json rename to frontend/public/json/scaling-governor.json diff --git a/json/seafile.json b/frontend/public/json/seafile.json similarity index 100% rename from json/seafile.json rename to frontend/public/json/seafile.json diff --git a/json/searxng.json b/frontend/public/json/searxng.json similarity index 100% rename from json/searxng.json rename to frontend/public/json/searxng.json diff --git a/json/seelf.json b/frontend/public/json/seelf.json similarity index 100% rename from json/seelf.json rename to frontend/public/json/seelf.json diff --git a/json/semaphore.json b/frontend/public/json/semaphore.json similarity index 100% rename from json/semaphore.json rename to frontend/public/json/semaphore.json diff --git a/json/sftpgo.json b/frontend/public/json/sftpgo.json similarity index 100% rename from json/sftpgo.json rename to frontend/public/json/sftpgo.json diff --git a/json/shinobi.json b/frontend/public/json/shinobi.json similarity index 100% rename from json/shinobi.json rename to frontend/public/json/shinobi.json diff --git a/json/silverbullet.json b/frontend/public/json/silverbullet.json similarity index 100% rename from json/silverbullet.json rename to frontend/public/json/silverbullet.json diff --git a/json/smokeping.json b/frontend/public/json/smokeping.json similarity index 100% rename from json/smokeping.json rename to frontend/public/json/smokeping.json diff --git a/json/snipeit.json b/frontend/public/json/snipeit.json similarity index 100% rename from json/snipeit.json rename to frontend/public/json/snipeit.json diff --git a/json/sonarr.json b/frontend/public/json/sonarr.json similarity index 100% rename from json/sonarr.json rename to frontend/public/json/sonarr.json diff --git a/json/spoolman.json b/frontend/public/json/spoolman.json similarity index 100% rename from json/spoolman.json rename to frontend/public/json/spoolman.json diff --git a/json/sqlserver2022.json b/frontend/public/json/sqlserver2022.json similarity index 100% rename from json/sqlserver2022.json rename to frontend/public/json/sqlserver2022.json diff --git a/json/stirling-pdf.json b/frontend/public/json/stirling-pdf.json similarity index 100% rename from json/stirling-pdf.json rename to frontend/public/json/stirling-pdf.json diff --git a/json/suwayomi-server.json b/frontend/public/json/suwayomi-server.json similarity index 100% rename from json/suwayomi-server.json rename to frontend/public/json/suwayomi-server.json diff --git a/json/syncthing.json b/frontend/public/json/syncthing.json similarity index 100% rename from json/syncthing.json rename to frontend/public/json/syncthing.json diff --git a/json/tandoor.json b/frontend/public/json/tandoor.json similarity index 100% rename from json/tandoor.json rename to frontend/public/json/tandoor.json diff --git a/json/tasmoadmin.json b/frontend/public/json/tasmoadmin.json similarity index 100% rename from json/tasmoadmin.json rename to frontend/public/json/tasmoadmin.json diff --git a/json/tasmocompiler.json b/frontend/public/json/tasmocompiler.json similarity index 100% rename from json/tasmocompiler.json rename to frontend/public/json/tasmocompiler.json diff --git a/json/tautulli.json b/frontend/public/json/tautulli.json similarity index 100% rename from json/tautulli.json rename to frontend/public/json/tautulli.json diff --git a/json/tdarr.json b/frontend/public/json/tdarr.json similarity index 100% rename from json/tdarr.json rename to frontend/public/json/tdarr.json diff --git a/json/technitiumdns.json b/frontend/public/json/technitiumdns.json similarity index 100% rename from json/technitiumdns.json rename to frontend/public/json/technitiumdns.json diff --git a/json/teddycloud.json b/frontend/public/json/teddycloud.json similarity index 100% rename from json/teddycloud.json rename to frontend/public/json/teddycloud.json diff --git a/json/the-lounge.json b/frontend/public/json/the-lounge.json similarity index 96% rename from json/the-lounge.json rename to frontend/public/json/the-lounge.json index 9ba41685a..493e7ab55 100644 --- a/json/the-lounge.json +++ b/frontend/public/json/the-lounge.json @@ -1,39 +1,39 @@ -{ - "name": "The Lounge", - "slug": "the-lounge", - "categories": [ - 22 - ], - "date_created": "2024-11-28", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 9000, - "documentation": "https://thelounge.chat/docs", - "website": "https://thelounge.chat/", - "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/the-lounge.svg", - "description": "Modern web IRC client designed for self-hosting ", - "install_methods": [ - { - "type": "default", - "script": "ct/the-lounge.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 4, - "os": "ubuntu", - "version": "24.04" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "The Lounge is running in private mode. Use `runuser -u thelounge -- thelounge add usernamehere` to create users.", - "type": "info" - } - ] - } +{ + "name": "The Lounge", + "slug": "the-lounge", + "categories": [ + 22 + ], + "date_created": "2024-11-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9000, + "documentation": "https://thelounge.chat/docs", + "website": "https://thelounge.chat/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/the-lounge.svg", + "description": "Modern web IRC client designed for self-hosting ", + "install_methods": [ + { + "type": "default", + "script": "ct/the-lounge.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The Lounge is running in private mode. Use `runuser -u thelounge -- thelounge add usernamehere` to create users.", + "type": "info" + } + ] + } diff --git a/json/threadfin.json b/frontend/public/json/threadfin.json similarity index 100% rename from json/threadfin.json rename to frontend/public/json/threadfin.json diff --git a/json/tianji.json b/frontend/public/json/tianji.json similarity index 100% rename from json/tianji.json rename to frontend/public/json/tianji.json diff --git a/json/traccar.json b/frontend/public/json/traccar.json similarity index 100% rename from json/traccar.json rename to frontend/public/json/traccar.json diff --git a/json/traefik.json b/frontend/public/json/traefik.json similarity index 100% rename from json/traefik.json rename to frontend/public/json/traefik.json diff --git a/json/transmission.json b/frontend/public/json/transmission.json similarity index 100% rename from json/transmission.json rename to frontend/public/json/transmission.json diff --git a/json/trilium.json b/frontend/public/json/trilium.json similarity index 100% rename from json/trilium.json rename to frontend/public/json/trilium.json diff --git a/json/turnkey.json b/frontend/public/json/turnkey.json similarity index 100% rename from json/turnkey.json rename to frontend/public/json/turnkey.json diff --git a/json/typesense.json b/frontend/public/json/typesense.json similarity index 100% rename from json/typesense.json rename to frontend/public/json/typesense.json diff --git a/json/ubuntu.json b/frontend/public/json/ubuntu.json similarity index 100% rename from json/ubuntu.json rename to frontend/public/json/ubuntu.json diff --git a/json/ubuntu2204-vm.json b/frontend/public/json/ubuntu2204-vm.json similarity index 100% rename from json/ubuntu2204-vm.json rename to frontend/public/json/ubuntu2204-vm.json diff --git a/json/ubuntu2404-vm.json b/frontend/public/json/ubuntu2404-vm.json similarity index 100% rename from json/ubuntu2404-vm.json rename to frontend/public/json/ubuntu2404-vm.json diff --git a/json/ubuntu2410-vm.json b/frontend/public/json/ubuntu2410-vm.json similarity index 100% rename from json/ubuntu2410-vm.json rename to frontend/public/json/ubuntu2410-vm.json diff --git a/json/umami.json b/frontend/public/json/umami.json similarity index 100% rename from json/umami.json rename to frontend/public/json/umami.json diff --git a/json/unbound.json b/frontend/public/json/unbound.json similarity index 100% rename from json/unbound.json rename to frontend/public/json/unbound.json diff --git a/json/unifi.json b/frontend/public/json/unifi.json similarity index 100% rename from json/unifi.json rename to frontend/public/json/unifi.json diff --git a/json/unmanic.json b/frontend/public/json/unmanic.json similarity index 100% rename from json/unmanic.json rename to frontend/public/json/unmanic.json diff --git a/json/update-lxcs.json b/frontend/public/json/update-lxcs.json similarity index 100% rename from json/update-lxcs.json rename to frontend/public/json/update-lxcs.json diff --git a/json/update-repo.json b/frontend/public/json/update-repo.json similarity index 100% rename from json/update-repo.json rename to frontend/public/json/update-repo.json diff --git a/json/uptimekuma.json b/frontend/public/json/uptimekuma.json similarity index 100% rename from json/uptimekuma.json rename to frontend/public/json/uptimekuma.json diff --git a/json/urbackupserver.json b/frontend/public/json/urbackupserver.json similarity index 100% rename from json/urbackupserver.json rename to frontend/public/json/urbackupserver.json diff --git a/json/vaultwarden.json b/frontend/public/json/vaultwarden.json similarity index 100% rename from json/vaultwarden.json rename to frontend/public/json/vaultwarden.json diff --git a/json/victoriametrics.json b/frontend/public/json/victoriametrics.json similarity index 100% rename from json/victoriametrics.json rename to frontend/public/json/victoriametrics.json diff --git a/json/vikunja.json b/frontend/public/json/vikunja.json similarity index 100% rename from json/vikunja.json rename to frontend/public/json/vikunja.json diff --git a/json/wallos.json b/frontend/public/json/wallos.json similarity index 100% rename from json/wallos.json rename to frontend/public/json/wallos.json diff --git a/json/wastebin.json b/frontend/public/json/wastebin.json similarity index 100% rename from json/wastebin.json rename to frontend/public/json/wastebin.json diff --git a/json/watcharr.json b/frontend/public/json/watcharr.json similarity index 100% rename from json/watcharr.json rename to frontend/public/json/watcharr.json diff --git a/json/watchyourlan.json b/frontend/public/json/watchyourlan.json similarity index 100% rename from json/watchyourlan.json rename to frontend/public/json/watchyourlan.json diff --git a/json/wavelog.json b/frontend/public/json/wavelog.json similarity index 100% rename from json/wavelog.json rename to frontend/public/json/wavelog.json diff --git a/json/web-check.json b/frontend/public/json/web-check.json similarity index 100% rename from json/web-check.json rename to frontend/public/json/web-check.json diff --git a/json/webmin.json b/frontend/public/json/webmin.json similarity index 100% rename from json/webmin.json rename to frontend/public/json/webmin.json diff --git a/json/wger.json b/frontend/public/json/wger.json similarity index 100% rename from json/wger.json rename to frontend/public/json/wger.json diff --git a/json/whisparr.json b/frontend/public/json/whisparr.json similarity index 100% rename from json/whisparr.json rename to frontend/public/json/whisparr.json diff --git a/json/whoogle.json b/frontend/public/json/whoogle.json similarity index 100% rename from json/whoogle.json rename to frontend/public/json/whoogle.json diff --git a/json/wikijs.json b/frontend/public/json/wikijs.json similarity index 100% rename from json/wikijs.json rename to frontend/public/json/wikijs.json diff --git a/json/wireguard.json b/frontend/public/json/wireguard.json similarity index 100% rename from json/wireguard.json rename to frontend/public/json/wireguard.json diff --git a/json/wordpress.json b/frontend/public/json/wordpress.json similarity index 100% rename from json/wordpress.json rename to frontend/public/json/wordpress.json diff --git a/json/yunohost.json b/frontend/public/json/yunohost.json similarity index 100% rename from json/yunohost.json rename to frontend/public/json/yunohost.json diff --git a/json/zabbix.json b/frontend/public/json/zabbix.json similarity index 100% rename from json/zabbix.json rename to frontend/public/json/zabbix.json diff --git a/json/zammad.json b/frontend/public/json/zammad.json similarity index 100% rename from json/zammad.json rename to frontend/public/json/zammad.json diff --git a/json/zerotier-one.json b/frontend/public/json/zerotier-one.json similarity index 100% rename from json/zerotier-one.json rename to frontend/public/json/zerotier-one.json diff --git a/json/zigbee2mqtt.json b/frontend/public/json/zigbee2mqtt.json similarity index 100% rename from json/zigbee2mqtt.json rename to frontend/public/json/zigbee2mqtt.json diff --git a/json/zipline.json b/frontend/public/json/zipline.json similarity index 100% rename from json/zipline.json rename to frontend/public/json/zipline.json diff --git a/json/zitadel.json b/frontend/public/json/zitadel.json similarity index 100% rename from json/zitadel.json rename to frontend/public/json/zitadel.json diff --git a/json/zoraxy.json b/frontend/public/json/zoraxy.json similarity index 100% rename from json/zoraxy.json rename to frontend/public/json/zoraxy.json diff --git a/json/zwave-js-ui.json b/frontend/public/json/zwave-js-ui.json similarity index 100% rename from json/zwave-js-ui.json rename to frontend/public/json/zwave-js-ui.json From 6e68b51e96d525b289d973ca882e4f876bcb4f1a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:32:22 +0100 Subject: [PATCH 100/258] Update CHANGELOG.md (#3186) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc622515e..7e7413dc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“‚ Github + - Relocate the Json Files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3184](https://github.com/community-scripts/ProxmoxVE/pull/3184)) - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) ## 2025-03-17 From f21cc09bff42f5549eef40fa4a8f9d9b17d9b987 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:36:33 +0100 Subject: [PATCH 101/258] Update CONTRIBUTING.md (#3187) changes json path --- .github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md b/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md index ff317425a..92a9567a7 100644 --- a/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md +++ b/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md @@ -20,7 +20,7 @@ These documents cover the coding standards for the following types of files in o - **`install/$AppName-install.sh` Scripts**: These scripts are responsible for the installation of applications. - **`ct/$AppName.sh` Scripts**: These scripts handle the creation and updating of containers. -- **`json/$AppName.json`**: These files store structured data and are used for the website. +- **`frontend/public/json/$AppName.json`**: These files store structured data and are used for the website. Each section provides detailed guidelines on various aspects of coding, including shebang usage, comments, variable naming, function naming, indentation, error handling, command substitution, quoting, script structure, and logging. Additionally, examples are provided to illustrate the application of these standards. From c27dcd629f1cc486d356b04659f034270dafd527 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:36:46 +0100 Subject: [PATCH 102/258] Update Workflow (#3185) --- .github/workflows/close-discussion.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/close-discussion.yml b/.github/workflows/close-discussion.yml index dd9a80b33..a811371d4 100644 --- a/.github/workflows/close-discussion.yml +++ b/.github/workflows/close-discussion.yml @@ -10,7 +10,11 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v4 + with: + repository: community-scripts/ProxmoxVE + ref: main + token: ${{ secrets.GITHUB_TOKEN }} - name: Set Up Node.js uses: actions/setup-node@v4 @@ -21,7 +25,7 @@ jobs: - name: Close Discussion env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.PAT_MICHEL }} PR_BODY: ${{ github.event.pull_request.body }} PR_NUMBER: ${{ github.event.pull_request.number }} REPO_OWNER: ${{ github.repository_owner }} From b0aa4136d696e0f7be299bde3ec0696ecac16400 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:36:56 +0100 Subject: [PATCH 103/258] GoMFT: Update Logo (#3188) --- frontend/public/json/gomft.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/gomft.json b/frontend/public/json/gomft.json index 4788cdf31..da2a2aeba 100644 --- a/frontend/public/json/gomft.json +++ b/frontend/public/json/gomft.json @@ -11,7 +11,7 @@ "interface_port": 8080, "documentation": "https://github.com/StarFleetCPTN/GoMFT#configuration", "website": "https://github.com/StarFleetCPTN/GoMFT", - "logo": "https://github.com/StarFleetCPTN/GoMFT/blob/main/static/img/logo.svg", + "logo": "https://raw.githubusercontent.com/StarFleetCPTN/GoMFT/refs/heads/main/static/img/logo.svg", "description": "GoMFT is a web-based managed file transfer application built with Go, leveraging rclone for robust file transfer capabilities. It provides a user-friendly interface for configuring, scheduling, and monitoring file transfers across various storage providers.", "install_methods": [ { From 49aa90f24eb19f7945cd6671ea59b8fae48ebf47 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:38:31 +0100 Subject: [PATCH 104/258] Update CHANGELOG.md (#3189) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e7413dc6..583ee35da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,9 +24,17 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“‚ Github + - Update Workflow to Close Discussion [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3185](https://github.com/community-scripts/ProxmoxVE/pull/3185)) + - Change json path CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#3187](https://github.com/community-scripts/ProxmoxVE/pull/3187)) - Relocate the Json Files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3184](https://github.com/community-scripts/ProxmoxVE/pull/3184)) - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) +### 🌐 Website + + - #### πŸ“ Script Information + + - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) + ## 2025-03-17 ### πŸš€ Updated Scripts From 64d5caae15366fcd488706be713488c4dd5c6a0e Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:40:31 +0100 Subject: [PATCH 105/258] Update gomft.json --- frontend/public/json/gomft.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/gomft.json b/frontend/public/json/gomft.json index da2a2aeba..870ce3743 100644 --- a/frontend/public/json/gomft.json +++ b/frontend/public/json/gomft.json @@ -11,7 +11,7 @@ "interface_port": 8080, "documentation": "https://github.com/StarFleetCPTN/GoMFT#configuration", "website": "https://github.com/StarFleetCPTN/GoMFT", - "logo": "https://raw.githubusercontent.com/StarFleetCPTN/GoMFT/refs/heads/main/static/img/logo.svg", + "logo": "https://raw.githubusercontent.com/StarFleetCPTN/GoMFT/83be259754689acc49a4b0dba25ba8384088a0fc/static/img/logo.svg", "description": "GoMFT is a web-based managed file transfer application built with Go, leveraging rclone for robust file transfer capabilities. It provides a user-friendly interface for configuring, scheduling, and monitoring file transfers across various storage providers.", "install_methods": [ { From 7cc4fee48b6d83a83a77404666dda83b971b59dd Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:20:28 +0100 Subject: [PATCH 106/258] Add worflow to crawl APP verisons (#3192) * Add worflow to crawl verisons * Update Test --- .github/workflows/crawl-versions.yaml | 113 ++++ frontend/public/json/versions.json | 562 ++++++++++++++++++ .../__tests__/public/validate-json.test.ts | 9 +- frontend/src/app/api/categories/route.ts | 3 +- frontend/tsconfig.json | 16 +- 5 files changed, 695 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/crawl-versions.yaml create mode 100644 frontend/public/json/versions.json diff --git a/.github/workflows/crawl-versions.yaml b/.github/workflows/crawl-versions.yaml new file mode 100644 index 000000000..52d25264a --- /dev/null +++ b/.github/workflows/crawl-versions.yaml @@ -0,0 +1,113 @@ +name: Crawl Versions from newreleases.io + +on: + workflow_dispatch: + schedule: + # Runs at 12:00 AM and 12:00 PM UTC + - cron: "0 0,12 * * *" + +permissions: + contents: write + pull-requests: write + +jobs: + move-to-main-repo: + runs-on: runner-cluster-htl-set + + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + with: + repository: community-scripts/ProxmoxVED + ref: main + + - name: Generate a token + id: generate-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ vars.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + + - name: Crawl from newreleases.io + env: + token: ${{ secrets.NEWRELEASES_TOKEN }} + run: | + page=1 + projects_file="project_json" + output_file="frontend/public/json/versions.json" + + echo "[]" > $output_file + + while true; do + + echo "Start loop on page: $page" + + projects=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects?page=$page") + total_pages=$(echo "$projects" | jq -r '.total_pages') + + if [ -z "$total_pages" ] || [ "$total_pages" -eq 0 ]; then + echo "No pages available. Exiting." + exit 1 + fi + if [ $page == $total_pages ]; then + break + fi + + if [ -z "$projects" ] || ! echo "$projects" | jq -e '.projects' > /dev/null; then + echo "No more projects or invalid response. Exiting." + break + fi + + echo "$projects" > "$projects_file" + + jq -r '.projects[] | "\(.id) \(.name)"' "$projects_file" | while read -r id name; do + version=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects/$id/latest-release") + version_data=$(echo "$version" | jq -r '.version // empty') + if [ -n "$version_data" ]; then + jq --arg name "$name" --arg version "$version_data" \ + '. += [{"name": $name, "version": $version}]' "$output_file" > "$output_file.tmp" && mv "$output_file.tmp" "$output_file" + fi + done + ((page++)) + done + + - name: Commit JSON + env: + GH_TOKEN: ${{ steps.generate-token.outputs.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "GitHub Actions[bot]" + git checkout -b update_versions || git checkout update_versions + git add frontend/public/json/versions.json + if git diff --cached --quiet; then + echo "No changes detected." + echo "changed=false" >> "$GITHUB_ENV" + exit 0 + else + echo "Changes detected:" + git diff --stat --cached + echo "changed=true" >> "$GITHUB_ENV" + fi + git commit -m "Update versions.json" + git push origin update_versions --force + gh pr create --title "[AUTOMATIC PR]Update versions.json" --body "Update versions.json, crawled from newreleases.io" --base main --head update_versions + + - name: Approve pull request + if: env.changed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=$(gh pr list --head "update_versions" --json number --jq '.[].number') + if [ -n "$PR_NUMBER" ]; then + gh pr review $PR_NUMBER --approve + fi + + - name: Re-approve pull request after update + if: env.changed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=$(gh pr list --head "update_versions" --json number --jq '.[].number') + if [ -n "$PR_NUMBER" ]; then + gh pr review $PR_NUMBER --approve + fi diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json new file mode 100644 index 000000000..54bdced0b --- /dev/null +++ b/frontend/public/json/versions.json @@ -0,0 +1,562 @@ +[ + { + "name": "Jackett/Jackett", + "version": "v0.22.1660" + }, + { + "name": "authelia/authelia", + "version": "v4.39.1" + }, + { + "name": "ollama/ollama", + "version": "v0.6.1" + }, + { + "name": "advplyr/audiobookshelf", + "version": "v2.20.0" + }, + { + "name": "bastienwirtz/homer", + "version": "v25.03.3" + }, + { + "name": "keycloak/keycloak", + "version": "26.1.4" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.13.0" + }, + { + "name": "Kareadita/Kavita", + "version": "v0.8.5.11" + }, + { + "name": "TriliumNext/Notes", + "version": "v0.92.4" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1" + }, + { + "name": "fallenbagel/jellyseerr", + "version": "v2.5.1" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "develop-20250222.4" + }, + { + "name": "glanceapp/glance", + "version": "v0.7.7" + }, + { + "name": "gethomepage/homepage", + "version": "v1.0.4" + }, + { + "name": "Donkie/Spoolman", + "version": "v0.22.0" + }, + { + "name": "pocket-id/pocket-id", + "version": "v0.40.1" + }, + { + "name": "evcc-io/evcc", + "version": "0.201.0" + }, + { + "name": "BookStackApp/BookStack", + "version": "v25.02.1" + }, + { + "name": "hoarder-app/hoarder", + "version": "ios/v1.6.9-0" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.26.1" + }, + { + "name": "Kozea/Radicale", + "version": "v3.5.0" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "v1.17.0-victorialogs" + }, + { + "name": "msgbyte/tianji", + "version": "v1.18.22" + }, + { + "name": "duplicati/duplicati", + "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15" + }, + { + "name": "henrygd/beszel", + "version": "v0.10.2" + }, + { + "name": "navidrome/navidrome", + "version": "v0.55.1" + }, + { + "name": "Threadfin/Threadfin", + "version": "1.2.31" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v0.44.2" + }, + { + "name": "ipfs/kubo", + "version": "v0.33.2" + }, + { + "name": "paperless-ngx/paperless-ngx", + "version": "v2.15.0-beta" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w11-4.12.0" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.11.0" + }, + { + "name": "docker/compose", + "version": "v2.34.0" + }, + { + "name": "FreshRSS/FreshRSS", + "version": "1.26.1" + }, + { + "name": "kimai/kimai", + "version": "2.31.0" + }, + { + "name": "zitadel/zitadel", + "version": "v2.66.13" + }, + { + "name": "usememos/memos", + "version": "v0.24.1" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.5-rc3" + }, + { + "name": "NodeBB/NodeBB", + "version": "v4.1.1" + }, + { + "name": "diced/zipline", + "version": "v4.0.1" + }, + { + "name": "minio/minio", + "version": "RELEASE.2025-03-12T18-04-18Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v9.33.0" + }, + { + "name": "cockpit-project/cockpit", + "version": "335" + }, + { + "name": "gotson/komga", + "version": "1.21.2" + }, + { + "name": "benjaminjonard/koillection", + "version": "1.6.12" + }, + { + "name": "excalidraw/excalidraw", + "version": "v0.18.0" + }, + { + "name": "Ombi-app/Ombi", + "version": "v4.47.1" + }, + { + "name": "mylar3/mylar3", + "version": "v0.8.2" + }, + { + "name": "stonith404/pingvin-share", + "version": "v1.10.3" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.57" + }, + { + "name": "Luligu/matterbridge", + "version": "2.2.4" + }, + { + "name": "AlexxIT/go2rtc", + "version": "v1.9.9" + }, + { + "name": "clusterzx/paperless-ai", + "version": "v2.7.4" + }, + { + "name": "YuukanOO/seelf", + "version": "v2.4.2" + }, + { + "name": "umami-software/umami", + "version": "v2.17.0" + }, + { + "name": "documenso/documenso", + "version": "v1.9.1-rc.9" + }, + { + "name": "rogerfar/rdt-client", + "version": "v2.0.102" + }, + { + "name": "prometheus/alertmanager", + "version": "v0.28.1" + }, + { + "name": "hargata/lubelog", + "version": "v1.4.5" + }, + { + "name": "ellite/Wallos", + "version": "v2.46.1" + }, + { + "name": "Dolibarr/dolibarr", + "version": "21.0.0" + }, + { + "name": "netbox-community/netbox", + "version": "v4.2.5" + }, + { + "name": "open-webui/open-webui", + "version": "v0.5.20" + }, + { + "name": "matze/wastebin", + "version": "3.0.0" + }, + { + "name": "immich-app/immich", + "version": "v1.129.0" + }, + { + "name": "snipe/snipe-it", + "version": "v8.0.4" + }, + { + "name": "toniebox-reverse-engineering/teddycloud", + "version": "tc_v0.6.4" + }, + { + "name": "go-gitea/gitea", + "version": "v1.23.5" + }, + { + "name": "sysadminsmedia/homebox", + "version": "v0.18.0" + }, + { + "name": "Koenkk/zigbee2mqtt", + "version": "2.1.3" + }, + { + "name": "heiher/hev-socks5-server", + "version": "2.8.0" + }, + { + "name": "inspircd/inspircd", + "version": "v4.6.0" + }, + { + "name": "tobychui/zoraxy", + "version": "v3.1.9" + }, + { + "name": "grocy/grocy", + "version": "v4.4.2" + }, + { + "name": "jhuckaby/Cronicle", + "version": "v0.9.76" + }, + { + "name": "docmost/docmost", + "version": "v0.8.4" + }, + { + "name": "Part-DB/Part-DB-server", + "version": "v1.16.1" + }, + { + "name": "prometheus/prometheus", + "version": "v3.2.1" + }, + { + "name": "silverbulletmd/silverbullet", + "version": "0.10.4" + }, + { + "name": "juanfont/headscale", + "version": "v0.25.1" + }, + { + "name": "benzino77/tasmocompiler", + "version": "v12.5.0" + }, + { + "name": "traefik/traefik", + "version": "v3.3.4" + }, + { + "name": "schlagmichdoch/PairDrop", + "version": "v1.11.2" + }, + { + "name": "Athou/commafeed", + "version": "5.6.1" + }, + { + "name": "azukaar/Cosmos-Server", + "version": "v0.18.3" + }, + { + "name": "wavelog/wavelog", + "version": "2.0.1" + }, + { + "name": "sabnzbd/sabnzbd", + "version": "4.4.1" + }, + { + "name": "grafana/grafana", + "version": "v11.5.2" + }, + { + "name": "gristlabs/grist-core", + "version": "v1.4.2" + }, + { + "name": "prometheus-pve/prometheus-pve-exporter", + "version": "v3.5.2" + }, + { + "name": "sbondCo/Watcharr", + "version": "v2.0.2" + }, + { + "name": "glpi-project/glpi", + "version": "10.0.18" + }, + { + "name": "TasmoAdmin/TasmoAdmin", + "version": "v4.2.3" + }, + { + "name": "dani-garcia/vaultwarden", + "version": "1.33.2" + }, + { + "name": "blakeblackshear/frigate", + "version": "v0.15.0" + }, + { + "name": "bluenviron/mediamtx", + "version": "v1.11.3" + }, + { + "name": "actualbudget/actual-server", + "version": "v25.2.1" + }, + { + "name": "NginxProxyManager/nginx-proxy-manager", + "version": "v2.12.3" + }, + { + "name": "thomiceli/opengist", + "version": "v1.9.1" + }, + { + "name": "Forceu/Gokapi", + "version": "v1.9.6" + }, + { + "name": "PrivateBin/PrivateBin", + "version": "1.7.6" + }, + { + "name": "hivemq/hivemq-community-edition", + "version": "2025.1" + }, + { + "name": "rustdesk/rustdesk-server", + "version": "1.1.14" + }, + { + "name": "hansmi/prometheus-paperless-exporter", + "version": "v0.0.6" + }, + { + "name": "donaldzou/WGDashboard", + "version": "v4.1.4" + }, + { + "name": "0xERR0R/blocky", + "version": "v0.25" + }, + { + "name": "linkwarden/linkwarden", + "version": "v2.9.3" + }, + { + "name": "Tautulli/Tautulli", + "version": "v2.15.1" + }, + { + "name": "traccar/traccar", + "version": "v6.6" + }, + { + "name": "ErsatzTV/ErsatzTV", + "version": "v25.1.0" + }, + { + "name": "seanmorley15/AdventureLog", + "version": "v0.8.0" + }, + { + "name": "MagicMirrorOrg/MagicMirror", + "version": "v2.30.0" + }, + { + "name": "louislam/uptime-kuma", + "version": "2.0.0-beta.1" + }, + { + "name": "pymedusa/Medusa", + "version": "v1.0.22" + }, + { + "name": "phpipam/phpipam", + "version": "v1.7.3" + }, + { + "name": "Bubka/2FAuth", + "version": "v5.4.3" + }, + { + "name": "gotify/server", + "version": "v2.6.1" + }, + { + "name": "janeczku/calibre-web", + "version": "0.6.24" + }, + { + "name": "sabre-io/Baikal", + "version": "0.10.1" + }, + { + "name": "caddyserver/xcaddy", + "version": "v0.4.4" + }, + { + "name": "linuxserver/Heimdall", + "version": "v2.6.3" + }, + { + "name": "aceberg/WatchYourLAN", + "version": "2.0.4" + }, + { + "name": "Kometa-Team/Kometa", + "version": "v2.1.0" + }, + { + "name": "FunkeyFlo/ps5-mqtt", + "version": "v1.4.0" + }, + { + "name": "projectsend/projectsend", + "version": "r1720" + }, + { + "name": "Pf2eToolsOrg/Pf2eTools", + "version": "v0.8.13" + }, + { + "name": "Paymenter/Paymenter", + "version": "v0.9.5" + }, + { + "name": "hywax/mafl", + "version": "v0.15.4" + }, + { + "name": "FlareSolverr/FlareSolverr", + "version": "v3.3.21" + }, + { + "name": "Suwayomi/Suwayomi-Server", + "version": "v1.1.1" + }, + { + "name": "Forceu/barcodebuddy", + "version": "v1.8.1.8" + }, + { + "name": "Lissy93/dashy", + "version": "3.1.1" + }, + { + "name": "gnmyt/myspeed", + "version": "v1.0.9" + }, + { + "name": "monicahq/monica", + "version": "v4.1.2" + }, + { + "name": "thelounge/thelounge-deb", + "version": "v4.4.3" + }, + { + "name": "wger-project/wger", + "version": "2.2" + }, + { + "name": "sct/overseerr", + "version": "preview-test-node-18" + }, + { + "name": "deepch/RTSPtoWeb", + "version": "v2.4.3" + }, + { + "name": "searxng/searxng", + "version": "v1.0.0" + }, + { + "name": "MediaBrowser/Emby", + "version": "3.5.2.0" + } +] diff --git a/frontend/src/__tests__/public/validate-json.test.ts b/frontend/src/__tests__/public/validate-json.test.ts index 562ebe9c1..1ab52db68 100644 --- a/frontend/src/__tests__/public/validate-json.test.ts +++ b/frontend/src/__tests__/public/validate-json.test.ts @@ -3,13 +3,14 @@ import { promises as fs } from "fs"; import path from "path"; import { ScriptSchema, type Script } from "@/app/json-editor/_schemas/schemas"; import { Metadata } from "@/lib/types"; - +console.log('Current directory: ' + process.cwd()); const jsonDir = "public/json"; const metadataFileName = "metadata.json"; +const versionsFileName = "versions.json"; const encoding = "utf-8"; const fileNames = (await fs.readdir(jsonDir)) - .filter((fileName) => fileName !== metadataFileName) + .filter((fileName) => fileName !== metadataFileName && fileName !== versionsFileName); describe.each(fileNames)("%s", async (fileName) => { let script: Script; @@ -20,6 +21,7 @@ describe.each(fileNames)("%s", async (fileName) => { script = JSON.parse(fileContent); }) + it("should have valid json according to script schema", () => { ScriptSchema.parse(script); }); @@ -27,6 +29,8 @@ describe.each(fileNames)("%s", async (fileName) => { it("should have a corresponding script file", () => { script.install_methods.forEach((method) => { const scriptPath = path.resolve("..", method.script) + //FIXME: Dose note account for new dir structure and files in /script/tools + assert(fs.stat(scriptPath), `Script file not found: ${scriptPath}`) }) }); @@ -40,7 +44,6 @@ describe(`${metadataFileName}`, async () => { const fileContent = await fs.readFile(filePath, encoding) metadata = JSON.parse(fileContent); }) - it("should have valid json according to metadata schema", () => { // TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts assert(metadata.categories.length > 0); diff --git a/frontend/src/app/api/categories/route.ts b/frontend/src/app/api/categories/route.ts index 2d33a3ab0..4db931509 100644 --- a/frontend/src/app/api/categories/route.ts +++ b/frontend/src/app/api/categories/route.ts @@ -7,6 +7,7 @@ export const dynamic = "force-static"; const jsonDir = "public/json"; const metadataFileName = "metadata.json"; +const versionFileName = "version.json"; const encoding = "utf-8"; const getMetadata = async () => { @@ -18,7 +19,7 @@ const getMetadata = async () => { const getScripts = async () => { const filePaths = (await fs.readdir(jsonDir)) - .filter((fileName) => fileName !== metadataFileName) + .filter((fileName) => fileName !== metadataFileName && fileName !== versionFileName) .map((fileName) => path.resolve(jsonDir, fileName)); const scripts = await Promise.all( diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 4b269df34..195f88b78 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -10,7 +14,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { @@ -18,7 +22,9 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] }, "target": "ES2017" }, @@ -29,5 +35,7 @@ ".next/types/**/*.ts", "next.config.mjs" ], - "exclude": ["node_modules"] + "exclude": [ + "node_modules" + ] } From 864522b7fa423116b31111669d4786263cf309b1 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:31:56 +0100 Subject: [PATCH 107/258] Fix wrong repo (#3197) --- .github/workflows/crawl-versions.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crawl-versions.yaml b/.github/workflows/crawl-versions.yaml index 52d25264a..96d03a7ae 100644 --- a/.github/workflows/crawl-versions.yaml +++ b/.github/workflows/crawl-versions.yaml @@ -18,7 +18,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v2 with: - repository: community-scripts/ProxmoxVED + repository: community-scripts/ProxmoxVE ref: main - name: Generate a token From 25c310b57b7ceb2a2159c6f95c1a514cf6597030 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:39:10 +0100 Subject: [PATCH 108/258] Fix frontend (#3199) --- frontend/src/app/api/categories/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/api/categories/route.ts b/frontend/src/app/api/categories/route.ts index 4db931509..c7392a1e3 100644 --- a/frontend/src/app/api/categories/route.ts +++ b/frontend/src/app/api/categories/route.ts @@ -40,7 +40,7 @@ export async function GET() { const categories = metadata.categories .map((category) => { category.scripts = scripts.filter((script) => - script.categories.includes(category.id), + script.categories?.includes(category.id), ); return category; }) From e2ff278dc203a82a57966f4361834728895ab736 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:43:36 +0100 Subject: [PATCH 109/258] Update CHANGELOG.md (#3195) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 583ee35da..11caf5a1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,10 +24,11 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“‚ Github - - Update Workflow to Close Discussion [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3185](https://github.com/community-scripts/ProxmoxVE/pull/3185)) + - Add worflow to crawl APP verisons [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3192](https://github.com/community-scripts/ProxmoxVE/pull/3192)) + - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) - Change json path CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#3187](https://github.com/community-scripts/ProxmoxVE/pull/3187)) - Relocate the Json Files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3184](https://github.com/community-scripts/ProxmoxVE/pull/3184)) - - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) + - Update Workflow to Close Discussion [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3185](https://github.com/community-scripts/ProxmoxVE/pull/3185)) ### 🌐 Website From ea666ccdb5c1abf82e158fa620063967d628a76d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:45:17 +0100 Subject: [PATCH 110/258] Update versions.json (#3201) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 563 +---------------------------- 1 file changed, 1 insertion(+), 562 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 54bdced0b..fe51488c7 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,562 +1 @@ -[ - { - "name": "Jackett/Jackett", - "version": "v0.22.1660" - }, - { - "name": "authelia/authelia", - "version": "v4.39.1" - }, - { - "name": "ollama/ollama", - "version": "v0.6.1" - }, - { - "name": "advplyr/audiobookshelf", - "version": "v2.20.0" - }, - { - "name": "bastienwirtz/homer", - "version": "v25.03.3" - }, - { - "name": "keycloak/keycloak", - "version": "26.1.4" - }, - { - "name": "semaphoreui/semaphore", - "version": "v2.13.0" - }, - { - "name": "Kareadita/Kavita", - "version": "v0.8.5.11" - }, - { - "name": "TriliumNext/Notes", - "version": "v0.92.4" - }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.1" - }, - { - "name": "fallenbagel/jellyseerr", - "version": "v2.5.1" - }, - { - "name": "firefly-iii/firefly-iii", - "version": "develop-20250222.4" - }, - { - "name": "glanceapp/glance", - "version": "v0.7.7" - }, - { - "name": "gethomepage/homepage", - "version": "v1.0.4" - }, - { - "name": "Donkie/Spoolman", - "version": "v0.22.0" - }, - { - "name": "pocket-id/pocket-id", - "version": "v0.40.1" - }, - { - "name": "evcc-io/evcc", - "version": "0.201.0" - }, - { - "name": "BookStackApp/BookStack", - "version": "v25.02.1" - }, - { - "name": "hoarder-app/hoarder", - "version": "ios/v1.6.9-0" - }, - { - "name": "pocketbase/pocketbase", - "version": "v0.26.1" - }, - { - "name": "Kozea/Radicale", - "version": "v3.5.0" - }, - { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.17.0-victorialogs" - }, - { - "name": "msgbyte/tianji", - "version": "v1.18.22" - }, - { - "name": "duplicati/duplicati", - "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15" - }, - { - "name": "henrygd/beszel", - "version": "v0.10.2" - }, - { - "name": "navidrome/navidrome", - "version": "v0.55.1" - }, - { - "name": "Threadfin/Threadfin", - "version": "1.2.31" - }, - { - "name": "Stirling-Tools/Stirling-PDF", - "version": "v0.44.2" - }, - { - "name": "ipfs/kubo", - "version": "v0.33.2" - }, - { - "name": "paperless-ngx/paperless-ngx", - "version": "v2.15.0-beta" - }, - { - "name": "wazuh/wazuh", - "version": "coverity-w11-4.12.0" - }, - { - "name": "homarr-labs/homarr", - "version": "v1.11.0" - }, - { - "name": "docker/compose", - "version": "v2.34.0" - }, - { - "name": "FreshRSS/FreshRSS", - "version": "1.26.1" - }, - { - "name": "kimai/kimai", - "version": "2.31.0" - }, - { - "name": "zitadel/zitadel", - "version": "v2.66.13" - }, - { - "name": "usememos/memos", - "version": "v0.24.1" - }, - { - "name": "openobserve/openobserve", - "version": "v0.14.5-rc3" - }, - { - "name": "NodeBB/NodeBB", - "version": "v4.1.1" - }, - { - "name": "diced/zipline", - "version": "v4.0.1" - }, - { - "name": "minio/minio", - "version": "RELEASE.2025-03-12T18-04-18Z" - }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v9.33.0" - }, - { - "name": "cockpit-project/cockpit", - "version": "335" - }, - { - "name": "gotson/komga", - "version": "1.21.2" - }, - { - "name": "benjaminjonard/koillection", - "version": "1.6.12" - }, - { - "name": "excalidraw/excalidraw", - "version": "v0.18.0" - }, - { - "name": "Ombi-app/Ombi", - "version": "v4.47.1" - }, - { - "name": "mylar3/mylar3", - "version": "v0.8.2" - }, - { - "name": "stonith404/pingvin-share", - "version": "v1.10.3" - }, - { - "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.57" - }, - { - "name": "Luligu/matterbridge", - "version": "2.2.4" - }, - { - "name": "AlexxIT/go2rtc", - "version": "v1.9.9" - }, - { - "name": "clusterzx/paperless-ai", - "version": "v2.7.4" - }, - { - "name": "YuukanOO/seelf", - "version": "v2.4.2" - }, - { - "name": "umami-software/umami", - "version": "v2.17.0" - }, - { - "name": "documenso/documenso", - "version": "v1.9.1-rc.9" - }, - { - "name": "rogerfar/rdt-client", - "version": "v2.0.102" - }, - { - "name": "prometheus/alertmanager", - "version": "v0.28.1" - }, - { - "name": "hargata/lubelog", - "version": "v1.4.5" - }, - { - "name": "ellite/Wallos", - "version": "v2.46.1" - }, - { - "name": "Dolibarr/dolibarr", - "version": "21.0.0" - }, - { - "name": "netbox-community/netbox", - "version": "v4.2.5" - }, - { - "name": "open-webui/open-webui", - "version": "v0.5.20" - }, - { - "name": "matze/wastebin", - "version": "3.0.0" - }, - { - "name": "immich-app/immich", - "version": "v1.129.0" - }, - { - "name": "snipe/snipe-it", - "version": "v8.0.4" - }, - { - "name": "toniebox-reverse-engineering/teddycloud", - "version": "tc_v0.6.4" - }, - { - "name": "go-gitea/gitea", - "version": "v1.23.5" - }, - { - "name": "sysadminsmedia/homebox", - "version": "v0.18.0" - }, - { - "name": "Koenkk/zigbee2mqtt", - "version": "2.1.3" - }, - { - "name": "heiher/hev-socks5-server", - "version": "2.8.0" - }, - { - "name": "inspircd/inspircd", - "version": "v4.6.0" - }, - { - "name": "tobychui/zoraxy", - "version": "v3.1.9" - }, - { - "name": "grocy/grocy", - "version": "v4.4.2" - }, - { - "name": "jhuckaby/Cronicle", - "version": "v0.9.76" - }, - { - "name": "docmost/docmost", - "version": "v0.8.4" - }, - { - "name": "Part-DB/Part-DB-server", - "version": "v1.16.1" - }, - { - "name": "prometheus/prometheus", - "version": "v3.2.1" - }, - { - "name": "silverbulletmd/silverbullet", - "version": "0.10.4" - }, - { - "name": "juanfont/headscale", - "version": "v0.25.1" - }, - { - "name": "benzino77/tasmocompiler", - "version": "v12.5.0" - }, - { - "name": "traefik/traefik", - "version": "v3.3.4" - }, - { - "name": "schlagmichdoch/PairDrop", - "version": "v1.11.2" - }, - { - "name": "Athou/commafeed", - "version": "5.6.1" - }, - { - "name": "azukaar/Cosmos-Server", - "version": "v0.18.3" - }, - { - "name": "wavelog/wavelog", - "version": "2.0.1" - }, - { - "name": "sabnzbd/sabnzbd", - "version": "4.4.1" - }, - { - "name": "grafana/grafana", - "version": "v11.5.2" - }, - { - "name": "gristlabs/grist-core", - "version": "v1.4.2" - }, - { - "name": "prometheus-pve/prometheus-pve-exporter", - "version": "v3.5.2" - }, - { - "name": "sbondCo/Watcharr", - "version": "v2.0.2" - }, - { - "name": "glpi-project/glpi", - "version": "10.0.18" - }, - { - "name": "TasmoAdmin/TasmoAdmin", - "version": "v4.2.3" - }, - { - "name": "dani-garcia/vaultwarden", - "version": "1.33.2" - }, - { - "name": "blakeblackshear/frigate", - "version": "v0.15.0" - }, - { - "name": "bluenviron/mediamtx", - "version": "v1.11.3" - }, - { - "name": "actualbudget/actual-server", - "version": "v25.2.1" - }, - { - "name": "NginxProxyManager/nginx-proxy-manager", - "version": "v2.12.3" - }, - { - "name": "thomiceli/opengist", - "version": "v1.9.1" - }, - { - "name": "Forceu/Gokapi", - "version": "v1.9.6" - }, - { - "name": "PrivateBin/PrivateBin", - "version": "1.7.6" - }, - { - "name": "hivemq/hivemq-community-edition", - "version": "2025.1" - }, - { - "name": "rustdesk/rustdesk-server", - "version": "1.1.14" - }, - { - "name": "hansmi/prometheus-paperless-exporter", - "version": "v0.0.6" - }, - { - "name": "donaldzou/WGDashboard", - "version": "v4.1.4" - }, - { - "name": "0xERR0R/blocky", - "version": "v0.25" - }, - { - "name": "linkwarden/linkwarden", - "version": "v2.9.3" - }, - { - "name": "Tautulli/Tautulli", - "version": "v2.15.1" - }, - { - "name": "traccar/traccar", - "version": "v6.6" - }, - { - "name": "ErsatzTV/ErsatzTV", - "version": "v25.1.0" - }, - { - "name": "seanmorley15/AdventureLog", - "version": "v0.8.0" - }, - { - "name": "MagicMirrorOrg/MagicMirror", - "version": "v2.30.0" - }, - { - "name": "louislam/uptime-kuma", - "version": "2.0.0-beta.1" - }, - { - "name": "pymedusa/Medusa", - "version": "v1.0.22" - }, - { - "name": "phpipam/phpipam", - "version": "v1.7.3" - }, - { - "name": "Bubka/2FAuth", - "version": "v5.4.3" - }, - { - "name": "gotify/server", - "version": "v2.6.1" - }, - { - "name": "janeczku/calibre-web", - "version": "0.6.24" - }, - { - "name": "sabre-io/Baikal", - "version": "0.10.1" - }, - { - "name": "caddyserver/xcaddy", - "version": "v0.4.4" - }, - { - "name": "linuxserver/Heimdall", - "version": "v2.6.3" - }, - { - "name": "aceberg/WatchYourLAN", - "version": "2.0.4" - }, - { - "name": "Kometa-Team/Kometa", - "version": "v2.1.0" - }, - { - "name": "FunkeyFlo/ps5-mqtt", - "version": "v1.4.0" - }, - { - "name": "projectsend/projectsend", - "version": "r1720" - }, - { - "name": "Pf2eToolsOrg/Pf2eTools", - "version": "v0.8.13" - }, - { - "name": "Paymenter/Paymenter", - "version": "v0.9.5" - }, - { - "name": "hywax/mafl", - "version": "v0.15.4" - }, - { - "name": "FlareSolverr/FlareSolverr", - "version": "v3.3.21" - }, - { - "name": "Suwayomi/Suwayomi-Server", - "version": "v1.1.1" - }, - { - "name": "Forceu/barcodebuddy", - "version": "v1.8.1.8" - }, - { - "name": "Lissy93/dashy", - "version": "3.1.1" - }, - { - "name": "gnmyt/myspeed", - "version": "v1.0.9" - }, - { - "name": "monicahq/monica", - "version": "v4.1.2" - }, - { - "name": "thelounge/thelounge-deb", - "version": "v4.4.3" - }, - { - "name": "wger-project/wger", - "version": "2.2" - }, - { - "name": "sct/overseerr", - "version": "preview-test-node-18" - }, - { - "name": "deepch/RTSPtoWeb", - "version": "v2.4.3" - }, - { - "name": "searxng/searxng", - "version": "v1.0.0" - }, - { - "name": "MediaBrowser/Emby", - "version": "3.5.2.0" - } -] +[] From e6dd7ac5a10ebe36686fa5a8c7c9a3131d7847c2 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:54:58 +0100 Subject: [PATCH 111/258] Update pr template and WF (#3200) * update pr template and WF * update pr template and WF * update pr template and WF --- .github/autolabeler-config.json | 28 ++++++++++++++----- .github/changelog-pr-config.json | 15 ++++++++++ .github/pull_request_template.md | 45 ++++++++++++++++++++---------- .github/workflows/autolabeler.yml | 1 + .github/workflows/changelog-pr.yml | 5 +++- 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/.github/autolabeler-config.json b/.github/autolabeler-config.json index 50e73e910..068d559fb 100644 --- a/.github/autolabeler-config.json +++ b/.github/autolabeler-config.json @@ -1,4 +1,3 @@ - { "new script": [ { @@ -16,7 +15,7 @@ ], "delete script": [ { - "fileStatus": "removed", + "fileStatus": "removed", "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], "excludeGlobs": [] } @@ -24,7 +23,13 @@ "maintenance": [ { "fileStatus": null, - "includeGlobs": ["*.md", ".github/**", "misc/*.func", "ct/create_lxc.sh", "api/**"], + "includeGlobs": [ + "*.md", + ".github/**", + "misc/*.func", + "ct/create_lxc.sh", + "api/**" + ], "excludeGlobs": [] } ], @@ -67,10 +72,19 @@ "high risk": [ { "fileStatus": null, - "includeGlobs": ["misc/build.func", "misc/install.func", "ct/create_lxc.sh"], + "includeGlobs": [ + "misc/build.func", + "misc/install.func", + "ct/create_lxc.sh" + ], + "excludeGlobs": [] + } + ], + "documentation": [ + { + "fileStatus": null, + "includeGlobs": ["*.md"], "excludeGlobs": [] } ] - - -} \ No newline at end of file +} diff --git a/.github/changelog-pr-config.json b/.github/changelog-pr-config.json index 2c62aa3f0..2f4eae06e 100644 --- a/.github/changelog-pr-config.json +++ b/.github/changelog-pr-config.json @@ -21,6 +21,11 @@ "title": "πŸ’₯ Breaking Changes", "labels": ["breaking change"], "notes" : [] + }, + { + "title": "πŸ”§ Refactor", + "labels": ["refactor"], + "notes" : [] } ] }, @@ -57,6 +62,16 @@ "title": "πŸ“‚ Github", "labels": ["github"], "notes" : [] + }, + { + "title" :"πŸ“ Documentation", + "labels": ["documentation"], + "notes" : [] + }, + { + "title" :"πŸ”§ Refactor", + "labels": ["refactor"], + "notes" : [] } ] }, diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d669ec78a..0f3ff54ac 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,25 +1,42 @@ -## ✍️ Description - +πŸ›‘ **New scripts must first be submitted to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) for testing.** +PRs for new scripts that skip this process will be closed. -## πŸ”— Related PR / Discussion / Issue +--- + +## ✍️ Description + + +## πŸ”— Related PR / Issue Link: # -## βœ… Prerequisites +## βœ… Prerequisites (**X** in brackets) -Before this PR can be reviewed, the following must be completed: +- [ ] **Self-review completed** – Code follows project standards. +- [ ] **Tested thoroughly** – Changes work as expected. +- [ ] **No breaking changes** – Existing functionality remains intact. +- [ ] **No security risks** – No hardcoded secrets, unnecessary privilege escalations, or permission issues. -- [] **Self-review performed** – Code follows established patterns and conventions. -- [] **Testing performed** – Changes have been thoroughly tested and verified. +--- -## πŸ› οΈ Type of Change +## πŸ› οΈ Type of Change (**X** in brackets) -Select all that apply: +- [ ] 🐞 **Bug fix** – Resolves an issue without breaking functionality. +- [ ] ✨ **New feature** – Adds new, non-breaking functionality. +- [ ] πŸ’₯ **Breaking change** – Alters existing functionality in a way that may require updates. +- [ ] πŸ†• **New script** – A fully functional and tested script or script set. +- [ ] 🌍 **Website update** – Changes to website-related JSON files or metadata. +- [ ] πŸ”§ **Refactoring / Code Cleanup** – Improves readability or maintainability without changing functionality. +- [ ] πŸ“ **Documentation update** – Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs. + +--- + +## πŸ” Code & Security Review (**X** in brackets) + +- [ ] **Follows `Code_Audit.md` & `CONTRIBUTING.md` guidelines** +- [ ] **Uses correct script structure (`AppName.sh`, `AppName-install.sh`, `AppName.json`)** +- [ ] **No hardcoded credentials** -- [] πŸ†• **New script** – A fully functional and tested script or script set. -- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality. -- [] ✨ **New feature** – Adds new, non-breaking functionality. -- [] πŸ’₯ **Breaking change** – Alters existing functionality in a way that may require updates. ## πŸ“‹ Additional Information (optional) - + diff --git a/.github/workflows/autolabeler.yml b/.github/workflows/autolabeler.yml index 75eba1c19..d72f66094 100644 --- a/.github/workflows/autolabeler.yml +++ b/.github/workflows/autolabeler.yml @@ -67,6 +67,7 @@ jobs: "🐞 **Bug fix**": "bugfix", "✨ **New feature**": "feature", "πŸ’₯ **Breaking change**": "breaking change", + "πŸ”§ **Refactoring / Code Cleanup**": "refactor", }; for (const [checkbox, label] of Object.entries(templateLabelMappings)) { diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 036ef7a7c..fa499b5d8 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -63,13 +63,16 @@ jobs: { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, { title: "✨ New Features", labels: ["feature"], notes: [] }, { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] } + { title: "πŸ”§ Refactor, labels: ["refactor"], notes: [] } ] : obj.labels.includes("maintenance") ? [ { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, { title: "✨ New Features", labels: ["feature"], notes: [] }, { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, { title: "πŸ“‘ API", labels: ["api"], notes: [] }, - { title: "Github", labels: ["github"], notes: [] } + { title: "Github", labels: ["github"], notes: [] }, + { title: "πŸ“ Documentation", labels: ["documentation"], notes: [] } + { title: "πŸ”§ Refactor, labels: ["refactor"], notes: [] } ] : obj.labels.includes("website") ? [ { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, From 001811a1e9e0072c83477e8e3d93f5e7dbe7d8ae Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:03:39 +0100 Subject: [PATCH 112/258] Update CHANGELOG.md (#3202) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11caf5a1f..3476038ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) ## 2025-03-17 From 31adca48d7cdfa0155f71a08d86aa3e776513a69 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:09:16 +0100 Subject: [PATCH 113/258] Fix wf (#3206) --- .github/workflows/changelog-pr.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index fa499b5d8..bef7566af 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -63,7 +63,7 @@ jobs: { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, { title: "✨ New Features", labels: ["feature"], notes: [] }, { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] } - { title: "πŸ”§ Refactor, labels: ["refactor"], notes: [] } + { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] }, ] : obj.labels.includes("maintenance") ? [ { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, @@ -71,8 +71,8 @@ jobs: { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, { title: "πŸ“‘ API", labels: ["api"], notes: [] }, { title: "Github", labels: ["github"], notes: [] }, - { title: "πŸ“ Documentation", labels: ["documentation"], notes: [] } - { title: "πŸ”§ Refactor, labels: ["refactor"], notes: [] } + { title: "πŸ“ Documentation", labels: ["documentation"], notes: [] }, + { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] } ] : obj.labels.includes("website") ? [ { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, From 4ffff91e774b7e9d4b0cac5920c4401be4b40a5d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:19:35 +0100 Subject: [PATCH 114/258] Update versions.json (#3204) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 563 ++++++++++++++++++++++++++++- 1 file changed, 562 insertions(+), 1 deletion(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index fe51488c7..1f2d78dcf 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1 +1,562 @@ -[] +[ + { + "name": "zitadel/zitadel", + "version": "v2.70.5" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1660" + }, + { + "name": "authelia/authelia", + "version": "v4.39.1" + }, + { + "name": "ollama/ollama", + "version": "v0.6.1" + }, + { + "name": "advplyr/audiobookshelf", + "version": "v2.20.0" + }, + { + "name": "bastienwirtz/homer", + "version": "v25.03.3" + }, + { + "name": "keycloak/keycloak", + "version": "26.1.4" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.13.0" + }, + { + "name": "Kareadita/Kavita", + "version": "v0.8.5.11" + }, + { + "name": "TriliumNext/Notes", + "version": "v0.92.4" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1" + }, + { + "name": "fallenbagel/jellyseerr", + "version": "v2.5.1" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "develop-20250222.4" + }, + { + "name": "glanceapp/glance", + "version": "v0.7.7" + }, + { + "name": "gethomepage/homepage", + "version": "v1.0.4" + }, + { + "name": "Donkie/Spoolman", + "version": "v0.22.0" + }, + { + "name": "pocket-id/pocket-id", + "version": "v0.40.1" + }, + { + "name": "evcc-io/evcc", + "version": "0.201.0" + }, + { + "name": "BookStackApp/BookStack", + "version": "v25.02.1" + }, + { + "name": "hoarder-app/hoarder", + "version": "ios/v1.6.9-0" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.26.1" + }, + { + "name": "Kozea/Radicale", + "version": "v3.5.0" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "v1.17.0-victorialogs" + }, + { + "name": "msgbyte/tianji", + "version": "v1.18.22" + }, + { + "name": "duplicati/duplicati", + "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15" + }, + { + "name": "henrygd/beszel", + "version": "v0.10.2" + }, + { + "name": "navidrome/navidrome", + "version": "v0.55.1" + }, + { + "name": "Threadfin/Threadfin", + "version": "1.2.31" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v0.44.2" + }, + { + "name": "ipfs/kubo", + "version": "v0.33.2" + }, + { + "name": "paperless-ngx/paperless-ngx", + "version": "v2.15.0-beta" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w11-4.12.0" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.11.0" + }, + { + "name": "docker/compose", + "version": "v2.34.0" + }, + { + "name": "FreshRSS/FreshRSS", + "version": "1.26.1" + }, + { + "name": "kimai/kimai", + "version": "2.31.0" + }, + { + "name": "usememos/memos", + "version": "v0.24.1" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.5-rc3" + }, + { + "name": "NodeBB/NodeBB", + "version": "v4.1.1" + }, + { + "name": "diced/zipline", + "version": "v4.0.1" + }, + { + "name": "minio/minio", + "version": "RELEASE.2025-03-12T18-04-18Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v9.33.0" + }, + { + "name": "cockpit-project/cockpit", + "version": "335" + }, + { + "name": "gotson/komga", + "version": "1.21.2" + }, + { + "name": "benjaminjonard/koillection", + "version": "1.6.12" + }, + { + "name": "excalidraw/excalidraw", + "version": "v0.18.0" + }, + { + "name": "Ombi-app/Ombi", + "version": "v4.47.1" + }, + { + "name": "mylar3/mylar3", + "version": "v0.8.2" + }, + { + "name": "stonith404/pingvin-share", + "version": "v1.10.3" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.57" + }, + { + "name": "Luligu/matterbridge", + "version": "2.2.4" + }, + { + "name": "AlexxIT/go2rtc", + "version": "v1.9.9" + }, + { + "name": "clusterzx/paperless-ai", + "version": "v2.7.4" + }, + { + "name": "YuukanOO/seelf", + "version": "v2.4.2" + }, + { + "name": "umami-software/umami", + "version": "v2.17.0" + }, + { + "name": "documenso/documenso", + "version": "v1.9.1-rc.9" + }, + { + "name": "rogerfar/rdt-client", + "version": "v2.0.102" + }, + { + "name": "prometheus/alertmanager", + "version": "v0.28.1" + }, + { + "name": "hargata/lubelog", + "version": "v1.4.5" + }, + { + "name": "ellite/Wallos", + "version": "v2.46.1" + }, + { + "name": "Dolibarr/dolibarr", + "version": "21.0.0" + }, + { + "name": "netbox-community/netbox", + "version": "v4.2.5" + }, + { + "name": "open-webui/open-webui", + "version": "v0.5.20" + }, + { + "name": "matze/wastebin", + "version": "3.0.0" + }, + { + "name": "immich-app/immich", + "version": "v1.129.0" + }, + { + "name": "snipe/snipe-it", + "version": "v8.0.4" + }, + { + "name": "toniebox-reverse-engineering/teddycloud", + "version": "tc_v0.6.4" + }, + { + "name": "go-gitea/gitea", + "version": "v1.23.5" + }, + { + "name": "sysadminsmedia/homebox", + "version": "v0.18.0" + }, + { + "name": "Koenkk/zigbee2mqtt", + "version": "2.1.3" + }, + { + "name": "heiher/hev-socks5-server", + "version": "2.8.0" + }, + { + "name": "inspircd/inspircd", + "version": "v4.6.0" + }, + { + "name": "tobychui/zoraxy", + "version": "v3.1.9" + }, + { + "name": "grocy/grocy", + "version": "v4.4.2" + }, + { + "name": "jhuckaby/Cronicle", + "version": "v0.9.76" + }, + { + "name": "docmost/docmost", + "version": "v0.8.4" + }, + { + "name": "Part-DB/Part-DB-server", + "version": "v1.16.1" + }, + { + "name": "prometheus/prometheus", + "version": "v3.2.1" + }, + { + "name": "silverbulletmd/silverbullet", + "version": "0.10.4" + }, + { + "name": "juanfont/headscale", + "version": "v0.25.1" + }, + { + "name": "benzino77/tasmocompiler", + "version": "v12.5.0" + }, + { + "name": "traefik/traefik", + "version": "v3.3.4" + }, + { + "name": "schlagmichdoch/PairDrop", + "version": "v1.11.2" + }, + { + "name": "Athou/commafeed", + "version": "5.6.1" + }, + { + "name": "azukaar/Cosmos-Server", + "version": "v0.18.3" + }, + { + "name": "wavelog/wavelog", + "version": "2.0.1" + }, + { + "name": "sabnzbd/sabnzbd", + "version": "4.4.1" + }, + { + "name": "grafana/grafana", + "version": "v11.5.2" + }, + { + "name": "gristlabs/grist-core", + "version": "v1.4.2" + }, + { + "name": "prometheus-pve/prometheus-pve-exporter", + "version": "v3.5.2" + }, + { + "name": "sbondCo/Watcharr", + "version": "v2.0.2" + }, + { + "name": "glpi-project/glpi", + "version": "10.0.18" + }, + { + "name": "TasmoAdmin/TasmoAdmin", + "version": "v4.2.3" + }, + { + "name": "dani-garcia/vaultwarden", + "version": "1.33.2" + }, + { + "name": "blakeblackshear/frigate", + "version": "v0.15.0" + }, + { + "name": "bluenviron/mediamtx", + "version": "v1.11.3" + }, + { + "name": "actualbudget/actual-server", + "version": "v25.2.1" + }, + { + "name": "NginxProxyManager/nginx-proxy-manager", + "version": "v2.12.3" + }, + { + "name": "thomiceli/opengist", + "version": "v1.9.1" + }, + { + "name": "Forceu/Gokapi", + "version": "v1.9.6" + }, + { + "name": "PrivateBin/PrivateBin", + "version": "1.7.6" + }, + { + "name": "hivemq/hivemq-community-edition", + "version": "2025.1" + }, + { + "name": "rustdesk/rustdesk-server", + "version": "1.1.14" + }, + { + "name": "hansmi/prometheus-paperless-exporter", + "version": "v0.0.6" + }, + { + "name": "donaldzou/WGDashboard", + "version": "v4.1.4" + }, + { + "name": "0xERR0R/blocky", + "version": "v0.25" + }, + { + "name": "linkwarden/linkwarden", + "version": "v2.9.3" + }, + { + "name": "Tautulli/Tautulli", + "version": "v2.15.1" + }, + { + "name": "traccar/traccar", + "version": "v6.6" + }, + { + "name": "ErsatzTV/ErsatzTV", + "version": "v25.1.0" + }, + { + "name": "seanmorley15/AdventureLog", + "version": "v0.8.0" + }, + { + "name": "MagicMirrorOrg/MagicMirror", + "version": "v2.30.0" + }, + { + "name": "louislam/uptime-kuma", + "version": "2.0.0-beta.1" + }, + { + "name": "pymedusa/Medusa", + "version": "v1.0.22" + }, + { + "name": "phpipam/phpipam", + "version": "v1.7.3" + }, + { + "name": "Bubka/2FAuth", + "version": "v5.4.3" + }, + { + "name": "gotify/server", + "version": "v2.6.1" + }, + { + "name": "janeczku/calibre-web", + "version": "0.6.24" + }, + { + "name": "sabre-io/Baikal", + "version": "0.10.1" + }, + { + "name": "caddyserver/xcaddy", + "version": "v0.4.4" + }, + { + "name": "linuxserver/Heimdall", + "version": "v2.6.3" + }, + { + "name": "aceberg/WatchYourLAN", + "version": "2.0.4" + }, + { + "name": "Kometa-Team/Kometa", + "version": "v2.1.0" + }, + { + "name": "FunkeyFlo/ps5-mqtt", + "version": "v1.4.0" + }, + { + "name": "projectsend/projectsend", + "version": "r1720" + }, + { + "name": "Pf2eToolsOrg/Pf2eTools", + "version": "v0.8.13" + }, + { + "name": "Paymenter/Paymenter", + "version": "v0.9.5" + }, + { + "name": "hywax/mafl", + "version": "v0.15.4" + }, + { + "name": "FlareSolverr/FlareSolverr", + "version": "v3.3.21" + }, + { + "name": "Suwayomi/Suwayomi-Server", + "version": "v1.1.1" + }, + { + "name": "Forceu/barcodebuddy", + "version": "v1.8.1.8" + }, + { + "name": "Lissy93/dashy", + "version": "3.1.1" + }, + { + "name": "gnmyt/myspeed", + "version": "v1.0.9" + }, + { + "name": "monicahq/monica", + "version": "v4.1.2" + }, + { + "name": "thelounge/thelounge-deb", + "version": "v4.4.3" + }, + { + "name": "wger-project/wger", + "version": "2.2" + }, + { + "name": "sct/overseerr", + "version": "preview-test-node-18" + }, + { + "name": "deepch/RTSPtoWeb", + "version": "v2.4.3" + }, + { + "name": "searxng/searxng", + "version": "v1.0.0" + }, + { + "name": "MediaBrowser/Emby", + "version": "3.5.2.0" + } +] From bd96decf1d957b043092d0ea606398e2774fabf5 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:54:43 +0100 Subject: [PATCH 115/258] 'Add new script' (#3205) Co-authored-by: app-header-generator[bot] <194485257+app-header-generator[bot]@users.noreply.github.com> --- cryptpad-install.sh | 88 +++++++++++++++++++++++++++++++++++++++++++++ cryptpad.json | 38 ++++++++++++++++++++ cryptpad.sh | 74 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+) create mode 100644 cryptpad-install.sh create mode 100644 cryptpad.json create mode 100644 cryptpad.sh diff --git a/cryptpad-install.sh b/cryptpad-install.sh new file mode 100644 index 000000000..634b4f464 --- /dev/null +++ b/cryptpad-install.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: SlaviΕ‘a AreΕΎina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/cryptpad/cryptpad + +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 \ + gnupg \ + git +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 "Setup Node.js" +$STD apt-get update +$STD apt-get install -y nodejs +msg_ok "Setup Node.js" + +read -p "Install OnlyOffice components instead of CKEditor? (Y/N): " onlyoffice + +msg_info "Setup ${APPLICATION}" +temp_file=$(mktemp) +RELEASE=$(curl -s https://api.github.com/repos/cryptpad/cryptpad/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') +wget -q "https://github.com/cryptpad/cryptpad/archive/refs/tags/${RELEASE}.tar.gz" -O $temp_file +tar zxf $temp_file +mv cryptpad-$RELEASE /opt/cryptpad +cd /opt/cryptpad +$STD npm ci +$STD npm run install:components +$STD npm run build +cp config/config.example.js config/config.js +IP=$(hostname -I | awk '{print $1}') +sed -i "51s/localhost/${IP}/g" /opt/cryptpad/config/config.js +sed -i "80s#//httpAddress: 'localhost'#httpAddress: '0.0.0.0'#g" /opt/cryptpad/config/config.js +if [[ "$onlyoffice" =~ ^[Yy]$ ]]; then + $STD bash -c "./install-onlyoffice.sh --accept-license" +fi +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Setup ${APPLICATION}" + +msg_info "Creating Service" +cat </etc/systemd/system/cryptpad.service +[Unit] +Description=CryptPad Service +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/cryptpad +ExecStart=/usr/bin/node server +Environment='PWD="/opt/cryptpad"' +StandardOutput=journal +StandardError=journal+console +LimitNOFILE=1000000 +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now cryptpad +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f $temp_file +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/cryptpad.json b/cryptpad.json new file mode 100644 index 000000000..a75a2ba97 --- /dev/null +++ b/cryptpad.json @@ -0,0 +1,38 @@ +{ + "name": "CryptPad", + "slug": "cryptpad", + "categories": [ + 12 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.cryptpad.org/", + "website": "https://cryptpad.org/", + "logo": "https://raw.githubusercontent.com/cryptpad/cryptpad/refs/heads/main/customize.dist/CryptPad_logo.svg", + "description": "CryptPad is a collaboration suite that is end-to-end encrypted and open-source. It is designed to facilitate collaboration by synchronizing changes to documents in real time. Since all the user data is encrypted, in the event of a breach, attackers have no way of accessing the stored content", + "install_methods": [ + { + "type": "default", + "script": "ct/cryptpad.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation finishes, `systemctl status cryptpad.service` to get token URL which you can use to create admin account", + "type": "info" + } + } diff --git a/cryptpad.sh b/cryptpad.sh new file mode 100644 index 000000000..cb849a296 --- /dev/null +++ b/cryptpad.sh @@ -0,0 +1,74 @@ +#!/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: SlaviΕ‘a AreΕΎina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/cryptpad/cryptpad + +APP="CryptPad" +var_tags="docs;office" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/cryptpad" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/cryptpad/cryptpad/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop cryptpad + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + temp_dir=$(mktemp -d) + cp -f /opt/cryptpad/config/config.js /opt/config.js + wget -q "https://github.com/cryptpad/cryptpad/archive/refs/tags/${RELEASE}.tar.gz" -P $temp_dir + cd $temp_dir + tar zxf $RELEASE.tar.gz + cp -rf cryptpad-$RELEASE/* /opt/cryptpad + cd /opt/cryptpad + $STD npm ci + $STD npm run install:components + $STD npm run build + cp -f /opt/config.js /opt/cryptpad/config/config.js + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Cleaning Up" + rm -rf $temp_dir + msg_ok "Cleanup Completed" + + msg_info "Starting $APP" + systemctl start cryptpad + msg_ok "Started $APP" + + msg_ok "Update Successful" + 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}:3000${CL}" From 1e72721d4eaf4e3ae3b5d587fb875cd0c8cf783d Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:55:15 +0100 Subject: [PATCH 116/258] Tandoor: Extend needed dependencies (#3207) --- install/tandoor-install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/install/tandoor-install.sh b/install/tandoor-install.sh index bc42a8e3d..cc6121a13 100644 --- a/install/tandoor-install.sh +++ b/install/tandoor-install.sh @@ -29,7 +29,11 @@ $STD apt-get install -y --no-install-recommends \ sudo \ git \ make \ - mc + mc \ + pkg-config \ + libxmlsec1-dev \ + libxml2-dev \ + libxmlsec1-openssl msg_ok "Installed Dependencies" msg_info "Setup Python3" From 21d82f207a9bd1b5bc9443c6713c2e6eac8a4cce Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:55:43 +0100 Subject: [PATCH 117/258] Shorten PR Template for ProxmoxVE (Remove some VED Things) (#3208) --- .github/pull_request_template.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0f3ff54ac..89b9bc47e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,15 +1,14 @@ -πŸ›‘ **New scripts must first be submitted to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) for testing.** -PRs for new scripts that skip this process will be closed. - ---- + ## ✍️ Description -## πŸ”— Related PR / Issue +## πŸ”— Related PR / Issue Link: # + ## βœ… Prerequisites (**X** in brackets) - [ ] **Self-review completed** – Code follows project standards. @@ -33,9 +32,7 @@ Link: # ## πŸ” Code & Security Review (**X** in brackets) -- [ ] **Follows `Code_Audit.md` & `CONTRIBUTING.md` guidelines** -- [ ] **Uses correct script structure (`AppName.sh`, `AppName-install.sh`, `AppName.json`)** -- [ ] **No hardcoded credentials** +- [ ] **Follows `Code_Audit.md` & `CONTRIBUTING.md` guidelines** ## πŸ“‹ Additional Information (optional) From f65cf8cf9e817c690ac9799cb9fa3a14c97f943d Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:55:59 +0100 Subject: [PATCH 118/258] Seafile: Lowercase Slug for Install/Update-Source (#3209) --- frontend/public/json/seafile.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/public/json/seafile.json b/frontend/public/json/seafile.json index c26172013..ddabe7eca 100644 --- a/frontend/public/json/seafile.json +++ b/frontend/public/json/seafile.json @@ -1,6 +1,6 @@ { "name": "Seafile", - "slug": "Seafile", + "slug": "seafile", "categories": [ 12 ], @@ -44,4 +44,4 @@ "type": "info" } ] -} \ No newline at end of file +} From cd05313ac2a7e1d8d7db192dbbf017349f76ad67 Mon Sep 17 00:00:00 2001 From: Christoph Kieslich Date: Tue, 18 Mar 2025 13:15:23 +0100 Subject: [PATCH 119/258] Fix openwebui update script when backup directory already exists (#3213) --- ct/openwebui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/openwebui.sh b/ct/openwebui.sh index 14a45f5e9..738a04386 100644 --- a/ct/openwebui.sh +++ b/ct/openwebui.sh @@ -29,7 +29,7 @@ function update_script() { fi msg_info "Updating ${APP} (Patience)" cd /opt/open-webui - mkdir /opt/open-webui-backup + mkdir -p /opt/open-webui-backup cp -rf /opt/open-webui/backend/data /opt/open-webui-backup git add -A $STD git stash @@ -61,4 +61,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}:8080${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" From 4d40d6180a920798ba5428dbc31bc718ddb04891 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:16:42 +0100 Subject: [PATCH 120/258] Update changelog-pr.yml (#3212) --- .github/workflows/changelog-pr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index bef7566af..7d6e52351 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -62,7 +62,7 @@ jobs: obj.labels.includes("update script") ? [ { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, { title: "✨ New Features", labels: ["feature"], notes: [] }, - { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] } + { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] }, ] : obj.labels.includes("maintenance") ? [ @@ -226,4 +226,4 @@ jobs: PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number') if [ -n "$PR_NUMBER" ]; then gh pr review $PR_NUMBER --approve - fi \ No newline at end of file + fi From 9f2d44879f3a74abc8a6c49a7bb29753400ce374 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:27:15 +0100 Subject: [PATCH 121/258] Update CHANGELOG.md (#3217) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3476038ad..80d914378 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,12 +18,24 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸ†• New Scripts - - GoMFT [@tremor021](https://github.com/tremor021) ([#3157](https://github.com/community-scripts/ProxmoxVE/pull/3157)) + - CryptPad [@MickLesk](https://github.com/MickLesk) ([#3205](https://github.com/community-scripts/ProxmoxVE/pull/3205)) +- GoMFT [@tremor021](https://github.com/tremor021) ([#3157](https://github.com/community-scripts/ProxmoxVE/pull/3157)) + +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - Fix openwebui update script when backup directory already exists [@chrisdoc](https://github.com/chrisdoc) ([#3213](https://github.com/community-scripts/ProxmoxVE/pull/3213)) + + - #### πŸ’₯ Breaking Changes + + - Tandoor: Extend needed dependencies (Read for Update-Functionality) [@MickLesk](https://github.com/MickLesk) ([#3207](https://github.com/community-scripts/ProxmoxVE/pull/3207)) ### 🧰 Maintenance - #### πŸ“‚ Github + - Update pr template and WF [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3200](https://github.com/community-scripts/ProxmoxVE/pull/3200)) - Add worflow to crawl APP verisons [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3192](https://github.com/community-scripts/ProxmoxVE/pull/3192)) - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) - Change json path CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#3187](https://github.com/community-scripts/ProxmoxVE/pull/3187)) @@ -34,6 +46,8 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) + - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3204](https://github.com/community-scripts/ProxmoxVE/pull/3204)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) From 05d4064f03cb7663d139d1738354121b2e46c7f9 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:27:35 +0100 Subject: [PATCH 122/258] Update Frontedn (#3216) --- frontend/src/app/api/versions/route.ts | 46 +++++++++++++++++++ .../app/scripts/_components/ScriptItem.tsx | 36 +++++++++++++-- frontend/src/lib/data.ts | 8 ++++ frontend/src/lib/types.ts | 5 ++ 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 frontend/src/app/api/versions/route.ts diff --git a/frontend/src/app/api/versions/route.ts b/frontend/src/app/api/versions/route.ts new file mode 100644 index 000000000..6adfd7fd6 --- /dev/null +++ b/frontend/src/app/api/versions/route.ts @@ -0,0 +1,46 @@ +import { AppVersion } from "@/lib/types"; +import { error } from "console"; +import { promises as fs } from "fs"; +// import Error from "next/error"; +import { NextResponse } from "next/server"; +import path from "path"; + +export const dynamic = "force-static"; + +const jsonDir = "public/json"; +const versionsFileName = "versions.json"; +const encoding = "utf-8"; + +const getVersions = async () => { + const filePath = path.resolve(jsonDir, versionsFileName); + const fileContent = await fs.readFile(filePath, encoding); + const versions: AppVersion[] = JSON.parse(fileContent); + + const modifiedVersions = versions.map(version => { + const nameParts = version.name.split('/'); + let newName = nameParts[nameParts.length - 1]; + newName = newName.toLowerCase().replace(/[^a-z0-9]/g, ''); + return { ...version, name: newName }; + }); + + return modifiedVersions; +}; + +export async function GET() { + try { + + const versions = await getVersions(); + return NextResponse.json(versions); + + } catch (error) { + console.error(error); + const err = error as globalThis.Error; + return NextResponse.json({ + name: err.name, + message: err.message || "An unexpected error occurred", + version: "No version found - Error" + }, { + status: 500, + }); + } +} diff --git a/frontend/src/app/scripts/_components/ScriptItem.tsx b/frontend/src/app/scripts/_components/ScriptItem.tsx index 973514a09..7199b808d 100644 --- a/frontend/src/app/scripts/_components/ScriptItem.tsx +++ b/frontend/src/app/scripts/_components/ScriptItem.tsx @@ -1,7 +1,9 @@ -"use client"; + import { Separator } from "@/components/ui/separator"; import { extractDate } from "@/lib/time"; -import { Script } from "@/lib/types"; +import { Script, AppVersion } from "@/lib/types"; +import { fetchVersions } from "@/lib/data"; + import { X } from "lucide-react"; import Image from "next/image"; @@ -15,6 +17,8 @@ import InstallCommand from "./ScriptItems/InstallCommand"; import InterFaces from "./ScriptItems/InterFaces"; import Tooltips from "./ScriptItems/Tooltips"; import { basePath } from "@/config/siteConfig"; +import { useEffect, useState } from "react"; + function ScriptItem({ item, @@ -27,6 +31,23 @@ function ScriptItem({ window.history.pushState({}, document.title, window.location.pathname); setSelectedScript(null); }; + const [versions, setVersions] = useState([]); + + + useEffect(() => { + fetchVersions() + .then((fetchedVersions) => { + console.log("Fetched Versions: ", fetchedVersions); + if (Array.isArray(fetchedVersions)) { + setVersions(fetchedVersions); + } else if (fetchedVersions && typeof fetchedVersions === "object") { + setVersions([fetchedVersions]); + } else { + setVersions([]); + } + }) + .catch((error) => console.error("Error fetching versions:", error)); + }, []); const defaultInstallMethod = item.install_methods?.[0]; const os = defaultInstallMethod?.resources?.os || "Proxmox Node"; @@ -48,8 +69,8 @@ function ScriptItem({ src={item.logo || `/${basePath}/logo.png`} width={400} onError={(e) => - ((e.currentTarget as HTMLImageElement).src = - `/${basePath}/logo.png`) + ((e.currentTarget as HTMLImageElement).src = + `/${basePath}/logo.png`) } height={400} alt={item.name} @@ -71,6 +92,13 @@ function ScriptItem({

+
{versions.length === 0 ? (

Loading versions...

) : + (<> +

Version:

+

{versions.find((v) => v.name === item.slug.replace(/[^a-z0-9]/g, ''))?.version || "No Version Information found"}

+ ) + } +
diff --git a/frontend/src/lib/data.ts b/frontend/src/lib/data.ts index 99678031a..526cc628b 100644 --- a/frontend/src/lib/data.ts +++ b/frontend/src/lib/data.ts @@ -8,3 +8,11 @@ export const fetchCategories = async () => { const categories: Category[] = await response.json(); return categories; }; + +export const fetchVersions = async () => { + const response = await fetch(`api/versions`); + if (!response.ok) { + throw new Error(`Failed to fetch versions: ${response.statusText}`); + } + return response.json(); +}; diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 2dfa97167..643b3a3d9 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -55,4 +55,9 @@ export interface Version { export interface OperatingSystem { name: string; versions: Version[]; +} + +export interface AppVersion { + name: string; + version: string; } \ No newline at end of file From eeeca584c6d7b37d7bd4a10b6c3b0b25bc80fb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:28:33 +0100 Subject: [PATCH 123/258] Update with login info (#3215) --- frontend/public/json/debian-vm.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/public/json/debian-vm.json b/frontend/public/json/debian-vm.json index 96909d727..ff2833074 100644 --- a/frontend/public/json/debian-vm.json +++ b/frontend/public/json/debian-vm.json @@ -31,9 +31,13 @@ "password": null }, "notes": [ - { - "text": "after installation, checkout: Β΄https://github.com/community-scripts/ProxmoxVE/discussions/836Β΄", - "type": "info" - } + { + "text": "VM has no root password set. To login type in user `root` and just press enter", + "type": "info" + }, + { + "text": "After installation, checkout: Β΄https://github.com/community-scripts/ProxmoxVE/discussions/836Β΄ for useful Debian commands", + "type": "info" + } ] } From ab67c8942525ebf5440f57b2d8421b57f465662e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:33:13 +0100 Subject: [PATCH 124/258] Update CHANGELOG.md (#3218) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80d914378..fa3c50483 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,8 +44,13 @@ All LXC instances created using this repository come pre-installed with Midnight ### 🌐 Website + - #### ✨ New Features + + - Show Version Information on Frontend [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3216](https://github.com/community-scripts/ProxmoxVE/pull/3216)) + - #### πŸ“ Script Information + - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3204](https://github.com/community-scripts/ProxmoxVE/pull/3204)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) From 56b15a3f7efb12c83befd69eae82c0e468a27245 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:36:03 +0100 Subject: [PATCH 125/258] Add label to Workflow PR (#3219) * Add label to PR * Add label to PR --- .github/workflows/crawl-versions.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crawl-versions.yaml b/.github/workflows/crawl-versions.yaml index 96d03a7ae..72bac6e6b 100644 --- a/.github/workflows/crawl-versions.yaml +++ b/.github/workflows/crawl-versions.yaml @@ -90,7 +90,7 @@ jobs: fi git commit -m "Update versions.json" git push origin update_versions --force - gh pr create --title "[AUTOMATIC PR]Update versions.json" --body "Update versions.json, crawled from newreleases.io" --base main --head update_versions + gh pr create --title "[Github Action] Update versions.json" --body "Update versions.json, crawled from newreleases.io" --base main --head update_versions --label "automated pr" - name: Approve pull request if: env.changed == 'true' From acb3aa501058035290e8efc179318c05b68c4946 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:52:10 +0100 Subject: [PATCH 126/258] Update CHANGELOG.md (#3220) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa3c50483..91ce61085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,6 @@ All LXC instances created using this repository come pre-installed with Midnight - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) - - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3204](https://github.com/community-scripts/ProxmoxVE/pull/3204)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) From b6e7af001a7f364c697b23cd41604f8418270478 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:29:43 +0100 Subject: [PATCH 127/258] Website: Lowercase Zitadel-Slug (#3222) --- frontend/public/json/zitadel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/zitadel.json b/frontend/public/json/zitadel.json index 8a147db3b..a48d9338c 100644 --- a/frontend/public/json/zitadel.json +++ b/frontend/public/json/zitadel.json @@ -1,6 +1,6 @@ { "name": "Zitadel", - "slug": "Zitadel", + "slug": "zitadel", "categories": [ 6 ], From 817d9a4833529d77eedd893b4b9bfa4c4213050f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:41:48 +0100 Subject: [PATCH 128/258] Update CHANGELOG.md (#3224) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91ce61085..c99c2e3eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,8 +35,8 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“‚ Github - - Update pr template and WF [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3200](https://github.com/community-scripts/ProxmoxVE/pull/3200)) - Add worflow to crawl APP verisons [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3192](https://github.com/community-scripts/ProxmoxVE/pull/3192)) + - Update pr template and WF [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3200](https://github.com/community-scripts/ProxmoxVE/pull/3200)) - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) - Change json path CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#3187](https://github.com/community-scripts/ProxmoxVE/pull/3187)) - Relocate the Json Files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3184](https://github.com/community-scripts/ProxmoxVE/pull/3184)) @@ -50,6 +50,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - Website: Lowercase Zitadel-Slug [@MickLesk](https://github.com/MickLesk) ([#3222](https://github.com/community-scripts/ProxmoxVE/pull/3222)) - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) From 3d49fb5a3efdac333eb506d880831346f210605c Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:46:01 +0100 Subject: [PATCH 129/258] VictoriaMetrics: Fix Wrong Slug (#3225) --- frontend/public/json/victoriametrics.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/victoriametrics.json b/frontend/public/json/victoriametrics.json index 43955e6ca..06da91d77 100644 --- a/frontend/public/json/victoriametrics.json +++ b/frontend/public/json/victoriametrics.json @@ -1,6 +1,6 @@ { "name": "VictoriaMetrics", - "slug": "victoria", + "slug": "victoriametrics", "categories": [ 8 ], From 2a8b6d309233e26976c286e774b4da63d3e6b8c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:46:09 +0100 Subject: [PATCH 130/258] Add debian only warning (#3210) --- frontend/public/json/crowdsec.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/crowdsec.json b/frontend/public/json/crowdsec.json index 3e4c87c2a..120014667 100644 --- a/frontend/public/json/crowdsec.json +++ b/frontend/public/json/crowdsec.json @@ -32,7 +32,7 @@ }, "notes": [ { - "text": "Execute within an existing LXC Console", + "text": "Execute within an existing LXC Console. Debian only!", "type": "warning" } ] From 46b640a60f430b70de1d9cd6e9378af59f793f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:56:33 +0100 Subject: [PATCH 131/258] Heimdall Dashboard: Fix missing logo on website (#3227) * Update Heimdall logo * take it from master branch --- frontend/public/json/heimdall-dashboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/heimdall-dashboard.json b/frontend/public/json/heimdall-dashboard.json index 7f84a5c13..0b7132e3a 100644 --- a/frontend/public/json/heimdall-dashboard.json +++ b/frontend/public/json/heimdall-dashboard.json @@ -11,7 +11,7 @@ "interface_port": 7990, "documentation": null, "website": "https://heimdall.site/", - "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/heimdall.png?raw=true", + "logo": "https://raw.githubusercontent.com/linuxserver/Heimdall/refs/heads/master/public/img/heimdall-logo.svg", "description": "Heimdall Dashboard is a self-hosted, web-based dashboard for managing and monitoring the health of applications and servers. It allows you to keep track of the status of your systems from a single, centralized location, and receive notifications when things go wrong. With Heimdall Dashboard, you have full control over your data and can customize it to meet your specific needs. Self-hosting the dashboard gives you the flexibility to run it on your own infrastructure, making it a suitable solution for organizations that prioritize data security and privacy.", "install_methods": [ { From c10a250eae03d2ab530a12a41395826e9918912e Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:00:39 +0100 Subject: [PATCH 132/258] Update Frontedn (#3223) From 91f13db7f85b85cb9e717ad061185e28dc0d9095 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:04:56 +0100 Subject: [PATCH 133/258] Update versions.json (#3230) --- frontend/public/json/versions.json | 328 ++++++++++++++++++++++++++++- 1 file changed, 324 insertions(+), 4 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 1f2d78dcf..df421d305 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,32 @@ [ + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.6" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.5-rc4" + }, + { + "name": "Radarr/Radarr", + "version": "v5.20.2.9777" + }, + { + "name": "apache/couchdb", + "version": "3.4.3.post1" + }, { "name": "zitadel/zitadel", "version": "v2.70.5" }, + { + "name": "nzbgetcom/nzbget", + "version": "testing" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0b1" + }, { "name": "Jackett/Jackett", "version": "v0.22.1660" @@ -15,6 +39,10 @@ "name": "ollama/ollama", "version": "v0.6.1" }, + { + "name": "StarFleetCPTN/GoMFT", + "version": "v0.1.15" + }, { "name": "advplyr/audiobookshelf", "version": "v2.20.0" @@ -35,14 +63,38 @@ "name": "Kareadita/Kavita", "version": "v0.8.5.11" }, + { + "name": "goauthentik/authentik", + "version": "version/2025.2.2" + }, + { + "name": "Sonarr/Sonarr", + "version": "v4.0.14.2939" + }, { "name": "TriliumNext/Notes", "version": "v0.92.4" }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.84.0" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.2.0-beta.1" + }, + { + "name": "home-assistant/operating-system", + "version": "15.0" + }, { "name": "morpheus65535/bazarr", "version": "v1.5.1" }, + { + "name": "webmin/webmin", + "version": "2.303" + }, { "name": "fallenbagel/jellyseerr", "version": "v2.5.1" @@ -63,6 +115,10 @@ "name": "Donkie/Spoolman", "version": "v0.22.0" }, + { + "name": "autobrr/autobrr", + "version": "v1.60.0" + }, { "name": "pocket-id/pocket-id", "version": "v0.40.1" @@ -79,10 +135,26 @@ "name": "hoarder-app/hoarder", "version": "ios/v1.6.9-0" }, + { + "name": "YunoHost/yunohost", + "version": "debian/12.0.12" + }, + { + "name": "Prowlarr/Prowlarr", + "version": "v1.32.2.4987" + }, { "name": "pocketbase/pocketbase", "version": "v0.26.1" }, + { + "name": "redis/redis", + "version": "8.0-m04" + }, + { + "name": "esphome/esphome", + "version": "2025.3.0b3" + }, { "name": "Kozea/Radicale", "version": "v3.5.0" @@ -91,6 +163,14 @@ "name": "VictoriaMetrics/VictoriaMetrics", "version": "v1.17.0-victorialogs" }, + { + "name": "bunkerity/bunkerweb", + "version": "v1.6.1" + }, + { + "name": "runtipi/runtipi", + "version": "v3.10.0" + }, { "name": "msgbyte/tianji", "version": "v1.18.22" @@ -107,6 +187,10 @@ "name": "navidrome/navidrome", "version": "v0.55.1" }, + { + "name": "coder/code-server", + "version": "v4.98.2" + }, { "name": "Threadfin/Threadfin", "version": "1.2.31" @@ -131,6 +215,10 @@ "name": "homarr-labs/homarr", "version": "v1.11.0" }, + { + "name": "home-assistant/core", + "version": "2025.3.3" + }, { "name": "docker/compose", "version": "v2.34.0" @@ -148,8 +236,8 @@ "version": "v0.24.1" }, { - "name": "openobserve/openobserve", - "version": "v0.14.5-rc3" + "name": "moghtech/komodo", + "version": "v1.17.0-dev-7" }, { "name": "NodeBB/NodeBB", @@ -171,10 +259,22 @@ "name": "cockpit-project/cockpit", "version": "335" }, + { + "name": "syncthing/syncthing", + "version": "v1.29.3" + }, + { + "name": "transmission/transmission", + "version": "4.1.0-beta.2" + }, { "name": "gotson/komga", "version": "1.21.2" }, + { + "name": "element-hq/synapse", + "version": "v1.126.0" + }, { "name": "benjaminjonard/koillection", "version": "1.6.12" @@ -183,6 +283,10 @@ "name": "excalidraw/excalidraw", "version": "v0.18.0" }, + { + "name": "neo4j/neo4j", + "version": "5.26.4" + }, { "name": "Ombi-app/Ombi", "version": "v4.47.1" @@ -211,6 +315,22 @@ "name": "clusterzx/paperless-ai", "version": "v2.7.4" }, + { + "name": "awawa-dev/HyperHDR", + "version": "v21.0.0.0" + }, + { + "name": "Lidarr/Lidarr", + "version": "v2.10.1.4589" + }, + { + "name": "Readarr/Readarr", + "version": "v0.4.12.2753" + }, + { + "name": "Brandawg93/PeaNUT", + "version": "v5.6.0" + }, { "name": "YuukanOO/seelf", "version": "v2.4.2" @@ -271,6 +391,18 @@ "name": "go-gitea/gitea", "version": "v1.23.5" }, + { + "name": "apache/tomcat", + "version": "10.1.39" + }, + { + "name": "tailscale/tailscale", + "version": "v1.80.3" + }, + { + "name": "pi-hole/pi-hole", + "version": "v6.0.5" + }, { "name": "sysadminsmedia/homebox", "version": "v0.18.0" @@ -295,6 +427,10 @@ "name": "grocy/grocy", "version": "v4.4.2" }, + { + "name": "photoprism/photoprism", + "version": "250228-43447fa38" + }, { "name": "jhuckaby/Cronicle", "version": "v0.9.76" @@ -303,6 +439,14 @@ "name": "docmost/docmost", "version": "v0.8.4" }, + { + "name": "cloudflare/cloudflared", + "version": "2025.2.1" + }, + { + "name": "cross-seed/cross-seed", + "version": "v6.11.2" + }, { "name": "Part-DB/Part-DB-server", "version": "v1.16.1" @@ -327,14 +471,46 @@ "name": "traefik/traefik", "version": "v3.3.4" }, + { + "name": "zabbix/zabbix", + "version": "7.2.4" + }, { "name": "schlagmichdoch/PairDrop", "version": "v1.11.2" }, + { + "name": "drakkan/sftpgo", + "version": "v2.6.6" + }, + { + "name": "ioBroker/ioBroker", + "version": "2025-02-23" + }, + { + "name": "ventoy/Ventoy", + "version": "v1.1.05" + }, { "name": "Athou/commafeed", "version": "5.6.1" }, + { + "name": "openhab/openhab-core", + "version": "5.0.0.M1" + }, + { + "name": "outline/outline", + "version": "v0.82.1-15" + }, + { + "name": "TechnitiumSoftware/DnsServer", + "version": "v13.4.3" + }, + { + "name": "OliveTin/OliveTin", + "version": "2025.2.21" + }, { "name": "azukaar/Cosmos-Server", "version": "v0.18.3" @@ -343,6 +519,10 @@ "name": "wavelog/wavelog", "version": "2.0.1" }, + { + "name": "wavelog/wavelog", + "version": "2.0.1" + }, { "name": "sabnzbd/sabnzbd", "version": "4.4.1" @@ -359,14 +539,50 @@ "name": "prometheus-pve/prometheus-pve-exporter", "version": "v3.5.2" }, + { + "name": "leiweibau/Pi.Alert", + "version": "v2025-02-16" + }, + { + "name": "qbittorrent/qBittorrent", + "version": "release-5.0.4" + }, + { + "name": "postgres/postgres", + "version": "REL_13_20" + }, + { + "name": "jellyfin/jellyfin", + "version": "v10.10.6" + }, { "name": "sbondCo/Watcharr", "version": "v2.0.2" }, + { + "name": "recyclarr/recyclarr", + "version": "v7.4.1" + }, + { + "name": "node-red/node-red", + "version": "4.0.9" + }, + { + "name": "mayswind/AriaNg", + "version": "1.3.10" + }, + { + "name": "MariaDB/server", + "version": "mariadb-11.8.1" + }, { "name": "glpi-project/glpi", "version": "10.0.18" }, + { + "name": "homebridge/homebridge", + "version": "v1.9.0" + }, { "name": "TasmoAdmin/TasmoAdmin", "version": "v4.2.3" @@ -383,6 +599,14 @@ "name": "bluenviron/mediamtx", "version": "v1.11.3" }, + { + "name": "apache/cassandra", + "version": "cassandra-4.0.17" + }, + { + "name": "apache/tika", + "version": "2.9.3" + }, { "name": "actualbudget/actual-server", "version": "v25.2.1" @@ -391,6 +615,10 @@ "name": "NginxProxyManager/nginx-proxy-manager", "version": "v2.12.3" }, + { + "name": "mongodb/mongo", + "version": "r8.0.5-rc1" + }, { "name": "thomiceli/opengist", "version": "v1.9.1" @@ -399,6 +627,10 @@ "name": "Forceu/Gokapi", "version": "v1.9.6" }, + { + "name": "requarks/wiki", + "version": "v2.5.306" + }, { "name": "PrivateBin/PrivateBin", "version": "1.7.6" @@ -415,6 +647,10 @@ "name": "hansmi/prometheus-paperless-exporter", "version": "v0.0.6" }, + { + "name": "owncast/owncast", + "version": "v0.2.1" + }, { "name": "donaldzou/WGDashboard", "version": "v4.1.4" @@ -423,6 +659,18 @@ "name": "0xERR0R/blocky", "version": "v0.25" }, + { + "name": "petio-team/petio", + "version": "v0.5.7" + }, + { + "name": "readeck/readeck", + "version": "0.17.1" + }, + { + "name": "influxdata/influxdb", + "version": "v1.10.8" + }, { "name": "linkwarden/linkwarden", "version": "v2.9.3" @@ -443,14 +691,34 @@ "name": "seanmorley15/AdventureLog", "version": "v0.8.0" }, + { + "name": "nicolargo/glances", + "version": "v4.3.0.8" + }, { "name": "MagicMirrorOrg/MagicMirror", "version": "v2.30.0" }, + { + "name": "go-vikunja/vikunja", + "version": "v0.24.6" + }, { "name": "louislam/uptime-kuma", "version": "2.0.0-beta.1" }, + { + "name": "IceWhaleTech/CasaOS", + "version": "v0.4.15" + }, + { + "name": "mysql/mysql-server", + "version": "mysql-cluster-7.6.33" + }, + { + "name": "ArchiveBox/ArchiveBox", + "version": "v0.7.3" + }, { "name": "pymedusa/Medusa", "version": "v1.0.22" @@ -463,6 +731,10 @@ "name": "Bubka/2FAuth", "version": "v5.4.3" }, + { + "name": "lldap/lldap", + "version": "v0.6.1" + }, { "name": "gotify/server", "version": "v2.6.1" @@ -475,6 +747,10 @@ "name": "sabre-io/Baikal", "version": "0.10.1" }, + { + "name": "nextcloud/nextcloudpi", + "version": "v1.55.3" + }, { "name": "caddyserver/xcaddy", "version": "v0.4.4" @@ -483,10 +759,22 @@ "name": "linuxserver/Heimdall", "version": "v2.6.3" }, + { + "name": "zerotier/ZeroTierOne", + "version": "1.14.2" + }, { "name": "aceberg/WatchYourLAN", "version": "2.0.4" }, + { + "name": "NLnetLabs/unbound", + "version": "release-1.22.0" + }, + { + "name": "Notifiarr/notifiarr", + "version": "v0.8.3" + }, { "name": "Kometa-Team/Kometa", "version": "v2.1.0" @@ -511,6 +799,10 @@ "name": "hywax/mafl", "version": "v0.15.4" }, + { + "name": "hywax/mafl", + "version": "v0.15.4" + }, { "name": "FlareSolverr/FlareSolverr", "version": "v3.3.21" @@ -527,18 +819,38 @@ "name": "Lissy93/dashy", "version": "3.1.1" }, + { + "name": "motioneye-project/motioneye", + "version": "0.43.1b2" + }, { "name": "gnmyt/myspeed", "version": "v1.0.9" }, + { + "name": "CrazyWolf13/web-check", + "version": "1.0.0" + }, { "name": "monicahq/monica", "version": "v4.1.2" }, + { + "name": "hakimel/reveal.js", + "version": "5.1.0" + }, { "name": "thelounge/thelounge-deb", "version": "v4.4.3" }, + { + "name": "louislam/dockge", + "version": "1.4.2" + }, + { + "name": "hyperion-project/hyperion.ng", + "version": "2.0.16" + }, { "name": "wger-project/wger", "version": "2.2" @@ -551,12 +863,20 @@ "name": "deepch/RTSPtoWeb", "version": "v2.4.3" }, + { + "name": "Shinobi-Systems/Shinobi", + "version": "furrykitten-3" + }, + { + "name": "deluge-torrent/deluge", + "version": "deluge-2.1.2.dev0" + }, { "name": "searxng/searxng", "version": "v1.0.0" }, { - "name": "MediaBrowser/Emby", - "version": "3.5.2.0" + "name": "LazyLibrarian/LazyLibrarian", + "version": "1.7.2" } ] From 37d2cd84d83d78052debc22dae83d70f9de9f225 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:05:36 +0100 Subject: [PATCH 134/258] Update CHANGELOG.md (#3228) --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c99c2e3eb..ae476a48d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,12 +44,19 @@ All LXC instances created using this repository come pre-installed with Midnight ### 🌐 Website + - #### 🐞 Bug Fixes + + - Update Frontend Version Logic [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3223](https://github.com/community-scripts/ProxmoxVE/pull/3223)) + - #### ✨ New Features - Show Version Information on Frontend [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3216](https://github.com/community-scripts/ProxmoxVE/pull/3216)) - #### πŸ“ Script Information + - Heimdall Dashboard: Fix missing logo on website [@tremor021](https://github.com/tremor021) ([#3227](https://github.com/community-scripts/ProxmoxVE/pull/3227)) + - CrowdSec: Add debian only warning to website [@tremor021](https://github.com/tremor021) ([#3210](https://github.com/community-scripts/ProxmoxVE/pull/3210)) + - VictoriaMetrics: Fix Wrong Slug [@MickLesk](https://github.com/MickLesk) ([#3225](https://github.com/community-scripts/ProxmoxVE/pull/3225)) - Website: Lowercase Zitadel-Slug [@MickLesk](https://github.com/MickLesk) ([#3222](https://github.com/community-scripts/ProxmoxVE/pull/3222)) - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) From f031dcb34e570c1bf16c1469315c6d25c31e9410 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:15:48 +0100 Subject: [PATCH 135/258] Update pimox-haos-vm.json (#3233) --- frontend/public/json/pimox-haos-vm.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/pimox-haos-vm.json b/frontend/public/json/pimox-haos-vm.json index 2a90e5c75..02b8f31b6 100644 --- a/frontend/public/json/pimox-haos-vm.json +++ b/frontend/public/json/pimox-haos-vm.json @@ -11,7 +11,7 @@ "interface_port": 8123, "documentation": null, "website": "https://github.com/jiangcuo/Proxmox-Port", - "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/pimox.png?raw=true", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/home-assistant.svg", "description": "The script automates the manual process of finding, downloading and extracting the aarch64 (qcow2) disk image provided by the Home Assistant Team, creating a VM with user defined settings, importing and attaching the disk, setting the boot order and starting the VM.", "install_methods": [ { From a1e3ae6b5bf212e874f68d949760fb56ce4c4c57 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:16:29 +0100 Subject: [PATCH 136/258] Fix wikijs (#3232) --- ct/wikijs.sh | 67 ++++++++++++++++++++++++--------------- install/wikijs-install.sh | 21 ++++-------- 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/ct/wikijs.sh b/ct/wikijs.sh index 2d845e9d2..056381f90 100644 --- a/ct/wikijs.sh +++ b/ct/wikijs.sh @@ -27,35 +27,50 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Stopping ${APP}" - systemctl stop wikijs - msg_ok "Stopped ${APP}" + RELEASE=$(curl -s https://api.github.com/repos/Requarks/wiki/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Verifying whether ${APP}' new release is v3.x+ and current install uses SQLite." + SQLITE_INSTALL=$([ -f /opt/wikijs/db.sqlite ] && echo "true" || echo "false") + if [[ "${SQLITE_INSTALL}" == "true" && "${RELEASE}" =~ ^3.* ]]; then + echo "SQLite is not supported in v3.x+, currently there is no update path availble." + exit + fi + msg_ok "There is an update path available for ${APP} to v${RELEASE}" - msg_info "Backing up Data" - rm -rf ~/data-backup - mkdir -p ~/data-backup - [ -f /opt/wikijs/db.sqlite ] && cp /opt/wikijs/db.sqlite ~/data-backup - [ -f /opt/wikijs/config.yml ] && cp /opt/wikijs/config.yml ~/data-backup - [ -d /opt/wikijs/data ] && cp -R /opt/wikijs/data ~/data-backup - msg_ok "Backed up Data" + msg_info "Stopping ${APP}" + systemctl stop wikijs + msg_ok "Stopped ${APP}" - msg_info "Updating ${APP}" - rm -rf /opt/wikijs/* - cd /opt/wikijs - wget -q https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz - tar xzf wiki-js.tar.gz - msg_ok "Updated ${APP}" + msg_info "Backing up Data" + mkdir /opt/wikijs-backup + $SQLITE_INSTALL && cp /opt/wikijs/db.sqlite /opt/wikijs-backup + cp -R /opt/wikijs/{config.yml,/data} /opt/wikijs-backup + msg_ok "Backed up Data" - msg_info "Restoring Data" - cp -R ~/data-backup/* /opt/wikijs - rm -rf ~/data-backup - $STD npm rebuild sqlite3 - msg_ok "Restored Data" + msg_info "Updating ${APP}" + rm -rf /opt/wikijs/* + cd /opt/wikijs + wget -q "https://github.com/requarks/wiki/releases/download/v${RELEASE}/wiki-js.tar.gz" + tar -xzf wiki-js.tar.gz + msg_ok "Updated ${APP}" - msg_info "Starting ${APP}" - systemctl start wikijs - msg_ok "Started ${APP}" - msg_ok "Updated Successfully" + msg_info "Restoring Data" + cp -R /opt/wikijs-backup/* /opt/wikijs + $SQLITE_INSTALL && $STD npm rebuild sqlite3 + msg_ok "Restored Data" + + msg_info "Starting ${APP}" + systemctl start wikijs + msg_ok "Started ${APP}" + + msg_info "Cleaning Up" + rm -rf /opt/wikijs/wiki-js.tar.gz + rm -rf /opt/wikijs-backup + msg_ok "Cleanup Completed" + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" + fi exit } @@ -66,4 +81,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}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" \ No newline at end of file diff --git a/install/wikijs-install.sh b/install/wikijs-install.sh index 903e74309..2c9edbe2e 100644 --- a/install/wikijs-install.sh +++ b/install/wikijs-install.sh @@ -19,12 +19,7 @@ $STD apt-get install -y \ sudo \ mc \ git \ - ca-certificates \ - gnupg \ - build-essential \ - python3 \ - g++ \ - make + gpg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -67,16 +62,12 @@ msg_ok "Set up PostgreSQL" msg_info "Setup Wiki.js" temp_file=$(mktemp) RELEASE=$(curl -s https://api.github.com/repos/Requarks/wiki/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -wget -q "https://github.com/Requarks/wiki/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file" -tar -xzf "$temp_file" -mv wiki-${RELEASE} /opt/wikijs +wget -q "https://github.com/requarks/wiki/releases/download/v${RELEASE}/wiki-js.tar.gz" -O "$temp_file" +mkdir /opt/wikijs +tar -xzf "$temp_file" -C /opt/wikijs mv /opt/wikijs/config.sample.yml /opt/wikijs/config.yml sed -i -E 's|^( *user: ).*|\1'"$DB_USER"'|' /opt/wikijs/config.yml sed -i -E 's|^( *pass: ).*|\1'"$DB_PASS"'|' /opt/wikijs/config.yml -cd /opt/wikijs -export NODE_OPTIONS="--max-old-space-size=2048" -$STD yarn install --ignore-engines -$STD yarn build echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed Wiki.js" @@ -88,7 +79,7 @@ After=network.target [Service] Type=simple -ExecStart=/usr/bin/yarn start +ExecStart=/usr/bin/node server Restart=always User=root Environment=NODE_ENV=production @@ -107,4 +98,4 @@ msg_info "Cleaning up" rm -f "$temp_file" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" +msg_ok "Cleaned" \ No newline at end of file From ed511335bb363ebed3334e70b34c249eb16388a3 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:17:16 +0100 Subject: [PATCH 137/258] Update crawl-versions.yaml (#3235) --- .github/workflows/crawl-versions.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crawl-versions.yaml b/.github/workflows/crawl-versions.yaml index 72bac6e6b..b908d1f4d 100644 --- a/.github/workflows/crawl-versions.yaml +++ b/.github/workflows/crawl-versions.yaml @@ -11,7 +11,7 @@ permissions: pull-requests: write jobs: - move-to-main-repo: + crawl-versions: runs-on: runner-cluster-htl-set steps: From 7a599c67594fad8a1f904f0cfdde60a9b97b93f0 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:18:36 +0100 Subject: [PATCH 138/258] Update versions.json (#3236) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 128 +++++++++++++++++++++++------ 1 file changed, 104 insertions(+), 24 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index df421d305..d37bf89d4 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -75,6 +75,10 @@ "name": "TriliumNext/Notes", "version": "v0.92.4" }, + { + "name": "HabitRPG/habitica", + "version": "v5.34.3" + }, { "name": "n8n-io/n8n", "version": "n8n@1.84.0" @@ -163,6 +167,14 @@ "name": "VictoriaMetrics/VictoriaMetrics", "version": "v1.17.0-victorialogs" }, + { + "name": "pelican-dev/wings", + "version": "v1.0.0-beta10" + }, + { + "name": "pelican-dev/panel", + "version": "v1.0.0-beta18" + }, { "name": "bunkerity/bunkerweb", "version": "v1.6.1" @@ -179,6 +191,10 @@ "name": "duplicati/duplicati", "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15" }, + { + "name": "theonedev/onedev", + "version": "vv11.7.5" + }, { "name": "henrygd/beszel", "version": "v0.10.2" @@ -215,6 +231,14 @@ "name": "homarr-labs/homarr", "version": "v1.11.0" }, + { + "name": "FlowiseAI/Flowise", + "version": "flowise@2.2.7-patch.1" + }, + { + "name": "jupyter/notebook", + "version": "v7.3.3" + }, { "name": "home-assistant/core", "version": "2025.3.3" @@ -227,6 +251,10 @@ "name": "FreshRSS/FreshRSS", "version": "1.26.1" }, + { + "name": "dotnetfactory/fluid-calendar", + "version": "v1.2.1" + }, { "name": "kimai/kimai", "version": "2.31.0" @@ -235,6 +263,10 @@ "name": "usememos/memos", "version": "v0.24.1" }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.4" + }, { "name": "moghtech/komodo", "version": "v1.17.0-dev-7" @@ -247,6 +279,10 @@ "name": "diced/zipline", "version": "v4.0.1" }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.501" + }, { "name": "minio/minio", "version": "RELEASE.2025-03-12T18-04-18Z" @@ -267,6 +303,10 @@ "name": "transmission/transmission", "version": "4.1.0-beta.2" }, + { + "name": "emqx/emqx", + "version": "e5.9.0-beta.1" + }, { "name": "gotson/komga", "version": "1.21.2" @@ -279,6 +319,10 @@ "name": "benjaminjonard/koillection", "version": "1.6.12" }, + { + "name": "OctoPrint/OctoPrint", + "version": "1.11.0rc4" + }, { "name": "excalidraw/excalidraw", "version": "v0.18.0" @@ -295,6 +339,10 @@ "name": "mylar3/mylar3", "version": "v0.8.2" }, + { + "name": "stackblitz-labs/bolt.diy", + "version": "v0.0.7-hf1" + }, { "name": "stonith404/pingvin-share", "version": "v1.10.3" @@ -307,6 +355,10 @@ "name": "Luligu/matterbridge", "version": "2.2.4" }, + { + "name": "icereed/paperless-gpt", + "version": "v0.13.0" + }, { "name": "AlexxIT/go2rtc", "version": "v1.9.9" @@ -315,6 +367,10 @@ "name": "clusterzx/paperless-ai", "version": "v2.7.4" }, + { + "name": "caddyserver/caddy", + "version": "v2.10.0-beta.2" + }, { "name": "awawa-dev/HyperHDR", "version": "v21.0.0.0" @@ -359,6 +415,10 @@ "name": "ellite/Wallos", "version": "v2.46.1" }, + { + "name": "eclipse-mosquitto/mosquitto", + "version": "v2.0.21" + }, { "name": "Dolibarr/dolibarr", "version": "21.0.0" @@ -407,6 +467,10 @@ "name": "sysadminsmedia/homebox", "version": "v0.18.0" }, + { + "name": "actualbudget/actual", + "version": "v25.3.1" + }, { "name": "Koenkk/zigbee2mqtt", "version": "2.1.3" @@ -435,6 +499,10 @@ "name": "jhuckaby/Cronicle", "version": "v0.9.76" }, + { + "name": "jordan-dalby/ByteStash", + "version": "v1.5.7" + }, { "name": "docmost/docmost", "version": "v0.8.4" @@ -443,6 +511,10 @@ "name": "cloudflare/cloudflared", "version": "2025.2.1" }, + { + "name": "rabbitmq/rabbitmq-server", + "version": "v4.0.7" + }, { "name": "cross-seed/cross-seed", "version": "v6.11.2" @@ -467,6 +539,10 @@ "name": "benzino77/tasmocompiler", "version": "v12.5.0" }, + { + "name": "ZoeyVid/NPMplus", + "version": "2025-02-25-r1" + }, { "name": "traefik/traefik", "version": "v3.3.4" @@ -519,10 +595,6 @@ "name": "wavelog/wavelog", "version": "2.0.1" }, - { - "name": "wavelog/wavelog", - "version": "2.0.1" - }, { "name": "sabnzbd/sabnzbd", "version": "4.4.1" @@ -543,6 +615,10 @@ "name": "leiweibau/Pi.Alert", "version": "v2025-02-16" }, + { + "name": "typesense/typesense", + "version": "v28.0" + }, { "name": "qbittorrent/qBittorrent", "version": "release-5.0.4" @@ -579,6 +655,10 @@ "name": "glpi-project/glpi", "version": "10.0.18" }, + { + "name": "WordPress/WordPress", + "version": "6.7.2" + }, { "name": "homebridge/homebridge", "version": "v1.9.0" @@ -595,6 +675,10 @@ "name": "blakeblackshear/frigate", "version": "v0.15.0" }, + { + "name": "forgejo/forgejo", + "version": "v10.0.1" + }, { "name": "bluenviron/mediamtx", "version": "v1.11.3" @@ -647,6 +731,10 @@ "name": "hansmi/prometheus-paperless-exporter", "version": "v0.0.6" }, + { + "name": "crafty-controller/crafty-4", + "version": "v4.4.7" + }, { "name": "owncast/owncast", "version": "v0.2.1" @@ -723,6 +811,10 @@ "name": "pymedusa/Medusa", "version": "v1.0.22" }, + { + "name": "MDeLuise/plant-it", + "version": "0.10.0" + }, { "name": "phpipam/phpipam", "version": "v1.7.3" @@ -763,6 +855,10 @@ "name": "zerotier/ZeroTierOne", "version": "1.14.2" }, + { + "name": "CorentinTh/it-tools", + "version": "v2024.10.22-7ca5933" + }, { "name": "aceberg/WatchYourLAN", "version": "2.0.4" @@ -799,10 +895,6 @@ "name": "hywax/mafl", "version": "v0.15.4" }, - { - "name": "hywax/mafl", - "version": "v0.15.4" - }, { "name": "FlareSolverr/FlareSolverr", "version": "v3.3.21" @@ -827,6 +919,10 @@ "name": "gnmyt/myspeed", "version": "v1.0.9" }, + { + "name": "binwiederhier/ntfy", + "version": "v2.11.0" + }, { "name": "CrazyWolf13/web-check", "version": "1.0.0" @@ -862,21 +958,5 @@ { "name": "deepch/RTSPtoWeb", "version": "v2.4.3" - }, - { - "name": "Shinobi-Systems/Shinobi", - "version": "furrykitten-3" - }, - { - "name": "deluge-torrent/deluge", - "version": "deluge-2.1.2.dev0" - }, - { - "name": "searxng/searxng", - "version": "v1.0.0" - }, - { - "name": "LazyLibrarian/LazyLibrarian", - "version": "1.7.2" } ] From 84314249b23e50185f108940725ad048a0066bba Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:18:59 +0100 Subject: [PATCH 139/258] Update CHANGELOG.md (#3234) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae476a48d..13c901610 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Wikijs: Remove Dev Message & Performance-Boost [@bvdberg01](https://github.com/bvdberg01) ([#3232](https://github.com/community-scripts/ProxmoxVE/pull/3232)) - Fix openwebui update script when backup directory already exists [@chrisdoc](https://github.com/chrisdoc) ([#3213](https://github.com/community-scripts/ProxmoxVE/pull/3213)) - #### πŸ’₯ Breaking Changes @@ -54,6 +55,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - Update Pimox Logo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3233](https://github.com/community-scripts/ProxmoxVE/pull/3233)) - Heimdall Dashboard: Fix missing logo on website [@tremor021](https://github.com/tremor021) ([#3227](https://github.com/community-scripts/ProxmoxVE/pull/3227)) - CrowdSec: Add debian only warning to website [@tremor021](https://github.com/tremor021) ([#3210](https://github.com/community-scripts/ProxmoxVE/pull/3210)) - VictoriaMetrics: Fix Wrong Slug [@MickLesk](https://github.com/MickLesk) ([#3225](https://github.com/community-scripts/ProxmoxVE/pull/3225)) From 4e36061ced77e691a39eff70395db2b90b6ceea7 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:19:11 +0100 Subject: [PATCH 140/258] Add Latest Change Date to Frontend (#3231) * Updated Logic for Versions * Update logic, add date --- .github/workflows/crawl-versions.yaml | 5 +++-- frontend/src/app/api/versions/route.ts | 5 ++--- .../app/scripts/_components/ScriptItem.tsx | 21 ++++++++++++++++++- frontend/src/lib/types.ts | 1 + 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.github/workflows/crawl-versions.yaml b/.github/workflows/crawl-versions.yaml index b908d1f4d..0c25c839d 100644 --- a/.github/workflows/crawl-versions.yaml +++ b/.github/workflows/crawl-versions.yaml @@ -63,9 +63,10 @@ jobs: jq -r '.projects[] | "\(.id) \(.name)"' "$projects_file" | while read -r id name; do version=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects/$id/latest-release") version_data=$(echo "$version" | jq -r '.version // empty') + date=$(echo "$version" | jq -r '.date // empty') if [ -n "$version_data" ]; then - jq --arg name "$name" --arg version "$version_data" \ - '. += [{"name": $name, "version": $version}]' "$output_file" > "$output_file.tmp" && mv "$output_file.tmp" "$output_file" + jq --arg name "$name" --arg version "$version_data" --arg date "$date" \ + '. += [{"name": $name, "version": $version, "date": $date}]' "$output_file" > "$output_file.tmp" && mv "$output_file.tmp" "$output_file" fi done ((page++)) diff --git a/frontend/src/app/api/versions/route.ts b/frontend/src/app/api/versions/route.ts index 6adfd7fd6..db891600f 100644 --- a/frontend/src/app/api/versions/route.ts +++ b/frontend/src/app/api/versions/route.ts @@ -17,9 +17,8 @@ const getVersions = async () => { const versions: AppVersion[] = JSON.parse(fileContent); const modifiedVersions = versions.map(version => { - const nameParts = version.name.split('/'); - let newName = nameParts[nameParts.length - 1]; - newName = newName.toLowerCase().replace(/[^a-z0-9]/g, ''); + let newName = version.name; + newName = newName.toLowerCase().replace(/[^a-z0-9/]/g, ''); return { ...version, name: newName }; }); diff --git a/frontend/src/app/scripts/_components/ScriptItem.tsx b/frontend/src/app/scripts/_components/ScriptItem.tsx index 7199b808d..8d3a50039 100644 --- a/frontend/src/app/scripts/_components/ScriptItem.tsx +++ b/frontend/src/app/scripts/_components/ScriptItem.tsx @@ -95,7 +95,26 @@ function ScriptItem({
{versions.length === 0 ? (

Loading versions...

) : (<>

Version:

-

{versions.find((v) => v.name === item.slug.replace(/[^a-z0-9]/g, ''))?.version || "No Version Information found"}

+

{versions.find((v) => + v.name === item.slug.replace(/[^a-z0-9]/g, '') || + v.name.includes(item.slug.replace(/[^a-z0-9]/g, '')) || + v.name.replace(/[^a-z0-9]/g, '') === item.slug.replace(/[^a-z0-9]/g, '') + + )?.version || "No Version information found" + }

+

Latest changes:

+

+ {(() => { + const matchedVersion = versions.find((v) => + v.name === item.slug.replace(/[^a-z0-9]/g, '') || + v.name.includes(item.slug.replace(/[^a-z0-9]/g, '')) || + v.name.replace(/[^a-z0-9]/g, '') === item.slug.replace(/[^a-z0-9]/g, '') + ); + return matchedVersion?.date ? + extractDate(matchedVersion.date as unknown as string) : + "No date information found" + })()} +

) }
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 643b3a3d9..f1fea85d7 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -60,4 +60,5 @@ export interface OperatingSystem { export interface AppVersion { name: string; version: string; + date: Date; } \ No newline at end of file From f5491cb7609b58476b3cb451f3504c4fac1a90dc Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:45:09 +0100 Subject: [PATCH 141/258] Update CHANGELOG.md (#3237) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13c901610..bb6098cc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,17 +51,18 @@ All LXC instances created using this repository come pre-installed with Midnight - #### ✨ New Features + - Add Latest Change Date to Frontend [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3231](https://github.com/community-scripts/ProxmoxVE/pull/3231)) - Show Version Information on Frontend [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3216](https://github.com/community-scripts/ProxmoxVE/pull/3216)) - #### πŸ“ Script Information + - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) + - Website: Lowercase Zitadel-Slug [@MickLesk](https://github.com/MickLesk) ([#3222](https://github.com/community-scripts/ProxmoxVE/pull/3222)) + - VictoriaMetrics: Fix Wrong Slug [@MickLesk](https://github.com/MickLesk) ([#3225](https://github.com/community-scripts/ProxmoxVE/pull/3225)) - Update Pimox Logo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3233](https://github.com/community-scripts/ProxmoxVE/pull/3233)) - Heimdall Dashboard: Fix missing logo on website [@tremor021](https://github.com/tremor021) ([#3227](https://github.com/community-scripts/ProxmoxVE/pull/3227)) - CrowdSec: Add debian only warning to website [@tremor021](https://github.com/tremor021) ([#3210](https://github.com/community-scripts/ProxmoxVE/pull/3210)) - - VictoriaMetrics: Fix Wrong Slug [@MickLesk](https://github.com/MickLesk) ([#3225](https://github.com/community-scripts/ProxmoxVE/pull/3225)) - - Website: Lowercase Zitadel-Slug [@MickLesk](https://github.com/MickLesk) ([#3222](https://github.com/community-scripts/ProxmoxVE/pull/3222)) - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) - - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) From aa369a13bf1fc5bdc29be59cb400bf7f00992b46 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:03:18 +0100 Subject: [PATCH 142/258] Update versions.json (#3239) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 720 +++++++++++++++++++---------- 1 file changed, 480 insertions(+), 240 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index d37bf89d4..f1f9b5d8e 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,962 +1,1202 @@ [ { "name": "crowdsecurity/crowdsec", - "version": "v1.6.6" + "version": "v1.6.6", + "date": "2025-03-18T13:05:01Z" }, { "name": "openobserve/openobserve", - "version": "v0.14.5-rc4" + "version": "v0.14.5-rc4", + "date": "2025-03-18T12:51:31Z" }, { "name": "Radarr/Radarr", - "version": "v5.20.2.9777" + "version": "v5.20.2.9777", + "date": "2025-03-18T12:11:37Z" }, { "name": "apache/couchdb", - "version": "3.4.3.post1" + "version": "3.4.3.post1", + "date": "2025-03-18T09:44:59Z" }, { "name": "zitadel/zitadel", - "version": "v2.70.5" + "version": "v2.70.5", + "date": "2025-03-18T08:08:16Z" }, { "name": "nzbgetcom/nzbget", - "version": "testing" + "version": "testing", + "date": "2025-03-18T08:06:43Z" }, { "name": "Checkmk/checkmk", - "version": "v2.4.0b1" + "version": "v2.4.0b1", + "date": "2025-03-18T08:03:25Z" }, { "name": "Jackett/Jackett", - "version": "v0.22.1660" + "version": "v0.22.1660", + "date": "2025-03-18T06:10:42Z" }, { "name": "authelia/authelia", - "version": "v4.39.1" + "version": "v4.39.1", + "date": "2025-03-18T03:57:41Z" }, { "name": "ollama/ollama", - "version": "v0.6.1" + "version": "v0.6.1", + "date": "2025-03-14T15:57:59Z" }, { "name": "StarFleetCPTN/GoMFT", - "version": "v0.1.15" + "version": "v0.1.15", + "date": "2025-03-18T02:30:29Z" }, { "name": "advplyr/audiobookshelf", - "version": "v2.20.0" + "version": "v2.20.0", + "date": "2025-03-17T22:44:56Z" }, { "name": "bastienwirtz/homer", - "version": "v25.03.3" + "version": "v25.03.3", + "date": "2025-03-17T20:55:37Z" }, { "name": "keycloak/keycloak", - "version": "26.1.4" + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "semaphoreui/semaphore", - "version": "v2.13.0" + "version": "v2.13.0", + "date": "2025-03-17T19:39:10Z" }, { "name": "Kareadita/Kavita", - "version": "v0.8.5.11" + "version": "v0.8.5.11", + "date": "2025-03-17T19:25:25Z" }, { "name": "goauthentik/authentik", - "version": "version/2025.2.2" + "version": "version/2025.2.2", + "date": "2025-03-17T19:16:49Z" }, { "name": "Sonarr/Sonarr", - "version": "v4.0.14.2939" + "version": "v4.0.14.2939", + "date": "2025-03-17T19:12:37Z" }, { "name": "TriliumNext/Notes", - "version": "v0.92.4" + "version": "v0.92.4", + "date": "2025-03-17T16:00:19Z" }, { "name": "HabitRPG/habitica", - "version": "v5.34.3" + "version": "v5.34.3", + "date": "2025-03-17T14:20:04Z" }, { "name": "n8n-io/n8n", - "version": "n8n@1.84.0" + "version": "n8n@1.84.0", + "date": "2025-03-17T13:58:36Z" }, { "name": "Graylog2/graylog2-server", - "version": "6.2.0-beta.1" + "version": "6.2.0-beta.1", + "date": "2025-03-17T13:00:39Z" }, { "name": "home-assistant/operating-system", - "version": "15.0" + "version": "15.0", + "date": "2025-03-17T10:26:18Z" }, { "name": "morpheus65535/bazarr", - "version": "v1.5.1" + "version": "v1.5.1", + "date": "2025-01-01T16:15:52Z" }, { "name": "webmin/webmin", - "version": "2.303" + "version": "2.303", + "date": "2025-03-17T04:54:50Z" }, { "name": "fallenbagel/jellyseerr", - "version": "v2.5.1" + "version": "v2.5.1", + "date": "2025-03-17T03:18:32Z" }, { "name": "firefly-iii/firefly-iii", - "version": "develop-20250222.4" + "version": "develop-20250222.4", + "date": "2025-02-22T16:26:15Z" }, { "name": "glanceapp/glance", - "version": "v0.7.7" + "version": "v0.7.7", + "date": "2025-03-17T02:24:06Z" }, { "name": "gethomepage/homepage", - "version": "v1.0.4" + "version": "v1.0.4", + "date": "2025-03-16T22:19:31Z" }, { "name": "Donkie/Spoolman", - "version": "v0.22.0" + "version": "v0.22.0", + "date": "2025-03-16T21:14:52Z" }, { "name": "autobrr/autobrr", - "version": "v1.60.0" + "version": "v1.60.0", + "date": "2025-03-16T18:39:49Z" }, { "name": "pocket-id/pocket-id", - "version": "v0.40.1" + "version": "v0.40.1", + "date": "2025-03-16T17:02:54Z" }, { "name": "evcc-io/evcc", - "version": "0.201.0" + "version": "0.201.0", + "date": "2025-03-16T16:59:18Z" }, { "name": "BookStackApp/BookStack", - "version": "v25.02.1" + "version": "v25.02.1", + "date": "2025-03-16T12:51:00Z" }, { "name": "hoarder-app/hoarder", - "version": "ios/v1.6.9-0" + "version": "ios/v1.6.9-0", + "date": "2025-03-16T12:48:20Z" }, { "name": "YunoHost/yunohost", - "version": "debian/12.0.12" + "version": "debian/12.0.12", + "date": "2025-03-16T11:59:24Z" }, { "name": "Prowlarr/Prowlarr", - "version": "v1.32.2.4987" + "version": "v1.32.2.4987", + "date": "2025-03-16T09:41:37Z" }, { "name": "pocketbase/pocketbase", - "version": "v0.26.1" + "version": "v0.26.1", + "date": "2025-03-16T08:51:41Z" }, { "name": "redis/redis", - "version": "8.0-m04" + "version": "8.0-m04", + "date": "2025-03-16T08:12:40Z" }, { "name": "esphome/esphome", - "version": "2025.3.0b3" + "version": "2025.3.0b3", + "date": "2025-03-16T06:53:58Z" }, { "name": "Kozea/Radicale", - "version": "v3.5.0" + "version": "v3.5.0", + "date": "2025-03-16T06:05:55Z" }, { "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.17.0-victorialogs" + "version": "v1.17.0-victorialogs", + "date": "2025-03-16T00:22:43Z" }, { "name": "pelican-dev/wings", - "version": "v1.0.0-beta10" + "version": "v1.0.0-beta10", + "date": "2025-03-15T20:24:34Z" }, { "name": "pelican-dev/panel", - "version": "v1.0.0-beta18" + "version": "v1.0.0-beta18", + "date": "2025-03-15T20:24:04Z" }, { "name": "bunkerity/bunkerweb", - "version": "v1.6.1" + "version": "v1.6.1", + "date": "2025-03-15T17:29:17Z" }, { "name": "runtipi/runtipi", - "version": "v3.10.0" + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" }, { "name": "msgbyte/tianji", - "version": "v1.18.22" + "version": "v1.18.22", + "date": "2025-03-15T13:36:57Z" }, { "name": "duplicati/duplicati", - "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15" + "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15", + "date": "2025-03-15T11:06:44Z" }, { "name": "theonedev/onedev", - "version": "vv11.7.5" + "version": "vv11.7.5", + "date": "2025-03-15T09:53:15Z" }, { "name": "henrygd/beszel", - "version": "v0.10.2" + "version": "v0.10.2", + "date": "2025-03-15T07:14:54Z" }, { "name": "navidrome/navidrome", - "version": "v0.55.1" + "version": "v0.55.1", + "date": "2025-03-15T05:36:06Z" }, { "name": "coder/code-server", - "version": "v4.98.2" + "version": "v4.98.2", + "date": "2025-03-15T02:11:28Z" }, { "name": "Threadfin/Threadfin", - "version": "1.2.31" + "version": "1.2.31", + "date": "2025-03-14T22:04:10Z" }, { "name": "Stirling-Tools/Stirling-PDF", - "version": "v0.44.2" + "version": "v0.44.2", + "date": "2025-03-14T21:01:11Z" }, { "name": "ipfs/kubo", - "version": "v0.33.2" + "version": "v0.33.2", + "date": "2025-02-14T00:24:56Z" }, { "name": "paperless-ngx/paperless-ngx", - "version": "v2.15.0-beta" + "version": "v2.15.0-beta", + "date": "2025-03-14T18:05:28Z" }, { "name": "wazuh/wazuh", - "version": "coverity-w11-4.12.0" + "version": "coverity-w11-4.12.0", + "date": "2025-03-14T20:04:02Z" }, { "name": "homarr-labs/homarr", - "version": "v1.11.0" + "version": "v1.11.0", + "date": "2025-03-14T19:14:52Z" }, { "name": "FlowiseAI/Flowise", - "version": "flowise@2.2.7-patch.1" + "version": "flowise@2.2.7-patch.1", + "date": "2025-03-14T14:53:53Z" }, { "name": "jupyter/notebook", - "version": "v7.3.3" + "version": "v7.3.3", + "date": "2025-03-14T13:41:04Z" }, { "name": "home-assistant/core", - "version": "2025.3.3" + "version": "2025.3.3", + "date": "2025-03-14T11:58:45Z" }, { "name": "docker/compose", - "version": "v2.34.0" + "version": "v2.34.0", + "date": "2025-03-14T09:11:17Z" }, { "name": "FreshRSS/FreshRSS", - "version": "1.26.1" + "version": "1.26.1", + "date": "2025-03-13T21:34:25Z" }, { "name": "dotnetfactory/fluid-calendar", - "version": "v1.2.1" + "version": "v1.2.1", + "date": "2025-03-13T19:11:35Z" }, { "name": "kimai/kimai", - "version": "2.31.0" + "version": "2.31.0", + "date": "2025-03-13T17:13:47Z" }, { "name": "usememos/memos", - "version": "v0.24.1" + "version": "v0.24.1", + "date": "2025-03-13T14:08:30Z" }, { "name": "dgtlmoon/changedetection.io", - "version": "0.49.4" + "version": "0.49.4", + "date": "2025-03-13T11:08:16Z" }, { "name": "moghtech/komodo", - "version": "v1.17.0-dev-7" + "version": "v1.17.0-dev-7", + "date": "2025-03-13T05:03:04Z" }, { "name": "NodeBB/NodeBB", - "version": "v4.1.1" + "version": "v4.1.1", + "date": "2025-03-12T23:10:23Z" }, { "name": "diced/zipline", - "version": "v4.0.1" + "version": "v4.0.1", + "date": "2025-03-12T22:41:17Z" }, { "name": "jenkinsci/jenkins", - "version": "jenkins-2.501" + "version": "jenkins-2.501", + "date": "2025-03-12T21:47:58Z" }, { "name": "minio/minio", - "version": "RELEASE.2025-03-12T18-04-18Z" + "version": "RELEASE.2025-03-12T18-04-18Z", + "date": "2025-03-12T18:45:21Z" }, { "name": "zwave-js/zwave-js-ui", - "version": "v9.33.0" + "version": "v9.33.0", + "date": "2025-03-12T16:29:52Z" }, { "name": "cockpit-project/cockpit", - "version": "335" + "version": "335", + "date": "2025-03-12T13:03:27Z" }, { "name": "syncthing/syncthing", - "version": "v1.29.3" + "version": "v1.29.3", + "date": "2025-03-12T11:56:30Z" }, { "name": "transmission/transmission", - "version": "4.1.0-beta.2" + "version": "4.1.0-beta.2", + "date": "2025-03-12T11:01:28Z" }, { "name": "emqx/emqx", - "version": "e5.9.0-beta.1" + "version": "e5.9.0-beta.1", + "date": "2025-03-12T09:52:26Z" }, { "name": "gotson/komga", - "version": "1.21.2" + "version": "1.21.2", + "date": "2025-03-12T04:19:30Z" }, { "name": "element-hq/synapse", - "version": "v1.126.0" + "version": "v1.126.0", + "date": "2025-03-11T16:29:42Z" }, { "name": "benjaminjonard/koillection", - "version": "1.6.12" + "version": "1.6.12", + "date": "2025-03-11T15:04:43Z" }, { "name": "OctoPrint/OctoPrint", - "version": "1.11.0rc4" + "version": "1.11.0rc4", + "date": "2025-03-11T13:37:12Z" }, { "name": "excalidraw/excalidraw", - "version": "v0.18.0" + "version": "v0.18.0", + "date": "2025-03-11T12:47:22Z" }, { "name": "neo4j/neo4j", - "version": "5.26.4" + "version": "5.26.4", + "date": "2025-03-11T10:52:05Z" }, { "name": "Ombi-app/Ombi", - "version": "v4.47.1" + "version": "v4.47.1", + "date": "2025-01-05T21:14:23Z" }, { "name": "mylar3/mylar3", - "version": "v0.8.2" + "version": "v0.8.2", + "date": "2025-03-11T05:20:22Z" }, { "name": "stackblitz-labs/bolt.diy", - "version": "v0.0.7-hf1" + "version": "v0.0.7-hf1", + "date": "2025-03-10T20:49:39Z" }, { "name": "stonith404/pingvin-share", - "version": "v1.10.3" + "version": "v1.10.3", + "date": "2025-03-10T20:36:59Z" }, { "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.57" + "version": "v0.107.57", + "date": "2025-02-20T14:58:55Z" }, { "name": "Luligu/matterbridge", - "version": "2.2.4" + "version": "2.2.4", + "date": "2025-03-10T10:40:00Z" }, { "name": "icereed/paperless-gpt", - "version": "v0.13.0" + "version": "v0.13.0", + "date": "2025-03-10T10:03:12Z" }, { "name": "AlexxIT/go2rtc", - "version": "v1.9.9" + "version": "v1.9.9", + "date": "2025-03-10T03:22:11Z" }, { "name": "clusterzx/paperless-ai", - "version": "v2.7.4" + "version": "v2.7.4", + "date": "2025-03-09T19:03:53Z" }, { "name": "caddyserver/caddy", - "version": "v2.10.0-beta.2" + "version": "v2.10.0-beta.2", + "date": "2025-03-09T13:51:09Z" }, { "name": "awawa-dev/HyperHDR", - "version": "v21.0.0.0" + "version": "v21.0.0.0", + "date": "2025-03-09T12:25:44Z" }, { "name": "Lidarr/Lidarr", - "version": "v2.10.1.4589" + "version": "v2.10.1.4589", + "date": "2025-03-09T09:51:41Z" }, { "name": "Readarr/Readarr", - "version": "v0.4.12.2753" + "version": "v0.4.12.2753", + "date": "2025-03-09T09:50:51Z" }, { "name": "Brandawg93/PeaNUT", - "version": "v5.6.0" + "version": "v5.6.0", + "date": "2025-03-08T19:02:31Z" }, { "name": "YuukanOO/seelf", - "version": "v2.4.2" + "version": "v2.4.2", + "date": "2025-03-08T10:49:04Z" }, { "name": "umami-software/umami", - "version": "v2.17.0" + "version": "v2.17.0", + "date": "2025-03-08T06:08:04Z" }, { "name": "documenso/documenso", - "version": "v1.9.1-rc.9" + "version": "v1.9.1-rc.9", + "date": "2025-03-07T23:28:53Z" }, { "name": "rogerfar/rdt-client", - "version": "v2.0.102" + "version": "v2.0.102", + "date": "2025-03-07T20:48:46Z" }, { "name": "prometheus/alertmanager", - "version": "v0.28.1" + "version": "v0.28.1", + "date": "2025-03-07T15:41:35Z" }, { "name": "hargata/lubelog", - "version": "v1.4.5" + "version": "v1.4.5", + "date": "2025-03-06T19:43:48Z" }, { "name": "ellite/Wallos", - "version": "v2.46.1" + "version": "v2.46.1", + "date": "2025-03-06T16:29:30Z" }, { "name": "eclipse-mosquitto/mosquitto", - "version": "v2.0.21" + "version": "v2.0.21", + "date": "2025-03-06T16:24:56Z" }, { "name": "Dolibarr/dolibarr", - "version": "21.0.0" + "version": "21.0.0", + "date": "2025-03-06T16:20:45Z" }, { "name": "netbox-community/netbox", - "version": "v4.2.5" + "version": "v4.2.5", + "date": "2025-03-06T15:11:52Z" }, { "name": "open-webui/open-webui", - "version": "v0.5.20" + "version": "v0.5.20", + "date": "2025-03-06T03:44:57Z" }, { "name": "matze/wastebin", - "version": "3.0.0" + "version": "3.0.0", + "date": "2025-03-05T21:41:29Z" }, { "name": "immich-app/immich", - "version": "v1.129.0" + "version": "v1.129.0", + "date": "2025-03-05T20:19:18Z" }, { "name": "snipe/snipe-it", - "version": "v8.0.4" + "version": "v8.0.4", + "date": "2025-03-05T17:12:03Z" }, { "name": "toniebox-reverse-engineering/teddycloud", - "version": "tc_v0.6.4" + "version": "tc_v0.6.4", + "date": "2025-03-05T15:43:40Z" }, { "name": "go-gitea/gitea", - "version": "v1.23.5" + "version": "v1.23.5", + "date": "2025-03-05T00:10:15Z" }, { "name": "apache/tomcat", - "version": "10.1.39" + "version": "10.1.39", + "date": "2025-03-04T19:05:18Z" }, { "name": "tailscale/tailscale", - "version": "v1.80.3" + "version": "v1.80.3", + "date": "2025-03-04T18:47:25Z" }, { "name": "pi-hole/pi-hole", - "version": "v6.0.5" + "version": "v6.0.5", + "date": "2025-03-04T17:28:41Z" }, { "name": "sysadminsmedia/homebox", - "version": "v0.18.0" + "version": "v0.18.0", + "date": "2025-03-04T15:35:27Z" }, { "name": "actualbudget/actual", - "version": "v25.3.1" + "version": "v25.3.1", + "date": "2025-03-03T02:05:36Z" }, { "name": "Koenkk/zigbee2mqtt", - "version": "2.1.3" + "version": "2.1.3", + "date": "2025-03-02T07:47:30Z" }, { "name": "heiher/hev-socks5-server", - "version": "2.8.0" + "version": "2.8.0", + "date": "2025-03-02T04:30:50Z" }, { "name": "inspircd/inspircd", - "version": "v4.6.0" + "version": "v4.6.0", + "date": "2025-03-01T10:29:31Z" }, { "name": "tobychui/zoraxy", - "version": "v3.1.9" + "version": "v3.1.9", + "date": "2025-03-01T02:24:33Z" }, { "name": "grocy/grocy", - "version": "v4.4.2" + "version": "v4.4.2", + "date": "2025-02-28T16:26:05Z" }, { "name": "photoprism/photoprism", - "version": "250228-43447fa38" + "version": "250228-43447fa38", + "date": "2025-02-28T15:18:09Z" }, { "name": "jhuckaby/Cronicle", - "version": "v0.9.76" + "version": "v0.9.76", + "date": "2025-02-28T03:15:18Z" }, { "name": "jordan-dalby/ByteStash", - "version": "v1.5.7" + "version": "v1.5.7", + "date": "2025-02-27T20:04:08Z" }, { "name": "docmost/docmost", - "version": "v0.8.4" + "version": "v0.8.4", + "date": "2025-02-27T16:18:45Z" }, { "name": "cloudflare/cloudflared", - "version": "2025.2.1" + "version": "2025.2.1", + "date": "2025-02-27T11:36:11Z" }, { "name": "rabbitmq/rabbitmq-server", - "version": "v4.0.7" + "version": "v4.0.7", + "date": "2025-02-26T19:07:11Z" }, { "name": "cross-seed/cross-seed", - "version": "v6.11.2" + "version": "v6.11.2", + "date": "2025-02-26T14:54:49Z" }, { "name": "Part-DB/Part-DB-server", - "version": "v1.16.1" + "version": "v1.16.1", + "date": "2025-02-26T11:29:15Z" }, { "name": "prometheus/prometheus", - "version": "v3.2.1" + "version": "v3.2.1", + "date": "2025-02-26T09:55:45Z" }, { "name": "silverbulletmd/silverbullet", - "version": "0.10.4" + "version": "0.10.4", + "date": "2025-02-25T18:13:42Z" }, { "name": "juanfont/headscale", - "version": "v0.25.1" + "version": "v0.25.1", + "date": "2025-02-25T17:30:48Z" }, { "name": "benzino77/tasmocompiler", - "version": "v12.5.0" + "version": "v12.5.0", + "date": "2025-02-25T14:55:50Z" }, { "name": "ZoeyVid/NPMplus", - "version": "2025-02-25-r1" + "version": "2025-02-25-r1", + "date": "2025-02-25T13:26:41Z" }, { "name": "traefik/traefik", - "version": "v3.3.4" + "version": "v3.3.4", + "date": "2025-02-25T10:18:58Z" }, { "name": "zabbix/zabbix", - "version": "7.2.4" + "version": "7.2.4", + "date": "2025-02-25T09:35:54Z" }, { "name": "schlagmichdoch/PairDrop", - "version": "v1.11.2" + "version": "v1.11.2", + "date": "2025-02-24T19:47:06Z" }, { "name": "drakkan/sftpgo", - "version": "v2.6.6" + "version": "v2.6.6", + "date": "2025-02-24T19:14:46Z" }, { "name": "ioBroker/ioBroker", - "version": "2025-02-23" + "version": "2025-02-23", + "date": "2025-02-24T16:05:06Z" }, { "name": "ventoy/Ventoy", - "version": "v1.1.05" + "version": "v1.1.05", + "date": "2025-02-24T11:53:12Z" }, { "name": "Athou/commafeed", - "version": "5.6.1" + "version": "5.6.1", + "date": "2025-02-23T20:39:48Z" }, { "name": "openhab/openhab-core", - "version": "5.0.0.M1" + "version": "5.0.0.M1", + "date": "2025-02-23T14:55:36Z" }, { "name": "outline/outline", - "version": "v0.82.1-15" + "version": "v0.82.1-15", + "date": "2025-02-23T14:38:09Z" }, { "name": "TechnitiumSoftware/DnsServer", - "version": "v13.4.3" + "version": "v13.4.3", + "date": "2025-02-23T11:08:26Z" }, { "name": "OliveTin/OliveTin", - "version": "2025.2.21" + "version": "2025.2.21", + "date": "2025-02-21T23:09:34Z" }, { "name": "azukaar/Cosmos-Server", - "version": "v0.18.3" + "version": "v0.18.3", + "date": "2025-02-21T20:51:12Z" }, { "name": "wavelog/wavelog", - "version": "2.0.1" + "version": "2.0.1", + "date": "2025-02-21T17:55:59Z" }, { "name": "sabnzbd/sabnzbd", - "version": "4.4.1" + "version": "4.4.1", + "date": "2024-12-20T13:21:31Z" }, { "name": "grafana/grafana", - "version": "v11.5.2" + "version": "v11.5.2", + "date": "2025-02-19T00:12:27Z" }, { "name": "gristlabs/grist-core", - "version": "v1.4.2" + "version": "v1.4.2", + "date": "2025-02-18T21:43:36Z" }, { "name": "prometheus-pve/prometheus-pve-exporter", - "version": "v3.5.2" + "version": "v3.5.2", + "date": "2025-02-18T16:43:41Z" }, { "name": "leiweibau/Pi.Alert", - "version": "v2025-02-16" + "version": "v2025-02-16", + "date": "2025-02-18T15:50:08Z" }, { "name": "typesense/typesense", - "version": "v28.0" + "version": "v28.0", + "date": "2025-02-18T15:49:57Z" }, { "name": "qbittorrent/qBittorrent", - "version": "release-5.0.4" + "version": "release-5.0.4", + "date": "2025-02-18T14:14:11Z" }, { "name": "postgres/postgres", - "version": "REL_13_20" + "version": "REL_13_20", + "date": "2025-02-17T21:17:13Z" }, { "name": "jellyfin/jellyfin", - "version": "v10.10.6" + "version": "v10.10.6", + "date": "2025-02-16T21:55:45Z" }, { "name": "sbondCo/Watcharr", - "version": "v2.0.2" + "version": "v2.0.2", + "date": "2025-02-16T21:34:29Z" }, { "name": "recyclarr/recyclarr", - "version": "v7.4.1" + "version": "v7.4.1", + "date": "2025-02-15T20:54:00Z" }, { "name": "node-red/node-red", - "version": "4.0.9" + "version": "4.0.9", + "date": "2025-02-14T17:10:20Z" }, { "name": "mayswind/AriaNg", - "version": "1.3.10" + "version": "1.3.10", + "date": "2025-02-14T16:23:14Z" }, { "name": "MariaDB/server", - "version": "mariadb-11.8.1" + "version": "mariadb-11.8.1", + "date": "2025-02-13T04:14:39Z" }, { "name": "glpi-project/glpi", - "version": "10.0.18" + "version": "10.0.18", + "date": "2025-02-12T11:07:02Z" }, { "name": "WordPress/WordPress", - "version": "6.7.2" + "version": "6.7.2", + "date": "2025-02-11T16:13:18Z" }, { "name": "homebridge/homebridge", - "version": "v1.9.0" + "version": "v1.9.0", + "date": "2025-02-11T13:26:42Z" }, { "name": "TasmoAdmin/TasmoAdmin", - "version": "v4.2.3" + "version": "v4.2.3", + "date": "2025-02-09T23:07:48Z" }, { "name": "dani-garcia/vaultwarden", - "version": "1.33.2" + "version": "1.33.2", + "date": "2025-02-09T17:54:59Z" }, { "name": "blakeblackshear/frigate", - "version": "v0.15.0" + "version": "v0.15.0", + "date": "2025-02-08T18:45:30Z" }, { "name": "forgejo/forgejo", - "version": "v10.0.1" + "version": "v10.0.1", + "date": "2025-02-08T13:17:20Z" }, { "name": "bluenviron/mediamtx", - "version": "v1.11.3" + "version": "v1.11.3", + "date": "2025-02-07T19:29:19Z" }, { "name": "apache/cassandra", - "version": "cassandra-4.0.17" + "version": "cassandra-4.0.17", + "date": "2025-02-07T10:38:54Z" }, { "name": "apache/tika", - "version": "2.9.3" + "version": "2.9.3", + "date": "2025-02-07T00:15:40Z" }, { "name": "actualbudget/actual-server", - "version": "v25.2.1" + "version": "v25.2.1", + "date": "2025-02-06T20:41:28Z" }, { "name": "NginxProxyManager/nginx-proxy-manager", - "version": "v2.12.3" + "version": "v2.12.3", + "date": "2025-02-06T11:07:07Z" }, { "name": "mongodb/mongo", - "version": "r8.0.5-rc1" + "version": "r8.0.5-rc1", + "date": "2025-02-04T20:35:23Z" }, { "name": "thomiceli/opengist", - "version": "v1.9.1" + "version": "v1.9.1", + "date": "2025-02-04T20:24:29Z" }, { "name": "Forceu/Gokapi", - "version": "v1.9.6" + "version": "v1.9.6", + "date": "2024-12-18T14:35:37Z" }, { "name": "requarks/wiki", - "version": "v2.5.306" + "version": "v2.5.306", + "date": "2025-02-02T21:19:29Z" }, { "name": "PrivateBin/PrivateBin", - "version": "1.7.6" + "version": "1.7.6", + "date": "2025-02-01T09:50:52Z" }, { "name": "hivemq/hivemq-community-edition", - "version": "2025.1" + "version": "2025.1", + "date": "2025-01-29T10:04:27Z" }, { "name": "rustdesk/rustdesk-server", - "version": "1.1.14" + "version": "1.1.14", + "date": "2025-01-25T12:48:28Z" }, { "name": "hansmi/prometheus-paperless-exporter", - "version": "v0.0.6" + "version": "v0.0.6", + "date": "2025-01-22T22:19:33Z" }, { "name": "crafty-controller/crafty-4", - "version": "v4.4.7" + "version": "v4.4.7", + "date": "2025-01-20T15:45:06Z" }, { "name": "owncast/owncast", - "version": "v0.2.1" + "version": "v0.2.1", + "date": "2025-01-19T22:40:40Z" }, { "name": "donaldzou/WGDashboard", - "version": "v4.1.4" + "version": "v4.1.4", + "date": "2025-01-19T13:14:19Z" }, { "name": "0xERR0R/blocky", - "version": "v0.25" + "version": "v0.25", + "date": "2025-01-17T20:49:31Z" }, { "name": "petio-team/petio", - "version": "v0.5.7" + "version": "v0.5.7", + "date": "2025-01-17T15:57:17Z" }, { "name": "readeck/readeck", - "version": "0.17.1" + "version": "0.17.1", + "date": "2025-01-15T19:13:33Z" }, { "name": "influxdata/influxdb", - "version": "v1.10.8" + "version": "v1.10.8", + "date": "2025-01-15T09:31:05Z" }, { "name": "linkwarden/linkwarden", - "version": "v2.9.3" + "version": "v2.9.3", + "date": "2025-01-13T16:19:53Z" }, { "name": "Tautulli/Tautulli", - "version": "v2.15.1" + "version": "v2.15.1", + "date": "2025-01-11T23:38:33Z" }, { "name": "traccar/traccar", - "version": "v6.6" + "version": "v6.6", + "date": "2025-01-11T17:26:49Z" }, { "name": "ErsatzTV/ErsatzTV", - "version": "v25.1.0" + "version": "v25.1.0", + "date": "2025-01-10T18:14:54Z" }, { "name": "seanmorley15/AdventureLog", - "version": "v0.8.0" + "version": "v0.8.0", + "date": "2025-01-08T14:27:50Z" }, { "name": "nicolargo/glances", - "version": "v4.3.0.8" + "version": "v4.3.0.8", + "date": "2025-01-05T13:55:13Z" }, { "name": "MagicMirrorOrg/MagicMirror", - "version": "v2.30.0" + "version": "v2.30.0", + "date": "2025-01-01T14:30:19Z" }, { "name": "go-vikunja/vikunja", - "version": "v0.24.6" + "version": "v0.24.6", + "date": "2024-12-22T20:24:35Z" }, { "name": "louislam/uptime-kuma", - "version": "2.0.0-beta.1" + "version": "2.0.0-beta.1", + "date": "2024-12-20T08:56:43Z" }, { "name": "IceWhaleTech/CasaOS", - "version": "v0.4.15" + "version": "v0.4.15", + "date": "2024-12-19T03:19:49Z" }, { "name": "mysql/mysql-server", - "version": "mysql-cluster-7.6.33" + "version": "mysql-cluster-7.6.33", + "date": "2024-12-16T11:55:50Z" }, { "name": "ArchiveBox/ArchiveBox", - "version": "v0.7.3" + "version": "v0.7.3", + "date": "2024-12-15T10:18:06Z" }, { "name": "pymedusa/Medusa", - "version": "v1.0.22" + "version": "v1.0.22", + "date": "2024-12-13T12:22:19Z" }, { "name": "MDeLuise/plant-it", - "version": "0.10.0" + "version": "0.10.0", + "date": "2024-12-10T09:35:26Z" }, { "name": "phpipam/phpipam", - "version": "v1.7.3" + "version": "v1.7.3", + "date": "2024-11-27T21:26:11Z" }, { "name": "Bubka/2FAuth", - "version": "v5.4.3" + "version": "v5.4.3", + "date": "2024-11-27T14:02:18Z" }, { "name": "lldap/lldap", - "version": "v0.6.1" + "version": "v0.6.1", + "date": "2024-11-22T21:48:41Z" }, { "name": "gotify/server", - "version": "v2.6.1" + "version": "v2.6.1", + "date": "2024-11-16T08:44:53Z" }, { "name": "janeczku/calibre-web", - "version": "0.6.24" + "version": "0.6.24", + "date": "2024-11-16T06:47:56Z" }, { "name": "sabre-io/Baikal", - "version": "0.10.1" + "version": "0.10.1", + "date": "2024-11-10T10:25:45Z" }, { "name": "nextcloud/nextcloudpi", - "version": "v1.55.3" + "version": "v1.55.3", + "date": "2024-11-08T22:21:10Z" }, { "name": "caddyserver/xcaddy", - "version": "v0.4.4" + "version": "v0.4.4", + "date": "2024-11-05T23:06:11Z" }, { "name": "linuxserver/Heimdall", - "version": "v2.6.3" + "version": "v2.6.3", + "date": "2024-11-05T11:00:43Z" }, { "name": "zerotier/ZeroTierOne", - "version": "1.14.2" + "version": "1.14.2", + "date": "2024-10-29T16:17:48Z" }, { "name": "CorentinTh/it-tools", - "version": "v2024.10.22-7ca5933" + "version": "v2024.10.22-7ca5933", + "date": "2024-10-22T09:58:03Z" }, { "name": "aceberg/WatchYourLAN", - "version": "2.0.4" + "version": "2.0.4", + "date": "2024-10-20T18:57:37Z" }, { "name": "NLnetLabs/unbound", - "version": "release-1.22.0" + "version": "release-1.22.0", + "date": "2024-10-17T08:43:37Z" }, { "name": "Notifiarr/notifiarr", - "version": "v0.8.3" + "version": "v0.8.3", + "date": "2024-10-04T23:49:07Z" }, { "name": "Kometa-Team/Kometa", - "version": "v2.1.0" + "version": "v2.1.0", + "date": "2024-09-30T17:59:43Z" }, { "name": "FunkeyFlo/ps5-mqtt", - "version": "v1.4.0" + "version": "v1.4.0", + "date": "2024-08-06T19:57:33Z" }, { "name": "projectsend/projectsend", - "version": "r1720" + "version": "r1720", + "date": "2024-08-03T04:07:20Z" }, { "name": "Pf2eToolsOrg/Pf2eTools", - "version": "v0.8.13" + "version": "v0.8.13", + "date": "2024-07-29T12:54:27Z" }, { "name": "Paymenter/Paymenter", - "version": "v0.9.5" + "version": "v0.9.5", + "date": "2024-07-20T08:46:42Z" }, { "name": "hywax/mafl", - "version": "v0.15.4" + "version": "v0.15.4", + "date": "2024-07-13T11:03:43Z" }, { "name": "FlareSolverr/FlareSolverr", - "version": "v3.3.21" + "version": "v3.3.21", + "date": "2024-06-26T01:14:46Z" }, { "name": "Suwayomi/Suwayomi-Server", - "version": "v1.1.1" + "version": "v1.1.1", + "date": "2024-06-15T17:23:48Z" }, { "name": "Forceu/barcodebuddy", - "version": "v1.8.1.8" + "version": "v1.8.1.8", + "date": "2024-06-02T20:01:53Z" }, { "name": "Lissy93/dashy", - "version": "3.1.1" + "version": "3.1.1", + "date": "2024-05-30T17:20:53Z" }, { "name": "motioneye-project/motioneye", - "version": "0.43.1b2" + "version": "0.43.1b2", + "date": "2024-05-29T20:32:35Z" }, { "name": "gnmyt/myspeed", - "version": "v1.0.9" + "version": "v1.0.9", + "date": "2024-05-21T22:15:33Z" }, { "name": "binwiederhier/ntfy", - "version": "v2.11.0" + "version": "v2.11.0", + "date": "2024-05-13T20:19:54Z" }, { "name": "CrazyWolf13/web-check", - "version": "1.0.0" + "version": "1.0.0", + "date": "2024-05-05T02:01:51Z" }, { "name": "monicahq/monica", - "version": "v4.1.2" + "version": "v4.1.2", + "date": "2024-05-04T08:06:50Z" }, { "name": "hakimel/reveal.js", - "version": "5.1.0" + "version": "5.1.0", + "date": "2024-04-11T07:03:04Z" }, { "name": "thelounge/thelounge-deb", - "version": "v4.4.3" + "version": "v4.4.3", + "date": "2024-04-06T12:24:35Z" }, { "name": "louislam/dockge", - "version": "1.4.2" + "version": "1.4.2", + "date": "2024-01-21T17:02:52Z" }, { "name": "hyperion-project/hyperion.ng", - "version": "2.0.16" + "version": "2.0.16", + "date": "2024-01-18T16:11:07Z" }, { "name": "wger-project/wger", - "version": "2.2" + "version": "2.2", + "date": "2023-12-06T12:08:09Z" }, { "name": "sct/overseerr", - "version": "preview-test-node-18" + "version": "preview-test-node-18", + "date": "2023-11-06T10:21:37Z" }, { "name": "deepch/RTSPtoWeb", - "version": "v2.4.3" + "version": "v2.4.3", + "date": "2023-03-29T12:05:02Z" } ] From a5985e4ce5dc249fe3f21858a3e796de44160830 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:12:54 +0100 Subject: [PATCH 143/258] Forgot a thing (#3240) --- frontend/src/app/api/versions/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/api/versions/route.ts b/frontend/src/app/api/versions/route.ts index db891600f..94585bad9 100644 --- a/frontend/src/app/api/versions/route.ts +++ b/frontend/src/app/api/versions/route.ts @@ -19,7 +19,7 @@ const getVersions = async () => { const modifiedVersions = versions.map(version => { let newName = version.name; newName = newName.toLowerCase().replace(/[^a-z0-9/]/g, ''); - return { ...version, name: newName }; + return { ...version, name: newName, date: new Date(version.date) }; }); return modifiedVersions; From aca396e993c18a73d6565e084df000930fed5800 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Tue, 18 Mar 2025 19:11:38 +0100 Subject: [PATCH 144/258] Move cryptpad files to right folders (#3242) --- cryptpad.sh => ct/cryptpad.sh | 0 cryptpad.json => frontend/public/json/cryptpad.json | 3 ++- cryptpad-install.sh => install/cryptpad-install.sh | 0 3 files changed, 2 insertions(+), 1 deletion(-) rename cryptpad.sh => ct/cryptpad.sh (100%) rename cryptpad.json => frontend/public/json/cryptpad.json (99%) rename cryptpad-install.sh => install/cryptpad-install.sh (100%) diff --git a/cryptpad.sh b/ct/cryptpad.sh similarity index 100% rename from cryptpad.sh rename to ct/cryptpad.sh diff --git a/cryptpad.json b/frontend/public/json/cryptpad.json similarity index 99% rename from cryptpad.json rename to frontend/public/json/cryptpad.json index a75a2ba97..06d45efce 100644 --- a/cryptpad.json +++ b/frontend/public/json/cryptpad.json @@ -35,4 +35,5 @@ "text": "After installation finishes, `systemctl status cryptpad.service` to get token URL which you can use to create admin account", "type": "info" } - } + ] +} diff --git a/cryptpad-install.sh b/install/cryptpad-install.sh similarity index 100% rename from cryptpad-install.sh rename to install/cryptpad-install.sh From 02036aaffa322c7b44a5df2dfa5f5a9f255a8be2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 19:14:51 +0100 Subject: [PATCH 145/258] Update .app files (#3244) Co-authored-by: GitHub Actions --- ct/headers/cryptpad | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/cryptpad diff --git a/ct/headers/cryptpad b/ct/headers/cryptpad new file mode 100644 index 000000000..c4d6ebe0e --- /dev/null +++ b/ct/headers/cryptpad @@ -0,0 +1,6 @@ + ______ __ ____ __ + / ____/______ ______ / /_/ __ \____ _____/ / + / / / ___/ / / / __ \/ __/ /_/ / __ `/ __ / +/ /___/ / / /_/ / /_/ / /_/ ____/ /_/ / /_/ / +\____/_/ \__, / .___/\__/_/ \__,_/\__,_/ + /____/_/ From 600607dca887c450645df26ba1869f0deca8956c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 19:19:38 +0100 Subject: [PATCH 146/258] Update CHANGELOG.md (#3243) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb6098cc0..f34e85b2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Move cryptpad files to right folders [@bvdberg01](https://github.com/bvdberg01) ([#3242](https://github.com/community-scripts/ProxmoxVE/pull/3242)) - Update Frontend Version Logic [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3223](https://github.com/community-scripts/ProxmoxVE/pull/3223)) - #### ✨ New Features From 05d4db84188c3e1ecb2343541c0fc222c5b8c9ec Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:44:42 +0100 Subject: [PATCH 147/258] Fix download url (#3245) --- ct/omada.sh | 2 +- install/omada-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/omada.sh b/ct/omada.sh index ace02b9b8..9a8da6bd7 100644 --- a/ct/omada.sh +++ b/ct/omada.sh @@ -43,7 +43,7 @@ function update_script() { msg_ok "Updated MongoDB to $MONGODB_VERSION" msg_info "Updating Omada Controller" - latest_url=$(curl -s "https://support.omadanetworks.com/en/product/omada-software-controller/?resourceType=download" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) + latest_url=$(curl -s "https://support.omadanetworks.com/en/download/software/omada-controller/" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) latest_version=$(basename "$latest_url") if [ -z "${latest_version}" ]; then msg_error "It seems that the server (tp-link.com) might be down. Please try again at a later time." diff --git a/install/omada-install.sh b/install/omada-install.sh index 38e51a114..c2c76cdc4 100644 --- a/install/omada-install.sh +++ b/install/omada-install.sh @@ -55,7 +55,7 @@ $STD apt-get install -y mongodb-org msg_ok "Installed MongoDB $MONGODB_VERSION" msg_info "Installing Omada Controller" -latest_url=$(curl -s "https://support.omadanetworks.com/en/product/omada-software-controller/?resourceType=download" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) +latest_url=$(curl -s "https://support.omadanetworks.com/en/download/software/omada-controller/" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) latest_version=$(basename "$latest_url") wget -qL ${latest_url} From 9d8e5e4705da603f7b758797dd555d98fc4e00c4 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:49:01 +0100 Subject: [PATCH 148/258] remove old backups (#3247) --- .../backup/check_and_update_json_date.yml | 60 ----- .github/workflows/backup/shellcheck.yml | 60 ----- .../workflows/backup/update_json_date.yml.bak | 88 ------- .../backup/validate-formatting.yaml.bak | 133 ---------- .../workflows/backup/validate-scripts.yml.bak | 234 ------------------ 5 files changed, 575 deletions(-) delete mode 100644 .github/workflows/backup/check_and_update_json_date.yml delete mode 100644 .github/workflows/backup/shellcheck.yml delete mode 100644 .github/workflows/backup/update_json_date.yml.bak delete mode 100644 .github/workflows/backup/validate-formatting.yaml.bak delete mode 100644 .github/workflows/backup/validate-scripts.yml.bak diff --git a/.github/workflows/backup/check_and_update_json_date.yml b/.github/workflows/backup/check_and_update_json_date.yml deleted file mode 100644 index cde3cbbad..000000000 --- a/.github/workflows/backup/check_and_update_json_date.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Update date_created in JSON files - -on: - # Dieser Trigger wird fΓΌr das Γ–ffnen von PRs sowie fΓΌr das Aktualisieren von offenen PRs verwendet - pull_request: - types: [opened, synchronize] - schedule: - # Dieser Trigger wird 4x am Tag ausgelΓΆst, um sicherzustellen, dass das Datum aktualisiert wird - - cron: "0 0,6,12,18 * * *" # FΓΌhrt alle 6 Stunden aus - workflow_dispatch: # Manuelle AusfΓΌhrung des Workflows mΓΆglich - -jobs: - update-date: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install yq - run: | - sudo apt-get update - sudo apt-get install -y yq - - - name: Set the current date - id: set_date - run: echo "TODAY=$(date -u +%Y-%m-%d)" >> $GITHUB_ENV - - - name: Check for changes in PR - run: | - # Hole den PR-Branch - PR_BRANCH="refs/pull/${{ github.event.pull_request.number }}/merge" - git fetch origin $PR_BRANCH - - # Liste alle JSON-Dateien im PR auf, die geΓ€ndert wurden - CHANGED_JSON_FILES=$(git diff --name-only origin/main...$PR_BRANCH | grep '.json') - - if [ -z "$CHANGED_JSON_FILES" ]; then - echo "No JSON files changed in this PR." - exit 0 - fi - - # Gehe alle geΓ€nderten JSON-Dateien durch und aktualisiere das Datum - for file in $CHANGED_JSON_FILES; do - echo "Updating date_created in $file" - # Setze das aktuelle Datum - yq eval ".date_created = \"${{ env.TODAY }}\"" -i "$file" - git add "$file" - done - - - name: Commit and push changes - run: | - # PrΓΌfe, ob es Γ„nderungen gibt und committe sie - git config user.name "json-updater-bot" - git config user.email "github-actions[bot]@users.noreply.github.com" - - git commit -m "Update date_created to ${{ env.TODAY }}" || echo "No changes to commit" - - # Push zurΓΌck in den PR-Branch - git push origin $PR_BRANCH diff --git a/.github/workflows/backup/shellcheck.yml b/.github/workflows/backup/shellcheck.yml deleted file mode 100644 index 4385fc8e9..000000000 --- a/.github/workflows/backup/shellcheck.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Shellcheck - -on: - push: - branches: - - main - pull_request: - workflow_dispatch: - schedule: - - cron: "5 1 * * *" - -jobs: - shellcheck: - name: Shellcheck - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Get changed files - id: changed-files - uses: tj-actions/changed-files@v45 - with: - files: | - **.sh - - - name: Download ShellCheck - shell: bash - env: - INPUT_VERSION: "v0.10.0" - run: | - set -euo pipefail - if [[ "${{ runner.os }}" == "macOS" ]]; then - osvariant="darwin" - else - osvariant="linux" - fi - - baseurl="https://github.com/koalaman/shellcheck/releases/download" - curl -Lso "${{ github.workspace }}/sc.tar.xz" \ - "${baseurl}/${INPUT_VERSION}/shellcheck-${INPUT_VERSION}.${osvariant}.x86_64.tar.xz" - - tar -xf "${{ github.workspace }}/sc.tar.xz" -C "${{ github.workspace }}" - mv "${{ github.workspace }}/shellcheck-${INPUT_VERSION}/shellcheck" \ - "${{ github.workspace }}/shellcheck" - - - name: Verify ShellCheck binary - run: | - ls -l "${{ github.workspace }}/shellcheck" - - - name: Display ShellCheck version - run: | - "${{ github.workspace }}/shellcheck" --version - - - name: Run ShellCheck - if: steps.changed-files.outputs.any_changed == 'true' - env: - ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} - run: | - echo "${ALL_CHANGED_FILES}" | xargs "${{ github.workspace }}/shellcheck" diff --git a/.github/workflows/backup/update_json_date.yml.bak b/.github/workflows/backup/update_json_date.yml.bak deleted file mode 100644 index cb9bc8559..000000000 --- a/.github/workflows/backup/update_json_date.yml.bak +++ /dev/null @@ -1,88 +0,0 @@ -name: Auto Update JSON-Date - -on: - push: - branches: - - main - workflow_dispatch: - -jobs: - update-json-dates: - runs-on: ubuntu-latest - - permissions: - contents: write - pull-requests: write - - steps: - - name: Generate a token - id: generate-token - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ vars.APP_ID }} - private-key: ${{ secrets.APP_PRIVATE_KEY }} - - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Full history for proper detection - - - name: Set up Git - run: | - git config --global user.name "GitHub Actions" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - - name: Find JSON files with incorrect date_created - id: find_wrong_json - run: | - TODAY=$(date -u +"%Y-%m-%d") - > incorrect_json_files.txt - - for FILE in json/*.json; do - if [[ -f "$FILE" ]]; then - DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "") - - if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then - echo "$FILE" >> incorrect_json_files.txt - fi - fi - done - - if [[ -s incorrect_json_files.txt ]]; then - echo "CHANGED=true" >> $GITHUB_ENV - else - echo "CHANGED=false" >> $GITHUB_ENV - fi - - - name: Run update script - if: env.CHANGED == 'true' - run: | - chmod +x .github/workflows/scripts/update-json.sh - while read -r FILE; do - .github/workflows/scripts/update-json.sh "$FILE" - done < incorrect_json_files.txt - - - name: Commit and create PR if changes exist - if: env.CHANGED == 'true' - run: | - git add json/*.json - git commit -m "Auto-update date_created in incorrect JSON files" - git checkout -b pr-fix-json-dates - git push origin pr-fix-json-dates --force - gh pr create --title "[core] Fix incorrect JSON date_created fields" \ - --body "This PR is auto-generated to fix incorrect `date_created` fields in JSON files." \ - --head pr-fix-json-dates \ - --base main \ - --label "automated pr" - env: - GH_TOKEN: ${{ steps.generate-token.outputs.token }} - - - name: Approve pull request - if: env.CHANGED == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - PR_NUMBER=$(gh pr list --head "pr-fix-json-dates" --json number --jq '.[].number') - if [ -n "$PR_NUMBER" ]; then - gh pr review $PR_NUMBER --approve - fi diff --git a/.github/workflows/backup/validate-formatting.yaml.bak b/.github/workflows/backup/validate-formatting.yaml.bak deleted file mode 100644 index 8eadd0acf..000000000 --- a/.github/workflows/backup/validate-formatting.yaml.bak +++ /dev/null @@ -1,133 +0,0 @@ -name: Validate script formatting - -on: - push: - branches: - - main - pull_request_target: - paths: - - "**/*.sh" - - "**/*.func" - -jobs: - shfmt: - name: Check changed files - runs-on: ubuntu-latest - permissions: - - pull-requests: write - - steps: - - name: Get pull request information - if: github.event_name == 'pull_request_target' - uses: actions/github-script@v7 - id: pr - with: - script: | - const { data: pullRequest } = await github.rest.pulls.get({ - ...context.repo, - pull_number: context.payload.pull_request.number, - }); - return pullRequest; - - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Ensure the full history is fetched for accurate diffing - ref: ${{ github.event_name == 'pull_request_target' && fromJSON(steps.pr.outputs.result).merge_commit_sha || '' }} - - - name: Get changed files - id: changed-files - run: | - if ${{ github.event_name == 'pull_request_target' }}; then - echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ steps.pr.outputs.result && fromJSON(steps.pr.outputs.result).merge_commit_sha }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT - else - echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT - fi - - - name: Set up Go - if: steps.changed-files.outputs.files != '' - uses: actions/setup-go@v5 - - - name: Install shfmt - if: steps.changed-files.outputs.files != '' - run: | - go install mvdan.cc/sh/v3/cmd/shfmt@latest - echo "$GOPATH/bin" >> $GITHUB_PATH - - - name: Run shfmt - if: steps.changed-files.outputs.files != '' - id: shfmt - run: | - set +e - - - shfmt_output=$(shfmt -d ${{ steps.changed-files.outputs.files }}) - if [[ $? -eq 0 ]]; then - exit 0 - else - echo "diff=\"$(echo -n "$shfmt_output" | base64 -w 0)\"" >> $GITHUB_OUTPUT - printf "%s" "$shfmt_output" - exit 1 - fi - - - name: Post comment with results - if: always() && steps.changed-files.outputs.files != '' && github.event_name == 'pull_request_target' - uses: actions/github-script@v7 - with: - script: | - const result = "${{ job.status }}" === "success" ? "success" : "failure"; - const diff = Buffer.from( - ${{ steps.shfmt.outputs.diff }}, - "base64", - ).toString(); - const issueNumber = context.payload.pull_request - ? context.payload.pull_request.number - : null; - const commentIdentifier = "validate-formatting"; - let newCommentBody = `\n### Script formatting\n\n`; - - if (result === "failure") { - newCommentBody += - `:x: We found issues in the formatting of the following changed files:\n\n\`\`\`diff\n${diff}\n\`\`\`\n`; - } else { - newCommentBody += `:rocket: All changed shell scripts are formatted correctly!\n`; - } - - newCommentBody += `\n\n`; - - if (issueNumber) { - const { data: comments } = await github.rest.issues.listComments({ - ...context.repo, - issue_number: issueNumber, - }); - - const existingComment = comments.find( - (comment) => comment.user.login === "github-actions[bot]", - - ); - - if (existingComment) { - if (existingComment.body.includes(commentIdentifier)) { - const re = new RegExp( - String.raw`[\s\S]*?`, - "", - ); - newCommentBody = existingComment.body.replace(re, newCommentBody); - } else { - newCommentBody = existingComment.body + "\n\n---\n\n" + newCommentBody; - } - - await github.rest.issues.updateComment({ - ...context.repo, - comment_id: existingComment.id, - body: newCommentBody, - }); - } else { - await github.rest.issues.createComment({ - ...context.repo, - issue_number: issueNumber, - body: newCommentBody, - }); - } - } diff --git a/.github/workflows/backup/validate-scripts.yml.bak b/.github/workflows/backup/validate-scripts.yml.bak deleted file mode 100644 index 84b697063..000000000 --- a/.github/workflows/backup/validate-scripts.yml.bak +++ /dev/null @@ -1,234 +0,0 @@ -name: Validate scripts -on: - push: - branches: - - main - pull_request_target: - paths: - - "ct/*.sh" - - "install/*.sh" - -jobs: - check-scripts: - name: Check changed files - runs-on: ubuntu-latest - permissions: - pull-requests: write - - steps: - - name: Debug event payload - run: | - echo "Event name: ${{ github.event_name }}" - echo "Payload: $(cat $GITHUB_EVENT_PATH)" - - - name: Get pull request information - if: github.event_name == 'pull_request_target' - uses: actions/github-script@v7 - id: pr - with: - script: | - const { data: pullRequest } = await github.rest.pulls.get({ - ...context.repo, - pull_number: context.payload.pull_request.number, - }); - return pullRequest; - - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: ${{ github.event_name == 'pull_request_target' && fromJSON(steps.pr.outputs.result).merge_commit_sha || '' }} - - - name: Get changed files - id: changed-files - run: | - if [ "${{ github.event_name }}" == "pull_request_target" ]; then - echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ steps.pr.outputs.result && fromJSON(steps.pr.outputs.result).merge_commit_sha }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT - else - echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT - fi - - - name: Check build.func line - if: always() && steps.changed-files.outputs.files != '' - id: build-func - run: | - NON_COMPLIANT_FILES="" - for FILE in ${{ steps.changed-files.outputs.files }}; do - if [[ "$FILE" == ct/* ]] && [[ $(sed -n '2p' "$FILE") != "source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)" ]]; then - NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE" - fi - done - - if [ -n "$NON_COMPLIANT_FILES" ]; then - echo "files=$NON_COMPLIANT_FILES" >> $GITHUB_OUTPUT - echo "Build.func line missing or incorrect in files:" - for FILE in $NON_COMPLIANT_FILES; do - echo "$FILE" - done - exit 1 - fi - - - name: Check executable permissions - if: always() && steps.changed-files.outputs.files != '' - id: check-executable - run: | - NON_COMPLIANT_FILES="" - for FILE in ${{ steps.changed-files.outputs.files }}; do - if [[ ! -x "$FILE" ]]; then - NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE" - fi - done - - if [ -n "$NON_COMPLIANT_FILES" ]; then - echo "files=$NON_COMPLIANT_FILES" >> $GITHUB_OUTPUT - echo "Files not executable:" - for FILE in $NON_COMPLIANT_FILES; do - echo "$FILE" - done - exit 1 - fi - - - name: Check copyright - if: always() && steps.changed-files.outputs.files != '' - id: check-copyright - run: | - NON_COMPLIANT_FILES="" - for FILE in ${{ steps.changed-files.outputs.files }}; do - if ! sed -n '3p' "$FILE" | grep -qE "^# Copyright \(c\) [0-9]{4}(-[0-9]{4})? (tteck \| community-scripts ORG|community-scripts ORG|tteck)$"; then - NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE" - fi - done - - if [ -n "$NON_COMPLIANT_FILES" ]; then - echo "files=$NON_COMPLIANT_FILES" >> $GITHUB_OUTPUT - echo "Copyright header missing or not on line 3 in files:" - for FILE in $NON_COMPLIANT_FILES; do - echo "$FILE" - done - exit 1 - fi - - - name: Check author - if: always() && steps.changed-files.outputs.files != '' - id: check-author - run: | - NON_COMPLIANT_FILES="" - for FILE in ${{ steps.changed-files.outputs.files }}; do - if ! sed -n '4p' "$FILE" | grep -qE "^# Author: .+"; then - NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE" - fi - done - - if [ -n "$NON_COMPLIANT_FILES" ]; then - echo "files=$NON_COMPLIANT_FILES" >> $GITHUB_OUTPUT - echo "Author header missing or invalid on line 4 in files:" - for FILE in $NON_COMPLIANT_FILES; do - echo "$FILE" - done - exit 1 - fi - - - name: Check license - if: always() && steps.changed-files.outputs.files != '' - id: check-license - run: | - NON_COMPLIANT_FILES="" - for FILE in ${{ steps.changed-files.outputs.files }}; do - if [[ "$(sed -n '5p' "$FILE")" != "# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE" ]]; then - NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE" - fi - done - - if [ -n "$NON_COMPLIANT_FILES" ]; then - echo "files=$NON_COMPLIANT_FILES" >> $GITHUB_OUTPUT - echo "License header missing or not on line 5 in files:" - for FILE in $NON_COMPLIANT_FILES; do - echo "$FILE" - done - exit 1 - fi - - - name: Check source - if: always() && steps.changed-files.outputs.files != '' - id: check-source - run: | - NON_COMPLIANT_FILES="" - for FILE in ${{ steps.changed-files.outputs.files }}; do - if ! sed -n '6p' "$FILE" | grep -qE "^# Source: .+"; then - NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE" - fi - done - - if [ -n "$NON_COMPLIANT_FILES" ]; then - echo "files=$NON_COMPLIANT_FILES" >> $GITHUB_OUTPUT - echo "Source header missing or not on line 6 in files:" - for FILE in $NON_COMPLIANT_FILES; do - echo "$FILE" - done - exit 1 - fi - - - name: Post results and comment - if: always() && steps.changed-files.outputs.files != '' && github.event_name == 'pull_request_target' - uses: actions/github-script@v7 - with: - script: | - const result = '${{ job.status }}' === 'success' ? 'success' : 'failure'; - const nonCompliantFiles = { - 'Invalid build.func source': "${{ steps.build-func.outputs.files || '' }}", - 'Not executable': "${{ steps.check-executable.outputs.files || '' }}", - 'Copyright header line missing or invalid': "${{ steps.check-copyright.outputs.files || '' }}", - 'Author header line missing or invalid': "${{ steps.check-author.outputs.files || '' }}", - 'License header line missing or invalid': "${{ steps.check-license.outputs.files || '' }}", - 'Source header line missing or invalid': "${{ steps.check-source.outputs.files || '' }}" - }; - - const issueNumber = context.payload.pull_request ? context.payload.pull_request.number : null; - const commentIdentifier = 'validate-scripts'; - let newCommentBody = `\n### Script validation\n\n`; - - if (result === 'failure') { - newCommentBody += ':x: We found issues in the following changed files:\n\n'; - for (const [check, files] of Object.entries(nonCompliantFiles)) { - if (files) { - newCommentBody += `**${check}:**\n`; - files.trim().split(' ').forEach(file => { - newCommentBody += `- ${file}: ${check}\n`; - }); - newCommentBody += `\n`; - } - } - } else { - newCommentBody += `:rocket: All changed shell scripts passed validation!\n`; - } - - newCommentBody += `\n\n`; - - if (issueNumber) { - const { data: comments } = await github.rest.issues.listComments({ - ...context.repo, - issue_number: issueNumber - }); - - const existingComment = comments.find(comment => - comment.body.includes(``) && - comment.user.login === 'github-actions[bot]' - ); - - if (existingComment) { - const re = new RegExp(String.raw`[\\s\\S]*?`, "m"); - newCommentBody = existingComment.body.replace(re, newCommentBody); - - await github.rest.issues.updateComment({ - ...context.repo, - comment_id: existingComment.id, - body: newCommentBody - }); - } else { - await github.rest.issues.createComment({ - ...context.repo, - issue_number: issueNumber, - body: newCommentBody - }); - } - } From 98a6f2f64eefd78e898f1ed9fce9283f9f2daf2a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:51:48 +0100 Subject: [PATCH 149/258] Update CHANGELOG.md (#3248) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f34e85b2e..6e666794d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Update omada download url [@bvdberg01](https://github.com/bvdberg01) ([#3245](https://github.com/community-scripts/ProxmoxVE/pull/3245)) - Wikijs: Remove Dev Message & Performance-Boost [@bvdberg01](https://github.com/bvdberg01) ([#3232](https://github.com/community-scripts/ProxmoxVE/pull/3232)) - Fix openwebui update script when backup directory already exists [@chrisdoc](https://github.com/chrisdoc) ([#3213](https://github.com/community-scripts/ProxmoxVE/pull/3213)) @@ -36,6 +37,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“‚ Github + - [core] cleanup - remove old backups of workflow files [@MickLesk](https://github.com/MickLesk) ([#3247](https://github.com/community-scripts/ProxmoxVE/pull/3247)) - Add worflow to crawl APP verisons [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3192](https://github.com/community-scripts/ProxmoxVE/pull/3192)) - Update pr template and WF [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3200](https://github.com/community-scripts/ProxmoxVE/pull/3200)) - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) @@ -57,13 +59,13 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - CrowdSec: Add debian only warning to website [@tremor021](https://github.com/tremor021) ([#3210](https://github.com/community-scripts/ProxmoxVE/pull/3210)) + - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) + - Heimdall Dashboard: Fix missing logo on website [@tremor021](https://github.com/tremor021) ([#3227](https://github.com/community-scripts/ProxmoxVE/pull/3227)) - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) - Website: Lowercase Zitadel-Slug [@MickLesk](https://github.com/MickLesk) ([#3222](https://github.com/community-scripts/ProxmoxVE/pull/3222)) - VictoriaMetrics: Fix Wrong Slug [@MickLesk](https://github.com/MickLesk) ([#3225](https://github.com/community-scripts/ProxmoxVE/pull/3225)) - Update Pimox Logo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3233](https://github.com/community-scripts/ProxmoxVE/pull/3233)) - - Heimdall Dashboard: Fix missing logo on website [@tremor021](https://github.com/tremor021) ([#3227](https://github.com/community-scripts/ProxmoxVE/pull/3227)) - - CrowdSec: Add debian only warning to website [@tremor021](https://github.com/tremor021) ([#3210](https://github.com/community-scripts/ProxmoxVE/pull/3210)) - - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) From 02493d5048045144255f2ed67ea2ab58f092d6cc Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 19 Mar 2025 07:00:22 +0100 Subject: [PATCH 150/258] Fluid-Calendar: Remove unneeded $STD in update (#3250) --- ct/fluid-calendar.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/fluid-calendar.sh b/ct/fluid-calendar.sh index f6721d547..938bc60b0 100644 --- a/ct/fluid-calendar.sh +++ b/ct/fluid-calendar.sh @@ -36,7 +36,7 @@ function update_script() { msg_ok "Stopped $APP" msg_info "Creating Backup" - $STD tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" /opt/fluid-calendar + tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" /opt/fluid-calendar msg_ok "Backup Created" msg_info "Updating $APP to v${RELEASE}" From 392e2b5e79e365647f175fd25a37bcfcb2e6c91b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 07:01:44 +0100 Subject: [PATCH 151/258] Update CHANGELOG.md (#3255) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e666794d..3025514dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-19 + +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - Fluid-Calendar: Remove unneeded $STD in update [@MickLesk](https://github.com/MickLesk) ([#3250](https://github.com/community-scripts/ProxmoxVE/pull/3250)) + ## 2025-03-18 ### πŸ†• New Scripts From a0eeeff67df7c466ab8e76382ce8fbb6c2e622cb Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 07:11:04 +0100 Subject: [PATCH 152/258] Update versions.json (#3253) --- frontend/public/json/versions.json | 174 ++++++++++++++--------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index f1f9b5d8e..9d6ae5977 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,13 +1,78 @@ [ { - "name": "crowdsecurity/crowdsec", - "version": "v1.6.6", - "date": "2025-03-18T13:05:01Z" + "name": "pocket-id/pocket-id", + "version": "v0.42.1", + "date": "2025-03-18T22:03:53Z" + }, + { + "name": "Donkie/Spoolman", + "version": "v0.22.1", + "date": "2025-03-18T21:01:22Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-18T20:28:40Z" + }, + { + "name": "esphome/esphome", + "version": "2025.2.2", + "date": "2025-03-03T08:23:30Z" + }, + { + "name": "dotnetfactory/fluid-calendar", + "version": "v1.2.2", + "date": "2025-03-18T18:47:36Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v9.33.1", + "date": "2025-03-18T17:26:41Z" + }, + { + "name": "zitadel/zitadel", + "version": "v2.66.14", + "date": "2025-03-18T16:05:48Z" + }, + { + "name": "prometheus/prometheus", + "version": "v2.53.4", + "date": "2025-03-18T15:50:39Z" + }, + { + "name": "syncthing/syncthing", + "version": "v1.29.3", + "date": "2025-03-12T11:56:30Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.502", + "date": "2025-03-18T15:02:59Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.126.0", + "date": "2025-03-11T16:29:42Z" + }, + { + "name": "OctoPrint/OctoPrint", + "version": "1.10.3", + "date": "2024-11-05T09:20:50Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.83.2", + "date": "2025-03-14T15:43:23Z" }, { "name": "openobserve/openobserve", "version": "v0.14.5-rc4", - "date": "2025-03-18T12:51:31Z" + "date": "2025-03-18T13:51:56Z" + }, + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.5", + "date": "2025-02-07T13:44:35Z" }, { "name": "Radarr/Radarr", @@ -19,15 +84,10 @@ "version": "3.4.3.post1", "date": "2025-03-18T09:44:59Z" }, - { - "name": "zitadel/zitadel", - "version": "v2.70.5", - "date": "2025-03-18T08:08:16Z" - }, { "name": "nzbgetcom/nzbget", - "version": "testing", - "date": "2025-03-18T08:06:43Z" + "version": "v24.8", + "date": "2025-03-18T07:33:51Z" }, { "name": "Checkmk/checkmk", @@ -46,8 +106,8 @@ }, { "name": "ollama/ollama", - "version": "v0.6.1", - "date": "2025-03-14T15:57:59Z" + "version": "v0.6.2", + "date": "2025-03-18T03:11:33Z" }, { "name": "StarFleetCPTN/GoMFT", @@ -99,11 +159,6 @@ "version": "v5.34.3", "date": "2025-03-17T14:20:04Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.84.0", - "date": "2025-03-17T13:58:36Z" - }, { "name": "Graylog2/graylog2-server", "version": "6.2.0-beta.1", @@ -144,21 +199,11 @@ "version": "v1.0.4", "date": "2025-03-16T22:19:31Z" }, - { - "name": "Donkie/Spoolman", - "version": "v0.22.0", - "date": "2025-03-16T21:14:52Z" - }, { "name": "autobrr/autobrr", "version": "v1.60.0", "date": "2025-03-16T18:39:49Z" }, - { - "name": "pocket-id/pocket-id", - "version": "v0.40.1", - "date": "2025-03-16T17:02:54Z" - }, { "name": "evcc-io/evcc", "version": "0.201.0", @@ -194,11 +239,6 @@ "version": "8.0-m04", "date": "2025-03-16T08:12:40Z" }, - { - "name": "esphome/esphome", - "version": "2025.3.0b3", - "date": "2025-03-16T06:53:58Z" - }, { "name": "Kozea/Radicale", "version": "v3.5.0", @@ -314,11 +354,6 @@ "version": "1.26.1", "date": "2025-03-13T21:34:25Z" }, - { - "name": "dotnetfactory/fluid-calendar", - "version": "v1.2.1", - "date": "2025-03-13T19:11:35Z" - }, { "name": "kimai/kimai", "version": "2.31.0", @@ -336,8 +371,8 @@ }, { "name": "moghtech/komodo", - "version": "v1.17.0-dev-7", - "date": "2025-03-13T05:03:04Z" + "version": "v1.16.12", + "date": "2024-12-02T08:46:29Z" }, { "name": "NodeBB/NodeBB", @@ -349,35 +384,20 @@ "version": "v4.0.1", "date": "2025-03-12T22:41:17Z" }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.501", - "date": "2025-03-12T21:47:58Z" - }, { "name": "minio/minio", "version": "RELEASE.2025-03-12T18-04-18Z", "date": "2025-03-12T18:45:21Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v9.33.0", - "date": "2025-03-12T16:29:52Z" - }, { "name": "cockpit-project/cockpit", "version": "335", "date": "2025-03-12T13:03:27Z" }, - { - "name": "syncthing/syncthing", - "version": "v1.29.3", - "date": "2025-03-12T11:56:30Z" - }, { "name": "transmission/transmission", - "version": "4.1.0-beta.2", - "date": "2025-03-12T11:01:28Z" + "version": "4.0.1-beta.1", + "date": "2024-12-13T00:16:24Z" }, { "name": "emqx/emqx", @@ -389,21 +409,11 @@ "version": "1.21.2", "date": "2025-03-12T04:19:30Z" }, - { - "name": "element-hq/synapse", - "version": "v1.126.0", - "date": "2025-03-11T16:29:42Z" - }, { "name": "benjaminjonard/koillection", "version": "1.6.12", "date": "2025-03-11T15:04:43Z" }, - { - "name": "OctoPrint/OctoPrint", - "version": "1.11.0rc4", - "date": "2025-03-11T13:37:12Z" - }, { "name": "excalidraw/excalidraw", "version": "v0.18.0", @@ -461,8 +471,8 @@ }, { "name": "caddyserver/caddy", - "version": "v2.10.0-beta.2", - "date": "2025-03-09T13:51:09Z" + "version": "v2.9.1", + "date": "2025-01-08T15:22:53Z" }, { "name": "awawa-dev/HyperHDR", @@ -471,13 +481,13 @@ }, { "name": "Lidarr/Lidarr", - "version": "v2.10.1.4589", - "date": "2025-03-09T09:51:41Z" + "version": "v2.9.6.4552", + "date": "2025-02-03T12:11:00Z" }, { "name": "Readarr/Readarr", - "version": "v0.4.12.2753", - "date": "2025-03-09T09:50:51Z" + "version": "v2.0.0.4645", + "date": "2017-03-07T18:56:06Z" }, { "name": "Brandawg93/PeaNUT", @@ -654,11 +664,6 @@ "version": "v1.16.1", "date": "2025-02-26T11:29:15Z" }, - { - "name": "prometheus/prometheus", - "version": "v3.2.1", - "date": "2025-02-26T09:55:45Z" - }, { "name": "silverbulletmd/silverbullet", "version": "0.10.4", @@ -811,8 +816,8 @@ }, { "name": "MariaDB/server", - "version": "mariadb-11.8.1", - "date": "2025-02-13T04:14:39Z" + "version": "mariadb-11.7.2", + "date": "2025-02-13T04:13:46Z" }, { "name": "glpi-project/glpi", @@ -1141,8 +1146,8 @@ }, { "name": "motioneye-project/motioneye", - "version": "0.43.1b2", - "date": "2024-05-29T20:32:35Z" + "version": "0.42.1", + "date": "2020-06-07T07:27:04Z" }, { "name": "gnmyt/myspeed", @@ -1193,10 +1198,5 @@ "name": "sct/overseerr", "version": "preview-test-node-18", "date": "2023-11-06T10:21:37Z" - }, - { - "name": "deepch/RTSPtoWeb", - "version": "v2.4.3", - "date": "2023-03-29T12:05:02Z" } ] From da5b00359db8008a5c16775f441e16c287a1c9e1 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 19 Mar 2025 09:15:53 +0100 Subject: [PATCH 153/258] Snipe-IT: Remove composer update & add no interaction for install (#3256) --- ct/snipeit.sh | 2 +- install/snipeit-install.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ct/snipeit.sh b/ct/snipeit.sh index 592e920bf..366ea2867 100644 --- a/ct/snipeit.sh +++ b/ct/snipeit.sh @@ -49,7 +49,7 @@ function update_script() { cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads cd /opt/snipe-it/ export COMPOSER_ALLOW_SUPERUSER=1 - $STD composer install --no-dev --prefer-source + $STD composer install --no-dev --optimize-autoloader --no-interaction $STD composer dump-autoload $STD php artisan migrate --force $STD php artisan config:clear diff --git a/install/snipeit-install.sh b/install/snipeit-install.sh index 5976f71c9..3da8f6e61 100644 --- a/install/snipeit-install.sh +++ b/install/snipeit-install.sh @@ -58,8 +58,8 @@ sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \ chown -R www-data: /opt/snipe-it chmod -R 755 /opt/snipe-it export COMPOSER_ALLOW_SUPERUSER=1 -$STD composer update --no-plugins --no-scripts -$STD composer install --no-dev +#$STD composer update --no-plugins --no-scripts +$STD composer install --no-dev --optimize-autoloader --no-interaction $STD php artisan key:generate --force echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed SnipeIT" From e58dcb7a046d1bae2edfea04fc8bd05b1bbe607c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 09:16:47 +0100 Subject: [PATCH 154/258] Update CHANGELOG.md (#3257) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3025514dc..b516793f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Snipe-IT: Remove composer update & add no interaction for install [@MickLesk](https://github.com/MickLesk) ([#3256](https://github.com/community-scripts/ProxmoxVE/pull/3256)) - Fluid-Calendar: Remove unneeded $STD in update [@MickLesk](https://github.com/MickLesk) ([#3250](https://github.com/community-scripts/ProxmoxVE/pull/3250)) ## 2025-03-18 From 1dc1165894119c664a58f55e375c52f4a00d7323 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:21:10 +0100 Subject: [PATCH 155/258] License VED to VE (#3258) --- ct/npmplus.sh | 2 +- ct/paperless-gpt.sh | 2 +- install/paperless-gpt-install.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ct/npmplus.sh b/ct/npmplus.sh index b43129820..cbc4682ed 100644 --- a/ct/npmplus.sh +++ b/ct/npmplus.sh @@ -2,7 +2,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2025 community-scripts ORG # Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/ZoeyVid/NPMplus APP="NPMplus" diff --git a/ct/paperless-gpt.sh b/ct/paperless-gpt.sh index d282010b0..be6760ba9 100644 --- a/ct/paperless-gpt.sh +++ b/ct/paperless-gpt.sh @@ -2,7 +2,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2025 community-scripts ORG # Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/icereed/paperless-gpt APP="Paperless-GPT" diff --git a/install/paperless-gpt-install.sh b/install/paperless-gpt-install.sh index 44394c289..aa10514c5 100644 --- a/install/paperless-gpt-install.sh +++ b/install/paperless-gpt-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2025 community-scripts ORG # Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/icereed/paperless-gpt source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" From 6072e72974337aa4bfa6ad7dfaa05b691aef3610 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:45:02 +0100 Subject: [PATCH 156/258] Update CHANGELOG.md (#3259) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b516793f6..dcf9d7506 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts + - License url VED to VE [@bvdberg01](https://github.com/bvdberg01) ([#3258](https://github.com/community-scripts/ProxmoxVE/pull/3258)) + - #### 🐞 Bug Fixes - Snipe-IT: Remove composer update & add no interaction for install [@MickLesk](https://github.com/MickLesk) ([#3256](https://github.com/community-scripts/ProxmoxVE/pull/3256)) From 6fa198147b08f6db813b0dcbe228ce8419ed8ecb Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Wed, 19 Mar 2025 12:04:58 +0100 Subject: [PATCH 157/258] JSON editor note fix (#3260) --- .../src/app/json-editor/_components/Note.tsx | 234 ++++++++++-------- 1 file changed, 127 insertions(+), 107 deletions(-) diff --git a/frontend/src/app/json-editor/_components/Note.tsx b/frontend/src/app/json-editor/_components/Note.tsx index 3242b5141..5827285c2 100644 --- a/frontend/src/app/json-editor/_components/Note.tsx +++ b/frontend/src/app/json-editor/_components/Note.tsx @@ -1,11 +1,11 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, } from "@/components/ui/select"; import { AlertColors } from "@/config/siteConfig"; import { cn } from "@/lib/utils"; @@ -15,116 +15,136 @@ import { ScriptSchema, type Script } from "../_schemas/schemas"; import { memo, useCallback, useRef } from "react"; type NoteProps = { - script: Script; - setScript: (script: Script) => void; - setIsValid: (isValid: boolean) => void; - setZodErrors: (zodErrors: z.ZodError | null) => void; + script: Script; + setScript: (script: Script) => void; + setIsValid: (isValid: boolean) => void; + setZodErrors: (zodErrors: z.ZodError | null) => void; }; function Note({ - script, - setScript, - setIsValid, - setZodErrors, + script, + setScript, + setIsValid, + setZodErrors, }: NoteProps) { - const inputRefs = useRef<(HTMLInputElement | null)[]>([]); + const inputRefs = useRef<(HTMLInputElement | null)[]>([]); - const addNote = useCallback(() => { - setScript({ - ...script, - notes: [...script.notes, { text: "", type: "" }], - }); - }, [script, setScript]); + const addNote = useCallback(() => { + setScript({ + ...script, + notes: [...script.notes, { text: "", type: "" }], + }); + }, [script, setScript]); - const updateNote = useCallback(( - index: number, - key: keyof Script["notes"][number], - value: string, - ) => { - const updated: Script = { - ...script, - notes: script.notes.map((note, i) => - i === index ? { ...note, [key]: value } : note, - ), - }; - const result = ScriptSchema.safeParse(updated); - setIsValid(result.success); - setZodErrors(result.success ? null : result.error); - setScript(updated); - // Restore focus after state update - if (key === "text") { - setTimeout(() => { - inputRefs.current[index]?.focus(); - }, 0); - } - }, [script, setScript, setIsValid, setZodErrors]); + const updateNote = useCallback(( + index: number, + key: keyof Script["notes"][number], + value: string, + ) => { + const updated: Script = { + ...script, + notes: script.notes.map((note, i) => + i === index ? { ...note, [key]: value } : note, + ), + }; + const result = ScriptSchema.safeParse(updated); + setIsValid(result.success); + setZodErrors(result.success ? null : result.error); + setScript(updated); + // Restore focus after state update + if (key === "text") { + setTimeout(() => { + inputRefs.current[index]?.focus(); + }, 0); + } + }, [script, setScript, setIsValid, setZodErrors]); - const removeNote = useCallback((index: number) => { - setScript({ - ...script, - notes: script.notes.filter((_, i) => i !== index), - }); - }, [script, setScript]); + const removeNote = useCallback((index: number) => { + setScript({ + ...script, + notes: script.notes.filter((_, i) => i !== index), + }); + }, [script, setScript]); - const NoteItem = memo( - ({ note, index }: { note: Script["notes"][number]; index: number }) => ( -
- updateNote(index, "text", e.target.value)} - ref={(el) => { - inputRefs.current[index] = el; - }} - /> - - -
- ), - ); - - NoteItem.displayName = 'NoteItem'; - - return ( - <> -

Notes

- {script.notes.map((note, index) => ( - - ))} - - - ); + + + ); } -export default memo(Note); +const NoteItem = memo( + ({ + note, + index, + updateNote, + removeNote, + }: { + note: Script["notes"][number]; + index: number; + updateNote: (index: number, key: keyof Script["notes"][number], value: string) => void; + removeNote: (index: number) => void; + }) => { + const inputRef = useRef(null); + + const handleTextChange = useCallback((e: React.ChangeEvent) => { + updateNote(index, "text", e.target.value); + setTimeout(() => { + inputRef.current?.focus(); + }, 0); + }, [index, updateNote]); + + return ( +
+ + + +
+ ); + } +); + +NoteItem.displayName = 'NoteItem'; + + +export default memo(Note); \ No newline at end of file From 9c2522630feebabd37c1b21baa1ead8475aa6ffd Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 12:11:02 +0100 Subject: [PATCH 158/258] Update CHANGELOG.md (#3261) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcf9d7506..0c26e96b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ All LXC instances created using this repository come pre-installed with Midnight - Snipe-IT: Remove composer update & add no interaction for install [@MickLesk](https://github.com/MickLesk) ([#3256](https://github.com/community-scripts/ProxmoxVE/pull/3256)) - Fluid-Calendar: Remove unneeded $STD in update [@MickLesk](https://github.com/MickLesk) ([#3250](https://github.com/community-scripts/ProxmoxVE/pull/3250)) +### 🌐 Website + + - #### 🐞 Bug Fixes + + - JSON editor note fix [@bvdberg01](https://github.com/bvdberg01) ([#3260](https://github.com/community-scripts/ProxmoxVE/pull/3260)) + ## 2025-03-18 ### πŸ†• New Scripts From 8c8412c7f85ed074b227ff64eb0560b7de7f247a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:17:12 +0100 Subject: [PATCH 159/258] Update versions.json (#3262) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 94 +++++++++++++++--------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 9d6ae5977..112e31867 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,39 @@ [ + { + "name": "Luligu/matterbridge", + "version": "2.2.5", + "date": "2025-03-19T09:11:26Z" + }, + { + "name": "forgejo/forgejo", + "version": "v7.0.14", + "date": "2025-03-19T08:53:16Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.0.0", + "date": "2025-03-19T08:16:12Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.3.0p29", + "date": "2025-03-19T07:42:50Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1665", + "date": "2025-03-19T05:58:42Z" + }, + { + "name": "StarFleetCPTN/GoMFT", + "version": "v0.1.16", + "date": "2025-03-19T04:30:53Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-19T01:59:46Z" + }, { "name": "pocket-id/pocket-id", "version": "v0.42.1", @@ -9,26 +44,21 @@ "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-18T20:28:40Z" - }, { "name": "esphome/esphome", "version": "2025.2.2", "date": "2025-03-03T08:23:30Z" }, + { + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" + }, { "name": "dotnetfactory/fluid-calendar", "version": "v1.2.2", "date": "2025-03-18T18:47:36Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v9.33.1", - "date": "2025-03-18T17:26:41Z" - }, { "name": "zitadel/zitadel", "version": "v2.66.14", @@ -64,6 +94,11 @@ "version": "n8n@1.83.2", "date": "2025-03-14T15:43:23Z" }, + { + "name": "zabbix/zabbix", + "version": "7.2.5rc1", + "date": "2025-03-18T14:10:32Z" + }, { "name": "openobserve/openobserve", "version": "v0.14.5-rc4", @@ -71,8 +106,8 @@ }, { "name": "crowdsecurity/crowdsec", - "version": "v1.6.5", - "date": "2025-02-07T13:44:35Z" + "version": "v1.6.6", + "date": "2025-03-18T13:05:01Z" }, { "name": "Radarr/Radarr", @@ -89,16 +124,6 @@ "version": "v24.8", "date": "2025-03-18T07:33:51Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0b1", - "date": "2025-03-18T08:03:25Z" - }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1660", - "date": "2025-03-18T06:10:42Z" - }, { "name": "authelia/authelia", "version": "v4.39.1", @@ -109,11 +134,6 @@ "version": "v0.6.2", "date": "2025-03-18T03:11:33Z" }, - { - "name": "StarFleetCPTN/GoMFT", - "version": "v0.1.15", - "date": "2025-03-18T02:30:29Z" - }, { "name": "advplyr/audiobookshelf", "version": "v2.20.0", @@ -124,11 +144,6 @@ "version": "v25.03.3", "date": "2025-03-17T20:55:37Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "semaphoreui/semaphore", "version": "v2.13.0", @@ -449,11 +464,6 @@ "version": "v0.107.57", "date": "2025-02-20T14:58:55Z" }, - { - "name": "Luligu/matterbridge", - "version": "2.2.4", - "date": "2025-03-10T10:40:00Z" - }, { "name": "icereed/paperless-gpt", "version": "v0.13.0", @@ -689,11 +699,6 @@ "version": "v3.3.4", "date": "2025-02-25T10:18:58Z" }, - { - "name": "zabbix/zabbix", - "version": "7.2.4", - "date": "2025-02-25T09:35:54Z" - }, { "name": "schlagmichdoch/PairDrop", "version": "v1.11.2", @@ -849,11 +854,6 @@ "version": "v0.15.0", "date": "2025-02-08T18:45:30Z" }, - { - "name": "forgejo/forgejo", - "version": "v10.0.1", - "date": "2025-02-08T13:17:20Z" - }, { "name": "bluenviron/mediamtx", "version": "v1.11.3", From 1035318f84d073396a162eb123fdd83106ed461f Mon Sep 17 00:00:00 2001 From: Chris <67816022+vhsdream@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:47:00 -0400 Subject: [PATCH 160/258] FluidCalendar: Switch to safer DB operations (#3270) --- ct/fluid-calendar.sh | 2 +- install/fluid-calendar-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/fluid-calendar.sh b/ct/fluid-calendar.sh index 938bc60b0..4194a36b5 100644 --- a/ct/fluid-calendar.sh +++ b/ct/fluid-calendar.sh @@ -48,7 +48,7 @@ function update_script() { export NEXT_TELEMETRY_DISABLED=1 $STD npm install --legacy-peer-deps $STD npm run prisma:generate - $STD npm run prisma:migrate + $STD npx prisma migrate deploy $STD npm run build:os msg_ok "Updated $APP to v${RELEASE}" diff --git a/install/fluid-calendar-install.sh b/install/fluid-calendar-install.sh index 5cc70f032..82a96a394 100644 --- a/install/fluid-calendar-install.sh +++ b/install/fluid-calendar-install.sh @@ -74,7 +74,7 @@ export NEXT_TELEMETRY_DISABLED=1 cd /opt/fluid-calendar $STD npm install --legacy-peer-deps $STD npm run prisma:generate -$STD npm run prisma:migrate +$STD npx prisma migrate deploy $STD npm run build:os msg_ok "Setup ${APPLICATION}" From 646aecc4da904d7f1c1eb51583aa02846403848c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:49:10 +0100 Subject: [PATCH 161/258] Update CHANGELOG.md (#3271) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c26e96b9..b1acb3a9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,10 @@ All LXC instances created using this repository come pre-installed with Midnight - Snipe-IT: Remove composer update & add no interaction for install [@MickLesk](https://github.com/MickLesk) ([#3256](https://github.com/community-scripts/ProxmoxVE/pull/3256)) - Fluid-Calendar: Remove unneeded $STD in update [@MickLesk](https://github.com/MickLesk) ([#3250](https://github.com/community-scripts/ProxmoxVE/pull/3250)) + - #### πŸ’₯ Breaking Changes + + - FluidCalendar: Switch to safer DB operations [@vhsdream](https://github.com/vhsdream) ([#3270](https://github.com/community-scripts/ProxmoxVE/pull/3270)) + ### 🌐 Website - #### 🐞 Bug Fixes From 95f7680e07e4d7b7796877fdeea395cedbd6a2ee Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 07:00:25 +0100 Subject: [PATCH 162/258] Update versions.json (#3272) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 96 +++++++++++++++--------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 112e31867..d22bb67f0 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,49 @@ [ + { + "name": "ellite/Wallos", + "version": "v2.47.1", + "date": "2025-03-19T23:30:33Z" + }, + { + "name": "influxdata/influxdb", + "version": "v3.0.0-0.beta.1", + "date": "2025-03-19T22:25:30Z" + }, + { + "name": "esphome/esphome", + "version": "2025.2.2", + "date": "2025-03-03T08:23:30Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-19T20:32:24Z" + }, + { + "name": "NodeBB/NodeBB", + "version": "v4.2.0", + "date": "2025-03-19T18:34:01Z" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.58", + "date": "2025-03-19T16:29:42Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.0.2", + "date": "2025-03-19T14:47:05Z" + }, + { + "name": "seanmorley15/AdventureLog", + "version": "v0.9.0", + "date": "2025-03-19T13:30:02Z" + }, + { + "name": "hakimel/reveal.js", + "version": "5.2.0", + "date": "2025-03-19T11:03:56Z" + }, { "name": "Luligu/matterbridge", "version": "2.2.5", @@ -9,11 +54,6 @@ "version": "v7.0.14", "date": "2025-03-19T08:53:16Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.0.0", - "date": "2025-03-19T08:16:12Z" - }, { "name": "Checkmk/checkmk", "version": "v2.3.0p29", @@ -29,11 +69,6 @@ "version": "v0.1.16", "date": "2025-03-19T04:30:53Z" }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-19T01:59:46Z" - }, { "name": "pocket-id/pocket-id", "version": "v0.42.1", @@ -44,11 +79,6 @@ "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "esphome/esphome", - "version": "2025.2.2", - "date": "2025-03-03T08:23:30Z" - }, { "name": "keycloak/keycloak", "version": "26.1.4", @@ -91,8 +121,8 @@ }, { "name": "n8n-io/n8n", - "version": "n8n@1.83.2", - "date": "2025-03-14T15:43:23Z" + "version": "n8n@1.84.0", + "date": "2025-03-17T13:58:36Z" }, { "name": "zabbix/zabbix", @@ -389,11 +419,6 @@ "version": "v1.16.12", "date": "2024-12-02T08:46:29Z" }, - { - "name": "NodeBB/NodeBB", - "version": "v4.1.1", - "date": "2025-03-12T23:10:23Z" - }, { "name": "diced/zipline", "version": "v4.0.1", @@ -459,11 +484,6 @@ "version": "v1.10.3", "date": "2025-03-10T20:36:59Z" }, - { - "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.57", - "date": "2025-02-20T14:58:55Z" - }, { "name": "icereed/paperless-gpt", "version": "v0.13.0", @@ -534,11 +554,6 @@ "version": "v1.4.5", "date": "2025-03-06T19:43:48Z" }, - { - "name": "ellite/Wallos", - "version": "v2.46.1", - "date": "2025-03-06T16:29:30Z" - }, { "name": "eclipse-mosquitto/mosquitto", "version": "v2.0.21", @@ -949,11 +964,6 @@ "version": "0.17.1", "date": "2025-01-15T19:13:33Z" }, - { - "name": "influxdata/influxdb", - "version": "v1.10.8", - "date": "2025-01-15T09:31:05Z" - }, { "name": "linkwarden/linkwarden", "version": "v2.9.3", @@ -974,11 +984,6 @@ "version": "v25.1.0", "date": "2025-01-10T18:14:54Z" }, - { - "name": "seanmorley15/AdventureLog", - "version": "v0.8.0", - "date": "2025-01-08T14:27:50Z" - }, { "name": "nicolargo/glances", "version": "v4.3.0.8", @@ -1150,7 +1155,7 @@ "date": "2020-06-07T07:27:04Z" }, { - "name": "gnmyt/myspeed", + "name": "gnmyt/MySpeed", "version": "v1.0.9", "date": "2024-05-21T22:15:33Z" }, @@ -1169,11 +1174,6 @@ "version": "v4.1.2", "date": "2024-05-04T08:06:50Z" }, - { - "name": "hakimel/reveal.js", - "version": "5.1.0", - "date": "2024-04-11T07:03:04Z" - }, { "name": "thelounge/thelounge-deb", "version": "v4.4.3", From 8ffd763b94156793443c79a8f8d6f6deb3b21d00 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:21:38 +0100 Subject: [PATCH 163/258] Update CHANGELOG.md (#3274) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1acb3a9c..b650d81cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-20 + ## 2025-03-19 ### πŸš€ Updated Scripts From dc269dd92bc211fe68a99c3afe55fb61308405f1 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:29:58 +0100 Subject: [PATCH 164/258] Netdata: Update to newer deb File (#3276) --- misc/netdata.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misc/netdata.sh b/misc/netdata.sh index d04b11f9a..abc1f6e25 100644 --- a/misc/netdata.sh +++ b/misc/netdata.sh @@ -59,9 +59,9 @@ install() { header_info msg_info "Setting up repository" - wget -q https://repo.netdata.cloud/repos/repoconfig/debian/bookworm/netdata-repo_2-2+debian12_all.deb - $STD dpkg -i netdata-repo_2-2+debian12_all.deb - rm -rf netdata-repo_2-2+debian12_all.deb + wget -q https://repo.netdata.cloud/repos/repoconfig/debian/bookworm/netdata-repo_5-1+debian12_all.deb + $STD dpkg -i netdata-repo_5-1+debian12_all.deb + rm -rf netdata-repo_5-1+debian12_all.deb msg_ok "Set up repository" msg_info "Installing Netdata" From 94ff8188e1fd71ea3adb4d54ee055fd3c1e73a6b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:20:13 +0100 Subject: [PATCH 165/258] Update versions.json (#3280) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 116 ++++++++++++++--------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index d22bb67f0..43bf43669 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,54 @@ [ + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-20T10:33:53Z" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v0.44.3", + "date": "2025-03-20T09:43:56Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.502", + "date": "2025-03-18T15:02:59Z" + }, + { + "name": "clusterzx/paperless-ai", + "version": "v2.7.5", + "date": "2025-03-20T08:45:10Z" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w11-4.12.0", + "date": "2025-03-14T20:04:02Z" + }, + { + "name": "jupyter/notebook", + "version": "@jupyter-notebook/ui-components@7.4.0-beta.2", + "date": "2025-03-20T07:41:24Z" + }, + { + "name": "evcc-io/evcc", + "version": "0.201.1", + "date": "2025-03-20T06:59:18Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1669", + "date": "2025-03-20T05:56:41Z" + }, + { + "name": "esphome/esphome", + "version": "2025.3.0", + "date": "2025-03-20T04:37:16Z" + }, + { + "name": "rabbitmq/rabbitmq-server", + "version": "v4.0.7", + "date": "2025-02-26T19:07:11Z" + }, { "name": "ellite/Wallos", "version": "v2.47.1", @@ -10,14 +60,9 @@ "date": "2025-03-19T22:25:30Z" }, { - "name": "esphome/esphome", - "version": "2025.2.2", - "date": "2025-03-03T08:23:30Z" - }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-19T20:32:24Z" + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "NodeBB/NodeBB", @@ -59,11 +104,6 @@ "version": "v2.3.0p29", "date": "2025-03-19T07:42:50Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1665", - "date": "2025-03-19T05:58:42Z" - }, { "name": "StarFleetCPTN/GoMFT", "version": "v0.1.16", @@ -79,11 +119,6 @@ "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "dotnetfactory/fluid-calendar", "version": "v1.2.2", @@ -104,11 +139,6 @@ "version": "v1.29.3", "date": "2025-03-12T11:56:30Z" }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.502", - "date": "2025-03-18T15:02:59Z" - }, { "name": "element-hq/synapse", "version": "v1.126.0", @@ -154,6 +184,11 @@ "version": "v24.8", "date": "2025-03-18T07:33:51Z" }, + { + "name": "runtipi/runtipi", + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" + }, { "name": "authelia/authelia", "version": "v4.39.1", @@ -249,11 +284,6 @@ "version": "v1.60.0", "date": "2025-03-16T18:39:49Z" }, - { - "name": "evcc-io/evcc", - "version": "0.201.0", - "date": "2025-03-16T16:59:18Z" - }, { "name": "BookStackApp/BookStack", "version": "v25.02.1", @@ -309,11 +339,6 @@ "version": "v1.6.1", "date": "2025-03-15T17:29:17Z" }, - { - "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" - }, { "name": "msgbyte/tianji", "version": "v1.18.22", @@ -349,11 +374,6 @@ "version": "1.2.31", "date": "2025-03-14T22:04:10Z" }, - { - "name": "Stirling-Tools/Stirling-PDF", - "version": "v0.44.2", - "date": "2025-03-14T21:01:11Z" - }, { "name": "ipfs/kubo", "version": "v0.33.2", @@ -364,11 +384,6 @@ "version": "v2.15.0-beta", "date": "2025-03-14T18:05:28Z" }, - { - "name": "wazuh/wazuh", - "version": "coverity-w11-4.12.0", - "date": "2025-03-14T20:04:02Z" - }, { "name": "homarr-labs/homarr", "version": "v1.11.0", @@ -379,11 +394,6 @@ "version": "flowise@2.2.7-patch.1", "date": "2025-03-14T14:53:53Z" }, - { - "name": "jupyter/notebook", - "version": "v7.3.3", - "date": "2025-03-14T13:41:04Z" - }, { "name": "home-assistant/core", "version": "2025.3.3", @@ -494,11 +504,6 @@ "version": "v1.9.9", "date": "2025-03-10T03:22:11Z" }, - { - "name": "clusterzx/paperless-ai", - "version": "v2.7.4", - "date": "2025-03-09T19:03:53Z" - }, { "name": "caddyserver/caddy", "version": "v2.9.1", @@ -674,11 +679,6 @@ "version": "2025.2.1", "date": "2025-02-27T11:36:11Z" }, - { - "name": "rabbitmq/rabbitmq-server", - "version": "v4.0.7", - "date": "2025-02-26T19:07:11Z" - }, { "name": "cross-seed/cross-seed", "version": "v6.11.2", From a53dc2c84ba772241b4d0c1fc3a6f41750e64f75 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 14:25:18 +0100 Subject: [PATCH 166/258] Update CHANGELOG.md (#3277) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b650d81cc..936bcf243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,12 @@ All LXC instances created using this repository come pre-installed with Midnight ## 2025-03-20 +### πŸš€ Updated Scripts + + - #### ✨ New Features + + - Netdata: Update to newer deb File [@MickLesk](https://github.com/MickLesk) ([#3276](https://github.com/community-scripts/ProxmoxVE/pull/3276)) + ## 2025-03-19 ### πŸš€ Updated Scripts From 2bc441e1f3a344f65f171ce68796d7c128dddae0 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 20 Mar 2025 19:42:22 +0100 Subject: [PATCH 167/258] [core] add gitignore to prevent big pulls (#3278) --- .gitignore | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..84f6d1c71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,76 @@ +# General OS files +.DS_Store +Thumbs.db + +# Editor & IDE files (keeping .vscode settings but ignoring unnecessary metadata) +!.vscode/ +.vscode/*.workspace +.vscode/*.tmp + +# Log and Cache files +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Python-specific exclusions +__pycache__/ +*.pyc +*.pyo +*.pyd +*.venv/ +venv/ +env/ +*.env + +# Node.js dependencies (frontend folder was excluded, but keeping this rule for reference) +frontend/node_modules/ +frontend/.svelte-kit/ +frontend/.turbo/ +frontend/.vite/ +frontend/build/ + +# API and Backend specific exclusions +api/.env +api/__pycache__/ +api/*.sqlite3 + +# Install scripts and temporary files +install/tmp/ +install/*.bak + +# VM and Container-specific exclusions +vm/tmp/ +vm/*.qcow2 +vm/*.img +vm/*.vmdk +vm/*.iso +vm/*.bak + +# Miscellaneous temporary or unnecessary files +*.bak +*.swp +*.swo +*.swn +*.tmp +*.backup + +# JSON configuration backups +json/*.bak +json/*.tmp +json/.vscode/ + +# Ignore compiled binaries or packaged artifacts +*.exe +*.dll +*.bin +*.deb +*.rpm +*.tar.gz +*.zip +*.tgz + +# Ignore repository metadata or Git itself +.git/ +.gitignore From 957da8d06235652152e1196f7ca7fe634ae20121 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 19:55:02 +0100 Subject: [PATCH 168/258] Update CHANGELOG.md (#3285) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 936bcf243..e23133479 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,12 @@ All LXC instances created using this repository come pre-installed with Midnight - Netdata: Update to newer deb File [@MickLesk](https://github.com/MickLesk) ([#3276](https://github.com/community-scripts/ProxmoxVE/pull/3276)) +### 🧰 Maintenance + + - #### ✨ New Features + + - [core] add gitignore to prevent big pulls [@MickLesk](https://github.com/MickLesk) ([#3278](https://github.com/community-scripts/ProxmoxVE/pull/3278)) + ## 2025-03-19 ### πŸš€ Updated Scripts From 395e014dcbe74ec45001305a58d2763a1f118d53 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 06:43:34 +0100 Subject: [PATCH 169/258] Update versions.json (#3292) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 116 ++++++++++++++--------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 43bf43669..7b198eb89 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,63 @@ [ + { + "name": "ipfs/kubo", + "version": "v0.34.0", + "date": "2025-03-20T21:51:05Z" + }, + { + "name": "pocket-id/pocket-id", + "version": "v0.43.1", + "date": "2025-03-20T20:38:06Z" + }, { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-20T10:33:53Z" + "date": "2025-03-20T20:29:19Z" + }, + { + "name": "stonith404/pingvin-share", + "version": "v1.10.4", + "date": "2025-03-20T18:56:10Z" + }, + { + "name": "dotnetfactory/fluid-calendar", + "version": "v1.2.3", + "date": "2025-03-20T17:54:55Z" + }, + { + "name": "ellite/Wallos", + "version": "v2.48.0", + "date": "2025-03-20T16:57:43Z" + }, + { + "name": "HabitRPG/habitica", + "version": "v5.34.4", + "date": "2025-03-20T16:54:45Z" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.58", + "date": "2025-03-19T16:29:42Z" + }, + { + "name": "neo4j/neo4j", + "version": "4.4.42", + "date": "2025-03-20T14:44:17Z" + }, + { + "name": "ZoeyVid/NPMplus", + "version": "2025-03-20-r1", + "date": "2025-03-20T14:32:21Z" + }, + { + "name": "redis/redis", + "version": "8.0-rc1", + "date": "2025-03-11T18:16:27Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.0.3", + "date": "2025-03-20T12:56:27Z" }, { "name": "Stirling-Tools/Stirling-PDF", @@ -49,11 +104,6 @@ "version": "v4.0.7", "date": "2025-02-26T19:07:11Z" }, - { - "name": "ellite/Wallos", - "version": "v2.47.1", - "date": "2025-03-19T23:30:33Z" - }, { "name": "influxdata/influxdb", "version": "v3.0.0-0.beta.1", @@ -69,16 +119,6 @@ "version": "v4.2.0", "date": "2025-03-19T18:34:01Z" }, - { - "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.58", - "date": "2025-03-19T16:29:42Z" - }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.0.2", - "date": "2025-03-19T14:47:05Z" - }, { "name": "seanmorley15/AdventureLog", "version": "v0.9.0", @@ -109,21 +149,11 @@ "version": "v0.1.16", "date": "2025-03-19T04:30:53Z" }, - { - "name": "pocket-id/pocket-id", - "version": "v0.42.1", - "date": "2025-03-18T22:03:53Z" - }, { "name": "Donkie/Spoolman", "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "dotnetfactory/fluid-calendar", - "version": "v1.2.2", - "date": "2025-03-18T18:47:36Z" - }, { "name": "zitadel/zitadel", "version": "v2.66.14", @@ -186,8 +216,8 @@ }, { "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" + "version": "nightly", + "date": "2025-03-18T07:27:47Z" }, { "name": "authelia/authelia", @@ -234,11 +264,6 @@ "version": "v0.92.4", "date": "2025-03-17T16:00:19Z" }, - { - "name": "HabitRPG/habitica", - "version": "v5.34.3", - "date": "2025-03-17T14:20:04Z" - }, { "name": "Graylog2/graylog2-server", "version": "6.2.0-beta.1", @@ -309,11 +334,6 @@ "version": "v0.26.1", "date": "2025-03-16T08:51:41Z" }, - { - "name": "redis/redis", - "version": "8.0-m04", - "date": "2025-03-16T08:12:40Z" - }, { "name": "Kozea/Radicale", "version": "v3.5.0", @@ -374,11 +394,6 @@ "version": "1.2.31", "date": "2025-03-14T22:04:10Z" }, - { - "name": "ipfs/kubo", - "version": "v0.33.2", - "date": "2025-02-14T00:24:56Z" - }, { "name": "paperless-ngx/paperless-ngx", "version": "v2.15.0-beta", @@ -469,11 +484,6 @@ "version": "v0.18.0", "date": "2025-03-11T12:47:22Z" }, - { - "name": "neo4j/neo4j", - "version": "5.26.4", - "date": "2025-03-11T10:52:05Z" - }, { "name": "Ombi-app/Ombi", "version": "v4.47.1", @@ -489,11 +499,6 @@ "version": "v0.0.7-hf1", "date": "2025-03-10T20:49:39Z" }, - { - "name": "stonith404/pingvin-share", - "version": "v1.10.3", - "date": "2025-03-10T20:36:59Z" - }, { "name": "icereed/paperless-gpt", "version": "v0.13.0", @@ -704,11 +709,6 @@ "version": "v12.5.0", "date": "2025-02-25T14:55:50Z" }, - { - "name": "ZoeyVid/NPMplus", - "version": "2025-02-25-r1", - "date": "2025-02-25T13:26:41Z" - }, { "name": "traefik/traefik", "version": "v3.3.4", From 17af4a374a65b02499eaa3648bc02ea98924769a Mon Sep 17 00:00:00 2001 From: Miles Starkenburg Date: Thu, 20 Mar 2025 23:57:49 -0700 Subject: [PATCH 170/258] Proxmox Mail Gateway display name is corrected (#3293) --- frontend/public/json/proxmox-mail-gateway.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/proxmox-mail-gateway.json b/frontend/public/json/proxmox-mail-gateway.json index 55b7ea51a..79d364979 100644 --- a/frontend/public/json/proxmox-mail-gateway.json +++ b/frontend/public/json/proxmox-mail-gateway.json @@ -1,5 +1,5 @@ { - "name": "Promox Mail Gateway", + "name": "Proxmox Mail Gateway", "slug": "proxmox-mail-gateway", "categories": [ 1 From adee6a419bf1e0f712a300820aeb2b25f7142798 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Fri, 21 Mar 2025 10:18:17 +0100 Subject: [PATCH 171/258] Threadfin: add port for website (#3295) --- frontend/public/json/threadfin.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/public/json/threadfin.json b/frontend/public/json/threadfin.json index d7efda799..bea0c5734 100644 --- a/frontend/public/json/threadfin.json +++ b/frontend/public/json/threadfin.json @@ -8,7 +8,7 @@ "type": "ct", "updateable": false, "privileged": false, - "interface_port": null, + "interface_port": 34400, "documentation": null, "website": "https://github.com/Threadfin/Threadfin", "logo": "https://raw.githubusercontent.com/Threadfin/Threadfin/main/html/img/threadfin.png", @@ -31,4 +31,4 @@ "password": null }, "notes": [] -} \ No newline at end of file +} From 28019ac04f77e8851557222f5b976d1d6a74888a Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:44:07 +0100 Subject: [PATCH 172/258] Clarify MTU in advanced Settings. (#3296) * Update build.func * Update build.func --- misc/build.func | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/build.func b/misc/build.func index 9b2d42baa..64309671f 100644 --- a/misc/build.func +++ b/misc/build.func @@ -715,7 +715,7 @@ advanced_settings() { fi echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}" - if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default [1500])" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default [The MTU of your selected vmbr, default is 1500])" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then if [ -z $MTU1 ]; then MTU1="Default" MTU="" From 33bf8c910a8f285ef3b89eb4f7aabc74d58edefd Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 12:00:34 +0100 Subject: [PATCH 173/258] Update CHANGELOG.md (#3294) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e23133479..1b920fde1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,21 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-21 + +### 🧰 Maintenance + + - #### πŸ’Ύ Core + + - Clarify MTU in advanced Settings. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3296](https://github.com/community-scripts/ProxmoxVE/pull/3296)) + +### 🌐 Website + + - #### πŸ“ Script Information + + - Threadfin: add port for website [@MickLesk](https://github.com/MickLesk) ([#3295](https://github.com/community-scripts/ProxmoxVE/pull/3295)) + - Proxmox, rather than Promox [@gringocl](https://github.com/gringocl) ([#3293](https://github.com/community-scripts/ProxmoxVE/pull/3293)) + ## 2025-03-20 ### πŸš€ Updated Scripts From 857cac40af219e71c0793286633d45f6445d59e8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:22:10 +0100 Subject: [PATCH 174/258] Update versions.json (#3301) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 96 +++++++++++++++--------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 7b198eb89..d14fccfd9 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,44 @@ [ + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.59", + "date": "2025-03-21T11:11:39Z" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.5-rc5", + "date": "2025-03-21T10:50:34Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-21T10:32:59Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.1.0", + "date": "2025-03-21T09:17:45Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1", + "date": "2025-01-01T16:15:52Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1672", + "date": "2025-03-21T05:51:00Z" + }, + { + "name": "StarFleetCPTN/GoMFT", + "version": "v0.1.18", + "date": "2025-03-21T04:36:04Z" + }, + { + "name": "jhuckaby/Cronicle", + "version": "v0.9.77", + "date": "2025-03-21T02:25:42Z" + }, { "name": "ipfs/kubo", "version": "v0.34.0", @@ -10,9 +50,9 @@ "date": "2025-03-20T20:38:06Z" }, { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-20T20:29:19Z" + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "stonith404/pingvin-share", @@ -24,6 +64,11 @@ "version": "v1.2.3", "date": "2025-03-20T17:54:55Z" }, + { + "name": "runtipi/runtipi", + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" + }, { "name": "ellite/Wallos", "version": "v2.48.0", @@ -34,11 +79,6 @@ "version": "v5.34.4", "date": "2025-03-20T16:54:45Z" }, - { - "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.58", - "date": "2025-03-19T16:29:42Z" - }, { "name": "neo4j/neo4j", "version": "4.4.42", @@ -54,11 +94,6 @@ "version": "8.0-rc1", "date": "2025-03-11T18:16:27Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.0.3", - "date": "2025-03-20T12:56:27Z" - }, { "name": "Stirling-Tools/Stirling-PDF", "version": "v0.44.3", @@ -89,11 +124,6 @@ "version": "0.201.1", "date": "2025-03-20T06:59:18Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1669", - "date": "2025-03-20T05:56:41Z" - }, { "name": "esphome/esphome", "version": "2025.3.0", @@ -109,11 +139,6 @@ "version": "v3.0.0-0.beta.1", "date": "2025-03-19T22:25:30Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "NodeBB/NodeBB", "version": "v4.2.0", @@ -144,11 +169,6 @@ "version": "v2.3.0p29", "date": "2025-03-19T07:42:50Z" }, - { - "name": "StarFleetCPTN/GoMFT", - "version": "v0.1.16", - "date": "2025-03-19T04:30:53Z" - }, { "name": "Donkie/Spoolman", "version": "v0.22.1", @@ -189,11 +209,6 @@ "version": "7.2.5rc1", "date": "2025-03-18T14:10:32Z" }, - { - "name": "openobserve/openobserve", - "version": "v0.14.5-rc4", - "date": "2025-03-18T13:51:56Z" - }, { "name": "crowdsecurity/crowdsec", "version": "v1.6.6", @@ -214,11 +229,6 @@ "version": "v24.8", "date": "2025-03-18T07:33:51Z" }, - { - "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-03-18T07:27:47Z" - }, { "name": "authelia/authelia", "version": "v4.39.1", @@ -274,11 +284,6 @@ "version": "15.0", "date": "2025-03-17T10:26:18Z" }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.1", - "date": "2025-01-01T16:15:52Z" - }, { "name": "webmin/webmin", "version": "2.303", @@ -664,11 +669,6 @@ "version": "250228-43447fa38", "date": "2025-02-28T15:18:09Z" }, - { - "name": "jhuckaby/Cronicle", - "version": "v0.9.76", - "date": "2025-02-28T03:15:18Z" - }, { "name": "jordan-dalby/ByteStash", "version": "v1.5.7", From 7fb1767993c113629e2489e75fdfd58195610fb0 Mon Sep 17 00:00:00 2001 From: jaykup26 Date: Fri, 21 Mar 2025 09:08:53 -0500 Subject: [PATCH 175/258] Update audiobookshelf.json (#3304) change Audiobookshelf category from "Documents & Notes" to "Media & Streaming" --- frontend/public/json/audiobookshelf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/public/json/audiobookshelf.json b/frontend/public/json/audiobookshelf.json index 062d71ec7..053e48b94 100644 --- a/frontend/public/json/audiobookshelf.json +++ b/frontend/public/json/audiobookshelf.json @@ -2,7 +2,7 @@ "name": "Audiobookshelf", "slug": "audiobookshelf", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", @@ -31,4 +31,4 @@ "password": null }, "notes": [] -} \ No newline at end of file +} From 44a52514568f80ce9c71f1a23998276a6b2a4d46 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:17:28 +0100 Subject: [PATCH 176/258] Update CHANGELOG.md (#3306) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b920fde1..738703472 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information + - Update audiobookshelf.json [@jaykup26](https://github.com/jaykup26) ([#3304](https://github.com/community-scripts/ProxmoxVE/pull/3304)) - Threadfin: add port for website [@MickLesk](https://github.com/MickLesk) ([#3295](https://github.com/community-scripts/ProxmoxVE/pull/3295)) - Proxmox, rather than Promox [@gringocl](https://github.com/gringocl) ([#3293](https://github.com/community-scripts/ProxmoxVE/pull/3293)) From 67bb2b7c89394eda0e234c3b50209ea6f0781b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:53:30 +0100 Subject: [PATCH 177/258] Update repo tree to fix .editorconfig beign ignored. (#3302) * Fix .editorconfig beign ignored * updated * update --- .editorconfig | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..f79a823d7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +; editorconfig.org +root = true + +[*] +charset = utf-8 +continuation_indent_size = 2 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +max_line_length = 120 +tab_width = 2 +; trim_trailing_whitespace = true ; disabled until files are cleaned up + +[*.md] +trim_trailing_whitespace = false From f7762da69c2ad228e3a3efbff06df4b70ce9ea0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:54:09 +0100 Subject: [PATCH 178/258] Build binary ourselves (#3303) --- ct/gomft.sh | 4 +++- install/gomft-install.sh | 15 ++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ct/gomft.sh b/ct/gomft.sh index 5effb2ed7..aba25e05a 100644 --- a/ct/gomft.sh +++ b/ct/gomft.sh @@ -40,8 +40,10 @@ function update_script() { wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file tar -xzf $temp_file cp -rf GoMFT-${RELEASE}/* /opt/gomft + cd /opt/gomft + $STD go mod download + $STD go build -o gomft $STD $HOME/go/bin/templ generate - wget -q "https://github.com/StarFleetCPTN/GoMFT/releases/download/v${RELEASE}/gomft-v${RELEASE}-linux-amd64" -O /opt/gomft/gomft chmod +x /opt/gomft/gomft echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated $APP to ${RELEASE}" diff --git a/install/gomft-install.sh b/install/gomft-install.sh index 72f314bdc..d398cad9e 100644 --- a/install/gomft-install.sh +++ b/install/gomft-install.sh @@ -35,16 +35,17 @@ set -o pipefail msg_ok "Setup Golang" msg_info "Setup ${APPLICATION}" -temp_file2=$(mktemp) +temp_file=$(mktemp) RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file2 -tar -xzf $temp_file2 +wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file +tar -xzf $temp_file mv GoMFT-${RELEASE}/ /opt/gomft cd /opt/gomft -$STD go install github.com/a-h/templ/cmd/templ@latest -wget -q "https://github.com/StarFleetCPTN/GoMFT/releases/download/v${RELEASE}/gomft-v${RELEASE}-linux-amd64" -O gomft -$STD $HOME/go/bin/templ generate +$STD go mod download +$STD go build -o gomft chmod +x gomft +$STD go install github.com/a-h/templ/cmd/templ@latest +$STD $HOME/go/bin/templ generate JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=') cat </opt/gomft/.env @@ -93,7 +94,7 @@ motd_ssh customize msg_info "Cleaning up" -rm -f $temp_file $temp_file2 +rm -f $temp_file $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" From 79e9fd911c955055877a6baef628029f4668ec8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:57:08 +0100 Subject: [PATCH 179/258] GoMFT: Fix build dependencies (#3313) * Fix dependency * Fix dependency * Update install * Formatting --- ct/gomft.sh | 83 +++++++++++++++++++++------------------- install/gomft-install.sh | 23 ++++++----- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/ct/gomft.sh b/ct/gomft.sh index aba25e05a..02bd2f520 100644 --- a/ct/gomft.sh +++ b/ct/gomft.sh @@ -20,48 +20,51 @@ color catch_errors function update_script() { - header_info - check_container_storage - check_container_resources + header_info + check_container_storage + check_container_resources - if [[ ! -d "/opt/gomft" ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then - msg_info "Stopping $APP" - systemctl stop gomft - msg_ok "Stopped $APP" - - msg_info "Updating $APP to ${RELEASE}" - rm -f /opt/gomft/gomft - temp_file=$(mktemp) - wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file - tar -xzf $temp_file - cp -rf GoMFT-${RELEASE}/* /opt/gomft - cd /opt/gomft - $STD go mod download - $STD go build -o gomft - $STD $HOME/go/bin/templ generate - chmod +x /opt/gomft/gomft - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated $APP to ${RELEASE}" - - msg_info "Cleaning Up" - rm -f $temp_file - rm -rf GoMFT-${RELEASE} - msg_ok "Cleanup Complete" - - msg_info "Starting $APP" - systemctl start gomft - msg_ok "Started $APP" - - msg_ok "Update Successful" - else - msg_ok "No update required. ${APP} is already at ${RELEASE}" - fi + if [[ ! -d "/opt/gomft" ]]; then + msg_error "No ${APP} Installation Found!" exit + fi + RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop gomft + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + rm -f /opt/gomft/gomft + temp_file=$(mktemp) + wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file + tar -xzf $temp_file + cp -rf GoMFT-${RELEASE}/* /opt/gomft + cd /opt/gomft + $STD go mod download + $STD go install github.com/a-h/templ/cmd/templ@latest + $STD $HOME/go/bin/templ generate + export CGO_ENABLED=1 + export GOOS=linux + $STD go build -o gomft + chmod +x /opt/gomft/gomft + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Cleaning Up" + rm -f $temp_file + rm -rf GoMFT-${RELEASE} + msg_ok "Cleanup Complete" + + msg_info "Starting $APP" + systemctl start gomft + msg_ok "Started $APP" + + msg_ok "Update Successful" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } start diff --git a/install/gomft-install.sh b/install/gomft-install.sh index d398cad9e..a9596a891 100644 --- a/install/gomft-install.sh +++ b/install/gomft-install.sh @@ -15,13 +15,14 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - sqlite3 \ - rclone \ - tzdata \ - ca-certificates + curl \ + sudo \ + mc \ + sqlite3 \ + rclone \ + tzdata \ + ca-certificates \ + build-essential msg_ok "Installed Dependencies" msg_info "Setting up Golang" @@ -34,7 +35,7 @@ ln -sf /usr/local/go/bin/go /usr/local/bin/go set -o pipefail msg_ok "Setup Golang" -msg_info "Setup ${APPLICATION}" +msg_info "Setup ${APPLICATION} (Patience)" temp_file=$(mktemp) RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file @@ -42,10 +43,12 @@ tar -xzf $temp_file mv GoMFT-${RELEASE}/ /opt/gomft cd /opt/gomft $STD go mod download -$STD go build -o gomft -chmod +x gomft $STD go install github.com/a-h/templ/cmd/templ@latest $STD $HOME/go/bin/templ generate +export CGO_ENABLED=1 +export GOOS=linux +$STD go build -o gomft +chmod +x /opt/gomft/gomft JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=') cat </opt/gomft/.env From 23ea43ecd4c2412cc5a92450240f58ebc3d72112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Fri, 21 Mar 2025 19:24:21 +0100 Subject: [PATCH 180/258] Correctly add repo to mysql.list (#3315) --- install/mysql-install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/install/mysql-install.sh b/install/mysql-install.sh index e70c7975c..abb7b5c93 100644 --- a/install/mysql-install.sh +++ b/install/mysql-install.sh @@ -33,7 +33,11 @@ fi msg_info "Installing MySQL" curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | gpg --dearmor -o /usr/share/keyrings/mysql.gpg -echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/debian $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list +if [ "$(lsb_release -si)" = "Debian" ]; then + echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/debian $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list +else + echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/ubuntu $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list +fi $STD apt-get update export DEBIAN_FRONTEND=noninteractive $STD apt-get install -y \ From 9573192a4d2e8b22b8b9d5fb25f540355611af4f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 19:30:57 +0100 Subject: [PATCH 181/258] Update CHANGELOG.md (#3308) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 738703472..35a6a7fe5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,14 @@ All LXC instances created using this repository come pre-installed with Midnight ## 2025-03-21 +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - MySQL: Correctly add repo to mysql.list [@tremor021](https://github.com/tremor021) ([#3315](https://github.com/community-scripts/ProxmoxVE/pull/3315)) + - GoMFT: Fix build dependencies [@tremor021](https://github.com/tremor021) ([#3313](https://github.com/community-scripts/ProxmoxVE/pull/3313)) + - GoMFT: Don't rely on binaries from github [@tremor021](https://github.com/tremor021) ([#3303](https://github.com/community-scripts/ProxmoxVE/pull/3303)) + ### 🧰 Maintenance - #### πŸ’Ύ Core @@ -26,9 +34,9 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ“ Script Information - - Update audiobookshelf.json [@jaykup26](https://github.com/jaykup26) ([#3304](https://github.com/community-scripts/ProxmoxVE/pull/3304)) - - Threadfin: add port for website [@MickLesk](https://github.com/MickLesk) ([#3295](https://github.com/community-scripts/ProxmoxVE/pull/3295)) - Proxmox, rather than Promox [@gringocl](https://github.com/gringocl) ([#3293](https://github.com/community-scripts/ProxmoxVE/pull/3293)) + - Audiobookshelf: Fix category on website [@jaykup26](https://github.com/jaykup26) ([#3304](https://github.com/community-scripts/ProxmoxVE/pull/3304)) + - Threadfin: add port for website [@MickLesk](https://github.com/MickLesk) ([#3295](https://github.com/community-scripts/ProxmoxVE/pull/3295)) ## 2025-03-20 From 6193164e3b97f4b18a690a734af2441e7c63200f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 20:08:51 +0100 Subject: [PATCH 182/258] Bump next from 15.1.3 to 15.2.3 in /frontend (#3316) Bumps [next](https://github.com/vercel/next.js) from 15.1.3 to 15.2.3. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.1.3...v15.2.3) --- updated-dependencies: - dependency-name: next dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 90 +++++++++++++++++++++----------------- frontend/package.json | 2 +- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3d73671df..d4d35bfd3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -33,7 +33,7 @@ "fuse.js": "^7.0.0", "lucide-react": "^0.453.0", "mini-svg-data-uri": "^1.4.4", - "next": "15.1.3", + "next": "15.2.3", "next-themes": "^0.3.0", "nuqs": "^2.1.1", "pocketbase": "^0.21.4", @@ -1549,9 +1549,10 @@ "license": "MIT" }, "node_modules/@next/env": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz", - "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==" + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.3.tgz", + "integrity": "sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { "version": "15.0.2", @@ -1594,12 +1595,13 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz", - "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.3.tgz", + "integrity": "sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1609,12 +1611,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz", - "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.3.tgz", + "integrity": "sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1624,12 +1627,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz", - "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.3.tgz", + "integrity": "sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1639,12 +1643,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz", - "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.3.tgz", + "integrity": "sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1654,12 +1659,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz", - "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.3.tgz", + "integrity": "sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1669,12 +1675,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz", - "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.3.tgz", + "integrity": "sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1684,12 +1691,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz", - "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.3.tgz", + "integrity": "sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1699,12 +1707,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz", - "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.3.tgz", + "integrity": "sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -7107,11 +7116,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz", - "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.3.tgz", + "integrity": "sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==", + "license": "MIT", "dependencies": { - "@next/env": "15.1.3", + "@next/env": "15.2.3", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -7126,14 +7136,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.1.3", - "@next/swc-darwin-x64": "15.1.3", - "@next/swc-linux-arm64-gnu": "15.1.3", - "@next/swc-linux-arm64-musl": "15.1.3", - "@next/swc-linux-x64-gnu": "15.1.3", - "@next/swc-linux-x64-musl": "15.1.3", - "@next/swc-win32-arm64-msvc": "15.1.3", - "@next/swc-win32-x64-msvc": "15.1.3", + "@next/swc-darwin-arm64": "15.2.3", + "@next/swc-darwin-x64": "15.2.3", + "@next/swc-linux-arm64-gnu": "15.2.3", + "@next/swc-linux-arm64-musl": "15.2.3", + "@next/swc-linux-x64-gnu": "15.2.3", + "@next/swc-linux-x64-musl": "15.2.3", + "@next/swc-win32-arm64-msvc": "15.2.3", + "@next/swc-win32-x64-msvc": "15.2.3", "sharp": "^0.33.5" }, "peerDependencies": { diff --git a/frontend/package.json b/frontend/package.json index 3457b6a22..97a41e9a0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -44,7 +44,7 @@ "fuse.js": "^7.0.0", "lucide-react": "^0.453.0", "mini-svg-data-uri": "^1.4.4", - "next": "15.1.3", + "next": "15.2.3", "next-themes": "^0.3.0", "nuqs": "^2.1.1", "pocketbase": "^0.21.4", From d17eb8e6a1d4753f0649ac97d8fed54294dcbc32 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Fri, 21 Mar 2025 20:36:01 +0100 Subject: [PATCH 183/258] Omada zulu 8 to 21 (#3318) * change zulu8 to zulu21 * Add check in updatescript --- ct/omada.sh | 13 ++++++++++++- install/omada-install.sh | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ct/omada.sh b/ct/omada.sh index 9a8da6bd7..5a7d881ad 100644 --- a/ct/omada.sh +++ b/ct/omada.sh @@ -42,6 +42,16 @@ function update_script() { $STD apt-get install -y --only-upgrade mongodb-org msg_ok "Updated MongoDB to $MONGODB_VERSION" + msg_info "Checking if right Azul Zulu Java is installed" + java_version=$(java -version 2>&1 | awk -F[\"_] '/version/ {print $2}') + if [[ "$java_version" =~ ^1\.8\.* ]]; then + $STD apt-get remove --purge -y zulu8-jdk + $STD apt-get -y install zulu21-jdk + msg_ok "Updated Azul Zulu Java to 21" + else + msg_ok "Azul Zulu Java 21 already installed" + fi + msg_info "Updating Omada Controller" latest_url=$(curl -s "https://support.omadanetworks.com/en/download/software/omada-controller/" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) latest_version=$(basename "$latest_url") @@ -51,7 +61,8 @@ function update_script() { fi wget -qL ${latest_url} - dpkg -i ${latest_version} + export DEBIAN_FRONTEND=noninteractive + $STD dpkg -i ${latest_version} rm -rf ${latest_version} msg_ok "Updated Omada Controller" } diff --git a/install/omada-install.sh b/install/omada-install.sh index c2c76cdc4..ef29fa15d 100644 --- a/install/omada-install.sh +++ b/install/omada-install.sh @@ -34,7 +34,7 @@ wget -qO /etc/apt/trusted.gpg.d/zulu-repo.asc "https://keyserver.ubuntu.com/pks/ wget -q https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb $STD dpkg -i zulu-repo_1.0.0-3_all.deb $STD apt-get update -$STD apt-get -y install zulu8-jdk +$STD apt-get -y install zulu21-jdk msg_ok "Installed Azul Zulu Java" msg_info "Installing libssl (if needed)" From f00cdff1717bf66332aef79459213b4e692be9ee Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 20:44:29 +0100 Subject: [PATCH 184/258] Update CHANGELOG.md (#3317) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35a6a7fe5..30ba1812a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - Omada zulu 8 to 21 [@bvdberg01](https://github.com/bvdberg01) ([#3318](https://github.com/community-scripts/ProxmoxVE/pull/3318)) - MySQL: Correctly add repo to mysql.list [@tremor021](https://github.com/tremor021) ([#3315](https://github.com/community-scripts/ProxmoxVE/pull/3315)) - GoMFT: Fix build dependencies [@tremor021](https://github.com/tremor021) ([#3313](https://github.com/community-scripts/ProxmoxVE/pull/3313)) - GoMFT: Don't rely on binaries from github [@tremor021](https://github.com/tremor021) ([#3303](https://github.com/community-scripts/ProxmoxVE/pull/3303)) @@ -32,6 +33,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### 🌐 Website + - Bump next from 15.1.3 to 15.2.3 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3316](https://github.com/community-scripts/ProxmoxVE/pull/3316)) + - #### πŸ“ Script Information - Proxmox, rather than Promox [@gringocl](https://github.com/gringocl) ([#3293](https://github.com/community-scripts/ProxmoxVE/pull/3293)) From 6af3b07e76638cdf92a9c0e6c1f2907507b7b630 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Fri, 21 Mar 2025 21:01:56 +0100 Subject: [PATCH 185/258] jdk to jre (#3319) --- ct/omada.sh | 2 +- install/omada-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/omada.sh b/ct/omada.sh index 5a7d881ad..80fd2ed9a 100644 --- a/ct/omada.sh +++ b/ct/omada.sh @@ -46,7 +46,7 @@ function update_script() { java_version=$(java -version 2>&1 | awk -F[\"_] '/version/ {print $2}') if [[ "$java_version" =~ ^1\.8\.* ]]; then $STD apt-get remove --purge -y zulu8-jdk - $STD apt-get -y install zulu21-jdk + $STD apt-get -y install zulu21-jre-headless msg_ok "Updated Azul Zulu Java to 21" else msg_ok "Azul Zulu Java 21 already installed" diff --git a/install/omada-install.sh b/install/omada-install.sh index ef29fa15d..e6d8ec0b1 100644 --- a/install/omada-install.sh +++ b/install/omada-install.sh @@ -34,7 +34,7 @@ wget -qO /etc/apt/trusted.gpg.d/zulu-repo.asc "https://keyserver.ubuntu.com/pks/ wget -q https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb $STD dpkg -i zulu-repo_1.0.0-3_all.deb $STD apt-get update -$STD apt-get -y install zulu21-jdk +$STD apt-get -y install zulu21-jre-headless msg_ok "Installed Azul Zulu Java" msg_info "Installing libssl (if needed)" From 48614f4f71174ab2d2dc6dc6289ce1ff8f24148a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 21:02:36 +0100 Subject: [PATCH 186/258] Update CHANGELOG.md (#3320) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30ba1812a..dbb5b7d05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts + - Omada jdk to jre [@bvdberg01](https://github.com/bvdberg01) ([#3319](https://github.com/community-scripts/ProxmoxVE/pull/3319)) + - #### 🐞 Bug Fixes - Omada zulu 8 to 21 [@bvdberg01](https://github.com/bvdberg01) ([#3318](https://github.com/community-scripts/ProxmoxVE/pull/3318)) From 6fcd21a7b7559902b3e31180336afda8f13374ab Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Sat, 22 Mar 2025 06:56:32 +0100 Subject: [PATCH 187/258] Cronicle: add missing gnupg package (#3323) --- install/cronicle-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/cronicle-install.sh b/install/cronicle-install.sh index 9d92cce0e..0d0bc4ea8 100644 --- a/install/cronicle-install.sh +++ b/install/cronicle-install.sh @@ -17,7 +17,8 @@ msg_info "Installing Dependencies" $STD apt-get install -y \ curl \ sudo \ - mc + mc \ + gnupg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" From ed15dce6855505895f7794c6804491d0d14c344b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 06:56:51 +0100 Subject: [PATCH 188/258] Update versions.json (#3327) --- frontend/public/json/versions.json | 144 ++++++++++++++--------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index d14fccfd9..a663dd31f 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,74 @@ [ + { + "name": "ollama/ollama", + "version": "v0.6.3-rc0", + "date": "2025-03-21T21:47:13Z" + }, + { + "name": "netbox-community/netbox", + "version": "v4.2.6", + "date": "2025-03-21T21:20:29Z" + }, + { + "name": "sabnzbd/sabnzbd", + "version": "4.4.1", + "date": "2024-12-20T13:21:31Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-21T20:27:25Z" + }, + { + "name": "home-assistant/core", + "version": "2025.3.4", + "date": "2025-03-21T20:22:46Z" + }, + { + "name": "leiweibau/Pi.Alert", + "version": "v2025-03-21", + "date": "2025-03-21T19:50:46Z" + }, + { + "name": "clusterzx/paperless-ai", + "version": "v2.7.6", + "date": "2025-03-21T19:24:53Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "develop-20250222.4", + "date": "2025-02-22T16:26:15Z" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.12.0", + "date": "2025-03-21T19:14:59Z" + }, + { + "name": "influxdata/influxdb", + "version": "v1.12.0rc0", + "date": "2025-03-21T17:24:38Z" + }, + { + "name": "documenso/documenso", + "version": "v1.10.0-rc.0", + "date": "2025-03-21T16:23:23Z" + }, + { + "name": "ZoeyVid/NPMplus", + "version": "2025-03-21-r1", + "date": "2025-03-21T14:54:00Z" + }, + { + "name": "forgejo/forgejo", + "version": "v10.0.2", + "date": "2025-03-21T12:34:48Z" + }, + { + "name": "photoprism/photoprism", + "version": "250321-57590c48b", + "date": "2025-03-21T11:48:16Z" + }, { "name": "AdguardTeam/AdGuardHome", "version": "v0.107.59", @@ -9,11 +79,6 @@ "version": "v0.14.5-rc5", "date": "2025-03-21T10:50:34Z" }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-21T10:32:59Z" - }, { "name": "zwave-js/zwave-js-ui", "version": "v10.1.0", @@ -66,8 +131,8 @@ }, { "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" + "version": "nightly", + "date": "2025-03-20T17:49:45Z" }, { "name": "ellite/Wallos", @@ -84,11 +149,6 @@ "version": "4.4.42", "date": "2025-03-20T14:44:17Z" }, - { - "name": "ZoeyVid/NPMplus", - "version": "2025-03-20-r1", - "date": "2025-03-20T14:32:21Z" - }, { "name": "redis/redis", "version": "8.0-rc1", @@ -104,11 +164,6 @@ "version": "jenkins-2.502", "date": "2025-03-18T15:02:59Z" }, - { - "name": "clusterzx/paperless-ai", - "version": "v2.7.5", - "date": "2025-03-20T08:45:10Z" - }, { "name": "wazuh/wazuh", "version": "coverity-w11-4.12.0", @@ -134,11 +189,6 @@ "version": "v4.0.7", "date": "2025-02-26T19:07:11Z" }, - { - "name": "influxdata/influxdb", - "version": "v3.0.0-0.beta.1", - "date": "2025-03-19T22:25:30Z" - }, { "name": "NodeBB/NodeBB", "version": "v4.2.0", @@ -159,11 +209,6 @@ "version": "2.2.5", "date": "2025-03-19T09:11:26Z" }, - { - "name": "forgejo/forgejo", - "version": "v7.0.14", - "date": "2025-03-19T08:53:16Z" - }, { "name": "Checkmk/checkmk", "version": "v2.3.0p29", @@ -234,11 +279,6 @@ "version": "v4.39.1", "date": "2025-03-18T03:57:41Z" }, - { - "name": "ollama/ollama", - "version": "v0.6.2", - "date": "2025-03-18T03:11:33Z" - }, { "name": "advplyr/audiobookshelf", "version": "v2.20.0", @@ -294,11 +334,6 @@ "version": "v2.5.1", "date": "2025-03-17T03:18:32Z" }, - { - "name": "firefly-iii/firefly-iii", - "version": "develop-20250222.4", - "date": "2025-02-22T16:26:15Z" - }, { "name": "glanceapp/glance", "version": "v0.7.7", @@ -404,21 +439,11 @@ "version": "v2.15.0-beta", "date": "2025-03-14T18:05:28Z" }, - { - "name": "homarr-labs/homarr", - "version": "v1.11.0", - "date": "2025-03-14T19:14:52Z" - }, { "name": "FlowiseAI/Flowise", "version": "flowise@2.2.7-patch.1", "date": "2025-03-14T14:53:53Z" }, - { - "name": "home-assistant/core", - "version": "2025.3.3", - "date": "2025-03-14T11:58:45Z" - }, { "name": "docker/compose", "version": "v2.34.0", @@ -549,11 +574,6 @@ "version": "v2.17.0", "date": "2025-03-08T06:08:04Z" }, - { - "name": "documenso/documenso", - "version": "v1.9.1-rc.9", - "date": "2025-03-07T23:28:53Z" - }, { "name": "rogerfar/rdt-client", "version": "v2.0.102", @@ -579,11 +599,6 @@ "version": "21.0.0", "date": "2025-03-06T16:20:45Z" }, - { - "name": "netbox-community/netbox", - "version": "v4.2.5", - "date": "2025-03-06T15:11:52Z" - }, { "name": "open-webui/open-webui", "version": "v0.5.20", @@ -664,11 +679,6 @@ "version": "v4.4.2", "date": "2025-02-28T16:26:05Z" }, - { - "name": "photoprism/photoprism", - "version": "250228-43447fa38", - "date": "2025-02-28T15:18:09Z" - }, { "name": "jordan-dalby/ByteStash", "version": "v1.5.7", @@ -769,11 +779,6 @@ "version": "2.0.1", "date": "2025-02-21T17:55:59Z" }, - { - "name": "sabnzbd/sabnzbd", - "version": "4.4.1", - "date": "2024-12-20T13:21:31Z" - }, { "name": "grafana/grafana", "version": "v11.5.2", @@ -789,11 +794,6 @@ "version": "v3.5.2", "date": "2025-02-18T16:43:41Z" }, - { - "name": "leiweibau/Pi.Alert", - "version": "v2025-02-16", - "date": "2025-02-18T15:50:08Z" - }, { "name": "typesense/typesense", "version": "v28.0", From 722e474f3b852bbe1de314518c735f011986ba5b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 08:50:02 +0100 Subject: [PATCH 189/258] Update CHANGELOG.md (#3328) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbb5b7d05..4432c8ac4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-22 + +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - Cronicle: add missing gnupg package [@MickLesk](https://github.com/MickLesk) ([#3323](https://github.com/community-scripts/ProxmoxVE/pull/3323)) + ## 2025-03-21 ### πŸš€ Updated Scripts From a2dc5da8cdd4071f174582bd7b278d8b99b6ffb8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 16:21:53 +0100 Subject: [PATCH 190/258] Update versions.json (#3332) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 54 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index a663dd31f..65889e000 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,28 @@ [ + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-22T10:31:21Z" + }, + { + "name": "documenso/documenso", + "version": "v1.10.0-rc.1", + "date": "2025-03-22T06:34:33Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1675", + "date": "2025-03-22T05:59:21Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.26.2", + "date": "2025-03-22T04:21:44Z" + }, { "name": "ollama/ollama", - "version": "v0.6.3-rc0", - "date": "2025-03-21T21:47:13Z" + "version": "v0.6.2", + "date": "2025-03-18T03:11:33Z" }, { "name": "netbox-community/netbox", @@ -15,9 +35,9 @@ "date": "2024-12-20T13:21:31Z" }, { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-21T20:27:25Z" + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "home-assistant/core", @@ -49,11 +69,6 @@ "version": "v1.12.0rc0", "date": "2025-03-21T17:24:38Z" }, - { - "name": "documenso/documenso", - "version": "v1.10.0-rc.0", - "date": "2025-03-21T16:23:23Z" - }, { "name": "ZoeyVid/NPMplus", "version": "2025-03-21-r1", @@ -89,11 +104,6 @@ "version": "v1.5.1", "date": "2025-01-01T16:15:52Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1672", - "date": "2025-03-21T05:51:00Z" - }, { "name": "StarFleetCPTN/GoMFT", "version": "v0.1.18", @@ -114,11 +124,6 @@ "version": "v0.43.1", "date": "2025-03-20T20:38:06Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "stonith404/pingvin-share", "version": "v1.10.4", @@ -131,8 +136,8 @@ }, { "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-03-20T17:49:45Z" + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" }, { "name": "ellite/Wallos", @@ -369,11 +374,6 @@ "version": "v1.32.2.4987", "date": "2025-03-16T09:41:37Z" }, - { - "name": "pocketbase/pocketbase", - "version": "v0.26.1", - "date": "2025-03-16T08:51:41Z" - }, { "name": "Kozea/Radicale", "version": "v3.5.0", From 00c8a73d62455ca793100165320ba30db91d2f03 Mon Sep 17 00:00:00 2001 From: Mx <105636539+0xN0BADC0FF33@users.noreply.github.com> Date: Sat, 22 Mar 2025 17:24:31 +0100 Subject: [PATCH 191/258] Update nextcloud-vm.sh to 18.1 ISO (#3333) New 18.1 ISO File on turnkey! --- vm/nextcloud-vm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/nextcloud-vm.sh b/vm/nextcloud-vm.sh index ad0dc5417..eaa20adec 100644 --- a/vm/nextcloud-vm.sh +++ b/vm/nextcloud-vm.sh @@ -386,7 +386,7 @@ fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." msg_info "Retrieving the URL for the $NAME Disk Image" -URL=http://mirror.turnkeylinux.org/turnkeylinux/images/iso/turnkey-nextcloud-18.0-bookworm-amd64.iso +URL=http://mirror.turnkeylinux.org/turnkeylinux/images/iso/turnkey-nextcloud-18.1-bookworm-amd64.iso sleep 2 msg_ok "${CL}${BL}${URL}${CL}" wget -q --show-progress $URL From e3a20e36d3030ead6745d5369e67505b4fa39417 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 18:28:57 +0100 Subject: [PATCH 192/258] Update CHANGELOG.md (#3334) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4432c8ac4..1239cbe0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,10 @@ All LXC instances created using this repository come pre-installed with Midnight - Cronicle: add missing gnupg package [@MickLesk](https://github.com/MickLesk) ([#3323](https://github.com/community-scripts/ProxmoxVE/pull/3323)) + - #### ✨ New Features + + - Update nextcloud-vm.sh to 18.1 ISO [@0xN0BADC0FF33](https://github.com/0xN0BADC0FF33) ([#3333](https://github.com/community-scripts/ProxmoxVE/pull/3333)) + ## 2025-03-21 ### πŸš€ Updated Scripts From d68c46604e9c9cbf884cf1408540627b622c4c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sat, 22 Mar 2025 21:33:31 +0100 Subject: [PATCH 193/258] Fix update process (#3341) --- ct/revealjs.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ct/revealjs.sh b/ct/revealjs.sh index b9bebeb55..5870d581c 100644 --- a/ct/revealjs.sh +++ b/ct/revealjs.sh @@ -40,12 +40,11 @@ function update_script() { tar zxf $temp_file rm -rf /opt/revealjs/node_modules/* cp /opt/revealjs/index.html /opt - cp /opt/revealjs/gulpfile.js /opt cp -rf reveal.js-${RELEASE}/* /opt/revealjs cd /opt/revealjs $STD npm install cp -f /opt/index.html /opt/revealjs - cp -f /opt/gulpfile.js /opt/revealjs + sed -i '25s/localhost/0.0.0.0/g' /opt/revealjs/gulpfile.js echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated $APP to ${RELEASE}" From 933d3731cfd05c2f0eab9bddbc0ea1feb50e5b31 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 21:41:58 +0100 Subject: [PATCH 194/258] Update CHANGELOG.md (#3342) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1239cbe0e..c01838414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### 🐞 Bug Fixes + - revealjs: Fix update process [@tremor021](https://github.com/tremor021) ([#3341](https://github.com/community-scripts/ProxmoxVE/pull/3341)) - Cronicle: add missing gnupg package [@MickLesk](https://github.com/MickLesk) ([#3323](https://github.com/community-scripts/ProxmoxVE/pull/3323)) - #### ✨ New Features From c3e7a257943d7b20231121d22078132a512e1aa3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 23 Mar 2025 01:50:42 +0100 Subject: [PATCH 195/258] Update versions.json (#3346) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 65889e000..1178a167c 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,33 @@ [ + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.5", + "date": "2025-03-22T21:58:07Z" + }, { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-22T10:31:21Z" + "date": "2025-03-22T20:27:13Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.19.1", + "date": "2025-03-22T17:57:11Z" + }, + { + "name": "hoarder-app/hoarder", + "version": "sdk/v0.23.0", + "date": "2025-03-22T17:26:10Z" + }, + { + "name": "nicolargo/glances", + "version": "v4.3.1", + "date": "2025-03-22T16:51:36Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.10", + "date": "2025-03-22T13:02:26Z" }, { "name": "documenso/documenso", @@ -54,11 +79,6 @@ "version": "v2.7.6", "date": "2025-03-21T19:24:53Z" }, - { - "name": "firefly-iii/firefly-iii", - "version": "develop-20250222.4", - "date": "2025-02-22T16:26:15Z" - }, { "name": "homarr-labs/homarr", "version": "v1.12.0", @@ -136,8 +156,8 @@ }, { "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" + "version": "nightly", + "date": "2025-03-20T17:49:45Z" }, { "name": "ellite/Wallos", @@ -359,11 +379,6 @@ "version": "v25.02.1", "date": "2025-03-16T12:51:00Z" }, - { - "name": "hoarder-app/hoarder", - "version": "ios/v1.6.9-0", - "date": "2025-03-16T12:48:20Z" - }, { "name": "YunoHost/yunohost", "version": "debian/12.0.12", @@ -399,11 +414,6 @@ "version": "v1.6.1", "date": "2025-03-15T17:29:17Z" }, - { - "name": "msgbyte/tianji", - "version": "v1.18.22", - "date": "2025-03-15T13:36:57Z" - }, { "name": "duplicati/duplicati", "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15", @@ -464,11 +474,6 @@ "version": "v0.24.1", "date": "2025-03-13T14:08:30Z" }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.49.4", - "date": "2025-03-13T11:08:16Z" - }, { "name": "moghtech/komodo", "version": "v1.16.12", @@ -984,11 +989,6 @@ "version": "v25.1.0", "date": "2025-01-10T18:14:54Z" }, - { - "name": "nicolargo/glances", - "version": "v4.3.0.8", - "date": "2025-01-05T13:55:13Z" - }, { "name": "MagicMirrorOrg/MagicMirror", "version": "v2.30.0", From a0f393cb568c84f1326f758d8110ef3df8b36dab Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 23 Mar 2025 15:06:11 +0100 Subject: [PATCH 196/258] Update versions.json (#3351) --- frontend/public/json/versions.json | 138 ++++++++++++++--------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 1178a167c..7d13b86f5 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,13 +1,73 @@ [ { - "name": "dgtlmoon/changedetection.io", - "version": "0.49.5", - "date": "2025-03-22T21:58:07Z" + "name": "Lidarr/Lidarr", + "version": "v2.10.3.4602", + "date": "2025-03-23T11:00:37Z" }, { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-22T20:27:13Z" + "date": "2025-03-23T10:30:16Z" + }, + { + "name": "YunoHost/yunohost", + "version": "debian/12.1.3", + "date": "2025-03-23T09:08:41Z" + }, + { + "name": "nicolargo/glances", + "version": "v4.3.1", + "date": "2025-03-23T09:02:54Z" + }, + { + "name": "forgejo/forgejo", + "version": "v10.0.3", + "date": "2025-03-23T08:58:24Z" + }, + { + "name": "Radarr/Radarr", + "version": "v5.20.2.9777", + "date": "2025-03-18T12:11:37Z" + }, + { + "name": "Prowlarr/Prowlarr", + "version": "v1.32.2.4987", + "date": "2025-03-16T09:41:37Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1680", + "date": "2025-03-23T06:10:41Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1", + "date": "2025-01-01T16:15:52Z" + }, + { + "name": "theonedev/onedev", + "version": "v11.7.6", + "date": "2025-03-23T05:08:22Z" + }, + { + "name": "esphome/esphome", + "version": "2025.3.1", + "date": "2025-03-23T04:45:21Z" + }, + { + "name": "usememos/memos", + "version": "v0.24.2", + "date": "2025-03-23T04:01:50Z" + }, + { + "name": "OliveTin/OliveTin", + "version": "2025.3.23", + "date": "2025-03-23T01:38:55Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.6", + "date": "2025-03-23T01:02:36Z" }, { "name": "msgbyte/tianji", @@ -20,9 +80,9 @@ "date": "2025-03-22T17:26:10Z" }, { - "name": "nicolargo/glances", - "version": "v4.3.1", - "date": "2025-03-22T16:51:36Z" + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "firefly-iii/firefly-iii", @@ -34,11 +94,6 @@ "version": "v1.10.0-rc.1", "date": "2025-03-22T06:34:33Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1675", - "date": "2025-03-22T05:59:21Z" - }, { "name": "pocketbase/pocketbase", "version": "v0.26.2", @@ -59,11 +114,6 @@ "version": "4.4.1", "date": "2024-12-20T13:21:31Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "home-assistant/core", "version": "2025.3.4", @@ -94,11 +144,6 @@ "version": "2025-03-21-r1", "date": "2025-03-21T14:54:00Z" }, - { - "name": "forgejo/forgejo", - "version": "v10.0.2", - "date": "2025-03-21T12:34:48Z" - }, { "name": "photoprism/photoprism", "version": "250321-57590c48b", @@ -119,11 +164,6 @@ "version": "v10.1.0", "date": "2025-03-21T09:17:45Z" }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.1", - "date": "2025-01-01T16:15:52Z" - }, { "name": "StarFleetCPTN/GoMFT", "version": "v0.1.18", @@ -156,8 +196,8 @@ }, { "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-03-20T17:49:45Z" + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" }, { "name": "ellite/Wallos", @@ -204,11 +244,6 @@ "version": "0.201.1", "date": "2025-03-20T06:59:18Z" }, - { - "name": "esphome/esphome", - "version": "2025.3.0", - "date": "2025-03-20T04:37:16Z" - }, { "name": "rabbitmq/rabbitmq-server", "version": "v4.0.7", @@ -284,11 +319,6 @@ "version": "v1.6.6", "date": "2025-03-18T13:05:01Z" }, - { - "name": "Radarr/Radarr", - "version": "v5.20.2.9777", - "date": "2025-03-18T12:11:37Z" - }, { "name": "apache/couchdb", "version": "3.4.3.post1", @@ -379,16 +409,6 @@ "version": "v25.02.1", "date": "2025-03-16T12:51:00Z" }, - { - "name": "YunoHost/yunohost", - "version": "debian/12.0.12", - "date": "2025-03-16T11:59:24Z" - }, - { - "name": "Prowlarr/Prowlarr", - "version": "v1.32.2.4987", - "date": "2025-03-16T09:41:37Z" - }, { "name": "Kozea/Radicale", "version": "v3.5.0", @@ -419,11 +439,6 @@ "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15", "date": "2025-03-15T11:06:44Z" }, - { - "name": "theonedev/onedev", - "version": "vv11.7.5", - "date": "2025-03-15T09:53:15Z" - }, { "name": "henrygd/beszel", "version": "v0.10.2", @@ -469,11 +484,6 @@ "version": "2.31.0", "date": "2025-03-13T17:13:47Z" }, - { - "name": "usememos/memos", - "version": "v0.24.1", - "date": "2025-03-13T14:08:30Z" - }, { "name": "moghtech/komodo", "version": "v1.16.12", @@ -554,11 +564,6 @@ "version": "v21.0.0.0", "date": "2025-03-09T12:25:44Z" }, - { - "name": "Lidarr/Lidarr", - "version": "v2.9.6.4552", - "date": "2025-02-03T12:11:00Z" - }, { "name": "Readarr/Readarr", "version": "v2.0.0.4645", @@ -769,11 +774,6 @@ "version": "v13.4.3", "date": "2025-02-23T11:08:26Z" }, - { - "name": "OliveTin/OliveTin", - "version": "2025.2.21", - "date": "2025-02-21T23:09:34Z" - }, { "name": "azukaar/Cosmos-Server", "version": "v0.18.3", From 51ec219eb74fa4a8ca61b7baabb46912f5f92da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:23:20 +0100 Subject: [PATCH 197/258] Check if build-essential is present, if not install it (#3358) --- ct/gomft.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ct/gomft.sh b/ct/gomft.sh index 02bd2f520..a274d2977 100644 --- a/ct/gomft.sh +++ b/ct/gomft.sh @@ -29,6 +29,10 @@ function update_script() { exit fi RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if ! dpkg -l | grep -q "^ii.*build-essential"; then + $STD apt-get install -y build-essential + fi + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then msg_info "Stopping $APP" systemctl stop gomft From 336a4546b2ad40fce69366a4e6e03cca855041be Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:25:12 +0100 Subject: [PATCH 198/258] Update CHANGELOG.md (#3347) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c01838414..04c6c481a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-23 + +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - GoMFT: Check if build-essential is present before updating, if not then install it [@tremor021](https://github.com/tremor021) ([#3358](https://github.com/community-scripts/ProxmoxVE/pull/3358)) + ## 2025-03-22 ### πŸš€ Updated Scripts From 42f376c072532547da7ee0911b945ca6e7fe8d25 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 07:26:40 +0100 Subject: [PATCH 199/258] Update versions.json (#3360) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 44 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 7d13b86f5..b6ba5396b 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,18 +1,33 @@ [ + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-23T20:28:38Z" + }, + { + "name": "runtipi/runtipi", + "version": "nightly", + "date": "2025-03-23T18:02:12Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.19.2", + "date": "2025-03-23T16:33:14Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.7", + "date": "2025-03-23T15:51:11Z" + }, { "name": "Lidarr/Lidarr", "version": "v2.10.3.4602", "date": "2025-03-23T11:00:37Z" }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-23T10:30:16Z" - }, { "name": "YunoHost/yunohost", - "version": "debian/12.1.3", - "date": "2025-03-23T09:08:41Z" + "version": "debian/12.0.12", + "date": "2025-03-16T11:59:24Z" }, { "name": "nicolargo/glances", @@ -64,16 +79,6 @@ "version": "2025.3.23", "date": "2025-03-23T01:38:55Z" }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.49.6", - "date": "2025-03-23T01:02:36Z" - }, - { - "name": "msgbyte/tianji", - "version": "v1.19.1", - "date": "2025-03-22T17:57:11Z" - }, { "name": "hoarder-app/hoarder", "version": "sdk/v0.23.0", @@ -194,11 +199,6 @@ "version": "v1.2.3", "date": "2025-03-20T17:54:55Z" }, - { - "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" - }, { "name": "ellite/Wallos", "version": "v2.48.0", From a03dd43e6ee0f78d9307077413ef67996b6c1955 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:58:51 +0100 Subject: [PATCH 200/258] Migrate yt-dlp-webui to ProxmoxVE (#3364) * 'Add new script' * Update yt-dlp-webui-install.sh * Update yt-dlp-webui.sh * Update yt-dlp-webui.json --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- ct/yt-dlp-webui.sh | 63 +++++++++++++++ frontend/public/json/yt-dlp-webui.json | 47 +++++++++++ install/yt-dlp-webui-install.sh | 103 +++++++++++++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 ct/yt-dlp-webui.sh create mode 100644 frontend/public/json/yt-dlp-webui.json create mode 100644 install/yt-dlp-webui-install.sh diff --git a/ct/yt-dlp-webui.sh b/ct/yt-dlp-webui.sh new file mode 100644 index 000000000..30141d49f --- /dev/null +++ b/ct/yt-dlp-webui.sh @@ -0,0 +1,63 @@ +#!/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: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/marcopiovanello/yt-dlp-web-ui + +APP="yt-dlp-webui" +var_tags="downloads;yt-dlp" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/bin/yt-dlp-webui ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating yt-dlp" + $STD yt-dlp -U + msg_ok "Updated yt-dlp" + RELEASE=$(curl -s https://api.github.com/repos/marcopiovanello/yt-dlp-web-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/yt-dlp-webui_version.txt)" ]] || [[ ! -f /opt/yt-dlp-webui_version.txt ]]; then + + msg_info "Stopping $APP" + systemctl stop yt-dlp-webui + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + rm -rf /usr/local/bin/yt-dlp-webui + wget -q "https://github.com/marcopiovanello/yt-dlp-web-ui/releases/download/v${RELEASE}/yt-dlp-webui_linux-amd64" -O /usr/local/bin/yt-dlp-webui + chmod +x /usr/local/bin/yt-dlp-webui + msg_ok "Updated $APP LXC" + + msg_info "Starting $APP" + systemctl start yt-dlp-webui + msg_ok "Started $APP" + 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}:3033${CL}" diff --git a/frontend/public/json/yt-dlp-webui.json b/frontend/public/json/yt-dlp-webui.json new file mode 100644 index 000000000..d103173d9 --- /dev/null +++ b/frontend/public/json/yt-dlp-webui.json @@ -0,0 +1,47 @@ +{ + "name": "yt-dlp-webui", + "slug": "yt-dlp-webui", + "categories": [ + 14 + ], + "date_created": "2025-03-21", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3033, + "documentation": "https://github.com/marcopiovanello/yt-dlp-web-ui", + "website": "https://github.com/marcopiovanello/yt-dlp-web-ui", + "logo": "https://raw.githubusercontent.com/marcopiovanello/yt-dlp-web-ui/refs/heads/master/frontend/src/assets/favicon.ico", + "description": "A not so terrible web ui for yt-dlp.\nHigh performance extendeable web ui and RPC server for yt-dlp with low impact on resources.\nCreated for the only purpose of fetching videos from my server/nas and monitor upcoming livestreams.", + "install_methods": [ + { + "type": "default", + "script": "ct/yt-dlp-webui.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [ + { + "text": "Show password: `cat ~/yt-dlp-webui.creds`", + "type": "info" + }, + { + "text": "The config file is located in `/opt/yt-dlp-webui/config.conf`", + "type": "info" + }, + { + "text": "Make sure to either mount an external path or increase the Disk space afterwards", + "type": "info" + } + ] +} diff --git a/install/yt-dlp-webui-install.sh b/install/yt-dlp-webui-install.sh new file mode 100644 index 000000000..b8fe75a0f --- /dev/null +++ b/install/yt-dlp-webui-install.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/marcopiovanello/yt-dlp-web-ui + +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 \ + sudo \ + mc \ + curl \ + ffmpeg +msg_ok "Installed Dependencies" + +msg_info "Installing ${APPLICATION}" +RELEASE=$(curl -s https://api.github.com/repos/marcopiovanello/yt-dlp-web-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q "https://github.com/marcopiovanello/yt-dlp-web-ui/releases/download/v${RELEASE}/yt-dlp-webui_linux-amd64" -O /usr/local/bin/yt-dlp-webui +chmod +x /usr/local/bin/yt-dlp-webui +echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" +msg_ok "Installed ${APPLICATION}" + +msg_info "Installing yt-dlp" +wget -q https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp +chmod a+rx /usr/local/bin/yt-dlp +msg_ok "Installed yt-dlp" + +msg_info "Setting up ${APPLICATION}" +mkdir -p /opt/yt-dlp-webui +mkdir /downloads +RPC_PASSWORD=$(openssl rand -base64 16) +{ + echo "yt-dlp-webui-Credentials" + echo "Username: admin" + echo "Password: ${RPC_PASSWORD}" +} >> ~/yt-dlp-webui.creds + +cat < /opt/yt-dlp-webui/config.conf +# Host where server will listen at (default: "0.0.0.0") +#host: 0.0.0.0 + +# Port where server will listen at (default: 3033) +port: 3033 + +# Directory where downloaded files will be stored (default: ".") +downloadPath: /downloads + +# [optional] Enable RPC authentication (requires username and password) +require_auth: true +username: admin +password: ${RPC_PASSWORD} + +# [optional] The download queue size (default: logical cpu cores) +queue_size: 4 # min. 2 + +# [optional] Full path to the yt-dlp (default: "yt-dlp") +downloaderPath: /usr/local/bin/yt-dlp + +# [optional] Enable file based logging with rotation (default: false) +#enable_file_logging: false + +# [optional] Directory where the log file will be stored (default: ".") +#log_path: . + +# [optional] Directory where the session database file will be stored (default: ".") +#session_file_path: . + +# [optional] Path where the sqlite database will be created/opened (default: "./local.db") +#local_database_path + +# [optional] Path where a custom frontend will be loaded (instead of the embedded one) +#frontend_path: ./web/solid-frontend +EOF + +cat < /etc/systemd/system/yt-dlp-webui.service +[Unit] +Description=yt-dlp-webui service file +After=network.target + +[Service] +ExecStart=/usr/local/bin/yt-dlp-webui --conf /opt/yt-dlp-webui/config.conf + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now yt-dlp-webui +msg_ok "Set up ${APPLICATION}" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" From f4bc2d0607f1d7cbe1fb85e418626ed0e2c1f49c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:59:58 +0100 Subject: [PATCH 201/258] Update .app files (#3370) Co-authored-by: GitHub Actions --- ct/headers/yt-dlp-webui | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/yt-dlp-webui diff --git a/ct/headers/yt-dlp-webui b/ct/headers/yt-dlp-webui new file mode 100644 index 000000000..6d1f6b828 --- /dev/null +++ b/ct/headers/yt-dlp-webui @@ -0,0 +1,6 @@ + __ ____ __ _ + __ __/ /_ ____/ / /___ _ _____ / /_ __ __(_) + / / / / __/_____/ __ / / __ \_____| | /| / / _ \/ __ \/ / / / / + / /_/ / /_/_____/ /_/ / / /_/ /_____/ |/ |/ / __/ /_/ / /_/ / / + \__, /\__/ \__,_/_/ .___/ |__/|__/\___/_.___/\__,_/_/ +/____/ /_/ From 06491a9444ada6535f356c7218b6163fea470f2e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:00:19 +0100 Subject: [PATCH 202/258] Update date in json (#3369) Co-authored-by: GitHub Actions --- frontend/public/json/yt-dlp-webui.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/yt-dlp-webui.json b/frontend/public/json/yt-dlp-webui.json index d103173d9..ce8cc5a9b 100644 --- a/frontend/public/json/yt-dlp-webui.json +++ b/frontend/public/json/yt-dlp-webui.json @@ -4,7 +4,7 @@ "categories": [ 14 ], - "date_created": "2025-03-21", + "date_created": "2025-03-24", "type": "ct", "updateable": true, "privileged": false, From e2e6ad593550c5051e9bb71aac262a5db414ad93 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:04:30 +0100 Subject: [PATCH 203/258] Refactor: ErsatzTV Script (#3365) * Update ersatztv-install.sh * Redesign ErsatzTV * Update ersatztv-install.sh * Update ersatztv.sh --- ct/ersatztv.sh | 21 +++++++++++++----- install/ersatztv-install.sh | 43 +++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/ct/ersatztv.sh b/ct/ersatztv.sh index aa0b0ae58..0ca5d5c41 100644 --- a/ct/ersatztv.sh +++ b/ct/ersatztv.sh @@ -26,29 +26,40 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - + RELEASE=$(curl -s https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1) + if [[ ! -f /opt/${APP}_version.txt && $(echo "x.x.x" > /opt/${APP}_version.txt) || "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then msg_info "Stopping ErsatzTV" systemctl stop ersatzTV msg_ok "Stopped ErsatzTV" msg_info "Updating ErsatzTV" - RELEASE=$(curl -s https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1) cp -R /opt/ErsatzTV/ ErsatzTV-backup rm ErsatzTV-backup/ErsatzTV rm -rf /opt/ErsatzTV - wget -qO- "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-x64.tar.gz" | tar -xz -C /opt - mv "/opt/ErsatzTV-${RELEASE}-linux-x64" /opt/ErsatzTV + temp_file=$(mktemp) + wget -qO- https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-x64.tar.gz -O "$temp_file" + tar -xzf "$temp_file" + mv /opt/ErsatzTV-${RELEASE}-linux-x64 /opt/ErsatzTV cp -R ErsatzTV-backup/* /opt/ErsatzTV/ rm -rf ErsatzTV-backup + echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ErsatzTV" msg_info "Starting ErsatzTV" systemctl start ersatzTV msg_ok "Started ErsatzTV" + + msg_info "Cleaning Up" + rm -f ${temp_file} + msg_ok "Cleaned" msg_ok "Updated Successfully" - exit + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } + start build_container description diff --git a/install/ersatztv-install.sh b/install/ersatztv-install.sh index 436136db5..a4fad8beb 100644 --- a/install/ersatztv-install.sh +++ b/install/ersatztv-install.sh @@ -1,12 +1,11 @@ #!/usr/bin/env bash # Copyright (c) 2021-2025 tteck -# Author: tteck -# Co-Author: MickLesk (Canbiz) +# Author: MickLesk (Canbiz) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/ErsatzTV/ErsatzTV +# Source: https://ersatztv.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,22 +14,20 @@ 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 \ + curl \ + sudo \ + mc msg_ok "Installed Dependencies" msg_info "Installing FFmpeg (Patience)" -wget -q https://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.8.1_all.deb -$STD dpkg -i deb-multimedia-keyring_2016.8.1_all.deb -cat </etc/apt/sources.list.d/backports.list -deb https://www.deb-multimedia.org bookworm main non-free -deb https://www.deb-multimedia.org bookworm-backports main -EOF -$STD apt update -DEBIAN_FRONTEND=noninteractive $STD apt-get install -t bookworm-backports ffmpeg -y -rm -rf /etc/apt/sources.list.d/backports.list deb-multimedia-keyring_2016.8.1_all.deb -$STD apt update +cd /usr/local/bin +wget -q https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz +$STD tar -xvf ffmpeg-release-amd64-static.tar.xz +rm -f ffmpeg-*.tar.xz +cd ffmpeg-* +mv ffmpeg ffprobe /usr/local/bin/ +rm -rf /usr/local/bin/ffmpeg-* msg_ok "Installed FFmpeg" msg_info "Setting Up Hardware Acceleration" @@ -44,10 +41,13 @@ if [[ "$CTTYPE" == "0" ]]; then fi msg_ok "Set Up Hardware Acceleration" -msg_info "Installing ErsatzTV" +msg_info "Installing ErsatzTV" +cd /opt RELEASE=$(curl -s https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1) -wget -qO- "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-x64.tar.gz" | tar -xz -C /opt -mv "/opt/ErsatzTV-${RELEASE}-linux-x64" /opt/ErsatzTV +wget -qO- "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-x64.tar.gz" -O "$temp_file" +tar -xzf "$temp_file" +mv /opt/ErsatzTV-${RELEASE}-linux-x64 /opt/ErsatzTV +echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed ErsatzTV" msg_info "Creating Service" @@ -67,13 +67,14 @@ RestartSec=30 [Install] WantedBy=multi-user.target EOF -systemctl -q --now enable ersatzTV.service +systemctl enable -q --now ersatzTV msg_ok "Created Service" motd_ssh customize msg_info "Cleaning up" +rm -f ${temp_file} $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" From 39904741dd40184d7a56b1b1cbc28255307d361a Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:36:45 +0100 Subject: [PATCH 204/258] Update workflow (#3371) --- .github/workflows/changelog-pr.yml | 34 ++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 7d6e52351..f3bcdf122 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -105,8 +105,37 @@ jobs: ).forEach(pr => { const prLabels = pr.labels.map(label => label.name.toLowerCase()); - const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; + if (pr.user.login === "push-app-to-main") { + const scriptName = pr.title; + if (scriptName) { + try { + const { data: relatedIssues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: "ProxmoxVED", + state: "all", + label: "Started Migration To ProxmoxVE", + per_page: 5 + }); + const matchingIssue = relatedIssues.find(issue => + issue.title.toLowerCase().includes(scriptName.toLowerCase()) + ); + if (matchingIssue) { + const issueAuthor = matchingIssue.user.login; + const issueAuthorUrl = `https://github.com/${issueAuthor}`; + const prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; + } else { + const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + } + } catch (error) { + console.error(`Error fetching related issues: ${error}`); + const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + } + } else { + const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + }else{ + const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; + } const updateScriptsCategory = categorizedPRs.find(category => category.labels.some(label => prLabels.includes(label)) ); @@ -150,7 +179,8 @@ jobs: const hasSubcategories = subCategories && subCategories.length > 0; const hasMainNotes = notes.length > 0; const hasSubNotes = hasSubcategories && subCategories.some(sub => sub.notes && sub.notes.length > 0); - + + if (hasMainNotes || hasSubNotes) { newReleaseNotes += `### ${title}\n\n`; From 888b4c34bd605598b10038778aa6f0b2e5230e88 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:51:58 +0100 Subject: [PATCH 205/258] [core] install core deps (debian / ubuntu) (#3366) * [core] install core deps (debian / ubuntu) Installed Core Deps "sudo, curl, mc" on debian / ubuntu based lxc's * Update install.func --- misc/install.func | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/misc/install.func b/misc/install.func index 84f416a41..d952c7480 100644 --- a/misc/install.func +++ b/misc/install.func @@ -211,6 +211,11 @@ EOF $STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED msg_ok "Updated Container OS" + + msg_info "Installing core dependencies" + $STD apt-get update + $STD apt-get install -y sudo curl mc + msg_ok "Core dependencies installed" } # This function modifies the message of the day (motd) and SSH settings From c9b5579869291f6426540e851d8b7ab541bc8293 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 24 Mar 2025 11:57:47 +0100 Subject: [PATCH 206/258] Fix WF (#3372) --- .github/workflows/changelog-pr.yml | 200 +++++++++++++++-------------- 1 file changed, 102 insertions(+), 98 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index f3bcdf122..8dd722833 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -48,116 +48,120 @@ jobs: uses: actions/github-script@v7 with: script: | - const fs = require('fs').promises; - const path = require('path'); + async function main() { + const fs = require('fs').promises; + const path = require('path'); - const configPath = path.resolve(process.env.CONFIG_PATH); - const fileContent = await fs.readFile(configPath, 'utf-8'); - const changelogConfig = JSON.parse(fileContent); + const configPath = path.resolve(process.env.CONFIG_PATH); + const fileContent = await fs.readFile(configPath, 'utf-8'); + const changelogConfig = JSON.parse(fileContent); - const categorizedPRs = changelogConfig.map(obj => ({ - ...obj, - notes: [], - subCategories: obj.subCategories ?? ( - obj.labels.includes("update script") ? [ - { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, - { title: "✨ New Features", labels: ["feature"], notes: [] }, - { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, - { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] }, - ] : - obj.labels.includes("maintenance") ? [ - { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, - { title: "✨ New Features", labels: ["feature"], notes: [] }, - { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, - { title: "πŸ“‘ API", labels: ["api"], notes: [] }, - { title: "Github", labels: ["github"], notes: [] }, - { title: "πŸ“ Documentation", labels: ["documentation"], notes: [] }, - { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] } - ] : - obj.labels.includes("website") ? [ - { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, - { title: "✨ New Features", labels: ["feature"], notes: [] }, - { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, - { title: "Script Information", labels: ["json"], notes: [] } - ] : [] - ) - })); + const categorizedPRs = changelogConfig.map(obj => ({ + ...obj, + notes: [], + subCategories: obj.subCategories ?? ( + obj.labels.includes("update script") ? [ + { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, + { title: "✨ New Features", labels: ["feature"], notes: [] }, + { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, + { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] }, + ] : + obj.labels.includes("maintenance") ? [ + { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, + { title: "✨ New Features", labels: ["feature"], notes: [] }, + { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, + { title: "πŸ“‘ API", labels: ["api"], notes: [] }, + { title: "Github", labels: ["github"], notes: [] }, + { title: "πŸ“ Documentation", labels: ["documentation"], notes: [] }, + { title: "πŸ”§ Refactor", labels: ["refactor"], notes: [] } + ] : + obj.labels.includes("website") ? [ + { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] }, + { title: "✨ New Features", labels: ["feature"], notes: [] }, + { title: "πŸ’₯ Breaking Changes", labels: ["breaking change"], notes: [] }, + { title: "Script Information", labels: ["json"], notes: [] } + ] : [] + ) + })); - const latestDateInChangelog = new Date(process.env.LATEST_DATE); - latestDateInChangelog.setUTCHours(23, 59, 59, 999); + const latestDateInChangelog = new Date(process.env.LATEST_DATE); + latestDateInChangelog.setUTCHours(23, 59, 59, 999); - const { data: pulls } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - base: "main", - state: "closed", - sort: "updated", - direction: "desc", - per_page: 100, - }); + const { data: pulls } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + base: "main", + state: "closed", + sort: "updated", + direction: "desc", + per_page: 100, + }); - pulls.filter(pr => - pr.merged_at && - new Date(pr.merged_at) > latestDateInChangelog && - !pr.labels.some(label => - ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()) - ) - ).forEach(pr => { + pulls.filter(pr => + pr.merged_at && + new Date(pr.merged_at) > latestDateInChangelog && + !pr.labels.some(label => + ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()) + ) + ).forEach(pr => { - const prLabels = pr.labels.map(label => label.name.toLowerCase()); - if (pr.user.login === "push-app-to-main") { - const scriptName = pr.title; - if (scriptName) { - try { - const { data: relatedIssues } = await github.rest.issues.listForRepo({ - owner: context.repo.owner, - repo: "ProxmoxVED", - state: "all", - label: "Started Migration To ProxmoxVE", - per_page: 5 - }); - const matchingIssue = relatedIssues.find(issue => - issue.title.toLowerCase().includes(scriptName.toLowerCase()) - ); - if (matchingIssue) { - const issueAuthor = matchingIssue.user.login; - const issueAuthorUrl = `https://github.com/${issueAuthor}`; - const prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; - } else { - const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + const prLabels = pr.labels.map(label => label.name.toLowerCase()); + if (pr.user.login === "push-app-to-main") { + const scriptName = pr.title; + if (scriptName) { + try { + const { data: relatedIssues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: "ProxmoxVED", + state: "all", + label: "Started Migration To ProxmoxVE", + per_page: 5 + }); + const matchingIssue = relatedIssues.find(issue => + issue.title.toLowerCase().includes(scriptName.toLowerCase()) + ); + if (matchingIssue) { + const issueAuthor = matchingIssue.user.login; + const issueAuthorUrl = `https://github.com/${issueAuthor}`; + const prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; + } else { + const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + } + } catch (error) { + console.error(`Error fetching related issues: ${error}`); + const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; } - } catch (error) { - console.error(`Error fetching related issues: ${error}`); - const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; - } - } else { - const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + } else { + const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; - }else{ - const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; - } - const updateScriptsCategory = categorizedPRs.find(category => - category.labels.some(label => prLabels.includes(label)) - ); - - if (updateScriptsCategory) { - - const subCategory = updateScriptsCategory.subCategories.find(sub => - sub.labels.some(label => prLabels.includes(label)) + }else{ + const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; + } + const updateScriptsCategory = categorizedPRs.find(category => + category.labels.some(label => prLabels.includes(label)) ); - if (subCategory) { - subCategory.notes.push(prNote); - } else { - updateScriptsCategory.notes.push(prNote); + if (updateScriptsCategory) { + + const subCategory = updateScriptsCategory.subCategories.find(sub => + sub.labels.some(label => prLabels.includes(label)) + ); + + if (subCategory) { + subCategory.notes.push(prNote); + } else { + updateScriptsCategory.notes.push(prNote); + } } - } + }); + + console.log(JSON.stringify(categorizedPRs, null, 2)); + + return categorizedPRs; + } + main().catch(error => { + console.error("Error in script:", error); }); - - console.log(JSON.stringify(categorizedPRs, null, 2)); - - return categorizedPRs; - - name: Update CHANGELOG.md uses: actions/github-script@v7 From 37b789450431c34cf562a07ef1a7aebf289bcbd3 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:32:45 +0100 Subject: [PATCH 207/258] Extension: Redis Alpine Installation (#3367) * Extension: Redis Alpine Installation * change website note --- ct/alpine-redis.sh | 72 +++++++++++++++++++++++++++++++++ frontend/public/json/redis.json | 13 +++++- install/alpine-redis-install.sh | 35 ++++++++++++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 ct/alpine-redis.sh create mode 100644 install/alpine-redis-install.sh diff --git a/ct/alpine-redis.sh b/ct/alpine-redis.sh new file mode 100644 index 000000000..2080461ca --- /dev/null +++ b/ct/alpine-redis.sh @@ -0,0 +1,72 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://redis.io/ + +APP="Alpine-Redis" +var_tags="alpine;database" +var_cpu="1" +var_ram="256" +var_disk="1" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) + while true; do + CHOICE=$( + whiptail --backtitle "Proxmox VE Helper Scripts" --title "Redis Management" --menu "Select option" 11 58 3 \ + "1" "Update Redis" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 + ) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + msg_info "Updating Redis" + apk update && apk upgrade redis + rc-service redis restart + msg_ok "Redis updated successfully!" + exit + ;; + 2) + msg_info "Setting Redis to listen on all interfaces" + sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf + rc-service redis restart + msg_ok "Redis now listens on all interfaces!" + exit + ;; + 3) + msg_info "Setting Redis to listen only on ${LXCIP}" + sed -i "s/^bind .*/bind ${LXCIP}/" /etc/redis.conf + rc-service redis restart + msg_ok "Redis now listens only on ${LXCIP}!" + exit + ;; + esac + done +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable on port 6379. + ${BL}redis-cli -h ${IP} -p 6379${CL} \n" \ No newline at end of file diff --git a/frontend/public/json/redis.json b/frontend/public/json/redis.json index 099ddfd4e..3f633f8c4 100644 --- a/frontend/public/json/redis.json +++ b/frontend/public/json/redis.json @@ -24,6 +24,17 @@ "os": "debian", "version": "12" } + }, + { + "type": "alpine", + "script": "ct/alpine-redis.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } } ], "default_credentials": { @@ -32,7 +43,7 @@ }, "notes": [ { - "text": "Redis Configuration: `nano /etc/redis/redis.conf`", + "text": "Redis Configuration: `nano /etc/redis/redis.conf` or in Alpine: `nano /etc/redis.conf`", "type": "info" } ] diff --git a/install/alpine-redis-install.sh b/install/alpine-redis-install.sh new file mode 100644 index 000000000..2fb4140cd --- /dev/null +++ b/install/alpine-redis-install.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://redis.io/ + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apk add \ + newt \ + curl \ + openssh \ + nano \ + mc \ + gpg + +msg_ok "Installed Dependencies" + +msg_info "Installing Redis" +$STD apk add redis +$STD sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf +$STD rc-update add redis default +$STD rc-service redis start +msg_ok "Installed Redis" + +motd_ssh +customize \ No newline at end of file From 4fd8e265f29d8992458e37af6e4a3cc9c70256c4 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:35:31 +0100 Subject: [PATCH 208/258] Update changelog-pr.yml --- .github/workflows/changelog-pr.yml | 106 +++++++++++++---------------- 1 file changed, 46 insertions(+), 60 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 8dd722833..2ef5ed85f 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -97,71 +97,60 @@ jobs: per_page: 100, }); - pulls.filter(pr => + const filteredPRs = pulls.filter(pr => pr.merged_at && new Date(pr.merged_at) > latestDateInChangelog && !pr.labels.some(label => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()) - ) - ).forEach(pr => { - - const prLabels = pr.labels.map(label => label.name.toLowerCase()); - if (pr.user.login === "push-app-to-main") { - const scriptName = pr.title; - if (scriptName) { - try { - const { data: relatedIssues } = await github.rest.issues.listForRepo({ - owner: context.repo.owner, - repo: "ProxmoxVED", - state: "all", - label: "Started Migration To ProxmoxVE", - per_page: 5 - }); - const matchingIssue = relatedIssues.find(issue => - issue.title.toLowerCase().includes(scriptName.toLowerCase()) - ); - if (matchingIssue) { - const issueAuthor = matchingIssue.user.login; - const issueAuthorUrl = `https://github.com/${issueAuthor}`; - const prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; - } else { - const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; - } - } catch (error) { - console.error(`Error fetching related issues: ${error}`); - const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + ) + ); + + for (const pr of filteredPRs) { // βœ… for...of unterstΓΌtzt await + const prLabels = pr.labels.map(label => label.name.toLowerCase()); + + let prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; + + if (pr.user.login === "push-app-to-main") { + const scriptName = pr.title; + if (scriptName) { + try { + const { data: relatedIssues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: "ProxmoxVED", + state: "all", + labels: ["Started Migration To ProxmoxVE"], // "label" -> "labels" + per_page: 5 + }); + const matchingIssue = relatedIssues.find(issue => + issue.title.toLowerCase().includes(scriptName.toLowerCase()) + ); + if (matchingIssue) { + const issueAuthor = matchingIssue.user.login; + const issueAuthorUrl = `https://github.com/${issueAuthor}`; + prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; } - } else { - const prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; - - }else{ - const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; - } - const updateScriptsCategory = categorizedPRs.find(category => - category.labels.some(label => prLabels.includes(label)) - ); - - if (updateScriptsCategory) { - - const subCategory = updateScriptsCategory.subCategories.find(sub => - sub.labels.some(label => prLabels.includes(label)) - ); - - if (subCategory) { - subCategory.notes.push(prNote); - } else { - updateScriptsCategory.notes.push(prNote); + } catch (error) { + console.error(`Error fetching related issues: ${error}`); } } - }); - - console.log(JSON.stringify(categorizedPRs, null, 2)); - - return categorizedPRs; + } + + const updateScriptsCategory = categorizedPRs.find(category => + category.labels.some(label => prLabels.includes(label)) + ); + + if (updateScriptsCategory) { + const subCategory = updateScriptsCategory.subCategories.find(sub => + sub.labels.some(label => prLabels.includes(label)) + ); + + if (subCategory) { + subCategory.notes.push(prNote); + } else { + updateScriptsCategory.notes.push(prNote); + } + } } - main().catch(error => { - console.error("Error in script:", error); - }); - name: Update CHANGELOG.md uses: actions/github-script@v7 @@ -184,8 +173,6 @@ jobs: const hasMainNotes = notes.length > 0; const hasSubNotes = hasSubcategories && subCategories.some(sub => sub.notes && sub.notes.length > 0); - - if (hasMainNotes || hasSubNotes) { newReleaseNotes += `### ${title}\n\n`; } @@ -202,7 +189,6 @@ jobs: } } } - const changelogContent = await fs.readFile(changelogPath, 'utf-8'); const changelogIncludesTodaysReleaseNotes = changelogContent.includes(`\n## ${today}`); From 03c915241fdef740b116555510d5a984b52eae66 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:39:00 +0100 Subject: [PATCH 209/258] Update changelog-pr.yml --- .github/workflows/changelog-pr.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 2ef5ed85f..06ef758c9 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -105,7 +105,7 @@ jobs: ) ); - for (const pr of filteredPRs) { // βœ… for...of unterstΓΌtzt await + for (const pr of filteredPRs) { const prLabels = pr.labels.map(label => label.name.toLowerCase()); let prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; @@ -118,7 +118,7 @@ jobs: owner: context.repo.owner, repo: "ProxmoxVED", state: "all", - labels: ["Started Migration To ProxmoxVE"], // "label" -> "labels" + labels: ["Started Migration To ProxmoxVE"], per_page: 5 }); const matchingIssue = relatedIssues.find(issue => @@ -132,9 +132,10 @@ jobs: } catch (error) { console.error(`Error fetching related issues: ${error}`); } + } else { + prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; // ❗ `const` entfernt, da `prNote` schon oben existiert } - } - + const updateScriptsCategory = categorizedPRs.find(category => category.labels.some(label => prLabels.includes(label)) ); From 92a5f77a5d887c2490b5fcef9bbc74e079b394f8 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:41:22 +0100 Subject: [PATCH 210/258] Update changelog-pr.yml --- .github/workflows/changelog-pr.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 06ef758c9..e38074f53 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -133,25 +133,25 @@ jobs: console.error(`Error fetching related issues: ${error}`); } } else { - prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; // ❗ `const` entfernt, da `prNote` schon oben existiert + prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; } - const updateScriptsCategory = categorizedPRs.find(category => - category.labels.some(label => prLabels.includes(label)) - ); - - if (updateScriptsCategory) { - const subCategory = updateScriptsCategory.subCategories.find(sub => - sub.labels.some(label => prLabels.includes(label)) + const updateScriptsCategory = categorizedPRs.find(category => + category.labels.some(label => prLabels.includes(label)) ); - - if (subCategory) { - subCategory.notes.push(prNote); - } else { - updateScriptsCategory.notes.push(prNote); + + if (updateScriptsCategory) { + const subCategory = updateScriptsCategory.subCategories.find(sub => + sub.labels.some(label => prLabels.includes(label)) + ); + + if (subCategory) { + subCategory.notes.push(prNote); + } else { + updateScriptsCategory.notes.push(prNote); + } } - } - } + - name: Update CHANGELOG.md uses: actions/github-script@v7 From 5aca671fad5115ac106f411cb74fee916e859126 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:43:15 +0100 Subject: [PATCH 211/258] Update changelog-pr.yml --- .github/workflows/changelog-pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index e38074f53..228e5a68c 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -151,6 +151,7 @@ jobs: updateScriptsCategory.notes.push(prNote); } } + } - name: Update CHANGELOG.md From 0e3e831a4bb67b709bb79002179f07ce9f97cf60 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:43:41 +0100 Subject: [PATCH 212/258] Update .app files (#3374) Co-authored-by: GitHub Actions --- ct/headers/alpine-redis | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/alpine-redis diff --git a/ct/headers/alpine-redis b/ct/headers/alpine-redis new file mode 100644 index 000000000..d9c0cae4a --- /dev/null +++ b/ct/headers/alpine-redis @@ -0,0 +1,6 @@ + ___ __ _ ____ ___ + / | / /___ (_)___ ___ / __ \___ ____/ (_)____ + / /| | / / __ \/ / __ \/ _ \______/ /_/ / _ \/ __ / / ___/ + / ___ |/ / /_/ / / / / / __/_____/ _, _/ __/ /_/ / (__ ) +/_/ |_/_/ .___/_/_/ /_/\___/ /_/ |_|\___/\__,_/_/____/ + /_/ From ef839acb12d78d43f4e171665a365252a9ef2c07 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:46:44 +0100 Subject: [PATCH 213/258] Update changelog-pr.yml --- .github/workflows/changelog-pr.yml | 111 ++++++++++++++++------------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 228e5a68c..4a9099dc7 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -97,62 +97,71 @@ jobs: per_page: 100, }); - const filteredPRs = pulls.filter(pr => - pr.merged_at && - new Date(pr.merged_at) > latestDateInChangelog && - !pr.labels.some(label => - ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()) - ) - ); - - for (const pr of filteredPRs) { - const prLabels = pr.labels.map(label => label.name.toLowerCase()); + const filteredPRs = pulls.filter(pr => + pr.merged_at && + new Date(pr.merged_at) > latestDateInChangelog && + !pr.labels.some(label => + ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()) + ) + ); - let prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; - - if (pr.user.login === "push-app-to-main") { - const scriptName = pr.title; - if (scriptName) { - try { - const { data: relatedIssues } = await github.rest.issues.listForRepo({ - owner: context.repo.owner, - repo: "ProxmoxVED", - state: "all", - labels: ["Started Migration To ProxmoxVE"], - per_page: 5 - }); - const matchingIssue = relatedIssues.find(issue => - issue.title.toLowerCase().includes(scriptName.toLowerCase()) - ); - if (matchingIssue) { - const issueAuthor = matchingIssue.user.login; - const issueAuthorUrl = `https://github.com/${issueAuthor}`; - prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; + for (const pr of filteredPRs) { + const prLabels = pr.labels.map(label => label.name.toLowerCase()); + + let prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; + + if (pr.user.login === "push-app-to-main") { + const scriptName = pr.title; + if (scriptName) { + try { + const { data: relatedIssues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: "ProxmoxVED", + state: "all", + labels: ["Started Migration To ProxmoxVE"], + per_page: 5 + }); + const matchingIssue = relatedIssues.find(issue => + issue.title.toLowerCase().includes(scriptName.toLowerCase()) + ); + if (matchingIssue) { + const issueAuthor = matchingIssue.user.login; + const issueAuthorUrl = `https://github.com/${issueAuthor}`; + prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; + } + } catch (error) { + console.error(`Error fetching related issues: ${error}`); } - } catch (error) { - console.error(`Error fetching related issues: ${error}`); - } - } else { - prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; - } - - const updateScriptsCategory = categorizedPRs.find(category => - category.labels.some(label => prLabels.includes(label)) - ); - - if (updateScriptsCategory) { - const subCategory = updateScriptsCategory.subCategories.find(sub => - sub.labels.some(label => prLabels.includes(label)) - ); - - if (subCategory) { - subCategory.notes.push(prNote); } else { - updateScriptsCategory.notes.push(prNote); + prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + } + } + + // Find matching category + for (const category of categorizedPRs) { + if (category.labels.some(label => prLabels.includes(label))) { + // Check if PR belongs to a subcategory + if (category.subCategories && category.subCategories.length > 0) { + const subCategory = category.subCategories.find(sub => + sub.labels.some(label => prLabels.includes(label)) + ); + + if (subCategory) { + subCategory.notes.push(prNote); + } else { + category.notes.push(prNote); + } + } else { + category.notes.push(prNote); + } } } } - + + return categorizedPRs; + } + + return await main(); - name: Update CHANGELOG.md uses: actions/github-script@v7 @@ -248,4 +257,4 @@ jobs: PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number') if [ -n "$PR_NUMBER" ]; then gh pr review $PR_NUMBER --approve - fi + fi \ No newline at end of file From 92dd4bcae28c146b7b61692dd4f85a6bcdfa85a3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 13:29:02 +0100 Subject: [PATCH 214/258] Update versions.json (#3376) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 126 ++++++++++++++--------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index b6ba5396b..8cd0116fc 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -2,12 +2,67 @@ { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-23T20:28:38Z" + "date": "2025-03-24T10:36:10Z" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.13.1", + "date": "2025-03-24T09:42:32Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.1.1", + "date": "2025-03-24T08:34:47Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0b2-rc1", + "date": "2025-03-24T07:20:45Z" + }, + { + "name": "cockpit-project/cockpit", + "version": "336", + "date": "2025-03-24T07:16:02Z" + }, + { + "name": "icereed/paperless-gpt", + "version": "v0.14.0", + "date": "2025-03-24T07:03:24Z" + }, + { + "name": "nzbgetcom/nzbget", + "version": "v24.8", + "date": "2025-03-18T07:33:51Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1685", + "date": "2025-03-24T05:54:06Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.26.3", + "date": "2025-03-24T04:42:52Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.10", + "date": "2025-03-22T13:02:26Z" + }, + { + "name": "requarks/wiki", + "version": "v2.5.307", + "date": "2025-03-24T01:33:31Z" + }, + { + "name": "moghtech/komodo", + "version": "v1.17.0", + "date": "2025-03-24T00:46:32Z" }, { "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-03-23T18:02:12Z" + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" }, { "name": "msgbyte/tianji", @@ -19,6 +74,11 @@ "version": "0.49.7", "date": "2025-03-23T15:51:11Z" }, + { + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" + }, { "name": "Lidarr/Lidarr", "version": "v2.10.3.4602", @@ -49,11 +109,6 @@ "version": "v1.32.2.4987", "date": "2025-03-16T09:41:37Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1680", - "date": "2025-03-23T06:10:41Z" - }, { "name": "morpheus65535/bazarr", "version": "v1.5.1", @@ -84,26 +139,11 @@ "version": "sdk/v0.23.0", "date": "2025-03-22T17:26:10Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, - { - "name": "firefly-iii/firefly-iii", - "version": "v6.2.10", - "date": "2025-03-22T13:02:26Z" - }, { "name": "documenso/documenso", "version": "v1.10.0-rc.1", "date": "2025-03-22T06:34:33Z" }, - { - "name": "pocketbase/pocketbase", - "version": "v0.26.2", - "date": "2025-03-22T04:21:44Z" - }, { "name": "ollama/ollama", "version": "v0.6.2", @@ -164,11 +204,6 @@ "version": "v0.14.5-rc5", "date": "2025-03-21T10:50:34Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.1.0", - "date": "2025-03-21T09:17:45Z" - }, { "name": "StarFleetCPTN/GoMFT", "version": "v0.1.18", @@ -269,11 +304,6 @@ "version": "2.2.5", "date": "2025-03-19T09:11:26Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.3.0p29", - "date": "2025-03-19T07:42:50Z" - }, { "name": "Donkie/Spoolman", "version": "v0.22.1", @@ -324,11 +354,6 @@ "version": "3.4.3.post1", "date": "2025-03-18T09:44:59Z" }, - { - "name": "nzbgetcom/nzbget", - "version": "v24.8", - "date": "2025-03-18T07:33:51Z" - }, { "name": "authelia/authelia", "version": "v4.39.1", @@ -344,11 +369,6 @@ "version": "v25.03.3", "date": "2025-03-17T20:55:37Z" }, - { - "name": "semaphoreui/semaphore", - "version": "v2.13.0", - "date": "2025-03-17T19:39:10Z" - }, { "name": "Kareadita/Kavita", "version": "v0.8.5.11", @@ -484,11 +504,6 @@ "version": "2.31.0", "date": "2025-03-13T17:13:47Z" }, - { - "name": "moghtech/komodo", - "version": "v1.16.12", - "date": "2024-12-02T08:46:29Z" - }, { "name": "diced/zipline", "version": "v4.0.1", @@ -499,11 +514,6 @@ "version": "RELEASE.2025-03-12T18-04-18Z", "date": "2025-03-12T18:45:21Z" }, - { - "name": "cockpit-project/cockpit", - "version": "335", - "date": "2025-03-12T13:03:27Z" - }, { "name": "transmission/transmission", "version": "4.0.1-beta.1", @@ -544,11 +554,6 @@ "version": "v0.0.7-hf1", "date": "2025-03-10T20:49:39Z" }, - { - "name": "icereed/paperless-gpt", - "version": "v0.13.0", - "date": "2025-03-10T10:03:12Z" - }, { "name": "AlexxIT/go2rtc", "version": "v1.9.9", @@ -914,11 +919,6 @@ "version": "v1.9.6", "date": "2024-12-18T14:35:37Z" }, - { - "name": "requarks/wiki", - "version": "v2.5.306", - "date": "2025-02-02T21:19:29Z" - }, { "name": "PrivateBin/PrivateBin", "version": "1.7.6", From 247b7477c94a84a06248b241595e9296d8de4895 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:18:00 +0100 Subject: [PATCH 215/258] finaly (#3377) --- .github/workflows/changelog-pr.yml | 68 ++++++++++++++++++------------ 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 4a9099dc7..9041e2e8b 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -89,7 +89,7 @@ jobs: const { data: pulls } = await github.rest.pulls.list({ owner: context.repo.owner, - repo: context.repo.repo, + repo: "ProxmoxVE", base: "main", state: "closed", sort: "updated", @@ -104,24 +104,24 @@ jobs: ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()) ) ); - + for (const pr of filteredPRs) { const prLabels = pr.labels.map(label => label.name.toLowerCase()); - + let prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; - - if (pr.user.login === "push-app-to-main") { + + + if (pr.user.login.includes("push-app-to-main[bot]")) { const scriptName = pr.title; - if (scriptName) { try { const { data: relatedIssues } = await github.rest.issues.listForRepo({ owner: context.repo.owner, - repo: "ProxmoxVED", + repo: "ProxmoxVED", state: "all", - labels: ["Started Migration To ProxmoxVE"], + labels: ["Started Migration To ProxmoxVE"], per_page: 5 - }); - const matchingIssue = relatedIssues.find(issue => + }); + const matchingIssue = relatedIssues.find(issue => issue.title.toLowerCase().includes(scriptName.toLowerCase()) ); if (matchingIssue) { @@ -131,36 +131,48 @@ jobs: } } catch (error) { console.error(`Error fetching related issues: ${error}`); + prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; } - } else { - prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; - } } - - // Find matching category - for (const category of categorizedPRs) { + + + + if (prLabels.includes("new script")) { + const newScriptCategory = categorizedPRs.find(category => + category.title === "New Scripts" || category.labels.includes("new script")); + if (newScriptCategory) { + newScriptCategory.notes.push(prNote); + } + } else { + + let categorized = false; + const priorityCategories = categorizedPRs.slice(); + for (const category of priorityCategories) { + if (categorized) break; if (category.labels.some(label => prLabels.includes(label))) { - // Check if PR belongs to a subcategory if (category.subCategories && category.subCategories.length > 0) { - const subCategory = category.subCategories.find(sub => - sub.labels.some(label => prLabels.includes(label)) - ); - - if (subCategory) { - subCategory.notes.push(prNote); - } else { - category.notes.push(prNote); - } + const subCategory = category.subCategories.find(sub => + sub.labels.some(label => prLabels.includes(label)) + ); + + if (subCategory) { + subCategory.notes.push(prNote); } else { category.notes.push(prNote); } + } else { + category.notes.push(prNote); + } + categorized = true; + } } } + } - + return categorizedPRs; } - + return await main(); - name: Update CHANGELOG.md From 316a6716b04716ce49cd0d026c05a23947f048ff Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:20:17 +0100 Subject: [PATCH 216/258] Update CHANGELOG.md (#3363) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04c6c481a..591c6f0b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,29 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-24 + +### πŸ†• New Scripts + + - yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364)) +- Extension/New Script: Redis Alpine Installation [@MickLesk](https://github.com/MickLesk) ([#3367](https://github.com/community-scripts/ProxmoxVE/pull/3367)) + +### πŸš€ Updated Scripts + + - #### πŸ”§ Refactor + + - Refactor: ErsatzTV Script [@MickLesk](https://github.com/MickLesk) ([#3365](https://github.com/community-scripts/ProxmoxVE/pull/3365)) + +### 🧰 Maintenance + + - #### ✨ New Features + + - [core] install core deps (debian / ubuntu) [@MickLesk](https://github.com/MickLesk) ([#3366](https://github.com/community-scripts/ProxmoxVE/pull/3366)) + + - #### πŸ“‚ Github + + - Refactor Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3371](https://github.com/community-scripts/ProxmoxVE/pull/3371)) + ## 2025-03-23 ### πŸš€ Updated Scripts From 230653102101c855fca0c15b2d0c2599bc0aef22 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:20:56 +0100 Subject: [PATCH 217/258] [core] Rebase Scripts (formatting, highlighting & remove old deps) (#3378) * Big Refactor: Remove Deps / Formatting & Correct End Of Line Sequence * f --- ct/ghost.sh | 6 +-- ct/gitea.sh | 2 +- ct/glance.sh | 2 +- ct/gokapi.sh | 2 +- ct/hev-socks5-server.sh | 2 +- install/2fauth-install.sh | 37 ++++++------- install/actualbudget-install.sh | 7 +-- install/adguard-install.sh | 8 +-- install/adventurelog-install.sh | 35 ++++++------ install/agentdvr-install.sh | 5 +- install/alpine-docker-install.sh | 2 +- install/alpine-grafana-install.sh | 4 +- install/alpine-install.sh | 2 +- install/alpine-it-tools-install.sh | 4 +- install/alpine-nextcloud-install.sh | 4 +- install/alpine-redis-install.sh | 6 +-- install/alpine-vaultwarden-install.sh | 4 +- install/alpine-zigbee2mqtt-install.sh | 2 +- install/apache-cassandra-install.sh | 5 +- install/apache-couchdb-install.sh | 15 +++--- install/apache-guacamole-install.sh | 53 +++++++++---------- install/apache-tika-install.sh | 6 +-- install/apache-tomcat-install.sh | 3 -- install/apt-cacher-ng-install.sh | 8 +-- install/archivebox-install.sh | 9 ++-- install/aria2-install.sh | 10 +--- install/audiobookshelf-install.sh | 5 +- install/authelia-install.sh | 15 ++---- install/authentik-install.sh | 5 +- install/autobrr-install.sh | 8 +-- install/baikal-install.sh | 25 ++++----- install/barcode-buddy-install.sh | 5 +- install/bazarr-install.sh | 10 +--- install/beszel-install.sh | 16 ++---- install/blocky-install.sh | 10 +--- install/boltdiy-install.sh | 5 +- install/bookstack-install.sh | 27 +++++----- install/bunkerweb-install.sh | 7 +-- install/bytestash-install.sh | 3 -- install/caddy-install.sh | 5 +- install/calibre-web-install.sh | 5 +- install/casaos-install.sh | 12 ++--- install/changedetection-install.sh | 5 +- install/channels-install.sh | 5 +- install/checkmk-install.sh | 9 +--- install/cloudflared-install.sh | 8 +-- install/cockpit-install.sh | 8 +-- install/commafeed-install.sh | 7 +-- install/cosmos-install.sh | 14 ++--- install/crafty-controller-install.sh | 15 +++--- install/cronicle-install.sh | 8 +-- install/cross-seed-install.sh | 8 +-- install/cryptpad-install.sh | 3 -- install/daemonsync-install.sh | 5 +- install/dashy-install.sh | 5 +- install/debian-install.sh | 10 +--- install/deconz-install.sh | 8 +-- install/deluge-install.sh | 5 +- install/docker-install.sh | 6 --- install/dockge-install.sh | 8 +-- install/docmost-install.sh | 21 ++++---- install/dolibarr-install.sh | 11 ++-- install/dotnetaspwebapi-install.sh | 13 ++--- install/duplicati-install.sh | 11 ++-- install/elementsynapse-install.sh | 6 +-- install/emby-install.sh | 8 +-- install/emqx-install.sh | 8 +-- install/ersatztv-install.sh | 7 --- install/esphome-install.sh | 3 -- install/evcc-install.sh | 11 ++-- install/excalidraw-install.sh | 7 +-- install/fenrus-install.sh | 5 +- install/fhem-install.sh | 5 +- install/firefly-install.sh | 10 ++-- install/flaresolverr-install.sh | 7 +-- install/flowiseai-install.sh | 5 +- install/fluid-calendar-install.sh | 17 +++--- install/forgejo-install.sh | 7 +-- install/freshrss-install.sh | 16 +++--- install/frigate-install.sh | 10 ++-- install/ghost-install.sh | 16 +++--- install/gitea-install.sh | 7 +-- install/glance-install.sh | 10 +--- install/glpi-install.sh | 21 ++++---- install/go2rtc-install.sh | 8 +-- install/gokapi-install.sh | 10 +--- install/gomft-install.sh | 3 -- install/gotify-install.sh | 10 +--- install/grafana-install.sh | 5 +- install/graylog-install.sh | 18 +++---- install/grist-install.sh | 5 +- install/grocy-install.sh | 5 +- install/habitica-install.sh | 3 -- install/headscale-install.sh | 8 +-- install/heimdall-dashboard-install.sh | 5 +- install/hev-socks5-server-install.sh | 11 +--- install/hivemq-install.sh | 5 +- install/hoarder-install.sh | 21 ++++---- install/homarr-install.sh | 7 +-- install/homeassistant-core-install.sh | 5 +- install/homeassistant-install.sh | 6 --- install/homebox-install.sh | 9 +--- install/homebridge-install.sh | 5 +- install/homepage-install.sh | 9 ++-- install/homer-install.sh | 5 +- install/hyperhdr-install.sh | 5 +- install/hyperion-install.sh | 5 +- install/influxdb-install.sh | 9 ++-- install/inspircd-install.sh | 8 --- install/inventree-install.sh | 7 +-- install/iobroker-install.sh | 5 +- install/iventoy-install.sh | 8 +-- install/jackett-install.sh | 8 +-- install/jellyfin-install.sh | 9 ++-- install/jellyseerr-install.sh | 5 +- install/jenkins-install.sh | 8 +-- install/jupyternotebook-install.sh | 3 -- install/kavita-install.sh | 8 +-- install/keycloak-install.sh | 6 +-- install/kimai-install.sh | 19 +++---- install/koillection-install.sh | 32 +++++------ install/kometa-install.sh | 9 +--- install/komga-install.sh | 8 +-- install/komodo-install.sh | 37 ++++++------- install/kubo-install.sh | 5 +- install/lazylibrarian-install.sh | 5 +- install/lidarr-install.sh | 5 +- install/linkwarden-install.sh | 19 +++---- install/listmonk-install.sh | 20 +++---- install/lldap-install.sh | 5 +- install/lubelogger-install.sh | 11 +--- install/mafl-install.sh | 5 +- install/magicmirror-install.sh | 8 +-- install/mariadb-install.sh | 30 +++++------ install/matterbridge-install.sh | 7 +-- install/mattermost-install.sh | 19 +++---- install/mediamtx-install.sh | 5 +- install/medusa-install.sh | 6 +-- install/memos-install.sh | 9 ++-- install/meshcentral-install.sh | 5 +- install/metube-install.sh | 7 +-- install/minio-install.sh | 11 +--- install/mongodb-install.sh | 7 +-- install/monica-install.sh | 24 ++++----- install/motioneye-install.sh | 5 +- install/mqtt-install.sh | 5 +- install/mylar3-install.sh | 12 ++--- install/myspeed-install.sh | 5 +- install/mysql-install.sh | 39 +++++++------- install/n8n-install.sh | 5 +- install/navidrome-install.sh | 5 +- install/neo4j-install.sh | 7 +-- install/netbox-install.sh | 29 +++++----- install/nextcloudpi-install.sh | 9 +--- install/nextpvr-install.sh | 7 +-- install/nginxproxymanager-install.sh | 3 -- install/nocodb-install.sh | 8 +-- install/node-red-install.sh | 5 +- install/nodebb-install.sh | 35 ++++++------ install/notifiarr-install.sh | 5 +- install/npmplus-install.sh | 1 - install/ntfy-install.sh | 7 +-- install/nxwitness-install.sh | 5 +- install/nzbget-install.sh | 6 +-- install/octoprint-install.sh | 9 ++-- install/ollama-install.sh | 5 +- install/omada-install.sh | 4 +- install/ombi-install.sh | 8 +-- install/omv-install.sh | 6 +-- install/onedev-install.sh | 4 -- install/opengist-install.sh | 6 +-- install/openhab-install.sh | 7 +-- install/openobserve-install.sh | 8 +-- install/openwebui-install.sh | 5 +- install/outline-install.sh | 13 ++--- install/overseerr-install.sh | 5 +- install/owncast-install.sh | 5 +- install/pairdrop-install.sh | 5 +- install/paperless-ai-install.sh | 7 +-- install/paperless-gpt-install.sh | 3 -- install/paperless-ngx-install.sh | 7 +-- install/part-db-install.sh | 28 +++++----- install/paymenter-install.sh | 5 +- install/peanut-install.sh | 5 +- install/pelican-panel-install.sh | 15 +++--- install/pelican-wings-install.sh | 9 +--- install/petio-install.sh | 11 ++-- install/pf2etools-install.sh | 7 +-- install/photoprism-install.sh | 5 +- install/phpipam-install.sh | 27 +++++----- install/pialert-install.sh | 8 +-- install/pihole-install.sh | 6 +-- install/pingvin-install.sh | 3 -- install/plant-it-install.sh | 3 -- install/plex-install.sh | 5 +- install/pocketbase-install.sh | 8 +-- install/pocketid-install.sh | 7 +-- install/podman-homeassistant-install.sh | 22 +++----- install/podman-install.sh | 23 +++----- install/postgresql-install.sh | 5 +- install/privatebin-install.sh | 5 +- install/projectsend-install.sh | 29 +++++----- install/prometheus-alertmanager-install.sh | 9 +--- install/prometheus-install.sh | 9 +--- ...ometheus-paperless-ngx-exporter-install.sh | 11 +--- install/prometheus-pve-exporter-install.sh | 11 +--- install/prowlarr-install.sh | 5 +- install/proxmox-backup-server-install.sh | 8 +-- install/proxmox-datacenter-manager-install.sh | 8 +-- install/proxmox-mail-gateway-install.sh | 12 +---- install/ps5-mqtt-install.sh | 10 ++-- install/pterodactyl-panel-install.sh | 27 +++++----- install/pterodactyl-wings-install.sh | 9 +--- install/qbittorrent-install.sh | 8 +-- install/rabbitmq-install.sh | 7 +-- install/radarr-install.sh | 3 -- install/radicale-install.sh | 3 -- install/rdtclient-install.sh | 7 --- install/readarr-install.sh | 5 +- install/readeck-install.sh | 8 +-- install/recyclarr-install.sh | 5 +- install/redis-install.sh | 5 +- install/revealjs-install.sh | 6 +-- install/rtsptoweb-install.sh | 5 +- install/runtipi-install.sh | 10 +--- install/rustdeskserver-install.sh | 11 +--- install/sabnzbd-install.sh | 5 +- install/seafile-install.sh | 20 +++---- install/searxng-install.sh | 15 +++--- install/seelf-install.sh | 19 ++++--- install/semaphore-install.sh | 5 +- install/sftpgo-install.sh | 5 +- install/shinobi-install.sh | 11 ++-- install/silverbullet-install.sh | 7 --- install/smokeping-install.sh | 8 +-- install/snipeit-install.sh | 3 -- install/sonarr-install.sh | 7 +-- install/spoolman-install.sh | 5 +- install/sqlserver2022-install.sh | 3 -- install/stirling-pdf-install.sh | 7 +-- install/suwayomiserver-install.sh | 7 +-- install/syncthing-install.sh | 5 +- install/tandoor-install.sh | 21 ++++---- install/tasmoadmin-install.sh | 5 +- install/tasmocompiler-install.sh | 7 +-- install/tautulli-install.sh | 5 +- install/tdarr-install.sh | 5 +- install/technitiumdns-install.sh | 8 +-- install/teddycloud-install.sh | 6 +-- install/the-lounge-install.sh | 6 +-- install/threadfin-install.sh | 5 +- install/tianji-install.sh | 9 ++-- install/traccar-install.sh | 10 +--- install/traefik-install.sh | 6 +-- install/transmission-install.sh | 9 +--- install/trilium-install.sh | 9 +--- install/typesense-install.sh | 11 +--- install/ubuntu-install.sh | 8 +-- install/umami-install.sh | 5 +- install/umbrel-install.sh | 10 +--- install/unbound-install.sh | 9 +--- install/unifi-install.sh | 7 +-- install/unmanic-install.sh | 7 +-- install/uptimekuma-install.sh | 5 +- install/urbackupserver-install.sh | 5 +- install/vaultwarden-install.sh | 5 +- install/victoriametrics-install.sh | 7 --- install/vikunja-install.sh | 8 +-- install/wallos-install.sh | 13 ++--- install/wastebin-install.sh | 7 --- install/watcharr-install.sh | 7 +-- install/watchyourlan-install.sh | 4 +- install/wavelog-install.sh | 16 +++--- install/web-check-install.sh | 13 ++--- install/wger-install.sh | 13 ++--- install/whisparr-install.sh | 7 +-- install/whoogle-install.sh | 8 +-- install/wikijs-install.sh | 15 +++--- install/wireguard-install.sh | 7 +-- install/wordpress-install.sh | 28 +++++----- install/yt-dlp-webui-install.sh | 6 +-- install/yunohost-install.sh | 3 -- install/zabbix-install.sh | 7 --- install/zammad-install.sh | 7 +-- install/zerotier-one-install.sh | 20 +++---- install/zigbee2mqtt-install.sh | 5 +- install/zipline-install.sh | 7 +-- install/zitadel-install.sh | 33 +++++------- install/zoraxy-install.sh | 10 +--- install/zwave-js-ui-install.sh | 11 +--- 290 files changed, 794 insertions(+), 1891 deletions(-) diff --git a/ct/ghost.sh b/ct/ghost.sh index 5aa325317..bb50897ee 100644 --- a/ct/ghost.sh +++ b/ct/ghost.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +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 @@ -25,7 +25,7 @@ function update_script() { check_container_resources msg_info "Updating ${APP} LXC" - if command -v ghost &> /dev/null; then + 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 @@ -49,4 +49,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}:2368${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2368${CL}" diff --git a/ct/gitea.sh b/ct/gitea.sh index 975855fb7..4c09fdb0c 100644 --- a/ct/gitea.sh +++ b/ct/gitea.sh @@ -46,4 +46,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/glance.sh b/ct/glance.sh index 448193ed4..88552383f 100644 --- a/ct/glance.sh +++ b/ct/glance.sh @@ -64,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}:8080${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/gokapi.sh b/ct/gokapi.sh index 740160720..74ff5c04d 100644 --- a/ct/gokapi.sh +++ b/ct/gokapi.sh @@ -38,4 +38,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}:53842/setup${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:53842/setup${CL}" diff --git a/ct/hev-socks5-server.sh b/ct/hev-socks5-server.sh index f439d4284..84e9bd287 100644 --- a/ct/hev-socks5-server.sh +++ b/ct/hev-socks5-server.sh @@ -61,4 +61,4 @@ msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW} Access it with a SOCKS5 client using the following URL:${CL}" echo -e "${TAB}${GATEWAY}${BGN}${IP}:1080${CL}" -echo -e "${INFO}${YW} and the credentials stored at /root/hev.creds${CL}" \ No newline at end of file +echo -e "${INFO}${YW} and the credentials stored at /root/hev.creds${CL}" diff --git a/install/2fauth-install.sh b/install/2fauth-install.sh index 7b87822aa..e7b3af6d0 100644 --- a/install/2fauth-install.sh +++ b/install/2fauth-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docs.2fauth.app/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,13 +15,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - nginx \ - composer \ - php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli} \ - mariadb-server + nginx \ + composer \ + php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli} \ + mariadb-server msg_ok "Installed Dependencies" msg_info "Setting up Database" @@ -32,30 +29,30 @@ $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 "2FAuth Credentials" - echo "Database User: $DB_USER" - echo "Database Password: $DB_PASS" - echo "Database Name: $DB_NAME" -} >> ~/2FAuth.creds + echo "2FAuth Credentials" + echo "Database User: $DB_USER" + echo "Database Password: $DB_PASS" + echo "Database Name: $DB_NAME" +} >>~/2FAuth.creds msg_ok "Set up Database" msg_info "Setup 2FAuth" RELEASE=$(curl -s https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -q "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip" unzip -q "${RELEASE}.zip" -mv "2FAuth-${RELEASE//v}/" /opt/2fauth +mv "2FAuth-${RELEASE//v/}/" /opt/2fauth cd "/opt/2fauth" || return cp .env.example .env IPADDRESS=$(hostname -I | awk '{print $1}') sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \ - -e "s|^DB_CONNECTION=$|DB_CONNECTION=mysql|" \ - -e "s|^DB_DATABASE=$|DB_DATABASE=$DB_NAME|" \ - -e "s|^DB_HOST=$|DB_HOST=127.0.0.1|" \ - -e "s|^DB_PORT=$|DB_PORT=3306|" \ - -e "s|^DB_USERNAME=$|DB_USERNAME=$DB_USER|" \ - -e "s|^DB_PASSWORD=$|DB_PASSWORD=$DB_PASS|" .env + -e "s|^DB_CONNECTION=$|DB_CONNECTION=mysql|" \ + -e "s|^DB_DATABASE=$|DB_DATABASE=$DB_NAME|" \ + -e "s|^DB_HOST=$|DB_HOST=127.0.0.1|" \ + -e "s|^DB_PORT=$|DB_PORT=3306|" \ + -e "s|^DB_USERNAME=$|DB_USERNAME=$DB_USER|" \ + -e "s|^DB_PASSWORD=$|DB_PASSWORD=$DB_PASS|" .env export COMPOSER_ALLOW_SUPERUSER=1 $STD composer update --no-plugins --no-scripts diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh index 2c56f2351..7403c5196 100644 --- a/install/actualbudget-install.sh +++ b/install/actualbudget-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://actualbudget.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ tini \ gpg \ build-essential @@ -46,7 +43,7 @@ mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migratio chown -R root:root /opt/actualbudget-data chmod -R 755 /opt/actualbudget-data -cat < /opt/actualbudget-data/.env +cat </opt/actualbudget-data/.env ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload ACTUAL_DATA_DIR=/opt/actualbudget-data ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files diff --git a/install/adguard-install.sh b/install/adguard-install.sh index 9adf15389..877324d79 100644 --- a/install/adguard-install.sh +++ b/install/adguard-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://adguard.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing AdGuard Home" $STD tar zxvf <(curl -fsSL https://static.adtidy.org/adguardhome/release/AdGuardHome_linux_amd64.tar.gz) -C /opt msg_ok "Installed AdGuard Home" diff --git a/install/adventurelog-install.sh b/install/adventurelog-install.sh index 16ad60dc9..dbaaf823e 100644 --- a/install/adventurelog-install.sh +++ b/install/adventurelog-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/seanmorley15/AdventureLog -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -17,9 +17,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ gpg \ - curl \ - sudo \ - mc \ gdal-bin \ libgdal-dev \ git \ @@ -57,12 +54,12 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8' $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" { - echo "AdventureLog-Credentials" - echo "AdventureLog Database User: $DB_USER" - echo "AdventureLog Database Password: $DB_PASS" - echo "AdventureLog Database Name: $DB_NAME" - echo "AdventureLog Secret: $SECRET_KEY" -} >> ~/adventurelog.creds + echo "AdventureLog-Credentials" + echo "AdventureLog Database User: $DB_USER" + echo "AdventureLog Database Password: $DB_PASS" + echo "AdventureLog Database Name: $DB_NAME" + echo "AdventureLog Secret: $SECRET_KEY" +} >>~/adventurelog.creds msg_ok "Set up PostgreSQL" msg_info "Installing AdventureLog (Patience)" @@ -74,7 +71,7 @@ RELEASE=$(curl -s https://api.github.com/repos/seanmorley15/AdventureLog/release wget -q "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip" unzip -q v${RELEASE}.zip mv AdventureLog-${RELEASE} /opt/adventurelog -cat < /opt/adventurelog/backend/server/.env +cat </opt/adventurelog/backend/server/.env PGHOST='localhost' PGDATABASE='${DB_NAME}' PGUSER='${DB_USER}' @@ -103,7 +100,7 @@ $STD pip install -r requirements.txt $STD python3 manage.py collectstatic --noinput $STD python3 manage.py migrate $STD python3 manage.py download-countries -cat < /opt/adventurelog/frontend/.env +cat </opt/adventurelog/frontend/.env PUBLIC_SERVER_URL=http://$LOCAL_IP:8000 BODY_SIZE_LIMIT=Infinity ORIGIN='http://$LOCAL_IP:3000' @@ -115,7 +112,7 @@ echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed AdventureLog" msg_info "Setting up Django Admin" -$STD python3 /opt/adventurelog/backend/server/manage.py shell << EOF +$STD python3 /opt/adventurelog/backend/server/manage.py shell <> ~/adventurelog.creds + echo "" + echo "Django-Credentials" + echo "Django Admin User: $DJANGO_ADMIN_USER" + echo "Django Admin Password: $DJANGO_ADMIN_PASS" +} >>~/adventurelog.creds msg_ok "Setup Django Admin" msg_info "Creating Service" @@ -171,4 +168,4 @@ msg_info "Cleaning up" rm -rf /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/agentdvr-install.sh b/install/agentdvr-install.sh index 4aeb19b18..58272816f 100644 --- a/install/agentdvr-install.sh +++ b/install/agentdvr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.ispyconnect.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 unzip $STD apt-get install -y apt-transport-https $STD apt-get install -y alsa-utils diff --git a/install/alpine-docker-install.sh b/install/alpine-docker-install.sh index cd5068a45..3330d7dde 100644 --- a/install/alpine-docker-install.sh +++ b/install/alpine-docker-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.docker.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors diff --git a/install/alpine-grafana-install.sh b/install/alpine-grafana-install.sh index 424354d74..8deae4dff 100644 --- a/install/alpine-grafana-install.sh +++ b/install/alpine-grafana-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://grafana.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -29,4 +29,4 @@ $STD rc-update add grafana default msg_ok "Installed Grafana" motd_ssh -customize \ No newline at end of file +customize diff --git a/install/alpine-install.sh b/install/alpine-install.sh index e288d2faf..aabf22346 100644 --- a/install/alpine-install.sh +++ b/install/alpine-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://alpinelinux.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors diff --git a/install/alpine-it-tools-install.sh b/install/alpine-it-tools-install.sh index f6bdca6a8..d8bb390c8 100644 --- a/install/alpine-it-tools-install.sh +++ b/install/alpine-it-tools-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://it-tools.tech/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -30,7 +30,7 @@ curl -fsSL -o it-tools.zip "$DOWNLOAD_URL" mkdir -p /usr/share/nginx/html unzip -q it-tools.zip -d /tmp/it-tools cp -r /tmp/it-tools/dist/* /usr/share/nginx/html -cat <<'EOF' > /etc/nginx/http.d/default.conf +cat <<'EOF' >/etc/nginx/http.d/default.conf server { listen 80; server_name localhost; diff --git a/install/alpine-nextcloud-install.sh b/install/alpine-nextcloud-install.sh index b0510b8c1..bbfed7e2d 100644 --- a/install/alpine-nextcloud-install.sh +++ b/install/alpine-nextcloud-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://nextcloud.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -139,7 +139,7 @@ server { } EOF sed -i -e 's|memory_limit = 128M|memory_limit = 512M|; $aapc.enable_cli=1' /etc/php83/php.ini -sed -i -e 's|upload_max_file_size = 2M|upload_max_file_size = 16G|' /etc/php83/php.ini +sed -i -e 's|upload_max_file_size = 2M|upload_max_file_size = 16G|' /etc/php83/php.ini sed -i -E '/^php_admin_(flag|value)\[opcache/s/^/;/' /etc/php83/php-fpm.d/nextcloud.conf msg_ok "Installed Nextcloud" diff --git a/install/alpine-redis-install.sh b/install/alpine-redis-install.sh index 2fb4140cd..5657e2c7e 100644 --- a/install/alpine-redis-install.sh +++ b/install/alpine-redis-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://redis.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -21,7 +21,7 @@ $STD apk add \ nano \ mc \ gpg - + msg_ok "Installed Dependencies" msg_info "Installing Redis" @@ -32,4 +32,4 @@ $STD rc-service redis start msg_ok "Installed Redis" motd_ssh -customize \ No newline at end of file +customize diff --git a/install/alpine-vaultwarden-install.sh b/install/alpine-vaultwarden-install.sh index 8483f951e..9d6767854 100644 --- a/install/alpine-vaultwarden-install.sh +++ b/install/alpine-vaultwarden-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/dani-garcia/vaultwarden -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -32,7 +32,7 @@ msg_ok "Installed Alpine-Vaultwarden" msg_info "Installing Web-Vault" $STD apk add vaultwarden-web-vault -msg_ok "Installed Web-Vault" +msg_ok "Installed Web-Vault" msg_info "Starting Alpine-Vaultwarden" $STD rc-service vaultwarden start diff --git a/install/alpine-zigbee2mqtt-install.sh b/install/alpine-zigbee2mqtt-install.sh index ecd27be72..dee853801 100644 --- a/install/alpine-zigbee2mqtt-install.sh +++ b/install/alpine-zigbee2mqtt-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.zigbee2mqtt.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors diff --git a/install/apache-cassandra-install.sh b/install/apache-cassandra-install.sh index 2337badb9..0c784345b 100644 --- a/install/apache-cassandra-install.sh +++ b/install/apache-cassandra-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://cassandra.apache.org/_/index.html -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https $STD apt-get install -y gpg msg_ok "Installed Dependencies" diff --git a/install/apache-couchdb-install.sh b/install/apache-couchdb-install.sh index 98c60572e..eea4b8413 100644 --- a/install/apache-couchdb-install.sh +++ b/install/apache-couchdb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://couchdb.apache.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https $STD apt-get install -y gnupg msg_ok "Installed Dependencies" @@ -24,11 +21,11 @@ msg_ok "Installed Dependencies" msg_info "Installing Apache CouchDB" ERLANG_COOKIE=$(openssl rand -base64 32) ADMIN_PASS="$(openssl rand -base64 18 | cut -c1-13)" -debconf-set-selections <<< "couchdb couchdb/cookie string $ERLANG_COOKIE" -debconf-set-selections <<< "couchdb couchdb/mode select standalone" -debconf-set-selections <<< "couchdb couchdb/bindaddress string 0.0.0.0" -debconf-set-selections <<< "couchdb couchdb/adminpass password $ADMIN_PASS" -debconf-set-selections <<< "couchdb couchdb/adminpass_again password $ADMIN_PASS" +debconf-set-selections <<<"couchdb couchdb/cookie string $ERLANG_COOKIE" +debconf-set-selections <<<"couchdb couchdb/mode select standalone" +debconf-set-selections <<<"couchdb couchdb/bindaddress string 0.0.0.0" +debconf-set-selections <<<"couchdb couchdb/adminpass password $ADMIN_PASS" +debconf-set-selections <<<"couchdb couchdb/adminpass_again password $ADMIN_PASS" curl -fsSL https://couchdb.apache.org/repo/keys.asc | gpg --dearmor -o /usr/share/keyrings/couchdb-archive-keyring.gpg VERSION_CODENAME="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" echo "deb [signed-by=/usr/share/keyrings/couchdb-archive-keyring.gpg] https://apache.jfrog.io/artifactory/couchdb-deb/ ${VERSION_CODENAME} main" >/etc/apt/sources.list.d/couchdb.sources.list diff --git a/install/apache-guacamole-install.sh b/install/apache-guacamole-install.sh index d4ab310b9..fca785d45 100644 --- a/install/apache-guacamole-install.sh +++ b/install/apache-guacamole-install.sh @@ -14,30 +14,29 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - build-essential \ - curl \ - jq \ - libcairo2-dev \ - libturbojpeg0 \ - libpng-dev \ - libtool-bin \ - libossp-uuid-dev \ - libvncserver-dev \ - freerdp2-dev \ - libssh2-1-dev \ - libtelnet-dev \ - libwebsockets-dev \ - libpulse-dev \ - libvorbis-dev \ - libwebp-dev \ - libssl-dev \ - libpango1.0-dev \ - libswscale-dev \ - libavcodec-dev \ - libavutil-dev \ - libavformat-dev \ - mariadb-server \ - default-jdk + build-essential \ + jq \ + libcairo2-dev \ + libturbojpeg0 \ + libpng-dev \ + libtool-bin \ + libossp-uuid-dev \ + libvncserver-dev \ + freerdp2-dev \ + libssh2-1-dev \ + libtelnet-dev \ + libwebsockets-dev \ + libpulse-dev \ + libvorbis-dev \ + libwebp-dev \ + libssl-dev \ + libpango1.0-dev \ + libswscale-dev \ + libavcodec-dev \ + libavutil-dev \ + libavformat-dev \ + mariadb-server \ + default-jdk msg_ok "Installed Dependencies" msg_info "Setup Apache Tomcat" @@ -84,7 +83,7 @@ mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVI echo "Database User: $DB_USER" echo "Database Password: $DB_PASS" echo "Database Name: $DB_NAME" -} >> ~/guacamole.creds +} >>~/guacamole.creds cd guacamole-auth-jdbc-1.5.5/mysql/schema cat *.sql | mysql -u root ${DB_NAME} { @@ -94,7 +93,7 @@ cat *.sql | mysql -u root ${DB_NAME} echo "mysql-username: $DB_USER" echo "mysql-password: $DB_PASS" -} >> /etc/guacamole/guacamole.properties +} >>/etc/guacamole/guacamole.properties msg_ok "Setup Database" msg_info "Setup Service" @@ -147,7 +146,7 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf ~/mysql-connector-java-8.0.26{,.tar.gz} +rm -rf ~/mysql-connector-java-8.0.26{,.tar.gz} rm -rf ~/guacamole-auth-jdbc-1.5.5{,.tar.gz} $STD apt-get -y autoremove $STD apt-get -y autoclean diff --git a/install/apache-tika-install.sh b/install/apache-tika-install.sh index 1976e60bc..ab6955aa9 100644 --- a/install/apache-tika-install.sh +++ b/install/apache-tika-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/apache/tika/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ software-properties-common \ gdal-bin \ tesseract-ocr \ @@ -26,6 +23,7 @@ $STD apt-get install -y \ tesseract-ocr-fra \ tesseract-ocr-spa \ tesseract-ocr-deu + $STD echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections $STD apt-get install -y \ xfonts-utils \ diff --git a/install/apache-tomcat-install.sh b/install/apache-tomcat-install.sh index 26e11f0fe..4a915be22 100644 --- a/install/apache-tomcat-install.sh +++ b/install/apache-tomcat-install.sh @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ gnupg2 \ - curl \ - sudo \ - mc \ lsb-release \ gpg \ apt-transport-https diff --git a/install/apt-cacher-ng-install.sh b/install/apt-cacher-ng-install.sh index 8cb628a16..e831c46eb 100644 --- a/install/apt-cacher-ng-install.sh +++ b/install/apt-cacher-ng-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://wiki.debian.org/AptCacherNg -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Apt-Cacher NG" DEBIAN_FRONTEND=noninteractive $STD apt-get -o Dpkg::Options::="--force-confold" install -y apt-cacher-ng sed -i 's/# PassThroughPattern: .* # this would allow CONNECT to everything/PassThroughPattern: .*/' /etc/apt-cacher-ng/acng.conf diff --git a/install/archivebox-install.sh b/install/archivebox-install.sh index 3c7f9f655..f0c9846e0 100644 --- a/install/archivebox-install.sh +++ b/install/archivebox-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://archivebox.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ expect \ libssl-dev \ @@ -48,8 +45,8 @@ $STD apt-get install -y nodejs msg_ok "Installed Node.js" msg_info "Installing Playwright" -$STD pip install playwright -$STD playwright install-deps chromium +$STD pip install playwright +$STD playwright install-deps chromium msg_ok "Installed Playwright" msg_info "Installing Chromium and ArchiveBox" diff --git a/install/aria2-install.sh b/install/aria2-install.sh index 2e33edcb3..571dc2684 100644 --- a/install/aria2-install.sh +++ b/install/aria2-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://aria2.github.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Aria2" $STD apt-get install -y aria2 msg_ok "Installed Aria2" @@ -95,4 +89,4 @@ msg_info "Cleaning up" rm AriaNg-*-AllInOne.zip $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/audiobookshelf-install.sh b/install/audiobookshelf-install.sh index 2b621f7a7..0d9adf48f 100644 --- a/install/audiobookshelf-install.sh +++ b/install/audiobookshelf-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.audiobookshelf.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,10 +14,7 @@ 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 gnupg -$STD apt-get install -y mc msg_ok "Installed Dependencies" msg_info "Installing audiobookshelf" diff --git a/install/authelia-install.sh b/install/authelia-install.sh index 2ea34521c..cc97e8219 100644 --- a/install/authelia-install.sh +++ b/install/authelia-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.authelia.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 Authelia" RELEASE=$(curl -s https://api.github.com/repos/authelia/authelia/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -q "https://github.com/authelia/authelia/releases/download/${RELEASE}/authelia_${RELEASE}_amd64.deb" @@ -30,9 +23,9 @@ read -p "Enter your domain (ex. example.com): " DOMAIN msg_info "Setting Authelia up" touch /etc/authelia/emails.txt -JWT_SECRET=$(openssl rand -hex 64) -SESSION_SECRET=$(openssl rand -hex 64) -STORAGE_KEY=$(openssl rand -hex 64) +JWT_SECRET=$(openssl rand -hex 64) +SESSION_SECRET=$(openssl rand -hex 64) +STORAGE_KEY=$(openssl rand -hex 64) cat </etc/authelia/users.yml users: authelia: diff --git a/install/authentik-install.sh b/install/authentik-install.sh index 8fedc347c..1f9d79f54 100644 --- a/install/authentik-install.sh +++ b/install/authentik-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gpg \ pkg-config \ libffi-dev \ @@ -104,7 +101,7 @@ DB_USER="authentik" DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;" $STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" -$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" +$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" $STD sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;" $STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;" msg_ok "Installed PostgreSQL" diff --git a/install/autobrr-install.sh b/install/autobrr-install.sh index f0550a06c..4fc19d1df 100644 --- a/install/autobrr-install.sh +++ b/install/autobrr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://autobrr.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Autobrr" wget -q $(curl -s https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4) tar -C /usr/local/bin -xzf autobrr*.tar.gz diff --git a/install/baikal-install.sh b/install/baikal-install.sh index ab452287a..0a13a9b12 100644 --- a/install/baikal-install.sh +++ b/install/baikal-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://sabre.io/baikal/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,13 +15,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - postgresql \ - apache2 \ - libapache2-mod-php \ - php-{pgsql,dom} + postgresql \ + apache2 \ + libapache2-mod-php \ + php-{pgsql,dom} msg_ok "Installed Dependencies" msg_info "Setting up PostgreSQL" @@ -31,11 +28,11 @@ DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" { -echo "Baikal Credentials" -echo "Baikal Database User: $DB_USER" -echo "Baikal Database Password: $DB_PASS" -echo "Baikal Database Name: $DB_NAME" -} >> ~/baikal.creds + echo "Baikal Credentials" + echo "Baikal Database User: $DB_USER" + echo "Baikal Database Password: $DB_PASS" + echo "Baikal Database Name: $DB_NAME" +} >>~/baikal.creds msg_ok "Set up PostgreSQL" msg_info "Installing Baikal" @@ -57,7 +54,7 @@ echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed Baikal" msg_info "Creating Service" -cat < /etc/apache2/sites-available/baikal.conf +cat </etc/apache2/sites-available/baikal.conf ServerName baikal DocumentRoot /opt/baikal/html diff --git a/install/barcode-buddy-install.sh b/install/barcode-buddy-install.sh index 3de9aae24..0c5763f83 100644 --- a/install/barcode-buddy-install.sh +++ b/install/barcode-buddy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Forceu/barcodebuddy -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ apache2 \ redis \ php-{curl,date,json,mbstring,redis,sqlite3,sockets} \ diff --git a/install/bazarr-install.sh b/install/bazarr-install.sh index 5dd3c1a23..2802de084 100755 --- a/install/bazarr-install.sh +++ b/install/bazarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.bazarr.media/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Setup Python3" $STD apt-get install -y \ python3 \ @@ -65,4 +59,4 @@ msg_info "Cleaning up" rm -rf bazarr.zip $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/beszel-install.sh b/install/beszel-install.sh index 46554721c..0c508a289 100644 --- a/install/beszel-install.sh +++ b/install/beszel-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://beszel.dev/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,17 +13,9 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - tar \ - sudo \ - mc -msg_ok "Installed Dependencies" - msg_info "Installing Beszel" -mkdir -p /opt/beszel -curl -sL "https://github.com/henrygd/beszel/releases/latest/download/beszel_$(uname -s)_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/').tar.gz" | tar -xz -O beszel | tee /opt/beszel/beszel >/dev/null +mkdir -p /opt/beszel +curl -sL "https://github.com/henrygd/beszel/releases/latest/download/beszel_$(uname -s)_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/').tar.gz" | tar -xz -O beszel | tee /opt/beszel/beszel >/dev/null chmod +x /opt/beszel/beszel msg_ok "Installed Beszel" @@ -51,4 +43,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/blocky-install.sh b/install/blocky-install.sh index b3d3ee870..b03174407 100644 --- a/install/blocky-install.sh +++ b/install/blocky-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://0xerr0r.github.io/blocky/latest/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,14 +13,8 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Blocky" -if systemctl is-active systemd-resolved > /dev/null 2>&1; then +if systemctl is-active systemd-resolved >/dev/null 2>&1; then systemctl disable -q --now systemd-resolved fi mkdir /opt/blocky diff --git a/install/boltdiy-install.sh b/install/boltdiy-install.sh index 17b4b2fec..809191336 100644 --- a/install/boltdiy-install.sh +++ b/install/boltdiy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/stackblitz-labs/bolt.diy/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gnupg \ git msg_ok "Installed Dependencies" diff --git a/install/bookstack-install.sh b/install/bookstack-install.sh index 6e288e54c..4d5340e7b 100644 --- a/install/bookstack-install.sh +++ b/install/bookstack-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/BookStackApp/BookStack -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,16 +15,13 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - unzip \ - mariadb-server \ - apache2 \ - curl \ - sudo \ - php8.2-{mbstring,gd,fpm,curl,intl,ldap,tidy,bz2,mysql,zip,xml} \ - composer \ - libapache2-mod-php \ - make \ - mc + unzip \ + mariadb-server \ + apache2 \ + php8.2-{mbstring,gd,fpm,curl,intl,ldap,tidy,bz2,mysql,zip,xml} \ + composer \ + libapache2-mod-php \ + make msg_ok "Installed Dependencies" msg_info "Setting up Database" @@ -39,7 +36,7 @@ $STD sudo mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; F echo "Bookstack Database User: $DB_USER" echo "Bookstack Database Password: $DB_PASS" echo "Bookstack Database Name: $DB_NAME" -} >> ~/bookstack.creds +} >>~/bookstack.creds msg_ok "Set up database" msg_info "Setup Bookstack (Patience)" @@ -58,8 +55,8 @@ sudo sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" /opt/bookstack/.env $STD composer install --no-dev --no-plugins --no-interaction $STD php artisan key:generate --no-interaction --force $STD php artisan migrate --no-interaction --force -chown www-data:www-data -R /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage -chmod -R 755 /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage +chown www-data:www-data -R /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage +chmod -R 755 /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage chmod -R 775 /opt/bookstack/storage /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads chmod -R 640 /opt/bookstack/.env $STD a2enmod rewrite @@ -106,7 +103,7 @@ cat </etc/apache2/sites-available/bookstack.conf EOF $STD a2ensite bookstack.conf -$STD a2dissite 000-default.conf +$STD a2dissite 000-default.conf $STD systemctl reload apache2 msg_ok "Created Services" diff --git a/install/bunkerweb-install.sh b/install/bunkerweb-install.sh index 70df88a77..c9bb6cb1a 100644 --- a/install/bunkerweb-install.sh +++ b/install/bunkerweb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.bunkerweb.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,12 +14,9 @@ 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 apt-transport-https -$STD apt-get install -y lsb-release +$STD apt-get install -y lsb-release msg_ok "Installed Dependencies" msg_info "Installing Nginx" diff --git a/install/bytestash-install.sh b/install/bytestash-install.sh index 51a80eeac..9f2b65988 100644 --- a/install/bytestash-install.sh +++ b/install/bytestash-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - sudo \ - curl \ - mc \ gnupg msg_ok "Installed Dependencies" diff --git a/install/caddy-install.sh b/install/caddy-install.sh index f17bcd5f7..9542a71e7 100644 --- a/install/caddy-install.sh +++ b/install/caddy-install.sh @@ -18,10 +18,7 @@ $STD apt-get install -y \ debian-keyring \ debian-archive-keyring \ apt-transport-https \ - gpg \ - curl \ - sudo \ - mc + gpg msg_ok "Installed Dependencies" msg_info "Installing Caddy" diff --git a/install/calibre-web-install.sh b/install/calibre-web-install.sh index 60bfaf0be..0643cf9b7 100644 --- a/install/calibre-web-install.sh +++ b/install/calibre-web-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/janeczku/calibre-web -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ 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 imagemagick msg_ok "Installed Dependencies" diff --git a/install/casaos-install.sh b/install/casaos-install.sh index 79c502c7d..41ad77aae 100644 --- a/install/casaos-install.sh +++ b/install/casaos-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://casaos.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,17 +13,11 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing CasaOS (Patience)" DOCKER_CONFIG_PATH='/etc/docker/daemon.json' mkdir -p $(dirname $DOCKER_CONFIG_PATH) -echo -e '{\n "log-driver": "journald"\n}' > /etc/docker/daemon.json -$STD bash <(curl -fsSL https://get.casaos.io/v0.4.1) +echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json +$STD bash <(curl -fsSL https://get.casaos.io/) msg_ok "Installed CasaOS" motd_ssh diff --git a/install/changedetection-install.sh b/install/changedetection-install.sh index 5bfa89ac1..cc54b0a35 100644 --- a/install/changedetection-install.sh +++ b/install/changedetection-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://changedetection.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ build-essential \ dumb-init \ diff --git a/install/channels-install.sh b/install/channels-install.sh index 2eec64360..6ec8c49f1 100644 --- a/install/channels-install.sh +++ b/install/channels-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://getchannels.com/dvr-server/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 chromium $STD apt-get install -y xvfb msg_ok "Installed Dependencies" diff --git a/install/checkmk-install.sh b/install/checkmk-install.sh index 7150546f8..fabcc0ba8 100644 --- a/install/checkmk-install.sh +++ b/install/checkmk-install.sh @@ -13,13 +13,6 @@ 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 "Install Checkmk" RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1) wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb -O /opt/checkmk.deb @@ -37,7 +30,7 @@ $STD omd start echo "Application-Credentials" echo "Username: cmkadmin" echo "Password: $PASSWORD" -} >> ~/checkmk.creds +} >>~/checkmk.creds msg_ok "Created Service" msg_info "Cleaning up" diff --git a/install/cloudflared-install.sh b/install/cloudflared-install.sh index 6a6d78a01..2022ab906 100644 --- a/install/cloudflared-install.sh +++ b/install/cloudflared-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.cloudflare.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Cloudflared" mkdir -p --mode=0755 /usr/share/keyrings VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" diff --git a/install/cockpit-install.sh b/install/cockpit-install.sh index 84082413f..67b946c80 100644 --- a/install/cockpit-install.sh +++ b/install/cockpit-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/cockpit-project/cockpit -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,12 +14,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Cockpit" source /etc/os-release echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" >/etc/apt/sources.list.d/backports.list diff --git a/install/commafeed-install.sh b/install/commafeed-install.sh index 5795c584b..b4ec7f162 100644 --- a/install/commafeed-install.sh +++ b/install/commafeed-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.commafeed.com/#/welcome -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 rsync msg_ok "Installed Dependencies" @@ -58,7 +55,7 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf commafeed-${RELEASE}-h2 commafeed-${RELEASE}-h2-jvm.zip zulu-repo_1.0.0-3_all.deb +rm -rf commafeed-${RELEASE}-h2 commafeed-${RELEASE}-h2-jvm.zip zulu-repo_1.0.0-3_all.deb $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/cosmos-install.sh b/install/cosmos-install.sh index 176ca09df..f266a926c 100644 --- a/install/cosmos-install.sh +++ b/install/cosmos-install.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash - #Copyright (c) 2021-2025 community-scripts ORG # Author: Michel Roegl-Brunner (michelroegl-brunner) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE @@ -16,12 +15,9 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - mc \ - sudo \ - snapraid \ - avahi-daemon \ - fdisk + snapraid \ + avahi-daemon \ + fdisk msg_ok "Installed Dependencies" msg_info "Install mergerfs" @@ -37,7 +33,7 @@ $STD sh get-docker.sh rm get-docker.sh msg_ok "Installed Docker" -msg_info "Install Cosmos" +msg_info "Install Cosmos" mkdir -p /opt/cosmos LATEST_RELEASE=$(curl -s https://api.github.com/repos/azukaar/Cosmos-Server/releases/latest | grep "tag_name" | cut -d '"' -f 4) ZIP_FILE="cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip" @@ -51,7 +47,7 @@ chmod +x /opt/cosmos/cosmos msg_ok "Installed Cosmos" msg_info "Creating Service" -cat < /etc/systemd/system/cosmos.service +cat </etc/systemd/system/cosmos.service [Unit] Description=Cosmos Cloud service ConditionFileIsExecutable=/opt/cosmos/start.sh diff --git a/install/crafty-controller-install.sh b/install/crafty-controller-install.sh index 6e5f68785..969b22354 100644 --- a/install/crafty-controller-install.sh +++ b/install/crafty-controller-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docs.craftycontrol.com/pages/getting-started/installation/linux/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies (a lot of patience)" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ sed \ lsb-release \ @@ -66,7 +63,7 @@ $STD sudo -u crafty bash -c ' msg_ok "Installed Craft-Controller and dependencies" msg_info "Setting up Crafty-Controller service" -cat > /etc/systemd/system/crafty-controller.service << 'EOF' +cat >/etc/systemd/system/crafty-controller.service <<'EOF' [Unit] Description=Crafty 4 After=network.target @@ -85,10 +82,10 @@ EOF $STD systemctl enable -q --now crafty-controller sleep 10 { - echo "Crafty-Controller-Credentials" - echo "Username: $(grep -oP '(?<="username": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)" - echo "Password: $(grep -oP '(?<="password": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)" -} >> ~/crafty-controller.creds + echo "Crafty-Controller-Credentials" + echo "Username: $(grep -oP '(?<="username": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)" + echo "Password: $(grep -oP '(?<="password": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)" +} >>~/crafty-controller.creds msg_ok "Crafty-Controller service started" motd_ssh diff --git a/install/cronicle-install.sh b/install/cronicle-install.sh index 0d0bc4ea8..f46604520 100644 --- a/install/cronicle-install.sh +++ b/install/cronicle-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://cronicle.net/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/cross-seed-install.sh b/install/cross-seed-install.sh index 278c01928..6413cf661 100644 --- a/install/cross-seed-install.sh +++ b/install/cross-seed-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.cross-seed.org -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/cryptpad-install.sh b/install/cryptpad-install.sh index 634b4f464..9bf77192a 100644 --- a/install/cryptpad-install.sh +++ b/install/cryptpad-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gnupg \ git msg_ok "Installed Dependencies" diff --git a/install/daemonsync-install.sh b/install/daemonsync-install.sh index 4cbdb6396..9aa62e9f0 100644 --- a/install/daemonsync-install.sh +++ b/install/daemonsync-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://daemonsync.me/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 g++-multilib msg_ok "Installed Dependencies" diff --git a/install/dashy-install.sh b/install/dashy-install.sh index 2eeb34458..2611b179d 100644 --- a/install/dashy-install.sh +++ b/install/dashy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://dashy.to/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/debian-install.sh b/install/debian-install.sh index 6835c1873..e68ea9490 100644 --- a/install/debian-install.sh +++ b/install/debian-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.debian.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,16 +13,10 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - motd_ssh customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/deconz-install.sh b/install/deconz-install.sh index fde873492..e9d74c0d8 100644 --- a/install/deconz-install.sh +++ b/install/deconz-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.phoscon.de/en/conbee2/software#deconz -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Setting Phoscon Repository" VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" curl -fsSL http://phoscon.de/apt/deconz.pub.key >/etc/apt/trusted.gpg.d/deconz.pub.asc diff --git a/install/deluge-install.sh b/install/deluge-install.sh index dc2eeb1eb..f8ebab681 100644 --- a/install/deluge-install.sh +++ b/install/deluge-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.deluge-torrent.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 python3-libtorrent msg_ok "Installed Dependencies" diff --git a/install/docker-install.sh b/install/docker-install.sh index bf45a1d49..7a3615cae 100644 --- a/install/docker-install.sh +++ b/install/docker-install.sh @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - get_latest_release() { curl -sL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4 } diff --git a/install/dockge-install.sh b/install/dockge-install.sh index d443a4006..4f6c5288d 100644 --- a/install/dockge-install.sh +++ b/install/dockge-install.sh @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - get_latest_release() { curl -sL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4 } @@ -75,7 +69,7 @@ services: privileged: true network_mode: host EOF -msg_ok "Added Home Assistant compose.yaml" + msg_ok "Added Home Assistant compose.yaml" fi motd_ssh diff --git a/install/docmost-install.sh b/install/docmost-install.sh index 176f89579..b3580f07e 100644 --- a/install/docmost-install.sh +++ b/install/docmost-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docmost.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,11 +16,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ gpg \ - curl \ - sudo \ redis \ make \ - mc \ postgresql msg_ok "Installed Dependencies" @@ -46,11 +43,11 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8' $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'" { - echo "Docmost-Credentials" - echo "Database Name: $DB_NAME" - echo "Database User: $DB_USER" - echo "Database Password: $DB_PASS" -} >> ~/docmost.creds + echo "Docmost-Credentials" + echo "Database Name: $DB_NAME" + echo "Database User: $DB_USER" + echo "Database Password: $DB_PASS" +} >>~/docmost.creds msg_ok "Set up PostgreSQL" msg_info "Installing Docmost (Patience)" @@ -63,9 +60,9 @@ cd /opt/docmost mv .env.example .env mkdir data sed -i -e "s|APP_SECRET=.*|APP_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)|" \ - -e "s|DATABASE_URL=.*|DATABASE_URL=postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME|" \ - -e "s|FILE_UPLOAD_SIZE_LIMIT=.*|FILE_UPLOAD_SIZE_LIMIT=50mb|" \ - /opt/docmost/.env + -e "s|DATABASE_URL=.*|DATABASE_URL=postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME|" \ + -e "s|FILE_UPLOAD_SIZE_LIMIT=.*|FILE_UPLOAD_SIZE_LIMIT=50mb|" \ + /opt/docmost/.env export NODE_OPTIONS="--max-old-space-size=2048" $STD pnpm install $STD pnpm build diff --git a/install/dolibarr-install.sh b/install/dolibarr-install.sh index cc09e54aa..323eada89 100644 --- a/install/dolibarr-install.sh +++ b/install/dolibarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Dolibarr/dolibarr/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ php-imap \ debconf-utils \ mariadb-server @@ -27,9 +24,9 @@ msg_info "Setting up Database" ROOT_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) $STD sudo mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$ROOT_PASS'); flush privileges;" { - echo "Dolibarr DB Credentials" - echo "MariaDB Root Password: $ROOT_PASS" -} >> ~/dolibarr.creds + echo "Dolibarr DB Credentials" + echo "MariaDB Root Password: $ROOT_PASS" +} >>~/dolibarr.creds msg_ok "Set up database" msg_info "Setup Dolibarr" diff --git a/install/dotnetaspwebapi-install.sh b/install/dotnetaspwebapi-install.sh index a89277028..4c2e8616b 100644 --- a/install/dotnetaspwebapi-install.sh +++ b/install/dotnetaspwebapi-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-9.0&tabs=linux-ubuntu -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -18,6 +18,7 @@ $STD apt-get update $STD apt-get install -y \ ssh \ software-properties-common + $STD add-apt-repository -y ppa:dotnet/backports $STD apt-get install -y \ dotnet-sdk-9.0 \ @@ -37,7 +38,7 @@ FTP_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) usermod --password $(echo ${FTP_PASS} | openssl passwd -1 -stdin) ftpuser mkdir -p /var/www/html usermod -d /var/www/html ftp -usermod -d /var/www/html ftpuser +usermod -d /var/www/html ftpuser chown ftpuser /var/www/html sed -i "s|#write_enable=YES|write_enable=YES|g" /etc/vsftpd.conf @@ -46,10 +47,10 @@ sed -i "s|#chroot_local_user=YES|chroot_local_user=NO|g" /etc/vsftpd.conf systemctl restart -q vsftpd.service { - echo "FTP-Credentials" - echo "Username: ftpuser" - echo "Password: $FTP_PASS" -} >> ~/ftp.creds + echo "FTP-Credentials" + echo "Username: ftpuser" + echo "Password: $FTP_PASS" +} >>~/ftp.creds msg_ok "FTP server setup completed" diff --git a/install/duplicati-install.sh b/install/duplicati-install.sh index faa5087ca..b51ea566c 100644 --- a/install/duplicati-install.sh +++ b/install/duplicati-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/duplicati/duplicati/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ libice6 \ libsm6 \ libfontconfig1 @@ -33,9 +30,9 @@ msg_ok "Finished setting up Duplicati" DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) { - echo "Admin password = ${ADMINPASS}" - echo "Database encryption key = ${DECRYPTKEY}" -} >> ~/duplicati.creds + echo "Admin password = ${ADMINPASS}" + echo "Database encryption key = ${DECRYPTKEY}" +} >>~/duplicati.creds msg_info "Creating Service" cat </etc/systemd/system/duplicati.service diff --git a/install/elementsynapse-install.sh b/install/elementsynapse-install.sh index e0359fd9a..2c288fee0 100644 --- a/install/elementsynapse-install.sh +++ b/install/elementsynapse-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/element-hq/synapse -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,11 +15,7 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - sudo \ - curl \ - mc \ lsb-release \ - wget \ apt-transport-https \ debconf-utils msg_ok "Installed Dependencies" diff --git a/install/emby-install.sh b/install/emby-install.sh index 77fab516b..1e0a59945 100644 --- a/install/emby-install.sh +++ b/install/emby-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://emby.media/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Setting Up Hardware Acceleration" $STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools} if [[ "$CTTYPE" == "0" ]]; then diff --git a/install/emqx-install.sh b/install/emqx-install.sh index 41b809a90..755d1190b 100644 --- a/install/emqx-install.sh +++ b/install/emqx-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.emqx.com/en -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing EMQX" $STD bash <(curl -fsSL https://packagecloud.io/install/repositories/emqx/emqx/script.deb.sh) $STD apt-get install -y emqx diff --git a/install/ersatztv-install.sh b/install/ersatztv-install.sh index a4fad8beb..127ddab82 100644 --- a/install/ersatztv-install.sh +++ b/install/ersatztv-install.sh @@ -13,13 +13,6 @@ 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 FFmpeg (Patience)" cd /usr/local/bin wget -q https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz diff --git a/install/esphome-install.sh b/install/esphome-install.sh index cb64c95e4..3efd1473a 100644 --- a/install/esphome-install.sh +++ b/install/esphome-install.sh @@ -14,9 +14,6 @@ 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 git msg_ok "Installed Dependencies" diff --git a/install/evcc-install.sh b/install/evcc-install.sh index ce2ae44ac..7b493b5c4 100644 --- a/install/evcc-install.sh +++ b/install/evcc-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/evcc-io/evcc -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,16 +16,13 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ lsb-release \ - gpg + gpg msg_ok "Installed Dependencies" msg_info "Setting up evcc Repository" -curl -fsSL https://dl.evcc.io/public/evcc/stable/gpg.EAD5D0E07B0EC0FD.key | gpg --dearmor -o /etc/apt/keyrings/evcc-stable.gpg -echo "deb [signed-by=/etc/apt/keyrings/evcc-stable.gpg] https://dl.evcc.io/public/evcc/stable/deb/debian $(lsb_release -cs) main" >/etc/apt/sources.list.d/evcc-stable.list +curl -fsSL https://dl.evcc.io/public/evcc/stable/gpg.EAD5D0E07B0EC0FD.key | gpg --dearmor -o /etc/apt/keyrings/evcc-stable.gpg +echo "deb [signed-by=/etc/apt/keyrings/evcc-stable.gpg] https://dl.evcc.io/public/evcc/stable/deb/debian $(lsb_release -cs) main" >/etc/apt/sources.list.d/evcc-stable.list $STD apt update msg_ok "evcc Repository setup sucessfully" diff --git a/install/excalidraw-install.sh b/install/excalidraw-install.sh index e83c5aae2..5d273e713 100644 --- a/install/excalidraw-install.sh +++ b/install/excalidraw-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/excalidraw/excalidraw -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gnupg \ xdg-utils msg_ok "Installed Dependencies" @@ -70,4 +67,4 @@ msg_info "Cleaning up" rm -f $temp_file $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/fenrus-install.sh b/install/fenrus-install.sh index 758b1ba33..d9b8b986f 100644 --- a/install/fenrus-install.sh +++ b/install/fenrus-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/revenz/Fenrus -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y sudo -$STD apt-get install -y mc -$STD apt-get install -y curl $STD apt-get install -y git msg_ok "Installed Dependencies" diff --git a/install/fhem-install.sh b/install/fhem-install.sh index d5617b349..c5057c0c9 100644 --- a/install/fhem-install.sh +++ b/install/fhem-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://fhem.de/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 avahi-daemon $STD apt-get install -y gnupg2 msg_ok "Installed Dependencies" diff --git a/install/firefly-install.sh b/install/firefly-install.sh index 20e55441d..023732348 100644 --- a/install/firefly-install.sh +++ b/install/firefly-install.sh @@ -14,10 +14,6 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main" >/etc/apt/sources.list.d/php.list $STD apt-get update @@ -42,7 +38,7 @@ mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVI echo "Firefly Database User: $DB_USER" echo "Firefly Database Password: $DB_PASS" echo "Firefly Database Name: $DB_NAME" -} >> ~/firefly.creds +} >>~/firefly.creds msg_ok "Set up database" msg_info "Installing Firefly III (Patience)" @@ -57,7 +53,7 @@ cd /opt/firefly cp .env.example .env sed -i "s/DB_HOST=.*/DB_HOST=localhost/" /opt/firefly/.env sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" /opt/firefly/.env -echo "export COMPOSER_ALLOW_SUPERUSER=1" >> ~/.bashrc +echo "export COMPOSER_ALLOW_SUPERUSER=1" >>~/.bashrc source ~/.bashrc $STD composer install --no-dev --no-plugins --no-interaction $STD php artisan firefly:upgrade-database @@ -88,7 +84,7 @@ chown www-data:www-data /opt/firefly/storage/oauth-*.key $STD a2enmod php8.4 $STD a2enmod rewrite $STD a2ensite firefly.conf -$STD a2dissite 000-default.conf +$STD a2dissite 000-default.conf $STD systemctl reload apache2 msg_ok "Created Service" diff --git a/install/flaresolverr-install.sh b/install/flaresolverr-install.sh index 27a295bfa..82909e62a 100644 --- a/install/flaresolverr-install.sh +++ b/install/flaresolverr-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/FlareSolverr/FlareSolverr -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ 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 apt-transport-https $STD apt-get install -y gpg $STD apt-get install -y xvfb @@ -25,7 +22,7 @@ msg_ok "Installed Dependencies" msg_info "Installing Chrome" wget -qO- https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg -echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list +echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" >/etc/apt/sources.list.d/google-chrome.list $STD apt update $STD apt install -y google-chrome-stable msg_ok "Installed Chrome" diff --git a/install/flowiseai-install.sh b/install/flowiseai-install.sh index f902364ee..666019fd9 100644 --- a/install/flowiseai-install.sh +++ b/install/flowiseai-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://flowiseai.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/fluid-calendar-install.sh b/install/fluid-calendar-install.sh index 82a96a394..ed5c83b17 100644 --- a/install/fluid-calendar-install.sh +++ b/install/fluid-calendar-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/dotnetfactory/fluid-calendar -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ zip \ gnupg \ postgresql-common @@ -40,12 +37,12 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCO $STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME to $DB_USER;" $STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;" { - echo "${APPLICATION} Credentials" - echo "Database User: $DB_USER" - echo "Database Password: $DB_PASS" - echo "Database Name: $DB_NAME" - echo "NextAuth Secret: $NEXTAUTH_SECRET" -} >> ~/$APPLICATION.creds + echo "${APPLICATION} Credentials" + echo "Database User: $DB_USER" + echo "Database Password: $DB_PASS" + echo "Database Name: $DB_NAME" + echo "NextAuth Secret: $NEXTAUTH_SECRET" +} >>~/$APPLICATION.creds msg_ok "Set up Postgresql Database" msg_info "Setup ${APPLICATION}" diff --git a/install/forgejo-install.sh b/install/forgejo-install.sh index 990234f22..dcd4d044f 100644 --- a/install/forgejo-install.sh +++ b/install/forgejo-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://forgejo.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y git-lfs msg_ok "Installed Dependencies" @@ -30,7 +27,7 @@ ln -sf /opt/forgejo/forgejo-$RELEASE-linux-amd64 /usr/local/bin/forgejo msg_ok "Installed Forgejo" msg_info "Setting up Forgejo" -$STD adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git +$STD adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git mkdir /var/lib/forgejo chown git:git /var/lib/forgejo chmod 750 /var/lib/forgejo diff --git a/install/freshrss-install.sh b/install/freshrss-install.sh index f30f6c155..cd287846b 100644 --- a/install/freshrss-install.sh +++ b/install/freshrss-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/FreshRSS/FreshRSS -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,16 +15,12 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ postgresql \ apache2 \ php-{curl,dom,json,ctype,pgsql,gmp,mbstring,iconv,zip} \ libapache2-mod-php msg_ok "Installed Dependencies" - msg_info "Setting up PostgreSQL" DB_NAME=freshrss DB_USER=freshrss @@ -32,11 +28,11 @@ DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" { -echo "FreshRSS Credentials" -echo "FreshRSS Database User: $DB_USER" -echo "FreshRSS Database Password: $DB_PASS" -echo "FreshRSS Database Name: $DB_NAME" -} >> ~/freshrss.creds + echo "FreshRSS Credentials" + echo "FreshRSS Database User: $DB_USER" + echo "FreshRSS Database Password: $DB_PASS" + echo "FreshRSS Database Name: $DB_NAME" +} >>~/freshrss.creds msg_ok "Set up PostgreSQL" msg_info "Installing FreshRSS" diff --git a/install/frigate-install.sh b/install/frigate-install.sh index b7049754e..91a2bc79d 100644 --- a/install/frigate-install.sh +++ b/install/frigate-install.sh @@ -15,7 +15,7 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y {curl,sudo,mc,git,gpg,ca-certificates,automake,build-essential,xz-utils,libtool,ccache,pkg-config,libgtk-3-dev,libavcodec-dev,libavformat-dev,libswscale-dev,libv4l-dev,libxvidcore-dev,libx264-dev,libjpeg-dev,libpng-dev,libtiff-dev,gfortran,openexr,libatlas-base-dev,libssl-dev,libtbb2,libtbb-dev,libdc1394-22-dev,libopenexr-dev,libgstreamer-plugins-base1.0-dev,libgstreamer1.0-dev,gcc,gfortran,libopenblas-dev,liblapack-dev,libusb-1.0-0-dev,jq,moreutils} +$STD apt-get install -y {git,gpg,ca-certificates,automake,build-essential,xz-utils,libtool,ccache,pkg-config,libgtk-3-dev,libavcodec-dev,libavformat-dev,libswscale-dev,libv4l-dev,libxvidcore-dev,libx264-dev,libjpeg-dev,libpng-dev,libtiff-dev,gfortran,openexr,libatlas-base-dev,libssl-dev,libtbb2,libtbb-dev,libdc1394-22-dev,libopenexr-dev,libgstreamer-plugins-base1.0-dev,libgstreamer1.0-dev,gcc,gfortran,libopenblas-dev,liblapack-dev,libusb-1.0-0-dev,jq,moreutils} msg_ok "Installed Dependencies" msg_info "Setup Python3" @@ -51,7 +51,7 @@ msg_ok "Set Up Hardware Acceleration" #RELEASE=$(curl -s https://api.github.com/repos/blakeblackshear/frigate/releases/latest | jq -r '.tag_name') msg_ok "Stop spinner to prevent segmentation fault" msg_info "Installing Frigate v0.14.1 (Perseverance)" -if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi +if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi cd ~ mkdir -p /opt/frigate/models wget -q https://github.com/blakeblackshear/frigate/archive/refs/tags/v0.14.1.tar.gz -O frigate.tar.gz @@ -101,7 +101,7 @@ if [[ "$CTTYPE" == "0" ]]; then else sed -i -e 's/^kvm:x:104:$/render:x:104:frigate/' -e 's/^render:x:105:$/kvm:x:105:/' /etc/group fi -echo "tmpfs /tmp/cache tmpfs defaults 0 0" >> /etc/fstab +echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab msg_ok "Installed Frigate" if grep -q -o -m1 -E 'avx[^ ]*' /proc/cpuinfo; then @@ -151,7 +151,7 @@ $STD ./configure --disable-udev --enable-shared $STD make -j $(nproc --all) cd /opt/frigate/libusb-1.0.26/libusb mkdir -p /usr/local/lib -$STD /bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib' +$STD /bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib' mkdir -p /usr/local/include/libusb-1.0 $STD /usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0' ldconfig @@ -171,7 +171,7 @@ msg_ok "Installed Coral Object Detection Model" msg_info "Building Nginx with Custom Modules" $STD /opt/frigate/docker/main/build_nginx.sh sed -e '/s6-notifyoncheck/ s/^#*/#/' -i /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run -ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx +ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx msg_ok "Built Nginx" msg_info "Installing Tempio" diff --git a/install/ghost-install.sh b/install/ghost-install.sh index d87f8e214..a69e5f44e 100644 --- a/install/ghost-install.sh +++ b/install/ghost-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://ghost.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,8 @@ setting_up_container network_check update_os - msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ nginx \ mariadb-server \ ca-certificates \ @@ -34,11 +30,11 @@ 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 + 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" diff --git a/install/gitea-install.sh b/install/gitea-install.sh index f54ff2ded..64dabb738 100644 --- a/install/gitea-install.sh +++ b/install/gitea-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://about.gitea.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y git -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc $STD apt-get install -y sqlite3 msg_ok "Installed Dependencies" @@ -27,7 +24,7 @@ RELEASE=$(wget -q https://github.com/go-gitea/gitea/releases/latest -O - | grep wget -q https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64 mv gitea* /usr/local/bin/gitea chmod +x /usr/local/bin/gitea -adduser --system --group --disabled-password --shell /bin/bash --home /etc/gitea gitea > /dev/null +adduser --system --group --disabled-password --shell /bin/bash --home /etc/gitea gitea >/dev/null mkdir -p /var/lib/gitea/{custom,data,log} chown -R gitea:gitea /var/lib/gitea/ chmod -R 750 /var/lib/gitea/ diff --git a/install/glance-install.sh b/install/glance-install.sh index ef8361901..442a454c1 100644 --- a/install/glance-install.sh +++ b/install/glance-install.sh @@ -13,14 +13,6 @@ 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 Glance" RELEASE=$(curl -s https://api.github.com/repos/glanceapp/glance/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') cd /opt @@ -78,4 +70,4 @@ msg_info "Cleaning up" rm -rf /opt/glance-linux-amd64.tar.gz $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/glpi-install.sh b/install/glpi-install.sh index bf9f0c5ec..6f49a782d 100644 --- a/install/glpi-install.sh +++ b/install/glpi-install.sh @@ -15,15 +15,12 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - git \ - sudo \ - mc \ - apache2 \ - php8.2-{apcu,cli,common,curl,gd,imap,ldap,mysql,xmlrpc,xml,mbstring,bcmath,intl,zip,redis,bz2,soap} \ - php-cas \ - libapache2-mod-php \ - mariadb-server + git \ + apache2 \ + php8.2-{apcu,cli,common,curl,gd,imap,ldap,mysql,xmlrpc,xml,mbstring,bcmath,intl,zip,redis,bz2,soap} \ + php-cas \ + libapache2-mod-php \ + mariadb-server msg_ok "Installed Dependencies" msg_info "Setting up database" @@ -40,7 +37,7 @@ mysql -u root -e "GRANT SELECT ON \`mysql\`.\`time_zone_name\` TO '$DB_USER'@'lo echo "Database: $DB_NAME" echo "Username: $DB_USER" echo "Password: $DB_PASS" -} >> ~/glpi_db.creds +} >>~/glpi_db.creds msg_ok "Set up database" msg_info "Installing GLPi" @@ -54,7 +51,7 @@ echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed GLPi" msg_info "Setting Downstream file" -cat < /opt/glpi/inc/downstream.php +cat </opt/glpi/inc/downstream.php /etc/glpi/local_define.php +cat </etc/glpi/local_define.php /etc/systemd/system/gokapi.service [Unit] Description=gokapi diff --git a/install/gomft-install.sh b/install/gomft-install.sh index a9596a891..ebf32b437 100644 --- a/install/gomft-install.sh +++ b/install/gomft-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ sqlite3 \ rclone \ tzdata \ diff --git a/install/gotify-install.sh b/install/gotify-install.sh index d4446c0bd..17de14229 100644 --- a/install/gotify-install.sh +++ b/install/gotify-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://gotify.net/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,18 +13,12 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Gotify" RELEASE=$(curl -s https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') mkdir -p /opt/gotify cd /opt/gotify wget -q https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip -$STD unzip gotify-linux-amd64.zip +unzip -q gotify-linux-amd64.zip rm -rf gotify-linux-amd64.zip chmod +x gotify-linux-amd64 echo "${RELEASE}" >/opt/${APPLICATION}_version.txt diff --git a/install/grafana-install.sh b/install/grafana-install.sh index 4e532963c..4a532b8e8 100644 --- a/install/grafana-install.sh +++ b/install/grafana-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://grafana.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 gnupg $STD apt-get install -y apt-transport-https $STD apt-get install -y software-properties-common diff --git a/install/graylog-install.sh b/install/graylog-install.sh index 351e8c1f5..4f89ad7b6 100644 --- a/install/graylog-install.sh +++ b/install/graylog-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://graylog.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Setup MongoDB" @@ -44,10 +40,10 @@ msg_info "Setup ${APPLICATION}" $STD apt-get install graylog-server ROOT_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) { - echo "${APPLICATION} Credentials" - echo "Admin User: admin" - echo "Admin Password: ${ROOT_PASSWORD}" -} >> ~/graylog.creds + echo "${APPLICATION} Credentials" + echo "Admin User: admin" + echo "Admin Password: ${ROOT_PASSWORD}" +} >>~/graylog.creds ROOT_PASSWORD=$(echo -n $ROOT_PASSWORD | shasum -a 256 | awk '{print $1}') sed -i "s/password_secret =/password_secret = $PASSWORD_SECRET/g" /etc/graylog/server/server.conf sed -i "s/root_password_sha2 =/root_password_sha2 = $ROOT_PASSWORD/g" /etc/graylog/server/server.conf @@ -62,4 +58,4 @@ msg_info "Cleaning up" rm -f graylog-*-repository_latest.deb $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/grist-install.sh b/install/grist-install.sh index 6f9540ba3..e41493f47 100644 --- a/install/grist-install.sh +++ b/install/grist-install.sh @@ -15,12 +15,9 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ make \ gnupg \ ca-certificates \ - mc \ unzip \ python3.11-venv msg_ok "Installed Dependencies" @@ -79,4 +76,4 @@ msg_info "Cleaning up" rm -rf /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/grocy-install.sh b/install/grocy-install.sh index 34d1e3263..af0ea3104 100644 --- a/install/grocy-install.sh +++ b/install/grocy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://grocy.info/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https msg_ok "Installed Dependencies" diff --git a/install/habitica-install.sh b/install/habitica-install.sh index 9aaf92939..443a33c9b 100644 --- a/install/habitica-install.sh +++ b/install/habitica-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ libkrb5-dev \ gnupg \ build-essential \ diff --git a/install/headscale-install.sh b/install/headscale-install.sh index 51b683955..9a523f4df 100644 --- a/install/headscale-install.sh +++ b/install/headscale-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/juanfont/headscale -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - RELEASE=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') msg_info "Installing ${APPLICATION} v${RELEASE}" wget -q https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb diff --git a/install/heimdall-dashboard-install.sh b/install/heimdall-dashboard-install.sh index e279614ef..dfc80d4f3 100644 --- a/install/heimdall-dashboard-install.sh +++ b/install/heimdall-dashboard-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://heimdall.site/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https $STD apt-get install -y composer $STD apt-get install -y php8.2-{bz2,curl,sqlite3,zip,xml} diff --git a/install/hev-socks5-server-install.sh b/install/hev-socks5-server-install.sh index d5b6310bc..68e24fd21 100644 --- a/install/hev-socks5-server-install.sh +++ b/install/hev-socks5-server-install.sh @@ -13,13 +13,6 @@ 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 "Setup ${APPLICATION}" RELEASE=$(curl -s https://api.github.com/repos/heiher/${APPLICATION}/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') curl -L -o "${APPLICATION}" "https://github.com/heiher/${APPLICATION}/releases/download/${RELEASE}/hev-socks5-server-linux-x86_64" @@ -32,7 +25,7 @@ mkdir -p /etc/${APPLICATION} USERNAME="admin" PASSWORD=$(openssl rand -base64 16) MARK="0" -echo "$USERNAME $PASSWORD $MARK" > /root/hev.creds +echo "$USERNAME $PASSWORD $MARK" >/root/hev.creds mv main.yml /etc/${APPLICATION}/main.yml msg_ok "Setup ${APPLICATION}" @@ -58,4 +51,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/hivemq-install.sh b/install/hivemq-install.sh index 265bcc686..45bfab281 100644 --- a/install/hivemq-install.sh +++ b/install/hivemq-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.hivemq.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/hoarder-install.sh b/install/hoarder-install.sh index b0fc7f0d5..e1e6e2a52 100644 --- a/install/hoarder-install.sh +++ b/install/hoarder-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://hoarder.app/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -17,16 +17,13 @@ msg_info "Installing Dependencies" $STD apt-get install -y \ g++ \ build-essential \ - curl \ git \ - sudo \ gnupg \ ca-certificates \ chromium/stable \ chromium-common/stable \ graphicsmagick \ - ghostscript \ - mc + ghostscript msg_ok "Installed Dependencies" msg_info "Installing Additional Tools" @@ -43,13 +40,13 @@ $STD dpkg -i meilisearch.deb wget -q https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml -O /etc/meilisearch.toml MASTER_KEY=$(openssl rand -base64 12) sed -i \ - -e 's|^env =.*|env = "production"|' \ - -e "s|^# master_key =.*|master_key = \"$MASTER_KEY\"|" \ - -e 's|^db_path =.*|db_path = "/var/lib/meilisearch/data"|' \ - -e 's|^dump_dir =.*|dump_dir = "/var/lib/meilisearch/dumps"|' \ - -e 's|^snapshot_dir =.*|snapshot_dir = "/var/lib/meilisearch/snapshots"|' \ - -e 's|^# no_analytics = true|no_analytics = true|' \ - /etc/meilisearch.toml + -e 's|^env =.*|env = "production"|' \ + -e "s|^# master_key =.*|master_key = \"$MASTER_KEY\"|" \ + -e 's|^db_path =.*|db_path = "/var/lib/meilisearch/data"|' \ + -e 's|^dump_dir =.*|dump_dir = "/var/lib/meilisearch/dumps"|' \ + -e 's|^snapshot_dir =.*|snapshot_dir = "/var/lib/meilisearch/snapshots"|' \ + -e 's|^# no_analytics = true|no_analytics = true|' \ + /etc/meilisearch.toml msg_ok "Installed Meilisearch" msg_info "Installing Node.js" diff --git a/install/homarr-install.sh b/install/homarr-install.sh index 2335133eb..f6bca857e 100644 --- a/install/homarr-install.sh +++ b/install/homarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/homarr-labs/homarr -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - sudo \ - mc \ - curl \ redis-server \ ca-certificates \ gpg \ @@ -76,7 +73,7 @@ rm /etc/nginx/nginx.conf cp /opt/homarr/nginx.conf /etc/nginx/templates/nginx.conf mkdir -p /opt/homarr/apps/cli cp /opt/homarr/packages/cli/cli.cjs /opt/homarr/apps/cli/cli.cjs -echo $'#!/bin/bash\ncd /opt/homarr/apps/cli && node ./cli.cjs "$@"' > /usr/bin/homarr +echo $'#!/bin/bash\ncd /opt/homarr/apps/cli && node ./cli.cjs "$@"' >/usr/bin/homarr chmod +x /usr/bin/homarr mkdir /opt/homarr/build cp ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node diff --git a/install/homeassistant-core-install.sh b/install/homeassistant-core-install.sh index 9a6ea6cdf..c725e59a7 100644 --- a/install/homeassistant-core-install.sh +++ b/install/homeassistant-core-install.sh @@ -15,10 +15,7 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - curl \ git \ - sudo \ - mc \ gnupg \ ca-certificates \ bluez \ @@ -99,4 +96,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/homeassistant-install.sh b/install/homeassistant-install.sh index f1a6c4eda..eb1b24af2 100644 --- a/install/homeassistant-install.sh +++ b/install/homeassistant-install.sh @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Setup Python3" $STD apt-get install -y \ python3 \ diff --git a/install/homebox-install.sh b/install/homebox-install.sh index b6bbb7335..8c0df5955 100644 --- a/install/homebox-install.sh +++ b/install/homebox-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/sysadminsmedia/homebox -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,13 +14,6 @@ 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 Homebox" RELEASE=$(curl -s https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -qO- https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_x86_64.tar.gz | tar -xzf - -C /opt diff --git a/install/homebridge-install.sh b/install/homebridge-install.sh index 7b788dea9..cc0013e08 100644 --- a/install/homebridge-install.sh +++ b/install/homebridge-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://homebridge.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 avahi-daemon $STD apt-get install -y gnupg2 msg_ok "Installed Dependencies" diff --git a/install/homepage-install.sh b/install/homepage-install.sh index 02f3c5f4a..f96c0d40a 100644 --- a/install/homepage-install.sh +++ b/install/homepage-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://gethomepage.dev/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,10 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y curl \ - sudo \ - mc \ - gpg +$STD apt-get install -y gpg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -48,7 +45,7 @@ export NEXT_PUBLIC_VERSION="v$RELEASE" export NEXT_PUBLIC_REVISION="source" export NEXT_TELEMETRY_DISABLED=1 $STD pnpm build -echo "HOMEPAGE_ALLOWED_HOSTS=localhost:3000,${LOCAL_IP}:3000" > /opt/homepage/.env +echo "HOMEPAGE_ALLOWED_HOSTS=localhost:3000,${LOCAL_IP}:3000" >/opt/homepage/.env echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed Homepage v${RELEASE}" diff --git a/install/homer-install.sh b/install/homer-install.sh index 465544082..36b393224 100644 --- a/install/homer-install.sh +++ b/install/homer-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/bastienwirtz/homer -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 pip msg_ok "Installed Dependencies" diff --git a/install/hyperhdr-install.sh b/install/hyperhdr-install.sh index eefbce4ca..ce84bec9a 100644 --- a/install/hyperhdr-install.sh +++ b/install/hyperhdr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.hyperhdr.eu/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/hyperion-install.sh b/install/hyperion-install.sh index f5a6965df..2abf73d3c 100644 --- a/install/hyperion-install.sh +++ b/install/hyperion-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://hyperion-project.org/forum/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 lsb-release $STD apt-get install -y gpg $STD apt-get install -y apt-transport-https diff --git a/install/influxdb-install.sh b/install/influxdb-install.sh index 414a3f6c0..cadfe3c37 100644 --- a/install/influxdb-install.sh +++ b/install/influxdb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.influxdata.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,17 +14,14 @@ 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 lsb-base $STD apt-get install -y lsb-release $STD apt-get install -y gnupg2 msg_ok "Installed Dependencies" msg_info "Setting up InfluxDB Repository" -wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg -echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main" > /etc/apt/sources.list.d/influxdata.list +wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor >/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg +echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main" >/etc/apt/sources.list.d/influxdata.list msg_ok "Set up InfluxDB Repository" read -r -p "Which version of InfluxDB to install? (1 or 2) " prompt diff --git a/install/inspircd-install.sh b/install/inspircd-install.sh index 724b9294a..d0c6ba250 100644 --- a/install/inspircd-install.sh +++ b/install/inspircd-install.sh @@ -13,14 +13,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo -msg_ok "Installed Dependencies" - - msg_info "Installing InspIRCd" RELEASE=$(curl -s https://api.github.com/repos/inspircd/inspircd/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') cd /opt diff --git a/install/inventree-install.sh b/install/inventree-install.sh index 49aaa783a..a51c1555e 100644 --- a/install/inventree-install.sh +++ b/install/inventree-install.sh @@ -14,12 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg \ - sudo +$STD apt-get install -y gnupg temp_file=$(mktemp) wget -q http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb -O $temp_file $STD dpkg -i $temp_file diff --git a/install/iobroker-install.sh b/install/iobroker-install.sh index c2a749d56..018f4a7c2 100644 --- a/install/iobroker-install.sh +++ b/install/iobroker-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.iobroker.net/#en/intro -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 ca-certificates $STD apt-get install -y gnupg msg_ok "Installed Dependencies" diff --git a/install/iventoy-install.sh b/install/iventoy-install.sh index 7376a5aca..ba25fdd4d 100644 --- a/install/iventoy-install.sh +++ b/install/iventoy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.iventoy.com/en/index.html -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - RELEASE=$(curl -s https://api.github.com/repos/ventoy/pxe/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') msg_info "Installing iVentoy v${RELEASE}" mkdir -p /opt/iventoy/{data,iso} diff --git a/install/jackett-install.sh b/install/jackett-install.sh index c4c21436a..3c93ef694 100644 --- a/install/jackett-install.sh +++ b/install/jackett-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Jackett/Jackett -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Jackett" RELEASE=$(wget -q https://github.com/Jackett/Jackett/releases/latest -O - | grep "title>Release" | cut -d " " -f 4) wget -q https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxAMDx64.tar.gz diff --git a/install/jellyfin-install.sh b/install/jellyfin-install.sh index 534294a01..fe945e0bc 100644 --- a/install/jellyfin-install.sh +++ b/install/jellyfin-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://jellyfin.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,10 +14,7 @@ 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 gpg -$STD apt-get install -y mc msg_ok "Installed Dependencies" msg_info "Setting Up Hardware Acceleration" @@ -32,10 +29,10 @@ fi msg_ok "Set Up Hardware Acceleration" msg_info "Installing Jellyfin" -VERSION="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )" +VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" # If the keyring directory is absent, create it if [[ ! -d /etc/apt/keyrings ]]; then - mkdir -p /etc/apt/keyrings + mkdir -p /etc/apt/keyrings fi # Download the repository signing key and install it to the keyring directory curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | gpg --dearmor --yes --output /etc/apt/keyrings/jellyfin.gpg diff --git a/install/jellyseerr-install.sh b/install/jellyseerr-install.sh index f36ce5a67..c7966c185 100644 --- a/install/jellyseerr-install.sh +++ b/install/jellyseerr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docs.jellyseerr.dev/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,11 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ gnupg \ - mc \ git \ - sudo \ build-essential msg_ok "Installed Dependencies" diff --git a/install/jenkins-install.sh b/install/jenkins-install.sh index 417997f81..55d4398c6 100644 --- a/install/jenkins-install.sh +++ b/install/jenkins-install.sh @@ -13,11 +13,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo \ - openjdk-17-jre +$STD apt-get install -y openjdk-17-jre msg_ok "Installed Dependencies" msg_info "Setup Jenkins" @@ -33,4 +29,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/jupyternotebook-install.sh b/install/jupyternotebook-install.sh index 4e22d61b9..843921187 100644 --- a/install/jupyternotebook-install.sh +++ b/install/jupyternotebook-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ python3 \ python3-pip msg_ok "Installed Dependencies" diff --git a/install/kavita-install.sh b/install/kavita-install.sh index 24318d7eb..0e98a210f 100644 --- a/install/kavita-install.sh +++ b/install/kavita-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.kavitareader.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Kavita" cd /opt RELEASE=$(curl -s https://api.github.com/repos/Kareadita/Kavita/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') diff --git a/install/keycloak-install.sh b/install/keycloak-install.sh index e0a1024ce..472187d44 100644 --- a/install/keycloak-install.sh +++ b/install/keycloak-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ -curl \ -sudo \ -mc \ -gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Installing OpenJDK" diff --git a/install/kimai-install.sh b/install/kimai-install.sh index 85767f8a2..de282959e 100644 --- a/install/kimai-install.sh +++ b/install/kimai-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.kimai.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ apt-transport-https \ - sudo \ - mc \ - curl \ apache2 \ git \ expect \ @@ -52,11 +49,11 @@ mysql -u root -e "CREATE DATABASE $DB_NAME;" mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');" mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" { - echo "Kimai-Credentials" - echo "Kimai Database User: $DB_USER" - echo "Kimai Database Password: $DB_PASS" - echo "Kimai Database Name: $DB_NAME" -} >> ~/kimai.creds + echo "Kimai-Credentials" + echo "Kimai Database User: $DB_USER" + echo "Kimai Database Password: $DB_PASS" + echo "Kimai Database Name: $DB_NAME" +} >>~/kimai.creds msg_ok "Set up database" msg_info "Installing Kimai (Patience)" @@ -65,7 +62,7 @@ wget -q "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip" unzip -q ${RELEASE}.zip mv kimai-${RELEASE} /opt/kimai cd /opt/kimai -echo "export COMPOSER_ALLOW_SUPERUSER=1" >> ~/.bashrc +echo "export COMPOSER_ALLOW_SUPERUSER=1" >>~/.bashrc source ~/.bashrc $STD composer install --no-dev --optimize-autoloader --no-interaction cp .env.dist .env @@ -117,7 +114,7 @@ cat </etc/apache2/sites-available/kimai.conf EOF $STD a2ensite kimai.conf -$STD a2dissite 000-default.conf +$STD a2dissite 000-default.conf $STD systemctl reload apache2 msg_ok "Created Service" diff --git a/install/koillection-install.sh b/install/koillection-install.sh index 66b58575b..8a844b50a 100644 --- a/install/koillection-install.sh +++ b/install/koillection-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://koillection.github.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,11 +15,7 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg2\ - postgresql \ + gnupg2 postgresql \ apache2 \ lsb-release msg_ok "Installed Dependencies" @@ -46,11 +42,11 @@ DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" { -echo "Koillection Credentials" -echo "Koillection Database User: $DB_USER" -echo "Koillection Database Password: $DB_PASS" -echo "Koillection Database Name: $DB_NAME" -} >> ~/koillection.creds + echo "Koillection Credentials" + echo "Koillection Database User: $DB_USER" + echo "Koillection Database Password: $DB_PASS" + echo "Koillection Database Name: $DB_NAME" +} >>~/koillection.creds msg_ok "Set up PostgreSQL" msg_info "Setting up Node.js/Yarn" @@ -73,19 +69,19 @@ cd /opt/koillection cp /opt/koillection/.env /opt/koillection/.env.local APP_SECRET=$(openssl rand -base64 32) sed -i -e "s|^APP_ENV=.*|APP_ENV=prod|" \ - -e "s|^APP_DEBUG=.*|APP_DEBUG=0|" \ - -e "s|^APP_SECRET=.*|APP_SECRET=${APP_SECRET}|" \ - -e "s|^DB_NAME=.*|DB_NAME=${DB_NAME}|" \ - -e "s|^DB_USER=.*|DB_USER=${DB_USER}|" \ - -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \ - /opt/koillection/.env.local + -e "s|^APP_DEBUG=.*|APP_DEBUG=0|" \ + -e "s|^APP_SECRET=.*|APP_SECRET=${APP_SECRET}|" \ + -e "s|^DB_NAME=.*|DB_NAME=${DB_NAME}|" \ + -e "s|^DB_USER=.*|DB_USER=${DB_USER}|" \ + -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \ + /opt/koillection/.env.local export COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev -o --no-interaction --classmap-authoritative $STD php bin/console doctrine:migrations:migrate --no-interaction $STD php bin/console app:translations:dump cd assets/ $STD yarn install -$STD yarn build +$STD yarn build chown -R www-data:www-data /opt/koillection/public/uploads echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed Koillection" diff --git a/install/kometa-install.sh b/install/kometa-install.sh index 23c0f5516..540629f81 100644 --- a/install/kometa-install.sh +++ b/install/kometa-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Kometa-Team/Kometa -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo -msg_ok "Installed Dependencies" - msg_info "Setup Python 3" $STD apt-get install python3-pip -y rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED diff --git a/install/komga-install.sh b/install/komga-install.sh index 1873ee7c1..63db9397a 100644 --- a/install/komga-install.sh +++ b/install/komga-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://komga.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo \ - openjdk-17-jre +$STD apt-get install -y openjdk-17-jre msg_ok "Installed Dependencies" msg_info "Installing Komga" diff --git a/install/komodo-install.sh b/install/komodo-install.sh index 9650a4d3b..153c280d1 100644 --- a/install/komodo-install.sh +++ b/install/komodo-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - ca-certificates +$STD apt-get install -y ca-certificates msg_ok "Installed Dependencies" msg_info "Setup Docker Repository" @@ -27,8 +23,8 @@ curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/doc chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ - $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ - sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | + sudo tee /etc/apt/sources.list.d/docker.list >/dev/null $STD apt-get update msg_ok "Setup Docker Repository" @@ -49,25 +45,24 @@ read -rp "Enter your choice (default: 1): " DB_CHOICE DB_CHOICE=${DB_CHOICE:-1} case $DB_CHOICE in - 1) - DB_COMPOSE_FILE="mongo.compose.yaml" - ;; - 2) - DB_COMPOSE_FILE="sqlite.compose.yaml" - ;; - 3) - DB_COMPOSE_FILE="postgres.compose.yaml" - ;; - *) - echo "Invalid choice. Defaulting to MongoDB." - DB_COMPOSE_FILE="mongo.compose.yaml" - ;; +1) + DB_COMPOSE_FILE="mongo.compose.yaml" + ;; +2) + DB_COMPOSE_FILE="sqlite.compose.yaml" + ;; +3) + DB_COMPOSE_FILE="postgres.compose.yaml" + ;; +*) + echo "Invalid choice. Defaulting to MongoDB." + DB_COMPOSE_FILE="mongo.compose.yaml" + ;; esac mkdir -p /opt/komodo cd /opt/komodo wget -q "https://raw.githubusercontent.com/mbecker20/komodo/main/compose/$DB_COMPOSE_FILE" - msg_info "Setup Komodo Environment" wget -q -O /opt/komodo/compose.env https://raw.githubusercontent.com/mbecker20/komodo/main/compose/compose.env DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=') diff --git a/install/kubo-install.sh b/install/kubo-install.sh index 023d04598..66961d3a3 100644 --- a/install/kubo-install.sh +++ b/install/kubo-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/ipfs/kubo -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/lazylibrarian-install.sh b/install/lazylibrarian-install.sh index a85f47896..7749ae6bc 100644 --- a/install/lazylibrarian-install.sh +++ b/install/lazylibrarian-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://gitlab.com/LazyLibrarian/LazyLibrarian -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ libpng-dev \ libjpeg-dev \ diff --git a/install/lidarr-install.sh b/install/lidarr-install.sh index 7bdabd2ea..301c21011 100644 --- a/install/lidarr-install.sh +++ b/install/lidarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://lidarr.audio/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 sqlite3 $STD apt-get install -y libchromaprint-tools $STD apt-get install -y mediainfo diff --git a/install/linkwarden-install.sh b/install/linkwarden-install.sh index c35e29291..91f6483cb 100644 --- a/install/linkwarden-install.sh +++ b/install/linkwarden-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://linkwarden.app/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ make \ git \ postgresql \ @@ -59,12 +56,12 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8' $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" { - echo "Linkwarden-Credentials" - echo "Linkwarden Database User: $DB_USER" - echo "Linkwarden Database Password: $DB_PASS" - echo "Linkwarden Database Name: $DB_NAME" - echo "Linkwarden Secret: $SECRET_KEY" -} >> ~/linkwarden.creds + echo "Linkwarden-Credentials" + echo "Linkwarden Database User: $DB_USER" + echo "Linkwarden Database Password: $DB_PASS" + echo "Linkwarden Database Name: $DB_NAME" + echo "Linkwarden Secret: $SECRET_KEY" +} >>~/linkwarden.creds msg_ok "Set up PostgreSQL DB" read -r -p "Would you like to add Adminer? " prompt @@ -88,7 +85,7 @@ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then echo "Adminer Database User: $DB_USER" echo "Adminer Database Password: $DB_PASS" echo "Adminer Database Name: $DB_NAME" -} >> ~/linkwarden.creds + } >>~/linkwarden.creds msg_ok "Installed Adminer" fi diff --git a/install/listmonk-install.sh b/install/listmonk-install.sh index 17163ed9b..4896af051 100644 --- a/install/listmonk-install.sh +++ b/install/listmonk-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://listmonk.app/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - postgresql +$STD apt-get install -y postgresql msg_ok "Installed Dependencies" msg_info "Setting up PostgreSQL" @@ -28,11 +24,11 @@ DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" { -echo "listmonk-Credentials" -echo -e "listmonk Database User: \e[32m$DB_USER\e[0m" -echo -e "listmonk Database Password: \e[32m$DB_PASS\e[0m" -echo -e "listmonk Database Name: \e[32m$DB_NAME\e[0m" -} >> ~/listmonk.creds + echo "listmonk-Credentials" + echo -e "listmonk Database User: \e[32m$DB_USER\e[0m" + echo -e "listmonk Database Password: \e[32m$DB_PASS\e[0m" + echo -e "listmonk Database Name: \e[32m$DB_NAME\e[0m" +} >>~/listmonk.creds msg_ok "Set up PostgreSQL" msg_info "Installing listmonk" @@ -77,4 +73,4 @@ msg_info "Cleaning up" rm -rf "/opt/listmonk_${RELEASE}_linux_amd64.tar.gz" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/lldap-install.sh b/install/lldap-install.sh index a122ca146..57a17cfbe 100644 --- a/install/lldap-install.sh +++ b/install/lldap-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/lldap/lldap -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/lubelogger-install.sh b/install/lubelogger-install.sh index a696ec7fc..43323e725 100644 --- a/install/lubelogger-install.sh +++ b/install/lubelogger-install.sh @@ -14,16 +14,9 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - wget \ - mc \ - zip \ - jq +$STD apt-get install -y jq msg_ok "Installed Dependencies" - msg_info "Installing LubeLogger" cd /opt mkdir -p /opt/lubelogger @@ -34,7 +27,7 @@ wget -q https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLog unzip -q LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip chmod 700 /opt/lubelogger/CarCareTracker cp /opt/lubelogger/appsettings.json /opt/lubelogger/appsettings_bak.json -jq '.Kestrel = {"Endpoints": {"Http": {"Url": "http://0.0.0.0:5000"}}}' /opt/lubelogger/appsettings_bak.json > /opt/lubelogger/appsettings.json +jq '.Kestrel = {"Endpoints": {"Http": {"Url": "http://0.0.0.0:5000"}}}' /opt/lubelogger/appsettings_bak.json >/opt/lubelogger/appsettings.json echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed LubeLogger" diff --git a/install/mafl-install.sh b/install/mafl-install.sh index d9600d21b..daa3a4e21 100644 --- a/install/mafl-install.sh +++ b/install/mafl-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://mafl.hywax.space/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 make $STD apt-get install -y g++ $STD apt-get install -y gcc diff --git a/install/magicmirror-install.sh b/install/magicmirror-install.sh index 8864b7eba..58345e8b4 100644 --- a/install/magicmirror-install.sh +++ b/install/magicmirror-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://magicmirror.builders/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/mariadb-install.sh b/install/mariadb-install.sh index 0a1fff468..94bcb6c76 100644 --- a/install/mariadb-install.sh +++ b/install/mariadb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://mariadb.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing MariaDB" $STD apt-get install -y mariadb-server sed -i 's/^# *\(port *=.*\)/\1/' /etc/mysql/my.cnf @@ -36,17 +30,17 @@ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then php-zip \ php-gd \ php-json \ - php-curl - - wget -q "https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz" - mkdir -p /var/www/html/phpMyAdmin - tar xf phpMyAdmin-5.2.1-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpMyAdmin - cp /var/www/html/phpMyAdmin/config.sample.inc.php /var/www/html/phpMyAdmin/config.inc.php - SECRET=$(openssl rand -base64 24) - sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" /var/www/html/phpMyAdmin/config.inc.php - chmod 660 /var/www/html/phpMyAdmin/config.inc.php - chown -R www-data:www-data /var/www/html/phpMyAdmin - systemctl restart apache2 + php-curl + + wget -q "https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz" + mkdir -p /var/www/html/phpMyAdmin + tar xf phpMyAdmin-5.2.1-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpMyAdmin + cp /var/www/html/phpMyAdmin/config.sample.inc.php /var/www/html/phpMyAdmin/config.inc.php + SECRET=$(openssl rand -base64 24) + sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" /var/www/html/phpMyAdmin/config.inc.php + chmod 660 /var/www/html/phpMyAdmin/config.inc.php + chown -R www-data:www-data /var/www/html/phpMyAdmin + systemctl restart apache2 msg_ok "Installed phpMyAdmin" fi diff --git a/install/matterbridge-install.sh b/install/matterbridge-install.sh index f8b0603ce..44e102bef 100644 --- a/install/matterbridge-install.sh +++ b/install/matterbridge-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Luligu/matterbridge/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ 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 msg_ok "Installed Dependencies" @@ -32,7 +29,7 @@ $STD apt-get update $STD apt-get install -y nodejs msg_ok "Installed Node.js" -msg_info "Install Matterbridge" +msg_info "Install Matterbridge" mkdir -p /root/Matterbridge $STD npm install -g matterbridge msg_ok "Installed Matterbridge" diff --git a/install/mattermost-install.sh b/install/mattermost-install.sh index b5f7f5aad..d94703778 100644 --- a/install/mattermost-install.sh +++ b/install/mattermost-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://mattermost.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,11 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gpg \ - postgresql + postgresql msg_ok "Installed Dependencies" msg_info "Setting up PostgreSQL" @@ -32,11 +29,11 @@ $STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME to $DB_ $STD sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;" $STD sudo -u postgres psql -c "GRANT USAGE, CREATE ON SCHEMA PUBLIC TO $DB_USER;" { - echo "Mattermost Credentials" - echo "Database User: $DB_USER" - echo "Database Password: $DB_PASS" - echo "Database Name: $DB_NAME" -} >> ~/mattermost.creds + echo "Mattermost Credentials" + echo "Database User: $DB_USER" + echo "Database Password: $DB_PASS" + echo "Database Name: $DB_NAME" +} >>~/mattermost.creds msg_ok "Set up PostgreSQL" msg_info "Installing Mattermost" @@ -47,7 +44,7 @@ $STD apt-get update $STD apt-get install -y mattermost $STD install -C -m 600 -o mattermost -g mattermost /opt/mattermost/config/config.defaults.json /opt/mattermost/config/config.json sed -i -e "/DataSource/c\ \"DataSource\": \"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME?sslmode=disable&connect_timeout=10\"," \ - -e "/SiteURL/c\ \"SiteURL\": \"http://$IPADDRESS:8065\"," /opt/mattermost/config/config.json + -e "/SiteURL/c\ \"SiteURL\": \"http://$IPADDRESS:8065\"," /opt/mattermost/config/config.json systemctl enable -q --now mattermost.service msg_ok "Installed Mattermost" diff --git a/install/mediamtx-install.sh b/install/mediamtx-install.sh index 497a0b068..1e951579e 100644 --- a/install/mediamtx-install.sh +++ b/install/mediamtx-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/bluenviron/mediamtx -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 ffmpeg msg_ok "Installed Dependencies" diff --git a/install/medusa-install.sh b/install/medusa-install.sh index a9ef95d17..8dfaf2430 100644 --- a/install/medusa-install.sh +++ b/install/medusa-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/pymedusa/Medusa -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -17,11 +17,9 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ gpg \ - curl \ - sudo \ - mc \ git-core \ mediainfo + cat </etc/apt/sources.list.d/non-free.list deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware EOF diff --git a/install/memos-install.sh b/install/memos-install.sh index 191843915..0fe256a97 100644 --- a/install/memos-install.sh +++ b/install/memos-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/usememos/memos -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -18,10 +18,7 @@ msg_info "Installing Dependencies" $STD apt-get install -y \ build-essential \ git \ - curl \ - sudo \ - tzdata \ - mc + tzdata msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -54,7 +51,7 @@ msg_info "Installing Memos (Patience)" mkdir -p /opt/memos_data export NODE_OPTIONS="--max-old-space-size=2048" $STD git clone https://github.com/usememos/memos.git /opt/memos -cd /opt/memos/web +cd /opt/memos/web $STD pnpm i --frozen-lockfile $STD pnpm build cd /opt/memos diff --git a/install/meshcentral-install.sh b/install/meshcentral-install.sh index f9091a953..e5f94063d 100644 --- a/install/meshcentral-install.sh +++ b/install/meshcentral-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://meshcentral.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 ca-certificates $STD apt-get install -y gnupg msg_ok "Installed Dependencies" diff --git a/install/metube-install.sh b/install/metube-install.sh index 49565cea3..5e07c68a9 100644 --- a/install/metube-install.sh +++ b/install/metube-install.sh @@ -17,19 +17,16 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y --no-install-recommends \ build-essential \ - curl \ aria2 \ coreutils \ gcc \ g++ \ musl-dev \ - sudo \ ffmpeg \ git \ make \ gnupg \ - ca-certificates \ - mc + ca-certificates msg_ok "Installed Dependencies" msg_info "Setup Python3" @@ -59,7 +56,7 @@ $STD node_modules/.bin/ng build cd /opt/metube $STD pip3 install pipenv $STD pipenv install -mkdir -p /opt/metube_downloads /opt/metube_downloads/.metube /opt/metube_downloads/music /opt/metube_downloads/videos +mkdir -p /opt/metube_downloads /opt/metube_downloads/.metube /opt/metube_downloads/music /opt/metube_downloads/videos cat </opt/metube/.env DOWNLOAD_DIR=/opt/metube_downloads STATE_DIR=/opt/metube_downloads/.metube diff --git a/install/minio-install.sh b/install/minio-install.sh index f06b1b3b8..e6e57c95d 100644 --- a/install/minio-install.sh +++ b/install/minio-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/minio/minio -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 "Setup MinIO" RELEASE=$(curl -s https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}') wget -q https://dl.min.io/server/minio/release/linux-amd64/minio @@ -41,7 +34,7 @@ EOF echo "MinIO-Credentials" echo "MinIO Admin User: $MINIO_ADMIN_USER" echo "MinIO Admin Password: $MINIO_ADMIN_PASSWORD" -} >> ~/minio.creds +} >>~/minio.creds echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Setup MinIO" diff --git a/install/mongodb-install.sh b/install/mongodb-install.sh index 728c878f1..478d54835 100644 --- a/install/mongodb-install.sh +++ b/install/mongodb-install.sh @@ -1,4 +1,3 @@ - #!/usr/bin/env bash # Copyright (c) 2021-2025 tteck @@ -6,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.mongodb.com/de-de -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,12 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y gnupg -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc msg_ok "Installed Dependencies" -# Abfrage fΓΌr die MongoDB-Version read -p "Do you want to install MongoDB 8.0 instead of 7.0? [y/N]: " install_mongodb_8 if [[ "$install_mongodb_8" =~ ^[Yy]$ ]]; then MONGODB_VERSION="8.0" diff --git a/install/monica-install.sh b/install/monica-install.sh index e7f6555de..8b2232169 100644 --- a/install/monica-install.sh +++ b/install/monica-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.monicahq.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,15 +15,11 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg2\ - mariadb-server \ - apache2 \ - libapache2-mod-php \ - php-{bcmath,curl,dom,gd,gmp,iconv,intl,json,mbstring,mysqli,opcache,pdo-mysql,redis,tokenizer,xml,zip} \ - composer + gnupg2 mariadb-server \ + apache2 \ + libapache2-mod-php \ + php-{bcmath,curl,dom,gd,gmp,iconv,intl,json,mbstring,mysqli,opcache,pdo-mysql,redis,tokenizer,xml,zip} \ + composer msg_ok "Installed Dependencies" msg_info "Setting up MariaDB" @@ -38,7 +34,7 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH echo "monica Database User: $DB_USER" echo "monica Database Password: $DB_PASS" echo "monica Database Name: $DB_NAME" -} >> ~/monica.creds +} >>~/monica.creds msg_ok "Set up MariaDB" msg_info "Setting up Node.js/Yarn" @@ -61,9 +57,9 @@ cd /opt/monica cp /opt/monica/.env.example /opt/monica/.env HASH_SALT=$(openssl rand -base64 32) sed -i -e "s|^DB_USERNAME=.*|DB_USERNAME=${DB_USER}|" \ - -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \ - -e "s|^HASH_SALT=.*|HASH_SALT=${HASH_SALT}|" \ - /opt/monica/.env + -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \ + -e "s|^HASH_SALT=.*|HASH_SALT=${HASH_SALT}|" \ + /opt/monica/.env $STD composer install --no-dev -o --no-interaction $STD yarn install $STD yarn run production diff --git a/install/motioneye-install.sh b/install/motioneye-install.sh index 60cf0532c..d6242bc2a 100644 --- a/install/motioneye-install.sh +++ b/install/motioneye-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/motioneye-project/motioneye -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y cifs-utils msg_ok "Installed Dependencies" diff --git a/install/mqtt-install.sh b/install/mqtt-install.sh index 716e62dee..f02b103b0 100644 --- a/install/mqtt-install.sh +++ b/install/mqtt-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://mosquitto.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/mylar3-install.sh b/install/mylar3-install.sh index ec709b0c1..14cc2ef20 100644 --- a/install/mylar3-install.sh +++ b/install/mylar3-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/mylar3/mylar3 -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,12 +14,8 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - jq -echo "deb http://deb.debian.org/debian bookworm non-free non-free-firmware" > /etc/apt/sources.list.d/non-free.list +$STD apt-get install -y jq +echo "deb http://deb.debian.org/debian bookworm non-free non-free-firmware" >/etc/apt/sources.list.d/non-free.list $STD apt-get update $STD apt-get install -y unrar rm /etc/apt/sources.list.d/non-free.list @@ -37,7 +33,7 @@ mkdir -p /opt/mylar3-data RELEASE=$(curl -s https://api.github.com/repos/mylar3/mylar3/releases/latest | jq -r '.tag_name') wget -qO- https://github.com/mylar3/mylar3/archive/refs/tags/${RELEASE}.tar.gz | tar -xz --strip-components=1 -C /opt/mylar3 $STD pip install --no-cache-dir -r /opt/mylar3/requirements.txt -echo "${RELEASE}" > /opt/${APPLICATION}_version.txt +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed ${APPLICATION}" msg_info "Creating Service" diff --git a/install/myspeed-install.sh b/install/myspeed-install.sh index 6aac988dc..da14494ca 100644 --- a/install/myspeed-install.sh +++ b/install/myspeed-install.sh @@ -15,15 +15,12 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ build-essential \ g++ \ make \ - sudo \ make \ gpg \ - ca-certificates \ - mc + ca-certificates msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/mysql-install.sh b/install/mysql-install.sh index abb7b5c93..c6899ae43 100644 --- a/install/mysql-install.sh +++ b/install/mysql-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.mysql.com/products/community | https://www.phpmyadmin.net -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,27 +16,24 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - sudo \ lsb-release \ - curl \ - gnupg \ - mc + gnupg msg_ok "Installed Dependencies" RELEASE_REPO="mysql-8.0" RELEASE_AUTH="mysql_native_password" read -r -p "Would you like to install the MySQL 8.4 LTS release instead of MySQL 8.0 (bug fix track; EOL April-2026)? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then - RELEASE_REPO="mysql-8.4-lts" - RELEASE_AUTH="caching_sha2_password" + RELEASE_REPO="mysql-8.4-lts" + RELEASE_AUTH="caching_sha2_password" fi msg_info "Installing MySQL" -curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | gpg --dearmor -o /usr/share/keyrings/mysql.gpg +curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | gpg --dearmor -o /usr/share/keyrings/mysql.gpg if [ "$(lsb_release -si)" = "Debian" ]; then - echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/debian $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list + echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/debian $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list else - echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/ubuntu $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list + echo "deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/ubuntu $(lsb_release -sc) ${RELEASE_REPO}" >/etc/apt/sources.list.d/mysql.list fi $STD apt-get update export DEBIAN_FRONTEND=noninteractive @@ -64,17 +61,17 @@ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then php-zip \ php-gd \ php-json \ - php-curl - - wget -q "https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz" - mkdir -p /var/www/html/phpMyAdmin - tar xf phpMyAdmin-5.2.1-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpMyAdmin - cp /var/www/html/phpMyAdmin/config.sample.inc.php /var/www/html/phpMyAdmin/config.inc.php - SECRET=$(openssl rand -base64 24) - sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" /var/www/html/phpMyAdmin/config.inc.php - chmod 660 /var/www/html/phpMyAdmin/config.inc.php - chown -R www-data:www-data /var/www/html/phpMyAdmin - systemctl restart apache2 + php-curl + + wget -q "https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz" + mkdir -p /var/www/html/phpMyAdmin + tar xf phpMyAdmin-5.2.1-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpMyAdmin + cp /var/www/html/phpMyAdmin/config.sample.inc.php /var/www/html/phpMyAdmin/config.inc.php + SECRET=$(openssl rand -base64 24) + sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" /var/www/html/phpMyAdmin/config.inc.php + chmod 660 /var/www/html/phpMyAdmin/config.inc.php + chown -R www-data:www-data /var/www/html/phpMyAdmin + systemctl restart apache2 msg_ok "Installed phpMyAdmin" fi diff --git a/install/n8n-install.sh b/install/n8n-install.sh index 0940cf88b..9445f5790 100644 --- a/install/n8n-install.sh +++ b/install/n8n-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://n8n.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 ca-certificates $STD apt-get install -y gnupg msg_ok "Installed Dependencies" diff --git a/install/navidrome-install.sh b/install/navidrome-install.sh index 4b9aeadf7..721ccd6dd 100644 --- a/install/navidrome-install.sh +++ b/install/navidrome-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.navidrome.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ network_check update_os msg_info "Installing Dependencies (patience)" -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc $STD apt-get install -y ffmpeg msg_ok "Installed Dependencies" diff --git a/install/neo4j-install.sh b/install/neo4j-install.sh index 3d7ecb1f4..fdc0c1c17 100644 --- a/install/neo4j-install.sh +++ b/install/neo4j-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://neo4j.com/product/neo4j-graph-database/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,15 +15,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 gpg msg_ok "Installed Dependencies" msg_info "Installing Neo4j (patience)" wget -qO- https://debian.neo4j.com/neotechnology.gpg.key | gpg --dearmor -o /etc/apt/keyrings/neotechnology.gpg -echo 'deb [signed-by=/etc/apt/keyrings/neotechnology.gpg] https://debian.neo4j.com stable latest' > /etc/apt/sources.list.d/neo4j.list +echo 'deb [signed-by=/etc/apt/keyrings/neotechnology.gpg] https://debian.neo4j.com stable latest' >/etc/apt/sources.list.d/neo4j.list $STD apt-get update $STD apt-get install -y neo4j sed -i '/server.default_listen_address/s/^#//' /etc/neo4j/neo4j.conf diff --git a/install/netbox-install.sh b/install/netbox-install.sh index e5d9a78ff..40773acd7 100644 --- a/install/netbox-install.sh +++ b/install/netbox-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://netboxlabs.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ apache2 \ redis-server \ postgresql \ @@ -41,11 +38,11 @@ DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" { -echo "Netbox-Credentials" -echo -e "Netbox Database User: \e[32m$DB_USER\e[0m" -echo -e "Netbox Database Password: \e[32m$DB_PASS\e[0m" -echo -e "Netbox Database Name: \e[32m$DB_NAME\e[0m" -} >> ~/netbox.creds + echo "Netbox-Credentials" + echo -e "Netbox Database User: \e[32m$DB_USER\e[0m" + echo -e "Netbox Database Password: \e[32m$DB_PASS\e[0m" + echo -e "Netbox Database Name: \e[32m$DB_NAME\e[0m" +} >>~/netbox.creds msg_ok "Set up PostgreSQL" msg_info "Installing NetBox (Patience)" @@ -85,7 +82,7 @@ systemctl daemon-reload systemctl enable -q --now netbox netbox-rq echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -echo -e "Netbox Secret: \e[32m$SECRET_KEY\e[0m" >> ~/netbox.creds +echo -e "Netbox Secret: \e[32m$SECRET_KEY\e[0m" >>~/netbox.creds msg_ok "Installed NetBox" msg_info "Setting up Django Admin" @@ -93,7 +90,7 @@ DJANGO_USER=Admin DJANGO_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) source /opt/netbox/venv/bin/activate -$STD python3 /opt/netbox/netbox/manage.py shell << EOF +$STD python3 /opt/netbox/netbox/manage.py shell <> ~/netbox.creds + echo "" + echo "Netbox-Django-Credentials" + echo -e "Django User: \e[32m$DJANGO_USER\e[0m" + echo -e "Django Password: \e[32m$DJANGO_PASS\e[0m" +} >>~/netbox.creds msg_ok "Setup Django Admin" motd_ssh diff --git a/install/nextcloudpi-install.sh b/install/nextcloudpi-install.sh index a3bfa4980..f246c40f9 100644 --- a/install/nextcloudpi-install.sh +++ b/install/nextcloudpi-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.turnkeylinux.org/nextcloud -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 NextCloudPi (Patience)" bash <(curl -fsSL https://raw.githubusercontent.com/nextcloud/nextcloudpi/master/install.sh) >/dev/null 2>&1 msg_ok "Installed NextCloudPi" diff --git a/install/nextpvr-install.sh b/install/nextpvr-install.sh index 98483d949..4a4647d0e 100644 --- a/install/nextpvr-install.sh +++ b/install/nextpvr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://nextpvr.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -18,16 +18,13 @@ $STD apt-get install -y \ mediainfo \ libmediainfo-dev \ libc6 \ - curl \ - sudo \ libgdiplus \ acl \ dvb-tools \ libdvbv5-0 \ dtv-scan-tables \ libc6-dev \ - ffmpeg \ - mc + ffmpeg msg_ok "Installed Dependencies" msg_info "Setup NextPVR (Patience)" diff --git a/install/nginxproxymanager-install.sh b/install/nginxproxymanager-install.sh index 0cdc99a30..8627bf159 100644 --- a/install/nginxproxymanager-install.sh +++ b/install/nginxproxymanager-install.sh @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get update $STD apt-get -y install \ - sudo \ - mc \ - curl \ gnupg \ make \ gcc \ diff --git a/install/nocodb-install.sh b/install/nocodb-install.sh index 29ce2b969..2ee8866b2 100644 --- a/install/nocodb-install.sh +++ b/install/nocodb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.nocodb.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing NocoDB" mkdir -p /opt/nocodb cd /opt/nocodb diff --git a/install/node-red-install.sh b/install/node-red-install.sh index 7fc3cf3d6..6bf096e15 100644 --- a/install/node-red-install.sh +++ b/install/node-red-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://nodered.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y ca-certificates $STD apt-get install -y gnupg diff --git a/install/nodebb-install.sh b/install/nodebb-install.sh index 3fca6f68d..3318ede46 100644 --- a/install/nodebb-install.sh +++ b/install/nodebb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/NodeBB/NodeBB -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,15 +15,12 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - build-essential \ - curl \ - sudo \ - make \ - redis-server \ - expect \ - gnupg \ - ca-certificates \ - mc + build-essential \ + make \ + redis-server \ + expect \ + gnupg \ + ca-certificates msg_ok "Installed Dependencies" msg_info "Setting up Node.js & MongoDB Repository" @@ -32,7 +29,7 @@ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dea 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 curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | gpg --dearmor -o /etc/apt/keyrings/mongodb-server-8.0.gpg -echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-server-8.0.gpg] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-8.0.list +echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-server-8.0.gpg] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" >/etc/apt/sources.list.d/mongodb-org-8.0.list $STD apt-get update msg_ok "Set up Repositories" @@ -44,7 +41,7 @@ msg_info "Installing MongoDB" $STD apt-get install -y mongodb-org systemctl enable -q --now mongod sleep 10 # MongoDB needs some secounds to start, if not sleep it collide with following mongosh -msg_ok "Installed MongoDB" +msg_ok "Installed MongoDB" msg_info "Configure MongoDB" MONGO_ADMIN_USER="admin" @@ -58,9 +55,9 @@ NODEBB_SECRET=$(uuidgen) echo "Mongo Database User: $MONGO_ADMIN_USER" echo "Mongo Database Password: $MONGO_ADMIN_PWD" echo "NodeBB User: $NODEBB_USER" - echo "NodeBB Password: $NODEBB_PWD" - echo "NodeBB Secret: $NODEBB_SECRET" -} >> ~/nodebb.creds + echo "NodeBB Password: $NODEBB_PWD" + echo "NodeBB Secret: $NODEBB_SECRET" +} >>~/nodebb.creds $STD mongosh <> /etc/mongod.conf' systemctl restart mongod -msg_ok "MongoDB successfully configurated" +msg_ok "MongoDB successfully configurated" -msg_info "Install NodeBB" +msg_info "Install NodeBB" cd /opt RELEASE=$(curl -s https://api.github.com/repos/NodeBB/NodeBB/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') wget -q "https://github.com/NodeBB/NodeBB/archive/refs/tags/v${RELEASE}.zip" @@ -95,7 +92,7 @@ unzip -q v${RELEASE}.zip mv NodeBB-${RELEASE} /opt/nodebb cd /opt/nodebb touch pidfile -expect < /dev/null 2>&1 +expect </dev/null 2>&1 log_file /dev/null set timeout -1 @@ -161,4 +158,4 @@ msg_info "Cleaning up" rm -R /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/notifiarr-install.sh b/install/notifiarr-install.sh index ecc026268..e17f66cbb 100644 --- a/install/notifiarr-install.sh +++ b/install/notifiarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://notifiarr.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh index d61d3effd..64fbe6bdc 100644 --- a/install/npmplus-install.sh +++ b/install/npmplus-install.sh @@ -23,7 +23,6 @@ $STD apk add \ gawk \ yq \ mc - msg_ok "Installed Dependencies" msg_info "Installing Docker & Compose" diff --git a/install/ntfy-install.sh b/install/ntfy-install.sh index d1b98f3a2..477e8c4f0 100644 --- a/install/ntfy-install.sh +++ b/install/ntfy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://ntfy.sh/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https msg_ok "Installed Dependencies" @@ -24,7 +21,7 @@ msg_ok "Installed Dependencies" msg_info "Installing ntfy" mkdir -p /etc/apt/keyrings curl -fsSL https://archive.heckel.io/apt/pubkey.txt | gpg --dearmor -o /etc/apt/keyrings/archive.heckel.io.gpg -echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/archive.heckel.io.gpg] https://archive.heckel.io/apt debian main" >/etc/apt/sources.list.d/archive.heckel.io.list +echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/archive.heckel.io.gpg] https://archive.heckel.io/apt debian main" >/etc/apt/sources.list.d/archive.heckel.io.list $STD apt-get update $STD apt-get install -y ntfy systemctl enable -q --now ntfy diff --git a/install/nxwitness-install.sh b/install/nxwitness-install.sh index 625e81fb0..c5728d430 100644 --- a/install/nxwitness-install.sh +++ b/install/nxwitness-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ make \ net-tools \ ffmpeg \ @@ -46,4 +43,4 @@ msg_info "Cleaning up" rm -f /tmp/nxwitness-server-$RELEASE-linux_x64.deb $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/nzbget-install.sh b/install/nzbget-install.sh index f8bc2dbe2..18211287a 100644 --- a/install/nzbget-install.sh +++ b/install/nzbget-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://nzbget.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,11 +15,9 @@ 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 par2 + cat </etc/apt/sources.list.d/non-free.list deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware EOF diff --git a/install/octoprint-install.sh b/install/octoprint-install.sh index 9ac637e3e..d13c8f837 100644 --- a/install/octoprint-install.sh +++ b/install/octoprint-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://octoprint.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y libyaml-dev $STD apt-get install -y build-essential @@ -37,11 +34,11 @@ msg_info "Creating user octoprint" useradd -m -s /bin/bash -p $(openssl passwd -1 octoprint) octoprint usermod -aG sudo,tty,dialout octoprint chown -R octoprint:octoprint /opt -echo "octoprint ALL=NOPASSWD: $(command -v systemctl) restart octoprint, $(command -v reboot), $(command -v poweroff)" > /etc/sudoers.d/octoprint +echo "octoprint ALL=NOPASSWD: $(command -v systemctl) restart octoprint, $(command -v reboot), $(command -v poweroff)" >/etc/sudoers.d/octoprint msg_ok "Created user octoprint" msg_info "Installing OctoPrint" -$STD sudo -u octoprint bash << EOF +$STD sudo -u octoprint bash <"/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.gpg" - cat </etc/apt/sources.list.d/openmediavault.list deb [signed-by=/etc/apt/trusted.gpg.d/openmediavault-archive-keyring.gpg] http://packages.openmediavault.org/public sandworm main EOF diff --git a/install/onedev-install.sh b/install/onedev-install.sh index 6b041e3db..4c92d01f2 100644 --- a/install/onedev-install.sh +++ b/install/onedev-install.sh @@ -15,15 +15,11 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - mc \ - sudo \ default-jdk \ git \ git-lfs msg_ok "Installed Dependencies" - msg_info "Installing OneDev" cd /opt wget -q https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz diff --git a/install/opengist-install.sh b/install/opengist-install.sh index de4b6cfab..ce0423778 100644 --- a/install/opengist-install.sh +++ b/install/opengist-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - mc \ - curl \ - sudo \ - git +$STD apt-get install -y git msg_ok "Installed Dependencies" msg_info "Install Opengist" diff --git a/install/openhab-install.sh b/install/openhab-install.sh index 448732d2b..6a7919a9c 100644 --- a/install/openhab-install.sh +++ b/install/openhab-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.openhab.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 gnupg $STD apt-get install -y apt-transport-https msg_ok "Installed Dependencies" @@ -33,7 +30,7 @@ msg_info "Installing openHAB" curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg mv openhab.gpg /usr/share/keyrings chmod u=rw,g=r,o=r /usr/share/keyrings/openhab.gpg -echo "deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main" > /etc/apt/sources.list.d/openhab.list +echo "deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main" >/etc/apt/sources.list.d/openhab.list $STD apt update $STD apt-get -y install openhab systemctl daemon-reload diff --git a/install/openobserve-install.sh b/install/openobserve-install.sh index fc620ee2c..2b3634813 100644 --- a/install/openobserve-install.sh +++ b/install/openobserve-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://openobserve.ai/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing OpenObserve" mkdir -p /opt/openobserve/data LATEST=$(curl -sL https://api.github.com/repos/openobserve/openobserve/releases/latest | grep '"tag_name":' | cut -d'"' -f4) diff --git a/install/openwebui-install.sh b/install/openwebui-install.sh index fbc0f2b40..580d2252e 100644 --- a/install/openwebui-install.sh +++ b/install/openwebui-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://openwebui.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gpg \ git \ ffmpeg diff --git a/install/outline-install.sh b/install/outline-install.sh index 436f4aadf..5ac07bcc5 100644 --- a/install/outline-install.sh +++ b/install/outline-install.sh @@ -15,13 +15,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ -curl \ -sudo \ -mc \ -gnupg \ -mkcert \ -git \ -redis + gnupg \ + mkcert \ + git \ + redis msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -103,4 +100,4 @@ msg_info "Cleaning up" rm -rf $temp_file $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/overseerr-install.sh b/install/overseerr-install.sh index ec92d7bf2..7459e3bf4 100644 --- a/install/overseerr-install.sh +++ b/install/overseerr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://overseerr.dev/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y ca-certificates $STD apt-get install -y gnupg diff --git a/install/owncast-install.sh b/install/owncast-install.sh index 465497c39..76bb010ec 100644 --- a/install/owncast-install.sh +++ b/install/owncast-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://owncast.online/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc $STD apt-get install -y ffmpeg msg_ok "Installed Dependencies" diff --git a/install/pairdrop-install.sh b/install/pairdrop-install.sh index 2f2f59733..e0c338e71 100644 --- a/install/pairdrop-install.sh +++ b/install/pairdrop-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://pairdrop.net/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y gpg msg_ok "Installed Dependencies" diff --git a/install/paperless-ai-install.sh b/install/paperless-ai-install.sh index 6bba0bf0d..c9513997e 100644 --- a/install/paperless-ai-install.sh +++ b/install/paperless-ai-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/clusterzx/paperless-ai -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,10 +15,7 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - gpg \ + gpg \ make \ gcc \ g++ \ diff --git a/install/paperless-gpt-install.sh b/install/paperless-gpt-install.sh index aa10514c5..f8ed8b0f3 100644 --- a/install/paperless-gpt-install.sh +++ b/install/paperless-gpt-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - sudo \ - curl \ - mc \ gcc \ gnupg \ ca-certificates \ diff --git a/install/paperless-ngx-install.sh b/install/paperless-ngx-install.sh index 809d4033a..bb96469ce 100644 --- a/install/paperless-ngx-install.sh +++ b/install/paperless-ngx-install.sh @@ -32,12 +32,9 @@ $STD apt-get install -y \ libtool \ pkg-config \ git \ - curl \ libtiff-dev \ libpng-dev \ - libleptonica-dev \ - sudo \ - mc + libleptonica-dev msg_ok "Installed Dependencies" msg_info "Setup Python3" @@ -221,7 +218,7 @@ EOF sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml systemctl daemon-reload -$STD systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task-queue paperless-consumer +$STD systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task-queue paperless-consumer msg_ok "Created Services" motd_ssh diff --git a/install/part-db-install.sh b/install/part-db-install.sh index fd315d25e..65059d9c9 100644 --- a/install/part-db-install.sh +++ b/install/part-db-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docs.part-db.de/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,10 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - zip \ ca-certificates \ software-properties-common \ apt-transport-https \ @@ -31,7 +27,7 @@ msg_ok "Installed Dependencies" msg_info "Setting up PHP" PHPVER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION . "\n";') -sed -i "s@post_max_size = 8M@post_max_size = 100M@g" /etc/php/${PHPVER}/apache2/php.ini +sed -i "s@post_max_size = 8M@post_max_size = 100M@g" /etc/php/${PHPVER}/apache2/php.ini sed -i "s@upload_max_filesize = 2M@upload_max_filesize = 100M@g" /etc/php/${PHPVER}/apache2/php.ini msg_ok "Setting up PHP" @@ -42,11 +38,11 @@ DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;" { -echo "Part-DB Credentials" -echo "Part-DB Database User: $DB_USER" -echo "Part-DB Database Password: $DB_PASS" -echo "Part-DB Database Name: $DB_NAME" -} >> ~/partdb.creds + echo "Part-DB Credentials" + echo "Part-DB Database User: $DB_USER" + echo "Part-DB Database Password: $DB_PASS" + echo "Part-DB Database Name: $DB_NAME" +} >>~/partdb.creds msg_ok "Set up PostgreSQL" msg_info "Setting up Node.js/Yarn" @@ -75,14 +71,14 @@ $STD composer install --no-dev -o --no-interaction $STD yarn install $STD yarn build $STD php bin/console cache:clear -php bin/console doctrine:migrations:migrate -n > ~/database-migration-output +php bin/console doctrine:migrations:migrate -n >~/database-migration-output chown -R www-data:www-data /opt/partdb ADMIN_PASS=$(grep -oP 'The initial password for the "admin" user is: \K\w+' ~/database-migration-output) { -echo "" -echo "Part-DB Admin User: admin" -echo "Part-DB Admin Password: $ADMIN_PASS" -} >> ~/partdb.creds + echo "" + echo "Part-DB Admin User: admin" + echo "Part-DB Admin Password: $ADMIN_PASS" +} >>~/partdb.creds echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed Part-DB" diff --git a/install/paymenter-install.sh b/install/paymenter-install.sh index 1dbcecf7d..53c6d5a52 100644 --- a/install/paymenter-install.sh +++ b/install/paymenter-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ software-properties-common \ apt-transport-https \ @@ -54,7 +51,7 @@ mysql -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost' W echo "Database: $DB_NAME" echo "Username: $DB_USER" echo "Password: $DB_PASS" -} >> ~/paymenter_db.creds +} >>~/paymenter_db.creds cp .env.example .env $STD composer install --no-dev --optimize-autoloader --no-interaction $STD php artisan key:generate --force diff --git a/install/peanut-install.sh b/install/peanut-install.sh index 31e4d4ab0..c77fdaa57 100644 --- a/install/peanut-install.sh +++ b/install/peanut-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Brandawg93/PeaNUT/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/pelican-panel-install.sh b/install/pelican-panel-install.sh index 909b63689..604683bf3 100644 --- a/install/pelican-panel-install.sh +++ b/install/pelican-panel-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/pelican-dev/panel -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ lsb-release \ mariadb-server \ mariadb-client \ @@ -48,11 +45,11 @@ $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 "Pelican Panel-Credentials" - echo "Pelican Panel Database User: $DB_USER" - echo "Pelican Panel Database Password: $DB_PASS" - echo "Pelican Panel Database Name: $DB_NAME" -} >> ~/pelican-panel.creds + echo "Pelican Panel-Credentials" + echo "Pelican Panel Database User: $DB_USER" + echo "Pelican Panel Database Password: $DB_PASS" + echo "Pelican Panel Database Name: $DB_NAME" +} >>~/pelican-panel.creds msg_ok "Set up MariaDB" msg_info "Installing Pelican Panel" diff --git a/install/pelican-wings-install.sh b/install/pelican-wings-install.sh index 9b917eef6..35dfc124a 100644 --- a/install/pelican-wings-install.sh +++ b/install/pelican-wings-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/pelican-dev/wings -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 Docker" DOCKER_CONFIG_PATH='/etc/docker/daemon.json' mkdir -p $(dirname $DOCKER_CONFIG_PATH) diff --git a/install/petio-install.sh b/install/petio-install.sh index 14958854e..442fad5e4 100644 --- a/install/petio-install.sh +++ b/install/petio-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://petio.tv/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y gnupg -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc msg_ok "Installed Dependencies" msg_info "Installing MongoDB 4.4" @@ -26,9 +23,9 @@ wget -qO- https://www.mongodb.org/static/pgp/server-4.4.asc | gpg --dearmor >/us OS_ID=$(grep '^ID=' /etc/os-release | cut -d'=' -f2) if [ "$OS_ID" = "debian" ]; then -echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] http://repo.mongodb.org/apt/debian $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/4.4 main" > /etc/apt/sources.list.d/mongodb-org-4.4.list + echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] http://repo.mongodb.org/apt/debian $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/4.4 main" >/etc/apt/sources.list.d/mongodb-org-4.4.list else -echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] https://repo.mongodb.org/apt/ubuntu $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/4.4 multiverse" > /etc/apt/sources.list.d/mongodb-org-4.4.list + echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] https://repo.mongodb.org/apt/ubuntu $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/4.4 multiverse" >/etc/apt/sources.list.d/mongodb-org-4.4.list fi $STD apt-get update @@ -37,7 +34,6 @@ sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf systemctl enable -q --now mongod.service msg_ok "MongoDB 4.4 Installed" - msg_info "Installing Petio" useradd -M --shell=/bin/false petio mkdir /opt/Petio @@ -68,7 +64,6 @@ EOF systemctl enable -q --now petio.service msg_ok "Created Service" - motd_ssh customize diff --git a/install/pf2etools-install.sh b/install/pf2etools-install.sh index 61d0b747e..f6d0f7f1e 100644 --- a/install/pf2etools-install.sh +++ b/install/pf2etools-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - mc \ - sudo \ apache2 \ gpg \ ca-certificates \ @@ -48,7 +45,7 @@ echo "${RELEASE}" >/opt/Pf2eTools_version.txt msg_ok "Set up Pf2eTools" msg_info "Creating Service" -cat <> /etc/apache2/apache2.conf +cat <>/etc/apache2/apache2.conf SetHandler server-status Order deny,allow @@ -68,4 +65,4 @@ $STD apt-get -y autoclean msg_ok "Cleaned" motd_ssh -customize \ No newline at end of file +customize diff --git a/install/photoprism-install.sh b/install/photoprism-install.sh index f0173de58..75867330f 100644 --- a/install/photoprism-install.sh +++ b/install/photoprism-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.photoprism.app/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - curl \ - sudo \ - mc \ exiftool \ ffmpeg \ libheif1 \ diff --git a/install/phpipam-install.sh b/install/phpipam-install.sh index ac7a5392d..60e9e0856 100644 --- a/install/phpipam-install.sh +++ b/install/phpipam-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://phpipam.net/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,14 +15,11 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - mariadb-server \ - apache2 \ - libapache2-mod-php \ - php8.2 php8.2-{fpm,curl,cli,mysql,gd,intl,imap,apcu,pspell,tidy,xmlrpc,mbstring,gmp,xml,ldap,common,snmp} \ - php-pear + mariadb-server \ + apache2 \ + libapache2-mod-php \ + php8.2 php8.2-{fpm,curl,cli,mysql,gd,intl,imap,apcu,pspell,tidy,xmlrpc,mbstring,gmp,xml,ldap,common,snmp} \ + php-pear msg_ok "Installed Dependencies" msg_info "Setting up MariaDB" @@ -37,7 +34,7 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH echo "phpIPAM Database User: $DB_USER" echo "phpIPAM Database Password: $DB_PASS" echo "phpIPAM Database Name: $DB_NAME" -} >> ~/phpipam.creds +} >>~/phpipam.creds msg_ok "Set up MariaDB" msg_info "Installing phpIPAM" @@ -45,13 +42,13 @@ RELEASE=$(curl -s https://api.github.com/repos/phpipam/phpipam/releases/latest | cd /opt wget -q "https://github.com/phpipam/phpipam/releases/download/v${RELEASE}/phpipam-v${RELEASE}.zip" unzip -q "phpipam-v${RELEASE}.zip" -mysql -u root "${DB_NAME}" < /opt/phpipam/db/SCHEMA.sql +mysql -u root "${DB_NAME}" /opt/${APPLICATION}_version.txt msg_ok "Installed phpIPAM" diff --git a/install/pialert-install.sh b/install/pialert-install.sh index 08bfe6a39..6f3a41685 100644 --- a/install/pialert-install.sh +++ b/install/pialert-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/leiweibau/Pi.Alert/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get -y install \ - sudo \ - mc \ - curl \ apt-utils \ avahi-utils \ lighttpd \ @@ -29,7 +26,6 @@ $STD apt-get -y install \ nbtscan \ libwww-perl \ nmap \ - zip \ aria2 \ wakeonlan msg_ok "Installed Dependencies" @@ -74,7 +70,7 @@ touch /opt/pialert/log/pialert.vendors.log /opt/pialert/log/pialert.IP.log /opt/ src_dir="/opt/pialert/log" dest_dir="/opt/pialert/front/php/server" for file in pialert.vendors.log pialert.IP.log pialert.1.log pialert.cleanup.log pialert.webservices.log; do - ln -s "$src_dir/$file" "$dest_dir/$file" + ln -s "$src_dir/$file" "$dest_dir/$file" done sed -i 's#PIALERT_PATH\s*=\s*'\''/home/pi/pialert'\''#PIALERT_PATH = '\''/opt/pialert'\''#' /opt/pialert/config/pialert.conf sed -i 's/$HOME/\/opt/g' /opt/pialert/install/pialert.cron diff --git a/install/pihole-install.sh b/install/pihole-install.sh index f2cf8336d..7c65a2e96 100644 --- a/install/pihole-install.sh +++ b/install/pihole-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - ufw +$STD apt-get install -y ufw msg_ok "Installed Dependencies" msg_info "Installing Pi-hole" diff --git a/install/pingvin-install.sh b/install/pingvin-install.sh index ef1937b16..f88f25f60 100644 --- a/install/pingvin-install.sh +++ b/install/pingvin-install.sh @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ gnupg msg_ok "Installed Dependencies" diff --git a/install/plant-it-install.sh b/install/plant-it-install.sh index 9083093c8..8b6de905c 100644 --- a/install/plant-it-install.sh +++ b/install/plant-it-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - mc \ - sudo \ gnupg2 \ mariadb-server \ redis \ diff --git a/install/plex-install.sh b/install/plex-install.sh index 5478e79f7..22c0c738f 100644 --- a/install/plex-install.sh +++ b/install/plex-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.plex.tv/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 msg_ok "Installed Dependencies" diff --git a/install/pocketbase-install.sh b/install/pocketbase-install.sh index a6325e12c..226baaa9c 100644 --- a/install/pocketbase-install.sh +++ b/install/pocketbase-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://pocketbase.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Pocketbase" RELEASE="$(curl -s https://api.github.com/repos/pocketbase/pocketbase/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')" wget -q "https://github.com/pocketbase/pocketbase/releases/download/v${RELEASE}/pocketbase_${RELEASE}_linux_amd64.zip" -O /tmp/pocketbase.zip diff --git a/install/pocketid-install.sh b/install/pocketid-install.sh index 167c831bb..df2534e73 100644 --- a/install/pocketid-install.sh +++ b/install/pocketid-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/pocket-id/pocket-id -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gpg \ caddy \ gcc @@ -57,7 +54,7 @@ cd /opt/pocket-id/backend cp .env.example .env sed -i "s/PUBLIC_APP_URL=http:\/\/localhost/PUBLIC_APP_URL=https:\/\/${public_url}/" .env cd cmd -CGO_ENABLED=1 +CGO_ENABLED=1 GOOS=linux $STD go build -o ../pocket-id-backend diff --git a/install/podman-homeassistant-install.sh b/install/podman-homeassistant-install.sh index bca94cecd..90cb766e8 100644 --- a/install/podman-homeassistant-install.sh +++ b/install/podman-homeassistant-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.home-assistant.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - get_latest_release() { curl -sL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4 } @@ -26,15 +20,15 @@ get_latest_release() { PORTAINER_LATEST_VERSION=$(get_latest_release "portainer/portainer") PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent") -if $STD mount | grep 'on / type zfs' > null && echo "ZFS"; then - msg_info "Enabling ZFS support." - mkdir -p /etc/containers - cat <<'EOF' >/usr/local/bin/overlayzfsmount +if $STD mount | grep 'on / type zfs' >null && echo "ZFS"; then + msg_info "Enabling ZFS support." + mkdir -p /etc/containers + cat <<'EOF' >/usr/local/bin/overlayzfsmount #!/bin/sh exec /bin/mount -t overlay overlay "$@" EOF - chmod +x /usr/local/bin/overlayzfsmount - cat <<'EOF' >/etc/containers/storage.conf + chmod +x /usr/local/bin/overlayzfsmount + cat <<'EOF' >/etc/containers/storage.conf [storage] driver = "overlay" runroot = "/run/containers/storage" @@ -52,7 +46,7 @@ fi msg_info "Installing Podman" $STD apt-get -y install podman $STD systemctl enable --now podman.socket -echo -e 'unqualified-search-registries=["docker.io"]' >> /etc/containers/registries.conf +echo -e 'unqualified-search-registries=["docker.io"]' >>/etc/containers/registries.conf msg_ok "Installed Podman" read -r -p "Would you like to add Portainer? " prompt diff --git a/install/podman-install.sh b/install/podman-install.sh index 4463689aa..1f7d5e846 100644 --- a/install/podman-install.sh +++ b/install/podman-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://podman.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - get_latest_release() { curl -sL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4 } @@ -26,15 +20,15 @@ get_latest_release() { PORTAINER_LATEST_VERSION=$(get_latest_release "portainer/portainer") PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent") -if $STD mount | grep 'on / type zfs' > null && echo "ZFS"; then - msg_info "Enabling ZFS support." - mkdir -p /etc/containers - cat <<'EOF' >/usr/local/bin/overlayzfsmount +if $STD mount | grep 'on / type zfs' >null && echo "ZFS"; then + msg_info "Enabling ZFS support." + mkdir -p /etc/containers + cat <<'EOF' >/usr/local/bin/overlayzfsmount #!/bin/sh exec /bin/mount -t overlay overlay "$@" EOF - chmod +x /usr/local/bin/overlayzfsmount - cat <<'EOF' >/etc/containers/storage.conf + chmod +x /usr/local/bin/overlayzfsmount + cat <<'EOF' >/etc/containers/storage.conf [storage] driver = "overlay" runroot = "/run/containers/storage" @@ -52,7 +46,7 @@ fi msg_info "Installing Podman" $STD apt-get -y install podman $STD systemctl enable --now podman.socket -echo -e 'unqualified-search-registries=["docker.io"]' >> /etc/containers/registries.conf +echo -e 'unqualified-search-registries=["docker.io"]' >>/etc/containers/registries.conf msg_ok "Installed Podman" read -r -p "Would you like to add Portainer? " prompt @@ -85,7 +79,6 @@ else fi fi - motd_ssh customize diff --git a/install/postgresql-install.sh b/install/postgresql-install.sh index 752fdd125..d2eb9d317 100644 --- a/install/postgresql-install.sh +++ b/install/postgresql-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.postgresql.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 gnupg msg_ok "Installed Dependencies" diff --git a/install/privatebin-install.sh b/install/privatebin-install.sh index 512775c60..ddb04c091 100644 --- a/install/privatebin-install.sh +++ b/install/privatebin-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ nginx \ php8.2-fpm \ php8.2-{common,cli,gd,mbstring,xml,fpm,curl,zip} \ @@ -101,7 +98,7 @@ systemctl reload nginx msg_ok "Nginx Configured" msg_info "Cleaning up" -rm -rf /opt/privatebin/${RELEASE}.zip +rm -rf /opt/privatebin/${RELEASE}.zip rm -rf /opt/privatebin/PrivateBin-${RELEASE} $STD apt-get -y autoremove $STD apt-get -y autoclean diff --git a/install/projectsend-install.sh b/install/projectsend-install.sh index 50b168fdb..c0ff45c36 100644 --- a/install/projectsend-install.sh +++ b/install/projectsend-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.projectsend.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,13 +15,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - mariadb-server \ - apache2 \ - libapache2-mod-php \ - php8.2-{pdo,mysql,mbstring,gettext,fileinfo,gd,xml,zip} + mariadb-server \ + apache2 \ + libapache2-mod-php \ + php8.2-{pdo,mysql,mbstring,gettext,fileinfo,gd,xml,zip} msg_ok "Installed Dependencies" msg_info "Setting up MariaDB" @@ -36,7 +33,7 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH echo "projectsend Database User: $DB_USER" echo "projectsend Database Password: $DB_PASS" echo "projectsend Database Name: $DB_NAME" -} >> ~/projectsend.creds +} >>~/projectsend.creds msg_ok "Set up MariaDB" msg_info "Installing projectsend" @@ -50,14 +47,14 @@ chown -R www-data:www-data /opt/projectsend chmod -R 775 /opt/projectsend chmod 644 /opt/projectsend/includes/sys.config.php sed -i -e "s/\(define('DB_NAME', \).*/\1'$DB_NAME');/" \ - -e "s/\(define('DB_USER', \).*/\1'$DB_USER');/" \ - -e "s/\(define('DB_PASSWORD', \).*/\1'$DB_PASS');/" \ - /opt/projectsend/includes/sys.config.php + -e "s/\(define('DB_USER', \).*/\1'$DB_USER');/" \ + -e "s/\(define('DB_PASSWORD', \).*/\1'$DB_PASS');/" \ + /opt/projectsend/includes/sys.config.php sed -i -e "s/^\(memory_limit = \).*/\1 256M/" \ - -e "s/^\(post_max_size = \).*/\1 256M/" \ - -e "s/^\(upload_max_filesize = \).*/\1 256M/" \ - -e "s/^\(max_execution_time = \).*/\1 300/" \ - /etc/php/8.2/apache2/php.ini + -e "s/^\(post_max_size = \).*/\1 256M/" \ + -e "s/^\(upload_max_filesize = \).*/\1 256M/" \ + -e "s/^\(max_execution_time = \).*/\1 300/" \ + /etc/php/8.2/apache2/php.ini echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed projectsend" diff --git a/install/prometheus-alertmanager-install.sh b/install/prometheus-alertmanager-install.sh index ad854ccdc..bac01b61d 100755 --- a/install/prometheus-alertmanager-install.sh +++ b/install/prometheus-alertmanager-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://prometheus.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 diff --git a/install/prometheus-install.sh b/install/prometheus-install.sh index cbabb93ae..3febc2021 100644 --- a/install/prometheus-install.sh +++ b/install/prometheus-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://prometheus.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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" RELEASE=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') mkdir -p /etc/prometheus diff --git a/install/prometheus-paperless-ngx-exporter-install.sh b/install/prometheus-paperless-ngx-exporter-install.sh index bb21e802a..a5c6f1163 100755 --- a/install/prometheus-paperless-ngx-exporter-install.sh +++ b/install/prometheus-paperless-ngx-exporter-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/hansmi/prometheus-paperless-exporter -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,20 +13,13 @@ 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 Paperless NGX Exporter" RELEASE=$(curl -s https://api.github.com/repos/hansmi/prometheus-paperless-exporter/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') wget -q https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz tar -xf prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz mv prometheus-paperless-exporter_${RELEASE}_linux_amd64/prometheus-paperless-exporter /usr/local/bin/ mkdir -p /etc/prometheus-paperless-ngx-exporter -cat < /etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file +cat </etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file SECRET_AUTH_TOKEN EOF echo "${RELEASE}" >/opt/${APPLICATION}_version.txt diff --git a/install/prometheus-pve-exporter-install.sh b/install/prometheus-pve-exporter-install.sh index ecbeb000a..b2ccef80d 100644 --- a/install/prometheus-pve-exporter-install.sh +++ b/install/prometheus-pve-exporter-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/prometheus-pve/prometheus-pve-exporter -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 "Setup Python3" $STD apt-get install -y \ python3 \ @@ -30,7 +23,7 @@ msg_ok "Setup Python3" msg_info "Installing Prometheus Proxmox VE Exporter" python3 -m pip install --default-timeout=300 --quiet --root-user-action=ignore prometheus-pve-exporter mkdir -p /opt/prometheus-pve-exporter -cat < /opt/prometheus-pve-exporter/pve.yml +cat </opt/prometheus-pve-exporter/pve.yml default: user: prometheus@pve password: sEcr3T! diff --git a/install/prowlarr-install.sh b/install/prowlarr-install.sh index c7eee8169..8a7ed4cb0 100644 --- a/install/prowlarr-install.sh +++ b/install/prowlarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://prowlarr.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 sqlite3 msg_ok "Installed Dependencies" diff --git a/install/proxmox-backup-server-install.sh b/install/proxmox-backup-server-install.sh index bba357aea..91bb8b995 100644 --- a/install/proxmox-backup-server-install.sh +++ b/install/proxmox-backup-server-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.proxmox.com/en/proxmox-backup-server -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - gpg \ - mc +$STD apt-get install -y gpg msg_ok "Installed Dependencies" msg_info "Installing Proxmox Backup Server" diff --git a/install/proxmox-datacenter-manager-install.sh b/install/proxmox-datacenter-manager-install.sh index ca751f15d..ef93be64c 100644 --- a/install/proxmox-datacenter-manager-install.sh +++ b/install/proxmox-datacenter-manager-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - gpg \ - mc +$STD apt-get install -y gpg msg_ok "Installed Dependencies" msg_info "Installing Proxmox Datacenter Manager" @@ -36,4 +32,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/proxmox-mail-gateway-install.sh b/install/proxmox-mail-gateway-install.sh index d893aa94f..e16e25f50 100644 --- a/install/proxmox-mail-gateway-install.sh +++ b/install/proxmox-mail-gateway-install.sh @@ -13,18 +13,10 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get -y install \ - curl \ - sudo \ - mc \ - wget -msg_ok "Installed Dependencies" - msg_info "Installing Proxmox Mail Gateway" wget -q https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg -echo "deb http://download.proxmox.com/debian/pmg bookworm pmg-no-subscription" > /etc/apt/sources.list.d/pmg.list -$STD apt-get update +echo "deb http://download.proxmox.com/debian/pmg bookworm pmg-no-subscription" >/etc/apt/sources.list.d/pmg.list +$STD apt-get update $STD apt-get -y install proxmox-mailgateway-container msg_ok "Installed Proxmox Mail Gateway" diff --git a/install/ps5-mqtt-install.sh b/install/ps5-mqtt-install.sh index be880e463..3dd055f98 100644 --- a/install/ps5-mqtt-install.sh +++ b/install/ps5-mqtt-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/FunkeyFlo/ps5-mqtt/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ jq \ ca-certificates \ gnupg @@ -35,7 +32,6 @@ $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 @@ -44,13 +40,13 @@ 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 +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 +cat </opt/.config/ps5-mqtt/config.json { "mqtt": { "host": "", diff --git a/install/pterodactyl-panel-install.sh b/install/pterodactyl-panel-install.sh index b0f6f7253..89e75298f 100644 --- a/install/pterodactyl-panel-install.sh +++ b/install/pterodactyl-panel-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/pterodactyl/panel -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ lsb-release \ redis \ mariadb-server \ @@ -49,11 +46,11 @@ $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 "pterodactyl Panel-Credentials" - echo "pterodactyl Panel Database User: $DB_USER" - echo "pterodactyl Panel Database Password: $DB_PASS" - echo "pterodactyl Panel Database Name: $DB_NAME" -} >> ~/pterodactyl-panel.creds + echo "pterodactyl Panel-Credentials" + echo "pterodactyl Panel Database User: $DB_USER" + echo "pterodactyl Panel Database Password: $DB_PASS" + echo "pterodactyl Panel Database Name: $DB_NAME" +} >>~/pterodactyl-panel.creds msg_ok "Set up MariaDB" read -p "Provide an email address for admin login, this should be a valid email address: " ADMIN_EMAIL @@ -72,18 +69,18 @@ ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) $STD composer install --no-dev --optimize-autoloader --no-interaction $STD php artisan key:generate --force $STD php artisan p:environment:setup --no-interaction --author $ADMIN_EMAIL --url "http://$IP" -$STD php artisan p:environment:database --no-interaction --database $DB_NAME --username $DB_USER --password $DB_PASS +$STD php artisan p:environment:database --no-interaction --database $DB_NAME --username $DB_USER --password $DB_PASS $STD php artisan migrate --seed --force --no-interaction $STD php artisan p:user:make --no-interaction --admin=1 --email "$ADMIN_EMAIL" --password "$ADMIN_PASS" --name-first "$NAME_FIRST" --name-last "$NAME_LAST" --username "admin" echo "* * * * * php /opt/pterodactyl-panel/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data - chown -R www-data:www-data /opt/pterodactyl-panel/* chmod -R 755 /opt/pterodactyl-panel/storage/* /opt/pterodactyl-panel/bootstrap/cache/ { - echo "" - echo "pterodactyl Admin Username: admin" - echo "pterodactyl Admin Email: $ADMIN_EMAIL" - echo "pterodactyl Admin Password: $ADMIN_PASS" -} >> ~/pterodactyl-panel.creds + echo "" + echo "pterodactyl Admin Username: admin" + echo "pterodactyl Admin Email: $ADMIN_EMAIL" + echo "pterodactyl Admin Password: $ADMIN_PASS" +} >>~/pterodactyl-panel.creds echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed pterodactyl Panel" diff --git a/install/pterodactyl-wings-install.sh b/install/pterodactyl-wings-install.sh index e610e5986..9eeceb16f 100644 --- a/install/pterodactyl-wings-install.sh +++ b/install/pterodactyl-wings-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/pterodactyl/wings -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 Docker" DOCKER_CONFIG_PATH='/etc/docker/daemon.json' mkdir -p $(dirname $DOCKER_CONFIG_PATH) diff --git a/install/qbittorrent-install.sh b/install/qbittorrent-install.sh index 82860dccf..dcc1857f1 100644 --- a/install/qbittorrent-install.sh +++ b/install/qbittorrent-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.qbittorrent.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing qbittorrent-nox" $STD apt-get install -y qbittorrent-nox mkdir -p /.config/qBittorrent/ diff --git a/install/rabbitmq-install.sh b/install/rabbitmq-install.sh index 58cb70743..3a0bb86e1 100644 --- a/install/rabbitmq-install.sh +++ b/install/rabbitmq-install.sh @@ -16,13 +16,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - sudo \ lsb-release \ - curl \ - gnupg \ + gnupg \ apt-transport-https \ - make \ - mc + make msg_ok "Installed Dependencies" msg_info "Adding RabbitMQ signing key" diff --git a/install/radarr-install.sh b/install/radarr-install.sh index 5a4933cd8..90758dc98 100644 --- a/install/radarr-install.sh +++ b/install/radarr-install.sh @@ -14,9 +14,6 @@ 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 sqlite3 msg_ok "Installed Dependencies" diff --git a/install/radicale-install.sh b/install/radicale-install.sh index 39c7dbd69..ab6080059 100644 --- a/install/radicale-install.sh +++ b/install/radicale-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ apache2-utils \ python3-pip \ python3.11-venv diff --git a/install/rdtclient-install.sh b/install/rdtclient-install.sh index 5831f1f50..a731517d5 100644 --- a/install/rdtclient-install.sh +++ b/install/rdtclient-install.sh @@ -13,13 +13,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - mc \ - curl \ - sudo -msg_ok "Installed Dependencies" - msg_info "Installing ASP.NET Core Runtime" wget -q https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb $STD dpkg -i packages-microsoft-prod.deb diff --git a/install/readarr-install.sh b/install/readarr-install.sh index ab093c9fa..41e825a19 100644 --- a/install/readarr-install.sh +++ b/install/readarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://readarr.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 sqlite3 msg_ok "Installed Dependencies" diff --git a/install/readeck-install.sh b/install/readeck-install.sh index 17bd29396..f633e7429 100644 --- a/install/readeck-install.sh +++ b/install/readeck-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://readeck.org/en/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Readeck" LATEST=$(curl -s https://codeberg.org/readeck/readeck/releases/ | grep -oP '(?<=Version )\d+\.\d+\.\d+' | head -1) mkdir -p /opt/readeck diff --git a/install/recyclarr-install.sh b/install/recyclarr-install.sh index 8e0196c23..b93a4118e 100644 --- a/install/recyclarr-install.sh +++ b/install/recyclarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://recyclarr.dev/wiki/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,10 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y curl $STD apt-get install -y git -$STD apt-get install -y sudo -$STD apt-get install -y mc msg_ok "Installed Dependencies" msg_info "Installing Recyclarr" diff --git a/install/redis-install.sh b/install/redis-install.sh index d3acf1bc7..52ccce087 100644 --- a/install/redis-install.sh +++ b/install/redis-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://redis.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https $STD apt-get install -y gpg $STD apt-get install -y lsb-release diff --git a/install/revealjs-install.sh b/install/revealjs-install.sh index b827cafde..161c86313 100644 --- a/install/revealjs-install.sh +++ b/install/revealjs-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/rtsptoweb-install.sh b/install/rtsptoweb-install.sh index e8a950798..14ca51ae4 100644 --- a/install/rtsptoweb-install.sh +++ b/install/rtsptoweb-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/deepch/RTSPtoWeb -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,10 +14,7 @@ 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 git -$STD apt-get install -y mc msg_ok "Installed Dependencies" msg_info "Installing Golang" diff --git a/install/runtipi-install.sh b/install/runtipi-install.sh index 156e98c53..5c137d4a5 100644 --- a/install/runtipi-install.sh +++ b/install/runtipi-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://runtipi.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,16 +13,10 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Runtipi (Patience)" DOCKER_CONFIG_PATH='/etc/docker/daemon.json' mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")" -echo -e '{\n "log-driver": "journald"\n}' > "$DOCKER_CONFIG_PATH" +echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH" cd /opt wget -q https://raw.githubusercontent.com/runtipi/runtipi/master/scripts/install.sh chmod +x install.sh diff --git a/install/rustdeskserver-install.sh b/install/rustdeskserver-install.sh index fc08b2c2b..7d473954e 100644 --- a/install/rustdeskserver-install.sh +++ b/install/rustdeskserver-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/rustdesk/rustdesk-server -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 "Setup RustDesk" RELEASE=$(curl -s https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') TEMPDIR=$(mktemp -d) @@ -37,4 +30,4 @@ msg_info "Cleaning up" rm -rf $TEMPDIR $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/sabnzbd-install.sh b/install/sabnzbd-install.sh index d7a01cc46..0895886b5 100644 --- a/install/sabnzbd-install.sh +++ b/install/sabnzbd-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://sabnzbd.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 par2 $STD apt-get install -y p7zip-full cat </etc/apt/sources.list.d/non-free.list diff --git a/install/seafile-install.sh b/install/seafile-install.sh index 48efb0fcc..81caf8e09 100644 --- a/install/seafile-install.sh +++ b/install/seafile-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y \ - sudo \ - mc \ - wget \ - expect +$STD apt-get install -y expect msg_ok "Installed Dependencies" msg_info "Installing MariaDB" @@ -50,7 +46,7 @@ sudo -u mysql mysql -s -e "GRANT ALL PRIVILEGES ON $SEAHUB_DB.* TO '$DB_USER'@lo echo "DB_PASS: $DB_PASS" echo "ADMIN_EMAIL: $ADMIN_EMAIL" echo "ADMIN_PASS: $ADMIN_PASS" -} >> ~/seafile.creds +} >>~/seafile.creds msg_ok "MariaDB setup for Seafile" msg_info "Installing Seafile Python Dependencies" @@ -187,13 +183,13 @@ msg_ok "Memcached Started" msg_info "Adjusting Conf files" sed -i "0,/127.0.0.1/s/127.0.0.1/0.0.0.0/" /opt/seafile/conf/gunicorn.conf.py sed -i "0,/SERVICE_URL = \"http:\/\/$IP\"/s/SERVICE_URL = \"http:\/\/$IP\"/SERVICE_URL = \"http:\/\/$IP:8000\"/" /opt/seafile/conf/seahub_settings.py -echo -e "\nFILE_SERVER_ROOT = \"http://$IP:8082\"" >> /opt/seafile/conf/seahub_settings.py -echo -e "CSRF_TRUSTED_ORIGINS = [\"http://$IP/\"]" >> /opt/seafile/conf/seahub_settings.py -echo -e "ALLOWED_HOSTS = [\"$IP\"]" >> /opt/seafile/conf/seahub_settings.py -echo -e "CSRF_TRUSTED_ORIGINS = ['http://$IP/']" >> /opt/seafile/conf/seahub_settings.py +echo -e "\nFILE_SERVER_ROOT = \"http://$IP:8082\"" >>/opt/seafile/conf/seahub_settings.py +echo -e "CSRF_TRUSTED_ORIGINS = [\"http://$IP/\"]" >>/opt/seafile/conf/seahub_settings.py +echo -e "ALLOWED_HOSTS = [\"$IP\"]" >>/opt/seafile/conf/seahub_settings.py +echo -e "CSRF_TRUSTED_ORIGINS = ['http://$IP/']" >>/opt/seafile/conf/seahub_settings.py msg_ok "Conf files adjusted" -msg_info "Setting up Seafile" +msg_info "Setting up Seafile" $STD su - seafile -c "bash /opt/seafile/seafile-server-latest/seafile.sh start" $STD su - seafile -c "expect < /dev/null + echo "ADMIN_EMAIL=admin@example.com" + echo "ADMIN_PASSWORD=$PASS" +} | tee .env ~/seelf.creds >/dev/null echo "${RELEASE}" >/opt/seelf_version.txt -SEELF_ADMIN_EMAIL=admin@example.com SEELF_ADMIN_PASSWORD=$PASS ./seelf serve &> /dev/null & sleep 5 ; kill $! +SEELF_ADMIN_EMAIL=admin@example.com SEELF_ADMIN_PASSWORD=$PASS ./seelf serve &>/dev/null & +sleep 5 +kill $! msg_ok "Done setting up seelf" msg_info "Creating Service" @@ -92,4 +91,4 @@ $STD apt-get -y autoclean msg_ok "Cleaned" motd_ssh -customize \ No newline at end of file +customize diff --git a/install/semaphore-install.sh b/install/semaphore-install.sh index a8d7988a3..5276f9072 100644 --- a/install/semaphore-install.sh +++ b/install/semaphore-install.sh @@ -15,11 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - mc \ git \ gpg \ - sudo wget -qO- "https://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=get&search=0x6125E2A8C77F2818FB7BD15B93C4A3FD7BB9C367" | gpg --dearmour >/usr/share/keyrings/ansible-archive-keyring.gpg cat </etc/apt/sources.list.d/ansible.list @@ -84,4 +81,4 @@ msg_info "Cleaning up" rm -rf semaphore_${RELEASE}_linux_amd64.deb $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/sftpgo-install.sh b/install/sftpgo-install.sh index bb0c9c646..6cb8ed2ae 100644 --- a/install/sftpgo-install.sh +++ b/install/sftpgo-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://sftpgo.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 sqlite3 msg_ok "Installed Dependencies" diff --git a/install/shinobi-install.sh b/install/shinobi-install.sh index bd3c777ae..41100cd91 100644 --- a/install/shinobi-install.sh +++ b/install/shinobi-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://shinobi.video/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,8 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y curl sudo git mc -$STD apt-get install -y make zip net-tools +$STD apt-get install -y make zip net-tools git $STD apt-get install -y gcc g++ cmake $STD apt-get install -y ca-certificates $STD apt-get install -y gnupg @@ -44,7 +43,7 @@ gitVersionNumber=$(git rev-parse HEAD) theDateRightNow=$(date) touch version.json chmod 777 version.json -echo '{"Product" : "'"Shinobi"'" , "Branch" : "'"master"'" , "Version" : "'"$gitVersionNumber"'" , "Date" : "'"$theDateRightNow"'" , "Repository" : "'"https://gitlab.com/Shinobi-Systems/Shinobi.git"'"}' > version.json +echo '{"Product" : "'"Shinobi"'" , "Branch" : "'"master"'" , "Version" : "'"$gitVersionNumber"'" , "Date" : "'"$theDateRightNow"'" , "Repository" : "'"https://gitlab.com/Shinobi-Systems/Shinobi.git"'"}' >version.json msg_ok "Cloned Shinobi" msg_info "Installing Database" @@ -59,7 +58,7 @@ msg_ok "Installed Database" msg_info "Installing Shinobi" cp conf.sample.json conf.json -cronKey=$(head -c 1024 < /dev/urandom | sha256sum | awk '{print substr($1,1,29)}') +cronKey=$(head -c 1024 /dev/null +node /opt/Shinobi/tools/modifyConfiguration.js addToConfig="{\"cron\":{\"key\":\"$(head -c 64 /dev/null $STD pm2 start camera.js $STD pm2 start cron.js $STD pm2 startup diff --git a/install/silverbullet-install.sh b/install/silverbullet-install.sh index a19d540b9..3d3d302e4 100644 --- a/install/silverbullet-install.sh +++ b/install/silverbullet-install.sh @@ -13,13 +13,6 @@ 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 Silverbullet" RELEASE=$(curl -s https://api.github.com/repos/silverbulletmd/silverbullet/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') mkdir -p /opt/silverbullet/bin /opt/silverbullet/space diff --git a/install/smokeping-install.sh b/install/smokeping-install.sh index 74ef1142b..f5a3a3814 100644 --- a/install/smokeping-install.sh +++ b/install/smokeping-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://oss.oetiker.ch/smokeping/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing SmokePing" $STD apt-get install -y smokeping cat </etc/smokeping/config.d/Targets diff --git a/install/snipeit-install.sh b/install/snipeit-install.sh index 3da8f6e61..b6be70827 100644 --- a/install/snipeit-install.sh +++ b/install/snipeit-install.sh @@ -15,11 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ composer \ git \ - sudo \ - mc \ nginx \ php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli} \ mariadb-server diff --git a/install/sonarr-install.sh b/install/sonarr-install.sh index 393e9b986..b41217dcb 100644 --- a/install/sonarr-install.sh +++ b/install/sonarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://sonarr.tv/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 sqlite3 msg_ok "Installed Dependencies" @@ -44,7 +41,7 @@ Restart=on-failure [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now sonarr.service +systemctl enable -q --now sonarr msg_ok "Created Service" motd_ssh diff --git a/install/spoolman-install.sh b/install/spoolman-install.sh index 0fb26161b..49f7fc700 100644 --- a/install/spoolman-install.sh +++ b/install/spoolman-install.sh @@ -17,13 +17,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ build-essential \ - curl \ - sudo \ make \ libpq-dev \ gpg \ - ca-certificates \ - mc + ca-certificates msg_ok "Installed Dependencies" msg_info "Setup Python3" diff --git a/install/sqlserver2022-install.sh b/install/sqlserver2022-install.sh index eb1f15d09..9860ddb17 100644 --- a/install/sqlserver2022-install.sh +++ b/install/sqlserver2022-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt install -y \ - curl \ - mc \ - sudo \ gpg \ coreutils msg_ok "Installed Dependencies" diff --git a/install/stirling-pdf-install.sh b/install/stirling-pdf-install.sh index ab445cc61..2af620c44 100644 --- a/install/stirling-pdf-install.sh +++ b/install/stirling-pdf-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.stirlingpdf.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ automake \ autoconf \ @@ -53,7 +50,7 @@ $STD pip3 install \ opencv-python-headless \ unoconv \ pngquant \ - WeasyPrint + WeasyPrint msg_ok "Installed Python Dependencies" msg_info "Installing Azul Zulu" diff --git a/install/suwayomiserver-install.sh b/install/suwayomiserver-install.sh index 3d0354a90..f432597d3 100644 --- a/install/suwayomiserver-install.sh +++ b/install/suwayomiserver-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Suwayomi/Suwayomi-Server -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,15 +15,12 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ openjdk-17-jre \ libc++-dev msg_ok "Installed Dependencies" msg_info "Settting up Suwayomi-Server" -URL=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' | tail -n+2 | head -n 1) +URL=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' | tail -n+2 | head -n 1) RELEASE=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -q $URL $STD dpkg -i *.deb diff --git a/install/syncthing-install.sh b/install/syncthing-install.sh index 05a96c42e..e0d8e32a8 100644 --- a/install/syncthing-install.sh +++ b/install/syncthing-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://syncthing.net/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 gnupg msg_ok "Installed Dependencies" diff --git a/install/tandoor-install.sh b/install/tandoor-install.sh index cc6121a13..ea09d35ef 100644 --- a/install/tandoor-install.sh +++ b/install/tandoor-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://tandoor.dev/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -25,11 +25,8 @@ $STD apt-get install -y --no-install-recommends \ libldap2-dev \ libssl-dev \ gpg \ - curl \ - sudo \ git \ make \ - mc \ pkg-config \ libxmlsec1-dev \ libxml2-dev \ @@ -72,15 +69,15 @@ DB_TIMEZONE=UTC secret_key=$(openssl rand -base64 45 | sed 's/\//\\\//g') DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" sed -i -e "s|SECRET_KEY=.*|SECRET_KEY=$secret_key|g" \ - -e "s|POSTGRES_HOST=.*|POSTGRES_HOST=localhost|g" \ - -e "s|POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$DB_PASS|g" \ - -e "s|POSTGRES_DB=.*|POSTGRES_DB=$DB_NAME|g" \ - -e "s|POSTGRES_USER=.*|POSTGRES_USER=$DB_USER|g" \ - -e "\$a\STATIC_URL=/staticfiles/" /opt/tandoor/.env + -e "s|POSTGRES_HOST=.*|POSTGRES_HOST=localhost|g" \ + -e "s|POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$DB_PASS|g" \ + -e "s|POSTGRES_DB=.*|POSTGRES_DB=$DB_NAME|g" \ + -e "s|POSTGRES_USER=.*|POSTGRES_USER=$DB_USER|g" \ + -e "\$a\STATIC_URL=/staticfiles/" /opt/tandoor/.env msg_ok "Installed Tandoor" msg_info "Install/Set up PostgreSQL Database" -curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc|gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg +curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg echo "deb https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" >/etc/apt/sources.list.d/pgdg.list $STD apt-get update $STD apt-get install -y postgresql-16 @@ -93,7 +90,7 @@ echo "" >>~/tandoor.creds echo -e "Tandoor Database Name: \e[32m$DB_NAME\e[0m" >>~/tandoor.creds echo -e "Tandoor Database User: \e[32m$DB_USER\e[0m" >>~/tandoor.creds echo -e "Tandoor Database Password: \e[32m$DB_PASS\e[0m" >>~/tandoor.creds -export $(cat /opt/tandoor/.env |grep "^[^#]" | xargs) +export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs) /usr/bin/python3 /opt/tandoor/manage.py migrate >/dev/null 2>&1 /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input >/dev/null 2>&1 /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse >/dev/null 2>&1 @@ -117,7 +114,7 @@ ExecStart=/usr/local/bin/gunicorn --error-logfile /tmp/gunicorn_err.log --log-le WantedBy=multi-user.target EOF -cat << 'EOF' >/etc/nginx/conf.d/tandoor.conf +cat <<'EOF' >/etc/nginx/conf.d/tandoor.conf server { listen 8002; #access_log /var/log/nginx/access.log; diff --git a/install/tasmoadmin-install.sh b/install/tasmoadmin-install.sh index ed4c3bf44..6b72f8537 100644 --- a/install/tasmoadmin-install.sh +++ b/install/tasmoadmin-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/TasmoAdmin/TasmoAdmin -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apache2 $STD apt-get install -y php8.2 $STD apt-get install -y libapache2-mod-php diff --git a/install/tasmocompiler-install.sh b/install/tasmocompiler-install.sh index 746ebb3d0..e15b16847 100644 --- a/install/tasmocompiler-install.sh +++ b/install/tasmocompiler-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/benzino77/tasmocompiler -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies. Patience" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gnupg \ git msg_ok "Installed Dependencies" @@ -83,4 +80,4 @@ msg_info "Cleaning up" rm -f /tmp/v${RELEASE}.tar.gz $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/tautulli-install.sh b/install/tautulli-install.sh index cf7b9aac9..63734ddd3 100644 --- a/install/tautulli-install.sh +++ b/install/tautulli-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://tautulli.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y pip msg_ok "Installed Dependencies" diff --git a/install/tdarr-install.sh b/install/tdarr-install.sh index 08a0f7f05..ef67547fa 100644 --- a/install/tdarr-install.sh +++ b/install/tdarr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://home.tdarr.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 handbrake-cli msg_ok "Installed Dependencies" diff --git a/install/technitiumdns-install.sh b/install/technitiumdns-install.sh index 96404d8ea..1cb00b242 100644 --- a/install/technitiumdns-install.sh +++ b/install/technitiumdns-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://technitium.com/dns/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing ASP.NET Core Runtime" wget -q https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb $STD dpkg -i packages-microsoft-prod.deb diff --git a/install/teddycloud-install.sh b/install/teddycloud-install.sh index 4c6a6577e..ac9485360 100644 --- a/install/teddycloud-install.sh +++ b/install/teddycloud-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/toniebox-reverse-engineering/teddycloud -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,12 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ libubsan1 \ ffmpeg \ - curl \ ca-certificates msg_ok "Installed Dependencies" diff --git a/install/the-lounge-install.sh b/install/the-lounge-install.sh index 619361238..fab2c2bf5 100644 --- a/install/the-lounge-install.sh +++ b/install/the-lounge-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - gpg \ - wget \ - mc +$STD apt-get install -y gpg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/threadfin-install.sh b/install/threadfin-install.sh index e24af2aab..98619fc6f 100644 --- a/install/threadfin-install.sh +++ b/install/threadfin-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Threadfin/Threadfin -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y sudo -$STD apt-get install -y mc -$STD apt-get install -y curl $STD apt-get install -y ffmpeg $STD apt-get install -y vlc msg_ok "Installed Dependencies" diff --git a/install/tianji-install.sh b/install/tianji-install.sh index 7c010fb91..699b2526a 100644 --- a/install/tianji-install.sh +++ b/install/tianji-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/msgbyte/tianji -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -21,13 +21,10 @@ $STD apt-get install -y \ cmake \ g++ \ build-essential \ - curl \ - sudo \ git \ make \ gnupg \ - ca-certificates \ - mc + ca-certificates msg_ok "Installed Dependencies" msg_info "Installing Node.js" @@ -47,7 +44,7 @@ DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" TIANJI_SECRET="$(openssl rand -base64 32 | cut -c1-24)" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;" $STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" -$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" +$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" $STD sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;" $STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;" echo "" >>~/tianji.creds diff --git a/install/traccar-install.sh b/install/traccar-install.sh index bf9987c6a..d7c61263c 100644 --- a/install/traccar-install.sh +++ b/install/traccar-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.traccar.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,19 +13,13 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - RELEASE=$(curl -s https://api.github.com/repos/traccar/traccar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') msg_info "Installing Traccar v${RELEASE}" wget -q https://github.com/traccar/traccar/releases/download/v${RELEASE}/traccar-linux-64-${RELEASE}.zip $STD unzip traccar-linux-64-${RELEASE}.zip $STD ./traccar.run systemctl enable -q --now traccar -rm -rf README.txt traccar-linux-64-${RELEASE}.zip traccar.run +rm -rf README.txt traccar-linux-64-${RELEASE}.zip traccar.run msg_ok "Installed Traccar v${RELEASE}" motd_ssh diff --git a/install/traefik-install.sh b/install/traefik-install.sh index c65006bbd..1873f5b42 100644 --- a/install/traefik-install.sh +++ b/install/traefik-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://traefik.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https msg_ok "Installed Dependencies" @@ -105,7 +102,6 @@ EOF systemctl enable -q --now traefik.service msg_ok "Created Service" - motd_ssh customize diff --git a/install/transmission-install.sh b/install/transmission-install.sh index 9ee2f7f8c..1eb9d770d 100644 --- a/install/transmission-install.sh +++ b/install/transmission-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://transmissionbt.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - - msg_info "Installing Transmission" $STD apt-get install -y transmission-daemon systemctl stop transmission-daemon diff --git a/install/trilium-install.sh b/install/trilium-install.sh index 61adc4d34..234f25cff 100644 --- a/install/trilium-install.sh +++ b/install/trilium-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://triliumnext.github.io/Docs/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 "Setup TriliumNext" cd /opt RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') diff --git a/install/typesense-install.sh b/install/typesense-install.sh index 897eda5c2..6c26f397f 100644 --- a/install/typesense-install.sh +++ b/install/typesense-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://typesense.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,19 +13,12 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo -msg_ok "Installed Dependencies" - msg_info "Installing TypeSense" RELEASE=$(curl -s https://api.github.com/repos/typesense/typesense/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') cd /opt wget -q https://dl.typesense.org/releases/${RELEASE}/typesense-server-${RELEASE}-amd64.deb $STD apt install -y /opt/typesense-server-${RELEASE}-amd64.deb -echo 'enable-cors = true' >> /etc/typesense/typesense-server.ini +echo 'enable-cors = true' >>/etc/typesense/typesense-server.ini echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed TypeSense" diff --git a/install/ubuntu-install.sh b/install/ubuntu-install.sh index 459568eeb..b1b02bb23 100644 --- a/install/ubuntu-install.sh +++ b/install/ubuntu-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://ubuntu.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - motd_ssh customize diff --git a/install/umami-install.sh b/install/umami-install.sh index d1830bccf..f3c1118e1 100644 --- a/install/umami-install.sh +++ b/install/umami-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://umami.is/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y gpg $STD apt-get install -y postgresql diff --git a/install/umbrel-install.sh b/install/umbrel-install.sh index 99acbe308..198ce4439 100644 --- a/install/umbrel-install.sh +++ b/install/umbrel-install.sh @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Umbrel (Patience)" DOCKER_CONFIG_PATH='/etc/docker/daemon.json' mkdir -p $(dirname $DOCKER_CONFIG_PATH) @@ -32,6 +26,6 @@ motd_ssh customize msg_info "Cleaning up" -#$STD apt-get autoremove -#$STD apt-get autoclean +$STD apt-get autoremove +$STD apt-get autoclean msg_ok "Cleaned" diff --git a/install/unbound-install.sh b/install/unbound-install.sh index 05581dd60..faab1f1ff 100644 --- a/install/unbound-install.sh +++ b/install/unbound-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/NLnetLabs/unbound -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - sudo \ - curl \ - mc -msg_ok "Installed Dependencies" - msg_info "Installing Unbound" $STD apt-get install -y \ unbound \ diff --git a/install/unifi-install.sh b/install/unifi-install.sh index 6b4d35711..9b9be2a09 100644 --- a/install/unifi-install.sh +++ b/install/unifi-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://ui.com/download/unifi -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 apt-transport-https $STD apt-get install -y gnupg msg_ok "Installed Dependencies" @@ -35,7 +32,7 @@ if ! grep -q -m1 'avx[^ ]*' /proc/cpuinfo; then wget -q http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1n-0+deb10u6_amd64.deb $STD dpkg -i libssl1.1_1.1.1n-0+deb10u6_amd64.deb fi - wget -qO- https://www.mongodb.org/static/pgp/server-4.4.asc | gpg --dearmor > /usr/share/keyrings/mongodb-server-4.4.gpg + wget -qO- https://www.mongodb.org/static/pgp/server-4.4.asc | gpg --dearmor >/usr/share/keyrings/mongodb-server-4.4.gpg echo "deb [signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg] https://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" >/etc/apt/sources.list.d/mongodb-org-4.4.list $STD apt-get update $STD apt-get install -y mongodb-org diff --git a/install/unmanic-install.sh b/install/unmanic-install.sh index 633ec61ba..48d5da7d5 100644 --- a/install/unmanic-install.sh +++ b/install/unmanic-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://docs.unmanic.app/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc $STD apt-get install -y ffmpeg $STD apt-get install -y python3-pip msg_ok "Installed Dependencies" @@ -41,7 +38,7 @@ sed -i -e 's/^sgx:x:104:$/render:x:104:root/' -e 's/^render:x:106:root$/sgx:x:10 msg_ok "Installed Unmanic" msg_info "Creating Service" -cat << EOF >/etc/systemd/system/unmanic.service +cat </etc/systemd/system/unmanic.service [Unit] Description=Unmanic - Library Optimiser After=network-online.target diff --git a/install/uptimekuma-install.sh b/install/uptimekuma-install.sh index 80551af4b..8cd8a84e1 100644 --- a/install/uptimekuma-install.sh +++ b/install/uptimekuma-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://uptime.kuma.pet/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git $STD apt-get install -y ca-certificates $STD apt-get install -y gnupg diff --git a/install/urbackupserver-install.sh b/install/urbackupserver-install.sh index 18d0fd9c2..998fd3309 100644 --- a/install/urbackupserver-install.sh +++ b/install/urbackupserver-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.urbackup.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gnupg \ coreutils msg_ok "Installed Dependencies" diff --git a/install/vaultwarden-install.sh b/install/vaultwarden-install.sh index 8a2e2c0f1..8cdb949f7 100644 --- a/install/vaultwarden-install.sh +++ b/install/vaultwarden-install.sh @@ -22,10 +22,7 @@ $STD apt-get -qqy install \ libssl-dev \ libmariadb-dev-compat \ libpq-dev \ - curl \ - sudo \ - argon2 \ - mc + argon2 msg_ok "Installed Dependencies" WEBVAULT=$(curl -s https://api.github.com/repos/dani-garcia/bw_web_builds/releases/latest | diff --git a/install/victoriametrics-install.sh b/install/victoriametrics-install.sh index 4ba74fb8d..178fcd30c 100644 --- a/install/victoriametrics-install.sh +++ b/install/victoriametrics-install.sh @@ -13,13 +13,6 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - sudo \ - curl \ - mc -msg_ok "Installed Dependencies" - msg_info "Setup VictoriaMetrics" temp_dir=$(mktemp -d) cd $temp_dir diff --git a/install/vikunja-install.sh b/install/vikunja-install.sh index 3ed62024c..80f375998 100644 --- a/install/vikunja-install.sh +++ b/install/vikunja-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://vikunja.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - make \ - mc +$STD apt-get install -y make msg_ok "Installed Dependencies" msg_info "Setup Vikunja (Patience)" diff --git a/install/wallos-install.sh b/install/wallos-install.sh index ff98a180f..4884e9316 100644 --- a/install/wallos-install.sh +++ b/install/wallos-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/ellite/wallos -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,12 +16,9 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ apache2 \ libapache2-mod-php \ - php8.2-{mbstring,gd,curl,intl,imagick,bz2,sqlite3,zip,xml} + php8.2-{mbstring,gd,curl,intl,imagick,bz2,sqlite3,zip,xml} msg_ok "Installed Dependencies" msg_info "Installing Wallos (Patience)" @@ -52,14 +49,14 @@ cat </etc/apache2/sites-available/wallos.conf EOF $STD a2ensite wallos.conf -$STD a2dissite 000-default.conf +$STD a2dissite 000-default.conf $STD systemctl reload apache2 $STD curl http://localhost/endpoints/db/migrate.php msg_ok "Installed Wallos" -msg_info "Setting up Crontabs" +msg_info "Setting up Crontabs" mkdir -p /var/log/cron -cat < /opt/wallos.cron +cat </opt/wallos.cron 0 1 * * * php /opt/wallos/endpoints/cronjobs/updatenextpayment.php >> /var/log/cron/updatenextpayment.log 2>&1 0 2 * * * php /opt/wallos/endpoints/cronjobs/updateexchange.php >> /var/log/cron/updateexchange.log 2>&1 0 8 * * * php /opt/wallos/endpoints/cronjobs/sendcancellationnotifications.php >> /var/log/cron/sendcancellationnotifications.log 2>&1 diff --git a/install/wastebin-install.sh b/install/wastebin-install.sh index 600295184..58226b63a 100644 --- a/install/wastebin-install.sh +++ b/install/wastebin-install.sh @@ -13,13 +13,6 @@ 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 Wastebin" temp_file=$(mktemp) RELEASE=$(curl -s https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') diff --git a/install/watcharr-install.sh b/install/watcharr-install.sh index aa3c249df..c39d8e04c 100644 --- a/install/watcharr-install.sh +++ b/install/watcharr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/sbondCo/Watcharr -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ gcc \ gnupg msg_ok "Installed Dependencies" @@ -90,4 +87,4 @@ msg_info "Cleaning up" rm -f "$temp_file" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/watchyourlan-install.sh b/install/watchyourlan-install.sh index 6c527186e..c13cc92d3 100644 --- a/install/watchyourlan-install.sh +++ b/install/watchyourlan-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/aceberg/WatchYourLAN -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,7 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y {curl,sudo,mc,gpg,arp-scan,ieee-data,libwww-perl} +$STD apt-get install -y {gpg,arp-scan,ieee-data,libwww-perl} msg_ok "Installed Dependencies" msg_info "Installing WatchYourLAN" diff --git a/install/wavelog-install.sh b/install/wavelog-install.sh index 961955809..0b5500434 100644 --- a/install/wavelog-install.sh +++ b/install/wavelog-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/wavelog/wavelog -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,13 +15,9 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - libapache2-mod-php \ - mariadb-server \ - mc \ - php8.2-{curl,mbstring,mysql,xml,zip,gd} \ - sudo \ - unzip + libapache2-mod-php \ + mariadb-server \ + php8.2-{curl,mbstring,mysql,xml,zip,gd} msg_ok "Installed Dependencies" msg_info "Setting up Database" @@ -36,7 +32,7 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH echo "Wavelog Database User: $DB_USER" echo "Wavelog Database Password: $DB_PASS" echo "Wavelog Database Name: $DB_NAME" -} >> ~/wavelog.creds +} >>~/wavelog.creds msg_ok "Set up database" msg_info "Setting up PHP" @@ -73,7 +69,7 @@ cat </etc/apache2/sites-available/wavelog.conf EOF $STD a2ensite wavelog.conf -$STD a2dissite 000-default.conf +$STD a2dissite 000-default.conf $STD systemctl reload apache2 msg_ok "Created Service" diff --git a/install/web-check-install.sh b/install/web-check-install.sh index df92be337..ef6ad3d14 100644 --- a/install/web-check-install.sh +++ b/install/web-check-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/lissy93/web-check -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" export DEBIAN_FRONTEND=noninteractive $STD apt-get -y install --no-install-recommends \ - curl \ - sudo \ - mc \ git \ gnupg \ traceroute \ @@ -67,7 +64,7 @@ $STD npm install -g yarn msg_ok "Installed Node.js" msg_info "Setting up Chromium" -/usr/bin/chromium --no-sandbox --version > /etc/chromium-version +/usr/bin/chromium --no-sandbox --version >/etc/chromium-version chmod 755 /usr/bin/chromium msg_ok "Setup Chromium" @@ -78,7 +75,7 @@ wget -q "https://github.com/CrazyWolf13/web-check/archive/refs/heads/${RELEASE}. tar xzf $temp_file mv web-check-${RELEASE} /opt/web-check cd /opt/web-check -cat <<'EOF' > /opt/web-check/.env +cat <<'EOF' >/opt/web-check/.env CHROME_PATH=/usr/bin/chromium PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium HEADLESS=true @@ -109,7 +106,7 @@ $STD yarn build --production msg_ok "Built Web-Check" msg_info "Creating Service" -cat <<'EOF' > /opt/run_web-check.sh +cat <<'EOF' >/opt/run_web-check.sh #!/bin/bash SCREEN_RESOLUTION="1280x1024x24" if ! systemctl is-active --quiet dbus; then @@ -123,7 +120,7 @@ cd /opt/web-check exec yarn start EOF chmod +x /opt/run_web-check.sh -cat <<'EOF' > /etc/systemd/system/web-check.service +cat <<'EOF' >/etc/systemd/system/web-check.service [Unit] Description=Web Check Service After=network.target diff --git a/install/wger-install.sh b/install/wger-install.sh index 7ffcdfbca..018eddd49 100644 --- a/install/wger-install.sh +++ b/install/wger-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/wger-project/wger -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,13 +15,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ - git \ - gnupg \ - apache2 \ - libapache2-mod-wsgi-py3 + git \ + gnupg \ + apache2 \ + libapache2-mod-wsgi-py3 msg_ok "Installed Dependencies" msg_info "Installing Python" diff --git a/install/whisparr-install.sh b/install/whisparr-install.sh index 76cdcf5cf..3600ea20a 100644 --- a/install/whisparr-install.sh +++ b/install/whisparr-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/Whisparr/Whisparr -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,10 +14,7 @@ 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 sqlite3 +$STD apt-get install -y sqlite3 msg_ok "Installed Dependencies" msg_info "Installing Whisparr" diff --git a/install/whoogle-install.sh b/install/whoogle-install.sh index 10e06c475..e20dfcd61 100644 --- a/install/whoogle-install.sh +++ b/install/whoogle-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/benbusby/whoogle-search -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,12 +13,6 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Setup Python3" $STD apt-get install -y \ python3 \ diff --git a/install/wikijs-install.sh b/install/wikijs-install.sh index 2c9edbe2e..076588081 100644 --- a/install/wikijs-install.sh +++ b/install/wikijs-install.sh @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ gpg msg_ok "Installed Dependencies" @@ -52,11 +49,11 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8' $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" { - echo "WikiJS-Credentials" - echo "WikiJS Database User: $DB_USER" - echo "WikiJS Database Password: $DB_PASS" - echo "WikiJS Database Name: $DB_NAME" -} >> ~/wikijs.creds + echo "WikiJS-Credentials" + echo "WikiJS Database User: $DB_USER" + echo "WikiJS Database Password: $DB_PASS" + echo "WikiJS Database Name: $DB_NAME" +} >>~/wikijs.creds msg_ok "Set up PostgreSQL" msg_info "Setup Wiki.js" @@ -98,4 +95,4 @@ msg_info "Cleaning up" rm -f "$temp_file" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/wireguard-install.sh b/install/wireguard-install.sh index 96b01df16..6e4b2048a 100644 --- a/install/wireguard-install.sh +++ b/install/wireguard-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.wireguard.com/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -14,9 +14,6 @@ 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 git msg_ok "Installed Dependencies" @@ -37,7 +34,7 @@ msg_ok "Installed WGDashboard" msg_info "Create Example Config for WGDashboard" private_key=$(wg genkey) -cat </etc/wireguard/wg0.conf +cat </etc/wireguard/wg0.conf [Interface] PrivateKey = ${private_key} Address = 10.0.0.1/24 diff --git a/install/wordpress-install.sh b/install/wordpress-install.sh index 665b105ab..b4efe2ef5 100644 --- a/install/wordpress-install.sh +++ b/install/wordpress-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://wordpress.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,15 +15,11 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - curl \ - unzip \ - sudo \ - mc \ - apache2 \ - php8.2-{bcmath,common,cli,curl,fpm,gd,snmp,imap,mbstring,mysql,xml,zip} \ - libapache2-mod-php \ - mariadb-server - msg_ok "Installed Dependencies" + apache2 \ + php8.2-{bcmath,common,cli,curl,fpm,gd,snmp,imap,mbstring,mysql,xml,zip} \ + libapache2-mod-php \ + mariadb-server +msg_ok "Installed Dependencies" msg_info "Setting up Database" DB_NAME=wordpress_db @@ -37,7 +33,7 @@ $STD mysql -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localho echo "Database User: $DB_USER" echo "Database Password: $DB_PASS" echo "Database Name: $DB_NAME" -} >> ~/wordpress.creds +} >>~/wordpress.creds msg_ok "Set up Database" msg_info "Installing Wordpress (Patience)" @@ -50,13 +46,13 @@ find . -type d -exec chmod 755 {} \; find . -type f -exec chmod 644 {} \; mv wp-config-sample.php wp-config.php sed -i -e "s|^define( 'DB_NAME', '.*' );|define( 'DB_NAME', '$DB_NAME' );|" \ - -e "s|^define( 'DB_USER', '.*' );|define( 'DB_USER', '$DB_USER' );|" \ - -e "s|^define( 'DB_PASSWORD', '.*' );|define( 'DB_PASSWORD', '$DB_PASS' );|" \ - /var/www/html/wordpress/wp-config.php + -e "s|^define( 'DB_USER', '.*' );|define( 'DB_USER', '$DB_USER' );|" \ + -e "s|^define( 'DB_PASSWORD', '.*' );|define( 'DB_PASSWORD', '$DB_PASS' );|" \ + /var/www/html/wordpress/wp-config.php msg_ok "Installed Wordpress" msg_info "Setup Services" -cat < /etc/apache2/sites-available/wordpress.conf +cat </etc/apache2/sites-available/wordpress.conf ServerName yourdomain.com DocumentRoot /var/www/html/wordpress @@ -82,4 +78,4 @@ msg_info "Cleaning up" rm -rf /var/www/html/latest.zip $STD apt-get autoremove $STD apt-get autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/yt-dlp-webui-install.sh b/install/yt-dlp-webui-install.sh index b8fe75a0f..1466b5483 100644 --- a/install/yt-dlp-webui-install.sh +++ b/install/yt-dlp-webui-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - sudo \ - mc \ - curl \ - ffmpeg +$STD apt-get install -y ffmpeg msg_ok "Installed Dependencies" msg_info "Installing ${APPLICATION}" diff --git a/install/yunohost-install.sh b/install/yunohost-install.sh index 8464bb13b..207d77117 100644 --- a/install/yunohost-install.sh +++ b/install/yunohost-install.sh @@ -14,9 +14,6 @@ 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 gnupg $STD apt-get install -y apt-transport-https $STD apt-get install -y lsb-release diff --git a/install/zabbix-install.sh b/install/zabbix-install.sh index dfd4592a5..1e5a478d4 100644 --- a/install/zabbix-install.sh +++ b/install/zabbix-install.sh @@ -13,13 +13,6 @@ 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 Zabbix" cd /tmp wget -q https://repo.zabbix.com/zabbix/7.2/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb diff --git a/install/zammad-install.sh b/install/zammad-install.sh index 8c5794851..3143b1cf3 100644 --- a/install/zammad-install.sh +++ b/install/zammad-install.sh @@ -15,14 +15,11 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ git \ - sudo \ gpg \ - wget \ nginx \ apt-transport-https \ - gnupg + gnupg msg_ok "Installed Dependencies" msg_info "Setting up Elasticsearch" @@ -58,4 +55,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/zerotier-one-install.sh b/install/zerotier-one-install.sh index 183879a86..673648cdc 100644 --- a/install/zerotier-one-install.sh +++ b/install/zerotier-one-install.sh @@ -14,26 +14,22 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - mc \ - sudo \ - gnupg +$STD apt-get install -y gnupg msg_ok "Installed Dependencies" msg_info "Setting up Zerotier-One" -curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg' | gpg --import && \ -if z="$(curl -s 'https://install.zerotier.com/' | gpg)"; then -echo "$z" | sudo bash -fi +curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg' | gpg --import && + if z="$(curl -s 'https://install.zerotier.com/' | gpg)"; then + echo "$z" | sudo bash + fi msg_ok "Setup Zerotier-One" msg_info "Setting up UI" curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb dpkg -i ztncui_0.8.14_amd64.deb sh -c "echo ZT_TOKEN=$(cat /var/lib/zerotier-one/authtoken.secret) > /opt/key-networks/ztncui/.env" -echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env -echo NODE_ENV=production >> /opt/key-networks/ztncui/.env +echo HTTPS_PORT=3443 >>/opt/key-networks/ztncui/.env +echo NODE_ENV=production >>/opt/key-networks/ztncui/.env chmod 400 /opt/key-networks/ztncui/.env chown ztncui:ztncui /opt/key-networks/ztncui/.env systemctl restart ztncui @@ -45,4 +41,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/zigbee2mqtt-install.sh b/install/zigbee2mqtt-install.sh index c64c1b76c..9c6a0f724 100644 --- a/install/zigbee2mqtt-install.sh +++ b/install/zigbee2mqtt-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.zigbee2mqtt.io/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -15,9 +15,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ git \ make \ g++ \ diff --git a/install/zipline-install.sh b/install/zipline-install.sh index 2d611bca7..3d167420a 100644 --- a/install/zipline-install.sh +++ b/install/zipline-install.sh @@ -6,7 +6,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/diced/zipline -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -17,10 +17,7 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ postgresql \ - gpg \ - curl \ - sudo \ - mc + gpg msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" diff --git a/install/zitadel-install.sh b/install/zitadel-install.sh index cb8f49828..1c0a4a56c 100644 --- a/install/zitadel-install.sh +++ b/install/zitadel-install.sh @@ -14,12 +14,7 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - ca-certificates \ - wget +$STD apt-get install -y ca-certificates msg_ok "Installed Dependecies" msg_info "Installing Postgresql" @@ -34,13 +29,13 @@ $STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE USER $DB_ADMIN_USER WITH PASSWORD '$DB_ADMIN_PASS' SUPERUSER;" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_ADMIN_USER;" { - echo "Application Credentials" - echo "DB_NAME: $DB_NAME" - echo "DB_USER: $DB_USER" - echo "DB_PASS: $DB_PASS" - echo "DB_ADMIN_USER: $DB_ADMIN_USER" - echo "DB_ADMIN_PASS: $DB_ADMIN_PASS" -} >> ~/zitadel.creds + echo "Application Credentials" + echo "DB_NAME: $DB_NAME" + echo "DB_USER: $DB_USER" + echo "DB_PASS: $DB_PASS" + echo "DB_ADMIN_USER: $DB_ADMIN_USER" + echo "DB_ADMIN_PASS: $DB_ADMIN_PASS" +} >>~/zitadel.creds msg_ok "Installed PostgreSQL" msg_info "Installing Zitadel" @@ -51,12 +46,12 @@ msg_ok "Installed Zitadel" msg_info "Setting up Zitadel Environments" mkdir -p /opt/zitadel -echo "/opt/zitadel/config.yaml" > "/opt/zitadel/.config" -head -c 32 < <(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9') > "/opt/zitadel/.masterkey" +echo "/opt/zitadel/config.yaml" >"/opt/zitadel/.config" +head -c 32 < <(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9') >"/opt/zitadel/.masterkey" { - echo "Config location: $(cat "/opt/zitadel/.config")" - echo "Masterkey: $(cat "/opt/zitadel/.masterkey")" -} >> ~/zitadel.creds + echo "Config location: $(cat "/opt/zitadel/.config")" + echo "Masterkey: $(cat "/opt/zitadel/.masterkey")" +} >>~/zitadel.creds cat </opt/zitadel/config.yaml Port: 8080 ExternalPort: 8080 @@ -133,7 +128,7 @@ msg_info "Set ExternalDomain to current IP and restart Zitadel" IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) sed -i "0,/localhost/s/localhost/${IP}/" /opt/zitadel/config.yaml systemctl stop -q zitadel.service -zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null +zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null systemctl restart -q zitadel.service msg_ok "Zitadel restarted with ExternalDomain set to current IP" diff --git a/install/zoraxy-install.sh b/install/zoraxy-install.sh index 626cb0f2b..a887b33cf 100644 --- a/install/zoraxy-install.sh +++ b/install/zoraxy-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://zoraxy.aroz.org/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,14 +13,8 @@ setting_up_container 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 -msg_ok "Installed Dependencies" - msg_info "Installing Zoraxy (Patience)" -RELEASE=$(curl -s https://api.github.com/repos/tobychui/zoraxy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') +RELEASE=$(curl -s https://api.github.com/repos/tobychui/zoraxy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -q "https://github.com/tobychui/zoraxy/releases/download/${RELEASE}/zoraxy_linux_amd64" mkdir -p /opt/zoraxy mv zoraxy_linux_amd64 /opt/zoraxy/zoraxy diff --git a/install/zwave-js-ui-install.sh b/install/zwave-js-ui-install.sh index 0a8f16f54..af7a6f541 100644 --- a/install/zwave-js-ui-install.sh +++ b/install/zwave-js-ui-install.sh @@ -5,7 +5,7 @@ # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://zwave-js.github.io/zwave-js-ui/#/ -source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color verb_ip6 catch_errors @@ -13,13 +13,6 @@ 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 Z-Wave JS UI" mkdir -p /opt/zwave-js-ui mkdir -p /opt/zwave_store @@ -35,7 +28,7 @@ echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed Z-Wave JS UI" msg_info "Creating Service" -cat < /etc/systemd/system/zwave-js-ui.service +cat </etc/systemd/system/zwave-js-ui.service [Unit] Description=zwave-js-ui Wants=network-online.target From 0be5f78d3571e7bcf3dfe35e3c409e99e3af4585 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:24:21 +0100 Subject: [PATCH 218/258] Update CHANGELOG.md (#3380) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 591c6f0b2..cba56364a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,10 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts + - #### ✨ New Features + + - [core] Rebase Scripts (formatting, highlighting & remove old deps) [@MickLesk](https://github.com/MickLesk) ([#3378](https://github.com/community-scripts/ProxmoxVE/pull/3378)) + - #### πŸ”§ Refactor - Refactor: ErsatzTV Script [@MickLesk](https://github.com/MickLesk) ([#3365](https://github.com/community-scripts/ProxmoxVE/pull/3365)) From e653157e24d479a3b829e7bf1b10092d4654de10 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:40:30 +0100 Subject: [PATCH 219/258] 'Add new script' (#3381) Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> --- ct/wazuh.sh | 44 ++++++++++++++++++++++++++++++ frontend/public/json/wazuh.json | 43 +++++++++++++++++++++++++++++ install/wazuh-install.sh | 48 +++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 ct/wazuh.sh create mode 100644 frontend/public/json/wazuh.json create mode 100644 install/wazuh-install.sh diff --git a/ct/wazuh.sh b/ct/wazuh.sh new file mode 100644 index 000000000..a5c6df8c0 --- /dev/null +++ b/ct/wazuh.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2025 community-scripts ORG +# Author: Omar Minaya +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wazuh.com/ + +APP="Wazuh" +var_tags="security;monitoring" +var_cpu="4" +var_ram="4096" +var_disk="18" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated ${APP} LXC" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:443${CL}" diff --git a/frontend/public/json/wazuh.json b/frontend/public/json/wazuh.json new file mode 100644 index 000000000..223e5af8a --- /dev/null +++ b/frontend/public/json/wazuh.json @@ -0,0 +1,43 @@ +{ + "name": "Wazuh", + "slug": "wazuh", + "categories": [ + 1 + ], + "date_created": "2025-03-19", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 443, + "documentation": "https://documentation.wazuh.com/", + "website": "https://wazuh.com/", + "logo": "https://avatars.githubusercontent.com/u/13752566?s=200&v=4", + "description": "Wazuh is an open-source security monitoring solution that provides endpoint protection, network monitoring, and log analysis capabilities.", + "install_methods": [ + { + "type": "default", + "script": "ct/wazuh.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + }, + { + "text": "Show password: `cat ~/wazuh.creds`", + "type": "info" + } + ] +} diff --git a/install/wazuh-install.sh b/install/wazuh-install.sh new file mode 100644 index 000000000..8b3cc053e --- /dev/null +++ b/install/wazuh-install.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +# Copyright (c) 2024 community-scripts ORG +# Author: Omar Minaya +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wazuh.com/ + +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 \ + sudo \ + mc \ + curl +msg_ok "Installed Dependencies" + +# Fetching the latest Wazuh version +msg_info "Fetching Latest Wazuh Version" +RELEASE=$(curl -s https://api.github.com/repos/wazuh/wazuh/releases/latest | grep '"tag_name"' | awk -F '"' '{print substr($4, 2, length($2)-4)}') +msg_ok "Latest Wazuh Version: $RELEASE" + +msg_info "Setup Wazuh" +curl -fsSL https://packages.wazuh.com/$RELEASE/wazuh-install.sh +chmod +x wazuh-install.sh + +if [ "$STD" = "silent" ]; then + bash wazuh-install.sh -a >>~/wazuh-install.output +else + bash wazuh-install.sh -a | tee -a ~/wazuh-install.output +fi +cat ~/wazuh-install.output | grep -E "User|Password" | awk '{$1=$1};1' | sed '1i wazuh-credentials' >~/wazuh.creds +msg_ok "Setup Wazuh" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f wazuh-*.sh +rm -f ~/wazuh-install.output +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" From 8d78ff146294663d99c092a07686605072633a56 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:41:57 +0100 Subject: [PATCH 220/258] Update date in json (#3382) Co-authored-by: GitHub Actions --- frontend/public/json/wazuh.json | 80 ++++++++++++++++----------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/frontend/public/json/wazuh.json b/frontend/public/json/wazuh.json index 223e5af8a..9fab4c049 100644 --- a/frontend/public/json/wazuh.json +++ b/frontend/public/json/wazuh.json @@ -1,43 +1,43 @@ { - "name": "Wazuh", - "slug": "wazuh", - "categories": [ - 1 - ], - "date_created": "2025-03-19", - "type": "ct", - "updateable": false, - "privileged": false, - "interface_port": 443, - "documentation": "https://documentation.wazuh.com/", - "website": "https://wazuh.com/", - "logo": "https://avatars.githubusercontent.com/u/13752566?s=200&v=4", - "description": "Wazuh is an open-source security monitoring solution that provides endpoint protection, network monitoring, and log analysis capabilities.", - "install_methods": [ - { - "type": "default", - "script": "ct/wazuh.sh", - "resources": { - "cpu": 4, - "ram": 4096, - "hdd": 10, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": "root", - "password": null + "name": "Wazuh", + "slug": "wazuh", + "categories": [ + 1 + ], + "date_created": "2025-03-24", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 443, + "documentation": "https://documentation.wazuh.com/", + "website": "https://wazuh.com/", + "logo": "https://avatars.githubusercontent.com/u/13752566?s=200&v=4", + "description": "Wazuh is an open-source security monitoring solution that provides endpoint protection, network monitoring, and log analysis capabilities.", + "install_methods": [ + { + "type": "default", + "script": "ct/wazuh.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" }, - "notes": [ - { - "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", - "type": "warning" - }, - { - "text": "Show password: `cat ~/wazuh.creds`", - "type": "info" - } - ] + { + "text": "Show password: `cat ~/wazuh.creds`", + "type": "info" + } + ] } From 50b59356aeee318becf3b702b55cfe63522a45d3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:42:12 +0100 Subject: [PATCH 221/258] Update .app files (#3384) Co-authored-by: GitHub Actions --- ct/headers/wazuh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/wazuh diff --git a/ct/headers/wazuh b/ct/headers/wazuh new file mode 100644 index 000000000..e72c98aa8 --- /dev/null +++ b/ct/headers/wazuh @@ -0,0 +1,6 @@ + _ __ __ +| | / /___ _____ __ __/ /_ +| | /| / / __ `/_ / / / / / __ \ +| |/ |/ / /_/ / / /_/ /_/ / / / / +|__/|__/\__,_/ /___/\__,_/_/ /_/ + From 396922b9fd4efa3c58064dfc90b12a401d2c9970 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:43:58 +0100 Subject: [PATCH 222/258] Update CHANGELOG.md (#3383) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cba56364a..cd5a07f99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸ†• New Scripts - - yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364)) + - wazuh [@push-app-to-main[bot]](https://github.com/push-app-to-main[bot]) ([#3381](https://github.com/community-scripts/ProxmoxVE/pull/3381)) +- yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364)) - Extension/New Script: Redis Alpine Installation [@MickLesk](https://github.com/MickLesk) ([#3367](https://github.com/community-scripts/ProxmoxVE/pull/3367)) ### πŸš€ Updated Scripts From 7d0f60c8d14889f715b2ccb6f2aa64870ae64b1e Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:27:18 +0100 Subject: [PATCH 223/258] Small issues fixed (#3386) --- ct/wazuh.sh | 2 +- frontend/public/json/wazuh.json | 6 +++--- install/wazuh-install.sh | 11 +---------- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/ct/wazuh.sh b/ct/wazuh.sh index a5c6df8c0..f139028a9 100644 --- a/ct/wazuh.sh +++ b/ct/wazuh.sh @@ -23,7 +23,7 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -d /var ]]; then + if [[ ! -f /lib/systemd/system/wazuh-manager.service ]]; then msg_error "No ${APP} Installation Found!" exit fi diff --git a/frontend/public/json/wazuh.json b/frontend/public/json/wazuh.json index 9fab4c049..26eda6951 100644 --- a/frontend/public/json/wazuh.json +++ b/frontend/public/json/wazuh.json @@ -2,7 +2,7 @@ "name": "Wazuh", "slug": "wazuh", "categories": [ - 1 + 9 ], "date_created": "2025-03-24", "type": "ct", @@ -11,7 +11,7 @@ "interface_port": 443, "documentation": "https://documentation.wazuh.com/", "website": "https://wazuh.com/", - "logo": "https://avatars.githubusercontent.com/u/13752566?s=200&v=4", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/wazuh.svg", "description": "Wazuh is an open-source security monitoring solution that provides endpoint protection, network monitoring, and log analysis capabilities.", "install_methods": [ { @@ -20,7 +20,7 @@ "resources": { "cpu": 4, "ram": 4096, - "hdd": 10, + "hdd": 18, "os": "debian", "version": "12" } diff --git a/install/wazuh-install.sh b/install/wazuh-install.sh index 8b3cc053e..ff447a6ac 100644 --- a/install/wazuh-install.sh +++ b/install/wazuh-install.sh @@ -13,22 +13,13 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - sudo \ - mc \ - curl -msg_ok "Installed Dependencies" - -# Fetching the latest Wazuh version msg_info "Fetching Latest Wazuh Version" RELEASE=$(curl -s https://api.github.com/repos/wazuh/wazuh/releases/latest | grep '"tag_name"' | awk -F '"' '{print substr($4, 2, length($2)-4)}') msg_ok "Latest Wazuh Version: $RELEASE" msg_info "Setup Wazuh" -curl -fsSL https://packages.wazuh.com/$RELEASE/wazuh-install.sh +curl -fsSL https://packages.wazuh.com/$RELEASE/wazuh-install.sh -o wazuh-install.sh chmod +x wazuh-install.sh - if [ "$STD" = "silent" ]; then bash wazuh-install.sh -a >>~/wazuh-install.output else From b1f51e2d34e3cd866a0c76569e379f11408ac867 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:28:39 +0100 Subject: [PATCH 224/258] Fix Workflow (#3387) --- .github/workflows/changelog-pr.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml index 9041e2e8b..96982070c 100644 --- a/.github/workflows/changelog-pr.yml +++ b/.github/workflows/changelog-pr.yml @@ -107,36 +107,38 @@ jobs: for (const pr of filteredPRs) { const prLabels = pr.labels.map(label => label.name.toLowerCase()); - - let prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; - - if (pr.user.login.includes("push-app-to-main[bot]")) { + const scriptName = pr.title; try { const { data: relatedIssues } = await github.rest.issues.listForRepo({ owner: context.repo.owner, repo: "ProxmoxVED", state: "all", - labels: ["Started Migration To ProxmoxVE"], - per_page: 5 + labels: ["Started Migration To ProxmoxVE"] }); + const matchingIssue = relatedIssues.find(issue => issue.title.toLowerCase().includes(scriptName.toLowerCase()) ); + if (matchingIssue) { const issueAuthor = matchingIssue.user.login; const issueAuthorUrl = `https://github.com/${issueAuthor}`; prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`; } + else { + prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; + } } catch (error) { console.error(`Error fetching related issues: ${error}`); prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`; } + }else{ + prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`; } - if (prLabels.includes("new script")) { const newScriptCategory = categorizedPRs.find(category => category.title === "New Scripts" || category.labels.includes("new script")); @@ -174,7 +176,7 @@ jobs: } return await main(); - + - name: Update CHANGELOG.md uses: actions/github-script@v7 with: From fc68c0fe3fc39de135290467688fe4bc1a5977b8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:36:32 +0100 Subject: [PATCH 225/258] Update CHANGELOG.md (#3385) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5a07f99..2b35e5c18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸ†• New Scripts - - wazuh [@push-app-to-main[bot]](https://github.com/push-app-to-main[bot]) ([#3381](https://github.com/community-scripts/ProxmoxVE/pull/3381)) + - wazuh [@omiinaya](https://github.com/omiinaya) ([#3381](https://github.com/community-scripts/ProxmoxVE/pull/3381)) - yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364)) - Extension/New Script: Redis Alpine Installation [@MickLesk](https://github.com/MickLesk) ([#3367](https://github.com/community-scripts/ProxmoxVE/pull/3367)) From 24fbced03068227babc2feca360258875d1a1597 Mon Sep 17 00:00:00 2001 From: Bram Suurd <78373894+BramSuurdje@users.noreply.github.com> Date: Mon, 24 Mar 2025 08:08:31 -0700 Subject: [PATCH 226/258] Update siteConfig.tsx (#3389) --- frontend/src/config/siteConfig.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/config/siteConfig.tsx b/frontend/src/config/siteConfig.tsx index 8103e2147..fabc0ed20 100644 --- a/frontend/src/config/siteConfig.tsx +++ b/frontend/src/config/siteConfig.tsx @@ -46,7 +46,7 @@ export const mostPopularScripts = ["post-pve-install", "docker", "homeassistant" export const analytics = { url: "analytics.proxmoxve-scripts.com", - token: "b60d3032-1a11-4244-a100-81d26c5c49a7", + token: "aefee1b9-2a12-4ac2-9d82-a63113edc62e", }; export const AlertColors = { From 990e89e1b2cd1309d3bb2a81f2d8dfe3064d9594 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 24 Mar 2025 16:22:39 +0100 Subject: [PATCH 227/258] Update ScriptItem.tsx (#3388) --- frontend/src/app/scripts/_components/ScriptItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/scripts/_components/ScriptItem.tsx b/frontend/src/app/scripts/_components/ScriptItem.tsx index 8d3a50039..a5f47b826 100644 --- a/frontend/src/app/scripts/_components/ScriptItem.tsx +++ b/frontend/src/app/scripts/_components/ScriptItem.tsx @@ -102,7 +102,7 @@ function ScriptItem({ )?.version || "No Version information found" }

-

Latest changes:

+

Latest Version changes(Pulled from newreleases.io):

{(() => { const matchedVersion = versions.find((v) => From 6af2aed11897a5d01688ad7cf1e335d6ad8be86b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 16:27:32 +0100 Subject: [PATCH 228/258] Update CHANGELOG.md (#3390) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b35e5c18..4f12d9926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,14 @@ All LXC instances created using this repository come pre-installed with Midnight - Refactor Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3371](https://github.com/community-scripts/ProxmoxVE/pull/3371)) +### 🌐 Website + + - Update siteConfig.tsx to use new analytics code [@BramSuurdje](https://github.com/BramSuurdje) ([#3389](https://github.com/community-scripts/ProxmoxVE/pull/3389)) + + - #### 🐞 Bug Fixes + + - Better Text for Version Date [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3388](https://github.com/community-scripts/ProxmoxVE/pull/3388)) + ## 2025-03-23 ### πŸš€ Updated Scripts From 694f063f0ce5cd2f1a2e51628367936272793686 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:34:25 +0100 Subject: [PATCH 229/258] [core] extend hardware transcoding for fileflows #3392 (#3396) --- misc/build.func | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/build.func b/misc/build.func index 64309671f..1f977fbb9 100644 --- a/misc/build.func +++ b/misc/build.func @@ -1135,7 +1135,7 @@ EOF fi if [ "$CT_TYPE" == "0" ]; then - if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then + if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" || "$APP" == "FileFlows" ]]; then cat <>$LXC_CONFIG # VAAPI hardware transcoding lxc.cgroup2.devices.allow: c 226:0 rwm @@ -1147,7 +1147,7 @@ lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,creat EOF fi else - if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then + if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" || "$APP" == "FileFlows" ]]; then if [[ -e "/dev/dri/renderD128" ]]; then if [[ -e "/dev/dri/card0" ]]; then cat <>$LXC_CONFIG From 62dc2bdecc1ff4ee2192e6dbce815dc6855d5e37 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:34:52 +0100 Subject: [PATCH 230/258] Extend HOME Env for Kubo (#3397) --- install/kubo-install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install/kubo-install.sh b/install/kubo-install.sh index 66961d3a3..c7471927a 100644 --- a/install/kubo-install.sh +++ b/install/kubo-install.sh @@ -43,6 +43,7 @@ After=syslog.target network.target Type=simple ExecStart=/usr/local/bin/ipfs daemon Restart=on-failure +Environment=HOME=/root [Install] WantedBy=multi-user.target EOF From ca55795473b3fe44a695f10169ba2242a45fa53d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:43:45 +0100 Subject: [PATCH 231/258] Update CHANGELOG.md (#3398) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f12d9926..d27a2ff4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,10 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts + - #### 🐞 Bug Fixes + + - Extend HOME Env for Kubo [@MickLesk](https://github.com/MickLesk) ([#3397](https://github.com/community-scripts/ProxmoxVE/pull/3397)) + - #### ✨ New Features - [core] Rebase Scripts (formatting, highlighting & remove old deps) [@MickLesk](https://github.com/MickLesk) ([#3378](https://github.com/community-scripts/ProxmoxVE/pull/3378)) @@ -38,6 +42,10 @@ All LXC instances created using this repository come pre-installed with Midnight - [core] install core deps (debian / ubuntu) [@MickLesk](https://github.com/MickLesk) ([#3366](https://github.com/community-scripts/ProxmoxVE/pull/3366)) + - #### πŸ’Ύ Core + + - [core] extend hardware transcoding for fileflows #3392 [@MickLesk](https://github.com/MickLesk) ([#3396](https://github.com/community-scripts/ProxmoxVE/pull/3396)) + - #### πŸ“‚ Github - Refactor Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3371](https://github.com/community-scripts/ProxmoxVE/pull/3371)) From e19a2e90d3a76dbb867a4365809ec8951a0bc837 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:05:19 +0100 Subject: [PATCH 232/258] fileflows (#3392) * 'Add new script' * increase RAM --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com> --- ct/fileflows.sh | 73 +++++++++++++++++++++++++++++ frontend/public/json/fileflows.json | 39 +++++++++++++++ install/fileflows-install.sh | 72 ++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 ct/fileflows.sh create mode 100644 frontend/public/json/fileflows.json create mode 100644 install/fileflows-install.sh diff --git a/ct/fileflows.sh b/ct/fileflows.sh new file mode 100644 index 000000000..7fb9f7511 --- /dev/null +++ b/ct/fileflows.sh @@ -0,0 +1,73 @@ +#!/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: kkroboth +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://fileflows.com/ + +APP="FileFlows" +var_tags="media;automation" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/fileflows ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + update_available=$(curl -s -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable) + if [[ "${update_available}" == "true" ]]; then + msg_info "Stopping $APP" + systemctl stop fileflows + msg_ok "Stopped $APP" + + msg_info "Creating Backup" + backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" + tar -czf $backup_filename -C /opt/fileflows Data + msg_ok "Backup Created" + + msg_info "Updating $APP to latest version" + temp_file=$(mktemp) + curl -fsSL https://fileflows.com/downloads/zip -o $temp_file + unzip -oq -d /opt/fileflows $temp_file + msg_ok "Updated $APP to latest version" + + msg_info "Starting $APP" + systemctl start fileflows + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $temp_file + rm -rf $backup_filename + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + else + msg_ok "No update required. ${APP} is already at latest version" + 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}:19200${CL}" diff --git a/frontend/public/json/fileflows.json b/frontend/public/json/fileflows.json new file mode 100644 index 000000000..96b4c2a12 --- /dev/null +++ b/frontend/public/json/fileflows.json @@ -0,0 +1,39 @@ +{ + "name": "FileFlows", + "slug": "fileflows", + "categories": [ + 13 + ], + "date_created": "2025-03-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 19200, + "documentation": "https://fileflows.com/docs", + "website": "https://fileflows.com/", + "logo": "https://raw.githubusercontent.com/revenz/FileFlows/refs/heads/develop/icon.png", + "description": "FileFlows is a powerful, open-source tool for automating media file processing workflows, including encoding, decoding, and media management. It offers an intuitive GUI and extensive plugin support, making it ideal for tasks like video transcoding, organizing, and managing large media libraries.", + "install_methods": [ + { + "type": "default", + "script": "ct/fileflows.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With Privileged/Unprivileged Hardware Acceleration Support", + "type": "info" + } + ] +} diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh new file mode 100644 index 000000000..72ce0f38f --- /dev/null +++ b/install/fileflows-install.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kkroboth +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://fileflows.com/ + +# 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 \ + ffmpeg +msg_ok "Installed Dependencies" + +read -r -p "Do you need the intel-media-va-driver-non-free driver for HW encoding (Debian 12 only)? " prompt +if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then + msg_info "Installing Intel Hardware Acceleration (non-free)" + cat </etc/apt/sources.list.d/non-free.list + +deb http://deb.debian.org/debian bookworm non-free non-free-firmware +deb-src http://deb.debian.org/debian bookworm non-free non-free-firmware + +deb http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware +deb-src http://deb.debian.org/debian-security bookworm-security non-free non-free-firmware + +deb http://deb.debian.org/debian bookworm-updates non-free non-free-firmware +deb-src http://deb.debian.org/debian bookworm-updates non-free non-free-firmware +EOF + $STD apt-get update + $STD apt-get -y install {intel-media-va-driver-non-free,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools} +else + msg_info "Installing Intel Hardware Acceleration" + $STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools} +fi +msg_ok "Installed and Set Up Intel Hardware Acceleration" + +msg_info "Installing ASP.NET Core Runtime" +curl -fsSL https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -o packages-microsoft-prod.deb +$STD dpkg -i packages-microsoft-prod.deb +rm -rf packages-microsoft-prod.deb +$STD apt-get update +$STD apt-get install -y aspnetcore-runtime-8.0 +msg_ok "Installed ASP.NET Core Runtime" + +msg_info "Setup ${APPLICATION}" +$STD ln -svf /usr/bin/ffmpeg /usr/local/bin/ffmpeg +$STD ln -svf /usr/bin/ffprobe /usr/local/bin/ffprobe +temp_file=$(mktemp) +curl -fsSL https://fileflows.com/downloads/zip -o $temp_file +unzip -q -d /opt/fileflows $temp_file +(cd /opt/fileflows/Server && dotnet FileFlows.Server.dll --systemd install --root true) +systemctl enable -q --now fileflows.service +msg_ok "Setup ${APPLICATION}" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f $temp_file +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" From 59bb9e334ee3e3d8272cd201db4ec62de45f0e4a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:15:26 +0100 Subject: [PATCH 233/258] Update .app files (#3402) Co-authored-by: GitHub Actions --- ct/headers/fileflows | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/fileflows diff --git a/ct/headers/fileflows b/ct/headers/fileflows new file mode 100644 index 000000000..2f25cf3e7 --- /dev/null +++ b/ct/headers/fileflows @@ -0,0 +1,6 @@ + _______ __ ________ + / ____(_) /__ / ____/ /___ _ _______ + / /_ / / / _ \/ /_ / / __ \ | /| / / ___/ + / __/ / / / __/ __/ / / /_/ / |/ |/ (__ ) +/_/ /_/_/\___/_/ /_/\____/|__/|__/____/ + From 76bbb72392f0a9a75e5ec8c82a6eefe0bd5b394d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:15:44 +0100 Subject: [PATCH 234/258] Update CHANGELOG.md (#3403) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d27a2ff4e..0c0b10283 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸ†• New Scripts - - wazuh [@omiinaya](https://github.com/omiinaya) ([#3381](https://github.com/community-scripts/ProxmoxVE/pull/3381)) + - fileflows [@kkroboth](https://github.com/kkroboth) ([#3392](https://github.com/community-scripts/ProxmoxVE/pull/3392)) +- wazuh [@omiinaya](https://github.com/omiinaya) ([#3381](https://github.com/community-scripts/ProxmoxVE/pull/3381)) - yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364)) - Extension/New Script: Redis Alpine Installation [@MickLesk](https://github.com/MickLesk) ([#3367](https://github.com/community-scripts/ProxmoxVE/pull/3367)) From 4f723800ec306876521fcbf6f99707db91a9094b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:15:58 +0100 Subject: [PATCH 235/258] Update date in json (#3401) Co-authored-by: GitHub Actions --- frontend/public/json/fileflows.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/fileflows.json b/frontend/public/json/fileflows.json index 96b4c2a12..70aa2753e 100644 --- a/frontend/public/json/fileflows.json +++ b/frontend/public/json/fileflows.json @@ -4,7 +4,7 @@ "categories": [ 13 ], - "date_created": "2025-03-07", + "date_created": "2025-03-24", "type": "ct", "updateable": true, "privileged": false, From d621ecb124912c4d2e0ac39fd9a2f5942fad29ed Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:18:06 +0100 Subject: [PATCH 236/258] Update CHANGELOG.md (#3404) Co-authored-by: github-actions[bot] From 67c391e3ed70cbecac90a0346b3650d8b8c66f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 24 Mar 2025 23:29:53 +0100 Subject: [PATCH 237/258] qBittorrent: Switch to static builds for faster updating/upgrading (#3405) * qBittorrent update to v5.0.4 * fixes --- ct/qbittorrent.sh | 40 ++++++++++++++++++++++++++++------ install/qbittorrent-install.sh | 25 ++++++++++++++------- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/ct/qbittorrent.sh b/ct/qbittorrent.sh index 5b4fa0d48..7d2bbbccf 100644 --- a/ct/qbittorrent.sh +++ b/ct/qbittorrent.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) -# Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: SlaviΕ‘a AreΕΎina (tremor021) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.qbittorrent.org/ @@ -27,10 +27,36 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating ${APP} LXC" - $STD apt-get update - $STD apt-get -y upgrade - msg_ok "Updated ${APP} LXC" + if [[ ! -f /opt/${APP}_version.txt ]]; then + touch /opt/${APP}_version.txt + mkdir -p $HOME/.config/qBittorrent/ + mkdir -p /opt/qbittorrent/ + mv /.config/qBittorrent $HOME/.config/ + $STD apt-get remove --purge -y qbittorrent-nox + sed -i 's@ExecStart=/usr/bin/qbittorrent-nox@ExecStart=/opt/qbittorrent/qbittorrent-nox@g' /etc/systemd/system/qbittorrent-nox.service + systemctl daemon-reload + fi + FULLRELEASE=$(curl -s https://api.github.com/repos/userdocs/qbittorrent-nox-static/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + RELEASE=$(echo $FULLRELEASE | cut -c 9-13) + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Service" + systemctl stop qbittorrent-nox + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + rm -f /opt/qbittorrent/qbittorrent-nox + curl -fsSL "https://github.com/userdocs/qbittorrent-nox-static/releases/download/${FULLRELEASE}/x86_64-qbittorrent-nox" -o /opt/qbittorrent/qbittorrent-nox + chmod +x /opt/qbittorrent/qbittorrent-nox + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + systemctl start qbittorrent-nox + msg_ok "Started Service" + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" + fi exit } @@ -41,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}:8090${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}" diff --git a/install/qbittorrent-install.sh b/install/qbittorrent-install.sh index dcc1857f1..d4d5abf25 100644 --- a/install/qbittorrent-install.sh +++ b/install/qbittorrent-install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: SlaviΕ‘a AreΕΎina (tremor021) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://www.qbittorrent.org/ @@ -13,10 +13,14 @@ setting_up_container network_check update_os -msg_info "Installing qbittorrent-nox" -$STD apt-get install -y qbittorrent-nox -mkdir -p /.config/qBittorrent/ -cat </.config/qBittorrent/qBittorrent.conf +msg_info "Setup qBittorrent-nox" +FULLRELEASE=$(curl -s https://api.github.com/repos/userdocs/qbittorrent-nox-static/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') +RELEASE=$(echo $FULLRELEASE | cut -c 9-13) +mkdir -p /opt/qbittorrent +curl -fsSL "https://github.com/userdocs/qbittorrent-nox-static/releases/download/${FULLRELEASE}/x86_64-qbittorrent-nox" -o /opt/qbittorrent/qbittorrent-nox +chmod +x /opt/qbittorrent/qbittorrent-nox +mkdir -p $HOME/.config/qBittorrent/ +cat <$HOME/.config/qBittorrent/qBittorrent.conf [LegalNotice] Accepted=true @@ -26,16 +30,21 @@ WebUI\Port=8090 WebUI\UseUPnP=false WebUI\Username=admin EOF -msg_ok "qbittorrent-nox" +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Setup qBittorrent-nox" msg_info "Creating Service" cat </etc/systemd/system/qbittorrent-nox.service [Unit] Description=qBittorrent client After=network.target + [Service] -ExecStart=/usr/bin/qbittorrent-nox +Type=simple +User=root +ExecStart=/opt/qbittorrent/qbittorrent-nox Restart=always + [Install] WantedBy=multi-user.target EOF From 8f862060d569826705d9de6762eafc2f5e6307b5 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 23:42:52 +0100 Subject: [PATCH 238/258] Update CHANGELOG.md (#3407) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c0b10283..528528cb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ All LXC instances created using this repository come pre-installed with Midnight - #### πŸ”§ Refactor + - qBittorrent: Switch to static builds for faster updating/upgrading [@tremor021](https://github.com/tremor021) ([#3405](https://github.com/community-scripts/ProxmoxVE/pull/3405)) - Refactor: ErsatzTV Script [@MickLesk](https://github.com/MickLesk) ([#3365](https://github.com/community-scripts/ProxmoxVE/pull/3365)) ### 🧰 Maintenance From 01bba3b325644b99c814aa13ad5ca0d8b4bedfe1 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 06:42:02 +0100 Subject: [PATCH 239/258] Update versions.json (#3409) --- frontend/public/json/versions.json | 146 ++++++++++++++--------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 8cd0116fc..a9addfed3 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,24 +1,89 @@ [ + { + "name": "caddyserver/caddy", + "version": "v2.9.1", + "date": "2025-01-08T15:22:53Z" + }, + { + "name": "influxdata/influxdb", + "version": "v3.0.0-0.beta.2", + "date": "2025-03-24T21:12:19Z" + }, + { + "name": "runtipi/runtipi", + "version": "nightly", + "date": "2025-03-24T21:04:06Z" + }, + { + "name": "ZoeyVid/NPMplus", + "version": "2025-03-24-r2", + "date": "2025-03-24T20:52:35Z" + }, + { + "name": "HabitRPG/habitica", + "version": "v5.35.0", + "date": "2025-03-24T20:51:10Z" + }, + { + "name": "go-gitea/gitea", + "version": "v1.23.6", + "date": "2025-03-24T20:38:45Z" + }, { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-24T10:36:10Z" + "date": "2025-03-24T20:28:03Z" + }, + { + "name": "docmost/docmost", + "version": "v0.9.0", + "date": "2025-03-24T18:25:37Z" + }, + { + "name": "Radarr/Radarr", + "version": "v5.21.1.9799", + "date": "2025-03-24T15:52:12Z" + }, + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.6", + "date": "2025-03-18T13:05:01Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.84.0", + "date": "2025-03-17T13:58:36Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "v1.114.0", + "date": "2025-03-24T13:27:36Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.2.0-beta.2", + "date": "2025-03-24T12:20:51Z" + }, + { + "name": "wavelog/wavelog", + "version": "2.0.2", + "date": "2025-03-24T12:02:08Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.2.0p41-rc1", + "date": "2025-03-24T11:45:43Z" }, { "name": "semaphoreui/semaphore", - "version": "v2.13.1", - "date": "2025-03-24T09:42:32Z" + "version": "v2.13.2", + "date": "2025-03-24T11:18:10Z" }, { "name": "zwave-js/zwave-js-ui", "version": "v10.1.1", "date": "2025-03-24T08:34:47Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0b2-rc1", - "date": "2025-03-24T07:20:45Z" - }, { "name": "cockpit-project/cockpit", "version": "336", @@ -59,11 +124,6 @@ "version": "v1.17.0", "date": "2025-03-24T00:46:32Z" }, - { - "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" - }, { "name": "msgbyte/tianji", "version": "v1.19.2", @@ -99,11 +159,6 @@ "version": "v10.0.3", "date": "2025-03-23T08:58:24Z" }, - { - "name": "Radarr/Radarr", - "version": "v5.20.2.9777", - "date": "2025-03-18T12:11:37Z" - }, { "name": "Prowlarr/Prowlarr", "version": "v1.32.2.4987", @@ -179,16 +234,6 @@ "version": "v1.12.0", "date": "2025-03-21T19:14:59Z" }, - { - "name": "influxdata/influxdb", - "version": "v1.12.0rc0", - "date": "2025-03-21T17:24:38Z" - }, - { - "name": "ZoeyVid/NPMplus", - "version": "2025-03-21-r1", - "date": "2025-03-21T14:54:00Z" - }, { "name": "photoprism/photoprism", "version": "250321-57590c48b", @@ -239,11 +284,6 @@ "version": "v2.48.0", "date": "2025-03-20T16:57:43Z" }, - { - "name": "HabitRPG/habitica", - "version": "v5.34.4", - "date": "2025-03-20T16:54:45Z" - }, { "name": "neo4j/neo4j", "version": "4.4.42", @@ -334,21 +374,11 @@ "version": "1.10.3", "date": "2024-11-05T09:20:50Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.84.0", - "date": "2025-03-17T13:58:36Z" - }, { "name": "zabbix/zabbix", "version": "7.2.5rc1", "date": "2025-03-18T14:10:32Z" }, - { - "name": "crowdsecurity/crowdsec", - "version": "v1.6.6", - "date": "2025-03-18T13:05:01Z" - }, { "name": "apache/couchdb", "version": "3.4.3.post1", @@ -389,11 +419,6 @@ "version": "v0.92.4", "date": "2025-03-17T16:00:19Z" }, - { - "name": "Graylog2/graylog2-server", - "version": "6.2.0-beta.1", - "date": "2025-03-17T13:00:39Z" - }, { "name": "home-assistant/operating-system", "version": "15.0", @@ -434,11 +459,6 @@ "version": "v3.5.0", "date": "2025-03-16T06:05:55Z" }, - { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.17.0-victorialogs", - "date": "2025-03-16T00:22:43Z" - }, { "name": "pelican-dev/wings", "version": "v1.0.0-beta10", @@ -559,11 +579,6 @@ "version": "v1.9.9", "date": "2025-03-10T03:22:11Z" }, - { - "name": "caddyserver/caddy", - "version": "v2.9.1", - "date": "2025-01-08T15:22:53Z" - }, { "name": "awawa-dev/HyperHDR", "version": "v21.0.0.0", @@ -639,11 +654,6 @@ "version": "tc_v0.6.4", "date": "2025-03-05T15:43:40Z" }, - { - "name": "go-gitea/gitea", - "version": "v1.23.5", - "date": "2025-03-05T00:10:15Z" - }, { "name": "apache/tomcat", "version": "10.1.39", @@ -699,11 +709,6 @@ "version": "v1.5.7", "date": "2025-02-27T20:04:08Z" }, - { - "name": "docmost/docmost", - "version": "v0.8.4", - "date": "2025-02-27T16:18:45Z" - }, { "name": "cloudflare/cloudflared", "version": "2025.2.1", @@ -784,11 +789,6 @@ "version": "v0.18.3", "date": "2025-02-21T20:51:12Z" }, - { - "name": "wavelog/wavelog", - "version": "2.0.1", - "date": "2025-02-21T17:55:59Z" - }, { "name": "grafana/grafana", "version": "v11.5.2", From 7886795e81083e5494dc28990572a0813b1909b5 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:29:42 +0100 Subject: [PATCH 240/258] Update versions.json (#3411) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 110 ++++++++++++++--------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index a9addfed3..49e5b7958 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,49 @@ [ + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.6", + "date": "2025-03-18T13:05:01Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-25T10:34:31Z" + }, + { + "name": "icereed/paperless-gpt", + "version": "v0.14.1", + "date": "2025-03-25T10:09:14Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.84.0", + "date": "2025-03-17T13:58:36Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0b2-rc2", + "date": "2025-03-25T08:29:23Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "pmm-6401-v1.114.0", + "date": "2025-03-25T07:58:34Z" + }, + { + "name": "zitadel/zitadel", + "version": "v2.70.6", + "date": "2025-03-25T07:11:32Z" + }, + { + "name": "aceberg/WatchYourLAN", + "version": "2.1.0", + "date": "2025-03-25T06:45:18Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1691", + "date": "2025-03-25T06:11:16Z" + }, { "name": "caddyserver/caddy", "version": "v2.9.1", @@ -11,8 +56,8 @@ }, { "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-03-24T21:04:06Z" + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" }, { "name": "ZoeyVid/NPMplus", @@ -30,9 +75,9 @@ "date": "2025-03-24T20:38:45Z" }, { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-24T20:28:03Z" + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "docmost/docmost", @@ -44,21 +89,6 @@ "version": "v5.21.1.9799", "date": "2025-03-24T15:52:12Z" }, - { - "name": "crowdsecurity/crowdsec", - "version": "v1.6.6", - "date": "2025-03-18T13:05:01Z" - }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.84.0", - "date": "2025-03-17T13:58:36Z" - }, - { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.114.0", - "date": "2025-03-24T13:27:36Z" - }, { "name": "Graylog2/graylog2-server", "version": "6.2.0-beta.2", @@ -69,11 +99,6 @@ "version": "2.0.2", "date": "2025-03-24T12:02:08Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.2.0p41-rc1", - "date": "2025-03-24T11:45:43Z" - }, { "name": "semaphoreui/semaphore", "version": "v2.13.2", @@ -89,21 +114,11 @@ "version": "336", "date": "2025-03-24T07:16:02Z" }, - { - "name": "icereed/paperless-gpt", - "version": "v0.14.0", - "date": "2025-03-24T07:03:24Z" - }, { "name": "nzbgetcom/nzbget", "version": "v24.8", "date": "2025-03-18T07:33:51Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1685", - "date": "2025-03-24T05:54:06Z" - }, { "name": "pocketbase/pocketbase", "version": "v0.26.3", @@ -134,11 +149,6 @@ "version": "0.49.7", "date": "2025-03-23T15:51:11Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "Lidarr/Lidarr", "version": "v2.10.3.4602", @@ -234,6 +244,11 @@ "version": "v1.12.0", "date": "2025-03-21T19:14:59Z" }, + { + "name": "fallenbagel/jellyseerr", + "version": "preview-OIDC", + "date": "2025-03-21T14:14:45Z" + }, { "name": "photoprism/photoprism", "version": "250321-57590c48b", @@ -349,11 +364,6 @@ "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "zitadel/zitadel", - "version": "v2.66.14", - "date": "2025-03-18T16:05:48Z" - }, { "name": "prometheus/prometheus", "version": "v2.53.4", @@ -429,11 +439,6 @@ "version": "2.303", "date": "2025-03-17T04:54:50Z" }, - { - "name": "fallenbagel/jellyseerr", - "version": "v2.5.1", - "date": "2025-03-17T03:18:32Z" - }, { "name": "glanceapp/glance", "version": "v0.7.7", @@ -1084,11 +1089,6 @@ "version": "v2024.10.22-7ca5933", "date": "2024-10-22T09:58:03Z" }, - { - "name": "aceberg/WatchYourLAN", - "version": "2.0.4", - "date": "2024-10-20T18:57:37Z" - }, { "name": "NLnetLabs/unbound", "version": "release-1.22.0", From cac4294d270247d546c9f2e0a5d1a5fa34040998 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 25 Mar 2025 15:37:18 +0100 Subject: [PATCH 241/258] Update Discord URL (#3412) --- .github/ISSUE_TEMPLATE/config.yml | 2 +- README.md | 4 ++-- SECURITY.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c38d4d6e9..3715f849f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,5 +7,5 @@ contact_links: url: https://github.com/community-scripts/ProxmoxVE/discussions/new?category=request-script about: For feature/script requests, please use the Discussions section. - name: πŸ’» Discord - url: https://discord.gg/UHrpNWGwkH + url: https://discord.gg/jsYVk5JBxq about: Join our Discord server to chat with other users in the Proxmox Helper Scripts community. diff --git a/README.md b/README.md index b0b3a7cb0..a57205c94 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Website - + Discord @@ -82,7 +82,7 @@ We appreciate any contributions to the projectβ€”whether it's bug reports, featu Join our community for support: -- **Discord**: Join our [Proxmox Helper Scripts Discord server](https://discord.gg/UHrpNWGwkH) for real-time support. +- **Discord**: Join our [Proxmox Helper Scripts Discord server](https://discord.gg/jsYVk5JBxq) for real-time support. - **GitHub Discussions**: [Ask questions or report issues](https://github.com/community-scripts/ProxmoxVE/discussions). ## 🀝 Report a Bug or Feature Request diff --git a/SECURITY.md b/SECURITY.md index c8530d506..cf5e73282 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,7 +13,7 @@ This project currently supports the following versions of Proxmox VE: ## Reporting a Vulnerability -Security vulnerabilities shouldn’t be reported publicly to prevent potential exploitation. Instead, please report any vulnerabilities privately by reaching out directly to us. You can either join our [Discord server](https://discord.gg/UHrpNWGwkH) and send a direct message to a maintainer or contact us via email at contact@community-scripts.org. Be sure to include a detailed description of the vulnerability and the steps to reproduce it. Thank you for helping us keep our project secure! +Security vulnerabilities shouldn’t be reported publicly to prevent potential exploitation. Instead, please report any vulnerabilities privately by reaching out directly to us. You can either join our [Discord server](https://discord.gg/jsYVk5JBxq) and send a direct message to a maintainer or contact us via email at contact@community-scripts.org. Be sure to include a detailed description of the vulnerability and the steps to reproduce it. Thank you for helping us keep our project secure! Once a vulnerability has been reported, the project maintainers will review it and acknowledge the report within 7 business days. We will then work to address the vulnerability and provide a fix as soon as possible. Depending on the severity of the issue, a patch may be released immediately or included in the next scheduled update. From 2f5fbf741681465d30b1ee7d7d6de74d9c2e468d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:03:42 +0100 Subject: [PATCH 242/258] Update CHANGELOG.md (#3410) --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 528528cb6..300c071f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-25 + +### 🧰 Maintenance + + - #### πŸ“‚ Github + + - Discord invite link updated [@MickLesk](https://github.com/MickLesk) ([#3412](https://github.com/community-scripts/ProxmoxVE/pull/3412)) + ## 2025-03-24 ### πŸ†• New Scripts From c0d31ccd57bc70ed028158e880caa0e1d8cdfe56 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 07:10:55 +0100 Subject: [PATCH 243/258] Update versions.json (#3416) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 188 ++++++++++++++--------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 49e5b7958..9888f5b2e 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,29 +1,109 @@ [ { - "name": "crowdsecurity/crowdsec", - "version": "v1.6.6", - "date": "2025-03-18T13:05:01Z" + "name": "esphome/esphome", + "version": "2025.3.2", + "date": "2025-03-25T23:06:45Z" + }, + { + "name": "grafana/grafana", + "version": "v11.6.0", + "date": "2025-03-25T22:10:15Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.8", + "date": "2025-03-25T22:00:52Z" + }, + { + "name": "immich-app/immich", + "version": "v1.130.1", + "date": "2025-03-25T20:49:15Z" }, { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-25T10:34:31Z" + "date": "2025-03-25T20:30:03Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.2.5rc2", + "date": "2025-03-25T19:25:22Z" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v0.45.0", + "date": "2025-03-25T18:48:17Z" + }, + { + "name": "ipfs/kubo", + "version": "v0.34.1", + "date": "2025-03-25T18:11:12Z" + }, + { + "name": "aceberg/WatchYourLAN", + "version": "2.1.1", + "date": "2025-03-25T17:21:41Z" + }, + { + "name": "pocket-id/pocket-id", + "version": "v0.44.0", + "date": "2025-03-25T16:09:10Z" + }, + { + "name": "dotnetfactory/fluid-calendar", + "version": "v1.3.0", + "date": "2025-03-25T15:55:02Z" + }, + { + "name": "emqx/emqx", + "version": "v5.8.6", + "date": "2025-03-25T15:22:13Z" + }, + { + "name": "hansmi/prometheus-paperless-exporter", + "version": "v0.0.7", + "date": "2025-03-25T15:11:18Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0b2", + "date": "2025-03-25T14:27:52Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.503", + "date": "2025-03-25T14:01:20Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.1.2", + "date": "2025-03-25T13:56:22Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.19.3", + "date": "2025-03-25T13:50:19Z" + }, + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.8", + "date": "2025-03-25T13:33:10Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.85.1", + "date": "2025-03-25T09:33:57Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.127.0", + "date": "2025-03-25T12:47:44Z" }, { "name": "icereed/paperless-gpt", "version": "v0.14.1", "date": "2025-03-25T10:09:14Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.84.0", - "date": "2025-03-17T13:58:36Z" - }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0b2-rc2", - "date": "2025-03-25T08:29:23Z" - }, { "name": "VictoriaMetrics/VictoriaMetrics", "version": "pmm-6401-v1.114.0", @@ -34,11 +114,6 @@ "version": "v2.70.6", "date": "2025-03-25T07:11:32Z" }, - { - "name": "aceberg/WatchYourLAN", - "version": "2.1.0", - "date": "2025-03-25T06:45:18Z" - }, { "name": "Jackett/Jackett", "version": "v0.22.1691", @@ -104,11 +179,6 @@ "version": "v2.13.2", "date": "2025-03-24T11:18:10Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.1.1", - "date": "2025-03-24T08:34:47Z" - }, { "name": "cockpit-project/cockpit", "version": "336", @@ -139,16 +209,6 @@ "version": "v1.17.0", "date": "2025-03-24T00:46:32Z" }, - { - "name": "msgbyte/tianji", - "version": "v1.19.2", - "date": "2025-03-23T16:33:14Z" - }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.49.7", - "date": "2025-03-23T15:51:11Z" - }, { "name": "Lidarr/Lidarr", "version": "v2.10.3.4602", @@ -184,11 +244,6 @@ "version": "v11.7.6", "date": "2025-03-23T05:08:22Z" }, - { - "name": "esphome/esphome", - "version": "2025.3.1", - "date": "2025-03-23T04:45:21Z" - }, { "name": "usememos/memos", "version": "v0.24.2", @@ -274,26 +329,11 @@ "version": "v0.9.77", "date": "2025-03-21T02:25:42Z" }, - { - "name": "ipfs/kubo", - "version": "v0.34.0", - "date": "2025-03-20T21:51:05Z" - }, - { - "name": "pocket-id/pocket-id", - "version": "v0.43.1", - "date": "2025-03-20T20:38:06Z" - }, { "name": "stonith404/pingvin-share", "version": "v1.10.4", "date": "2025-03-20T18:56:10Z" }, - { - "name": "dotnetfactory/fluid-calendar", - "version": "v1.2.3", - "date": "2025-03-20T17:54:55Z" - }, { "name": "ellite/Wallos", "version": "v2.48.0", @@ -309,16 +349,6 @@ "version": "8.0-rc1", "date": "2025-03-11T18:16:27Z" }, - { - "name": "Stirling-Tools/Stirling-PDF", - "version": "v0.44.3", - "date": "2025-03-20T09:43:56Z" - }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.502", - "date": "2025-03-18T15:02:59Z" - }, { "name": "wazuh/wazuh", "version": "coverity-w11-4.12.0", @@ -374,21 +404,11 @@ "version": "v1.29.3", "date": "2025-03-12T11:56:30Z" }, - { - "name": "element-hq/synapse", - "version": "v1.126.0", - "date": "2025-03-11T16:29:42Z" - }, { "name": "OctoPrint/OctoPrint", "version": "1.10.3", "date": "2024-11-05T09:20:50Z" }, - { - "name": "zabbix/zabbix", - "version": "7.2.5rc1", - "date": "2025-03-18T14:10:32Z" - }, { "name": "apache/couchdb", "version": "3.4.3.post1", @@ -544,11 +564,6 @@ "version": "4.0.1-beta.1", "date": "2024-12-13T00:16:24Z" }, - { - "name": "emqx/emqx", - "version": "e5.9.0-beta.1", - "date": "2025-03-12T09:52:26Z" - }, { "name": "gotson/komga", "version": "1.21.2", @@ -644,11 +659,6 @@ "version": "3.0.0", "date": "2025-03-05T21:41:29Z" }, - { - "name": "immich-app/immich", - "version": "v1.129.0", - "date": "2025-03-05T20:19:18Z" - }, { "name": "snipe/snipe-it", "version": "v8.0.4", @@ -794,11 +804,6 @@ "version": "v0.18.3", "date": "2025-02-21T20:51:12Z" }, - { - "name": "grafana/grafana", - "version": "v11.5.2", - "date": "2025-02-19T00:12:27Z" - }, { "name": "gristlabs/grist-core", "version": "v1.4.2", @@ -939,11 +944,6 @@ "version": "1.1.14", "date": "2025-01-25T12:48:28Z" }, - { - "name": "hansmi/prometheus-paperless-exporter", - "version": "v0.0.6", - "date": "2025-01-22T22:19:33Z" - }, { "name": "crafty-controller/crafty-4", "version": "v4.4.7", From 51f9de27f1d3cee0e8bc61a65303c30cfca7abb9 Mon Sep 17 00:00:00 2001 From: Chris <67816022+vhsdream@users.noreply.github.com> Date: Wed, 26 Mar 2025 03:31:29 -0400 Subject: [PATCH 244/258] fluid-calendar: Fix failed build; simplify backup (#3417) --- ct/fluid-calendar.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/ct/fluid-calendar.sh b/ct/fluid-calendar.sh index 4194a36b5..beb7deae5 100644 --- a/ct/fluid-calendar.sh +++ b/ct/fluid-calendar.sh @@ -35,15 +35,14 @@ function update_script() { systemctl stop fluid-calendar.service msg_ok "Stopped $APP" - msg_info "Creating Backup" - tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" /opt/fluid-calendar - msg_ok "Backup Created" - msg_info "Updating $APP to v${RELEASE}" + cp /opt/fluid-calendar/.env /opt/fluid.env + rm -rf /opt/fluid-calendar tmp_file=$(mktemp) wget -q "https://github.com/dotnetfactory/fluid-calendar/archive/refs/tags/v${RELEASE}.zip" -O $tmp_file unzip -q $tmp_file - cp -rf ${APP}-${RELEASE}/* /opt/fluid-calendar + mv ${APP}-${RELEASE}/ /opt/fluid-calendar + mv /opt/fluid.env /opt/fluid-calendar/.env cd /opt/fluid-calendar export NEXT_TELEMETRY_DISABLED=1 $STD npm install --legacy-peer-deps @@ -58,8 +57,6 @@ function update_script() { msg_info "Cleaning Up" rm -rf $tmp_file - rm -rf "/opt/${APP}_backup_$(date +%F).tar.gz" - rm -rf /tmp/${APP}-${RELEASE} msg_ok "Cleanup Completed" echo "${RELEASE}" >/opt/${APP}_version.txt From 3072f7dd5115ec998be47e3a9eee626dde5d5cff Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 10:11:43 +0100 Subject: [PATCH 245/258] Update CHANGELOG.md (#3418) --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 300c071f9..6c5894e42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-26 + +### πŸš€ Updated Scripts + + - #### 🐞 Bug Fixes + + - fluid-calendar: Fix failed build during updates [@vhsdream](https://github.com/vhsdream) ([#3417](https://github.com/community-scripts/ProxmoxVE/pull/3417)) + ## 2025-03-25 ### 🧰 Maintenance From 333b0c00cce618b351ae9ea9c91ff6895a138d06 Mon Sep 17 00:00:00 2001 From: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com> Date: Wed, 26 Mar 2025 12:43:49 +0100 Subject: [PATCH 246/258] Remove coredeps in CONTRIBUTOR_AND_GUIDES (#3420) * Remove core deps from install deps * Remove core deps fileflows-install.sh --- .github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md | 3 --- .github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh | 7 ++----- install/fileflows-install.sh | 3 --- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md b/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md index d2b65e025..45ddd92fd 100644 --- a/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md +++ b/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md @@ -111,11 +111,8 @@ Example: ```bash $STD apt-get install -y \ - curl \ composer \ git \ - sudo \ - mc \ nginx ``` diff --git a/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh b/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh index 5b3d6833b..ea2f25a56 100644 --- a/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh +++ b/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh @@ -14,12 +14,9 @@ setting_up_container network_check update_os -# Installing Dependencies with the 3 core dependencies (curl;sudo;mc) +# Installing Dependencies msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ [PACKAGE_1] \ [PACKAGE_2] \ [PACKAGE_3] @@ -80,4 +77,4 @@ msg_info "Cleaning up" rm -f ${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" \ No newline at end of file +msg_ok "Cleaned" diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh index 72ce0f38f..4098cc238 100644 --- a/install/fileflows-install.sh +++ b/install/fileflows-install.sh @@ -16,9 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - curl \ - sudo \ - mc \ ffmpeg msg_ok "Installed Dependencies" From 6ba5c9870638c636918340ce6de5b017d967d131 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:32:02 +0100 Subject: [PATCH 247/258] Update CHANGELOG.md (#3421) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c5894e42..0f1c9d674 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ All LXC instances created using this repository come pre-installed with Midnight ### πŸš€ Updated Scripts + - Remove coredeps in CONTRIBUTOR_AND_GUIDES [@bvdberg01](https://github.com/bvdberg01) ([#3420](https://github.com/community-scripts/ProxmoxVE/pull/3420)) + - #### 🐞 Bug Fixes - fluid-calendar: Fix failed build during updates [@vhsdream](https://github.com/vhsdream) ([#3417](https://github.com/community-scripts/ProxmoxVE/pull/3417)) From 6be9d72f70337c67e81748e42e526185ff8fec33 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:32:17 +0100 Subject: [PATCH 248/258] Update versions.json (#3422) --- frontend/public/json/versions.json | 126 ++++++++++++++--------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 9888f5b2e..b2c86c26e 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,54 @@ [ + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-26T10:33:41Z" + }, + { + "name": "evcc-io/evcc", + "version": "0.202.0", + "date": "2025-03-26T10:19:01Z" + }, + { + "name": "jupyter/notebook", + "version": "@jupyter-notebook/ui-components@7.4.0-beta.3", + "date": "2025-03-26T10:07:53Z" + }, + { + "name": "forgejo/forgejo", + "version": "v12.0.0-dev", + "date": "2025-03-26T09:58:55Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.2.0p41", + "date": "2025-03-26T09:55:26Z" + }, + { + "name": "sct/overseerr", + "version": "v1.34.0", + "date": "2025-03-26T08:48:34Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1695", + "date": "2025-03-26T06:01:34Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.26.4", + "date": "2025-03-26T05:16:46Z" + }, + { + "name": "theonedev/onedev", + "version": "v11.8.0", + "date": "2025-03-26T04:41:15Z" + }, + { + "name": "cockpit-project/cockpit", + "version": "336.1", + "date": "2025-03-26T04:10:14Z" + }, { "name": "esphome/esphome", "version": "2025.3.2", @@ -20,9 +70,9 @@ "date": "2025-03-25T20:49:15Z" }, { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-25T20:30:03Z" + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" }, { "name": "zabbix/zabbix", @@ -64,11 +114,6 @@ "version": "v0.0.7", "date": "2025-03-25T15:11:18Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0b2", - "date": "2025-03-25T14:27:52Z" - }, { "name": "jenkinsci/jenkins", "version": "jenkins-2.503", @@ -104,6 +149,11 @@ "version": "v0.14.1", "date": "2025-03-25T10:09:14Z" }, + { + "name": "runtipi/runtipi", + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" + }, { "name": "VictoriaMetrics/VictoriaMetrics", "version": "pmm-6401-v1.114.0", @@ -114,26 +164,21 @@ "version": "v2.70.6", "date": "2025-03-25T07:11:32Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1691", - "date": "2025-03-25T06:11:16Z" - }, { "name": "caddyserver/caddy", "version": "v2.9.1", "date": "2025-01-08T15:22:53Z" }, + { + "name": "fallenbagel/jellyseerr", + "version": "preview-OIDC", + "date": "2025-03-25T00:28:11Z" + }, { "name": "influxdata/influxdb", "version": "v3.0.0-0.beta.2", "date": "2025-03-24T21:12:19Z" }, - { - "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" - }, { "name": "ZoeyVid/NPMplus", "version": "2025-03-24-r2", @@ -149,11 +194,6 @@ "version": "v1.23.6", "date": "2025-03-24T20:38:45Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "docmost/docmost", "version": "v0.9.0", @@ -179,21 +219,11 @@ "version": "v2.13.2", "date": "2025-03-24T11:18:10Z" }, - { - "name": "cockpit-project/cockpit", - "version": "336", - "date": "2025-03-24T07:16:02Z" - }, { "name": "nzbgetcom/nzbget", "version": "v24.8", "date": "2025-03-18T07:33:51Z" }, - { - "name": "pocketbase/pocketbase", - "version": "v0.26.3", - "date": "2025-03-24T04:42:52Z" - }, { "name": "firefly-iii/firefly-iii", "version": "v6.2.10", @@ -224,11 +254,6 @@ "version": "v4.3.1", "date": "2025-03-23T09:02:54Z" }, - { - "name": "forgejo/forgejo", - "version": "v10.0.3", - "date": "2025-03-23T08:58:24Z" - }, { "name": "Prowlarr/Prowlarr", "version": "v1.32.2.4987", @@ -239,11 +264,6 @@ "version": "v1.5.1", "date": "2025-01-01T16:15:52Z" }, - { - "name": "theonedev/onedev", - "version": "v11.7.6", - "date": "2025-03-23T05:08:22Z" - }, { "name": "usememos/memos", "version": "v0.24.2", @@ -299,11 +319,6 @@ "version": "v1.12.0", "date": "2025-03-21T19:14:59Z" }, - { - "name": "fallenbagel/jellyseerr", - "version": "preview-OIDC", - "date": "2025-03-21T14:14:45Z" - }, { "name": "photoprism/photoprism", "version": "250321-57590c48b", @@ -354,16 +369,6 @@ "version": "coverity-w11-4.12.0", "date": "2025-03-14T20:04:02Z" }, - { - "name": "jupyter/notebook", - "version": "@jupyter-notebook/ui-components@7.4.0-beta.2", - "date": "2025-03-20T07:41:24Z" - }, - { - "name": "evcc-io/evcc", - "version": "0.201.1", - "date": "2025-03-20T06:59:18Z" - }, { "name": "rabbitmq/rabbitmq-server", "version": "v4.0.7", @@ -1193,10 +1198,5 @@ "name": "wger-project/wger", "version": "2.2", "date": "2023-12-06T12:08:09Z" - }, - { - "name": "sct/overseerr", - "version": "preview-test-node-18", - "date": "2023-11-06T10:21:37Z" } ] From b9a63edfb0ee68196f92ce92f1d2e1a55c4f8613 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:28:52 +0100 Subject: [PATCH 249/258] Alpine: Gitea (#3424) --- ct/alpine-gitea.sh | 45 +++++++++++++++++++++++++++++++++ frontend/public/json/gitea.json | 13 +++++++++- install/alpine-gitea-install.sh | 40 +++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 ct/alpine-gitea.sh create mode 100644 install/alpine-gitea-install.sh diff --git a/ct/alpine-gitea.sh b/ct/alpine-gitea.sh new file mode 100644 index 000000000..47c402bd8 --- /dev/null +++ b/ct/alpine-gitea.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gitea.io + +APP="Alpine-Gitea" +var_tags="alpine;git" +var_cpu="1" +var_ram="256" +var_disk="1" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + msg_info "Updating Alpine Packages" + apk update + apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating Gitea" + apk upgrade gitea + msg_ok "Updated Gitea" + + msg_info "Restarting Gitea" + rc-service gitea restart + msg_ok "Restarted Gitea" +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/frontend/public/json/gitea.json b/frontend/public/json/gitea.json index 82890c1d7..c27c95936 100644 --- a/frontend/public/json/gitea.json +++ b/frontend/public/json/gitea.json @@ -24,6 +24,17 @@ "os": "debian", "version": "12" } + }, + { + "type": "alpine", + "script": "ct/alpine-gitea.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } } ], "default_credentials": { @@ -31,4 +42,4 @@ "password": null }, "notes": [] -} \ No newline at end of file +} diff --git a/install/alpine-gitea-install.sh b/install/alpine-gitea-install.sh new file mode 100644 index 000000000..6db3c2249 --- /dev/null +++ b/install/alpine-gitea-install.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gitea.io/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apk add \ + newt \ + curl \ + openssh \ + nano \ + mc \ + gpg + +msg_ok "Installed Dependencies" + +msg_info "Installing Gitea" +$STD apk add --no-cache gitea +msg_ok "Installed Gitea" + +msg_info "Enabling Gitea Service" +$STD rc-update add gitea default +msg_ok "Enabled Gitea Service" + +msg_info "Starting Gitea" +$STD service gitea start +msg_ok "Started Gitea" + +motd_ssh +customize From 008af3cbfc763bed4e9846386bae791d493c5550 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:20:40 +0100 Subject: [PATCH 250/258] Update .app files (#3426) Co-authored-by: GitHub Actions --- ct/headers/alpine-gitea | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/alpine-gitea diff --git a/ct/headers/alpine-gitea b/ct/headers/alpine-gitea new file mode 100644 index 000000000..085b375a2 --- /dev/null +++ b/ct/headers/alpine-gitea @@ -0,0 +1,6 @@ + ___ __ _ _______ __ + / | / /___ (_)___ ___ / ____(_) /____ ____ _ + / /| | / / __ \/ / __ \/ _ \______/ / __/ / __/ _ \/ __ `/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / / /_/ __/ /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ \____/_/\__/\___/\__,_/ + /_/ From beeef264b8d3ee7ff3c2ec4dcb02c2e1eebacfdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Wed, 26 Mar 2025 20:47:45 +0100 Subject: [PATCH 251/258] FlowiseAI: Fix dependencies (#3427) * Fix dependencies * Fix missing documentation link --- frontend/public/json/flowiseai.json | 71 +++++++++++++++-------------- install/flowiseai-install.sh | 6 ++- 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/frontend/public/json/flowiseai.json b/frontend/public/json/flowiseai.json index 0c4dd7ab5..0502d32f1 100644 --- a/frontend/public/json/flowiseai.json +++ b/frontend/public/json/flowiseai.json @@ -1,34 +1,39 @@ { - "name": "FlowiseAI", - "slug": "flowiseai", - "categories": [ - 20 - ], - "date_created": "2024-05-02", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 3000, - "documentation": null, - "website": "https://flowiseai.com/", - "logo": "https://flowiseai.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo-color-high.e60de2f8.png&w=256&q=75", - "description": "FlowiseAI is an open source low-code tool for developers to build customized LLM orchestration flow & AI agents", - "install_methods": [ - { - "type": "default", - "script": "ct/flowiseai.sh", - "resources": { - "cpu": 4, - "ram": 4096, - "hdd": 10, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [] -} \ No newline at end of file + "name": "FlowiseAI", + "slug": "flowiseai", + "categories": [ + 20 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.flowiseai.com/", + "website": "https://flowiseai.com/", + "logo": "https://flowiseai.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo-color-high.e60de2f8.png&w=256&q=75", + "description": "FlowiseAI is an open source low-code tool for developers to build customized LLM orchestration flow & AI agents", + "install_methods": [ + { + "type": "default", + "script": "ct/flowiseai.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Application takes long time to install. Please be patient!", + "type": "warning" + } + ] +} diff --git a/install/flowiseai-install.sh b/install/flowiseai-install.sh index 666019fd9..86a0dbd6e 100644 --- a/install/flowiseai-install.sh +++ b/install/flowiseai-install.sh @@ -26,7 +26,11 @@ $STD apt-get install -y nodejs msg_ok "Installed Node.js" msg_info "Installing FlowiseAI (Patience)" -$STD npm install -g flowise +$STD npm install -g flowise \ + @opentelemetry/exporter-trace-otlp-grpc \ + @opentelemetry/exporter-trace-otlp-proto \ + @opentelemetry/sdk-trace-node \ + langchainhub mkdir -p /opt/flowiseai wget -q https://raw.githubusercontent.com/FlowiseAI/Flowise/main/packages/server/.env.example -O /opt/flowiseai/.env msg_ok "Installed FlowiseAI" From a9b7c52b1a6b6b5ef8aa1ee81e690353f1b1ae2c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 21:37:58 +0100 Subject: [PATCH 252/258] Update CHANGELOG.md (#3425) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f1c9d674..31a57be82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,14 +16,24 @@ All LXC instances created using this repository come pre-installed with Midnight ## 2025-03-26 +### πŸ†• New Scripts + + - Alpine: Gitea [@MickLesk](https://github.com/MickLesk) ([#3424](https://github.com/community-scripts/ProxmoxVE/pull/3424)) + ### πŸš€ Updated Scripts - - Remove coredeps in CONTRIBUTOR_AND_GUIDES [@bvdberg01](https://github.com/bvdberg01) ([#3420](https://github.com/community-scripts/ProxmoxVE/pull/3420)) + - FlowiseAI: Fix dependencies [@tremor021](https://github.com/tremor021) ([#3427](https://github.com/community-scripts/ProxmoxVE/pull/3427)) - #### 🐞 Bug Fixes - fluid-calendar: Fix failed build during updates [@vhsdream](https://github.com/vhsdream) ([#3417](https://github.com/community-scripts/ProxmoxVE/pull/3417)) +### 🧰 Maintenance + + - #### πŸ“‚ Github + + - Remove coredeps in CONTRIBUTOR_AND_GUIDES [@bvdberg01](https://github.com/bvdberg01) ([#3420](https://github.com/community-scripts/ProxmoxVE/pull/3420)) + ## 2025-03-25 ### 🧰 Maintenance From dc980951ea034f1b6c913470b1fb4e10e9c7530f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:29:54 +0100 Subject: [PATCH 253/258] Update versions.json (#3432) --- frontend/public/json/versions.json | 132 ++++++++++++++--------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index b2c86c26e..2a3febfc5 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,73 @@ [ + { + "name": "home-assistant/core", + "version": "2025.3.4", + "date": "2025-03-21T20:22:46Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.127.1", + "date": "2025-03-26T21:44:28Z" + }, + { + "name": "duplicati/duplicati", + "version": "v2.1.0.112-2.1.0.112_canary_2025-03-26", + "date": "2025-03-26T21:04:38Z" + }, + { + "name": "ollama/ollama", + "version": "v0.6.3-rc1", + "date": "2025-03-26T20:39:01Z" + }, { "name": "fhem/fhem-mirror", "version": "6.2", - "date": "2025-03-26T10:33:41Z" + "date": "2025-03-26T20:29:58Z" + }, + { + "name": "runtipi/runtipi", + "version": "e2e", + "date": "2025-03-23T22:08:04Z" + }, + { + "name": "glanceapp/glance", + "version": "v0.7.8", + "date": "2025-03-26T19:59:07Z" + }, + { + "name": "tailscale/tailscale", + "version": "v1.82.0", + "date": "2025-03-26T19:50:59Z" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.13.2", + "date": "2025-03-26T19:13:48Z" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w11-4.12.0", + "date": "2025-03-14T20:04:02Z" + }, + { + "name": "immich-app/immich", + "version": "v1.130.2", + "date": "2025-03-26T16:01:25Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.9", + "date": "2025-03-26T15:31:03Z" + }, + { + "name": "prometheus/prometheus", + "version": "v0.303.0-rc.0", + "date": "2025-03-26T12:48:46Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.84.2", + "date": "2025-03-26T14:11:45Z" }, { "name": "evcc-io/evcc", @@ -59,16 +124,6 @@ "version": "v11.6.0", "date": "2025-03-25T22:10:15Z" }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.49.8", - "date": "2025-03-25T22:00:52Z" - }, - { - "name": "immich-app/immich", - "version": "v1.130.1", - "date": "2025-03-25T20:49:15Z" - }, { "name": "keycloak/keycloak", "version": "26.1.4", @@ -134,26 +189,11 @@ "version": "v1.6.8", "date": "2025-03-25T13:33:10Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.85.1", - "date": "2025-03-25T09:33:57Z" - }, - { - "name": "element-hq/synapse", - "version": "v1.127.0", - "date": "2025-03-25T12:47:44Z" - }, { "name": "icereed/paperless-gpt", "version": "v0.14.1", "date": "2025-03-25T10:09:14Z" }, - { - "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" - }, { "name": "VictoriaMetrics/VictoriaMetrics", "version": "pmm-6401-v1.114.0", @@ -214,11 +254,6 @@ "version": "2.0.2", "date": "2025-03-24T12:02:08Z" }, - { - "name": "semaphoreui/semaphore", - "version": "v2.13.2", - "date": "2025-03-24T11:18:10Z" - }, { "name": "nzbgetcom/nzbget", "version": "v24.8", @@ -284,11 +319,6 @@ "version": "v1.10.0-rc.1", "date": "2025-03-22T06:34:33Z" }, - { - "name": "ollama/ollama", - "version": "v0.6.2", - "date": "2025-03-18T03:11:33Z" - }, { "name": "netbox-community/netbox", "version": "v4.2.6", @@ -299,11 +329,6 @@ "version": "4.4.1", "date": "2024-12-20T13:21:31Z" }, - { - "name": "home-assistant/core", - "version": "2025.3.4", - "date": "2025-03-21T20:22:46Z" - }, { "name": "leiweibau/Pi.Alert", "version": "v2025-03-21", @@ -364,11 +389,6 @@ "version": "8.0-rc1", "date": "2025-03-11T18:16:27Z" }, - { - "name": "wazuh/wazuh", - "version": "coverity-w11-4.12.0", - "date": "2025-03-14T20:04:02Z" - }, { "name": "rabbitmq/rabbitmq-server", "version": "v4.0.7", @@ -399,11 +419,6 @@ "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "prometheus/prometheus", - "version": "v2.53.4", - "date": "2025-03-18T15:50:39Z" - }, { "name": "syncthing/syncthing", "version": "v1.29.3", @@ -464,11 +479,6 @@ "version": "2.303", "date": "2025-03-17T04:54:50Z" }, - { - "name": "glanceapp/glance", - "version": "v0.7.7", - "date": "2025-03-17T02:24:06Z" - }, { "name": "gethomepage/homepage", "version": "v1.0.4", @@ -504,11 +514,6 @@ "version": "v1.6.1", "date": "2025-03-15T17:29:17Z" }, - { - "name": "duplicati/duplicati", - "version": "v2.1.0.111-2.1.0.111_canary_2025-03-15", - "date": "2025-03-15T11:06:44Z" - }, { "name": "henrygd/beszel", "version": "v0.10.2", @@ -679,11 +684,6 @@ "version": "10.1.39", "date": "2025-03-04T19:05:18Z" }, - { - "name": "tailscale/tailscale", - "version": "v1.80.3", - "date": "2025-03-04T18:47:25Z" - }, { "name": "pi-hole/pi-hole", "version": "v6.0.5", From 32741150417eb7274703e41ddcf8b9d9845145f0 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:20:57 +0100 Subject: [PATCH 254/258] harmonize licence to VE (not VED) --- ct/fileflows.sh | 2 +- install/fileflows-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/fileflows.sh b/ct/fileflows.sh index 7fb9f7511..fe0c82f86 100644 --- a/ct/fileflows.sh +++ b/ct/fileflows.sh @@ -2,7 +2,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2025 community-scripts ORG # Author: kkroboth -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://fileflows.com/ APP="FileFlows" diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh index 4098cc238..0419aceed 100644 --- a/install/fileflows-install.sh +++ b/install/fileflows-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2025 community-scripts ORG # Author: kkroboth -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://fileflows.com/ # Import Functions und Setup From 022472af348d617b2d4f869d3f4f771d0850c5f7 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:51:40 +0100 Subject: [PATCH 255/258] Refactor Spinner/MSG Function (support now alpine and better performance / handling) (#3436) --- misc/build.func | 101 +++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 43 deletions(-) diff --git a/misc/build.func b/misc/build.func index 1f977fbb9..f50d4db37 100644 --- a/misc/build.func +++ b/misc/build.func @@ -29,15 +29,13 @@ color() { # Formatting CL=$(echo "\033[m") - UL=$(echo "\033[4m") BOLD=$(echo "\033[1m") - BFR="\\r\\033[K" HOLD=" " TAB=" " # Icons - CM="${TAB}βœ”οΈ${TAB}${CL}" - CROSS="${TAB}βœ–οΈ${TAB}${CL}" + CM="${TAB}βœ”οΈ${TAB}" + CROSS="${TAB}βœ–οΈ${TAB}" INFO="${TAB}πŸ’‘${TAB}${CL}" OS="${TAB}πŸ–₯️${TAB}${CL}" OSVERSION="${TAB}🌟${TAB}${CL}" @@ -81,58 +79,75 @@ error_handler() { } # This function displays an informational message with logging support. +declare -A MSG_INFO_SHOWN +SPINNER_ACTIVE=0 +SPINNER_PID="" +SPINNER_MSG="" + +trap 'stop_spinner' EXIT INT TERM HUP + start_spinner() { local msg="$1" - local frames=('β ‹' 'β ™' 'β Ή' 'β Έ' 'β Ό' 'β ΄' 'β ¦' 'β §' 'β ‡' '⠏') + local frames=(β ‹ β ™ β Ή β Έ β Ό β ΄ β ¦ β § β ‡ ⠏) local spin_i=0 local interval=0.1 - local term_width=$(tput cols) + + SPINNER_MSG="$msg" + printf "\r\e[2K" >&2 { - while [ "${SPINNER_ACTIVE:-1}" -eq 1 ]; do - printf "\r\e[2K${frames[spin_i]} ${YW}%b${CL}" "$msg" >&2 + while [[ "$SPINNER_ACTIVE" -eq 1 ]]; do + printf "\r\e[2K%s %b" "${frames[spin_i]}" "${YW}${SPINNER_MSG}${CL}" >&2 spin_i=$(((spin_i + 1) % ${#frames[@]})) sleep "$interval" done } & SPINNER_PID=$! + disown "$SPINNER_PID" +} + +stop_spinner() { + if [[ ${SPINNER_PID+v} && -n "$SPINNER_PID" ]] && kill -0 "$SPINNER_PID" 2>/dev/null; then + kill "$SPINNER_PID" 2>/dev/null + sleep 0.1 + kill -0 "$SPINNER_PID" 2>/dev/null && kill -9 "$SPINNER_PID" 2>/dev/null + wait "$SPINNER_PID" 2>/dev/null || true + fi + SPINNER_ACTIVE=0 + unset SPINNER_PID +} + +spinner_guard() { + if [[ "$SPINNER_ACTIVE" -eq 1 ]] && [[ -n "$SPINNER_PID" ]]; then + kill "$SPINNER_PID" 2>/dev/null + wait "$SPINNER_PID" 2>/dev/null || true + SPINNER_ACTIVE=0 + unset SPINNER_PID + fi } msg_info() { local msg="$1" - if [ "${SPINNER_ACTIVE:-0}" -eq 1 ]; then - return - fi + [[ -n "${MSG_INFO_SHOWN["$msg"]+x}" ]] && return + MSG_INFO_SHOWN["$msg"]=1 + spinner_guard SPINNER_ACTIVE=1 start_spinner "$msg" } msg_ok() { - if [ -n "${SPINNER_PID:-}" ] && ps -p "$SPINNER_PID" >/dev/null 2>&1; then - kill "$SPINNER_PID" >/dev/null 2>&1 - wait "$SPINNER_PID" 2>/dev/null || true - fi - local msg="$1" - printf "\r\e[2K${CM}${GN}%b${CL}\n" "$msg" >&2 - unset SPINNER_PID - SPINNER_ACTIVE=0 - - log_message "OK" "$msg" + stop_spinner + printf "\r\e[2K%s %b\n" "${CM}" "${GN}${msg}${CL}" >&2 + unset MSG_INFO_SHOWN["$msg"] } msg_error() { - if [ -n "${SPINNER_PID:-}" ] && ps -p "$SPINNER_PID" >/dev/null 2>&1; then - kill "$SPINNER_PID" >/dev/null 2>&1 - wait "$SPINNER_PID" 2>/dev/null || true - fi - + stop_spinner local msg="$1" - printf "\r\e[2K${CROSS}${RD}%b${CL}\n" "$msg" >&2 - unset SPINNER_PID - SPINNER_ACTIVE=0 + printf "\r\e[2K%s %b\n" "${CROSS}" "${RD}${msg}${CL}" >&2 log_message "ERROR" "$msg" } @@ -1250,21 +1265,21 @@ exit_script() { #200 exit codes indicate error in create_lxc.sh #100 exit codes indicate error in install.func - if [ $exit_code -ne 0 ]; then + if [ $exit_code -ne 0 ]; then case $exit_code in - 100) post_update_to_api "failed" "100: Unexpected error in create_lxc.sh" ;; - 101) post_update_to_api "failed" "101: No network connection detected in create_lxc.sh" ;; - 200) post_update_to_api "failed" "200: LXC creation failed in create_lxc.sh" ;; - 201) post_update_to_api "failed" "201: Invalid Storage class in create_lxc.sh" ;; - 202) post_update_to_api "failed" "202: User aborted menu in create_lxc.sh" ;; - 203) post_update_to_api "failed" "203: CTID not set in create_lxc.sh" ;; - 204) post_update_to_api "failed" "204: PCT_OSTYPE not set in create_lxc.sh" ;; - 205) post_update_to_api "failed" "205: CTID cannot be less than 100 in create_lxc.sh" ;; - 206) post_update_to_api "failed" "206: CTID already in use in create_lxc.sh" ;; - 207) post_update_to_api "failed" "207: Template not found in create_lxc.sh" ;; - 208) post_update_to_api "failed" "208: Error downloading template in create_lxc.sh" ;; - 209) post_update_to_api "failed" "209: Container creation failed, but template is intact in create_lxc.sh" ;; - *) post_update_to_api "failed" "Unknown error, exit code: $exit_code in create_lxc.sh" ;; + 100) post_update_to_api "failed" "100: Unexpected error in create_lxc.sh" ;; + 101) post_update_to_api "failed" "101: No network connection detected in create_lxc.sh" ;; + 200) post_update_to_api "failed" "200: LXC creation failed in create_lxc.sh" ;; + 201) post_update_to_api "failed" "201: Invalid Storage class in create_lxc.sh" ;; + 202) post_update_to_api "failed" "202: User aborted menu in create_lxc.sh" ;; + 203) post_update_to_api "failed" "203: CTID not set in create_lxc.sh" ;; + 204) post_update_to_api "failed" "204: PCT_OSTYPE not set in create_lxc.sh" ;; + 205) post_update_to_api "failed" "205: CTID cannot be less than 100 in create_lxc.sh" ;; + 206) post_update_to_api "failed" "206: CTID already in use in create_lxc.sh" ;; + 207) post_update_to_api "failed" "207: Template not found in create_lxc.sh" ;; + 208) post_update_to_api "failed" "208: Error downloading template in create_lxc.sh" ;; + 209) post_update_to_api "failed" "209: Container creation failed, but template is intact in create_lxc.sh" ;; + *) post_update_to_api "failed" "Unknown error, exit code: $exit_code in create_lxc.sh" ;; esac fi } From 9cbd315456eee1ca03177c7888ea06abb6521515 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:52:04 +0100 Subject: [PATCH 256/258] [core]: add functions for Alpine (update / core deps) (#3437) --- misc/alpine-install.func | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/misc/alpine-install.func b/misc/alpine-install.func index 636be6485..714ca12a7 100644 --- a/misc/alpine-install.func +++ b/misc/alpine-install.func @@ -8,7 +8,6 @@ color() { # Colors YW=$(echo "\033[33m") - YWB=$(echo "\033[93m") BL=$(echo "\033[36m") RD=$(echo "\033[01;31m") GN=$(echo "\033[1;92m") @@ -30,10 +29,8 @@ color() { INFO="${TAB}πŸ’‘${TAB}${CL}" NETWORK="${TAB}πŸ“‘${TAB}${CL}" OS="${TAB}πŸ–₯️${TAB}${CL}" - OSVERSION="${TAB}🌟${TAB}${CL}" HOSTNAME="${TAB}🏠${TAB}${CL}" GATEWAY="${TAB}🌐${TAB}${CL}" - DEFAULT="${TAB}βš™οΈ${TAB}${CL}" } # Function to set STD mode based on verbosity @@ -143,6 +140,11 @@ update_os() { $STD apk update $STD apk upgrade msg_ok "Updated Container OS" + + msg_info "Installing core dependencies" + $STD apk update + $STD apk add newt curl openssh nano mc ncurses + msg_ok "Core dependencies installed" } # This function modifies the message of the day (motd) and SSH settings @@ -181,7 +183,7 @@ motd_ssh() { # Validate Timezone for some LXC's validate_tz() { - [[ -f "/usr/share/zoneinfo/$1" ]] + [[ -f "/usr/share/zoneinfo/$1" ]] } # This function customizes the container and enables passwordless login for the root user @@ -191,4 +193,7 @@ customize() { bash -c "passwd -d root" >/dev/null 2>&1 msg_ok "Customized Container" fi + + echo "bash -c \"\$(curl -fsSL https://github.com/community-scripts/ProxmoxVE/raw/main/ct/${app}.sh)\"" >/usr/bin/update + chmod +x /usr/bin/update } From 9f890aae8903c2b06eddc0b266486c94366280b2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:53:04 +0100 Subject: [PATCH 257/258] Update CHANGELOG.md (#3434) --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31a57be82..867739c82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,18 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-03-27 + +### πŸš€ Updated Scripts + + - [core]: add functions for Alpine (update / core deps) [@MickLesk](https://github.com/MickLesk) ([#3437](https://github.com/community-scripts/ProxmoxVE/pull/3437)) + +### 🧰 Maintenance + + - #### πŸ’Ύ Core + + - [core]: Refactor Spinner/MSG Function (support now alpine / performance / handling) [@MickLesk](https://github.com/MickLesk) ([#3436](https://github.com/community-scripts/ProxmoxVE/pull/3436)) + ## 2025-03-26 ### πŸ†• New Scripts From 73faa0ab105ebbb8b7d06a2dd7b65497c76500b4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 13:15:48 +0100 Subject: [PATCH 258/258] Update versions.json (#3440) Co-authored-by: GitHub Actions[bot] --- frontend/public/json/versions.json | 88 +++++++++++++++--------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 2a3febfc5..8c89508e4 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -4,6 +4,41 @@ "version": "2025.3.4", "date": "2025-03-21T20:22:46Z" }, + { + "name": "syncthing/syncthing", + "version": "v1.29.3", + "date": "2025-03-12T11:56:30Z" + }, + { + "name": "evcc-io/evcc", + "version": "0.202.1", + "date": "2025-03-27T08:24:55Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1", + "date": "2025-01-01T16:15:52Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1699", + "date": "2025-03-27T05:57:08Z" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.5-rc6", + "date": "2025-03-27T05:15:49Z" + }, + { + "name": "StarFleetCPTN/GoMFT", + "version": "v0.2.1", + "date": "2025-03-27T02:08:19Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-03-27T02:00:18Z" + }, { "name": "element-hq/synapse", "version": "v1.127.1", @@ -16,18 +51,13 @@ }, { "name": "ollama/ollama", - "version": "v0.6.3-rc1", - "date": "2025-03-26T20:39:01Z" - }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-03-26T20:29:58Z" + "version": "v0.6.2", + "date": "2025-03-18T03:11:33Z" }, { "name": "runtipi/runtipi", - "version": "e2e", - "date": "2025-03-23T22:08:04Z" + "version": "nightly", + "date": "2025-03-26T20:06:34Z" }, { "name": "glanceapp/glance", @@ -39,6 +69,11 @@ "version": "v1.82.0", "date": "2025-03-26T19:50:59Z" }, + { + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" + }, { "name": "semaphoreui/semaphore", "version": "v2.13.2", @@ -69,11 +104,6 @@ "version": "n8n@1.84.2", "date": "2025-03-26T14:11:45Z" }, - { - "name": "evcc-io/evcc", - "version": "0.202.0", - "date": "2025-03-26T10:19:01Z" - }, { "name": "jupyter/notebook", "version": "@jupyter-notebook/ui-components@7.4.0-beta.3", @@ -94,11 +124,6 @@ "version": "v1.34.0", "date": "2025-03-26T08:48:34Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1695", - "date": "2025-03-26T06:01:34Z" - }, { "name": "pocketbase/pocketbase", "version": "v0.26.4", @@ -124,11 +149,6 @@ "version": "v11.6.0", "date": "2025-03-25T22:10:15Z" }, - { - "name": "keycloak/keycloak", - "version": "26.1.4", - "date": "2025-03-13T15:41:42Z" - }, { "name": "zabbix/zabbix", "version": "7.2.5rc2", @@ -294,11 +314,6 @@ "version": "v1.32.2.4987", "date": "2025-03-16T09:41:37Z" }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.1", - "date": "2025-01-01T16:15:52Z" - }, { "name": "usememos/memos", "version": "v0.24.2", @@ -354,16 +369,6 @@ "version": "v0.107.59", "date": "2025-03-21T11:11:39Z" }, - { - "name": "openobserve/openobserve", - "version": "v0.14.5-rc5", - "date": "2025-03-21T10:50:34Z" - }, - { - "name": "StarFleetCPTN/GoMFT", - "version": "v0.1.18", - "date": "2025-03-21T04:36:04Z" - }, { "name": "jhuckaby/Cronicle", "version": "v0.9.77", @@ -419,11 +424,6 @@ "version": "v0.22.1", "date": "2025-03-18T21:01:22Z" }, - { - "name": "syncthing/syncthing", - "version": "v1.29.3", - "date": "2025-03-12T11:56:30Z" - }, { "name": "OctoPrint/OctoPrint", "version": "1.10.3",

uy@T?R!-xCtc?ByEK>!==k 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 z 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