Compare commits

...

16 Commits

Author SHA1 Message Date
ab9c57ccf9 Update CHANGELOG.md (#6650)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-08 00:13:55 +00:00
dce77d12c7 Update versions.json (#6649)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-08 02:13:35 +02:00
1f35b649cc qf 2025-08-07 19:41:59 +02:00
5938a9aceb Update CHANGELOG.md (#6645)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 17:39:10 +00:00
3b76211c12 Tandoor v2 (#6635) 2025-08-07 19:38:49 +02:00
7221a0759d Update CHANGELOG.md (#6644)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 17:35:42 +00:00
a750932b3a Refactor: Post-PVE-Script (PVe9 Support) (#6626) 2025-08-07 19:35:19 +02:00
a4de1efae8 Update versions.json (#6640)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 14:06:04 +02:00
f7570cb40c Update CHANGELOG.md (#6639)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 11:36:21 +00:00
10471b88aa Refactor: Paymenter (#6589)
* Refactor

* Update paymenter.sh

* Update paymenter-install.sh
2025-08-07 13:36:01 +02:00
04a83cce10 Update CHANGELOG.md (#6638)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 11:35:26 +00:00
f9e26f4f7c Commafeed: Fix Backup Handling while Update (#6629)
* Commafeed: Fix Backup Handling while Update

* Update commafeed.sh
2025-08-07 13:35:05 +02:00
ed6baa1158 Update CHANGELOG.md (#6637)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 11:35:01 +00:00
a7cc93af09 Feature: Clean-LXC support now alpine (#6628) 2025-08-07 13:34:40 +02:00
a494ed5872 Update CHANGELOG.md (#6636)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-08-07 11:34:18 +00:00
ede517a560 Fix release fetching (#6632) 2025-08-07 13:33:56 +02:00
13 changed files with 781 additions and 408 deletions

View File

@ -10,8 +10,27 @@
> [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2025-08-08
## 2025-08-07
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Commafeed: Fix Backup Handling while Update [@MickLesk](https://github.com/MickLesk) ([#6629](https://github.com/community-scripts/ProxmoxVE/pull/6629))
- VictoriaMetrics: Fix release fetching [@tremor021](https://github.com/tremor021) ([#6632](https://github.com/community-scripts/ProxmoxVE/pull/6632))
- #### ✨ New Features
- Feature: Post-PVE-Script (PVE9 Support + some Features) [@MickLesk](https://github.com/MickLesk) ([#6626](https://github.com/community-scripts/ProxmoxVE/pull/6626))
- Feature: Clean-LXC now supports Alpine based containers [@MickLesk](https://github.com/MickLesk) ([#6628](https://github.com/community-scripts/ProxmoxVE/pull/6628))
- #### 🔧 Refactor
- Refactor: Tandoor v2 [@MickLesk](https://github.com/MickLesk) ([#6635](https://github.com/community-scripts/ProxmoxVE/pull/6635))
- Refactor: Paymenter [@tremor021](https://github.com/tremor021) ([#6589](https://github.com/community-scripts/ProxmoxVE/pull/6589))
## 2025-08-06
### 🚀 Updated Scripts

View File

@ -40,16 +40,20 @@ function update_script() {
$STD apt-get install -y rsync
msg_ok "Installed Dependencies"
fi
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
msg_info "Backing up existing data"
mv /opt/commafeed/data /opt/data.bak
msg_ok "Backed up existing data"
fi
fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip"
msg_info "Updating ${APP} to ${RELEASE}"
if [ -d /opt/commafeed/data.bak ] && [ "$(ls -A /opt/commafeed/data.bak)" ]; then
mv /opt/commafeed/data.bak /opt/commafeed/data
if [ -d /opt/data.bak ] && [ "$(ls -A /opt/data.bak)" ]; then
msg_info "Restoring data"
mv /opt/data.bak /opt/commafeed/data
msg_ok "Restored data"
fi
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting ${APP}"
systemctl start commafeed

View File

@ -23,32 +23,25 @@ function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/paymenter ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
if [[ "$CURRENT_PHP" != "8.3" ]]; then
msg_info "Migrating PHP $CURRENT_PHP to 8.3"
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
$STD apt-get update
$STD apt-get remove -y php"${CURRENT_PHP//./}"*
$STD apt-get install -y \
php8.3 \
php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,curl,zip,intl,redis,fpm}
PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULE="common,mysql,fpm,redis" setup_php
setup_composer
sed -i 's|php8\.2-fpm\.sock|php8.3-fpm.sock|g' /etc/nginx/sites-available/paymenter.conf
$STD systemctl reload nginx
msg_ok "Migrated PHP $CURRENT_PHP to 8.3"
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/paymenter/paymenter/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
RELEASE=$(curl -fsSL https://api.github.com/repos/paymenter/paymenter/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f ~/.paymenter ]] || [[ "${RELEASE}" != "$(cat ~/.paymenter)" ]]; then
msg_info "Updating ${APP} to ${RELEASE}"
echo "${RELEASE}" >/opt/${APP}_version.txt
cd /opt/paymenter
$STD php artisan p:upgrade --no-interaction
echo "${RELEASE}" >~/.paymenter
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}."

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (Canbiz)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://tandoor.dev/
@ -27,27 +27,57 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
#if ! [[ $(dpkg -s python3-xmlsec 2>/dev/null) ]]; then
#$STD apt-get update
#$STD apt-get install -y python3-xmlsec
#fi
#if cd /opt/tandoor && git pull | grep -q 'Already up to date'; then
msg_ok "There is currently no update available."
#else
#msg_info "Updating ${APP} (Patience)"
#export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs)
#cd /opt/tandoor/
#$STD pip3 install -r requirements.txt
#$STD /usr/bin/python3 /opt/tandoor/manage.py migrate
#$STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input
#$STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse
#cd /opt/tandoor/vue
#$STD yarn install
#$STD yarn build
#cd /opt/tandoor
#$STD python3 version.py
#systemctl restart gunicorn_tandoor
#msg_ok "Updated ${APP}"
if [[ ! -f ~/.tandoor ]]; then
msg_error "v1 Installation found, please export your data and create an new LXC."
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/TandoorRecipes/recipes/releases/latest | jq -r '.tag_name' | sed 's/^v//')
if [[ "${RELEASE}" != "$(cat ~/.tandoor 2>/dev/null)" ]] || [[ ! -f ~/.tandoor ]]; then
msg_info "Stopping $APP"
systemctl stop tandoor
msg_ok "Stopped $APP"
msg_info "Creating Backup"
mv /opt/tandoor /opt/tandoor.bak
msg_ok "Backup Created"
NODE_VERSION="20" NODE_MODULE="yarn" setup_nodejs
PYTHON_VERSION="3.13" setup_uv
fetch_and_deploy_gh_release "tandoor" "TandoorRecipes/recipes" "tarball" "latest" "/opt/tandoor"
msg_info "Updating $APP to ${RELEASE}"
cp -r /opt/tandoor.bak/{config,api,mediafiles,staticfiles} /opt/tandoor/
mv /opt/.env /opt/tandoor/.env
cd /opt/tandoor
$STD uv venv .venv --python=python3
$STD uv pip install -r requirements.txt --python .venv/bin/python
cd /opt/tandoor/vue3
$STD yarn install
$STD yarn build
TANDOOR_VERSION="$(curl -fsSL https://api.github.com/repos/TandoorRecipes/recipes/releases/latest | jq -r .tag_name)"
cat <<EOF >/opt/tandoor/cookbook/version_info.py
TANDOOR_VERSION = "$TANDOOR_VERSION"
TANDOOR_REF = "bare-metal"
VERSION_INFO = []
EOF
cd /opt/tandoor
$STD /opt/tandoor/.venv/bin/python manage.py migrate
$STD /opt/tandoor/.venv/bin/python manage.py collectstatic --no-input
msg_ok "Updated $APP to ${RELEASE}"
msg_info "Starting $APP"
systemctl start tandoor
systemctl reload nginx
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -rf /opt/tandoor.bak
msg_ok "Cleanup Completed"
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}

View File

@ -35,8 +35,15 @@ function update_script() {
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl stop victoriametrics-logs
msg_ok "Stopped $APP"
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-amd64-v+([0-9.]).tar.gz"
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-amd64-v+([0-9.]).tar.gz"
victoriametrics_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest" |
jq -r '.assets[].name' |
grep -E '^victoria-metrics-linux-amd64-v[0-9.]+\.tar\.gz$')
vmutils_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest" |
jq -r '.assets[].name' |
grep -E '^vmutils-linux-amd64-v[0-9.]+\.tar\.gz$')
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "$victoriametrics_filename"
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "$vmutils_filename"
if [[ -f /etc/systemd/system/victoriametrics-logs.service ]]; then
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"

View File

@ -1,34 +1,149 @@
[
{
"name": "MariaDB/server",
"version": "mariadb-12.0.2",
"date": "2025-08-07T21:23:15Z"
},
{
"name": "ollama/ollama",
"version": "v0.11.4",
"date": "2025-08-07T21:23:55Z"
},
{
"name": "fallenbagel/jellyseerr",
"version": "preview-seerr",
"date": "2025-08-07T21:00:53Z"
},
{
"name": "semaphoreui/semaphore",
"version": "v2.16.1",
"date": "2025-08-07T20:54:27Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.1.2",
"date": "2025-06-26T22:08:00Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.2.21",
"date": "2025-07-17T04:46:25Z"
},
{
"name": "rcourtman/Pulse",
"version": "v4.0.12",
"date": "2025-08-07T16:14:05Z"
},
{
"name": "mongodb/mongo",
"version": "r7.0.23",
"date": "2025-08-07T17:25:30Z"
},
{
"name": "tailscale/tailscale",
"version": "v1.86.4",
"date": "2025-08-07T16:48:40Z"
},
{
"name": "jenkinsci/jenkins",
"version": "jenkins-2.522",
"date": "2025-08-05T15:33:22Z"
},
{
"name": "bunkerity/bunkerweb",
"version": "v1.6.3",
"date": "2025-08-07T16:17:27Z"
},
{
"name": "rabbitmq/rabbitmq-server",
"version": "v4.1.3",
"date": "2025-08-04T12:13:45Z"
},
{
"name": "element-hq/synapse",
"version": "v1.135.0",
"date": "2025-08-01T12:43:17Z"
},
{
"name": "cross-seed/cross-seed",
"version": "v6.13.1",
"date": "2025-07-17T21:36:42Z"
},
{
"name": "zwave-js/zwave-js-ui",
"version": "v11.1.0",
"date": "2025-08-07T14:57:29Z"
},
{
"name": "karlomikus/bar-assistant",
"version": "v5.6.1",
"date": "2025-08-07T14:46:03Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.105.4",
"date": "2025-08-07T13:58:23Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-mdx@11.7.4",
"date": "2025-08-07T13:56:33Z"
},
{
"name": "blakeblackshear/frigate",
"version": "v0.14.1",
"date": "2024-08-29T22:32:51Z"
},
{
"name": "syncthing/syncthing",
"version": "v1.30.0",
"date": "2025-07-01T11:29:11Z"
},
{
"name": "glpi-project/glpi",
"version": "10.0.19",
"date": "2025-07-16T09:45:14Z"
},
{
"name": "mattermost/mattermost",
"version": "server/public/v0.1.16",
"date": "2025-07-28T22:46:46Z"
},
{
"name": "keycloak/keycloak",
"version": "26.2.7",
"date": "2025-08-07T08:19:29Z"
},
{
"name": "crowdsecurity/crowdsec",
"version": "v1.6.11",
"date": "2025-07-22T12:11:38Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.2235",
"date": "2025-08-07T05:48:41Z"
},
{
"name": "cloudreve/cloudreve",
"version": "4.4.1",
"date": "2025-08-07T04:25:37Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.2",
"date": "2025-07-17T12:08:03Z"
},
{
"name": "influxdata/influxdb",
"version": "v1.12.2rc2",
"date": "2025-08-06T23:12:18Z"
},
{
"name": "mongodb/mongo",
"version": "r8.2.0-rc3",
"date": "2025-08-06T22:48:18Z"
},
{
"name": "rcourtman/Pulse",
"version": "v4.0.8",
"date": "2025-08-06T22:04:29Z"
},
{
"name": "fallenbagel/jellyseerr",
"version": "preview-seerr",
"date": "2025-08-06T21:45:58Z"
},
{
"name": "booklore-app/booklore",
"version": "v0.35.1",
"date": "2025-08-06T21:30:17Z"
},
{
"name": "MariaDB/server",
"version": "mariadb-11.8.3",
"date": "2025-08-06T21:17:38Z"
},
{
"name": "Athou/commafeed",
"version": "5.11.0",
@ -44,11 +159,6 @@
"version": "v1.24.12",
"date": "2025-08-06T18:42:07Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.2.21",
"date": "2025-07-17T04:46:25Z"
},
{
"name": "home-assistant/core",
"version": "2025.8.0",
@ -64,11 +174,6 @@
"version": "3.2.2-rc1",
"date": "2025-08-06T16:59:43Z"
},
{
"name": "cross-seed/cross-seed",
"version": "v6.13.1",
"date": "2025-07-17T21:36:42Z"
},
{
"name": "Graylog2/graylog2-server",
"version": "6.1.14",
@ -109,46 +214,16 @@
"version": "v12.0.4",
"date": "2025-08-06T06:30:07Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.2233",
"date": "2025-08-06T05:56:01Z"
},
{
"name": "garethgeorge/backrest",
"version": "v1.9.1",
"date": "2025-08-06T05:48:33Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-openapi@9.1.9",
"date": "2025-08-06T04:54:06Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.1.2",
"date": "2025-06-26T22:08:00Z"
},
{
"name": "ollama/ollama",
"version": "v0.11.3",
"date": "2025-08-06T01:29:59Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.2",
"date": "2025-07-17T12:08:03Z"
},
{
"name": "autobrr/autobrr",
"version": "v1.65.0",
"date": "2025-08-05T21:12:35Z"
},
{
"name": "keycloak/keycloak",
"version": "26.0.14",
"date": "2025-08-01T11:29:12Z"
},
{
"name": "HabitRPG/habitica",
"version": "v5.38.1",
@ -174,31 +249,11 @@
"version": "prototype-webhooks-0",
"date": "2025-08-05T16:55:32Z"
},
{
"name": "jenkinsci/jenkins",
"version": "jenkins-2.522",
"date": "2025-08-05T15:33:22Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.105.3",
"date": "2025-08-05T13:06:29Z"
},
{
"name": "apache/cassandra",
"version": "cassandra-5.0.5",
"date": "2025-08-05T12:08:49Z"
},
{
"name": "cloudreve/cloudreve",
"version": "4.4.0",
"date": "2025-08-05T11:51:08Z"
},
{
"name": "semaphoreui/semaphore",
"version": "v2.15.5",
"date": "2025-08-05T11:49:45Z"
},
{
"name": "sabnzbd/sabnzbd",
"version": "4.5.2",
@ -214,21 +269,11 @@
"version": "v2.14.0",
"date": "2025-08-05T08:31:35Z"
},
{
"name": "bunkerity/bunkerweb",
"version": "v1.6.3",
"date": "2025-08-05T07:46:45Z"
},
{
"name": "jupyter/notebook",
"version": "v7.4.5",
"date": "2025-08-05T07:41:04Z"
},
{
"name": "mattermost/mattermost",
"version": "server/public/v0.1.16",
"date": "2025-07-28T22:46:46Z"
},
{
"name": "rogerfar/rdt-client",
"version": "v2.0.116",
@ -279,11 +324,6 @@
"version": "10.1.44",
"date": "2025-08-04T13:17:59Z"
},
{
"name": "rabbitmq/rabbitmq-server",
"version": "v4.1.3",
"date": "2025-08-04T12:13:45Z"
},
{
"name": "redis/redis",
"version": "8.2.0",
@ -334,11 +374,6 @@
"version": "v1.4.3",
"date": "2025-08-03T15:19:16Z"
},
{
"name": "blakeblackshear/frigate",
"version": "v0.14.1",
"date": "2024-08-29T22:32:51Z"
},
{
"name": "Lidarr/Lidarr",
"version": "v2.12.4.4658",
@ -424,21 +459,6 @@
"version": "2025.07.1",
"date": "2025-08-01T14:40:28Z"
},
{
"name": "element-hq/synapse",
"version": "v1.135.0",
"date": "2025-08-01T12:43:17Z"
},
{
"name": "crowdsecurity/crowdsec",
"version": "v1.6.11",
"date": "2025-07-22T12:11:38Z"
},
{
"name": "zwave-js/zwave-js-ui",
"version": "v11.0.1",
"date": "2025-08-01T07:43:59Z"
},
{
"name": "gotson/komga",
"version": "1.23.1",
@ -516,7 +536,7 @@
},
{
"name": "wazuh/wazuh",
"version": "coverity-w31-4.13.0",
"version": "coverity-w32-4.13.0",
"date": "2025-07-30T08:30:15Z"
},
{
@ -534,11 +554,6 @@
"version": "v4.3.5",
"date": "2025-07-29T20:30:04Z"
},
{
"name": "tailscale/tailscale",
"version": "v1.86.2",
"date": "2025-07-29T19:16:24Z"
},
{
"name": "caddyserver/xcaddy",
"version": "v0.4.5",
@ -614,11 +629,6 @@
"version": "v8.2.1",
"date": "2025-07-24T14:37:54Z"
},
{
"name": "glpi-project/glpi",
"version": "10.0.19",
"date": "2025-07-16T09:45:14Z"
},
{
"name": "minio/minio",
"version": "RELEASE.2025-07-23T15-54-02Z",
@ -709,11 +719,6 @@
"version": "v0.6.18",
"date": "2025-07-19T19:26:14Z"
},
{
"name": "karlomikus/bar-assistant",
"version": "v5.6.0",
"date": "2025-07-19T13:34:36Z"
},
{
"name": "duplicati/duplicati",
"version": "v2.1.1.0-2.1.1.0_experimental_2025-07-17",
@ -844,11 +849,6 @@
"version": "0.23.1",
"date": "2025-07-06T23:57:52Z"
},
{
"name": "syncthing/syncthing",
"version": "v1.30.0",
"date": "2025-07-01T11:29:11Z"
},
{
"name": "Part-DB/Part-DB-server",
"version": "v1.17.2",

View File

@ -16,42 +16,15 @@ update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
git \
software-properties-common \
apt-transport-https \
ca-certificates \
nginx \
redis-server
msg_ok "Installed Dependencies"
setup_mariadb
msg_info "Adding PHP Repository"
$STD curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
$STD apt-get update
msg_ok "Added PHP Repository"
msg_info "Installing PHP"
$STD apt-get remove -y php8.2*
$STD apt-get install -y \
php8.3 \
php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,curl,zip,intl,fpm,redis}
msg_info "Installed PHP"
msg_info "Installing Composer"
$STD curl -fsSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
msg_ok "Installed Composer"
msg_info "Installing Paymenter"
RELEASE=$(curl -fsSL https://api.github.com/repos/paymenter/paymenter/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
mkdir -p /opt/paymenter
cd /opt/paymenter
curl -fsSL "https://github.com/paymenter/paymenter/releases/download/${RELEASE}/paymenter.tar.gz" -o paymenter.tar.gz
$STD tar -xzvf paymenter.tar.gz
chmod -R 755 storage/* bootstrap/cache/
msg_ok "Installed Paymenter"
PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULE="common,mysql,fpm,redis" setup_php
setup_composer
fetch_and_deploy_gh_release "paymenter" "paymenter/paymenter" "prebuild" "latest" "/opt/paymenter" "paymenter.tar.gz"
chmod -R 755 /opt/paymenter/storage/* /opt/paymenter/bootstrap/cache/
msg_info "Setting up database"
DB_NAME=paymenter
@ -67,6 +40,7 @@ $STD mariadb -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'local
echo "Username: $DB_USER"
echo "Password: $DB_PASS"
} >>~/paymenter_db.creds
cd /opt/paymenter
cp .env.example .env
$STD composer install --no-dev --optimize-autoloader --no-interaction
$STD php artisan key:generate --force
@ -138,11 +112,11 @@ systemctl enable --now paymenter
systemctl enable --now redis-server
msg_ok "Setup Service"
motd_ssh
customize
msg_info "Cleaning up"
rm -rf /opt/paymenter/paymenter.tar.gz
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
motd_ssh
customize

View File

@ -1,8 +1,7 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (Canbiz)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://tandoor.dev/
@ -17,6 +16,7 @@ update_os
msg_info "Installing Dependencies (Patience)"
$STD apt-get install -y --no-install-recommends \
build-essential \
python3 \
libpq-dev \
libmagic-dev \
libzbar0 \
@ -24,72 +24,72 @@ $STD apt-get install -y --no-install-recommends \
libsasl2-dev \
libldap2-dev \
libssl-dev \
git \
make \
pkg-config \
libxmlsec1-dev \
libxml2-dev \
libxmlsec1-openssl
msg_ok "Installed Dependencies"
msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-setuptools \
python3-pip \
python3-xmlsec
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
msg_ok "Setup Python3"
NODE_VERSION="20" NODE_MODULE="yarn" setup_nodejs
fetch_and_deploy_gh_release "tandoor" "TandoorRecipes/recipes" "tarball" "latest" "/opt/tandoor"
PG_VERSION="16" setup_postgresql
PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="20" NODE_MODULE="yarn@latest" setup_nodejs
msg_info "Installing Tandoor (Patience)"
$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
curl -fsSL "https://raw.githubusercontent.com/TandoorRecipes/recipes/develop/.env.template" -o "/opt/tandoor/.env"
msg_info "Set up PostgreSQL Database"
DB_NAME=db_recipes
DB_USER=tandoor
DB_ENCODING=utf8
DB_TIMEZONE=UTC
secret_key=$(openssl rand -base64 45 | sed 's/\//\\\//g')
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
cd /opt/tandoor
$STD python3 version.py
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
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
$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;"
$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 "" >>~/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)
/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
{
echo "Tandoor-Credentials"
echo "Tandoor Database Name: $DB_NAME"
echo "Tandoor Database User: $DB_USER"
echo "Tandoor Database Password: $DB_PASS"
} >>~/tandoor.creds
msg_ok "Set up PostgreSQL Database"
msg_info "Setup Tandoor"
mkdir -p /opt/tandoor/{config,api,mediafiles,staticfiles}
cd /opt/tandoor
$STD uv venv .venv --python=python3
$STD uv pip install -r requirements.txt --python .venv/bin/python
cd /opt/tandoor/vue3
$STD yarn install
$STD yarn build
cat <<EOF >/opt/tandoor/.env
SECRET_KEY=$SECRET_KEY
TZ=Europe/Berlin
DB_ENGINE=django.db.backends.postgresql
POSTGRES_HOST=localhost
POSTGRES_DB=$DB_NAME
POSTGRES_PORT=5432
POSTGRES_USER=$DB_USER
POSTGRES_PASSWORD=$DB_PASS
STATIC_URL=/staticfiles/
MEDIA_URL=/mediafiles/
EOF
TANDOOR_VERSION="$(curl -s https://api.github.com/repos/TandoorRecipes/recipes/releases/latest | jq -r .tag_name)"
cat <<EOF >/opt/tandoor/cookbook/version_info.py
TANDOOR_VERSION = "$TANDOOR_VERSION"
TANDOOR_REF = "bare-metal"
VERSION_INFO = []
EOF
cd /opt/tandoor
$STD /opt/tandoor/.venv/bin/python manage.py migrate
$STD /opt/tandoor/.venv/bin/python manage.py collectstatic --no-input
msg_ok "Installed Tandoor"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/gunicorn_tandoor.service
cat <<EOF >/etc/systemd/system/tandoor.service
[Unit]
Description=gunicorn daemon for tandoor
After=network.target
@ -100,7 +100,7 @@ Restart=always
RestartSec=3
WorkingDirectory=/opt/tandoor
EnvironmentFile=/opt/tandoor/.env
ExecStart=/usr/local/bin/gunicorn --error-logfile /tmp/gunicorn_err.log --log-level debug --capture-output --bind unix:/opt/tandoor/tandoor.sock recipes.wsgi:application
ExecStart=/opt/tandoor/.venv/bin/gunicorn --error-logfile /tmp/gunicorn_err.log --log-level debug --capture-output --bind unix:/opt/tandoor/tandoor.sock recipes.wsgi:application
[Install]
WantedBy=multi-user.target
@ -109,8 +109,8 @@ EOF
cat <<'EOF' >/etc/nginx/conf.d/tandoor.conf
server {
listen 8002;
#access_log /var/log/nginx/access.log;
#error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
client_max_body_size 128M;
# serve media files
location /static/ {
@ -123,12 +123,15 @@ server {
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/opt/tandoor/tandoor.sock;
}
}
EOF
systemctl reload nginx
systemctl enable -q --now gunicorn_tandoor
systemctl enable -q --now tandoor
msg_ok "Created Services"
motd_ssh

View File

@ -13,8 +13,17 @@ setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-amd64-v+([0-9.]).tar.gz"
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-amd64-v+([0-9.]).tar.gz"
msg_info "Getting latest version of VictoriaMetrics"
victoriametrics_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest" |
jq -r '.assets[].name' |
grep -E '^victoria-metrics-linux-amd64-v[0-9.]+\.tar\.gz$')
vmutils_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest" |
jq -r '.assets[].name' |
grep -E '^vmutils-linux-amd64-v[0-9.]+\.tar\.gz$')
msg_ok "Got latest version of VictoriaMetrics"
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "$victoriametrics_filename"
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "$vmutils_filename"
read -r -p "${TAB3}Would you like to add VictoriaLogs? <y/N> " prompt

View File

@ -1,7 +1,6 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
# Copyright (c) 2021-2025 community-scripts ORG
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
@ -13,67 +12,95 @@ function header_info() {
/ / / / _ \/ __ `/ __ \ / / | / /
/ /___/ / __/ /_/ / / / / / /___/ / /___
\____/_/\___/\__,_/_/ /_/ /_____/_/|_\____/
EOF
}
set -eEuo pipefail
BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m")
BL="\033[36m"
RD="\033[01;31m"
CM='\xE2\x9C\x94\033'
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
GN="\033[1;92m"
CL="\033[m"
header_info
echo "Loading..."
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Clean logs, cache and update apt lists on selected LXC Containers. Proceed?" 10 58
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This will clean logs, cache and update package lists on selected LXC Containers. Proceed?" 10 58
NODE=$(hostname)
EXCLUDE_MENU=()
MSG_MAX_LENGTH=0
while read -r TAG ITEM; do
OFFSET=2
((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET
EXCLUDE_MENU+=("$TAG" "$ITEM " "OFF")
done < <(pct list | awk 'NR>1')
excluded_containers=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --checklist "\nSelect containers to skip from cleaning:\n" \
16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"')
if [ $? -ne 0 ]; then
exit
fi
fi
function clean_container() {
container=$1
function run_lxc_clean() {
local container=$1
header_info
name=$(pct exec "$container" hostname)
echo -e "${BL}[Info]${GN} Cleaning ${name} ${CL} \n"
pct exec "$container" -- bash -c "apt-get -y --purge autoremove && apt-get -y autoclean && bash <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/clean.sh) && rm -rf /var/lib/apt/lists/* && apt-get update"
pct exec "$container" -- bash -c '
BL="\033[36m"; GN="\033[1;92m"; CL="\033[m"
name=$(hostname)
if [ -e /etc/alpine-release ]; then
echo -e "${BL}[Info]${GN} Cleaning $name (Alpine)${CL}\n"
apk cache clean
find /var/log -type f -delete 2>/dev/null
find /tmp -mindepth 1 -delete 2>/dev/null
apk update
else
echo -e "${BL}[Info]${GN} Cleaning $name (Debian/Ubuntu)${CL}\n"
find /var/cache -type f -delete 2>/dev/null
find /var/log -type f -delete 2>/dev/null
find /tmp -mindepth 1 -delete 2>/dev/null
apt-get -y --purge autoremove
apt-get -y autoclean
rm -rf /var/lib/apt/lists/*
apt-get update
fi
'
}
for container in $(pct list | awk '{if(NR>1) print $1}'); do
if [[ " ${excluded_containers[@]} " =~ " $container " ]]; then
header_info
echo -e "${BL}[Info]${GN} Skipping ${BL}$container${CL}"
sleep 1
else
os=$(pct config "$container" | awk '/^ostype/ {print $2}')
if [ "$os" != "debian" ] && [ "$os" != "ubuntu" ]; then
header_info
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container is not Debian or Ubuntu ${CL} \n"
sleep 1
continue
fi
continue
fi
status=$(pct status "$container")
template=$(pct config "$container" | grep -q "template:" && echo "true" || echo "false")
if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
echo -e "${BL}[Info]${GN} Starting${BL} $container ${CL} \n"
pct start "$container"
echo -e "${BL}[Info]${GN} Waiting For${BL} $container${CL}${GN} To Start ${CL} \n"
sleep 5
clean_container "$container"
echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n"
pct shutdown "$container" &
elif [ "$status" == "status: running" ]; then
clean_container "$container"
fi
os=$(pct config "$container" | awk '/^ostype/ {print $2}')
# Supported: debian, ubuntu, alpine
if [ "$os" != "debian" ] && [ "$os" != "ubuntu" ] && [ "$os" != "alpine" ]; then
header_info
echo -e "${BL}[Info]${GN} Skipping ${RD}$container is not Debian, Ubuntu or Alpine${CL} \n"
sleep 1
continue
fi
status=$(pct status "$container")
template=$(pct config "$container" | grep -q "template:" && echo "true" || echo "false")
if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
echo -e "${BL}[Info]${GN} Starting${BL} $container ${CL} \n"
pct start "$container"
echo -e "${BL}[Info]${GN} Waiting For${BL} $container${CL}${GN} To Start ${CL} \n"
sleep 5
run_lxc_clean "$container"
echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n"
pct shutdown "$container" &
elif [ "$status" == "status: running" ]; then
run_lxc_clean "$container"
fi
done

View File

@ -1,47 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info() {
clear
cat <<"EOF"
________ __ _ ________
/ ____/ /__ ____ _____ / / | |/ / ____/
/ / / / _ \/ __ `/ __ \ / / | / /
/ /___/ / __/ /_/ / / / / / /___/ / /___
\____/_/\___/\__,_/_/ /_/ /_____/_/|_\____/
EOF
}
BL=$(echo "\033[36m")
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
name=$(hostname)
header_info
echo -e "${BL}[Info]${GN} Cleaning $name${CL} \n"
cache=$(find /var/cache/ -type f)
if [[ -z "$cache" ]]; then
echo -e "It appears there are no cached files on your system. \n"
sleep 2
else
find /var/cache -type f -delete
echo "Successfully Removed Cache"
sleep 2
fi
header_info
echo -e "${BL}[Info]${GN} Cleaning $name${CL} \n"
logs=$(find /var/log/ -type f)
if [[ -z "$logs" ]]; then
echo -e "It appears there are no logs on your system. \n"
sleep 2
else
find /var/log -type f -delete
echo "Successfully Removed Logs"
sleep 2
fi
header_info
echo -e "${BL}[Info]${GN} Cleaning $name${CL} \n"
echo -e "${GN}Populating apt lists${CL} \n"

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
# Author: tteckster | MickLesk (CanbiZ)
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
@ -44,9 +44,66 @@ msg_error() {
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
}
start_routines() {
get_pve_version() {
local pve_ver
pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
echo "$pve_ver"
}
get_pve_major_minor() {
local ver="$1"
local major minor
IFS='.' read -r major minor _ <<<"$ver"
echo "$major $minor"
}
component_exists_in_sources() {
local component="$1"
grep -h -E "^[^#]*Components:[^#]*\b${component}\b" /etc/apt/sources.list.d/*.sources 2>/dev/null | grep -q .
}
main() {
header_info
echo -e "\nThis script will Perform Post Install Routines.\n"
while true; do
read -p "Start the Proxmox VE Post Install Script (y/n)? " yn
case $yn in
[Yy]*) break ;;
[Nn]*)
clear
exit
;;
*) echo "Please answer yes or no." ;;
esac
done
local PVE_VERSION PVE_MAJOR PVE_MINOR
PVE_VERSION="$(get_pve_version)"
read -r PVE_MAJOR PVE_MINOR <<<"$(get_pve_major_minor "$PVE_VERSION")"
if [[ "$PVE_MAJOR" == "8" ]]; then
if ((PVE_MINOR < 0 || PVE_MINOR > 9)); then
msg_error "Unsupported Proxmox 8 version"
exit 1
fi
start_routines_8
elif [[ "$PVE_MAJOR" == "9" ]]; then
if ((PVE_MINOR != 0)); then
msg_error "Only Proxmox 9.0 is currently supported"
exit 1
fi
start_routines_9
else
msg_error "Unsupported Proxmox VE major version: $PVE_MAJOR"
echo -e "Supported: 8.08.9.x and 9.0"
exit 1
fi
}
start_routines_8() {
header_info
# === Bookworm/8.x: .list-Files ===
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SOURCES" --menu "The package manager will use the correct sources to update and install packages on your Proxmox VE server.\n \nCorrect Proxmox VE sources?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
@ -61,9 +118,7 @@ EOF
echo 'APT::Get::Update::SourceListWarnings::NonFreeFirmware "false";' >/etc/apt/apt.conf.d/no-bookworm-firmware.conf
msg_ok "Corrected Proxmox VE Sources"
;;
no)
msg_error "Selected no to Correcting Proxmox VE Sources"
;;
no) msg_error "Selected no to Correcting Proxmox VE Sources" ;;
esac
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-ENTERPRISE" --menu "The 'pve-enterprise' repository is only available to users who have purchased a Proxmox VE subscription.\n \nDisable 'pve-enterprise' repository?" 14 58 2 \
@ -77,9 +132,7 @@ EOF
EOF
msg_ok "Disabled 'pve-enterprise' repository"
;;
no)
msg_error "Selected no to Disabling 'pve-enterprise' repository"
;;
no) msg_error "Selected no to Disabling 'pve-enterprise' repository" ;;
esac
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-NO-SUBSCRIPTION" --menu "The 'pve-no-subscription' repository provides access to all of the open-source components of Proxmox VE.\n \nEnable 'pve-no-subscription' repository?" 14 58 2 \
@ -93,9 +146,7 @@ deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
EOF
msg_ok "Enabled 'pve-no-subscription' repository"
;;
no)
msg_error "Selected no to Enabling 'pve-no-subscription' repository"
;;
no) msg_error "Selected no to Enabling 'pve-no-subscription' repository" ;;
esac
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CEPH PACKAGE REPOSITORIES" --menu "The 'Ceph Package Repositories' provides access to both the 'no-subscription' and 'enterprise' repositories (initially disabled).\n \nCorrect 'ceph package sources?" 14 58 2 \
@ -112,9 +163,7 @@ EOF
EOF
msg_ok "Corrected 'ceph package repositories'"
;;
no)
msg_error "Selected no to Correcting 'ceph package repositories'"
;;
no) msg_error "Selected no to Correcting 'ceph package repositories'" ;;
esac
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVETEST" --menu "The 'pvetest' repository can give advanced users access to new features and updates before they are officially released.\n \nAdd (Disabled) 'pvetest' repository?" 14 58 2 \
@ -128,11 +177,336 @@ EOF
EOF
msg_ok "Added 'pvetest' repository"
;;
no)
msg_error "Selected no to Adding 'pvetest' repository"
;;
no) msg_error "Selected no to Adding 'pvetest' repository" ;;
esac
post_routines_common
}
start_routines_9() {
header_info
# check if deb822 Sources (*.sources) exist
if find /etc/apt/sources.list.d/ -maxdepth 1 -name '*.sources' | grep -q .; then
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Deb822 sources detected" \
--msgbox "Modern deb822 sources (*.sources) already exist.\n\nNo changes to sources format required.\n\nYou may still have legacy sources.list or .list files, which you can disable in the next step." 12 65
else
check_and_disable_legacy_sources() {
local LEGACY_COUNT=0
local listfile="/etc/apt/sources.list"
# Check sources.list
if [[ -f "$listfile" ]] && grep -qE '^\s*deb ' "$listfile"; then
((LEGACY_COUNT++))
fi
# Check .list files
local list_files
list_files=$(find /etc/apt/sources.list.d/ -type f -name "*.list" 2>/dev/null)
if [[ -n "$list_files" ]]; then
LEGACY_COUNT=$((LEGACY_COUNT + $(echo "$list_files" | wc -l)))
fi
if ((LEGACY_COUNT > 0)); then
# Show summary to user
local MSG="Legacy APT sources found:\n"
[[ -f "$listfile" ]] && MSG+=" - /etc/apt/sources.list\n"
[[ -n "$list_files" ]] && MSG+="$(echo "$list_files" | sed 's|^| - |')\n"
MSG+="\nDo you want to disable (comment out/rename) all legacy sources and use ONLY deb822 .sources format?\n\nRecommended for Proxmox VE 9."
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Disable legacy sources?" \
--yesno "$MSG" 18 80
if [[ $? -eq 0 ]]; then
# Backup and disable sources.list
if [[ -f "$listfile" ]] && grep -qE '^\s*deb ' "$listfile"; then
cp "$listfile" "$listfile.bak"
sed -i '/^\s*deb /s/^/# Disabled by Proxmox Helper Script /' "$listfile"
msg_ok "Disabled entries in sources.list (backup: sources.list.bak)"
fi
# Rename all .list files to .list.bak
if [[ -n "$list_files" ]]; then
while IFS= read -r f; do
mv "$f" "$f.bak"
done <<<"$list_files"
msg_ok "Renamed legacy .list files to .bak"
fi
else
msg_error "Kept legacy sources as-is (may cause APT warnings)"
fi
fi
}
check_and_disable_legacy_sources
# === Trixie/9.x: deb822 .sources ===
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SOURCES" --menu \
"The package manager will use the correct sources to update and install packages on your Proxmox VE 9 server.\n\nMigrate to deb822 sources format?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Correcting Proxmox VE Sources (deb822)"
# remove all existing .list files
rm -f /etc/apt/sources.list.d/*.list
# remove bookworm and proxmox entries from sources.list
sed -i '/proxmox/d;/bookworm/d' /etc/apt/sources.list || true
# Create new deb822 sources
cat >/etc/apt/sources.list.d/debian.sources <<EOF
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://security.debian.org/debian-security
Suites: trixie-security
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie-updates
Components: main contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
msg_ok "Corrected Proxmox VE 9 (Trixie) Sources"
;;
no) msg_error "Selected no to Correcting Proxmox VE Sources" ;;
esac
fi
# ---- PVE-ENTERPRISE ----
if component_exists_in_sources "pve-enterprise"; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "PVE-ENTERPRISE" \
--menu "'pve-enterprise' repository already exists.\n\nWhat do you want to do?" 14 58 2 \
"keep" "Keep as is" \
"disable" "Comment out (disable) this repo" \
"delete" "Delete this repo file" \
3>&2 2>&1 1>&3)
case $CHOICE in
keep)
msg_ok "Kept 'pve-enterprise' repository"
;;
disable)
msg_info "Disabling (commenting) 'pve-enterprise' repository"
# Comment out every non-comment line in the file that has 'pve-enterprise' in Components
for file in /etc/apt/sources.list.d/*.sources; do
if grep -q "Components:.*pve-enterprise" "$file"; then
sed -i '/^\s*Types:/,/^$/s/^\([^#].*\)$/# \1/' "$file"
fi
done
msg_ok "Disabled 'pve-enterprise' repository"
;;
delete)
msg_info "Deleting 'pve-enterprise' repository file"
for file in /etc/apt/sources.list.d/*.sources; do
if grep -q "Components:.*pve-enterprise" "$file"; then
rm -f "$file"
fi
done
msg_ok "Deleted 'pve-enterprise' repository file"
;;
esac
else
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "PVE-ENTERPRISE" \
--menu "The 'pve-enterprise' repository is only available to users who have purchased a Proxmox VE subscription.\n\nAdd 'pve-enterprise' repository (deb822)?" 14 58 2 \
"no" " " \
"yes" " " \
--default-item "no" \
3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Adding 'pve-enterprise' repository (deb822)"
cat >/etc/apt/sources.list.d/pve-enterprise.sources <<EOF
Types: deb
URIs: https://enterprise.proxmox.com/debian/pve
Suites: trixie
Components: pve-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'pve-enterprise' repository"
;;
no) msg_error "Selected no to Adding 'pve-enterprise' repository" ;;
esac
fi
# ---- CEPH-ENTERPRISE ----
if grep -q "enterprise.proxmox.com.*ceph" /etc/apt/sources.list.d/*.sources 2>/dev/null; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "CEPH-ENTERPRISE" \
--menu "'ceph enterprise' repository already exists.\n\nWhat do you want to do?" 14 58 2 \
"keep" "Keep as is" \
"disable" "Comment out (disable) this repo" \
"delete" "Delete this repo file" \
3>&2 2>&1 1>&3)
case $CHOICE in
keep)
msg_ok "Kept 'ceph enterprise' repository"
;;
disable)
msg_info "Disabling (commenting) 'ceph enterprise' repository"
for file in /etc/apt/sources.list.d/*.sources; do
if grep -q "enterprise.proxmox.com.*ceph" "$file"; then
sed -i '/^\s*Types:/,/^$/s/^\([^#].*\)$/# \1/' "$file"
fi
done
msg_ok "Disabled 'ceph enterprise' repository"
;;
delete)
msg_info "Deleting 'ceph enterprise' repository file"
for file in /etc/apt/sources.list.d/*.sources; do
if grep -q "enterprise.proxmox.com.*ceph" "$file"; then
rm -f "$file"
fi
done
msg_ok "Deleted 'ceph enterprise' repository file"
;;
esac
fi
# ---- PVE-NO-SUBSCRIPTION ----
REPO_FILE=""
REPO_ACTIVE=0
REPO_COMMENTED=0
for file in /etc/apt/sources.list.d/*.sources; do
if grep -q "Components:.*pve-no-subscription" "$file"; then
REPO_FILE="$file"
if grep -E '^[^#]*Components:.*pve-no-subscription' "$file" >/dev/null; then
REPO_ACTIVE=1
elif grep -E '^#.*Components:.*pve-no-subscription' "$file" >/dev/null; then
REPO_COMMENTED=1
fi
break
fi
done
if [[ "$REPO_ACTIVE" -eq 1 ]]; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "PVE-NO-SUBSCRIPTION" \
--menu "'pve-no-subscription' repository is currently ENABLED.\n\nWhat do you want to do?" 14 58 3 \
"keep" "Keep as is" \
"disable" "Comment out (disable)" \
"delete" "Delete repo file" \
3>&2 2>&1 1>&3)
case $CHOICE in
keep)
msg_ok "Kept 'pve-no-subscription' repository"
;;
disable)
msg_info "Disabling (commenting) 'pve-no-subscription' repository"
sed -i '/^\s*Types:/,/^$/s/^\([^#].*\)$/# \1/' "$REPO_FILE"
msg_ok "Disabled 'pve-no-subscription' repository"
;;
delete)
msg_info "Deleting 'pve-no-subscription' repository file"
rm -f "$REPO_FILE"
msg_ok "Deleted 'pve-no-subscription' repository file"
;;
esac
elif [[ "$REPO_COMMENTED" -eq 1 ]]; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "PVE-NO-SUBSCRIPTION" \
--menu "'pve-no-subscription' repository is currently DISABLED (commented out).\n\nWhat do you want to do?" 14 58 3 \
"enable" "Uncomment (enable)" \
"keep" "Keep disabled" \
"delete" "Delete repo file" \
3>&2 2>&1 1>&3)
case $CHOICE in
enable)
msg_info "Enabling (uncommenting) 'pve-no-subscription' repository"
sed -i '/^#\s*Types:/,/^$/s/^#\s*//' "$REPO_FILE"
msg_ok "Enabled 'pve-no-subscription' repository"
;;
keep)
msg_ok "Kept 'pve-no-subscription' repository disabled"
;;
delete)
msg_info "Deleting 'pve-no-subscription' repository file"
rm -f "$REPO_FILE"
msg_ok "Deleted 'pve-no-subscription' repository file"
;;
esac
else
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-NO-SUBSCRIPTION" \
--menu "The 'pve-no-subscription' repository provides access to all of the open-source components of Proxmox VE.\n\nAdd 'pve-no-subscription' repository (deb822)?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Adding 'pve-no-subscription' repository (deb822)"
cat >/etc/apt/sources.list.d/proxmox.sources <<EOF
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'pve-no-subscription' repository"
;;
no) msg_error "Selected no to Adding 'pve-no-subscription' repository" ;;
esac
fi
# ---- CEPH ----
if component_exists_in_sources "no-subscription"; then
msg_ok "'ceph' package repository (no-subscription) already exists (skipped)"
else
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CEPH PACKAGE REPOSITORIES" \
--menu "The 'Ceph Package Repositories' provides access to both the 'no-subscription' and 'enterprise' repositories (deb822).\n\nAdd 'ceph package sources?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Adding 'ceph package repositories' (deb822)"
cat >/etc/apt/sources.list.d/ceph.sources <<EOF
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'ceph package repositories'"
;;
no)
msg_error "Selected no to Adding 'ceph package repositories'"
find /etc/apt/sources.list.d/ -type f \( -name "*.sources" -o -name "*.list" \) \
-exec sed -i '/enterprise.proxmox.com.*ceph/s/^/# /' {} \;
msg_ok "Disabled all Ceph Enterprise repositories"
;;
esac
fi
# ---- PVETEST ----
if component_exists_in_sources "pvetest"; then
msg_ok "'pvetest' repository already exists (skipped)"
else
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVETEST" \
--menu "The 'pvetest' repository can give advanced users access to new features and updates before they are officially released.\n\nAdd (Disabled) 'pvetest' repository (deb822)?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
case $CHOICE in
yes)
msg_info "Adding 'pvetest' repository (deb822, disabled)"
cat >/etc/apt/sources.list.d/pvetest.sources <<EOF
# Types: deb
# URIs: http://download.proxmox.com/debian/pve
# Suites: trixie
# Components: pvetest
# Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
msg_ok "Added 'pvetest' repository"
;;
no) msg_error "Selected no to Adding 'pvetest' repository" ;;
esac
fi
post_routines_common
}
post_routines_common() {
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
@ -140,7 +514,7 @@ EOF
yes)
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
msg_info "Disabling subscription nag"
echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script
echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then echo 'Removing subscription nag from UI...'; sed -i '/data\.status/{s/\\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi\" };" >/etc/apt/apt.conf.d/no-nag-script
msg_ok "Disabled subscription nag (Delete browser cache)"
;;
no)
@ -149,8 +523,7 @@ EOF
rm /etc/apt/apt.conf.d/no-nag-script 2>/dev/null
;;
esac
apt --reinstall install proxmox-widget-toolkit &>/dev/null
apt --reinstall install proxmox-widget-toolkit &>/dev/null || msg_error "Widget toolkit reinstall failed"
if ! systemctl is-active --quiet pve-ha-lrm; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "Enable high availability?" 10 58 2 \
"yes" " " \
@ -163,9 +536,7 @@ EOF
systemctl enable -q --now corosync
msg_ok "Enabled high availability"
;;
no)
msg_error "Selected no to Enabling high availability"
;;
no) msg_error "Selected no to Enabling high availability" ;;
esac
fi
@ -188,14 +559,10 @@ EOF
systemctl disable -q --now corosync
msg_ok "Disabled Corosync"
;;
no)
msg_error "Selected no to Disabling Corosync"
;;
no) msg_error "Selected no to Disabling Corosync" ;;
esac
;;
no)
msg_error "Selected no to Disabling high availability"
;;
no) msg_error "Selected no to Disabling high availability" ;;
esac
fi
@ -205,15 +572,24 @@ EOF
case $CHOICE in
yes)
msg_info "Updating Proxmox VE (Patience)"
apt-get update &>/dev/null
apt-get -y dist-upgrade &>/dev/null
apt update &>/dev/null || msg_error "apt update failed"
apt -y dist-upgrade &>/dev/null || msg_error "apt dist-upgrade failed"
msg_ok "Updated Proxmox VE"
;;
no)
msg_error "Selected no to Updating Proxmox VE"
;;
no) msg_error "Selected no to Updating Proxmox VE" ;;
esac
# Final message for all hosts in cluster and browser cache
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Post-Install Reminder" --msgbox \
"IMPORTANT:
If you have multiple Proxmox VE hosts in a cluster, please make sure to run this script on every node individually.
After completing these steps, it is strongly recommended to REBOOT your node.
After the upgrade or post-install routines, always clear your browser cache or perform a hard reload (Ctrl+Shift+R) before using the Proxmox VE Web UI to avoid UI display issues.
" 20 80
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "REBOOT" --menu "\nReboot Proxmox VE now? (recommended)" 11 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
@ -231,26 +607,4 @@ EOF
esac
}
header_info
echo -e "\nThis script will Perform Post Install Routines.\n"
while true; do
read -p "Start the Proxmox VE Post Install Script (y/n)?" yn
case $yn in
[Yy]*) break ;;
[Nn]*)
clear
exit
;;
*) echo "Please answer yes or no." ;;
esac
done
if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then
msg_error "This version of Proxmox Virtual Environment is not supported"
echo -e "Requires Proxmox Virtual Environment Version 8.0 or later."
echo -e "Exiting..."
sleep 2
exit
fi
start_routines
main