mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-10-27 14:42:33 +01:00
Compare commits
18
Commits
No files matched your search
Generated
+168
@@ -1,3 +1,171 @@
|
||||
## 2026-10-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- patchmon: avoids systemd environment secret leaks via D-Bus/subprocesses. [@rhclayto](https://github.com/rhclayto) ([#18074](https://github.com/community-scripts/ProxmoxVE/pull/18074))
|
||||
- fix: Linkwarden - clear Yarn berry cache after install and update- #18115 [@bferd](https://github.com/bferd) ([#18116](https://github.com/community-scripts/ProxmoxVE/pull/18116))
|
||||
- Borg-UI: recreate the borg venvs with --clear [@MickLesk](https://github.com/MickLesk) ([#18118](https://github.com/community-scripts/ProxmoxVE/pull/18118))
|
||||
- SnapOtter: recreate the AI venv with --clear [@MickLesk](https://github.com/MickLesk) ([#18119](https://github.com/community-scripts/ProxmoxVE/pull/18119))
|
||||
- Update authentik version to 2026.8.5 [@thieneret](https://github.com/thieneret) ([#18125](https://github.com/community-scripts/ProxmoxVE/pull/18125))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Frigate: bump to v0.18.2 [@MickLesk](https://github.com/MickLesk) ([#18120](https://github.com/community-scripts/ProxmoxVE/pull/18120))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- install: answer every prompt from the environment, survive a closed stdin [@MickLesk](https://github.com/MickLesk) ([#18121](https://github.com/community-scripts/ProxmoxVE/pull/18121))
|
||||
|
||||
### 🧰 Tools
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(addons): use catch_errors so the update marker is cleared [@mazelado](https://github.com/mazelado) ([#18128](https://github.com/community-scripts/ProxmoxVE/pull/18128))
|
||||
|
||||
## 2026-10-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- postgresql: default the version prompt and match Alpine's packages [@MickLesk](https://github.com/MickLesk) ([#18093](https://github.com/community-scripts/ProxmoxVE/pull/18093))
|
||||
- Storyteller: build the runtime like upstream's Dockerfile [@MickLesk](https://github.com/MickLesk) ([#18083](https://github.com/community-scripts/ProxmoxVE/pull/18083))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- proxcenter: skip the type check and lower the build heap [@MickLesk](https://github.com/MickLesk) ([#18090](https://github.com/community-scripts/ProxmoxVE/pull/18090))
|
||||
- hermesagent: retry the installer download, fall back to GitHub [@MickLesk](https://github.com/MickLesk) ([#18091](https://github.com/community-scripts/ProxmoxVE/pull/18091))
|
||||
- zabbix: use the arm64 repository for 7.0 [@MickLesk](https://github.com/MickLesk) ([#18089](https://github.com/community-scripts/ProxmoxVE/pull/18089))
|
||||
- kasm: survive a failed release lookup and answer the installer with flags [@MickLesk](https://github.com/MickLesk) ([#18092](https://github.com/community-scripts/ProxmoxVE/pull/18092))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- InvoiceShelf: run the Laravel scheduler [@MickLesk](https://github.com/MickLesk) ([#18079](https://github.com/community-scripts/ProxmoxVE/pull/18079))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- podman-homeassistant: require Debian 13 [@MickLesk](https://github.com/MickLesk) ([#18095](https://github.com/community-scripts/ProxmoxVE/pull/18095))
|
||||
- apache-guacamole: require Debian 13 [@MickLesk](https://github.com/MickLesk) ([#18094](https://github.com/community-scripts/ProxmoxVE/pull/18094))
|
||||
- unifi-os-server: require Debian 13 [@MickLesk](https://github.com/MickLesk) ([#18096](https://github.com/community-scripts/ProxmoxVE/pull/18096))
|
||||
- openwebui: drop the Intel oneAPI Base Toolkit [@MickLesk](https://github.com/MickLesk) ([#18098](https://github.com/community-scripts/ProxmoxVE/pull/18098))
|
||||
- ollama: drop the Intel oneAPI Base Toolkit [@MickLesk](https://github.com/MickLesk) ([#18097](https://github.com/community-scripts/ProxmoxVE/pull/18097))
|
||||
- tdarr: do not let a failed or slow updater block the service start [@MickLesk](https://github.com/MickLesk) ([#18100](https://github.com/community-scripts/ProxmoxVE/pull/18100))
|
||||
- immich: install mise from its GitHub release, retry jellyfin-ffmpeg, default the ML prompt [@MickLesk](https://github.com/MickLesk) ([#18099](https://github.com/community-scripts/ProxmoxVE/pull/18099))
|
||||
- Refactor: pimox-haos-vm [@MickLesk](https://github.com/MickLesk) ([#18077](https://github.com/community-scripts/ProxmoxVE/pull/18077))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Telemetry: explain and categorize by the command that failed [@MickLesk](https://github.com/MickLesk) ([core#166](https://github.com/community-scripts/core/pull/166))
|
||||
- error-handler: report a handled silent failure only on its own line [@MickLesk](https://github.com/MickLesk) ([core#165](https://github.com/community-scripts/core/pull/165))
|
||||
- VM silent: return the failure instead of exiting [@MickLesk](https://github.com/MickLesk) ([core#164](https://github.com/community-scripts/core/pull/164))
|
||||
- error-handler: keep the start explanation and the final IP lookup from failing the run [@MickLesk](https://github.com/MickLesk) ([core#163](https://github.com/community-scripts/core/pull/163))
|
||||
- error output: report a failure inside a subshell once [@MickLesk](https://github.com/MickLesk) ([core#162](https://github.com/community-scripts/core/pull/162))
|
||||
- general: allow Composer as root in every script [@MickLesk](https://github.com/MickLesk) ([core#161](https://github.com/community-scripts/core/pull/161))
|
||||
- lxc-updater: skip the resource check when the container cannot read its RAM [@MickLesk](https://github.com/MickLesk) ([core#160](https://github.com/community-scripts/core/pull/160))
|
||||
- vm-core: let vm_timezone_default survive a host without /etc/timezone [@MickLesk](https://github.com/MickLesk) ([core#159](https://github.com/community-scripts/core/pull/159))
|
||||
|
||||
## 2026-10-22
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Zabbix: keep unattended updates on the installed series [@florianpunz](https://github.com/florianpunz) ([#18051](https://github.com/community-scripts/ProxmoxVE/pull/18051))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Cryptpad [@MickLesk](https://github.com/MickLesk) ([#18065](https://github.com/community-scripts/ProxmoxVE/pull/18065))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Incus: drive a remote Incus server from the client's default remote [@MickLesk](https://github.com/MickLesk) ([core#154](https://github.com/community-scripts/core/pull/154))
|
||||
- Deploy the release again when an update is redone [@MickLesk](https://github.com/MickLesk) ([core#158](https://github.com/community-scripts/core/pull/158))
|
||||
|
||||
### ❔ Uncategorized
|
||||
|
||||
- chore(ct): sync sparkyfitness defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18061](https://github.com/community-scripts/ProxmoxVE/pull/18061))
|
||||
|
||||
## 2026-10-21
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Immich: bump release version to v3.3.5 (CVE) [@CerberusStyle](https://github.com/CerberusStyle) ([#18057](https://github.com/community-scripts/ProxmoxVE/pull/18057))
|
||||
- DroppedNeedle: pass release version to the app via COMMIT_TAG [@MickLesk](https://github.com/MickLesk) ([#18042](https://github.com/community-scripts/ProxmoxVE/pull/18042))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Keep the version an update started from across a redo [@MickLesk](https://github.com/MickLesk) ([core#156](https://github.com/community-scripts/core/pull/156))
|
||||
- Redo an update whose run did not finish after the deploy [@MickLesk](https://github.com/MickLesk) ([core#155](https://github.com/community-scripts/core/pull/155))
|
||||
|
||||
## 2026-10-20
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Plane: give Silo its own HOME [@MickLesk](https://github.com/MickLesk) ([#18028](https://github.com/community-scripts/ProxmoxVE/pull/18028))
|
||||
- Immich: Pin version to 3.3.4 [@vhsdream](https://github.com/vhsdream) ([#18036](https://github.com/community-scripts/ProxmoxVE/pull/18036))
|
||||
- InvenTree: run apt under systemd so postinst can finish [@MickLesk](https://github.com/MickLesk) ([#18029](https://github.com/community-scripts/ProxmoxVE/pull/18029))
|
||||
- Profilarr: pass the deno pin as the version [@MickLesk](https://github.com/MickLesk) ([#18025](https://github.com/community-scripts/ProxmoxVE/pull/18025))
|
||||
- Silo: keep the version file out of ~/.silo [@MickLesk](https://github.com/MickLesk) ([#18030](https://github.com/community-scripts/ProxmoxVE/pull/18030))
|
||||
- InvenTree: move to go.packager.io [@MickLesk](https://github.com/MickLesk) ([#18015](https://github.com/community-scripts/ProxmoxVE/pull/18015))
|
||||
- Zitadel: run init and setup in the foreground [@MickLesk](https://github.com/MickLesk) ([#18016](https://github.com/community-scripts/ProxmoxVE/pull/18016))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Zitadel: Support v1 and v2 Login [@MickLesk](https://github.com/MickLesk) ([#18031](https://github.com/community-scripts/ProxmoxVE/pull/18031))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: OpenWebUI (remove numba pin) [@MickLesk](https://github.com/MickLesk) ([#18026](https://github.com/community-scripts/ProxmoxVE/pull/18026))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Only treat an NVIDIA GPU as present when its device nodes are [@MickLesk](https://github.com/MickLesk) ([core#153](https://github.com/community-scripts/core/pull/153))
|
||||
|
||||
## 2026-10-19
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Calagopus ([#18012](https://github.com/community-scripts/ProxmoxVE/pull/18012))
|
||||
- Netronome ([#18011](https://github.com/community-scripts/ProxmoxVE/pull/18011))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- immich: record library revisions when the line is missing [@mazelado](https://github.com/mazelado) ([#17990](https://github.com/community-scripts/ProxmoxVE/pull/17990))
|
||||
- Update authentik 2026.8.4 [@thieneret](https://github.com/thieneret) ([#18004](https://github.com/community-scripts/ProxmoxVE/pull/18004))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(mealie): add reverse proxy auth settings to mealie.env [@bferd](https://github.com/bferd) ([#18006](https://github.com/community-scripts/ProxmoxVE/pull/18006))
|
||||
|
||||
## 2026-10-18
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Donetick: create selfhosted.yaml from the example [@MickLesk](https://github.com/MickLesk) ([#17992](https://github.com/community-scripts/ProxmoxVE/pull/17992))
|
||||
- Wiki.js: only back up db.sqlite on SQLite installs [@MickLesk](https://github.com/MickLesk) ([#17993](https://github.com/community-scripts/ProxmoxVE/pull/17993))
|
||||
- FlareSolverr: pass Chrome an en-US Accept-Language [@MickLesk](https://github.com/MickLesk) ([#17995](https://github.com/community-scripts/ProxmoxVE/pull/17995))
|
||||
- 2FAuth: install the locked dependencies [@MickLesk](https://github.com/MickLesk) ([#17996](https://github.com/community-scripts/ProxmoxVE/pull/17996))
|
||||
- Tracearr: drop the pnpm store after the update build [@gioxx](https://github.com/gioxx) ([#17869](https://github.com/community-scripts/ProxmoxVE/pull/17869))
|
||||
- vaultwarden: build before stopping the service [@mazelado](https://github.com/mazelado) ([#17983](https://github.com/community-scripts/ProxmoxVE/pull/17983))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- fix: geopulse 2.0.0 upgrade support (nginx .mjs, pg18, jwt cleanup) [@CrazyWolf13](https://github.com/CrazyWolf13) ([#17978](https://github.com/community-scripts/ProxmoxVE/pull/17978))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Let get_current_ip reach its IPv6 fallback [@MickLesk](https://github.com/MickLesk) ([core#151](https://github.com/community-scripts/core/pull/151))
|
||||
- Drop apt autoclean before apt clean [@MickLesk](https://github.com/MickLesk) ([core#152](https://github.com/community-scripts/core/pull/152))
|
||||
- Silence apt's script warning in $STD [@MickLesk](https://github.com/MickLesk) ([core#150](https://github.com/community-scripts/core/pull/150))
|
||||
|
||||
## 2026-10-17
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
+33
-152
@@ -119,6 +119,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -132,7 +135,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
|
||||
<details>
|
||||
<summary><h4>October (17 entries)</h4></summary>
|
||||
<summary><h4>October (24 entries)</h4></summary>
|
||||
|
||||
[View October 2026 Changelog](.github/changelogs/2026/10.md)
|
||||
|
||||
@@ -565,6 +568,34 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-10-25
|
||||
|
||||
## 2026-10-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- patchmon: avoids systemd environment secret leaks via D-Bus/subprocesses. [@rhclayto](https://github.com/rhclayto) ([#18074](https://github.com/community-scripts/ProxmoxVE/pull/18074))
|
||||
- fix: Linkwarden - clear Yarn berry cache after install and update- #18115 [@bferd](https://github.com/bferd) ([#18116](https://github.com/community-scripts/ProxmoxVE/pull/18116))
|
||||
- Borg-UI: recreate the borg venvs with --clear [@MickLesk](https://github.com/MickLesk) ([#18118](https://github.com/community-scripts/ProxmoxVE/pull/18118))
|
||||
- SnapOtter: recreate the AI venv with --clear [@MickLesk](https://github.com/MickLesk) ([#18119](https://github.com/community-scripts/ProxmoxVE/pull/18119))
|
||||
- Update authentik version to 2026.8.5 [@thieneret](https://github.com/thieneret) ([#18125](https://github.com/community-scripts/ProxmoxVE/pull/18125))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Frigate: bump to v0.18.2 [@MickLesk](https://github.com/MickLesk) ([#18120](https://github.com/community-scripts/ProxmoxVE/pull/18120))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- install: answer every prompt from the environment, survive a closed stdin [@MickLesk](https://github.com/MickLesk) ([#18121](https://github.com/community-scripts/ProxmoxVE/pull/18121))
|
||||
|
||||
### 🧰 Tools
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(addons): use catch_errors so the update marker is cleared [@mazelado](https://github.com/mazelado) ([#18128](https://github.com/community-scripts/ProxmoxVE/pull/18128))
|
||||
|
||||
## 2026-10-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
@@ -1249,154 +1280,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- Incus: make prompts visible for end-user [@MickLesk](https://github.com/MickLesk) ([core#73](https://github.com/community-scripts/core/pull/73))
|
||||
- incus: do not let an install script block on an invisible prompt [@MickLesk](https://github.com/MickLesk) ([core#71](https://github.com/community-scripts/core/pull/71))
|
||||
- tel: report progress from installs only, not updates [@MickLesk](https://github.com/MickLesk) ([core#72](https://github.com/community-scripts/core/pull/72))
|
||||
|
||||
## 2026-09-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Declare the RomM filesystem structure required since 5.3.0 [@MickLesk](https://github.com/MickLesk) ([#17480](https://github.com/community-scripts/ProxmoxVE/pull/17480))
|
||||
- general: use apt_update_safe instead of aborting on a failed apt update [@MickLesk](https://github.com/MickLesk) ([#17462](https://github.com/community-scripts/ProxmoxVE/pull/17462))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Journiv: Serve Node Frontend and add HTTP Auth .env [@MickLesk](https://github.com/MickLesk) ([#17479](https://github.com/community-scripts/ProxmoxVE/pull/17479))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- core: accept an off-subnet gateway for /31 and /32 [@MickLesk](https://github.com/MickLesk) ([core#70](https://github.com/community-scripts/core/pull/70))
|
||||
|
||||
## 2026-09-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(signoz): install the histogramQuantile ClickHouse function [@maksimtech](https://github.com/maksimtech) ([#17386](https://github.com/community-scripts/ProxmoxVE/pull/17386))
|
||||
- omniroute: bump to 4 GB for the npm install [@MickLesk](https://github.com/MickLesk) ([#17461](https://github.com/community-scripts/ProxmoxVE/pull/17461))
|
||||
- Run Borg-UI with a single gunicorn worker [@MickLesk](https://github.com/MickLesk) ([#17445](https://github.com/community-scripts/ProxmoxVE/pull/17445))
|
||||
- immich: keep geodata linked and the build deps present on update [@MickLesk](https://github.com/MickLesk) ([#17438](https://github.com/community-scripts/ProxmoxVE/pull/17438))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Scanopy [@MickLesk](https://github.com/MickLesk) ([#16797](https://github.com/community-scripts/ProxmoxVE/pull/16797))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- stop a partial find from aborting the caller under pipefail [@MickLesk](https://github.com/MickLesk) ([core#68](https://github.com/community-scripts/core/pull/68))
|
||||
- core: give RHEL-family containers an ostype PVE accepts [@MickLesk](https://github.com/MickLesk) ([core#67](https://github.com/community-scripts/core/pull/67))
|
||||
- core: do not abort on a failed apt update [@MickLesk](https://github.com/MickLesk) ([core#66](https://github.com/community-scripts/core/pull/66))
|
||||
- VM's: report a finished VM as done, not aborted [@MickLesk](https://github.com/MickLesk) ([core#65](https://github.com/community-scripts/core/pull/65))
|
||||
- VM-Core: decide console autologin from the image, not USE_CLOUD_INIT [@MickLesk](https://github.com/MickLesk) ([core#63](https://github.com/community-scripts/core/pull/63))
|
||||
- VM-Core: report failed image steps and restore tty1 autologin without cloud-init [@MickLesk](https://github.com/MickLesk) ([core#62](https://github.com/community-scripts/core/pull/62))
|
||||
- tools: raise pnpm/yarn fetch timeout and lower network concurrency [@MickLesk](https://github.com/MickLesk) ([core#59](https://github.com/community-scripts/core/pull/59))
|
||||
- VM-Core: stop discarding cloud-init error messages [@MickLesk](https://github.com/MickLesk) ([core#60](https://github.com/community-scripts/core/pull/60))
|
||||
|
||||
## 2026-09-22
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(invoiceshelf): re-link storage during update [@owenvoke](https://github.com/owenvoke) ([#17431](https://github.com/community-scripts/ProxmoxVE/pull/17431))
|
||||
- fix(alpine-it-tools): write the version file after a successful update [@Houtek](https://github.com/Houtek) ([#17421](https://github.com/community-scripts/ProxmoxVE/pull/17421))
|
||||
- Umami: Align pnpm with engines.pnpm on update [@ReneNulschDE](https://github.com/ReneNulschDE) ([#17404](https://github.com/community-scripts/ProxmoxVE/pull/17404))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- several scripts: let uv see the project before syncing it | refactor some scripts that use uv [@MickLesk](https://github.com/MickLesk) ([#17436](https://github.com/community-scripts/ProxmoxVE/pull/17436))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- setup_uv: honour a project's required-version pin [@MickLesk](https://github.com/MickLesk) ([core#58](https://github.com/community-scripts/core/pull/58))
|
||||
- fix(motd): repair legacy 00_lxc-details.sh header and dead color placeholders [@BadFlo](https://github.com/BadFlo) ([core#53](https://github.com/community-scripts/core/pull/53))
|
||||
- meilisearch: take the raw binary, not the .deb [@MickLesk](https://github.com/MickLesk) ([core#57](https://github.com/community-scripts/core/pull/57))
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- github: Stop generating header filenames with a newline in them [@MickLesk](https://github.com/MickLesk) ([#17435](https://github.com/community-scripts/ProxmoxVE/pull/17435))
|
||||
|
||||
### ❔ Uncategorized
|
||||
|
||||
- chore(ct): sync cloudflare-ddns defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#17446](https://github.com/community-scripts/ProxmoxVE/pull/17446))
|
||||
|
||||
## 2026-09-21
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- AudioMuse-AI ([#17415](https://github.com/community-scripts/ProxmoxVE/pull/17415))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(portabase): meet the default admin password rules [@maksimtech](https://github.com/maksimtech) ([#17384](https://github.com/community-scripts/ProxmoxVE/pull/17384))
|
||||
- truenas-vm: strip the G before the storage allocation [@MickLesk](https://github.com/MickLesk) ([#17407](https://github.com/community-scripts/ProxmoxVE/pull/17407))
|
||||
- Librenms - Fix local snmpd community string setup [@dopch](https://github.com/dopch) ([#17363](https://github.com/community-scripts/ProxmoxVE/pull/17363))
|
||||
- fix(iventoy): preserve release data and migrate legacy service launchers [@Msprg](https://github.com/Msprg) ([#17161](https://github.com/community-scripts/ProxmoxVE/pull/17161))
|
||||
- xyops: bump Node.js from 22 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#17398](https://github.com/community-scripts/ProxmoxVE/pull/17398))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Generate app headers [@github-actions[bot]](https://github.com/github-actions[bot]) ([core#56](https://github.com/community-scripts/core/pull/56))
|
||||
- github-api: take the release the maintainer marked as latest [@MickLesk](https://github.com/MickLesk) ([core#55](https://github.com/community-scripts/core/pull/55))
|
||||
- general: prune old Rust toolchains [@MickLesk](https://github.com/MickLesk) ([core#52](https://github.com/community-scripts/core/pull/52))
|
||||
- Ask when the preselected storage cannot hold the content [@MickLesk](https://github.com/MickLesk) ([core#51](https://github.com/community-scripts/core/pull/51))
|
||||
|
||||
## 2026-09-20
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Your-Spotify ([#17376](https://github.com/community-scripts/ProxmoxVE/pull/17376))
|
||||
|
||||
## 2026-09-19
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- qBit-Manage ([#17377](https://github.com/community-scripts/ProxmoxVE/pull/17377))
|
||||
- Ubuntu-VM: AIO | new core | performance | remove old wrappers [@MickLesk](https://github.com/MickLesk) ([#17354](https://github.com/community-scripts/ProxmoxVE/pull/17354))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Fall back to the unversioned banner slug [@MickLesk](https://github.com/MickLesk) ([core#48](https://github.com/community-scripts/core/pull/48))
|
||||
|
||||
### ❔ Uncategorized
|
||||
|
||||
- chore(ct): sync immichframe defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#17373](https://github.com/community-scripts/ProxmoxVE/pull/17373))
|
||||
|
||||
## 2026-09-18
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Almalinux-VM ([#17349](https://github.com/community-scripts/ProxmoxVE/pull/17349))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- update authentik to 2026.8.3 [@thieneret](https://github.com/thieneret) ([#17366](https://github.com/community-scripts/ProxmoxVE/pull/17366))
|
||||
- crafty-controller: chown after restore_backup so restored data keeps ownership [@MickLesk](https://github.com/MickLesk) ([#17348](https://github.com/community-scripts/ProxmoxVE/pull/17348))
|
||||
- databasus, domain-monitor, poznote: chown after restore_backup so restored data keeps its owner [@MickLesk](https://github.com/MickLesk) ([#17350](https://github.com/community-scripts/ProxmoxVE/pull/17350))
|
||||
- alpine-vm: ask for the Cloud-Init credentials [@MickLesk](https://github.com/MickLesk) ([#17355](https://github.com/community-scripts/ProxmoxVE/pull/17355))
|
||||
- suggestarr: keep the data where the app actually reads it [@MickLesk](https://github.com/MickLesk) ([#17317](https://github.com/community-scripts/ProxmoxVE/pull/17317))
|
||||
- immichframe: set the admin password the new admin UI requires [@MickLesk](https://github.com/MickLesk) ([#17315](https://github.com/community-scripts/ProxmoxVE/pull/17315))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- pangolin: Bump to 1.23.0 [@MickLesk](https://github.com/MickLesk) ([#17343](https://github.com/community-scripts/ProxmoxVE/pull/17343))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Oxicloud [@MickLesk](https://github.com/MickLesk) ([#17338](https://github.com/community-scripts/ProxmoxVE/pull/17338))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- Stop a modified conffile from aborting the whole update [@MickLesk](https://github.com/MickLesk) ([core#47](https://github.com/community-scripts/core/pull/47))
|
||||
- Generate app headers [@github-actions[bot]](https://github.com/github-actions[bot]) ([core#46](https://github.com/community-scripts/core/pull/46))
|
||||
- github api: retry a 200 that is not a usable release payload [@MickLesk](https://github.com/MickLesk) ([core#45](https://github.com/community-scripts/core/pull/45))
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- chore: fix PR template help [@CrazyWolf13](https://github.com/CrazyWolf13) ([#17364](https://github.com/community-scripts/ProxmoxVE/pull/17364))
|
||||
- tel: report progress from installs only, not updates [@MickLesk](https://github.com/MickLesk) ([core#72](https://github.com/community-scripts/core/pull/72))
|
||||
+1
-1
@@ -47,7 +47,7 @@ function update_script() {
|
||||
RUST_PROFILE="minimal" RUST_TOOLCHAIN="stable" setup_rust
|
||||
setup_yq
|
||||
|
||||
AUTHENTIK_VERSION="version/2026.8.4"
|
||||
AUTHENTIK_VERSION="version/2026.8.5"
|
||||
# Source: https://github.com/goauthentik/fips/blob/main/Makefile#L26
|
||||
XMLSEC_VERSION="1.3.12"
|
||||
|
||||
|
||||
+2
-2
@@ -69,7 +69,7 @@ function update_script() {
|
||||
|
||||
if [[ "$(cat /opt/borg1-venv/.pinned_version 2>/dev/null)" != "$BORG1_VERSION" ]]; then
|
||||
msg_info "Installing Borg ${BORG1_VERSION} (Patience)"
|
||||
$STD uv venv --python "$BORG_PYTHON" /opt/borg1-venv
|
||||
$STD uv venv --clear --python "$BORG_PYTHON" /opt/borg1-venv
|
||||
$STD uv pip install --python /opt/borg1-venv pyfuse3 "borgbackup==${BORG1_VERSION}"
|
||||
echo "$BORG1_VERSION" >/opt/borg1-venv/.pinned_version
|
||||
ln -sf /opt/borg1-venv/bin/borg /usr/local/bin/borg
|
||||
@@ -78,7 +78,7 @@ function update_script() {
|
||||
|
||||
if [[ "$(cat /opt/borg2-venv/.pinned_version 2>/dev/null)" != "${BORG2_VERSION}-${BORGSTORE_VERSION}" ]]; then
|
||||
msg_info "Installing Borg ${BORG2_VERSION} (Patience)"
|
||||
$STD uv venv --python "$BORG_PYTHON" /opt/borg2-venv
|
||||
$STD uv venv --clear --python "$BORG_PYTHON" /opt/borg2-venv
|
||||
$STD uv pip install --python /opt/borg2-venv pyfuse3 "borgbackup==${BORG2_VERSION}" "borgstore[rclone,sftp,rest,s3,blake3]==${BORGSTORE_VERSION}"
|
||||
echo "${BORG2_VERSION}-${BORGSTORE_VERSION}" >/opt/borg2-venv/.pinned_version
|
||||
ln -sf /opt/borg2-venv/bin/borg /usr/local/bin/borg2
|
||||
|
||||
@@ -64,6 +64,7 @@ function update_script() {
|
||||
$STD yarn prisma:deploy
|
||||
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache
|
||||
rm -rf /root/.cache/yarn
|
||||
rm -rf /root/.yarn/berry/cache
|
||||
rm -rf /opt/linkwarden/.next/cache
|
||||
msg_ok "Updated Linkwarden"
|
||||
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ EOF
|
||||
|
||||
msg_info "Updating SnapOtter"
|
||||
$STD uv python install 3.11
|
||||
$STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv
|
||||
$STD uv venv --clear --seed --python 3.11 /opt/snapotter_data/ai/venv
|
||||
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
||||
$STD uv pip install --python /opt/snapotter_data/ai/venv/bin/python \
|
||||
numpy==1.26.4 Pillow==12.3.0 opencv-python-headless==4.10.0.84 fonttools \
|
||||
|
||||
@@ -13,12 +13,14 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
read -r -p "${TAB3}Which Tomcat version would you like to install? (9, 10.1, 11): " version
|
||||
version="${var_apache_tomcat_version:-}"
|
||||
[[ -n "$version" ]] || read -r -p "${TAB3}Which Tomcat version would you like to install? (9, 10.1, 11): " version || true
|
||||
jdk_version="${var_apache_tomcat_jdk_version:-}"
|
||||
case $version in
|
||||
9)
|
||||
TOMCAT_VERSION="9"
|
||||
echo "Which LTS Java version would you like to use? (8, 11, 17, 21): "
|
||||
read -r jdk_version
|
||||
[[ -n "$jdk_version" ]] || read -r jdk_version || true
|
||||
case $jdk_version in
|
||||
8 | 11 | 17 | 21)
|
||||
JAVA_VERSION="$jdk_version" setup_java
|
||||
@@ -32,7 +34,7 @@ case $version in
|
||||
10 | 10.1)
|
||||
TOMCAT_VERSION="10"
|
||||
echo "Which LTS Java version would you like to use? (11, 17, 21): "
|
||||
read -r jdk_version
|
||||
[[ -n "$jdk_version" ]] || read -r jdk_version || true
|
||||
case $jdk_version in
|
||||
11 | 17 | 21)
|
||||
JAVA_VERSION="$jdk_version" setup_java
|
||||
@@ -46,7 +48,7 @@ case $version in
|
||||
11)
|
||||
TOMCAT_VERSION="11"
|
||||
echo "Which LTS Java version would you like to use? (17, 21): "
|
||||
read -r jdk_version
|
||||
[[ -n "$jdk_version" ]] || read -r jdk_version || true
|
||||
case $jdk_version in
|
||||
17 | 21)
|
||||
JAVA_VERSION="$jdk_version" setup_java
|
||||
|
||||
@@ -18,7 +18,7 @@ $STD apt install -y aria2
|
||||
msg_ok "Installed Aria2"
|
||||
|
||||
prompt="${var_aria2_ariang:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add AriaNG? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add AriaNG? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y nginx
|
||||
|
||||
@@ -47,7 +47,8 @@ Choose Asterisk version to install:
|
||||
2) Latest LTS ($LTS_VERSION)
|
||||
3) Latest Certified ($CERT_VERSION)
|
||||
EOF
|
||||
read -rp "Enter choice [1-3]: " ASTERISK_CHOICE
|
||||
ASTERISK_CHOICE="${var_asterisk_version:-}"
|
||||
[[ -n "$ASTERISK_CHOICE" ]] || read -rp "Enter choice [1-3]: " ASTERISK_CHOICE || true
|
||||
|
||||
CERTIFIED=0
|
||||
case "$ASTERISK_CHOICE" in
|
||||
|
||||
@@ -17,9 +17,10 @@ fetch_and_deploy_gh_release "authelia" "authelia/authelia" "binary"
|
||||
|
||||
MAX_ATTEMPTS=3
|
||||
attempt=0
|
||||
DOMAIN="${var_authelia_domain:-}"
|
||||
while true; do
|
||||
attempt=$((attempt + 1))
|
||||
read -rp "${TAB3}Enter your domain or IP (ex. example.com or 192.168.1.100): " DOMAIN
|
||||
[[ -n "$DOMAIN" ]] || read -rp "${TAB3}Enter your domain or IP (ex. example.com or 192.168.1.100): " DOMAIN || true
|
||||
if [[ -z "$DOMAIN" ]]; then
|
||||
if ((attempt >= MAX_ATTEMPTS)); then
|
||||
DOMAIN="${LOCAL_IP:-localhost}"
|
||||
@@ -40,11 +41,13 @@ while true; do
|
||||
break
|
||||
else
|
||||
msg_warn "Invalid IP address!"
|
||||
DOMAIN=""
|
||||
fi
|
||||
elif [[ "$DOMAIN" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$ ]]; then
|
||||
break
|
||||
else
|
||||
msg_warn "Invalid domain format!"
|
||||
DOMAIN=""
|
||||
fi
|
||||
done
|
||||
msg_info "Setting Authelia up"
|
||||
|
||||
@@ -57,7 +57,7 @@ PG_VERSION="17" setup_postgresql
|
||||
PG_DB_NAME="authentik" PG_DB_USER="authentik" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
|
||||
|
||||
XMLSEC_VERSION="1.3.12"
|
||||
AUTHENTIK_VERSION="version/2026.8.4"
|
||||
AUTHENTIK_VERSION="version/2026.8.5"
|
||||
fetch_and_deploy_gh_release "xmlsec" "lsh123/xmlsec" "tarball" "${XMLSEC_VERSION}" "/opt/xmlsec"
|
||||
fetch_and_deploy_gh_release "authentik" "goauthentik/authentik" "tarball" "${AUTHENTIK_VERSION}" "/opt/authentik"
|
||||
GO_VERSION="$(grep -m1 '^go ' /opt/authentik/go.mod | awk '{print $2}')" setup_go
|
||||
|
||||
@@ -15,7 +15,8 @@ update_os
|
||||
|
||||
fetch_and_deploy_gh_release "bichon" "rustmailer/bichon" "prebuild" "latest" "/opt/bichon" "bichon-*-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.tar.gz"
|
||||
|
||||
read -r -p "${TAB3}Enter the public URL for Bichon (e.g., https://bichon.yourdomain.com) or leave empty to use container IP: " bichon_url
|
||||
bichon_url="${var_bichon_url:-}"
|
||||
[[ -n "$bichon_url" ]] || read -r -p "${TAB3}Enter the public URL for Bichon (e.g., https://bichon.yourdomain.com) or leave empty to use container IP: " bichon_url || true
|
||||
if [[ -z "$bichon_url" ]]; then
|
||||
msg_info "No URL provided"
|
||||
BICHON_PUBLIC_URL="http://$LOCAL_IP:15630"
|
||||
|
||||
@@ -34,7 +34,8 @@ setup_deb_based() {
|
||||
chmod +x bitmagnet
|
||||
msg_ok "Configured bitmagnet"
|
||||
|
||||
read -r -p "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey
|
||||
tmdbapikey="${var_bitmagnet_tmdb_api_key:-}"
|
||||
[[ -n "$tmdbapikey" ]] || read -r -p "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey || true
|
||||
|
||||
cat <<EOF >/etc/bitmagnet.env
|
||||
POSTGRES_HOST=localhost
|
||||
@@ -99,7 +100,8 @@ setup_alpine() {
|
||||
$STD su - postgres -c "psql -c 'CREATE DATABASE bitmagnet;'"
|
||||
msg_ok "Built bitmagnet"
|
||||
|
||||
read -rp "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey
|
||||
tmdbapikey="${var_bitmagnet_tmdb_api_key:-}"
|
||||
[[ -n "$tmdbapikey" ]] || read -rp "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey || true
|
||||
|
||||
msg_info "Enabling bitmagnet Service"
|
||||
cat <<EOF >/etc/init.d/bitmagnet
|
||||
|
||||
@@ -25,7 +25,7 @@ $STD npm install
|
||||
msg_ok "Installed ByteStash"
|
||||
|
||||
allowreg="${var_bytestash_registration:-}"
|
||||
[[ -n "$allowreg" ]] || read -rp "${TAB3}Do you want to allow registration of multiple accounts? [y/n]: " allowreg
|
||||
[[ -n "$allowreg" ]] || read -rp "${TAB3}Do you want to allow registration of multiple accounts? [y/n]: " allowreg || true
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/bytestash-backend.service
|
||||
|
||||
@@ -18,7 +18,7 @@ setup_deb_based() {
|
||||
systemctl enable -q --now caddy
|
||||
|
||||
prompt="${var_caddy_xcaddy:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install xCaddy Addon? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install xCaddy Addon? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
setup_go
|
||||
fetch_and_deploy_gh_release "xcaddy" "caddyserver/xcaddy" "binary"
|
||||
@@ -64,7 +64,7 @@ EOF
|
||||
msg_ok "Installed Caddy"
|
||||
|
||||
prompt="${var_caddy_xcaddy:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install xCaddy Addon? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install xCaddy Addon? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
GO_VERSION="$(curl -fsSL https://go.dev/VERSION?m=text | head -1 | cut -c3-)" setup_go
|
||||
fetch_and_deploy_gh_release "xcaddy" "caddyserver/xcaddy" "prebuild" "latest" "/opt/xcaddy" "xcaddy_*_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
@@ -13,15 +13,18 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
var_cf_api_token="default"
|
||||
read -rp "${TAB3}Enter the Cloudflare API token: " var_cf_api_token
|
||||
var_cf_api_token="${var_cf_api_token:-}"
|
||||
[[ -n "$var_cf_api_token" ]] || read -rp "${TAB3}Enter the Cloudflare API token: " var_cf_api_token || true
|
||||
[[ -n "$var_cf_api_token" ]] || { msg_error "No Cloudflare API token given; set var_cf_api_token or answer the prompt"; exit 64; }
|
||||
|
||||
var_cf_domains="default"
|
||||
read -rp "${TAB3}Enter the domains separated with a comma (*.example.org,www.example.org) " var_cf_domains
|
||||
var_cf_domains="${var_cf_domains:-}"
|
||||
[[ -n "$var_cf_domains" ]] || read -rp "${TAB3}Enter the domains separated with a comma (*.example.org,www.example.org) " var_cf_domains || true
|
||||
[[ -n "$var_cf_domains" ]] || { msg_error "No domains given; set var_cf_domains or answer the prompt"; exit 64; }
|
||||
|
||||
var_cf_proxied="false"
|
||||
answer="${var_cloudflare_ddns_proxied:-}"
|
||||
while true; do
|
||||
read -rp "${TAB3}Proxied? (y/n): " answer
|
||||
[[ -n "$answer" ]] || read -rp "${TAB3}Proxied? (y/n): " answer || answer="n"
|
||||
case "$answer" in
|
||||
[Yy]*)
|
||||
var_cf_proxied="true"
|
||||
@@ -31,12 +34,13 @@ while true; do
|
||||
var_cf_proxied="false"
|
||||
break
|
||||
;;
|
||||
*) echo "Please answer y or n." ;;
|
||||
*) echo "Please answer y or n."; answer="" ;;
|
||||
esac
|
||||
done
|
||||
var_cf_ip6_provider="none"
|
||||
answer="${var_cloudflare_ddns_ipv6:-}"
|
||||
while true; do
|
||||
read -rp "${TAB3}Enable IPv6 support? (y/n): " answer
|
||||
[[ -n "$answer" ]] || read -rp "${TAB3}Enable IPv6 support? (y/n): " answer || answer="n"
|
||||
case "$answer" in
|
||||
[Yy]*)
|
||||
var_cf_ip6_provider="cloudflare.trace"
|
||||
@@ -46,7 +50,7 @@ while true; do
|
||||
var_cf_ip6_provider="none"
|
||||
break
|
||||
;;
|
||||
*) echo "Please answer y or n." ;;
|
||||
*) echo "Please answer y or n."; answer="" ;;
|
||||
esac
|
||||
done
|
||||
msg_ok "Configured Application"
|
||||
|
||||
@@ -33,7 +33,7 @@ msg_ok "Installed Cockpit"
|
||||
# 45Drives only publishes amd64 packages
|
||||
if [[ "$(arch_resolve)" != "arm64" ]]; then
|
||||
prompt="${var_cockpit_45drives:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "Would you like to install 45Drives' cockpit-file-sharing, cockpit-identities, and cockpit-navigator <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "Would you like to install 45Drives' cockpit-file-sharing, cockpit-identities, and cockpit-navigator <y/N> " prompt || true
|
||||
fi
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing 45Drives' cockpit extensions"
|
||||
|
||||
@@ -17,7 +17,8 @@ setup_hwaccel
|
||||
echo
|
||||
echo "${TAB3}Choose the GPU type for ComfyUI:"
|
||||
echo "${TAB3}[1]-None [2]-NVIDIA [3]-AMD [4]-Intel"
|
||||
read -rp "${TAB3}Enter your choice [1-4] (default: 1): " gpu_choice
|
||||
gpu_choice="${var_comfyui_gpu_type:-}"
|
||||
[[ -n "$gpu_choice" ]] || read -rp "${TAB3}Enter your choice [1-4] (default: 1): " gpu_choice || true
|
||||
gpu_choice=${gpu_choice:-1}
|
||||
case "$gpu_choice" in
|
||||
1) comfyui_gpu_type="none" ;;
|
||||
|
||||
@@ -20,7 +20,7 @@ msg_ok "Installed Dependencies"
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
|
||||
onlyoffice="${var_cryptpad_onlyoffice:-}"
|
||||
[[ -n "$onlyoffice" ]] || read -rp "${TAB3}Install OnlyOffice components instead of CKEditor? (Y/N): " onlyoffice
|
||||
[[ -n "$onlyoffice" ]] || read -rp "${TAB3}Install OnlyOffice components instead of CKEditor? (Y/N): " onlyoffice || true
|
||||
fetch_and_deploy_gh_release "cryptpad" "cryptpad/cryptpad" "tarball"
|
||||
|
||||
msg_info "Setup CryptPad"
|
||||
|
||||
@@ -15,11 +15,8 @@ update_os
|
||||
|
||||
setup_deb_based() {
|
||||
setup_docker
|
||||
if [[ -n "${var_docker_socket:-}" ]]; then
|
||||
socket_choice="$var_docker_socket"
|
||||
else
|
||||
read -r -p "${TAB3}Expose Docker TCP socket (insecure) ? [n = No, l = Local only (127.0.0.1), a = All interfaces (0.0.0.0)] <n/l/a>: " socket_choice
|
||||
fi
|
||||
socket_choice="${var_docker_socket:-}"
|
||||
[[ -n "$socket_choice" ]] || read -r -p "${TAB3}Expose Docker TCP socket (insecure) ? [n = No, l = Local only (127.0.0.1), a = All interfaces (0.0.0.0)] <n/l/a>: " socket_choice || true
|
||||
case "${socket_choice,,}" in
|
||||
l | local)
|
||||
socket="tcp://127.0.0.1:2375"
|
||||
@@ -70,11 +67,8 @@ setup_alpine() {
|
||||
msg_ok "Installed Docker"
|
||||
|
||||
DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_github_release "docker/compose" false)
|
||||
if [[ -n "${var_docker_compose:-}" ]]; then
|
||||
prompt="$var_docker_compose"
|
||||
else
|
||||
read -r -p "${TAB3}Would you like to add Docker Compose? <y/N> " prompt
|
||||
fi
|
||||
prompt="${var_docker_compose:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Docker Compose? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes|true)$ ]]; then
|
||||
msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
|
||||
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
|
||||
@@ -83,11 +77,8 @@ setup_alpine() {
|
||||
chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose
|
||||
msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
|
||||
fi
|
||||
if [[ -n "${var_docker_socket:-}" ]]; then
|
||||
prompt="$var_docker_socket"
|
||||
else
|
||||
read -r -p "${TAB3}Would you like to expose the Docker TCP socket? <y/N> " prompt
|
||||
fi
|
||||
prompt="${var_docker_socket:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to expose the Docker TCP socket? <y/N> " prompt || true
|
||||
case "${prompt,,}" in
|
||||
y | yes | a | all) socket="tcp://0.0.0.0:2375" ;;
|
||||
l | local) socket="tcp://127.0.0.1:2375" ;;
|
||||
|
||||
@@ -26,8 +26,9 @@ $STD apt install -y \
|
||||
nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
var_project_name="default"
|
||||
read -r -p "${TAB3}Type the assembly name of the project: " var_project_name
|
||||
var_project_name="${var_project_name:-}"
|
||||
[[ -n "$var_project_name" ]] || read -r -p "${TAB3}Type the assembly name of the project: " var_project_name || true
|
||||
[[ -n "$var_project_name" ]] || { msg_error "No assembly name given; set var_project_name or answer the prompt"; exit 64; }
|
||||
|
||||
msg_info "Setting up FTP Server"
|
||||
useradd ftpuser
|
||||
|
||||
@@ -23,7 +23,9 @@ NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||
|
||||
echo "${TAB3}It is important to choose the name for your server before you install Synapse, because it cannot be changed later."
|
||||
echo "${TAB3}The server name determines the “domain” part of user-ids for users on your server: these will all be of the format @user:my.domain.name. It also determines how other matrix servers will reach yours for federation."
|
||||
read -p "${TAB3}Please enter the name for your server: " servername
|
||||
servername="${var_elementsynapse_server_name:-}"
|
||||
[[ -n "$servername" ]] || read -r -p "${TAB3}Please enter the name for your server: " servername || true
|
||||
[[ -n "$servername" ]] || { msg_error "No server name given; set var_elementsynapse_server_name or answer the prompt"; exit 64; }
|
||||
|
||||
msg_info "Installing Element Synapse"
|
||||
setup_deb822_repo "matrix-org" \
|
||||
|
||||
@@ -39,7 +39,7 @@ echo "$LATEST_VERSION" >~/.emqx
|
||||
msg_ok "Installed EMQX"
|
||||
|
||||
prompt="${var_emqx_disable_mq:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to disable the EMQX MQ feature? (reduces disk/CPU usage) <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to disable the EMQX MQ feature? (reduces disk/CPU usage) <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Disabling EMQX MQ feature"
|
||||
mkdir -p /etc/emqx
|
||||
|
||||
@@ -45,7 +45,8 @@ $STD ln -svf /usr/bin/ffmpeg /usr/local/bin/ffmpeg
|
||||
$STD ln -svf /usr/bin/ffprobe /usr/local/bin/ffprobe
|
||||
$STD rm -rf /opt/fileflows/Server/runtimes/win-*
|
||||
|
||||
read -r -p "${TAB3}Do you want to install FileFlows Server or Agent? (S/A): " install_server
|
||||
install_server="${var_fileflows_mode:-}"
|
||||
[[ -n "$install_server" ]] || read -r -p "${TAB3}Do you want to install FileFlows Server or Agent? (S/A): " install_server || true
|
||||
|
||||
if [[ "$install_server" =~ ^[Ss]$ ]]; then
|
||||
msg_info "Installing FileFlows Server"
|
||||
@@ -54,9 +55,10 @@ if [[ "$install_server" =~ ^[Ss]$ ]]; then
|
||||
systemctl enable -q --now fileflows
|
||||
msg_ok "Installed FileFlows Server"
|
||||
else
|
||||
read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url
|
||||
server_url="${var_fileflows_server_url:-}"
|
||||
[[ -n "$server_url" ]] || read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url || true
|
||||
while [[ -z "${server_url// /}" ]]; do
|
||||
read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url
|
||||
read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url || { msg_error "No FileFlows Server URL given; set var_fileflows_server_url or answer the prompt"; exit 64; }
|
||||
done
|
||||
msg_info "Installing FileFlows Agent"
|
||||
cd /opt/fileflows/Agent
|
||||
|
||||
@@ -15,12 +15,12 @@ update_os
|
||||
setup_yq
|
||||
|
||||
if [[ -z "${var_forgejo_instance:-}" ]]; then
|
||||
read -r -p "${TAB3}Forgejo Instance URL (e.g. https://codeberg.org): " var_forgejo_instance
|
||||
read -r -p "${TAB3}Forgejo Instance URL (e.g. https://codeberg.org): " var_forgejo_instance || true
|
||||
var_forgejo_instance="${var_forgejo_instance:-https://codeberg.org}"
|
||||
fi
|
||||
|
||||
if [[ -z "${var_forgejo_runner_uuid:-}" ]]; then
|
||||
read -r -p "${TAB3}Forgejo Runner UUID: " var_forgejo_runner_uuid
|
||||
read -r -p "${TAB3}Forgejo Runner UUID: " var_forgejo_runner_uuid || true
|
||||
fi
|
||||
|
||||
if [[ -z "${var_forgejo_runner_uuid:-}" ]]; then
|
||||
@@ -29,7 +29,7 @@ if [[ -z "${var_forgejo_runner_uuid:-}" ]]; then
|
||||
fi
|
||||
|
||||
if [[ -z "${var_forgejo_runner_token:-}" ]]; then
|
||||
read -r -p "${TAB3}Forgejo Runner Token: " var_forgejo_runner_token
|
||||
read -r -p "${TAB3}Forgejo Runner Token: " var_forgejo_runner_token || true
|
||||
fi
|
||||
|
||||
if [[ -z "${var_forgejo_runner_token:-}" ]]; then
|
||||
@@ -39,7 +39,7 @@ fi
|
||||
|
||||
DEFAULT_RUNNER_LABELS="linux-amd64:docker://node:22-bookworm"
|
||||
if [[ -z "${var_runner_labels:-}" ]]; then
|
||||
read -r -p "${TAB3}Additional runner labels (comma-separated, or leave blank for default only): " var_runner_labels
|
||||
read -r -p "${TAB3}Additional runner labels (comma-separated, or leave blank for default only): " var_runner_labels || true
|
||||
fi
|
||||
if [[ -n "${var_runner_labels:-}" ]]; then
|
||||
RUNNER_LABELS="${DEFAULT_RUNNER_LABELS},${var_runner_labels}"
|
||||
|
||||
@@ -110,7 +110,7 @@ export AUTOGRAPH_VERBOSITY=0
|
||||
export GLOG_minloglevel=3
|
||||
export GLOG_logtostderr=0
|
||||
|
||||
fetch_and_deploy_gh_release "frigate" "blakeblackshear/frigate" "tarball" "v0.18.0" "/opt/frigate"
|
||||
fetch_and_deploy_gh_release "frigate" "blakeblackshear/frigate" "tarball" "v0.18.2" "/opt/frigate"
|
||||
|
||||
msg_info "Building Nginx"
|
||||
$STD bash /opt/frigate/docker/main/build_nginx.sh
|
||||
|
||||
@@ -51,8 +51,10 @@ echo -e ""
|
||||
msg_custom "🪙" "$YW" "CoinGecko API keys are optional but provide better cryptocurrency data."
|
||||
msg_custom "🪙" "$YW" "You can skip this and add them later by editing /opt/ghostfolio/.env"
|
||||
echo -e ""
|
||||
read -rp "${TAB3}CoinGecko Demo API key (press Enter to skip): " COINGECKO_DEMO_KEY
|
||||
read -rp "${TAB3}CoinGecko Pro API key (press Enter to skip): " COINGECKO_PRO_KEY
|
||||
COINGECKO_DEMO_KEY="${var_ghostfolio_coingecko_demo_key:-}"
|
||||
[[ -n "$COINGECKO_DEMO_KEY" ]] || read -rp "${TAB3}CoinGecko Demo API key (press Enter to skip): " COINGECKO_DEMO_KEY || true
|
||||
COINGECKO_PRO_KEY="${var_ghostfolio_coingecko_pro_key:-}"
|
||||
[[ -n "$COINGECKO_PRO_KEY" ]] || read -rp "${TAB3}CoinGecko Pro API key (press Enter to skip): " COINGECKO_PRO_KEY || true
|
||||
|
||||
msg_info "Setting up Environment"
|
||||
cat <<EOF >/opt/ghostfolio/.env
|
||||
|
||||
@@ -16,7 +16,7 @@ update_os
|
||||
fetch_and_deploy_gh_release "headscale" "juanfont/headscale" "binary"
|
||||
|
||||
prompt="${var_headscale_admin:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add headscale-admin UI? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add headscale-admin UI? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
fetch_and_deploy_gh_release "headscale-admin" "GoodiesHQ/headscale-admin" "prebuild" "latest" "/opt/headscale-admin" "admin.zip"
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@ setup_deb822_repo \
|
||||
"stable"
|
||||
msg_ok "Set up InfluxDB Repository"
|
||||
|
||||
read -r -p "${TAB3}Which version of InfluxDB to install? (1, 2 or 3) " prompt
|
||||
prompt="${var_influxdb_version:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Which version of InfluxDB to install? (1, 2 or 3) " prompt || true
|
||||
if [[ $prompt == "3" ]]; then
|
||||
INFLUX="3"
|
||||
elif [[ $prompt == "2" ]]; then
|
||||
@@ -51,7 +52,7 @@ fi
|
||||
msg_ok "Installed InfluxDB"
|
||||
|
||||
prompt="${var_influxdb_telegraf:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Telegraf? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Telegraf? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Telegraf"
|
||||
$STD apt install -y telegraf
|
||||
|
||||
@@ -28,9 +28,15 @@ mkdir -p config/assets
|
||||
cp config/config.yml.template config/config.yml
|
||||
msg_ok "Setup Kometa"
|
||||
|
||||
read -r -p "${TAB3}Enter your TMDb API key: " TMDBKEY
|
||||
read -r -p "${TAB3}Enter your Plex URL: " PLEXURL
|
||||
read -r -p "${TAB3}Enter your Plex token: " PLEXTOKEN
|
||||
TMDBKEY="${var_kometa_tmdb_key:-}"
|
||||
[[ -n "$TMDBKEY" ]] || read -r -p "${TAB3}Enter your TMDb API key: " TMDBKEY || true
|
||||
[[ -n "$TMDBKEY" ]] || { msg_error "No TMDb API key given; set var_kometa_tmdb_key or answer the prompt"; exit 64; }
|
||||
PLEXURL="${var_kometa_plex_url:-}"
|
||||
[[ -n "$PLEXURL" ]] || read -r -p "${TAB3}Enter your Plex URL: " PLEXURL || true
|
||||
[[ -n "$PLEXURL" ]] || { msg_error "No Plex URL given; set var_kometa_plex_url or answer the prompt"; exit 64; }
|
||||
PLEXTOKEN="${var_kometa_plex_token:-}"
|
||||
[[ -n "$PLEXTOKEN" ]] || read -r -p "${TAB3}Enter your Plex token: " PLEXTOKEN || true
|
||||
[[ -n "$PLEXTOKEN" ]] || { msg_error "No Plex token given; set var_kometa_plex_token or answer the prompt"; exit 64; }
|
||||
sed -i '/^plex:/,/^[^ ]/{s| url:.*| url: '"$PLEXURL"'|}' /opt/kometa/config/config.yml
|
||||
sed -i '/^plex:/,/^[^ ]/{s| token:.*| token: '"$PLEXTOKEN"'|}' /opt/kometa/config/config.yml
|
||||
sed -i '/^tmdb:/,/^[^ ]/{s| apikey:.*| apikey: '"$TMDBKEY"'|}' /opt/kometa/config/config.yml
|
||||
|
||||
@@ -15,7 +15,8 @@ update_os
|
||||
|
||||
echo "${TAB3}How would you like to handle SSL termination?"
|
||||
echo "${TAB3}[i]-Internal (self-signed SSL Certificate) [e]-External (use your own reverse proxy)"
|
||||
read -rp "${TAB3}Enter your choice <i/e> (default: i): " ssl_choice
|
||||
ssl_choice="${var_kutt_ssl:-}"
|
||||
[[ -n "$ssl_choice" ]] || read -rp "${TAB3}Enter your choice <i/e> (default: i): " ssl_choice || true
|
||||
ssl_choice=${ssl_choice:-i}
|
||||
case "${ssl_choice,,}" in
|
||||
i)
|
||||
@@ -32,7 +33,9 @@ EOF
|
||||
msg_ok "Configured Caddy"
|
||||
;;
|
||||
e)
|
||||
read -r -p "${TAB3}Enter the hostname you want to use for Kutt (eg. kutt.example.com): " custom_host
|
||||
custom_host="${var_kutt_hostname:-}"
|
||||
[[ -n "$custom_host" ]] || read -r -p "${TAB3}Enter the hostname you want to use for Kutt (eg. kutt.example.com): " custom_host || true
|
||||
[[ -n "$custom_host" ]] || { msg_error "No hostname given; set var_kutt_hostname or answer the prompt"; exit 64; }
|
||||
if [[ "$custom_host" ]]; then
|
||||
DEFAULT_HOST="$custom_host"
|
||||
fi
|
||||
|
||||
@@ -29,12 +29,12 @@ rm -f /tmp/LanguageTool-stable.zip
|
||||
msg_ok "Setup LanguageTool"
|
||||
|
||||
ngram_dir=""
|
||||
lang_code=""
|
||||
lang_code="${var_languagetool_ngram_lang:-}"
|
||||
max_attempts=3
|
||||
attempt=0
|
||||
|
||||
while [[ $attempt -lt $max_attempts ]]; do
|
||||
read -r -p "${TAB3}Enter language code (en, de, es, fr, nl) to download ngrams or press ENTER to skip: " lang_code
|
||||
[[ -n "$lang_code" ]] || read -r -p "${TAB3}Enter language code (en, de, es, fr, nl) to download ngrams or press ENTER to skip: " lang_code || lang_code=""
|
||||
|
||||
if [[ -z "$lang_code" ]]; then
|
||||
break
|
||||
@@ -43,11 +43,11 @@ while [[ $attempt -lt $max_attempts ]]; do
|
||||
if [[ "$lang_code" =~ [[:space:]] ]]; then
|
||||
((attempt++))
|
||||
remaining=$((max_attempts - attempt))
|
||||
lang_code=""
|
||||
if [[ $remaining -gt 0 ]]; then
|
||||
msg_error "Please enter only ONE language code. You have $remaining attempt(s) remaining."
|
||||
else
|
||||
msg_error "Maximum attempts reached. Continuing without ngrams."
|
||||
lang_code=""
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
@@ -25,7 +25,7 @@ RUST_CRATES="monolith" setup_rust
|
||||
PG_DB_NAME="linkwardendb" PG_DB_USER="linkwarden" setup_postgresql_db
|
||||
|
||||
prompt="${var_linkwarden_adminer:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
setup_adminer
|
||||
fi
|
||||
@@ -61,6 +61,7 @@ $STD yarn web:build
|
||||
$STD yarn prisma:deploy
|
||||
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache
|
||||
rm -rf /root/.cache/yarn
|
||||
rm -rf /root/.yarn/berry/cache
|
||||
rm -rf /opt/linkwarden/.next/cache
|
||||
msg_ok "Installed Linkwarden"
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ setup_deb_based() {
|
||||
msg_ok "Setup MariaDB"
|
||||
|
||||
prompt="${var_mariadb_phpmyadmin:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add PhpMyAdmin? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add PhpMyAdmin? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing phpMyAdmin"
|
||||
$STD apt install -y \
|
||||
@@ -60,7 +60,7 @@ setup_alpine() {
|
||||
msg_ok "MariaDB Configured"
|
||||
|
||||
prompt="${var_mariadb_adminer:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install Adminer with lighttpd? <y/N>: " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install Adminer with lighttpd? <y/N>: " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Adminer and dependencies"
|
||||
$STD apk add --no-cache \
|
||||
|
||||
@@ -13,7 +13,9 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
read -r -p "${TAB3}Enter the email address of your first admin user: " admin_email
|
||||
admin_email="${var_mediamanager_admin_email:-}"
|
||||
[[ -n "$admin_email" ]] || read -r -p "${TAB3}Enter the email address of your first admin user: " admin_email || true
|
||||
[[ -n "$admin_email" ]] || { msg_error "No admin e-mail given; set var_mediamanager_admin_email or answer the prompt"; exit 64; }
|
||||
if [[ "$admin_email" ]]; then
|
||||
EMAIL="$admin_email"
|
||||
fi
|
||||
|
||||
@@ -16,7 +16,7 @@ update_os
|
||||
MEILISEARCH_BIND="0.0.0.0:7700" setup_meilisearch
|
||||
|
||||
prompt="${var_meilisearch_ui:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Do you want add meilisearch-ui? [y/n]: " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Do you want add meilisearch-ui? [y/n]: " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
fetch_and_deploy_gh_release "meilisearch-ui" "riccox/meilisearch-ui" "tarball"
|
||||
|
||||
@@ -16,8 +16,9 @@ update_os
|
||||
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
||||
MONGO_VERSION="8.0" setup_mongodb
|
||||
else
|
||||
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
|
||||
install_mongodb_8="${var_mongodb_8:-}"
|
||||
[[ -n "$install_mongodb_8" ]] || read -r -p "${TAB3}Do you want to install MongoDB 8.0 instead of 7.0? [y/N]: " install_mongodb_8 || true
|
||||
if [[ "$install_mongodb_8" =~ ^[Yy]([Ee][Ss])?$ ]]; then
|
||||
MONGO_VERSION="8.0" setup_mongodb
|
||||
else
|
||||
MONGO_VERSION="7.0" setup_mongodb
|
||||
|
||||
@@ -21,7 +21,8 @@ msg_ok "Installed Dependencies"
|
||||
|
||||
RELEASE_REPO="mysql-8.0"
|
||||
RELEASE_AUTH="mysql_native_password"
|
||||
read -r -p "${TAB3}Would you like to install the MySQL 8.4 LTS release instead of MySQL 8.0 (bug fix track; EOL April-2026)? <y/N> " prompt
|
||||
prompt="${var_mysql_lts:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install the MySQL 8.4 LTS release instead of MySQL 8.0 (bug fix track; EOL April-2026)? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
RELEASE_REPO="mysql-8.4-lts"
|
||||
RELEASE_AUTH="caching_sha2_password"
|
||||
@@ -61,7 +62,8 @@ echo -e "MySQL user: root" >>~/mysql.creds
|
||||
echo -e "MySQL password: $ADMIN_PASS" >>~/mysql.creds
|
||||
msg_ok "MySQL Server configured"
|
||||
|
||||
read -r -p "${TAB3}Would you like to add PhpMyAdmin? <y/N> " prompt
|
||||
prompt="${var_mysql_phpmyadmin:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add PhpMyAdmin? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/phpmyadmin.sh)"
|
||||
fi
|
||||
|
||||
@@ -36,7 +36,8 @@ echo " 1) NetBird Managed (default) - Use NetBird's managed service"
|
||||
echo " 2) Self-Hosted - Use your own NetBird management server"
|
||||
echo ""
|
||||
|
||||
read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE
|
||||
DEPLOYMENT_TYPE="${var_netbird_deployment:-}"
|
||||
[[ -n "$DEPLOYMENT_TYPE" ]] || read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE || true
|
||||
DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}"
|
||||
|
||||
NETBIRD_MGMT_URL=""
|
||||
@@ -51,7 +52,8 @@ case "$DEPLOYMENT_TYPE" in
|
||||
echo "Enter your NetBird management server URL."
|
||||
echo "Example: https://management.example.com"
|
||||
echo ""
|
||||
read -r -p "Management URL: " NETBIRD_MGMT_URL
|
||||
NETBIRD_MGMT_URL="${var_netbird_mgmt_url:-}"
|
||||
[[ -n "$NETBIRD_MGMT_URL" ]] || read -r -p "Management URL: " NETBIRD_MGMT_URL || true
|
||||
|
||||
if [[ -z "$NETBIRD_MGMT_URL" ]]; then
|
||||
msg_warn "No management URL provided. Run 'netbird up --management-url <url>' to connect."
|
||||
@@ -81,7 +83,8 @@ else
|
||||
fi
|
||||
echo ""
|
||||
|
||||
read -r -p "Select authentication method [1]: " AUTH_METHOD
|
||||
AUTH_METHOD="${var_netbird_auth:-}"
|
||||
[[ -n "$AUTH_METHOD" ]] || read -r -p "Select authentication method [1]: " AUTH_METHOD || true
|
||||
AUTH_METHOD="${AUTH_METHOD:-1}"
|
||||
|
||||
if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then
|
||||
@@ -90,7 +93,8 @@ if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then
|
||||
echo ""
|
||||
echo "Enter your NetBird setup key from the NetBird dashboard."
|
||||
echo ""
|
||||
read -r -p "Setup key: " NETBIRD_SETUP_KEY
|
||||
NETBIRD_SETUP_KEY="${var_netbird_setup_key:-}"
|
||||
[[ -n "$NETBIRD_SETUP_KEY" ]] || read -r -p "Setup key: " NETBIRD_SETUP_KEY || true
|
||||
echo ""
|
||||
|
||||
if [[ -z "$NETBIRD_SETUP_KEY" ]]; then
|
||||
@@ -136,7 +140,8 @@ else
|
||||
echo ""
|
||||
echo "Enter your NetBird setup key from the NetBird dashboard."
|
||||
echo ""
|
||||
read -r -p "Setup key: " NETBIRD_SETUP_KEY
|
||||
NETBIRD_SETUP_KEY="${var_netbird_setup_key:-}"
|
||||
[[ -n "$NETBIRD_SETUP_KEY" ]] || read -r -p "Setup key: " NETBIRD_SETUP_KEY || true
|
||||
echo ""
|
||||
|
||||
if [[ -z "$NETBIRD_SETUP_KEY" ]]; then
|
||||
|
||||
@@ -16,16 +16,15 @@ update_os
|
||||
fetch_and_deploy_gh_release "newt" "fosrl/newt" "singlefile" "latest" "/opt/newt" "newt_linux_$(arch_resolve)"
|
||||
ln -sf /opt/newt/newt /usr/local/bin/newt
|
||||
|
||||
if [[ -z "${NEWT_ID:-}" ]]; then
|
||||
read -rp "Newt ID (from your Pangolin dashboard): " NEWT_ID
|
||||
fi
|
||||
if [[ -z "${NEWT_SECRET:-}" ]]; then
|
||||
read -rsp "Newt Secret: " NEWT_SECRET
|
||||
NEWT_ID="${NEWT_ID:-${var_newt_id:-}}"
|
||||
[[ -n "$NEWT_ID" ]] || read -rp "Newt ID (from your Pangolin dashboard): " NEWT_ID || true
|
||||
NEWT_SECRET="${NEWT_SECRET:-${var_newt_secret:-}}"
|
||||
if [[ -z "$NEWT_SECRET" ]]; then
|
||||
read -rsp "Newt Secret: " NEWT_SECRET || true
|
||||
echo
|
||||
fi
|
||||
if [[ -z "${PANGOLIN_ENDPOINT:-}" ]]; then
|
||||
read -rp "Pangolin endpoint (e.g. https://pangolin.example.com): " PANGOLIN_ENDPOINT
|
||||
fi
|
||||
PANGOLIN_ENDPOINT="${PANGOLIN_ENDPOINT:-${var_newt_endpoint:-}}"
|
||||
[[ -n "$PANGOLIN_ENDPOINT" ]] || read -rp "Pangolin endpoint (e.g. https://pangolin.example.com): " PANGOLIN_ENDPOINT || true
|
||||
|
||||
if [[ -z "$NEWT_ID" || -z "$NEWT_SECRET" || -z "$PANGOLIN_ENDPOINT" ]]; then
|
||||
msg_error "Newt ID, Secret and Endpoint are all required. Aborting."
|
||||
|
||||
@@ -38,12 +38,14 @@ curl -fsSL "https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop
|
||||
msg_ok "Fetched NPMplus"
|
||||
|
||||
attempts=0
|
||||
TZ_INPUT="${var_npmplus_tz:-}"
|
||||
while true; do
|
||||
read -r -p "${TAB3}Enter your TZ Identifier (e.g., Europe/Berlin): " TZ_INPUT
|
||||
[[ -n "$TZ_INPUT" ]] || read -r -p "${TAB3}Enter your TZ Identifier (e.g., Europe/Berlin): " TZ_INPUT || { msg_error "No TZ identifier given; set var_npmplus_tz or answer the prompt"; exit 64; }
|
||||
if validate_tz "$TZ_INPUT"; then
|
||||
break
|
||||
fi
|
||||
msg_error "Invalid timezone! Please enter a valid TZ identifier."
|
||||
TZ_INPUT=""
|
||||
|
||||
attempts=$((attempts + 1))
|
||||
if [[ "$attempts" -ge 3 ]]; then
|
||||
@@ -52,7 +54,9 @@ while true; do
|
||||
fi
|
||||
done
|
||||
|
||||
read -r -p "${TAB3}Enter your ACME Email: " ACME_EMAIL_INPUT
|
||||
ACME_EMAIL_INPUT="${var_npmplus_acme_email:-}"
|
||||
[[ -n "$ACME_EMAIL_INPUT" ]] || read -r -p "${TAB3}Enter your ACME Email: " ACME_EMAIL_INPUT || true
|
||||
[[ -n "$ACME_EMAIL_INPUT" ]] || { msg_error "No ACME e-mail given; set var_npmplus_acme_email or answer the prompt"; exit 64; }
|
||||
|
||||
yq -i "
|
||||
.services.npmplus.environment |=
|
||||
|
||||
@@ -17,19 +17,23 @@ MAX_ATTEMPTS=3
|
||||
servers=("opencloud" "collabora" "wopi")
|
||||
attempt=0
|
||||
for server in "${servers[@]}"; do
|
||||
fqdn_var="var_opencloud_${server}_fqdn"
|
||||
fqdn="${!fqdn_var:-}"
|
||||
until ((attempt >= MAX_ATTEMPTS)); do
|
||||
attempt=$((attempt + 1))
|
||||
read -rp "${TAB3}Enter the FQDN of your ${server^} server (ATTEMPT $attempt/$MAX_ATTEMPTS) (eg $server.domain.tld): " fqdn
|
||||
[[ -n "$fqdn" ]] || read -rp "${TAB3}Enter the FQDN of your ${server^} server (ATTEMPT $attempt/$MAX_ATTEMPTS) (eg $server.domain.tld): " fqdn || { msg_error "No ${server^} FQDN given; set ${fqdn_var} or answer the prompt"; exit 64; }
|
||||
if [[ -z "$fqdn" ]]; then
|
||||
msg_warn "Domain cannot be empty!"
|
||||
elif [[ "$fqdn" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
|
||||
msg_warn "IP address not allowed! Please use a FQDN"
|
||||
fqdn=""
|
||||
elif [[ "$fqdn" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$ ]]; then
|
||||
export ${server^^}_FQDN="$fqdn"
|
||||
attempt=0
|
||||
break
|
||||
else
|
||||
msg_warn "Invalid domain format!"
|
||||
fqdn=""
|
||||
fi
|
||||
done
|
||||
if ((attempt >= MAX_ATTEMPTS)); then
|
||||
|
||||
@@ -27,7 +27,7 @@ PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
OTEL_ARGS=()
|
||||
prompt="${var_openwebui_otel:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install OpenTelemetry instrumentation packages (requires manual .env configuration)? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to install OpenTelemetry instrumentation packages (requires manual .env configuration)? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
for pkg in \
|
||||
opentelemetry-api \
|
||||
@@ -57,7 +57,7 @@ done
|
||||
msg_ok "Installed Open WebUI"
|
||||
|
||||
prompt="${var_openwebui_ollama:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
if [[ "$(arch_resolve)" == "amd64" ]]; then
|
||||
msg_info "Setting up Intel® Repositories"
|
||||
|
||||
@@ -27,17 +27,22 @@ apt_update_safe
|
||||
$STD apt install -y openziti-controller openziti-console </dev/null
|
||||
msg_ok "Installed openziti"
|
||||
|
||||
read -r -p "${TAB3}Would you like to go through the auto configuration now? <y/N>" prompt
|
||||
prompt="${var_openziti_controller_autoconfig:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to go through the auto configuration now? <y/N>" prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
GEN_FQDN="controller.${LOCAL_IP}.sslip.io"
|
||||
read -r -p "${TAB3}Please enter the controller FQDN [${GEN_FQDN}]: " ZITI_CTRL_ADVERTISED_ADDRESS
|
||||
ZITI_CTRL_ADVERTISED_ADDRESS="${var_openziti_controller_fqdn:-}"
|
||||
[[ -n "$ZITI_CTRL_ADVERTISED_ADDRESS" ]] || read -r -p "${TAB3}Please enter the controller FQDN [${GEN_FQDN}]: " ZITI_CTRL_ADVERTISED_ADDRESS || true
|
||||
ZITI_CTRL_ADVERTISED_ADDRESS=${ZITI_CTRL_ADVERTISED_ADDRESS:-$GEN_FQDN}
|
||||
read -r -p "${TAB3}Please enter the controller port [1280]: " ZITI_CTRL_ADVERTISED_PORT
|
||||
ZITI_CTRL_ADVERTISED_PORT="${var_openziti_controller_port:-}"
|
||||
[[ -n "$ZITI_CTRL_ADVERTISED_PORT" ]] || read -r -p "${TAB3}Please enter the controller port [1280]: " ZITI_CTRL_ADVERTISED_PORT || true
|
||||
ZITI_CTRL_ADVERTISED_PORT=${ZITI_CTRL_ADVERTISED_PORT:-1280}
|
||||
read -r -p "${TAB3}Please enter the controller admin user [admin]: " ZITI_USER
|
||||
ZITI_USER="${var_openziti_controller_user:-}"
|
||||
[[ -n "$ZITI_USER" ]] || read -r -p "${TAB3}Please enter the controller admin user [admin]: " ZITI_USER || true
|
||||
ZITI_USER=${ZITI_USER:-admin}
|
||||
GEN_PWD=$(head -c128 /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^*_+~' | cut -c 1-12)
|
||||
read -r -p "${TAB3}Please enter the controller admin password [${GEN_PWD}]:" ZITI_PWD
|
||||
ZITI_PWD="${var_openziti_controller_password:-}"
|
||||
[[ -n "$ZITI_PWD" ]] || read -r -p "${TAB3}Please enter the controller admin password [${GEN_PWD}]:" ZITI_PWD || true
|
||||
ZITI_PWD=${ZITI_PWD:-$GEN_PWD}
|
||||
CONFIG_FILE="/opt/openziti/etc/controller/bootstrap.env"
|
||||
sed -i "s|^ZITI_CTRL_ADVERTISED_ADDRESS=.*|ZITI_CTRL_ADVERTISED_ADDRESS='${ZITI_CTRL_ADVERTISED_ADDRESS}'|" "$CONFIG_FILE"
|
||||
|
||||
@@ -29,7 +29,8 @@ sed -i '0,/^ExecStart/ { /^ExecStart/ { n; s|^ExecStart.*|ExecStart=/opt/openzit
|
||||
systemctl daemon-reload
|
||||
msg_ok "Installed openziti"
|
||||
|
||||
read -r -p "${TAB3}Please paste an identity enrollment token(JTW)" prompt
|
||||
prompt="${var_openziti_tunnel_enrollment_token:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Please paste an identity enrollment token(JTW)" prompt || true
|
||||
if [[ ${prompt} ]]; then
|
||||
msg_info "Adding identity"
|
||||
echo "${prompt}" >/opt/openziti/etc/identities/identity.jwt
|
||||
|
||||
@@ -27,15 +27,13 @@ fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/
|
||||
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
pango_url="${var_pangolin_url:-}"
|
||||
if [[ -z "$pango_url" ]]; then
|
||||
read -rp "${TAB3}Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url
|
||||
fi
|
||||
[[ -n "$pango_url" ]] || read -rp "${TAB3}Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url || true
|
||||
[[ -n "$pango_url" ]] || { msg_error "No Pangolin URL given; set var_pangolin_url or answer the prompt"; exit 64; }
|
||||
[[ "$pango_url" != https://* && "$pango_url" != http://* ]] && pango_url="https://${pango_url}"
|
||||
|
||||
pango_email="${var_pangolin_email:-}"
|
||||
if [[ -z "$pango_email" ]]; then
|
||||
read -rp "${TAB3}Enter your email address: " pango_email
|
||||
fi
|
||||
[[ -n "$pango_email" ]] || read -rp "${TAB3}Enter your email address: " pango_email || true
|
||||
[[ -n "$pango_email" ]] || { msg_error "No email address given; set var_pangolin_email or answer the prompt"; exit 64; }
|
||||
|
||||
msg_info "Setup Pangolin"
|
||||
SECRET_KEY=$(random_password 32)
|
||||
|
||||
@@ -38,16 +38,22 @@ CGO_ENABLED=1 go build -tags musl -o paperless-gpt .
|
||||
msg_ok "Setup Paperless-GPT"
|
||||
|
||||
mkdir -p /opt/paperless-gpt-data
|
||||
read -rp "${TAB3}Do you want to enter the Paperless local URL now? (y/n) " input_url
|
||||
if [[ $input_url =~ ^[Yy]$ ]]; then
|
||||
read -rp "${TAB3}Enter your Paperless-NGX instance URL (e.g., http://192.168.1.100:8000): " PAPERLESS_BASE_URL
|
||||
input_url="${var_paperless_gpt_enter_url:-}"
|
||||
[[ -n "$input_url" ]] || read -rp "${TAB3}Do you want to enter the Paperless local URL now? (y/n) " input_url || true
|
||||
if [[ $input_url =~ ^[Yy]([Ee][Ss])?$ ]]; then
|
||||
PAPERLESS_BASE_URL="${var_paperless_gpt_url:-}"
|
||||
[[ -n "$PAPERLESS_BASE_URL" ]] || read -rp "${TAB3}Enter your Paperless-NGX instance URL (e.g., http://192.168.1.100:8000): " PAPERLESS_BASE_URL || true
|
||||
[[ -n "$PAPERLESS_BASE_URL" ]] || { msg_error "No Paperless-NGX URL given; set var_paperless_gpt_url or answer the prompt"; exit 64; }
|
||||
else
|
||||
PAPERLESS_BASE_URL="http://your_paperless_ngx_url"
|
||||
fi
|
||||
|
||||
read -rp "${TAB3}Do you want to enter the Paperless API token now? (y/n) " input_token
|
||||
if [[ $input_token =~ ^[Yy]$ ]]; then
|
||||
read -rp "${TAB3}Enter your Paperless API token: " PAPERLESS_API_TOKEN
|
||||
input_token="${var_paperless_gpt_enter_token:-}"
|
||||
[[ -n "$input_token" ]] || read -rp "${TAB3}Do you want to enter the Paperless API token now? (y/n) " input_token || true
|
||||
if [[ $input_token =~ ^[Yy]([Ee][Ss])?$ ]]; then
|
||||
PAPERLESS_API_TOKEN="${var_paperless_gpt_api_token:-}"
|
||||
[[ -n "$PAPERLESS_API_TOKEN" ]] || read -rp "${TAB3}Enter your Paperless API token: " PAPERLESS_API_TOKEN || true
|
||||
[[ -n "$PAPERLESS_API_TOKEN" ]] || { msg_error "No Paperless API token given; set var_paperless_gpt_api_token or answer the prompt"; exit 64; }
|
||||
else
|
||||
PAPERLESS_API_TOKEN="your_paperless_api_token"
|
||||
fi
|
||||
|
||||
@@ -172,7 +172,7 @@ systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task
|
||||
msg_ok "Created Services"
|
||||
|
||||
prompt="${var_paperless_ngx_adminer:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
setup_adminer
|
||||
fi
|
||||
|
||||
@@ -107,7 +107,7 @@ ExecStart=/opt/patchmon/patchmon-server
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=PATH=/usr/bin:/usr/local/bin
|
||||
EnvironmentFile=/opt/patchmon/.env
|
||||
Environment=ENV_FILE=/opt/patchmon/.env
|
||||
NoNewPrivileges=true
|
||||
PrivateTmp=true
|
||||
ProtectSystem=strict
|
||||
|
||||
@@ -57,10 +57,10 @@ systemctl restart pihole-FTL.service
|
||||
msg_ok "Installed Pi-hole"
|
||||
|
||||
prompt="${var_pihole_unbound:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Unbound? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Unbound? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
prompt="${var_pihole_unbound_dot:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Unbound is configured as a recursive DNS server by default, would you like it to be configured as a forwarding DNS server (using DNS-over-TLS (DoT)) instead? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Unbound is configured as a recursive DNS server by default, would you like it to be configured as a forwarding DNS server (using DNS-over-TLS (DoT)) instead? <y/N> " prompt || true
|
||||
msg_info "Installing Unbound"
|
||||
mkdir -p /etc/unbound/unbound.conf.d
|
||||
cat <<EOF >/etc/unbound/unbound.conf.d/pi-hole.conf
|
||||
|
||||
@@ -13,7 +13,9 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
|
||||
public_url="${var_pocketid_url:-}"
|
||||
[[ -n "$public_url" ]] || read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url || true
|
||||
[[ -n "$public_url" ]] || { msg_error "No public URL given; set var_pocketid_url or answer the prompt"; exit 64; }
|
||||
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"
|
||||
|
||||
@@ -54,7 +54,7 @@ msg_ok "Installed Podman"
|
||||
mkdir -p /etc/containers/systemd
|
||||
|
||||
prompt="${var_podman_homeassistant_portainer:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Portainer? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Portainer? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Portainer $PORTAINER_LATEST_VERSION"
|
||||
podman volume create portainer_data >/dev/null
|
||||
@@ -82,7 +82,7 @@ EOF
|
||||
msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION"
|
||||
else
|
||||
prompt="${var_podman_homeassistant_portainer_agent:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add the Portainer Agent? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add the Portainer Agent? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Portainer agent $PORTAINER_AGENT_LATEST_VERSION"
|
||||
cat <<EOF >/etc/containers/systemd/portainer-agent.container
|
||||
|
||||
@@ -49,7 +49,7 @@ msg_ok "Installed Podman"
|
||||
mkdir -p /etc/containers/systemd
|
||||
|
||||
prompt="${var_podman_portainer:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Portainer? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add Portainer? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Portainer $PORTAINER_LATEST_VERSION"
|
||||
podman volume create portainer_data >/dev/null
|
||||
@@ -78,7 +78,7 @@ EOF
|
||||
msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION"
|
||||
else
|
||||
prompt="${var_podman_portainer_agent:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add the Portainer Agent? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add the Portainer Agent? <y/N> " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Portainer agent $PORTAINER_AGENT_LATEST_VERSION"
|
||||
$STD podman pull docker.io/portainer/agent:latest
|
||||
|
||||
@@ -47,9 +47,15 @@ msg_ok "Installed PHP"
|
||||
|
||||
MARIADB_DB_NAME="panel" MARIADB_DB_USER="pterodactyl" MARIADB_DB_CREDS_FILE="$HOME/pterodactyl-panel.creds" setup_mariadb_db
|
||||
|
||||
read -p "${TAB3}Provide an email address for admin login, this should be a valid email address: " ADMIN_EMAIL
|
||||
read -p "${TAB3}Enter your First Name: " NAME_FIRST
|
||||
read -p "${TAB3}Enter your Last Name: " NAME_LAST
|
||||
ADMIN_EMAIL="${var_pterodactyl_panel_admin_email:-}"
|
||||
[[ -n "$ADMIN_EMAIL" ]] || read -r -p "${TAB3}Provide an email address for admin login, this should be a valid email address: " ADMIN_EMAIL || true
|
||||
[[ -n "$ADMIN_EMAIL" ]] || { msg_error "No admin email given; set var_pterodactyl_panel_admin_email or answer the prompt"; exit 64; }
|
||||
NAME_FIRST="${var_pterodactyl_panel_first_name:-}"
|
||||
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name: " NAME_FIRST || true
|
||||
[[ -n "$NAME_FIRST" ]] || { msg_error "No first name given; set var_pterodactyl_panel_first_name or answer the prompt"; exit 64; }
|
||||
NAME_LAST="${var_pterodactyl_panel_last_name:-}"
|
||||
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name: " NAME_LAST || true
|
||||
[[ -n "$NAME_LAST" ]] || { msg_error "No last name given; set var_pterodactyl_panel_last_name or answer the prompt"; exit 64; }
|
||||
|
||||
fetch_and_deploy_gh_release "pterodactyl-panel" "pterodactyl/panel" "prebuild" "latest" "/opt/pterodactyl-panel" "panel.tar.gz"
|
||||
|
||||
|
||||
@@ -13,11 +13,8 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
if [[ -n "${var_rustdesk_api:-}" ]]; then
|
||||
prompt="$var_rustdesk_api"
|
||||
else
|
||||
read -r -p "${TAB3}Would you like to add the RustDesk API web UI (lejianwen/rustdesk-api, unmaintained since 09/2025)? <y/N> " prompt
|
||||
fi
|
||||
prompt="${var_rustdesk_api:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add the RustDesk API web UI (lejianwen/rustdesk-api, unmaintained since 09/2025)? <y/N> " prompt || true
|
||||
INSTALL_API=0
|
||||
[[ "${prompt,,}" =~ ^(y|yes|true)$ ]] && INSTALL_API=1
|
||||
API_PASS="$(random_password 16)"
|
||||
|
||||
@@ -41,7 +41,7 @@ $STD uv pip install -r /opt/sabnzbd/requirements.txt --python=/opt/sabnzbd/venv/
|
||||
msg_ok "Installed SABnzbd"
|
||||
|
||||
prompt="${var_sabnzbd_par2_turbo:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "Would you like to install par2cmdline-turbo? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "Would you like to install par2cmdline-turbo? <y/N> " prompt || true
|
||||
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-$(arch_resolve).zip"
|
||||
|
||||
@@ -47,7 +47,8 @@ echo " 3) Use an existing Flaresolverr/Byparr LXC"
|
||||
echo " 4) Disable captcha bypassing altogether (not recommended)"
|
||||
echo ""
|
||||
|
||||
read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE
|
||||
DEPLOYMENT_TYPE="${var_shelfmark_deployment_type:-}"
|
||||
[[ -n "$DEPLOYMENT_TYPE" ]] || read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE || true
|
||||
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"
|
||||
@@ -69,7 +70,8 @@ case "$DEPLOYMENT_TYPE" in
|
||||
echo "Example: http://flaresoverr.homelab.lan:8191 or"
|
||||
echo "http://192.168.10.99:8191"
|
||||
echo ""
|
||||
read -r -p "FlareSolverr/Byparr URL: " BYPASSER_URL
|
||||
BYPASSER_URL="${var_shelfmark_bypasser_url:-}"
|
||||
[[ -n "$BYPASSER_URL" ]] || read -r -p "FlareSolverr/Byparr URL: " BYPASSER_URL || true
|
||||
|
||||
if [[ -z "$BYPASSER_URL" ]]; then
|
||||
msg_warn "No Flaresolverr/Byparr URL provided. Falling back to Shelfmark's internal bypasser."
|
||||
|
||||
@@ -18,7 +18,7 @@ mkdir -p /opt/silverbullet/space
|
||||
|
||||
RUNTIME_API_ENV=""
|
||||
runtime_api_prompt="${var_silverbullet_runtime_api:-}"
|
||||
[[ -n "$runtime_api_prompt" ]] || read -rp "${TAB3}Enable Silverbullet Runtime API? Requires Chromium (~700MB). Uses ~200MB extra RAM. (y/N): " runtime_api_prompt
|
||||
[[ -n "$runtime_api_prompt" ]] || read -rp "${TAB3}Enable Silverbullet Runtime API? Requires Chromium (~700MB). Uses ~200MB extra RAM. (y/N): " runtime_api_prompt || true
|
||||
if [[ "${runtime_api_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing Chromium for Runtime API"
|
||||
$STD apt install -y chromium
|
||||
|
||||
@@ -37,7 +37,7 @@ sed -i \
|
||||
msg_ok "Configured Slskd"
|
||||
|
||||
soularr="${var_slskd_soularr:-}"
|
||||
[[ -n "$soularr" ]] || read -rp "${TAB3}Do you want to install Soularr? y/N " soularr
|
||||
[[ -n "$soularr" ]] || read -rp "${TAB3}Do you want to install Soularr? y/N " soularr || true
|
||||
if [[ ${soularr,,} =~ ^(y|yes)$ ]]; then
|
||||
PYTHON_VERSION="3.11" setup_uv
|
||||
fetch_and_deploy_gh_release "Soularr" "mrusse/soularr" "tarball" "latest" "/opt/soularr"
|
||||
|
||||
@@ -46,7 +46,8 @@ echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile
|
||||
source ~/.bash_profile
|
||||
msg_ok "Installed SQL Server Tools"
|
||||
|
||||
read -r -p "${TAB3}Do you want to run the SQL server setup now? (Later is also possible) <y/N>" prompt
|
||||
prompt="${var_sqlserver2022_setup_now:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Do you want to run the SQL server setup now? (Later is also possible) <y/N>" prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
/opt/mssql/bin/mssql-conf setup
|
||||
else
|
||||
|
||||
@@ -46,7 +46,8 @@ echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile
|
||||
source ~/.bash_profile
|
||||
msg_ok "Installed SQL Server Tools"
|
||||
|
||||
read -r -p "${TAB3}Do you want to run the SQL Server setup now? (Later is also possible) <y/N>" prompt
|
||||
prompt="${var_sqlserver2025_setup_now:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Do you want to run the SQL Server setup now? (Later is also possible) <y/N>" prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
/opt/mssql/bin/mssql-conf setup
|
||||
else
|
||||
|
||||
@@ -32,7 +32,9 @@ Password: ${PASS}
|
||||
EOF
|
||||
msg_ok "Set up Tinyauth"
|
||||
|
||||
read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url
|
||||
app_url="${var_tinyauth_app_url:-}"
|
||||
[[ -n "$app_url" ]] || read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url || true
|
||||
[[ -n "$app_url" ]] || { msg_error "No Tinyauth app URL given; set var_tinyauth_app_url or answer the prompt"; exit 64; }
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/opt/tinyauth/.env
|
||||
@@ -77,7 +79,9 @@ Password: ${PASS}
|
||||
EOF
|
||||
msg_ok "Configured Tinyauth"
|
||||
|
||||
read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url
|
||||
app_url="${var_tinyauth_app_url:-}"
|
||||
[[ -n "$app_url" ]] || read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url || true
|
||||
[[ -n "$app_url" ]] || { msg_error "No Tinyauth app URL given; set var_tinyauth_app_url or answer the prompt"; exit 64; }
|
||||
|
||||
cat <<EOF >/opt/tinyauth/.env
|
||||
TINYAUTH_DATABASE_PATH=/opt/tinyauth/database.db
|
||||
|
||||
@@ -106,7 +106,7 @@ setup_alpine() {
|
||||
msg_ok "Installed Traefik"
|
||||
|
||||
enable_webui="${var_traefik_webui:-}"
|
||||
[[ -n "$enable_webui" ]] || read -p "${TAB3}Enable Traefik WebUI (Port 8080)? [y/N]: " enable_webui
|
||||
[[ -n "$enable_webui" ]] || read -r -p "${TAB3}Enable Traefik WebUI (Port 8080)? [y/N]: " enable_webui || true
|
||||
if [[ "${enable_webui,,}" =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Configuring Traefik WebUI"
|
||||
sed -i 's/localhost//g' /etc/traefik/traefik.yaml
|
||||
|
||||
@@ -14,17 +14,17 @@ network_check
|
||||
update_os
|
||||
|
||||
install -d -m 0700 /etc/twingate
|
||||
access_token=""
|
||||
refresh_token=""
|
||||
network=""
|
||||
access_token="${var_twingate_connector_access_token:-}"
|
||||
refresh_token="${var_twingate_connector_refresh_token:-}"
|
||||
network="${var_twingate_connector_network:-}"
|
||||
while [[ -z "$access_token" ]]; do
|
||||
read -rp "${TAB3}Please enter your access token: " access_token
|
||||
read -rp "${TAB3}Please enter your access token: " access_token || { msg_error "No access token given; set var_twingate_connector_access_token or answer the prompt"; exit 64; }
|
||||
done
|
||||
while [[ -z "$refresh_token" ]]; do
|
||||
read -rp "${TAB3}Please enter your refresh token: " refresh_token
|
||||
read -rp "${TAB3}Please enter your refresh token: " refresh_token || { msg_error "No refresh token given; set var_twingate_connector_refresh_token or answer the prompt"; exit 64; }
|
||||
done
|
||||
while [[ -z "$network" ]]; do
|
||||
read -rp "${TAB3}Please enter your network name: " network
|
||||
read -rp "${TAB3}Please enter your network name: " network || { msg_error "No network name given; set var_twingate_connector_network or answer the prompt"; exit 64; }
|
||||
done
|
||||
|
||||
msg_info "Setup Twingate Repository"
|
||||
|
||||
@@ -37,10 +37,10 @@ setup_deb_based() {
|
||||
|
||||
echo
|
||||
prompt="${var_valkey_tls:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Enable TLS for Valkey (Sentinel mode does not supported)? [y/N]: " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Enable TLS for Valkey (Sentinel mode does not supported)? [y/N]: " prompt || true
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
tls_only="${var_valkey_tls_only:-}"
|
||||
[[ -n "$tls_only" ]] || read -r -p "${TAB3}Use TLS-only mode (disable TCP port 6379)? [y/N]: " tls_only
|
||||
[[ -n "$tls_only" ]] || read -r -p "${TAB3}Use TLS-only mode (disable TCP port 6379)? [y/N]: " tls_only || true
|
||||
msg_info "Configuring TLS for Valkey..."
|
||||
|
||||
create_self_signed_cert "Valkey"
|
||||
|
||||
@@ -17,7 +17,7 @@ fetch_and_deploy_gh_release "versitygw" "versity/versitygw" "binary"
|
||||
|
||||
WEBUI_CONF=""
|
||||
webui_prompt="${var_versitygw_webgui:-}"
|
||||
[[ -n "$webui_prompt" ]] || read -rp "Would you like to enable the VersityGW WebGUI (Beta)? (y/N): " webui_prompt
|
||||
[[ -n "$webui_prompt" ]] || read -rp "Would you like to enable the VersityGW WebGUI (Beta)? (y/N): " webui_prompt || true
|
||||
if [[ "${webui_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
WEBUI_CONF="\nVGW_WEBUI_PORT=:7071\nVGW_WEBUI_NO_TLS=true"
|
||||
msg_ok "WebGUI will be enabled on port 7071"
|
||||
|
||||
@@ -28,7 +28,7 @@ fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics"
|
||||
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "$victoriametrics_release" "/opt/victoriametrics" "$vmutils_filename"
|
||||
|
||||
prompt="${var_victoriametrics_logs:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add VictoriaLogs? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add VictoriaLogs? <y/N> " prompt || true
|
||||
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
vl_release_json="$(mktemp)"
|
||||
|
||||
@@ -25,7 +25,7 @@ setup_deb_based() {
|
||||
msg_ok "Installed WireGuard"
|
||||
|
||||
prompt="${var_wireguard_wgdashboard:-}"
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add WGDashboard? <y/N> " prompt
|
||||
[[ -n "$prompt" ]] || read -r -p "${TAB3}Would you like to add WGDashboard? <y/N> " prompt || true
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
git clone -q https://github.com/WGDashboard/WGDashboard.git /etc/wgdashboard
|
||||
|
||||
@@ -111,7 +111,7 @@ EOF
|
||||
msg_ok "Installed WireGuard"
|
||||
|
||||
INSTALL_WGD="${var_wireguard_wgdashboard:-}"
|
||||
[[ -n "$INSTALL_WGD" ]] || read -rp "${TAB3}Do you want to install WGDashboard? (y/N): " INSTALL_WGD
|
||||
[[ -n "$INSTALL_WGD" ]] || read -rp "${TAB3}Do you want to install WGDashboard? (y/N): " INSTALL_WGD || true
|
||||
if [[ "${INSTALL_WGD,,}" =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Installing additional dependencies for WGDashboard"
|
||||
$STD apk add --no-cache \
|
||||
|
||||
@@ -16,7 +16,8 @@ update_os
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_DB_NAME="zabbixdb" PG_DB_USER="zabbix" setup_postgresql_db
|
||||
|
||||
read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE
|
||||
ZABBIX_CHOICE="${var_zabbix_version:-}"
|
||||
[[ -n "$ZABBIX_CHOICE" ]] || read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE || true
|
||||
ZABBIX_CHOICE=${ZABBIX_CHOICE:-2}
|
||||
case "$ZABBIX_CHOICE" in
|
||||
1) ZABBIX_VERSION="7.0" ;;
|
||||
@@ -59,8 +60,9 @@ sed -i "s/^DBUser=.*/DBUser=$PG_DB_USER/" /etc/zabbix/zabbix_server.conf
|
||||
sed -i "s/^# DBPassword=.*/DBPassword=$PG_DB_PASS/" /etc/zabbix/zabbix_server.conf
|
||||
msg_ok "Installed Zabbix $ZABBIX_VERSION"
|
||||
|
||||
AGENT_CHOICE="${var_zabbix_agent:-}"
|
||||
while true; do
|
||||
read -rp "Which agent do you want to install? [1=agent (classic), 2=agent2 (modern), default=1]: " AGENT_CHOICE
|
||||
[[ -n "$AGENT_CHOICE" ]] || read -rp "Which agent do you want to install? [1=agent (classic), 2=agent2 (modern), default=1]: " AGENT_CHOICE || AGENT_CHOICE="1"
|
||||
case "$AGENT_CHOICE" in
|
||||
2)
|
||||
AGENT_PKG="zabbix-agent2"
|
||||
@@ -72,6 +74,7 @@ while true; do
|
||||
;;
|
||||
*)
|
||||
echo "Invalid choice. Please enter 1 or 2."
|
||||
AGENT_CHOICE=""
|
||||
;;
|
||||
esac
|
||||
done
|
||||
@@ -81,7 +84,8 @@ if [ "$AGENT_PKG" = "zabbix-agent2" ]; then
|
||||
echo "Choose plugins for Zabbix Agent2:"
|
||||
echo "1) PostgreSQL only (default, recommended)"
|
||||
echo "2) All plugins (may cause issues)"
|
||||
read -rp "Choose option [1-2]: " PLUGIN_CHOICE
|
||||
PLUGIN_CHOICE="${var_zabbix_plugins:-}"
|
||||
[[ -n "$PLUGIN_CHOICE" ]] || read -rp "Choose option [1-2]: " PLUGIN_CHOICE || true
|
||||
|
||||
case "$PLUGIN_CHOICE" in
|
||||
2)
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "actual-budget
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
require_debian_like
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "adguardhome-s
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# ==============================================================================
|
||||
# CONFIGURATION
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "coder-code-se
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
APP="Coder Code Server"
|
||||
APP_TYPE="addon"
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "copyparty" "a
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
|
||||
# ==============================================================================
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "cronmaster" "
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
require_debian_like
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser-q
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||
load_functions
|
||||
|
||||
@@ -29,7 +29,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser"
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||
load_functions
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "immich-public
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# ==============================================================================
|
||||
# CONFIGURATION
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "jellystat" "a
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# ==============================================================================
|
||||
# CONFIGURATION
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "nextcloud-exp
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
require_debian_like
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "olivetin" "ad
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||
load_functions
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pihole-export
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
|
||||
# ==============================================================================
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "prometheus-pa
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
require_debian_like
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "qbittorrent-e
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
|
||||
# ==============================================================================
|
||||
|
||||
@@ -23,7 +23,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "sparkyfitness
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
load_functions
|
||||
require_debian_like
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "webmin" "addo
|
||||
|
||||
# Enable error handling
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
catch_errors
|
||||
|
||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
||||
load_functions
|
||||
|
||||
Reference in new issue
Block a user