diff --git a/.github/changelogs/2026/06.md b/.github/changelogs/2026/06.md
index ddd1c030d..429f376cf 100644
--- a/.github/changelogs/2026/06.md
+++ b/.github/changelogs/2026/06.md
@@ -1,3 +1,147 @@
+## 2026-06-20
+
+### đ New Scripts
+
+ - Apache-Airflow ([#15228](https://github.com/community-scripts/ProxmoxVE/pull/15228))
+- Plane ([#15227](https://github.com/community-scripts/ProxmoxVE/pull/15227))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Fix docker service crash [@asylumexp](https://github.com/asylumexp) ([#15243](https://github.com/community-scripts/ProxmoxVE/pull/15243))
+ - Nginxproxymanager: repair broken certbot pip before update [@MickLesk](https://github.com/MickLesk) ([#15224](https://github.com/community-scripts/ProxmoxVE/pull/15224))
+
+ - #### ⨠New Features
+
+ - [arm64] Port scripts between komga & mediamanager to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15245](https://github.com/community-scripts/ProxmoxVE/pull/15245))
+ - [arm64] port scripts between hyperhdr & kometa to arm64 [@asylumexp](https://github.com/asylumexp) ([#15234](https://github.com/community-scripts/ProxmoxVE/pull/15234))
+
+### đ Github
+
+ - add arm64 title check to autolabeler [@asylumexp](https://github.com/asylumexp) ([#15235](https://github.com/community-scripts/ProxmoxVE/pull/15235))
+
+### â Uncategorized
+
+ - chore(ct): sync limesurvey defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#15247](https://github.com/community-scripts/ProxmoxVE/pull/15247))
+
+## 2026-06-19
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - add avx2 check to influxdb3 [@asylumexp](https://github.com/asylumexp) ([#15208](https://github.com/community-scripts/ProxmoxVE/pull/15208))
+ - Step ca leaf data patch [@heinemannj](https://github.com/heinemannj) ([#15210](https://github.com/community-scripts/ProxmoxVE/pull/15210))
+ - Kimai: Add APP_SECRET env var [@tremor021](https://github.com/tremor021) ([#15199](https://github.com/community-scripts/ProxmoxVE/pull/15199))
+
+ - #### ⨠New Features
+
+ - [arm64] Port scripts between garage-hortusfox to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15207](https://github.com/community-scripts/ProxmoxVE/pull/15207))
+ - [arm64] Port scripts titled between A-F to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15181](https://github.com/community-scripts/ProxmoxVE/pull/15181))
+
+### đ Github
+
+ - fix (workflow): YAML syntax error in pocketbase stub generation [@Trollfjorden](https://github.com/Trollfjorden) ([#15174](https://github.com/community-scripts/ProxmoxVE/pull/15174))
+
+### â Uncategorized
+
+ - chore(ct): sync coredns defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#15182](https://github.com/community-scripts/ProxmoxVE/pull/15182))
+- chore(ct): sync gatus defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#15184](https://github.com/community-scripts/ProxmoxVE/pull/15184))
+- chore(ct): sync bitmagnet defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#15183](https://github.com/community-scripts/ProxmoxVE/pull/15183))
+
+## 2026-06-18
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - flowise: add deps / uv / python 3.11 [@MickLesk](https://github.com/MickLesk) ([#15177](https://github.com/community-scripts/ProxmoxVE/pull/15177))
+
+ - #### đĨ Breaking Changes
+
+ - refactor: crafty-controller [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15178](https://github.com/community-scripts/ProxmoxVE/pull/15178))
+
+## 2026-06-17
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - kasm: fix release detection [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15151](https://github.com/community-scripts/ProxmoxVE/pull/15151))
+
+ - #### ⨠New Features
+
+ - trek: update install and upgrade workflow for v3.1.0 [@MickLesk](https://github.com/MickLesk) ([#15165](https://github.com/community-scripts/ProxmoxVE/pull/15165))
+
+ - #### đĨ Breaking Changes
+
+ - TREK: Pin version [@tremor021](https://github.com/tremor021) ([#15156](https://github.com/community-scripts/ProxmoxVE/pull/15156))
+
+ - #### đ§ Refactor
+
+ - chore(paperless-ngx): pin version to prevent v3 update [@tomfrenzel](https://github.com/tomfrenzel) ([#15171](https://github.com/community-scripts/ProxmoxVE/pull/15171))
+
+### đ§° Tools
+
+ - #### đ Bug Fixes
+
+ - immich public proxy: replace npm install with npm ci for consistent dependency installation [@MickLesk](https://github.com/MickLesk) ([#15166](https://github.com/community-scripts/ProxmoxVE/pull/15166))
+
+## 2026-06-16
+
+### đ New Scripts
+
+ - Feishin ([#15130](https://github.com/community-scripts/ProxmoxVE/pull/15130))
+- Kiwix ([#15131](https://github.com/community-scripts/ProxmoxVE/pull/15131))
+- Add runtime status guard and deleted script stubs [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15125](https://github.com/community-scripts/ProxmoxVE/pull/15125))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - fix(degoog): use localhost for valkey url [@ethan-hgwr](https://github.com/ethan-hgwr) ([#15149](https://github.com/community-scripts/ProxmoxVE/pull/15149))
+ - Fix InvoiceShelf install/update Yarn package manager mismatch [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15141](https://github.com/community-scripts/ProxmoxVE/pull/15141))
+ - fix storyteller install failure with yarn 4 corepack [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15140](https://github.com/community-scripts/ProxmoxVE/pull/15140))
+ - fix: generate policy-compliant OpenObserve root password [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15137](https://github.com/community-scripts/ProxmoxVE/pull/15137))
+
+## 2026-06-15
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Watcharr: Clean install on update [@tremor021](https://github.com/tremor021) ([#15119](https://github.com/community-scripts/ProxmoxVE/pull/15119))
+ - Vaultwarden: extend version check for VaultWarden update [@MickLesk](https://github.com/MickLesk) ([#15105](https://github.com/community-scripts/ProxmoxVE/pull/15105))
+
+ - #### ⨠New Features
+
+ - degoog: add curl-impersonate to script [@MickLesk](https://github.com/MickLesk) ([#15117](https://github.com/community-scripts/ProxmoxVE/pull/15117))
+
+### đž Core
+
+ - #### ⨠New Features
+
+ - tools.func: extend mesa-vulkan-drivers and vulkan-tools to installation for ARC GPU's [@MickLesk](https://github.com/MickLesk) ([#15106](https://github.com/community-scripts/ProxmoxVE/pull/15106))
+
+ - #### đ§ Refactor
+
+ - core: improve mirror selection and error handling [@MickLesk](https://github.com/MickLesk) ([#15108](https://github.com/community-scripts/ProxmoxVE/pull/15108))
+ - core: implement gateway validation for DHCP and static networks [@MickLesk](https://github.com/MickLesk) ([#15107](https://github.com/community-scripts/ProxmoxVE/pull/15107))
+
+## 2026-06-14
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Iinvoiceninja: fix nginx setup assets port [@MickLesk](https://github.com/MickLesk) ([#15090](https://github.com/community-scripts/ProxmoxVE/pull/15090))
+ - CheckMK: remove stale backup site before creating new backup during update [@MickLesk](https://github.com/MickLesk) ([#15088](https://github.com/community-scripts/ProxmoxVE/pull/15088))
+
+ - #### đ§ Refactor
+
+ - Refactor: Implement backup functions for scripts C-D [@tremor021](https://github.com/tremor021) ([#15096](https://github.com/community-scripts/ProxmoxVE/pull/15096))
+
## 2026-06-13
### đ New Scripts
diff --git a/.github/workflows/autolabeler.yml b/.github/workflows/autolabeler.yml
index 899a8d3c3..78695b181 100644
--- a/.github/workflows/autolabeler.yml
+++ b/.github/workflows/autolabeler.yml
@@ -21,7 +21,7 @@ jobs:
- name: Install dependencies
run: npm install minimatch
- - name: Label PR based on file changes and PR template
+ - name: Label PR based on file changes, title, and PR template
uses: actions/github-script@v7
with:
script: |
@@ -35,6 +35,7 @@ jobs:
const prNumber = context.payload.pull_request.number;
const prBody = context.payload.pull_request.body || "";
+ const prTitle = context.payload.pull_request.title || "";
let labelsToAdd = new Set();
@@ -68,6 +69,11 @@ jobs:
}
}
+ // Add arm64 label if PR title contains "arm64"
+ if (/arm64/i.test(prTitle)) {
+ labelsToAdd.add("arm64");
+ }
+
// Always parse template checkboxes to add content-type labels (bugfix, feature, etc.)
const templateLabelMappings = {
"đ **Bug fix**": "bugfix",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fce04bbaf..c765dc730 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -65,6 +65,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+
+
+
@@ -78,7 +81,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
-June (13 entries)
+June (20 entries)
[View June 2026 Changelog](.github/changelogs/2026/06.md)
@@ -483,6 +486,151 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+## 2026-06-24
+
+### đ Updated Scripts
+
+ - enabling rewirte module in apache [@d3v3lop3rDE](https://github.com/d3v3lop3rDE) ([#15360](https://github.com/community-scripts/ProxmoxVE/pull/15360))
+
+### đž Core
+
+ - #### ⨠New Features
+
+ - core: add var_http_proxy and var_http_no_proxy support [@MickLesk](https://github.com/MickLesk) ([#15225](https://github.com/community-scripts/ProxmoxVE/pull/15225))
+
+## 2026-06-23
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - update jdk when updating crafty-controller [@asylumexp](https://github.com/asylumexp) ([#15349](https://github.com/community-scripts/ProxmoxVE/pull/15349))
+ - fix docker update function [@asylumexp](https://github.com/asylumexp) ([#15353](https://github.com/community-scripts/ProxmoxVE/pull/15353))
+ - LibreNMS: run daily.sh as librenms user with git available [@MickLesk](https://github.com/MickLesk) ([#15314](https://github.com/community-scripts/ProxmoxVE/pull/15314))
+
+ - #### ⨠New Features
+
+ - termix - patch tmp nginx behaviour to match the install script [@xyzulu](https://github.com/xyzulu) ([#15283](https://github.com/community-scripts/ProxmoxVE/pull/15283))
+
+### đž Core
+
+ - Fix syntax error in build function [@l0caldadmin](https://github.com/l0caldadmin) ([#15337](https://github.com/community-scripts/ProxmoxVE/pull/15337))
+
+ - #### đ Bug Fixes
+
+ - fix: close lxc build function [@ServerBP](https://github.com/ServerBP) ([#15343](https://github.com/community-scripts/ProxmoxVE/pull/15343))
+
+### đ§° Tools
+
+ - #### ⨠New Features
+
+ - [arm64] port pve scripts to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15288](https://github.com/community-scripts/ProxmoxVE/pull/15288))
+
+### â Uncategorized
+
+ - fix(build.func): remove duplicate if statement causing syntax error on container creation [@Copilot](https://github.com/Copilot) ([#15338](https://github.com/community-scripts/ProxmoxVE/pull/15338))
+
+## 2026-06-22
+
+### đ New Scripts
+
+ - Postiz ([#15048](https://github.com/community-scripts/ProxmoxVE/pull/15048))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - invoiceshelf: use pnpm instead of yarn for frontend build [@MickLesk](https://github.com/MickLesk) ([#15312](https://github.com/community-scripts/ProxmoxVE/pull/15312))
+ - VictoriaMetrics: resolve architecture before jq asset filter [@MickLesk](https://github.com/MickLesk) ([#15316](https://github.com/community-scripts/ProxmoxVE/pull/15316))
+ - Endurain: pin uv to the version required by the project [@MickLesk](https://github.com/MickLesk) ([#15313](https://github.com/community-scripts/ProxmoxVE/pull/15313))
+ - add proxy headers to dispatcharr from #15143 [@asylumexp](https://github.com/asylumexp) ([#15293](https://github.com/community-scripts/ProxmoxVE/pull/15293))
+ - Fix-15015: check correct path for certbot [@galz55](https://github.com/galz55) ([#15034](https://github.com/community-scripts/ProxmoxVE/pull/15034))
+ - fix(romm): resolve 403 Forbidden error on nginx mod_zip installation [@hug-efrei](https://github.com/hug-efrei) ([#15134](https://github.com/community-scripts/ProxmoxVE/pull/15134))
+ - Degoog: Fix valkey url in update; set mandatory settings password [@vhsdream](https://github.com/vhsdream) ([#15300](https://github.com/community-scripts/ProxmoxVE/pull/15300))
+ - [arm64] fix update functions to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15290](https://github.com/community-scripts/ProxmoxVE/pull/15290))
+ - Fix typo in victoriametrics [@asylumexp](https://github.com/asylumexp) ([#15289](https://github.com/community-scripts/ProxmoxVE/pull/15289))
+
+ - #### ⨠New Features
+
+ - update: esphome to install and run ESPHome Device Builder [@jesserockz](https://github.com/jesserockz) ([#15195](https://github.com/community-scripts/ProxmoxVE/pull/15195))
+ - [arm64] Port scripts between warracker-zwavejsui to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15291](https://github.com/community-scripts/ProxmoxVE/pull/15291))
+ - [arm64] Port scripts between thingsboard & wanderer to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15286](https://github.com/community-scripts/ProxmoxVE/pull/15286))
+ - [arm64] Port scripts between snowshare & thelounge to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15280](https://github.com/community-scripts/ProxmoxVE/pull/15280))
+
+### đž Core
+
+ - #### đ Bug Fixes
+
+ - tools.func: refresh ruby-build when requested version is missing [@MickLesk](https://github.com/MickLesk) ([#15315](https://github.com/community-scripts/ProxmoxVE/pull/15315))
+
+ - #### ⨠New Features
+
+ - core: add pre-install storage health checks [@MickLesk](https://github.com/MickLesk) ([#15226](https://github.com/community-scripts/ProxmoxVE/pull/15226))
+
+ - #### đ§ Refactor
+
+ - core:: skip LXC stack upgrade prompt in unattended mode [@MickLesk](https://github.com/MickLesk) ([#15319](https://github.com/community-scripts/ProxmoxVE/pull/15319))
+
+### đ§° Tools
+
+ - #### đ§ Refactor
+
+ - update-apps: sanitize service detection and fail on invalid names [@MickLesk](https://github.com/MickLesk) ([#15318](https://github.com/community-scripts/ProxmoxVE/pull/15318))
+
+## 2026-06-21
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Matomo: flatten nested deploy layout after update [@MickLesk](https://github.com/MickLesk) ([#15267](https://github.com/community-scripts/ProxmoxVE/pull/15267))
+
+ - #### ⨠New Features
+
+ - [arm64] Port scripts between qdrant & snipeit to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15274](https://github.com/community-scripts/ProxmoxVE/pull/15274))
+ - [arm64] Port scripts between nodered & paperlessngx to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15255](https://github.com/community-scripts/ProxmoxVE/pull/15255))
+ - [arm64] port scripts titled between papra and qbittorrent to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15258](https://github.com/community-scripts/ProxmoxVE/pull/15258))
+ - [arm64] Port scripts between mediamtx-nocodb to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15254](https://github.com/community-scripts/ProxmoxVE/pull/15254))
+
+ - #### đ§ Refactor
+
+ - tools.func: centralize Node.js corepack and npm handling in `setup_nodejs()` [@MickLesk](https://github.com/MickLesk) ([#15268](https://github.com/community-scripts/ProxmoxVE/pull/15268))
+
+### đž Core
+
+ - #### đ Bug Fixes
+
+ - tools.func: APT install and deb822 repo reliability [@MickLesk](https://github.com/MickLesk) ([#15272](https://github.com/community-scripts/ProxmoxVE/pull/15272))
+ - tools.func: prevent MySQL data loss and fix repo version matching [@MickLesk](https://github.com/MickLesk) ([#15271](https://github.com/community-scripts/ProxmoxVE/pull/15271))
+ - tools.func: runtime hardening for API helpers and Docker/MeiliSearch [@MickLesk](https://github.com/MickLesk) ([#15273](https://github.com/community-scripts/ProxmoxVE/pull/15273))
+
+## 2026-06-20
+
+### đ New Scripts
+
+ - Apache-Airflow ([#15228](https://github.com/community-scripts/ProxmoxVE/pull/15228))
+- Plane ([#15227](https://github.com/community-scripts/ProxmoxVE/pull/15227))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Fix docker service crash [@asylumexp](https://github.com/asylumexp) ([#15243](https://github.com/community-scripts/ProxmoxVE/pull/15243))
+ - Nginxproxymanager: repair broken certbot pip before update [@MickLesk](https://github.com/MickLesk) ([#15224](https://github.com/community-scripts/ProxmoxVE/pull/15224))
+
+ - #### ⨠New Features
+
+ - [arm64] Port scripts between komga & mediamanager to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15245](https://github.com/community-scripts/ProxmoxVE/pull/15245))
+ - [arm64] port scripts between hyperhdr & kometa to arm64 [@asylumexp](https://github.com/asylumexp) ([#15234](https://github.com/community-scripts/ProxmoxVE/pull/15234))
+
+### đ Github
+
+ - add arm64 title check to autolabeler [@asylumexp](https://github.com/asylumexp) ([#15235](https://github.com/community-scripts/ProxmoxVE/pull/15235))
+
+### â Uncategorized
+
+ - chore(ct): sync limesurvey defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#15247](https://github.com/community-scripts/ProxmoxVE/pull/15247))
+
## 2026-06-19
### đ Updated Scripts
@@ -495,6 +643,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### ⨠New Features
+ - [arm64] Port scripts between garage-hortusfox to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15207](https://github.com/community-scripts/ProxmoxVE/pull/15207))
- [arm64] Port scripts titled between A-F to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15181](https://github.com/community-scripts/ProxmoxVE/pull/15181))
### đ Github
@@ -1052,120 +1201,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### đ§ Refactor
- - core: suppress MOTD for non-interactive shells [@MickLesk](https://github.com/MickLesk) ([#14638](https://github.com/community-scripts/ProxmoxVE/pull/14638))
-
-## 2026-05-21
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - snowshare: use mv instead of cp for uploads backup to prevent disk fill [@TuroYT](https://github.com/TuroYT) ([#14558](https://github.com/community-scripts/ProxmoxVE/pull/14558))
- - Technitium DNS: download release before stopping the service on update [@w-gitops](https://github.com/w-gitops) ([#14616](https://github.com/community-scripts/ProxmoxVE/pull/14616))
-
- - #### ⨠New Features
-
- - Proxmox VE 9.2 support [@MickLesk](https://github.com/MickLesk) ([#14624](https://github.com/community-scripts/ProxmoxVE/pull/14624))
-
-## 2026-05-20
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Update mylar3 to point to new Repo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14606](https://github.com/community-scripts/ProxmoxVE/pull/14606))
- - Ollama: Fix for latest version [@tremor021](https://github.com/tremor021) ([#14596](https://github.com/community-scripts/ProxmoxVE/pull/14596))
-
- - #### ⨠New Features
-
- - Profilarr v2: Update and Refactor whole Script [@MickLesk](https://github.com/MickLesk) ([#14584](https://github.com/community-scripts/ProxmoxVE/pull/14584))
-
-## 2026-05-19
-
-### đ New Scripts
-
- - LobeHub ([#14441](https://github.com/community-scripts/ProxmoxVE/pull/14441))
-
-### đ Updated Scripts
-
- - Update nodejs Versions [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14582](https://github.com/community-scripts/ProxmoxVE/pull/14582))
-
- - #### đ Bug Fixes
-
- - ESPConnect: Fix paths to SSL certificates [@tremor021](https://github.com/tremor021) ([#14591](https://github.com/community-scripts/ProxmoxVE/pull/14591))
- - ReactiveResume: set correct WorkingDirectory for systemd service [@MickLesk](https://github.com/MickLesk) ([#14579](https://github.com/community-scripts/ProxmoxVE/pull/14579))
- - Sparkyfitness: add missing nginx template variable substitutions [@MickLesk](https://github.com/MickLesk) ([#14578](https://github.com/community-scripts/ProxmoxVE/pull/14578))
- - Wanderer: include dev dependencies during build [@MickLesk](https://github.com/MickLesk) ([#14577](https://github.com/community-scripts/ProxmoxVE/pull/14577))
- - Whisparr: switch from nightly to stable GitHub release [@MickLesk](https://github.com/MickLesk) ([#14581](https://github.com/community-scripts/ProxmoxVE/pull/14581))
-
- - #### đ§ Refactor
-
- - Refactor: SonarQube [@tremor021](https://github.com/tremor021) ([#14594](https://github.com/community-scripts/ProxmoxVE/pull/14594))
-
-## 2026-05-18
-
-### đ New Scripts
-
- - ESPconnect ([#14444](https://github.com/community-scripts/ProxmoxVE/pull/14444))
-- degoog ([#14533](https://github.com/community-scripts/ProxmoxVE/pull/14533))
-- Webtrees ([#14532](https://github.com/community-scripts/ProxmoxVE/pull/14532))
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Bichon: Support v1 migration [@tomfrenzel](https://github.com/tomfrenzel) ([#14524](https://github.com/community-scripts/ProxmoxVE/pull/14524))
-
- - #### ⨠New Features
-
- - Pangolin: bump to 1.18.4, fix missing statusHistory migration [@MickLesk](https://github.com/MickLesk) ([#14566](https://github.com/community-scripts/ProxmoxVE/pull/14566))
-
-## 2026-05-17
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - dashy: fix yarn-missing on update and back up full user-data [@lissy93](https://github.com/lissy93) ([#14548](https://github.com/community-scripts/ProxmoxVE/pull/14548))
-
- - #### ⨠New Features
-
- - tools.func: replace max-time with speed-limit stall detection in curl_download [@MickLesk](https://github.com/MickLesk) ([#14545](https://github.com/community-scripts/ProxmoxVE/pull/14545))
-
-## 2026-05-16
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Homelable: replace passlib with bcrypt for password hashing [@MickLesk](https://github.com/MickLesk) ([#14530](https://github.com/community-scripts/ProxmoxVE/pull/14530))
- - dashy: fix: restore [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14527](https://github.com/community-scripts/ProxmoxVE/pull/14527))
- - Update Tinyauth source URL in installation script [@MehrunesSky](https://github.com/MehrunesSky) ([#14483](https://github.com/community-scripts/ProxmoxVE/pull/14483))
- - Excalidraw: Fix build [@tremor021](https://github.com/tremor021) ([#14509](https://github.com/community-scripts/ProxmoxVE/pull/14509))
-
- - #### ⨠New Features
-
- - Update authentik version to 2026.2.3 [@thieneret](https://github.com/thieneret) ([#14517](https://github.com/community-scripts/ProxmoxVE/pull/14517))
-
-## 2026-05-15
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - OPNsense: replace undefined msg_warn with inline echo in alloc retry [@MickLesk](https://github.com/MickLesk) ([#14500](https://github.com/community-scripts/ProxmoxVE/pull/14500))
- - Checkmk: detect OMD version suffix dynamically on update [@MickLesk](https://github.com/MickLesk) ([#14496](https://github.com/community-scripts/ProxmoxVE/pull/14496))
-
- - #### ⨠New Features
-
- - SearXNG: enable JSON format by default for API integrations [@MickLesk](https://github.com/MickLesk) ([#14498](https://github.com/community-scripts/ProxmoxVE/pull/14498))
-
- - #### đ§ Refactor
-
- - Refactor: Ollama use tools.func [@MickLesk](https://github.com/MickLesk) ([#14501](https://github.com/community-scripts/ProxmoxVE/pull/14501))
-
-### đž Core
-
- - #### đ Bug Fixes
-
- - core: fall back to silent mode when no TTY or whiptail unavailable [@MickLesk](https://github.com/MickLesk) ([#14497](https://github.com/community-scripts/ProxmoxVE/pull/14497))
\ No newline at end of file
+ - core: suppress MOTD for non-interactive shells [@MickLesk](https://github.com/MickLesk) ([#14638](https://github.com/community-scripts/ProxmoxVE/pull/14638))
\ No newline at end of file
diff --git a/ct/agentdvr.sh b/ct/agentdvr.sh
index 7c0e486ee..73360ced2 100644
--- a/ct/agentdvr.sh
+++ b/ct/agentdvr.sh
@@ -30,7 +30,7 @@ function update_script() {
exit
fi
- RELEASE=$(curl -fsSL "https://www.ispyconnect.com/api/Agent/DownloadLocation4?platform=Linux64&fromVersion=0" | grep -o 'https://.*\.zip')
+ RELEASE=$(curl -fsSL "https://www.ispyconnect.com/api/Agent/DownloadLocation4?platform=$(arch_resolve "Linux64" "LinuxARM64")&fromVersion=0" | grep -o 'https://.*\.zip')
if [[ "${RELEASE}" != "$(cat ~/.agentdvr 2>/dev/null)" ]] || [[ ! -f ~/.agentdvr ]]; then
msg_info "Stopping service"
systemctl stop AgentDVR
@@ -39,10 +39,10 @@ function update_script() {
msg_info "Updating AgentDVR"
cd /opt/agentdvr/agent
curl -fsSL "$RELEASE" -o $(basename "$RELEASE")
- $STD unzip -o Agent_Linux64*.zip
+ $STD unzip -o Agent_$(arch_resolve "Linux64" "LinuxARM64")*.zip
chmod +x ./Agent
echo $RELEASE >~/.agentdvr
- rm -rf Agent_Linux64*.zip
+ rm -rf Agent_$(arch_resolve "Linux64" "LinuxARM64")*.zip
msg_ok "Updated AgentDVR"
msg_info "Starting service"
diff --git a/ct/apache-airflow.sh b/ct/apache-airflow.sh
new file mode 100644
index 000000000..d6a331177
--- /dev/null
+++ b/ct/apache-airflow.sh
@@ -0,0 +1,75 @@
+#!/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/apache/airflow
+
+APP="Apache-Airflow"
+var_tags="${var_tags:-workflow;scheduler;automation}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-4096}"
+var_disk="${var_disk:-16}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+var_arm64="${var_arm64:-no}"
+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/airflow ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ INSTALLED=$(cat ~/.airflow 2>/dev/null || echo "0")
+ LATEST=$(curl -fsSL "https://pypi.org/pypi/apache-airflow/json" | jq -r '.info.version')
+
+ if [[ "$INSTALLED" == "$LATEST" ]]; then
+ msg_ok "Already on the latest version (${LATEST})"
+ exit
+ fi
+
+ msg_info "Stopping Services"
+ systemctl stop airflow-api-server airflow-scheduler airflow-dag-processor airflow-triggerer
+ msg_ok "Stopped Services"
+
+ create_backup /opt/airflow/.env
+
+ msg_info "Updating Apache Airflow to ${LATEST}"
+ $STD uv pip install --python /opt/airflow/.venv/bin/python \
+ "apache-airflow[postgres,fab]==${LATEST}" \
+ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-${LATEST}/constraints-3.12.txt"
+ echo "${LATEST}" >~/.airflow
+ msg_ok "Updated Apache Airflow to ${LATEST}"
+
+ restore_backup
+
+ msg_info "Running Database Migrations"
+ set -a && source /opt/airflow/.env && set +a
+ $STD /opt/airflow/.venv/bin/airflow db migrate
+ msg_ok "Ran Database Migrations"
+
+ msg_info "Starting Services"
+ systemctl start airflow-api-server airflow-scheduler airflow-dag-processor airflow-triggerer
+ msg_ok "Started Services"
+ msg_ok "Updated successfully!"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
diff --git a/ct/apprise-api.sh b/ct/apprise-api.sh
index 43728c874..06cd29783 100644
--- a/ct/apprise-api.sh
+++ b/ct/apprise-api.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,6 +34,7 @@ function update_script() {
systemctl stop apprise-api
msg_ok "Stopped Service"
+ export UV_PYTHON_INSTALL_DIR=/opt/uv-python
PYTHON_VERSION="3.12" setup_uv
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "apprise" "caronc/apprise-api" "tarball"
@@ -41,7 +42,9 @@ function update_script() {
cd /opt/apprise
cp ./requirements.txt /etc/requirements.txt
$STD apt install -y nginx git
- $STD uv pip install -r requirements.txt gunicorn supervisor --system
+ $STD uv venv /opt/apprise/.venv
+ $STD uv pip install -r requirements.txt gunicorn supervisor -p /opt/apprise/.venv/bin/python
+ ln -sf /opt/apprise/.venv/bin/supervisord /opt/apprise/.venv/bin/gunicorn /usr/local/bin/
cp -fr apprise_api/static /usr/share/nginx/html/s/
mv apprise_api/ webapp
touch /etc/nginx/server-override.conf
diff --git a/ct/archivebox.sh b/ct/archivebox.sh
index 2baa8a795..76c170560 100644
--- a/ct/archivebox.sh
+++ b/ct/archivebox.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,13 +39,13 @@ function update_script() {
msg_ok "Stopped Service"
msg_info "Upgrading Playwright"
- $STD uv pip install playwright --system
+ $STD uv pip install playwright --system --break-system-packages
$STD playwright install-deps chromium
msg_ok "Upgraded Playwright"
msg_info "Updating ArchiveBox"
cd /opt/archivebox/data
- $STD uv pip install --system --upgrade --no-reinstall archivebox
+ $STD uv pip install --system --break-system-packages --upgrade --no-reinstall archivebox
sudo -u archivebox archivebox init
msg_ok "Updated ArchiveBox"
diff --git a/ct/bitfocus-companion.sh b/ct/bitfocus-companion.sh
index 368548da1..c6687383c 100644
--- a/ct/bitfocus-companion.sh
+++ b/ct/bitfocus-companion.sh
@@ -31,11 +31,14 @@ function update_script() {
fi
RELEASE_JSON=$(curl -fsSL "https://api.bitfocus.io/v1/product/companion/packages?limit=20")
- PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c '(if type == "array" then . else .packages end) | [.[] | select(.target=="linux-tgz" and (.uri | contains("linux-x64")))] | first')
+ PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c \
+ --arg target "linux-$(arch_resolve "tgz" "arm64-tgz")" \
+ --arg arch "linux-$(arch_resolve "x64" "arm64")" \
+ '(if type == "array" then . else .packages end) | [.[] | select(.target==$target and (.uri | contains($arch)))] | first')
RELEASE=$(echo "$PACKAGE_JSON" | jq -r '.version // empty')
ASSET_URL=$(echo "$PACKAGE_JSON" | jq -r '.uri // empty')
if [[ -z "$RELEASE" || -z "$ASSET_URL" ]]; then
- msg_error "Could not resolve a matching Linux x64 Companion package from the Bitfocus API."
+ msg_error "Could not resolve a matching Linux $(arch_resolve "x64" "arm64") Companion package from the Bitfocus API."
exit 1
fi
diff --git a/ct/bookorbit.sh b/ct/bookorbit.sh
index 25b19cddf..16e330e24 100644
--- a/ct/bookorbit.sh
+++ b/ct/bookorbit.sh
@@ -30,6 +30,8 @@ function update_script() {
exit
fi
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
+
if check_for_gh_release "bookorbit" "bookorbit/bookorbit"; then
msg_info "Stopping Service"
systemctl stop bookorbit
@@ -42,7 +44,7 @@ function update_script() {
msg_info "Rebuilding Application"
cd /opt/bookorbit
PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/bookorbit/package.json)
- $STD corepack enable
+
$STD corepack prepare "pnpm@${PNPM_VERSION}" --activate
$STD pnpm install --frozen-lockfile
$STD pnpm --filter client run build-only
@@ -59,7 +61,6 @@ function update_script() {
$STD uv pip install --python /opt/bookorbit-python/bin/python -r /opt/bookorbit/server/requirements/kobo-cloudscraper.txt
msg_ok "Updated Kobo Python Runtime"
-
msg_info "Starting Service"
systemctl start bookorbit
msg_ok "Started Service"
diff --git a/ct/configarr.sh b/ct/configarr.sh
index 636e3d8a8..6590f3383 100644
--- a/ct/configarr.sh
+++ b/ct/configarr.sh
@@ -37,7 +37,7 @@ function update_script() {
/opt/configarr/secrets.yml \
/opt/configarr/.env
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr" "prebuild" "latest" "/opt/configarr" "configarr-linux-x64.tar.xz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr" "prebuild" "latest" "/opt/configarr" "configarr-linux-$(arch_resolve "x64" "arm64").tar.xz"
restore_backup
diff --git a/ct/crafty-controller.sh b/ct/crafty-controller.sh
index 2c31aee82..89b0012c2 100644
--- a/ct/crafty-controller.sh
+++ b/ct/crafty-controller.sh
@@ -46,6 +46,12 @@ function update_script() {
restore_backup
+ msg_info "Updating TemurinJDK"
+ setup_java
+ $STD apt install -y temurin-{8,11,17,21,25}-jre
+ $STD update-alternatives --set java /usr/lib/jvm/temurin-25-jre-$(arch_resolve)/bin/java
+ msg_ok "Updated TemurinJDK"
+
msg_info "Updating Python dependencies"
chown -R crafty:crafty /opt/crafty-controller
cd /opt/crafty-controller/crafty/crafty-4
diff --git a/ct/databasus.sh b/ct/databasus.sh
index e07104331..8e5cc5df9 100644
--- a/ct/databasus.sh
+++ b/ct/databasus.sh
@@ -30,6 +30,8 @@ function update_script() {
exit
fi
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
+
if check_for_gh_release "databasus" "databasus/databasus"; then
msg_info "Stopping Databasus"
$STD systemctl stop databasus
@@ -70,7 +72,7 @@ function update_script() {
msg_info "Updating Databasus"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
cd /opt/databasus/frontend
- $STD corepack enable
+
$STD corepack prepare pnpm@latest --activate
$STD pnpm install --frozen-lockfile
$STD pnpm run build
diff --git a/ct/degoog.sh b/ct/degoog.sh
index fa98bbf99..97312acdb 100644
--- a/ct/degoog.sh
+++ b/ct/degoog.sh
@@ -57,9 +57,11 @@ function update_script() {
restore_backup
if [[ -f /opt/degoog/.env ]]; then
- grep -q "^DEGOOG_VALKEY_URL=" /opt/degoog/.env && sed -i "s|^DEGOOG_VALKEY_URL=.*|DEGOOG_VALKEY_URL=redis://valkey:6379|" /opt/degoog/.env || echo "DEGOOG_VALKEY_URL=redis://valkey:6379" >>/opt/degoog/.env
+ grep -q "^DEGOOG_VALKEY_URL=" /opt/degoog/.env && sed -i "s|^DEGOOG_VALKEY_URL=.*|DEGOOG_VALKEY_URL=redis://127.0.0.1:6379|" /opt/degoog/.env || echo "DEGOOG_VALKEY_URL=redis://127.0.0.1:6379" >>/opt/degoog/.env
grep -q "^DEGOOG_CACHE_MAX_ENTRIES=" /opt/degoog/.env && sed -i "s|^DEGOOG_CACHE_MAX_ENTRIES=.*|DEGOOG_CACHE_MAX_ENTRIES=1000|" /opt/degoog/.env || echo "DEGOOG_CACHE_MAX_ENTRIES=1000" >>/opt/degoog/.env
grep -q "^DEGOOG_CACHE_TTL_MS=" /opt/degoog/.env && sed -i "s|^DEGOOG_CACHE_TTL_MS=.*|DEGOOG_CACHE_TTL_MS=43200000|" /opt/degoog/.env || echo "DEGOOG_CACHE_TTL_MS=43200000" >>/opt/degoog/.env
+ grep -q "^# DEGOOG_SETTINGS_PASSWORDS" /opt/degoog/.env && sed -i "s|^# DEGOOG_SETTINGS_PASSWORDS=.*|DEGOOG_SETTINGS_PASSWORDS=$(openssl rand -hex 32)|" /opt/degoog/.env &&
+ msg_warn "Mandatory Settings Password created - check /opt/degoog/.env"
fi
msg_ok "Restored Configuration & Data"
diff --git a/ct/dispatcharr.sh b/ct/dispatcharr.sh
index cd9636770..1c523eaf8 100644
--- a/ct/dispatcharr.sh
+++ b/ct/dispatcharr.sh
@@ -32,11 +32,76 @@ function update_script() {
setup_uv
NODE_VERSION="24" setup_nodejs
+ if [[ -f "/etc/nginx/sites-available/dispatcharr.conf" ]] && ! grep -q "real_forwarded_proto" "/etc/nginx/sites-available/dispatcharr.conf"; then
+ msg_info "Migrating Nginx Configuration"
+ cat <"/etc/nginx/sites-available/dispatcharr.conf"
+map \$http_x_forwarded_proto \$real_forwarded_proto {
+ "" \$scheme;
+ default \$http_x_forwarded_proto;
+}
- # Fix for nginx not allowing large files
- if ! grep -q "client_max_body_size 100M;" /etc/nginx/sites-available/dispatcharr.conf; then
- sed -i '/server_name _;/a \ client_max_body_size 100M;' /etc/nginx/sites-available/dispatcharr.conf
+map \$http_x_forwarded_port \$real_forwarded_port {
+ "" \$server_port;
+ default \$http_x_forwarded_port;
+}
+
+server {
+ listen 9191;
+ server_name _;
+ client_max_body_size 100M;
+
+ # Serve static assets with correct MIME types
+ location /assets/ {
+ alias /opt/dispatcharr/frontend/dist/assets/;
+ expires 30d;
+ add_header Cache-Control "public, immutable";
+
+ # Explicitly set MIME types for webpack-built assets
+ types {
+ text/javascript js;
+ text/css css;
+ image/png png;
+ image/svg+xml svg svgz;
+ font/woff2 woff2;
+ font/woff woff;
+ font/ttf ttf;
+ }
+ }
+
+ location /static/ {
+ alias /opt/dispatcharr/static/;
+ expires 30d;
+ add_header Cache-Control "public, immutable";
+ }
+
+ location /media/ {
+ alias /opt/dispatcharr/media/;
+ }
+
+ location /ws/ {
+ proxy_pass http://127.0.0.1:8001;
+ 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 \$real_forwarded_proto;
+ }
+
+ # All other requests proxy to uWSGI
+ location / {
+ 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 \$real_forwarded_proto;
+ proxy_set_header X-Forwarded-Port \$real_forwarded_port;
+ proxy_pass http://127.0.0.1:5656;
+ }
+}
+EOF
systemctl reload nginx
+ msg_ok "Migrated Nginx Configuration"
fi
ensure_dependencies vlc-bin vlc-plugin-base
diff --git a/ct/docker.sh b/ct/docker.sh
index d14a6901d..0ef27e8bc 100644
--- a/ct/docker.sh
+++ b/ct/docker.sh
@@ -27,12 +27,14 @@ function update_script() {
msg_info "Updating base system"
$STD apt update
- $STD apt upgrade -y
+ $STD apt upgrade -y
msg_ok "Base system updated"
- msg_info "Updating Docker Engine"
- $STD apt install --only-upgrade -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin
- msg_ok "Docker Engine updated"
+ if dpkg-query -W -f='${Status}' docker-ce 2>/dev/null | grep -q "ok installed"; then
+ USE_DOCKER_REPO="true" setup_docker
+ else
+ setup_docker
+ fi
if docker ps -a --format '{{.Image}}' | grep -q '^portainer/portainer-ce:latest$'; then
msg_info "Updating Portainer"
diff --git a/ct/duplicati.sh b/ct/duplicati.sh
index 5601f4da0..7770d1de5 100644
--- a/ct/duplicati.sh
+++ b/ct/duplicati.sh
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop duplicati
msg_info "Stopped Service"
- fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "duplicati-*-linux-x64-gui.deb"
+ fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "duplicati-*-linux-$(arch_resolve "x64" "arm64")-gui.deb"
msg_info "Starting Service"
systemctl start duplicati
diff --git a/ct/endurain.sh b/ct/endurain.sh
index 664efe62a..ae372adf1 100644
--- a/ct/endurain.sh
+++ b/ct/endurain.sh
@@ -61,6 +61,8 @@ function update_script() {
msg_info "Updating Backend"
cd /opt/endurain/backend
+ UV_VERSION=$(grep -Po 'required-version\s*=\s*"\K[^"]+' pyproject.toml 2>/dev/null || echo "0.11.18")
+ UV_VERSION="$UV_VERSION" setup_uv
$STD poetry export -f requirements.txt --output requirements.txt --without-hashes
$STD uv venv --clear
$STD uv pip install -r requirements.txt
diff --git a/ct/esphome.sh b/ct/esphome.sh
index 5695991a0..4dcf1ea06 100644
--- a/ct/esphome.sh
+++ b/ct/esphome.sh
@@ -24,13 +24,14 @@ function update_script() {
header_info
check_container_storage
check_container_resources
- if [[ ! -f /etc/systemd/system/esphomeDashboard.service ]]; then
+ if [[ ! -f /etc/systemd/system/esphome-device-builder.service && ! -f /etc/systemd/system/esphomeDashboard.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Stopping Service"
- systemctl stop esphomeDashboard
+ systemctl stop esphome-device-builder 2>/dev/null || true
+ systemctl stop esphomeDashboard 2>/dev/null || true
msg_ok "Stopped Service"
VENV_PATH="/opt/esphome/.venv"
@@ -46,33 +47,36 @@ function update_script() {
$STD uv venv --clear "$VENV_PATH"
$STD "$VENV_PATH/bin/python" -m ensurepip --upgrade
$STD "$VENV_PATH/bin/python" -m pip install --upgrade pip
- $STD "$VENV_PATH/bin/python" -m pip install esphome tornado esptool
+ $STD "$VENV_PATH/bin/python" -m pip install esphome esphome-device-builder esptool
msg_ok "Migrated to uv/venv"
else
- msg_info "Updating ESPHome"
+ msg_info "Updating ESPHome Device Builder"
PYTHON_VERSION="3.12" setup_uv
- $STD "$VENV_PATH/bin/python" -m pip install --upgrade esphome tornado esptool
- msg_ok "Updated ESPHome"
+ $STD "$VENV_PATH/bin/python" -m pip install --upgrade esphome esphome-device-builder esptool
+ msg_ok "Updated ESPHome Device Builder"
fi
- SERVICE_FILE="/etc/systemd/system/esphomeDashboard.service"
- if ! grep -q "${VENV_PATH}/bin/esphome" "$SERVICE_FILE"; then
- msg_info "Updating systemd service"
- cat <"$SERVICE_FILE"
+
+ msg_info "Migrating to ESPHome Device Builder service"
+ if [[ -f /etc/systemd/system/esphomeDashboard.service ]]; then
+ systemctl disable -q esphomeDashboard 2>/dev/null || true
+ rm -f /etc/systemd/system/esphomeDashboard.service
+ fi
+ cat </etc/systemd/system/esphome-device-builder.service
[Unit]
-Description=ESPHome Dashboard
+Description=ESPHome Device Builder
After=network.target
[Service]
-ExecStart=${VENV_PATH}/bin/esphome dashboard /root/config/
+ExecStart=${VENV_PATH}/bin/esphome-device-builder /root/config/
Restart=always
User=root
[Install]
WantedBy=multi-user.target
EOF
- $STD systemctl daemon-reload
- msg_ok "Updated systemd service"
- fi
+ $STD systemctl daemon-reload
+ $STD systemctl enable esphome-device-builder
+ msg_ok "Migrated to ESPHome Device Builder service"
msg_info "Linking esphome to /usr/local/bin"
rm -f /usr/local/bin/esphome
@@ -80,7 +84,7 @@ EOF
msg_ok "Linked esphome binary"
msg_info "Starting Service"
- systemctl start esphomeDashboard
+ systemctl start esphome-device-builder
msg_ok "Started Service"
msg_ok "Updated successfully!"
exit
diff --git a/ct/feishin.sh b/ct/feishin.sh
index b13b280e5..4f3f8cd63 100644
--- a/ct/feishin.sh
+++ b/ct/feishin.sh
@@ -30,6 +30,8 @@ function update_script() {
exit
fi
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
+
if check_for_gh_release "feishin" "jeffvli/feishin"; then
create_backup /opt/feishin/.env
@@ -38,7 +40,7 @@ function update_script() {
msg_info "Rebuilding Feishin Web"
cd /opt/feishin
#PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json)
- $STD corepack enable
+
$STD corepack prepare "pnpm@10" --activate
$STD pnpm install
$STD pnpm run build:web
diff --git a/ct/garage.sh b/ct/garage.sh
index fefc96926..ebca5a3b4 100644
--- a/ct/garage.sh
+++ b/ct/garage.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -40,7 +40,7 @@ function update_script() {
msg_ok "Backed Up Data"
msg_info "Updating Garage"
- curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/x86_64-unknown-linux-musl/garage" -o /usr/local/bin/garage
+ curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
chmod +x /usr/local/bin/garage
echo "${GITEA_RELEASE}" >~/.garage
msg_ok "Updated Garage"
diff --git a/ct/geopulse.sh b/ct/geopulse.sh
index 12189eb7f..8c2079a60 100644
--- a/ct/geopulse.sh
+++ b/ct/geopulse.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/gitea.sh b/ct/gitea.sh
index 9c0e75a07..f29289de8 100644
--- a/ct/gitea.sh
+++ b/ct/gitea.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
msg_ok "Service stopped"
rm -rf /usr/local/bin/gitea
- fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-amd64"
+ fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-$(arch_resolve)"
chmod +x /usr/local/bin/gitea
msg_info "Starting service"
diff --git a/ct/github-runner.sh b/ct/github-runner.sh
index 245270c20..6bc0a36bc 100644
--- a/ct/github-runner.sh
+++ b/ct/github-runner.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_nesting="${var_nesting:-1}"
var_keyctl="${var_keyctl:-1}"
@@ -46,7 +46,7 @@ function update_script() {
done
msg_ok "Backed up configuration"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "actions-runner" "actions/runner" "prebuild" "latest" "/opt/actions-runner" "actions-runner-linux-x64-*.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "actions-runner" "actions/runner" "prebuild" "latest" "/opt/actions-runner" "actions-runner-linux-$(arch_resolve "x64" "arm64")-*.tar.gz"
msg_info "Restoring runner configuration"
for f in .runner .credentials .credentials_rsaparams .env .path; do
diff --git a/ct/glance.sh b/ct/glance.sh
index d377c6fb5..d98eaca00 100644
--- a/ct/glance.sh
+++ b/ct/glance.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -43,7 +43,7 @@ function update_script() {
systemctl stop glance
msg_ok "Stopped Service"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "glance" "glanceapp/glance" "prebuild" "latest" "/opt/glance" "glance-linux-amd64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "glance" "glanceapp/glance" "prebuild" "latest" "/opt/glance" "glance-linux-$(arch_resolve).tar.gz"
msg_info "Starting Service"
systemctl start glance
diff --git a/ct/gluetun.sh b/ct/gluetun.sh
index f86032460..c6cd1331a 100644
--- a/ct/gluetun.sh
+++ b/ct/gluetun.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_tun="${var_tun:-yes}"
diff --git a/ct/go2rtc.sh b/ct/go2rtc.sh
index 36c27bc17..bee6a2479 100644
--- a/ct/go2rtc.sh
+++ b/ct/go2rtc.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop go2rtc
msg_ok "Stopped service"
- fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_amd64"
+ fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_$(arch_resolve)"
msg_info "Starting service"
systemctl start go2rtc
diff --git a/ct/gogs.sh b/ct/gogs.sh
index 6342738b2..d00561852 100644
--- a/ct/gogs.sh
+++ b/ct/gogs.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -40,7 +40,7 @@ function update_script() {
cp -r /opt/gogs/data /opt/gogs_data_backup
msg_ok "Backed up Data"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_amd64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_$(arch_resolve).tar.gz"
msg_info "Restoring Data"
cp -r /opt/gogs_custom_backup/. /opt/gogs/custom
diff --git a/ct/gokapi.sh b/ct/gokapi.sh
index 7164015c6..8024187f7 100644
--- a/ct/gokapi.sh
+++ b/ct/gokapi.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop gokapi
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "*linux*amd64.zip"
+ fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "*linux*$(arch_resolve).zip"
# Migrate from pre-v2.2.4 binary name (gokapi-linux_amd64 -> gokapi)
if [[ -f /opt/gokapi/gokapi-linux_amd64 ]]; then
diff --git a/ct/gotify.sh b/ct/gotify.sh
index 7b5ffbb38..0615a2342 100644
--- a/ct/gotify.sh
+++ b/ct/gotify.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,8 +33,8 @@ function update_script() {
systemctl stop gotify
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-amd64.zip"
- chmod +x /opt/gotify/gotify-linux-amd64
+ fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-$(arch_resolve).zip"
+ chmod +x /opt/gotify/gotify-linux-$(arch_resolve)
msg_info "Starting Service"
systemctl start gotify
diff --git a/ct/gramps-web.sh b/ct/gramps-web.sh
index 19f5190e4..04c369452 100644
--- a/ct/gramps-web.sh
+++ b/ct/gramps-web.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -31,7 +31,7 @@ function update_script() {
fi
PYTHON_VERSION="3.12" setup_uv
- NODE_VERSION="22" setup_nodejs
+ NODE_VERSION="22" NODE_MODULE="corepack" setup_nodejs
if check_for_gh_release "gramps-web-api" "gramps-project/gramps-web-api"; then
msg_info "Stopping Service"
@@ -84,7 +84,7 @@ function update_script() {
msg_info "Updating Gramps Web Frontend"
cd /opt/gramps-web/frontend
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
- $STD corepack enable
+
$STD npm install
$STD npm run build
msg_ok "Updated Gramps Web Frontend"
diff --git a/ct/headers/apache-airflow b/ct/headers/apache-airflow
new file mode 100644
index 000000000..0c0912393
--- /dev/null
+++ b/ct/headers/apache-airflow
@@ -0,0 +1,6 @@
+ ___ __ ___ _ ______
+ / | ____ ____ ______/ /_ ___ / | (_)____/ __/ /___ _ __
+ / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ /| | / / ___/ /_/ / __ \ | /| / /
+ / ___ |/ /_/ / /_/ / /__/ / / / __/_____/ ___ |/ / / / __/ / /_/ / |/ |/ /
+/_/ |_/ .___/\__,_/\___/_/ /_/\___/ /_/ |_/_/_/ /_/ /_/\____/|__/|__/
+ /_/
diff --git a/ct/headers/plane b/ct/headers/plane
new file mode 100644
index 000000000..d2c671d48
--- /dev/null
+++ b/ct/headers/plane
@@ -0,0 +1,6 @@
+ ____ __
+ / __ \/ /___ _____ ___
+ / /_/ / / __ `/ __ \/ _ \
+ / ____/ / /_/ / / / / __/
+/_/ /_/\__,_/_/ /_/\___/
+
diff --git a/ct/headers/postiz b/ct/headers/postiz
new file mode 100644
index 000000000..2c5c0ba81
--- /dev/null
+++ b/ct/headers/postiz
@@ -0,0 +1,6 @@
+ ____ __ _
+ / __ \____ _____/ /_(_)___
+ / /_/ / __ \/ ___/ __/ /_ /
+ / ____/ /_/ (__ ) /_/ / / /_
+/_/ \____/____/\__/_/ /___/
+
diff --git a/ct/healthchecks.sh b/ct/healthchecks.sh
index b3704ca60..2bfb8b014 100644
--- a/ct/healthchecks.sh
+++ b/ct/healthchecks.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/hermesagent.sh b/ct/hermesagent.sh
index 78a2d2476..daf62e436 100644
--- a/ct/hermesagent.sh
+++ b/ct/hermesagent.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/hev-socks5-server.sh b/ct/hev-socks5-server.sh
index 9141aa4a1..3b9ffe873 100644
--- a/ct/hev-socks5-server.sh
+++ b/ct/hev-socks5-server.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -36,7 +36,7 @@ function update_script() {
systemctl stop hev-socks5-server
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "hev-socks5-server" "heiher/hev-socks5-server" "singlefile" "latest" "/opt" "hev-socks5-server-linux-x86_64"
+ fetch_and_deploy_gh_release "hev-socks5-server" "heiher/hev-socks5-server" "singlefile" "latest" "/opt" "hev-socks5-server-linux-$(arch_resolve "x86_64" "arm64")"
msg_info "Starting Service"
systemctl start hev-socks5-server
diff --git a/ct/homarr.sh b/ct/homarr.sh
index 87d7ff2bb..c288cab41 100644
--- a/ct/homarr.sh
+++ b/ct/homarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -62,7 +62,7 @@ EOF
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
setup_nodejs
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-debian-amd64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-debian-$(arch_resolve).tar.gz"
msg_info "Updating Homarr"
cp /opt/homarr/redis.conf /etc/redis/redis.conf
diff --git a/ct/homeassistant.sh b/ct/homeassistant.sh
index 67b42aa28..8bdc36d30 100644
--- a/ct/homeassistant.sh
+++ b/ct/homeassistant.sh
@@ -6,13 +6,13 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
# Source: https://www.home-assistant.io/
APP="Home Assistant"
-var_tags="${var_tags:-automation;smarthome}"
+var_tags="${var_tags:-automation;smarthome;docker}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -71,7 +71,7 @@ function update_script() {
if [ "$UPD" == "4" ]; then
msg_info "Installing FileBrowser"
RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')
- $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin
+ $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-$(arch_resolve)-filebrowser.tar.gz | tar -xzv -C /usr/local/bin
$STD filebrowser config init -a '0.0.0.0'
$STD filebrowser config set -a '0.0.0.0'
$STD filebrowser users add admin community-scripts.org --perm.admin
diff --git a/ct/homebox.sh b/ct/homebox.sh
index bc36c2547..3d956ee8d 100644
--- a/ct/homebox.sh
+++ b/ct/homebox.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,7 +39,7 @@ function update_script() {
systemctl stop homebox
msg_ok "Stopped Service"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_x86_64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
chmod +x /opt/homebox/homebox
[ -f /opt/.env ] && mv /opt/.env /opt/homebox/.env
[ -d /opt/.data ] && mv /opt/.data /opt/homebox/.data
diff --git a/ct/homelable.sh b/ct/homelable.sh
index 8348cd529..61104b54c 100644
--- a/ct/homelable.sh
+++ b/ct/homelable.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/hoodik.sh b/ct/hoodik.sh
index 7acd7a3d6..c81e3f32f 100644
--- a/ct/hoodik.sh
+++ b/ct/hoodik.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -40,7 +40,7 @@ function update_script() {
cp /opt/hoodik/.env /opt/hoodik.env.bak
msg_ok "Backed up Configuration"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "hoodik" "hudikhq/hoodik" "prebuild" "latest" "/opt/hoodik" "*x86_64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "hoodik" "hudikhq/hoodik" "prebuild" "latest" "/opt/hoodik" "*$(arch_resolve "x86_64" "arm64").tar.gz"
msg_info "Restoring Configuration"
cp /opt/hoodik.env.bak /opt/hoodik/.env
diff --git a/ct/hyperion.sh b/ct/hyperion.sh
index 6c1f385c5..89dd97c0b 100644
--- a/ct/hyperion.sh
+++ b/ct/hyperion.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
diff --git a/ct/igotify.sh b/ct/igotify.sh
index 10b153966..aad49d7fe 100644
--- a/ct/igotify.sh
+++ b/ct/igotify.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,7 +39,7 @@ function update_script() {
cp /opt/igotify/.env /opt/igotify.env.bak
msg_ok "Backed up Configuration"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "igotify" "androidseb25/iGotify-Notification-Assistent" "prebuild" "latest" "/opt/igotify" "iGotify-Notification-Service-amd64-v*.zip"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "igotify" "androidseb25/iGotify-Notification-Assistent" "prebuild" "latest" "/opt/igotify" "iGotify-Notification-Service-$(arch_resolve)-v*.zip"
msg_info "Restoring Configuration"
cp /opt/igotify.env.bak /opt/igotify/.env
diff --git a/ct/immich.sh b/ct/immich.sh
index f0362c2df..e97231997 100644
--- a/ct/immich.sh
+++ b/ct/immich.sh
@@ -12,7 +12,7 @@ var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-6144}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -67,7 +67,7 @@ EOF
if [[ ! -f /etc/apt/sources.list.d/mise.list ]]; then
msg_info "Installing Mise"
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
- echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
+ echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=$(arch_resolve)] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
ensure_dependencies mise
msg_ok "Installed Mise"
fi
@@ -127,7 +127,7 @@ EOF
VCHORD_RELEASE="0.5.3"
[[ -f ~/.vchord_version ]] && mv ~/.vchord_version ~/.vectorchord
if check_for_gh_release "VectorChord" "tensorchord/VectorChord" "${VCHORD_RELEASE}" "updated together with Immich after testing"; then
- fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-16-vchord_*_amd64.deb"
+ fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-16-vchord_*_$(arch_resolve).deb"
systemctl restart postgresql
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vector UPDATE;"
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;"
@@ -168,13 +168,12 @@ EOF
setup_uv
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "${RELEASE}" "$SRC_DIR"
PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)"
- NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
+ NODE_VERSION="24" NODE_MODULE="corepack,pnpm@${PNPM_VERSION}" setup_nodejs
msg_info "Updating Immich web and microservices"
cd "$SRC_DIR"/server
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export CI=1
- corepack enable
# server build
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
@@ -241,7 +240,7 @@ EOF
$STD sudo --preserve-env=VIRTUAL_ENV,UV_HTTP_TIMEOUT -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p "${ML_PYTHON}" --managed-python && break
[[ $attempt -lt 3 ]] && msg_warn "uv sync attempt $attempt failed, retrying..." && sleep 10
done
- patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-x86_64-linux-gnu.so"
+ patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-$(arch_resolve "x86_64" "aarch64")-linux-gnu.so"
msg_ok "Updated Intel OpenVINO machine-learning"
else
ML_PYTHON="python3.11"
diff --git a/ct/immichframe.sh b/ct/immichframe.sh
index c4da9fe1e..3abf19051 100644
--- a/ct/immichframe.sh
+++ b/ct/immichframe.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -45,7 +45,7 @@ function update_script() {
cd /tmp/immichframe
$STD dotnet publish ImmichFrame.WebApi/ImmichFrame.WebApi.csproj \
--configuration Release \
- --runtime linux-x64 \
+ --runtime "$(arch_resolve "linux-x64" "linux-arm64")" \
--self-contained false \
--output /opt/immichframe
diff --git a/ct/influxdb.sh b/ct/influxdb.sh
index 96dd1332e..aa75ebcbd 100644
--- a/ct/influxdb.sh
+++ b/ct/influxdb.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/investbrain.sh b/ct/investbrain.sh
index 3d619fc0f..0c2f48310 100644
--- a/ct/investbrain.sh
+++ b/ct/investbrain.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/invoiceshelf.sh b/ct/invoiceshelf.sh
index 15fa2c368..5d2faa82d 100644
--- a/ct/invoiceshelf.sh
+++ b/ct/invoiceshelf.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -53,12 +53,11 @@ function update_script() {
cd /opt/invoiceshelf
$STD composer install --no-dev --optimize-autoloader
if command -v corepack >/dev/null 2>&1; then
- $STD corepack enable
- $STD corepack yarn install
- $STD corepack yarn build
+ $STD corepack pnpm install
+ $STD corepack pnpm run build
else
- $STD yarn install
- $STD yarn build
+ $STD pnpm install
+ $STD pnpm run build
fi
$STD php artisan migrate --force
$STD php artisan optimize:clear
diff --git a/ct/ironclaw.sh b/ct/ironclaw.sh
index b2e3eed28..123577f80 100644
--- a/ct/ironclaw.sh
+++ b/ct/ironclaw.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/isponsorblocktv.sh b/ct/isponsorblocktv.sh
index 30ae32f4d..f1ebc374b 100644
--- a/ct/isponsorblocktv.sh
+++ b/ct/isponsorblocktv.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -36,9 +36,9 @@ function update_script() {
systemctl stop isponsorblocktv
msg_ok "Stopped Service"
- ISBTV_BINARY="iSponsorBlockTV-x86_64-linux-v1"
+ ISBTV_BINARY="iSponsorBlockTV-$(arch_resolve "x86_64-linux-v1" "aarch64-linux")"
if grep -q ' avx ' /proc/cpuinfo 2>/dev/null && grep -q ' avx2 ' /proc/cpuinfo 2>/dev/null && grep -q ' movbe ' /proc/cpuinfo 2>/dev/null; then
- ISBTV_BINARY="iSponsorBlockTV-x86_64-linux"
+ ISBTV_BINARY="iSponsorBlockTV-$(arch_resolve "x86_64" "aarch64")-linux"
fi
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "isponsorblocktv" "dmunozv04/iSponsorBlockTV" "singlefile" "latest" "/opt/isponsorblocktv" "${ISBTV_BINARY}"
diff --git a/ct/jackett.sh b/ct/jackett.sh
index 47904057f..f08ba37ea 100644
--- a/ct/jackett.sh
+++ b/ct/jackett.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -41,7 +41,7 @@ EOF
systemctl stop jackett
msg_ok "Stopped Service"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jackett" "Jackett/Jackett" "prebuild" "latest" "/opt/Jackett" "Jackett.Binaries.LinuxAMDx64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jackett" "Jackett/Jackett" "prebuild" "latest" "/opt/Jackett" "Jackett.Binaries.Linux$(arch_resolve "AMDx64" "ARM64").tar.gz"
msg_info "Starting Service"
systemctl start jackett
diff --git a/ct/jellyfin.sh b/ct/jellyfin.sh
index 2072d6bc5..f497d916e 100644
--- a/ct/jellyfin.sh
+++ b/ct/jellyfin.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-16}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -30,7 +30,7 @@ function update_script() {
exit
fi
- if ! grep -qEi 'ubuntu' /etc/os-release; then
+ if ! grep -qEi 'ubuntu' /etc/os-release && [[ "$(arch_resolve)" == "amd64" ]]; then
msg_info "Updating Intel Dependencies"
rm -f ~/.intel-* || true
@@ -57,7 +57,7 @@ function update_script() {
msg_info "Updating Jellyfin"
ensure_dependencies libjemalloc2
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
- ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
+ ln -sf "/usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")/libjemalloc.so.2" /usr/lib/libjemalloc.so
fi
$STD apt -y upgrade
$STD apt -y --with-new-pkgs upgrade jellyfin jellyfin-server jellyfin-ffmpeg7
diff --git a/ct/jellyseerr.sh b/ct/jellyseerr.sh
index 46b2611de..86128bb11 100644
--- a/ct/jellyseerr.sh
+++ b/ct/jellyseerr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/jitsi-meet.sh b/ct/jitsi-meet.sh
index d7efe1230..efac14ff5 100644
--- a/ct/jitsi-meet.sh
+++ b/ct/jitsi-meet.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/jotty.sh b/ct/jotty.sh
index 74267afda..af0e610d0 100644
--- a/ct/jotty.sh
+++ b/ct/jotty.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/kan.sh b/ct/kan.sh
index 221668159..1817ab674 100644
--- a/ct/kan.sh
+++ b/ct/kan.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/karakeep.sh b/ct/karakeep.sh
index 93c3cd41b..c52db636c 100644
--- a/ct/karakeep.sh
+++ b/ct/karakeep.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-15}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -89,11 +89,11 @@ EOF
fi
sed -i "s/^SERVER_VERSION=.*$/SERVER_VERSION=${CHECK_UPDATE_RELEASE#v}/" /etc/karakeep/karakeep.env
MODULE_VERSION="$(jq -r '.packageManager | split("@")[1]' /opt/karakeep/package.json)"
- NODE_VERSION="24" NODE_MODULE="pnpm@${MODULE_VERSION}" setup_nodejs
+ NODE_VERSION="24" NODE_MODULE="corepack,pnpm@${MODULE_VERSION}" setup_nodejs
setup_meilisearch
msg_info "Updating Karakeep"
- corepack enable
+
export PUPPETEER_SKIP_DOWNLOAD="true"
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD="true"
export NEXT_TELEMETRY_DISABLED=1
diff --git a/ct/kavita.sh b/ct/kavita.sh
index fb2d67c54..f12acf119 100644
--- a/ct/kavita.sh
+++ b/ct/kavita.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop kavita
msg_ok "Service Stopped"
- fetch_and_deploy_gh_release "kavita" "Kareadita/Kavita" "prebuild" "latest" "/opt/Kavita" "kavita-linux-x64.tar.gz"
+ fetch_and_deploy_gh_release "kavita" "Kareadita/Kavita" "prebuild" "latest" "/opt/Kavita" "kavita-linux-$(arch_resolve "x64" "arm64").tar.gz"
chmod +x /opt/Kavita/Kavita && chown root:root /opt/Kavita/Kavita
msg_info "Starting Service"
diff --git a/ct/keycloak.sh b/ct/keycloak.sh
index 19e032eb8..be953f9e8 100644
--- a/ct/keycloak.sh
+++ b/ct/keycloak.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/kimai.sh b/ct/kimai.sh
index 95b1ca1b3..e88a35a36 100644
--- a/ct/kimai.sh
+++ b/ct/kimai.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-7}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/kitchenowl.sh b/ct/kitchenowl.sh
index fcdda0438..362f29b2d 100644
--- a/ct/kitchenowl.sh
+++ b/ct/kitchenowl.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/kiwix.sh b/ct/kiwix.sh
index 88016ef4e..c66803e2e 100644
--- a/ct/kiwix.sh
+++ b/ct/kiwix.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/kometa.sh b/ct/kometa.sh
index c37bdd786..b0a9e0caa 100644
--- a/ct/kometa.sh
+++ b/ct/kometa.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -44,7 +44,8 @@ function update_script() {
msg_info "Updating Kometa"
cd /opt/kometa
- $STD uv pip install -r requirements.txt --system
+ [[ -d /opt/kometa/.venv ]] || $STD uv venv /opt/kometa/.venv
+ $STD uv pip install -r requirements.txt -p /opt/kometa/.venv/bin/python
mkdir -p config/assets
cp /opt/config.yml config/config.yml
msg_ok "Updated Kometa"
diff --git a/ct/komga.sh b/ct/komga.sh
index 201adb8a0..4f9558383 100644
--- a/ct/komga.sh
+++ b/ct/komga.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/kubo.sh b/ct/kubo.sh
index eb4d98463..8d7425a47 100644
--- a/ct/kubo.sh
+++ b/ct/kubo.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop ipfs
msg_ok "Stopped service"
- fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-$(arch_resolve).tar.gz"
msg_info "Starting service"
systemctl start ipfs
diff --git a/ct/kutt.sh b/ct/kutt.sh
index 6c9e64e0a..c118172f7 100644
--- a/ct/kutt.sh
+++ b/ct/kutt.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/languagetool.sh b/ct/languagetool.sh
index 40c21d043..a938792c8 100644
--- a/ct/languagetool.sh
+++ b/ct/languagetool.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/lazylibrarian.sh b/ct/lazylibrarian.sh
index 5a86550bf..c07abac96 100644
--- a/ct/lazylibrarian.sh
+++ b/ct/lazylibrarian.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/librechat.sh b/ct/librechat.sh
index 5c60e0a52..d6d62cca2 100644
--- a/ct/librechat.sh
+++ b/ct/librechat.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-6144}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/librenms.sh b/ct/librenms.sh
index 6659e4208..7404dd93e 100644
--- a/ct/librenms.sh
+++ b/ct/librenms.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -29,10 +29,21 @@ function update_script() {
exit
fi
setup_mariadb
+ ensure_dependencies git
+ if [[ ! -d /opt/librenms/.git ]]; then
+ msg_info "Initializing LibreNMS git metadata"
+ LIBRENMS_VERSION=$(cat ~/.librenms 2>/dev/null)
+ cd /opt/librenms
+ git init -q
+ git remote add origin https://github.com/librenms/librenms.git
+ git fetch --depth 1 origin "refs/tags/v${LIBRENMS_VERSION}" 2>/dev/null ||
+ git fetch --depth 1 origin "refs/tags/${LIBRENMS_VERSION}" 2>/dev/null || true
+ git checkout -qf FETCH_HEAD 2>/dev/null || true
+ chown -R librenms:librenms .git
+ msg_ok "Initialized LibreNMS git metadata"
+ fi
msg_info "Updating LibreNMS"
- su librenms
- cd /opt/librenms
- ./daily.sh
+ $STD su - librenms -s /bin/bash -c 'cd /opt/librenms && ./daily.sh'
msg_ok "Updated LibreNMS"
exit
}
diff --git a/ct/librespeed-rust.sh b/ct/librespeed-rust.sh
index 37a66f5e3..bb921bb03 100644
--- a/ct/librespeed-rust.sh
+++ b/ct/librespeed-rust.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop speedtest_rs
msg_ok "Services Stopped"
- fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-x86_64-unknown-linux-gnu.deb"
+ fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.deb"
msg_info "Starting Service"
systemctl start speedtest_rs
diff --git a/ct/libretranslate.sh b/ct/libretranslate.sh
index c3a5955c1..7cf601fa4 100644
--- a/ct/libretranslate.sh
+++ b/ct/libretranslate.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
diff --git a/ct/lidarr.sh b/ct/lidarr.sh
index 4e4c7024e..141197a57 100644
--- a/ct/lidarr.sh
+++ b/ct/lidarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop lidarr
msg_ok "Service stopped"
- fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-x64.tar.gz"
+ fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
chmod 775 /opt/Lidarr
msg_info "Starting service"
diff --git a/ct/limesurvey.sh b/ct/limesurvey.sh
index 10f24b983..7f8537fe7 100644
--- a/ct/limesurvey.sh
+++ b/ct/limesurvey.sh
@@ -9,10 +9,10 @@ APP="LimeSurvey"
var_tags="${var_tags:-os}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
-var_disk="${var_disk:-2}"
+var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/linkding.sh b/ct/linkding.sh
index 09119791e..b0ae20025 100644
--- a/ct/linkding.sh
+++ b/ct/linkding.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -46,7 +46,7 @@ function update_script() {
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
+ ln -sf /usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")/mod_icu.so /opt/linkding/libicu.so
msg_ok "Restored Data"
msg_info "Updating LinkDing"
diff --git a/ct/linkwarden.sh b/ct/linkwarden.sh
index 59eb32c04..6fb08596b 100644
--- a/ct/linkwarden.sh
+++ b/ct/linkwarden.sh
@@ -28,7 +28,7 @@ function update_script() {
exit
fi
if check_for_gh_release "linkwarden" "linkwarden/linkwarden"; then
- NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
+ NODE_VERSION="22" NODE_MODULE="corepack,yarn@latest" setup_nodejs
msg_info "Stopping Service"
systemctl stop linkwarden
msg_ok "Stopped Service"
@@ -54,7 +54,7 @@ function update_script() {
fi
fi
if command -v corepack >/dev/null 2>&1; then
- $STD corepack enable
+
$STD corepack prepare "yarn@${yarn_ver}" --activate || true
fi
$STD yarn
diff --git a/ct/listmonk.sh b/ct/listmonk.sh
index 11483bf46..774672905 100644
--- a/ct/listmonk.sh
+++ b/ct/listmonk.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -37,7 +37,7 @@ function update_script() {
mv /opt/listmonk/ /opt/listmonk-backup
msg_ok "Backed up data"
- fetch_and_deploy_gh_release "listmonk" "knadh/listmonk" "prebuild" "latest" "/opt/listmonk" "listmonk*linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "listmonk" "knadh/listmonk" "prebuild" "latest" "/opt/listmonk" "listmonk*linux_$(arch_resolve).tar.gz"
msg_info "Configuring listmonk"
mv /opt/listmonk-backup/config.toml /opt/listmonk/config.toml
diff --git a/ct/livebook.sh b/ct/livebook.sh
index b31503330..928ef33e1 100755
--- a/ct/livebook.sh
+++ b/ct/livebook.sh
@@ -12,7 +12,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/lobehub.sh b/ct/lobehub.sh
index d42912c1b..1a856e428 100644
--- a/ct/lobehub.sh
+++ b/ct/lobehub.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-10240}"
var_disk="${var_disk:-15}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/loki.sh b/ct/loki.sh
index 745fcd672..c1effaf39 100644
--- a/ct/loki.sh
+++ b/ct/loki.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/lychee.sh b/ct/lychee.sh
index e5d630290..887d1f3ac 100644
--- a/ct/lychee.sh
+++ b/ct/lychee.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/lyrionmusicserver.sh b/ct/lyrionmusicserver.sh
index 275f91024..8ef432b93 100644
--- a/ct/lyrionmusicserver.sh
+++ b/ct/lyrionmusicserver.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-3}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -31,9 +31,10 @@ function update_script() {
exit
fi
- DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP ']*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
- RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
- DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
+ DEB_ARCH=$(arch_resolve "amd64" "arm")
+ DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP "]*href=\"\K[^\"]*${DEB_ARCH}\.deb(?=\"[^>]*>)" | head -n 1)
+ RELEASE=$(echo "$DEB_URL" | grep -oP "lyrionmusicserver_\K[0-9.]+(?=_${DEB_ARCH}\.deb)")
+ DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_${DEB_ARCH}.deb"
if [[ ! -f /opt/lyrion_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/lyrion_version.txt)" ]]; then
msg_info "Updating $APP to ${RELEASE}"
curl_with_retry "$DEB_URL" "$DEB_FILE"
diff --git a/ct/mail-archiver.sh b/ct/mail-archiver.sh
index 366d367a6..944ed4336 100644
--- a/ct/mail-archiver.sh
+++ b/ct/mail-archiver.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/managemydamnlife.sh b/ct/managemydamnlife.sh
index ae9643d14..eedda1f85 100644
--- a/ct/managemydamnlife.sh
+++ b/ct/managemydamnlife.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/manyfold.sh b/ct/manyfold.sh
index 86e1022dd..52c9b76c3 100644
--- a/ct/manyfold.sh
+++ b/ct/manyfold.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-15}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -29,7 +29,7 @@ function update_script() {
exit
fi
- NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
+ NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs
ensure_dependencies f3d
if check_for_gh_release "manyfold" "manyfold3d/manyfold"; then
@@ -65,8 +65,6 @@ function update_script() {
msg_ok "Restored Data"
msg_info "Installing Manyfold"
- $STD npm install --global corepack
- $STD corepack enable yarn
sudo -u manyfold bash -c '
source /opt/manyfold/.env
diff --git a/ct/matomo.sh b/ct/matomo.sh
index a753daf68..c2407600f 100644
--- a/ct/matomo.sh
+++ b/ct/matomo.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -43,6 +43,16 @@ function update_script() {
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "matomo" "matomo-org/matomo" "prebuild" "latest" "/opt/matomo" "matomo-*.zip"
+ msg_info "Setting up Matomo"
+ if [[ -d /opt/matomo/matomo ]]; then
+ rm -rf /opt/matomo/tmp "/opt/matomo/How to install Matomo.html"
+ find /opt/matomo/matomo -mindepth 1 -maxdepth 1 -exec mv -t /opt/matomo {} +
+ rm -rf /opt/matomo/matomo
+ fi
+ mkdir -p /opt/matomo/tmp
+ chmod -R 755 /opt/matomo/tmp
+ msg_ok "Set up Matomo"
+
msg_info "Restoring Data"
if [[ -f /opt/matomo_config.bak ]]; then
mkdir -p /opt/matomo/config
@@ -58,7 +68,16 @@ function update_script() {
chown -R www-data:www-data /opt/matomo
msg_ok "Restored Data"
+ if [[ -f /opt/matomo/console ]]; then
+ msg_info "Running Matomo database upgrade"
+ cd /opt/matomo
+ $STD runuser -u www-data -- php console core:update --no-interaction
+ msg_ok "Ran Matomo database upgrade"
+ fi
+
msg_info "Starting Services"
+ PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;')
+ systemctl restart "php${PHP_VER}-fpm"
systemctl start caddy
msg_ok "Started Services"
msg_ok "Updated successfully!"
diff --git a/ct/matter-server.sh b/ct/matter-server.sh
index ffbb5a559..1f2a4337d 100644
--- a/ct/matter-server.sh
+++ b/ct/matter-server.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -41,7 +41,7 @@ function update_script() {
echo "${MATTER_VERSION}" >~/.matter-server
msg_ok "Updated Matter Server"
- fetch_and_deploy_gh_release "chip-ota-provider-app" "home-assistant-libs/matter-linux-ota-provider" "singlefile" "latest" "/usr/local/bin" "chip-ota-provider-app-x86-64"
+ fetch_and_deploy_gh_release "chip-ota-provider-app" "home-assistant-libs/matter-linux-ota-provider" "singlefile" "latest" "/usr/local/bin" "chip-ota-provider-app-$(arch_resolve "x86-64" "aarch64")"
msg_info "Starting Service"
systemctl start matter-server
diff --git a/ct/matterjs-server.sh b/ct/matterjs-server.sh
index 9758ab6cd..65d53f5f5 100644
--- a/ct/matterjs-server.sh
+++ b/ct/matterjs-server.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/mediamanager.sh b/ct/mediamanager.sh
index 9a2d07dce..3ae88f893 100644
--- a/ct/mediamanager.sh
+++ b/ct/mediamanager.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-3072}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/mediamtx.sh b/ct/mediamtx.sh
index 36bffe8a4..eec17f329 100644
--- a/ct/mediamtx.sh
+++ b/ct/mediamtx.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop mediamtx
msg_ok "Service stopped"
- fetch_and_deploy_gh_release "mediamtx" "bluenviron/mediamtx" "prebuild" "latest" "/opt/mediamtx" "mediamtx*linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "mediamtx" "bluenviron/mediamtx" "prebuild" "latest" "/opt/mediamtx" "mediamtx*linux_$(arch_resolve).tar.gz"
msg_info "Starting service"
systemctl start mediamtx
diff --git a/ct/memos.sh b/ct/memos.sh
index 56e909289..f2ceee908 100644
--- a/ct/memos.sh
+++ b/ct/memos.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-3}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop memos
msg_ok "Service stopped"
- fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_$(arch_resolve).tar.gz"
msg_info "Starting service"
systemctl start memos
diff --git a/ct/metube.sh b/ct/metube.sh
index fbaeee46c..b00f4e833 100644
--- a/ct/metube.sh
+++ b/ct/metube.sh
@@ -41,7 +41,7 @@ function update_script() {
fi
fi
- NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
+ NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs
if check_for_gh_release "metube" "alexta69/metube"; then
msg_info "Stopping Service"
@@ -60,7 +60,7 @@ function update_script() {
msg_info "Building Frontend"
cd /opt/metube/ui
if command -v corepack >/dev/null 2>&1; then
- $STD corepack enable
+
$STD corepack prepare pnpm --activate || true
fi
echo 'onlyBuiltDependencies=*' >> .npmrc
diff --git a/ct/mini-qr.sh b/ct/mini-qr.sh
index 0912d9b20..0e8a1038c 100644
--- a/ct/mini-qr.sh
+++ b/ct/mini-qr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/minthcm.sh b/ct/minthcm.sh
index f2badd08d..4bdbd7813 100644
--- a/ct/minthcm.sh
+++ b/ct/minthcm.sh
@@ -12,7 +12,7 @@ var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/mongodb.sh b/ct/mongodb.sh
index c1f644a17..ec4f27a28 100644
--- a/ct/mongodb.sh
+++ b/ct/mongodb.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/musicseerr.sh b/ct/musicseerr.sh
index a20484fb8..f7aa74e6d 100644
--- a/ct/musicseerr.sh
+++ b/ct/musicseerr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/n8n.sh b/ct/n8n.sh
index 3a11fac91..9d5f793ac 100644
--- a/ct/n8n.sh
+++ b/ct/n8n.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/nagios.sh b/ct/nagios.sh
index a73a55fe5..55df3a9c4 100644
--- a/ct/nagios.sh
+++ b/ct/nagios.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/nametag.sh b/ct/nametag.sh
index 0fd45d877..9346a80f7 100644
--- a/ct/nametag.sh
+++ b/ct/nametag.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/navidrome.sh b/ct/navidrome.sh
index 7d3233934..b7fbb27ca 100644
--- a/ct/navidrome.sh
+++ b/ct/navidrome.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/neko.sh b/ct/neko.sh
index 107573757..6b8a92c3c 100644
--- a/ct/neko.sh
+++ b/ct/neko.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
diff --git a/ct/netbird.sh b/ct/netbird.sh
index 0975a9bac..336094791 100644
--- a/ct/netbird.sh
+++ b/ct/netbird.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_tun="${var_tun:-yes}"
diff --git a/ct/netboot-xyz.sh b/ct/netboot-xyz.sh
index 95e5b63a0..16283c18d 100644
--- a/ct/netboot-xyz.sh
+++ b/ct/netboot-xyz.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/netvisor.sh b/ct/netvisor.sh
index ae0b1aae8..370f10bca 100644
--- a/ct/netvisor.sh
+++ b/ct/netvisor.sh
@@ -8,11 +8,11 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="Scanopy"
var_tags="${var_tags:-analytics}"
var_cpu="${var_cpu:-2}"
-var_ram="${var_ram:-3072}"
+var_ram="${var_ram:-4096}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/nextexplorer.sh b/ct/nextexplorer.sh
index 3a869f72c..a60d11a2f 100644
--- a/ct/nextexplorer.sh
+++ b/ct/nextexplorer.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-3072}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/nextpvr.sh b/ct/nextpvr.sh
index 7bb7a3439..d63b72b15 100644
--- a/ct/nextpvr.sh
+++ b/ct/nextpvr.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
diff --git a/ct/nginx-ui.sh b/ct/nginx-ui.sh
index 1f9c3ec69..a257c9090 100644
--- a/ct/nginx-ui.sh
+++ b/ct/nginx-ui.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,7 +39,7 @@ function update_script() {
cp /usr/local/etc/nginx-ui/app.ini /tmp/nginx-ui-app.ini.bak
msg_ok "Backed up Configuration"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nginx-ui" "0xJacky/nginx-ui" "prebuild" "latest" "/opt/nginx-ui" "nginx-ui-linux-64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nginx-ui" "0xJacky/nginx-ui" "prebuild" "latest" "/opt/nginx-ui" "nginx-ui-linux-$(arch_resolve "64" "arm64-v8a").tar.gz"
msg_info "Updating Binary"
cp /opt/nginx-ui/nginx-ui /usr/local/bin/nginx-ui
diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh
index be81295a6..2bcfa34d4 100644
--- a/ct/nginxproxymanager.sh
+++ b/ct/nginxproxymanager.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -108,8 +108,13 @@ EOF
cd /root
if [ -d /opt/certbot ]; then
msg_info "Updating Certbot"
- $STD /opt/certbot/bin/pip install --upgrade pip setuptools wheel
- $STD /opt/certbot/bin/pip install --upgrade certbot certbot-dns-cloudflare
+ CERTBOT_PYTHON="/opt/certbot/bin/python"
+ if ! "$CERTBOT_PYTHON" -m pip --version &>/dev/null; then
+ msg_info "Repairing Certbot pip"
+ $STD "$CERTBOT_PYTHON" -m ensurepip --upgrade
+ fi
+ $STD "$CERTBOT_PYTHON" -m pip install --upgrade pip setuptools wheel
+ $STD "$CERTBOT_PYTHON" -m pip install --upgrade certbot certbot-dns-cloudflare
msg_ok "Updated Certbot"
fi
@@ -216,7 +221,13 @@ EOF
msg_ok "Initialized Backend"
msg_info "Starting Services"
- CERTBOT_VER=$(/opt/certbot/bin/certbot --version 2>&1 | awk '{print $NF}')
+ if [ -f /opt/certbot/bin/certbot ]; then
+ CERTBOT_VER=$(/opt/certbot/bin/certbot --version 2>&1 | awk '{print $NF}' || echo "0.0.0")
+ elif command -v certbot &>/dev/null; then
+ CERTBOT_VER=$(certbot --version 2>&1 | awk '{print $NF}' || echo "0.0.0")
+ else
+ CERTBOT_VER="2.0.0"
+ fi
if grep -q "Environment=CERTBOT_VERSION" /lib/systemd/system/npm.service; then
sed -i "s|Environment=CERTBOT_VERSION=.*|Environment=CERTBOT_VERSION=${CERTBOT_VER}|" /lib/systemd/system/npm.service
else
diff --git a/ct/nightscout.sh b/ct/nightscout.sh
index e6133a250..ff5bf789b 100644
--- a/ct/nightscout.sh
+++ b/ct/nightscout.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/nocodb.sh b/ct/nocodb.sh
index f55cb5d24..2a5263e79 100644
--- a/ct/nocodb.sh
+++ b/ct/nocodb.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop nocodb
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-x64"
+ fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-$(arch_resolve "x64" "arm64")"
msg_info "Starting Service"
systemctl start nocodb
diff --git a/ct/npmplus.sh b/ct/npmplus.sh
index abc5168ac..9bf8c30b1 100644
--- a/ct/npmplus.sh
+++ b/ct/npmplus.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-3}"
var_os="${var_os:-alpine}"
var_version="${var_version:-3.23}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/nxwitness.sh b/ct/nxwitness.sh
index 346963f65..263c6ea05 100644
--- a/ct/nxwitness.sh
+++ b/ct/nxwitness.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
var_gpu="${var_gpu:-yes}"
@@ -32,7 +32,7 @@ function update_script() {
BASE_URL="https://updates.networkoptix.com/default/index.html"
RELEASE=$(curl -fsSL "$BASE_URL" | grep -oP '(?<=)[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?=)' | head -n 1)
DETAIL_PAGE=$(curl -fsSL "$BASE_URL#note_$RELEASE")
- DOWNLOAD_URL=$(echo "$DETAIL_PAGE" | grep -oP "https://updates.networkoptix.com/default/$RELEASE/linux/nxwitness-server-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-linux_x64\.deb" | head -n 1)
+ DOWNLOAD_URL=$(echo "$DETAIL_PAGE" | grep -oP "https://updates.networkoptix.com/default/$RELEASE/$(arch_resolve "linux" "arm")/nxwitness-server-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-linux_$(arch_resolve "x64" "arm64")\.deb" | head -n 1)
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service"
systemctl stop networkoptix-root-tool networkoptix-mediaserver
@@ -40,11 +40,11 @@ function update_script() {
msg_info "Updating ${APP} to ${RELEASE}"
cd /tmp
- curl -fsSL "$DOWNLOAD_URL" -o ""nxwitness-server-$RELEASE-linux_x64.deb""
+ curl -fsSL "$DOWNLOAD_URL" -o ""nxwitness-server-$RELEASE-linux_$(arch_resolve "x64" "arm64").deb""
export DEBIAN_FRONTEND=noninteractive
export DEBCONF_NOWARNINGS=yes
- $STD dpkg -i nxwitness-server-$RELEASE-linux_x64.deb
- rm -f /tmp/nxwitness-server-$RELEASE-linux_x64.deb
+ $STD dpkg -i nxwitness-server-$RELEASE-linux_$(arch_resolve "x64" "arm64").deb
+ rm -f /tmp/nxwitness-server-$RELEASE-linux_$(arch_resolve "x64" "arm64").deb
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP}"
diff --git a/ct/oauth2-proxy.sh b/ct/oauth2-proxy.sh
index f84edddbf..42a669bb2 100644
--- a/ct/oauth2-proxy.sh
+++ b/ct/oauth2-proxy.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-3}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop oauth2-proxy
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "oauth2-proxy" "oauth2-proxy/oauth2-proxy" "prebuild" "latest" "/opt/oauth2-proxy" "oauth2-proxy*linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "oauth2-proxy" "oauth2-proxy/oauth2-proxy" "prebuild" "latest" "/opt/oauth2-proxy" "oauth2-proxy*linux-$(arch_resolve).tar.gz"
msg_info "Starting Service"
systemctl start oauth2-proxy
diff --git a/ct/ollama.sh b/ct/ollama.sh
index 02f099740..d1595d98e 100644
--- a/ct/ollama.sh
+++ b/ct/ollama.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-40}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_gpu="${var_gpu:-yes}"
header_info "$APP"
@@ -40,7 +40,7 @@ function update_script() {
OLLAMA_INSTALL_DIR="/usr/local/lib/ollama"
rm -rf "$OLLAMA_INSTALL_DIR" /usr/local/bin/ollama
mkdir -p "$OLLAMA_INSTALL_DIR"
- if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "$OLLAMA_INSTALL_DIR" "ollama-linux-amd64.tar.zst"; then
+ if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "$OLLAMA_INSTALL_DIR" "ollama-linux-$(arch_resolve).tar.zst"; then
msg_error "Download or deployment failed â check network connectivity and GitHub API availability"
exit 250
fi
diff --git a/ct/omada.sh b/ct/omada.sh
index 71f347bc1..e339190f0 100644
--- a/ct/omada.sh
+++ b/ct/omada.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-3072}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -30,7 +30,7 @@ function update_script() {
fi
msg_info "Updating MongoDB"
- if lscpu | grep -q 'avx'; then
+ if [[ "$(arch_resolve)" == "arm64" ]] || lscpu | grep -q 'avx'; then
MONGO_VERSION="8.0"
else
msg_error "No AVX detected (CPU-Flag)! We have discontinued support for this. You are welcome to try it manually with a Debian LXC, but due to the many issues with Omada, we currently only support AVX CPUs."
diff --git a/ct/ombi.sh b/ct/ombi.sh
index cbb8d4790..c4644122c 100644
--- a/ct/ombi.sh
+++ b/ct/ombi.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -41,7 +41,7 @@ function update_script() {
msg_ok "Backup created"
rm -rf /opt/ombi
- fetch_and_deploy_gh_release "ombi" "Ombi-app/Ombi" "prebuild" "latest" "/opt/ombi" "linux-x64.tar.gz"
+ fetch_and_deploy_gh_release "ombi" "Ombi-app/Ombi" "prebuild" "latest" "/opt/ombi" "linux-$(arch_resolve "x64" "arm64").tar.gz"
[[ -f /opt/Ombi.db ]] && mv /opt/Ombi.db /opt/ombi
[[ -f /opt/OmbiExternal.db ]] && mv /opt/OmbiExternal.db /opt/ombi
[[ -f /opt/OmbiSettings.db ]] && mv /opt/OmbiSettings.db /opt/ombi
diff --git a/ct/opencloud.sh b/ct/opencloud.sh
index b148d49b8..d2d78c805 100644
--- a/ct/opencloud.sh
+++ b/ct/opencloud.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -43,7 +43,7 @@ function update_script() {
msg_ok "Updated packages"
rm -f /usr/bin/{OpenCloud,opencloud}
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-$(arch_resolve)"
mv /usr/bin/OpenCloud /usr/bin/opencloud
if ! grep -q 'POSIX_WATCH' /etc/opencloud/opencloud.env; then
diff --git a/ct/opengist.sh b/ct/opengist.sh
index 2336b699c..8f470ef1e 100644
--- a/ct/opengist.sh
+++ b/ct/opengist.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -37,7 +37,7 @@ function update_script() {
mv /opt/opengist /opt/opengist-backup
msg_ok "Backup created"
- fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-$(arch_resolve).tar.gz"
msg_info "Restoring Configuration"
mv /opt/opengist-backup/config.yml /opt/opengist/config.yml
diff --git a/ct/openobserve.sh b/ct/openobserve.sh
index d74eab8da..94e2f7bf0 100644
--- a/ct/openobserve.sh
+++ b/ct/openobserve.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-3}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
msg_info "Updating OpenObserve"
systemctl stop openobserve
RELEASE=$(get_latest_github_release "openobserve/openobserve")
- tar zxf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/v$RELEASE/openobserve-v$RELEASE-linux-amd64.tar.gz) -C /opt/openobserve
+ tar zxf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/v$RELEASE/openobserve-v$RELEASE-linux-$(arch_resolve).tar.gz) -C /opt/openobserve
systemctl start openobserve
msg_ok "Updated OpenObserve"
msg_ok "Updated successfully!"
diff --git a/ct/openthread-br.sh b/ct/openthread-br.sh
index f63fb8421..7222e28ad 100644
--- a/ct/openthread-br.sh
+++ b/ct/openthread-br.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
var_tun="${var_tun:-yes}"
diff --git a/ct/openwebui.sh b/ct/openwebui.sh
index 1cce85f3b..db1341922 100644
--- a/ct/openwebui.sh
+++ b/ct/openwebui.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-8192}"
var_disk="${var_disk:-50}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -99,7 +99,7 @@ EOF
msg_ok "Stopped Service"
rm -rf /usr/lib/ollama /usr/bin/ollama
- if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "/usr/lib/ollama" "ollama-linux-amd64.tar.zst"; then
+ if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "/usr/lib/ollama" "ollama-linux-$(arch_resolve).tar.zst"; then
msg_error "Ollama download or deployment failed â check network connectivity and GitHub API availability"
else
ln -sf /usr/lib/ollama/bin/ollama /usr/bin/ollama
diff --git a/ct/ots.sh b/ct/ots.sh
index 1e86aa6fd..11cdd0d80 100644
--- a/ct/ots.sh
+++ b/ct/ots.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-3}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop nginx
msg_ok "Stopped Services"
- fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
+ fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_$(arch_resolve).tgz"
msg_info "Starting Services"
systemctl start ots
diff --git a/ct/outline.sh b/ct/outline.sh
index cf38d4bd2..a67b7ff2e 100644
--- a/ct/outline.sh
+++ b/ct/outline.sh
@@ -29,7 +29,7 @@ function update_script() {
exit
fi
- NODE_VERSION="24" setup_nodejs
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
if check_for_gh_release "outline" "outline/outline"; then
msg_info "Stopping Services"
@@ -48,7 +48,7 @@ function update_script() {
export NODE_ENV=development
export NODE_OPTIONS="--max-old-space-size=3584"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
- $STD corepack enable
+
$STD yarn install --immutable
export NODE_ENV=production
$STD yarn build
diff --git a/ct/owncast.sh b/ct/owncast.sh
index b8b3ba60d..29eccb7f3 100644
--- a/ct/owncast.sh
+++ b/ct/owncast.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop owncast
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "owncast" "owncast/owncast" "prebuild" "latest" "/opt/owncast" "owncast*linux-64bit.zip"
+ fetch_and_deploy_gh_release "owncast" "owncast/owncast" "prebuild" "latest" "/opt/owncast" "owncast*linux-$(arch_resolve "64bit" "arm64").zip"
msg_info "Starting Service"
systemctl start owncast
diff --git a/ct/ownfoil.sh b/ct/ownfoil.sh
index 8c78d9ece..6144dd7ab 100644
--- a/ct/ownfoil.sh
+++ b/ct/ownfoil.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pangolin.sh b/ct/pangolin.sh
index 0ea3d7bc0..08d604277 100644
--- a/ct/pangolin.sh
+++ b/ct/pangolin.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_tun="${var_tun:-1}"
@@ -50,7 +50,7 @@ function update_script() {
msg_ok "Created backup"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_amd64"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
msg_info "Updating Pangolin"
cd /opt/pangolin
diff --git a/ct/paperclip.sh b/ct/paperclip.sh
index ff61931a4..e7c1f5101 100644
--- a/ct/paperclip.sh
+++ b/ct/paperclip.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-8192}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/papra.sh b/ct/papra.sh
index e3646edf4..9e4fed221 100644
--- a/ct/papra.sh
+++ b/ct/papra.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/passbolt.sh b/ct/passbolt.sh
index c3510e2e5..b65a9d37f 100644
--- a/ct/passbolt.sh
+++ b/ct/passbolt.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/patchmon.sh b/ct/patchmon.sh
index 72a7b99b2..9414c5a73 100644
--- a/ct/patchmon.sh
+++ b/ct/patchmon.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -73,7 +73,7 @@ function update_script() {
msg_ok "Migration complete!"
fi
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "latest" "/opt/patchmon" "patchmon-server-linux-amd64"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "latest" "/opt/patchmon" "patchmon-server-linux-$(arch_resolve)"
mv /opt/patchmon/PatchMon /opt/patchmon/patchmon-server
msg_info "Fetching PatchMon agent binaries"
diff --git a/ct/paymenter.sh b/ct/paymenter.sh
index f65319d51..6eaee71f9 100644
--- a/ct/paymenter.sh
+++ b/ct/paymenter.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pelican-panel.sh b/ct/pelican-panel.sh
index f61e3cf8d..0f15d1092 100644
--- a/ct/pelican-panel.sh
+++ b/ct/pelican-panel.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pelican-wings.sh b/ct/pelican-wings.sh
index f97d21cae..b8a8666a1 100644
--- a/ct/pelican-wings.sh
+++ b/ct/pelican-wings.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop wings
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "wings" "pelican-dev/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_amd64"
+ fetch_and_deploy_gh_release "wings" "pelican-dev/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_$(arch_resolve)"
msg_info "Starting Service"
systemctl start wings
diff --git a/ct/photoprism.sh b/ct/photoprism.sh
index a9554c581..7e8d15e46 100644
--- a/ct/photoprism.sh
+++ b/ct/photoprism.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-3072}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -43,9 +43,9 @@ function update_script() {
msg_ok "Added environment export"
fi
- fetch_and_deploy_gh_release "photoprism" "photoprism/photoprism" "prebuild" "latest" "/opt/photoprism" "*linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "photoprism" "photoprism/photoprism" "prebuild" "latest" "/opt/photoprism" "*linux-$(arch_resolve).tar.gz"
- LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-bookworm-amd64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1)
+ LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-bookworm-$(arch_resolve)-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1)
if [[ "${LIBHEIF_URL}" != "$(cat ~/.photoprism_libheif 2>/dev/null)" ]] || [[ ! -f ~/.photoprism_libheif ]]; then
msg_info "Updating PhotoPrism LibHeif"
ensure_dependencies libvips42
diff --git a/ct/pialert.sh b/ct/pialert.sh
index 3d49bf209..c03e1d266 100644
--- a/ct/pialert.sh
+++ b/ct/pialert.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-3}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/plane.sh b/ct/plane.sh
new file mode 100644
index 000000000..13c29969c
--- /dev/null
+++ b/ct/plane.sh
@@ -0,0 +1,90 @@
+#!/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: onionrings29
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://plane.so | GitHub: https://github.com/makeplane/plane
+
+APP="Plane"
+var_tags="${var_tags:-project-management}"
+var_cpu="${var_cpu:-4}"
+var_ram="${var_ram:-6144}"
+var_disk="${var_disk:-8}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+var_arm64="${var_arm64:-yes}"
+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/plane ]]; then
+ msg_error "No Plane Installation Found!"
+ exit 1
+ fi
+
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
+
+ if check_for_gh_release "plane" "makeplane/plane"; then
+ msg_info "Stopping Services"
+ systemctl stop plane-api plane-worker plane-beat plane-live plane-space
+ msg_ok "Stopped Services"
+
+ create_backup /opt/plane/.env \
+ /opt/plane/apps/admin/.env \
+ /opt/plane/apps/api/.env \
+ /opt/plane/apps/space/.env \
+ /opt/plane/apps/web/.env
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball"
+
+ restore_backup
+
+ msg_info "Rebuilding Frontend (Patience)"
+ cd /opt/plane
+ export NODE_OPTIONS="--max-old-space-size=4096"
+ export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
+
+ $STD pnpm install --frozen-lockfile
+ $STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live
+ msg_ok "Rebuilt Frontend"
+
+ msg_info "Updating Python Dependencies"
+ cd /opt/plane/apps/api
+ export VIRTUAL_ENV=/opt/plane-venv
+ $STD uv pip install --upgrade -r requirements/production.txt
+ msg_ok "Updated Python Dependencies"
+
+ msg_info "Running Migrations"
+ cd /opt/plane/apps/api
+ set -a
+ source /opt/plane/apps/api/.env
+ set +a
+ $STD /opt/plane-venv/bin/python manage.py migrate
+ $STD /opt/plane-venv/bin/python manage.py collectstatic --noinput
+ $STD /opt/plane-venv/bin/python manage.py configure_instance
+ msg_ok "Ran Migrations"
+
+ msg_info "Starting Services"
+ systemctl start plane-api plane-worker plane-beat plane-live plane-space
+ 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}"
diff --git a/ct/planka.sh b/ct/planka.sh
index 6fc3c517f..a875347d8 100644
--- a/ct/planka.sh
+++ b/ct/planka.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pocketbase.sh b/ct/pocketbase.sh
index c7cb30b61..2d8b393a2 100644
--- a/ct/pocketbase.sh
+++ b/ct/pocketbase.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pocketid.sh b/ct/pocketid.sh
index baa2a6723..6153b40c0 100755
--- a/ct/pocketid.sh
+++ b/ct/pocketid.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -71,7 +71,7 @@ function update_script() {
cp /opt/pocket-id/.env /opt/env
fi
- fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-amd64"
+ fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-$(arch_resolve)"
mv /opt/env /opt/pocket-id/.env
msg_info "Starting Service"
diff --git a/ct/postiz.sh b/ct/postiz.sh
new file mode 100644
index 000000000..cdfbc51b2
--- /dev/null
+++ b/ct/postiz.sh
@@ -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/gitroomhq/postiz-app
+
+APP="Postiz"
+var_tags="${var_tags:-social-media;scheduling;automation}"
+var_cpu="${var_cpu:-4}"
+var_ram="${var_ram:-8192}"
+var_disk="${var_disk:-20}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+var_arm64="${var_arm64:-no}"
+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/postiz ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "postiz" "gitroomhq/postiz-app"; then
+ msg_info "Stopping Services"
+ systemctl stop postiz-orchestrator postiz-frontend postiz-backend
+ msg_ok "Stopped Services"
+
+ create_backup /opt/postiz/.env \
+ /opt/postiz/uploads
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "postiz" "gitroomhq/postiz-app" "tarball"
+
+ msg_info "Building Application"
+ cd /opt/postiz
+ cp /opt/postiz_env.bak /opt/postiz/.env
+ set -a && source /opt/postiz/.env && set +a
+ export NODE_OPTIONS="--max-old-space-size=4096"
+ $STD pnpm install
+ $STD pnpm run build
+ unset NODE_OPTIONS
+ msg_ok "Built Application"
+
+ msg_info "Running Database Migrations"
+ cd /opt/postiz
+ $STD pnpm run prisma-db-push
+ msg_ok "Ran Database Migrations"
+
+
+ mkdir -p /opt/postiz/uploads
+ restore_backup
+
+ msg_info "Starting Services"
+ systemctl start postiz-backend postiz-frontend postiz-orchestrator
+ 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}"
diff --git a/ct/powerdns.sh b/ct/powerdns.sh
index b378c3f01..f6dd45e70 100644
--- a/ct/powerdns.sh
+++ b/ct/powerdns.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/profilarr.sh b/ct/profilarr.sh
index 565351af5..d56990581 100644
--- a/ct/profilarr.sh
+++ b/ct/profilarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-7}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/projectsend.sh b/ct/projectsend.sh
index cc4f78217..688262708 100644
--- a/ct/projectsend.sh
+++ b/ct/projectsend.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/prometheus-alertmanager.sh b/ct/prometheus-alertmanager.sh
index 86d5431e1..2f006a424 100755
--- a/ct/prometheus-alertmanager.sh
+++ b/ct/prometheus-alertmanager.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop prometheus-alertmanager
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "alertmanager" "prometheus/alertmanager" "prebuild" "latest" "/usr/local/bin/" "alertmanager*linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "alertmanager" "prometheus/alertmanager" "prebuild" "latest" "/usr/local/bin/" "alertmanager*linux-$(arch_resolve).tar.gz"
msg_info "Starting Service"
systemctl start prometheus-alertmanager
diff --git a/ct/prometheus-blackbox-exporter.sh b/ct/prometheus-blackbox-exporter.sh
index 757e447b7..0f7072314 100644
--- a/ct/prometheus-blackbox-exporter.sh
+++ b/ct/prometheus-blackbox-exporter.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -38,7 +38,7 @@ function update_script() {
mv /opt/blackbox-exporter/blackbox.yml /opt
msg_ok "Backup created"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "blackbox-exporter" "prometheus/blackbox_exporter" "prebuild" "latest" "/opt/blackbox-exporter" "blackbox_exporter-*.linux-amd64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "blackbox-exporter" "prometheus/blackbox_exporter" "prebuild" "latest" "/opt/blackbox-exporter" "blackbox_exporter-*.linux-$(arch_resolve).tar.gz"
msg_info "Restoring backup"
cp -r /opt/blackbox.yml /opt/blackbox-exporter
diff --git a/ct/prometheus.sh b/ct/prometheus.sh
index 236442745..d6507ba29 100644
--- a/ct/prometheus.sh
+++ b/ct/prometheus.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop prometheus
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "prometheus" "prometheus/prometheus" "prebuild" "latest" "/usr/local/bin" "*linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "prometheus" "prometheus/prometheus" "prebuild" "latest" "/usr/local/bin" "*linux-$(arch_resolve).tar.gz"
rm -f /usr/local/bin/prometheus.yml
msg_info "Starting Service"
diff --git a/ct/prowlarr.sh b/ct/prowlarr.sh
index b6b7fe7c8..548e3e834 100644
--- a/ct/prowlarr.sh
+++ b/ct/prowlarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
msg_ok "Stopped Service"
rm -rf /opt/Prowlarr
- fetch_and_deploy_gh_release "prowlarr" "Prowlarr/Prowlarr" "prebuild" "latest" "/opt/Prowlarr" "Prowlarr.master*linux-core-x64.tar.gz"
+ fetch_and_deploy_gh_release "prowlarr" "Prowlarr/Prowlarr" "prebuild" "latest" "/opt/Prowlarr" "Prowlarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
chmod 775 /opt/Prowlarr
msg_info "Starting Service"
diff --git a/ct/proxmox-backup-server.sh b/ct/proxmox-backup-server.sh
index b32d23618..0e9cdad19 100644
--- a/ct/proxmox-backup-server.sh
+++ b/ct/proxmox-backup-server.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pterodactyl-panel.sh b/ct/pterodactyl-panel.sh
index 1f10ac765..d2002c01b 100644
--- a/ct/pterodactyl-panel.sh
+++ b/ct/pterodactyl-panel.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/pterodactyl-wings.sh b/ct/pterodactyl-wings.sh
index c9ee0dadc..92e5be251 100644
--- a/ct/pterodactyl-wings.sh
+++ b/ct/pterodactyl-wings.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
msg_ok "Stopped Service"
rm /usr/local/bin/wings
- fetch_and_deploy_gh_release "wings" "pterodactyl/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_amd64"
+ fetch_and_deploy_gh_release "wings" "pterodactyl/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_$(arch_resolve)"
msg_info "Starting Service"
systemctl start wings
diff --git a/ct/pulse.sh b/ct/pulse.sh
index 9eaaf78e6..fe0235fd4 100644
--- a/ct/pulse.sh
+++ b/ct/pulse.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,7 +39,7 @@ function update_script() {
rm -f /opt/pulse/pulse
fi
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "pulse-v*-linux-amd64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "pulse-v*-linux-$(arch_resolve).tar.gz"
ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse
mkdir -p /etc/pulse
chown pulse:pulse /etc/pulse
diff --git a/ct/qbittorrent.sh b/ct/qbittorrent.sh
index be40d772f..9ffb5260d 100644
--- a/ct/qbittorrent.sh
+++ b/ct/qbittorrent.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -38,7 +38,7 @@ function update_script() {
msg_ok "Stopped Service"
rm -f /opt/qbittorrent/qbittorrent-nox
- fetch_and_deploy_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static" "singlefile" "latest" "/opt/qbittorrent" "x86_64-qbittorrent-nox"
+ fetch_and_deploy_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static" "singlefile" "latest" "/opt/qbittorrent" "$(arch_resolve "x86_64" "aarch64")-qbittorrent-nox"
mv /opt/qbittorrent/qbittorrent /opt/qbittorrent/qbittorrent-nox
msg_info "Starting Service"
diff --git a/ct/qdrant.sh b/ct/qdrant.sh
index d8d8e7510..9c28542f2 100644
--- a/ct/qdrant.sh
+++ b/ct/qdrant.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/qui.sh b/ct/qui.sh
index 43ab17c34..6857a73a0 100644
--- a/ct/qui.sh
+++ b/ct/qui.sh
@@ -12,7 +12,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop qui
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/tmp/qui" "qui_*_linux_x86_64.tar.gz"
+ fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/tmp/qui" "qui_*_linux_$(arch_resolve "x86_64" "arm64").tar.gz"
msg_info "Updating qui"
mv /tmp/qui/qui /usr/local/bin/qui
diff --git a/ct/rabbitmq.sh b/ct/rabbitmq.sh
index 355efb7ab..d797034e4 100644
--- a/ct/rabbitmq.sh
+++ b/ct/rabbitmq.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/radarr.sh b/ct/radarr.sh
index aee60a2f5..2c3f9c1c3 100644
--- a/ct/radarr.sh
+++ b/ct/radarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -36,7 +36,7 @@ function update_script() {
msg_ok "Stopped Service"
rm -rf /opt/Radarr
- fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-x64.tar.gz"
+ fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
chmod 775 /opt/Radarr
msg_info "Starting Service"
diff --git a/ct/rclone.sh b/ct/rclone.sh
index bef8873d6..6c791d258 100644
--- a/ct/rclone.sh
+++ b/ct/rclone.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_fuse="${var_fuse:-yes}"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop rclone-web
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-amd64.zip"
+ fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-$(arch_resolve).zip"
msg_info "Starting Service"
systemctl start rclone-web
diff --git a/ct/rdtclient.sh b/ct/rdtclient.sh
index 1502c9256..14f3f657d 100755
--- a/ct/rdtclient.sh
+++ b/ct/rdtclient.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/reactive-resume.sh b/ct/reactive-resume.sh
index 33dada404..e1da974db 100644
--- a/ct/reactive-resume.sh
+++ b/ct/reactive-resume.sh
@@ -37,13 +37,13 @@ function update_script() {
ensure_dependencies git
cp /opt/reactive-resume/.env /opt/reactive-resume.env.bak
- NODE_VERSION="24" setup_nodejs
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "reactive-resume" "amruthpillai/reactive-resume" "tarball" "latest" "/opt/reactive-resume"
msg_info "Updating Reactive Resume (Patience)"
cd /opt/reactive-resume
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
- corepack enable
+
corepack prepare --activate
export CI="true"
export NODE_ENV="production"
diff --git a/ct/readarr.sh b/ct/readarr.sh
index 23a3c06fa..889bd511c 100644
--- a/ct/readarr.sh
+++ b/ct/readarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/readeck.sh b/ct/readeck.sh
index adc963e1a..e8c368760 100644
--- a/ct/readeck.sh
+++ b/ct/readeck.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop readeck
msg_ok "Stopped Service"
- fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
+ fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-$(arch_resolve)"
msg_info "Starting Service"
systemctl start readeck
diff --git a/ct/recyclarr.sh b/ct/recyclarr.sh
index 021ffdf1a..f2e95e4ef 100644
--- a/ct/recyclarr.sh
+++ b/ct/recyclarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -32,7 +32,7 @@ function update_script() {
msg_info "Updating ${APP}"
- fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-x64.tar.xz"
+ fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-$(arch_resolve "x64" "arm64").tar.xz"
# Migrate includes from configs/ to includes/ (recyclarr v8)
RECYCLARR_DIR="/root/.config/recyclarr"
diff --git a/ct/reitti.sh b/ct/reitti.sh
index c06e4789d..f160176d4 100644
--- a/ct/reitti.sh
+++ b/ct/reitti.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-15}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/romm.sh b/ct/romm.sh
index dc49b8af7..7a34a8e75 100644
--- a/ct/romm.sh
+++ b/ct/romm.sh
@@ -59,8 +59,13 @@ function update_script() {
ROMM_BASE=${ROMM_BASE:-/var/lib/romm}
ln -sfn "$ROMM_BASE"/resources /opt/romm/frontend/dist/assets/romm/resources
ln -sfn "$ROMM_BASE"/assets /opt/romm/frontend/dist/assets/romm/assets
- sed -i "s|alias .*/library/;|alias ${ROMM_BASE}/library/;|" /etc/nginx/sites-available/romm
- systemctl reload nginx
+ if [[ -f /etc/angie/http.d/romm.conf ]]; then
+ sed -i "s|alias .*/library/;|alias ${ROMM_BASE}/library/;|" /etc/angie/http.d/romm.conf
+ systemctl reload angie
+ elif [[ -f /etc/nginx/sites-available/romm ]]; then
+ sed -i "s|alias .*/library/;|alias ${ROMM_BASE}/library/;|" /etc/nginx/sites-available/romm
+ systemctl reload nginx
+ fi
msg_ok "Updated ROMM"
msg_info "Starting Services"
diff --git a/ct/rustdeskserver.sh b/ct/rustdeskserver.sh
index 529cb56a2..921ab1130 100644
--- a/ct/rustdeskserver.sh
+++ b/ct/rustdeskserver.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,10 +39,10 @@ function update_script() {
fi
msg_info "Stopped Service"
- 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" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*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-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*$(arch_resolve).deb"
+ fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*$(arch_resolve).deb"
+ fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*$(arch_resolve).deb"
+ fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*$(arch_resolve).deb"
msg_info "Starting services"
systemctl start -q rustdesk-*
diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh
index 30b0cdcab..e5a6143d0 100644
--- a/ct/sabnzbd.sh
+++ b/ct/sabnzbd.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -26,7 +26,7 @@ function update_script() {
check_container_resources
if par2 --version | grep -q "par2cmdline-turbo"; then
- fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-amd64.zip"
+ fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-$(arch_resolve).zip"
fi
if [[ ! -d /opt/sabnzbd ]]; then
diff --git a/ct/scanopy.sh b/ct/scanopy.sh
index 7363953a9..e290dc367 100644
--- a/ct/scanopy.sh
+++ b/ct/scanopy.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -70,7 +70,7 @@ function update_script() {
msg_ok "Created frontend UI"
if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then
- fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64"
+ fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-$(arch_resolve)"
mv "/usr/local/bin/Scanopy Daemon" /usr/local/bin/scanopy-daemon
rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh
sed -i -e 's|usr/bin|usr/local/bin|' \
diff --git a/ct/scraparr.sh b/ct/scraparr.sh
index 4dd1e11eb..2e87272dd 100644
--- a/ct/scraparr.sh
+++ b/ct/scraparr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/seaweedfs.sh b/ct/seaweedfs.sh
index a669e4994..94a14a57d 100644
--- a/ct/seaweedfs.sh
+++ b/ct/seaweedfs.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_fuse="${var_fuse:-yes}"
@@ -36,7 +36,7 @@ function update_script() {
systemctl stop seaweedfs
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_$(arch_resolve).tar.gz"
msg_info "Starting Service"
systemctl start seaweedfs
diff --git a/ct/seerr.sh b/ct/seerr.sh
index 4ea49c8f8..9b43ec2cb 100644
--- a/ct/seerr.sh
+++ b/ct/seerr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/semaphore.sh b/ct/semaphore.sh
index 6013a8edf..e4adf7ef0 100644
--- a/ct/semaphore.sh
+++ b/ct/semaphore.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -55,7 +55,7 @@ function update_script() {
systemctl stop semaphore
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
+ fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_$(arch_resolve).deb"
if [[ -f /opt/semaphore/semaphore_db.bolt ]]; then
$STD semaphore migrate --from-boltdb /opt/semaphore/semaphore_db.bolt --config /opt/semaphore/config.json
diff --git a/ct/shelfmark.sh b/ct/shelfmark.sh
index ab7e541bc..25ce77236 100644
--- a/ct/shelfmark.sh
+++ b/ct/shelfmark.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/shlink.sh b/ct/shlink.sh
index 1f6d1cf4c..0d6a210dd 100644
--- a/ct/shlink.sh
+++ b/ct/shlink.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/signoz.sh b/ct/signoz.sh
index cb7a48689..65690d7de 100644
--- a/ct/signoz.sh
+++ b/ct/signoz.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,9 +35,9 @@ function update_script() {
systemctl stop signoz-otel-collector
msg_ok "Stopped Services"
- fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_amd64.tar.gz"
- fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_amd64.tar.gz"
- fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_$(arch_resolve).tar.gz"
+ fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_$(arch_resolve).tar.gz"
+ fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_$(arch_resolve).tar.gz"
msg_info "Updating SigNoz"
cd /opt/signoz-schema-migrator/bin
diff --git a/ct/silverbullet.sh b/ct/silverbullet.sh
index af23e1bd8..58c1240c8 100644
--- a/ct/silverbullet.sh
+++ b/ct/silverbullet.sh
@@ -12,7 +12,7 @@ var_disk="${var_disk:-2}"
var_ram="${var_ram:-512}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
header_info "${APP}"
variables
@@ -33,7 +33,7 @@ function update_script() {
systemctl stop silverbullet
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-x86_64.zip"
+ fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-$(arch_resolve "x86_64" "aarch64").zip"
msg_info "Starting Service"
systemctl start silverbullet
diff --git a/ct/slskd.sh b/ct/slskd.sh
index 474ee1dd3..f3c34e412 100644
--- a/ct/slskd.sh
+++ b/ct/slskd.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -40,7 +40,7 @@ function update_script() {
cp /opt/slskd/config/slskd.yml /opt/slskd.yml.bak
msg_ok "Backed up config"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-x64.zip"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-$(arch_resolve "x64" "arm64").zip"
msg_info "Restoring config"
mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml
diff --git a/ct/solidtime.sh b/ct/solidtime.sh
index 98dddff80..e5675c178 100644
--- a/ct/solidtime.sh
+++ b/ct/solidtime.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/sonarqube.sh b/ct/sonarqube.sh
index 1519e9395..0f7331cff 100644
--- a/ct/sonarqube.sh
+++ b/ct/sonarqube.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-6144}"
var_disk="${var_disk:-25}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/sonarr.sh b/ct/sonarr.sh
index 78f0f1bd2..bf45b463e 100644
--- a/ct/sonarr.sh
+++ b/ct/sonarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop sonarr
msg_ok "Stopped Service"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Sonarr" "Sonarr/Sonarr" "prebuild" "latest" "/opt/Sonarr" "Sonarr.main.*.linux-x64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Sonarr" "Sonarr/Sonarr" "prebuild" "latest" "/opt/Sonarr" "Sonarr.main.*.linux-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Starting Service"
systemctl start sonarr
diff --git a/ct/sonobarr.sh b/ct/sonobarr.sh
index 57d423993..7b80e1b79 100644
--- a/ct/sonobarr.sh
+++ b/ct/sonobarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/soulsync.sh b/ct/soulsync.sh
index 0bd6c3c9f..6f016e56b 100644
--- a/ct/soulsync.sh
+++ b/ct/soulsync.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/sparkyfitness.sh b/ct/sparkyfitness.sh
index 5954b0bee..98694622b 100644
--- a/ct/sparkyfitness.sh
+++ b/ct/sparkyfitness.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-7}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/speedtest-tracker.sh b/ct/speedtest-tracker.sh
index aadbba0d6..4d5599063 100644
--- a/ct/speedtest-tracker.sh
+++ b/ct/speedtest-tracker.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/split-pro.sh b/ct/split-pro.sh
index 059b413fe..1496689c4 100644
--- a/ct/split-pro.sh
+++ b/ct/split-pro.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
variables
diff --git a/ct/sportarr.sh b/ct/sportarr.sh
index ae0f6e095..126adac86 100644
--- a/ct/sportarr.sh
+++ b/ct/sportarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop sportarr
msg_ok "Stopped Services"
- fetch_and_deploy_gh_release "sportarr" "Sportarr/Sportarr" "prebuild" "latest" "/opt/sportarr" "Sportarr-linux-x64-*.tar.gz"
+ fetch_and_deploy_gh_release "sportarr" "Sportarr/Sportarr" "prebuild" "latest" "/opt/sportarr" "Sportarr-linux-$(arch_resolve "x64" "arm64")-*.tar.gz"
msg_info "Starting Services"
systemctl start sportarr
diff --git a/ct/step-ca.sh b/ct/step-ca.sh
index 83e0dca13..3c0eef66e 100644
--- a/ct/step-ca.sh
+++ b/ct/step-ca.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -57,7 +57,7 @@ function update_script() {
msg_ok "Updated step-ca and step-cli"
if check_for_gh_release "step-badger" "lukasz-lobocki/step-badger"; then
- fetch_and_deploy_gh_release "step-badger" "lukasz-lobocki/step-badger" "prebuild" "latest" "/opt/step-badger" "step-badger_Linux_x86_64.tar.gz"
+ fetch_and_deploy_gh_release "step-badger" "lukasz-lobocki/step-badger" "prebuild" "latest" "/opt/step-badger" "step-badger_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
msg_ok "Updated step-badger"
fi
exit
diff --git a/ct/storybook.sh b/ct/storybook.sh
index 68e8e93d5..89ddede43 100644
--- a/ct/storybook.sh
+++ b/ct/storybook.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/storyteller.sh b/ct/storyteller.sh
index a461a6d02..81e30ce4a 100644
--- a/ct/storyteller.sh
+++ b/ct/storyteller.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-10240}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -48,7 +48,7 @@ function update_script() {
msg_info "Rebuilding Storyteller"
cd /opt/storyteller
export NODE_OPTIONS="--max-old-space-size=4096"
- $STD corepack enable
+
$STD corepack yarn install --network-timeout 600000
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
export CI=1
diff --git a/ct/strapi.sh b/ct/strapi.sh
index 041142658..6e6255af7 100755
--- a/ct/strapi.sh
+++ b/ct/strapi.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/stylus.sh b/ct/stylus.sh
index 69996de43..8eecfb7b1 100644
--- a/ct/stylus.sh
+++ b/ct/stylus.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_fuse="${var_fuse:-1}"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop stylus
msg_info "Stopped Service"
- fetch_and_deploy_gh_release "stylus" "mmastrac/stylus" "singlefile" "latest" "/usr/bin/" "*_linux_amd64"
+ fetch_and_deploy_gh_release "stylus" "mmastrac/stylus" "singlefile" "latest" "/usr/bin/" "*_linux_$(arch_resolve)"
msg_info "Starting Service"
systemctl start stylus
diff --git a/ct/sure.sh b/ct/sure.sh
index 77e743556..5f8448504 100644
--- a/ct/sure.sh
+++ b/ct/sure.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/tandoor.sh b/ct/tandoor.sh
index 575233035..b59803783 100644
--- a/ct/tandoor.sh
+++ b/ct/tandoor.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/tdarr.sh b/ct/tdarr.sh
index e7c9355c3..fad25eccf 100644
--- a/ct/tdarr.sh
+++ b/ct/tdarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -34,7 +34,7 @@ function update_script() {
$STD apt upgrade -y
rm -rf /opt/tdarr/Tdarr_Updater
cd /opt/tdarr
- RELEASE=$(curl_with_retry "https://f000.backblazeb2.com/file/tdarrs/versions.json" "-" | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep linux_x64 | head -n 1)
+ RELEASE=$(curl_with_retry "https://f000.backblazeb2.com/file/tdarrs/versions.json" "-" | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep "linux_$(arch_resolve "x64" "arm64")" | head -n 1)
curl_with_retry "$RELEASE" "Tdarr_Updater.zip"
$STD unzip Tdarr_Updater.zip
chmod +x Tdarr_Updater
diff --git a/ct/teable.sh b/ct/teable.sh
index 5d8935f80..9588461fa 100644
--- a/ct/teable.sh
+++ b/ct/teable.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-10240}"
var_disk="${var_disk:-25}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/technitiumdns.sh b/ct/technitiumdns.sh
index d155cb3b9..345ff9eb1 100644
--- a/ct/technitiumdns.sh
+++ b/ct/technitiumdns.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/teleport.sh b/ct/teleport.sh
index 086fb52aa..f32dbbcac 100644
--- a/ct/teleport.sh
+++ b/ct/teleport.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/termix.sh b/ct/termix.sh
index 4476c8d5a..a7551f6e0 100644
--- a/ct/termix.sh
+++ b/ct/termix.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -206,9 +206,25 @@ EOF
sed -i 's|/app/html|/opt/termix/html|g' /etc/nginx/nginx.conf
sed -i 's|/app/nginx|/opt/termix/nginx|g' /etc/nginx/nginx.conf
sed -i 's|listen ${PORT};|listen 80;|g' /etc/nginx/nginx.conf
-
rm -f /etc/systemd/system/nginx.service.d/pidfile.conf
rm -f /etc/tmpfiles.d/nginx-termix.conf
+
+ if [ ! -d /tmp/nginx ]; then
+ mkdir -p /tmp/nginx
+ fi
+
+ if [ ! -f /etc/tmpfiles.d/nginx-termix.conf ]; then
+ echo "d /tmp/nginx 0755 nobody nogroup -" >/etc/tmpfiles.d/nginx-termix.conf
+ fi
+
+ if [ ! -f /etc/systemd/system/nginx.service.d/pidfile.conf ]; then
+ mkdir -p /etc/systemd/system/nginx.service.d/
+ cat <<'EOF' >/etc/systemd/system/nginx.service.d/pidfile.conf
+[Service]
+PIDFile=/tmp/nginx/nginx.pid
+EOF
+ fi
+
systemctl daemon-reload
nginx -t && systemctl restart nginx
msg_ok "Updated Nginx Configuration"
diff --git a/ct/thingsboard.sh b/ct/thingsboard.sh
index b0c3231f2..87f796480 100644
--- a/ct/thingsboard.sh
+++ b/ct/thingsboard.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/threadfin.sh b/ct/threadfin.sh
index 1945490b4..462de9ca1 100644
--- a/ct/threadfin.sh
+++ b/ct/threadfin.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop threadfin
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "threadfin-app" "threadfin/threadfin" "singlefile" "latest" "/opt/threadfin" "Threadfin_linux_amd64"
+ fetch_and_deploy_gh_release "threadfin-app" "threadfin/threadfin" "singlefile" "latest" "/opt/threadfin" "Threadfin_linux_$(arch_resolve)"
mv /opt/threadfin/threadfin-app /opt/threadfin/threadfin
msg_info "Starting Service"
diff --git a/ct/tianji.sh b/ct/tianji.sh
index 3bc530ff8..c1888724a 100644
--- a/ct/tianji.sh
+++ b/ct/tianji.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/tinyauth.sh b/ct/tinyauth.sh
index 6cb0bc656..4209e974a 100644
--- a/ct/tinyauth.sh
+++ b/ct/tinyauth.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop tinyauth
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "tinyauth" "tinyauthapp/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-amd64"
+ fetch_and_deploy_gh_release "tinyauth" "tinyauthapp/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-$(arch_resolve)"
msg_info "Starting Service"
systemctl start tinyauth
diff --git a/ct/tolgee.sh b/ct/tolgee.sh
index c5dd8b86f..fab3dc278 100644
--- a/ct/tolgee.sh
+++ b/ct/tolgee.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/traccar.sh b/ct/traccar.sh
index 1d482d8b5..174e45f70 100644
--- a/ct/traccar.sh
+++ b/ct/traccar.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -40,7 +40,7 @@ function update_script() {
[[ -d /opt/traccar/media ]] && mv /opt/traccar/media /opt
msg_ok "Backup created"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-64*.zip"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-$(arch_resolve "64*" "arm-*").zip"
msg_info "Perform Update"
cd /opt/traccar
diff --git a/ct/tracearr.sh b/ct/tracearr.sh
index fa5a82620..47a98053b 100644
--- a/ct/tracearr.sh
+++ b/ct/tracearr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-8192}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/traefik.sh b/ct/traefik.sh
index 5f306f1b1..523f648ef 100644
--- a/ct/traefik.sh
+++ b/ct/traefik.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop traefik
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
msg_info "Starting Service"
systemctl start traefik
diff --git a/ct/transmute.sh b/ct/transmute.sh
index 195bc70c7..4b107744d 100644
--- a/ct/transmute.sh
+++ b/ct/transmute.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -30,10 +30,10 @@ function update_script() {
exit
fi
- fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
+ fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-$(arch_resolve "x86_64" "arm64").txz"
ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
- fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
- fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
+ fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-$(arch_resolve)-*.deb"
+ fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-$(arch_resolve).deb"
if check_for_gh_release "transmute" "transmute-app/transmute"; then
msg_info "Stopping Service"
diff --git a/ct/trek.sh b/ct/trek.sh
index 9d411730d..be958f75f 100644
--- a/ct/trek.sh
+++ b/ct/trek.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/trilium.sh b/ct/trilium.sh
index 750e662f8..66f7c1b06 100644
--- a/ct/trilium.sh
+++ b/ct/trilium.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -51,7 +51,7 @@ function update_script() {
rm -rf /opt/trilium
msg_ok "Backed up Database"
- fetch_and_deploy_gh_release "Trilium" "TriliumNext/Trilium" "prebuild" "latest" "/opt/trilium" "TriliumNotes-Server-*linux-x64.tar.xz"
+ fetch_and_deploy_gh_release "Trilium" "TriliumNext/Trilium" "prebuild" "latest" "/opt/trilium" "TriliumNotes-Server-*linux-$(arch_resolve "x64" "arm64").tar.xz"
msg_info "Restoring Database"
mkdir -p "$(dirname "${DB_RESTORE_PATH}")"
diff --git a/ct/trip.sh b/ct/trip.sh
index 074f0702e..b77245aba 100644
--- a/ct/trip.sh
+++ b/ct/trip.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/tubearchivist.sh b/ct/tubearchivist.sh
index a087e7d27..9cb445b4a 100644
--- a/ct/tubearchivist.sh
+++ b/ct/tubearchivist.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-6144}"
var_disk="${var_disk:-30}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/tunarr.sh b/ct/tunarr.sh
index cc5bd86f4..b19cd13a6 100644
--- a/ct/tunarr.sh
+++ b/ct/tunarr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -41,7 +41,7 @@ function update_script() {
msg_error "Backup failed: /root/.local/share/tunarr does not exist"
fi
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tunarr" "chrisbenincasa/tunarr" "prebuild" "latest" "/opt/tunarr" "*linux-x64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tunarr" "chrisbenincasa/tunarr" "prebuild" "latest" "/opt/tunarr" "*linux-$(arch_resolve "x64" "arm64").tar.gz"
cd /opt/tunarr
mv tunarr* tunarr
@@ -56,7 +56,7 @@ function update_script() {
systemctl stop tunarr
msg_ok "Stopped Service"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux$(arch_resolve "64" "arm64")-gpl-7.1.tar.xz"
msg_info "Set ErsatzTV-ffmpeg links"
chmod +x /opt/ErsatzTV-ffmpeg/bin/*
diff --git a/ct/twenty.sh b/ct/twenty.sh
index 19871062f..3bde6f746 100644
--- a/ct/twenty.sh
+++ b/ct/twenty.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-10240}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -31,6 +31,8 @@ function update_script() {
exit
fi
+ NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
+
if check_for_gh_release "twenty" "twentyhq/twenty"; then
msg_info "Stopping Services"
systemctl stop twenty-worker twenty-server
@@ -47,7 +49,7 @@ function update_script() {
msg_info "Building Application"
cd /opt/twenty
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
- $STD corepack enable
+
$STD corepack prepare yarn@4.9.2 --activate
export NODE_OPTIONS="--max-old-space-size=3072"
$STD yarn install --immutable || $STD yarn install
diff --git a/ct/uhf.sh b/ct/uhf.sh
index 515978849..fabb2f6ed 100644
--- a/ct/uhf.sh
+++ b/ct/uhf.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}"
@@ -44,8 +44,8 @@ function update_script() {
apt remove ffmpeg -y && apt autoremove -y
fi
setup_ffmpeg
- fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-x64-*.zip"
- fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-x64-*.zip"
+ fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-$(arch_resolve "x64" "arm64")-*.zip"
+ fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-$(arch_resolve "x64" "arm64")-*.zip"
msg_ok "Updated UHF Server"
msg_info "Starting Service"
diff --git a/ct/unbound.sh b/ct/unbound.sh
index 7eb707b48..95c1a18bc 100644
--- a/ct/unbound.sh
+++ b/ct/unbound.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/unifi-os-server.sh b/ct/unifi-os-server.sh
index f53787308..cc35f23b1 100644
--- a/ct/unifi-os-server.sh
+++ b/ct/unifi-os-server.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
var_tun="${var_tun:-yes}"
var_nesting="${var_nesting:-1}"
diff --git a/ct/unmanic.sh b/ct/unmanic.sh
index 361702007..8a96cb147 100644
--- a/ct/unmanic.sh
+++ b/ct/unmanic.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
var_gpu="${var_gpu:-yes}"
diff --git a/ct/upgopher.sh b/ct/upgopher.sh
index 90a5c97b1..067bd4b23 100644
--- a/ct/upgopher.sh
+++ b/ct/upgopher.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop upgopher
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "upgopher" "wanetty/upgopher" "prebuild" "latest" "/opt/upgopher" "upgopher_*_linux_amd64.tar.gz"
+ fetch_and_deploy_gh_release "upgopher" "wanetty/upgopher" "prebuild" "latest" "/opt/upgopher" "upgopher_*_linux_$(arch_resolve).tar.gz"
chmod +x /opt/upgopher/upgopher
msg_info "Starting Service"
diff --git a/ct/upsnap.sh b/ct/upsnap.sh
index 550772cbd..7fec8506d 100644
--- a/ct/upsnap.sh
+++ b/ct/upsnap.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop upsnap
msg_ok "Stopped Services"
- fetch_and_deploy_gh_release "upsnap" "seriousm4x/UpSnap" "prebuild" "latest" "/opt/upsnap" "UpSnap_*_linux_amd64.zip"
+ fetch_and_deploy_gh_release "upsnap" "seriousm4x/UpSnap" "prebuild" "latest" "/opt/upsnap" "UpSnap_*_linux_$(arch_resolve).zip"
msg_info "Starting Services"
systemctl start upsnap
diff --git a/ct/urbackupserver.sh b/ct/urbackupserver.sh
index 5d63dd6c2..fc6d0e53f 100644
--- a/ct/urbackupserver.sh
+++ b/ct/urbackupserver.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
header_info "$APP"
diff --git a/ct/versitygw.sh b/ct/versitygw.sh
index f041d2e79..9cc646d60 100644
--- a/ct/versitygw.sh
+++ b/ct/versitygw.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/victoriametrics.sh b/ct/victoriametrics.sh
index db3c53dcc..e6c8e5c2a 100644
--- a/ct/victoriametrics.sh
+++ b/ct/victoriametrics.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -38,13 +38,13 @@ function update_script() {
msg_ok "Stopped Service"
victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" |
- jq -r '.[] | select(.assets[].name | match("^victoria-metrics-linux-amd64-v[0-9.]+.tar.gz$")) | .tag_name' |
+ jq -r --arg a "$(arch_resolve)" '.[] | select(.assets[].name | match("^victoria-metrics-linux-" + $a + "-v[0-9.]+.tar.gz$")) | .tag_name' |
head -n 1)
msg_debug "Using release $victoriametrics_release"
- victoriametrics_filename="victoria-metrics-linux-amd64-${victoriametrics_release}.tar.gz"
- vmutils_filename="vmutils-linux-amd64-${victoriametrics_release}.tar.gz"
+ victoriametrics_filename="victoria-metrics-linux-$(arch_resolve)-${victoriametrics_release}.tar.gz"
+ vmutils_filename="vmutils-linux-$(arch_resolve)-${victoriametrics_release}.tar.gz"
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "$victoriametrics_release" "/opt/victoriametrics" "$victoriametrics_filename"
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "$victoriametrics_release" "/opt/victoriametrics" "$vmutils_filename"
@@ -52,10 +52,10 @@ function update_script() {
if [[ -f /etc/systemd/system/victoriametrics-logs.service ]]; then
vmlogs_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
jq -r '.assets[].name' |
- grep -E '^victoria-logs-linux-amd64-v[0-9.]+\.tar\.gz$')
+ grep -E "^victoria-logs-linux-$(arch_resolve)-v[0-9.]+\.tar\.gz$")
vlutils_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
jq -r '.assets[].name' |
- grep -E '^vlutils-linux-amd64-v[0-9.]+\.tar\.gz$')
+ grep -E "^vlutils-linux-$(arch_resolve)-v[0-9.]+\.tar\.gz$")
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vmlogs_filename"
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vlutils_filename"
diff --git a/ct/wallos.sh b/ct/wallos.sh
index f28b5846a..b1b193ea3 100644
--- a/ct/wallos.sh
+++ b/ct/wallos.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/wanderer.sh b/ct/wanderer.sh
index 05e5e4f76..432963379 100644
--- a/ct/wanderer.sh
+++ b/ct/wanderer.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/wastebin.sh b/ct/wastebin.sh
index cd9ff6900..0b44f1820 100644
--- a/ct/wastebin.sh
+++ b/ct/wastebin.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -66,7 +66,7 @@ EOF
msg_info "Updating Wastebin"
temp_file=$(mktemp)
- curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst" -o "$temp_file"
+ curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl.tar.zst" -o "$temp_file"
tar -xf "$temp_file"
cp -f wastebin* /opt/wastebin/
chmod +x /opt/wastebin/wastebin
diff --git a/ct/wazuh.sh b/ct/wazuh.sh
index 937b513d8..4158920f2 100644
--- a/ct/wazuh.sh
+++ b/ct/wazuh.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-25}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/web-check.sh b/ct/web-check.sh
index 327878810..d664014ac 100644
--- a/ct/web-check.sh
+++ b/ct/web-check.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/whisparr.sh b/ct/whisparr.sh
index b2b270971..3d72004dd 100644
--- a/ct/whisparr.sh
+++ b/ct/whisparr.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/whodb.sh b/ct/whodb.sh
index f39190b46..7bf803056 100644
--- a/ct/whodb.sh
+++ b/ct/whodb.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
systemctl stop whodb
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-amd64"
+ fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-$(arch_resolve)"
msg_info "Starting Service"
systemctl start whodb
diff --git a/ct/wishlist.sh b/ct/wishlist.sh
index 7542941eb..58a9789ef 100644
--- a/ct/wishlist.sh
+++ b/ct/wishlist.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/writefreely.sh b/ct/writefreely.sh
index daf3f6dcb..c38b805c5 100644
--- a/ct/writefreely.sh
+++ b/ct/writefreely.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -41,7 +41,7 @@ function update_script() {
cp /opt/writefreely/config.ini /tmp/writefreely_backup/ 2>/dev/null
msg_ok "Created Backup"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_$(arch_resolve).tar.gz"
msg_info "Restoring Data"
cp /tmp/writefreely_backup/config.ini /opt/writefreely/ 2>/dev/null
diff --git a/ct/xyops.sh b/ct/xyops.sh
index 140db1450..61f641119 100644
--- a/ct/xyops.sh
+++ b/ct/xyops.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/yamtrack.sh b/ct/yamtrack.sh
index 06eba2335..1537d8329 100644
--- a/ct/yamtrack.sh
+++ b/ct/yamtrack.sh
@@ -13,7 +13,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/yourls.sh b/ct/yourls.sh
index 680c0a0b3..212290816 100644
--- a/ct/yourls.sh
+++ b/ct/yourls.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/yt-dlp-webui.sh b/ct/yt-dlp-webui.sh
index 8be401bdb..9f0e69028 100644
--- a/ct/yt-dlp-webui.sh
+++ b/ct/yt-dlp-webui.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -39,7 +39,7 @@ function update_script() {
msg_ok "Updated yt-dlp"
rm -rf /usr/local/bin/yt-dlp-webui
- fetch_and_deploy_gh_release "yt-dlp-webui" "marcopiovanello/yt-dlp-web-ui" "singlefile" "latest" "/usr/local/bin" "yt-dlp-webui_linux-amd64"
+ fetch_and_deploy_gh_release "yt-dlp-webui" "marcopiovanello/yt-dlp-web-ui" "singlefile" "latest" "/usr/local/bin" "yt-dlp-webui_linux-$(arch_resolve)"
msg_info "Starting Service"
systemctl start yt-dlp-webui
diff --git a/ct/yubal.sh b/ct/yubal.sh
index b4630d115..ea1c56a6f 100644
--- a/ct/yubal.sh
+++ b/ct/yubal.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-15}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/zerobyte.sh b/ct/zerobyte.sh
index 16b3bd17b..1f65eeeea 100644
--- a/ct/zerobyte.sh
+++ b/ct/zerobyte.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-6144}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/zerotier-one.sh b/ct/zerotier-one.sh
index 187c281d3..0cf3dc1c5 100644
--- a/ct/zerotier-one.sh
+++ b/ct/zerotier-one.sh
@@ -8,11 +8,11 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="Zerotier-One"
var_tags="${var_tags:-networking}"
var_cpu="${var_cpu:-1}"
-var_ram="${var_ram:-512}"
+var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
diff --git a/ct/zitadel.sh b/ct/zitadel.sh
index 75fd6b2d7..9963c1046 100644
--- a/ct/zitadel.sh
+++ b/ct/zitadel.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
msg_ok "Stopped Service"
rm -f /usr/local/bin/zitadel
- fetch_and_deploy_gh_release "zitadel" "zitadel/zitadel" "prebuild" "latest" "/usr/local/bin" "zitadel-linux-amd64.tar.gz"
+ fetch_and_deploy_gh_release "zitadel" "zitadel/zitadel" "prebuild" "latest" "/usr/local/bin" "zitadel-linux-$(arch_resolve).tar.gz"
msg_info "Updating Zitadel"
$STD zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true
diff --git a/ct/zoraxy.sh b/ct/zoraxy.sh
index 3bc2fbb8e..29801afd9 100644
--- a/ct/zoraxy.sh
+++ b/ct/zoraxy.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -34,7 +34,7 @@ function update_script() {
msg_ok "Service stopped"
rm -rf /opt/zoraxy/zoraxy
- fetch_and_deploy_gh_release "zoraxy" "tobychui/zoraxy" "singlefile" "latest" "/opt/zoraxy" "zoraxy_linux_amd64"
+ fetch_and_deploy_gh_release "zoraxy" "tobychui/zoraxy" "singlefile" "latest" "/opt/zoraxy" "zoraxy_linux_$(arch_resolve)"
msg_info "Starting service"
systemctl start zoraxy
diff --git a/ct/zot-registry.sh b/ct/zot-registry.sh
index 4ceb94c5f..183527b76 100644
--- a/ct/zot-registry.sh
+++ b/ct/zot-registry.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
msg_ok "Stopped Zot service"
rm -f /usr/bin/zot
- fetch_and_deploy_gh_release "zot" "project-zot/zot" "singlefile" "latest" "/usr/bin" "zot-linux-amd64"
+ fetch_and_deploy_gh_release "zot" "project-zot/zot" "singlefile" "latest" "/usr/bin" "zot-linux-$(arch_resolve)"
msg_info "Configuring Zot Registry"
chown root:root /usr/bin/zot
diff --git a/ct/zwave-js-ui.sh b/ct/zwave-js-ui.sh
index 5790c571b..16ad05d3a 100644
--- a/ct/zwave-js-ui.sh
+++ b/ct/zwave-js-ui.sh
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
+var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
header_info "$APP"
@@ -35,7 +35,7 @@ function update_script() {
msg_ok "Stopped Service"
rm -rf /opt/zwave-js-ui/*
- fetch_and_deploy_gh_release "zwave-js-ui" "zwave-js/zwave-js-ui" "prebuild" "latest" "/opt/zwave-js-ui" "zwave-js-ui*-linux.zip"
+ fetch_and_deploy_gh_release "zwave-js-ui" "zwave-js/zwave-js-ui" "prebuild" "latest" "/opt/zwave-js-ui" "zwave-js-ui*-$(arch_resolve "linux" "linux-arm64").zip"
msg_info "Starting Service"
systemctl start zwave-js-ui
diff --git a/install/apache-airflow-install.sh b/install/apache-airflow-install.sh
new file mode 100644
index 000000000..89ec4835c
--- /dev/null
+++ b/install/apache-airflow-install.sh
@@ -0,0 +1,141 @@
+#!/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/apache/airflow
+
+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 \
+ libpq-dev \
+ libssl-dev \
+ libffi-dev \
+ python3-dev
+msg_ok "Installed Dependencies"
+
+UV_PYTHON="3.12" setup_uv
+PG_VERSION="16" setup_postgresql
+PG_DB_NAME="airflow" PG_DB_USER="airflow" setup_postgresql_db
+
+msg_info "Installing Apache Airflow"
+AIRFLOW_VERSION="3.2.1"
+mkdir -p /opt/airflow/{dags,logs,plugins}
+cd /opt/airflow
+$STD uv venv --python 3.12
+$STD uv pip install --python /opt/airflow/.venv/bin/python \
+ "apache-airflow[postgres,fab]==${AIRFLOW_VERSION}" \
+ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-3.12.txt"
+echo "${AIRFLOW_VERSION}" >~/.airflow
+msg_ok "Installed Apache Airflow"
+
+msg_info "Configuring Application"
+FERNET_KEY=$(/opt/airflow/.venv/bin/python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())")
+SECRET_KEY=$(openssl rand -hex 32)
+ADMIN_PASS=$(openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | cut -c1-12)
+cat </opt/airflow/.env
+AIRFLOW_HOME=/opt/airflow
+AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}
+AIRFLOW__CORE__EXECUTOR=LocalExecutor
+AIRFLOW__CORE__FERNET_KEY=${FERNET_KEY}
+AIRFLOW__CORE__DAGS_FOLDER=/opt/airflow/dags
+AIRFLOW__CORE__LOAD_EXAMPLES=false
+AIRFLOW__CORE__AUTH_MANAGER=airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager
+AIRFLOW__API__AUTH_BACKENDS=airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session
+AIRFLOW__WEBSERVER__SECRET_KEY=${SECRET_KEY}
+AIRFLOW__WEBSERVER__BASE_URL=http://${LOCAL_IP}:8080
+AIRFLOW_ADMIN_PASSWORD=${ADMIN_PASS}
+EOF
+set -a && source /opt/airflow/.env && set +a
+$STD /opt/airflow/.venv/bin/airflow db migrate
+$STD /opt/airflow/.venv/bin/airflow users create \
+ --username admin \
+ --firstname Admin \
+ --lastname User \
+ --role Admin \
+ --email admin@example.com \
+ --password "${ADMIN_PASS}"
+msg_ok "Configured Application"
+
+msg_info "Creating Services"
+cat </etc/systemd/system/airflow-api-server.service
+[Unit]
+Description=Apache Airflow API Server
+After=network.target postgresql.service
+
+[Service]
+Type=simple
+User=root
+EnvironmentFile=/opt/airflow/.env
+ExecStart=/opt/airflow/.venv/bin/airflow api-server --port 8080
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/airflow-scheduler.service
+[Unit]
+Description=Apache Airflow Scheduler
+After=network.target postgresql.service
+
+[Service]
+Type=simple
+User=root
+EnvironmentFile=/opt/airflow/.env
+ExecStart=/opt/airflow/.venv/bin/airflow scheduler
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/airflow-dag-processor.service
+[Unit]
+Description=Apache Airflow DAG Processor
+After=network.target postgresql.service
+
+[Service]
+Type=simple
+User=root
+EnvironmentFile=/opt/airflow/.env
+ExecStart=/opt/airflow/.venv/bin/airflow dag-processor
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/airflow-triggerer.service
+[Unit]
+Description=Apache Airflow Triggerer
+After=network.target postgresql.service
+
+[Service]
+Type=simple
+User=root
+EnvironmentFile=/opt/airflow/.env
+ExecStart=/opt/airflow/.venv/bin/airflow triggerer
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now airflow-api-server airflow-scheduler airflow-dag-processor airflow-triggerer
+msg_ok "Created Services"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/apprise-api-install.sh b/install/apprise-api-install.sh
index 27296b53b..89bcc0b8e 100644
--- a/install/apprise-api-install.sh
+++ b/install/apprise-api-install.sh
@@ -19,13 +19,16 @@ $STD apt install -y \
git
msg_ok "Installed Dependencies"
+export UV_PYTHON_INSTALL_DIR=/opt/uv-python
PYTHON_VERSION="3.12" setup_uv
fetch_and_deploy_gh_release "apprise" "caronc/apprise-api" "tarball"
msg_info "Setup Apprise-API"
cd /opt/apprise
cp ./requirements.txt /etc/requirements.txt
-$STD uv pip install -r requirements.txt gunicorn supervisor --system
+$STD uv venv /opt/apprise/.venv
+$STD uv pip install -r requirements.txt gunicorn supervisor -p /opt/apprise/.venv/bin/python
+ln -sf /opt/apprise/.venv/bin/supervisord /opt/apprise/.venv/bin/gunicorn /usr/local/bin/
cp -fr apprise_api/static /usr/share/nginx/html/s/
mv apprise_api/ webapp
touch /etc/nginx/server-override.conf
diff --git a/install/archivebox-install.sh b/install/archivebox-install.sh
index 1a0f3ccc9..5ae2c25e9 100644
--- a/install/archivebox-install.sh
+++ b/install/archivebox-install.sh
@@ -37,7 +37,7 @@ NODE_VERSION="22" NODE_MODULE="@postlight/parser@latest,single-file-cli@latest"
PYTHON_VERSION="3.13" setup_uv
msg_info "Installing Playwright"
-$STD uv pip install playwright --system
+$STD uv pip install playwright --system --break-system-packages
$STD playwright install-deps chromium
msg_ok "Installed Playwright"
@@ -46,7 +46,7 @@ mkdir -p /opt/archivebox/{data,.npm,.cache,.local}
$STD adduser --system --shell /bin/bash --gecos 'Archive Box User' --group --disabled-password --home /home/archivebox archivebox
chown -R archivebox:archivebox /opt/archivebox/{data,.npm,.cache,.local}
chmod -R 755 /opt/archivebox/data
-$STD uv pip install archivebox --system
+$STD uv pip install archivebox --system --break-system-packages
cd /opt/archivebox/data
expect </opt/degoog/.env
DEGOOG_PORT=4444
DEGOOG_ENGINES_DIR=/opt/degoog/data/engines
@@ -43,7 +44,7 @@ DEGOOG_PLUGIN_SETTINGS_FILE=/opt/degoog/data/plugin-settings.json
DEGOOG_VALKEY_URL=redis://127.0.0.1:6379
DEGOOG_CACHE_MAX_ENTRIES=1000
DEGOOG_CACHE_TTL_MS=43200000
-# DEGOOG_SETTINGS_PASSWORDS=changeme
+DEGOOG_SETTINGS_PASSWORDS=${SETTINGS_PASS}
# DEGOOG_PUBLIC_INSTANCE=false
# LOGGER=debug
EOF
diff --git a/install/dispatcharr-install.sh b/install/dispatcharr-install.sh
index f39dee893..f02b3c1b6 100644
--- a/install/dispatcharr-install.sh
+++ b/install/dispatcharr-install.sh
@@ -74,6 +74,16 @@ msg_ok "Configured Dispatcharr"
msg_info "Configuring Nginx"
cat </etc/nginx/sites-available/dispatcharr.conf
+map \$http_x_forwarded_proto \$real_forwarded_proto {
+ "" \$scheme;
+ default \$http_x_forwarded_proto;
+}
+
+map \$http_x_forwarded_port \$real_forwarded_port {
+ "" \$server_port;
+ default \$http_x_forwarded_port;
+}
+
server {
listen 9191;
server_name _;
@@ -115,13 +125,16 @@ server {
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_set_header X-Forwarded-Proto \$real_forwarded_proto;
}
# All other requests proxy to uWSGI
location / {
- include proxy_params;
- proxy_set_header X-Forwarded-Port \$server_port;
+ 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 \$real_forwarded_proto;
+ proxy_set_header X-Forwarded-Port \$real_forwarded_port;
proxy_pass http://127.0.0.1:5656;
}
}
diff --git a/install/docker-install.sh b/install/docker-install.sh
index 217ee6bdb..5ed717b2f 100644
--- a/install/docker-install.sh
+++ b/install/docker-install.sh
@@ -13,31 +13,13 @@ setting_up_container
network_check
update_os
-DOCKER_LATEST_VERSION=$(get_latest_github_release "moby/moby")
-PORTAINER_LATEST_VERSION=$(get_latest_github_release "portainer/portainer")
PORTAINER_AGENT_LATEST_VERSION=$(get_latest_github_release "portainer/agent")
-msg_info "Installing Docker $DOCKER_LATEST_VERSION (with Compose, Buildx)"
-DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
-mkdir -p $(dirname $DOCKER_CONFIG_PATH)
-echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json
-$STD sh <(curl -fsSL https://get.docker.com)
-msg_ok "Installed Docker $DOCKER_LATEST_VERSION"
-
read -r -p "${TAB3}Would you like to add Portainer (UI)? " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- msg_info "Installing Portainer $PORTAINER_LATEST_VERSION"
- docker volume create portainer_data >/dev/null
- $STD docker run -d \
- -p 8000:8000 \
- -p 9443:9443 \
- --name=portainer \
- --restart=always \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v portainer_data:/data \
- portainer/portainer-ce:latest
- msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION"
+ DOCKER_PORTAINER="true" setup_docker
else
+ setup_docker
read -r -p "${TAB3}Would you like to install the Portainer Agent (for remote management)? " prompt_agent
if [[ ${prompt_agent,,} =~ ^(y|yes)$ ]]; then
msg_info "Installing Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
@@ -76,7 +58,7 @@ if [[ -n "$socket" ]]; then
cat </etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
-ExecStart=/usr/bin/dockerd
+ExecStart=$(command -v dockerd || echo /usr/sbin/dockerd)
EOF
$STD systemctl daemon-reexec
diff --git a/install/endurain-install.sh b/install/endurain-install.sh
index 6aef73f66..805797204 100644
--- a/install/endurain-install.sh
+++ b/install/endurain-install.sh
@@ -81,6 +81,8 @@ msg_ok "Built Frontend"
msg_info "Setting up Backend"
cd /opt/endurain/backend
+UV_VERSION=$(grep -Po 'required-version\s*=\s*"\K[^"]+' pyproject.toml 2>/dev/null || echo "0.11.18")
+UV_VERSION="$UV_VERSION" setup_uv
$STD uv tool install poetry
$STD uv tool update-shell
export PATH="/root/.local/bin:$PATH"
diff --git a/install/esphome-install.sh b/install/esphome-install.sh
index 9b6a665c8..1b5b7367d 100644
--- a/install/esphome-install.sh
+++ b/install/esphome-install.sh
@@ -26,8 +26,8 @@ cd /opt/esphome
$STD uv venv --clear /opt/esphome/.venv
$STD /opt/esphome/.venv/bin/python -m ensurepip --upgrade
$STD /opt/esphome/.venv/bin/python -m pip install --upgrade pip
-$STD /opt/esphome/.venv/bin/python -m pip install esphome tornado esptool
-msg_ok "Setup and Installed ESPHome"
+$STD /opt/esphome/.venv/bin/python -m pip install esphome esphome-device-builder esptool
+msg_ok "Setup and Installed ESPHome Device Builder"
msg_info "Linking esphome to /usr/local/bin"
rm -f /usr/local/bin/esphome
@@ -36,13 +36,13 @@ msg_ok "Linked esphome binary"
msg_info "Creating Service"
mkdir -p /root/config
-cat </etc/systemd/system/esphomeDashboard.service
+cat </etc/systemd/system/esphome-device-builder.service
[Unit]
-Description=ESPHome Dashboard
+Description=ESPHome Device Builder
After=network.target
[Service]
-ExecStart=/opt/esphome/.venv/bin/esphome dashboard /root/config/
+ExecStart=/opt/esphome/.venv/bin/esphome-device-builder /root/config/
Restart=always
User=root
@@ -50,7 +50,7 @@ User=root
WantedBy=multi-user.target
EOF
-systemctl enable -q --now esphomeDashboard
+systemctl enable -q --now esphome-device-builder
msg_ok "Created Service"
motd_ssh
diff --git a/install/feishin-install.sh b/install/feishin-install.sh
index 68669db7d..6a12898d0 100644
--- a/install/feishin-install.sh
+++ b/install/feishin-install.sh
@@ -19,14 +19,14 @@ $STD apt install -y \
gettext-base
msg_ok "Installed Dependencies"
-NODE_VERSION="24" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
fetch_and_deploy_gh_release "feishin" "jeffvli/feishin" "tarball"
msg_info "Building Feishin Web"
cd /opt/feishin
#PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json)
-$STD corepack enable
+
$STD corepack prepare "pnpm@10" --activate
$STD pnpm install
$STD pnpm run build:web
diff --git a/install/foldergram-install.sh b/install/foldergram-install.sh
index 895a619a8..92b6bef06 100644
--- a/install/foldergram-install.sh
+++ b/install/foldergram-install.sh
@@ -23,7 +23,7 @@ fetch_and_deploy_gh_release "foldergram" "foldergram/foldergram" "tarball"
msg_info "Configuring Foldergram"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
-$STD corepack enable
+
cd /opt/foldergram
$STD pnpm install
$STD pnpm run build
diff --git a/install/garage-install.sh b/install/garage-install.sh
index 5ba1d24ea..92b66f7fe 100644
--- a/install/garage-install.sh
+++ b/install/garage-install.sh
@@ -15,7 +15,7 @@ update_os
msg_info "Setup Garage"
GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name')
-curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/x86_64-unknown-linux-musl/garage" -o /usr/local/bin/garage
+curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
chmod +x /usr/local/bin/garage
mkdir -p /var/lib/garage/{data,meta,snapshots}
mkdir -p /etc/garage
diff --git a/install/gitea-install.sh b/install/gitea-install.sh
index fc68c7da6..83da30c41 100644
--- a/install/gitea-install.sh
+++ b/install/gitea-install.sh
@@ -20,7 +20,7 @@ $STD apt install -y \
sqlite3
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-amd64"
+fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-$(arch_resolve)"
msg_info "Configuring Gitea"
chmod +x /usr/local/bin/gitea
diff --git a/install/github-runner-install.sh b/install/github-runner-install.sh
index 80a9d24cf..f6ac73236 100644
--- a/install/github-runner-install.sh
+++ b/install/github-runner-install.sh
@@ -25,7 +25,7 @@ msg_info "Creating runner user (no sudo)"
useradd -m -s /bin/bash runner
msg_ok "Runner user ready"
-fetch_and_deploy_gh_release "actions-runner" "actions/runner" "prebuild" "latest" "/opt/actions-runner" "actions-runner-linux-x64-*.tar.gz"
+fetch_and_deploy_gh_release "actions-runner" "actions/runner" "prebuild" "latest" "/opt/actions-runner" "actions-runner-linux-$(arch_resolve "x64" "arm64")-*.tar.gz"
msg_info "Setting ownership for runner user"
chown -R runner:runner /opt/actions-runner
diff --git a/install/glance-install.sh b/install/glance-install.sh
index 2c1f97a34..2d6c8b233 100644
--- a/install/glance-install.sh
+++ b/install/glance-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "glance" "glanceapp/glance" "prebuild" "latest" "/opt/glance" "glance-linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "glance" "glanceapp/glance" "prebuild" "latest" "/opt/glance" "glance-linux-$(arch_resolve).tar.gz"
msg_info "Configuring Glance"
mkdir -p /opt/glance_data
diff --git a/install/go2rtc-install.sh b/install/go2rtc-install.sh
index 82927161c..15db9c73b 100644
--- a/install/go2rtc-install.sh
+++ b/install/go2rtc-install.sh
@@ -18,7 +18,7 @@ msg_info "Installing Dependencies"
$STD apt install -y ffmpeg
msg_ok "Installed Dependencies"
-USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_amd64"
+USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_$(arch_resolve)"
msg_info "Creating Service"
cat </etc/systemd/system/go2rtc.service
@@ -30,7 +30,7 @@ After=network.target
Type=simple
User=root
WorkingDirectory=/opt/go2rtc
-ExecStart=/opt/go2rtc/go2rtc_linux_amd64
+ExecStart=/opt/go2rtc/go2rtc_linux_$(arch_resolve)
[Install]
WantedBy=multi-user.target
diff --git a/install/gogs-install.sh b/install/gogs-install.sh
index e58e1d36c..63b168e23 100644
--- a/install/gogs-install.sh
+++ b/install/gogs-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y git
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_$(arch_resolve).tar.gz"
msg_info "Setting up Gogs"
mkdir -p /opt/gogs/{custom/conf,data,log}
diff --git a/install/gokapi-install.sh b/install/gokapi-install.sh
index d45fa580b..3df5ddee1 100644
--- a/install/gokapi-install.sh
+++ b/install/gokapi-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "*linux*amd64.zip"
+fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "*linux*$(arch_resolve).zip"
msg_info "Configuring Gokapi"
mkdir -p /opt/gokapi/{data,config}
diff --git a/install/gotify-install.sh b/install/gotify-install.sh
index cab11a785..44444c74f 100644
--- a/install/gotify-install.sh
+++ b/install/gotify-install.sh
@@ -13,8 +13,8 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-amd64.zip"
-chmod +x /opt/gotify/gotify-linux-amd64
+fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-$(arch_resolve).zip"
+chmod +x /opt/gotify/gotify-linux-$(arch_resolve)
msg_info "Creating Service"
cat </etc/systemd/system/gotify.service
@@ -27,7 +27,7 @@ After=network.target
Type=simple
User=root
WorkingDirectory=/opt/gotify
-ExecStart=/opt/gotify/./gotify-linux-amd64
+ExecStart=/opt/gotify/./gotify-linux-$(arch_resolve)
Restart=always
RestartSec=3
diff --git a/install/gramps-web-install.sh b/install/gramps-web-install.sh
index 7924847a2..f7df3692b 100644
--- a/install/gramps-web-install.sh
+++ b/install/gramps-web-install.sh
@@ -38,7 +38,7 @@ $STD apt install -y \
msg_ok "Installed Dependencies"
PYTHON_VERSION="3.12" setup_uv
-NODE_VERSION="22" setup_nodejs
+NODE_VERSION="22" NODE_MODULE="corepack" setup_nodejs
fetch_and_deploy_gh_release "gramps-web-api" "gramps-project/gramps-web-api" "tarball" "latest" "/opt/gramps-web-api"
fetch_and_deploy_gh_release "gramps-web" "gramps-project/gramps-web" "tarball" "latest" "/opt/gramps-web/frontend"
@@ -92,7 +92,7 @@ msg_ok "Installed Gramps Addons"
cd /opt/gramps-web/frontend
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
-$STD corepack enable
+
$STD npm install
$STD npm run build
cd /opt/gramps-web-api
diff --git a/install/hev-socks5-server-install.sh b/install/hev-socks5-server-install.sh
index ee58634b5..02871583c 100644
--- a/install/hev-socks5-server-install.sh
+++ b/install/hev-socks5-server-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "hev-socks5-server" "heiher/hev-socks5-server" "singlefile" "latest" "/opt" "hev-socks5-server-linux-x86_64"
+fetch_and_deploy_gh_release "hev-socks5-server" "heiher/hev-socks5-server" "singlefile" "latest" "/opt" "hev-socks5-server-linux-$(arch_resolve "x86_64" "arm64")"
msg_info "Setup hev-socks5-server"
mkdir -p /etc/hev-socks5-server
diff --git a/install/homarr-install.sh b/install/homarr-install.sh
index f8e39c3a6..f46d09c5b 100644
--- a/install/homarr-install.sh
+++ b/install/homarr-install.sh
@@ -23,7 +23,7 @@ msg_ok "Installed Dependencies"
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
setup_nodejs
-fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-debian-amd64.tar.gz"
+fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-debian-$(arch_resolve).tar.gz"
msg_info "Installing Homarr"
mkdir -p /opt/homarr_db
diff --git a/install/homeassistant-install.sh b/install/homeassistant-install.sh
index 5af67d7c6..3534f2222 100644
--- a/install/homeassistant-install.sh
+++ b/install/homeassistant-install.sh
@@ -30,32 +30,9 @@ get_latest_release() {
curl -fsSL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4
}
-DOCKER_LATEST_VERSION=$(get_latest_release "moby/moby")
CORE_LATEST_VERSION=$(get_latest_release "home-assistant/core")
-PORTAINER_LATEST_VERSION=$(get_latest_release "portainer/portainer")
-msg_info "Installing Docker $DOCKER_LATEST_VERSION"
-DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
-mkdir -p $(dirname $DOCKER_CONFIG_PATH)
-echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json
-$STD sh <(curl -fsSL https://get.docker.com)
-msg_ok "Installed Docker $DOCKER_LATEST_VERSION"
-
-msg_info "Pulling Portainer $PORTAINER_LATEST_VERSION Image"
-$STD docker pull portainer/portainer-ce:latest
-msg_ok "Pulled Portainer $PORTAINER_LATEST_VERSION Image"
-
-msg_info "Installing Portainer $PORTAINER_LATEST_VERSION"
-$STD docker volume create portainer_data
-$STD docker run -d \
- -p 8000:8000 \
- -p 9443:9443 \
- --name=portainer \
- --restart=always \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v portainer_data:/data \
- portainer/portainer-ce:latest
-msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION"
+DOCKER_PORTAINER="true" setup_docker
msg_info "Pulling Home Assistant $CORE_LATEST_VERSION Image"
$STD docker pull ghcr.io/home-assistant/home-assistant:stable
diff --git a/install/homebox-install.sh b/install/homebox-install.sh
index 065a16874..fce110b08 100644
--- a/install/homebox-install.sh
+++ b/install/homebox-install.sh
@@ -14,7 +14,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_x86_64.tar.gz"
+fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
msg_info "Configuring Homebox"
chmod +x /opt/homebox/homebox
diff --git a/install/hoodik-install.sh b/install/hoodik-install.sh
index d524c503e..5cbb863e0 100644
--- a/install/hoodik-install.sh
+++ b/install/hoodik-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "hoodik" "hudikhq/hoodik" "prebuild" "latest" "/opt/hoodik" "*x86_64.tar.gz"
+fetch_and_deploy_gh_release "hoodik" "hudikhq/hoodik" "prebuild" "latest" "/opt/hoodik" "*$(arch_resolve "x86_64" "arm64").tar.gz"
msg_info "Configuring Hoodik"
mkdir -p /opt/hoodik_data
diff --git a/install/igotify-install.sh b/install/igotify-install.sh
index 66987b1c8..18746077b 100644
--- a/install/igotify-install.sh
+++ b/install/igotify-install.sh
@@ -23,7 +23,7 @@ setup_deb822_repo \
$STD apt install -y aspnetcore-runtime-10.0
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "igotify" "androidseb25/iGotify-Notification-Assistent" "prebuild" "latest" "/opt/igotify" "iGotify-Notification-Service-amd64-v*.zip"
+fetch_and_deploy_gh_release "igotify" "androidseb25/iGotify-Notification-Assistent" "prebuild" "latest" "/opt/igotify" "iGotify-Notification-Service-$(arch_resolve)-v*.zip"
msg_info "Creating Service"
cat </opt/igotify/.env
diff --git a/install/immich-install.sh b/install/immich-install.sh
index 378dd0642..d64589727 100644
--- a/install/immich-install.sh
+++ b/install/immich-install.sh
@@ -124,13 +124,23 @@ msg_ok "Dependencies Installed"
msg_info "Installing Mise"
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
-echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
+echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=$(arch_resolve)] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
$STD apt update
$STD apt install -y mise
msg_ok "Installed Mise"
msg_info "Configuring Debian Testing Repo"
-sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
+if [[ -f /etc/apt/sources.list.d/debian.sources ]]; then
+ sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
+else
+ cat </etc/apt/sources.list.d/testing.sources
+Types: deb
+URIs: http://deb.debian.org/debian
+Suites: testing
+Components: main
+Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
+EOF
+fi
cat </etc/apt/preferences.d/preferences
Package: *
Pin: release a=unstable
@@ -153,7 +163,7 @@ ACTUAL_PG_VERSION=$(ls /etc/postgresql/ 2>/dev/null | sort -V | tail -1)
ACTUAL_PG_VERSION=${ACTUAL_PG_VERSION:-16}
VCHORD_RELEASE="0.5.3"
-fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-${ACTUAL_PG_VERSION}-vchord_*_amd64.deb"
+fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-${ACTUAL_PG_VERSION}-vchord_*_$(arch_resolve).deb"
sed -i "s/^#shared_preload.*/shared_preload_libraries = 'vchord.so'/" /etc/postgresql/${ACTUAL_PG_VERSION}/main/postgresql.conf
systemctl restart postgresql.service
@@ -303,14 +313,13 @@ mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v2.7.5" "$SRC_DIR"
PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)"
-NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack,pnpm@${PNPM_VERSION}" setup_nodejs
msg_info "Installing Immich (patience)"
cd "$SRC_DIR"/server
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export CI=1
-corepack enable
# server build
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
@@ -376,7 +385,7 @@ if [[ -f ~/.openvino ]]; then
$STD sudo --preserve-env=VIRTUAL_ENV,UV_HTTP_TIMEOUT -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p "${ML_PYTHON}" --managed-python && break
[[ $attempt -lt 3 ]] && msg_warn "uv sync attempt $attempt failed, retrying..." && sleep 10
done
- patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-x86_64-linux-gnu.so"
+ patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-$(arch_resolve "x86_64" "aarch64")-linux-gnu.so"
msg_ok "Installed Intel OpenVINO machine-learning"
else
ML_PYTHON="python3.11"
diff --git a/install/immichframe-install.sh b/install/immichframe-install.sh
index 683ee162c..6daa4ce04 100644
--- a/install/immichframe-install.sh
+++ b/install/immichframe-install.sh
@@ -14,18 +14,26 @@ network_check
update_os
msg_info "Installing Dependencies"
-setup_deb822_repo \
- "microsoft" \
- "https://packages.microsoft.com/keys/microsoft-2025.asc" \
- "https://packages.microsoft.com/debian/13/prod/" \
- "trixie" \
- "main"
-$STD apt install -y \
- libicu-dev \
- libssl-dev \
- gettext-base \
- dotnet-sdk-8.0 \
- aspnetcore-runtime-8.0
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ $STD apt install -y libicu-dev libssl-dev gettext-base
+ curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
+ $STD bash /tmp/dotnet-install.sh --channel 8.0 --install-dir /usr/lib/dotnet8
+ ln -sf /usr/lib/dotnet8/dotnet /usr/bin/dotnet
+ rm -f /tmp/dotnet-install.sh
+else
+ setup_deb822_repo \
+ "microsoft" \
+ "https://packages.microsoft.com/keys/microsoft-2025.asc" \
+ "https://packages.microsoft.com/debian/13/prod/" \
+ "trixie" \
+ "main"
+ $STD apt install -y \
+ libicu-dev \
+ libssl-dev \
+ gettext-base \
+ dotnet-sdk-8.0 \
+ aspnetcore-runtime-8.0
+fi
msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs
@@ -36,7 +44,7 @@ mkdir -p /opt/immichframe
cd /tmp/immichframe
$STD dotnet publish ImmichFrame.WebApi/ImmichFrame.WebApi.csproj \
--configuration Release \
- --runtime linux-x64 \
+ --runtime "$(arch_resolve "linux-x64" "linux-arm64")" \
--self-contained false \
--output /opt/immichframe
cd /tmp/immichframe/immichFrame.Web
diff --git a/install/influxdb-install.sh b/install/influxdb-install.sh
index 9e4af3e53..772b22d21 100644
--- a/install/influxdb-install.sh
+++ b/install/influxdb-install.sh
@@ -32,7 +32,7 @@ fi
msg_info "Installing InfluxDB v${INFLUX}"
if [[ $INFLUX == "3" ]]; then
- if ! grep -qm1 'avx2' /proc/cpuinfo; then
+ if [[ "$(arch_resolve)" == "amd64" ]] && ! grep -qm1 'avx2' /proc/cpuinfo; then
msg_error "InfluxDB v3 requires AVX2 support, which is not available on this system."
exit 106
fi
@@ -43,9 +43,9 @@ elif [[ $INFLUX == "2" ]]; then
systemctl enable -q --now influxdb
else
$STD apt install -y influxdb
- download_file "https://dl.influxdata.com/chronograf/releases/chronograf_1.10.8_amd64.deb" "${HOME}/chronograf_1.10.8_amd64.deb"
- $STD dpkg -i "${HOME}/chronograf_1.10.8_amd64.deb"
- rm -rf "${HOME}/chronograf_1.10.8_amd64.deb"
+ download_file "https://dl.influxdata.com/chronograf/releases/chronograf_1.10.8_$(arch_resolve).deb" "${HOME}/chronograf_1.10.8_$(arch_resolve).deb"
+ $STD dpkg -i "${HOME}/chronograf_1.10.8_$(arch_resolve).deb"
+ rm -rf "${HOME}/chronograf_1.10.8_$(arch_resolve).deb"
systemctl enable -q --now influxdb
fi
msg_ok "Installed InfluxDB"
diff --git a/install/investbrain-install.sh b/install/investbrain-install.sh
index 9163166e8..bd678e654 100644
--- a/install/investbrain-install.sh
+++ b/install/investbrain-install.sh
@@ -17,6 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y \
nginx \
supervisor \
+ cron \
redis-server \
libfreetype-dev \
libjpeg62-turbo-dev \
diff --git a/install/invoiceshelf-install.sh b/install/invoiceshelf-install.sh
index 368fcf6e6..657054f37 100644
--- a/install/invoiceshelf-install.sh
+++ b/install/invoiceshelf-install.sh
@@ -19,7 +19,7 @@ msg_ok "Installed Dependencies"
PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULES="bcmath,gd,intl,xml,zip,pdo_pgsql,mbstring,curl,exif" setup_php
setup_composer
-NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs
PG_VERSION="16" setup_postgresql
PG_DB_NAME="invoiceshelf" PG_DB_USER="invoiceshelf" setup_postgresql_db
@@ -38,14 +38,14 @@ sed -i "s|^DB_DATABASE=.*|DB_DATABASE=${PG_DB_NAME}|" .env
sed -i "s|^DB_USERNAME=.*|DB_USERNAME=${PG_DB_USER}|" .env
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=${PG_DB_PASS}|" .env
COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev --optimize-autoloader --no-interaction
-$STD php artisan key:generate
+$STD php artisan key:generate --force
if command -v corepack >/dev/null 2>&1; then
- $STD corepack enable
- $STD corepack yarn install
- $STD corepack yarn build
+
+ $STD corepack pnpm install
+ $STD corepack pnpm run build
else
- $STD yarn install
- $STD yarn build
+ $STD pnpm install
+ $STD pnpm run build
fi
mkdir -p storage/framework/{cache,sessions,views} storage/logs bootstrap/cache
chown -R www-data:www-data /opt/invoiceshelf
diff --git a/install/isponsorblocktv-install.sh b/install/isponsorblocktv-install.sh
index 1fc861610..1f3d5044b 100644
--- a/install/isponsorblocktv-install.sh
+++ b/install/isponsorblocktv-install.sh
@@ -13,9 +13,9 @@ setting_up_container
network_check
update_os
-ISBTV_BINARY="iSponsorBlockTV-x86_64-linux-v1"
+ISBTV_BINARY="$(arch_resolve "iSponsorBlockTV-x86_64-linux-v1" "iSponsorBlockTV-aarch64-linux")"
if grep -q ' avx ' /proc/cpuinfo 2>/dev/null && grep -q ' avx2 ' /proc/cpuinfo 2>/dev/null && grep -q ' movbe ' /proc/cpuinfo 2>/dev/null; then
- ISBTV_BINARY="iSponsorBlockTV-x86_64-linux"
+ ISBTV_BINARY="$(arch_resolve "iSponsorBlockTV-x86_64-linux" "iSponsorBlockTV-aarch64-linux")"
fi
fetch_and_deploy_gh_release "isponsorblocktv" "dmunozv04/iSponsorBlockTV" "singlefile" "latest" "/opt/isponsorblocktv" "${ISBTV_BINARY}"
diff --git a/install/jackett-install.sh b/install/jackett-install.sh
index 2cc45770a..291d6f3e1 100644
--- a/install/jackett-install.sh
+++ b/install/jackett-install.sh
@@ -13,7 +13,11 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "jackett" "Jackett/Jackett" "prebuild" "latest" "/opt/Jackett" "Jackett.Binaries.LinuxAMDx64.tar.gz"
+msg_info "Installing Dependencies"
+$STD apt-get install -y libicu-dev
+msg_ok "Installed Dependencies"
+
+fetch_and_deploy_gh_release "jackett" "Jackett/Jackett" "prebuild" "latest" "/opt/Jackett" "Jackett.Binaries.Linux$(arch_resolve "AMDx64" "ARM64").tar.gz"
cat </opt/.env
DisableRootWarning=true
diff --git a/install/jellyfin-install.sh b/install/jellyfin-install.sh
index a25ac387f..9c205df73 100644
--- a/install/jellyfin-install.sh
+++ b/install/jellyfin-install.sh
@@ -18,7 +18,7 @@ msg_custom "âšī¸" "${GN}" "If NVIDIA GPU passthrough is detected, you'll be as
msg_info "Installing Dependencies"
ensure_dependencies libjemalloc2
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
- ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
+ ln -sf "/usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")/libjemalloc.so.2" /usr/lib/libjemalloc.so
fi
msg_ok "Installed Dependencies"
diff --git a/install/karakeep-install.sh b/install/karakeep-install.sh
index a0eea98da..4f1d0c3ab 100644
--- a/install/karakeep-install.sh
+++ b/install/karakeep-install.sh
@@ -24,7 +24,7 @@ $STD apt install -y \
ffmpeg
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "monolith" "Y2Z/monolith" "singlefile" "latest" "/usr/bin" "monolith-gnu-linux-x86_64"
+fetch_and_deploy_gh_release "monolith" "Y2Z/monolith" "singlefile" "latest" "/usr/bin" "monolith-gnu-linux-$(arch_resolve "x86_64" "aarch64")"
fetch_and_deploy_gh_release "yt-dlp" "yt-dlp/yt-dlp-nightly-builds" "singlefile" "latest" "/usr/bin" "yt-dlp_linux"
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(uname -m)-unknown-linux-gnu.zip"
setup_meilisearch
@@ -35,7 +35,7 @@ MODULE_VERSION="$(jq -r '.packageManager | split("@")[1]' /opt/karakeep/package.
NODE_VERSION="24" NODE_MODULE="pnpm@${MODULE_VERSION}" setup_nodejs
msg_info "Installing external JavaScript Extension for yt-dlp"
-$STD pip install -U yt-dlp-ejs
+$STD pip install -U yt-dlp-ejs --break-system-packages
mkdir -p ~/.config/pip
cat <~/.config/pip/pip.conf
[global]
diff --git a/install/kasm-install.sh b/install/kasm-install.sh
index f5dbd024f..d921933a4 100644
--- a/install/kasm-install.sh
+++ b/install/kasm-install.sh
@@ -14,7 +14,26 @@ network_check
update_os
msg_info "Installing Docker"
-$STD sh <(curl -fsSL https://get.docker.com/)
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ setup_deb822_repo "docker" \
+ "https://download.docker.com/linux/$(get_os_info id)/gpg" \
+ "https://download.docker.com/linux/$(get_os_info id)" \
+ "$(get_os_info codename)" \
+ "stable"
+ $STD apt install -y \
+ docker-ce=5:28.5.2-1~debian.13~trixie \
+ docker-ce-cli=5:28.5.2-1~debian.13~trixie \
+ containerd.io=1.7.29-1~debian.13~trixie \
+ docker-buildx-plugin docker-compose-plugin
+ runc_tmp=$(mktemp -d)
+ (cd "$runc_tmp" && apt-get download runc && dpkg-deb -x runc_*.deb x)
+ dpkg-divert --local --rename --add /usr/bin/runc
+ install -m755 "$runc_tmp"/x/usr/sbin/runc /usr/bin/runc
+ rm -rf "$runc_tmp"
+ systemctl restart containerd docker
+else
+ $STD sh <(curl -fsSL https://get.docker.com/)
+fi
msg_ok "Installed Docker"
msg_info "Detecting latest Kasm Workspaces release"
@@ -53,7 +72,7 @@ curl_download "/opt/kasm_release_${KASM_VERSION}.tar.gz" "$KASM_URL"
cd /opt
tar -xf "kasm_release_${KASM_VERSION}.tar.gz"
chmod +x /opt/kasm_release/install.sh
-printf 'y\ny\ny\n4\n' | bash /opt/kasm_release/install.sh >~/kasm-install.output 2>&1
+printf 'y\ny\ny\n4\n' | bash /opt/kasm_release/install.sh --ignore-dep-failures >~/kasm-install.output 2>&1
awk '
/^Kasm UI Login Credentials$/ {capture=1}
capture {print}
diff --git a/install/kavita-install.sh b/install/kavita-install.sh
index 138942834..3f618bd48 100644
--- a/install/kavita-install.sh
+++ b/install/kavita-install.sh
@@ -13,7 +13,11 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "Kavita" "Kareadita/Kavita" "prebuild" "latest" "/opt/Kavita" "kavita-linux-x64.tar.gz"
+msg_info "Installing Dependencies"
+$STD apt-get install -y libicu-dev
+msg_ok "Installed Dependencies"
+
+fetch_and_deploy_gh_release "Kavita" "Kareadita/Kavita" "prebuild" "latest" "/opt/Kavita" "kavita-linux-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Creating Service"
cat </etc/systemd/system/kavita.service
diff --git a/install/keycloak-install.sh b/install/keycloak-install.sh
index 2616459dc..b36a62c3f 100644
--- a/install/keycloak-install.sh
+++ b/install/keycloak-install.sh
@@ -42,7 +42,7 @@ ExecStart=/opt/keycloak/bin/kc.sh start
ExecStop=/opt/keycloak/bin/kc.sh stop
Restart=always
RestartSec=3
-Environment="JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64"
+Environment="JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-$(arch_resolve)"
Environment="KC_DB=postgres"
Environment="KC_DB_USERNAME=$DB_USER"
Environment="KC_DB_PASSWORD=$DB_PASS"
diff --git a/install/kometa-install.sh b/install/kometa-install.sh
index 135080bc7..b0b2e2e96 100644
--- a/install/kometa-install.sh
+++ b/install/kometa-install.sh
@@ -18,7 +18,8 @@ fetch_and_deploy_gh_release "kometa" "Kometa-Team/Kometa" "tarball"
msg_info "Setup Kometa"
cd /opt/kometa
-$STD uv pip install -r requirements.txt --system
+$STD uv venv /opt/kometa/.venv
+$STD uv pip install -r requirements.txt -p /opt/kometa/.venv/bin/python
mkdir -p config/assets
cp config/config.yml.template config/config.yml
msg_ok "Setup Kometa"
@@ -47,7 +48,7 @@ After=network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/kometa
-ExecStart=/usr/bin/python3 kometa.py
+ExecStart=/opt/kometa/.venv/bin/python kometa.py
Restart=always
RestartSec=30
diff --git a/install/komga-install.sh b/install/komga-install.sh
index 329f9f0a9..7943dbfac 100644
--- a/install/komga-install.sh
+++ b/install/komga-install.sh
@@ -22,7 +22,7 @@ $STD apt -y install \
msg_ok "Installed dependencies"
JAVA_VERSION="23" setup_java
-fetch_and_deploy_gh_release "kepubify" "pgaskin/kepubify" "singlefile" "latest" "/usr/bin" "kepubify-linux-64bit"
+fetch_and_deploy_gh_release "kepubify" "pgaskin/kepubify" "singlefile" "latest" "/usr/bin" "kepubify-linux-$(arch_resolve "64bit" "arm64")"
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga-org" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar"
mv /opt/komga/komga-*.jar /opt/komga/komga.jar
@@ -35,7 +35,7 @@ After=syslog.target network.target
[Service]
Type=simple
WorkingDirectory=/opt/komga/
-Environment=LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
+Environment=LD_LIBRARY_PATH=/usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")
ExecStart=/usr/bin/java --enable-native-access=ALL-UNNAMED -jar -Xmx2g komga.jar
TimeoutStopSec=20
KillMode=process
diff --git a/install/kubo-install.sh b/install/kubo-install.sh
index cc86dae3b..adcd3fae4 100644
--- a/install/kubo-install.sh
+++ b/install/kubo-install.sh
@@ -14,9 +14,10 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-$(arch_resolve).tar.gz"
msg_info "Configuring IPFS"
+export HOME="${HOME:-/root}"
$STD ln -s /usr/local/kubo/ipfs /usr/local/bin/ipfs
$STD ipfs init
ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
diff --git a/install/lazylibrarian-install.sh b/install/lazylibrarian-install.sh
index a78976ec6..28b72b1d5 100644
--- a/install/lazylibrarian-install.sh
+++ b/install/lazylibrarian-install.sh
@@ -27,16 +27,16 @@ msg_info "Setup Python3"
$STD apt install -y \
pip \
python3-irc
-$STD pip install jaraco.stream
-$STD pip install python-Levenshtein
-$STD pip install soupsieve
-$STD pip install pypdf
+$STD pip install --break-system-packages jaraco.stream
+$STD pip install --break-system-packages python-Levenshtein
+$STD pip install --break-system-packages soupsieve
+$STD pip install --break-system-packages pypdf
msg_ok "Setup Python3"
msg_info "Installing LazyLibrarian"
$STD git clone https://gitlab.com/LazyLibrarian/LazyLibrarian /opt/LazyLibrarian
cd /opt/LazyLibrarian
-$STD pip install .
+$STD pip install --break-system-packages .
msg_ok "Installed LazyLibrarian"
msg_info "Creating Service"
diff --git a/install/librenms-install.sh b/install/librenms-install.sh
index 9fa2a0f27..b50472227 100644
--- a/install/librenms-install.sh
+++ b/install/librenms-install.sh
@@ -17,6 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y \
acl \
fping \
+ git \
graphviz \
imagemagick \
mtr-tiny \
@@ -64,6 +65,16 @@ EOF
chown -R librenms:librenms /opt/librenms
chmod 771 /opt/librenms
chmod -R ug=rwX /opt/librenms/bootstrap/cache /opt/librenms/storage /opt/librenms/logs /opt/librenms/rrd
+if [[ ! -d /opt/librenms/.git ]]; then
+ LIBRENMS_VERSION=$(cat ~/.librenms 2>/dev/null)
+ cd /opt/librenms
+ git init -q
+ git remote add origin https://github.com/librenms/librenms.git
+ git fetch --depth 1 origin "refs/tags/v${LIBRENMS_VERSION}" 2>/dev/null ||
+ git fetch --depth 1 origin "refs/tags/${LIBRENMS_VERSION}" 2>/dev/null || true
+ git checkout -qf FETCH_HEAD 2>/dev/null || true
+ chown -R librenms:librenms .git
+fi
msg_ok "Configured LibreNMS"
msg_info "Configure MariaDB"
diff --git a/install/librespeed-rust-install.sh b/install/librespeed-rust-install.sh
index 31e74037e..e05418822 100644
--- a/install/librespeed-rust-install.sh
+++ b/install/librespeed-rust-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-x86_64-unknown-linux-gnu.deb"
+fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.deb"
msg_info "Enabling Service"
systemctl enable -q --now speedtest_rs
diff --git a/install/lidarr-install.sh b/install/lidarr-install.sh
index 85f0073ec..83bc66ac1 100644
--- a/install/lidarr-install.sh
+++ b/install/lidarr-install.sh
@@ -17,10 +17,11 @@ msg_info "Installing Dependencies"
$STD apt install -y \
sqlite3 \
libchromaprint-tools \
+ libicu-dev \
mediainfo
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-x64.tar.gz"
+fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Configuring Lidarr"
mkdir -p /var/lib/lidarr/
diff --git a/install/linkding-install.sh b/install/linkding-install.sh
index 88ed1d433..9ab3e8e94 100644
--- a/install/linkding-install.sh
+++ b/install/linkding-install.sh
@@ -33,7 +33,7 @@ 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
+ln -sf /usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")/mod_icu.so /opt/linkding/libicu.so
msg_ok "Built Frontend"
msg_info "Setting up LinkDing"
diff --git a/install/linkwarden-install.sh b/install/linkwarden-install.sh
index 8c4f6f664..93d9ab841 100644
--- a/install/linkwarden-install.sh
+++ b/install/linkwarden-install.sh
@@ -19,7 +19,7 @@ $STD apt install -y \
build-essential
msg_ok "Installed Dependencies"
-NODE_VERSION="22" setup_nodejs
+NODE_VERSION="22" NODE_MODULE="corepack" setup_nodejs
PG_VERSION="16" setup_postgresql
RUST_CRATES="monolith" setup_rust
PG_DB_NAME="linkwardendb" PG_DB_USER="linkwarden" setup_postgresql_db
@@ -44,7 +44,7 @@ if [[ -f package.json ]]; then
fi
fi
if command -v corepack >/dev/null 2>&1; then
- $STD corepack enable
+
$STD corepack prepare "yarn@${yarn_ver}" --activate || true
fi
$STD yarn
diff --git a/install/listmonk-install.sh b/install/listmonk-install.sh
index 14bb4ebad..22c42a96c 100644
--- a/install/listmonk-install.sh
+++ b/install/listmonk-install.sh
@@ -29,7 +29,7 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMP
} >>~/listmonk.creds
msg_ok "Configured PostgreSQL"
-fetch_and_deploy_gh_release "listmonk" "knadh/listmonk" "prebuild" "latest" "/opt/listmonk" "listmonk*linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "listmonk" "knadh/listmonk" "prebuild" "latest" "/opt/listmonk" "listmonk*linux_$(arch_resolve).tar.gz"
msg_info "Configuring listmonk"
mkdir -p /opt/listmonk/uploads
diff --git a/install/lyrionmusicserver-install.sh b/install/lyrionmusicserver-install.sh
index a348c9fbb..b12f55c06 100644
--- a/install/lyrionmusicserver-install.sh
+++ b/install/lyrionmusicserver-install.sh
@@ -14,9 +14,10 @@ network_check
update_os
msg_info "Setup Lyrion Music Server"
-DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP ']*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
-RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
-DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
+DEB_ARCH=$(arch_resolve "amd64" "arm")
+DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP "]*href=\"\K[^\"]*${DEB_ARCH}\.deb(?=\"[^>]*>)" | head -n 1)
+RELEASE=$(echo "$DEB_URL" | grep -oP "lyrionmusicserver_\K[0-9.]+(?=_${DEB_ARCH}\.deb)")
+DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_${DEB_ARCH}.deb"
curl_with_retry "$DEB_URL" "$DEB_FILE"
$STD apt install "$DEB_FILE" -y
rm -f "$DEB_FILE"
diff --git a/install/mail-archiver-install.sh b/install/mail-archiver-install.sh
index 24fb81061..d4dfc839c 100644
--- a/install/mail-archiver-install.sh
+++ b/install/mail-archiver-install.sh
@@ -22,8 +22,14 @@ setup_deb822_repo \
"main"
$STD apt install -y \
dotnet-sdk-10.0 \
- aspnetcore-runtime-8.0 \
libgssapi-krb5-2
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
+ $STD bash /tmp/dotnet-install.sh --channel 8.0 --runtime aspnetcore --install-dir /usr/lib/dotnet
+ rm -f /tmp/dotnet-install.sh
+else
+ $STD apt install -y aspnetcore-runtime-8.0
+fi
msg_ok "Installed Dependencies"
PG_VERSION="17" setup_postgresql
diff --git a/install/manyfold-install.sh b/install/manyfold-install.sh
index 7007fa74d..dfc43b49e 100644
--- a/install/manyfold-install.sh
+++ b/install/manyfold-install.sh
@@ -27,7 +27,7 @@ msg_ok "Installed Dependencies"
setup_imagemagick
PG_VERSION="16" setup_postgresql
PG_DB_NAME="manyfold" PG_DB_USER="manyfold" setup_postgresql_db
-NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs
fetch_and_deploy_gh_release "manyfold" "manyfold3d/manyfold" "tarball" "latest" "/opt/manyfold/app"
@@ -66,7 +66,7 @@ gem install bundler
bundle install
gem install sidekiq
gem install foreman
-corepack enable yarn
+
rm -f /opt/manyfold/app/config/credentials.yml.enc
corepack prepare $YARN_VERSION --activate
corepack use $YARN_VERSION
@@ -81,7 +81,7 @@ msg_ok "Configured Manyfold"
msg_info "Installing Manyfold"
chown -R manyfold:manyfold {/home/manyfold,/opt/manyfold}
chmod +x /opt/manyfold/user_setup.sh
-$STD npm install --global corepack
+
$STD sudo -u manyfold bash /opt/manyfold/user_setup.sh
rm -f /opt/manyfold/user_setup.sh
msg_ok "Installed Manyfold"
diff --git a/install/matter-server-install.sh b/install/matter-server-install.sh
index 4fff7775d..acedc4eb3 100644
--- a/install/matter-server-install.sh
+++ b/install/matter-server-install.sh
@@ -39,7 +39,7 @@ $STD uv pip install --python /opt/matter-server/.venv/bin/python "python-matter-
echo "${MATTER_VERSION}" >~/.matter-server
msg_ok "Set up Matter Server"
-fetch_and_deploy_gh_release "chip-ota-provider-app" "home-assistant-libs/matter-linux-ota-provider" "singlefile" "latest" "/usr/local/bin" "chip-ota-provider-app-x86-64"
+fetch_and_deploy_gh_release "chip-ota-provider-app" "home-assistant-libs/matter-linux-ota-provider" "singlefile" "latest" "/usr/local/bin" "chip-ota-provider-app-$(arch_resolve "x86-64" "aarch64")"
msg_info "Configuring Network"
cat </etc/sysctl.d/99-matter.conf
diff --git a/install/mediamtx-install.sh b/install/mediamtx-install.sh
index a657aa03e..0fcf7f910 100644
--- a/install/mediamtx-install.sh
+++ b/install/mediamtx-install.sh
@@ -18,7 +18,7 @@ msg_info "Installing Dependencies"
$STD apt install -y ffmpeg
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "mediamtx" "bluenviron/mediamtx" "prebuild" "latest" "/opt/mediamtx" "mediamtx*linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "mediamtx" "bluenviron/mediamtx" "prebuild" "latest" "/opt/mediamtx" "mediamtx*linux_$(arch_resolve).tar.gz"
msg_info "Creating Service"
cat </etc/systemd/system/mediamtx.service
diff --git a/install/memos-install.sh b/install/memos-install.sh
index f95530327..704865d6f 100644
--- a/install/memos-install.sh
+++ b/install/memos-install.sh
@@ -14,7 +14,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_$(arch_resolve).tar.gz"
mkdir -p /opt/memos_data
msg_info "Creating Service"
diff --git a/install/metube-install.sh b/install/metube-install.sh
index 734cf583c..ee4a6247b 100644
--- a/install/metube-install.sh
+++ b/install/metube-install.sh
@@ -23,7 +23,7 @@ $STD apt install -y \
msg_ok "Installed Dependencies"
PYTHON_VERSION="3.13" setup_uv
-NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs
msg_info "Installing Deno"
export DENO_INSTALL="/usr/local"
@@ -38,7 +38,7 @@ fetch_and_deploy_gh_release "metube" "alexta69/metube" "tarball" "latest"
msg_info "Installing MeTube"
cd /opt/metube/ui
if command -v corepack >/dev/null 2>&1; then
- $STD corepack enable
+
$STD corepack prepare pnpm --activate || true
fi
echo 'onlyBuiltDependencies=*' >> .npmrc
diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh
index d9d5071bd..629c6a6ce 100644
--- a/install/minthcm-install.sh
+++ b/install/minthcm-install.sh
@@ -13,6 +13,10 @@ setting_up_container
network_check
update_os
+msg_info "Installing Dependencies"
+$STD apt install -y cron
+msg_ok "Installed Dependencies"
+
PHP_VERSION="8.2"
PHP_APACHE="YES" PHP_MODULE="mysql,redis" PHP_FPM="YES" setup_php
setup_composer
diff --git a/install/mongodb-install.sh b/install/mongodb-install.sh
index 2ac811ce4..4c9d34f03 100644
--- a/install/mongodb-install.sh
+++ b/install/mongodb-install.sh
@@ -13,11 +13,15 @@ setting_up_container
network_check
update_os
-read -p "${TAB3}Do you want to install MongoDB 8.0 instead of 7.0? [y/N]: " install_mongodb_8
-if [[ "$install_mongodb_8" =~ ^[Yy]$ ]]; then
+if [[ "$(arch_resolve)" == "arm64" ]]; then
MONGO_VERSION="8.0" setup_mongodb
else
- MONGO_VERSION="7.0" setup_mongodb
+ read -p "${TAB3}Do you want to install MongoDB 8.0 instead of 7.0? [y/N]: " install_mongodb_8
+ if [[ "$install_mongodb_8" =~ ^[Yy]$ ]]; then
+ MONGO_VERSION="8.0" setup_mongodb
+ else
+ MONGO_VERSION="7.0" setup_mongodb
+ fi
fi
sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf
diff --git a/install/nextpvr-install.sh b/install/nextpvr-install.sh
index ec77f2cbc..5fe143618 100644
--- a/install/nextpvr-install.sh
+++ b/install/nextpvr-install.sh
@@ -25,6 +25,7 @@ $STD apt install -y \
libdvbv5-0 \
dtv-scan-tables \
libc6-dev \
+ libicu-dev \
ffmpeg
msg_ok "Installed Dependencies"
diff --git a/install/nginx-ui-install.sh b/install/nginx-ui-install.sh
index 194322fdb..7ddfc2b57 100644
--- a/install/nginx-ui-install.sh
+++ b/install/nginx-ui-install.sh
@@ -19,7 +19,7 @@ $STD apt install -y \
logrotate
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "nginx-ui" "0xJacky/nginx-ui" "prebuild" "latest" "/opt/nginx-ui" "nginx-ui-linux-64.tar.gz"
+fetch_and_deploy_gh_release "nginx-ui" "0xJacky/nginx-ui" "prebuild" "latest" "/opt/nginx-ui" "nginx-ui-linux-$(arch_resolve "64" "arm64-v8a").tar.gz"
msg_info "Installing Nginx UI"
cp /opt/nginx-ui/nginx-ui /usr/local/bin/nginx-ui
diff --git a/install/nocodb-install.sh b/install/nocodb-install.sh
index 81e31e7d8..7ac0a98ce 100644
--- a/install/nocodb-install.sh
+++ b/install/nocodb-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-x64"
+fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-$(arch_resolve "x64" "arm64")"
msg_info "Creating Service"
cat </etc/systemd/system/nocodb.service
diff --git a/install/npmplus-install.sh b/install/npmplus-install.sh
index 64f04dae9..7424d5d5e 100644
--- a/install/npmplus-install.sh
+++ b/install/npmplus-install.sh
@@ -31,7 +31,7 @@ get_latest_release() {
DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose")
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
-curl -fsSL https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_LATEST_VERSION/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
+curl -fsSL https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_LATEST_VERSION/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
msg_ok "Installed Docker & Compose"
diff --git a/install/nxwitness-install.sh b/install/nxwitness-install.sh
index ff5a5e734..6c5d479fe 100644
--- a/install/nxwitness-install.sh
+++ b/install/nxwitness-install.sh
@@ -30,11 +30,11 @@ cd /tmp
BASE_URL="https://updates.networkoptix.com/default/index.html"
RELEASE=$(curl -fsSL "$BASE_URL" | grep -oP '(?<=)[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?=)' | head -n 1)
DETAIL_PAGE=$(curl -fsSL "$BASE_URL#note_$RELEASE")
-DOWNLOAD_URL=$(echo "$DETAIL_PAGE" | grep -oP "https://updates.networkoptix.com/default/$RELEASE/linux/nxwitness-server-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-linux_x64\.deb" | head -n 1)
-curl -fsSL "$DOWNLOAD_URL" -o ""nxwitness-server-$RELEASE-linux_x64.deb""
+DOWNLOAD_URL=$(echo "$DETAIL_PAGE" | grep -oP "https://updates.networkoptix.com/default/$RELEASE/$(arch_resolve "linux" "arm")/nxwitness-server-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-linux_$(arch_resolve "x64" "arm64")\.deb" | head -n 1)
+curl -fsSL "$DOWNLOAD_URL" -o ""nxwitness-server-$RELEASE-linux_$(arch_resolve "x64" "arm64").deb""
export DEBIAN_FRONTEND=noninteractive
-$STD dpkg -i nxwitness-server-$RELEASE-linux_x64.deb
-rm -f /tmp/nxwitness-server-$RELEASE-linux_x64.deb
+$STD dpkg -i nxwitness-server-$RELEASE-linux_$(arch_resolve "x64" "arm64").deb
+rm -f /tmp/nxwitness-server-$RELEASE-linux_$(arch_resolve "x64" "arm64").deb
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Setup Nx Witness"
diff --git a/install/oauth2-proxy-install.sh b/install/oauth2-proxy-install.sh
index 15312fa68..51ecaaf60 100644
--- a/install/oauth2-proxy-install.sh
+++ b/install/oauth2-proxy-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "oauth2-proxy" "oauth2-proxy/oauth2-proxy" "prebuild" "latest" "/opt/oauth2-proxy" "oauth2-proxy*linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "oauth2-proxy" "oauth2-proxy/oauth2-proxy" "prebuild" "latest" "/opt/oauth2-proxy" "oauth2-proxy*linux-$(arch_resolve).tar.gz"
touch /opt/oauth2-proxy/config.toml
msg_info "Creating Service"
diff --git a/install/ollama-install.sh b/install/ollama-install.sh
index 52f69856b..d7174e887 100644
--- a/install/ollama-install.sh
+++ b/install/ollama-install.sh
@@ -20,6 +20,7 @@ $STD apt install -y \
zstd
msg_ok "Installed Dependencies"
+if [[ "$(arch_resolve)" == "amd64" ]]; then
msg_info "Setting up IntelÂŽ Repositories"
mkdir -p /usr/share/keyrings
curl -fsSL https://repositories.intel.com/gpu/intel-graphics.key | gpg --dearmor -o /usr/share/keyrings/intel-graphics.gpg 2>/dev/null || true
@@ -60,12 +61,13 @@ msg_ok "Installed IntelÂŽ Level Zero"
msg_info "Installing IntelÂŽ oneAPI Base Toolkit (Patience)"
$STD apt install -y --no-install-recommends intel-basekit-2024.1
msg_ok "Installed IntelÂŽ oneAPI Base Toolkit"
+fi
msg_info "Installing Ollama (Patience)"
OLLAMA_INSTALL_DIR="/usr/local/lib/ollama"
BINDIR="/usr/local/bin"
mkdir -p "$OLLAMA_INSTALL_DIR"
-if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "$OLLAMA_INSTALL_DIR" "ollama-linux-amd64.tar.zst"; then
+if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "$OLLAMA_INSTALL_DIR" "ollama-linux-$(arch_resolve).tar.zst"; then
msg_error "Failed to download or deploy Ollama â check network connectivity and GitHub API availability"
exit 250
fi
diff --git a/install/omada-install.sh b/install/omada-install.sh
index bfc51e092..64203e155 100644
--- a/install/omada-install.sh
+++ b/install/omada-install.sh
@@ -19,7 +19,7 @@ msg_ok "Installed Dependencies"
JAVA_VERSION="21" setup_java
-if lscpu | grep -q 'avx'; then
+if [[ "$(arch_resolve)" == "arm64" ]] || lscpu | grep -q 'avx'; then
MONGO_VERSION="8.0" setup_mongodb
else
msg_error "No AVX detected (CPU-Flag)! We have discontinued support for this. You are welcome to try it manually with a Debian LXC, but due to the many issues with Omada, we currently only support AVX CPUs."
@@ -28,7 +28,7 @@ fi
if ! dpkg -l | grep -q 'libssl1.1'; then
msg_info "Installing libssl (if needed)"
- curl_download "/tmp/libssl.deb" "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u5_amd64.deb"
+ curl_download "/tmp/libssl.deb" "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u8_$(arch_resolve).deb"
$STD dpkg -i /tmp/libssl.deb
rm -f /tmp/libssl.deb
msg_ok "Installed libssl1.1"
diff --git a/install/ombi-install.sh b/install/ombi-install.sh
index 96f6135e5..c0a6449a6 100644
--- a/install/ombi-install.sh
+++ b/install/ombi-install.sh
@@ -13,7 +13,11 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "ombi" "Ombi-app/Ombi" "prebuild" "latest" "/opt/ombi" "linux-x64.tar.gz"
+msg_info "Installing Dependencies"
+$STD apt install -y libicu-dev
+msg_ok "Installed Dependencies"
+
+fetch_and_deploy_gh_release "ombi" "Ombi-app/Ombi" "prebuild" "latest" "/opt/ombi" "linux-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Creating Service"
cat </etc/systemd/system/ombi.service
diff --git a/install/opencloud-install.sh b/install/opencloud-install.sh
index f91185ece..807dd2e75 100644
--- a/install/opencloud-install.sh
+++ b/install/opencloud-install.sh
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
echo "$COOLPASS" >~/.coolpass
msg_ok "Installed Collabora Online"
-fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.0.0" "/usr/bin" "opencloud-*-linux-amd64"
+fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.0.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)"
mv /usr/bin/OpenCloud /usr/bin/opencloud
msg_info "Configuring OpenCloud"
diff --git a/install/opengist-install.sh b/install/opengist-install.sh
index ae7496bd9..814d1c2d9 100644
--- a/install/opengist-install.sh
+++ b/install/opengist-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y git
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-$(arch_resolve).tar.gz"
mkdir -p /opt/opengist-data
sed -i 's|opengist-home:.*|opengist-home: /opt/opengist-data|' /opt/opengist/config.yml
diff --git a/install/openobserve-install.sh b/install/openobserve-install.sh
index 1057ff629..84c1a79c8 100644
--- a/install/openobserve-install.sh
+++ b/install/openobserve-install.sh
@@ -16,7 +16,7 @@ update_os
msg_info "Installing OpenObserve"
mkdir -p /opt/openobserve/data
RELEASE=$(get_latest_github_release "openobserve/openobserve")
-tar zxf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/v$RELEASE/openobserve-v$RELEASE-linux-amd64.tar.gz) -C /opt/openobserve
+tar zxf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/v$RELEASE/openobserve-v$RELEASE-linux-$(arch_resolve).tar.gz) -C /opt/openobserve
ROOT_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c9)Aa1!"
cat </opt/openobserve/data/.env
diff --git a/install/openwebui-install.sh b/install/openwebui-install.sh
index 874cd1211..4b82715a1 100644
--- a/install/openwebui-install.sh
+++ b/install/openwebui-install.sh
@@ -31,6 +31,7 @@ msg_ok "Installed Open WebUI"
read -r -p "${TAB3}Would you like to add Ollama? " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
+ if [[ "$(arch_resolve)" == "amd64" ]]; then
msg_info "Setting up IntelÂŽ Repositories"
mkdir -p /usr/share/keyrings
curl -fsSL https://repositories.intel.com/gpu/intel-graphics.key | gpg --dearmor -o /usr/share/keyrings/intel-graphics.gpg 2>/dev/null || true
@@ -71,9 +72,10 @@ EOF
msg_info "Installing IntelÂŽ oneAPI Base Toolkit (Patience)"
$STD apt install -y --no-install-recommends intel-basekit-2024.1 2>/dev/null || true
msg_ok "Installed IntelÂŽ oneAPI Base Toolkit"
+ fi
msg_info "Installing Ollama"
- if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "/usr/lib/ollama" "ollama-linux-amd64.tar.zst"; then
+ if ! fetch_and_deploy_gh_release "ollama-com" "ollama/ollama" "prebuild" "latest" "/usr/lib/ollama" "ollama-linux-$(arch_resolve).tar.zst"; then
msg_error "Failed to download or deploy Ollama â check network connectivity and GitHub API availability"
else
ln -sf /usr/lib/ollama/bin/ollama /usr/bin/ollama
diff --git a/install/ots-install.sh b/install/ots-install.sh
index ddad7d671..e6f1dff2e 100644
--- a/install/ots-install.sh
+++ b/install/ots-install.sh
@@ -19,7 +19,7 @@ $STD apt install -y \
nginx
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
+fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_$(arch_resolve).tgz"
create_self_signed_cert
msg_info "Setup OTS"
diff --git a/install/outline-install.sh b/install/outline-install.sh
index 9bacffe8f..222fdd016 100644
--- a/install/outline-install.sh
+++ b/install/outline-install.sh
@@ -20,7 +20,7 @@ $STD apt install -y \
redis
msg_ok "Installed Dependencies"
-NODE_VERSION="24" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
PG_VERSION="16" setup_postgresql
PG_DB_NAME="outline" PG_DB_USER="outline" setup_postgresql_db
@@ -39,7 +39,7 @@ sed -i "5s#URL=#URL=http://${LOCAL_IP}#g" /opt/outline/.env
sed -i 's/FORCE_HTTPS=true/FORCE_HTTPS=false/g' /opt/outline/.env
export NODE_OPTIONS="--max-old-space-size=3584"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
-$STD corepack enable
+
$STD yarn install --immutable
export NODE_ENV=production
sed -i 's/NODE_ENV=development/NODE_ENV=production/g' /opt/outline/.env
diff --git a/install/owncast-install.sh b/install/owncast-install.sh
index 32cecf022..3bbc8b6e2 100644
--- a/install/owncast-install.sh
+++ b/install/owncast-install.sh
@@ -19,7 +19,7 @@ msg_info "Installing Dependencies (Patience)"
$STD apt install -y ffmpeg
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "owncast" "owncast/owncast" "prebuild" "latest" "/opt/owncast" "owncast*linux-64bit.zip"
+fetch_and_deploy_gh_release "owncast" "owncast/owncast" "prebuild" "latest" "/opt/owncast" "owncast*linux-$(arch_resolve "64bit" "arm64").zip"
msg_info "Creating Service"
cat </etc/systemd/system/owncast.service
diff --git a/install/pangolin-install.sh b/install/pangolin-install.sh
index fb15fb015..ab3fc5095 100644
--- a/install/pangolin-install.sh
+++ b/install/pangolin-install.sh
@@ -24,8 +24,8 @@ msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.18.4}"
fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
-fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_amd64"
-fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
+fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
read -rp "${TAB3}Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url
read -rp "${TAB3}Enter your email address: " pango_email
diff --git a/install/patchmon-install.sh b/install/patchmon-install.sh
index fddc32394..12b88686f 100644
--- a/install/patchmon-install.sh
+++ b/install/patchmon-install.sh
@@ -21,7 +21,7 @@ PG_VERSION="17" setup_postgresql
PG_DB_NAME="patchmon_db" PG_DB_USER="patchmon_usr" setup_postgresql_db
RELEASE="v2.0.2"
-fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "latest" "/opt/patchmon" "patchmon-server-linux-amd64"
+fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "latest" "/opt/patchmon" "patchmon-server-linux-$(arch_resolve)"
mv /opt/patchmon/PatchMon /opt/patchmon/patchmon-server
msg_info "Configuring PatchMon"
diff --git a/install/paymenter-install.sh b/install/paymenter-install.sh
index fde781ad7..70b281d98 100644
--- a/install/paymenter-install.sh
+++ b/install/paymenter-install.sh
@@ -17,7 +17,8 @@ msg_info "Installing Dependencies"
$STD apt install -y \
git \
nginx \
- redis-server
+ redis-server \
+ cron
msg_ok "Installed Dependencies"
setup_mariadb
diff --git a/install/pelican-panel-install.sh b/install/pelican-panel-install.sh
index 9d3846320..ba4bb8286 100644
--- a/install/pelican-panel-install.sh
+++ b/install/pelican-panel-install.sh
@@ -13,6 +13,10 @@ setting_up_container
network_check
update_os
+msg_info "Installing Dependencies"
+$STD apt install -y cron
+msg_ok "Installed Dependencies"
+
PHP_VERSION="8.4" PHP_APACHE="YES" PHP_FPM="YES" setup_php
setup_composer
setup_mariadb
diff --git a/install/pelican-wings-install.sh b/install/pelican-wings-install.sh
index 7a7674f4d..74fe0e298 100644
--- a/install/pelican-wings-install.sh
+++ b/install/pelican-wings-install.sh
@@ -13,15 +13,9 @@ setting_up_container
network_check
update_os
-msg_info "Installing Docker"
-DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
-mkdir -p "$(dirname $DOCKER_CONFIG_PATH)"
-echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
-$STD sh <(curl -fsSL https://get.docker.com)
-systemctl enable -q --now docker
-msg_ok "Installed Docker"
+setup_docker
-fetch_and_deploy_gh_release "wings" "pelican-dev/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_amd64"
+fetch_and_deploy_gh_release "wings" "pelican-dev/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_$(arch_resolve)"
mkdir -p /etc/pelican /var/run/wings
msg_info "Creating Service"
diff --git a/install/photoprism-install.sh b/install/photoprism-install.sh
index 1d54199ce..741a20ed1 100644
--- a/install/photoprism-install.sh
+++ b/install/photoprism-install.sh
@@ -34,13 +34,13 @@ echo 'export $(grep -v "^#" /opt/photoprism/config/.env | xargs)' >>~/.bashrc
export PATH=/usr/local:$PATH
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "photoprism" "photoprism/photoprism" "prebuild" "latest" "/opt/photoprism" "*linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "photoprism" "photoprism/photoprism" "prebuild" "latest" "/opt/photoprism" "*linux-$(arch_resolve).tar.gz"
msg_info "Installing PhotoPrism (Patience)"
mkdir -p /opt/photoprism/{cache,config,photos,storage,temp}
mkdir -p /opt/photoprism/photos/{originals,import}
mkdir -p /opt/photoprism_backups
-LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-bookworm-amd64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1)
+LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-bookworm-$(arch_resolve)-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1)
curl -fsSL "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" -o /tmp/libheif.tar.gz
tar -xzf /tmp/libheif.tar.gz -C /usr/local
ldconfig
diff --git a/install/pialert-install.sh b/install/pialert-install.sh
index 4be4eb9e2..58e60c38e 100644
--- a/install/pialert-install.sh
+++ b/install/pialert-install.sh
@@ -30,7 +30,8 @@ $STD apt -y install \
wakeonlan \
fping \
zip \
- libtext-csv-perl
+ libtext-csv-perl \
+ cron
msg_ok "Installed Dependencies"
msg_info "Installing PHP Dependencies"
diff --git a/install/plane-install.sh b/install/plane-install.sh
new file mode 100644
index 000000000..e5fa04712
--- /dev/null
+++ b/install/plane-install.sh
@@ -0,0 +1,386 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: onionrings29
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://plane.so
+
+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 \
+ build-essential \
+ libpq-dev \
+ libxml2-dev \
+ libxslt1-dev \
+ libxmlsec1-dev \
+ libxmlsec1-openssl \
+ pkg-config \
+ python3-dev \
+ python3-venv \
+ redis-server \
+ erlang-base \
+ erlang-{asn1,crypto,eldap,ftp,inets,mnesia,os-mon,parsetools} \
+ erlang-{public-key,runtime-tools,snmp,ssl,syntax-tools,tftp,tools,xmerl} \
+ rabbitmq-server
+msg_ok "Installed Dependencies"
+
+NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
+PG_VERSION="16" setup_postgresql
+PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db
+
+msg_info "Configuring RabbitMQ"
+RABBITMQ_PASS=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c16)
+$STD rabbitmqctl add_vhost plane
+$STD rabbitmqctl add_user plane "${RABBITMQ_PASS}"
+$STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*"
+msg_ok "Configured RabbitMQ"
+
+msg_info "Installing MinIO"
+curl -fsSL https://dl.min.io/server/minio/release/linux-$(arch_resolve)/minio -o /usr/local/bin/minio
+chmod +x /usr/local/bin/minio
+mkdir -p /opt/minio/data
+MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16)
+MINIO_SECRET_KEY=$(openssl rand -base64 36 | tr -dc 'a-zA-Z0-9' | head -c32)
+cat </etc/default/minio
+MINIO_ROOT_USER="${MINIO_ACCESS_KEY}"
+MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}"
+MINIO_VOLUMES="/opt/minio/data"
+EOF
+cat </etc/systemd/system/minio.service
+[Unit]
+Description=MinIO Object Storage
+After=network.target
+
+[Service]
+Type=simple
+EnvironmentFile=/etc/default/minio
+ExecStart=/usr/local/bin/minio server \$MINIO_VOLUMES --console-address ":9090"
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now minio
+msg_ok "Installed MinIO"
+
+fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball"
+
+msg_info "Building Frontend Apps (Patience)"
+cd /opt/plane
+FRONTEND_ENV="VITE_API_BASE_URL=http://${LOCAL_IP}
+VITE_WEB_BASE_URL=http://${LOCAL_IP}
+VITE_ADMIN_BASE_URL=http://${LOCAL_IP}
+VITE_ADMIN_BASE_PATH=/god-mode
+VITE_SPACE_BASE_URL=http://${LOCAL_IP}
+VITE_SPACE_BASE_PATH=/spaces
+VITE_LIVE_BASE_URL=http://${LOCAL_IP}
+VITE_LIVE_BASE_PATH=/live"
+# Each Vite app needs its own .env for the build
+for app in web admin space; do
+ echo "$FRONTEND_ENV" >/opt/plane/apps/${app}/.env
+done
+export NODE_OPTIONS="--max-old-space-size=4096"
+export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
+
+$STD pnpm install --frozen-lockfile
+$STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live
+msg_ok "Built Frontend Apps"
+
+msg_info "Setting up Python API"
+setup_uv
+$STD uv venv /opt/plane-venv
+export VIRTUAL_ENV=/opt/plane-venv
+$STD uv pip install -r /opt/plane/apps/api/requirements/production.txt
+msg_ok "Set up Python API"
+
+msg_info "Configuring Plane"
+SECRET_KEY=$(openssl rand -hex 32)
+MACHINE_SIG=$(echo -n "$(hostname)-$(date +%s)" | sha256sum | head -c64)
+LIVE_SECRET=$(openssl rand -hex 16)
+cat </opt/plane/apps/api/.env
+DEBUG=0
+CORS_ALLOWED_ORIGINS=http://${LOCAL_IP}
+
+POSTGRES_USER=plane
+POSTGRES_PASSWORD=${PG_DB_PASS}
+POSTGRES_HOST=localhost
+POSTGRES_DB=plane
+POSTGRES_PORT=5432
+DATABASE_URL=postgresql://plane:${PG_DB_PASS}@localhost:5432/plane
+
+REDIS_HOST=localhost
+REDIS_PORT=6379
+REDIS_URL=redis://localhost:6379/
+
+RABBITMQ_HOST=localhost
+RABBITMQ_PORT=5672
+RABBITMQ_USER=plane
+RABBITMQ_PASSWORD=${RABBITMQ_PASS}
+RABBITMQ_VHOST=plane
+AMQP_URL=amqp://plane:${RABBITMQ_PASS}@localhost:5672/plane
+
+AWS_REGION=us-east-1
+AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY}
+AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY}
+AWS_S3_ENDPOINT_URL=http://localhost:9000
+AWS_S3_BUCKET_NAME=uploads
+FILE_SIZE_LIMIT=104857600
+
+USE_MINIO=1
+MINIO_ENDPOINT_SSL=0
+SECRET_KEY=${SECRET_KEY}
+MACHINE_SIGNATURE=${MACHINE_SIG}
+
+WEB_URL=http://${LOCAL_IP}
+ADMIN_BASE_URL=http://${LOCAL_IP}
+ADMIN_BASE_PATH=/god-mode
+SPACE_BASE_URL=http://${LOCAL_IP}
+SPACE_BASE_PATH=/spaces
+APP_BASE_URL=http://${LOCAL_IP}
+APP_BASE_PATH=
+LIVE_BASE_URL=http://${LOCAL_IP}
+LIVE_BASE_PATH=/live
+
+GUNICORN_WORKERS=2
+LIVE_SERVER_SECRET_KEY=${LIVE_SECRET}
+API_KEY_RATE_LIMIT=60/minute
+EOF
+cat </opt/plane/.env
+API_BASE_URL=http://localhost:8000
+LIVE_SERVER_SECRET_KEY=${LIVE_SECRET}
+REDIS_HOST=localhost
+REDIS_PORT=6379
+REDIS_URL=redis://localhost:6379/
+PORT=3100
+EOF
+msg_ok "Configured Plane"
+
+msg_info "Running Database Migrations"
+cd /opt/plane/apps/api
+set -a
+source /opt/plane/apps/api/.env
+set +a
+$STD /opt/plane-venv/bin/python manage.py migrate
+$STD /opt/plane-venv/bin/python manage.py collectstatic --noinput
+$STD /opt/plane-venv/bin/python manage.py configure_instance
+$STD /opt/plane-venv/bin/python manage.py register_instance "${MACHINE_SIG}"
+msg_ok "Ran Database Migrations"
+
+msg_info "Creating Services and MinIO Bucket"
+curl -fsSL https://dl.min.io/client/mc/release/linux-$(arch_resolve)/mc -o /usr/local/bin/mcli
+chmod +x /usr/local/bin/mcli
+$STD /usr/local/bin/mcli alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}"
+$STD /usr/local/bin/mcli mb plane/uploads --ignore-existing
+$STD /usr/local/bin/mcli anonymous set download plane/uploads
+
+cat </etc/systemd/system/plane-api.service
+[Unit]
+Description=Plane API
+After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/plane/apps/api
+EnvironmentFile=/opt/plane/apps/api/.env
+ExecStart=/opt/plane-venv/bin/gunicorn -w 2 -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:8000 --max-requests 1200 --max-requests-jitter 1000 --access-logfile -
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/plane-worker.service
+[Unit]
+Description=Plane Celery Worker
+After=plane-api.service
+Requires=plane-api.service
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/plane/apps/api
+EnvironmentFile=/opt/plane/apps/api/.env
+ExecStart=/opt/plane-venv/bin/celery -A plane worker -l info
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/plane-beat.service
+[Unit]
+Description=Plane Celery Beat
+After=plane-api.service
+Requires=plane-api.service
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/plane/apps/api
+EnvironmentFile=/opt/plane/apps/api/.env
+ExecStart=/opt/plane-venv/bin/celery -A plane beat -l info
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/plane-live.service
+[Unit]
+Description=Plane Live Server
+After=network.target
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/plane
+EnvironmentFile=/opt/plane/.env
+ExecStart=/usr/bin/node apps/live/dist/start.mjs
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/plane-space.service
+[Unit]
+Description=Plane Space Server
+After=network.target
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/plane/apps/space
+Environment=PORT=3002
+Environment=NODE_ENV=production
+ExecStart=/opt/plane/apps/space/node_modules/.bin/react-router-serve ./build/server/index.js
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl daemon-reload
+systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-space
+{
+ echo "RabbitMQ User: plane"
+ echo "RabbitMQ Password: ${RABBITMQ_PASS}"
+ echo "MinIO Access Key: ${MINIO_ACCESS_KEY}"
+ echo "MinIO Secret Key: ${MINIO_SECRET_KEY}"
+ echo "Secret Key: ${SECRET_KEY}"
+ echo "Config: /opt/plane/apps/api/.env"
+} >>~/plane.creds
+msg_ok "Created Services and MinIO Bucket"
+
+msg_info "Configuring Nginx"
+cat <<'EOF' >/etc/nginx/sites-available/plane.conf
+upstream plane-api {
+ server 127.0.0.1:8000;
+}
+
+upstream plane-live {
+ server 127.0.0.1:3100;
+}
+
+upstream plane-space {
+ server 127.0.0.1:3002;
+}
+
+upstream plane-minio {
+ server 127.0.0.1:9000;
+}
+
+server {
+ listen 80 default_server;
+ server_name _;
+ client_max_body_size 100M;
+
+ location /api/ {
+ proxy_pass http://plane-api;
+ 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;
+ }
+
+ location /auth/ {
+ proxy_pass http://plane-api;
+ 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;
+ }
+
+ location /static/ {
+ alias /opt/plane/apps/api/plane/static-assets/collected-static/;
+ }
+
+ location /live/ {
+ proxy_pass http://plane-live;
+ 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;
+ }
+
+ location = /uploads {
+ proxy_pass http://plane-minio;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /uploads/ {
+ proxy_pass http://plane-minio;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+
+ location /spaces/ {
+ proxy_pass http://plane-space;
+ 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;
+ }
+
+ location /spaces {
+ return 301 /spaces/;
+ }
+
+ location /god-mode/ {
+ alias /opt/plane/apps/admin/build/client/;
+ try_files $uri $uri/ /god-mode/index.html;
+ }
+
+ location /god-mode {
+ return 301 /god-mode/;
+ }
+
+ location / {
+ root /opt/plane/apps/web/build/client;
+ try_files $uri $uri/ /index.html;
+ }
+}
+EOF
+ln -sf /etc/nginx/sites-available/plane.conf /etc/nginx/sites-enabled/plane.conf
+rm -f /etc/nginx/sites-enabled/default
+$STD systemctl reload nginx
+msg_ok "Configured Nginx"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/pocketbase-install.sh b/install/pocketbase-install.sh
index b68cdcf8e..31fd8fdab 100644
--- a/install/pocketbase-install.sh
+++ b/install/pocketbase-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "pocketbase" "pocketbase/pocketbase" "prebuild" "latest" "/opt/pocketbase" "pocketbase*linux_amd64.zip"
+fetch_and_deploy_gh_release "pocketbase" "pocketbase/pocketbase" "prebuild" "latest" "/opt/pocketbase" "pocketbase*linux_$(arch_resolve).zip"
msg_info "Configuring Pocketbase"
mkdir -p /opt/pocketbase/{pb_public,pb_migrations,pb_hooks}
diff --git a/install/pocketid-install.sh b/install/pocketid-install.sh
index 06c33d924..47f945d3b 100644
--- a/install/pocketid-install.sh
+++ b/install/pocketid-install.sh
@@ -14,7 +14,7 @@ network_check
update_os
read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
-fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-amd64"
+fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-$(arch_resolve)"
msg_info "Configuring Pocket ID"
ENCRYPTION_KEY=$(openssl rand -base64 32)
diff --git a/install/postiz-install.sh b/install/postiz-install.sh
new file mode 100644
index 000000000..b5c3efd6f
--- /dev/null
+++ b/install/postiz-install.sh
@@ -0,0 +1,248 @@
+#!/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/gitroomhq/postiz-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 \
+ build-essential \
+ redis-server \
+ nginx
+msg_ok "Installed Dependencies"
+
+PG_VERSION="17" setup_postgresql
+PG_DB_NAME="postiz" PG_DB_USER="postiz" setup_postgresql_db
+NODE_VERSION="24" setup_nodejs
+
+fetch_and_deploy_gh_release "temporal" "temporalio/cli" "prebuild" "latest" "/opt/temporal" "temporal_cli_*_linux_amd64.tar.gz"
+chmod +x /opt/temporal/temporal
+fetch_and_deploy_gh_release "postiz" "gitroomhq/postiz-app" "tarball"
+
+msg_info "Installing pnpm"
+PNPM_VERSION=$(sed -n 's/.*"packageManager":\s*"pnpm@\([^"]*\)".*/\1/p' /opt/postiz/package.json)
+$STD npm install -g "pnpm@${PNPM_VERSION}"
+msg_ok "Installed pnpm"
+
+msg_info "Configuring Application"
+JWT_SECRET=$(openssl rand -base64 32)
+mkdir -p /opt/postiz/uploads
+cat </opt/postiz/.env
+DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}
+REDIS_URL=redis://localhost:6379
+JWT_SECRET=${JWT_SECRET}
+MAIN_URL=http://${LOCAL_IP}
+FRONTEND_URL=http://${LOCAL_IP}
+NEXT_PUBLIC_BACKEND_URL=http://${LOCAL_IP}/api
+BACKEND_INTERNAL_URL=http://localhost:3000
+NOT_SECURED=true
+TEMPORAL_ADDRESS=localhost:7233
+IS_GENERAL=true
+STORAGE_PROVIDER=local
+UPLOAD_DIRECTORY=/opt/postiz/uploads
+NEXT_PUBLIC_UPLOAD_DIRECTORY=/uploads
+NX_ADD_PLUGINS=false
+EOF
+msg_ok "Configured Application"
+
+msg_info "Building Application"
+cd /opt/postiz
+set -a && source /opt/postiz/.env && set +a
+export NODE_OPTIONS="--max-old-space-size=4096"
+$STD pnpm install
+$STD pnpm run build
+unset NODE_OPTIONS
+msg_ok "Built Application"
+
+msg_info "Running Database Migrations"
+cd /opt/postiz
+set -a && source /opt/postiz/.env && set +a
+$STD pnpm run prisma-db-push
+msg_ok "Ran Database Migrations"
+
+msg_info "Creating Services"
+PNPM_BIN="$(command -v pnpm)"
+cat </etc/systemd/system/postiz-temporal.service
+[Unit]
+Description=Temporal Dev Server (Postiz)
+After=network.target
+
+[Service]
+Type=simple
+User=root
+ExecStart=/opt/temporal/temporal server start-dev --db-filename /opt/temporal/temporal.db --log-format json --log-level warn
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/postiz-backend.service
+[Unit]
+Description=Postiz Backend
+After=network.target postgresql.service redis-server.service postiz-temporal.service
+Requires=postgresql.service redis-server.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/postiz
+EnvironmentFile=/opt/postiz/.env
+ExecStart=${PNPM_BIN} run start:prod:backend
+Environment=NODE_OPTIONS=--max-old-space-size=512
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/postiz-frontend.service
+[Unit]
+Description=Postiz Frontend
+After=network.target postiz-backend.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/postiz
+EnvironmentFile=/opt/postiz/.env
+Environment=PORT=4200
+ExecStart=${PNPM_BIN} run start:prod:frontend
+Environment=NODE_OPTIONS=--max-old-space-size=512
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/postiz-orchestrator.service
+[Unit]
+Description=Postiz Orchestrator
+After=network.target postiz-temporal.service postiz-backend.service
+Requires=postiz-temporal.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/postiz
+EnvironmentFile=/opt/postiz/.env
+ExecStart=${PNPM_BIN} run start:prod:orchestrator
+Environment=NODE_OPTIONS=--max-old-space-size=384
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+systemctl enable -q --now redis-server postiz-temporal postiz-backend postiz-frontend postiz-orchestrator
+msg_ok "Created Services"
+
+msg_info "Creating Helper Scripts"
+cat <<'EOF' >/usr/local/bin/postiz-rebuild
+#!/usr/bin/env bash
+echo "=== Postiz Rebuild ==="
+echo "Stopping services..."
+systemctl stop postiz-orchestrator postiz-frontend postiz-backend
+
+cd /opt/postiz
+set -a && source /opt/postiz/.env && set +a
+export NODE_OPTIONS="--max-old-space-size=4096"
+
+echo "Building application (this may take a while)..."
+pnpm run build
+BUILD_RC=$?
+unset NODE_OPTIONS
+
+if [[ $BUILD_RC -ne 0 ]]; then
+ echo "ERROR: Build failed! Check the output above."
+ echo "Starting services with previous build..."
+ systemctl start postiz-backend postiz-frontend postiz-orchestrator
+ exit 1
+fi
+
+echo "Running database migrations..."
+pnpm run prisma-db-push
+
+echo "Starting services..."
+systemctl start postiz-backend postiz-frontend postiz-orchestrator
+echo "=== Rebuild complete ==="
+EOF
+chmod +x /usr/local/bin/postiz-rebuild
+msg_ok "Created Helper Scripts"
+
+msg_info "Configuring Nginx"
+cat </etc/nginx/sites-available/postiz
+server {
+ listen 80 default_server;
+ server_name _;
+
+ client_max_body_size 100M;
+
+ gzip on;
+ gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
+
+ location /api/ {
+ proxy_pass http://127.0.0.1:3000/;
+ 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_set_header Reload \$http_reload;
+ proxy_set_header Onboarding \$http_onboarding;
+ proxy_set_header Activate \$http_activate;
+ proxy_set_header Auth \$http_auth;
+ proxy_set_header Showorg \$http_showorg;
+ proxy_set_header Impersonate \$http_impersonate;
+ proxy_set_header Accept-Language \$http_accept_language;
+ }
+
+ location /uploads/ {
+ alias /opt/postiz/uploads/;
+ }
+
+ location / {
+ proxy_pass http://127.0.0.1:4200/;
+ 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_set_header Reload \$http_reload;
+ proxy_set_header Onboarding \$http_onboarding;
+ proxy_set_header Activate \$http_activate;
+ proxy_set_header Auth \$http_auth;
+ proxy_set_header Showorg \$http_showorg;
+ proxy_set_header Impersonate \$http_impersonate;
+ proxy_set_header Accept-Language \$http_accept_language;
+ proxy_set_header i18next \$http_i18next;
+ }
+}
+EOF
+ln -sf /etc/nginx/sites-available/postiz /etc/nginx/sites-enabled/postiz
+rm -f /etc/nginx/sites-enabled/default
+$STD nginx -t
+systemctl enable -q nginx
+systemctl reload -q nginx
+msg_ok "Configured Nginx"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/prometheus-alertmanager-install.sh b/install/prometheus-alertmanager-install.sh
index b74835782..6189a59e4 100755
--- a/install/prometheus-alertmanager-install.sh
+++ b/install/prometheus-alertmanager-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "alertmanager" "prometheus/alertmanager" "prebuild" "latest" "/usr/local/bin/" "alertmanager*linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "alertmanager" "prometheus/alertmanager" "prebuild" "latest" "/usr/local/bin/" "alertmanager*linux-$(arch_resolve).tar.gz"
msg_info "Configuring Prometheus Alertmanager"
mkdir -p /etc/alertmanager /var/lib/alertmanager
diff --git a/install/prometheus-blackbox-exporter-install.sh b/install/prometheus-blackbox-exporter-install.sh
index 138b0c160..9242838d7 100644
--- a/install/prometheus-blackbox-exporter-install.sh
+++ b/install/prometheus-blackbox-exporter-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "blackbox-exporter" "prometheus/blackbox_exporter" "prebuild" "latest" "/opt/blackbox-exporter" "blackbox_exporter-*.linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "blackbox-exporter" "prometheus/blackbox_exporter" "prebuild" "latest" "/opt/blackbox-exporter" "blackbox_exporter-*.linux-$(arch_resolve).tar.gz"
msg_info "Creating Service"
cat </etc/systemd/system/blackbox-exporter.service
diff --git a/install/prometheus-install.sh b/install/prometheus-install.sh
index 4893e6dc3..3dee5990c 100644
--- a/install/prometheus-install.sh
+++ b/install/prometheus-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "prometheus" "prometheus/prometheus" "prebuild" "latest" "/usr/local/bin" "*linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "prometheus" "prometheus/prometheus" "prebuild" "latest" "/usr/local/bin" "*linux-$(arch_resolve).tar.gz"
msg_info "Installing Prometheus"
mkdir -p /etc/prometheus
diff --git a/install/prowlarr-install.sh b/install/prowlarr-install.sh
index c47bc8ef2..1f6fbf98b 100644
--- a/install/prowlarr-install.sh
+++ b/install/prowlarr-install.sh
@@ -14,10 +14,10 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y sqlite3
+$STD apt install -y sqlite3 libicu-dev
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "prowlarr" "Prowlarr/Prowlarr" "prebuild" "latest" "/opt/Prowlarr" "Prowlarr.master*linux-core-x64.tar.gz"
+fetch_and_deploy_gh_release "prowlarr" "Prowlarr/Prowlarr" "prebuild" "latest" "/opt/Prowlarr" "Prowlarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Configuring Prowlarr"
mkdir -p /var/lib/prowlarr/
diff --git a/install/proxmox-backup-server-install.sh b/install/proxmox-backup-server-install.sh
index 5564500d9..887683d69 100644
--- a/install/proxmox-backup-server-install.sh
+++ b/install/proxmox-backup-server-install.sh
@@ -13,16 +13,30 @@ setting_up_container
network_check
update_os
-msg_info "Installing Proxmox Backup Server"
-setup_deb822_repo \
- "proxmox-backup-server" \
- "https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg" \
- "http://download.proxmox.com/debian/pbs" \
- "trixie" \
- "pbs-no-subscription"
export DEBIAN_FRONTEND=noninteractive
export IFUPDOWN2_NO_IFRELOAD=1
-$STD apt install -y proxmox-backup-server
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ msg_info "Installing Proxmox Backup Server (unofficial arm64 build)"
+ PBS_TMP="$(mktemp -d)"
+ github_api_call "https://api.github.com/repos/wofferl/proxmox-backup-arm64/releases/latest" "$PBS_TMP/release.json"
+ cd "$PBS_TMP"
+ for url in $(jq -r '.assets[].browser_download_url
+ | select(endswith(".deb"))
+ | select(test("dbgsym|client-static|file-restore") | not)' release.json); do
+ curl_with_retry "$url" "$(basename "$url")"
+ done
+ $STD apt install -y ./*.deb
+ rm -rf "$PBS_TMP"
+else
+ msg_info "Installing Proxmox Backup Server"
+ setup_deb822_repo \
+ "proxmox-backup-server" \
+ "https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg" \
+ "http://download.proxmox.com/debian/pbs" \
+ "trixie" \
+ "pbs-no-subscription"
+ $STD apt install -y proxmox-backup-server
+fi
msg_ok "Installed Proxmox Backup Server"
motd_ssh
diff --git a/install/pterodactyl-panel-install.sh b/install/pterodactyl-panel-install.sh
index 42a9b2ce4..7c5d3f8f8 100644
--- a/install/pterodactyl-panel-install.sh
+++ b/install/pterodactyl-panel-install.sh
@@ -18,7 +18,8 @@ $STD apt install -y \
lsb-release \
redis \
apache2 \
- composer
+ composer \
+ cron
msg_ok "Installed Dependencies"
setup_mariadb
diff --git a/install/pterodactyl-wings-install.sh b/install/pterodactyl-wings-install.sh
index 8655726cd..4b9efd112 100644
--- a/install/pterodactyl-wings-install.sh
+++ b/install/pterodactyl-wings-install.sh
@@ -13,15 +13,9 @@ setting_up_container
network_check
update_os
-msg_info "Installing Docker"
-DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
-mkdir -p $(dirname $DOCKER_CONFIG_PATH)
-echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json
-$STD sh <(curl -fsSL https://get.docker.com)
-systemctl enable -q --now docker
-msg_ok "Installed Docker"
+setup_docker
-fetch_and_deploy_gh_release "wings" "pterodactyl/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_amd64"
+fetch_and_deploy_gh_release "wings" "pterodactyl/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_$(arch_resolve)"
mkdir -p /etc/pterodactyl
msg_info "Creating Service"
diff --git a/install/pulse-install.sh b/install/pulse-install.sh
index 54db6fb13..a6847618e 100644
--- a/install/pulse-install.sh
+++ b/install/pulse-install.sh
@@ -29,7 +29,7 @@ else
fi
mkdir -p /etc/pulse
-fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "pulse-v*-linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "pulse-v*-linux-$(arch_resolve).tar.gz"
ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse
chown -R pulse:pulse /etc/pulse /opt/pulse
msg_ok "Installed Pulse"
diff --git a/install/qbittorrent-install.sh b/install/qbittorrent-install.sh
index bd57c2e8e..6f02ae8c4 100644
--- a/install/qbittorrent-install.sh
+++ b/install/qbittorrent-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static" "singlefile" "latest" "/opt/qbittorrent" "x86_64-qbittorrent-nox"
+fetch_and_deploy_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static" "singlefile" "latest" "/opt/qbittorrent" "$(arch_resolve "x86_64" "aarch64")-qbittorrent-nox"
msg_info "Setup qBittorrent-nox"
mv /opt/qbittorrent/qbittorrent /opt/qbittorrent/qbittorrent-nox
diff --git a/install/qdrant-install.sh b/install/qdrant-install.sh
index ede3a9cea..16c0a0894 100644
--- a/install/qdrant-install.sh
+++ b/install/qdrant-install.sh
@@ -13,7 +13,11 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "prebuild" "latest" "/usr/bin" "qdrant-aarch64-unknown-linux-musl.tar.gz"
+else
+ fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
+fi
msg_info "Creating Qdrant Configuration"
mkdir -p /etc/qdrant
diff --git a/install/qui-install.sh b/install/qui-install.sh
index 8e45ed000..7e0d2ca3c 100644
--- a/install/qui-install.sh
+++ b/install/qui-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/usr/local/bin" "qui_*_linux_x86_64.tar.gz"
+fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/usr/local/bin" "qui_*_linux_$(arch_resolve "x86_64" "arm64").tar.gz"
chmod +x /usr/local/bin/qui
ln -sf /usr/local/bin/qui /usr/bin/qui
ln -sf /usr/local/bin/qui /opt/qui
diff --git a/install/radarr-install.sh b/install/radarr-install.sh
index e98eeb05f..d51f8ec03 100644
--- a/install/radarr-install.sh
+++ b/install/radarr-install.sh
@@ -14,10 +14,10 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y sqlite3
+$STD apt install -y sqlite3 libicu-dev
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-x64.tar.gz"
+fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Configuring Radarr"
mkdir -p /var/lib/radarr/
diff --git a/install/rclone-install.sh b/install/rclone-install.sh
index 8087fe601..2ab54de3c 100644
--- a/install/rclone-install.sh
+++ b/install/rclone-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y apache2-utils fuse3
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-amd64.zip"
+fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-$(arch_resolve).zip"
msg_info "Installing rclone"
cd /opt/rclone
diff --git a/install/reactive-resume-install.sh b/install/reactive-resume-install.sh
index 1eb864b0f..35cbee5f2 100644
--- a/install/reactive-resume-install.sh
+++ b/install/reactive-resume-install.sh
@@ -15,7 +15,7 @@ update_os
PG_VERSION="16" setup_postgresql
PG_DB_NAME="reactive_resume" PG_DB_USER="reactive_resume" setup_postgresql_db
-NODE_VERSION="24" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
msg_info "Installing Dependencies"
$STD apt install -y \
@@ -28,7 +28,7 @@ fetch_and_deploy_gh_release "reactive-resume" "amruthpillai/reactive-resume" "ta
msg_info "Building Reactive Resume (Patience)"
cd /opt/reactive-resume
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
-corepack enable
+
corepack prepare --activate
export NODE_ENV="production"
export CI="true"
diff --git a/install/readarr-install.sh b/install/readarr-install.sh
index 42f21ec76..882d0569b 100644
--- a/install/readarr-install.sh
+++ b/install/readarr-install.sh
@@ -14,14 +14,14 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y sqlite3
+$STD apt install -y sqlite3 libicu-dev
msg_ok "Installed Dependencies"
msg_info "Installing Readarr"
mkdir -p /var/lib/readarr/
chmod 775 /var/lib/readarr/
cd /var/lib/readarr/
-$STD curl -fsSL 'https://readarr.servarr.com/v1/update/develop/updatefile?os=linux&runtime=netcore&arch=x64' -o readarr.tar.gz
+$STD curl -fsSL "https://readarr.servarr.com/v1/update/develop/updatefile?os=linux&runtime=netcore&arch=$(arch_resolve "x64" "arm64")" -o readarr.tar.gz
$STD tar -xvzf readarr.tar.gz
mv Readarr /opt
chmod 775 /opt/Readarr
diff --git a/install/readeck-install.sh b/install/readeck-install.sh
index 5b6599bbd..d5fdb42f5 100644
--- a/install/readeck-install.sh
+++ b/install/readeck-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
+fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-$(arch_resolve)"
msg_info "Creating Service"
cat </etc/systemd/system/readeck.service
diff --git a/install/recyclarr-install.sh b/install/recyclarr-install.sh
index 299aca685..e523b38f6 100644
--- a/install/recyclarr-install.sh
+++ b/install/recyclarr-install.sh
@@ -14,10 +14,10 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y git
+$STD apt install -y git libicu-dev cron
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-x64.tar.xz"
+fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-$(arch_resolve "x64" "arm64").tar.xz"
msg_info "Configuring Recyclarr"
mkdir -p /root/.config/recyclarr/{configs,includes}
diff --git a/install/romm-install.sh b/install/romm-install.sh
index 95f591f5d..bf126dea0 100644
--- a/install/romm-install.sh
+++ b/install/romm-install.sh
@@ -37,20 +37,19 @@ $STD apt install -y \
redis-server \
redis-tools \
p7zip-full \
- tzdata \
- nginx
+ tzdata
msg_ok "Installed Dependencies"
-msg_info "Installing Nginx mod_zip module"
+msg_info "Installing Angie with mod_zip module"
setup_deb822_repo \
- "getpagespeed-extras" \
- "https://extras.getpagespeed.com/deb-archive-keyring.gpg" \
- "https://extras.getpagespeed.com/debian" \
+ "angie" \
+ "https://angie.software/keys/angie-signing.gpg" \
+ "https://download.angie.software/angie/debian/$(get_os_info version_id)" \
"$(get_os_info codename)" \
"main"
-$STD apt-get install -y nginx nginx-module-zip
-msg_ok "Installed Nginx mod_zip module"
-
+$STD apt-get install -y angie angie-module-zip
+sed -i '1i load_module modules/ngx_http_zip_module.so;' /etc/angie/angie.conf
+msg_ok "Installed Angie with mod_zip module"
PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="24" setup_nodejs
setup_mariadb
@@ -126,9 +125,13 @@ 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
+if [[ "$(arch_resolve)" != "arm64" ]]; then
+ 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
+else
+ msg_warn "RAHasher (RetroAchievements hashing) has no arm64 build; skipping. RA hash features will be unavailable."
+fi
fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball"
@@ -192,8 +195,8 @@ ln -sfn "$ROMM_BASE"/resources /opt/romm/frontend/dist/assets/romm/resources
ln -sfn "$ROMM_BASE"/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
+msg_info "Configuring Angie"
+cat <<'EOF' >/etc/angie/http.d/romm.conf
upstream romm_backend {
server 127.0.0.1:5000;
}
@@ -263,13 +266,11 @@ server {
}
EOF
-sed -i "s|alias /var/lib/romm/library/;|alias ${ROMM_BASE}/library/;|" /etc/nginx/sites-available/romm
-rm -f /etc/nginx/sites-enabled/default
-rm -f /etc/nginx/conf.d/default.conf
-ln -sf /etc/nginx/sites-available/romm /etc/nginx/sites-enabled/romm
-systemctl restart nginx
-systemctl enable -q --now nginx
-msg_ok "Configured Nginx"
+sed -i "s|alias /var/lib/romm/library/;|alias ${ROMM_BASE}/library/;|" /etc/angie/http.d/romm.conf
+rm -f /etc/angie/http.d/default.conf
+systemctl restart angie
+systemctl enable -q --now angie
+msg_ok "Configured Angie"
msg_info "Creating Services"
cat </etc/systemd/system/romm-backend.service
diff --git a/install/rustdeskserver-install.sh b/install/rustdeskserver-install.sh
index 273d9bc13..56b301cf6 100644
--- a/install/rustdeskserver-install.sh
+++ b/install/rustdeskserver-install.sh
@@ -13,10 +13,10 @@ setting_up_container
network_check
update_os
-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" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*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-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*$(arch_resolve).deb"
+fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*$(arch_resolve).deb"
+fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*$(arch_resolve).deb"
+fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*$(arch_resolve).deb"
systemctl enable -q --now rustdesk-hbbr
systemctl enable -q --now rustdesk-hbbs
systemctl enable -q --now rustdesk-api
diff --git a/install/sabnzbd-install.sh b/install/sabnzbd-install.sh
index fd85b775e..4193ee0ec 100644
--- a/install/sabnzbd-install.sh
+++ b/install/sabnzbd-install.sh
@@ -43,7 +43,7 @@ msg_ok "Installed SABnzbd"
read -r -p "Would you like to install par2cmdline-turbo? " prompt
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
mv /usr/bin/par2 /usr/bin/par2.old
- fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-amd64.zip"
+ fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-$(arch_resolve).zip"
fi
msg_info "Creating Service"
diff --git a/install/seaweedfs-install.sh b/install/seaweedfs-install.sh
index 6d4aec60b..940a638d5 100644
--- a/install/seaweedfs-install.sh
+++ b/install/seaweedfs-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y fuse3
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_$(arch_resolve).tar.gz"
msg_info "Setting up SeaweedFS"
mkdir -p /opt/seaweedfs-data
diff --git a/install/semaphore-install.sh b/install/semaphore-install.sh
index 1cd334dcd..f86d61be5 100644
--- a/install/semaphore-install.sh
+++ b/install/semaphore-install.sh
@@ -19,7 +19,7 @@ $STD apt install -y \
ansible
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
+fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_$(arch_resolve).deb"
msg_info "Configuring Semaphore"
mkdir -p /opt/semaphore
diff --git a/install/shelfmark-install.sh b/install/shelfmark-install.sh
index 22597eaf9..c477caca3 100644
--- a/install/shelfmark-install.sh
+++ b/install/shelfmark-install.sh
@@ -49,6 +49,10 @@ echo ""
read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE
DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}"
+if [[ "$(arch_resolve)" == "arm64" && "$DEPLOYMENT_TYPE" == "2" ]]; then
+ msg_warn "FlareSolverr has no arm64 build; using Shelfmark's internal bypasser instead"
+ DEPLOYMENT_TYPE="1"
+fi
case "$DEPLOYMENT_TYPE" in
1)
diff --git a/install/signoz-install.sh b/install/signoz-install.sh
index 6714b97b3..72cbf83a4 100644
--- a/install/signoz-install.sh
+++ b/install/signoz-install.sh
@@ -28,7 +28,7 @@ Types: deb
URIs: https://packages.clickhouse.com/deb
Suites: stable
Components: main
-Architectures: amd64
+Architectures: $(arch_resolve)
Signed-By: /usr/share/keyrings/clickhouse-keyring.gpg
EOF
$STD apt update
@@ -108,7 +108,7 @@ EOF
systemctl enable -q --now clickhouse-server
msg_ok "Configured ClickHouse"
-fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_$(arch_resolve).tar.gz"
msg_info "Running ClickHouse migrations"
cd /opt/signoz-schema-migrator/bin
@@ -116,7 +116,7 @@ $STD ./signoz-schema-migrator sync --dsn="tcp://localhost:9000?password=" --repl
$STD ./signoz-schema-migrator async --dsn="tcp://localhost:9000?password=" --replication=true --up=
msg_ok "ClickHouse Migrations Completed"
-fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_$(arch_resolve).tar.gz"
msg_info "Setting up SigNoz"
mkdir -p /var/lib/signoz
@@ -153,7 +153,7 @@ EOF
systemctl enable -q --now signoz
msg_ok "Setup Signoz"
-fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_$(arch_resolve).tar.gz"
msg_info "Setting up SigNoz OTel Collector"
mkdir -p /var/lib/signoz-otel-collector
diff --git a/install/silverbullet-install.sh b/install/silverbullet-install.sh
index 9f28acc57..6e26d9ccd 100644
--- a/install/silverbullet-install.sh
+++ b/install/silverbullet-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-x86_64.zip"
+fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-$(arch_resolve "x86_64" "aarch64").zip"
mkdir -p /opt/silverbullet/space
msg_info "Creating Service"
diff --git a/install/slskd-install.sh b/install/slskd-install.sh
index 448839a71..5a49fb1d0 100644
--- a/install/slskd-install.sh
+++ b/install/slskd-install.sh
@@ -13,7 +13,11 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-x64.zip"
+msg_info "Installing Dependencies"
+$STD apt install -y libicu-dev
+msg_ok "Installed Dependencies"
+
+fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-$(arch_resolve "x64" "arm64").zip"
msg_info "Configuring Slskd"
JWT_KEY=$(openssl rand -base64 44)
diff --git a/install/sonarr-install.sh b/install/sonarr-install.sh
index 4962c2924..0f47fb19c 100644
--- a/install/sonarr-install.sh
+++ b/install/sonarr-install.sh
@@ -14,10 +14,10 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y sqlite3
+$STD apt install -y sqlite3 libicu-dev
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "Sonarr" "Sonarr/Sonarr" "prebuild" "latest" "/opt/Sonarr" "Sonarr.main.*.linux-x64.tar.gz"
+fetch_and_deploy_gh_release "Sonarr" "Sonarr/Sonarr" "prebuild" "latest" "/opt/Sonarr" "Sonarr.main.*.linux-$(arch_resolve "x64" "arm64").tar.gz"
mkdir -p /var/lib/sonarr/
chmod 775 /var/lib/sonarr/
diff --git a/install/sportarr-install.sh b/install/sportarr-install.sh
index b35968ca7..aedb4a7d1 100644
--- a/install/sportarr-install.sh
+++ b/install/sportarr-install.sh
@@ -18,10 +18,11 @@ msg_info "Installing Dependencies"
$STD apt install -y \
ffmpeg \
gosu \
- sqlite3
+ sqlite3 \
+ libicu-dev
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "sportarr" "Sportarr/Sportarr" "prebuild" "latest" "/opt/sportarr" "Sportarr-linux-x64-*.tar.gz"
+fetch_and_deploy_gh_release "sportarr" "Sportarr/Sportarr" "prebuild" "latest" "/opt/sportarr" "Sportarr-linux-$(arch_resolve "x64" "arm64")-*.tar.gz"
msg_info "Creating Service"
cat </opt/sportarr/.env
diff --git a/install/step-ca-install.sh b/install/step-ca-install.sh
index 2a13fadfe..f034a2b25 100644
--- a/install/step-ca-install.sh
+++ b/install/step-ca-install.sh
@@ -333,7 +333,7 @@ EOF
$STD systemctl enable -q --now step-ca
msg_ok "Started step-ca as a Daemon"
-fetch_and_deploy_gh_release "step-badger" "lukasz-lobocki/step-badger" "prebuild" "latest" "/opt/step-badger" "step-badger_Linux_x86_64.tar.gz"
+fetch_and_deploy_gh_release "step-badger" "lukasz-lobocki/step-badger" "prebuild" "latest" "/opt/step-badger" "step-badger_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
ln -s /opt/step-badger/step-badger /usr/local/bin/step-badger
motd_ssh
diff --git a/install/storyteller-install.sh b/install/storyteller-install.sh
index 3bf66cea6..3e23a1bdf 100644
--- a/install/storyteller-install.sh
+++ b/install/storyteller-install.sh
@@ -24,15 +24,15 @@ $STD apt install -y \
ffmpeg
msg_ok "Installed Dependencies"
-NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
+NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs
-fetch_and_deploy_gh_release "readium" "readium/cli" "prebuild" "latest" "/opt/readium" "readium_linux_x86_64.tar.gz"
+fetch_and_deploy_gh_release "readium" "readium/cli" "prebuild" "latest" "/opt/readium" "readium_linux_$(arch_resolve "x86_64" "arm64").tar.gz"
ln -sf /opt/readium/readium /usr/local/bin/readium
fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller"
msg_info "Setting up Storyteller"
cd /opt/storyteller
-$STD corepack enable
+
$STD corepack yarn install --network-timeout 600000
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
STORYTELLER_SECRET_KEY=$(openssl rand -base64 32)
diff --git a/install/stylus-install.sh b/install/stylus-install.sh
index 96086b403..81594675a 100644
--- a/install/stylus-install.sh
+++ b/install/stylus-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "stylus" "mmastrac/stylus" "singlefile" "latest" "/usr/bin/" "*_linux_amd64"
+fetch_and_deploy_gh_release "stylus" "mmastrac/stylus" "singlefile" "latest" "/usr/bin/" "*_linux_$(arch_resolve)"
msg_info "Configuring Stylus"
$STD stylus init /opt/stylus/
diff --git a/install/tdarr-install.sh b/install/tdarr-install.sh
index 5cc28bfd8..9024e2002 100644
--- a/install/tdarr-install.sh
+++ b/install/tdarr-install.sh
@@ -20,7 +20,7 @@ msg_ok "Installed Dependencies"
msg_info "Installing Tdarr"
mkdir -p /opt/tdarr
cd /opt/tdarr
-RELEASE=$(curl_with_retry "https://f000.backblazeb2.com/file/tdarrs/versions.json" "-" | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep linux_x64 | head -n 1)
+RELEASE=$(curl_with_retry "https://f000.backblazeb2.com/file/tdarrs/versions.json" "-" | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep "linux_$(arch_resolve "x64" "arm64")" | head -n 1)
curl_with_retry "$RELEASE" "Tdarr_Updater.zip"
$STD unzip Tdarr_Updater.zip
chmod +x Tdarr_Updater
diff --git a/install/threadfin-install.sh b/install/threadfin-install.sh
index 46fd7d5c4..e85a825df 100644
--- a/install/threadfin-install.sh
+++ b/install/threadfin-install.sh
@@ -20,7 +20,7 @@ $STD apt install -y \
vlc
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "threadfin-app" "threadfin/threadfin" "singlefile" "latest" "/opt/threadfin" "Threadfin_linux_amd64"
+fetch_and_deploy_gh_release "threadfin-app" "threadfin/threadfin" "singlefile" "latest" "/opt/threadfin" "Threadfin_linux_$(arch_resolve)"
mv /opt/threadfin/threadfin-app /opt/threadfin/threadfin
msg_info "Creating Service"
diff --git a/install/tinyauth-install.sh b/install/tinyauth-install.sh
index de5981e67..85db46eb7 100644
--- a/install/tinyauth-install.sh
+++ b/install/tinyauth-install.sh
@@ -19,7 +19,7 @@ $STD apt install -y \
apache2-utils
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "tinyauth" "steveiliop56/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-amd64"
+fetch_and_deploy_gh_release "tinyauth" "steveiliop56/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-$(arch_resolve)"
msg_info "Setting up Tinyauth"
PASS=$(openssl rand -base64 8 | tr -dc 'a-zA-Z0-9' | head -c 8)
diff --git a/install/traccar-install.sh b/install/traccar-install.sh
index c7db0f67e..7970a2e86 100644
--- a/install/traccar-install.sh
+++ b/install/traccar-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-64*.zip"
+fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-$(arch_resolve "64*" "arm-*").zip"
msg_info "Configuring Traccar"
cd /opt/traccar
diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh
index f714fb652..a1f6cdc85 100644
--- a/install/tracearr-install.sh
+++ b/install/tracearr-install.sh
@@ -17,13 +17,13 @@ msg_info "Installing Dependencies"
$STD apt install -y redis-server
msg_ok "Installed Dependencies"
-NODE_VERSION="24" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
PG_VERSION="18" setup_postgresql
msg_info "Installing pnpm"
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]' | cut -d'+' -f1)"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
-$STD corepack enable pnpm
+
$STD corepack prepare pnpm@${PNPM_VERSION} --activate
msg_ok "Installed pnpm"
diff --git a/install/traefik-install.sh b/install/traefik-install.sh
index 1b8699da2..950fb8b79 100644
--- a/install/traefik-install.sh
+++ b/install/traefik-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y apt-transport-https
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
mkdir -p /etc/traefik/{conf.d,ssl}
msg_info "Creating Traefik configuration"
diff --git a/install/transmute-install.sh b/install/transmute-install.sh
index a3b83d72d..8546c0f0c 100644
--- a/install/transmute-install.sh
+++ b/install/transmute-install.sh
@@ -42,11 +42,11 @@ $STD apt install -y \
python3-cssselect
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
-fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
+fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-$(arch_resolve).deb"
+fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-$(arch_resolve "x86_64" "arm64").txz"
ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg
-fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
+fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-$(arch_resolve)-*.deb"
fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball"
msg_info "Setting up Python Backend"
diff --git a/install/trilium-install.sh b/install/trilium-install.sh
index 28f379a34..747e3e45a 100644
--- a/install/trilium-install.sh
+++ b/install/trilium-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "Trilium" "TriliumNext/Trilium" "prebuild" "latest" "/opt/trilium" "TriliumNotes-Server-*linux-x64.tar.xz"
+fetch_and_deploy_gh_release "Trilium" "TriliumNext/Trilium" "prebuild" "latest" "/opt/trilium" "TriliumNotes-Server-*linux-$(arch_resolve "x64" "arm64").tar.xz"
msg_info "Creating Service"
cat </etc/systemd/system/trilium.service
diff --git a/install/tubearchivist-install.sh b/install/tubearchivist-install.sh
index 8afe94377..bc69181af 100644
--- a/install/tubearchivist-install.sh
+++ b/install/tubearchivist-install.sh
@@ -31,7 +31,7 @@ msg_ok "Installed Dependencies"
UV_PYTHON="3.13" setup_uv
NODE_VERSION="24" setup_nodejs
-fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-x86_64-unknown-linux-gnu.zip"
+fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
msg_info "Installing ElasticSearch"
setup_deb822_repo \
diff --git a/install/tunarr-install.sh b/install/tunarr-install.sh
index c3be63dd7..9af700d61 100644
--- a/install/tunarr-install.sh
+++ b/install/tunarr-install.sh
@@ -15,10 +15,10 @@ update_os
setup_hwaccel
-fetch_and_deploy_gh_release "tunarr" "chrisbenincasa/tunarr" "prebuild" "latest" "/opt/tunarr" "*linux-x64.tar.gz"
+fetch_and_deploy_gh_release "tunarr" "chrisbenincasa/tunarr" "prebuild" "latest" "/opt/tunarr" "*linux-$(arch_resolve "x64" "arm64").tar.gz"
cd /opt/tunarr
mv tunarr* tunarr
-fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
+fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux$(arch_resolve "64" "arm64")-gpl-7.1.tar.xz"
msg_info "Set ErsatzTV-ffmpeg links"
chmod +x /opt/ErsatzTV-ffmpeg/bin/*
diff --git a/install/twenty-install.sh b/install/twenty-install.sh
index 033b3e140..23819f20d 100644
--- a/install/twenty-install.sh
+++ b/install/twenty-install.sh
@@ -21,14 +21,14 @@ msg_ok "Installed Dependencies"
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="twenty_db" PG_DB_USER="twenty" PG_DB_SCHEMA_PERMS="true" PG_DB_EXTENSIONS="vector" setup_postgresql_db
-NODE_VERSION="24" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
fetch_and_deploy_gh_release "twenty" "twentyhq/twenty" "tarball"
msg_info "Building Application"
cd /opt/twenty
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
-$STD corepack enable
+
$STD corepack prepare yarn@4.9.2 --activate
yarn install --immutable >/dev/null 2>&1 || $STD yarn install
export NODE_OPTIONS="--max-old-space-size=4096"
diff --git a/install/uhf-install.sh b/install/uhf-install.sh
index 3f66b1fec..7d9913e7b 100644
--- a/install/uhf-install.sh
+++ b/install/uhf-install.sh
@@ -31,8 +31,8 @@ LOG_LEVEL=INFO
EOF
msg_ok "Set Up UHF Server Environment"
-fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-x64-*.zip"
-fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-x64-*.zip"
+fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-$(arch_resolve "x64" "arm64")-*.zip"
+fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-$(arch_resolve "x64" "arm64")-*.zip"
msg_info "Creating Service"
cat </etc/systemd/system/uhf-server.service
diff --git a/install/unifi-os-server-install.sh b/install/unifi-os-server-install.sh
index 791c6c91d..842b03cd4 100644
--- a/install/unifi-os-server-install.sh
+++ b/install/unifi-os-server-install.sh
@@ -50,10 +50,11 @@ if ! curl -fsSL "$API_URL" -o "$TEMP_JSON"; then
msg_error "Failed to fetch data from Ubiquiti API"
exit 250
fi
-LATEST=$(jq -r '
+PLATFORM="linux-$(arch_resolve "x64" "arm64")"
+LATEST=$(jq -r --arg platform "$PLATFORM" '
._embedded.firmware
| map(select(.product == "unifi-os-server"))
- | map(select(.platform == "linux-x64"))
+ | map(select(.platform == $platform))
| sort_by(.version_major, .version_minor, .version_patch)
| last
' "$TEMP_JSON")
diff --git a/install/unmanic-install.sh b/install/unmanic-install.sh
index edee43e51..a66c50341 100644
--- a/install/unmanic-install.sh
+++ b/install/unmanic-install.sh
@@ -22,7 +22,7 @@ msg_ok "Installed Dependencies"
setup_hwaccel
msg_info "Installing Unmanic"
-$STD pip3 install unmanic
+$STD pip3 install --break-system-packages unmanic
msg_ok "Installed Unmanic"
msg_info "Creating Service"
diff --git a/install/upgopher-install.sh b/install/upgopher-install.sh
index 491be1c2c..c1b1938e1 100644
--- a/install/upgopher-install.sh
+++ b/install/upgopher-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "upgopher" "wanetty/upgopher" "prebuild" "latest" "/opt/upgopher" "upgopher_*_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "upgopher" "wanetty/upgopher" "prebuild" "latest" "/opt/upgopher" "upgopher_*_linux_$(arch_resolve).tar.gz"
msg_info "Installing Upgopher"
chmod +x /opt/upgopher/upgopher
diff --git a/install/upsnap-install.sh b/install/upsnap-install.sh
index ed9aefab3..4a8fde67e 100644
--- a/install/upsnap-install.sh
+++ b/install/upsnap-install.sh
@@ -23,7 +23,7 @@ $STD apt install -y \
sshpass
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "upsnap" "seriousm4x/UpSnap" "prebuild" "latest" "/opt/upsnap" "UpSnap_*_linux_amd64.zip"
+fetch_and_deploy_gh_release "upsnap" "seriousm4x/UpSnap" "prebuild" "latest" "/opt/upsnap" "UpSnap_*_linux_$(arch_resolve).zip"
setcap 'cap_net_raw=+ep' /opt/upsnap/upsnap
msg_info "Creating Service"
diff --git a/install/victoriametrics-install.sh b/install/victoriametrics-install.sh
index 7d5b174d6..6768211bc 100644
--- a/install/victoriametrics-install.sh
+++ b/install/victoriametrics-install.sh
@@ -16,10 +16,10 @@ update_os
msg_info "Getting latest version of VictoriaMetrics"
victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" |
- jq -r '.[] | select(.assets[].name | match("^victoria-metrics-linux-amd64-v[0-9.]+.tar.gz$")) | .tag_name' |
+ jq -r --arg a "$(arch_resolve)" '.[] | select(.assets[].name | match("^victoria-metrics-linux-" + $a + "-v[0-9.]+.tar.gz$")) | .tag_name' |
head -n 1)
-victoriametrics_filename="victoria-metrics-linux-amd64-${victoriametrics_release}.tar.gz"
-vmutils_filename="vmutils-linux-amd64-${victoriametrics_release}.tar.gz"
+victoriametrics_filename="victoria-metrics-linux-$(arch_resolve)-${victoriametrics_release}.tar.gz"
+vmutils_filename="vmutils-linux-$(arch_resolve)-${victoriametrics_release}.tar.gz"
msg_ok "Got version $victoriametrics_release of VictoriaMetrics"
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "$victoriametrics_release" "/opt/victoriametrics" "$victoriametrics_filename"
@@ -30,10 +30,10 @@ read -r -p "${TAB3}Would you like to add VictoriaLogs? " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
vmlogs_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
jq -r '.assets[].name' |
- grep -E '^victoria-logs-linux-amd64-v[0-9.]+\.tar\.gz$')
+ grep -E "^victoria-logs-linux-$(arch_resolve)-v[0-9.]+\.tar\.gz$")
vlutils_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
jq -r '.assets[].name' |
- grep -E '^vlutils-linux-amd64-v[0-9.]+\.tar\.gz$')
+ grep -E "^vlutils-linux-$(arch_resolve)-v[0-9.]+\.tar\.gz$")
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vmlogs_filename"
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vlutils_filename"
fi
diff --git a/install/wallos-install.sh b/install/wallos-install.sh
index a37a07938..982cf91c3 100644
--- a/install/wallos-install.sh
+++ b/install/wallos-install.sh
@@ -39,11 +39,12 @@ cat </etc/apache2/sites-available/wallos.conf
EOF
$STD a2ensite wallos.conf
$STD a2dissite 000-default.conf
-$STD systemctl reload apache2
+$STD systemctl restart apache2
$STD curl http://localhost/endpoints/db/migrate.php
msg_ok "Installed Wallos"
msg_info "Setting up Crontabs"
+$STD apt-get install -y cron
mkdir -p /var/log/cron
cat </opt/wallos.cron
0 1 * * * php /opt/wallos/endpoints/cronjobs/updatenextpayment.php >> /var/log/cron/updatenextpayment.log 2>&1
diff --git a/install/wanderer-install.sh b/install/wanderer-install.sh
index 71bab2676..3cebc9fef 100644
--- a/install/wanderer-install.sh
+++ b/install/wanderer-install.sh
@@ -15,7 +15,11 @@ update_os
setup_go
NODE_VERSION="22" setup_nodejs
-fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "singlefile" "latest" "/usr/local/bin" "meilisearch-linux-aarch64"
+else
+ fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
+fi
mkdir -p /opt/wanderer/{source,data/pb_data,data/meili_data}
fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source"
diff --git a/install/wastebin-install.sh b/install/wastebin-install.sh
index 8b44dcf91..782486080 100644
--- a/install/wastebin-install.sh
+++ b/install/wastebin-install.sh
@@ -20,7 +20,7 @@ msg_ok "Installed dependencies"
msg_info "Installing Wastebin"
temp_file=$(mktemp)
RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst" -o "$temp_file"
+curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl.tar.zst" -o "$temp_file"
tar -xf "$temp_file"
mkdir -p /opt/wastebin
mv wastebin* /opt/wastebin/
diff --git a/install/wger-install.sh b/install/wger-install.sh
index 213c29f38..dabdfd1e1 100644
--- a/install/wger-install.sh
+++ b/install/wger-install.sh
@@ -31,7 +31,7 @@ msg_info "Setting up wger"
mkdir -p /opt/wger/{static,media}
chmod o+w /opt/wger/media
cd /opt/wger
-$STD corepack enable
+
$STD npm install
$STD npm run build:css:sass
$STD uv venv
diff --git a/install/whisparr-install.sh b/install/whisparr-install.sh
index fc0327b41..d328ed221 100644
--- a/install/whisparr-install.sh
+++ b/install/whisparr-install.sh
@@ -14,10 +14,10 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y sqlite3
+$STD apt install -y sqlite3 libicu-dev
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "Whisparr" "Whisparr/Whisparr" "prebuild" "latest" "/opt/Whisparr" "Whisparr.*.linux-x64.tar.gz"
+fetch_and_deploy_gh_release "Whisparr" "Whisparr/Whisparr" "prebuild" "latest" "/opt/Whisparr" "Whisparr.*.linux-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Configuring Whisparr"
mkdir -p /var/lib/whisparr/
diff --git a/install/whodb-install.sh b/install/whodb-install.sh
index 78e7ef802..7e407f5f9 100644
--- a/install/whodb-install.sh
+++ b/install/whodb-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-amd64"
+fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-$(arch_resolve)"
msg_info "Creating Service"
cat </etc/systemd/system/whodb.service
diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh
index 841f6d2b0..fd029cdaa 100644
--- a/install/wishlist-install.sh
+++ b/install/wishlist-install.sh
@@ -20,7 +20,7 @@ $STD apt install -y \
caddy
msg_ok "Installed dependencies"
-NODE_VERSION="24" NODE_MODULE="pnpm@10" setup_nodejs
+NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist")
diff --git a/install/wordpress-install.sh b/install/wordpress-install.sh
index 5cae303fe..52a14c7d0 100644
--- a/install/wordpress-install.sh
+++ b/install/wordpress-install.sh
@@ -47,6 +47,7 @@ cat </etc/apache2/sites-available/wordpress.conf
EOF
$STD a2ensite wordpress.conf
$STD a2dissite 000-default.conf
+$STD a2enmod rewrite
systemctl reload apache2
msg_ok "Created Services"
diff --git a/install/writefreely-install.sh b/install/writefreely-install.sh
index e87e89184..335e3f7de 100644
--- a/install/writefreely-install.sh
+++ b/install/writefreely-install.sh
@@ -19,7 +19,7 @@ msg_ok "Installed Dependencies"
setup_mariadb
MARIADB_DB_NAME="writefreely" MARIADB_DB_USER="writefreely" setup_mariadb_db
-fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
+fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_$(arch_resolve).tar.gz"
msg_info "Setting up WriteFreely"
cd /opt/writefreely
diff --git a/install/yt-dlp-webui-install.sh b/install/yt-dlp-webui-install.sh
index bfc69c2aa..fb6665ede 100644
--- a/install/yt-dlp-webui-install.sh
+++ b/install/yt-dlp-webui-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y ffmpeg
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "yt-dlp-webui" "marcopiovanello/yt-dlp-web-ui" "singlefile" "latest" "/usr/local/bin" "yt-dlp-webui_linux-amd64"
+fetch_and_deploy_gh_release "yt-dlp-webui" "marcopiovanello/yt-dlp-web-ui" "singlefile" "latest" "/usr/local/bin" "yt-dlp-webui_linux-$(arch_resolve)"
fetch_and_deploy_gh_release "yt-dlp" "yt-dlp/yt-dlp" "singlefile" "latest" "/usr/local/bin" "yt-dlp"
msg_info "Setting up YT-DLP-WEBUI"
diff --git a/install/zerobyte-install.sh b/install/zerobyte-install.sh
index 4d43d5e50..0625c5fa3 100644
--- a/install/zerobyte-install.sh
+++ b/install/zerobyte-install.sh
@@ -24,15 +24,15 @@ $STD apt-get install -y \
openssh-client
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "restic" "restic/restic" "singlefile" "latest" "/usr/local/bin" "restic_*_linux_amd64.bz2"
+fetch_and_deploy_gh_release "restic" "restic/restic" "singlefile" "latest" "/usr/local/bin" "restic_*_linux_$(arch_resolve).bz2"
mv /usr/local/bin/restic /usr/local/bin/restic.bz2
bzip2 -d /usr/local/bin/restic.bz2
chmod +x /usr/local/bin/restic
-fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone-*-linux-amd64.zip"
+fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone-*-linux-$(arch_resolve).zip"
ln -sf /opt/rclone/rclone /usr/local/bin/rclone
-fetch_and_deploy_gh_release "shoutrrr" "nicholas-fedor/shoutrrr" "prebuild" "latest" "/opt/shoutrrr" "shoutrrr_linux_amd64_*.tar.gz"
+fetch_and_deploy_gh_release "shoutrrr" "nicholas-fedor/shoutrrr" "prebuild" "latest" "/opt/shoutrrr" "shoutrrr_linux_$(arch_resolve "amd64" "arm64v8")_*.tar.gz"
ln -sf /opt/shoutrrr/shoutrrr /usr/local/bin/shoutrrr
msg_info "Installing Bun"
diff --git a/install/zerotier-one-install.sh b/install/zerotier-one-install.sh
index 2dc1114d7..6fd368011 100644
--- a/install/zerotier-one-install.sh
+++ b/install/zerotier-one-install.sh
@@ -36,8 +36,44 @@ fi
msg_ok "Setup Zerotier-One"
msg_info "Setting up UI"
-curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
-dpkg -i ztncui_0.8.14_amd64.deb
+if [[ "$(arch_resolve)" == "arm64" ]]; then
+ $STD apt-get install -y build-essential python3 openssl
+ NODE_VERSION="20" setup_nodejs
+ curl -fsSL "https://github.com/key-networks/ztncui/archive/refs/heads/master.tar.gz" -o /tmp/ztncui.tar.gz
+ $STD tar -xzf /tmp/ztncui.tar.gz -C /tmp
+ mkdir -p /opt/key-networks
+ cp -r /tmp/ztncui-master/src /opt/key-networks/ztncui
+ cd /opt/key-networks/ztncui
+ $STD npm install --omit=dev
+ cp etc/default.passwd etc/passwd
+ create_self_signed_cert "ztncui"
+ mkdir -p etc/tls
+ cp /etc/ssl/ztncui/ztncui.key etc/tls/privkey.pem
+ cp /etc/ssl/ztncui/ztncui.crt etc/tls/fullchain.pem
+ id -u ztncui &>/dev/null || useradd --system --home-dir /opt/key-networks/ztncui --shell /usr/sbin/nologin ztncui
+ chown -R ztncui:ztncui /opt/key-networks/ztncui
+ cat <<'EOF' >/lib/systemd/system/ztncui.service
+[Unit]
+Description=ztncui - ZeroTier network controller user interface
+Documentation=https://key-networks.com
+After=network.target
+
+[Service]
+Type=simple
+User=ztncui
+WorkingDirectory=/opt/key-networks/ztncui
+ExecStart=/usr/bin/node /opt/key-networks/ztncui/bin/www
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
+EOF
+ systemctl daemon-reload
+ systemctl enable -q ztncui
+else
+ curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
+ dpkg -i ztncui_0.8.14_amd64.deb
+fi
sh -c "echo ZT_TOKEN=$(cat /var/lib/zerotier-one/authtoken.secret) > /opt/key-networks/ztncui/.env"
echo HTTPS_PORT=3443 >>/opt/key-networks/ztncui/.env
echo NODE_ENV=production >>/opt/key-networks/ztncui/.env
diff --git a/install/zitadel-install.sh b/install/zitadel-install.sh
index e19f957e0..82f32e398 100644
--- a/install/zitadel-install.sh
+++ b/install/zitadel-install.sh
@@ -14,7 +14,7 @@ network_check
update_os
msg_info "Installing Dependencies (Patience)"
-$STD apt install -y ca-certificates
+$STD apt install -y ca-certificates lsof
msg_ok "Installed Dependecies"
PG_VERSION="17" setup_postgresql
@@ -39,7 +39,7 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_ADMIN_USER;"
} >>~/zitadel.creds
msg_ok "Installed PostgreSQL"
-fetch_and_deploy_gh_release "zitadel" "zitadel/zitadel" "prebuild" "latest" "/usr/local/bin" "zitadel-linux-amd64.tar.gz"
+fetch_and_deploy_gh_release "zitadel" "zitadel/zitadel" "prebuild" "latest" "/usr/local/bin" "zitadel-linux-$(arch_resolve).tar.gz"
msg_info "Setting up Zitadel Environments"
mkdir -p /opt/zitadel
diff --git a/install/zoraxy-install.sh b/install/zoraxy-install.sh
index 5141f7185..f79b7f28e 100644
--- a/install/zoraxy-install.sh
+++ b/install/zoraxy-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "zoraxy" "tobychui/zoraxy" "singlefile" "latest" "/opt/zoraxy" "zoraxy_linux_amd64"
+fetch_and_deploy_gh_release "zoraxy" "tobychui/zoraxy" "singlefile" "latest" "/opt/zoraxy" "zoraxy_linux_$(arch_resolve)"
ln -s /opt/zoraxy/zoraxy /usr/local/bin/zoraxy
msg_info "Creating Service"
diff --git a/install/zot-registry-install.sh b/install/zot-registry-install.sh
index fad3682dd..39d7a2d48 100644
--- a/install/zot-registry-install.sh
+++ b/install/zot-registry-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y apache2-utils
msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "zot" "project-zot/zot" "singlefile" "latest" "/usr/bin" "zot-linux-amd64"
+fetch_and_deploy_gh_release "zot" "project-zot/zot" "singlefile" "latest" "/usr/bin" "zot-linux-$(arch_resolve)"
msg_info "Configuring Zot Registry"
mkdir -p /etc/zot
diff --git a/install/zwave-js-ui-install.sh b/install/zwave-js-ui-install.sh
index 620dcf241..89f0bdb5e 100644
--- a/install/zwave-js-ui-install.sh
+++ b/install/zwave-js-ui-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "zwave-js-ui" "zwave-js/zwave-js-ui" "prebuild" "latest" "/opt/zwave-js-ui" "zwave-js-ui*-linux.zip"
+fetch_and_deploy_gh_release "zwave-js-ui" "zwave-js/zwave-js-ui" "prebuild" "latest" "/opt/zwave-js-ui" "zwave-js-ui*-$(arch_resolve "linux" "linux-arm64").zip"
msg_info "Configuring Z-Wave JS UI"
mkdir -p /opt/zwave_store
@@ -33,7 +33,7 @@ After=network-online.target
[Service]
User=root
WorkingDirectory=/opt/zwave-js-ui
-ExecStart=/opt/zwave-js-ui/zwave-js-ui-linux
+ExecStart=/opt/zwave-js-ui/$(arch_resolve "zwave-js-ui-linux" "zwave-js-ui")
EnvironmentFile=/opt/.env
[Install]
diff --git a/misc/alpine-install.func b/misc/alpine-install.func
index 874558e2f..893817a1f 100644
--- a/misc/alpine-install.func
+++ b/misc/alpine-install.func
@@ -138,6 +138,7 @@ network_check() {
# This function updates the Container OS by running apk upgrade with mirror fallback
update_os() {
msg_info "Updating Container OS"
+ configure_http_proxy
if ! $STD apk -U upgrade; then
msg_warn "apk update failed (dl-cdn.alpinelinux.org), trying alternate mirrors..."
local alpine_mirrors="mirror.init7.net ftp.halifax.rwth-aachen.de mirrors.edge.kernel.org alpine.mirror.wearetriple.com mirror.leaseweb.com uk.alpinelinux.org dl-2.alpinelinux.org dl-4.alpinelinux.org"
@@ -243,7 +244,7 @@ EOF
msg_ok "Customized Container"
fi
- echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update
+ echo 'set -a; [ -f /etc/profile.d/90-http-proxy.sh ] && . /etc/profile.d/90-http-proxy.sh; set +a; bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/'"${app}"'.sh)"' >/usr/bin/update
chmod +x /usr/bin/update
post_progress_to_api
}
diff --git a/misc/build.func b/misc/build.func
index 14db4c858..81f5be105 100644
--- a/misc/build.func
+++ b/misc/build.func
@@ -1032,6 +1032,9 @@ base_settings() {
fi
fi
+ HTTP_PROXY="${var_http_proxy:-}"
+ HTTP_NO_PROXY="${var_http_no_proxy:-}"
+
MTU=${var_mtu:-""}
_sd_val="${var_searchdomain:-""}"
[[ -n "$_sd_val" ]] && SD="-searchdomain=$_sd_val" || SD=""
@@ -1085,7 +1088,7 @@ load_vars_file() {
# Allowed var_* keys
local VAR_WHITELIST=(
- var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_keyctl
+ var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_keyctl
var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu
var_net var_nesting var_ns var_os var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged
var_verbose var_version var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage var_searchdomain
@@ -1267,6 +1270,15 @@ load_vars_file() {
var_sdn_vnet)
if [[ -n "$var_val" ]] && ! validate_sdn_vnet "$var_val"; then
msg_warn "SDN vnet '$var_val' from $file not found, ignoring"
+ var_http_proxy)
+ if [[ -n "$var_val" ]] && ! [[ "$var_val" =~ ^https?://[^[:space:]]+(:[0-9]+)?/?$ ]]; then
+ msg_warn "Invalid HTTP proxy URL '$var_val' in $file, ignoring"
+ continue
+ fi
+ ;;
+ var_http_no_proxy)
+ if [[ -n "$var_val" ]] && [[ ! "$var_val" =~ ^[a-zA-Z0-9.*_:/-]+(,[a-zA-Z0-9.*_:/-]+)*$ ]]; then
+ msg_warn "Invalid no_proxy value '$var_val' in $file, ignoring"
continue
fi
;;
@@ -1309,7 +1321,7 @@ default_var_settings() {
# Allowed var_* keys (alphabetically sorted)
# Note: Removed var_ctid (can only exist once), var_ipv6_static (static IPs are unique)
local VAR_WHITELIST=(
- var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_keyctl
+ var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_keyctl
var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu
var_net var_nesting var_ns var_os var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged
var_verbose var_version var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage
@@ -1389,6 +1401,10 @@ var_ssh=no
# var_apt_cacher_ip=http://proxy.local
# var_apt_cacher_ip=https://proxy.local:443
+# HTTP/HTTPS proxy (optional - for networks requiring a proxy)
+# var_http_proxy=http://proxy.local:8080
+# var_http_no_proxy=localhost,127.0.0.1,.local
+
# Features/Tags/verbosity
var_fuse=no
var_tun=no
@@ -1488,7 +1504,7 @@ get_app_defaults_path() {
if ! declare -p VAR_WHITELIST >/dev/null 2>&1; then
# Note: Removed var_ctid (can only exist once), var_ipv6_static (static IPs are unique)
declare -ag VAR_WHITELIST=(
- var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_keyctl
+ var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_keyctl
var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu
var_net var_nesting var_ns var_os var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged
var_verbose var_version var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage var_searchdomain
@@ -1636,6 +1652,8 @@ _build_current_app_vars_tmp() {
_ssh_auth="${SSH_AUTHORIZED_KEY:-}"
_apt_cacher="${APT_CACHER:-}"
_apt_cacher_ip="${APT_CACHER_IP:-}"
+ _http_proxy="${HTTP_PROXY:-${var_http_proxy:-}}"
+ _http_no_proxy="${HTTP_NO_PROXY:-${var_http_no_proxy:-}}"
_fuse="${ENABLE_FUSE:-no}"
_tun="${ENABLE_TUN:-no}"
_gpu="${ENABLE_GPU:-no}"
@@ -1687,6 +1705,8 @@ _build_current_app_vars_tmp() {
[ -n "$_apt_cacher" ] && echo "var_apt_cacher=$(_sanitize_value "$_apt_cacher")"
[ -n "$_apt_cacher_ip" ] && echo "var_apt_cacher_ip=$(_sanitize_value "$_apt_cacher_ip")"
+ [ -n "$_http_proxy" ] && echo "var_http_proxy=$(_sanitize_value "$_http_proxy")"
+ [ -n "$_http_no_proxy" ] && echo "var_http_no_proxy=$(_sanitize_value "$_http_no_proxy")"
[ -n "$_fuse" ] && echo "var_fuse=$(_sanitize_value "$_fuse")"
[ -n "$_tun" ] && echo "var_tun=$(_sanitize_value "$_tun")"
@@ -1851,7 +1871,7 @@ advanced_settings() {
TAGS="community-script${var_tags:+;${var_tags}}"
fi
local STEP=1
- local MAX_STEP=29
+ local MAX_STEP=30
# Store values for back navigation - inherit from var_* app defaults
local _ct_type="${var_unprivileged:-1}"
@@ -1871,6 +1891,8 @@ advanced_settings() {
local _ipv6_gate=""
local _apt_cacher="${var_apt_cacher:-no}"
local _apt_cacher_ip="${var_apt_cacher_ip:-}"
+ local _http_proxy="${var_http_proxy:-}"
+ local _http_no_proxy="${var_http_no_proxy:-}"
local _mtu="${var_mtu:-}"
local _sd="${var_searchdomain:-}"
local _ns="${var_ns:-}"
@@ -2663,9 +2685,46 @@ advanced_settings() {
;;
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- # STEP 24: Container Timezone
+ # STEP 24: HTTP/HTTPS Proxy
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
24)
+ local http_proxy_default_flag="--defaultno"
+ [[ -n "$_http_proxy" ]] && http_proxy_default_flag=""
+
+ if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
+ --title "HTTP/HTTPS PROXY" \
+ --ok-button "Next" --cancel-button "Back" \
+ $http_proxy_default_flag \
+ --yesno "\nUse HTTP/HTTPS proxy?\n\nRequired when internet access must go through a proxy server.\n(e.g. corporate networks)\n\n(App default: ${var_http_proxy:-none})" 14 62; then
+ if result=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
+ --title "HTTP PROXY URL" \
+ --inputbox "\nEnter HTTP proxy URL:\n(e.g. http://proxy.local:8080)" 12 62 "$_http_proxy" \
+ 3>&1 1>&2 2>&3); then
+ _http_proxy="$result"
+ local _no_proxy_default="${_http_no_proxy:-localhost,127.0.0.1,.local}"
+ if result=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
+ --title "NO_PROXY EXCEPTIONS" \
+ --inputbox "\nEnter NO_PROXY exceptions (comma-separated):\nLeave empty for defaults." 12 62 "$_no_proxy_default" \
+ 3>&1 1>&2 2>&3); then
+ _http_no_proxy="$result"
+ fi
+ fi
+ else
+ if [ $? -eq 1 ]; then
+ _http_proxy=""
+ _http_no_proxy=""
+ else
+ ((STEP--))
+ continue
+ fi
+ fi
+ ((STEP++))
+ ;;
+
+ # âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+ # STEP 25: Container Timezone
+ # âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+ 25)
local tz_hint="$_ct_timezone"
[[ -z "$tz_hint" ]] && tz_hint="(empty - will use host timezone)"
@@ -2688,9 +2747,9 @@ advanced_settings() {
;;
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- # STEP 25: Container Protection
+ # STEP 26: Container Protection
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- 25)
+ 26)
local protect_default_flag="--defaultno"
[[ "$_protect_ct" == "yes" || "$_protect_ct" == "1" ]] && protect_default_flag=""
@@ -2712,9 +2771,9 @@ advanced_settings() {
;;
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- # STEP 26: Device Node Creation (mknod)
+ # STEP 27: Device Node Creation (mknod)
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- 26)
+ 27)
local mknod_default_flag="--defaultno"
[[ "$_enable_mknod" == "1" ]] && mknod_default_flag=""
@@ -2736,9 +2795,9 @@ advanced_settings() {
;;
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- # STEP 27: Mount Filesystems
+ # STEP 28: Mount Filesystems
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- 27)
+ 28)
local mount_hint=""
[[ -n "$_mount_fs" ]] && mount_hint="$_mount_fs" || mount_hint="(none)"
@@ -2759,9 +2818,9 @@ advanced_settings() {
;;
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- # STEP 28: Optional host-side post-install hook (path on the Proxmox HOST)
+ # STEP 29: Optional host-side post-install hook (path on the Proxmox HOST)
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- 28)
+ 29)
local _hook_prompt="Optional: absolute path to a *.sh file ON THE PROXMOX HOST.
It runs as root on the HOST (NOT in the LXC) after the container
@@ -2811,9 +2870,9 @@ Leave empty to skip."
;;
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- # STEP 29: Verbose Mode & Confirmation
+ # STEP 30: Verbose Mode & Confirmation
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
- 29)
+ 30)
local verbose_default_flag="--defaultno"
[[ "$_verbose" == "yes" ]] && verbose_default_flag=""
@@ -2841,6 +2900,7 @@ Leave empty to skip."
local tz_display="${_ct_timezone:-Host TZ}"
local apt_display="${_apt_cacher:-no}"
[[ "$_apt_cacher" == "yes" && -n "$_apt_cacher_ip" ]] && apt_display="$_apt_cacher_ip"
+ local http_proxy_display="${_http_proxy:-(none)}"
local post_install_display="${_post_install:-(none)}"
local post_install_warn=""
@@ -2870,6 +2930,7 @@ Features:
Advanced:
Timezone: $tz_display
APT Cacher: $apt_display
+ HTTP Proxy: $http_proxy_display
Verbose: $_verbose
Post-Install Script: ${post_install_display}${post_install_warn}"
@@ -2913,6 +2974,8 @@ Advanced:
CT_TIMEZONE="$_ct_timezone"
APT_CACHER="$_apt_cacher"
APT_CACHER_IP="$_apt_cacher_ip"
+ HTTP_PROXY="$_http_proxy"
+ HTTP_NO_PROXY="$_http_no_proxy"
VERBOSE="$_verbose"
var_post_install="$_post_install"
@@ -2929,6 +2992,8 @@ Advanced:
var_apt_cacher="$_apt_cacher"
var_apt_cacher_ip="$_apt_cacher_ip"
var_sdn_vnet="$_sdn_vnet"
+ var_http_proxy="$_http_proxy"
+ var_http_no_proxy="$_http_no_proxy"
# Format optional values
[[ -n "$_mtu" ]] && MTU=",mtu=$_mtu" || MTU=""
@@ -2966,6 +3031,7 @@ Advanced:
[[ "${PROTECT_CT:-no}" == "yes" || "${PROTECT_CT:-no}" == "1" ]] && echo -e "${CONTAINERTYPE}${BOLD}${DGN}Protection: ${BGN}Enabled${CL}"
[[ -n "${CT_TIMEZONE:-}" ]] && echo -e "${INFO}${BOLD}${DGN}Timezone: ${BGN}$CT_TIMEZONE${CL}"
[[ "$APT_CACHER" == "yes" ]] && echo -e "${INFO}${BOLD}${DGN}APT Cacher: ${BGN}$APT_CACHER_IP${CL}"
+ [[ -n "${HTTP_PROXY:-}" ]] && echo -e "${INFO}${BOLD}${DGN}HTTP Proxy: ${BGN}$HTTP_PROXY${CL}"
echo -e "${SEARCH}${BOLD}${DGN}Verbose Mode: ${BGN}$VERBOSE${CL}"
echo -e "${CREATING}${BOLD}${RD}Creating an LXC of ${APP} using the above advanced settings${CL}"
@@ -3803,6 +3869,47 @@ start() {
# SECTION 8: CONTAINER CREATION & DEPLOYMENT
# ==============================================================================
+# ------------------------------------------------------------------------------
+# _apply_http_proxy_in_container()
+#
+# - Writes persistent proxy settings into the LXC before base package install
+# - Ensures apt/apk/curl work behind corporate proxies during early setup
+# ------------------------------------------------------------------------------
+_apply_http_proxy_in_container() {
+ local proxy="${HTTP_PROXY:-}"
+ local noproxy="${HTTP_NO_PROXY:-}"
+ [[ -z "$proxy" || -z "${CTID:-}" ]] && return 0
+ [[ -z "$noproxy" ]] && noproxy="localhost,127.0.0.1,.local"
+
+ msg_info "Applying HTTP proxy in container"
+ local tmpf
+ tmpf="$(mktemp)"
+ cat >"$tmpf" </dev/null 2>&1 || {
+ rm -f "$tmpf"
+ msg_warn "Failed to push HTTP proxy profile into container"
+ return 0
+ }
+ pct exec "$CTID" -- chmod 644 /etc/profile.d/90-http-proxy.sh >/dev/null 2>&1 || true
+
+ if [[ "$var_os" != "alpine" && "${APT_CACHER:-}" != "yes" ]]; then
+ cat >"$tmpf" </dev/null 2>&1 || true
+ fi
+ rm -f "$tmpf"
+ msg_ok "Applied HTTP proxy in container"
+}
+
# ------------------------------------------------------------------------------
# build_container()
#
@@ -3932,6 +4039,12 @@ build_container() {
export SESSION_ID="$SESSION_ID"
export CACHER="$APT_CACHER"
export CACHER_IP="$APT_CACHER_IP"
+ if [[ -n "${HTTP_PROXY:-}" ]]; then
+ export HTTP_PROXY HTTPS_PROXY="$HTTP_PROXY" http_proxy="$HTTP_PROXY" https_proxy="$HTTP_PROXY"
+ export NO_PROXY="${HTTP_NO_PROXY:-}" no_proxy="${HTTP_NO_PROXY:-}"
+ export var_http_proxy="$HTTP_PROXY"
+ export var_http_no_proxy="${HTTP_NO_PROXY:-}"
+ fi
export tz="$timezone"
export APPLICATION="$APP"
export app="$NSAPP"
@@ -4042,6 +4155,7 @@ $PCT_OPTIONS_STRING"
exit 214
fi
msg_ok "Storage space validated"
+ check_storage_health "$CONTAINER_STORAGE" "$DISK_SIZE"
fi
create_lxc_container || exit $?
@@ -4415,6 +4529,8 @@ EOF
local install_exit_code=0
+ _apply_http_proxy_in_container
+
# Continue with standard container setup
if [ "$var_os" == "alpine" ]; then
sleep 3
@@ -4422,10 +4538,13 @@ EOF
https://dl-cdn.alpinelinux.org/alpine/latest-stable/main
https://dl-cdn.alpinelinux.org/alpine/latest-stable/community
EOF'
- pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses jq" >>"$BUILD_LOG" 2>&1 || {
+ pct exec "$CTID" -- ash -c 'set -a; [ -f /etc/profile.d/90-http-proxy.sh ] && . /etc/profile.d/90-http-proxy.sh; set +a; apk add bash newt curl openssh nano mc ncurses jq' >>"$BUILD_LOG" 2>&1 || {
msg_warn "apk install failed (dl-cdn.alpinelinux.org), trying alternate mirrors..."
local alpine_exit=0
pct exec "$CTID" -- ash -c '
+ set -a
+ [ -f /etc/profile.d/90-http-proxy.sh ] && . /etc/profile.d/90-http-proxy.sh
+ set +a
ALPINE_MIRRORS="mirror.init7.net ftp.halifax.rwth-aachen.de mirrors.edge.kernel.org alpine.mirror.wearetriple.com mirror.leaseweb.com uk.alpinelinux.org dl-2.alpinelinux.org dl-4.alpinelinux.org"
for m in $(printf "%s\n" $ALPINE_MIRRORS | shuf); do
if wget -q --spider --timeout=2 "http://$m/alpine/latest-stable/main/" 2>/dev/null; then
@@ -4484,13 +4603,16 @@ EOF
pct exec "$CTID" -- bash -c "echo -e 'nameserver 8.8.8.8\nnameserver 1.1.1.1' >/etc/resolv.conf"
fi
- pct exec "$CTID" -- bash -c "apt-get update 2>&1 && apt-get install -y ${_base_pkgs} 2>&1" >>"$BUILD_LOG" 2>&1 || {
+ pct exec "$CTID" -- bash -c "set -a; [ -f /etc/profile.d/90-http-proxy.sh ] && . /etc/profile.d/90-http-proxy.sh; set +a; apt-get update 2>&1 && apt-get install -y ${_base_pkgs} 2>&1" >>"$BUILD_LOG" 2>&1 || {
local failed_mirror
failed_mirror=$(pct exec "$CTID" -- bash -c "grep -m1 -oP '(?<=URIs: https?://)[^/]+' /etc/apt/sources.list.d/debian.sources 2>/dev/null || grep -m1 -oP '(?<=deb https?://)[^/]+' /etc/apt/sources.list 2>/dev/null" 2>/dev/null || echo "unknown")
msg_warn "apt-get update failed (${failed_mirror})."
msg_custom "âšī¸" "${YW}" "Probing alternate mirrors (this can take 1-2 minutes on network issues)"
local mirror_exit=0
pct exec "$CTID" -- env APT_BASE="$_base_pkgs" bash -c '
+ set -a
+ [ -f /etc/profile.d/90-http-proxy.sh ] && . /etc/profile.d/90-http-proxy.sh
+ set +a
DISTRO=$(. /etc/os-release 2>/dev/null && echo "$ID" || echo "debian")
echo " Mirror fallback for distro: $DISTRO"
@@ -5424,6 +5546,7 @@ select_storage() {
# Validate storage space for container storage
if [[ "$CLASS" == "container" && -n "${DISK_SIZE:-}" ]]; then
validate_storage_space "$STORAGE_RESULT" "$DISK_SIZE" "yes"
+ check_storage_health "$STORAGE_RESULT" "$DISK_SIZE"
# Continue even if validation fails - user was warned
fi
@@ -5489,6 +5612,51 @@ validate_storage_space() {
return 0
}
+# ------------------------------------------------------------------------------
+# check_storage_health()
+#
+# - Warns or blocks when target storage is nearly full
+# - Complements validate_storage_space (free space vs. requested disk)
+# - Uses pvesm status usage when available
+# ------------------------------------------------------------------------------
+check_storage_health() {
+ local storage="$1"
+ local required_gb="${2:-8}"
+ [[ -z "$storage" ]] && return 0
+
+ local storage_line storage_type total_kb avail_kb used_pct free_gb_fmt
+ storage_line=$(pvesm status 2>/dev/null | awk -v s="$storage" '$1 == s {print $0}')
+ [[ -z "$storage_line" ]] && return 0
+
+ storage_type=$(awk '{print $2}' <<<"$storage_line")
+ total_kb=$(awk '{print $4}' <<<"$storage_line")
+ avail_kb=$(awk '{print $6}' <<<"$storage_line")
+
+ [[ -z "$total_kb" || "$total_kb" == "0" || -z "$avail_kb" ]] && return 0
+
+ used_pct=$(( (total_kb - avail_kb) * 100 / total_kb ))
+ free_gb_fmt=$(numfmt --to=iec --from-unit=1024 --suffix=B --format %.1f "$avail_kb" 2>/dev/null || echo "${avail_kb}KB")
+
+ if (( used_pct >= 95 )); then
+ msg_warn "Storage '${storage}' (${storage_type}) is ${used_pct}% full (${free_gb_fmt} free)"
+ if ! is_unattended && command -v whiptail >/dev/null 2>&1 && [[ -t 0 ]]; then
+ if ! whiptail --backtitle "Proxmox VE Helper Scripts" \
+ --title "STORAGE ALMOST FULL" \
+ --yesno "Storage '${storage}' is ${used_pct}% full.\n\nType: ${storage_type}\nAvailable: ${free_gb_fmt}\nRequired for CT: ${required_gb} GB\n\nContinue anyway?" 14 70; then
+ msg_error "Installation cancelled â storage nearly full"
+ exit 214
+ fi
+ elif (( used_pct >= 98 )); then
+ msg_error "Storage '${storage}' is ${used_pct}% full â refusing install in unattended mode"
+ exit 214
+ fi
+ elif (( used_pct >= 85 )); then
+ msg_warn "Storage '${storage}' (${storage_type}) is ${used_pct}% full (${free_gb_fmt} free)"
+ fi
+
+ return 0
+}
+
# ==============================================================================
# SECTION 8: CONTAINER CREATION
# ==============================================================================
@@ -5715,6 +5883,11 @@ create_lxc_container() {
msg_debug "No newer candidate for pve-container/lxc-pve (installed=$_pvec_i/$_lxcp_i, cand=$_pvec_c/$_lxcp_c)"
return 0
fi
+ local _disable_update="${DISABLE_UPDATE:-no}"
+ if [[ "${PHS_SILENT:-0}" == "1" || "${_disable_update,,}" == "yes" ]]; then
+ msg_info "Skipping host LXC stack upgrade prompt (unattended mode)"
+ return 2
+ fi
msg_warn "An update for the Proxmox LXC stack is available"
echo " pve-container: installed=${_pvec_i:-n/a} candidate=${_pvec_c:-n/a}"
diff --git a/misc/core.func b/misc/core.func
index 6e9e590e0..adf5a68d9 100644
--- a/misc/core.func
+++ b/misc/core.func
@@ -970,6 +970,53 @@ is_verbose_mode() {
[[ "$verbose" != "no" ]]
}
+# ------------------------------------------------------------------------------
+# configure_http_proxy()
+#
+# - Applies var_http_proxy / var_http_no_proxy inside the container
+# - Persists proxy env for login shells, systemd, and package managers
+# - Skips APT proxy config when APT Cacher-NG is active
+# ------------------------------------------------------------------------------
+configure_http_proxy() {
+ local proxy="${HTTP_PROXY:-${http_proxy:-${var_http_proxy:-}}}"
+ local noproxy="${HTTP_NO_PROXY:-${no_proxy:-${var_http_no_proxy:-}}}"
+ [[ -z "$proxy" ]] && return 0
+ [[ -z "$noproxy" ]] && noproxy="localhost,127.0.0.1,.local"
+
+ msg_info "Configuring HTTP proxy"
+ cat >/etc/profile.d/90-http-proxy.sh </dev/null; then
+ cat >>/etc/environment </etc/apt/apt.conf.d/95http-proxy </etc/apt/apt.conf.d/00aptproxy
local _proxy_raw="${CACHER_IP}"
local _proxy_host _proxy_port _proxy_url
@@ -509,7 +510,7 @@ EOF
systemctl restart "$(basename "$(dirname "$GETTY_OVERRIDE")" | sed 's/\.d//')"
msg_ok "Customized Container"
fi
- echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update
+ echo 'set -a; [ -f /etc/profile.d/90-http-proxy.sh ] && . /etc/profile.d/90-http-proxy.sh; set +a; bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/'"${app}"'.sh)"' >/usr/bin/update
chmod +x /usr/bin/update
if [[ -n "${SSH_AUTHORIZED_KEY}" ]]; then
diff --git a/misc/tools.func b/misc/tools.func
index 6a0c3ed88..14c86488e 100644
--- a/misc/tools.func
+++ b/misc/tools.func
@@ -24,6 +24,7 @@
# cleanup_tool_keyrings() - Remove keyrings from all 3 locations
# stop_all_services() - Stop services by pattern (e.g. "php*-fpm")
# verify_tool_version() - Validate installed version matches expected
+# version_matches_spec() - Compare installed semver against spec (8.0 matches 8.0.40)
# cleanup_legacy_install() - Remove nvm, rbenv, rustup, etc.
# prepare_repository_setup() - Cleanup repos + keyrings + validate APT
# install_packages_with_retry() - Install with 3 retries and APT refresh
@@ -282,7 +283,7 @@ get_cached_version() {
cat "/var/cache/app-versions/${app}_version.txt"
return 0
fi
- return 0
+ return 1
}
# ------------------------------------------------------------------------------
@@ -344,6 +345,37 @@ verify_tool_version() {
return 0
}
+# ------------------------------------------------------------------------------
+# Compare installed semver against a version spec at the spec's precision.
+# Returns: 0 if match (e.g. spec 8.0 matches installed 8.0.40), 1 otherwise
+# Usage: version_matches_spec "8.0.40" "8.0"
+# ------------------------------------------------------------------------------
+version_matches_spec() {
+ local installed="$1"
+ local spec="$2"
+ local spec_depth prefix i
+ local -a spec_parts installed_parts
+
+ [[ -n "$installed" && -n "$spec" ]] || return 1
+
+ IFS='.' read -ra spec_parts <<<"$spec"
+ spec_depth=${#spec_parts[@]}
+ ((spec_depth > 0)) || return 1
+
+ if ((spec_depth == 1)); then
+ [[ "${installed%%.*}" == "$spec" ]] && return 0
+ return 1
+ fi
+
+ IFS='.' read -ra installed_parts <<<"$installed"
+ prefix=""
+ for ((i = 0; i < spec_depth && i < ${#installed_parts[@]}; i++)); do
+ [[ -n "$prefix" ]] && prefix+="."
+ prefix+="${installed_parts[i]}"
+ done
+ [[ "$prefix" == "$spec" ]]
+}
+
# ------------------------------------------------------------------------------
# Clean up legacy installation methods (nvm, rbenv, rustup, etc.)
# Usage: cleanup_legacy_install "nodejs" -> removes nvm
@@ -462,10 +494,10 @@ install_packages_with_retry() {
fi
fi
done
- # If some packages installed, consider partial success
if [[ ${#failed[@]} -lt ${#packages[@]} ]]; then
if [[ ${#failed[@]} -gt 0 ]]; then
- msg_warn "Partially installed. Failed packages: ${failed[*]}"
+ msg_error "Partial install â failed packages: ${failed[*]}"
+ return 100
fi
return 0
fi
@@ -620,13 +652,15 @@ remove_old_tool_version() {
mysql)
stop_all_services "mysql"
$STD apt purge -y 'mysql*' >/dev/null 2>&1 || true
- rm -rf /var/lib/mysql 2>/dev/null || true
+ # Keep data directory for safety (remove manually if needed)
+ # rm -rf /var/lib/mysql 2>/dev/null || true
cleanup_tool_keyrings "mysql"
;;
mongodb)
stop_all_services "mongod"
$STD apt purge -y 'mongodb*' >/dev/null 2>&1 || true
- rm -rf /var/lib/mongodb 2>/dev/null || true
+ # Keep data directory for safety (remove manually if needed)
+ # rm -rf /var/lib/mongodb 2>/dev/null || true
cleanup_tool_keyrings "mongodb"
;;
node | nodejs)
@@ -671,7 +705,8 @@ remove_old_tool_version() {
clickhouse)
stop_all_services "clickhouse-server"
$STD apt purge -y 'clickhouse*' >/dev/null 2>&1 || true
- rm -rf /var/lib/clickhouse 2>/dev/null || true
+ # Keep data directory for safety (remove manually if needed)
+ # rm -rf /var/lib/clickhouse 2>/dev/null || true
cleanup_tool_keyrings "clickhouse"
;;
esac
@@ -695,8 +730,8 @@ should_update_tool() {
# Get currently installed version
current_version=$(is_tool_installed "$tool_name" 2>/dev/null) || return 0 # Not installed = needs install
- # If versions are identical, no update needed
- if [[ "$current_version" == "$target_version" ]]; then
+ # If versions match at the requested precision, no update needed
+ if version_matches_spec "$current_version" "$target_version"; then
return 1 # No update needed
fi
@@ -764,8 +799,15 @@ manage_tool_repository() {
local distro_codename
distro_codename=$(get_os_info codename)
- # Suite mapping with fallback for newer releases not yet supported by upstream
- if [[ "$distro_id" == "debian" ]]; then
+ if [[ "$distro_id" == "debian" && "$(dpkg --print-architecture)" == "arm64" ]]; then
+ case "$distro_codename" in
+ trixie | forky) suite="noble" ;;
+ bookworm) suite="jammy" ;;
+ *) suite="noble" ;;
+ esac
+ distro_id="ubuntu"
+ repo_url="https://repo.mongodb.org/apt/ubuntu"
+ elif [[ "$distro_id" == "debian" ]]; then
case "$distro_codename" in
trixie | forky | sid)
# Testing/unstable releases fallback to latest stable suite
@@ -884,6 +926,49 @@ Suites: $distro_codename
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /usr/share/keyrings/deb.sury.org-php.gpg
+EOF
+ return 0
+ ;;
+
+ mysql)
+ if [[ -z "$gpg_key_url" ]]; then
+ msg_error "MySQL repository requires gpg_key_url"
+ return 65
+ fi
+
+ cleanup_old_repo_files "mysql"
+
+ if ! download_gpg_key "$gpg_key_url" "/etc/apt/keyrings/mysql.gpg" "dearmor"; then
+ msg_error "Failed to import MySQL GPG key"
+ return 7
+ fi
+
+ local distro_codename suite component
+ distro_codename=$(get_os_info codename)
+
+ if [[ "$distro_id" == "debian" ]]; then
+ case "$distro_codename" in
+ trixie | forky | sid) suite="bookworm" ;;
+ bookworm | bullseye) suite="$distro_codename" ;;
+ *) suite="bookworm" ;;
+ esac
+ else
+ suite=$(get_fallback_suite "$distro_id" "$distro_codename" "$repo_url")
+ fi
+
+ case "$version" in
+ 8.4 | 8.4.*) component="mysql-8.4-lts" ;;
+ 8.0 | 8.0.*) component="mysql-8.0" ;;
+ *) component="mysql-${version}" ;;
+ esac
+
+ cat </etc/apt/sources.list.d/mysql.sources
+Types: deb
+URIs: ${repo_url}/
+Suites: ${suite}
+Components: ${component}
+Architectures: $(dpkg --print-architecture)
+Signed-By: /etc/apt/keyrings/mysql.gpg
EOF
return 0
;;
@@ -1115,11 +1200,34 @@ get_system_arch() {
# ------------------------------------------------------------------------------
# Create temporary directory with automatic cleanup
+# Appends to a shared list so existing EXIT traps are preserved.
# ------------------------------------------------------------------------------
+_tools_temp_dirs=()
+
+_tools_cleanup_temp_dirs() {
+ local d
+ for d in "${_tools_temp_dirs[@]}"; do
+ rm -rf "$d" 2>/dev/null || true
+ done
+}
+
+_tools_register_temp_cleanup() {
+ [[ "${_TOOLS_TEMP_TRAP_SET:-}" == "1" ]] && return 0
+ _TOOLS_TEMP_TRAP_SET=1
+ local existing
+ existing=$(trap -p EXIT 2>/dev/null | sed -n "s/^trap -- '\\(.*\\)' EXIT/\1/p" || true)
+ if [[ -n "$existing" && "$existing" != "_tools_cleanup_temp_dirs" ]]; then
+ trap "_tools_cleanup_temp_dirs; ${existing}" EXIT ERR INT TERM
+ else
+ trap _tools_cleanup_temp_dirs EXIT ERR INT TERM
+ fi
+}
+
create_temp_dir() {
- local tmp_dir=$(mktemp -d)
- # Set trap to cleanup on EXIT, ERR, INT, TERM
- trap "rm -rf '$tmp_dir'" EXIT ERR INT TERM
+ local tmp_dir
+ tmp_dir=$(mktemp -d) || return 1
+ _tools_temp_dirs+=("$tmp_dir")
+ _tools_register_temp_cleanup
echo "$tmp_dir"
}
@@ -2042,9 +2150,11 @@ setup_deb822_repo() {
[[ -n "$enabled" ]] && echo "Enabled: $enabled"
} >/etc/apt/sources.list.d/${name}.sources
- $STD apt update || {
- msg_warn "apt update failed after adding repository: ${name}"
- }
+ if ! $STD apt update; then
+ msg_error "apt update failed after adding repository: ${name}"
+ msg_error "Hint: Verify suite '${suite}' and URI '${repo_url}' are valid for this distribution."
+ return 100
+ fi
}
# ------------------------------------------------------------------------------
@@ -2475,6 +2585,8 @@ check_for_gh_tag() {
# - Does not modify anything, only checks version state
# - Does not support pre-releases
# ------------------------------------------------------------------------------
+TOOLS_GH_REL_JSON=""
+
check_for_gh_release() {
local app="$1"
local source="$2"
@@ -2494,6 +2606,10 @@ check_for_gh_release() {
ensure_dependencies jq
+ local gh_check_json
+ gh_check_json=$(mktemp /tmp/tools-gh-check-XXXXXX.json) || return 7
+ trap 'rm -f "$gh_check_json"' RETURN
+
# Build auth header if token is available
local header_args=()
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
@@ -2504,14 +2620,14 @@ check_for_gh_release() {
# For pinned versions, query the specific release tag directly
if [[ -n "$pinned_version_in" ]]; then
local pinned_version_encoded="${pinned_version_in//\//%2F}"
- http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gh_check.json \
+ http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gh_check_json" \
-H 'Accept: application/vnd.github+json' \
-H 'X-GitHub-Api-Version: 2022-11-28' \
"${header_args[@]}" \
"https://api.github.com/repos/${source}/releases/tags/${pinned_version_encoded}" 2>/dev/null) || true
- if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then
- releases_json="[$(/dev/null) || true
- if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then
- releases_json="[$(/dev/null) || true
- if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then
- releases_json=$(/dev/null) || true
+ http_code=$(curl --connect-timeout 10 --max-time "${api_timeouts[$((attempt - 1))]:-240}" -sSL -w "%{http_code}" -o "$gh_rel_json" "${header[@]}" "$api_url" 2>/dev/null) || true
if [[ "$http_code" == "200" ]]; then
success=true
break
@@ -3683,7 +3810,7 @@ fetch_and_deploy_gh_release() {
fi
local json tag_name
- json=$( " prompt
- if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- msg_info "Updating Portainer"
- docker stop portainer
- docker rm portainer
- docker pull portainer/portainer-ce:latest
- docker run -d \
- -p 9000:9000 \
- -p 9443:9443 \
- --name=portainer \
- --restart=always \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v portainer_data:/data \
- portainer/portainer-ce:latest
- msg_ok "Updated Portainer to $PORTAINER_LATEST"
+ if _docker_is_noninteractive; then
+ msg_info "Skipping Portainer update prompt (non-interactive)"
+ else
+ read -r -p "${TAB3}Update Portainer $PORTAINER_CURRENT â $PORTAINER_LATEST? " prompt
+ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
+ msg_info "Updating Portainer"
+ docker stop portainer
+ docker rm portainer
+ docker pull portainer/portainer-ce:latest
+ docker run -d \
+ -p 9000:9000 \
+ -p 9443:9443 \
+ --name=portainer \
+ --restart=always \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ -v portainer_data:/data \
+ portainer/portainer-ce:latest
+ msg_ok "Updated Portainer to $PORTAINER_LATEST"
+ fi
fi
else
msg_ok "Portainer is up-to-date ($PORTAINER_CURRENT)"
@@ -4465,7 +4601,7 @@ EOF
fi
# Interactive Container Update Check
- if [[ "${DOCKER_SKIP_UPDATES:-}" != "true" ]] && [ "$docker_installed" = true ]; then
+ if [[ "${DOCKER_SKIP_UPDATES:-}" != "true" ]] && [ "$docker_installed" = true ] && ! _docker_is_noninteractive; then
msg_info "Checking for container updates"
# Get list of running containers with update status
@@ -5239,15 +5375,15 @@ setup_hwaccel() {
# ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# Resolve the IGC tag that the latest compute-runtime was built against.
# Must be called AFTER a fetch_and_deploy_gh_release for intel/compute-runtime
-# so that /tmp/gh_rel.json contains the compute-runtime release metadata.
+# so that TOOLS_GH_REL_JSON contains the compute-runtime release metadata.
# Sets the variable named by $1 (default: igc_tag) to the discovered tag.
# ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
_resolve_igc_tag() {
local -n _out_ref="${1:-igc_tag}"
_out_ref="latest"
- if [[ -f /tmp/gh_rel.json ]]; then
+ if [[ -n "${TOOLS_GH_REL_JSON:-}" && -f "$TOOLS_GH_REL_JSON" ]]; then
local _body _parsed
- _body=$(jq -r '.body // empty' /tmp/gh_rel.json 2>/dev/null) || return 0
+ _body=$(jq -r '.body // empty' "$TOOLS_GH_REL_JSON" 2>/dev/null) || return 0
_parsed=$(grep -oP 'intel-graphics-compiler/releases/tag/\K[^\s\)]+' <<<"$_body" | head -1)
[[ -n "$_parsed" ]] && _out_ref="$_parsed"
fi
@@ -5281,7 +5417,7 @@ _setup_intel_arc() {
if [[ "$os_codename" == "trixie" || "$os_codename" == "sid" ]]; then
msg_info "Fetching Intel compute-runtime from GitHub for Arc support"
- # Fetch a compute-runtime package first so /tmp/gh_rel.json is populated,
+ # Fetch a compute-runtime package first so TOOLS_GH_REL_JSON is populated,
# then resolve the matching IGC tag from the release notes.
# libigdgmm - bundled in compute-runtime releases
fetch_and_deploy_gh_release "libigdgmm12" "intel/compute-runtime" "binary" "latest" "" "libigdgmm12_*_amd64.deb" || true
@@ -5345,7 +5481,7 @@ _setup_intel_modern() {
if [[ "$os_codename" == "trixie" || "$os_codename" == "sid" ]]; then
msg_info "Fetching Intel compute-runtime from GitHub"
- # Fetch a compute-runtime package first so /tmp/gh_rel.json is populated,
+ # Fetch a compute-runtime package first so TOOLS_GH_REL_JSON is populated,
# then resolve the matching IGC tag from the release notes.
# libigdgmm first (bundled in compute-runtime releases)
fetch_and_deploy_gh_release "libigdgmm12" "intel/compute-runtime" "binary" "latest" "" "libigdgmm12_*_amd64.deb" || true
@@ -6399,7 +6535,7 @@ EOF
fi
# Scenario 1: Already installed at target version - just update packages
- if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" == "$MARIADB_VERSION" ]]; then
+ if [[ -n "$CURRENT_VERSION" ]] && version_matches_spec "$CURRENT_VERSION" "$MARIADB_VERSION"; then
msg_info "Update MariaDB $MARIADB_VERSION"
# Ensure APT is working
@@ -6431,7 +6567,7 @@ EOF
fi
# Scenario 2b: Different version installed - clean upgrade
- if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" != "$MARIADB_VERSION" ]]; then
+ if [[ -n "$CURRENT_VERSION" ]] && ! version_matches_spec "$CURRENT_VERSION" "$MARIADB_VERSION"; then
msg_info "Upgrade MariaDB from $CURRENT_VERSION to $MARIADB_VERSION"
remove_old_tool_version "mariadb"
fi
@@ -6720,29 +6856,22 @@ setup_meilisearch() {
fi
fi
- # If migration is needed but dump failed, we have options:
- # 1. Abort the update (safest, but annoying)
- # 2. Backup data directory and proceed (allows manual recovery)
- # 3. Just proceed and hope for the best (dangerous)
- # We choose option 2: backup and proceed with warning
if [[ "$NEEDS_MIGRATION" == "true" ]] && [[ -z "$DUMP_UID" ]]; then
- local MEILI_DB_PATH
- MEILI_DB_PATH=$(grep -E "^db_path\s*=" /etc/meilisearch.toml 2>/dev/null | sed 's/.*=\s*"\(.*\)"/\1/' | tr -d ' ' || true)
- MEILI_DB_PATH="${MEILI_DB_PATH:-/var/lib/meilisearch/data}"
-
- if [[ -d "$MEILI_DB_PATH" ]] && [[ -n "$(ls -A "$MEILI_DB_PATH" 2>/dev/null)" ]]; then
- local BACKUP_PATH="${MEILI_DB_PATH}.backup.$(date +%Y%m%d%H%M%S)"
- msg_warn "Backing up MeiliSearch data to ${BACKUP_PATH}"
- mv "$MEILI_DB_PATH" "$BACKUP_PATH"
- mkdir -p "$MEILI_DB_PATH"
- msg_info "Data backed up. After update, you may need to reindex your data."
- msg_info "Old data is preserved at: ${BACKUP_PATH}"
+ msg_error "MeiliSearch migration requires a successful dump before upgrade"
+ msg_error "Ensure the service is running and master_key is configured, or set MEILISEARCH_SKIP_MIGRATION=1 to force (data loss risk)"
+ if [[ "${MEILISEARCH_SKIP_MIGRATION:-}" != "1" ]]; then
+ return 100
fi
+ msg_warn "MEILISEARCH_SKIP_MIGRATION=1 â proceeding without dump (manual reindex may be required)"
fi
# Stop service and update binary
systemctl stop meilisearch
- fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary"
+ if [[ "$(arch_resolve)" == "arm64" ]]; then
+ fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "singlefile" "latest" "/usr/bin" "meilisearch-linux-aarch64"
+ else
+ fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary"
+ fi
# If migration needed and dump was created, remove old data and import dump
if [[ "$NEEDS_MIGRATION" == "true" ]] && [[ -n "$DUMP_UID" ]]; then
@@ -6810,11 +6939,18 @@ setup_meilisearch() {
# Fresh install
msg_info "Setup MeiliSearch"
- # Install binary
- fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" || {
- msg_error "Failed to install MeiliSearch binary"
- return 250
- }
+ # Install binary (meilisearch publishes only an amd64 .deb; arm64 uses the raw linux-aarch64 binary)
+ if [[ "$(arch_resolve)" == "arm64" ]]; then
+ fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "singlefile" "latest" "/usr/bin" "meilisearch-linux-aarch64" || {
+ msg_error "Failed to install MeiliSearch binary"
+ return 250
+ }
+ else
+ fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" || {
+ msg_error "Failed to install MeiliSearch binary"
+ return 250
+ }
+ fi
# Download default config
curl -fsSL https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml -o /etc/meilisearch.toml || {
@@ -7135,7 +7271,7 @@ setup_mysql() {
# Scenario 2: Use official MySQL repository (USE_MYSQL_REPO=true)
# Scenario 2a: Already at target version - just update packages
- if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" == "$MYSQL_VERSION" ]]; then
+ if [[ -n "$CURRENT_VERSION" ]] && version_matches_spec "$CURRENT_VERSION" "$MYSQL_VERSION"; then
msg_info "Update MySQL $MYSQL_VERSION"
ensure_apt_working || return 100
@@ -7151,7 +7287,7 @@ setup_mysql() {
fi
# Scenario 2: Different version installed - clean upgrade
- if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" != "$MYSQL_VERSION" ]]; then
+ if [[ -n "$CURRENT_VERSION" ]] && ! version_matches_spec "$CURRENT_VERSION" "$MYSQL_VERSION"; then
msg_info "Upgrade MySQL from $CURRENT_VERSION to $MYSQL_VERSION"
remove_old_tool_version "mysql"
else
@@ -7265,13 +7401,18 @@ EOF
# - Optionally installs or updates global npm modules
#
# Variables:
-# NODE_VERSION - Node.js version to install (default: 24 LTS)
-# NODE_MODULE - Comma-separated list of global modules (e.g. "yarn,@vue/cli@5.0.0")
+# NODE_VERSION - Node.js version to install (default: 24 LTS)
+# NODE_MODULE - Comma-separated global modules (e.g. "yarn,corepack,pnpm@10")
+# NODE_COREPACK_ENABLE - Run corepack enable after install (default: 1 when corepack is used)
# ------------------------------------------------------------------------------
setup_nodejs() {
local NODE_VERSION="${NODE_VERSION:-24}"
local NODE_MODULE="${NODE_MODULE:-}"
+ local NODE_COREPACK_ENABLE="${NODE_COREPACK_ENABLE:-1}"
+ local node_major="${NODE_VERSION%%.*}"
+ local wants_corepack=0
+ local node_setup_ok_msg=""
# ALWAYS clean up legacy installations first (nvm, etc.) to prevent conflicts
cleanup_legacy_install "nodejs"
@@ -7298,18 +7439,17 @@ setup_nodejs() {
# Upgrade to the latest minor/patch release from NodeSource
$STD apt-get install -y --only-upgrade nodejs 2>/dev/null || true
- # Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425)
- $STD npm install -g npm@11.11.0 2>/dev/null || true
-
cache_installed_version "nodejs" "$NODE_VERSION"
msg_ok "Update Node.js $NODE_VERSION"
else
# Scenario 2: Different version installed - clean upgrade
if [[ -n "$CURRENT_NODE_VERSION" && "$CURRENT_NODE_VERSION" != "$NODE_VERSION" ]]; then
msg_info "Upgrade Node.js from $CURRENT_NODE_VERSION to $NODE_VERSION"
+ node_setup_ok_msg="Upgrade Node.js to $NODE_VERSION"
remove_old_tool_version "nodejs"
else
msg_info "Setup Node.js $NODE_VERSION"
+ node_setup_ok_msg="Setup Node.js $NODE_VERSION"
fi
# Remove ALL Debian nodejs packages BEFORE adding NodeSource repo
@@ -7318,6 +7458,7 @@ setup_nodejs() {
$STD apt purge -y nodejs nodejs-doc libnode* node-* 2>/dev/null || true
$STD apt autoremove -y 2>/dev/null || true
$STD apt clean 2>/dev/null || true
+ msg_ok "Removed Debian-packaged Node.js"
fi
# Remove any APT pinning (not needed)
@@ -7363,17 +7504,19 @@ setup_nodejs() {
return 127
fi
- # Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425)
- local NPM_VERSION
- NPM_VERSION=$(npm -v 2>/dev/null || echo "0")
- if [[ "$NPM_VERSION" != "0" ]]; then
- $STD npm install -g npm@11.11.0 2>/dev/null || {
- msg_warn "Failed to update npm to 11.11.0 (continuing with bundled npm $NPM_VERSION)"
- }
- fi
-
cache_installed_version "nodejs" "$NODE_VERSION"
- msg_ok "Setup Node.js $NODE_VERSION"
+ msg_ok "$node_setup_ok_msg"
+ fi
+
+ # Node 22.22.2 bundles npm 10.9.7 which cannot self-upgrade (nodejs/node#62425)
+ if [[ "$NODE_VERSION" == "22" && "$(npm -v 2>/dev/null)" == "10.9.7" ]]; then
+ msg_info "Updating npm (Node 22 regression fix)"
+ $STD npm install -g npm@10.9.8 2>/dev/null || true
+ if $STD npm install -g npm@latest 2>/dev/null; then
+ msg_ok "Updated npm ($(npm -v))"
+ else
+ msg_warn "npm update failed on Node 22.22.2"
+ fi
fi
# Set a safe default heap limit for Node.js builds if not explicitly provided.
@@ -7418,12 +7561,18 @@ setup_nodejs() {
}
# Install global Node modules
- if [[ -n "$NODE_MODULE" ]]; then
+ if [[ -n "$NODE_MODULE" ]] || (( node_major >= 25 )); then
+ if (( node_major >= 25 )) && [[ ",${NODE_MODULE}," != *",corepack,"* ]] && [[ "$NODE_MODULE" != corepack* ]]; then
+ NODE_MODULE="${NODE_MODULE:+$NODE_MODULE,}corepack"
+ fi
+
IFS=',' read -ra MODULES <<<"$NODE_MODULE"
- # Pin pnpm to v10 to avoid breaking changes from newer major versions
for i in "${!MODULES[@]}"; do
- if [[ "${MODULES[$i]}" =~ ^pnpm(@.*)?$ ]]; then
+ if [[ "${MODULES[$i]}" == "corepack" || "${MODULES[$i]}" == corepack@* ]]; then
+ wants_corepack=1
+ fi
+ if [[ "${MODULES[$i]}" == "pnpm" ]]; then
MODULES[$i]="pnpm@^10"
fi
done
@@ -7449,33 +7598,43 @@ setup_nodejs() {
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' 2>/dev/null | tr -d '[:space:]' || echo '')"
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
- msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
- if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
+ msg_info "Updating $MODULE_NAME to v$MODULE_REQ_VERSION"
+ if $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
+ msg_ok "Updated $MODULE_NAME"
+ else
msg_warn "Failed to update $MODULE_NAME to version $MODULE_REQ_VERSION"
((failed_modules++)) || true
- continue
fi
elif [[ "$MODULE_REQ_VERSION" == "latest" ]]; then
msg_info "Updating $MODULE_NAME to latest version"
- if ! $STD npm install -g "${MODULE_NAME}@latest" 2>/dev/null; then
+ if $STD npm install -g "${MODULE_NAME}@latest" 2>/dev/null; then
+ msg_ok "Updated $MODULE_NAME"
+ else
msg_warn "Failed to update $MODULE_NAME to latest version"
((failed_modules++)) || true
- continue
fi
fi
else
msg_info "Installing $MODULE_NAME@$MODULE_REQ_VERSION"
- if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
+ if $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
+ msg_ok "Installed $MODULE_NAME"
+ else
msg_warn "Failed to install $MODULE_NAME@$MODULE_REQ_VERSION"
((failed_modules++)) || true
- continue
fi
fi
done
- if [[ $failed_modules -eq 0 ]]; then
- msg_ok "Installed Node.js modules: $NODE_MODULE"
+ if (( failed_modules > 0 )); then
+ msg_warn "$failed_modules Node.js module(s) failed: $NODE_MODULE"
+ fi
+ fi
+
+ if [[ "$NODE_COREPACK_ENABLE" == "1" ]] && (( wants_corepack )) && command -v corepack >/dev/null 2>&1; then
+ msg_info "Enabling corepack"
+ if $STD corepack enable 2>/dev/null; then
+ msg_ok "Enabled corepack"
else
- msg_warn "Installed Node.js modules with $failed_modules failure(s): $NODE_MODULE"
+ msg_warn "corepack enable failed"
fi
fi
}
@@ -8293,29 +8452,34 @@ setup_ruby() {
fi
# Install ruby-build plugin
- if [[ ! -d "$RBENV_DIR/plugins/ruby-build" ]]; then
+ _install_ruby_build_plugin() {
local RUBY_BUILD_RELEASE
RUBY_BUILD_RELEASE=$(get_latest_github_release "rbenv/ruby-build") || {
msg_error "Failed to fetch latest ruby-build version from GitHub"
- rm -rf "$TMP_DIR"
return 7
}
if ! curl_with_retry "https://github.com/rbenv/ruby-build/archive/refs/tags/v${RUBY_BUILD_RELEASE}.tar.gz" "$TMP_DIR/ruby-build.tar.gz"; then
msg_error "Failed to download ruby-build"
msg_error "Hint: Check connectivity to github.com/rbenv/ruby-build"
- rm -rf "$TMP_DIR"
return 7
fi
tar -xzf "$TMP_DIR/ruby-build.tar.gz" -C "$TMP_DIR" || {
msg_error "Failed to extract ruby-build"
- rm -rf "$TMP_DIR"
return 251
}
mkdir -p "$RBENV_DIR/plugins/ruby-build"
cp -r "$TMP_DIR/ruby-build-${RUBY_BUILD_RELEASE}/." "$RBENV_DIR/plugins/ruby-build/"
+ return 0
+ }
+
+ if [[ ! -d "$RBENV_DIR/plugins/ruby-build" ]]; then
+ _install_ruby_build_plugin || {
+ rm -rf "$TMP_DIR"
+ return 7
+ }
fi
# Setup PATH and install Ruby version
@@ -8323,6 +8487,14 @@ setup_ruby() {
eval "$("$RBENV_BIN" init - bash)" 2>/dev/null || true
if ! "$RBENV_BIN" versions --bare 2>/dev/null | grep -qx "$RUBY_VERSION"; then
+ if [[ ! -f "$RBENV_DIR/plugins/ruby-build/share/ruby-build/$RUBY_VERSION" ]]; then
+ msg_info "Updating ruby-build definitions"
+ _install_ruby_build_plugin || {
+ rm -rf "$TMP_DIR"
+ return 7
+ }
+ msg_ok "Updated ruby-build definitions"
+ fi
$STD "$RBENV_BIN" install "$RUBY_VERSION" || {
msg_error "Failed to install Ruby $RUBY_VERSION"
rm -rf "$TMP_DIR"
@@ -8518,13 +8690,10 @@ setup_uv() {
local UV_BIN="/usr/local/bin/uv"
local UVX_BIN="/usr/local/bin/uvx"
local TMP_DIR=$(mktemp -d)
- local CACHED_VERSION
# trap for TMP Cleanup
trap "rm -rf '$TMP_DIR'" EXIT
- CACHED_VERSION=$(get_cached_version "uv")
-
# Architecture Detection
local ARCH=$(uname -m)
local OS_TYPE=""
@@ -8554,12 +8723,14 @@ setup_uv() {
ensure_dependencies jq
- # Fetch latest version
- local LATEST_VERSION
- LATEST_VERSION=$(get_latest_github_release "astral-sh/uv") || {
- msg_error "Could not fetch latest uv version from GitHub API"
- return 7
- }
+ # Fetch target version (pinned via UV_VERSION or latest release)
+ local TARGET_VERSION="${UV_VERSION:-}"
+ if [[ -z "$TARGET_VERSION" ]]; then
+ TARGET_VERSION=$(get_latest_github_release "astral-sh/uv") || {
+ msg_error "Could not fetch latest uv version from GitHub API"
+ return 7
+ }
+ fi
# Get currently installed version
local INSTALLED_VERSION=""
@@ -8567,9 +8738,9 @@ setup_uv() {
INSTALLED_VERSION=$("$UV_BIN" --version 2>/dev/null | awk '{print $2}')
fi
- # Scenario 1: Already at latest version
- if [[ -n "$INSTALLED_VERSION" && "$INSTALLED_VERSION" == "$LATEST_VERSION" ]]; then
- cache_installed_version "uv" "$LATEST_VERSION"
+ # Scenario 1: Already at target version
+ if [[ -n "$INSTALLED_VERSION" && "$INSTALLED_VERSION" == "$TARGET_VERSION" ]]; then
+ cache_installed_version "uv" "$TARGET_VERSION"
# Check if uvx is needed and missing
if [[ "${USE_UVX:-NO}" == "YES" ]] && [[ ! -x "$UVX_BIN" ]]; then
@@ -8582,13 +8753,13 @@ setup_uv() {
fi
# Scenario 2: New install or upgrade
- if [[ -n "$INSTALLED_VERSION" && "$INSTALLED_VERSION" != "$LATEST_VERSION" ]]; then
- msg_info "Upgrade uv from $INSTALLED_VERSION to $LATEST_VERSION"
+ if [[ -n "$INSTALLED_VERSION" && "$INSTALLED_VERSION" != "$TARGET_VERSION" ]]; then
+ msg_info "Upgrade uv from $INSTALLED_VERSION to $TARGET_VERSION"
else
- msg_info "Setup uv $LATEST_VERSION"
+ msg_info "Setup uv $TARGET_VERSION"
fi
- local UV_URL="https://github.com/astral-sh/uv/releases/download/${LATEST_VERSION}/${UV_TAR}"
+ local UV_URL="https://github.com/astral-sh/uv/releases/download/${TARGET_VERSION}/${UV_TAR}"
if ! curl_with_retry "$UV_URL" "$TMP_DIR/uv.tar.gz"; then
msg_error "Failed to download uv from $UV_URL"
@@ -8643,8 +8814,8 @@ setup_uv() {
msg_ok "Python $PYTHON_VERSION installed"
fi
- cache_installed_version "uv" "$LATEST_VERSION"
- msg_ok "Setup uv $LATEST_VERSION"
+ cache_installed_version "uv" "$TARGET_VERSION"
+ msg_ok "Setup uv $TARGET_VERSION"
}
# Helper function to install uvx wrapper
@@ -9000,6 +9171,10 @@ check_for_gl_release() {
ensure_dependencies jq
+ local gl_check_json
+ gl_check_json=$(mktemp /tmp/tools-gl-check-XXXXXX.json) || return 7
+ trap 'rm -f "$gl_check_json"' RETURN
+
local repo_encoded
repo_encoded=$(printf '%s' "$source" | sed 's|/|%2F|g')
@@ -9011,23 +9186,23 @@ check_for_gl_release() {
# For pinned versions, try to fetch the specific release tag first
if [[ -n "$pinned_version_in" ]]; then
local pinned_encoded="${pinned_version_in//\//%2F}"
- http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gl_check.json \
+ http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gl_check_json" \
"${header[@]}" \
"https://gitlab.com/api/v4/projects/$repo_encoded/releases/$pinned_encoded" 2>/dev/null) || true
- if [[ "$http_code" == "200" ]] && [[ -s /tmp/gl_check.json ]]; then
- releases_json="[$(/dev/null) || true
- if [[ "$http_code" == "200" ]] && [[ -s /tmp/gl_check.json ]]; then
- releases_json=$(/dev/null) || true
+ http_code=$(curl $api_timeout -sSL -w "%{http_code}" -o "$gl_rel_json" "${header[@]}" "$api_url" 2>/dev/null) || true
if [[ "$http_code" == "200" ]]; then
success=true
break
@@ -9334,7 +9513,7 @@ fetch_and_deploy_gl_release() {
fi
local json tag_name
- json=$(/dev/null)" = "arm64" ]; then
+ echo -e "${RD}Intel HW acceleration is only available on x86 (Intel) systems.${CL}"
+ exit 0
+fi
+
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Add Intel HW Acceleration" --yesno "This Will Add Intel HW Acceleration to an existing LXC Container. Proceed?" 8 72
NODE=$(hostname)
PREV_MENU=()
diff --git a/tools/pve/microcode.sh b/tools/pve/microcode.sh
index b1b236ad5..4ac47b51d 100644
--- a/tools/pve/microcode.sh
+++ b/tools/pve/microcode.sh
@@ -139,6 +139,12 @@ if ! command -v pveversion >/dev/null 2>&1; then
exit
fi
+if [ "$(dpkg --print-architecture 2>/dev/null)" = "arm64" ]; then
+ header_info
+ msg_error "CPU microcode updates are only available for x86 (Intel/AMD) systems."
+ exit 0
+fi
+
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Processor Microcode" --yesno "This will check for CPU microcode packages with the option to install. Proceed?" 10 58
msg_info "Checking CPU Vendor"
diff --git a/tools/pve/pbs-microcode.sh b/tools/pve/pbs-microcode.sh
index 0c6222899..e592e8e95 100644
--- a/tools/pve/pbs-microcode.sh
+++ b/tools/pve/pbs-microcode.sh
@@ -157,6 +157,12 @@ if [ ! -f /etc/proxmox-backup/user.cfg ]; then
exit
fi
+if [ "$(dpkg --print-architecture 2>/dev/null)" = "arm64" ]; then
+ header_info
+ msg_error "CPU microcode updates are only available for x86 (Intel/AMD) systems."
+ exit 0
+fi
+
whiptail --backtitle "Proxmox Backup Server Helper Scripts" \
--title "Proxmox Backup Server Processor Microcode" \
--yesno "This script searches for CPU microcode packages and offers the option to install them.\nProceed?" 10 68
diff --git a/tools/pve/pbs3-upgrade.sh b/tools/pve/pbs3-upgrade.sh
index aa41e3512..fe0f14790 100644
--- a/tools/pve/pbs3-upgrade.sh
+++ b/tools/pve/pbs3-upgrade.sh
@@ -175,4 +175,10 @@ while true; do
esac
done
+if [ "$(dpkg --print-architecture 2>/dev/null)" = "arm64" ]; then
+ header_info
+ msg_error "This upgrade script targets the amd64 Proxmox repositories and is not supported on ARM64."
+ exit 1
+fi
+
start_routines
diff --git a/tools/pve/pbs4-upgrade.sh b/tools/pve/pbs4-upgrade.sh
index 73304b62d..172617fd6 100644
--- a/tools/pve/pbs4-upgrade.sh
+++ b/tools/pve/pbs4-upgrade.sh
@@ -199,4 +199,10 @@ while true; do
esac
done
+if [ "$(dpkg --print-architecture 2>/dev/null)" = "arm64" ]; then
+ header_info
+ msg_error "This upgrade script targets the amd64 Proxmox repositories and is not supported on ARM64."
+ exit 1
+fi
+
start_routines
diff --git a/tools/pve/post-pbs-install.sh b/tools/pve/post-pbs-install.sh
index b099d7032..9c4af7664 100644
--- a/tools/pve/post-pbs-install.sh
+++ b/tools/pve/post-pbs-install.sh
@@ -135,6 +135,12 @@ EOF
no) msg_error "Selected no to Correcting Debian Sources" ;;
esac
+ if [[ "$(dpkg --print-architecture 2>/dev/null)" == "arm64" ]]; then
+ msg_ok "ARM64 detected - skipping Proxmox repository setup"
+ post_routines_common
+ return
+ fi
+
# --- Enterprise repo ---
read -r state file <<<"$(repo_state_list pbs-enterprise)"
case $state in
@@ -209,6 +215,12 @@ EOF
no) msg_error "Selected no to Correcting Debian Sources" ;;
esac
+ if [[ "$(dpkg --print-architecture 2>/dev/null)" == "arm64" ]]; then
+ msg_ok "ARM64 detected - skipping Proxmox repository setup"
+ post_routines_common
+ return
+ fi
+
# --- Enterprise repo ---
if component_exists_in_sources "pbs-enterprise"; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PBS Enterprise Repository" --menu \
diff --git a/tools/pve/post-pmg-install.sh b/tools/pve/post-pmg-install.sh
index 2f8627358..519fe39de 100644
--- a/tools/pve/post-pmg-install.sh
+++ b/tools/pve/post-pmg-install.sh
@@ -53,6 +53,11 @@ if ! dpkg -s proxmox-mailgateway-container >/dev/null 2>&1 &&
exit 232
fi
+if [ "$(dpkg --print-architecture 2>/dev/null)" = "arm64" ]; then
+ msg_error "Proxmox Mail Gateway does not support ARM64."
+ exit 1
+fi
+
repo_state() {
# $1 = repo name (e.g. pmg-enterprise, pmg-no-subscription, pmgtest)
local repo="$1"
diff --git a/tools/pve/post-pve-install.sh b/tools/pve/post-pve-install.sh
index 9e07cd906..ffecb812e 100644
--- a/tools/pve/post-pve-install.sh
+++ b/tools/pve/post-pve-install.sh
@@ -125,6 +125,12 @@ EOF
no) msg_error "Selected no to Correcting Proxmox VE Sources" ;;
esac
+ if [[ "$(dpkg --print-architecture 2>/dev/null)" == "arm64" ]]; then
+ msg_ok "ARM64 detected - skipping Proxmox repository setup"
+ post_routines_common
+ return
+ fi
+
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVE-ENTERPRISE" --menu "The 'pve-enterprise' repository is only available to users who have purchased a Proxmox VE subscription.\n \nDisable 'pve-enterprise' repository?" 14 58 2 \
"yes" " " \
"no" " " 3>&2 2>&1 1>&3)
@@ -282,6 +288,12 @@ EOF
esac
fi
+ if [[ "$(dpkg --print-architecture 2>/dev/null)" == "arm64" ]]; then
+ msg_ok "ARM64 detected - skipping Proxmox repository setup"
+ post_routines_common
+ return
+ fi
+
# ---- PVE-ENTERPRISE ----
if component_exists_in_sources "pve-enterprise"; then
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
diff --git a/tools/pve/pve8-upgrade.sh b/tools/pve/pve8-upgrade.sh
index 7149002ff..3db17a109 100644
--- a/tools/pve/pve8-upgrade.sh
+++ b/tools/pve/pve8-upgrade.sh
@@ -131,6 +131,12 @@ if ! command -v pveversion >/dev/null 2>&1; then
exit
fi
+if [ "$(dpkg --print-architecture 2>/dev/null)" = "arm64" ]; then
+ header_info
+ msg_error "This upgrade script targets the amd64 Proxmox VE repositories and is not supported on ARM64."
+ exit 1
+fi
+
if ! pveversion | grep -Eq "pve-manager/(7\.4-(16|17|18|19))"; then
header_info
msg_error "This version of Proxmox Virtual Environment is not supported"
diff --git a/tools/pve/update-apps.sh b/tools/pve/update-apps.sh
index e8164b9f7..6e2bd3aac 100644
--- a/tools/pve/update-apps.sh
+++ b/tools/pve/update-apps.sh
@@ -145,11 +145,35 @@ function header_info {
EOF
}
+function sanitize_service_name() {
+ local name="${1//$'\r'/}"
+ name="${name//$'\n'/}"
+ [[ -z "$name" ]] && return 1
+ [[ "$name" == *'#!'* ]] && return 1
+ [[ ! "$name" =~ ^[a-zA-Z0-9._-]+$ ]] && return 1
+ return 0
+}
+
+function validate_service_script() {
+ local name="$1"
+ sanitize_service_name "$name" || return 1
+ curl -fsSL --max-time 10 -o /dev/null \
+ "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${name}.sh" 2>/dev/null
+}
+
function detect_service() {
- pushd $(mktemp -d) >/dev/null
- pct pull "$1" /usr/bin/update update 2>/dev/null
- service=$(cat update | sed 's|.*/ct/||g' | sed 's|\.sh).*||g')
- popd >/dev/null
+ local container="$1"
+ local tmpdir update_file
+ service=""
+ tmpdir=$(mktemp -d)
+ update_file="$tmpdir/update"
+ pct pull "$container" /usr/bin/update "$update_file" 2>/dev/null || true
+ if [[ ! -s "$update_file" ]]; then
+ rm -rf "$tmpdir"
+ return 1
+ fi
+ service=$(grep -oE '/ct/[a-zA-Z0-9._-]+\.sh' "$update_file" 2>/dev/null | head -n1 | sed 's|.*/ct/||; s|\.sh$||')
+ rm -rf "$tmpdir"
}
function dry_run_container() {
@@ -447,24 +471,33 @@ for container in $CHOICE; do
#1) Detect service using the service name in the update command
detect_service $container
- #1.1) If update script not detected, return
- if [ -z "${service}" ]; then
- echo -e "${YW}[WARN]${CL} Update script not found. Skipping to next container"
- log_result "$container" "(unknown)" "SKIPPED" "No update script found in container"
- log_write "Container $container: SKIPPED â no update script found"
+ #1.1) If update script not detected or service name is invalid, skip
+ if [ -z "${service}" ] || ! sanitize_service_name "${service}"; then
+ echo -e "${RD}[ERROR]${CL} Could not detect a valid service name for container $container"
+ log_result "$container" "(unknown)" "ERROR" "Invalid or missing service name in /usr/bin/update"
+ log_write "Container $container: ERROR â invalid or missing service name"
continue
- else
- echo -e "${BL}[INFO]${CL} Detected service: ${GN}${service}${CL}"
- log_write "Container $container: detected service '$service'"
fi
+ if ! validate_service_script "${service}"; then
+ echo -e "${RD}[ERROR]${CL} Service '${service}' does not resolve to ct/${service}.sh"
+ log_result "$container" "${service}" "ERROR" "No matching ct/${service}.sh script found"
+ log_write "Container $container: ERROR â ct/${service}.sh not found"
+ continue
+ fi
+
+ echo -e "${BL}[INFO]${CL} Detected service: ${GN}${service}${CL}"
+ log_write "Container $container: detected service '${service}'"
+
#2) Extract service build/update resource requirements from config/installation file
- script=$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${service}.sh)
+ script=$(curl -fsSL "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${service}.sh")
#2.1) Check if the script downloaded successfully
- if [ $? -ne 0 ]; then
- echo -e "${RD}[ERROR]${CL} Issue while downloading install script."
- echo -e "${YW}[WARN]${CL} Unable to assess build resource requirements. Proceeding with current resources."
+ if [ $? -ne 0 ] || [ -z "${script}" ]; then
+ echo -e "${RD}[ERROR]${CL} Failed to download ct/${service}.sh"
+ log_result "$container" "${service}" "ERROR" "Failed to download ct/${service}.sh"
+ log_write "Container $container (${service}): ERROR â failed to download install script"
+ continue
fi
config=$(pct config "$container")