mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-08-05 04:13:24 +02:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 30fae6c806 | |||
| b3550b99e0 | |||
| 1ac9af2add | |||
| 9b6476b22a | |||
| cb1b4bb705 | |||
| 55675cef37 | |||
| 0cea54711b | |||
| 34717720d4 | |||
| f230bd019a | |||
| a5452ec83b | |||
| 3e23659bbe | |||
| 6ad7dda1ec | |||
| fc21e2c458 | |||
| 7b7d5c4fdc | |||
| e028f3eb1b | |||
| 308ef17283 | |||
| 0fb07d03e7 | |||
| 084706a3d5 | |||
| cb58c616f7 | |||
| 89e43f2753 | |||
| 63434d9a0f | |||
| 7373c26b7f | |||
| d5d336698e | |||
| a686666abd | |||
| bedc73a049 | |||
| 92b7155ff9 | |||
| 5356ce7dcc | |||
| 566cbf736d |
Generated
-162
@@ -1,165 +1,3 @@
|
|||||||
## 2026-07-31
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Docmost: cleanup folder at update [@MickLesk](https://github.com/MickLesk) ([#16177](https://github.com/community-scripts/ProxmoxVE/pull/16177))
|
|
||||||
- Firecrawl: Add dependency [@tremor021](https://github.com/tremor021) ([#16174](https://github.com/community-scripts/ProxmoxVE/pull/16174))
|
|
||||||
|
|
||||||
## 2026-07-30
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Firecrawl ([#16156](https://github.com/community-scripts/ProxmoxVE/pull/16156))
|
|
||||||
- OmniRoute ([#16155](https://github.com/community-scripts/ProxmoxVE/pull/16155))
|
|
||||||
- PegaProx ([#16154](https://github.com/community-scripts/ProxmoxVE/pull/16154))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Immich: Pin version to 3.1.0 [@vhsdream](https://github.com/vhsdream) ([#16170](https://github.com/community-scripts/ProxmoxVE/pull/16170))
|
|
||||||
- romm: remove stale 1.x alembic migrations on update [@Darkatek7](https://github.com/Darkatek7) ([#16101](https://github.com/community-scripts/ProxmoxVE/pull/16101))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Medusa: convert the non-free unrar source to deb822 format [@angusmaul](https://github.com/angusmaul) ([#16093](https://github.com/community-scripts/ProxmoxVE/pull/16093))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- tools.func: support dynamic gitlab URL | add setup_mysql_db function [@MickLesk](https://github.com/MickLesk) ([#16166](https://github.com/community-scripts/ProxmoxVE/pull/16166))
|
|
||||||
- core: add configurable host CA inheritance during bootstrap [@MickLesk](https://github.com/MickLesk) ([#15889](https://github.com/community-scripts/ProxmoxVE/pull/15889))
|
|
||||||
|
|
||||||
## 2026-07-29
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- backup virtual printer in bambuddy [@asylumexp](https://github.com/asylumexp) ([#16142](https://github.com/community-scripts/ProxmoxVE/pull/16142))
|
|
||||||
- ImmichFrame: check .NET SDK before update deployment [@aidaskni](https://github.com/aidaskni) ([#16104](https://github.com/community-scripts/ProxmoxVE/pull/16104))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Bichon: Migration for V2 Release [@MickLesk](https://github.com/MickLesk) ([#16145](https://github.com/community-scripts/ProxmoxVE/pull/16145))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: Harden remote func bootstrapping with dns issues [@MickLesk](https://github.com/MickLesk) ([#16146](https://github.com/community-scripts/ProxmoxVE/pull/16146))
|
|
||||||
|
|
||||||
## 2026-07-28
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Create search directory in wanderer-install.sh [@Isnubi](https://github.com/Isnubi) ([#16134](https://github.com/community-scripts/ProxmoxVE/pull/16134))
|
|
||||||
- npmplus: Remove duplicate msg_info for container recreation [@MickLesk](https://github.com/MickLesk) ([#16122](https://github.com/community-scripts/ProxmoxVE/pull/16122))
|
|
||||||
- fix Node.js version drift [@asylumexp](https://github.com/asylumexp) ([#16111](https://github.com/community-scripts/ProxmoxVE/pull/16111))
|
|
||||||
- UmlautAdaptarr: use the Debian 13 Microsoft repo with its 2025 signing key [@angusmaul](https://github.com/angusmaul) ([#16077](https://github.com/community-scripts/ProxmoxVE/pull/16077))
|
|
||||||
- fix(bazarr): store data in /var/lib/bazarr instead of inside /opt/bazarr [@angusmaul](https://github.com/angusmaul) ([#16098](https://github.com/community-scripts/ProxmoxVE/pull/16098))
|
|
||||||
- Cloudflare-DDNS: store API token in a 600 env file and build the binary at install time [@angusmaul](https://github.com/angusmaul) ([#16100](https://github.com/community-scripts/ProxmoxVE/pull/16100))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- tools.func: add nginx site helper and PHP socket resolver [@MickLesk](https://github.com/MickLesk) ([#16118](https://github.com/community-scripts/ProxmoxVE/pull/16118))
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- Migrate Musicseerr to DroppedNeedle [@vhsdream](https://github.com/vhsdream) ([#15751](https://github.com/community-scripts/ProxmoxVE/pull/15751))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: fix read prompt input directly from /dev/tty [@MickLesk](https://github.com/MickLesk) ([#16126](https://github.com/community-scripts/ProxmoxVE/pull/16126))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- actual-budget-prometheus-exporter ([#16109](https://github.com/community-scripts/ProxmoxVE/pull/16109))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- fix: prometheus-paperless-exporter incompatibility with paperless v3 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#16119](https://github.com/community-scripts/ProxmoxVE/pull/16119))
|
|
||||||
|
|
||||||
### 📂 Github
|
|
||||||
|
|
||||||
- fix keep-open for close invalid pr [@asylumexp](https://github.com/asylumexp) ([#16105](https://github.com/community-scripts/ProxmoxVE/pull/16105))
|
|
||||||
- Bump GitHub Actions across workflows [@MickLesk](https://github.com/MickLesk) ([#16091](https://github.com/community-scripts/ProxmoxVE/pull/16091))
|
|
||||||
|
|
||||||
## 2026-07-27
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Unpackerr ([#16034](https://github.com/community-scripts/ProxmoxVE/pull/16034))
|
|
||||||
- CookCLI ([#16028](https://github.com/community-scripts/ProxmoxVE/pull/16028))
|
|
||||||
- Discourse ([#16024](https://github.com/community-scripts/ProxmoxVE/pull/16024))
|
|
||||||
- Mastodon ([#16029](https://github.com/community-scripts/ProxmoxVE/pull/16029))
|
|
||||||
- Docspell ([#16033](https://github.com/community-scripts/ProxmoxVE/pull/16033))
|
|
||||||
- Poznote ([#16030](https://github.com/community-scripts/ProxmoxVE/pull/16030))
|
|
||||||
- Shiori ([#16026](https://github.com/community-scripts/ProxmoxVE/pull/16026))
|
|
||||||
- Nezha ([#16025](https://github.com/community-scripts/ProxmoxVE/pull/16025))
|
|
||||||
- PasswordPusher ([#16031](https://github.com/community-scripts/ProxmoxVE/pull/16031))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Update MeiliSearch command for database upgrade [@Isnubi](https://github.com/Isnubi) ([#16081](https://github.com/community-scripts/ProxmoxVE/pull/16081))
|
|
||||||
- Mylar3 & Medusa: use trixie non-free for unrar, not bookworm [@angusmaul](https://github.com/angusmaul) ([#16072](https://github.com/community-scripts/ProxmoxVE/pull/16072))
|
|
||||||
- Vikunja: pin install/update to v2.3.0 due upstream issues [@MickLesk](https://github.com/MickLesk) ([#16059](https://github.com/community-scripts/ProxmoxVE/pull/16059))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- OpenThread-BR: Add runtime configuration options [@tomfrenzel](https://github.com/tomfrenzel) ([#16038](https://github.com/community-scripts/ProxmoxVE/pull/16038))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: Handle LXC upgrade prompt cancellation [@MickLesk](https://github.com/MickLesk) ([#16058](https://github.com/community-scripts/ProxmoxVE/pull/16058))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: fix OS version fallback when the host catalog lacks the requested version & harden template validation [@MickLesk](https://github.com/MickLesk) ([#16068](https://github.com/community-scripts/ProxmoxVE/pull/16068))
|
|
||||||
|
|
||||||
## 2026-07-26
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Satisfactory ([#16023](https://github.com/community-scripts/ProxmoxVE/pull/16023))
|
|
||||||
- OmniTools ([#16032](https://github.com/community-scripts/ProxmoxVE/pull/16032))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Apache Tika: Remove software-properties-common from Apache Tika install [@andygrunwald](https://github.com/andygrunwald) ([#16054](https://github.com/community-scripts/ProxmoxVE/pull/16054))
|
|
||||||
- Fix inventree missing db engine (upstream issue / postinstall) [@MickLesk](https://github.com/MickLesk) ([#16022](https://github.com/community-scripts/ProxmoxVE/pull/16022))
|
|
||||||
- OPNsense VM: answer console password prompt explicitly, add inter-key delay [@MickLesk](https://github.com/MickLesk) ([#16021](https://github.com/community-scripts/ProxmoxVE/pull/16021))
|
|
||||||
- [endurain] add node update to update script [@johanngrobe](https://github.com/johanngrobe) ([#16014](https://github.com/community-scripts/ProxmoxVE/pull/16014))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Apache Tika: Switch from Debian Bookworm to Debian Trixie and replace manual install of OpenJDK with setup_java [@andygrunwald](https://github.com/andygrunwald) ([#16036](https://github.com/community-scripts/ProxmoxVE/pull/16036))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: improve OS mismatch message [@MickLesk](https://github.com/MickLesk) ([#16035](https://github.com/community-scripts/ProxmoxVE/pull/16035))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Improve command description for disabling pve-enterprise repo [@Marcondiro](https://github.com/Marcondiro) ([#16020](https://github.com/community-scripts/ProxmoxVE/pull/16020))
|
|
||||||
|
|
||||||
## 2026-07-25
|
## 2026-07-25
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
Generated
-12
@@ -1,12 +0,0 @@
|
|||||||
## 2026-08-01
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Update bazarr-install.sh [@asylumexp](https://github.com/asylumexp) ([#16191](https://github.com/community-scripts/ProxmoxVE/pull/16191))
|
|
||||||
- fix romm missing 7z [@asylumexp](https://github.com/asylumexp) ([#16194](https://github.com/community-scripts/ProxmoxVE/pull/16194))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- add CLEANUPARR_CONFIG_PATH, CLEANUPARR_LOGS_PATH vars [@asylumexp](https://github.com/asylumexp) ([#16193](https://github.com/community-scripts/ProxmoxVE/pull/16193))
|
|
||||||
+155
-81
@@ -83,9 +83,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -99,14 +96,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><h4>August (1 entries)</h4></summary>
|
<summary><h4>July (25 entries)</h4></summary>
|
||||||
|
|
||||||
[View August 2026 Changelog](.github/changelogs/2026/08.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>July (31 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View July 2026 Changelog](.github/changelogs/2026/07.md)
|
[View July 2026 Changelog](.github/changelogs/2026/07.md)
|
||||||
|
|
||||||
@@ -518,75 +508,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 2026-08-04
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Obsidian-LiveSync ([#16233](https://github.com/community-scripts/ProxmoxVE/pull/16233))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- passwordpusher: dynamically read Ruby version from .ruby-version file [@Copilot](https://github.com/Copilot) ([#16242](https://github.com/community-scripts/ProxmoxVE/pull/16242))
|
|
||||||
- fix(salt): write version cache to ~/.salt, not /~.salt [@TowyTowy](https://github.com/TowyTowy) ([#16265](https://github.com/community-scripts/ProxmoxVE/pull/16265))
|
|
||||||
- AFFiNE: fix version and build type reported by the app itself [@MickLesk](https://github.com/MickLesk) ([#16251](https://github.com/community-scripts/ProxmoxVE/pull/16251))
|
|
||||||
- Passbolt: fetch GPG key from Passbolt's own host instead of the flaky keyserver [@MickLesk](https://github.com/MickLesk) ([#16248](https://github.com/community-scripts/ProxmoxVE/pull/16248))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Opencloud: Pin version to 7.4.0 [@vhsdream](https://github.com/vhsdream) ([#16257](https://github.com/community-scripts/ProxmoxVE/pull/16257))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Bump NodeJS Versions of several scripts [@MickLesk](https://github.com/MickLesk) ([#16230](https://github.com/community-scripts/ProxmoxVE/pull/16230))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- tools.func: never delete ubuntu.sources (or other distro base sources) as orphaned [@MickLesk](https://github.com/MickLesk) ([#16250](https://github.com/community-scripts/ProxmoxVE/pull/16250))
|
|
||||||
- tools.func: complete a stale/partial backup manifest instead of trusting it as-is [@MickLesk](https://github.com/MickLesk) ([#16252](https://github.com/community-scripts/ProxmoxVE/pull/16252))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Refactor: harmonize tools/addon and move boilerplate into core.func [@MickLesk](https://github.com/MickLesk) ([#16202](https://github.com/community-scripts/ProxmoxVE/pull/16202))
|
|
||||||
|
|
||||||
## 2026-08-03
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Correction to link in Paperless-NGX update script [@jsspen](https://github.com/jsspen) ([#16241](https://github.com/community-scripts/ProxmoxVE/pull/16241))
|
|
||||||
- fix restore env in split pro [@johanngrobe](https://github.com/johanngrobe) ([#16228](https://github.com/community-scripts/ProxmoxVE/pull/16228))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: read all interactive prompts from /dev/tty, drain leftover input on read failure (hotfix) [@MickLesk](https://github.com/MickLesk) ([#16235](https://github.com/community-scripts/ProxmoxVE/pull/16235))
|
|
||||||
|
|
||||||
## 2026-08-02
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Portainer as Addon [@MickLesk](https://github.com/MickLesk) ([#16200](https://github.com/community-scripts/ProxmoxVE/pull/16200))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- LibreNMS: Ensure ipmitool dependency is installed [@tremor021](https://github.com/tremor021) ([#16219](https://github.com/community-scripts/ProxmoxVE/pull/16219))
|
|
||||||
- Bitfocus Companion: add libatomic1 dependency [@tremor021](https://github.com/tremor021) ([#16212](https://github.com/community-scripts/ProxmoxVE/pull/16212))
|
|
||||||
- fix(dispatcharr): add recordings and dvr queues to celery worker [@eXistC](https://github.com/eXistC) ([#16204](https://github.com/community-scripts/ProxmoxVE/pull/16204))
|
|
||||||
- add retry for uv - same as immich [@asylumexp](https://github.com/asylumexp) ([#16203](https://github.com/community-scripts/ProxmoxVE/pull/16203))
|
|
||||||
- Fix for cross-seed node version regression [@TorinFrancis](https://github.com/TorinFrancis) ([#16209](https://github.com/community-scripts/ProxmoxVE/pull/16209))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- chore: remove portainer setup from several scripts (moved to addon) [@MickLesk](https://github.com/MickLesk) ([#16201](https://github.com/community-scripts/ProxmoxVE/pull/16201))
|
|
||||||
|
|
||||||
## 2026-08-01
|
## 2026-08-01
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
@@ -1186,4 +1107,157 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- Removed deprecated parameter in Filebrowser Quantum configuration [@alpargatagazer](https://github.com/alpargatagazer) ([#15573](https://github.com/community-scripts/ProxmoxVE/pull/15573))
|
- Removed deprecated parameter in Filebrowser Quantum configuration [@alpargatagazer](https://github.com/alpargatagazer) ([#15573](https://github.com/community-scripts/ProxmoxVE/pull/15573))
|
||||||
|
|
||||||
|
## 2026-07-02
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Rackula ([#15465](https://github.com/community-scripts/ProxmoxVE/pull/15465))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- typo: fix npm update to npm install for n8n [@MickLesk](https://github.com/MickLesk) ([#15545](https://github.com/community-scripts/ProxmoxVE/pull/15545))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Frigate: bump to v0.17.2 [@MickLesk](https://github.com/MickLesk) ([#15536](https://github.com/community-scripts/ProxmoxVE/pull/15536))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- Revert "Immich v3.0.0" [@MickLesk](https://github.com/MickLesk) ([#15558](https://github.com/community-scripts/ProxmoxVE/pull/15558))
|
||||||
|
- Immich v3.0.0 [@vhsdream](https://github.com/vhsdream) ([#15153](https://github.com/community-scripts/ProxmoxVE/pull/15153))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools.func: configure pnpm to allow all build scripts for environments [@MickLesk](https://github.com/MickLesk) ([#15532](https://github.com/community-scripts/ProxmoxVE/pull/15532))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- feat(build.func): add var_ignore_disable to bypass disabled-script guard [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15544](https://github.com/community-scripts/ProxmoxVE/pull/15544))
|
||||||
|
|
||||||
|
## 2026-07-01
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- iVentoy ([#15503](https://github.com/community-scripts/ProxmoxVE/pull/15503))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Stirling-PDF: patch libicudata execstack flag for LXC container compatibility [@MickLesk](https://github.com/MickLesk) ([#15531](https://github.com/community-scripts/ProxmoxVE/pull/15531))
|
||||||
|
- FlowiseAI: align install to use pnpm instead of npm to fix missing dependencies [@MickLesk](https://github.com/MickLesk) ([#15530](https://github.com/community-scripts/ProxmoxVE/pull/15530))
|
||||||
|
- Vaultwarden: handle version detection failure gracefully in update [@MickLesk](https://github.com/MickLesk) ([#15526](https://github.com/community-scripts/ProxmoxVE/pull/15526))
|
||||||
|
- homarr: fix: update-fail [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15512](https://github.com/community-scripts/ProxmoxVE/pull/15512))
|
||||||
|
- n8n: pin version to 2.27.5 [@tremor021](https://github.com/tremor021) ([#15516](https://github.com/community-scripts/ProxmoxVE/pull/15516))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- [arm64] feat: iventory arm64 support [@asylumexp](https://github.com/asylumexp) ([#15521](https://github.com/community-scripts/ProxmoxVE/pull/15521))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: fix SDN vnet network parameter to use bridge instead of vnet [@MickLesk](https://github.com/MickLesk) ([#15527](https://github.com/community-scripts/ProxmoxVE/pull/15527))
|
||||||
|
- tools.func: use safe variable expansion in check_for_gh_release RETURN trap [@MickLesk](https://github.com/MickLesk) ([#15529](https://github.com/community-scripts/ProxmoxVE/pull/15529))
|
||||||
|
|
||||||
|
## 2026-06-30
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Use heredoc when creating env files and creds/other [@tremor021](https://github.com/tremor021) ([#15469](https://github.com/community-scripts/ProxmoxVE/pull/15469))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [tools/pve/*.sh] https://download.proxmox.com -> http://download.proxmox.com (PVE8 Only) [@galeksandrp](https://github.com/galeksandrp) ([#15498](https://github.com/community-scripts/ProxmoxVE/pull/15498))
|
||||||
|
|
||||||
|
## 2026-06-29
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Koffan ([#15467](https://github.com/community-scripts/ProxmoxVE/pull/15467))
|
||||||
|
- Etherpad ([#15468](https://github.com/community-scripts/ProxmoxVE/pull/15468))
|
||||||
|
- Flame ([#15464](https://github.com/community-scripts/ProxmoxVE/pull/15464))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- chore(ct): sync snapotter defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#15472](https://github.com/community-scripts/ProxmoxVE/pull/15472))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- feat: update nginx proxy manager to trixie [@asylumexp](https://github.com/asylumexp) ([#15457](https://github.com/community-scripts/ProxmoxVE/pull/15457))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- [tools.func]: add edit_yaml_config function [@tremor021](https://github.com/tremor021) ([#15484](https://github.com/community-scripts/ProxmoxVE/pull/15484))
|
||||||
|
|
||||||
|
## 2026-06-28
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- remove: promtail as EOL and other fixes [@asylumexp](https://github.com/asylumexp) ([#15455](https://github.com/community-scripts/ProxmoxVE/pull/15455))
|
||||||
|
|
||||||
|
## 2026-06-27
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- tool: add disk-health tool (SMART + NVMe) [@MickLesk](https://github.com/MickLesk) ([#15417](https://github.com/community-scripts/ProxmoxVE/pull/15417))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Deluge openssl fix [@asylumexp](https://github.com/asylumexp) ([#15435](https://github.com/community-scripts/ProxmoxVE/pull/15435))
|
||||||
|
- fix command syntax in tunarr.sh [@asylumexp](https://github.com/asylumexp) ([#15434](https://github.com/community-scripts/ProxmoxVE/pull/15434))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Storyteller: bump Node.js version to Node 24 [@thinusn](https://github.com/thinusn) ([#15439](https://github.com/community-scripts/ProxmoxVE/pull/15439))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- fix(endurain): replace Poetry/uv-pip backend setup with uv sync --frozen --no-dev [@Copilot](https://github.com/Copilot) ([#15429](https://github.com/community-scripts/ProxmoxVE/pull/15429))
|
||||||
|
|
||||||
|
## 2026-06-26
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Termix: Update Nginx configuration file paths [@xyzulu](https://github.com/xyzulu) ([#15397](https://github.com/community-scripts/ProxmoxVE/pull/15397))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Docuseal: use real SECRET_KEY_BASE for db:migrate on update [@MickLesk](https://github.com/MickLesk) ([#15411](https://github.com/community-scripts/ProxmoxVE/pull/15411))
|
||||||
|
- bun: correct install for degoog [@MickLesk](https://github.com/MickLesk) ([#15412](https://github.com/community-scripts/ProxmoxVE/pull/15412))
|
||||||
|
- fix databasus update/install errors [@asylumexp](https://github.com/asylumexp) ([#15403](https://github.com/community-scripts/ProxmoxVE/pull/15403))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools.func: fix setup_docker - don't abort update on docker pull failure [@MickLesk](https://github.com/MickLesk) ([#15410](https://github.com/community-scripts/ProxmoxVE/pull/15410))
|
||||||
|
- fix(build.func): set /dev/kfd GID in fix_gpu_gids for AMD ROCm [@jamiej](https://github.com/jamiej) ([#15401](https://github.com/community-scripts/ProxmoxVE/pull/15401))
|
||||||
|
- fix alpine mktmp error [@asylumexp](https://github.com/asylumexp) ([#15398](https://github.com/community-scripts/ProxmoxVE/pull/15398))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: reduce IP-Tag resource usage and clean up ShellCheck findings [@MickLesk](https://github.com/MickLesk) ([#15418](https://github.com/community-scripts/ProxmoxVE/pull/15418))
|
||||||
|
- QoL: kernel-clean: Validate kernel selection input [@MickLesk](https://github.com/MickLesk) ([#15414](https://github.com/community-scripts/ProxmoxVE/pull/15414))
|
||||||
|
- QoL: clean-lxcs exclude matching and set -e cancel handling [@MickLesk](https://github.com/MickLesk) ([#15413](https://github.com/community-scripts/ProxmoxVE/pull/15413))
|
||||||
|
- QoL: Harden microcode download/install in microcode and pbs-microcode [@MickLesk](https://github.com/MickLesk) ([#15415](https://github.com/community-scripts/ProxmoxVE/pull/15415))
|
||||||
|
- QoL: scaling-governor extend selection and guard missing cpufreq [@MickLesk](https://github.com/MickLesk) ([#15416](https://github.com/community-scripts/ProxmoxVE/pull/15416))
|
||||||
+1
-1
@@ -30,7 +30,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
RELEASE=$(get_latest_github_release "actualbudget/actual")
|
RELEASE=$(get_latest_github_release "actualbudget/actual")
|
||||||
if [[ -f /opt/actualbudget-data/config.json ]]; then
|
if [[ -f /opt/actualbudget-data/config.json ]]; then
|
||||||
if check_for_gh_release "actualbudget" "actualbudget/actual"; then
|
if check_for_gh_release "actualbudget" "actualbudget/actual"; then
|
||||||
|
|||||||
@@ -81,8 +81,6 @@ TURBO
|
|||||||
|
|
||||||
export NODE_OPTIONS="--max-old-space-size=2048"
|
export NODE_OPTIONS="--max-old-space-size=2048"
|
||||||
$STD yarn install
|
$STD yarn install
|
||||||
$STD bash ./scripts/set-version.sh "$(cat ~/.affine_app)"
|
|
||||||
export BUILD_TYPE=stable
|
|
||||||
$STD npm install -g typescript
|
$STD npm install -g typescript
|
||||||
|
|
||||||
$STD yarn affine @affine/native build
|
$STD yarn affine @affine/native build
|
||||||
|
|||||||
+1
-10
@@ -118,19 +118,10 @@ function update_script() {
|
|||||||
export UV_COMPILE_BYTECODE="1"
|
export UV_COMPILE_BYTECODE="1"
|
||||||
export UV_LINK_MODE="copy"
|
export UV_LINK_MODE="copy"
|
||||||
export UV_NATIVE_TLS="1"
|
export UV_NATIVE_TLS="1"
|
||||||
export UV_HTTP_TIMEOUT="300"
|
|
||||||
export RUSTUP_PERMIT_COPY_RENAME="true"
|
export RUSTUP_PERMIT_COPY_RENAME="true"
|
||||||
export UV_PYTHON_INSTALL_DIR="/usr/local/bin"
|
export UV_PYTHON_INSTALL_DIR="/usr/local/bin"
|
||||||
cd /opt/authentik
|
cd /opt/authentik
|
||||||
for attempt in 1 2 3; do
|
$STD uv sync --frozen --no-install-project --no-dev
|
||||||
if [[ $attempt -eq 3 ]]; then
|
|
||||||
$STD uv sync --frozen --no-install-project --no-dev
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
$STD uv sync --frozen --no-install-project --no-dev && break
|
|
||||||
msg_warn "uv sync attempt $attempt failed, retrying..."
|
|
||||||
sleep $((attempt * 15))
|
|
||||||
done
|
|
||||||
chown -R authentik:authentik /opt/authentik
|
chown -R authentik:authentik /opt/authentik
|
||||||
msg_ok "Updated python server"
|
msg_ok "Updated python server"
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ function update_script() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ensure_dependencies libatomic1
|
|
||||||
|
|
||||||
RELEASE_JSON=$(curl -fsSL "https://api.bitfocus.io/v1/product/companion/packages?limit=20")
|
RELEASE_JSON=$(curl -fsSL "https://api.bitfocus.io/v1/product/companion/packages?limit=20")
|
||||||
PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c \
|
PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c \
|
||||||
--arg target "linux-$(arch_resolve "tgz" "arm64-tgz")" \
|
--arg target "linux-$(arch_resolve "tgz" "arm64-tgz")" \
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ function update_script() {
|
|||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="26" setup_nodejs
|
||||||
ensure_dependencies build-essential
|
ensure_dependencies build-essential
|
||||||
|
|
||||||
if command -v cross-seed &>/dev/null; then
|
if command -v cross-seed &>/dev/null; then
|
||||||
|
|||||||
+16
-5
@@ -37,9 +37,20 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if docker ps -a --format '{{.Image}}' | grep -q '^portainer/portainer-ce:latest$'; then
|
if docker ps -a --format '{{.Image}}' | grep -q '^portainer/portainer-ce:latest$'; then
|
||||||
msg_warn "Portainer is now managed by a dedicated addon script and is no longer updated here."
|
msg_info "Updating Portainer"
|
||||||
echo -e "${TAB}Update/migrate it with:"
|
$STD docker pull portainer/portainer-ce:latest
|
||||||
echo -e "${TAB}${TAB}${GN}bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)\"${CL}"
|
$STD docker stop portainer
|
||||||
|
$STD docker rm portainer
|
||||||
|
$STD docker volume create portainer_data >/dev/null 2>&1
|
||||||
|
$STD docker run -d \
|
||||||
|
-p 8000:8000 \
|
||||||
|
-p 9443:9443 \
|
||||||
|
--name=portainer \
|
||||||
|
--restart=always \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-v portainer_data:/data \
|
||||||
|
portainer/portainer-ce:latest
|
||||||
|
msg_ok "Updated Portainer"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if docker ps -a --format '{{.Names}}' | grep -q '^portainer_agent$'; then
|
if docker ps -a --format '{{.Names}}' | grep -q '^portainer_agent$'; then
|
||||||
@@ -66,5 +77,5 @@ description
|
|||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
msg_ok "Completed successfully!\n"
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
echo -e "${INFO}${YW} Portainer is available as a separate addon. Install it with:${CL}"
|
echo -e "${INFO}${YW} If you installed Portainer, access it at the following URL:${CL}"
|
||||||
echo -e "${GATEWAY}${BGN}bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)\"${CL}"
|
echo -e "${GATEWAY}${BGN}https://${IP}:9443${CL}"
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
_____
|
||||||
|
/ ___/_________ _____ ____ ____ __ __
|
||||||
|
\__ \/ ___/ __ `/ __ \/ __ \/ __ \/ / / /
|
||||||
|
___/ / /__/ /_/ / / / / /_/ / /_/ / /_/ /
|
||||||
|
/____/\___/\__,_/_/ /_/\____/ .___/\__, /
|
||||||
|
/_/ /____/
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ __ _ ___ __ _ _____
|
|
||||||
/ __ \/ /_ _____(_)___/ (_)___ _____ / / (_) _____ / ___/__ ______ _____
|
|
||||||
/ / / / __ \/ ___/ / __ / / __ `/ __ \______/ / / / | / / _ \\__ \/ / / / __ \/ ___/
|
|
||||||
/ /_/ / /_/ (__ ) / /_/ / / /_/ / / / /_____/ /___/ /| |/ / __/__/ / /_/ / / / / /__
|
|
||||||
\____/_.___/____/_/\__,_/_/\__,_/_/ /_/ /_____/_/ |___/\___/____/\__, /_/ /_/\___/
|
|
||||||
/____/
|
|
||||||
@@ -28,9 +28,6 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ensure_dependencies ipmitool
|
|
||||||
|
|
||||||
if check_for_gh_release "librenms" "librenms/librenms"; then
|
if check_for_gh_release "librenms" "librenms/librenms"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop php8.4-fpm librenms-scheduler.timer
|
systemctl stop php8.4-fpm librenms-scheduler.timer
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/vrtmrz/obsidian-livesync | https://couchdb.apache.org/
|
|
||||||
|
|
||||||
APP="Obsidian-LiveSync"
|
|
||||||
var_tags="${var_tags:-documents;notes}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-1024}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_arm64="${var_arm64:-yes}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /opt/couchdb/etc/local.d/obsidian-livesync.ini ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Stopping CouchDB"
|
|
||||||
systemctl stop couchdb
|
|
||||||
msg_ok "Stopped CouchDB"
|
|
||||||
|
|
||||||
create_backup /var/lib/couchdb /opt/couchdb/etc/local.d/obsidian-livesync.ini /opt/obsidian-livesync/.env
|
|
||||||
|
|
||||||
msg_info "Updating Container OS"
|
|
||||||
$STD apt update
|
|
||||||
$STD apt upgrade -y
|
|
||||||
msg_ok "Updated Container OS"
|
|
||||||
|
|
||||||
systemctl stop couchdb
|
|
||||||
restore_backup
|
|
||||||
|
|
||||||
msg_info "Starting CouchDB"
|
|
||||||
systemctl start couchdb
|
|
||||||
msg_ok "Started CouchDB"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW}Configure the Self-hosted LiveSync plugin with the credentials in /opt/obsidian-livesync/.env${CL}"
|
|
||||||
echo -e "${GATEWAY}${BGN}http://${IP}:5984/_utils/${CL}"
|
|
||||||
@@ -43,8 +43,6 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
msg_ok "New version available: ${LATEST}"
|
msg_ok "New version available: ${LATEST}"
|
||||||
|
|
||||||
NODE_VERSION="26" setup_nodejs
|
|
||||||
|
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop omniroute
|
systemctl stop omniroute
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v7.4.0"
|
RELEASE="v7.3.0"
|
||||||
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
|
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
|
||||||
msg_info "Stopping services"
|
msg_info "Stopping services"
|
||||||
systemctl stop opencloud opencloud-wopi
|
systemctl stop opencloud opencloud-wopi
|
||||||
|
|||||||
+1
-1
@@ -42,7 +42,7 @@ function update_script() {
|
|||||||
echo -e ""
|
echo -e ""
|
||||||
msg_custom "🔄" "Migration required to new data structure (/opt/paperless_data/)"
|
msg_custom "🔄" "Migration required to new data structure (/opt/paperless_data/)"
|
||||||
msg_custom "📖" "Please follow the migration guide:"
|
msg_custom "📖" "Please follow the migration guide:"
|
||||||
echo -e "${GATEWAY}${BGN}https://github.com/community-scripts/ProxmoxVE/pull/9223${CL}"
|
echo -e "${GATEWAY}${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/9223${CL}"
|
||||||
echo -e ""
|
echo -e ""
|
||||||
msg_custom "⚠️" "Update aborted. Please migrate your data first."
|
msg_custom "⚠️" "Update aborted. Please migrate your data first."
|
||||||
exit 253
|
exit 253
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ function update_script() {
|
|||||||
create_backup /opt/passwordpusher/storage /opt/passwordpusher/.env.production
|
create_backup /opt/passwordpusher/storage /opt/passwordpusher/.env.production
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
|
||||||
RUBY_VERSION="$(cat /opt/passwordpusher/.ruby-version)" RUBY_INSTALL_RAILS="false" setup_ruby
|
|
||||||
|
|
||||||
msg_info "Installing Gem Dependencies"
|
msg_info "Installing Gem Dependencies"
|
||||||
cd /opt/passwordpusher
|
cd /opt/passwordpusher
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ function update_script() {
|
|||||||
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
|
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt upgrade -y
|
$STD apt upgrade -y
|
||||||
echo "${RELEASE}" >~/.salt
|
echo "${RELEASE}" >/~.salt
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
+5
-3
@@ -35,16 +35,18 @@ function update_script() {
|
|||||||
systemctl stop split-pro
|
systemctl stop split-pro
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
create_backup /opt/split-pro/.env
|
msg_info "Backing up Data"
|
||||||
|
cp /opt/split-pro/.env /opt/split-pro.env
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "split-pro" "oss-apps/split-pro" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "split-pro" "oss-apps/split-pro" "tarball"
|
||||||
|
|
||||||
restore_backup
|
|
||||||
|
|
||||||
msg_info "Building Application"
|
msg_info "Building Application"
|
||||||
cd /opt/split-pro
|
cd /opt/split-pro
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
|
cp /opt/split-pro.env /opt/split-pro/.env
|
||||||
|
rm -f /opt/split-pro.env
|
||||||
ln -sf /opt/split-pro_data/uploads /opt/split-pro/uploads
|
ln -sf /opt/split-pro_data/uploads /opt/split-pro/uploads
|
||||||
$STD pnpm exec prisma migrate deploy
|
$STD pnpm exec prisma migrate deploy
|
||||||
msg_ok "Built Application"
|
msg_ok "Built Application"
|
||||||
|
|||||||
+1
-1
@@ -143,7 +143,7 @@ EOF
|
|||||||
fi
|
fi
|
||||||
msg_ok "Migrated Configuration"
|
msg_ok "Migrated Configuration"
|
||||||
|
|
||||||
create_backup /opt/termix/data /opt/termix/uploads /opt/termix/.env
|
create_backup /opt/termix/data /opt/termix/uploads
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ function update_script() {
|
|||||||
systemctl stop watcharr
|
systemctl stop watcharr
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
|
||||||
|
|
||||||
create_backup /opt/watcharr/server/data
|
create_backup /opt/watcharr/server/data
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
|
||||||
restore_backup
|
restore_backup
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ $STD apt install -y \
|
|||||||
g++
|
g++
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
create_self_signed_cert
|
create_self_signed_cert
|
||||||
|
|
||||||
msg_info "Installing Actual Budget"
|
msg_info "Installing Actual Budget"
|
||||||
|
|||||||
@@ -78,8 +78,6 @@ $STD yarn config set enableTelemetry 0
|
|||||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||||
export TSC_COMPILE_ON_ERROR=true
|
export TSC_COMPILE_ON_ERROR=true
|
||||||
$STD yarn install
|
$STD yarn install
|
||||||
$STD bash ./scripts/set-version.sh "$(cat ~/.affine_app)"
|
|
||||||
export BUILD_TYPE=stable
|
|
||||||
$STD npm install -g typescript
|
$STD npm install -g typescript
|
||||||
$STD yarn affine @affine/native build
|
$STD yarn affine @affine/native build
|
||||||
$STD yarn affine @affine/server-native build
|
$STD yarn affine @affine/server-native build
|
||||||
|
|||||||
@@ -26,21 +26,23 @@ msg_ok "Installed Docker"
|
|||||||
get_latest_release() {
|
get_latest_release() {
|
||||||
curl -fsSL https://api.github.com/repos/"$1"/releases/latest | grep '"tag_name":' | cut -d'"' -f4
|
curl -fsSL https://api.github.com/repos/"$1"/releases/latest | grep '"tag_name":' | cut -d'"' -f4
|
||||||
}
|
}
|
||||||
|
PORTAINER_LATEST_VERSION=$(get_latest_release "portainer/portainer")
|
||||||
DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose")
|
DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose")
|
||||||
PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent")
|
PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent")
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to add Docker Compose? <y/N> " prompt
|
read -r -p "${TAB3}Would you like to add Portainer? <y/N> " prompt
|
||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
|
msg_info "Installing Portainer $PORTAINER_LATEST_VERSION"
|
||||||
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
|
docker volume create portainer_data >/dev/null
|
||||||
mkdir -p "$DOCKER_CONFIG"/cli-plugins
|
$STD docker run -d \
|
||||||
curl -fsSL https://github.com/docker/compose/releases/download/"$DOCKER_COMPOSE_LATEST_VERSION"/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose
|
-p 8000:8000 \
|
||||||
chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose
|
-p 9443:9443 \
|
||||||
msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
|
--name=portainer \
|
||||||
fi
|
--restart=always \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then
|
-v portainer_data:/data \
|
||||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
|
portainer/portainer-ce:latest
|
||||||
|
msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION"
|
||||||
else
|
else
|
||||||
read -r -p "${TAB3}Would you like to add the Portainer Agent? <y/N> " prompt
|
read -r -p "${TAB3}Would you like to add the Portainer Agent? <y/N> " prompt
|
||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
@@ -55,12 +57,21 @@ else
|
|||||||
msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
|
msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
read -r -p "${TAB3}Would you like to add Docker Compose? <y/N> " prompt
|
||||||
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
|
||||||
|
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
|
||||||
|
mkdir -p "$DOCKER_CONFIG"/cli-plugins
|
||||||
|
curl -fsSL https://github.com/docker/compose/releases/download/"$DOCKER_COMPOSE_LATEST_VERSION"/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose
|
||||||
|
chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose
|
||||||
|
msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to expose the Docker TCP socket? <y/N> " prompt
|
read -r -p "${TAB3}Would you like to expose the Docker TCP socket? <y/N> " prompt
|
||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
msg_info "Exposing Docker TCP socket"
|
msg_info "Exposing Docker TCP socket"
|
||||||
$STD mkdir -p /etc/docker
|
$STD mkdir -p /etc/docker
|
||||||
$STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' >/etc/docker/daemon.json
|
$STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' > /etc/docker/daemon.json
|
||||||
$STD rc-service docker restart
|
$STD rc-service docker restart
|
||||||
msg_ok "Exposed Docker TCP socket at tcp://+:2375"
|
msg_ok "Exposed Docker TCP socket at tcp://+:2375"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -122,18 +122,9 @@ export UV_NO_BINARY_PACKAGE="cryptography lxml python-kadmin-rs xmlsec"
|
|||||||
export UV_COMPILE_BYTECODE="1"
|
export UV_COMPILE_BYTECODE="1"
|
||||||
export UV_LINK_MODE="copy"
|
export UV_LINK_MODE="copy"
|
||||||
export UV_NATIVE_TLS="1"
|
export UV_NATIVE_TLS="1"
|
||||||
export UV_HTTP_TIMEOUT="300"
|
|
||||||
export UV_PYTHON_INSTALL_DIR="/usr/local/bin"
|
export UV_PYTHON_INSTALL_DIR="/usr/local/bin"
|
||||||
cd /opt/authentik
|
cd /opt/authentik
|
||||||
for attempt in 1 2 3; do
|
$STD uv sync --frozen --no-install-project --no-dev
|
||||||
if [[ $attempt -eq 3 ]]; then
|
|
||||||
$STD uv sync --frozen --no-install-project --no-dev
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
$STD uv sync --frozen --no-install-project --no-dev && break
|
|
||||||
msg_warn "uv sync attempt $attempt failed, retrying..."
|
|
||||||
sleep $((attempt * 15))
|
|
||||||
done
|
|
||||||
cp /opt/authentik/authentik/sources/kerberos/krb5.conf /etc/krb5.conf
|
cp /opt/authentik/authentik/sources/kerberos/krb5.conf /etc/krb5.conf
|
||||||
msg_ok "Setup python server"
|
msg_ok "Setup python server"
|
||||||
|
|
||||||
|
|||||||
@@ -14,9 +14,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y \
|
$STD apt install -y libusb-1.0-0
|
||||||
libusb-1.0-0 \
|
|
||||||
libatomic1
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Fetching Latest Bitfocus Companion Release"
|
msg_info "Fetching Latest Bitfocus Companion Release"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
|||||||
$STD apt install -y build-essential
|
$STD apt install -y build-essential
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="26" setup_nodejs
|
||||||
|
|
||||||
msg_info "Setup Cross-Seed"
|
msg_info "Setup Cross-Seed"
|
||||||
$STD npm install cross-seed@latest -g
|
$STD npm install cross-seed@latest -g
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ cd /opt/dispatcharr
|
|||||||
set -a
|
set -a
|
||||||
source .env
|
source .env
|
||||||
set +a
|
set +a
|
||||||
exec uv run celery -A dispatcharr worker -l info -c 4 -Q celery,recordings,dvr,default
|
exec uv run celery -A dispatcharr worker -l info -c 4
|
||||||
EOF
|
EOF
|
||||||
chmod +x /opt/dispatcharr/start-celery.sh
|
chmod +x /opt/dispatcharr/start-celery.sh
|
||||||
|
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ update_os
|
|||||||
|
|
||||||
PORTAINER_AGENT_LATEST_VERSION=$(get_latest_github_release "portainer/agent")
|
PORTAINER_AGENT_LATEST_VERSION=$(get_latest_github_release "portainer/agent")
|
||||||
|
|
||||||
setup_docker
|
read -r -p "${TAB3}Would you like to add Portainer (UI)? <y/N> " prompt
|
||||||
|
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||||
if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then
|
DOCKER_PORTAINER="true" setup_docker
|
||||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
|
|
||||||
else
|
else
|
||||||
|
setup_docker
|
||||||
read -r -p "${TAB3}Would you like to install the Portainer Agent (for remote management)? <y/N> " prompt_agent
|
read -r -p "${TAB3}Would you like to install the Portainer Agent (for remote management)? <y/N> " prompt_agent
|
||||||
if [[ ${prompt_agent,,} =~ ^(y|yes)$ ]]; then
|
if [[ ${prompt_agent,,} =~ ^(y|yes)$ ]]; then
|
||||||
msg_info "Installing Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
|
msg_info "Installing Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
|
||||||
|
|||||||
@@ -32,8 +32,7 @@ get_latest_release() {
|
|||||||
|
|
||||||
CORE_LATEST_VERSION=$(get_latest_release "home-assistant/core")
|
CORE_LATEST_VERSION=$(get_latest_release "home-assistant/core")
|
||||||
|
|
||||||
setup_docker
|
DOCKER_PORTAINER="true" setup_docker
|
||||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
|
|
||||||
|
|
||||||
msg_info "Pulling Home Assistant $CORE_LATEST_VERSION Image"
|
msg_info "Pulling Home Assistant $CORE_LATEST_VERSION Image"
|
||||||
$STD docker pull ghcr.io/home-assistant/home-assistant:stable
|
$STD docker pull ghcr.io/home-assistant/home-assistant:stable
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ $STD apt install -y \
|
|||||||
rrdtool \
|
rrdtool \
|
||||||
snmp \
|
snmp \
|
||||||
snmpd \
|
snmpd \
|
||||||
whois \
|
whois
|
||||||
ipmitool
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing Python Dependencies"
|
msg_info "Installing Python Dependencies"
|
||||||
|
|||||||
@@ -1,98 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/vrtmrz/obsidian-livesync | https://couchdb.apache.org/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
setup_deb822_repo \
|
|
||||||
"couchdb" \
|
|
||||||
"https://couchdb.apache.org/repo/keys.asc" \
|
|
||||||
"https://apache.jfrog.io/artifactory/couchdb-deb/" \
|
|
||||||
"$(get_os_info codename)" \
|
|
||||||
"main"
|
|
||||||
|
|
||||||
msg_info "Installing CouchDB"
|
|
||||||
COUCHDB_ADMIN_USER="admin"
|
|
||||||
COUCHDB_PASSWORD="$(openssl rand -hex 24)"
|
|
||||||
COUCHDB_COOKIE="$(openssl rand -hex 16)"
|
|
||||||
|
|
||||||
cat <<EOF | debconf-set-selections
|
|
||||||
couchdb couchdb/mode select standalone
|
|
||||||
couchdb couchdb/mode seen true
|
|
||||||
couchdb couchdb/bindaddress string 0.0.0.0
|
|
||||||
couchdb couchdb/bindaddress seen true
|
|
||||||
couchdb couchdb/cookie string ${COUCHDB_COOKIE}
|
|
||||||
couchdb couchdb/cookie seen true
|
|
||||||
couchdb couchdb/adminpass password ${COUCHDB_PASSWORD}
|
|
||||||
couchdb couchdb/adminpass seen true
|
|
||||||
couchdb couchdb/adminpass_again password ${COUCHDB_PASSWORD}
|
|
||||||
couchdb couchdb/adminpass_again seen true
|
|
||||||
EOF
|
|
||||||
DEBIAN_FRONTEND=noninteractive $STD apt-get install -y couchdb
|
|
||||||
|
|
||||||
cat <<EOF >/root/.couchdb.credentials
|
|
||||||
COUCHDB_ADMIN_USER="${COUCHDB_ADMIN_USER}"
|
|
||||||
COUCHDB_ADMIN_PASSWORD="${COUCHDB_PASSWORD}"
|
|
||||||
COUCHDB_COOKIE="${COUCHDB_COOKIE}"
|
|
||||||
EOF
|
|
||||||
msg_ok "Installed CouchDB"
|
|
||||||
|
|
||||||
msg_info "Configuring CouchDB"
|
|
||||||
mkdir -p /opt/couchdb/etc/local.d /opt/obsidian-livesync
|
|
||||||
cat <<EOF >/opt/couchdb/etc/local.d/obsidian-livesync.ini
|
|
||||||
[couchdb]
|
|
||||||
single_node = true
|
|
||||||
max_document_size = 50000000
|
|
||||||
|
|
||||||
[admins]
|
|
||||||
admin = ${COUCHDB_PASSWORD}
|
|
||||||
|
|
||||||
[chttpd]
|
|
||||||
bind_address = 0.0.0.0
|
|
||||||
port = 5984
|
|
||||||
max_http_request_size = 4294967296
|
|
||||||
|
|
||||||
[chttpd_auth]
|
|
||||||
require_valid_user = true
|
|
||||||
|
|
||||||
[httpd]
|
|
||||||
enable_cors = true
|
|
||||||
WWW-Authenticate = Basic realm="couchdb"
|
|
||||||
|
|
||||||
[cors]
|
|
||||||
credentials = true
|
|
||||||
origins = app://obsidian.md,capacitor://localhost,http://localhost
|
|
||||||
headers = accept, authorization, content-type, origin, referer
|
|
||||||
methods = GET, PUT, POST, HEAD, DELETE
|
|
||||||
max_age = 3600
|
|
||||||
EOF
|
|
||||||
cat <<EOF >/opt/obsidian-livesync/.env
|
|
||||||
COUCHDB_URL=http://${LOCAL_IP}:5984
|
|
||||||
COUCHDB_USER=admin
|
|
||||||
COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
|
|
||||||
COUCHDB_DATABASE=obsidiannotes
|
|
||||||
EOF
|
|
||||||
chmod 600 /opt/obsidian-livesync/.env
|
|
||||||
msg_ok "Configured CouchDB"
|
|
||||||
|
|
||||||
msg_info "Creating LiveSync Database"
|
|
||||||
systemctl enable -q couchdb
|
|
||||||
systemctl restart couchdb
|
|
||||||
for _ in {1..30}; do
|
|
||||||
curl -fsS -u "admin:${COUCHDB_PASSWORD}" -X PUT http://127.0.0.1:5984/obsidiannotes >/dev/null 2>&1 && break
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
msg_ok "Created LiveSync Database"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -13,7 +13,7 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
NODE_VERSION="26" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
msg_info "Installing OmniRoute"
|
msg_info "Installing OmniRoute"
|
||||||
$STD npm install -g omniroute@latest
|
$STD npm install -g omniroute@latest
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
|
|||||||
echo "$COOLPASS" >~/.coolpass
|
echo "$COOLPASS" >~/.coolpass
|
||||||
msg_ok "Installed Collabora Online"
|
msg_ok "Installed Collabora Online"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.4.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)"
|
fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.3.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)"
|
||||||
mv /usr/bin/OpenCloud /usr/bin/opencloud
|
mv /usr/bin/OpenCloud /usr/bin/opencloud
|
||||||
|
|
||||||
msg_info "Configuring OpenCloud"
|
msg_info "Configuring OpenCloud"
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ create_self_signed_cert
|
|||||||
|
|
||||||
setup_deb822_repo \
|
setup_deb822_repo \
|
||||||
"passbolt" \
|
"passbolt" \
|
||||||
"https://download.passbolt.com/pub.key" \
|
"https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=0x3D1A0346C8E1802F774AEF21DE8B853FC155581D" \
|
||||||
"https://download.passbolt.com/ce/debian" \
|
"https://download.passbolt.com/ce/debian" \
|
||||||
"buster" \
|
"buster" \
|
||||||
"stable"
|
"stable"
|
||||||
|
|||||||
@@ -22,13 +22,12 @@ $STD apt install -y \
|
|||||||
pkg-config
|
pkg-config
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
RUBY_VERSION="4.0.5" RUBY_INSTALL_RAILS="false" setup_ruby
|
||||||
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||||
|
export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
|
fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
|
||||||
|
|
||||||
RUBY_VERSION="$(cat /opt/passwordpusher/.ruby-version)" RUBY_INSTALL_RAILS="false" setup_ruby
|
|
||||||
export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
|
|
||||||
|
|
||||||
msg_info "Installing Gem Dependencies"
|
msg_info "Installing Gem Dependencies"
|
||||||
cd /opt/passwordpusher
|
cd /opt/passwordpusher
|
||||||
$STD bundle config set --local without 'development test'
|
$STD bundle config set --local without 'development test'
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Pin: version ${RELEASE}
|
|||||||
Pin-Priority: 1001
|
Pin-Priority: 1001
|
||||||
EOF
|
EOF
|
||||||
$STD apt install -y salt-master
|
$STD apt install -y salt-master
|
||||||
echo "${RELEASE}" >~/.salt
|
echo "${RELEASE}" >/~.salt
|
||||||
msg_ok "Installed Salt"
|
msg_ok "Installed Salt"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ $STD apt install -y gcc
|
|||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
setup_go
|
setup_go
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
|
fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
|
||||||
|
|
||||||
msg_info "Setup Watcharr"
|
msg_info "Setup Watcharr"
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ network_check() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $ipv4_connected == false ]]; then
|
if [[ $ipv4_connected == false ]]; then
|
||||||
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt </dev/tty
|
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt
|
||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
||||||
else
|
else
|
||||||
|
|||||||
+1
-2
@@ -3917,7 +3917,7 @@ run_addon_updates() {
|
|||||||
name="${a##*/update_}"
|
name="${a##*/update_}"
|
||||||
printf 'Do you also want to update addon "%s"? (y/N) [60s]: ' "$name"
|
printf 'Do you also want to update addon "%s"? (y/N) [60s]: ' "$name"
|
||||||
ans=""
|
ans=""
|
||||||
if read -r -t 60 ans </dev/tty; then :; else echo; fi
|
if read -r -t 60 ans; then :; else echo; fi
|
||||||
case "${ans,,}" in
|
case "${ans,,}" in
|
||||||
y | yes)
|
y | yes)
|
||||||
bash "$a" || msg_warn "Addon update for $name failed (rc=$?)"
|
bash "$a" || msg_warn "Addon update for $name failed (rc=$?)"
|
||||||
@@ -5729,7 +5729,6 @@ EOF
|
|||||||
# read itself failed (e.g. broken/closed stdin, I/O error) rather than
|
# read itself failed (e.g. broken/closed stdin, I/O error) rather than
|
||||||
# timing out - don't guess and destroy the container on a read we
|
# timing out - don't guess and destroy the container on a read we
|
||||||
# couldn't actually capture; keep it since that's the reversible choice.
|
# couldn't actually capture; keep it since that's the reversible choice.
|
||||||
while read -r -t 0.1 -n 1 _ </dev/tty 2>/dev/null; do :; done
|
|
||||||
echo ""
|
echo ""
|
||||||
msg_error "Could not read your response (stdin error) - keeping container ${CTID} for safety."
|
msg_error "Could not read your response (stdin error) - keeping container ${CTID} for safety."
|
||||||
msg_error "Remove it manually if not needed: pct destroy ${CTID}"
|
msg_error "Remove it manually if not needed: pct destroy ${CTID}"
|
||||||
|
|||||||
+7
-7
@@ -824,7 +824,7 @@ msg_info() {
|
|||||||
# Pause mode: Wait for Enter after each step
|
# Pause mode: Wait for Enter after each step
|
||||||
if [[ "${DEV_MODE_PAUSE:-false}" == "true" ]]; then
|
if [[ "${DEV_MODE_PAUSE:-false}" == "true" ]]; then
|
||||||
echo -en "\n${YWB}[PAUSE]${CL} Press Enter to continue..." >&2
|
echo -en "\n${YWB}[PAUSE]${CL} Press Enter to continue..." >&2
|
||||||
read -r </dev/tty
|
read -r
|
||||||
fi
|
fi
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -839,7 +839,7 @@ msg_info() {
|
|||||||
if [[ "${DEV_MODE_PAUSE:-false}" == "true" ]]; then
|
if [[ "${DEV_MODE_PAUSE:-false}" == "true" ]]; then
|
||||||
stop_spinner
|
stop_spinner
|
||||||
echo -en "\n${YWB}[PAUSE]${CL} Press Enter to continue..." >&2
|
echo -en "\n${YWB}[PAUSE]${CL} Press Enter to continue..." >&2
|
||||||
read -r </dev/tty
|
read -r
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1287,7 +1287,7 @@ prompt_confirm() {
|
|||||||
# Interactive prompt with timeout
|
# Interactive prompt with timeout
|
||||||
echo -en "${YW}${message} ${hint} (auto-${default} in ${timeout}s): ${CL}"
|
echo -en "${YW}${message} ${hint} (auto-${default} in ${timeout}s): ${CL}"
|
||||||
|
|
||||||
if read -t "$timeout" -r response </dev/tty; then
|
if read -t "$timeout" -r response; then
|
||||||
# User provided input
|
# User provided input
|
||||||
response="${response,,}" # lowercase
|
response="${response,,}" # lowercase
|
||||||
case "$response" in
|
case "$response" in
|
||||||
@@ -1380,7 +1380,7 @@ prompt_input() {
|
|||||||
# Interactive prompt with timeout
|
# Interactive prompt with timeout
|
||||||
echo -en "${YW}${message}${hint} (auto-default in ${timeout}s): ${CL}" >&2
|
echo -en "${YW}${message}${hint} (auto-default in ${timeout}s): ${CL}" >&2
|
||||||
|
|
||||||
if read -t "$timeout" -r response </dev/tty; then
|
if read -t "$timeout" -r response; then
|
||||||
# User provided input (or pressed Enter for empty)
|
# User provided input (or pressed Enter for empty)
|
||||||
if [[ -n "$response" ]]; then
|
if [[ -n "$response" ]]; then
|
||||||
echo "$response"
|
echo "$response"
|
||||||
@@ -1482,7 +1482,7 @@ prompt_input_required() {
|
|||||||
|
|
||||||
echo -en "${YW}${message} (required, timeout ${timeout}s): ${CL}" >&2
|
echo -en "${YW}${message} (required, timeout ${timeout}s): ${CL}" >&2
|
||||||
|
|
||||||
if read -t "$timeout" -r response </dev/tty; then
|
if read -t "$timeout" -r response; then
|
||||||
if [[ -z "$response" ]]; then
|
if [[ -z "$response" ]]; then
|
||||||
echo -e "${YW}This field is required. Please enter a value. (attempt ${attempts}/3)${CL}" >&2
|
echo -e "${YW}This field is required. Please enter a value. (attempt ${attempts}/3)${CL}" >&2
|
||||||
fi
|
fi
|
||||||
@@ -1577,7 +1577,7 @@ prompt_select() {
|
|||||||
echo -en "${YW}Select [1-${num_options}] (auto-select ${default} in ${timeout}s): ${CL}" >&2
|
echo -en "${YW}Select [1-${num_options}] (auto-select ${default} in ${timeout}s): ${CL}" >&2
|
||||||
|
|
||||||
local response
|
local response
|
||||||
if read -t "$timeout" -r response </dev/tty; then
|
if read -t "$timeout" -r response; then
|
||||||
if [[ -z "$response" ]]; then
|
if [[ -z "$response" ]]; then
|
||||||
# Empty response, use default
|
# Empty response, use default
|
||||||
echo "${options[$((default - 1))]}"
|
echo "${options[$((default - 1))]}"
|
||||||
@@ -1660,7 +1660,7 @@ prompt_password() {
|
|||||||
# Interactive prompt with timeout (silent input)
|
# Interactive prompt with timeout (silent input)
|
||||||
echo -en "${YW}${message}${hint} (timeout ${timeout}s): ${CL}" >&2
|
echo -en "${YW}${message}${hint} (timeout ${timeout}s): ${CL}" >&2
|
||||||
|
|
||||||
if read -t "$timeout" -rs response </dev/tty; then
|
if read -t "$timeout" -rs response; then
|
||||||
echo "" >&2 # Newline after hidden input
|
echo "" >&2 # Newline after hidden input
|
||||||
if [[ -n "$response" ]]; then
|
if [[ -n "$response" ]]; then
|
||||||
# Validate minimum length
|
# Validate minimum length
|
||||||
|
|||||||
@@ -499,7 +499,7 @@ error_handler() {
|
|||||||
|
|
||||||
local response=""
|
local response=""
|
||||||
local read_rc
|
local read_rc
|
||||||
read -t 60 -r response </dev/tty
|
read -t 60 -r response
|
||||||
read_rc=$?
|
read_rc=$?
|
||||||
if [[ $read_rc -eq 0 ]]; then
|
if [[ $read_rc -eq 0 ]]; then
|
||||||
if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then
|
if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then
|
||||||
@@ -543,7 +543,6 @@ error_handler() {
|
|||||||
# read itself failed (e.g. broken/closed stdin, I/O error) rather than
|
# read itself failed (e.g. broken/closed stdin, I/O error) rather than
|
||||||
# timing out - don't guess and destroy the container on a read we
|
# timing out - don't guess and destroy the container on a read we
|
||||||
# couldn't actually capture; keep it since that's the reversible choice.
|
# couldn't actually capture; keep it since that's the reversible choice.
|
||||||
while read -r -t 0.1 -n 1 _ </dev/tty 2>/dev/null; do :; done
|
|
||||||
echo ""
|
echo ""
|
||||||
if declare -f msg_error >/dev/null 2>&1; then
|
if declare -f msg_error >/dev/null 2>&1; then
|
||||||
msg_error "Could not read your response (stdin error) - keeping container ${CTID} for safety."
|
msg_error "Could not read your response (stdin error) - keeping container ${CTID} for safety."
|
||||||
|
|||||||
+1
-1
@@ -201,7 +201,7 @@ network_check() {
|
|||||||
|
|
||||||
# If both IPv4 and IPv6 checks fail, prompt the user
|
# If both IPv4 and IPv6 checks fail, prompt the user
|
||||||
if [[ $ipv4_connected == false && $ipv6_connected == false ]]; then
|
if [[ $ipv4_connected == false && $ipv6_connected == false ]]; then
|
||||||
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt </dev/tty
|
read -r -p "No Internet detected, would you like to continue anyway? <y/N> " prompt
|
||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
||||||
else
|
else
|
||||||
|
|||||||
+86
-39
@@ -1292,17 +1292,14 @@ create_temp_dir() {
|
|||||||
# - Copies each given file/directory into a persistent store at
|
# - Copies each given file/directory into a persistent store at
|
||||||
# /opt/<NSAPP>.backup, mirroring its absolute path inside the store, and
|
# /opt/<NSAPP>.backup, mirroring its absolute path inside the store, and
|
||||||
# records it in a manifest so restore_backup needs no arguments.
|
# records it in a manifest so restore_backup needs no arguments.
|
||||||
# - Idempotent per path: a path already recorded in the manifest (from this
|
# - Idempotent: if a store from a previous (failed) run already exists, it is
|
||||||
# run or a previous failed one) is left untouched, keeping the
|
# left untouched and no new backup is taken. This keeps the last-known-good
|
||||||
# last-known-good copy instead of overwriting it with now-partially-updated
|
# data instead of overwriting it with now-partially-updated data on retry.
|
||||||
# data on retry. Any requested path NOT yet in the manifest is backed up
|
|
||||||
# now and appended - so a manifest left incomplete by an interrupted prior
|
|
||||||
# run gets completed instead of silently missing paths on restore.
|
|
||||||
# - Missing source paths are skipped with a warning (not fatal).
|
# - Missing source paths are skipped with a warning (not fatal).
|
||||||
# - Aborts the update on copy failure: if any file/dir cannot be backed up,
|
# - Aborts the update on copy failure: if any file/dir cannot be backed up,
|
||||||
# the script exits before the update runs against unprotected data (the
|
# the half-written store is removed and the script exits, so the update
|
||||||
# paths already recorded are left in place, so a retry only redoes the one
|
# never runs against unprotected data (and a retry re-attempts a clean
|
||||||
# that failed).
|
# backup rather than skipping it).
|
||||||
#
|
#
|
||||||
# restore_backup
|
# restore_backup
|
||||||
# - Copies every path recorded in the manifest back to its origin (replacing
|
# - Copies every path recorded in the manifest back to its origin (replacing
|
||||||
@@ -1321,17 +1318,19 @@ create_backup() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! mkdir -p "$store" || ! touch "$manifest"; then
|
if [[ -f "$manifest" ]]; then
|
||||||
msg_error "Backup failed: could not create store at ${store} - aborting update"
|
msg_ok "Existing backup found at ${store}, skipping backup"
|
||||||
exit 1
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Backing up data"
|
msg_info "Backing up data"
|
||||||
|
if ! mkdir -p "$store" || ! : >"$manifest"; then
|
||||||
|
msg_error "Backup failed: could not create store at ${store} - aborting update"
|
||||||
|
rm -rf "$store"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
for path in "$@"; do
|
for path in "$@"; do
|
||||||
path="${path%/}"
|
path="${path%/}"
|
||||||
if grep -qxF "$path" "$manifest" 2>/dev/null; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if [[ ! -e "$path" ]]; then
|
if [[ ! -e "$path" ]]; then
|
||||||
msg_warn "Skipping backup of '${path}' (not found)"
|
msg_warn "Skipping backup of '${path}' (not found)"
|
||||||
continue
|
continue
|
||||||
@@ -1339,6 +1338,7 @@ create_backup() {
|
|||||||
dest="${store}/files${path}"
|
dest="${store}/files${path}"
|
||||||
if ! mkdir -p "$(dirname "$dest")" || ! cp -a "$path" "$dest"; then
|
if ! mkdir -p "$(dirname "$dest")" || ! cp -a "$path" "$dest"; then
|
||||||
msg_error "Backup of '${path}' failed - aborting update"
|
msg_error "Backup of '${path}' failed - aborting update"
|
||||||
|
rm -rf "$store"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "$path" >>"$manifest"
|
echo "$path" >>"$manifest"
|
||||||
@@ -1466,7 +1466,7 @@ prompt_for_github_token() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local reply
|
local reply
|
||||||
read -rp "${TAB}Would you like to enter a GitHub Personal Access Token (PAT)? [y/N]: " reply </dev/tty
|
read -rp "${TAB}Would you like to enter a GitHub Personal Access Token (PAT)? [y/N]: " reply
|
||||||
reply="${reply:-n}"
|
reply="${reply:-n}"
|
||||||
|
|
||||||
if [[ ! "${reply,,}" =~ ^(y|yes)$ ]]; then
|
if [[ ! "${reply,,}" =~ ^(y|yes)$ ]]; then
|
||||||
@@ -1475,7 +1475,7 @@ prompt_for_github_token() {
|
|||||||
|
|
||||||
local token
|
local token
|
||||||
while true; do
|
while true; do
|
||||||
read -rp "${TAB}Enter your GitHub PAT: " token </dev/tty
|
read -rp "${TAB}Enter your GitHub PAT: " token
|
||||||
# Trim leading/trailing whitespace
|
# Trim leading/trailing whitespace
|
||||||
token="$(echo "$token" | xargs)"
|
token="$(echo "$token" | xargs)"
|
||||||
if [[ -z "$token" ]]; then
|
if [[ -z "$token" ]]; then
|
||||||
@@ -2040,9 +2040,8 @@ cleanup_orphaned_sources() {
|
|||||||
local basename_file
|
local basename_file
|
||||||
basename_file=$(basename "$sources_file")
|
basename_file=$(basename "$sources_file")
|
||||||
|
|
||||||
# NEVER remove the distro's own base sources file (debian.sources,
|
# NEVER remove debian.sources - this is the standard Debian repository
|
||||||
# ubuntu.sources, ...)
|
if [[ "$basename_file" == "debian.sources" ]]; then
|
||||||
if [[ "$basename_file" == "$(get_os_info id).sources" ]]; then
|
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2114,7 +2113,7 @@ ensure_apt_working() {
|
|||||||
# Step 4: More aggressive - remove all third-party sources
|
# Step 4: More aggressive - remove all third-party sources
|
||||||
msg_warn "APT update still failing, removing third-party sources"
|
msg_warn "APT update still failing, removing third-party sources"
|
||||||
find /etc/apt/sources.list.d/ -type f \( -name "*.sources" -o -name "*.list" \) \
|
find /etc/apt/sources.list.d/ -type f \( -name "*.sources" -o -name "*.list" \) \
|
||||||
! -name "$(get_os_info id).sources" -delete 2>/dev/null || true
|
! -name "debian.sources" -delete 2>/dev/null || true
|
||||||
|
|
||||||
# Final attempt
|
# Final attempt
|
||||||
if ! $STD apt update; then
|
if ! $STD apt update; then
|
||||||
@@ -3974,7 +3973,7 @@ _gh_scan_older_releases() {
|
|||||||
local use_fallback="y"
|
local use_fallback="y"
|
||||||
if [[ -t 0 ]]; then
|
if [[ -t 0 ]]; then
|
||||||
msg_warn "Release ${skip_tag} has no matching asset. Previous release ${rel_tag} has a compatible asset."
|
msg_warn "Release ${skip_tag} has no matching asset. Previous release ${rel_tag} has a compatible asset."
|
||||||
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback </dev/tty || use_fallback="y"
|
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback || use_fallback="y"
|
||||||
use_fallback="${use_fallback:-y}"
|
use_fallback="${use_fallback:-y}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -4600,17 +4599,20 @@ setup_composer() {
|
|||||||
# - By default uses distro repository (docker.io) for stability
|
# - By default uses distro repository (docker.io) for stability
|
||||||
# - Optionally uses official Docker repository for latest features
|
# - Optionally uses official Docker repository for latest features
|
||||||
# - Detects and migrates old Docker installations
|
# - Detects and migrates old Docker installations
|
||||||
|
# - Optional: Installs/Updates Portainer CE
|
||||||
# - Updates running containers interactively
|
# - Updates running containers interactively
|
||||||
# - Cleans up legacy repository files
|
# - Cleans up legacy repository files
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# setup_docker # Uses official Docker repo (recommended)
|
# setup_docker # Uses official Docker repo (recommended)
|
||||||
# USE_DOCKER_REPO=false setup_docker # Uses distro docker.io package
|
# USE_DOCKER_REPO=false setup_docker # Uses distro docker.io package
|
||||||
|
# DOCKER_PORTAINER="true" setup_docker
|
||||||
# DOCKER_LOG_DRIVER="json-file" setup_docker
|
# DOCKER_LOG_DRIVER="json-file" setup_docker
|
||||||
#
|
#
|
||||||
# Variables:
|
# Variables:
|
||||||
# USE_DOCKER_REPO - Set to "false" to use distro docker.io package
|
# USE_DOCKER_REPO - Set to "false" to use distro docker.io package
|
||||||
# (default: true, uses official Docker repository)
|
# (default: true, uses official Docker repository)
|
||||||
|
# DOCKER_PORTAINER - Install Portainer CE (optional, "true" to enable)
|
||||||
# DOCKER_LOG_DRIVER - Log driver (optional, default: "journald")
|
# DOCKER_LOG_DRIVER - Log driver (optional, default: "journald")
|
||||||
# DOCKER_SKIP_UPDATES - Skip container update check (optional, "true" to skip)
|
# DOCKER_SKIP_UPDATES - Skip container update check (optional, "true" to skip)
|
||||||
#
|
#
|
||||||
@@ -4621,7 +4623,7 @@ setup_composer() {
|
|||||||
# - Interactive per-container update prompt (Y/N, 60 s auto-no)
|
# - Interactive per-container update prompt (Y/N, 60 s auto-no)
|
||||||
# - Compose-managed containers: full restart via docker compose
|
# - Compose-managed containers: full restart via docker compose
|
||||||
# - Standalone containers: image pull only, no destructive stop/rm
|
# - Standalone containers: image pull only, no destructive stop/rm
|
||||||
# - Portainer is no longer managed here; use tools/addon/portainer.sh
|
# - Portainer installation and update support
|
||||||
# - Set DOCKER_NONINTERACTIVE=1 to skip interactive prompts (CI/unattended)
|
# - Set DOCKER_NONINTERACTIVE=1 to skip interactive prompts (CI/unattended)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
_docker_is_noninteractive() {
|
_docker_is_noninteractive() {
|
||||||
@@ -4677,6 +4679,7 @@ ensure_docker() {
|
|||||||
|
|
||||||
setup_docker() {
|
setup_docker() {
|
||||||
local docker_installed=false
|
local docker_installed=false
|
||||||
|
local portainer_installed=false
|
||||||
local USE_DOCKER_REPO="${USE_DOCKER_REPO:-true}"
|
local USE_DOCKER_REPO="${USE_DOCKER_REPO:-true}"
|
||||||
|
|
||||||
# Check if Docker is already installed
|
# Check if Docker is already installed
|
||||||
@@ -4686,6 +4689,12 @@ setup_docker() {
|
|||||||
msg_info "Docker $DOCKER_CURRENT_VERSION detected"
|
msg_info "Docker $DOCKER_CURRENT_VERSION detected"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check if Portainer is running
|
||||||
|
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^portainer$'; then
|
||||||
|
portainer_installed=true
|
||||||
|
msg_info "Portainer container detected"
|
||||||
|
fi
|
||||||
|
|
||||||
# Scenario 1: Use distro repository (opt-out via USE_DOCKER_REPO=false)
|
# Scenario 1: Use distro repository (opt-out via USE_DOCKER_REPO=false)
|
||||||
if [[ "$USE_DOCKER_REPO" != "true" && "$USE_DOCKER_REPO" != "TRUE" && "$USE_DOCKER_REPO" != "1" ]]; then
|
if [[ "$USE_DOCKER_REPO" != "true" && "$USE_DOCKER_REPO" != "TRUE" && "$USE_DOCKER_REPO" != "1" ]]; then
|
||||||
|
|
||||||
@@ -4799,6 +4808,54 @@ EOF
|
|||||||
systemctl enable -q --now docker
|
systemctl enable -q --now docker
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Portainer Management (common for both modes)
|
||||||
|
if [[ "${DOCKER_PORTAINER:-}" == "true" ]]; then
|
||||||
|
if [ "$portainer_installed" = true ]; then
|
||||||
|
msg_info "Checking for Portainer updates"
|
||||||
|
PORTAINER_CURRENT=$(docker inspect portainer --format='{{.Config.Image}}' 2>/dev/null | cut -d':' -f2)
|
||||||
|
PORTAINER_LATEST=$(curl -fsSL https://registry.hub.docker.com/v2/repositories/portainer/portainer-ce/tags?page_size=100 | grep -oP '"name":"\K[0-9]+\.[0-9]+\.[0-9]+"' | head -1 | tr -d '"')
|
||||||
|
|
||||||
|
if [ "$PORTAINER_CURRENT" != "$PORTAINER_LATEST" ]; then
|
||||||
|
if _docker_is_noninteractive; then
|
||||||
|
msg_info "Skipping Portainer update prompt (non-interactive)"
|
||||||
|
else
|
||||||
|
read -r -p "${TAB3}Update Portainer $PORTAINER_CURRENT → $PORTAINER_LATEST? <y/N> " prompt
|
||||||
|
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||||
|
msg_info "Updating Portainer"
|
||||||
|
docker stop portainer
|
||||||
|
docker rm portainer
|
||||||
|
docker pull portainer/portainer-ce:latest
|
||||||
|
docker run -d \
|
||||||
|
-p 9000:9000 \
|
||||||
|
-p 9443:9443 \
|
||||||
|
--name=portainer \
|
||||||
|
--restart=always \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-v portainer_data:/data \
|
||||||
|
portainer/portainer-ce:latest
|
||||||
|
msg_ok "Updated Portainer to $PORTAINER_LATEST"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
msg_ok "Portainer is up-to-date ($PORTAINER_CURRENT)"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
msg_info "Installing Portainer"
|
||||||
|
docker volume create portainer_data
|
||||||
|
docker run -d \
|
||||||
|
-p 9000:9000 \
|
||||||
|
-p 9443:9443 \
|
||||||
|
--name=portainer \
|
||||||
|
--restart=always \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-v portainer_data:/data \
|
||||||
|
portainer/portainer-ce:latest
|
||||||
|
|
||||||
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
msg_ok "Installed Portainer (http://${LOCAL_IP}:9000)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Container Update Check
|
# Container Update Check
|
||||||
# - Skipped entirely when running unattended / non-interactive
|
# - Skipped entirely when running unattended / non-interactive
|
||||||
# - Compose-managed containers: offered via Y/N → docker compose pull + up -d
|
# - Compose-managed containers: offered via Y/N → docker compose pull + up -d
|
||||||
@@ -4814,7 +4871,7 @@ EOF
|
|||||||
name=$(echo "$line" | awk '{print $1}')
|
name=$(echo "$line" | awk '{print $1}')
|
||||||
image=$(echo "$line" | awk '{print $2}')
|
image=$(echo "$line" | awk '{print $2}')
|
||||||
|
|
||||||
# Portainer is managed by its own addon script, not this generic loop
|
# Portainer containers are handled by the dedicated block above
|
||||||
[[ "$name" == "portainer" || "$name" == "portainer_agent" ]] && continue
|
[[ "$name" == "portainer" || "$name" == "portainer_agent" ]] && continue
|
||||||
|
|
||||||
current_digest=$(docker inspect "$name" --format='{{.Image}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12)
|
current_digest=$(docker inspect "$name" --format='{{.Image}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12)
|
||||||
@@ -4844,7 +4901,7 @@ EOF
|
|||||||
for entry in "${compose_updates[@]}"; do
|
for entry in "${compose_updates[@]}"; do
|
||||||
IFS='|' read -r name image compose_workdir compose_service <<<"$entry"
|
IFS='|' read -r name image compose_workdir compose_service <<<"$entry"
|
||||||
reply=""
|
reply=""
|
||||||
if read -r -t 60 -p "${TAB3}Update ${name} (${image}) via Compose? <y/N> (auto-no in 60s): " reply </dev/tty; then
|
if read -r -t 60 -p "${TAB3}Update ${name} (${image}) via Compose? <y/N> (auto-no in 60s): " reply; then
|
||||||
echo ""
|
echo ""
|
||||||
else
|
else
|
||||||
echo ""
|
echo ""
|
||||||
@@ -4862,7 +4919,7 @@ EOF
|
|||||||
for entry in "${standalone_updates[@]}"; do
|
for entry in "${standalone_updates[@]}"; do
|
||||||
IFS='|' read -r name image <<<"$entry"
|
IFS='|' read -r name image <<<"$entry"
|
||||||
reply=""
|
reply=""
|
||||||
if read -r -t 60 -p "${TAB3}Pull new image for ${name} (${image})? <y/N> (auto-no in 60s): " reply </dev/tty; then
|
if read -r -t 60 -p "${TAB3}Pull new image for ${name} (${image})? <y/N> (auto-no in 60s): " reply; then
|
||||||
echo ""
|
echo ""
|
||||||
else
|
else
|
||||||
echo ""
|
echo ""
|
||||||
@@ -5457,7 +5514,7 @@ setup_hwaccel() {
|
|||||||
# Read with 60 second timeout
|
# Read with 60 second timeout
|
||||||
local selection=""
|
local selection=""
|
||||||
echo -n "Select GPU(s) to configure (1-${gpu_count}, A=all) [timeout 60s, default=all]: "
|
echo -n "Select GPU(s) to configure (1-${gpu_count}, A=all) [timeout 60s, default=all]: "
|
||||||
if read -r -t 60 selection </dev/tty; then
|
if read -r -t 60 selection; then
|
||||||
selection="${selection^^}" # uppercase
|
selection="${selection^^}" # uppercase
|
||||||
else
|
else
|
||||||
echo ""
|
echo ""
|
||||||
@@ -5505,7 +5562,7 @@ setup_hwaccel() {
|
|||||||
echo ""
|
echo ""
|
||||||
msg_custom "🎮" "${GN}" "NVIDIA GPU passthrough detected"
|
msg_custom "🎮" "${GN}" "NVIDIA GPU passthrough detected"
|
||||||
local nvidia_reply=""
|
local nvidia_reply=""
|
||||||
read -r -t 60 -p "${TAB3}⚙️ Install NVIDIA driver libraries in the container? [Y/n] (auto-yes in 60s): " nvidia_reply </dev/tty || nvidia_reply=""
|
read -r -t 60 -p "${TAB3}⚙️ Install NVIDIA driver libraries in the container? [Y/n] (auto-yes in 60s): " nvidia_reply || nvidia_reply=""
|
||||||
case "${nvidia_reply,,}" in
|
case "${nvidia_reply,,}" in
|
||||||
n | no) install_nvidia_drivers="no" ;;
|
n | no) install_nvidia_drivers="no" ;;
|
||||||
*) install_nvidia_drivers="yes" ;;
|
*) install_nvidia_drivers="yes" ;;
|
||||||
@@ -7732,16 +7789,6 @@ setup_nodejs() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# npm >=11 skips native-module install/rebuild scripts (better-sqlite3, bcrypt,
|
|
||||||
# argon2, ...) unless each package is explicitly allowlisted, silently leaving
|
|
||||||
# native deps unbuilt. Bypass the policy globally instead of allowlisting
|
|
||||||
# per script.
|
|
||||||
local npm_major
|
|
||||||
npm_major=$(npm -v 2>/dev/null | cut -d. -f1)
|
|
||||||
if [[ "${npm_major:-0}" -ge 11 ]]; then
|
|
||||||
$STD npm config set dangerously-allow-all-scripts true --location=global 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set a safe default heap limit for Node.js builds if not explicitly provided.
|
# Set a safe default heap limit for Node.js builds if not explicitly provided.
|
||||||
# Priority:
|
# Priority:
|
||||||
# 1) NODE_OPTIONS (caller/user override)
|
# 1) NODE_OPTIONS (caller/user override)
|
||||||
@@ -9813,7 +9860,7 @@ _gl_scan_older_releases() {
|
|||||||
local use_fallback="y"
|
local use_fallback="y"
|
||||||
if [[ -t 0 ]]; then
|
if [[ -t 0 ]]; then
|
||||||
msg_warn "Release ${skip_tag} has no matching asset. Previous release ${rel_tag} has a compatible asset."
|
msg_warn "Release ${skip_tag} has no matching asset. Previous release ${rel_tag} has a compatible asset."
|
||||||
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback </dev/tty || use_fallback="y"
|
read -rp "Use version ${rel_tag} instead? [Y/n] (auto-yes in 60s): " -t 60 use_fallback || use_fallback="y"
|
||||||
use_fallback="${use_fallback:-y}"
|
use_fallback="${use_fallback:-y}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -1,190 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/portainer/portainer
|
|
||||||
if ! command -v curl &>/dev/null; then
|
|
||||||
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
|
|
||||||
apt-get update >/dev/null 2>&1
|
|
||||||
apt-get install -y curl >/dev/null 2>&1
|
|
||||||
fi
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
|
|
||||||
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "portainer" "addon"
|
|
||||||
|
|
||||||
# Enable error handling
|
|
||||||
set -Eeuo pipefail
|
|
||||||
trap 'error_handler' ERR
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# CONFIGURATION
|
|
||||||
# ==============================================================================
|
|
||||||
APP="Portainer"
|
|
||||||
APP_TYPE="addon"
|
|
||||||
INSTALL_PATH="/opt/portainer"
|
|
||||||
COMPOSE_FILE="${INSTALL_PATH}/compose.yaml"
|
|
||||||
DEFAULT_PORT=9443
|
|
||||||
|
|
||||||
# Initialize all core functions (colors, formatting, icons, STD mode)
|
|
||||||
load_functions
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# UNINSTALL
|
|
||||||
# ==============================================================================
|
|
||||||
function uninstall() {
|
|
||||||
msg_info "Uninstalling ${APP}"
|
|
||||||
|
|
||||||
if [[ -f "$COMPOSE_FILE" ]]; then
|
|
||||||
msg_info "Stopping and removing Docker containers"
|
|
||||||
cd "$INSTALL_PATH"
|
|
||||||
$STD docker compose down --volumes --remove-orphans
|
|
||||||
msg_ok "Stopped and removed Docker containers"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf "$INSTALL_PATH"
|
|
||||||
rm -f "/usr/local/bin/update_portainer"
|
|
||||||
msg_ok "${APP} has been uninstalled"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# UPDATE
|
|
||||||
# ==============================================================================
|
|
||||||
function update() {
|
|
||||||
msg_info "Pulling latest ${APP} image"
|
|
||||||
cd "$INSTALL_PATH"
|
|
||||||
$STD docker compose pull
|
|
||||||
msg_ok "Pulled latest image"
|
|
||||||
|
|
||||||
msg_info "Restarting ${APP}"
|
|
||||||
$STD docker compose up -d --remove-orphans
|
|
||||||
msg_ok "Restarted ${APP}"
|
|
||||||
|
|
||||||
msg_ok "Updated successfully"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# CHECK DOCKER
|
|
||||||
# ==============================================================================
|
|
||||||
function check_docker() {
|
|
||||||
if ! command -v docker &>/dev/null; then
|
|
||||||
msg_error "Docker is not installed. This script requires an existing Docker LXC. Exiting."
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
if ! docker compose version &>/dev/null; then
|
|
||||||
msg_error "Docker Compose plugin is not available. Please install it before running this script. Exiting."
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') and Docker Compose are available"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# CHECK EXISTING CONTAINER
|
|
||||||
# ==============================================================================
|
|
||||||
function check_existing_container() {
|
|
||||||
# Guards against clobbering a Portainer container not managed by this addon
|
|
||||||
# (e.g. Business/Enterprise Edition installed manually or via the legacy docker.sh flow)
|
|
||||||
if docker ps -a --format '{{.Names}}' | grep -q '^portainer$'; then
|
|
||||||
msg_error "A container named 'portainer' already exists but is not managed by this addon."
|
|
||||||
msg_error "This may be a Portainer Business/Enterprise Edition install or a manual setup."
|
|
||||||
msg_error "Remove/rename that container first, or manage it manually. Exiting."
|
|
||||||
exit 10
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# INSTALL
|
|
||||||
# ==============================================================================
|
|
||||||
function install() {
|
|
||||||
check_docker
|
|
||||||
check_existing_container
|
|
||||||
|
|
||||||
msg_info "Creating install directory"
|
|
||||||
mkdir -p "$INSTALL_PATH"
|
|
||||||
msg_ok "Created ${INSTALL_PATH}"
|
|
||||||
|
|
||||||
msg_info "Downloading Docker Compose file"
|
|
||||||
curl -fsSL "https://downloads.portainer.io/ce-sts/portainer-compose.yaml" -o "$COMPOSE_FILE"
|
|
||||||
msg_ok "Downloaded Docker Compose file"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
|
||||||
cd "$INSTALL_PATH"
|
|
||||||
$STD docker compose up -d
|
|
||||||
msg_ok "Started ${APP}"
|
|
||||||
|
|
||||||
# Create update script
|
|
||||||
msg_info "Creating update script"
|
|
||||||
cat <<'UPDATEEOF' >/usr/local/bin/update_portainer
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
# Portainer Update Script
|
|
||||||
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)"
|
|
||||||
UPDATEEOF
|
|
||||||
chmod +x /usr/local/bin/update_portainer
|
|
||||||
msg_ok "Created update script (/usr/local/bin/update_portainer)"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
msg_ok "${APP} is reachable at: ${BL}https://${LOCAL_IP}:${DEFAULT_PORT}${CL}"
|
|
||||||
echo ""
|
|
||||||
msg_warn "On first access, you'll be prompted to create an admin account."
|
|
||||||
}
|
|
||||||
|
|
||||||
# ==============================================================================
|
|
||||||
# MAIN
|
|
||||||
# ==============================================================================
|
|
||||||
|
|
||||||
# Handle type=update (called from update script)
|
|
||||||
if [[ "${type:-}" == "update" ]]; then
|
|
||||||
header_info
|
|
||||||
if [[ -f "$COMPOSE_FILE" ]]; then
|
|
||||||
update
|
|
||||||
else
|
|
||||||
msg_error "${APP} is not installed. Nothing to update."
|
|
||||||
exit 233
|
|
||||||
fi
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
header_info
|
|
||||||
get_lxc_ip
|
|
||||||
|
|
||||||
# Check if already installed
|
|
||||||
if [[ -f "$COMPOSE_FILE" ]]; then
|
|
||||||
msg_warn "${APP} is already installed."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo -n "${TAB}Uninstall ${APP}? (y/N): "
|
|
||||||
read -r uninstall_prompt
|
|
||||||
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
|
||||||
uninstall
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -n "${TAB}Update ${APP}? (y/N): "
|
|
||||||
read -r update_prompt
|
|
||||||
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
|
||||||
update
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_warn "No action selected. Exiting."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fresh installation
|
|
||||||
msg_warn "${APP} is not installed."
|
|
||||||
echo ""
|
|
||||||
echo -e "${TAB}${INFO} This will install:"
|
|
||||||
echo -e "${TAB} - Portainer (via Docker Compose)"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo -n "${TAB}Install ${APP}? (y/N): "
|
|
||||||
read -r install_prompt
|
|
||||||
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
|
||||||
install
|
|
||||||
else
|
|
||||||
msg_warn "Installation cancelled. Exiting."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
__ __ __ __ _ __ __
|
|
||||||
____ _____/ /___/ / ____ ___ / /_/ /_ (_)________/ / / / _______
|
|
||||||
/ __ `/ __ / __ /_____/ __ \/ _ \/ __/ __ \/ / ___/ __ /_____/ / |/_/ ___/
|
|
||||||
/ /_/ / /_/ / /_/ /_____/ / / / __/ /_/ /_/ / / / / /_/ /_____/ /> </ /__
|
|
||||||
\__,_/\__,_/\__,_/ /_/ /_/\___/\__/_.___/_/_/ \__,_/ /_/_/|_|\___/
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
__ __ __ _ __ __ __
|
|
||||||
____ _____/ /___/ / / /_____ _(_) /_____________ _/ /__ / / _______
|
|
||||||
/ __ `/ __ / __ /_____/ __/ __ `/ / / ___/ ___/ __ `/ / _ \______/ / |/_/ ___/
|
|
||||||
/ /_/ / /_/ / /_/ /_____/ /_/ /_/ / / (__ ) /__/ /_/ / / __/_____/ /> </ /__
|
|
||||||
\__,_/\__,_/\__,_/ \__/\__,_/_/_/____/\___/\__,_/_/\___/ /_/_/|_|\___/
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ __ __ __
|
|
||||||
____ _/ / / / /____ ____ ___ ____ / /___ _/ /____ _____
|
|
||||||
/ __ `/ / /_____/ __/ _ \/ __ `__ \/ __ \/ / __ `/ __/ _ \/ ___/
|
|
||||||
/ /_/ / / /_____/ /_/ __/ / / / / / /_/ / / /_/ / /_/ __(__ )
|
|
||||||
\__,_/_/_/ \__/\___/_/ /_/ /_/ .___/_/\__,_/\__/\___/____/
|
|
||||||
/_/
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
_ __ __ __ __
|
|
||||||
/ | / /__ / /_____/ /___ _/ /_____ _
|
|
||||||
/ |/ / _ \/ __/ __ / __ `/ __/ __ `/
|
|
||||||
/ /| / __/ /_/ /_/ / /_/ / /_/ /_/ /
|
|
||||||
/_/ |_/\___/\__/\__,_/\__,_/\__/\__,_/
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ __ _
|
|
||||||
/ __ \____ _____/ /_____ _(_)___ ___ _____
|
|
||||||
/ /_/ / __ \/ ___/ __/ __ `/ / __ \/ _ \/ ___/
|
|
||||||
/ ____/ /_/ / / / /_/ /_/ / / / / / __/ /
|
|
||||||
/_/ \____/_/ \__/\__,_/_/_/ /_/\___/_/
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
____ __ _____ ____ _ __
|
|
||||||
/ __ \/ / / / _ \/ __ \ | / /
|
|
||||||
/ /_/ / /_/ / __/ / / / |/ /
|
|
||||||
/ .___/\__, /\___/_/ /_/|___/
|
|
||||||
/_/ /____/
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
_ __ __ _
|
|
||||||
| | / /__ / /_ ____ ___ (_)___
|
|
||||||
| | /| / / _ \/ __ \/ __ `__ \/ / __ \
|
|
||||||
| |/ |/ / __/ /_/ / / / / / / / / / /
|
|
||||||
|__/|__/\___/_.___/_/ /_/ /_/_/_/ /_/
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user