mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-18 19:15:55 +01:00
Compare commits
84 Commits
tremor021-
...
automated/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13e8d4884b | ||
|
|
be26dc33dd | ||
|
|
b439960222 | ||
|
|
b4a5d28957 | ||
|
|
eaa69d58be | ||
|
|
3ffff334a0 | ||
|
|
38f04f4dcc | ||
|
|
fdbcee3a93 | ||
|
|
ce11ba8f27 | ||
|
|
43a0a078f5 | ||
|
|
646dabf0f0 | ||
|
|
2582c1f63b | ||
|
|
3ce3c6f613 | ||
|
|
97652792be | ||
|
|
f07f2cb04e | ||
|
|
5f73f9d5e6 | ||
|
|
0183ae0fff | ||
|
|
32d1937a74 | ||
|
|
0a7bd20b06 | ||
|
|
c9ecb1ccca | ||
|
|
d274a269b5 | ||
|
|
cbee9d64b5 | ||
|
|
ffcda217e3 | ||
|
|
438d5d6b94 | ||
|
|
104366bc64 | ||
|
|
9dab79f8ca | ||
|
|
2dddeaf966 | ||
|
|
fae06a3a58 | ||
|
|
137272c354 | ||
|
|
52a9e23401 | ||
|
|
c2333de180 | ||
|
|
ad8974894b | ||
|
|
38af4be5ba | ||
|
|
80ae1f34fa | ||
|
|
06bc6e20d5 | ||
|
|
4418e72856 | ||
|
|
896714e06f | ||
|
|
96389a02cb | ||
|
|
a4e6286260 | ||
|
|
a6617cc6a1 | ||
|
|
f1377e6cb0 | ||
|
|
56cff01240 | ||
|
|
26ba17c8c3 | ||
|
|
2bd4b063d9 | ||
|
|
40bd7dc366 | ||
|
|
a81ebcb16c | ||
|
|
cebdbcc35d | ||
|
|
42475ed4f6 | ||
|
|
11eba0093f | ||
|
|
f6e535c7b7 | ||
|
|
58329f99ea | ||
|
|
558220fb0e | ||
|
|
61aee12a82 | ||
|
|
215c441129 | ||
|
|
32afe0c2e4 | ||
|
|
73ee5f8f19 | ||
|
|
34db7c652f | ||
|
|
c5c6e660ba | ||
|
|
ae8dd5ba36 | ||
|
|
c975b25ad5 | ||
|
|
4e3ee020e4 | ||
|
|
90ce773247 | ||
|
|
704f8d7e10 | ||
|
|
d7fbbbde0f | ||
|
|
2edd2ffaf8 | ||
|
|
cba1a0bb6b | ||
|
|
97bc69452d | ||
|
|
4257954cfa | ||
|
|
39354352ff | ||
|
|
652920ee49 | ||
|
|
057bdefcc0 | ||
|
|
74b2a29d37 | ||
|
|
607e868328 | ||
|
|
9839bfb5a9 | ||
|
|
983e0f39ca | ||
|
|
8afbf73be0 | ||
|
|
1ca59363ea | ||
|
|
f5180606b3 | ||
|
|
de4857cf53 | ||
|
|
d63c0362bb | ||
|
|
b647868cb5 | ||
|
|
2bae310cc3 | ||
|
|
98b6c59986 | ||
|
|
f4e7edd51d |
3
.github/workflows/autolabeler.yml
generated
vendored
3
.github/workflows/autolabeler.yml
generated
vendored
@@ -100,7 +100,8 @@ jobs:
|
|||||||
// If it's an update script PR with json changes and a content label, skip adding website/json
|
// If it's an update script PR with json changes and a content label, skip adding website/json
|
||||||
// The PR should be categorized as update script with the content label
|
// The PR should be categorized as update script with the content label
|
||||||
if (!(hasUpdateScript && hasJson && hasContentLabel)) {
|
if (!(hasUpdateScript && hasJson && hasContentLabel)) {
|
||||||
labelsToAdd.add(hasJson ? "json" : "website");
|
labelsToAdd.add("website");
|
||||||
|
if (hasJson) labelsToAdd.add("json");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
100
CHANGELOG.md
100
CHANGELOG.md
@@ -404,14 +404,112 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-02-18
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: Execution ID & Telemetry Improvements [@MickLesk](https://github.com/MickLesk) ([#12041](https://github.com/community-scripts/ProxmoxVE/pull/12041))
|
||||||
|
|
||||||
|
## 2026-02-17
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Databasus ([#12018](https://github.com/community-scripts/ProxmoxVE/pull/12018))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [Hotfix] Cleanuparr: backup config before update [@vhsdream](https://github.com/vhsdream) ([#12039](https://github.com/community-scripts/ProxmoxVE/pull/12039))
|
||||||
|
- fix: pterodactyl-panel add symlink [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11997](https://github.com/community-scripts/ProxmoxVE/pull/11997))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: call get_lxc_ip in start() before updates [@MickLesk](https://github.com/MickLesk) ([#12015](https://github.com/community-scripts/ProxmoxVE/pull/12015))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools/pve: add data analytics / formatting / linting [@MickLesk](https://github.com/MickLesk) ([#12034](https://github.com/community-scripts/ProxmoxVE/pull/12034))
|
||||||
|
- core: smart recovery for failed installs | extend exit_codes [@MickLesk](https://github.com/MickLesk) ([#11221](https://github.com/community-scripts/ProxmoxVE/pull/11221))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: error-handler improvements | better exit_code handling | better tools.func source check [@MickLesk](https://github.com/MickLesk) ([#12019](https://github.com/community-scripts/ProxmoxVE/pull/12019))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Immich Public Proxy: centralize and fix systemd service creation [@MickLesk](https://github.com/MickLesk) ([#12025](https://github.com/community-scripts/ProxmoxVE/pull/12025))
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
|
||||||
|
- fix contribution/setup-fork [@andreasabeck](https://github.com/andreasabeck) ([#12047](https://github.com/community-scripts/ProxmoxVE/pull/12047))
|
||||||
|
|
||||||
|
## 2026-02-16
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- RomM ([#11987](https://github.com/community-scripts/ProxmoxVE/pull/11987))
|
||||||
|
- LinkDing ([#11976](https://github.com/community-scripts/ProxmoxVE/pull/11976))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Opencloud: Pin version to 5.1.0 [@vhsdream](https://github.com/vhsdream) ([#12004](https://github.com/community-scripts/ProxmoxVE/pull/12004))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Tududi: Fix sed command for DB_FILE configuration [@tremor021](https://github.com/tremor021) ([#11988](https://github.com/community-scripts/ProxmoxVE/pull/11988))
|
||||||
|
- slskd: fix exit position [@MickLesk](https://github.com/MickLesk) ([#11963](https://github.com/community-scripts/ProxmoxVE/pull/11963))
|
||||||
|
- cryptpad: restore config earlier and run onlyoffice upgrade [@MickLesk](https://github.com/MickLesk) ([#11964](https://github.com/community-scripts/ProxmoxVE/pull/11964))
|
||||||
|
- jellyseerr/overseerr: Migrate update script to Seerr; prompt rerun [@MickLesk](https://github.com/MickLesk) ([#11965](https://github.com/community-scripts/ProxmoxVE/pull/11965))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core/vm's: ensure script state is sent on script exit [@MickLesk](https://github.com/MickLesk) ([#11991](https://github.com/community-scripts/ProxmoxVE/pull/11991))
|
||||||
|
- Vaultwarden: export VW_VERSION as version number [@MickLesk](https://github.com/MickLesk) ([#11966](https://github.com/community-scripts/ProxmoxVE/pull/11966))
|
||||||
|
- Zabbix: Improve zabbix-agent service detection [@MickLesk](https://github.com/MickLesk) ([#11968](https://github.com/community-scripts/ProxmoxVE/pull/11968))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: ensure /usr/local/bin PATH persists for pct enter sessions [@MickLesk](https://github.com/MickLesk) ([#11970](https://github.com/community-scripts/ProxmoxVE/pull/11970))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: remove duplicate error handler from alpine-install.func [@MickLesk](https://github.com/MickLesk) ([#11971](https://github.com/community-scripts/ProxmoxVE/pull/11971))
|
||||||
|
|
||||||
|
### 📂 Github
|
||||||
|
|
||||||
|
- github: add "website" label if "json" changed [@MickLesk](https://github.com/MickLesk) ([#11975](https://github.com/community-scripts/ProxmoxVE/pull/11975))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 📝 Script Information
|
||||||
|
|
||||||
|
- Update Wishlist LXC webpage to include reverse proxy info [@summoningpixels](https://github.com/summoningpixels) ([#11973](https://github.com/community-scripts/ProxmoxVE/pull/11973))
|
||||||
|
- Update OpenCloud LXC webpage to include services ports [@summoningpixels](https://github.com/summoningpixels) ([#11969](https://github.com/community-scripts/ProxmoxVE/pull/11969))
|
||||||
|
|
||||||
## 2026-02-15
|
## 2026-02-15
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|
||||||
- add: seer script and migrations [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11930](https://github.com/community-scripts/ProxmoxVE/pull/11930))
|
- ebusd ([#11942](https://github.com/community-scripts/ProxmoxVE/pull/11942))
|
||||||
|
- add: seer script and migrations [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11930](https://github.com/community-scripts/ProxmoxVE/pull/11930))
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Fix seerr URL in jellyseerr script [@lucacome](https://github.com/lucacome) ([#11951](https://github.com/community-scripts/ProxmoxVE/pull/11951))
|
||||||
|
- Fix jellyseer and overseer script replacement [@lucacome](https://github.com/lucacome) ([#11949](https://github.com/community-scripts/ProxmoxVE/pull/11949))
|
||||||
|
- Tautulli: Add setuptools < 81 [@tremor021](https://github.com/tremor021) ([#11943](https://github.com/community-scripts/ProxmoxVE/pull/11943))
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
- Refactor: Patchmon [@vhsdream](https://github.com/vhsdream) ([#11888](https://github.com/community-scripts/ProxmoxVE/pull/11888))
|
- Refactor: Patchmon [@vhsdream](https://github.com/vhsdream) ([#11888](https://github.com/community-scripts/ProxmoxVE/pull/11888))
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set +o pipefail && RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | head -1) && set -o pipefail
|
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | awk 'NR==1')
|
||||||
|
|
||||||
if [ "${RELEASE}" != "$(cat ~/.teamspeak-server)" ] || [ ! -f ~/.teamspeak-server ]; then
|
if [ "${RELEASE}" != "$(cat ~/.teamspeak-server)" ] || [ ! -f ~/.teamspeak-server ]; then
|
||||||
msg_info "Updating ${APP} LXC"
|
msg_info "Updating ${APP} LXC"
|
||||||
|
|||||||
@@ -32,8 +32,17 @@ function update_script() {
|
|||||||
systemctl stop cleanuparr
|
systemctl stop cleanuparr
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Backing up config"
|
||||||
|
cp -r /opt/cleanuparr/config /opt/cleanuparr_config_backup
|
||||||
|
msg_ok "Backed up config"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-amd64.zip"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-amd64.zip"
|
||||||
|
|
||||||
|
msg_info "Restoring config"
|
||||||
|
[[ -d /opt/cleanuparr/config ]] && rm -rf /opt/cleanuparr/config
|
||||||
|
mv /opt/cleanuparr_config_backup /opt/cleanuparr/config
|
||||||
|
msg_ok "Restored config"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start cleanuparr
|
systemctl start cleanuparr
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
@@ -39,17 +39,20 @@ function update_script() {
|
|||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cryptpad" "cryptpad/cryptpad" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cryptpad" "cryptpad/cryptpad" "tarball"
|
||||||
|
|
||||||
|
msg_info "Restoring configuration"
|
||||||
|
mv /opt/config.js /opt/cryptpad/config/
|
||||||
|
msg_ok "Configuration restored"
|
||||||
|
|
||||||
msg_info "Updating CryptaPad"
|
msg_info "Updating CryptaPad"
|
||||||
cd /opt/cryptpad
|
cd /opt/cryptpad
|
||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run install:components
|
$STD npm run install:components
|
||||||
|
if [ -f "/opt/cryptpad/install-onlyoffice.sh" ]; then
|
||||||
|
$STD bash /opt/cryptpad/install-onlyoffice.sh --accept-license
|
||||||
|
fi
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
msg_ok "Updated CryptaPad"
|
msg_ok "Updated CryptaPad"
|
||||||
|
|
||||||
msg_info "Restoring configuration"
|
|
||||||
mv /opt/config.js /opt/cryptpad/config/
|
|
||||||
msg_ok "Configuration restored"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start cryptpad
|
systemctl start cryptpad
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
78
ct/databasus.sh
Normal file
78
ct/databasus.sh
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/databasus/databasus
|
||||||
|
|
||||||
|
APP="Databasus"
|
||||||
|
var_tags="${var_tags:-backup;postgresql;database}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -f /opt/databasus/databasus ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "databasus" "databasus/databasus"; then
|
||||||
|
msg_info "Stopping Databasus"
|
||||||
|
$STD systemctl stop databasus
|
||||||
|
msg_ok "Stopped Databasus"
|
||||||
|
|
||||||
|
msg_info "Backing up Configuration"
|
||||||
|
cp /opt/databasus/.env /opt/databasus.env.bak
|
||||||
|
msg_ok "Backed up Configuration"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||||
|
|
||||||
|
msg_info "Updating Databasus"
|
||||||
|
cd /opt/databasus/frontend
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build
|
||||||
|
cd /opt/databasus/backend
|
||||||
|
$STD go mod download
|
||||||
|
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||||
|
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
||||||
|
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
||||||
|
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
||||||
|
cp -r /opt/databasus/backend/migrations /opt/databasus/
|
||||||
|
chown -R postgres:postgres /opt/databasus
|
||||||
|
msg_ok "Updated Databasus"
|
||||||
|
|
||||||
|
msg_info "Restoring Configuration"
|
||||||
|
cp /opt/databasus.env.bak /opt/databasus/.env
|
||||||
|
rm -f /opt/databasus.env.bak
|
||||||
|
chown postgres:postgres /opt/databasus/.env
|
||||||
|
msg_ok "Restored Configuration"
|
||||||
|
|
||||||
|
msg_info "Starting Databasus"
|
||||||
|
$STD systemctl start databasus
|
||||||
|
msg_ok "Started Databasus"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
50
ct/ebusd.sh
Normal file
50
ct/ebusd.sh
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Joerg Heinemann (heinemannj)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/john30/ebusd
|
||||||
|
|
||||||
|
APP="ebusd"
|
||||||
|
var_tags="${var_tags:-automation}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /etc/default/ebusd ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "ebusd" "john30/ebusd"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop ebusd
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "ebusd" "john30/ebusd" "binary" "latest" "/opt/ebusd" "ebusd-*_amd64-trixie_mqtt1.deb"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start ebusd
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
6
ct/headers/databasus
Normal file
6
ct/headers/databasus
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ __ __
|
||||||
|
/ __ \____ _/ /_____ _/ /_ ____ ________ _______
|
||||||
|
/ / / / __ `/ __/ __ `/ __ \/ __ `/ ___/ / / / ___/
|
||||||
|
/ /_/ / /_/ / /_/ /_/ / /_/ / /_/ (__ ) /_/ (__ )
|
||||||
|
/_____/\__,_/\__/\__,_/_.___/\__,_/____/\__,_/____/
|
||||||
|
|
||||||
6
ct/headers/ebusd
Normal file
6
ct/headers/ebusd
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ __
|
||||||
|
___ / /_ __ ___________/ /
|
||||||
|
/ _ \/ __ \/ / / / ___/ __ /
|
||||||
|
/ __/ /_/ / /_/ (__ ) /_/ /
|
||||||
|
\___/_.___/\__,_/____/\__,_/
|
||||||
|
|
||||||
6
ct/headers/linkding
Normal file
6
ct/headers/linkding
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
___ __ ___
|
||||||
|
/ (_)___ / /______/ (_)___ ____ _
|
||||||
|
/ / / __ \/ //_/ __ / / __ \/ __ `/
|
||||||
|
/ / / / / / ,< / /_/ / / / / / /_/ /
|
||||||
|
/_/_/_/ /_/_/|_|\__,_/_/_/ /_/\__, /
|
||||||
|
/____/
|
||||||
6
ct/headers/romm
Normal file
6
ct/headers/romm
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ __ ___
|
||||||
|
/ __ \____ ____ ___ / |/ /
|
||||||
|
/ /_/ / __ \/ __ `__ \/ /|_/ /
|
||||||
|
/ _, _/ /_/ / / / / / / / / /
|
||||||
|
/_/ |_|\____/_/ /_/ /_/_/ /_/
|
||||||
|
|
||||||
@@ -45,9 +45,14 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Switching update script to Seerr"
|
msg_info "Switching update script to Seerr"
|
||||||
sed -i 's|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/jellyseerr.sh|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/seerr.sh|g' /usr/bin/update
|
cat <<'EOF' >/usr/bin/update
|
||||||
msg_ok "Switched update script to Seerr. Running update..."
|
#!/usr/bin/env bash
|
||||||
exec /usr/bin/update
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/seerr.sh)"
|
||||||
|
EOF
|
||||||
|
chmod +x /usr/bin/update
|
||||||
|
msg_ok "Switched update script to Seerr"
|
||||||
|
msg_warn "Please type 'update' again to complete the migration"
|
||||||
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating Jellyseerr"
|
msg_info "Updating Jellyseerr"
|
||||||
|
|||||||
79
ct/linkding.sh
Normal file
79
ct/linkding.sh
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (MickLesk)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://linkding.link/
|
||||||
|
|
||||||
|
APP="linkding"
|
||||||
|
var_tags="${var_tags:-bookmarks;management}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/linkding ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "linkding" "sissbruecker/linkding"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop nginx linkding linkding-tasks
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp -r /opt/linkding/data /opt/linkding_data_backup
|
||||||
|
cp /opt/linkding/.env /opt/linkding_env_backup
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp -r /opt/linkding_data_backup/. /opt/linkding/data
|
||||||
|
cp /opt/linkding_env_backup /opt/linkding/.env
|
||||||
|
rm -rf /opt/linkding_data_backup /opt/linkding_env_backup
|
||||||
|
ln -sf /usr/lib/x86_64-linux-gnu/mod_icu.so /opt/linkding/libicu.so
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Updating LinkDing"
|
||||||
|
cd /opt/linkding
|
||||||
|
rm -f bookmarks/settings/dev.py
|
||||||
|
touch bookmarks/settings/custom.py
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build
|
||||||
|
$STD uv sync --no-dev --frozen
|
||||||
|
$STD uv pip install gunicorn
|
||||||
|
set -a && source /opt/linkding/.env && set +a
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py migrate
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py collectstatic --no-input
|
||||||
|
msg_ok "Updated LinkDing"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start nginx linkding linkding-tasks
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9090${CL}"
|
||||||
@@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v5.0.2"
|
RELEASE="v5.1.0"
|
||||||
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
||||||
msg_info "Stopping services"
|
msg_info "Stopping services"
|
||||||
systemctl stop opencloud opencloud-wopi
|
systemctl stop opencloud opencloud-wopi
|
||||||
|
|||||||
@@ -44,9 +44,14 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Switching update script to Seerr"
|
msg_info "Switching update script to Seerr"
|
||||||
sed -i 's|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/overseerr.sh|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/seerr.sh|g' /usr/bin/update
|
cat <<'EOF' >/usr/bin/update
|
||||||
msg_ok "Switched update script to Seerr. Running update..."
|
#!/usr/bin/env bash
|
||||||
exec /usr/bin/update
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/seerr.sh)"
|
||||||
|
EOF
|
||||||
|
chmod +x /usr/bin/update
|
||||||
|
msg_ok "Switched update script to Seerr"
|
||||||
|
msg_warn "Please type 'update' again to complete the migration"
|
||||||
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "overseerr" "sct/overseerr"; then
|
if check_for_gh_release "overseerr" "sct/overseerr"; then
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ EOF
|
|||||||
$STD php artisan migrate --seed --force --no-interaction
|
$STD php artisan migrate --seed --force --no-interaction
|
||||||
chown -R www-data:www-data /opt/pterodactyl-panel/*
|
chown -R www-data:www-data /opt/pterodactyl-panel/*
|
||||||
chmod -R 755 /opt/pterodactyl-panel/storage /opt/pterodactyl-panel/bootstrap/cache/
|
chmod -R 755 /opt/pterodactyl-panel/storage /opt/pterodactyl-panel/bootstrap/cache/
|
||||||
|
ln -s /opt/pterodactyl-panel /var/www/pterodactyl
|
||||||
rm -rf "/opt/pterodactyl-panel/panel.tar.gz"
|
rm -rf "/opt/pterodactyl-panel/panel.tar.gz"
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
msg_ok "Updated $APP to v${RELEASE}"
|
||||||
|
|||||||
74
ct/romm.sh
Normal file
74
ct/romm.sh
Normal file
@@ -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-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ) | DevelopmentCats | AlphaLawless
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://romm.app
|
||||||
|
|
||||||
|
APP="RomM"
|
||||||
|
var_tags="${var_tags:-emulation}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-20}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/romm ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "romm" "rommapp/romm"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop romm-backend romm-worker romm-scheduler romm-watcher
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
msg_info "Backing up configuration"
|
||||||
|
cp /opt/romm/.env /opt/romm/.env.backup
|
||||||
|
msg_ok "Backed up configuration"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball" "latest" "/opt/romm"
|
||||||
|
|
||||||
|
msg_info "Updating ROMM"
|
||||||
|
cp /opt/romm/.env.backup /opt/romm/.env
|
||||||
|
cd /opt/romm
|
||||||
|
$STD uv sync --all-extras
|
||||||
|
cd /opt/romm/backend
|
||||||
|
$STD uv run alembic upgrade head
|
||||||
|
cd /opt/romm/frontend
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
# Merge static assets into dist folder
|
||||||
|
cp -rf /opt/romm/frontend/assets/* /opt/romm/frontend/dist/assets/
|
||||||
|
mkdir -p /opt/romm/frontend/dist/assets/romm
|
||||||
|
ln -sfn /var/lib/romm/resources /opt/romm/frontend/dist/assets/romm/resources
|
||||||
|
ln -sfn /var/lib/romm/assets /opt/romm/frontend/dist/assets/romm/assets
|
||||||
|
msg_ok "Updated ROMM"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start romm-backend romm-worker romm-scheduler romm-watcher
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
@@ -83,6 +83,7 @@ function update_script() {
|
|||||||
msg_ok "Started Soularr Timer"
|
msg_ok "Started Soularr Timer"
|
||||||
msg_ok "Updated Soularr successfully!"
|
msg_ok "Updated Soularr successfully!"
|
||||||
fi
|
fi
|
||||||
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
||||||
cd /tmp/vaultwarden-src
|
cd /tmp/vaultwarden-src
|
||||||
|
VW_VERSION="$VAULT"
|
||||||
|
export VW_VERSION
|
||||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||||
if [[ -f /usr/bin/vaultwarden ]]; then
|
if [[ -f /usr/bin/vaultwarden ]]; then
|
||||||
cp target/release/vaultwarden /usr/bin/
|
cp target/release/vaultwarden /usr/bin/
|
||||||
|
|||||||
15
ct/zabbix.sh
15
ct/zabbix.sh
@@ -35,15 +35,18 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if systemctl list-unit-files | grep -q zabbix-agent2.service; then
|
if systemctl cat zabbix-agent2.service &>/dev/null; then
|
||||||
AGENT_SERVICE="zabbix-agent2"
|
AGENT_SERVICE="zabbix-agent2"
|
||||||
else
|
elif systemctl cat zabbix-agent.service &>/dev/null; then
|
||||||
AGENT_SERVICE="zabbix-agent"
|
AGENT_SERVICE="zabbix-agent"
|
||||||
|
else
|
||||||
|
AGENT_SERVICE=""
|
||||||
|
msg_warn "No Zabbix Agent service found, skipping agent actions"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop zabbix-server
|
systemctl stop zabbix-server
|
||||||
systemctl stop "$AGENT_SERVICE"
|
[[ -n "$AGENT_SERVICE" ]] && systemctl stop "$AGENT_SERVICE"
|
||||||
msg_ok "Stopped Services"
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE
|
read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE
|
||||||
@@ -83,13 +86,13 @@ function update_script() {
|
|||||||
|
|
||||||
$STD apt install --only-upgrade zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql
|
$STD apt install --only-upgrade zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql
|
||||||
|
|
||||||
if [ "$AGENT_SERVICE" = "zabbix-agent2" ]; then
|
if [[ "$AGENT_SERVICE" == "zabbix-agent2" ]]; then
|
||||||
$STD apt install --only-upgrade zabbix-agent2 zabbix-agent2-plugin-postgresql
|
$STD apt install --only-upgrade zabbix-agent2 zabbix-agent2-plugin-postgresql
|
||||||
if [ -f /etc/zabbix/zabbix_agent2.d/plugins.d/nvidia.conf ]; then
|
if [ -f /etc/zabbix/zabbix_agent2.d/plugins.d/nvidia.conf ]; then
|
||||||
sed -i 's|^Plugins.NVIDIA.System.Path=.*|# Plugins.NVIDIA.System.Path=/usr/libexec/zabbix/zabbix-agent2-plugin-nvidia-gpu|' \
|
sed -i 's|^Plugins.NVIDIA.System.Path=.*|# Plugins.NVIDIA.System.Path=/usr/libexec/zabbix/zabbix-agent2-plugin-nvidia-gpu|' \
|
||||||
/etc/zabbix/zabbix_agent2.d/plugins.d/nvidia.conf
|
/etc/zabbix/zabbix_agent2.d/plugins.d/nvidia.conf
|
||||||
fi
|
fi
|
||||||
else
|
elif [[ "$AGENT_SERVICE" == "zabbix-agent" ]]; then
|
||||||
$STD apt install --only-upgrade zabbix-agent
|
$STD apt install --only-upgrade zabbix-agent
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -105,7 +108,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Starting Services"
|
msg_info "Starting Services"
|
||||||
systemctl start zabbix-server
|
systemctl start zabbix-server
|
||||||
systemctl start "$AGENT_SERVICE"
|
[[ -n "$AGENT_SERVICE" ]] && systemctl start "$AGENT_SERVICE"
|
||||||
systemctl restart apache2
|
systemctl restart apache2
|
||||||
msg_ok "Started Services"
|
msg_ok "Started Services"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ update_links() {
|
|||||||
# Find all files containing the old repo reference
|
# Find all files containing the old repo reference
|
||||||
while IFS= read -r file; do
|
while IFS= read -r file; do
|
||||||
# Count occurrences
|
# Count occurrences
|
||||||
local count=$(grep -c "github.com/$old_repo/$old_name" "$file" 2>/dev/null || echo 0)
|
local count=$(grep -E -c "(github.com|githubusercontent.com)/$old_repo/$old_name" "$file" 2>/dev/null || echo 0)
|
||||||
|
|
||||||
if [[ $count -gt 0 ]]; then
|
if [[ $count -gt 0 ]]; then
|
||||||
# Backup original
|
# Backup original
|
||||||
@@ -143,16 +143,16 @@ update_links() {
|
|||||||
# Replace links - use different sed syntax for BSD/macOS vs GNU sed
|
# Replace links - use different sed syntax for BSD/macOS vs GNU sed
|
||||||
if sed --version &>/dev/null 2>&1; then
|
if sed --version &>/dev/null 2>&1; then
|
||||||
# GNU sed
|
# GNU sed
|
||||||
sed -i "s|github.com/$old_repo/$old_name|github.com/$new_owner/$new_repo|g" "$file"
|
sed -E -i "s@(github.com|githubusercontent.com)/$old_repo/$old_name@\\1/$new_owner/$new_repo@g" "$file"
|
||||||
else
|
else
|
||||||
# BSD sed (macOS)
|
# BSD sed (macOS)
|
||||||
sed -i '' "s|github.com/$old_repo/$old_name|github.com/$new_owner/$new_repo|g" "$file"
|
sed -E -i '' "s@(github.com|githubusercontent.com)/$old_repo/$old_name@\\1/$new_owner/$new_repo@g" "$file"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
((files_updated++))
|
((files_updated++))
|
||||||
print_success "Updated $file ($count links)"
|
print_success "Updated $file ($count links)"
|
||||||
fi
|
fi
|
||||||
done < <(find "$search_path" -type f \( -name "*.md" -o -name "*.sh" -o -name "*.func" -o -name "*.json" \) -not -path "*/.git/*" 2>/dev/null | xargs grep -l "github.com/$old_repo/$old_name" 2>/dev/null)
|
done < <(find "$search_path" -type f \( -name "*.md" -o -name "*.sh" -o -name "*.func" -o -name "*.json" \) -not -path "*/.git/*" 2>/dev/null | xargs grep -E -l "(github.com|githubusercontent.com)/$old_repo/$old_name" 2>/dev/null)
|
||||||
|
|
||||||
return $files_updated
|
return $files_updated
|
||||||
}
|
}
|
||||||
|
|||||||
44
frontend/public/json/databasus.json
Normal file
44
frontend/public/json/databasus.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "Databasus",
|
||||||
|
"slug": "databasus",
|
||||||
|
"categories": [
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-17",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": "https://github.com/databasus/databasus",
|
||||||
|
"website": "https://github.com/databasus/databasus",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/databasus.webp",
|
||||||
|
"config_path": "/opt/databasus/.env",
|
||||||
|
"description": "Free, open source and self-hosted solution for automated PostgreSQL backups. With multiple storage options, notifications, scheduling, and a beautiful web interface for managing database backups across multiple PostgreSQL instances.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/databasus.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "admin@localhost",
|
||||||
|
"password": "See /root/databasus.creds"
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Supports PostgreSQL versions 12-18 with cloud and self-hosted instances",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Features: Scheduled backups, multiple storage providers, notifications, encryption",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
40
frontend/public/json/ebusd.json
Normal file
40
frontend/public/json/ebusd.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "ebusd",
|
||||||
|
"slug": "ebusd",
|
||||||
|
"categories": [
|
||||||
|
16
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-15",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": null,
|
||||||
|
"documentation": "https://github.com/john30/ebusd/wiki",
|
||||||
|
"website": "https://github.com/john30/ebusd",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ebusd.webp",
|
||||||
|
"config_path": "/etc/default/ebusd",
|
||||||
|
"description": "ebusd is a daemon for handling communication with eBUS devices connected to a 2-wire `energy bus` used by numerous heating systems.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/ebusd.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 512,
|
||||||
|
"hdd": 2,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "root",
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "For required post installation actions, checkout: `https://github.com/community-scripts/ProxmoxVE/discussions/11352`",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-02-15T18:07:51Z",
|
"generated": "2026-02-18T12:13:31Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -158,9 +158,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "bookstack",
|
"slug": "bookstack",
|
||||||
"repo": "BookStackApp/BookStack",
|
"repo": "BookStackApp/BookStack",
|
||||||
"version": "v25.12.3",
|
"version": "v25.12.5",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T15:29:25Z"
|
"date": "2026-02-17T18:42:47Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "byparr",
|
"slug": "byparr",
|
||||||
@@ -193,9 +193,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "cleanuparr",
|
"slug": "cleanuparr",
|
||||||
"repo": "Cleanuparr/Cleanuparr",
|
"repo": "Cleanuparr/Cleanuparr",
|
||||||
"version": "v2.6.2",
|
"version": "v2.6.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-15T02:15:19Z"
|
"date": "2026-02-16T22:41:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "cloudreve",
|
"slug": "cloudreve",
|
||||||
@@ -207,9 +207,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "comfyui",
|
"slug": "comfyui",
|
||||||
"repo": "comfyanonymous/ComfyUI",
|
"repo": "comfyanonymous/ComfyUI",
|
||||||
"version": "v0.13.0",
|
"version": "v0.14.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-10T20:27:38Z"
|
"date": "2026-02-18T06:12:02Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "commafeed",
|
"slug": "commafeed",
|
||||||
@@ -221,9 +221,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "configarr",
|
"slug": "configarr",
|
||||||
"repo": "raydak-labs/configarr",
|
"repo": "raydak-labs/configarr",
|
||||||
"version": "v1.20.0",
|
"version": "v1.21.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-10T21:25:47Z"
|
"date": "2026-02-17T22:59:07Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "convertx",
|
"slug": "convertx",
|
||||||
@@ -253,19 +253,26 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-11T15:39:05Z"
|
"date": "2026-02-11T15:39:05Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"slug": "databasus",
|
||||||
|
"repo": "databasus/databasus",
|
||||||
|
"version": "v3.14.1",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-02-18T10:43:45Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"slug": "dawarich",
|
"slug": "dawarich",
|
||||||
"repo": "Freika/dawarich",
|
"repo": "Freika/dawarich",
|
||||||
"version": "1.1.0",
|
"version": "1.2.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-08T14:42:45Z"
|
"date": "2026-02-15T22:33:56Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "discopanel",
|
"slug": "discopanel",
|
||||||
"repo": "nickheyer/discopanel",
|
"repo": "nickheyer/discopanel",
|
||||||
"version": "v1.0.36",
|
"version": "v1.0.37",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-09T21:15:44Z"
|
"date": "2026-02-18T08:53:43Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "dispatcharr",
|
"slug": "dispatcharr",
|
||||||
@@ -316,6 +323,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-06T12:05:40Z"
|
"date": "2026-01-06T12:05:40Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"slug": "ebusd",
|
||||||
|
"repo": "john30/ebusd",
|
||||||
|
"version": "26.1",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-02-09T06:09:24Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"slug": "elementsynapse",
|
"slug": "elementsynapse",
|
||||||
"repo": "etkecc/synapse-admin",
|
"repo": "etkecc/synapse-admin",
|
||||||
@@ -354,9 +368,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "firefly",
|
"slug": "firefly",
|
||||||
"repo": "firefly-iii/firefly-iii",
|
"repo": "firefly-iii/firefly-iii",
|
||||||
"version": "v6.4.21",
|
"version": "v6.4.22",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-14T19:40:46Z"
|
"date": "2026-02-15T18:43:08Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "fladder",
|
"slug": "fladder",
|
||||||
@@ -543,16 +557,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "huntarr",
|
"slug": "huntarr",
|
||||||
"repo": "plexguide/Huntarr.io",
|
"repo": "plexguide/Huntarr.io",
|
||||||
"version": "9.2.4.1",
|
"version": "9.3.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-12T22:17:47Z"
|
"date": "2026-02-18T02:35:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "immich-public-proxy",
|
"slug": "immich-public-proxy",
|
||||||
"repo": "alangrainger/immich-public-proxy",
|
"repo": "alangrainger/immich-public-proxy",
|
||||||
"version": "v1.15.1",
|
"version": "v1.15.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-26T08:04:27Z"
|
"date": "2026-02-16T22:54:27Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "inspircd",
|
"slug": "inspircd",
|
||||||
@@ -571,16 +585,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "invoiceninja",
|
"slug": "invoiceninja",
|
||||||
"repo": "invoiceninja/invoiceninja",
|
"repo": "invoiceninja/invoiceninja",
|
||||||
"version": "v5.12.60",
|
"version": "v5.12.64",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-15T00:11:31Z"
|
"date": "2026-02-18T07:59:44Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
"repo": "Jackett/Jackett",
|
"repo": "Jackett/Jackett",
|
||||||
"version": "v0.24.1124",
|
"version": "v0.24.1147",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-15T05:54:22Z"
|
"date": "2026-02-18T05:54:19Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jellystat",
|
"slug": "jellystat",
|
||||||
@@ -634,9 +648,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "kimai",
|
"slug": "kimai",
|
||||||
"repo": "kimai/kimai",
|
"repo": "kimai/kimai",
|
||||||
"version": "2.48.0",
|
"version": "2.49.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T18:10:59Z"
|
"date": "2026-02-15T20:40:19Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "kitchenowl",
|
"slug": "kitchenowl",
|
||||||
@@ -690,16 +704,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "leantime",
|
"slug": "leantime",
|
||||||
"repo": "Leantime/leantime",
|
"repo": "Leantime/leantime",
|
||||||
"version": "v3.6.2",
|
"version": "v3.7.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T16:37:00Z"
|
"date": "2026-02-18T00:02:31Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "librenms",
|
"slug": "librenms",
|
||||||
"repo": "librenms/librenms",
|
"repo": "librenms/librenms",
|
||||||
"version": "26.1.1",
|
"version": "26.2.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-12T23:26:02Z"
|
"date": "2026-02-16T12:15:13Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "librespeed-rust",
|
"slug": "librespeed-rust",
|
||||||
@@ -722,12 +736,19 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-11-16T22:40:18Z"
|
"date": "2025-11-16T22:40:18Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"slug": "linkding",
|
||||||
|
"repo": "sissbruecker/linkding",
|
||||||
|
"version": "v1.45.0",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-06T20:31:04Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"slug": "linkstack",
|
"slug": "linkstack",
|
||||||
"repo": "linkstackorg/linkstack",
|
"repo": "linkstackorg/linkstack",
|
||||||
"version": "v4.8.5",
|
"version": "v4.8.6",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-26T18:46:52Z"
|
"date": "2026-02-17T16:53:47Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "linkwarden",
|
"slug": "linkwarden",
|
||||||
@@ -767,9 +788,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "mail-archiver",
|
"slug": "mail-archiver",
|
||||||
"repo": "s1t5/mail-archiver",
|
"repo": "s1t5/mail-archiver",
|
||||||
"version": "2602.1",
|
"version": "2602.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-11T06:23:11Z"
|
"date": "2026-02-17T09:46:52Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "managemydamnlife",
|
"slug": "managemydamnlife",
|
||||||
@@ -788,9 +809,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "mealie",
|
"slug": "mealie",
|
||||||
"repo": "mealie-recipes/mealie",
|
"repo": "mealie-recipes/mealie",
|
||||||
"version": "v3.10.2",
|
"version": "v3.11.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-04T23:32:32Z"
|
"date": "2026-02-17T04:13:35Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "mediamanager",
|
"slug": "mediamanager",
|
||||||
@@ -872,9 +893,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "netbox",
|
"slug": "netbox",
|
||||||
"repo": "netbox-community/netbox",
|
"repo": "netbox-community/netbox",
|
||||||
"version": "v4.5.2",
|
"version": "v4.5.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-03T13:54:26Z"
|
"date": "2026-02-17T15:39:18Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "nextcloud-exporter",
|
"slug": "nextcloud-exporter",
|
||||||
@@ -942,9 +963,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "opencloud",
|
"slug": "opencloud",
|
||||||
"repo": "opencloud-eu/opencloud",
|
"repo": "opencloud-eu/opencloud",
|
||||||
"version": "v5.0.2",
|
"version": "v5.1.0",
|
||||||
"pinned": true,
|
"pinned": true,
|
||||||
"date": "2026-02-05T16:29:01Z"
|
"date": "2026-02-16T15:04:28Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "opengist",
|
"slug": "opengist",
|
||||||
@@ -956,9 +977,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "ots",
|
"slug": "ots",
|
||||||
"repo": "Luzifer/ots",
|
"repo": "Luzifer/ots",
|
||||||
"version": "v1.21.0",
|
"version": "v1.21.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-19T23:21:29Z"
|
"date": "2026-02-16T12:12:23Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "outline",
|
"slug": "outline",
|
||||||
@@ -1005,23 +1026,23 @@
|
|||||||
{
|
{
|
||||||
"slug": "paperless-gpt",
|
"slug": "paperless-gpt",
|
||||||
"repo": "icereed/paperless-gpt",
|
"repo": "icereed/paperless-gpt",
|
||||||
"version": "v0.24.0",
|
"version": "v0.25.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-14T21:28:09Z"
|
"date": "2026-02-16T08:31:48Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "paperless-ngx",
|
"slug": "paperless-ngx",
|
||||||
"repo": "paperless-ngx/paperless-ngx",
|
"repo": "paperless-ngx/paperless-ngx",
|
||||||
"version": "v2.20.6",
|
"version": "v2.20.7",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T07:30:27Z"
|
"date": "2026-02-16T16:52:23Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "patchmon",
|
"slug": "patchmon",
|
||||||
"repo": "PatchMon/PatchMon",
|
"repo": "PatchMon/PatchMon",
|
||||||
"version": "v1.4.0",
|
"version": "v1.4.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T10:39:03Z"
|
"date": "2026-02-16T18:00:13Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "paymenter",
|
"slug": "paymenter",
|
||||||
@@ -1075,9 +1096,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "planka",
|
"slug": "planka",
|
||||||
"repo": "plankanban/planka",
|
"repo": "plankanban/planka",
|
||||||
"version": "v2.0.0",
|
"version": "v2.0.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-11T13:50:10Z"
|
"date": "2026-02-17T15:26:55Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "plant-it",
|
"slug": "plant-it",
|
||||||
@@ -1089,9 +1110,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pocketbase",
|
"slug": "pocketbase",
|
||||||
"repo": "pocketbase/pocketbase",
|
"repo": "pocketbase/pocketbase",
|
||||||
"version": "v0.36.3",
|
"version": "v0.36.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T18:38:58Z"
|
"date": "2026-02-17T08:02:51Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "pocketid",
|
"slug": "pocketid",
|
||||||
@@ -1222,9 +1243,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "rclone",
|
"slug": "rclone",
|
||||||
"repo": "rclone/rclone",
|
"repo": "rclone/rclone",
|
||||||
"version": "v1.73.0",
|
"version": "v1.73.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-30T22:12:03Z"
|
"date": "2026-02-17T18:27:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "rdtclient",
|
"slug": "rdtclient",
|
||||||
@@ -1261,6 +1282,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-03-28T13:00:23Z"
|
"date": "2025-03-28T13:00:23Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"slug": "romm",
|
||||||
|
"repo": "RetroAchievements/RALibretro",
|
||||||
|
"version": "1.8.2",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-23T17:03:31Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"slug": "rustdeskserver",
|
"slug": "rustdeskserver",
|
||||||
"repo": "rustdesk/rustdesk-server",
|
"repo": "rustdesk/rustdesk-server",
|
||||||
@@ -1313,9 +1341,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "semaphore",
|
"slug": "semaphore",
|
||||||
"repo": "semaphoreui/semaphore",
|
"repo": "semaphoreui/semaphore",
|
||||||
"version": "v2.17.0",
|
"version": "v2.17.7",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-13T21:08:30Z"
|
"date": "2026-02-18T08:10:16Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "shelfmark",
|
"slug": "shelfmark",
|
||||||
@@ -1341,9 +1369,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "slskd",
|
"slug": "slskd",
|
||||||
"repo": "slskd/slskd",
|
"repo": "slskd/slskd",
|
||||||
"version": "0.24.3",
|
"version": "0.24.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-15T14:40:15Z"
|
"date": "2026-02-16T16:50:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "snipeit",
|
"slug": "snipeit",
|
||||||
@@ -1390,9 +1418,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "stirling-pdf",
|
"slug": "stirling-pdf",
|
||||||
"repo": "Stirling-Tools/Stirling-PDF",
|
"repo": "Stirling-Tools/Stirling-PDF",
|
||||||
"version": "v2.4.6",
|
"version": "v2.5.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-12T00:01:19Z"
|
"date": "2026-02-18T11:05:34Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "streamlink-webui",
|
"slug": "streamlink-webui",
|
||||||
@@ -1425,9 +1453,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tautulli",
|
"slug": "tautulli",
|
||||||
"repo": "Tautulli/Tautulli",
|
"repo": "Tautulli/Tautulli",
|
||||||
"version": "v2.16.0",
|
"version": "v2.16.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-09-09T01:05:45Z"
|
"date": "2026-02-15T20:40:37Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "teddycloud",
|
"slug": "teddycloud",
|
||||||
@@ -1481,9 +1509,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tracearr",
|
"slug": "tracearr",
|
||||||
"repo": "connorgallopo/Tracearr",
|
"repo": "connorgallopo/Tracearr",
|
||||||
"version": "v1.4.17",
|
"version": "v1.4.18",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-11T01:33:21Z"
|
"date": "2026-02-15T19:55:40Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tracktor",
|
"slug": "tracktor",
|
||||||
@@ -1523,9 +1551,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tunarr",
|
"slug": "tunarr",
|
||||||
"repo": "chrisbenincasa/tunarr",
|
"repo": "chrisbenincasa/tunarr",
|
||||||
"version": "v1.1.12",
|
"version": "v1.1.14",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-03T20:19:00Z"
|
"date": "2026-02-17T18:26:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "uhf",
|
"slug": "uhf",
|
||||||
@@ -1607,9 +1635,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "wanderer",
|
"slug": "wanderer",
|
||||||
"repo": "meilisearch/meilisearch",
|
"repo": "meilisearch/meilisearch",
|
||||||
"version": "v1.35.0",
|
"version": "v1.35.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-02T09:57:03Z"
|
"date": "2026-02-16T17:01:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "warracker",
|
"slug": "warracker",
|
||||||
@@ -1719,9 +1747,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "zitadel",
|
"slug": "zitadel",
|
||||||
"repo": "zitadel/zitadel",
|
"repo": "zitadel/zitadel",
|
||||||
"version": "v4.10.1",
|
"version": "v4.11.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-30T06:52:53Z"
|
"date": "2026-02-16T09:48:38Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "zoraxy",
|
"slug": "zoraxy",
|
||||||
|
|||||||
40
frontend/public/json/linkding.json
Normal file
40
frontend/public/json/linkding.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "linkding",
|
||||||
|
"slug": "linkding",
|
||||||
|
"categories": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-16",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 9090,
|
||||||
|
"documentation": "https://linkding.link/",
|
||||||
|
"website": "https://linkding.link/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/linkding.webp",
|
||||||
|
"config_path": "/opt/linkding/.env",
|
||||||
|
"description": "linkding is a self-hosted bookmark manager that is designed to be minimal, fast, and easy to set up. It features a clean UI, tag-based organization, bulk editing, Markdown notes, read it later functionality, sharing, REST API, and browser extensions for Firefox and Chrome.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/linkding.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "admin",
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Admin credentials are stored in /opt/linkding/.env",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "Valid TLS certificates and fully-qualified domain names behind a reverse proxy (Caddy) for 3 services - OpenCloud, Collabora, and WOPI are **REQUIRED**",
|
"text": "Valid TLS certificates and fully-qualified domain names behind a reverse proxy (Caddy) for 3 services - OpenCloud (port: 9200), Collabora (port: 9980), and WOPI (port: 9300) are **REQUIRED**",
|
||||||
"type": "warning"
|
"type": "warning"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
35
frontend/public/json/romm.json
Normal file
35
frontend/public/json/romm.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "RomM",
|
||||||
|
"slug": "romm",
|
||||||
|
"categories": [
|
||||||
|
24
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-16",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": "https://docs.romm.app/latest/",
|
||||||
|
"website": "https://romm.app/",
|
||||||
|
"config_path": "/opt/romm/.env",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/romm.webp",
|
||||||
|
"description": "RomM (ROM Manager) allows you to scan, enrich, browse and play your game collection with a clean and responsive interface. Support for multiple platforms, various naming schemes, and custom tags.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/romm.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 20,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@@ -10,9 +10,9 @@
|
|||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 3280,
|
"interface_port": 3280,
|
||||||
"documentation": "https://github.com/cmintey/wishlist/blob/main/README.md#getting-started",
|
"documentation": "https://github.com/cmintey/wishlist/blob/main/README.md#getting-started",
|
||||||
"config_path": "/opt/wishlist/.env",
|
|
||||||
"website": "https://github.com/cmintey/wishlist",
|
"website": "https://github.com/cmintey/wishlist",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cmintey-wishlist.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cmintey-wishlist.webp",
|
||||||
|
"config_path": "/opt/wishlist/.env",
|
||||||
"description": "Wishlist is a self-hosted wishlist application that you can share with your friends and family. You no longer have to wonder what to get your family for the holidays, simply check their wishlist and claim any available item!",
|
"description": "Wishlist is a self-hosted wishlist application that you can share with your friends and family. You no longer have to wonder what to get your family for the holidays, simply check their wishlist and claim any available item!",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
@@ -31,5 +31,10 @@
|
|||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": []
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "When using a reverse proxy with this script, please edit the`ORIGIN` value in `/opt/wishlist/.env` to point to your new URL, otherwise creating an admin account or logging in will not work.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ $STD apk add --no-cache \
|
|||||||
libc6-compat
|
libc6-compat
|
||||||
msg_ok "Installed dependencies"
|
msg_ok "Installed dependencies"
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | head -1)
|
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | awk 'NR==1')
|
||||||
msg_info "Installing Teamspeak Server v${RELEASE}"
|
msg_info "Installing Teamspeak Server v${RELEASE}"
|
||||||
mkdir -p /opt/teamspeak-server
|
mkdir -p /opt/teamspeak-server
|
||||||
cd /opt/teamspeak-server
|
cd /opt/teamspeak-server
|
||||||
|
|||||||
@@ -26,13 +26,13 @@ msg_info "Setup CryptPad"
|
|||||||
cd /opt/cryptpad
|
cd /opt/cryptpad
|
||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run install:components
|
$STD npm run install:components
|
||||||
$STD npm run build
|
|
||||||
cp config/config.example.js config/config.js
|
|
||||||
sed -i "51s/localhost/${LOCAL_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
|
if [[ "$onlyoffice" =~ ^[Yy]$ ]]; then
|
||||||
$STD bash -c "./install-onlyoffice.sh --accept-license"
|
$STD bash -c "./install-onlyoffice.sh --accept-license"
|
||||||
fi
|
fi
|
||||||
|
cp config/config.example.js config/config.js
|
||||||
|
sed -i "51s/localhost/${LOCAL_IP}/g" /opt/cryptpad/config/config.js
|
||||||
|
sed -i "80s#//httpAddress: 'localhost'#httpAddress: '0.0.0.0'#g" /opt/cryptpad/config/config.js
|
||||||
|
$STD npm run build
|
||||||
msg_ok "Setup CryptPad"
|
msg_ok "Setup CryptPad"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
|
|||||||
171
install/databasus-install.sh
Normal file
171
install/databasus-install.sh
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/databasus/databasus
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
nginx \
|
||||||
|
valkey
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
setup_go
|
||||||
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||||
|
|
||||||
|
msg_info "Building Databasus (Patience)"
|
||||||
|
cd /opt/databasus/frontend
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build
|
||||||
|
cd /opt/databasus/backend
|
||||||
|
$STD go mod tidy
|
||||||
|
$STD go mod download
|
||||||
|
$STD go install github.com/swaggo/swag/cmd/swag@latest
|
||||||
|
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||||
|
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
||||||
|
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
||||||
|
mkdir -p /databasus-data/{pgdata,temp,backups,data,logs}
|
||||||
|
mkdir -p /opt/databasus/ui/build
|
||||||
|
mkdir -p /opt/databasus/migrations
|
||||||
|
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
||||||
|
cp -r /opt/databasus/backend/migrations/* /opt/databasus/migrations/
|
||||||
|
chown -R postgres:postgres /databasus-data
|
||||||
|
msg_ok "Built Databasus"
|
||||||
|
|
||||||
|
msg_info "Configuring Databasus"
|
||||||
|
JWT_SECRET=$(openssl rand -hex 32)
|
||||||
|
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||||
|
# Create PostgreSQL version symlinks for compatibility
|
||||||
|
for v in 12 13 14 15 16 18; do
|
||||||
|
ln -sf /usr/lib/postgresql/17 /usr/lib/postgresql/$v
|
||||||
|
done
|
||||||
|
# Install goose for migrations
|
||||||
|
$STD go install github.com/pressly/goose/v3/cmd/goose@latest
|
||||||
|
ln -sf /root/go/bin/goose /usr/local/bin/goose
|
||||||
|
cat <<EOF >/opt/databasus/.env
|
||||||
|
# Environment
|
||||||
|
ENV_MODE=production
|
||||||
|
|
||||||
|
# Server
|
||||||
|
SERVER_PORT=4005
|
||||||
|
SERVER_HOST=0.0.0.0
|
||||||
|
|
||||||
|
# Database
|
||||||
|
DATABASE_DSN=host=localhost user=postgres password=postgres dbname=databasus port=5432 sslmode=disable
|
||||||
|
DATABASE_URL=postgres://postgres:postgres@localhost:5432/databasus?sslmode=disable
|
||||||
|
|
||||||
|
# Migrations
|
||||||
|
GOOSE_DRIVER=postgres
|
||||||
|
GOOSE_DBSTRING=postgres://postgres:postgres@localhost:5432/databasus?sslmode=disable
|
||||||
|
GOOSE_MIGRATION_DIR=/opt/databasus/migrations
|
||||||
|
|
||||||
|
# Valkey (Redis-compatible cache)
|
||||||
|
VALKEY_HOST=localhost
|
||||||
|
VALKEY_PORT=6379
|
||||||
|
|
||||||
|
# Security
|
||||||
|
JWT_SECRET=${JWT_SECRET}
|
||||||
|
ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||||
|
|
||||||
|
# Paths
|
||||||
|
DATA_DIR=/databasus-data/data
|
||||||
|
BACKUP_DIR=/databasus-data/backups
|
||||||
|
LOG_DIR=/databasus-data/logs
|
||||||
|
EOF
|
||||||
|
chown postgres:postgres /opt/databasus/.env
|
||||||
|
chmod 600 /opt/databasus/.env
|
||||||
|
msg_ok "Configured Databasus"
|
||||||
|
|
||||||
|
msg_info "Configuring Valkey"
|
||||||
|
cat <<EOF >/etc/valkey/valkey.conf
|
||||||
|
port 6379
|
||||||
|
bind 127.0.0.1
|
||||||
|
protected-mode yes
|
||||||
|
save ""
|
||||||
|
maxmemory 256mb
|
||||||
|
maxmemory-policy allkeys-lru
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now valkey-server
|
||||||
|
systemctl restart valkey-server
|
||||||
|
msg_ok "Configured Valkey"
|
||||||
|
|
||||||
|
msg_info "Creating Database"
|
||||||
|
# Configure PostgreSQL to allow local password auth for databasus
|
||||||
|
PG_HBA="/etc/postgresql/17/main/pg_hba.conf"
|
||||||
|
if ! grep -q "databasus" "$PG_HBA"; then
|
||||||
|
sed -i '/^local\s*all\s*all/i local databasus postgres trust' "$PG_HBA"
|
||||||
|
sed -i '/^host\s*all\s*all\s*127/i host databasus postgres 127.0.0.1/32 trust' "$PG_HBA"
|
||||||
|
systemctl reload postgresql
|
||||||
|
fi
|
||||||
|
$STD sudo -u postgres psql -c "CREATE DATABASE databasus;" 2>/dev/null || true
|
||||||
|
$STD sudo -u postgres psql -c "ALTER USER postgres WITH SUPERUSER CREATEROLE CREATEDB;" 2>/dev/null || true
|
||||||
|
msg_ok "Created Database"
|
||||||
|
|
||||||
|
msg_info "Creating Databasus Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/databasus.service
|
||||||
|
[Unit]
|
||||||
|
Description=Databasus - Database Backup Management
|
||||||
|
After=network.target postgresql.service valkey.service
|
||||||
|
Requires=postgresql.service valkey.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/databasus
|
||||||
|
EnvironmentFile=/opt/databasus/.env
|
||||||
|
ExecStart=/opt/databasus/databasus
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
$STD systemctl daemon-reload
|
||||||
|
$STD systemctl enable -q --now databasus
|
||||||
|
msg_ok "Created Databasus Service"
|
||||||
|
|
||||||
|
msg_info "Configuring Nginx"
|
||||||
|
cat <<EOF >/etc/nginx/sites-available/databasus
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:4005;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host \$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_cache_bypass \$http_upgrade;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_read_timeout 86400s;
|
||||||
|
proxy_send_timeout 86400s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
ln -sf /etc/nginx/sites-available/databasus /etc/nginx/sites-enabled/databasus
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
$STD nginx -t
|
||||||
|
$STD systemctl enable -q --now nginx
|
||||||
|
$STD systemctl reload nginx
|
||||||
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
23
install/ebusd-install.sh
Normal file
23
install/ebusd-install.sh
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Joerg Heinemann (heinemannj)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/john30/ebusd
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing ebusd"
|
||||||
|
fetch_and_deploy_gh_release "ebusd" "john30/ebusd" "binary" "latest" "" "ebusd-*_amd64-trixie_mqtt1.deb"
|
||||||
|
systemctl enable -q ebusd
|
||||||
|
msg_ok "Installed ebusd"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
126
install/linkding-install.sh
Normal file
126
install/linkding-install.sh
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (MickLesk)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://linkding.link/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
python3-dev \
|
||||||
|
nginx \
|
||||||
|
libpq-dev \
|
||||||
|
libicu-dev \
|
||||||
|
libsqlite3-dev \
|
||||||
|
libffi-dev
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
setup_uv
|
||||||
|
fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding"
|
||||||
|
|
||||||
|
msg_info "Building Frontend"
|
||||||
|
cd /opt/linkding
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build
|
||||||
|
ln -sf /usr/lib/x86_64-linux-gnu/mod_icu.so /opt/linkding/libicu.so
|
||||||
|
msg_ok "Built Frontend"
|
||||||
|
|
||||||
|
msg_info "Setting up LinkDing"
|
||||||
|
rm -f bookmarks/settings/dev.py
|
||||||
|
touch bookmarks/settings/custom.py
|
||||||
|
$STD uv sync --no-dev --frozen
|
||||||
|
$STD uv pip install gunicorn
|
||||||
|
mkdir -p data/{favicons,previews,assets}
|
||||||
|
ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||||
|
cat <<EOF >/opt/linkding/.env
|
||||||
|
LD_SUPERUSER_NAME=admin
|
||||||
|
LD_SUPERUSER_PASSWORD=${ADMIN_PASS}
|
||||||
|
LD_CSRF_TRUSTED_ORIGINS=http://${LOCAL_IP}:9090
|
||||||
|
EOF
|
||||||
|
set -a && source /opt/linkding/.env && set +a
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py generate_secret_key
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py migrate
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py enable_wal
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py create_initial_superuser
|
||||||
|
$STD /opt/linkding/.venv/bin/python manage.py collectstatic --no-input
|
||||||
|
msg_ok "Set up LinkDing"
|
||||||
|
|
||||||
|
msg_info "Creating Services"
|
||||||
|
cat <<EOF >/etc/systemd/system/linkding.service
|
||||||
|
[Unit]
|
||||||
|
Description=linkding Bookmark Manager
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/linkding
|
||||||
|
EnvironmentFile=/opt/linkding/.env
|
||||||
|
ExecStart=/opt/linkding/.venv/bin/gunicorn \
|
||||||
|
--bind 127.0.0.1:8000 \
|
||||||
|
--workers 3 \
|
||||||
|
--threads 2 \
|
||||||
|
--timeout 120 \
|
||||||
|
bookmarks.wsgi:application
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
cat <<EOF >/etc/systemd/system/linkding-tasks.service
|
||||||
|
[Unit]
|
||||||
|
Description=linkding Background Tasks
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/linkding
|
||||||
|
EnvironmentFile=/opt/linkding/.env
|
||||||
|
ExecStart=/opt/linkding/.venv/bin/python manage.py run_huey
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
cat <<'EOF' >/etc/nginx/sites-available/linkding
|
||||||
|
server {
|
||||||
|
listen 9090;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
client_max_body_size 20M;
|
||||||
|
|
||||||
|
location /static/ {
|
||||||
|
alias /opt/linkding/static/;
|
||||||
|
expires 30d;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_redirect off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
$STD rm -f /etc/nginx/sites-enabled/default
|
||||||
|
$STD ln -sf /etc/nginx/sites-available/linkding /etc/nginx/sites-enabled/linkding
|
||||||
|
systemctl enable -q --now nginx linkding linkding-tasks
|
||||||
|
systemctl restart nginx
|
||||||
|
msg_ok "Created Services"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
|
|||||||
echo "$COOLPASS" >~/.coolpass
|
echo "$COOLPASS" >~/.coolpass
|
||||||
msg_ok "Installed Collabora Online"
|
msg_ok "Installed Collabora Online"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v5.0.2" "/usr/bin" "opencloud-*-linux-amd64"
|
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v5.1.0" "/usr/bin" "opencloud-*-linux-amd64"
|
||||||
|
|
||||||
msg_info "Configuring OpenCloud"
|
msg_info "Configuring OpenCloud"
|
||||||
DATA_DIR="/var/lib/opencloud"
|
DATA_DIR="/var/lib/opencloud"
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ $STD php artisan p:user:make --no-interaction --admin=1 --email "$ADMIN_EMAIL" -
|
|||||||
echo "* * * * * php /opt/pterodactyl-panel/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data -
|
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/*
|
chown -R www-data:www-data /opt/pterodactyl-panel/*
|
||||||
chmod -R 755 /opt/pterodactyl-panel/storage/* /opt/pterodactyl-panel/bootstrap/cache/
|
chmod -R 755 /opt/pterodactyl-panel/storage/* /opt/pterodactyl-panel/bootstrap/cache/
|
||||||
|
ln -s /opt/pterodactyl-panel /var/www/pterodactyl
|
||||||
{
|
{
|
||||||
echo ""
|
echo ""
|
||||||
echo "pterodactyl Admin Username: admin"
|
echo "pterodactyl Admin Username: admin"
|
||||||
|
|||||||
344
install/romm-install.sh
Normal file
344
install/romm-install.sh
Normal file
@@ -0,0 +1,344 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ) | DevelopmentCats | AlphaLawless
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://romm.app
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
acl \
|
||||||
|
git \
|
||||||
|
build-essential \
|
||||||
|
libssl-dev \
|
||||||
|
libffi-dev \
|
||||||
|
libmagic-dev \
|
||||||
|
python3-dev \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
libmariadb3 \
|
||||||
|
libmariadb-dev \
|
||||||
|
libpq-dev \
|
||||||
|
libbz2-dev \
|
||||||
|
libreadline-dev \
|
||||||
|
libsqlite3-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
liblzma-dev \
|
||||||
|
libncurses5-dev \
|
||||||
|
libncursesw5-dev \
|
||||||
|
redis-server \
|
||||||
|
redis-tools \
|
||||||
|
p7zip-full \
|
||||||
|
tzdata \
|
||||||
|
nginx
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PYTHON_VERSION="3.13" setup_uv
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="romm" MARIADB_DB_USER="romm" setup_mariadb_db
|
||||||
|
|
||||||
|
msg_info "Creating directories"
|
||||||
|
mkdir -p /opt/romm \
|
||||||
|
/var/lib/romm/config \
|
||||||
|
/var/lib/romm/resources \
|
||||||
|
/var/lib/romm/assets/{saves,states,screenshots} \
|
||||||
|
/var/lib/romm/library/roms \
|
||||||
|
/var/lib/romm/library/bios
|
||||||
|
msg_ok "Created directories"
|
||||||
|
|
||||||
|
msg_info "Creating configuration file"
|
||||||
|
cat <<'EOF' >/var/lib/romm/config/config.yml
|
||||||
|
# RomM Configuration File
|
||||||
|
# Documentation: https://docs.romm.app/latest/Getting-Started/Configuration-File/
|
||||||
|
# Only uncomment the lines you want to use/modify
|
||||||
|
|
||||||
|
# exclude:
|
||||||
|
# platforms:
|
||||||
|
# - excluded_folder_a
|
||||||
|
# roms:
|
||||||
|
# single_file:
|
||||||
|
# extensions:
|
||||||
|
# - xml
|
||||||
|
# - txt
|
||||||
|
# names:
|
||||||
|
# - '._*'
|
||||||
|
# - '*.nfo'
|
||||||
|
# multi_file:
|
||||||
|
# names:
|
||||||
|
# - downloaded_media
|
||||||
|
# - media
|
||||||
|
|
||||||
|
# system:
|
||||||
|
# platforms:
|
||||||
|
# gc: ngc
|
||||||
|
# ps1: psx
|
||||||
|
|
||||||
|
# The folder name where your roms are located (relative to library path)
|
||||||
|
# filesystem:
|
||||||
|
# roms_folder: 'roms'
|
||||||
|
|
||||||
|
# scan:
|
||||||
|
# priority:
|
||||||
|
# metadata:
|
||||||
|
# - "igdb"
|
||||||
|
# - "moby"
|
||||||
|
# - "ss"
|
||||||
|
# - "ra"
|
||||||
|
# artwork:
|
||||||
|
# - "igdb"
|
||||||
|
# - "moby"
|
||||||
|
# - "ss"
|
||||||
|
# region:
|
||||||
|
# - "us"
|
||||||
|
# - "eu"
|
||||||
|
# - "jp"
|
||||||
|
# language:
|
||||||
|
# - "en"
|
||||||
|
# media:
|
||||||
|
# - box2d
|
||||||
|
# - box3d
|
||||||
|
# - screenshot
|
||||||
|
# - manual
|
||||||
|
|
||||||
|
# emulatorjs:
|
||||||
|
# debug: false
|
||||||
|
# cache_limit: null
|
||||||
|
EOF
|
||||||
|
chmod 644 /var/lib/romm/config/config.yml
|
||||||
|
msg_ok "Created configuration file"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "RAHasher" "RetroAchievements/RALibretro" "prebuild" "latest" "/opt/RALibretro" "RAHasher-x64-Linux-*.zip"
|
||||||
|
cp /opt/RALibretro/RAHasher /usr/bin/RAHasher
|
||||||
|
chmod +x /usr/bin/RAHasher
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "romm" "rommapp/romm"
|
||||||
|
|
||||||
|
msg_info "Creating environment file"
|
||||||
|
sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf
|
||||||
|
systemctl restart redis-server
|
||||||
|
systemctl enable -q --now redis-server
|
||||||
|
AUTH_SECRET_KEY=$(openssl rand -hex 32)
|
||||||
|
|
||||||
|
cat <<EOF >/opt/romm/.env
|
||||||
|
ROMM_BASE_PATH=/var/lib/romm
|
||||||
|
ROMM_CONFIG_PATH=/var/lib/romm/config/config.yml
|
||||||
|
WEB_CONCURRENCY=4
|
||||||
|
|
||||||
|
DB_HOST=127.0.0.1
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_NAME=$MARIADB_DB_NAME
|
||||||
|
DB_USER=$MARIADB_DB_USER
|
||||||
|
DB_PASSWD=$MARIADB_DB_PASS
|
||||||
|
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PORT=6379
|
||||||
|
|
||||||
|
ROMM_AUTH_SECRET_KEY=$AUTH_SECRET_KEY
|
||||||
|
DISABLE_DOWNLOAD_ENDPOINT_AUTH=false
|
||||||
|
DISABLE_CSRF_PROTECTION=false
|
||||||
|
|
||||||
|
ENABLE_RESCAN_ON_FILESYSTEM_CHANGE=true
|
||||||
|
RESCAN_ON_FILESYSTEM_CHANGE_DELAY=5
|
||||||
|
|
||||||
|
ENABLE_SCHEDULED_RESCAN=true
|
||||||
|
SCHEDULED_RESCAN_CRON=0 3 * * *
|
||||||
|
ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB=true
|
||||||
|
SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON=0 4 * * *
|
||||||
|
|
||||||
|
LOGLEVEL=INFO
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 600 /opt/romm/.env
|
||||||
|
msg_ok "Created environment file"
|
||||||
|
|
||||||
|
msg_info "Setting up RomM Backend"
|
||||||
|
cd /opt/romm
|
||||||
|
export UV_CONCURRENT_DOWNLOADS=1
|
||||||
|
$STD uv sync --all-extras
|
||||||
|
cd /opt/romm/backend
|
||||||
|
$STD uv run alembic upgrade head
|
||||||
|
msg_ok "Set up RomM Backend"
|
||||||
|
|
||||||
|
msg_info "Setting up RomM Frontend"
|
||||||
|
cd /opt/romm/frontend
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
|
||||||
|
cp -rf /opt/romm/frontend/assets/* /opt/romm/frontend/dist/assets/
|
||||||
|
|
||||||
|
mkdir -p /opt/romm/frontend/dist/assets/romm
|
||||||
|
ln -sfn /var/lib/romm/resources /opt/romm/frontend/dist/assets/romm/resources
|
||||||
|
ln -sfn /var/lib/romm/assets /opt/romm/frontend/dist/assets/romm/assets
|
||||||
|
msg_ok "Set up RomM Frontend"
|
||||||
|
|
||||||
|
msg_info "Configuring Nginx"
|
||||||
|
cat <<'EOF' >/etc/nginx/sites-available/romm
|
||||||
|
upstream romm_backend {
|
||||||
|
server 127.0.0.1:5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default upgrade;
|
||||||
|
'' close;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
root /opt/romm/frontend/dist;
|
||||||
|
client_max_body_size 0;
|
||||||
|
|
||||||
|
# Frontend SPA
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Static assets
|
||||||
|
location /assets {
|
||||||
|
alias /opt/romm/frontend/dist/assets;
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# EmulatorJS player - requires COOP/COEP headers for SharedArrayBuffer
|
||||||
|
location ~ ^/rom/.*/ejs$ {
|
||||||
|
add_header Cross-Origin-Embedder-Policy "require-corp";
|
||||||
|
add_header Cross-Origin-Opener-Policy "same-origin";
|
||||||
|
try_files $uri /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Backend API
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://romm_backend;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
proxy_set_header Host $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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket and Netplay
|
||||||
|
location ~ ^/(ws|netplay) {
|
||||||
|
proxy_pass http://romm_backend;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_read_timeout 86400;
|
||||||
|
}
|
||||||
|
|
||||||
|
# OpenAPI docs
|
||||||
|
location = /openapi.json {
|
||||||
|
proxy_pass http://romm_backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Internal library file serving
|
||||||
|
location /library/ {
|
||||||
|
internal;
|
||||||
|
alias /var/lib/romm/library/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
ln -sf /etc/nginx/sites-available/romm /etc/nginx/sites-enabled/romm
|
||||||
|
systemctl restart nginx
|
||||||
|
systemctl enable -q --now nginx
|
||||||
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
|
msg_info "Creating Services"
|
||||||
|
cat <<EOF >/etc/systemd/system/romm-backend.service
|
||||||
|
[Unit]
|
||||||
|
Description=RomM Backend
|
||||||
|
After=network.target mariadb.service redis-server.service
|
||||||
|
Requires=mariadb.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/romm/backend
|
||||||
|
EnvironmentFile=/opt/romm/.env
|
||||||
|
Environment="PYTHONPATH=/opt/romm"
|
||||||
|
ExecStart=/opt/romm/.venv/bin/python main.py
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/romm-worker.service
|
||||||
|
[Unit]
|
||||||
|
Description=RomM RQ Worker
|
||||||
|
After=network.target mariadb.service redis-server.service romm-backend.service
|
||||||
|
Requires=mariadb.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/romm/backend
|
||||||
|
EnvironmentFile=/opt/romm/.env
|
||||||
|
Environment="PYTHONPATH=/opt/romm/backend"
|
||||||
|
ExecStart=/opt/romm/.venv/bin/rq worker --path /opt/romm/backend --url redis://127.0.0.1:6379/0 high default low
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/romm-scheduler.service
|
||||||
|
[Unit]
|
||||||
|
Description=RomM RQ Scheduler
|
||||||
|
After=network.target mariadb.service redis-server.service romm-backend.service
|
||||||
|
Requires=mariadb.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/romm/backend
|
||||||
|
EnvironmentFile=/opt/romm/.env
|
||||||
|
Environment="PYTHONPATH=/opt/romm/backend"
|
||||||
|
Environment="RQ_REDIS_HOST=127.0.0.1"
|
||||||
|
Environment="RQ_REDIS_PORT=6379"
|
||||||
|
ExecStart=/opt/romm/.venv/bin/rqscheduler --path /opt/romm/backend
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/romm-watcher.service
|
||||||
|
[Unit]
|
||||||
|
Description=RomM Filesystem Watcher
|
||||||
|
After=network.target romm-backend.service
|
||||||
|
Requires=romm-backend.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/romm/backend
|
||||||
|
EnvironmentFile=/opt/romm/.env
|
||||||
|
Environment="PYTHONPATH=/opt/romm/backend"
|
||||||
|
ExecStart=/opt/romm/.venv/bin/watchfiles --target-type command '/opt/romm/.venv/bin/python watcher.py' /var/lib/romm/library
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl enable -q --now romm-backend romm-worker romm-scheduler romm-watcher
|
||||||
|
msg_ok "Created Services"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -29,6 +29,7 @@ $STD uv venv --clear
|
|||||||
$STD source /opt/Tautulli/.venv/bin/activate
|
$STD source /opt/Tautulli/.venv/bin/activate
|
||||||
$STD uv pip install -r requirements.txt
|
$STD uv pip install -r requirements.txt
|
||||||
$STD uv pip install pyopenssl
|
$STD uv pip install pyopenssl
|
||||||
|
$STD uv pip install "setuptools<81"
|
||||||
msg_ok "Installed Tautulli"
|
msg_ok "Installed Tautulli"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ SECRET="$(openssl rand -hex 64)"
|
|||||||
sed -e '/^NODE_ENV=/s/=.*$/=production/' \
|
sed -e '/^NODE_ENV=/s/=.*$/=production/' \
|
||||||
-e 's/^TUDUDI_USER/# TUDUDI_USER/g' \
|
-e 's/^TUDUDI_USER/# TUDUDI_USER/g' \
|
||||||
-e "/_SECRET=/s/=.*$/=${SECRET}/" \
|
-e "/_SECRET=/s/=.*$/=${SECRET}/" \
|
||||||
-e "/^# DB_FILE/s/^# //; \
|
-e '/^# DB_FILE=/s/^# //' \
|
||||||
\|DB_FILE|s|/path.*$|${DB_LOCATION}/production.sqlite3|" \
|
-e "s|^DB_FILE=.*|DB_FILE=${DB_LOCATION}/production.sqlite3|" \
|
||||||
-e "/^# TUDUDI_ALLOWED/s/^# //; \
|
-e "/^# TUDUDI_ALLOWED/s/^# //; \
|
||||||
\|_ORIGINS=|s|=.*$|=<your tududi IP or FDQN>|" \
|
\|_ORIGINS=|s|=.*$|=<your tududi IP or FDQN>|" \
|
||||||
-e "/^# TUDUDI_UPLOAD/s/^# //; \
|
-e "/^# TUDUDI_UPLOAD/s/^# //; \
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "l
|
|||||||
|
|
||||||
msg_info "Building Vaultwarden (Patience)"
|
msg_info "Building Vaultwarden (Patience)"
|
||||||
cd /tmp/vaultwarden-src
|
cd /tmp/vaultwarden-src
|
||||||
|
VW_VERSION=$(get_latest_github_release "dani-garcia/vaultwarden")
|
||||||
|
export VW_VERSION
|
||||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||||
msg_ok "Built Vaultwarden"
|
msg_ok "Built Vaultwarden"
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,35 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
load_functions
|
load_functions
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
# Persist diagnostics setting inside container (exported from build.func)
|
||||||
|
# so addon scripts running later can find the user's choice
|
||||||
|
if [[ ! -f /usr/local/community-scripts/diagnostics ]]; then
|
||||||
|
mkdir -p /usr/local/community-scripts
|
||||||
|
echo "DIAGNOSTICS=${DIAGNOSTICS:-no}" >/usr/local/community-scripts/diagnostics
|
||||||
|
fi
|
||||||
|
|
||||||
# Get LXC IP address (must be called INSIDE container, after network is up)
|
# Get LXC IP address (must be called INSIDE container, after network is up)
|
||||||
get_lxc_ip
|
get_lxc_ip
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# post_progress_to_api()
|
||||||
|
#
|
||||||
|
# - Lightweight progress ping from inside the container
|
||||||
|
# - Updates the existing telemetry record status from "installing" to "configuring"
|
||||||
|
# - Signals that the installation is actively progressing (not stuck)
|
||||||
|
# - Fire-and-forget: never blocks or fails the script
|
||||||
|
# - Only executes if DIAGNOSTICS=yes and RANDOM_UUID is set
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
post_progress_to_api() {
|
||||||
|
command -v curl &>/dev/null || return 0
|
||||||
|
[[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0
|
||||||
|
[[ -z "${RANDOM_UUID:-}" ]] && return 0
|
||||||
|
|
||||||
|
curl -fsS -m 5 -X POST "https://telemetry.community-scripts.org/telemetry" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"random_id\":\"${RANDOM_UUID}\",\"execution_id\":\"${EXECUTION_ID:-${RANDOM_UUID}}\",\"type\":\"lxc\",\"nsapp\":\"${app:-unknown}\",\"status\":\"configuring\"}" &>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
# This function enables IPv6 if it's not disabled and sets verbose mode
|
# This function enables IPv6 if it's not disabled and sets verbose mode
|
||||||
verb_ip6() {
|
verb_ip6() {
|
||||||
set_std_mode # Set STD mode based on VERBOSE
|
set_std_mode # Set STD mode based on VERBOSE
|
||||||
@@ -34,42 +60,6 @@ EOF
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
set -Eeuo pipefail
|
|
||||||
trap 'error_handler $? $LINENO "$BASH_COMMAND"' ERR
|
|
||||||
trap on_exit EXIT
|
|
||||||
trap on_interrupt INT
|
|
||||||
trap on_terminate TERM
|
|
||||||
|
|
||||||
error_handler() {
|
|
||||||
local exit_code="$1"
|
|
||||||
local line_number="$2"
|
|
||||||
local command="$3"
|
|
||||||
|
|
||||||
if [[ "$exit_code" -eq 0 ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf "\e[?25h"
|
|
||||||
echo -e "\n${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}\n"
|
|
||||||
exit "$exit_code"
|
|
||||||
}
|
|
||||||
|
|
||||||
on_exit() {
|
|
||||||
local exit_code="$?"
|
|
||||||
[[ -n "${lockfile:-}" && -e "$lockfile" ]] && rm -f "$lockfile"
|
|
||||||
exit "$exit_code"
|
|
||||||
}
|
|
||||||
|
|
||||||
on_interrupt() {
|
|
||||||
echo -e "\n${RD}Interrupted by user (SIGINT)${CL}"
|
|
||||||
exit 130
|
|
||||||
}
|
|
||||||
|
|
||||||
on_terminate() {
|
|
||||||
echo -e "\n${RD}Terminated by signal (SIGTERM)${CL}"
|
|
||||||
exit 143
|
|
||||||
}
|
|
||||||
|
|
||||||
# This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection
|
# This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection
|
||||||
setting_up_container() {
|
setting_up_container() {
|
||||||
msg_info "Setting up Container OS"
|
msg_info "Setting up Container OS"
|
||||||
@@ -89,6 +79,7 @@ setting_up_container() {
|
|||||||
fi
|
fi
|
||||||
msg_ok "Set up Container OS"
|
msg_ok "Set up Container OS"
|
||||||
msg_ok "Network Connected: ${BL}$(ip addr show | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | tail -n1)${CL}"
|
msg_ok "Network Connected: ${BL}$(ip addr show | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | tail -n1)${CL}"
|
||||||
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
# This function checks the network connection by pinging a known IP address and prompts the user to continue if the internet is not connected
|
# This function checks the network connection by pinging a known IP address and prompts the user to continue if the internet is not connected
|
||||||
@@ -121,8 +112,18 @@ network_check() {
|
|||||||
update_os() {
|
update_os() {
|
||||||
msg_info "Updating Container OS"
|
msg_info "Updating Container OS"
|
||||||
$STD apk -U upgrade
|
$STD apk -U upgrade
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
local tools_content
|
||||||
|
tools_content=$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) || {
|
||||||
|
msg_error "Failed to download tools.func"
|
||||||
|
exit 6
|
||||||
|
}
|
||||||
|
source /dev/stdin <<<"$tools_content"
|
||||||
|
if ! declare -f fetch_and_deploy_gh_release >/dev/null 2>&1; then
|
||||||
|
msg_error "tools.func loaded but incomplete — missing expected functions"
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
msg_ok "Updated Container OS"
|
msg_ok "Updated Container OS"
|
||||||
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
# This function modifies the message of the day (motd) and SSH settings
|
# This function modifies the message of the day (motd) and SSH settings
|
||||||
|
|||||||
@@ -34,11 +34,19 @@ net_resolves() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ensure_usr_local_bin_persist() {
|
ensure_usr_local_bin_persist() {
|
||||||
|
# Login shells: /etc/profile.d/
|
||||||
local PROFILE_FILE="/etc/profile.d/10-localbin.sh"
|
local PROFILE_FILE="/etc/profile.d/10-localbin.sh"
|
||||||
if [ ! -f "$PROFILE_FILE" ]; then
|
if [ ! -f "$PROFILE_FILE" ]; then
|
||||||
echo 'case ":$PATH:" in *:/usr/local/bin:*) ;; *) export PATH="/usr/local/bin:$PATH";; esac' >"$PROFILE_FILE"
|
echo 'case ":$PATH:" in *:/usr/local/bin:*) ;; *) export PATH="/usr/local/bin:$PATH";; esac' >"$PROFILE_FILE"
|
||||||
chmod +x "$PROFILE_FILE"
|
chmod +x "$PROFILE_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Non-login shells (pct enter): /root/.profile and /root/.bashrc
|
||||||
|
for rc_file in /root/.profile /root/.bashrc; do
|
||||||
|
if [ -f "$rc_file" ] && ! grep -q '/usr/local/bin' "$rc_file"; then
|
||||||
|
echo 'export PATH="/usr/local/bin:$PATH"' >>"$rc_file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
download_with_progress() {
|
download_with_progress() {
|
||||||
|
|||||||
140
misc/api.func
140
misc/api.func
@@ -117,16 +117,17 @@ detect_repo_source
|
|||||||
# - Canonical source of truth for ALL exit code mappings
|
# - Canonical source of truth for ALL exit code mappings
|
||||||
# - Used by both api.func (telemetry) and error_handler.func (error display)
|
# - Used by both api.func (telemetry) and error_handler.func (error display)
|
||||||
# - Supports:
|
# - Supports:
|
||||||
# * Generic/Shell errors (1, 2, 124, 126-130, 134, 137, 139, 141, 143)
|
# * Generic/Shell errors (1-3, 10, 124-132, 134, 137, 139, 141, 143-146)
|
||||||
# * curl/wget errors (6, 7, 22, 28, 35)
|
# * curl/wget errors (4-8, 16, 18, 22-28, 30, 32-36, 39, 44-48, 51-52, 55-57, 59, 61, 63, 75, 78-79, 92, 95)
|
||||||
# * Package manager errors (APT, DPKG: 100-102, 255)
|
# * Package manager errors (APT, DPKG: 100-102, 255)
|
||||||
|
# * BSD sysexits (64-78)
|
||||||
# * Systemd/Service errors (150-154)
|
# * Systemd/Service errors (150-154)
|
||||||
# * Python/pip/uv errors (160-162)
|
# * Python/pip/uv errors (160-162)
|
||||||
# * PostgreSQL errors (170-173)
|
# * PostgreSQL errors (170-173)
|
||||||
# * MySQL/MariaDB errors (180-183)
|
# * MySQL/MariaDB errors (180-183)
|
||||||
# * MongoDB errors (190-193)
|
# * MongoDB errors (190-193)
|
||||||
# * Proxmox custom codes (200-231)
|
# * Proxmox custom codes (200-231)
|
||||||
# * Node.js/npm errors (243, 245-249)
|
# * Node.js/npm errors (239, 243, 245-249)
|
||||||
# - Returns description string for given exit code
|
# - Returns description string for given exit code
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
explain_exit_code() {
|
explain_exit_code() {
|
||||||
@@ -135,30 +136,87 @@ explain_exit_code() {
|
|||||||
# --- Generic / Shell ---
|
# --- Generic / Shell ---
|
||||||
1) echo "General error / Operation not permitted" ;;
|
1) echo "General error / Operation not permitted" ;;
|
||||||
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
||||||
|
3) echo "General syntax or argument error" ;;
|
||||||
|
10) echo "Docker / privileged mode required (unsupported environment)" ;;
|
||||||
|
|
||||||
# --- curl / wget errors (commonly seen in downloads) ---
|
# --- curl / wget errors (commonly seen in downloads) ---
|
||||||
|
4) echo "curl: Feature not supported or protocol error" ;;
|
||||||
|
5) echo "curl: Could not resolve proxy" ;;
|
||||||
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
||||||
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
||||||
|
8) echo "curl: Server reply error (FTP/SFTP or apk untrusted key)" ;;
|
||||||
|
16) echo "curl: HTTP/2 framing layer error" ;;
|
||||||
|
18) echo "curl: Partial file (transfer not completed)" ;;
|
||||||
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
||||||
|
23) echo "curl: Write error (disk full or permissions)" ;;
|
||||||
|
24) echo "curl: Write to local file failed" ;;
|
||||||
|
25) echo "curl: Upload failed" ;;
|
||||||
|
26) echo "curl: Read error on local file (I/O)" ;;
|
||||||
|
27) echo "curl: Out of memory (memory allocation failed)" ;;
|
||||||
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
||||||
|
30) echo "curl: FTP port command failed" ;;
|
||||||
|
32) echo "curl: FTP SIZE command failed" ;;
|
||||||
|
33) echo "curl: HTTP range error" ;;
|
||||||
|
34) echo "curl: HTTP post error" ;;
|
||||||
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
||||||
|
36) echo "curl: FTP bad download resume" ;;
|
||||||
|
39) echo "curl: LDAP search failed" ;;
|
||||||
|
44) echo "curl: Internal error (bad function call order)" ;;
|
||||||
|
45) echo "curl: Interface error (failed to bind to specified interface)" ;;
|
||||||
|
46) echo "curl: Bad password entered" ;;
|
||||||
|
47) echo "curl: Too many redirects" ;;
|
||||||
|
48) echo "curl: Unknown command line option specified" ;;
|
||||||
|
51) echo "curl: SSL peer certificate or SSH host key verification failed" ;;
|
||||||
|
52) echo "curl: Empty reply from server (got nothing)" ;;
|
||||||
|
55) echo "curl: Failed sending network data" ;;
|
||||||
|
56) echo "curl: Receive error (connection reset by peer)" ;;
|
||||||
|
57) echo "curl: Unrecoverable poll/select error (system I/O failure)" ;;
|
||||||
|
59) echo "curl: Couldn't use specified SSL cipher" ;;
|
||||||
|
61) echo "curl: Bad/unrecognized transfer encoding" ;;
|
||||||
|
63) echo "curl: Maximum file size exceeded" ;;
|
||||||
|
75) echo "Temporary failure (retry later)" ;;
|
||||||
|
78) echo "curl: Remote file not found (404 on FTP/file)" ;;
|
||||||
|
79) echo "curl: SSH session error (key exchange/auth failed)" ;;
|
||||||
|
92) echo "curl: HTTP/2 stream error (protocol violation)" ;;
|
||||||
|
95) echo "curl: HTTP/3 layer error" ;;
|
||||||
|
|
||||||
# --- Package manager / APT / DPKG ---
|
# --- Package manager / APT / DPKG ---
|
||||||
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
||||||
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
||||||
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
||||||
|
|
||||||
|
# --- BSD sysexits.h (64-78) ---
|
||||||
|
64) echo "Usage error (wrong arguments)" ;;
|
||||||
|
65) echo "Data format error (bad input data)" ;;
|
||||||
|
66) echo "Input file not found (cannot open input)" ;;
|
||||||
|
67) echo "User not found (addressee unknown)" ;;
|
||||||
|
68) echo "Host not found (hostname unknown)" ;;
|
||||||
|
69) echo "Service unavailable" ;;
|
||||||
|
70) echo "Internal software error" ;;
|
||||||
|
71) echo "System error (OS-level failure)" ;;
|
||||||
|
72) echo "Critical OS file missing" ;;
|
||||||
|
73) echo "Cannot create output file" ;;
|
||||||
|
74) echo "I/O error" ;;
|
||||||
|
76) echo "Remote protocol error" ;;
|
||||||
|
77) echo "Permission denied" ;;
|
||||||
|
|
||||||
# --- Common shell/system errors ---
|
# --- Common shell/system errors ---
|
||||||
124) echo "Command timed out (timeout command)" ;;
|
124) echo "Command timed out (timeout command)" ;;
|
||||||
|
125) echo "Command failed to start (Docker daemon or execution error)" ;;
|
||||||
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
||||||
127) echo "Command not found" ;;
|
127) echo "Command not found" ;;
|
||||||
128) echo "Invalid argument to exit" ;;
|
128) echo "Invalid argument to exit" ;;
|
||||||
|
129) echo "Killed by SIGHUP (terminal closed / hangup)" ;;
|
||||||
130) echo "Aborted by user (SIGINT)" ;;
|
130) echo "Aborted by user (SIGINT)" ;;
|
||||||
|
131) echo "Killed by SIGQUIT (core dumped)" ;;
|
||||||
|
132) echo "Killed by SIGILL (illegal CPU instruction)" ;;
|
||||||
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
||||||
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
||||||
139) echo "Segmentation fault (core dumped)" ;;
|
139) echo "Segmentation fault (core dumped)" ;;
|
||||||
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
||||||
143) echo "Terminated (SIGTERM)" ;;
|
143) echo "Terminated (SIGTERM)" ;;
|
||||||
|
144) echo "Killed by signal 16 (SIGUSR1 / SIGSTKFLT)" ;;
|
||||||
|
146) echo "Killed by signal 18 (SIGTSTP)" ;;
|
||||||
|
|
||||||
# --- Systemd / Service errors (150-154) ---
|
# --- Systemd / Service errors (150-154) ---
|
||||||
150) echo "Systemd: Service failed to start" ;;
|
150) echo "Systemd: Service failed to start" ;;
|
||||||
@@ -166,7 +224,6 @@ explain_exit_code() {
|
|||||||
152) echo "Permission denied (EACCES)" ;;
|
152) echo "Permission denied (EACCES)" ;;
|
||||||
153) echo "Build/compile failed (make/gcc/cmake)" ;;
|
153) echo "Build/compile failed (make/gcc/cmake)" ;;
|
||||||
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
|
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
|
||||||
|
|
||||||
# --- Python / pip / uv (160-162) ---
|
# --- Python / pip / uv (160-162) ---
|
||||||
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
|
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
|
||||||
161) echo "Python: Dependency resolution failed" ;;
|
161) echo "Python: Dependency resolution failed" ;;
|
||||||
@@ -217,7 +274,8 @@ explain_exit_code() {
|
|||||||
225) echo "Proxmox: No template available for OS/Version" ;;
|
225) echo "Proxmox: No template available for OS/Version" ;;
|
||||||
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
||||||
|
|
||||||
# --- Node.js / npm / pnpm / yarn (243-249) ---
|
# --- Node.js / npm / pnpm / yarn (239-249) ---
|
||||||
|
239) echo "npm/Node.js: Unexpected runtime error or dependency failure" ;;
|
||||||
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
||||||
245) echo "Node.js: Invalid command-line option" ;;
|
245) echo "Node.js: Invalid command-line option" ;;
|
||||||
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
||||||
@@ -494,6 +552,7 @@ post_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "lxc",
|
"type": "lxc",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "installing",
|
"status": "installing",
|
||||||
@@ -598,6 +657,7 @@ post_to_api_vm() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "installing",
|
"status": "installing",
|
||||||
@@ -624,6 +684,8 @@ EOF
|
|||||||
curl -fsS -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
curl -fsS -m "${TELEMETRY_TIMEOUT}" -X POST "${TELEMETRY_URL}" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "$JSON_PAYLOAD" &>/dev/null || true
|
-d "$JSON_PAYLOAD" &>/dev/null || true
|
||||||
|
|
||||||
|
POST_TO_API_DONE=true
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -728,6 +790,7 @@ post_update_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
@@ -770,6 +833,7 @@ EOF
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
@@ -812,6 +876,7 @@ EOF
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
@@ -848,6 +913,9 @@ categorize_error() {
|
|||||||
# Network errors (curl/wget)
|
# Network errors (curl/wget)
|
||||||
6 | 7 | 22 | 35) echo "network" ;;
|
6 | 7 | 22 | 35) echo "network" ;;
|
||||||
|
|
||||||
|
# Docker / Privileged mode required
|
||||||
|
10) echo "config" ;;
|
||||||
|
|
||||||
# Timeout errors
|
# Timeout errors
|
||||||
28 | 124 | 211) echo "timeout" ;;
|
28 | 124 | 211) echo "timeout" ;;
|
||||||
|
|
||||||
@@ -922,6 +990,63 @@ get_install_duration() {
|
|||||||
echo $((now - INSTALL_START_TIME))
|
echo $((now - INSTALL_START_TIME))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# _telemetry_report_exit()
|
||||||
|
#
|
||||||
|
# - Internal handler called by EXIT trap set in init_tool_telemetry()
|
||||||
|
# - Determines success/failure from exit code and reports via appropriate API
|
||||||
|
# - Arguments:
|
||||||
|
# * $1: exit_code from the script
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
_telemetry_report_exit() {
|
||||||
|
local ec="${1:-0}"
|
||||||
|
local status="success"
|
||||||
|
[[ "$ec" -ne 0 ]] && status="failed"
|
||||||
|
|
||||||
|
# Lazy name resolution: use explicit name, fall back to $APP, then "unknown"
|
||||||
|
local name="${TELEMETRY_TOOL_NAME:-${APP:-unknown}}"
|
||||||
|
|
||||||
|
if [[ "${TELEMETRY_TOOL_TYPE:-pve}" == "addon" ]]; then
|
||||||
|
post_addon_to_api "$name" "$status" "$ec"
|
||||||
|
else
|
||||||
|
post_tool_to_api "$name" "$status" "$ec"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# init_tool_telemetry()
|
||||||
|
#
|
||||||
|
# - One-line telemetry setup for tools/addon scripts
|
||||||
|
# - Reads DIAGNOSTICS from /usr/local/community-scripts/diagnostics
|
||||||
|
# (persisted on PVE host during first build, and inside containers by install.func)
|
||||||
|
# - Starts install timer for duration tracking
|
||||||
|
# - Sets EXIT trap to automatically report success/failure on script exit
|
||||||
|
# - Arguments:
|
||||||
|
# * $1: tool_name (optional, falls back to $APP at exit time)
|
||||||
|
# * $2: type ("pve" for PVE host scripts, "addon" for container addons)
|
||||||
|
# - Usage:
|
||||||
|
# source <(curl -fsSL .../misc/api.func) 2>/dev/null || true
|
||||||
|
# init_tool_telemetry "post-pve-install" "pve"
|
||||||
|
# init_tool_telemetry "" "addon" # uses $APP at exit time
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
init_tool_telemetry() {
|
||||||
|
local name="${1:-}"
|
||||||
|
local type="${2:-pve}"
|
||||||
|
|
||||||
|
[[ -n "$name" ]] && TELEMETRY_TOOL_NAME="$name"
|
||||||
|
TELEMETRY_TOOL_TYPE="$type"
|
||||||
|
|
||||||
|
# Read diagnostics opt-in/opt-out
|
||||||
|
if [[ -f /usr/local/community-scripts/diagnostics ]]; then
|
||||||
|
DIAGNOSTICS=$(grep -i "^DIAGNOSTICS=" /usr/local/community-scripts/diagnostics 2>/dev/null | awk -F'=' '{print $2}') || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
start_install_timer
|
||||||
|
|
||||||
|
# EXIT trap: automatically report telemetry when script ends
|
||||||
|
trap '_telemetry_report_exit "$?"' EXIT
|
||||||
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# post_tool_to_api()
|
# post_tool_to_api()
|
||||||
#
|
#
|
||||||
@@ -969,7 +1094,8 @@ post_tool_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${uuid}",
|
"random_id": "${uuid}",
|
||||||
"type": "tool",
|
"execution_id": "${EXECUTION_ID:-${uuid}}",
|
||||||
|
"type": "pve",
|
||||||
"nsapp": "${tool_name}",
|
"nsapp": "${tool_name}",
|
||||||
"status": "${status}",
|
"status": "${status}",
|
||||||
"exit_code": ${exit_code},
|
"exit_code": ${exit_code},
|
||||||
@@ -1036,6 +1162,7 @@ post_addon_to_api() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${uuid}",
|
"random_id": "${uuid}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${uuid}}",
|
||||||
"type": "addon",
|
"type": "addon",
|
||||||
"nsapp": "${addon_name}",
|
"nsapp": "${addon_name}",
|
||||||
"status": "${status}",
|
"status": "${status}",
|
||||||
@@ -1127,6 +1254,7 @@ post_update_to_api_extended() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"random_id": "${RANDOM_UUID}",
|
"random_id": "${RANDOM_UUID}",
|
||||||
|
"execution_id": "${EXECUTION_ID:-${RANDOM_UUID}}",
|
||||||
"type": "${TELEMETRY_TYPE:-lxc}",
|
"type": "${TELEMETRY_TYPE:-lxc}",
|
||||||
"nsapp": "${NSAPP:-unknown}",
|
"nsapp": "${NSAPP:-unknown}",
|
||||||
"status": "${pb_status}",
|
"status": "${pb_status}",
|
||||||
|
|||||||
479
misc/build.func
479
misc/build.func
@@ -42,9 +42,10 @@ variables() {
|
|||||||
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
||||||
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
||||||
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
||||||
DIAGNOSTICS="yes" # sets the DIAGNOSTICS variable to "yes", used for the API call.
|
DIAGNOSTICS="no" # Safe default: no telemetry until user consents via diagnostics_check()
|
||||||
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
||||||
|
EXECUTION_ID="${RANDOM_UUID}" # Unique execution ID for telemetry record identification (unique-indexed in PocketBase)
|
||||||
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
||||||
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
||||||
combined_log="/tmp/install-${SESSION_ID}-combined.log" # Combined log (build + install) for failed installations
|
combined_log="/tmp/install-${SESSION_ID}-combined.log" # Combined log (build + install) for failed installations
|
||||||
@@ -2787,93 +2788,85 @@ Advanced:
|
|||||||
# diagnostics_check()
|
# diagnostics_check()
|
||||||
#
|
#
|
||||||
# - Ensures diagnostics config file exists at /usr/local/community-scripts/diagnostics
|
# - Ensures diagnostics config file exists at /usr/local/community-scripts/diagnostics
|
||||||
# - Asks user whether to send anonymous diagnostic data
|
# - Asks user whether to send anonymous diagnostic data (first run only)
|
||||||
# - Saves DIAGNOSTICS=yes/no in the config file
|
# - Saves DIAGNOSTICS=yes/no in the config file
|
||||||
# - Creates file if missing with default DIAGNOSTICS=yes
|
# - Reads current diagnostics setting from existing file
|
||||||
# - Reads current diagnostics setting from file
|
|
||||||
# - Sets global DIAGNOSTICS variable for API telemetry opt-in/out
|
# - Sets global DIAGNOSTICS variable for API telemetry opt-in/out
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
diagnostics_check() {
|
diagnostics_check() {
|
||||||
if ! [ -d "/usr/local/community-scripts" ]; then
|
local config_dir="/usr/local/community-scripts"
|
||||||
mkdir -p /usr/local/community-scripts
|
local config_file="${config_dir}/diagnostics"
|
||||||
|
|
||||||
|
mkdir -p "$config_dir"
|
||||||
|
|
||||||
|
if [[ -f "$config_file" ]]; then
|
||||||
|
DIAGNOSTICS=$(awk -F '=' '/^DIAGNOSTICS/ {print $2}' "$config_file") || true
|
||||||
|
DIAGNOSTICS="${DIAGNOSTICS:-no}"
|
||||||
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [ -f "/usr/local/community-scripts/diagnostics" ]; then
|
local result
|
||||||
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS" --yesno "Send Diagnostics of LXC Installation?\n\n(This only transmits data without user data, just RAM, CPU, LXC name, ...)" 10 58); then
|
result=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
cat <<EOF >/usr/local/community-scripts/diagnostics
|
--title "TELEMETRY & DIAGNOSTICS" \
|
||||||
DIAGNOSTICS=yes
|
--ok-button "Confirm" --cancel-button "Exit" \
|
||||||
|
--radiolist "\nHelp improve Community-Scripts by sharing anonymous data.\n\nWhat we collect:\n - Container resources (CPU, RAM, disk), OS & PVE version\n - Application name, install method and status\n\nWhat we DON'T collect:\n - No IP addresses, hostnames, or personal data\n\nYou can change this anytime in the Settings menu.\nPrivacy: https://github.com/community-scripts/telemetry-service/blob/main/docs/PRIVACY.md\n\nUse SPACE to select, ENTER to confirm." 22 76 2 \
|
||||||
|
"yes" "Yes, share anonymous data" OFF \
|
||||||
|
"no" "No, opt out" OFF \
|
||||||
|
3>&1 1>&2 2>&3) || result="no"
|
||||||
|
|
||||||
#This file is used to store the diagnostics settings for the Community-Scripts API.
|
DIAGNOSTICS="${result:-no}"
|
||||||
#https://github.com/community-scripts/ProxmoxVE/discussions/1836
|
|
||||||
#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
|
cat <<EOF >"$config_file"
|
||||||
#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
|
DIAGNOSTICS=${DIAGNOSTICS}
|
||||||
#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
|
|
||||||
#This will disable the diagnostics feature.
|
# Community-Scripts Telemetry Configuration
|
||||||
#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
|
# https://telemetry.community-scripts.org
|
||||||
#This will enable the diagnostics feature.
|
#
|
||||||
#The following information will be sent:
|
# This file stores your telemetry preference.
|
||||||
#"disk_size"
|
# Set DIAGNOSTICS=yes to share anonymous installation data.
|
||||||
#"core_count"
|
# Set DIAGNOSTICS=no to disable telemetry.
|
||||||
#"ram_size"
|
#
|
||||||
#"os_type"
|
# You can also change this via the Settings menu during installation.
|
||||||
#"os_version"
|
#
|
||||||
#"nsapp"
|
# Data collected (when enabled):
|
||||||
#"method"
|
# disk_size, core_count, ram_size, os_type, os_version,
|
||||||
#"pve_version"
|
# nsapp, method, pve_version, status, exit_code
|
||||||
#"status"
|
#
|
||||||
#If you have any concerns, please review the source code at /misc/build.func
|
# No personal data (IPs, hostnames, passwords) is ever collected.
|
||||||
|
# Privacy: https://github.com/community-scripts/telemetry-service/blob/main/docs/PRIVACY.md
|
||||||
EOF
|
EOF
|
||||||
DIAGNOSTICS="yes"
|
|
||||||
else
|
|
||||||
cat <<EOF >/usr/local/community-scripts/diagnostics
|
|
||||||
DIAGNOSTICS=no
|
|
||||||
|
|
||||||
#This file is used to store the diagnostics settings for the Community-Scripts API.
|
|
||||||
#https://github.com/community-scripts/ProxmoxVE/discussions/1836
|
|
||||||
#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
|
|
||||||
#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
|
|
||||||
#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
|
|
||||||
#This will disable the diagnostics feature.
|
|
||||||
#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
|
|
||||||
#This will enable the diagnostics feature.
|
|
||||||
#The following information will be sent:
|
|
||||||
#"disk_size"
|
|
||||||
#"core_count"
|
|
||||||
#"ram_size"
|
|
||||||
#"os_type"
|
|
||||||
#"os_version"
|
|
||||||
#"nsapp"
|
|
||||||
#"method"
|
|
||||||
#"pve_version"
|
|
||||||
#"status"
|
|
||||||
#If you have any concerns, please review the source code at /misc/build.func
|
|
||||||
EOF
|
|
||||||
DIAGNOSTICS="no"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
DIAGNOSTICS=$(awk -F '=' '/^DIAGNOSTICS/ {print $2}' /usr/local/community-scripts/diagnostics)
|
|
||||||
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
diagnostics_menu() {
|
diagnostics_menu() {
|
||||||
if [ "${DIAGNOSTICS:-no}" = "yes" ]; then
|
local current="${DIAGNOSTICS:-no}"
|
||||||
|
local status_text="DISABLED"
|
||||||
|
[[ "$current" == "yes" ]] && status_text="ENABLED"
|
||||||
|
|
||||||
|
local dialog_text=(
|
||||||
|
"Telemetry is currently: ${status_text}\n\n"
|
||||||
|
"Anonymous data helps us improve scripts and track issues.\n"
|
||||||
|
"No personal data is ever collected.\n\n"
|
||||||
|
"More info: https://telemetry.community-scripts.org\n\n"
|
||||||
|
"Do you want to ${current:+change this setting}?"
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ "$current" == "yes" ]]; then
|
||||||
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
--title "DIAGNOSTIC SETTINGS" \
|
--title "TELEMETRY SETTINGS" \
|
||||||
--yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \
|
--yesno "${dialog_text[*]}" 14 64 \
|
||||||
--yes-button "No" --no-button "Back"; then
|
--yes-button "Disable" --no-button "Keep enabled"; then
|
||||||
DIAGNOSTICS="no"
|
DIAGNOSTICS="no"
|
||||||
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics
|
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics
|
||||||
whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58
|
whiptail --msgbox "Telemetry disabled.\n\nNote: Existing containers keep their current setting.\nNew containers will inherit this choice." 10 58
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
if whiptail --backtitle "Proxmox VE Helper Scripts" \
|
||||||
--title "DIAGNOSTIC SETTINGS" \
|
--title "TELEMETRY SETTINGS" \
|
||||||
--yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \
|
--yesno "${dialog_text[*]}" 14 64 \
|
||||||
--yes-button "Yes" --no-button "Back"; then
|
--yes-button "Enable" --no-button "Keep disabled"; then
|
||||||
DIAGNOSTICS="yes"
|
DIAGNOSTICS="yes"
|
||||||
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics
|
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics
|
||||||
whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58
|
whiptail --msgbox "Telemetry enabled.\n\nNote: Existing containers keep their current setting.\nNew containers will inherit this choice." 10 58
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -3427,6 +3420,7 @@ start() {
|
|||||||
VERBOSE="no"
|
VERBOSE="no"
|
||||||
set_std_mode
|
set_std_mode
|
||||||
ensure_profile_loaded
|
ensure_profile_loaded
|
||||||
|
get_lxc_ip
|
||||||
update_script
|
update_script
|
||||||
update_motd_ip
|
update_motd_ip
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
@@ -3454,6 +3448,7 @@ start() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
ensure_profile_loaded
|
ensure_profile_loaded
|
||||||
|
get_lxc_ip
|
||||||
update_script
|
update_script
|
||||||
update_motd_ip
|
update_motd_ip
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
@@ -3559,6 +3554,7 @@ build_container() {
|
|||||||
# Core exports for install.func
|
# Core exports for install.func
|
||||||
export DIAGNOSTICS="$DIAGNOSTICS"
|
export DIAGNOSTICS="$DIAGNOSTICS"
|
||||||
export RANDOM_UUID="$RANDOM_UUID"
|
export RANDOM_UUID="$RANDOM_UUID"
|
||||||
|
export EXECUTION_ID="$EXECUTION_ID"
|
||||||
export SESSION_ID="$SESSION_ID"
|
export SESSION_ID="$SESSION_ID"
|
||||||
export CACHER="$APT_CACHER"
|
export CACHER="$APT_CACHER"
|
||||||
export CACHER_IP="$APT_CACHER_IP"
|
export CACHER_IP="$APT_CACHER_IP"
|
||||||
@@ -4038,6 +4034,13 @@ EOF'
|
|||||||
|
|
||||||
msg_ok "Customized LXC Container"
|
msg_ok "Customized LXC Container"
|
||||||
|
|
||||||
|
# Optional DNS override for retry scenarios (inside LXC, never on host)
|
||||||
|
if [[ "${DNS_RETRY_OVERRIDE:-false}" == "true" ]]; then
|
||||||
|
msg_info "Applying DNS retry override in LXC (8.8.8.8, 1.1.1.1)"
|
||||||
|
pct exec "$CTID" -- bash -c "printf 'nameserver 8.8.8.8\nnameserver 1.1.1.1\n' >/etc/resolv.conf" >/dev/null 2>&1 || true
|
||||||
|
msg_ok "DNS override applied in LXC"
|
||||||
|
fi
|
||||||
|
|
||||||
# Install SSH keys
|
# Install SSH keys
|
||||||
install_ssh_keys_into_ct
|
install_ssh_keys_into_ct
|
||||||
|
|
||||||
@@ -4150,20 +4153,155 @@ EOF'
|
|||||||
|
|
||||||
# Prompt user for cleanup with 60s timeout
|
# Prompt user for cleanup with 60s timeout
|
||||||
echo ""
|
echo ""
|
||||||
echo -en "${TAB}❓${TAB}${YW}Remove broken container ${CTID}? (Y/n) [auto-remove in 60s]: ${CL}"
|
|
||||||
|
# Detect error type for smart recovery options
|
||||||
|
local is_oom=false
|
||||||
|
local is_network_issue=false
|
||||||
|
local is_apt_issue=false
|
||||||
|
local is_cmd_not_found=false
|
||||||
|
local error_explanation=""
|
||||||
|
if declare -f explain_exit_code >/dev/null 2>&1; then
|
||||||
|
error_explanation="$(explain_exit_code "$install_exit_code")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OOM detection: exit codes 134 (SIGABRT/heap), 137 (SIGKILL/OOM), 243 (Node.js heap)
|
||||||
|
if [[ $install_exit_code -eq 134 || $install_exit_code -eq 137 || $install_exit_code -eq 243 ]]; then
|
||||||
|
is_oom=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# APT/DPKG detection: exit codes 100-102 (APT), 255 (DPKG with log evidence)
|
||||||
|
case "$install_exit_code" in
|
||||||
|
100 | 101 | 102) is_apt_issue=true ;;
|
||||||
|
255)
|
||||||
|
if [[ -f "$combined_log" ]] && grep -qiE 'dpkg|apt-get|apt\.conf|broken packages|unmet dependencies|E: Sub-process|E: Failed' "$combined_log"; then
|
||||||
|
is_apt_issue=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Command not found detection
|
||||||
|
if [[ $install_exit_code -eq 127 ]]; then
|
||||||
|
is_cmd_not_found=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Network-related detection (curl/apt/git fetch failures and transient network issues)
|
||||||
|
case "$install_exit_code" in
|
||||||
|
6 | 7 | 22 | 28 | 35 | 52 | 56 | 57 | 75 | 78) is_network_issue=true ;;
|
||||||
|
100)
|
||||||
|
# APT can fail due to network (Failed to fetch)
|
||||||
|
if [[ -f "$combined_log" ]] && grep -qiE 'Failed to fetch|Could not resolve|Connection failed|Network is unreachable|Temporary failure resolving' "$combined_log"; then
|
||||||
|
is_network_issue=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
128)
|
||||||
|
if [[ -f "$combined_log" ]] && grep -qiE 'RPC failed|early EOF|fetch-pack|HTTP/2 stream|Could not resolve host|Temporary failure resolving|Failed to fetch|Connection reset|Network is unreachable' "$combined_log"; then
|
||||||
|
is_network_issue=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Exit 1 subclassification: analyze logs to identify actual root cause
|
||||||
|
# Many exit 1 errors are actually APT, OOM, network, or command-not-found issues
|
||||||
|
if [[ $install_exit_code -eq 1 && -f "$combined_log" ]]; then
|
||||||
|
if grep -qiE 'E: Unable to|E: Package|E: Failed to fetch|dpkg.*error|broken packages|unmet dependencies|dpkg --configure -a' "$combined_log"; then
|
||||||
|
is_apt_issue=true
|
||||||
|
fi
|
||||||
|
if grep -qiE 'Cannot allocate memory|Out of memory|oom-killer|Killed process|JavaScript heap' "$combined_log"; then
|
||||||
|
is_oom=true
|
||||||
|
fi
|
||||||
|
if grep -qiE 'Could not resolve|DNS|Connection refused|Network is unreachable|No route to host|Temporary failure resolving|Failed to fetch' "$combined_log"; then
|
||||||
|
is_network_issue=true
|
||||||
|
fi
|
||||||
|
if grep -qiE ': command not found|No such file or directory.*/s?bin/' "$combined_log"; then
|
||||||
|
is_cmd_not_found=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show error explanation if available
|
||||||
|
if [[ -n "$error_explanation" ]]; then
|
||||||
|
echo -e "${TAB}${RD}Error: ${error_explanation}${CL}"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show specific hints for known error types
|
||||||
|
if [[ $install_exit_code -eq 10 ]]; then
|
||||||
|
echo -e "${TAB}${INFO} This error usually means the container needs ${GN}privileged${CL} mode or Docker/nesting support."
|
||||||
|
echo -e "${TAB}${INFO} Recreate with: Advanced Install → Container Type: ${GN}Privileged${CL}"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $install_exit_code -eq 125 || $install_exit_code -eq 126 ]]; then
|
||||||
|
echo -e "${TAB}${INFO} The command exists but cannot be executed. This may be a ${GN}permission${CL} issue."
|
||||||
|
echo -e "${TAB}${INFO} If using Docker, ensure the container is ${GN}privileged${CL} or has correct permissions."
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$is_cmd_not_found" == true ]]; then
|
||||||
|
local missing_cmd=""
|
||||||
|
if [[ -f "$combined_log" ]]; then
|
||||||
|
missing_cmd=$(grep -oiE '[a-zA-Z0-9_.-]+: command not found' "$combined_log" | tail -1 | sed 's/: command not found//')
|
||||||
|
fi
|
||||||
|
if [[ -n "$missing_cmd" ]]; then
|
||||||
|
echo -e "${TAB}${INFO} Missing command: ${GN}${missing_cmd}${CL}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build recovery menu based on error type
|
||||||
|
echo -e "${YW}What would you like to do?${CL}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GN}1)${CL} Remove container and exit"
|
||||||
|
echo -e " ${GN}2)${CL} Keep container for debugging"
|
||||||
|
echo -e " ${GN}3)${CL} Retry with verbose mode (full rebuild)"
|
||||||
|
|
||||||
|
local next_option=4
|
||||||
|
local APT_OPTION="" OOM_OPTION="" DNS_OPTION=""
|
||||||
|
|
||||||
|
if [[ "$is_apt_issue" == true ]]; then
|
||||||
|
if [[ "$var_os" == "alpine" ]]; then
|
||||||
|
echo -e " ${GN}${next_option})${CL} Repair APK state and re-run install (in-place)"
|
||||||
|
else
|
||||||
|
echo -e " ${GN}${next_option})${CL} Repair APT/DPKG state and re-run install (in-place)"
|
||||||
|
fi
|
||||||
|
APT_OPTION=$next_option
|
||||||
|
next_option=$((next_option + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$is_oom" == true ]]; then
|
||||||
|
local recovery_attempt="${RECOVERY_ATTEMPT:-0}"
|
||||||
|
if [[ $recovery_attempt -lt 2 ]]; then
|
||||||
|
local new_ram=$((RAM_SIZE * 2))
|
||||||
|
local new_cpu=$((CORE_COUNT * 2))
|
||||||
|
echo -e " ${GN}${next_option})${CL} Retry with more resources (RAM: ${RAM_SIZE}→${new_ram} MiB, CPU: ${CORE_COUNT}→${new_cpu} cores)"
|
||||||
|
OOM_OPTION=$next_option
|
||||||
|
next_option=$((next_option + 1))
|
||||||
|
else
|
||||||
|
echo -e " ${DGN}-)${CL} ${DGN}OOM retry exhausted (already retried ${recovery_attempt}x)${CL}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$is_network_issue" == true ]]; then
|
||||||
|
echo -e " ${GN}${next_option})${CL} Retry with DNS override in LXC (8.8.8.8 / 1.1.1.1)"
|
||||||
|
DNS_OPTION=$next_option
|
||||||
|
next_option=$((next_option + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
local max_option=$((next_option - 1))
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -en "${YW}Select option [1-${max_option}] (default: 1, auto-remove in 60s): ${CL}"
|
||||||
|
|
||||||
if read -t 60 -r response; then
|
if read -t 60 -r response; then
|
||||||
if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then
|
case "${response:-1}" in
|
||||||
|
1)
|
||||||
# Remove container
|
# Remove container
|
||||||
echo ""
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID}${CL}"
|
||||||
msg_info "Removing container ${CTID}"
|
|
||||||
pct stop "$CTID" &>/dev/null || true
|
pct stop "$CTID" &>/dev/null || true
|
||||||
pct destroy "$CTID" &>/dev/null || true
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
msg_ok "Container ${CTID} removed"
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
elif [[ "$response" =~ ^[Nn]$ ]]; then
|
;;
|
||||||
echo ""
|
2)
|
||||||
msg_warn "Container ${CTID} kept for debugging"
|
echo -e "\n${TAB}${YW}Container ${CTID} kept for debugging${CL}"
|
||||||
|
|
||||||
# Dev mode: Setup MOTD/SSH for debugging access to broken container
|
# Dev mode: Setup MOTD/SSH for debugging access to broken container
|
||||||
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
|
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
|
||||||
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
|
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
|
||||||
@@ -4175,7 +4313,162 @@ EOF'
|
|||||||
echo -e "${BFR}${CM}${GN}MOTD/SSH ready - SSH into container: ssh root@${ct_ip}${CL}"
|
echo -e "${BFR}${CM}${GN}MOTD/SSH ready - SSH into container: ssh root@${ct_ip}${CL}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
exit $install_exit_code
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
# Retry with verbose mode (full rebuild)
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild...${CL}"
|
||||||
|
pct stop "$CTID" &>/dev/null || true
|
||||||
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
|
echo ""
|
||||||
|
# Get new container ID
|
||||||
|
local old_ctid="$CTID"
|
||||||
|
export CTID=$(get_valid_container_id "$CTID")
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
|
||||||
|
# Show rebuild summary
|
||||||
|
echo -e "${YW}Rebuilding with preserved settings:${CL}"
|
||||||
|
echo -e " Container ID: ${old_ctid} → ${CTID}"
|
||||||
|
echo -e " RAM: ${RAM_SIZE} MiB | CPU: ${CORE_COUNT} cores | Disk: ${DISK_SIZE} GB"
|
||||||
|
echo -e " Network: ${NET:-dhcp} | Bridge: ${BRG:-vmbr0}"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Restarting installation..."
|
||||||
|
# Re-run build_container
|
||||||
|
build_container
|
||||||
|
return $?
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Handle dynamic smart recovery options via named option variables
|
||||||
|
local handled=false
|
||||||
|
|
||||||
|
if [[ -n "${APT_OPTION}" && "${response}" == "${APT_OPTION}" ]]; then
|
||||||
|
# Package manager in-place repair: fix broken state and re-run install script
|
||||||
|
handled=true
|
||||||
|
if [[ "$var_os" == "alpine" ]]; then
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Repairing APK state in container ${CTID}...${CL}"
|
||||||
|
pct exec "$CTID" -- ash -c "
|
||||||
|
apk fix 2>/dev/null || true
|
||||||
|
apk cache clean 2>/dev/null || true
|
||||||
|
apk update 2>/dev/null || true
|
||||||
|
" >/dev/null 2>&1 || true
|
||||||
|
echo -e "${BFR}${CM}${GN}APK state repaired in container ${CTID}${CL}"
|
||||||
|
else
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Repairing APT/DPKG state in container ${CTID}...${CL}"
|
||||||
|
pct exec "$CTID" -- bash -c "
|
||||||
|
DEBIAN_FRONTEND=noninteractive dpkg --configure -a 2>/dev/null || true
|
||||||
|
apt-get -f install -y 2>/dev/null || true
|
||||||
|
apt-get clean 2>/dev/null
|
||||||
|
apt-get update 2>/dev/null || true
|
||||||
|
" >/dev/null 2>&1 || true
|
||||||
|
echo -e "${BFR}${CM}${GN}APT/DPKG state repaired in container ${CTID}${CL}"
|
||||||
fi
|
fi
|
||||||
|
echo ""
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
|
||||||
|
echo -e "${YW}Re-running installation in existing container ${CTID}:${CL}"
|
||||||
|
echo -e " RAM: ${RAM_SIZE} MiB | CPU: ${CORE_COUNT} cores | Disk: ${DISK_SIZE} GB"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Re-running installation script..."
|
||||||
|
|
||||||
|
# Re-run install script in existing container (don't destroy/recreate)
|
||||||
|
set +Eeuo pipefail
|
||||||
|
trap - ERR
|
||||||
|
lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/${var_install}.sh)"
|
||||||
|
local apt_retry_exit=$?
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
# Check for error flag from retry
|
||||||
|
local apt_retry_code=0
|
||||||
|
if [[ -n "${SESSION_ID:-}" ]]; then
|
||||||
|
local retry_error_flag="/root/.install-${SESSION_ID}.failed"
|
||||||
|
if pct exec "$CTID" -- test -f "$retry_error_flag" 2>/dev/null; then
|
||||||
|
apt_retry_code=$(pct exec "$CTID" -- cat "$retry_error_flag" 2>/dev/null || echo "1")
|
||||||
|
pct exec "$CTID" -- rm -f "$retry_error_flag" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $apt_retry_code -eq 0 && $apt_retry_exit -ne 0 ]]; then
|
||||||
|
apt_retry_code=$apt_retry_exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $apt_retry_code -eq 0 ]]; then
|
||||||
|
msg_ok "Installation completed successfully after APT repair!"
|
||||||
|
post_update_to_api "done" "0" "force"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
msg_error "Installation still failed after APT repair (exit code: ${apt_retry_code})"
|
||||||
|
install_exit_code=$apt_retry_code
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${OOM_OPTION}" && "${response}" == "${OOM_OPTION}" ]]; then
|
||||||
|
# Retry with doubled resources
|
||||||
|
handled=true
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild with more resources...${CL}"
|
||||||
|
pct stop "$CTID" &>/dev/null || true
|
||||||
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
|
echo ""
|
||||||
|
local old_ctid="$CTID"
|
||||||
|
local old_ram="$RAM_SIZE"
|
||||||
|
local old_cpu="$CORE_COUNT"
|
||||||
|
export CTID=$(get_valid_container_id "$CTID")
|
||||||
|
export RAM_SIZE=$((RAM_SIZE * 2))
|
||||||
|
export CORE_COUNT=$((CORE_COUNT * 2))
|
||||||
|
export var_ram="$RAM_SIZE"
|
||||||
|
export var_cpu="$CORE_COUNT"
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
export RECOVERY_ATTEMPT=$((${RECOVERY_ATTEMPT:-0} + 1))
|
||||||
|
|
||||||
|
echo -e "${YW}Rebuilding with increased resources (attempt ${RECOVERY_ATTEMPT}/2):${CL}"
|
||||||
|
echo -e " Container ID: ${old_ctid} → ${CTID}"
|
||||||
|
echo -e " RAM: ${old_ram} → ${GN}${RAM_SIZE}${CL} MiB (x2)"
|
||||||
|
echo -e " CPU: ${old_cpu} → ${GN}${CORE_COUNT}${CL} cores (x2)"
|
||||||
|
echo -e " Disk: ${DISK_SIZE} GB | Network: ${NET:-dhcp} | Bridge: ${BRG:-vmbr0}"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Restarting installation..."
|
||||||
|
build_container
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${DNS_OPTION}" && "${response}" == "${DNS_OPTION}" ]]; then
|
||||||
|
# Retry with DNS override in LXC
|
||||||
|
handled=true
|
||||||
|
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild with DNS override...${CL}"
|
||||||
|
pct stop "$CTID" &>/dev/null || true
|
||||||
|
pct destroy "$CTID" &>/dev/null || true
|
||||||
|
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
|
||||||
|
echo ""
|
||||||
|
local old_ctid="$CTID"
|
||||||
|
export CTID=$(get_valid_container_id "$CTID")
|
||||||
|
export DNS_RETRY_OVERRIDE="true"
|
||||||
|
export VERBOSE="yes"
|
||||||
|
export var_verbose="yes"
|
||||||
|
|
||||||
|
echo -e "${YW}Rebuilding with DNS override in LXC:${CL}"
|
||||||
|
echo -e " Container ID: ${old_ctid} → ${CTID}"
|
||||||
|
echo -e " DNS: ${GN}8.8.8.8, 1.1.1.1${CL} (inside LXC only)"
|
||||||
|
echo -e " Verbose: ${GN}enabled${CL}"
|
||||||
|
echo ""
|
||||||
|
msg_info "Restarting installation..."
|
||||||
|
build_container
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$handled" == false ]]; then
|
||||||
|
echo -e "\n${TAB}${YW}Invalid option. Container ${CTID} kept.${CL}"
|
||||||
|
exit $install_exit_code
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
else
|
else
|
||||||
# Timeout - auto-remove
|
# Timeout - auto-remove
|
||||||
echo ""
|
echo ""
|
||||||
@@ -5253,20 +5546,36 @@ ensure_log_on_host() {
|
|||||||
# - Exit trap handler for reporting to API telemetry
|
# - Exit trap handler for reporting to API telemetry
|
||||||
# - Captures exit code and reports to PocketBase using centralized error descriptions
|
# - Captures exit code and reports to PocketBase using centralized error descriptions
|
||||||
# - Uses explain_exit_code() from api.func for consistent error messages
|
# - Uses explain_exit_code() from api.func for consistent error messages
|
||||||
# - Posts failure status with exit code to API (error description resolved automatically)
|
# - For signal exits (>128): sends telemetry FIRST before log collection
|
||||||
# - Only executes on non-zero exit codes
|
# to prevent pct pull hangs from blocking status updates
|
||||||
|
# - For non-zero exit codes: posts "failed" status
|
||||||
|
# - For zero exit codes where post_update_to_api was never called:
|
||||||
|
# catches orphaned "installing" records (e.g., script exited cleanly
|
||||||
|
# but description() was never reached)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
api_exit_script() {
|
api_exit_script() {
|
||||||
exit_code=$?
|
local exit_code=$?
|
||||||
if [ $exit_code -ne 0 ]; then
|
if [ $exit_code -ne 0 ]; then
|
||||||
ensure_log_on_host
|
if [ $exit_code -gt 128 ]; then
|
||||||
|
# Signal exit: send telemetry IMMEDIATELY (container may be dying)
|
||||||
|
post_update_to_api "failed" "$exit_code" 2>/dev/null || true
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
|
else
|
||||||
|
# Normal error: collect logs first for better error details
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
post_update_to_api "failed" "$exit_code"
|
post_update_to_api "failed" "$exit_code"
|
||||||
fi
|
fi
|
||||||
|
elif [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
# Script exited with 0 but never sent a completion status
|
||||||
|
# exit_code=0 is never an error — report as success
|
||||||
|
post_update_to_api "done" "0"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if command -v pveversion >/dev/null 2>&1; then
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
trap 'api_exit_script' EXIT
|
trap 'api_exit_script' EXIT
|
||||||
fi
|
fi
|
||||||
trap 'ensure_log_on_host; post_update_to_api "failed" "$?"' ERR
|
trap 'local _ec=$?; if [[ $_ec -ne 0 ]]; then ensure_log_on_host 2>/dev/null || true; post_update_to_api "failed" "$_ec"; fi' ERR
|
||||||
trap 'ensure_log_on_host; post_update_to_api "failed" "130"; exit 130' SIGINT
|
trap 'post_update_to_api "failed" "129" 2>/dev/null || true; ensure_log_on_host 2>/dev/null || true; exit 129' SIGHUP
|
||||||
trap 'ensure_log_on_host; post_update_to_api "failed" "143"; exit 143' SIGTERM
|
trap 'post_update_to_api "failed" "130" 2>/dev/null || true; ensure_log_on_host 2>/dev/null || true; exit 130' SIGINT
|
||||||
|
trap 'post_update_to_api "failed" "143" 2>/dev/null || true; ensure_log_on_host 2>/dev/null || true; exit 143' SIGTERM
|
||||||
|
|||||||
@@ -37,24 +37,79 @@ if ! declare -f explain_exit_code &>/dev/null; then
|
|||||||
case "$code" in
|
case "$code" in
|
||||||
1) echo "General error / Operation not permitted" ;;
|
1) echo "General error / Operation not permitted" ;;
|
||||||
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
|
||||||
|
3) echo "General syntax or argument error" ;;
|
||||||
|
10) echo "Docker / privileged mode required (unsupported environment)" ;;
|
||||||
|
4) echo "curl: Feature not supported or protocol error" ;;
|
||||||
|
5) echo "curl: Could not resolve proxy" ;;
|
||||||
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
|
||||||
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
|
||||||
|
8) echo "curl: Server reply error (FTP/SFTP or apk untrusted key)" ;;
|
||||||
|
16) echo "curl: HTTP/2 framing layer error" ;;
|
||||||
|
18) echo "curl: Partial file (transfer not completed)" ;;
|
||||||
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
|
||||||
|
23) echo "curl: Write error (disk full or permissions)" ;;
|
||||||
|
24) echo "curl: Write to local file failed" ;;
|
||||||
|
25) echo "curl: Upload failed" ;;
|
||||||
|
26) echo "curl: Read error on local file (I/O)" ;;
|
||||||
|
27) echo "curl: Out of memory (memory allocation failed)" ;;
|
||||||
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
|
||||||
|
30) echo "curl: FTP port command failed" ;;
|
||||||
|
32) echo "curl: FTP SIZE command failed" ;;
|
||||||
|
33) echo "curl: HTTP range error" ;;
|
||||||
|
34) echo "curl: HTTP post error" ;;
|
||||||
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
|
||||||
|
36) echo "curl: FTP bad download resume" ;;
|
||||||
|
39) echo "curl: LDAP search failed" ;;
|
||||||
|
44) echo "curl: Internal error (bad function call order)" ;;
|
||||||
|
45) echo "curl: Interface error (failed to bind to specified interface)" ;;
|
||||||
|
46) echo "curl: Bad password entered" ;;
|
||||||
|
47) echo "curl: Too many redirects" ;;
|
||||||
|
48) echo "curl: Unknown command line option specified" ;;
|
||||||
|
51) echo "curl: SSL peer certificate or SSH host key verification failed" ;;
|
||||||
|
52) echo "curl: Empty reply from server (got nothing)" ;;
|
||||||
|
55) echo "curl: Failed sending network data" ;;
|
||||||
|
56) echo "curl: Receive error (connection reset by peer)" ;;
|
||||||
|
57) echo "curl: Unrecoverable poll/select error (system I/O failure)" ;;
|
||||||
|
59) echo "curl: Couldn't use specified SSL cipher" ;;
|
||||||
|
61) echo "curl: Bad/unrecognized transfer encoding" ;;
|
||||||
|
63) echo "curl: Maximum file size exceeded" ;;
|
||||||
|
75) echo "Temporary failure (retry later)" ;;
|
||||||
|
78) echo "curl: Remote file not found (404 on FTP/file)" ;;
|
||||||
|
79) echo "curl: SSH session error (key exchange/auth failed)" ;;
|
||||||
|
92) echo "curl: HTTP/2 stream error (protocol violation)" ;;
|
||||||
|
95) echo "curl: HTTP/3 layer error" ;;
|
||||||
|
64) echo "Usage error (wrong arguments)" ;;
|
||||||
|
65) echo "Data format error (bad input data)" ;;
|
||||||
|
66) echo "Input file not found (cannot open input)" ;;
|
||||||
|
67) echo "User not found (addressee unknown)" ;;
|
||||||
|
68) echo "Host not found (hostname unknown)" ;;
|
||||||
|
69) echo "Service unavailable" ;;
|
||||||
|
70) echo "Internal software error" ;;
|
||||||
|
71) echo "System error (OS-level failure)" ;;
|
||||||
|
72) echo "Critical OS file missing" ;;
|
||||||
|
73) echo "Cannot create output file" ;;
|
||||||
|
74) echo "I/O error" ;;
|
||||||
|
76) echo "Remote protocol error" ;;
|
||||||
|
77) echo "Permission denied" ;;
|
||||||
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
|
||||||
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
|
||||||
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
|
||||||
124) echo "Command timed out (timeout command)" ;;
|
124) echo "Command timed out (timeout command)" ;;
|
||||||
|
125) echo "Command failed to start (Docker daemon or execution error)" ;;
|
||||||
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
126) echo "Command invoked cannot execute (permission problem?)" ;;
|
||||||
127) echo "Command not found" ;;
|
127) echo "Command not found" ;;
|
||||||
128) echo "Invalid argument to exit" ;;
|
128) echo "Invalid argument to exit" ;;
|
||||||
130) echo "Terminated by Ctrl+C (SIGINT)" ;;
|
129) echo "Killed by SIGHUP (terminal closed / hangup)" ;;
|
||||||
|
130) echo "Aborted by user (SIGINT)" ;;
|
||||||
|
131) echo "Killed by SIGQUIT (core dumped)" ;;
|
||||||
|
132) echo "Killed by SIGILL (illegal CPU instruction)" ;;
|
||||||
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
|
||||||
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
137) echo "Killed (SIGKILL / Out of memory?)" ;;
|
||||||
139) echo "Segmentation fault (core dumped)" ;;
|
139) echo "Segmentation fault (core dumped)" ;;
|
||||||
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
|
||||||
143) echo "Terminated (SIGTERM)" ;;
|
143) echo "Terminated (SIGTERM)" ;;
|
||||||
|
144) echo "Killed by signal 16 (SIGUSR1 / SIGSTKFLT)" ;;
|
||||||
|
146) echo "Killed by signal 18 (SIGTSTP)" ;;
|
||||||
150) echo "Systemd: Service failed to start" ;;
|
150) echo "Systemd: Service failed to start" ;;
|
||||||
151) echo "Systemd: Service unit not found" ;;
|
151) echo "Systemd: Service unit not found" ;;
|
||||||
152) echo "Permission denied (EACCES)" ;;
|
152) echo "Permission denied (EACCES)" ;;
|
||||||
@@ -100,6 +155,7 @@ if ! declare -f explain_exit_code &>/dev/null; then
|
|||||||
224) echo "Proxmox: PBS storage is for backups only" ;;
|
224) echo "Proxmox: PBS storage is for backups only" ;;
|
||||||
225) echo "Proxmox: No template available for OS/Version" ;;
|
225) echo "Proxmox: No template available for OS/Version" ;;
|
||||||
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
231) echo "Proxmox: LXC stack upgrade failed" ;;
|
||||||
|
239) echo "npm/Node.js: Unexpected runtime error or dependency failure" ;;
|
||||||
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
|
||||||
245) echo "Node.js: Invalid command-line option" ;;
|
245) echo "Node.js: Invalid command-line option" ;;
|
||||||
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
246) echo "Node.js: Internal JavaScript Parse Error" ;;
|
||||||
@@ -273,6 +329,8 @@ error_handler() {
|
|||||||
# - Cleans up lock files if lockfile variable is set
|
# - Cleans up lock files if lockfile variable is set
|
||||||
# - Exits with captured exit code
|
# - Exits with captured exit code
|
||||||
# - Always runs on script termination (success or failure)
|
# - Always runs on script termination (success or failure)
|
||||||
|
# - For signal exits (>128): sends telemetry FIRST before log collection
|
||||||
|
# to prevent pct pull hangs from blocking status updates
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
on_exit() {
|
on_exit() {
|
||||||
local exit_code=$?
|
local exit_code=$?
|
||||||
@@ -281,14 +339,24 @@ on_exit() {
|
|||||||
# post_to_api was called ("installing" sent) but post_update_to_api was never called
|
# post_to_api was called ("installing" sent) but post_update_to_api was never called
|
||||||
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
if declare -f post_update_to_api >/dev/null 2>&1; then
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
# Ensure log is accessible on host before reporting
|
if [[ $exit_code -gt 128 ]]; then
|
||||||
|
# Signal exit: send telemetry IMMEDIATELY (container may be dying, pct pull could hang)
|
||||||
|
post_update_to_api "failed" "$exit_code" 2>/dev/null || true
|
||||||
|
# Then try log collection (non-critical, best-effort)
|
||||||
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
ensure_log_on_host
|
ensure_log_on_host 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Normal exit: collect logs first for better error details
|
||||||
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
if [[ $exit_code -ne 0 ]]; then
|
if [[ $exit_code -ne 0 ]]; then
|
||||||
post_update_to_api "failed" "$exit_code"
|
post_update_to_api "failed" "$exit_code"
|
||||||
else
|
else
|
||||||
post_update_to_api "failed" "1"
|
# exit_code=0 is never an error — report as success
|
||||||
|
post_update_to_api "done" "0"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -300,22 +368,26 @@ on_exit() {
|
|||||||
# on_interrupt()
|
# on_interrupt()
|
||||||
#
|
#
|
||||||
# - SIGINT (Ctrl+C) trap handler
|
# - SIGINT (Ctrl+C) trap handler
|
||||||
|
# - Reports to telemetry FIRST (time-critical: container may be dying)
|
||||||
# - Displays "Interrupted by user" message
|
# - Displays "Interrupted by user" message
|
||||||
# - Exits with code 130 (128 + SIGINT=2)
|
# - Exits with code 130 (128 + SIGINT=2)
|
||||||
|
# - Output redirected to /dev/null fallback to prevent SIGPIPE on closed terminals
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
on_interrupt() {
|
on_interrupt() {
|
||||||
# Ensure log is accessible on host before reporting
|
# CRITICAL: Send telemetry FIRST before any cleanup or output
|
||||||
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
# If ensure_log_on_host hangs (e.g. pct pull on dying container),
|
||||||
ensure_log_on_host
|
# the status update would never be sent, leaving records stuck in "installing"
|
||||||
fi
|
|
||||||
# Report interruption to telemetry API (prevents stuck "installing" records)
|
|
||||||
if declare -f post_update_to_api >/dev/null 2>&1; then
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
post_update_to_api "failed" "130"
|
post_update_to_api "failed" "130" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
# Best-effort log collection (non-critical after telemetry is sent)
|
||||||
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
if declare -f msg_error >/dev/null 2>&1; then
|
if declare -f msg_error >/dev/null 2>&1; then
|
||||||
msg_error "Interrupted by user (SIGINT)"
|
msg_error "Interrupted by user (SIGINT)" 2>/dev/null || true
|
||||||
else
|
else
|
||||||
echo -e "\n${RD}Interrupted by user (SIGINT)${CL}"
|
echo -e "\n${RD}Interrupted by user (SIGINT)${CL}" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
exit 130
|
exit 130
|
||||||
}
|
}
|
||||||
@@ -324,23 +396,27 @@ on_interrupt() {
|
|||||||
# on_terminate()
|
# on_terminate()
|
||||||
#
|
#
|
||||||
# - SIGTERM trap handler
|
# - SIGTERM trap handler
|
||||||
|
# - Reports to telemetry FIRST (time-critical: process being killed)
|
||||||
# - Displays "Terminated by signal" message
|
# - Displays "Terminated by signal" message
|
||||||
# - Exits with code 143 (128 + SIGTERM=15)
|
# - Exits with code 143 (128 + SIGTERM=15)
|
||||||
# - Triggered by external process termination
|
# - Triggered by external process termination
|
||||||
|
# - Output redirected to /dev/null fallback to prevent SIGPIPE on closed terminals
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
on_terminate() {
|
on_terminate() {
|
||||||
# Ensure log is accessible on host before reporting
|
# CRITICAL: Send telemetry FIRST before any cleanup or output
|
||||||
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
# Same rationale as on_interrupt: ensure status gets reported even if
|
||||||
ensure_log_on_host
|
# ensure_log_on_host hangs or terminal is already closed
|
||||||
fi
|
|
||||||
# Report termination to telemetry API (prevents stuck "installing" records)
|
|
||||||
if declare -f post_update_to_api >/dev/null 2>&1; then
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
post_update_to_api "failed" "143"
|
post_update_to_api "failed" "143" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
# Best-effort log collection (non-critical after telemetry is sent)
|
||||||
|
if declare -f ensure_log_on_host >/dev/null 2>&1; then
|
||||||
|
ensure_log_on_host 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
if declare -f msg_error >/dev/null 2>&1; then
|
if declare -f msg_error >/dev/null 2>&1; then
|
||||||
msg_error "Terminated by signal (SIGTERM)"
|
msg_error "Terminated by signal (SIGTERM)" 2>/dev/null || true
|
||||||
else
|
else
|
||||||
echo -e "\n${RD}Terminated by signal (SIGTERM)${CL}"
|
echo -e "\n${RD}Terminated by signal (SIGTERM)${CL}" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
exit 143
|
exit 143
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,35 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
load_functions
|
load_functions
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
|
# Persist diagnostics setting inside container (exported from build.func)
|
||||||
|
# so addon scripts running later can find the user's choice
|
||||||
|
if [[ ! -f /usr/local/community-scripts/diagnostics ]]; then
|
||||||
|
mkdir -p /usr/local/community-scripts
|
||||||
|
echo "DIAGNOSTICS=${DIAGNOSTICS:-no}" >/usr/local/community-scripts/diagnostics
|
||||||
|
fi
|
||||||
|
|
||||||
# Get LXC IP address (must be called INSIDE container, after network is up)
|
# Get LXC IP address (must be called INSIDE container, after network is up)
|
||||||
get_lxc_ip
|
get_lxc_ip
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# post_progress_to_api()
|
||||||
|
#
|
||||||
|
# - Lightweight progress ping from inside the container
|
||||||
|
# - Updates the existing telemetry record status from "installing" to "configuring"
|
||||||
|
# - Signals that the installation is actively progressing (not stuck)
|
||||||
|
# - Fire-and-forget: never blocks or fails the script
|
||||||
|
# - Only executes if DIAGNOSTICS=yes and RANDOM_UUID is set
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
post_progress_to_api() {
|
||||||
|
command -v curl &>/dev/null || return 0
|
||||||
|
[[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0
|
||||||
|
[[ -z "${RANDOM_UUID:-}" ]] && return 0
|
||||||
|
|
||||||
|
curl -fsS -m 5 -X POST "https://telemetry.community-scripts.org/telemetry" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"random_id\":\"${RANDOM_UUID}\",\"execution_id\":\"${EXECUTION_ID:-${RANDOM_UUID}}\",\"type\":\"lxc\",\"nsapp\":\"${app:-unknown}\",\"status\":\"configuring\"}" &>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# SECTION 2: NETWORK & CONNECTIVITY
|
# SECTION 2: NETWORK & CONNECTIVITY
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -103,6 +129,7 @@ setting_up_container() {
|
|||||||
msg_ok "Set up Container OS"
|
msg_ok "Set up Container OS"
|
||||||
#msg_custom "${CM}" "${GN}" "Network Connected: ${BL}$(hostname -I)"
|
#msg_custom "${CM}" "${GN}" "Network Connected: ${BL}$(hostname -I)"
|
||||||
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
||||||
|
post_progress_to_api
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -172,7 +199,7 @@ network_check() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
trap 'error_handler' ERR
|
||||||
}
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -206,8 +233,18 @@ EOF
|
|||||||
$STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
|
$STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
|
||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
||||||
msg_ok "Updated Container OS"
|
msg_ok "Updated Container OS"
|
||||||
|
post_progress_to_api
|
||||||
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
local tools_content
|
||||||
|
tools_content=$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) || {
|
||||||
|
msg_error "Failed to download tools.func"
|
||||||
|
exit 6
|
||||||
|
}
|
||||||
|
source /dev/stdin <<<"$tools_content"
|
||||||
|
if ! declare -f fetch_and_deploy_gh_release >/dev/null 2>&1; then
|
||||||
|
msg_error "tools.func loaded but incomplete — missing expected functions"
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|||||||
@@ -1851,16 +1851,26 @@ function download_with_progress() {
|
|||||||
# Ensures /usr/local/bin is permanently in system PATH.
|
# Ensures /usr/local/bin is permanently in system PATH.
|
||||||
#
|
#
|
||||||
# Description:
|
# Description:
|
||||||
# - Adds to /etc/profile.d if not present
|
# - Adds to /etc/profile.d for login shells (SSH, noVNC)
|
||||||
|
# - Adds to /root/.bashrc for non-login shells (pct enter)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
function ensure_usr_local_bin_persist() {
|
function ensure_usr_local_bin_persist() {
|
||||||
local PROFILE_FILE="/etc/profile.d/custom_path.sh"
|
# Skip on Proxmox host
|
||||||
|
command -v pveversion &>/dev/null && return
|
||||||
|
|
||||||
if [[ ! -f "$PROFILE_FILE" ]] && ! command -v pveversion &>/dev/null; then
|
# Login shells: /etc/profile.d/
|
||||||
|
local PROFILE_FILE="/etc/profile.d/custom_path.sh"
|
||||||
|
if [[ ! -f "$PROFILE_FILE" ]]; then
|
||||||
echo 'export PATH="/usr/local/bin:$PATH"' >"$PROFILE_FILE"
|
echo 'export PATH="/usr/local/bin:$PATH"' >"$PROFILE_FILE"
|
||||||
chmod +x "$PROFILE_FILE"
|
chmod +x "$PROFILE_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Non-login shells (pct enter): /root/.bashrc
|
||||||
|
local BASHRC="/root/.bashrc"
|
||||||
|
if [[ -f "$BASHRC" ]] && ! grep -q '/usr/local/bin' "$BASHRC"; then
|
||||||
|
echo 'export PATH="/usr/local/bin:$PATH"' >>"$BASHRC"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -529,9 +529,21 @@ cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
if [[ "$(dirs -p | wc -l)" -gt 1 ]]; then
|
if [[ "$(dirs -p | wc -l)" -gt 1 ]]; then
|
||||||
popd >/dev/null || true
|
popd >/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
# Report final telemetry status if post_to_api_vm was called but no update was sent
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if declare -f post_update_to_api >/dev/null 2>&1; then
|
||||||
|
if [[ $exit_code -ne 0 ]]; then
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
else
|
||||||
|
# Exited cleanly but description()/success was never called — shouldn't happen
|
||||||
|
post_update_to_api "failed" "1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_root() {
|
check_root() {
|
||||||
|
|||||||
@@ -19,6 +19,11 @@ EOF
|
|||||||
}
|
}
|
||||||
header_info
|
header_info
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-netbird-lxc" "addon"
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
read -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)?" yn
|
read -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)?" yn
|
||||||
case $yn in
|
case $yn in
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ function msg_info() { echo -e " \e[1;36m➤\e[0m $1"; }
|
|||||||
function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; }
|
function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; }
|
||||||
function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; }
|
function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-tailscale-lxc" "addon"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
if ! command -v pveversion &>/dev/null; then
|
if ! command -v pveversion &>/dev/null; then
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
@@ -29,6 +30,7 @@ DEFAULT_PORT=8080
|
|||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# HEADER
|
# HEADER
|
||||||
|
|||||||
@@ -42,6 +42,11 @@ function msg() {
|
|||||||
local TEXT="$1"
|
local TEXT="$1"
|
||||||
echo -e "$TEXT"
|
echo -e "$TEXT"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "all-templates" "addon"
|
||||||
|
|
||||||
function validate_container_id() {
|
function validate_container_id() {
|
||||||
local ctid="$1"
|
local ctid="$1"
|
||||||
# Check if ID is numeric
|
# Check if ID is numeric
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
APP="Coder Code Server"
|
APP="Coder Code Server"
|
||||||
hostname="$(hostname)"
|
hostname="$(hostname)"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "coder-code-server" "addon"
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o errtrace
|
set -o errtrace
|
||||||
set -o nounset
|
set -o nounset
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
APP="CrowdSec"
|
APP="CrowdSec"
|
||||||
hostname="$(hostname)"
|
hostname="$(hostname)"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "crowdsec" "addon"
|
||||||
|
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o errtrace
|
set -o errtrace
|
||||||
set -o nounset
|
set -o nounset
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ DEFAULT_PORT=8080
|
|||||||
SRC_DIR="/"
|
SRC_DIR="/"
|
||||||
TMP_BIN="/tmp/filebrowser.$$"
|
TMP_BIN="/tmp/filebrowser.$$"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser-quantum" "addon"
|
||||||
|
|
||||||
# Get primary IP
|
# Get primary IP
|
||||||
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
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)
|
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ INSTALL_PATH="/usr/local/bin/filebrowser"
|
|||||||
DB_PATH="/usr/local/community-scripts/filebrowser.db"
|
DB_PATH="/usr/local/community-scripts/filebrowser.db"
|
||||||
DEFAULT_PORT=8080
|
DEFAULT_PORT=8080
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser" "addon"
|
||||||
|
|
||||||
# Get first non-loopback IP & Detect primary network interface dynamically
|
# Get first non-loopback IP & Detect primary network interface dynamically
|
||||||
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
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)
|
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; }
|
|||||||
function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
|
function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
|
||||||
function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
|
function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "glances" "addon"
|
||||||
|
|
||||||
get_lxc_ip() {
|
get_lxc_ip() {
|
||||||
if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then
|
if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then
|
||||||
hostname -I | awk '{print $1}'
|
hostname -I | awk '{print $1}'
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
@@ -29,6 +30,7 @@ DEFAULT_PORT=3000
|
|||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# HEADER
|
# HEADER
|
||||||
@@ -104,6 +106,10 @@ function update() {
|
|||||||
$STD npm run build
|
$STD npm run build
|
||||||
msg_ok "Built ${APP}"
|
msg_ok "Built ${APP}"
|
||||||
|
|
||||||
|
msg_info "Updating service"
|
||||||
|
create_service
|
||||||
|
msg_ok "Updated service"
|
||||||
|
|
||||||
msg_info "Starting service"
|
msg_info "Starting service"
|
||||||
systemctl start immich-proxy
|
systemctl start immich-proxy
|
||||||
msg_ok "Started service"
|
msg_ok "Started service"
|
||||||
@@ -112,6 +118,27 @@ function update() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function create_service() {
|
||||||
|
cat <<EOF >"$SERVICE_PATH"
|
||||||
|
[Unit]
|
||||||
|
Description=Immich Public Proxy
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=${INSTALL_PATH}/app
|
||||||
|
EnvironmentFile=${CONFIG_PATH}/.env
|
||||||
|
ExecStart=/usr/bin/node ${INSTALL_PATH}/app/dist/index.js
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
}
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# INSTALL
|
# INSTALL
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -173,23 +200,7 @@ EOF
|
|||||||
msg_ok "Created configuration"
|
msg_ok "Created configuration"
|
||||||
|
|
||||||
msg_info "Creating service"
|
msg_info "Creating service"
|
||||||
cat <<EOF >"$SERVICE_PATH"
|
create_service
|
||||||
[Unit]
|
|
||||||
Description=Immich Public Proxy
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=${INSTALL_PATH}
|
|
||||||
EnvironmentFile=${CONFIG_PATH}/.env
|
|
||||||
ExecStart=/usr/bin/node ${INSTALL_PATH}/app/server.js
|
|
||||||
Restart=always
|
|
||||||
RestartSec=10
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now immich-proxy
|
systemctl enable -q --now immich-proxy
|
||||||
msg_ok "Created and started service"
|
msg_ok "Created and started service"
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
@@ -29,6 +30,7 @@ DEFAULT_PORT=3000
|
|||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# HEADER
|
# HEADER
|
||||||
|
|||||||
@@ -26,6 +26,11 @@ BFR="\\r\\033[K"
|
|||||||
HOLD="-"
|
HOLD="-"
|
||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
silent() { "$@" >/dev/null 2>&1; }
|
silent() { "$@" >/dev/null 2>&1; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "netdata" "addon"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
APP="OliveTin"
|
APP="OliveTin"
|
||||||
hostname="$(hostname)"
|
hostname="$(hostname)"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "olivetin" "addon"
|
||||||
|
|
||||||
set-e
|
set-e
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ APP="phpMyAdmin"
|
|||||||
INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin"
|
INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin"
|
||||||
INSTALL_DIR_ALPINE="/usr/share/phpmyadmin"
|
INSTALL_DIR_ALPINE="/usr/share/phpmyadmin"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "phpmyadmin" "addon"
|
||||||
|
|
||||||
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
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)
|
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=$(hostname -I | awk '{print $1}')
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -8,11 +8,13 @@
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ function msg_error() {
|
|||||||
local msg="$1"
|
local msg="$1"
|
||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pyenv" "addon"
|
||||||
|
|
||||||
if command -v pveversion >/dev/null 2>&1; then
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
msg_error "Can't Install on Proxmox "
|
msg_error "Can't Install on Proxmox "
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ fi
|
|||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
|
||||||
# Enable error handling
|
# Enable error handling
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
trap 'error_handler' ERR
|
trap 'error_handler' ERR
|
||||||
load_functions
|
load_functions
|
||||||
|
init_tool_telemetry "" "addon"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ msg_ok() {
|
|||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "webmin" "addon"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ HOLD=" "
|
|||||||
CM="${GN}✓${CL} "
|
CM="${GN}✓${CL} "
|
||||||
CROSS="${RD}✗${CL} "
|
CROSS="${RD}✗${CL} "
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-iptag" "pve"
|
||||||
|
|
||||||
# Stop any running spinner
|
# Stop any running spinner
|
||||||
stop_spinner() {
|
stop_spinner() {
|
||||||
if [ -n "$SPINNER_PID" ] && kill -0 "$SPINNER_PID" 2>/dev/null; then
|
if [ -n "$SPINNER_PID" ] && kill -0 "$SPINNER_PID" 2>/dev/null; then
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ CM='\xE2\x9C\x94\033'
|
|||||||
GN="\033[1;92m"
|
GN="\033[1;92m"
|
||||||
CL="\033[m"
|
CL="\033[m"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-lxcs" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ function header_info {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-orphaned-lvm" "pve"
|
||||||
|
|
||||||
# Function to check for orphaned LVM volumes
|
# Function to check for orphaned LVM volumes
|
||||||
function find_orphaned_lvm {
|
function find_orphaned_lvm {
|
||||||
echo -e "\n🔍 Scanning for orphaned LVM volumes...\n"
|
echo -e "\n🔍 Scanning for orphaned LVM volumes...\n"
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ EOF
|
|||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "container-restore" "pve"
|
||||||
|
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
local msg="$1"
|
local msg="$1"
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..."
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ EOF
|
|||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "core-restore" "pve"
|
||||||
|
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
local msg="$1"
|
local msg="$1"
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..."
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ RD=$(echo "\033[01;31m")
|
|||||||
CM='\xE2\x9C\x94\033'
|
CM='\xE2\x9C\x94\033'
|
||||||
GN=$(echo "\033[1;92m")
|
GN=$(echo "\033[1;92m")
|
||||||
CL=$(echo "\033[m")
|
CL=$(echo "\033[m")
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "execute-lxcs" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Execute" --yesno "This will execute a command inside selected LXC Containers. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Execute" --yesno "This will execute a command inside selected LXC Containers. Proceed?" 10 58
|
||||||
@@ -40,7 +45,6 @@ if [ $? -ne 0 ]; then
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
read -r -p "Enter here command for inside the containers: " custom_command
|
read -r -p "Enter here command for inside the containers: " custom_command
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
@@ -50,8 +54,7 @@ function execute_in() {
|
|||||||
container=$1
|
container=$1
|
||||||
name=$(pct exec "$container" hostname)
|
name=$(pct exec "$container" hostname)
|
||||||
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
|
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
|
||||||
if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1"
|
if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1"; then
|
||||||
then
|
|
||||||
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
|
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
|
||||||
else
|
else
|
||||||
pct exec "$container" -- bash -c "${custom_command}" | tee
|
pct exec "$container" -- bash -c "${custom_command}" | tee
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ function header_info {
|
|||||||
/___/ /_/ /_/
|
/___/ /_/ /_/
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "frigate-support" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
while true; do
|
while true; do
|
||||||
read -p "This will Prepare a LXC Container for Frigate. Proceed (y/n)?" yn
|
read -p "This will Prepare a LXC Container for Frigate. Proceed (y/n)?" yn
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ RD="\033[01;31m"
|
|||||||
GN="\033[1;92m"
|
GN="\033[1;92m"
|
||||||
CL="\033[m"
|
CL="\033[m"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "fstrim" "pve"
|
||||||
|
|
||||||
LOGFILE="/var/log/fstrim.log"
|
LOGFILE="/var/log/fstrim.log"
|
||||||
touch "$LOGFILE"
|
touch "$LOGFILE"
|
||||||
chmod 600 "$LOGFILE"
|
chmod 600 "$LOGFILE"
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ function header_info {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "host-backup" "pve"
|
||||||
|
|
||||||
# Function to perform backup
|
# Function to perform backup
|
||||||
function perform_backup {
|
function perform_backup {
|
||||||
local BACKUP_PATH
|
local BACKUP_PATH
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ BFR="\\r\\033[K"
|
|||||||
HOLD="-"
|
HOLD="-"
|
||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "hw-acceleration" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ GN="\033[1;92m"
|
|||||||
RD="\033[01;31m"
|
RD="\033[01;31m"
|
||||||
CL="\033[m"
|
CL="\033[m"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-clean" "pve"
|
||||||
|
|
||||||
# Detect current kernel
|
# Detect current kernel
|
||||||
current_kernel=$(uname -r)
|
current_kernel=$(uname -r)
|
||||||
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | grep -v "$current_kernel" | sort -V)
|
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | grep -v "$current_kernel" | sort -V)
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ HOLD="-"
|
|||||||
CM="${GN}✓${CL}"
|
CM="${GN}✓${CL}"
|
||||||
current_kernel=$(uname -r)
|
current_kernel=$(uname -r)
|
||||||
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}')
|
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}')
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-pin" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
function msg_info() {
|
function msg_info() {
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ CL=$(echo "\033[m")
|
|||||||
TAB=" "
|
TAB=" "
|
||||||
CM="${TAB}✔️${TAB}${CL}"
|
CM="${TAB}✔️${TAB}${CL}"
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "lxc-delete" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
|||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "microcode" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
current_microcode=$(journalctl -k | grep -i 'microcode: Current revision:' | grep -oP 'Current revision: \K0x[0-9a-f]+')
|
current_microcode=$(journalctl -k | grep -i 'microcode: Current revision:' | grep -oP 'Current revision: \K0x[0-9a-f]+')
|
||||||
[ -z "$current_microcode" ] && current_microcode="Not found."
|
[ -z "$current_microcode" ] && current_microcode="Not found."
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ cat <<"EOF"
|
|||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "monitor-all" "pve"
|
||||||
|
|
||||||
add() {
|
add() {
|
||||||
echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled"
|
echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled"
|
||||||
echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service."
|
echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service."
|
||||||
@@ -175,5 +179,8 @@ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All f
|
|||||||
case $CHOICE in
|
case $CHOICE in
|
||||||
"Add") add ;;
|
"Add") add ;;
|
||||||
"Remove") remove ;;
|
"Remove") remove ;;
|
||||||
*) echo "Exiting..."; exit 0 ;;
|
*)
|
||||||
|
echo "Exiting..."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ INFO="${TAB}ℹ️${TAB}${CL}"
|
|||||||
WARN="${TAB}⚠️${TAB}${CL}"
|
WARN="${TAB}⚠️${TAB}${CL}"
|
||||||
|
|
||||||
function header_info {
|
function header_info {
|
||||||
clear
|
clear
|
||||||
cat <<"EOF"
|
cat <<"EOF"
|
||||||
|
|
||||||
_ ____________ ____ __________ ___ ____ _ __ __
|
_ ____________ ____ __________ ___ ____ _ __ __
|
||||||
/ | / / _/ ____/ / __ \/ __/ __/ /___ ____ _____/ (_)___ ____ _ / __ \(_)________ _/ /_ / /__ _____
|
/ | / / _/ ____/ / __ \/ __/ __/ /___ ____ _____/ (_)___ ____ _ / __ \(_)________ _/ /_ / /__ _____
|
||||||
@@ -33,6 +33,10 @@ Enhanced version supporting both e1000e and e1000 drivers
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "nic-offloading-fix" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
|
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
|
||||||
@@ -49,7 +53,10 @@ fi
|
|||||||
if ! command -v ethtool >/dev/null 2>&1; then
|
if ! command -v ethtool >/dev/null 2>&1; then
|
||||||
msg_info "Installing ethtool"
|
msg_info "Installing ethtool"
|
||||||
apt-get update &>/dev/null
|
apt-get update &>/dev/null
|
||||||
apt-get install -y ethtool &>/dev/null || { msg_error "Failed to install ethtool. Exiting."; exit 1; }
|
apt-get install -y ethtool &>/dev/null || {
|
||||||
|
msg_error "Failed to install ethtool. Exiting."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
msg_ok "ethtool installed successfully"
|
msg_ok "ethtool installed successfully"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -86,8 +93,8 @@ msg_ok "Found ${BL}$COUNT${GN} Intel e1000e/e1000 interfaces"
|
|||||||
|
|
||||||
# Create a checklist for interface selection with all interfaces initially checked
|
# Create a checklist for interface selection with all interfaces initially checked
|
||||||
INTERFACES_CHECKLIST=()
|
INTERFACES_CHECKLIST=()
|
||||||
for ((i=0; i<${#INTERFACES[@]}; i+=2)); do
|
for ((i = 0; i < ${#INTERFACES[@]}; i += 2)); do
|
||||||
INTERFACES_CHECKLIST+=("${INTERFACES[i]}" "${INTERFACES[i+1]}" "ON")
|
INTERFACES_CHECKLIST+=("${INTERFACES[i]}" "${INTERFACES[i + 1]}" "ON")
|
||||||
done
|
done
|
||||||
|
|
||||||
# Show interface selection checklist
|
# Show interface selection checklist
|
||||||
@@ -108,7 +115,7 @@ if [ -z "$SELECTED_INTERFACES" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Convert the selected interfaces into an array
|
# Convert the selected interfaces into an array
|
||||||
readarray -t INTERFACE_ARRAY <<< "$SELECTED_INTERFACES"
|
readarray -t INTERFACE_ARRAY <<<"$SELECTED_INTERFACES"
|
||||||
|
|
||||||
# Show the number of selected interfaces
|
# Show the number of selected interfaces
|
||||||
INTERFACE_COUNT=${#INTERFACE_ARRAY[@]}
|
INTERFACE_COUNT=${#INTERFACE_ARRAY[@]}
|
||||||
@@ -148,7 +155,7 @@ for SELECTED_INTERFACE in "${INTERFACE_ARRAY[@]}"; do
|
|||||||
msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW} (${BL}$DRIVER${YW})"
|
msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW} (${BL}$DRIVER${YW})"
|
||||||
|
|
||||||
# Start with the common part of the service file
|
# Start with the common part of the service file
|
||||||
cat > "$SERVICE_PATH" << EOF
|
cat >"$SERVICE_PATH" <<EOF
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Disable NIC offloading for Intel $DRIVER interface $SELECTED_INTERFACE
|
Description=Disable NIC offloading for Intel $DRIVER interface $SELECTED_INTERFACE
|
||||||
After=network.target
|
After=network.target
|
||||||
@@ -172,16 +179,20 @@ EOF
|
|||||||
|
|
||||||
# Configure this service
|
# Configure this service
|
||||||
{
|
{
|
||||||
echo "25"; sleep 0.2
|
echo "25"
|
||||||
|
sleep 0.2
|
||||||
# Reload systemd to recognize the new service
|
# Reload systemd to recognize the new service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
echo "50"; sleep 0.2
|
echo "50"
|
||||||
|
sleep 0.2
|
||||||
# Start the service
|
# Start the service
|
||||||
systemctl start "$SERVICE_NAME"
|
systemctl start "$SERVICE_NAME"
|
||||||
echo "75"; sleep 0.2
|
echo "75"
|
||||||
|
sleep 0.2
|
||||||
# Enable the service to start on boot
|
# Enable the service to start on boot
|
||||||
systemctl enable "$SERVICE_NAME"
|
systemctl enable "$SERVICE_NAME"
|
||||||
echo "100"; sleep 0.2
|
echo "100"
|
||||||
|
sleep 0.2
|
||||||
} | whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
|
} | whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
|
||||||
|
|
||||||
# Individual service status
|
# Individual service status
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs3-upgrade" "pve"
|
||||||
|
|
||||||
start_routines() {
|
start_routines() {
|
||||||
header_info
|
header_info
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 2 BACKUP" --menu "\nMake a backup of /etc/proxmox-backup to ensure that in the worst case, any relevant configuration can be recovered?" 14 58 2 \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 2 BACKUP" --menu "\nMake a backup of /etc/proxmox-backup to ensure that in the worst case, any relevant configuration can be recovered?" 14 58 2 \
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
|||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs4-upgrade" "pve"
|
||||||
|
|
||||||
start_routines() {
|
start_routines() {
|
||||||
header_info
|
header_info
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 3 BACKUP" --menu \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS 3 BACKUP" --menu \
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ CM="${GN}✓${CL}"
|
|||||||
CROSS="${RD}✗${CL}"
|
CROSS="${RD}✗${CL}"
|
||||||
|
|
||||||
msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs-microcode" "pve"
|
||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
|
|||||||
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
|
||||||
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pbs-install" "pve"
|
||||||
|
|
||||||
# ---- helpers ----
|
# ---- helpers ----
|
||||||
get_pbs_codename() {
|
get_pbs_codename() {
|
||||||
awk -F'=' '/^VERSION_CODENAME=/{print $2}' /etc/os-release
|
awk -F'=' '/^VERSION_CODENAME=/{print $2}' /etc/os-release
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pmg-install" "pve"
|
||||||
|
|
||||||
if ! grep -q "Proxmox Mail Gateway" /etc/issue 2>/dev/null; then
|
if ! grep -q "Proxmox Mail Gateway" /etc/issue 2>/dev/null; then
|
||||||
msg_error "This script is only intended for Proxmox Mail Gateway"
|
msg_error "This script is only intended for Proxmox Mail Gateway"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pve-install" "pve"
|
||||||
|
|
||||||
get_pve_version() {
|
get_pve_version() {
|
||||||
local pve_ver
|
local pve_ver
|
||||||
pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
pve_ver="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ if ! command -v curl >/dev/null 2>&1; then
|
|||||||
apt-get install -y curl >/dev/null 2>&1
|
apt-get install -y curl >/dev/null 2>&1
|
||||||
fi
|
fi
|
||||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/core.func)
|
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
load_functions
|
load_functions
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve-privilege-converter" "pve"
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
shopt -s inherit_errexit nullglob
|
shopt -s inherit_errexit nullglob
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ msg_error() {
|
|||||||
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve8-upgrade" "pve"
|
||||||
|
|
||||||
start_routines() {
|
start_routines() {
|
||||||
header_info
|
header_info
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,11 @@
|
|||||||
# License: MIT
|
# License: MIT
|
||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "scaling-governor" "pve"
|
||||||
|
|
||||||
header_info() {
|
header_info() {
|
||||||
clear
|
clear
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-apps" "pve"
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# CONFIGURATION VARIABLES
|
# CONFIGURATION VARIABLES
|
||||||
@@ -98,11 +100,11 @@ EOF
|
|||||||
|
|
||||||
# Handle command line arguments
|
# Handle command line arguments
|
||||||
case "${1:-}" in
|
case "${1:-}" in
|
||||||
--help|-h)
|
--help | -h)
|
||||||
print_usage
|
print_usage
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
--export-config)
|
--export-config)
|
||||||
export_config_json
|
export_config_json
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
@@ -205,7 +207,7 @@ if [[ -n "$var_container" ]]; then
|
|||||||
all)
|
all)
|
||||||
# Select all containers with matching tags
|
# Select all containers with matching tags
|
||||||
CHOICE=""
|
CHOICE=""
|
||||||
for ((i=0; i<${#menu_items[@]}; i+=3)); do
|
for ((i = 0; i < ${#menu_items[@]}; i += 3)); do
|
||||||
CHOICE="$CHOICE ${menu_items[$i]}"
|
CHOICE="$CHOICE ${menu_items[$i]}"
|
||||||
done
|
done
|
||||||
CHOICE=$(echo "$CHOICE" | xargs)
|
CHOICE=$(echo "$CHOICE" | xargs)
|
||||||
@@ -213,7 +215,7 @@ if [[ -n "$var_container" ]]; then
|
|||||||
all_running)
|
all_running)
|
||||||
# Select only running containers with matching tags
|
# Select only running containers with matching tags
|
||||||
CHOICE=""
|
CHOICE=""
|
||||||
for ((i=0; i<${#menu_items[@]}; i+=3)); do
|
for ((i = 0; i < ${#menu_items[@]}; i += 3)); do
|
||||||
cid="${menu_items[$i]}"
|
cid="${menu_items[$i]}"
|
||||||
if pct status "$cid" 2>/dev/null | grep -q "running"; then
|
if pct status "$cid" 2>/dev/null | grep -q "running"; then
|
||||||
CHOICE="$CHOICE $cid"
|
CHOICE="$CHOICE $cid"
|
||||||
@@ -224,7 +226,7 @@ if [[ -n "$var_container" ]]; then
|
|||||||
all_stopped)
|
all_stopped)
|
||||||
# Select only stopped containers with matching tags
|
# Select only stopped containers with matching tags
|
||||||
CHOICE=""
|
CHOICE=""
|
||||||
for ((i=0; i<${#menu_items[@]}; i+=3)); do
|
for ((i = 0; i < ${#menu_items[@]}; i += 3)); do
|
||||||
cid="${menu_items[$i]}"
|
cid="${menu_items[$i]}"
|
||||||
if pct status "$cid" 2>/dev/null | grep -q "stopped"; then
|
if pct status "$cid" 2>/dev/null | grep -q "stopped"; then
|
||||||
CHOICE="$CHOICE $cid"
|
CHOICE="$CHOICE $cid"
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ RD=$(echo "\033[01;31m")
|
|||||||
CM='\xE2\x9C\x94\033'
|
CM='\xE2\x9C\x94\033'
|
||||||
GN=$(echo "\033[1;92m")
|
GN=$(echo "\033[1;92m")
|
||||||
CL=$(echo "\033[m")
|
CL=$(echo "\033[m")
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-lxcs" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ RD=$(echo "\033[01;31m")
|
|||||||
GN=$(echo "\033[1;92m")
|
GN=$(echo "\033[1;92m")
|
||||||
CL=$(echo "\033[m")
|
CL=$(echo "\033[m")
|
||||||
|
|
||||||
|
# Telemetry
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
||||||
|
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-repo" "pve"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
echo "Loading..."
|
||||||
NODE=$(hostname)
|
NODE=$(hostname)
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,15 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,8 +104,16 @@ function cleanup_vmid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
|
local exit_code=$?
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
# Only send telemetry if post_to_api_vm was called (installing status was sent)
|
||||||
|
if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then
|
||||||
|
if [[ $exit_code -eq 0 ]]; then
|
||||||
post_update_to_api "done" "none"
|
post_update_to_api "done" "none"
|
||||||
|
else
|
||||||
|
post_update_to_api "failed" "$exit_code"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
rm -rf $TEMP_DIR
|
rm -rf $TEMP_DIR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user