mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-08 07:48:10 +00:00
Compare commits
19 Commits
pin_wealth
...
fix/github
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b00241ebd | ||
|
|
79ed7e4b73 | ||
|
|
94d95ac5d2 | ||
|
|
a39b457888 | ||
|
|
94ff34d0df | ||
|
|
ff4648b7f3 | ||
|
|
acedb5fb55 | ||
|
|
4bd39e7bae | ||
|
|
5c2cf61455 | ||
|
|
10b47eae33 | ||
|
|
c61b0e766a | ||
|
|
9ff1d088c5 | ||
|
|
be803ced6f | ||
|
|
5949e9e32e | ||
|
|
bb3276bbbd | ||
|
|
b7a09989cb | ||
|
|
039d046649 | ||
|
|
58301651e4 | ||
|
|
b848c2d1bf |
16
CHANGELOG.md
16
CHANGELOG.md
@@ -410,18 +410,34 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-03-07
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Update Rdtclient to dotnet 10.0 [@asylumexp](https://github.com/asylumexp) ([#12638](https://github.com/community-scripts/ProxmoxVE/pull/12638))
|
||||||
|
- fix(immich): fix update script failing to add Debian testing repo when preferences file already exists [@Copilot](https://github.com/Copilot) ([#12631](https://github.com/community-scripts/ProxmoxVE/pull/12631))
|
||||||
|
|
||||||
## 2026-03-06
|
## 2026-03-06
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- RustDesk Server: Fix update script [@tremor021](https://github.com/tremor021) ([#12625](https://github.com/community-scripts/ProxmoxVE/pull/12625))
|
||||||
|
- [Node-RED] Restart service after update [@Aurelien30000](https://github.com/Aurelien30000) ([#12621](https://github.com/community-scripts/ProxmoxVE/pull/12621))
|
||||||
|
- wealthfolio: update cors [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12617](https://github.com/community-scripts/ProxmoxVE/pull/12617))
|
||||||
- CryptPad: Better update handling [@tremor021](https://github.com/tremor021) ([#12611](https://github.com/community-scripts/ProxmoxVE/pull/12611))
|
- CryptPad: Better update handling [@tremor021](https://github.com/tremor021) ([#12611](https://github.com/community-scripts/ProxmoxVE/pull/12611))
|
||||||
|
|
||||||
- #### ✨ New Features
|
- #### ✨ New Features
|
||||||
|
|
||||||
- RustDesk Server: Switch to updated repository [@tremor021](https://github.com/tremor021) ([#12083](https://github.com/community-scripts/ProxmoxVE/pull/12083))
|
- RustDesk Server: Switch to updated repository [@tremor021](https://github.com/tremor021) ([#12083](https://github.com/community-scripts/ProxmoxVE/pull/12083))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- Semaphore: Move from BoltDB to SQLite [@tremor021](https://github.com/tremor021) ([#12624](https://github.com/community-scripts/ProxmoxVE/pull/12624))
|
||||||
|
|
||||||
## 2026-03-05
|
## 2026-03-05
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ function update_script() {
|
|||||||
msg_info "Updating Node-RED"
|
msg_info "Updating Node-RED"
|
||||||
$STD npm install -g --unsafe-perm node-red
|
$STD npm install -g --unsafe-perm node-red
|
||||||
msg_ok "Updated Node-RED"
|
msg_ok "Updated Node-RED"
|
||||||
|
|
||||||
|
msg_info "Restarting Node-RED"
|
||||||
|
$STD rc-service nodered restart
|
||||||
|
msg_ok "Restarted Node-RED"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,9 +36,13 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -f /etc/apt/preferences.d/preferences ]]; then
|
if ! grep -qE '(^|[[:space:]])testing([[:space:]]|$)' /etc/apt/sources.list.d/debian.sources 2>/dev/null; then
|
||||||
msg_info "Adding Debian Testing repo"
|
msg_info "Adding Debian Testing repo"
|
||||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
if grep -q "trixie-updates" /etc/apt/sources.list.d/debian.sources 2>/dev/null; then
|
||||||
|
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||||
|
else
|
||||||
|
sed -i '/^[[:space:]]*Suites:.*trixie/ s/$/ testing/' /etc/apt/sources.list.d/debian.sources
|
||||||
|
fi
|
||||||
cat <<EOF >/etc/apt/preferences.d/preferences
|
cat <<EOF >/etc/apt/preferences.d/preferences
|
||||||
Package: *
|
Package: *
|
||||||
Pin: release a=unstable
|
Pin: release a=unstable
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ function update_script() {
|
|||||||
|
|
||||||
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
||||||
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
||||||
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
if dpkg-query -W aspnetcore-runtime-9.0 >/dev/null 2>&1; then
|
||||||
$STD apt remove --purge -y dotnet-sdk-8.0
|
$STD apt remove --purge -y aspnetcore-runtime-9.0
|
||||||
ensure_dependencies aspnetcore-runtime-9.0
|
ensure_dependencies aspnetcore-runtime-10.0
|
||||||
fi
|
fi
|
||||||
rm -rf /opt/rdtc-backup
|
rm -rf /opt/rdtc-backup
|
||||||
|
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
msg_info "Stopped Service"
|
msg_info "Stopped Service"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "rustdesk-hbbr" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*amd64.deb"
|
fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*amd64.deb"
|
||||||
fetch_and_deploy_gh_release "rustdesk-hbbs" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*amd64.deb"
|
fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*amd64.deb"
|
||||||
fetch_and_deploy_gh_release "rustdesk-utils" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*amd64.deb"
|
fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*amd64.deb"
|
||||||
fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*amd64.deb"
|
fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*amd64.deb"
|
||||||
|
|
||||||
msg_info "Starting services"
|
msg_info "Starting services"
|
||||||
|
|||||||
@@ -28,6 +28,34 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ -f /opt/semaphore/semaphore_db.bolt ]]; then
|
||||||
|
msg_warn "WARNING: Due to bugs with BoltDB database, update script will move your application"
|
||||||
|
msg_warn "to use SQLite database instead. Unfortunately, this will reset your application and make it a fresh"
|
||||||
|
msg_warn "installation. All your data will be lost!"
|
||||||
|
echo ""
|
||||||
|
read -r -p "${TAB3}Do you want to continue? (y/N): " CONFIRM
|
||||||
|
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
msg_info "Moving from BoltDB to SQLite"
|
||||||
|
systemctl stop semaphore
|
||||||
|
rm -rf /opt/semaphore/semaphore_db.bolt
|
||||||
|
sed -i \
|
||||||
|
-e 's|"bolt": {|"sqlite": {|' \
|
||||||
|
-e 's|/semaphore_db.bolt"|/database.sqlite"|' \
|
||||||
|
-e '/semaphore_db.bolt/d' \
|
||||||
|
-e '/"dialect"/d' \
|
||||||
|
-e '/^ },$/a\ "dialect": "sqlite",' \
|
||||||
|
/opt/semaphore/config.json
|
||||||
|
SEM_PW=$(cat ~/semaphore.creds)
|
||||||
|
systemctl start semaphore
|
||||||
|
$STD semaphore user add --admin --login admin --email admin@helper-scripts.com --name Administrator --password "${SEM_PW}" --config /opt/semaphore/config.json
|
||||||
|
|
||||||
|
msg_ok "Moved from BoltDB to SQLite"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "semaphore" "semaphoreui/semaphore"; then
|
if check_for_gh_release "semaphore" "semaphoreui/semaphore"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop semaphore
|
systemctl stop semaphore
|
||||||
|
|||||||
@@ -29,8 +29,11 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="3.0.3"
|
if grep -q '^WF_CORS_ALLOW_ORIGINS=\*$' /opt/wealthfolio/.env; then
|
||||||
if check_for_gh_release "wealthfolio" "afadil/wealthfolio" "${RELEASE}"; then
|
sed -i "s|^WF_CORS_ALLOW_ORIGINS=\*$|WF_CORS_ALLOW_ORIGINS=http://${LOCAL_IP}:8080|" /opt/wealthfolio/.env
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "wealthfolio" "afadil/wealthfolio"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop wealthfolio
|
systemctl stop wealthfolio
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
@@ -40,7 +43,7 @@ function update_script() {
|
|||||||
cp /opt/wealthfolio/.env /opt/wealthfolio_env_backup
|
cp /opt/wealthfolio/.env /opt/wealthfolio_env_backup
|
||||||
msg_ok "Backed up Data"
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball" "v${RELEASE}"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball"
|
||||||
|
|
||||||
msg_info "Building Frontend (patience)"
|
msg_info "Building Frontend (patience)"
|
||||||
cd /opt/wealthfolio
|
cd /opt/wealthfolio
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-03-06T12:10:39Z",
|
"generated": "2026-03-07T18:06:42Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -116,9 +116,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "bentopdf",
|
"slug": "bentopdf",
|
||||||
"repo": "alam00000/bentopdf",
|
"repo": "alam00000/bentopdf",
|
||||||
"version": "v2.4.0",
|
"version": "v2.4.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-01T14:25:43Z"
|
"date": "2026-03-07T09:14:39Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "beszel",
|
"slug": "beszel",
|
||||||
@@ -151,9 +151,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "booklore",
|
"slug": "booklore",
|
||||||
"repo": "booklore-app/BookLore",
|
"repo": "booklore-app/BookLore",
|
||||||
"version": "v2.0.5",
|
"version": "v2.0.6",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-01T16:13:13Z"
|
"date": "2026-03-06T19:16:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "bookstack",
|
"slug": "bookstack",
|
||||||
@@ -193,9 +193,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "checkmate",
|
"slug": "checkmate",
|
||||||
"repo": "bluewave-labs/Checkmate",
|
"repo": "bluewave-labs/Checkmate",
|
||||||
"version": "v3.5.0",
|
"version": "v3.5.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-04T19:51:22Z"
|
"date": "2026-03-06T21:18:36Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "cleanuparr",
|
"slug": "cleanuparr",
|
||||||
@@ -284,9 +284,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "discopanel",
|
"slug": "discopanel",
|
||||||
"repo": "nickheyer/discopanel",
|
"repo": "nickheyer/discopanel",
|
||||||
"version": "v2.0.0",
|
"version": "v2.0.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-06T08:19:39Z"
|
"date": "2026-03-07T02:43:33Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "dispatcharr",
|
"slug": "dispatcharr",
|
||||||
@@ -438,9 +438,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "ghostfolio",
|
"slug": "ghostfolio",
|
||||||
"repo": "ghostfolio/ghostfolio",
|
"repo": "ghostfolio/ghostfolio",
|
||||||
"version": "2.247.0",
|
"version": "2.248.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-04T07:48:00Z"
|
"date": "2026-03-07T17:24:24Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "gitea",
|
"slug": "gitea",
|
||||||
@@ -452,9 +452,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "gitea-mirror",
|
"slug": "gitea-mirror",
|
||||||
"repo": "RayLabsHQ/gitea-mirror",
|
"repo": "RayLabsHQ/gitea-mirror",
|
||||||
"version": "v3.12.4",
|
"version": "v3.12.5",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-06T05:02:40Z"
|
"date": "2026-03-07T01:30:40Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "glance",
|
"slug": "glance",
|
||||||
@@ -501,9 +501,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "grocy",
|
"slug": "grocy",
|
||||||
"repo": "grocy/grocy",
|
"repo": "grocy/grocy",
|
||||||
"version": "v4.5.0",
|
"version": "v4.6.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-03-28T19:02:22Z"
|
"date": "2026-03-06T17:35:19Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "guardian",
|
"slug": "guardian",
|
||||||
@@ -550,16 +550,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "homarr",
|
"slug": "homarr",
|
||||||
"repo": "homarr-labs/homarr",
|
"repo": "homarr-labs/homarr",
|
||||||
"version": "v1.54.0",
|
"version": "v1.55.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-27T19:38:50Z"
|
"date": "2026-03-06T19:40:16Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "homebox",
|
"slug": "homebox",
|
||||||
"repo": "sysadminsmedia/homebox",
|
"repo": "sysadminsmedia/homebox",
|
||||||
"version": "v0.24.0",
|
"version": "v0.24.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-03T16:09:55Z"
|
"date": "2026-03-07T15:41:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "homepage",
|
"slug": "homepage",
|
||||||
@@ -613,9 +613,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
"repo": "Jackett/Jackett",
|
"repo": "Jackett/Jackett",
|
||||||
"version": "v0.24.1292",
|
"version": "v0.24.1307",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-06T05:57:21Z"
|
"date": "2026-03-07T05:55:30Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jellystat",
|
"slug": "jellystat",
|
||||||
@@ -641,9 +641,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "kapowarr",
|
"slug": "kapowarr",
|
||||||
"repo": "Casvt/Kapowarr",
|
"repo": "Casvt/Kapowarr",
|
||||||
"version": "V1.2.0",
|
"version": "V1.3.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-04-16T14:55:28Z"
|
"date": "2026-03-06T16:38:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "karakeep",
|
"slug": "karakeep",
|
||||||
@@ -872,9 +872,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "metube",
|
"slug": "metube",
|
||||||
"repo": "alexta69/metube",
|
"repo": "alexta69/metube",
|
||||||
"version": "2026.03.03",
|
"version": "2026.03.07",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-03T19:15:55Z"
|
"date": "2026-03-07T14:14:57Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "miniflux",
|
"slug": "miniflux",
|
||||||
@@ -1145,9 +1145,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pocketid",
|
"slug": "pocketid",
|
||||||
"repo": "pocket-id/pocket-id",
|
"repo": "pocket-id/pocket-id",
|
||||||
"version": "v2.3.0",
|
"version": "v2.4.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-23T19:50:48Z"
|
"date": "2026-03-07T17:51:41Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "powerdns",
|
"slug": "powerdns",
|
||||||
@@ -1229,9 +1229,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pulse",
|
"slug": "pulse",
|
||||||
"repo": "rcourtman/Pulse",
|
"repo": "rcourtman/Pulse",
|
||||||
"version": "v5.1.20",
|
"version": "v5.1.21",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-06T00:30:32Z"
|
"date": "2026-03-06T12:13:08Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "pve-scripts-local",
|
"slug": "pve-scripts-local",
|
||||||
@@ -1285,9 +1285,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "rclone",
|
"slug": "rclone",
|
||||||
"repo": "rclone/rclone",
|
"repo": "rclone/rclone",
|
||||||
"version": "v1.73.1",
|
"version": "v1.73.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-17T18:27:21Z"
|
"date": "2026-03-06T20:42:26Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "rdtclient",
|
"slug": "rdtclient",
|
||||||
@@ -1355,9 +1355,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "scanopy",
|
"slug": "scanopy",
|
||||||
"repo": "scanopy/scanopy",
|
"repo": "scanopy/scanopy",
|
||||||
"version": "v0.14.14",
|
"version": "v0.14.15",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-06T06:50:38Z"
|
"date": "2026-03-06T23:06:01Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "scraparr",
|
"slug": "scraparr",
|
||||||
@@ -1411,9 +1411,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "silverbullet",
|
"slug": "silverbullet",
|
||||||
"repo": "silverbulletmd/silverbullet",
|
"repo": "silverbulletmd/silverbullet",
|
||||||
"version": "2.5.1",
|
"version": "2.5.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-05T15:13:22Z"
|
"date": "2026-03-06T12:20:58Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "slskd",
|
"slug": "slskd",
|
||||||
@@ -1467,16 +1467,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "sportarr",
|
"slug": "sportarr",
|
||||||
"repo": "Sportarr/Sportarr",
|
"repo": "Sportarr/Sportarr",
|
||||||
"version": "v4.0.986.1061",
|
"version": "v4.0.988.1063",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-06T01:04:24Z"
|
"date": "2026-03-07T12:15:33Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "stirling-pdf",
|
"slug": "stirling-pdf",
|
||||||
"repo": "Stirling-Tools/Stirling-PDF",
|
"repo": "Stirling-Tools/Stirling-PDF",
|
||||||
"version": "v2.6.0",
|
"version": "v2.7.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-03T20:46:42Z"
|
"date": "2026-03-06T11:21:47Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "streamlink-webui",
|
"slug": "streamlink-webui",
|
||||||
@@ -1593,9 +1593,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "traefik",
|
"slug": "traefik",
|
||||||
"repo": "traefik/traefik",
|
"repo": "traefik/traefik",
|
||||||
"version": "v3.6.9",
|
"version": "v3.6.10",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-23T17:21:17Z"
|
"date": "2026-03-06T15:08:35Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "trilium",
|
"slug": "trilium",
|
||||||
@@ -1740,9 +1740,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "wealthfolio",
|
"slug": "wealthfolio",
|
||||||
"repo": "afadil/wealthfolio",
|
"repo": "afadil/wealthfolio",
|
||||||
"version": "v3.0.4",
|
"version": "v3.0.3",
|
||||||
"pinned": false,
|
"pinned": true,
|
||||||
"date": "2026-03-05T19:58:24Z"
|
"date": "2026-03-03T21:47:55Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "web-check",
|
"slug": "web-check",
|
||||||
@@ -1796,9 +1796,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "yubal",
|
"slug": "yubal",
|
||||||
"repo": "guillevc/yubal",
|
"repo": "guillevc/yubal",
|
||||||
"version": "v0.6.2",
|
"version": "v0.6.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-24T15:15:46Z"
|
"date": "2026-03-07T03:24:05Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "zerobyte",
|
"slug": "zerobyte",
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "This instance uses BoltDB",
|
"text": "This instance uses SQLite",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ setup_deb822_repo \
|
|||||||
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
||||||
"https://packages.microsoft.com/debian/13/prod/" \
|
"https://packages.microsoft.com/debian/13/prod/" \
|
||||||
"trixie"
|
"trixie"
|
||||||
$STD apt install -y aspnetcore-runtime-9.0
|
$STD apt install -y aspnetcore-runtime-10.0
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
||||||
|
|||||||
@@ -30,11 +30,12 @@ SEM_KEY=$(openssl rand -base64 32)
|
|||||||
SEM_PW=$(openssl rand -base64 12)
|
SEM_PW=$(openssl rand -base64 12)
|
||||||
cat <<EOF >/opt/semaphore/config.json
|
cat <<EOF >/opt/semaphore/config.json
|
||||||
{
|
{
|
||||||
"bolt": {
|
"sqlite": {
|
||||||
"host": "/opt/semaphore/semaphore_db.bolt"
|
"host": "/opt/semaphore/database.sqlite"
|
||||||
},
|
},
|
||||||
|
"dialect": "sqlite",
|
||||||
"tmp_path": "/opt/semaphore/tmp",
|
"tmp_path": "/opt/semaphore/tmp",
|
||||||
"cookie_hash": "${SEM_HASH}",
|
"cookie_hash": "${SEM_HASH}",
|
||||||
"cookie_encryption": "${SEM_ENCRYPTION}",
|
"cookie_encryption": "${SEM_ENCRYPTION}",
|
||||||
"access_key_encryption": "${SEM_KEY}"
|
"access_key_encryption": "${SEM_KEY}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ WF_DB_PATH=/opt/wealthfolio_data/wealthfolio.db
|
|||||||
WF_SECRET_KEY=${SECRET_KEY}
|
WF_SECRET_KEY=${SECRET_KEY}
|
||||||
WF_AUTH_PASSWORD_HASH=${WF_PASSWORD_HASH}
|
WF_AUTH_PASSWORD_HASH=${WF_PASSWORD_HASH}
|
||||||
WF_STATIC_DIR=/opt/wealthfolio/dist
|
WF_STATIC_DIR=/opt/wealthfolio/dist
|
||||||
WF_CORS_ALLOW_ORIGINS=*
|
|
||||||
WF_REQUEST_TIMEOUT_MS=30000
|
WF_REQUEST_TIMEOUT_MS=30000
|
||||||
|
WF_CORS_ALLOW_ORIGINS=http://${LOCAL_IP}:8080
|
||||||
EOF
|
EOF
|
||||||
echo "WF_PASSWORD=${WF_PASSWORD}" >~/wealthfolio.creds
|
echo "WF_PASSWORD=${WF_PASSWORD}" >~/wealthfolio.creds
|
||||||
msg_ok "Configured Wealthfolio"
|
msg_ok "Configured Wealthfolio"
|
||||||
|
|||||||
@@ -1079,6 +1079,44 @@ is_package_installed() {
|
|||||||
dpkg-query -W -f='${Status}' "$package" 2>/dev/null | grep -q "^install ok installed$"
|
dpkg-query -W -f='${Status}' "$package" 2>/dev/null | grep -q "^install ok installed$"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Prompt user to enter a GitHub Personal Access Token (PAT) interactively
|
||||||
|
# Returns 0 if a valid token was provided, 1 otherwise
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
prompt_for_github_token() {
|
||||||
|
if [[ ! -t 0 ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local reply
|
||||||
|
read -rp "${TAB}Would you like to enter a GitHub Personal Access Token (PAT)? [y/N]: " reply
|
||||||
|
reply="${reply:-n}"
|
||||||
|
|
||||||
|
if [[ ! "${reply,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local token
|
||||||
|
while true; do
|
||||||
|
read -rp "${TAB}Enter your GitHub PAT: " token
|
||||||
|
# Trim leading/trailing whitespace
|
||||||
|
token="$(echo "$token" | xargs)"
|
||||||
|
if [[ -z "$token" ]]; then
|
||||||
|
msg_warn "Token cannot be empty. Please try again."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ "$token" =~ [[:space:]] ]]; then
|
||||||
|
msg_warn "Token must not contain spaces. Please try again."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
done
|
||||||
|
|
||||||
|
export GITHUB_TOKEN="$token"
|
||||||
|
msg_ok "GitHub token has been set."
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# GitHub API call with authentication and rate limit handling
|
# GitHub API call with authentication and rate limit handling
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -1091,7 +1129,8 @@ github_api_call() {
|
|||||||
local header_args=()
|
local header_args=()
|
||||||
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||||
|
|
||||||
for attempt in $(seq 1 $max_retries); do
|
local attempt=1
|
||||||
|
while ((attempt <= max_retries)); do
|
||||||
local http_code
|
local http_code
|
||||||
http_code=$(curl -sSL -w "%{http_code}" -o "$output_file" \
|
http_code=$(curl -sSL -w "%{http_code}" -o "$output_file" \
|
||||||
-H "Accept: application/vnd.github+json" \
|
-H "Accept: application/vnd.github+json" \
|
||||||
@@ -1108,7 +1147,11 @@ github_api_call() {
|
|||||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||||
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
||||||
else
|
else
|
||||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
msg_error "The repository may require authentication."
|
||||||
|
fi
|
||||||
|
if prompt_for_github_token; then
|
||||||
|
header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||||
|
continue
|
||||||
fi
|
fi
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
@@ -1118,9 +1161,16 @@ github_api_call() {
|
|||||||
msg_warn "GitHub API rate limit, waiting ${retry_delay}s... (attempt $attempt/$max_retries)"
|
msg_warn "GitHub API rate limit, waiting ${retry_delay}s... (attempt $attempt/$max_retries)"
|
||||||
sleep "$retry_delay"
|
sleep "$retry_delay"
|
||||||
retry_delay=$((retry_delay * 2))
|
retry_delay=$((retry_delay * 2))
|
||||||
|
((attempt++))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||||
|
if prompt_for_github_token; then
|
||||||
|
header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||||
|
retry_delay=2
|
||||||
|
attempt=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||||
return 1
|
return 1
|
||||||
@@ -1132,6 +1182,7 @@ github_api_call() {
|
|||||||
000 | "")
|
000 | "")
|
||||||
if [[ $attempt -lt $max_retries ]]; then
|
if [[ $attempt -lt $max_retries ]]; then
|
||||||
sleep "$retry_delay"
|
sleep "$retry_delay"
|
||||||
|
((attempt++))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
msg_error "GitHub API connection failed (no response)."
|
msg_error "GitHub API connection failed (no response)."
|
||||||
@@ -1141,12 +1192,14 @@ github_api_call() {
|
|||||||
*)
|
*)
|
||||||
if [[ $attempt -lt $max_retries ]]; then
|
if [[ $attempt -lt $max_retries ]]; then
|
||||||
sleep "$retry_delay"
|
sleep "$retry_delay"
|
||||||
|
((attempt++))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
msg_error "GitHub API call failed (HTTP $http_code)."
|
msg_error "GitHub API call failed (HTTP $http_code)."
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
((attempt++))
|
||||||
done
|
done
|
||||||
|
|
||||||
msg_error "GitHub API call failed after ${max_retries} attempts: ${url}"
|
msg_error "GitHub API call failed after ${max_retries} attempts: ${url}"
|
||||||
@@ -3123,11 +3176,30 @@ function fetch_and_deploy_gh_release() {
|
|||||||
if [[ "$http_code" == "200" ]]; then
|
if [[ "$http_code" == "200" ]]; then
|
||||||
success=true
|
success=true
|
||||||
break
|
break
|
||||||
|
elif [[ "$http_code" == "401" ]]; then
|
||||||
|
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||||
|
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||||
|
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
||||||
|
else
|
||||||
|
msg_error "The repository may require authentication."
|
||||||
|
fi
|
||||||
|
if prompt_for_github_token; then
|
||||||
|
header=(-H "Authorization: token $GITHUB_TOKEN")
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
break
|
||||||
elif [[ "$http_code" == "403" ]]; then
|
elif [[ "$http_code" == "403" ]]; then
|
||||||
if ((attempt < max_retries)); then
|
if ((attempt < max_retries)); then
|
||||||
msg_warn "GitHub API rate limit hit, retrying in ${retry_delay}s... (attempt $attempt/$max_retries)"
|
msg_warn "GitHub API rate limit hit, retrying in ${retry_delay}s... (attempt $attempt/$max_retries)"
|
||||||
sleep "$retry_delay"
|
sleep "$retry_delay"
|
||||||
retry_delay=$((retry_delay * 2))
|
retry_delay=$((retry_delay * 2))
|
||||||
|
else
|
||||||
|
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||||
|
if prompt_for_github_token; then
|
||||||
|
header=(-H "Authorization: token $GITHUB_TOKEN")
|
||||||
|
retry_delay=2
|
||||||
|
attempt=0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
sleep "$retry_delay"
|
sleep "$retry_delay"
|
||||||
@@ -3136,21 +3208,10 @@ function fetch_and_deploy_gh_release() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
if ! $success; then
|
if ! $success; then
|
||||||
if [[ "$http_code" == "401" ]]; then
|
if [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
||||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
|
||||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
|
||||||
msg_error "Your GITHUB_TOKEN appears to be invalid or expired."
|
|
||||||
else
|
|
||||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
|
||||||
fi
|
|
||||||
elif [[ "$http_code" == "403" ]]; then
|
|
||||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
|
||||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
|
||||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
|
||||||
elif [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
|
||||||
msg_error "GitHub API connection failed (no response)."
|
msg_error "GitHub API connection failed (no response)."
|
||||||
msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit"
|
msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit"
|
||||||
else
|
elif [[ "$http_code" != "401" ]]; then
|
||||||
msg_error "Failed to fetch release metadata (HTTP $http_code)"
|
msg_error "Failed to fetch release metadata (HTTP $http_code)"
|
||||||
fi
|
fi
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
Reference in New Issue
Block a user