mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-04-23 10:25:05 +02:00
Compare commits
1 Commits
github-act
...
fix/crafty
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
363bed8e0d |
18
.gitattributes
vendored
18
.gitattributes
vendored
@@ -4,29 +4,35 @@
|
|||||||
*.sh linguist-detectable=true
|
*.sh linguist-detectable=true
|
||||||
*.bash linguist-language=Shell
|
*.bash linguist-language=Shell
|
||||||
*.func linguist-language=Shell
|
*.func linguist-language=Shell
|
||||||
*.func linguist-detectable=true
|
|
||||||
*.install linguist-language=Shell
|
*.install linguist-language=Shell
|
||||||
|
|
||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
# Exclude header art from stats
|
# Treat Golang files as Go (for /api/)
|
||||||
|
api/**/*.go linguist-language=Go
|
||||||
|
|
||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
ct/headers/* linguist-documentation
|
# Treat frontend as JavaScript/TypeScript (optional)
|
||||||
|
frontend/**/*.ts linguist-language=TypeScript
|
||||||
|
frontend/**/*.js linguist-language=JavaScript
|
||||||
|
|
||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
# Exclude documentation from stats
|
# Exclude documentation from stats
|
||||||
# ---------------------------------------
|
|
||||||
*.md linguist-documentation
|
*.md linguist-documentation
|
||||||
|
docs/** linguist-documentation
|
||||||
README.md linguist-documentation
|
README.md linguist-documentation
|
||||||
CONTRIBUTING.md linguist-documentation
|
CONTRIBUTING.md linguist-documentation
|
||||||
SECURITY.md linguist-documentation
|
SECURITY.md linguist-documentation
|
||||||
|
|
||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
# Exclude generated/config files
|
# Exclude generated/config files
|
||||||
# ---------------------------------------
|
*.json linguist-generated
|
||||||
|
frontend/public/json/*.json linguist-generated=false
|
||||||
|
*.lock linguist-generated
|
||||||
|
*.yml linguist-generated
|
||||||
|
*.yaml linguist-generated
|
||||||
.github/** linguist-generated
|
.github/** linguist-generated
|
||||||
.vscode/** linguist-generated
|
.vscode/** linguist-generated
|
||||||
|
|
||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
# Standard text handling
|
# Standard text handling
|
||||||
# ---------------------------------------
|
|
||||||
* text=auto eol=lf
|
* text=auto eol=lf
|
||||||
|
|||||||
3
.github/CODEOWNERS
generated
vendored
3
.github/CODEOWNERS
generated
vendored
@@ -12,3 +12,6 @@
|
|||||||
|
|
||||||
# Set default reviewers
|
# Set default reviewers
|
||||||
* @community-scripts/Contributor
|
* @community-scripts/Contributor
|
||||||
|
|
||||||
|
# All changes in frontend
|
||||||
|
/frontend/ @community-scripts/Frontend-Dev
|
||||||
|
|||||||
42
.github/changelogs/2026/03.md
generated
vendored
42
.github/changelogs/2026/03.md
generated
vendored
@@ -1,45 +1,3 @@
|
|||||||
## 2026-03-31
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Graylog: set vm.max_map_count on host for OpenSearch [@MickLesk](https://github.com/MickLesk) ([#13441](https://github.com/community-scripts/ProxmoxVE/pull/13441))
|
|
||||||
- Koillection: ensure newline before appending to .env.local [@MickLesk](https://github.com/MickLesk) ([#13440](https://github.com/community-scripts/ProxmoxVE/pull/13440))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: skip empty gateway value in network config [@MickLesk](https://github.com/MickLesk) ([#13442](https://github.com/community-scripts/ProxmoxVE/pull/13442))
|
|
||||||
|
|
||||||
## 2026-03-30
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Bambuddy ([#13411](https://github.com/community-scripts/ProxmoxVE/pull/13411))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- Rename: BirdNET > BirdNET-Go [@MickLesk](https://github.com/MickLesk) ([#13410](https://github.com/community-scripts/ProxmoxVE/pull/13410))
|
|
||||||
|
|
||||||
## 2026-03-29
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- YOURLS ([#13379](https://github.com/community-scripts/ProxmoxVE/pull/13379))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- fix(victoriametrics): use jq to filter releases [@Joery-M](https://github.com/Joery-M) ([#13393](https://github.com/community-scripts/ProxmoxVE/pull/13393))
|
|
||||||
- Ollama: add error handling for Intel GPG key imports [@MickLesk](https://github.com/MickLesk) ([#13397](https://github.com/community-scripts/ProxmoxVE/pull/13397))
|
|
||||||
- Immich: ignore Redis connection error on maintenance mode disable [@MickLesk](https://github.com/MickLesk) ([#13398](https://github.com/community-scripts/ProxmoxVE/pull/13398))
|
|
||||||
- NPM: unmask openresty after migration from package [@MickLesk](https://github.com/MickLesk) ([#13399](https://github.com/community-scripts/ProxmoxVE/pull/13399))
|
|
||||||
|
|
||||||
## 2026-03-28
|
## 2026-03-28
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
343
.github/changelogs/2026/04.md
generated
vendored
343
.github/changelogs/2026/04.md
generated
vendored
@@ -1,343 +0,0 @@
|
|||||||
## 2026-04-18
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Dagu ([#13830](https://github.com/community-scripts/ProxmoxVE/pull/13830))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- BabyBuddy: set DJANGO_SETTINGS_MODULE before migrate in update [@MickLesk](https://github.com/MickLesk) ([#13836](https://github.com/community-scripts/ProxmoxVE/pull/13836))
|
|
||||||
- litellm: add prisma generate and use venv binary directly [@MickLesk](https://github.com/MickLesk) ([#13835](https://github.com/community-scripts/ProxmoxVE/pull/13835))
|
|
||||||
- yamtrack: add missing nginx.conf sed edits to update script [@MickLesk](https://github.com/MickLesk) ([#13834](https://github.com/community-scripts/ProxmoxVE/pull/13834))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- SparkyFitness Garmin Microservice: fix update function [@tomfrenzel](https://github.com/tomfrenzel) ([#13824](https://github.com/community-scripts/ProxmoxVE/pull/13824))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Clean-Orphan-LVM: check all cluster nodes for VM/CT configs [@MickLesk](https://github.com/MickLesk) ([#13837](https://github.com/community-scripts/ProxmoxVE/pull/13837))
|
|
||||||
|
|
||||||
## 2026-04-17
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- step-ca ([#13775](https://github.com/community-scripts/ProxmoxVE/pull/13775))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: pin IGC version to compute-runtime compatible tag (Intel GPU) [@MickLesk](https://github.com/MickLesk) ([#13814](https://github.com/community-scripts/ProxmoxVE/pull/13814))
|
|
||||||
- Fix for bambuddy community script update [@abbasegbeyemi](https://github.com/abbasegbeyemi) ([#13816](https://github.com/community-scripts/ProxmoxVE/pull/13816))
|
|
||||||
- Umami: Fix update procedure [@tremor021](https://github.com/tremor021) ([#13807](https://github.com/community-scripts/ProxmoxVE/pull/13807))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: sanitize mount_fs input — strip spaces and trailing commas [@MickLesk](https://github.com/MickLesk) ([#13806](https://github.com/community-scripts/ProxmoxVE/pull/13806))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: fix some pct create issues (telemetry) + cleanup [@MickLesk](https://github.com/MickLesk) ([#13810](https://github.com/community-scripts/ProxmoxVE/pull/13810))
|
|
||||||
|
|
||||||
## 2026-04-16
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Add pnpm as a dependency to ghost-cli install [@YourFavoriteKyle](https://github.com/YourFavoriteKyle) ([#13789](https://github.com/community-scripts/ProxmoxVE/pull/13789))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: wire ENABLE_MKNOD and ALLOW_MOUNT_FS into LXC features [@MickLesk](https://github.com/MickLesk) ([#13796](https://github.com/community-scripts/ProxmoxVE/pull/13796))
|
|
||||||
|
|
||||||
## 2026-04-15
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- iGotify ([#13773](https://github.com/community-scripts/ProxmoxVE/pull/13773))
|
|
||||||
- GitHub-Runner ([#13709](https://github.com/community-scripts/ProxmoxVE/pull/13709))
|
|
||||||
- Revert "Remove low-install-count CT scripts and installers (#13570)" [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13752](https://github.com/community-scripts/ProxmoxVE/pull/13752))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- [alpine-nextcloud] Update Nginx MIME types to support .mjs files [@GuiltyFox](https://github.com/GuiltyFox) ([#13771](https://github.com/community-scripts/ProxmoxVE/pull/13771))
|
|
||||||
- Domain Monitor: Fix file ownership after update [@tremor021](https://github.com/tremor021) ([#13759](https://github.com/community-scripts/ProxmoxVE/pull/13759))
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- Reitti: refactor scripts for v4 - remove RabbitMQ and Photon [@MickLesk](https://github.com/MickLesk) ([#13728](https://github.com/community-scripts/ProxmoxVE/pull/13728))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Semaphore: add BoltDB to SQLite migration [@tremor021](https://github.com/tremor021) ([#13779](https://github.com/community-scripts/ProxmoxVE/pull/13779))
|
|
||||||
|
|
||||||
### 📚 Documentation
|
|
||||||
|
|
||||||
- cleanup: remove docs/, update README & CONTRIBUTING, fix repo config [@MickLesk](https://github.com/MickLesk) ([#13770](https://github.com/community-scripts/ProxmoxVE/pull/13770))
|
|
||||||
|
|
||||||
## 2026-04-14
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- Immich: Pin photo-processing library revisions [@vhsdream](https://github.com/vhsdream) ([#13748](https://github.com/community-scripts/ProxmoxVE/pull/13748))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- BentoPDF: Nginx fixes [@tremor021](https://github.com/tremor021) ([#13741](https://github.com/community-scripts/ProxmoxVE/pull/13741))
|
|
||||||
- Zerobyte: add git to dependencies to fix bun install failure [@Copilot](https://github.com/Copilot) ([#13721](https://github.com/community-scripts/ProxmoxVE/pull/13721))
|
|
||||||
- alpine-nextcloud-install: do not use deprecated nginx config [@AlexanderStein](https://github.com/AlexanderStein) ([#13726](https://github.com/community-scripts/ProxmoxVE/pull/13726))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Mealie: support v3.15+ Nuxt 4 migration [@MickLesk](https://github.com/MickLesk) ([#13731](https://github.com/community-scripts/ProxmoxVE/pull/13731))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Lyrion: correct service name and version file in update script [@MickLesk](https://github.com/MickLesk) ([#13734](https://github.com/community-scripts/ProxmoxVE/pull/13734))
|
|
||||||
- Changedetection: move env vars from service file to .env [@tremor021](https://github.com/tremor021) ([#13732](https://github.com/community-scripts/ProxmoxVE/pull/13732))
|
|
||||||
|
|
||||||
## 2026-04-13
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Slskd: Remove stale Soularr lock file on startup and redirect logs to stderr [@MickLesk](https://github.com/MickLesk) ([#13669](https://github.com/community-scripts/ProxmoxVE/pull/13669))
|
|
||||||
- Bambuddy: preserve database and archive on update [@Copilot](https://github.com/Copilot) ([#13706](https://github.com/community-scripts/ProxmoxVE/pull/13706))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Immich: Pin version to 2.7.5 [@vhsdream](https://github.com/vhsdream) ([#13715](https://github.com/community-scripts/ProxmoxVE/pull/13715))
|
|
||||||
- Bytestash: auto backup/restore data on update [@MickLesk](https://github.com/MickLesk) ([#13707](https://github.com/community-scripts/ProxmoxVE/pull/13707))
|
|
||||||
- OpenCloud: pin version to 6.0.0 [@vhsdream](https://github.com/vhsdream) ([#13691](https://github.com/community-scripts/ProxmoxVE/pull/13691))
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- Mealie: pin version to v3.14.0 in install and update scripts [@Copilot](https://github.com/Copilot) ([#13724](https://github.com/community-scripts/ProxmoxVE/pull/13724))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: remove unused TEMP_DIR mktemp leak in build_container / clean sonarqube [@MickLesk](https://github.com/MickLesk) ([#13708](https://github.com/community-scripts/ProxmoxVE/pull/13708))
|
|
||||||
|
|
||||||
## 2026-04-12
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Alpine-Wakapi: Remove container checks in update_script function [@MickLesk](https://github.com/MickLesk) ([#13694](https://github.com/community-scripts/ProxmoxVE/pull/13694))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- IronClaw: Install keychain dependencies and launch in a DBus session [@MickLesk](https://github.com/MickLesk) ([#13692](https://github.com/community-scripts/ProxmoxVE/pull/13692))
|
|
||||||
- MeTube: Allow pnpm build scripts to fix ERR_PNPM_IGNORED_BUILDS [@MickLesk](https://github.com/MickLesk) ([#13668](https://github.com/community-scripts/ProxmoxVE/pull/13668))
|
|
||||||
|
|
||||||
## 2026-04-11
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Immich: Ensure newline before appending IMMICH_HELMET_FILE to .env [@MickLesk](https://github.com/MickLesk) ([#13667](https://github.com/community-scripts/ProxmoxVE/pull/13667))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- BentoPDF: replace http-server with nginx to fix WASM initialization timeout [@MickLesk](https://github.com/MickLesk) ([#13625](https://github.com/community-scripts/ProxmoxVE/pull/13625))
|
|
||||||
- Element Synapse: Add MatrixRTC configuration for Element Call support [@MickLesk](https://github.com/MickLesk) ([#13665](https://github.com/community-scripts/ProxmoxVE/pull/13665))
|
|
||||||
- RomM: Use ROMM_BASE_PATH from .env for symlinks and nginx config [@MickLesk](https://github.com/MickLesk) ([#13666](https://github.com/community-scripts/ProxmoxVE/pull/13666))
|
|
||||||
- Immich: Pin version to 2.7.4 [@vhsdream](https://github.com/vhsdream) ([#13661](https://github.com/community-scripts/ProxmoxVE/pull/13661))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Crafty Controller: Wait for credentials file instead of fixed sleep [@MickLesk](https://github.com/MickLesk) ([#13670](https://github.com/community-scripts/ProxmoxVE/pull/13670))
|
|
||||||
- Refactor: Alpine-Wakapi [@tremor021](https://github.com/tremor021) ([#13656](https://github.com/community-scripts/ProxmoxVE/pull/13656))
|
|
||||||
|
|
||||||
## 2026-04-10
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- fix: ensure trailing newline in redis.conf before appending bind directive [@Copilot](https://github.com/Copilot) ([#13647](https://github.com/community-scripts/ProxmoxVE/pull/13647))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Immich: Pin version to 2.7.3 [@vhsdream](https://github.com/vhsdream) ([#13631](https://github.com/community-scripts/ProxmoxVE/pull/13631))
|
|
||||||
- Homarr: bind Redis to localhost only [@MickLesk](https://github.com/MickLesk) ([#13552](https://github.com/community-scripts/ProxmoxVE/pull/13552))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- tools.func: prevent script crash when entering GitHub token after rate limit [@MickLesk](https://github.com/MickLesk) ([#13638](https://github.com/community-scripts/ProxmoxVE/pull/13638))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- addons: Filebrowser & Filebrowser-Quantum get warning if host install [@MickLesk](https://github.com/MickLesk) ([#13639](https://github.com/community-scripts/ProxmoxVE/pull/13639))
|
|
||||||
|
|
||||||
## 2026-04-09
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- boostack: add: git [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13620](https://github.com/community-scripts/ProxmoxVE/pull/13620))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Update OPNsense version from 25.7 to 26.1 [@tdn131](https://github.com/tdn131) ([#13626](https://github.com/community-scripts/ProxmoxVE/pull/13626))
|
|
||||||
- CheckMK: Bump Default OS to 13 (trixie) + dynamic codename + fix RELEASE-Tag Fetching [@MickLesk](https://github.com/MickLesk) ([#13610](https://github.com/community-scripts/ProxmoxVE/pull/13610))
|
|
||||||
|
|
||||||
## 2026-04-08
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- IronClaw | Alpine-IronClaw ([#13591](https://github.com/community-scripts/ProxmoxVE/pull/13591))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- immich: disable upgrade-insecure-requests CSP directive [@MickLesk](https://github.com/MickLesk) ([#13600](https://github.com/community-scripts/ProxmoxVE/pull/13600))
|
|
||||||
- Immich: v2.7.2 [@vhsdream](https://github.com/vhsdream) ([#13579](https://github.com/community-scripts/ProxmoxVE/pull/13579))
|
|
||||||
- Update flaresolverr-install.sh [@maztheman](https://github.com/maztheman) ([#13584](https://github.com/community-scripts/ProxmoxVE/pull/13584))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- bambuddy: add mkdir before data restore & add ffmpeg dependency [@MickLesk](https://github.com/MickLesk) ([#13601](https://github.com/community-scripts/ProxmoxVE/pull/13601))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- feat: update UHF Server script to use setup_ffmpeg [@zackwithak13](https://github.com/zackwithak13) ([#13564](https://github.com/community-scripts/ProxmoxVE/pull/13564))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: add script page badges to descriptions | change donate URL [@MickLesk](https://github.com/MickLesk) ([#13596](https://github.com/community-scripts/ProxmoxVE/pull/13596))
|
|
||||||
|
|
||||||
## 2026-04-07
|
|
||||||
|
|
||||||
### 🗑️ Deleted Scripts
|
|
||||||
|
|
||||||
- Remove low-install-count CT scripts and installers [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#13570](https://github.com/community-scripts/ProxmoxVE/pull/13570))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: improve resilience for top Proxmox error codes (209, 215, 118, 206) [@MickLesk](https://github.com/MickLesk) ([#13575](https://github.com/community-scripts/ProxmoxVE/pull/13575))
|
|
||||||
|
|
||||||
## 2026-04-06
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- OpenThread Border Router ([#13536](https://github.com/community-scripts/ProxmoxVE/pull/13536))
|
|
||||||
- Homelable ([#13539](https://github.com/community-scripts/ProxmoxVE/pull/13539))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Papra: check env before copy [@MickLesk](https://github.com/MickLesk) ([#13553](https://github.com/community-scripts/ProxmoxVE/pull/13553))
|
|
||||||
- changedetection: fix: typing_extensions error [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13548](https://github.com/community-scripts/ProxmoxVE/pull/13548))
|
|
||||||
- kasm: fix: fetch latest version [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13547](https://github.com/community-scripts/ProxmoxVE/pull/13547))
|
|
||||||
|
|
||||||
## 2026-04-05
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Grist: remove install:ee step (private repo, not needed for grist-core) [@MickLesk](https://github.com/MickLesk) ([#13526](https://github.com/community-scripts/ProxmoxVE/pull/13526))
|
|
||||||
- Nginx Proxy Manager: ensure /tmp/nginx/body exists via openresty service [@MickLesk](https://github.com/MickLesk) ([#13528](https://github.com/community-scripts/ProxmoxVE/pull/13528))
|
|
||||||
- MotionEye: run as root to enable SMB share support [@MickLesk](https://github.com/MickLesk) ([#13527](https://github.com/community-scripts/ProxmoxVE/pull/13527))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: silent() function - use return instead of exit to allow || true error handling [@MickLesk](https://github.com/MickLesk) ([#13529](https://github.com/community-scripts/ProxmoxVE/pull/13529))
|
|
||||||
|
|
||||||
## 2026-04-04
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- komodo: set `PERIPHERY_CORE_PUBLIC_KEYS` to default value if absent [@4ndv](https://github.com/4ndv) ([#13519](https://github.com/community-scripts/ProxmoxVE/pull/13519))
|
|
||||||
|
|
||||||
## 2026-04-03
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- netboot.xyz ([#13480](https://github.com/community-scripts/ProxmoxVE/pull/13480))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- OpenWRT-VM: use poweroff instead of halt to properly stop VM [@MickLesk](https://github.com/MickLesk) ([#13504](https://github.com/community-scripts/ProxmoxVE/pull/13504))
|
|
||||||
- NginxProxyManager: fix openresty restart by setting user root before reload [@MickLesk](https://github.com/MickLesk) ([#13500](https://github.com/community-scripts/ProxmoxVE/pull/13500))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Crafty Controller: add Java 25 for Minecraft 1.26.1+ [@MickLesk](https://github.com/MickLesk) ([#13502](https://github.com/community-scripts/ProxmoxVE/pull/13502))
|
|
||||||
- Wealthfolio: update to v3.2.1 and Node.js 24 [@afadil](https://github.com/afadil) ([#13486](https://github.com/community-scripts/ProxmoxVE/pull/13486))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core.func: prevent profile.d scripts from aborting on non-zero exit [@MickLesk](https://github.com/MickLesk) ([#13503](https://github.com/community-scripts/ProxmoxVE/pull/13503))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- APT Proxy: Support full URLs (http/https with custom ports) [@MickLesk](https://github.com/MickLesk) ([#13474](https://github.com/community-scripts/ProxmoxVE/pull/13474))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- PVE LXC-Updater: pipe apt list through cat to prevent pager hang [@MickLesk](https://github.com/MickLesk) ([#13501](https://github.com/community-scripts/ProxmoxVE/pull/13501))
|
|
||||||
|
|
||||||
## 2026-04-02
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Grist: Guard backup restore for empty docs/db files [@MickLesk](https://github.com/MickLesk) ([#13472](https://github.com/community-scripts/ProxmoxVE/pull/13472))
|
|
||||||
- fix(zigbee2mqtt): suppress grep error when pnpm-workspace.yaml is absent on update [@Copilot](https://github.com/Copilot) ([#13476](https://github.com/community-scripts/ProxmoxVE/pull/13476))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Cron LXC Updater: Add full PATH for cron environment [@MickLesk](https://github.com/MickLesk) ([#13473](https://github.com/community-scripts/ProxmoxVE/pull/13473))
|
|
||||||
|
|
||||||
## 2026-04-01
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- DrawDB ([#13454](https://github.com/community-scripts/ProxmoxVE/pull/13454))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Filebrowser: make noauth setup use correct database [@MickLesk](https://github.com/MickLesk) ([#13457](https://github.com/community-scripts/ProxmoxVE/pull/13457))
|
|
||||||
2
.github/pull_request_template.md
generated
vendored
2
.github/pull_request_template.md
generated
vendored
@@ -22,6 +22,6 @@ Fixes #
|
|||||||
- [ ] ✨ **New feature** – Adds new, non-breaking functionality.
|
- [ ] ✨ **New feature** – Adds new, non-breaking functionality.
|
||||||
- [ ] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
|
- [ ] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
|
||||||
- [ ] 🆕 **New script** – A fully functional and tested script or script set.
|
- [ ] 🆕 **New script** – A fully functional and tested script or script set.
|
||||||
- [ ] 🌍 **Website update** – Changes to script metadata (PocketBase/website data).
|
- [ ] 🌍 **Website update** – Changes to website-related JSON files or metadata.
|
||||||
- [ ] 🔧 **Refactoring / Code Cleanup** – Improves readability or maintainability without changing functionality.
|
- [ ] 🔧 **Refactoring / Code Cleanup** – Improves readability or maintainability without changing functionality.
|
||||||
- [ ] 📝 **Documentation update** – Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
|
- [ ] 📝 **Documentation update** – Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
|
||||||
|
|||||||
482
.github/workflows/pocketbase-bot.yml
generated
vendored
482
.github/workflows/pocketbase-bot.yml
generated
vendored
@@ -31,8 +31,6 @@ jobs:
|
|||||||
ACTOR: ${{ github.event.comment.user.login }}
|
ACTOR: ${{ github.event.comment.user.login }}
|
||||||
ACTOR_ASSOCIATION: ${{ github.event.comment.author_association }}
|
ACTOR_ASSOCIATION: ${{ github.event.comment.author_association }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
FRONTEND_URL: ${{ secrets.FRONTEND_URL }}
|
|
||||||
REVALIDATE_SECRET: ${{ secrets.REVALIDATE_SECRET }}
|
|
||||||
run: |
|
run: |
|
||||||
node << 'ENDSCRIPT'
|
node << 'ENDSCRIPT'
|
||||||
(async function () {
|
(async function () {
|
||||||
@@ -115,6 +113,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── Permission check ───────────────────────────────────────────────
|
// ── Permission check ───────────────────────────────────────────────
|
||||||
|
// author_association: OWNER = repo/org owner, MEMBER = org member (includes Contributors team)
|
||||||
const association = process.env.ACTOR_ASSOCIATION;
|
const association = process.env.ACTOR_ASSOCIATION;
|
||||||
if (association !== 'OWNER' && association !== 'MEMBER') {
|
if (association !== 'OWNER' && association !== 'MEMBER') {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
@@ -129,11 +128,18 @@ jobs:
|
|||||||
await addReaction('eyes');
|
await addReaction('eyes');
|
||||||
|
|
||||||
// ── Parse command ──────────────────────────────────────────────────
|
// ── Parse command ──────────────────────────────────────────────────
|
||||||
|
// Formats (first line of comment):
|
||||||
|
// /pocketbase <slug> field=value [field=value ...] ← field updates (simple values)
|
||||||
|
// /pocketbase <slug> set <field> ← value from code block below
|
||||||
|
// /pocketbase <slug> note list|add|edit|remove ... ← note management
|
||||||
|
// /pocketbase <slug> method list ← list install methods
|
||||||
|
// /pocketbase <slug> method <type> cpu=N ram=N hdd=N ← edit install method resources
|
||||||
const commentBody = process.env.COMMENT_BODY || '';
|
const commentBody = process.env.COMMENT_BODY || '';
|
||||||
const lines = commentBody.trim().split('\n');
|
const lines = commentBody.trim().split('\n');
|
||||||
const firstLine = lines[0].trim();
|
const firstLine = lines[0].trim();
|
||||||
const withoutCmd = firstLine.replace(/^\/pocketbase\s+/, '').trim();
|
const withoutCmd = firstLine.replace(/^\/pocketbase\s+/, '').trim();
|
||||||
|
|
||||||
|
// Extract code block content from comment body (```...``` or ```lang\n...```)
|
||||||
function extractCodeBlock(body) {
|
function extractCodeBlock(body) {
|
||||||
const m = body.match(/```[^\n]*\n([\s\S]*?)```/);
|
const m = body.match(/```[^\n]*\n([\s\S]*?)```/);
|
||||||
return m ? m[1].trim() : null;
|
return m ? m[1].trim() : null;
|
||||||
@@ -141,8 +147,6 @@ jobs:
|
|||||||
const codeBlockValue = extractCodeBlock(commentBody);
|
const codeBlockValue = extractCodeBlock(commentBody);
|
||||||
|
|
||||||
const HELP_TEXT =
|
const HELP_TEXT =
|
||||||
'**Show current state:**\n' +
|
|
||||||
'```\n/pocketbase <slug> info\n```\n\n' +
|
|
||||||
'**Field update (simple):** `/pocketbase <slug> field=value [field=value ...]`\n\n' +
|
'**Field update (simple):** `/pocketbase <slug> field=value [field=value ...]`\n\n' +
|
||||||
'**Field update (HTML/multiline) — value from code block:**\n' +
|
'**Field update (HTML/multiline) — value from code block:**\n' +
|
||||||
'````\n' +
|
'````\n' +
|
||||||
@@ -158,16 +162,12 @@ jobs:
|
|||||||
'/pocketbase <slug> note edit <type> "<old text>" "<new text>"\n' +
|
'/pocketbase <slug> note edit <type> "<old text>" "<new text>"\n' +
|
||||||
'/pocketbase <slug> note remove <type> "<text>"\n' +
|
'/pocketbase <slug> note remove <type> "<text>"\n' +
|
||||||
'```\n\n' +
|
'```\n\n' +
|
||||||
'**Install method management:**\n' +
|
'**Install method resources:**\n' +
|
||||||
'```\n' +
|
'```\n' +
|
||||||
'/pocketbase <slug> method list\n' +
|
'/pocketbase <slug> method list\n' +
|
||||||
|
'/pocketbase <slug> method <type> hdd=10\n' +
|
||||||
'/pocketbase <slug> method <type> cpu=4 ram=2048 hdd=20\n' +
|
'/pocketbase <slug> method <type> cpu=4 ram=2048 hdd=20\n' +
|
||||||
'/pocketbase <slug> method <type> config_path="/opt/app/.env"\n' +
|
'```\n\n' +
|
||||||
'/pocketbase <slug> method <type> os=debian version=13\n' +
|
|
||||||
'/pocketbase <slug> method add <type> cpu=2 ram=2048 hdd=8 os=debian version=13\n' +
|
|
||||||
'/pocketbase <slug> method remove <type>\n' +
|
|
||||||
'```\n' +
|
|
||||||
'Method fields: `cpu` `ram` `hdd` `os` `version` `config_path` `script`\n\n' +
|
|
||||||
'**Editable fields:** `name` `description` `logo` `documentation` `website` `project_url` `github` ' +
|
'**Editable fields:** `name` `description` `logo` `documentation` `website` `project_url` `github` ' +
|
||||||
'`config_path` `port` `default_user` `default_passwd` ' +
|
'`config_path` `port` `default_user` `default_passwd` ' +
|
||||||
'`updateable` `privileged` `has_arm` `is_dev` ' +
|
'`updateable` `privileged` `has_arm` `is_dev` ' +
|
||||||
@@ -189,7 +189,8 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── PocketBase: authenticate ───────────────────────────────────────
|
// ── Allowed fields and their types ─────────────────────────────────
|
||||||
|
// ── PocketBase: authenticate (shared by all paths) ─────────────────
|
||||||
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
||||||
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
|
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
|
||||||
const coll = process.env.POCKETBASE_COLLECTION;
|
const coll = process.env.POCKETBASE_COLLECTION;
|
||||||
@@ -209,7 +210,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
const token = JSON.parse(authRes.body).token;
|
const token = JSON.parse(authRes.body).token;
|
||||||
|
|
||||||
// ── PocketBase: find record by slug ────────────────────────────────
|
// ── PocketBase: find record by slug (shared by all paths) ──────────
|
||||||
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
||||||
const filter = "(slug='" + slug.replace(/'/g, "''") + "')";
|
const filter = "(slug='" + slug.replace(/'/g, "''") + "')";
|
||||||
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', {
|
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', {
|
||||||
@@ -227,172 +228,65 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Shared helpers ─────────────────────────────────────────────────
|
|
||||||
|
|
||||||
// Key=value parser: handles unquoted and "quoted" values
|
|
||||||
function parseKVPairs(str) {
|
|
||||||
const fields = {};
|
|
||||||
let pos = 0;
|
|
||||||
while (pos < str.length) {
|
|
||||||
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
|
||||||
if (pos >= str.length) break;
|
|
||||||
let keyStart = pos;
|
|
||||||
while (pos < str.length && str[pos] !== '=' && !/\s/.test(str[pos])) pos++;
|
|
||||||
const key = str.substring(keyStart, pos).trim();
|
|
||||||
if (!key || pos >= str.length || str[pos] !== '=') { pos++; continue; }
|
|
||||||
pos++;
|
|
||||||
let value;
|
|
||||||
if (pos < str.length && str[pos] === '"') {
|
|
||||||
pos++;
|
|
||||||
let valStart = pos;
|
|
||||||
while (pos < str.length && str[pos] !== '"') {
|
|
||||||
if (str[pos] === '\\') pos++;
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
value = str.substring(valStart, pos).replace(/\\"/g, '"');
|
|
||||||
if (pos < str.length) pos++;
|
|
||||||
} else {
|
|
||||||
let valStart = pos;
|
|
||||||
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
|
||||||
value = str.substring(valStart, pos);
|
|
||||||
}
|
|
||||||
fields[key] = value;
|
|
||||||
}
|
|
||||||
return fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Token parser for note commands: unquoted-word OR "quoted string"
|
|
||||||
function parseTokens(str) {
|
|
||||||
const tokens = [];
|
|
||||||
let pos = 0;
|
|
||||||
while (pos < str.length) {
|
|
||||||
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
|
||||||
if (pos >= str.length) break;
|
|
||||||
if (str[pos] === '"') {
|
|
||||||
pos++;
|
|
||||||
let start = pos;
|
|
||||||
while (pos < str.length && str[pos] !== '"') {
|
|
||||||
if (str[pos] === '\\') pos++;
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
tokens.push(str.substring(start, pos).replace(/\\"/g, '"'));
|
|
||||||
if (pos < str.length) pos++;
|
|
||||||
} else {
|
|
||||||
let start = pos;
|
|
||||||
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
|
||||||
tokens.push(str.substring(start, pos));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read JSON blob from record (handles parsed objects and strings)
|
|
||||||
function readJsonBlob(val) {
|
|
||||||
if (Array.isArray(val)) return val;
|
|
||||||
try { return JSON.parse(val || '[]'); } catch (e) { return []; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Frontend cache revalidation (silent, best-effort)
|
|
||||||
async function revalidate(s) {
|
|
||||||
const frontendUrl = process.env.FRONTEND_URL;
|
|
||||||
const secret = process.env.REVALIDATE_SECRET;
|
|
||||||
if (!frontendUrl || !secret) return;
|
|
||||||
try {
|
|
||||||
await request(frontendUrl.replace(/\/$/, '') + '/api/revalidate', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Authorization': 'Bearer ' + secret, 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify({ tags: ['scripts', 'script-' + s] })
|
|
||||||
});
|
|
||||||
} catch (e) { console.warn('Revalidation skipped:', e.message); }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format notes list for display
|
|
||||||
function formatNotesList(arr) {
|
|
||||||
if (arr.length === 0) return '*None*';
|
|
||||||
return arr.map(function (n, i) {
|
|
||||||
return (i + 1) + '. **`' + (n.type || '?') + '`**: ' + (n.text || '');
|
|
||||||
}).join('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format install methods list for display
|
|
||||||
function formatMethodsList(arr) {
|
|
||||||
if (arr.length === 0) return '*None*';
|
|
||||||
return arr.map(function (im, i) {
|
|
||||||
const r = im.resources || {};
|
|
||||||
const parts = [
|
|
||||||
(r.os || '?') + ' ' + (r.version || '?'),
|
|
||||||
(r.cpu != null ? r.cpu : '?') + 'C / ' + (r.ram != null ? r.ram : '?') + ' MB / ' + (r.hdd != null ? r.hdd : '?') + ' GB'
|
|
||||||
];
|
|
||||||
if (im.config_path) parts.push('config: `' + im.config_path + '`');
|
|
||||||
if (im.script) parts.push('script: `' + im.script + '`');
|
|
||||||
return (i + 1) + '. **`' + (im.type || '?') + '`** — ' + parts.join(', ');
|
|
||||||
}).join('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Route: dispatch to subcommand handler ──────────────────────────
|
// ── Route: dispatch to subcommand handler ──────────────────────────
|
||||||
const infoMatch = rest.match(/^info$/i);
|
|
||||||
const noteMatch = rest.match(/^note\s+(list|add|edit|remove)\b/i);
|
const noteMatch = rest.match(/^note\s+(list|add|edit|remove)\b/i);
|
||||||
const methodMatch = rest.match(/^method\b/i);
|
const methodMatch = rest.match(/^method\b/i);
|
||||||
const setMatch = rest.match(/^set\s+(\S+)/i);
|
const setMatch = rest.match(/^set\s+(\S+)/i);
|
||||||
|
|
||||||
if (infoMatch) {
|
if (noteMatch) {
|
||||||
// ── INFO SUBCOMMAND ──────────────────────────────────────────────
|
// ── NOTE SUBCOMMAND (reads/writes notes_json on script record) ────
|
||||||
const notesArr = readJsonBlob(record.notes);
|
|
||||||
const methodsArr = readJsonBlob(record.install_methods);
|
|
||||||
|
|
||||||
const out = [];
|
|
||||||
out.push('ℹ️ **PocketBase Bot**: Info for **`' + slug + '`**\n');
|
|
||||||
|
|
||||||
out.push('**Basic info:**');
|
|
||||||
out.push('- **Name:** ' + (record.name || '—'));
|
|
||||||
out.push('- **Slug:** `' + slug + '`');
|
|
||||||
out.push('- **Port:** ' + (record.port != null ? '`' + record.port + '`' : '—'));
|
|
||||||
out.push('- **Updateable:** ' + (record.updateable ? 'Yes' : 'No'));
|
|
||||||
out.push('- **Privileged:** ' + (record.privileged ? 'Yes' : 'No'));
|
|
||||||
out.push('- **ARM:** ' + (record.has_arm ? 'Yes' : 'No'));
|
|
||||||
if (record.is_dev) out.push('- **Dev:** Yes');
|
|
||||||
if (record.is_disabled) out.push('- **Disabled:** Yes' + (record.disable_message ? ' — ' + record.disable_message : ''));
|
|
||||||
if (record.is_deleted) out.push('- **Deleted:** Yes' + (record.deleted_message ? ' — ' + record.deleted_message : ''));
|
|
||||||
out.push('');
|
|
||||||
|
|
||||||
out.push('**Links:**');
|
|
||||||
out.push('- **Website:** ' + (record.website || '—'));
|
|
||||||
out.push('- **Docs:** ' + (record.documentation || '—'));
|
|
||||||
out.push('- **Logo:** ' + (record.logo ? '[link](' + record.logo + ')' : '—'));
|
|
||||||
out.push('- **GitHub:** ' + (record.github || '—'));
|
|
||||||
if (record.config_path) out.push('- **Config:** `' + record.config_path + '`');
|
|
||||||
out.push('');
|
|
||||||
|
|
||||||
out.push('**Credentials:**');
|
|
||||||
out.push('- **User:** ' + (record.default_user || '—'));
|
|
||||||
out.push('- **Password:** ' + (record.default_passwd ? '*(set)*' : '—'));
|
|
||||||
out.push('');
|
|
||||||
|
|
||||||
out.push('**Install methods** (' + methodsArr.length + '):');
|
|
||||||
out.push(formatMethodsList(methodsArr));
|
|
||||||
out.push('');
|
|
||||||
|
|
||||||
out.push('**Notes** (' + notesArr.length + '):');
|
|
||||||
out.push(formatNotesList(notesArr));
|
|
||||||
|
|
||||||
await addReaction('+1');
|
|
||||||
await postComment(out.join('\n'));
|
|
||||||
|
|
||||||
} else if (noteMatch) {
|
|
||||||
// ── NOTE SUBCOMMAND ──────────────────────────────────────────────
|
|
||||||
const noteAction = noteMatch[1].toLowerCase();
|
const noteAction = noteMatch[1].toLowerCase();
|
||||||
const noteArgsStr = rest.substring(noteMatch[0].length).trim();
|
const noteArgsStr = rest.substring(noteMatch[0].length).trim();
|
||||||
let notesArr = readJsonBlob(record.notes);
|
|
||||||
|
|
||||||
async function patchNotes(arr) {
|
// Parse notes_json from the already-fetched script record
|
||||||
|
// PocketBase may return JSON fields as already-parsed objects
|
||||||
|
let notesArr = [];
|
||||||
|
try {
|
||||||
|
const rawNotes = record.notes_json;
|
||||||
|
notesArr = Array.isArray(rawNotes) ? rawNotes : JSON.parse(rawNotes || '[]');
|
||||||
|
} catch (e) { notesArr = []; }
|
||||||
|
|
||||||
|
// Token parser: unquoted-word OR "quoted string" (supports \" escapes)
|
||||||
|
function parseNoteTokens(str) {
|
||||||
|
const tokens = [];
|
||||||
|
let pos = 0;
|
||||||
|
while (pos < str.length) {
|
||||||
|
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
||||||
|
if (pos >= str.length) break;
|
||||||
|
if (str[pos] === '"') {
|
||||||
|
pos++;
|
||||||
|
let start = pos;
|
||||||
|
while (pos < str.length && str[pos] !== '"') {
|
||||||
|
if (str[pos] === '\\') pos++;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
tokens.push(str.substring(start, pos).replace(/\\"/g, '"'));
|
||||||
|
if (pos < str.length) pos++;
|
||||||
|
} else {
|
||||||
|
let start = pos;
|
||||||
|
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
||||||
|
tokens.push(str.substring(start, pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatNotesList(arr) {
|
||||||
|
if (arr.length === 0) return '*None*';
|
||||||
|
return arr.map(function (n, i) {
|
||||||
|
return (i + 1) + '. **`' + (n.type || '?') + '`**: ' + (n.text || '');
|
||||||
|
}).join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function patchNotesJson(arr) {
|
||||||
const res = await request(recordsUrl + '/' + record.id, {
|
const res = await request(recordsUrl + '/' + record.id, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({ notes: arr })
|
body: JSON.stringify({ notes_json: JSON.stringify(arr) })
|
||||||
});
|
});
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment('❌ **PocketBase Bot**: Failed to update notes:\n```\n' + res.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: Failed to update `notes_json`:\n```\n' + res.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -405,7 +299,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
|
|
||||||
} else if (noteAction === 'add') {
|
} else if (noteAction === 'add') {
|
||||||
const tokens = parseTokens(noteArgsStr);
|
const tokens = parseNoteTokens(noteArgsStr);
|
||||||
if (tokens.length < 2) {
|
if (tokens.length < 2) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -417,8 +311,7 @@ jobs:
|
|||||||
const noteType = tokens[0].toLowerCase();
|
const noteType = tokens[0].toLowerCase();
|
||||||
const noteText = tokens.slice(1).join(' ');
|
const noteText = tokens.slice(1).join(' ');
|
||||||
notesArr.push({ type: noteType, text: noteText });
|
notesArr.push({ type: noteType, text: noteText });
|
||||||
await patchNotes(notesArr);
|
await patchNotesJson(notesArr);
|
||||||
await revalidate(slug);
|
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Added note to **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Added note to **`' + slug + '`**\n\n' +
|
||||||
@@ -428,7 +321,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
|
|
||||||
} else if (noteAction === 'edit') {
|
} else if (noteAction === 'edit') {
|
||||||
const tokens = parseTokens(noteArgsStr);
|
const tokens = parseNoteTokens(noteArgsStr);
|
||||||
if (tokens.length < 3) {
|
if (tokens.length < 3) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -453,8 +346,7 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
notesArr[idx].text = newText;
|
notesArr[idx].text = newText;
|
||||||
await patchNotes(notesArr);
|
await patchNotesJson(notesArr);
|
||||||
await revalidate(slug);
|
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Edited note in **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Edited note in **`' + slug + '`**\n\n' +
|
||||||
@@ -465,7 +357,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
|
|
||||||
} else if (noteAction === 'remove') {
|
} else if (noteAction === 'remove') {
|
||||||
const tokens = parseTokens(noteArgsStr);
|
const tokens = parseNoteTokens(noteArgsStr);
|
||||||
if (tokens.length < 2) {
|
if (tokens.length < 2) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -489,8 +381,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
await patchNotes(notesArr);
|
await patchNotesJson(notesArr);
|
||||||
await revalidate(slug);
|
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Removed note from **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Removed note from **`' + slug + '`**\n\n' +
|
||||||
@@ -501,36 +392,36 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (methodMatch) {
|
} else if (methodMatch) {
|
||||||
// ── METHOD SUBCOMMAND ────────────────────────────────────────────
|
// ── METHOD SUBCOMMAND (reads/writes install_methods_json on script record) ──
|
||||||
const methodArgs = rest.replace(/^method\s*/i, '').trim();
|
const methodArgs = rest.replace(/^method\s*/i, '').trim();
|
||||||
const methodListMode = !methodArgs || methodArgs.toLowerCase() === 'list';
|
const methodListMode = !methodArgs || methodArgs.toLowerCase() === 'list';
|
||||||
let methodsArr = readJsonBlob(record.install_methods);
|
|
||||||
|
|
||||||
// Method field classification
|
// Parse install_methods_json from the already-fetched script record
|
||||||
const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' };
|
// PocketBase may return JSON fields as already-parsed objects
|
||||||
const METHOD_KEYS = { config_path: 'string', script: 'string' };
|
let methodsArr = [];
|
||||||
const ALL_METHOD_KEYS = Object.assign({}, RESOURCE_KEYS, METHOD_KEYS);
|
try {
|
||||||
|
const rawMethods = record.install_methods_json;
|
||||||
|
methodsArr = Array.isArray(rawMethods) ? rawMethods : JSON.parse(rawMethods || '[]');
|
||||||
|
} catch (e) { methodsArr = []; }
|
||||||
|
|
||||||
function applyMethodChanges(method, parsed) {
|
function formatMethodsList(arr) {
|
||||||
if (!method.resources) method.resources = {};
|
if (arr.length === 0) return '*None*';
|
||||||
for (const [k, v] of Object.entries(parsed)) {
|
return arr.map(function (im, i) {
|
||||||
if (RESOURCE_KEYS[k]) {
|
const r = im.resources || {};
|
||||||
method.resources[k] = RESOURCE_KEYS[k] === 'number' ? parseInt(v, 10) : v;
|
return (i + 1) + '. **`' + (im.type || '?') + '`** — CPU: `' + (r.cpu != null ? r.cpu : '?') +
|
||||||
} else if (METHOD_KEYS[k]) {
|
'` · RAM: `' + (r.ram != null ? r.ram : '?') + ' MB` · HDD: `' + (r.hdd != null ? r.hdd : '?') + ' GB`';
|
||||||
method[k] = v === '' ? null : v;
|
}).join('\n');
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function patchMethods(arr) {
|
async function patchInstallMethodsJson(arr) {
|
||||||
const res = await request(recordsUrl + '/' + record.id, {
|
const res = await request(recordsUrl + '/' + record.id, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({ install_methods: arr })
|
body: JSON.stringify({ install_methods_json: JSON.stringify(arr) })
|
||||||
});
|
});
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment('❌ **PocketBase Bot**: Failed to update install methods:\n```\n' + res.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: Failed to update `install_methods_json`:\n```\n' + res.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -541,122 +432,70 @@ jobs:
|
|||||||
'ℹ️ **PocketBase Bot**: Install methods for **`' + slug + '`** (' + methodsArr.length + ' total)\n\n' +
|
'ℹ️ **PocketBase Bot**: Install methods for **`' + slug + '`** (' + methodsArr.length + ' total)\n\n' +
|
||||||
formatMethodsList(methodsArr)
|
formatMethodsList(methodsArr)
|
||||||
);
|
);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Check for add / remove sub-actions
|
// Parse: <type> cpu=N ram=N hdd=N
|
||||||
const addMatch = methodArgs.match(/^add\s+(\S+)(?:\s+(.+))?$/i);
|
const methodParts = methodArgs.match(/^(\S+)\s+(.+)$/);
|
||||||
const removeMatch = methodArgs.match(/^remove\s+(\S+)$/i);
|
if (!methodParts) {
|
||||||
|
await addReaction('-1');
|
||||||
if (addMatch) {
|
|
||||||
// ── METHOD ADD ───────────────────────────────────────────────
|
|
||||||
const newType = addMatch[1];
|
|
||||||
if (methodsArr.some(function (im) { return (im.type || '').toLowerCase() === newType.toLowerCase(); })) {
|
|
||||||
await addReaction('-1');
|
|
||||||
await postComment('❌ **PocketBase Bot**: Install method `' + newType + '` already exists for `' + slug + '`.\n\nUse `/pocketbase ' + slug + ' method list` to see all methods.');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
const newMethod = { type: newType, resources: { cpu: 1, ram: 512, hdd: 4, os: 'debian', version: '13' } };
|
|
||||||
if (addMatch[2]) {
|
|
||||||
const parsed = parseKVPairs(addMatch[2]);
|
|
||||||
const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; });
|
|
||||||
if (unknown.length > 0) {
|
|
||||||
await addReaction('-1');
|
|
||||||
await postComment('❌ **PocketBase Bot**: Unknown method field(s): `' + unknown.join('`, `') + '`\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
applyMethodChanges(newMethod, parsed);
|
|
||||||
}
|
|
||||||
methodsArr.push(newMethod);
|
|
||||||
await patchMethods(methodsArr);
|
|
||||||
await revalidate(slug);
|
|
||||||
await addReaction('+1');
|
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Added install method **`' + newType + '`** to **`' + slug + '`**\n\n' +
|
'❌ **PocketBase Bot**: Invalid `method` syntax.\n\n' +
|
||||||
formatMethodsList([newMethod]) + '\n\n' +
|
'**Usage:**\n```\n/pocketbase ' + slug + ' method list\n/pocketbase ' + slug + ' method <type> hdd=10\n/pocketbase ' + slug + ' method <type> cpu=4 ram=2048 hdd=20\n```'
|
||||||
'*Executed by @' + actor + '*'
|
|
||||||
);
|
|
||||||
|
|
||||||
} else if (removeMatch) {
|
|
||||||
// ── METHOD REMOVE ────────────────────────────────────────────
|
|
||||||
const removeType = removeMatch[1].toLowerCase();
|
|
||||||
const removed = methodsArr.filter(function (im) { return (im.type || '').toLowerCase() === removeType; });
|
|
||||||
if (removed.length === 0) {
|
|
||||||
await addReaction('-1');
|
|
||||||
const available = methodsArr.map(function (im) { return im.type || '?'; });
|
|
||||||
await postComment('❌ **PocketBase Bot**: No install method `' + removeType + '` found.\n\n**Available:** `' + (available.length ? available.join('`, `') : '(none)') + '`');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
methodsArr = methodsArr.filter(function (im) { return (im.type || '').toLowerCase() !== removeType; });
|
|
||||||
await patchMethods(methodsArr);
|
|
||||||
await revalidate(slug);
|
|
||||||
await addReaction('+1');
|
|
||||||
await postComment(
|
|
||||||
'✅ **PocketBase Bot**: Removed install method **`' + removed[0].type + '`** from **`' + slug + '`**\n\n' +
|
|
||||||
'*Executed by @' + actor + '*'
|
|
||||||
);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// ── METHOD EDIT ──────────────────────────────────────────────
|
|
||||||
const editParts = methodArgs.match(/^(\S+)\s+(.+)$/);
|
|
||||||
if (!editParts) {
|
|
||||||
await addReaction('-1');
|
|
||||||
await postComment(
|
|
||||||
'❌ **PocketBase Bot**: Invalid `method` syntax.\n\n' +
|
|
||||||
'**Usage:**\n```\n/pocketbase ' + slug + ' method list\n' +
|
|
||||||
'/pocketbase ' + slug + ' method <type> cpu=4 ram=2048 hdd=20\n' +
|
|
||||||
'/pocketbase ' + slug + ' method <type> config_path="/opt/app/.env"\n' +
|
|
||||||
'/pocketbase ' + slug + ' method add <type> cpu=2 ram=2048 hdd=8\n' +
|
|
||||||
'/pocketbase ' + slug + ' method remove <type>\n```'
|
|
||||||
);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
const targetType = editParts[1].toLowerCase();
|
|
||||||
const parsed = parseKVPairs(editParts[2]);
|
|
||||||
|
|
||||||
const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; });
|
|
||||||
if (unknown.length > 0) {
|
|
||||||
await addReaction('-1');
|
|
||||||
await postComment('❌ **PocketBase Bot**: Unknown method field(s): `' + unknown.join('`, `') + '`\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
if (Object.keys(parsed).length === 0) {
|
|
||||||
await addReaction('-1');
|
|
||||||
await postComment('❌ **PocketBase Bot**: No valid `key=value` pairs found.\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const idx = methodsArr.findIndex(function (im) { return (im.type || '').toLowerCase() === targetType; });
|
|
||||||
if (idx === -1) {
|
|
||||||
await addReaction('-1');
|
|
||||||
const available = methodsArr.map(function (im) { return im.type || '?'; });
|
|
||||||
await postComment(
|
|
||||||
'❌ **PocketBase Bot**: No install method `' + targetType + '` found for `' + slug + '`.\n\n' +
|
|
||||||
'**Available:** `' + (available.length ? available.join('`, `') : '(none)') + '`\n\n' +
|
|
||||||
'Use `/pocketbase ' + slug + ' method list` to see all methods.'
|
|
||||||
);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
applyMethodChanges(methodsArr[idx], parsed);
|
|
||||||
await patchMethods(methodsArr);
|
|
||||||
await revalidate(slug);
|
|
||||||
|
|
||||||
const changesLines = Object.entries(parsed)
|
|
||||||
.map(function ([k, v]) {
|
|
||||||
const unit = k === 'ram' ? ' MB' : k === 'hdd' ? ' GB' : '';
|
|
||||||
return '- `' + k + '` → `' + v + unit + '`';
|
|
||||||
}).join('\n');
|
|
||||||
await addReaction('+1');
|
|
||||||
await postComment(
|
|
||||||
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
|
|
||||||
'**Changes applied:**\n' + changesLines + '\n\n' +
|
|
||||||
'*Executed by @' + actor + '*'
|
|
||||||
);
|
);
|
||||||
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
const targetType = methodParts[1].toLowerCase();
|
||||||
|
const resourcesStr = methodParts[2];
|
||||||
|
|
||||||
|
// Parse resource fields (only cpu/ram/hdd allowed)
|
||||||
|
const RESOURCE_FIELDS = { cpu: true, ram: true, hdd: true };
|
||||||
|
const resourceChanges = {};
|
||||||
|
const rePairs = /([a-z]+)=(\d+)/gi;
|
||||||
|
let m;
|
||||||
|
while ((m = rePairs.exec(resourcesStr)) !== null) {
|
||||||
|
const key = m[1].toLowerCase();
|
||||||
|
if (RESOURCE_FIELDS[key]) resourceChanges[key] = parseInt(m[2], 10);
|
||||||
|
}
|
||||||
|
if (Object.keys(resourceChanges).length === 0) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase Bot**: No valid resource fields found. Use `cpu=N`, `ram=N`, `hdd=N`.');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find matching method by type name (case-insensitive)
|
||||||
|
const idx = methodsArr.findIndex(function (im) {
|
||||||
|
return (im.type || '').toLowerCase() === targetType;
|
||||||
|
});
|
||||||
|
if (idx === -1) {
|
||||||
|
await addReaction('-1');
|
||||||
|
const availableTypes = methodsArr.map(function (im) { return im.type || '?'; });
|
||||||
|
await postComment(
|
||||||
|
'❌ **PocketBase Bot**: No install method with type `' + targetType + '` found for `' + slug + '`.\n\n' +
|
||||||
|
'**Available types:** `' + (availableTypes.length ? availableTypes.join('`, `') : '(none)') + '`\n\n' +
|
||||||
|
'Use `/pocketbase ' + slug + ' method list` to see all methods.'
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!methodsArr[idx].resources) methodsArr[idx].resources = {};
|
||||||
|
if (resourceChanges.cpu != null) methodsArr[idx].resources.cpu = resourceChanges.cpu;
|
||||||
|
if (resourceChanges.ram != null) methodsArr[idx].resources.ram = resourceChanges.ram;
|
||||||
|
if (resourceChanges.hdd != null) methodsArr[idx].resources.hdd = resourceChanges.hdd;
|
||||||
|
|
||||||
|
await patchInstallMethodsJson(methodsArr);
|
||||||
|
|
||||||
|
const changesLines = Object.entries(resourceChanges)
|
||||||
|
.map(function ([k, v]) { return '- `' + k + '` → `' + v + (k === 'ram' ? ' MB' : k === 'hdd' ? ' GB' : '') + '`'; })
|
||||||
|
.join('\n');
|
||||||
|
await addReaction('+1');
|
||||||
|
await postComment(
|
||||||
|
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
|
||||||
|
'**Changes applied:**\n' + changesLines + '\n\n' +
|
||||||
|
'*Executed by @' + actor + '*'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (setMatch) {
|
} else if (setMatch) {
|
||||||
// ── SET SUBCOMMAND (value from code block) ───────────────────────
|
// ── SET SUBCOMMAND (multi-line / HTML / special chars via code block) ──
|
||||||
const fieldName = setMatch[1].toLowerCase();
|
const fieldName = setMatch[1].toLowerCase();
|
||||||
const SET_ALLOWED = {
|
const SET_ALLOWED = {
|
||||||
name: 'string', description: 'string', logo: 'string',
|
name: 'string', description: 'string', logo: 'string',
|
||||||
@@ -692,7 +531,6 @@ jobs:
|
|||||||
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + setPatchRes.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + setPatchRes.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
await revalidate(slug);
|
|
||||||
const preview = codeBlockValue.length > 300 ? codeBlockValue.substring(0, 300) + '…' : codeBlockValue;
|
const preview = codeBlockValue.length > 300 ? codeBlockValue.substring(0, 300) + '…' : codeBlockValue;
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -703,6 +541,11 @@ jobs:
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// ── FIELD=VALUE PATH ─────────────────────────────────────────────
|
// ── FIELD=VALUE PATH ─────────────────────────────────────────────
|
||||||
|
const fieldsStr = rest;
|
||||||
|
|
||||||
|
// Skipped: slug, script_created/updated, created (auto), categories/
|
||||||
|
// install_methods/notes/type (relations), github_data/install_methods_json/
|
||||||
|
// notes_json (auto-generated), execute_in (select relation), last_update_commit (auto)
|
||||||
const ALLOWED_FIELDS = {
|
const ALLOWED_FIELDS = {
|
||||||
name: 'string',
|
name: 'string',
|
||||||
description: 'string',
|
description: 'string',
|
||||||
@@ -725,7 +568,39 @@ jobs:
|
|||||||
deleted_message: 'string',
|
deleted_message: 'string',
|
||||||
};
|
};
|
||||||
|
|
||||||
const parsedFields = parseKVPairs(rest);
|
// Field=value parser (handles quoted values and empty=null)
|
||||||
|
function parseFields(str) {
|
||||||
|
const fields = {};
|
||||||
|
let pos = 0;
|
||||||
|
while (pos < str.length) {
|
||||||
|
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
||||||
|
if (pos >= str.length) break;
|
||||||
|
let keyStart = pos;
|
||||||
|
while (pos < str.length && str[pos] !== '=' && !/\s/.test(str[pos])) pos++;
|
||||||
|
const key = str.substring(keyStart, pos).trim();
|
||||||
|
if (!key || pos >= str.length || str[pos] !== '=') { pos++; continue; }
|
||||||
|
pos++;
|
||||||
|
let value;
|
||||||
|
if (str[pos] === '"') {
|
||||||
|
pos++;
|
||||||
|
let valStart = pos;
|
||||||
|
while (pos < str.length && str[pos] !== '"') {
|
||||||
|
if (str[pos] === '\\') pos++;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
value = str.substring(valStart, pos).replace(/\\"/g, '"');
|
||||||
|
if (pos < str.length) pos++;
|
||||||
|
} else {
|
||||||
|
let valStart = pos;
|
||||||
|
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
||||||
|
value = str.substring(valStart, pos);
|
||||||
|
}
|
||||||
|
fields[key] = value;
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedFields = parseFields(fieldsStr);
|
||||||
|
|
||||||
const unknownFields = Object.keys(parsedFields).filter(function (f) { return !ALLOWED_FIELDS[f]; });
|
const unknownFields = Object.keys(parsedFields).filter(function (f) { return !ALLOWED_FIELDS[f]; });
|
||||||
if (unknownFields.length > 0) {
|
if (unknownFields.length > 0) {
|
||||||
@@ -780,7 +655,6 @@ jobs:
|
|||||||
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + patchRes.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + patchRes.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
await revalidate(slug);
|
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
const changesLines = Object.entries(payload)
|
const changesLines = Object.entries(payload)
|
||||||
.map(function ([k, v]) { return '- `' + k + '` → `' + JSON.stringify(v) + '`'; })
|
.map(function ([k, v]) { return '- `' + k + '` → `' + JSON.stringify(v) + '`'; })
|
||||||
|
|||||||
1
.github/workflows/push-json-to-pocketbase.yml
generated
vendored
1
.github/workflows/push-json-to-pocketbase.yml
generated
vendored
@@ -170,6 +170,7 @@ jobs:
|
|||||||
website: data.website,
|
website: data.website,
|
||||||
logo: data.logo,
|
logo: data.logo,
|
||||||
description: data.description,
|
description: data.description,
|
||||||
|
config_path: data.config_path,
|
||||||
default_user: (data.default_credentials && data.default_credentials.username) || data.default_user || null,
|
default_user: (data.default_credentials && data.default_credentials.username) || data.default_user || null,
|
||||||
default_passwd: (data.default_credentials && data.default_credentials.password) || data.default_passwd || null,
|
default_passwd: (data.default_credentials && data.default_credentials.password) || data.default_passwd || null,
|
||||||
is_dev: false
|
is_dev: false
|
||||||
|
|||||||
43
.gitignore
vendored
43
.gitignore
vendored
@@ -2,14 +2,32 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
# Editor & IDE files
|
# Editor & IDE files (keeping .vscode settings but ignoring unnecessary metadata)
|
||||||
!.vscode/
|
!.vscode/
|
||||||
.vscode/*.workspace
|
.vscode/*.workspace
|
||||||
.vscode/*.tmp
|
.vscode/*.tmp
|
||||||
|
|
||||||
# Log files
|
# Log and Cache files
|
||||||
logs/
|
logs/
|
||||||
*.log
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Python-specific exclusions
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
*.venv/
|
||||||
|
venv/
|
||||||
|
env/
|
||||||
|
*.env
|
||||||
|
|
||||||
|
# API and Backend specific exclusions
|
||||||
|
api/.env
|
||||||
|
api/__pycache__/
|
||||||
|
api/*.sqlite3
|
||||||
|
|
||||||
# Install scripts and temporary files
|
# Install scripts and temporary files
|
||||||
install/tmp/
|
install/tmp/
|
||||||
@@ -23,7 +41,7 @@ vm/*.vmdk
|
|||||||
vm/*.iso
|
vm/*.iso
|
||||||
vm/*.bak
|
vm/*.bak
|
||||||
|
|
||||||
# Miscellaneous temporary files
|
# Miscellaneous temporary or unnecessary files
|
||||||
*.bak
|
*.bak
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
@@ -31,7 +49,22 @@ vm/*.bak
|
|||||||
*.tmp
|
*.tmp
|
||||||
*.backup
|
*.backup
|
||||||
|
|
||||||
# JSON temporary files
|
# JSON configuration backups
|
||||||
json/
|
|
||||||
json/*.bak
|
json/*.bak
|
||||||
json/*.tmp
|
json/*.tmp
|
||||||
|
json/.vscode/
|
||||||
|
|
||||||
|
# Ignore compiled binaries or packaged artifacts
|
||||||
|
*.exe
|
||||||
|
*.dll
|
||||||
|
*.bin
|
||||||
|
*.deb
|
||||||
|
*.rpm
|
||||||
|
*.tar.gz
|
||||||
|
*.zip
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Ignore repository metadata or Git itself
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.vscode/settings.json
|
||||||
|
|||||||
16
.vscode/.editorconfig
generated
vendored
Normal file
16
.vscode/.editorconfig
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
; editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
continuation_indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
max_line_length = 120
|
||||||
|
tab_width = 2
|
||||||
|
; trim_trailing_whitespace = true ; disabled until files are cleaned up
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
0
.shellcheckrc → .vscode/.shellcheckrc
generated
vendored
0
.shellcheckrc → .vscode/.shellcheckrc
generated
vendored
941
CHANGELOG.md
941
CHANGELOG.md
@@ -26,15 +26,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -54,14 +45,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><h4>April (18 entries)</h4></summary>
|
<summary><h4>March (28 entries)</h4></summary>
|
||||||
|
|
||||||
[View April 2026 Changelog](.github/changelogs/2026/04.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>March (31 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View March 2026 Changelog](.github/changelogs/2026/03.md)
|
[View March 2026 Changelog](.github/changelogs/2026/03.md)
|
||||||
|
|
||||||
@@ -445,378 +429,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 2026-04-23
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: hotfix - prefer silent mode on PHS env conflict [@MickLesk](https://github.com/MickLesk) ([#13951](https://github.com/community-scripts/ProxmoxVE/pull/13951))
|
|
||||||
|
|
||||||
## 2026-04-22
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Dashy ([#13817](https://github.com/community-scripts/ProxmoxVE/pull/13817))
|
|
||||||
- Mini-QR ([#13902](https://github.com/community-scripts/ProxmoxVE/pull/13902))
|
|
||||||
- ownfoil ([#13904](https://github.com/community-scripts/ProxmoxVE/pull/13904))
|
|
||||||
- ERPNext ([#13921](https://github.com/community-scripts/ProxmoxVE/pull/13921))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- add --clear to uv venv in update_script() to prevent interactive prompt [@MickLesk](https://github.com/MickLesk) ([#13926](https://github.com/community-scripts/ProxmoxVE/pull/13926))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: Add PHS_VERBOSE env var to skip verbose mode prompts [@gormanity](https://github.com/gormanity) ([#13797](https://github.com/community-scripts/ProxmoxVE/pull/13797))
|
|
||||||
|
|
||||||
## 2026-04-21
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- gogs ([#13896](https://github.com/community-scripts/ProxmoxVE/pull/13896))
|
|
||||||
- anchor ([#13895](https://github.com/community-scripts/ProxmoxVE/pull/13895))
|
|
||||||
- minthcm ([#13903](https://github.com/community-scripts/ProxmoxVE/pull/13903))
|
|
||||||
- foldergram ([#13900](https://github.com/community-scripts/ProxmoxVE/pull/13900))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- OpenCloud: Pin version to 6.1.0 [@vhsdream](https://github.com/vhsdream) ([#13890](https://github.com/community-scripts/ProxmoxVE/pull/13890))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Domain-Locker: Update dependencies [@tremor021](https://github.com/tremor021) ([#13901](https://github.com/community-scripts/ProxmoxVE/pull/13901))
|
|
||||||
- homelable: fix install failure by correcting password-reset chmod target [@Copilot](https://github.com/Copilot) ([#13894](https://github.com/community-scripts/ProxmoxVE/pull/13894))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- FileFlows: Update dependencies [@tremor021](https://github.com/tremor021) ([#13917](https://github.com/community-scripts/ProxmoxVE/pull/13917))
|
|
||||||
|
|
||||||
## 2026-04-20
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- WhoDB ([#13880](https://github.com/community-scripts/ProxmoxVE/pull/13880))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- pangolin: create migration tables before data transfer to prevent role loss [@MickLesk](https://github.com/MickLesk) ([#13874](https://github.com/community-scripts/ProxmoxVE/pull/13874))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Pangolin: pre-apply schema migrations to prevent data loss [@MickLesk](https://github.com/MickLesk) ([#13861](https://github.com/community-scripts/ProxmoxVE/pull/13861))
|
|
||||||
- ActualBudget: change migration messages to warnings [@MickLesk](https://github.com/MickLesk) ([#13860](https://github.com/community-scripts/ProxmoxVE/pull/13860))
|
|
||||||
- slskd: migrate config keys for 0.25.0 breaking change [@MickLesk](https://github.com/MickLesk) ([#13862](https://github.com/community-scripts/ProxmoxVE/pull/13862))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Wanderer: add pocketbase CLI wrapper with env [@MickLesk](https://github.com/MickLesk) ([#13863](https://github.com/community-scripts/ProxmoxVE/pull/13863))
|
|
||||||
- feat(homelable): add password reset utility script [@davidsoncabista](https://github.com/davidsoncabista) ([#13798](https://github.com/community-scripts/ProxmoxVE/pull/13798))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Several Scripts: Bump NodeJS to align Node.js versions with upstream for 5 scripts [@MickLesk](https://github.com/MickLesk) ([#13875](https://github.com/community-scripts/ProxmoxVE/pull/13875))
|
|
||||||
- Refactor: PMG Post Install [@MickLesk](https://github.com/MickLesk) ([#13693](https://github.com/community-scripts/ProxmoxVE/pull/13693))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: detect Perl breakage after LXC stack upgrade and improve storage validation [@MickLesk](https://github.com/MickLesk) ([#13879](https://github.com/community-scripts/ProxmoxVE/pull/13879))
|
|
||||||
|
|
||||||
## 2026-04-19
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- nametag ([#13849](https://github.com/community-scripts/ProxmoxVE/pull/13849))
|
|
||||||
|
|
||||||
## 2026-04-18
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Dagu ([#13830](https://github.com/community-scripts/ProxmoxVE/pull/13830))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- BabyBuddy: set DJANGO_SETTINGS_MODULE before migrate in update [@MickLesk](https://github.com/MickLesk) ([#13836](https://github.com/community-scripts/ProxmoxVE/pull/13836))
|
|
||||||
- litellm: add prisma generate and use venv binary directly [@MickLesk](https://github.com/MickLesk) ([#13835](https://github.com/community-scripts/ProxmoxVE/pull/13835))
|
|
||||||
- yamtrack: add missing nginx.conf sed edits to update script [@MickLesk](https://github.com/MickLesk) ([#13834](https://github.com/community-scripts/ProxmoxVE/pull/13834))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- SparkyFitness Garmin Microservice: fix update function [@tomfrenzel](https://github.com/tomfrenzel) ([#13824](https://github.com/community-scripts/ProxmoxVE/pull/13824))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Clean-Orphan-LVM: check all cluster nodes for VM/CT configs [@MickLesk](https://github.com/MickLesk) ([#13837](https://github.com/community-scripts/ProxmoxVE/pull/13837))
|
|
||||||
|
|
||||||
## 2026-04-17
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- step-ca ([#13775](https://github.com/community-scripts/ProxmoxVE/pull/13775))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: pin IGC version to compute-runtime compatible tag (Intel GPU) [@MickLesk](https://github.com/MickLesk) ([#13814](https://github.com/community-scripts/ProxmoxVE/pull/13814))
|
|
||||||
- Fix for bambuddy community script update [@abbasegbeyemi](https://github.com/abbasegbeyemi) ([#13816](https://github.com/community-scripts/ProxmoxVE/pull/13816))
|
|
||||||
- Umami: Fix update procedure [@tremor021](https://github.com/tremor021) ([#13807](https://github.com/community-scripts/ProxmoxVE/pull/13807))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: sanitize mount_fs input — strip spaces and trailing commas [@MickLesk](https://github.com/MickLesk) ([#13806](https://github.com/community-scripts/ProxmoxVE/pull/13806))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: fix some pct create issues (telemetry) + cleanup [@MickLesk](https://github.com/MickLesk) ([#13810](https://github.com/community-scripts/ProxmoxVE/pull/13810))
|
|
||||||
|
|
||||||
## 2026-04-16
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Add pnpm as a dependency to ghost-cli install [@YourFavoriteKyle](https://github.com/YourFavoriteKyle) ([#13789](https://github.com/community-scripts/ProxmoxVE/pull/13789))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: wire ENABLE_MKNOD and ALLOW_MOUNT_FS into LXC features [@MickLesk](https://github.com/MickLesk) ([#13796](https://github.com/community-scripts/ProxmoxVE/pull/13796))
|
|
||||||
|
|
||||||
## 2026-04-15
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- iGotify ([#13773](https://github.com/community-scripts/ProxmoxVE/pull/13773))
|
|
||||||
- GitHub-Runner ([#13709](https://github.com/community-scripts/ProxmoxVE/pull/13709))
|
|
||||||
- Revert "Remove low-install-count CT scripts and installers (#13570)" [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13752](https://github.com/community-scripts/ProxmoxVE/pull/13752))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- [alpine-nextcloud] Update Nginx MIME types to support .mjs files [@GuiltyFox](https://github.com/GuiltyFox) ([#13771](https://github.com/community-scripts/ProxmoxVE/pull/13771))
|
|
||||||
- Domain Monitor: Fix file ownership after update [@tremor021](https://github.com/tremor021) ([#13759](https://github.com/community-scripts/ProxmoxVE/pull/13759))
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- Reitti: refactor scripts for v4 - remove RabbitMQ and Photon [@MickLesk](https://github.com/MickLesk) ([#13728](https://github.com/community-scripts/ProxmoxVE/pull/13728))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Semaphore: add BoltDB to SQLite migration [@tremor021](https://github.com/tremor021) ([#13779](https://github.com/community-scripts/ProxmoxVE/pull/13779))
|
|
||||||
|
|
||||||
### 📚 Documentation
|
|
||||||
|
|
||||||
- cleanup: remove docs/, update README & CONTRIBUTING, fix repo config [@MickLesk](https://github.com/MickLesk) ([#13770](https://github.com/community-scripts/ProxmoxVE/pull/13770))
|
|
||||||
|
|
||||||
## 2026-04-14
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- Immich: Pin photo-processing library revisions [@vhsdream](https://github.com/vhsdream) ([#13748](https://github.com/community-scripts/ProxmoxVE/pull/13748))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- BentoPDF: Nginx fixes [@tremor021](https://github.com/tremor021) ([#13741](https://github.com/community-scripts/ProxmoxVE/pull/13741))
|
|
||||||
- Zerobyte: add git to dependencies to fix bun install failure [@Copilot](https://github.com/Copilot) ([#13721](https://github.com/community-scripts/ProxmoxVE/pull/13721))
|
|
||||||
- alpine-nextcloud-install: do not use deprecated nginx config [@AlexanderStein](https://github.com/AlexanderStein) ([#13726](https://github.com/community-scripts/ProxmoxVE/pull/13726))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Mealie: support v3.15+ Nuxt 4 migration [@MickLesk](https://github.com/MickLesk) ([#13731](https://github.com/community-scripts/ProxmoxVE/pull/13731))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Lyrion: correct service name and version file in update script [@MickLesk](https://github.com/MickLesk) ([#13734](https://github.com/community-scripts/ProxmoxVE/pull/13734))
|
|
||||||
- Changedetection: move env vars from service file to .env [@tremor021](https://github.com/tremor021) ([#13732](https://github.com/community-scripts/ProxmoxVE/pull/13732))
|
|
||||||
|
|
||||||
## 2026-04-13
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Slskd: Remove stale Soularr lock file on startup and redirect logs to stderr [@MickLesk](https://github.com/MickLesk) ([#13669](https://github.com/community-scripts/ProxmoxVE/pull/13669))
|
|
||||||
- Bambuddy: preserve database and archive on update [@Copilot](https://github.com/Copilot) ([#13706](https://github.com/community-scripts/ProxmoxVE/pull/13706))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Immich: Pin version to 2.7.5 [@vhsdream](https://github.com/vhsdream) ([#13715](https://github.com/community-scripts/ProxmoxVE/pull/13715))
|
|
||||||
- Bytestash: auto backup/restore data on update [@MickLesk](https://github.com/MickLesk) ([#13707](https://github.com/community-scripts/ProxmoxVE/pull/13707))
|
|
||||||
- OpenCloud: pin version to 6.0.0 [@vhsdream](https://github.com/vhsdream) ([#13691](https://github.com/community-scripts/ProxmoxVE/pull/13691))
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- Mealie: pin version to v3.14.0 in install and update scripts [@Copilot](https://github.com/Copilot) ([#13724](https://github.com/community-scripts/ProxmoxVE/pull/13724))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: remove unused TEMP_DIR mktemp leak in build_container / clean sonarqube [@MickLesk](https://github.com/MickLesk) ([#13708](https://github.com/community-scripts/ProxmoxVE/pull/13708))
|
|
||||||
|
|
||||||
## 2026-04-12
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Alpine-Wakapi: Remove container checks in update_script function [@MickLesk](https://github.com/MickLesk) ([#13694](https://github.com/community-scripts/ProxmoxVE/pull/13694))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- IronClaw: Install keychain dependencies and launch in a DBus session [@MickLesk](https://github.com/MickLesk) ([#13692](https://github.com/community-scripts/ProxmoxVE/pull/13692))
|
|
||||||
- MeTube: Allow pnpm build scripts to fix ERR_PNPM_IGNORED_BUILDS [@MickLesk](https://github.com/MickLesk) ([#13668](https://github.com/community-scripts/ProxmoxVE/pull/13668))
|
|
||||||
|
|
||||||
## 2026-04-11
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Immich: Ensure newline before appending IMMICH_HELMET_FILE to .env [@MickLesk](https://github.com/MickLesk) ([#13667](https://github.com/community-scripts/ProxmoxVE/pull/13667))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- BentoPDF: replace http-server with nginx to fix WASM initialization timeout [@MickLesk](https://github.com/MickLesk) ([#13625](https://github.com/community-scripts/ProxmoxVE/pull/13625))
|
|
||||||
- Element Synapse: Add MatrixRTC configuration for Element Call support [@MickLesk](https://github.com/MickLesk) ([#13665](https://github.com/community-scripts/ProxmoxVE/pull/13665))
|
|
||||||
- RomM: Use ROMM_BASE_PATH from .env for symlinks and nginx config [@MickLesk](https://github.com/MickLesk) ([#13666](https://github.com/community-scripts/ProxmoxVE/pull/13666))
|
|
||||||
- Immich: Pin version to 2.7.4 [@vhsdream](https://github.com/vhsdream) ([#13661](https://github.com/community-scripts/ProxmoxVE/pull/13661))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Crafty Controller: Wait for credentials file instead of fixed sleep [@MickLesk](https://github.com/MickLesk) ([#13670](https://github.com/community-scripts/ProxmoxVE/pull/13670))
|
|
||||||
- Refactor: Alpine-Wakapi [@tremor021](https://github.com/tremor021) ([#13656](https://github.com/community-scripts/ProxmoxVE/pull/13656))
|
|
||||||
|
|
||||||
## 2026-04-10
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- fix: ensure trailing newline in redis.conf before appending bind directive [@Copilot](https://github.com/Copilot) ([#13647](https://github.com/community-scripts/ProxmoxVE/pull/13647))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Immich: Pin version to 2.7.3 [@vhsdream](https://github.com/vhsdream) ([#13631](https://github.com/community-scripts/ProxmoxVE/pull/13631))
|
|
||||||
- Homarr: bind Redis to localhost only [@MickLesk](https://github.com/MickLesk) ([#13552](https://github.com/community-scripts/ProxmoxVE/pull/13552))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- tools.func: prevent script crash when entering GitHub token after rate limit [@MickLesk](https://github.com/MickLesk) ([#13638](https://github.com/community-scripts/ProxmoxVE/pull/13638))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- addons: Filebrowser & Filebrowser-Quantum get warning if host install [@MickLesk](https://github.com/MickLesk) ([#13639](https://github.com/community-scripts/ProxmoxVE/pull/13639))
|
|
||||||
|
|
||||||
## 2026-04-09
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- boostack: add: git [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13620](https://github.com/community-scripts/ProxmoxVE/pull/13620))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Update OPNsense version from 25.7 to 26.1 [@tdn131](https://github.com/tdn131) ([#13626](https://github.com/community-scripts/ProxmoxVE/pull/13626))
|
|
||||||
- CheckMK: Bump Default OS to 13 (trixie) + dynamic codename + fix RELEASE-Tag Fetching [@MickLesk](https://github.com/MickLesk) ([#13610](https://github.com/community-scripts/ProxmoxVE/pull/13610))
|
|
||||||
|
|
||||||
## 2026-04-08
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- IronClaw | Alpine-IronClaw ([#13591](https://github.com/community-scripts/ProxmoxVE/pull/13591))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- immich: disable upgrade-insecure-requests CSP directive [@MickLesk](https://github.com/MickLesk) ([#13600](https://github.com/community-scripts/ProxmoxVE/pull/13600))
|
|
||||||
- Immich: v2.7.2 [@vhsdream](https://github.com/vhsdream) ([#13579](https://github.com/community-scripts/ProxmoxVE/pull/13579))
|
|
||||||
- Update flaresolverr-install.sh [@maztheman](https://github.com/maztheman) ([#13584](https://github.com/community-scripts/ProxmoxVE/pull/13584))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- bambuddy: add mkdir before data restore & add ffmpeg dependency [@MickLesk](https://github.com/MickLesk) ([#13601](https://github.com/community-scripts/ProxmoxVE/pull/13601))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- feat: update UHF Server script to use setup_ffmpeg [@zackwithak13](https://github.com/zackwithak13) ([#13564](https://github.com/community-scripts/ProxmoxVE/pull/13564))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: add script page badges to descriptions | change donate URL [@MickLesk](https://github.com/MickLesk) ([#13596](https://github.com/community-scripts/ProxmoxVE/pull/13596))
|
|
||||||
|
|
||||||
## 2026-04-07
|
|
||||||
|
|
||||||
### 🗑️ Deleted Scripts
|
|
||||||
|
|
||||||
- Remove low-install-count CT scripts and installers [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#13570](https://github.com/community-scripts/ProxmoxVE/pull/13570))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: improve resilience for top Proxmox error codes (209, 215, 118, 206) [@MickLesk](https://github.com/MickLesk) ([#13575](https://github.com/community-scripts/ProxmoxVE/pull/13575))
|
|
||||||
|
|
||||||
## 2026-04-06
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- OpenThread Border Router ([#13536](https://github.com/community-scripts/ProxmoxVE/pull/13536))
|
|
||||||
- Homelable ([#13539](https://github.com/community-scripts/ProxmoxVE/pull/13539))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Papra: check env before copy [@MickLesk](https://github.com/MickLesk) ([#13553](https://github.com/community-scripts/ProxmoxVE/pull/13553))
|
|
||||||
- changedetection: fix: typing_extensions error [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13548](https://github.com/community-scripts/ProxmoxVE/pull/13548))
|
|
||||||
- kasm: fix: fetch latest version [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13547](https://github.com/community-scripts/ProxmoxVE/pull/13547))
|
|
||||||
|
|
||||||
## 2026-04-05
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Grist: remove install:ee step (private repo, not needed for grist-core) [@MickLesk](https://github.com/MickLesk) ([#13526](https://github.com/community-scripts/ProxmoxVE/pull/13526))
|
|
||||||
- Nginx Proxy Manager: ensure /tmp/nginx/body exists via openresty service [@MickLesk](https://github.com/MickLesk) ([#13528](https://github.com/community-scripts/ProxmoxVE/pull/13528))
|
|
||||||
- MotionEye: run as root to enable SMB share support [@MickLesk](https://github.com/MickLesk) ([#13527](https://github.com/community-scripts/ProxmoxVE/pull/13527))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: silent() function - use return instead of exit to allow || true error handling [@MickLesk](https://github.com/MickLesk) ([#13529](https://github.com/community-scripts/ProxmoxVE/pull/13529))
|
|
||||||
|
|
||||||
## 2026-04-04
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- komodo: set `PERIPHERY_CORE_PUBLIC_KEYS` to default value if absent [@4ndv](https://github.com/4ndv) ([#13519](https://github.com/community-scripts/ProxmoxVE/pull/13519))
|
|
||||||
|
|
||||||
## 2026-04-03
|
## 2026-04-03
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
@@ -825,32 +437,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- OpenWRT-VM: use poweroff instead of halt to properly stop VM [@MickLesk](https://github.com/MickLesk) ([#13504](https://github.com/community-scripts/ProxmoxVE/pull/13504))
|
|
||||||
- NginxProxyManager: fix openresty restart by setting user root before reload [@MickLesk](https://github.com/MickLesk) ([#13500](https://github.com/community-scripts/ProxmoxVE/pull/13500))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
- #### ✨ New Features
|
||||||
|
|
||||||
- Crafty Controller: add Java 25 for Minecraft 1.26.1+ [@MickLesk](https://github.com/MickLesk) ([#13502](https://github.com/community-scripts/ProxmoxVE/pull/13502))
|
|
||||||
- Wealthfolio: update to v3.2.1 and Node.js 24 [@afadil](https://github.com/afadil) ([#13486](https://github.com/community-scripts/ProxmoxVE/pull/13486))
|
- Wealthfolio: update to v3.2.1 and Node.js 24 [@afadil](https://github.com/afadil) ([#13486](https://github.com/community-scripts/ProxmoxVE/pull/13486))
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core.func: prevent profile.d scripts from aborting on non-zero exit [@MickLesk](https://github.com/MickLesk) ([#13503](https://github.com/community-scripts/ProxmoxVE/pull/13503))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- APT Proxy: Support full URLs (http/https with custom ports) [@MickLesk](https://github.com/MickLesk) ([#13474](https://github.com/community-scripts/ProxmoxVE/pull/13474))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- PVE LXC-Updater: pipe apt list through cat to prevent pager hang [@MickLesk](https://github.com/MickLesk) ([#13501](https://github.com/community-scripts/ProxmoxVE/pull/13501))
|
|
||||||
|
|
||||||
## 2026-04-02
|
## 2026-04-02
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
@@ -1110,4 +700,531 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🔧 Refactor
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
- Harden code-server addon install script [@MickLesk](https://github.com/MickLesk) ([#13116](https://github.com/community-scripts/ProxmoxVE/pull/13116))
|
- Harden code-server addon install script [@MickLesk](https://github.com/MickLesk) ([#13116](https://github.com/community-scripts/ProxmoxVE/pull/13116))
|
||||||
|
|
||||||
|
## 2026-03-19
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Owncast: increase default disk size from 2GB to 10GB [@Copilot](https://github.com/Copilot) ([#13079](https://github.com/community-scripts/ProxmoxVE/pull/13079))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: remove extra backslash to match single quoted here-doc [@Zelnes](https://github.com/Zelnes) ([#13108](https://github.com/community-scripts/ProxmoxVE/pull/13108))
|
||||||
|
- Reactive-Resume: Upgrade Node to 24 and enable Corepack [@MickLesk](https://github.com/MickLesk) ([#13093](https://github.com/community-scripts/ProxmoxVE/pull/13093))
|
||||||
|
- Increase Tracearr RAM; derive APP_VERSION [@MickLesk](https://github.com/MickLesk) ([#13087](https://github.com/community-scripts/ProxmoxVE/pull/13087))
|
||||||
|
- ProjectSend: Update application access URL [@tremor021](https://github.com/tremor021) ([#13078](https://github.com/community-scripts/ProxmoxVE/pull/13078))
|
||||||
|
- Dispatcharr: use npm install --no-audit --progress=false [@MickLesk](https://github.com/MickLesk) ([#13074](https://github.com/community-scripts/ProxmoxVE/pull/13074))
|
||||||
|
- core: reorder hwaccel setup and adjust GPU group usermod [@MickLesk](https://github.com/MickLesk) ([#13072](https://github.com/community-scripts/ProxmoxVE/pull/13072))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: display pin reason in release-check messages [@MickLesk](https://github.com/MickLesk) ([#13095](https://github.com/community-scripts/ProxmoxVE/pull/13095))
|
||||||
|
- NocoDB: Unpin Version to latest [@MickLesk](https://github.com/MickLesk) ([#13094](https://github.com/community-scripts/ProxmoxVE/pull/13094))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools.func: use dpkg-query for reliable JDK version detection [@MickLesk](https://github.com/MickLesk) ([#13101](https://github.com/community-scripts/ProxmoxVE/pull/13101))
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
|
||||||
|
- Update link from helper-scripts.com to community-scripts.org [@adnanvaldes](https://github.com/adnanvaldes) ([#13098](https://github.com/community-scripts/ProxmoxVE/pull/13098))
|
||||||
|
- github: add PocketBase bot workflow [@MickLesk](https://github.com/MickLesk) ([#13075](https://github.com/community-scripts/ProxmoxVE/pull/13075))
|
||||||
|
|
||||||
|
## 2026-03-18
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Alpine-Ntfy [@MickLesk](https://github.com/MickLesk) ([#13048](https://github.com/community-scripts/ProxmoxVE/pull/13048))
|
||||||
|
- Split-Pro ([#12975](https://github.com/community-scripts/ProxmoxVE/pull/12975))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Tdarr: use curl_with_retry and correct exit code [@MickLesk](https://github.com/MickLesk) ([#13060](https://github.com/community-scripts/ProxmoxVE/pull/13060))
|
||||||
|
- reitti: fix: v4 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#13039](https://github.com/community-scripts/ProxmoxVE/pull/13039))
|
||||||
|
- Paperless-NGX: increase default RAM to 3GB [@MickLesk](https://github.com/MickLesk) ([#13018](https://github.com/community-scripts/ProxmoxVE/pull/13018))
|
||||||
|
- Plex: restart service after update to apply new version [@MickLesk](https://github.com/MickLesk) ([#13017](https://github.com/community-scripts/ProxmoxVE/pull/13017))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools: centralize GPU group setup via setup_hwaccel [@MickLesk](https://github.com/MickLesk) ([#13044](https://github.com/community-scripts/ProxmoxVE/pull/13044))
|
||||||
|
- Termix: add guacd build and systemd integration [@MickLesk](https://github.com/MickLesk) ([#12999](https://github.com/community-scripts/ProxmoxVE/pull/12999))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Podman: replace deprecated commands with Quadlets [@MickLesk](https://github.com/MickLesk) ([#13052](https://github.com/community-scripts/ProxmoxVE/pull/13052))
|
||||||
|
- Refactor: Jellyfin repo, ffmpeg package and symlinks [@MickLesk](https://github.com/MickLesk) ([#13045](https://github.com/community-scripts/ProxmoxVE/pull/13045))
|
||||||
|
- pve-scripts-local: Increase default disk size from 4GB to 10GB [@MickLesk](https://github.com/MickLesk) ([#13009](https://github.com/community-scripts/ProxmoxVE/pull/13009))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func Implement pg_cron setup for setup_postgresql [@MickLesk](https://github.com/MickLesk) ([#13053](https://github.com/community-scripts/ProxmoxVE/pull/13053))
|
||||||
|
- tools.func: Implement check_for_gh_tag function [@MickLesk](https://github.com/MickLesk) ([#12998](https://github.com/community-scripts/ProxmoxVE/pull/12998))
|
||||||
|
- tools.func: Implement fetch_and_deploy_gh_tag function [@MickLesk](https://github.com/MickLesk) ([#13000](https://github.com/community-scripts/ProxmoxVE/pull/13000))
|
||||||
|
|
||||||
|
## 2026-03-17
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Gluetun: add OpenVPN process user and cleanup stale config [@MickLesk](https://github.com/MickLesk) ([#13016](https://github.com/community-scripts/ProxmoxVE/pull/13016))
|
||||||
|
- Frigate: check OpenVino model files exist before configuring detector and use curl_with_retry instead of default wget [@MickLesk](https://github.com/MickLesk) ([#13019](https://github.com/community-scripts/ProxmoxVE/pull/13019))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- tools.func: Update `create_self_signed_cert()` [@tremor021](https://github.com/tremor021) ([#13008](https://github.com/community-scripts/ProxmoxVE/pull/13008))
|
||||||
|
|
||||||
|
## 2026-03-16
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Gluetun ([#12976](https://github.com/community-scripts/ProxmoxVE/pull/12976))
|
||||||
|
- Anytype-Server ([#12974](https://github.com/community-scripts/ProxmoxVE/pull/12974))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Immich: use gcc-13 for compilation & add uv python pre-install with retry logic [@MickLesk](https://github.com/MickLesk) ([#12935](https://github.com/community-scripts/ProxmoxVE/pull/12935))
|
||||||
|
- Tautulli: add setuptools<81 constraint to update script [@MickLesk](https://github.com/MickLesk) ([#12959](https://github.com/community-scripts/ProxmoxVE/pull/12959))
|
||||||
|
- Seerr: add missing build deps [@MickLesk](https://github.com/MickLesk) ([#12960](https://github.com/community-scripts/ProxmoxVE/pull/12960))
|
||||||
|
- fix: yubal update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12961](https://github.com/community-scripts/ProxmoxVE/pull/12961))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- hwaccel: remove ROCm install from AMD APU setup [@MickLesk](https://github.com/MickLesk) ([#12958](https://github.com/community-scripts/ProxmoxVE/pull/12958))
|
||||||
|
|
||||||
|
## 2026-03-15
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Yamtrack ([#12936](https://github.com/community-scripts/ProxmoxVE/pull/12936))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Wishlist: use --frozen-lockfile for pnpm install [@MickLesk](https://github.com/MickLesk) ([#12892](https://github.com/community-scripts/ProxmoxVE/pull/12892))
|
||||||
|
- SparkyFitness: use --legacy-peer-deps for npm install [@MickLesk](https://github.com/MickLesk) ([#12888](https://github.com/community-scripts/ProxmoxVE/pull/12888))
|
||||||
|
- Frigate: add fallback for OpenVino labelmap file [@MickLesk](https://github.com/MickLesk) ([#12889](https://github.com/community-scripts/ProxmoxVE/pull/12889))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: ITSM-NG [@MickLesk](https://github.com/MickLesk) ([#12918](https://github.com/community-scripts/ProxmoxVE/pull/12918))
|
||||||
|
- core: unify RELEASE variable for check_for_gh_release and fetch_and_deploy [@MickLesk](https://github.com/MickLesk) ([#12917](https://github.com/community-scripts/ProxmoxVE/pull/12917))
|
||||||
|
- Standardize NSAPP names across VM scripts [@MickLesk](https://github.com/MickLesk) ([#12924](https://github.com/community-scripts/ProxmoxVE/pull/12924))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: retry downloads with exponential backoff [@MickLesk](https://github.com/MickLesk) ([#12896](https://github.com/community-scripts/ProxmoxVE/pull/12896))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- [go2rtc] Add ffmpeg dependency to install script [@Copilot](https://github.com/Copilot) ([#12944](https://github.com/community-scripts/ProxmoxVE/pull/12944))
|
||||||
|
|
||||||
|
## 2026-03-14
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Patchmon: remove v prefix from pinned version [@MickLesk](https://github.com/MickLesk) ([#12891](https://github.com/community-scripts/ProxmoxVE/pull/12891))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools.func: don't abort on AMD repo apt update failure [@MickLesk](https://github.com/MickLesk) ([#12890](https://github.com/community-scripts/ProxmoxVE/pull/12890))
|
||||||
|
|
||||||
|
## 2026-03-13
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Hotfix: Removed clean install usage from original script. [@nickheyer](https://github.com/nickheyer) ([#12870](https://github.com/community-scripts/ProxmoxVE/pull/12870))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Discopanel: V2 Support + Script rewrite [@nickheyer](https://github.com/nickheyer) ([#12763](https://github.com/community-scripts/ProxmoxVE/pull/12763))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- update-apps: fix restore path, add PBS support and improve restore messages [@omertahaoztop](https://github.com/omertahaoztop) ([#12528](https://github.com/community-scripts/ProxmoxVE/pull/12528))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix(pve-privilege-converter): handle already stopped container in manage_states [@liuqitoday](https://github.com/liuqitoday) ([#12765](https://github.com/community-scripts/ProxmoxVE/pull/12765))
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
|
||||||
|
- Update: Docs/website metadata workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12858](https://github.com/community-scripts/ProxmoxVE/pull/12858))
|
||||||
|
|
||||||
|
## 2026-03-12
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- manyfold: fix incorrect port in upstream requests by forwarding original host [@anlopo](https://github.com/anlopo) ([#12812](https://github.com/community-scripts/ProxmoxVE/pull/12812))
|
||||||
|
- SparkyFitness: install pnpm dependencies from workspace root [@MickLesk](https://github.com/MickLesk) ([#12792](https://github.com/community-scripts/ProxmoxVE/pull/12792))
|
||||||
|
- n8n: add build-essential to update dependencies [@MickLesk](https://github.com/MickLesk) ([#12795](https://github.com/community-scripts/ProxmoxVE/pull/12795))
|
||||||
|
- Frigate openvino labelmap patch [@semtex1987](https://github.com/semtex1987) ([#12751](https://github.com/community-scripts/ProxmoxVE/pull/12751))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Pin Patchmon to 1.4.2 [@vhsdream](https://github.com/vhsdream) ([#12789](https://github.com/community-scripts/ProxmoxVE/pull/12789))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools.func: correct PATH escaping in ROCm profile script [@MickLesk](https://github.com/MickLesk) ([#12793](https://github.com/community-scripts/ProxmoxVE/pull/12793))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: add mode=generated for unattended frontend installs [@MickLesk](https://github.com/MickLesk) ([#12807](https://github.com/community-scripts/ProxmoxVE/pull/12807))
|
||||||
|
- core: validate storage availability when loading defaults [@MickLesk](https://github.com/MickLesk) ([#12794](https://github.com/community-scripts/ProxmoxVE/pull/12794))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- tools.func: support older NVIDIA driver versions with 2 segments (xxx.xxx) [@MickLesk](https://github.com/MickLesk) ([#12796](https://github.com/community-scripts/ProxmoxVE/pull/12796))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Fix PBS microcode naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12834](https://github.com/community-scripts/ProxmoxVE/pull/12834))
|
||||||
|
|
||||||
|
### 📂 Github
|
||||||
|
|
||||||
|
- Cleanup: remove old workflow files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12818](https://github.com/community-scripts/ProxmoxVE/pull/12818))
|
||||||
|
- Cleanup: remove frontend, move JSONs to json/ top-level [@MickLesk](https://github.com/MickLesk) ([#12813](https://github.com/community-scripts/ProxmoxVE/pull/12813))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- Remove json files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12830](https://github.com/community-scripts/ProxmoxVE/pull/12830))
|
||||||
|
|
||||||
|
## 2026-03-11
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: Init telemetry in addon scripts [@MickLesk](https://github.com/MickLesk) ([#12777](https://github.com/community-scripts/ProxmoxVE/pull/12777))
|
||||||
|
- Tracearr: Increase default disk variable from 5 to 10 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12762](https://github.com/community-scripts/ProxmoxVE/pull/12762))
|
||||||
|
- Fix Wireguard Dashboard update [@odin568](https://github.com/odin568) ([#12767](https://github.com/community-scripts/ProxmoxVE/pull/12767))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Coder-Code-Server: Check if config file exists [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12758](https://github.com/community-scripts/ProxmoxVE/pull/12758))
|
||||||
|
|
||||||
|
## 2026-03-10
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [Fix] Immich: Pin libvips to 8.17.3 [@vhsdream](https://github.com/vhsdream) ([#12744](https://github.com/community-scripts/ProxmoxVE/pull/12744))
|
||||||
|
|
||||||
|
## 2026-03-09
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Pin Opencloud to 5.2.0 [@vhsdream](https://github.com/vhsdream) ([#12721](https://github.com/community-scripts/ProxmoxVE/pull/12721))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [Hotfix] qBittorrent: Disable UPnP port forwarding by default [@vhsdream](https://github.com/vhsdream) ([#12728](https://github.com/community-scripts/ProxmoxVE/pull/12728))
|
||||||
|
- [Quickfix] Opencloud: ensure correct case for binary [@vhsdream](https://github.com/vhsdream) ([#12729](https://github.com/community-scripts/ProxmoxVE/pull/12729))
|
||||||
|
- Omada: Bump libssl [@MickLesk](https://github.com/MickLesk) ([#12724](https://github.com/community-scripts/ProxmoxVE/pull/12724))
|
||||||
|
- openwebui: Ensure required dependencies [@MickLesk](https://github.com/MickLesk) ([#12717](https://github.com/community-scripts/ProxmoxVE/pull/12717))
|
||||||
|
- Frigate: try an OpenVino model build fallback [@MickLesk](https://github.com/MickLesk) ([#12704](https://github.com/community-scripts/ProxmoxVE/pull/12704))
|
||||||
|
- Change cronjob setup to use www-data user [@opastorello](https://github.com/opastorello) ([#12695](https://github.com/community-scripts/ProxmoxVE/pull/12695))
|
||||||
|
- RustDesk Server: Fix check_for_gh_release function call [@tremor021](https://github.com/tremor021) ([#12694](https://github.com/community-scripts/ProxmoxVE/pull/12694))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- feat: improve zigbee2mqtt backup handler [@MickLesk](https://github.com/MickLesk) ([#12714](https://github.com/community-scripts/ProxmoxVE/pull/12714))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- Reactive Resume: rewrite for v5 using original repo amruthpilla/reactive-resume [@MickLesk](https://github.com/MickLesk) ([#12705](https://github.com/community-scripts/ProxmoxVE/pull/12705))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools: add Alpine (apk) support to ensure_dependencies and is_package_installed [@MickLesk](https://github.com/MickLesk) ([#12703](https://github.com/community-scripts/ProxmoxVE/pull/12703))
|
||||||
|
- tools.func: extend hwaccel with ROCm [@MickLesk](https://github.com/MickLesk) ([#12707](https://github.com/community-scripts/ProxmoxVE/pull/12707))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- feat: add CopycatWarningToast component for user warnings [@BramSuurdje](https://github.com/BramSuurdje) ([#12733](https://github.com/community-scripts/ProxmoxVE/pull/12733))
|
||||||
|
|
||||||
|
## 2026-03-08
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [Fix] Immich: chown install dir before machine-learning update [@vhsdream](https://github.com/vhsdream) ([#12684](https://github.com/community-scripts/ProxmoxVE/pull/12684))
|
||||||
|
- [Fix] Scanopy: Build generate-fixtures [@vhsdream](https://github.com/vhsdream) ([#12686](https://github.com/community-scripts/ProxmoxVE/pull/12686))
|
||||||
|
- fix: rustdeskserver: use correct repo string [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12682](https://github.com/community-scripts/ProxmoxVE/pull/12682))
|
||||||
|
- NZBGet: Fixes for RAR5 handling [@tremor021](https://github.com/tremor021) ([#12675](https://github.com/community-scripts/ProxmoxVE/pull/12675))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- LXC-Execute: Fix slug [@tremor021](https://github.com/tremor021) ([#12681](https://github.com/community-scripts/ProxmoxVE/pull/12681))
|
||||||
|
|
||||||
|
## 2026-03-07
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- ImmichFrame ([#12653](https://github.com/community-scripts/ProxmoxVE/pull/12653))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Grocy: bump PHP version from 8.3 to 8.5 [@MickLesk](https://github.com/MickLesk) ([#12651](https://github.com/community-scripts/ProxmoxVE/pull/12651))
|
||||||
|
- Check for influxdb3 installation in update_script [@odin568](https://github.com/odin568) ([#12648](https://github.com/community-scripts/ProxmoxVE/pull/12648))
|
||||||
|
- Update Rdtclient to dotnet 10.0 [@asylumexp](https://github.com/asylumexp) ([#12638](https://github.com/community-scripts/ProxmoxVE/pull/12638))
|
||||||
|
- fix(immich): fix update script failing to add Debian testing repo when preferences file already exists [@Copilot](https://github.com/Copilot) ([#12631](https://github.com/community-scripts/ProxmoxVE/pull/12631))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools: add interactive GitHub PAT prompt on rate limit / auth failure [@MickLesk](https://github.com/MickLesk) ([#12652](https://github.com/community-scripts/ProxmoxVE/pull/12652))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 📝 Script Information
|
||||||
|
|
||||||
|
- Papra: update repository URL to papra-hq/papra [@MickLesk](https://github.com/MickLesk) ([#12650](https://github.com/community-scripts/ProxmoxVE/pull/12650))
|
||||||
|
|
||||||
|
## 2026-03-06
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- RustDesk Server: Fix update script [@tremor021](https://github.com/tremor021) ([#12625](https://github.com/community-scripts/ProxmoxVE/pull/12625))
|
||||||
|
- [Node-RED] Restart service after update [@Aurelien30000](https://github.com/Aurelien30000) ([#12621](https://github.com/community-scripts/ProxmoxVE/pull/12621))
|
||||||
|
- wealthfolio: update cors [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12617](https://github.com/community-scripts/ProxmoxVE/pull/12617))
|
||||||
|
- CryptPad: Better update handling [@tremor021](https://github.com/tremor021) ([#12611](https://github.com/community-scripts/ProxmoxVE/pull/12611))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- RustDesk Server: Switch to updated repository [@tremor021](https://github.com/tremor021) ([#12083](https://github.com/community-scripts/ProxmoxVE/pull/12083))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- Semaphore: Move from BoltDB to SQLite [@tremor021](https://github.com/tremor021) ([#12624](https://github.com/community-scripts/ProxmoxVE/pull/12624))
|
||||||
|
|
||||||
|
## 2026-03-05
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- ddclient ([#12587](https://github.com/community-scripts/ProxmoxVE/pull/12587))
|
||||||
|
- Netbird ([#12585](https://github.com/community-scripts/ProxmoxVE/pull/12585))
|
||||||
|
- Papra ([#12577](https://github.com/community-scripts/ProxmoxVE/pull/12577))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fluid-calendar: add build-essential to install and update dependencies [@Copilot](https://github.com/Copilot) ([#12602](https://github.com/community-scripts/ProxmoxVE/pull/12602))
|
||||||
|
- Refactor: BentoPDF [@vhsdream](https://github.com/vhsdream) ([#12597](https://github.com/community-scripts/ProxmoxVE/pull/12597))
|
||||||
|
- Tianji: Fix the bug introduced by the refactor [@tremor021](https://github.com/tremor021) ([#12564](https://github.com/community-scripts/ProxmoxVE/pull/12564))
|
||||||
|
- PowerDNS: use 'launch=' instead of 'launch+=' for gsqlite3 backend [@MickLesk](https://github.com/MickLesk) ([#12579](https://github.com/community-scripts/ProxmoxVE/pull/12579))
|
||||||
|
|
||||||
|
### 🗑️ Deleted Scripts
|
||||||
|
|
||||||
|
- Suwayomi-Server: remove due to inactivity and very low usage [@MickLesk](https://github.com/MickLesk) ([#12596](https://github.com/community-scripts/ProxmoxVE/pull/12596))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: add var_os / var_version to whitelist for app.vars [@MickLesk](https://github.com/MickLesk) ([#12576](https://github.com/community-scripts/ProxmoxVE/pull/12576))
|
||||||
|
|
||||||
|
## 2026-03-04
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: gitea-mirror [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12549](https://github.com/community-scripts/ProxmoxVE/pull/12549))
|
||||||
|
- fix(immich): correct LibRaw clone URL to official upstream [@DenislavDenev](https://github.com/DenislavDenev) ([#12526](https://github.com/community-scripts/ProxmoxVE/pull/12526))
|
||||||
|
- update: stirling-pdf: java 25 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12552](https://github.com/community-scripts/ProxmoxVE/pull/12552))
|
||||||
|
- Docmost: register NoopAuditService globally when EE submodule is missing [@MickLesk](https://github.com/MickLesk) ([#12551](https://github.com/community-scripts/ProxmoxVE/pull/12551))
|
||||||
|
- jellyseer/overseer migration corrupting /usr/bin/update [@MickLesk](https://github.com/MickLesk) ([#12539](https://github.com/community-scripts/ProxmoxVE/pull/12539))
|
||||||
|
- PowerDNS: use gsqlite3 backend instead of BIND [@MickLesk](https://github.com/MickLesk) ([#12538](https://github.com/community-scripts/ProxmoxVE/pull/12538))
|
||||||
|
- addon migrations: /usr/bin/update replacement to prevent syntax error [@MickLesk](https://github.com/MickLesk) ([#12540](https://github.com/community-scripts/ProxmoxVE/pull/12540))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Fluid-Calendar: NodeJS bump [@tremor021](https://github.com/tremor021) ([#12558](https://github.com/community-scripts/ProxmoxVE/pull/12558))
|
||||||
|
- Refactor: LiteLLM [@tremor021](https://github.com/tremor021) ([#12550](https://github.com/community-scripts/ProxmoxVE/pull/12550))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- tools: fall back to distro packages for psql [@MickLesk](https://github.com/MickLesk) ([#12542](https://github.com/community-scripts/ProxmoxVE/pull/12542))
|
||||||
|
- fix: whitelist var_searchdomain and fix the handling of var_ns and va… [@tommoyer](https://github.com/tommoyer) ([#12521](https://github.com/community-scripts/ProxmoxVE/pull/12521))
|
||||||
|
|
||||||
|
## 2026-03-03
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Tinyauth: v5 Support & add Debian Version [@MickLesk](https://github.com/MickLesk) ([#12501](https://github.com/community-scripts/ProxmoxVE/pull/12501))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- cross-seed: install build-essential to resolve missing `make` error [@Copilot](https://github.com/Copilot) ([#12522](https://github.com/community-scripts/ProxmoxVE/pull/12522))
|
||||||
|
- meshcentral: increased disk space to 4GB [@MickLesk](https://github.com/MickLesk) ([#12509](https://github.com/community-scripts/ProxmoxVE/pull/12509))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- opnsense-vm: harden temp dir, bridge detection and network selection [@MickLesk](https://github.com/MickLesk) ([#12513](https://github.com/community-scripts/ProxmoxVE/pull/12513))
|
||||||
|
|
||||||
|
### 🗑️ Deleted Scripts
|
||||||
|
|
||||||
|
- Remove Unifi Network Server scripts (dead APT repo) [@Copilot](https://github.com/Copilot) ([#12500](https://github.com/community-scripts/ProxmoxVE/pull/12500))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: recovery - add ENOSPC disk-full detection with auto-retry using * 2 hdd [@MickLesk](https://github.com/MickLesk) ([#12511](https://github.com/community-scripts/ProxmoxVE/pull/12511))
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
|
||||||
|
- Fix config_path casing in reactive-resume.json [@ScubyG](https://github.com/ScubyG) ([#12525](https://github.com/community-scripts/ProxmoxVE/pull/12525))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Revert #11534 PR that messed up search [@BramSuurdje](https://github.com/BramSuurdje) ([#12492](https://github.com/community-scripts/ProxmoxVE/pull/12492))
|
||||||
|
|
||||||
|
## 2026-03-02
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- PowerDNS ([#12481](https://github.com/community-scripts/ProxmoxVE/pull/12481))
|
||||||
|
- Profilarr ([#12441](https://github.com/community-scripts/ProxmoxVE/pull/12441))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Tracearr: prepare for imminent v1.4.19 release [@durzo](https://github.com/durzo) ([#12413](https://github.com/community-scripts/ProxmoxVE/pull/12413))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Frigate: Bump to v0.17 [@MickLesk](https://github.com/MickLesk) ([#12474](https://github.com/community-scripts/ProxmoxVE/pull/12474))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- Migrate: DokPloy, Komodo, Coolify, Dockge, Runtipi to Addons [@MickLesk](https://github.com/MickLesk) ([#12275](https://github.com/community-scripts/ProxmoxVE/pull/12275))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- ref: replace generic exit 1 with specific exit codes in ct & install [@MickLesk](https://github.com/MickLesk) ([#12475](https://github.com/community-scripts/ProxmoxVE/pull/12475))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: Improve stability with retry logic, caching, and debug mode [@MickLesk](https://github.com/MickLesk) ([#10351](https://github.com/community-scripts/ProxmoxVE/pull/10351))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: standardize exit codes and add mappings [@MickLesk](https://github.com/MickLesk) ([#12467](https://github.com/community-scripts/ProxmoxVE/pull/12467))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- frontend: improve detail view badges, addon texts, and HTML title [@MickLesk](https://github.com/MickLesk) ([#12461](https://github.com/community-scripts/ProxmoxVE/pull/12461))
|
||||||
|
|
||||||
|
## 2026-03-01
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Sparkyfitness: use pnpm [@tomfrenzel](https://github.com/tomfrenzel) ([#12445](https://github.com/community-scripts/ProxmoxVE/pull/12445))
|
||||||
|
- OpenArchiver: Fix installation [@tremor021](https://github.com/tremor021) ([#12447](https://github.com/community-scripts/ProxmoxVE/pull/12447))
|
||||||
|
|
||||||
|
## 2026-02-28
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Update Reactive Resume install script with useful .env information for reverse proxy setup [@Mazianni](https://github.com/Mazianni) ([#12401](https://github.com/community-scripts/ProxmoxVE/pull/12401))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- gramps-web: install addons (FilterRules) for relationship diagram [@MickLesk](https://github.com/MickLesk) ([#12387](https://github.com/community-scripts/ProxmoxVE/pull/12387))
|
||||||
|
- [Fix] Immich: Change `sed` command to fully replace line in postgresql.conf [@vhsdream](https://github.com/vhsdream) ([#12429](https://github.com/community-scripts/ProxmoxVE/pull/12429))
|
||||||
|
- [FIX] Immich: fix Openvino memory leak during OCR; improve HW-accelerated ML performance [@vhsdream](https://github.com/vhsdream) ([#12426](https://github.com/community-scripts/ProxmoxVE/pull/12426))
|
||||||
|
- Fix default tag for ioBroker LXC install [@josefglatz](https://github.com/josefglatz) ([#12423](https://github.com/community-scripts/ProxmoxVE/pull/12423))
|
||||||
|
- Ombi: Add database.json [@hraphael](https://github.com/hraphael) ([#12412](https://github.com/community-scripts/ProxmoxVE/pull/12412))
|
||||||
|
- Dawarich: add missing build deps and handle seed failure [@MickLesk](https://github.com/MickLesk) ([#12410](https://github.com/community-scripts/ProxmoxVE/pull/12410))
|
||||||
|
- pangolin: increase hdd to 10G [@MickLesk](https://github.com/MickLesk) ([#12409](https://github.com/community-scripts/ProxmoxVE/pull/12409))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- BookLore: add additional JVM flags [@vhsdream](https://github.com/vhsdream) ([#12421](https://github.com/community-scripts/ProxmoxVE/pull/12421))
|
||||||
|
|
||||||
|
### 🗑️ Deleted Scripts
|
||||||
|
|
||||||
|
- Delete Palmr [@vhsdream](https://github.com/vhsdream) ([#12399](https://github.com/community-scripts/ProxmoxVE/pull/12399))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: read from /dev/tty in all interactive prompts | fix empty or cropped logs due build process [@MickLesk](https://github.com/MickLesk) ([#12406](https://github.com/community-scripts/ProxmoxVE/pull/12406))
|
||||||
|
|
||||||
|
## 2026-02-27
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Strapi ([#12320](https://github.com/community-scripts/ProxmoxVE/pull/12320))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- TrueNAS VM: filter out new nightlies with MASTER [@juronja](https://github.com/juronja) ([#12355](https://github.com/community-scripts/ProxmoxVE/pull/12355))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: graceful fallback for apt-get update failures [@MickLesk](https://github.com/MickLesk) ([#12386](https://github.com/community-scripts/ProxmoxVE/pull/12386))
|
||||||
|
- core: Improve error outputs across core functions [@MickLesk](https://github.com/MickLesk) ([#12378](https://github.com/community-scripts/ProxmoxVE/pull/12378))
|
||||||
137
CONTRIBUTING.md
137
CONTRIBUTING.md
@@ -1,137 +0,0 @@
|
|||||||
# Contributing to Proxmox VE Helper-Scripts
|
|
||||||
|
|
||||||
Welcome! We're glad you want to contribute. This guide covers everything you need to add new scripts, improve existing ones, or help in other ways.
|
|
||||||
|
|
||||||
For detailed coding standards and full documentation, visit **[community-scripts.org/docs](https://community-scripts.org/docs)**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## How Can I Help?
|
|
||||||
|
|
||||||
> [!IMPORTANT]
|
|
||||||
> **New scripts** must always be submitted to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) first — not to this repository.
|
|
||||||
> PRs with new scripts opened directly against ProxmoxVE **will be closed without review**.
|
|
||||||
> **Bug fixes, improvements, and features for existing scripts** go here (ProxmoxVE).
|
|
||||||
|
|
||||||
| I want to… | Where to go |
|
|
||||||
| :------------------------------------------ | :------------------------------------------------------------------------------------------- |
|
|
||||||
| **Add a brand-new script** | [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) — testing repo for new scripts |
|
|
||||||
| **Fix a bug or improve an existing script** | This repo (ProxmoxVE) — open a PR here |
|
|
||||||
| **Add a feature to an existing script** | This repo (ProxmoxVE) — open a PR here |
|
|
||||||
| Report a bug or broken script | [Open an Issue](https://github.com/community-scripts/ProxmoxVE/issues) |
|
|
||||||
| Request a new script or feature | [Start a Discussion](https://github.com/community-scripts/ProxmoxVE/discussions) |
|
|
||||||
| Report a security vulnerability | [Security Policy](SECURITY.md) |
|
|
||||||
| Chat with contributors | [Discord](https://discord.gg/3AnUqsXnmK) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Before writing scripts, we recommend setting up:
|
|
||||||
|
|
||||||
- **Visual Studio Code** with these extensions:
|
|
||||||
- [Shell Syntax](https://marketplace.visualstudio.com/items?itemName=bmalehorn.shell-syntax)
|
|
||||||
- [ShellCheck](https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck)
|
|
||||||
- [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Script Structure
|
|
||||||
|
|
||||||
Every script consists of two files:
|
|
||||||
|
|
||||||
| File | Purpose |
|
|
||||||
| :--------------------------- | :------------------------------------------------------ |
|
|
||||||
| `ct/AppName.sh` | Container creation, variable setup, and update handling |
|
|
||||||
| `install/AppName-install.sh` | Application installation logic |
|
|
||||||
|
|
||||||
Use existing scripts in [`ct/`](ct/) and [`install/`](install/) as reference. Full coding standards and annotated templates are at **[community-scripts.org/docs/contribution](https://community-scripts.org/docs/contribution)**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Contribution Process
|
|
||||||
|
|
||||||
### Adding a new script
|
|
||||||
|
|
||||||
New scripts are **not accepted directly in this repository**. The workflow is:
|
|
||||||
|
|
||||||
1. Fork [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) and clone it
|
|
||||||
2. Create a branch: `git switch -c feat/myapp`
|
|
||||||
3. Write your two script files:
|
|
||||||
- `ct/myapp.sh`
|
|
||||||
- `install/myapp-install.sh`
|
|
||||||
4. Test thoroughly in ProxmoxVED — run the script against a real Proxmox instance
|
|
||||||
5. Open a PR in **ProxmoxVED** for review and testing
|
|
||||||
6. Once accepted and verified there, the script will be promoted to ProxmoxVE by maintainers
|
|
||||||
|
|
||||||
Follow the coding standards at [community-scripts.org/docs/contribution](https://community-scripts.org/docs/contribution).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Fixing a bug or improving an existing script
|
|
||||||
|
|
||||||
Changes to scripts that already exist in ProxmoxVE go directly here:
|
|
||||||
|
|
||||||
1. Fork **this repository** (ProxmoxVE) and clone it:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE
|
|
||||||
cd ProxmoxVE
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Create a branch:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git switch -c fix/myapp-description
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Make your changes to the relevant files in `ct/` and/or `install/`
|
|
||||||
|
|
||||||
4. Open a PR from your fork to `community-scripts/ProxmoxVE/main`
|
|
||||||
|
|
||||||
Your PR should only contain the files you changed. Do not include unrelated modifications.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Code Standards
|
|
||||||
|
|
||||||
Key rules at a glance:
|
|
||||||
|
|
||||||
- One script per service — keep them focused
|
|
||||||
- Naming convention: lowercase, hyphen-separated (`my-app.sh`)
|
|
||||||
- Shebang: `#!/usr/bin/env bash`
|
|
||||||
- Quote all variables: `"$VAR"` not `$VAR`
|
|
||||||
- Use lowercase variable names
|
|
||||||
- Do not hardcode credentials or sensitive values
|
|
||||||
|
|
||||||
Full standards and examples: **[community-scripts.org/docs/contribution](https://community-scripts.org/docs/contribution)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Developer Mode & Debugging
|
|
||||||
|
|
||||||
Set the `dev_mode` variable to enable debugging features when testing. Flags can be combined (comma-separated):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
dev_mode="trace,keep" bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/myapp.sh)"
|
|
||||||
```
|
|
||||||
|
|
||||||
| Flag | Description |
|
|
||||||
| :----------- | :----------------------------------------------------------- |
|
|
||||||
| `trace` | Enables `set -x` for maximum verbosity during execution |
|
|
||||||
| `keep` | Prevents the container from being deleted if the build fails |
|
|
||||||
| `pause` | Pauses execution at key points before customization |
|
|
||||||
| `breakpoint` | Drops to a shell at hardcoded `breakpoint` calls in scripts |
|
|
||||||
| `logs` | Saves detailed build logs to `/var/log/community-scripts/` |
|
|
||||||
| `dryrun` | Bypasses actual container creation (limited support) |
|
|
||||||
| `motd` | Forces an update of the Message of the Day |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
- **Website metadata** (name, description, logo, tags) is managed via the website — use the "Report Issue" link on any script page to request changes. Do not submit metadata changes via repo files.
|
|
||||||
- **JSON files** in `json/` define script properties used by the website. See existing files for structure reference.
|
|
||||||
- Keep PRs small and focused. One fix or feature per PR is ideal.
|
|
||||||
- PRs with **new scripts** opened against ProxmoxVE will be closed — submit them to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) instead.
|
|
||||||
- PRs that fail CI checks will not be merged.
|
|
||||||
400
README.md
400
README.md
@@ -1,209 +1,283 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png" height="112px" alt="Proxmox VE Helper-Scripts Logo" />
|
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png" height="120px" alt="Proxmox VE Helper-Scripts Logo" />
|
||||||
|
|
||||||
<h1>Proxmox VE Helper-Scripts</h1>
|
<h1>Proxmox VE Helper-Scripts</h1>
|
||||||
<p><strong>One-command installations for services, containers, and VMs on Proxmox VE</strong><br/>
|
<p><em>A Community Legacy in Memory of @tteck</em></p>
|
||||||
A community project — built on the foundation of <a href="https://github.com/tteck">@tteck</a>'s original work</p>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="https://community-scripts.org"><img src="https://img.shields.io/badge/Website-community--scripts.org-4c9b3f?style=flat-square" /></a>
|
<a href="https://community-scripts.org">
|
||||||
<a href="https://discord.gg/3AnUqsXnmK"><img src="https://img.shields.io/badge/Discord-Join_us-7289da?style=flat-square&logo=discord&logoColor=white" /></a>
|
<img src="https://img.shields.io/badge/🌐_Website-Visit-4c9b3f?style=for-the-badge&labelColor=2d3748" alt="Website" />
|
||||||
<a href="https://github.com/community-scripts/ProxmoxVE/stargazers"><img src="https://img.shields.io/github/stars/community-scripts/ProxmoxVE?style=flat-square&label=Stars&color=f5a623" /></a>
|
</a>
|
||||||
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/CHANGELOG.md"><img src="https://img.shields.io/badge/Changelog-view-6c5ce7?style=flat-square" /></a>
|
<a href="https://discord.gg/3AnUqsXnmK">
|
||||||
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue?style=flat-square" /></a>
|
<img src="https://img.shields.io/badge/💬_Discord-Join-7289da?style=for-the-badge&labelColor=2d3748" alt="Discord" />
|
||||||
|
</a>
|
||||||
|
<a href="https://ko-fi.com/community_scripts">
|
||||||
|
<img src="https://img.shields.io/badge/❤️_Support-Donate-FF5F5F?style=for-the-badge&labelColor=2d3748" alt="Donate" />
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/README.md">
|
||||||
|
<img src="https://img.shields.io/badge/🤝_Contribute-Guidelines-ff4785?style=for-the-badge&labelColor=2d3748" alt="Contribute" />
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/USER_SUBMITTED_GUIDES.md">
|
||||||
|
<img src="https://img.shields.io/badge/📚_Guides-Read-0077b5?style=for-the-badge&labelColor=2d3748" alt="Guides" />
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/community-scripts/ProxmoxVE/blob/main/CHANGELOG.md">
|
||||||
|
<img src="https://img.shields.io/badge/📋_Changelog-View-6c5ce7?style=for-the-badge&labelColor=2d3748" alt="Changelog" />
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
**Simplify your Proxmox VE setup with community-driven automation scripts**
|
||||||
|
Originally created by tteck, now maintained and expanded by the community
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<sub>🙌 <strong>Shoutout to</strong></sub>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<a href="https://selfh.st/">
|
||||||
|
<img src="https://img.shields.io/badge/selfh.st-Icons_for_Self--Hosted-2563eb?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiBmaWxsPSJ3aGl0ZSIvPjwvc3ZnPg==&labelColor=1e3a8a" alt="selfh.st Icons" />
|
||||||
|
</a>
|
||||||
|
<br />
|
||||||
|
<sub><a href="https://github.com/selfhst/icons">View on GitHub</a> • Consistent, beautiful icons for 5000+ self-hosted apps</sub>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## What is this?
|
## 🎯 Key Features
|
||||||
|
|
||||||
**Simplify your Proxmox VE setup with community-driven automation scripts.**
|
<div align="center">
|
||||||
|
|
||||||
Install and configure popular self-hosted services with a single command — no manual package hunting, no config file archaeology. Paste a command into your Proxmox shell, answer a few prompts, and your container or VM is up and running.
|
<table>
|
||||||
|
|
||||||
The collection covers hundreds of services across categories like home automation, media servers, networking tools, databases, monitoring stacks, and more.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
| Component | Details |
|
|
||||||
| -------------- | ------------------------------------------------ |
|
|
||||||
| **Proxmox VE** | Version 8.4, 9.0, or 9.1 |
|
|
||||||
| **Host OS** | Proxmox VE (Debian-based) |
|
|
||||||
| **Access** | Root shell access on the Proxmox host |
|
|
||||||
| **Network** | Internet connection required during installation |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
The fastest way to find and run scripts:
|
|
||||||
|
|
||||||
1. Go to **[community-scripts.org](https://community-scripts.org)**
|
|
||||||
2. Search for the service you want (e.g. "Home Assistant", "Nginx Proxy Manager", "Jellyfin")
|
|
||||||
3. Copy the one-line install command from the script page
|
|
||||||
4. Open your **Proxmox Shell** and paste it
|
|
||||||
5. Choose between **Default** or **Advanced** setup and follow the prompts
|
|
||||||
|
|
||||||
Each script page documents what the container includes, default resource allocation, and post-install notes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## How Scripts Work
|
|
||||||
|
|
||||||
Every script follows the same pattern:
|
|
||||||
|
|
||||||
**Default mode** — Picks sensible resource defaults (CPU, RAM, storage) and asks only the minimum required questions. Most installs finish in under five minutes.
|
|
||||||
|
|
||||||
**Advanced mode** — Gives you full control over container settings, networking, storage backends, and application-level configuration before anything is installed.
|
|
||||||
|
|
||||||
After installation, each container ships with a **post-install helper** accessible from the Proxmox shell. It handles common tasks like:
|
|
||||||
|
|
||||||
- Applying updates to the installed service
|
|
||||||
- Changing application settings without manually editing config files
|
|
||||||
- Basic troubleshooting and log access
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## What's Included
|
|
||||||
|
|
||||||
The repository covers a wide range of categories. A few examples:
|
|
||||||
|
|
||||||
| Category | Examples |
|
|
||||||
| --------------- | --------------------------------------------------- |
|
|
||||||
| Home Automation | Home Assistant, Zigbee2MQTT, ESPHome, Node-RED |
|
|
||||||
| Media | Jellyfin, Plex, Radarr, Sonarr, Immich |
|
|
||||||
| Networking | AdGuard Home, Nginx Proxy Manager, Pi-hole, Traefik |
|
|
||||||
| Monitoring | Grafana, Prometheus, Uptime Kuma, Netdata |
|
|
||||||
| Databases | PostgreSQL, MariaDB, Redis, InfluxDB |
|
|
||||||
| Security | Vaultwarden, CrowdSec, Authentik |
|
|
||||||
| Dev & Tools | Gitea, Portainer, VS Code Server, n8n |
|
|
||||||
|
|
||||||
> Browse the full list at **[community-scripts.org/categories](https://community-scripts.org/categories)** — new scripts are added regularly.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
This project runs on community contributions. Whether you want to write new scripts, improve existing ones, or just report a bug — every bit helps.
|
|
||||||
|
|
||||||
### Where to start
|
|
||||||
|
|
||||||
| I want to… | Go here |
|
|
||||||
| ------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
||||||
| Add a **new** script | [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED) — new scripts are tested here first |
|
|
||||||
| Fix or improve an **existing** script | [Contributing Guidelines](CONTRIBUTING.md) — open a PR in this repo |
|
|
||||||
| Report a bug or broken script | [Issues](https://github.com/community-scripts/ProxmoxVE/issues) |
|
|
||||||
| Request a new script or feature | [Discussions](https://github.com/community-scripts/ProxmoxVE/discussions) |
|
|
||||||
| Report a security vulnerability | [Security Policy](SECURITY.md) |
|
|
||||||
| Get help or chat with other users | [Discord](https://discord.gg/3AnUqsXnmK) |
|
|
||||||
|
|
||||||
### Before you open a PR
|
|
||||||
|
|
||||||
- **New scripts go to [ProxmoxVED](https://github.com/community-scripts/ProxmoxVED), not here.** PRs with new scripts opened directly against this repo will be closed.
|
|
||||||
- Bug fixes and improvements to existing scripts belong in this repo — read the [Contributing Guidelines](CONTRIBUTING.md) first.
|
|
||||||
- Keep PRs focused. One fix or feature per PR.
|
|
||||||
- Document what your script installs and any non-obvious decisions in the corresponding JSON metadata file.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Core Team
|
|
||||||
|
|
||||||
<table align="center">
|
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">
|
<td align="center" width="25%">
|
||||||
<a href="https://github.com/MickLesk">
|
<h3>⚡ Quick Setup</h3>
|
||||||
<img src="https://github.com/MickLesk.png" width="80" height="80" style="border-radius:50%" alt="MickLesk" /><br/>
|
<p>One-command installations for popular services and containers</p>
|
||||||
<sub><b>MickLesk</b></sub>
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>⚙️ Flexible Config</h3>
|
||||||
|
<p>Simple mode for beginners, advanced options for power users</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>🔄 Auto Updates</h3>
|
||||||
|
<p>Keep your installations current with built-in update mechanisms</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>🛠️ Easy Management</h3>
|
||||||
|
<p>Post-install scripts for configuration and troubleshooting</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>👥 Community Driven</h3>
|
||||||
|
<p>Actively maintained with contributions from users worldwide</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>📖 Well Documented</h3>
|
||||||
|
<p>Comprehensive guides and community support</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>🔒 Secure</h3>
|
||||||
|
<p>Regular security updates and best practices</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>⚡ Performance</h3>
|
||||||
|
<p>Optimized configurations for best performance</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Requirements
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center" width="33%">
|
||||||
|
<h3>🖥️ Proxmox VE</h3>
|
||||||
|
<p>Version: 8.4.x | 9.0.x | 9.1.x</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="33%">
|
||||||
|
<h3>🐧 Operating System</h3>
|
||||||
|
<p>Debian-based with Proxmox Tools</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="33%">
|
||||||
|
<h3>🌐 Network</h3>
|
||||||
|
<p>Internet connection required</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📥 Getting Started
|
||||||
|
|
||||||
|
Choose your preferred installation method:
|
||||||
|
|
||||||
|
### Method 1: One-Click Web Installer
|
||||||
|
|
||||||
|
The fastest way to get started:
|
||||||
|
|
||||||
|
1. Visit **[community-scripts.org](https://community-scripts.org/)** 🌐
|
||||||
|
2. Search for your desired script (e.g., "Home Assistant", "Docker")
|
||||||
|
3. Copy the bash command displayed on the script page
|
||||||
|
4. Open your **Proxmox Shell** and paste the command
|
||||||
|
5. Press Enter and follow the interactive prompts
|
||||||
|
|
||||||
|
### Method 2: PVEScripts-Local
|
||||||
|
|
||||||
|
Install a convenient script manager directly in your Proxmox UI:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/pve-scripts-local.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
|
This adds a menu to your Proxmox interface for easy script access without visiting the website.
|
||||||
|
|
||||||
|
📖 **Learn more:** [ProxmoxVE-Local Repository](https://github.com/community-scripts/ProxmoxVE-Local)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💬 Join the Community
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center" width="33%">
|
||||||
|
<h3>💬 Discord</h3>
|
||||||
|
<p>Real-time chat, support, and discussions</p>
|
||||||
|
<a href="https://discord.gg/3AnUqsXnmK">
|
||||||
|
<img src="https://img.shields.io/badge/Join-7289da?style=for-the-badge&logo=discord&logoColor=white" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
<td align="center" width="33%">
|
||||||
<a href="https://github.com/michelroegl-brunner">
|
<h3>💭 Discussions</h3>
|
||||||
<img src="https://github.com/michelroegl-brunner.png" width="80" height="80" style="border-radius:50%" alt="michelroegl-brunner" /><br/>
|
<p>Feature requests, Q&A, and ideas</p>
|
||||||
<sub><b>michelroegl-brunner</b></sub>
|
<a href="https://github.com/community-scripts/ProxmoxVE/discussions">
|
||||||
|
<img src="https://img.shields.io/badge/Discuss-238636?style=for-the-badge&logo=github&logoColor=white" alt="Discussions" />
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
<td align="center" width="33%">
|
||||||
<a href="https://github.com/BramSuurdje">
|
<h3>🐛 Issues</h3>
|
||||||
<img src="https://github.com/BramSuurdje.png" width="80" height="80" style="border-radius:50%" alt="BramSuurdje" /><br/>
|
<p>Bug reports and issue tracking</p>
|
||||||
<sub><b>BramSuurdje</b></sub>
|
<a href="https://github.com/community-scripts/ProxmoxVE/issues">
|
||||||
</a>
|
<img src="https://img.shields.io/badge/Report-d73a4a?style=for-the-badge&logo=github&logoColor=white" alt="Issues" />
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/CrazyWolf13">
|
|
||||||
<img src="https://github.com/CrazyWolf13.png" width="80" height="80" style="border-radius:50%" alt="CrazyWolf13" /><br/>
|
|
||||||
<sub><b>CrazyWolf13</b></sub>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/tremor021">
|
|
||||||
<img src="https://github.com/tremor021.png" width="80" height="80" style="border-radius:50%" alt="tremor021" /><br/>
|
|
||||||
<sub><b>tremor021</b></sub>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/vhsdream">
|
|
||||||
<img src="https://github.com/vhsdream.png" width="80" height="80" style="border-radius:50%" alt="vhsdream" /><br/>
|
|
||||||
<sub><b>vhsdream</b></sub>
|
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Project Activity
|
## 🛠️ Contribute
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>💻 Code</h3>
|
||||||
|
<p>Add new scripts or improve existing ones</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>📝 Documentation</h3>
|
||||||
|
<p>Write guides, improve READMEs, translate content</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>🧪 Testing</h3>
|
||||||
|
<p>Test scripts and report compatibility issues</p>
|
||||||
|
</td>
|
||||||
|
<td align="center" width="25%">
|
||||||
|
<h3>💡 Ideas</h3>
|
||||||
|
<p>Suggest features or workflow improvements</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<br />
|
||||||
|
|
||||||
|
👉 Check our **[Contributing Guidelines](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/README.md)** to get started
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ❤️ Support the Project
|
||||||
|
|
||||||
|
This project is maintained by volunteers in memory of tteck. Your support helps us maintain infrastructure, improve documentation, and give back to important causes.
|
||||||
|
|
||||||
|
**🎗️ 30% of all donations go directly to cancer research and hospice care**
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<a href="https://ko-fi.com/community_scripts">
|
||||||
|
<img src="https://img.shields.io/badge/☕_Buy_us_a_coffee-Support_on_Ko--fi-FF5F5F?style=for-the-badge&labelColor=2d3748" alt="Support on Ko-fi" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<sub>Every contribution helps keep this project alive and supports meaningful causes</sub>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 Project Statistics
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img
|
<img
|
||||||
src="https://repobeats.axiom.co/api/embed/57edde03e00f88d739bdb5b844ff7d07dd079375.svg"
|
src="https://repobeats.axiom.co/api/embed/57edde03e00f88d739bdb5b844ff7d07dd079375.svg"
|
||||||
alt="Repository activity"
|
alt="Repobeats analytics"
|
||||||
width="700"
|
width="650"
|
||||||
/>
|
/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://star-history.com/#community-scripts/ProxmoxVE&Date">
|
<a href="https://star-history.com/#community-scripts/ProxmoxVE&Date">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date&theme=dark" />
|
<source
|
||||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date" />
|
media="(prefers-color-scheme: dark)"
|
||||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date" width="700" />
|
srcset="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date&theme=dark"
|
||||||
|
/>
|
||||||
|
<source
|
||||||
|
media="(prefers-color-scheme: light)"
|
||||||
|
srcset="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
alt="Star History Chart"
|
||||||
|
src="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date"
|
||||||
|
width="650"
|
||||||
|
/>
|
||||||
</picture>
|
</picture>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Support the Project
|
## 📜 License
|
||||||
|
|
||||||
This project is maintained by volunteers. All infrastructure costs come out of pocket, and the work is done in people's spare time.
|
This project is licensed under the **[MIT License](LICENSE)** - feel free to use, modify, and distribute.
|
||||||
|
|
||||||
**30% of all donations are forwarded directly to cancer research and hospice care** — a cause that was important to tteck.
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<a href="https://ko-fi.com/community_scripts">
|
|
||||||
<img src="https://img.shields.io/badge/Support_on_Ko--fi-FF5F5F?style=for-the-badge&logo=ko-fi&logoColor=white" alt="Support on Ko-fi" />
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="https://community-scripts.org/donate">
|
|
||||||
<img src="https://img.shields.io/badge/Donate-community--scripts.org%2Fdonate-4c9b3f?style=for-the-badge" alt="Donate via community-scripts.org" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This project is licensed under the [MIT License](LICENSE) — free to use, modify, and redistribute for personal and commercial purposes.
|
|
||||||
|
|
||||||
See the full license text in [LICENSE](LICENSE).
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<sub>Built on the foundation of <a href="https://github.com/tteck">tteck</a>'s original work · <a href="https://github.com/tteck/Proxmox">Original Repository</a></sub><br/>
|
<sub>Made with ❤️ by the Proxmox community in memory of tteck</sub>
|
||||||
<sub>Maintained and expanded by the community · In memory of tteck</sub><br/>
|
<br />
|
||||||
<sub><i>Proxmox® is a registered trademark of <a href="https://www.proxmox.com/en/about/company">Proxmox Server Solutions GmbH</a></i></sub>
|
<sub><i>Proxmox® is a registered trademark of <a href="https://www.proxmox.com/en/about/company">Proxmox Server Solutions GmbH</a></i></sub>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ function update_script() {
|
|||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
msg_warn "Old Installation Found, you need to migrate your data and recreate to a new container"
|
msg_info "Old Installation Found, you need to migrate your data and recreate to a new container"
|
||||||
msg_warn "Please follow the instructions on the Actual Budget website to migrate your data"
|
msg_info "Please follow the instructions on the Actual Budget website to migrate your data"
|
||||||
msg_warn "https://actualbudget.org/docs/backup-restore/backup"
|
msg_info "https://actualbudget.org/docs/backup-restore/backup"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -1,71 +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/nearai/ironclaw
|
|
||||||
|
|
||||||
APP="Alpine-IronClaw"
|
|
||||||
var_tags="${var_tags:-ai;agent;alpine}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-1024}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-alpine}"
|
|
||||||
var_version="${var_version:-3.23}"
|
|
||||||
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 /usr/local/bin/ironclaw ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "ironclaw-bin" "nearai/ironclaw"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
rc-service ironclaw stop 2>/dev/null || true
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
|
||||||
cp /root/.ironclaw/.env /root/ironclaw.env.bak
|
|
||||||
msg_ok "Backed up Configuration"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "ironclaw-bin" "nearai/ironclaw" "prebuild" "latest" "/usr/local/bin" \
|
|
||||||
"ironclaw-$(uname -m)-unknown-linux-musl.tar.gz"
|
|
||||||
chmod +x /usr/local/bin/ironclaw
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration"
|
|
||||||
cp /root/ironclaw.env.bak /root/.ironclaw/.env
|
|
||||||
rm -f /root/ironclaw.env.bak
|
|
||||||
msg_ok "Restored Configuration"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
rc-service ironclaw start
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Complete setup by running:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}ironclaw onboard${CL}"
|
|
||||||
echo -e "${INFO}${YW} Then start the service:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}rc-service ironclaw start${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access the Web UI at:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
echo -e "${INFO}${YW} Auth token and database credentials:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}cat /root/.ironclaw/.env${CL}"
|
|
||||||
@@ -22,6 +22,8 @@ catch_errors
|
|||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
if [[ ! -d /opt/wakapi ]]; then
|
if [[ ! -d /opt/wakapi ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
@@ -42,10 +44,12 @@ function update_script() {
|
|||||||
cp /opt/wakapi/config.yml /opt/wakapi/wakapi_db.db /opt/wakapi-backup/
|
cp /opt/wakapi/config.yml /opt/wakapi/wakapi_db.db /opt/wakapi-backup/
|
||||||
msg_ok "Created backup"
|
msg_ok "Created backup"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wakapi" "muety/wakapi" "prebuild" "latest" "/opt/wakapi" "wakapi_linux_amd64.zip"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wakapi" "muety/wakapi" "tarball"
|
||||||
|
|
||||||
msg_info "Configuring Wakapi"
|
msg_info "Configuring Wakapi"
|
||||||
cd /opt/wakapi
|
cd /opt/wakapi
|
||||||
|
$STD go mod download
|
||||||
|
$STD go build -o wakapi
|
||||||
cp /opt/wakapi-backup/config.yml /opt/wakapi/
|
cp /opt/wakapi-backup/config.yml /opt/wakapi/
|
||||||
cp /opt/wakapi-backup/wakapi_db.db /opt/wakapi/
|
cp /opt/wakapi-backup/wakapi_db.db /opt/wakapi/
|
||||||
rm -rf /opt/wakapi-backup
|
rm -rf /opt/wakapi-backup
|
||||||
|
|||||||
83
ct/anchor.sh
83
ct/anchor.sh
@@ -1,83 +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/ZhFahim/anchor
|
|
||||||
|
|
||||||
APP="Anchor"
|
|
||||||
var_tags="${var_tags:-notes;productivity;sync}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-10}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f ~/.anchor ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "anchor" "ZhFahim/anchor"; then
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop anchor-web anchor-server
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
|
||||||
cp /opt/anchor/.env /opt/anchor.env.bak
|
|
||||||
msg_ok "Backed up Configuration"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "anchor" "ZhFahim/anchor" "tarball"
|
|
||||||
|
|
||||||
msg_info "Building Server"
|
|
||||||
cd /opt/anchor/server
|
|
||||||
$STD pnpm install --frozen-lockfile
|
|
||||||
$STD pnpm prisma generate
|
|
||||||
$STD pnpm build
|
|
||||||
[[ -d src/generated ]] && mkdir -p dist/src && cp -R src/generated dist/src/
|
|
||||||
msg_ok "Built Server"
|
|
||||||
|
|
||||||
msg_info "Building Web Interface"
|
|
||||||
cd /opt/anchor/web
|
|
||||||
$STD pnpm install --frozen-lockfile
|
|
||||||
SERVER_URL=http://127.0.0.1:3001 $STD pnpm build
|
|
||||||
cp -r .next/static .next/standalone/.next/static
|
|
||||||
cp -r public .next/standalone/public
|
|
||||||
msg_ok "Built Web Interface"
|
|
||||||
|
|
||||||
cp /opt/anchor.env.bak /opt/anchor/.env
|
|
||||||
rm -f /opt/anchor.env.bak
|
|
||||||
|
|
||||||
msg_info "Running Database Migrations"
|
|
||||||
cd /opt/anchor/server
|
|
||||||
set -a && source /opt/anchor/.env && set +a
|
|
||||||
$STD pnpm prisma migrate deploy
|
|
||||||
msg_ok "Ran Database Migrations"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start anchor-server anchor-web
|
|
||||||
msg_ok "Started Services"
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
@@ -48,7 +48,6 @@ function update_script() {
|
|||||||
mv /tmp/production.py.bak /opt/babybuddy/babybuddy/settings/production.py
|
mv /tmp/production.py.bak /opt/babybuddy/babybuddy/settings/production.py
|
||||||
source .venv/bin/activate
|
source .venv/bin/activate
|
||||||
$STD uv pip install -r requirements.txt
|
$STD uv pip install -r requirements.txt
|
||||||
export DJANGO_SETTINGS_MODULE=babybuddy.settings.production
|
|
||||||
$STD python manage.py migrate
|
$STD python manage.py migrate
|
||||||
msg_ok "Updated ${APP}"
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
|||||||
@@ -29,8 +29,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ensure_dependencies ffmpeg
|
|
||||||
|
|
||||||
if check_for_gh_release "bambuddy" "maziggy/bambuddy"; then
|
if check_for_gh_release "bambuddy" "maziggy/bambuddy"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop bambuddy
|
systemctl stop bambuddy
|
||||||
@@ -39,16 +37,13 @@ function update_script() {
|
|||||||
msg_info "Backing up Configuration and Data"
|
msg_info "Backing up Configuration and Data"
|
||||||
cp /opt/bambuddy/.env /opt/bambuddy.env.bak
|
cp /opt/bambuddy/.env /opt/bambuddy.env.bak
|
||||||
cp -r /opt/bambuddy/data /opt/bambuddy_data_bak
|
cp -r /opt/bambuddy/data /opt/bambuddy_data_bak
|
||||||
[[ -f /opt/bambuddy/bambuddy.db ]] && cp /opt/bambuddy/bambuddy.db /opt/bambuddy.db.bak
|
|
||||||
[[ -f /opt/bambuddy/bambutrack.db ]] && cp /opt/bambuddy/bambutrack.db /opt/bambutrack.db.bak
|
|
||||||
[[ -d /opt/bambuddy/archive ]] && cp -r /opt/bambuddy/archive /opt/bambuddy_archive_bak
|
|
||||||
msg_ok "Backed up Configuration and Data"
|
msg_ok "Backed up Configuration and Data"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bambuddy" "maziggy/bambuddy" "tarball" "latest" "/opt/bambuddy"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bambuddy" "maziggy/bambuddy" "tarball" "latest" "/opt/bambuddy"
|
||||||
|
|
||||||
msg_info "Updating Python Dependencies"
|
msg_info "Updating Python Dependencies"
|
||||||
cd /opt/bambuddy
|
cd /opt/bambuddy
|
||||||
$STD uv venv --clear
|
$STD uv venv
|
||||||
$STD uv pip install -r requirements.txt
|
$STD uv pip install -r requirements.txt
|
||||||
msg_ok "Updated Python Dependencies"
|
msg_ok "Updated Python Dependencies"
|
||||||
|
|
||||||
@@ -59,17 +54,10 @@ function update_script() {
|
|||||||
msg_ok "Rebuilt Frontend"
|
msg_ok "Rebuilt Frontend"
|
||||||
|
|
||||||
msg_info "Restoring Configuration and Data"
|
msg_info "Restoring Configuration and Data"
|
||||||
mkdir -p /opt/bambuddy/data
|
|
||||||
cp /opt/bambuddy.env.bak /opt/bambuddy/.env
|
cp /opt/bambuddy.env.bak /opt/bambuddy/.env
|
||||||
cp -r /opt/bambuddy_data_bak/. /opt/bambuddy/data/
|
cp -r /opt/bambuddy_data_bak/. /opt/bambuddy/data/
|
||||||
[[ -f /opt/bambuddy.db.bak ]] && cp /opt/bambuddy.db.bak /opt/bambuddy/bambuddy.db
|
rm -f /opt/bambuddy.env.bak
|
||||||
[[ -f /opt/bambutrack.db.bak ]] && cp /opt/bambutrack.db.bak /opt/bambuddy/bambutrack.db
|
rm -rf /opt/bambuddy_data_bak
|
||||||
if [[ -d /opt/bambuddy_archive_bak ]]; then
|
|
||||||
mkdir -p /opt/bambuddy/archive
|
|
||||||
cp -r /opt/bambuddy_archive_bak/. /opt/bambuddy/archive/
|
|
||||||
fi
|
|
||||||
rm -f /opt/bambuddy.env.bak /opt/bambuddy.db.bak /opt/bambutrack.db.bak
|
|
||||||
rm -rf /opt/bambuddy_data_bak /opt/bambuddy_archive_bak
|
|
||||||
msg_ok "Restored Configuration and Data"
|
msg_ok "Restored Configuration and Data"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ function update_script() {
|
|||||||
msg_info "Updating BentoPDF"
|
msg_info "Updating BentoPDF"
|
||||||
cd /opt/bentopdf
|
cd /opt/bentopdf
|
||||||
$STD npm ci --no-audit --no-fund
|
$STD npm ci --no-audit --no-fund
|
||||||
|
$STD npm install http-server -g
|
||||||
if [[ -f /opt/production.env ]]; then
|
if [[ -f /opt/production.env ]]; then
|
||||||
mv /opt/production.env ./.env.production
|
mv /opt/production.env ./.env.production
|
||||||
else
|
else
|
||||||
@@ -51,97 +52,15 @@ function update_script() {
|
|||||||
export SIMPLE_MODE=true
|
export SIMPLE_MODE=true
|
||||||
export VITE_USE_CDN=true
|
export VITE_USE_CDN=true
|
||||||
$STD npm run build:all
|
$STD npm run build:all
|
||||||
if [[ ! -f /opt/bentopdf/dist/config.json ]]; then
|
|
||||||
cat <<'EOF' >/opt/bentopdf/dist/config.json
|
|
||||||
{}
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
msg_ok "Updated BentoPDF"
|
msg_ok "Updated BentoPDF"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
ensure_dependencies nginx openssl
|
if grep -q '8080' /etc/systemd/system/bentopdf.service; then
|
||||||
if [[ ! -f /etc/ssl/private/bentopdf-selfsigned.key || ! -f /etc/ssl/certs/bentopdf-selfsigned.crt ]]; then
|
sed -i -e 's|/bentopdf|/bentopdf/dist|' \
|
||||||
CERT_CN="$(hostname -I | awk '{print $1}')"
|
-e 's|npx.*|npx http-server -g -b -d false -r --no-dotfiles|' \
|
||||||
$STD openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
|
/etc/systemd/system/bentopdf.service
|
||||||
-keyout /etc/ssl/private/bentopdf-selfsigned.key \
|
systemctl daemon-reload
|
||||||
-out /etc/ssl/certs/bentopdf-selfsigned.crt \
|
|
||||||
-subj "/CN=${CERT_CN}"
|
|
||||||
fi
|
fi
|
||||||
cat <<'EOF' >/etc/nginx/sites-available/bentopdf
|
|
||||||
server {
|
|
||||||
listen 8080;
|
|
||||||
server_name _;
|
|
||||||
return 301 https://$host:8443$request_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 8443 ssl;
|
|
||||||
server_name _;
|
|
||||||
ssl_certificate /etc/ssl/certs/bentopdf-selfsigned.crt;
|
|
||||||
ssl_certificate_key /etc/ssl/private/bentopdf-selfsigned.key;
|
|
||||||
root /opt/bentopdf/dist;
|
|
||||||
index index.html;
|
|
||||||
|
|
||||||
# Required for LibreOffice WASM (Word/Excel/PowerPoint to PDF via SharedArrayBuffer)
|
|
||||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
|
||||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
|
||||||
add_header Cross-Origin-Resource-Policy "cross-origin" always;
|
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
|
|
||||||
gzip_static on;
|
|
||||||
|
|
||||||
location ~* /libreoffice-wasm/soffice\.wasm\.gz$ {
|
|
||||||
gzip off;
|
|
||||||
types {} default_type application/wasm;
|
|
||||||
add_header Content-Encoding gzip;
|
|
||||||
add_header Vary "Accept-Encoding";
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~* /libreoffice-wasm/soffice\.data\.gz$ {
|
|
||||||
gzip off;
|
|
||||||
types {} default_type application/octet-stream;
|
|
||||||
add_header Content-Encoding gzip;
|
|
||||||
add_header Vary "Accept-Encoding";
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~* \.wasm$ {
|
|
||||||
types {} default_type application/wasm;
|
|
||||||
expires 1y;
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~* \.(wasm\.gz|data\.gz|data)$ {
|
|
||||||
expires 1y;
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri $uri/ $uri.html =404;
|
|
||||||
}
|
|
||||||
|
|
||||||
error_page 404 /404.html;
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
|
||||||
ln -sf /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/bentopdf
|
|
||||||
cat <<'EOF' >/etc/systemd/system/bentopdf.service
|
|
||||||
[Unit]
|
|
||||||
Description=BentoPDF Service
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/usr/sbin/nginx -g "daemon off;"
|
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
|
||||||
Restart=always
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl start bentopdf
|
systemctl start bentopdf
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
@@ -156,4 +75,4 @@ 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} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
setup_mariadb
|
setup_mariadb
|
||||||
ensure_dependencies git
|
|
||||||
if check_for_gh_release "bookstack" "BookStackApp/BookStack"; then
|
if check_for_gh_release "bookstack" "BookStackApp/BookStack"; then
|
||||||
msg_info "Stopping Apache2"
|
msg_info "Stopping Apache2"
|
||||||
systemctl stop apache2
|
systemctl stop apache2
|
||||||
|
|||||||
@@ -29,41 +29,28 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if check_for_gh_release "bytestash" "jordan-dalby/ByteStash"; then
|
if check_for_gh_release "bytestash" "jordan-dalby/ByteStash"; then
|
||||||
msg_info "Stopping Services"
|
read -rp "${TAB3}Did you make a backup via application WebUI? (y/n): " backuped
|
||||||
systemctl stop bytestash-backend bytestash-frontend
|
if [[ "$backuped" =~ ^[Yy]$ ]]; then
|
||||||
msg_ok "Services Stopped"
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop bytestash-backend bytestash-frontend
|
||||||
|
msg_ok "Services Stopped"
|
||||||
|
|
||||||
msg_info "Backing up data"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bytestash" "jordan-dalby/ByteStash" "tarball"
|
||||||
tmp_dir="/opt/bytestash-data-backup"
|
|
||||||
mkdir -p "$tmp_dir"
|
msg_info "Configuring ByteStash"
|
||||||
if [[ -d /opt/bytestash/data ]]; then
|
cd /opt/bytestash/server
|
||||||
cp -r /opt/bytestash/data "$tmp_dir"/data
|
$STD npm install
|
||||||
elif [[ -d /opt/data ]]; then
|
cd /opt/bytestash/client
|
||||||
cp -r /opt/data "$tmp_dir"/data
|
$STD npm install
|
||||||
|
msg_ok "Updated ByteStash"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start bytestash-backend bytestash-frontend
|
||||||
|
msg_ok "Started Services"
|
||||||
|
else
|
||||||
|
msg_error "PLEASE MAKE A BACKUP FIRST!"
|
||||||
|
exit
|
||||||
fi
|
fi
|
||||||
msg_ok "Data backed up"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bytestash" "jordan-dalby/ByteStash" "tarball"
|
|
||||||
|
|
||||||
msg_info "Restoring data"
|
|
||||||
if [[ -d "$tmp_dir"/data ]]; then
|
|
||||||
mkdir -p /opt/bytestash/data
|
|
||||||
cp -r "$tmp_dir"/data/* /opt/bytestash/data/
|
|
||||||
rm -rf "$tmp_dir"
|
|
||||||
fi
|
|
||||||
msg_ok "Data restored"
|
|
||||||
|
|
||||||
msg_info "Configuring ByteStash"
|
|
||||||
cd /opt/bytestash/server
|
|
||||||
$STD npm install
|
|
||||||
cd /opt/bytestash/client
|
|
||||||
$STD npm install
|
|
||||||
msg_ok "Updated ByteStash"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start bytestash-backend bytestash-frontend
|
|
||||||
msg_ok "Started Services"
|
|
||||||
|
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
cd /opt/calibre-web
|
cd /opt/calibre-web
|
||||||
$STD uv venv --clear /opt/calibre-web/.venv
|
$STD uv venv
|
||||||
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir --upgrade pip setuptools wheel
|
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir --upgrade pip setuptools wheel
|
||||||
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir -r requirements.txt
|
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir -r requirements.txt
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|||||||
@@ -34,11 +34,11 @@ function update_script() {
|
|||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD pip3 install changedetection.io --upgrade --break-system-packages --ignore-installed typing_extensions
|
$STD pip3 install changedetection.io --upgrade
|
||||||
msg_ok "Updated ${APP}"
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
msg_info "Updating Playwright"
|
msg_info "Updating Playwright"
|
||||||
$STD pip3 install playwright --upgrade --break-system-packages
|
$STD pip3 install playwright --upgrade
|
||||||
msg_ok "Updated Playwright"
|
msg_ok "Updated Playwright"
|
||||||
|
|
||||||
if [[ -f /etc/systemd/system/browserless.service ]]; then
|
if [[ -f /etc/systemd/system/browserless.service ]]; then
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
|
|||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_disk="${var_disk:-6}"
|
var_disk="${var_disk:-6}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-12}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -29,11 +29,10 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -Ev 'rc|b' | sort -V | tail -n 1)
|
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -Ev 'rc|b' | sort -V | tail -n 1)
|
||||||
RELEASE="${RELEASE%%+*}"
|
|
||||||
msg_info "Updating ${APP} to v${RELEASE}"
|
msg_info "Updating ${APP} to v${RELEASE}"
|
||||||
$STD omd stop monitoring
|
$STD omd stop monitoring
|
||||||
$STD omd cp monitoring monitoringbackup
|
$STD omd cp monitoring monitoringbackup
|
||||||
curl -fsSL "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.$(get_os_info codename)_amd64.deb" -o "/opt/checkmk.deb"
|
curl -fsSL "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb" -o "/opt/checkmk.deb"
|
||||||
$STD apt-get install -y /opt/checkmk.deb
|
$STD apt-get install -y /opt/checkmk.deb
|
||||||
$STD omd --force -V ${RELEASE}.cre update --conflict=install monitoring
|
$STD omd --force -V ${RELEASE}.cre update --conflict=install monitoring
|
||||||
$STD omd start monitoring
|
$STD omd start monitoring
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 tteck
|
||||||
# Author: MintHCM
|
# Author: tteck (tteckster)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/minthcm/minthcm
|
# Source: https://daemonsync.me/
|
||||||
|
|
||||||
APP="MintHCM"
|
APP="Daemon Sync"
|
||||||
var_tags="${var_tags:-hcm}"
|
var_tags="${var_tags:-sync}"
|
||||||
var_disk="${var_disk:-20}"
|
var_cpu="${var_cpu:-1}"
|
||||||
var_cpu="${var_cpu:-4}"
|
var_ram="${var_ram:-512}"
|
||||||
var_ram="${var_ram:-4096}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
@@ -18,16 +18,20 @@ header_info "$APP"
|
|||||||
variables
|
variables
|
||||||
color
|
color
|
||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -d /var/www/MintHCM ]]; then
|
if [[ ! -d /var ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
msg_info "Updating LXC"
|
||||||
msg_custom "🚀" "${GN}" "The app offers a built-in updater. Please use it."
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
msg_ok "Updated LXC"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,4 +42,4 @@ 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} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8084${CL}"
|
||||||
64
ct/dagu.sh
64
ct/dagu.sh
@@ -1,64 +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://dagu.sh/
|
|
||||||
|
|
||||||
APP="Dagu"
|
|
||||||
var_tags="${var_tags:-automation;workflow;scheduler}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-512}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /opt/dagu/dagu ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "dagu" "dagucloud/dagu"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop dagu
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
cp -r /opt/dagu/data /opt/dagu_data_backup
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "dagu" "dagucloud/dagu" "prebuild" "latest" "/opt/dagu" "dagu_*_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
mkdir -p /opt/dagu/data
|
|
||||||
cp -r /opt/dagu_data_backup/. /opt/dagu/data
|
|
||||||
rm -rf /opt/dagu_data_backup
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start dagu
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
|
||||||
73
ct/dashy.sh
73
ct/dashy.sh
@@ -1,73 +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: tteck (tteckster) | Co-Author: CrazyWolf13
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://dashy.to/
|
|
||||||
|
|
||||||
APP="Dashy"
|
|
||||||
var_tags="${var_tags:-dashboard}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-6}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -d /opt/dashy/public/ ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if check_for_gh_release "dashy" "Lissy93/dashy"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop dashy
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up conf.yml"
|
|
||||||
if [[ -f /opt/dashy/public/conf.yml ]]; then
|
|
||||||
cp -R /opt/dashy/public/conf.yml /opt/dashy_conf_backup.yml
|
|
||||||
else
|
|
||||||
cp -R /opt/dashy/user-data/conf.yml /opt/dashy_conf_backup.yml
|
|
||||||
fi
|
|
||||||
msg_ok "Backed up conf.yml"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dashy" "Lissy93/dashy" "prebuild" "latest" "/opt/dashy" "dashy-*.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Updating Dashy"
|
|
||||||
cd /opt/dashy
|
|
||||||
$STD yarn install --ignore-engines --network-timeout 300000
|
|
||||||
msg_ok "Updated Dashy"
|
|
||||||
|
|
||||||
msg_info "Restoring conf.yml"
|
|
||||||
cp -R /opt/dashy_conf_backup.yml /opt/dashy/user-data
|
|
||||||
msg_ok "Restored conf.yml"
|
|
||||||
|
|
||||||
msg_info "Cleaning"
|
|
||||||
rm -rf /opt/dashy_conf_backup.yml /opt/dashy/public/conf.yml
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
|
|
||||||
msg_info "Starting Dashy"
|
|
||||||
systemctl start dashy
|
|
||||||
msg_ok "Started Dashy"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4000${CL}"
|
|
||||||
@@ -20,43 +20,41 @@ color
|
|||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -d /opt/domain-locker ]]; then
|
if [[ ! -d /opt/domain-locker ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "domain-locker" "Lissy93/domain-locker"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop domain-locker
|
||||||
|
msg_info "Service stopped"
|
||||||
|
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-locker" "Lissy93/domain-locker" "tarball"
|
||||||
|
|
||||||
|
msg_info "Installing Modules (patience)"
|
||||||
|
cd /opt/domain-locker
|
||||||
|
$STD npm install
|
||||||
|
msg_ok "Installed Modules"
|
||||||
|
|
||||||
|
msg_info "Building Domain-Locker (a lot of patience)"
|
||||||
|
set -a
|
||||||
|
source /opt/domain-locker.env
|
||||||
|
set +a
|
||||||
|
$STD npm run build
|
||||||
|
msg_info "Built Domain-Locker"
|
||||||
|
|
||||||
|
msg_info "Restarting Services"
|
||||||
|
systemctl start domain-locker
|
||||||
|
msg_ok "Restarted Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
exit
|
exit
|
||||||
fi
|
|
||||||
|
|
||||||
ensure_dependencies whois
|
|
||||||
|
|
||||||
if check_for_gh_release "domain-locker" "Lissy93/domain-locker"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop domain-locker
|
|
||||||
msg_info "Service stopped"
|
|
||||||
|
|
||||||
PG_VERSION="17" setup_postgresql
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-locker" "Lissy93/domain-locker" "tarball"
|
|
||||||
|
|
||||||
msg_info "Installing Modules (patience)"
|
|
||||||
cd /opt/domain-locker
|
|
||||||
$STD npm install
|
|
||||||
msg_ok "Installed Modules"
|
|
||||||
|
|
||||||
msg_info "Building Domain-Locker (a lot of patience)"
|
|
||||||
set -a
|
|
||||||
source /opt/domain-locker.env
|
|
||||||
set +a
|
|
||||||
$STD npm run build
|
|
||||||
msg_info "Built Domain-Locker"
|
|
||||||
|
|
||||||
msg_info "Restarting Services"
|
|
||||||
systemctl start domain-locker
|
|
||||||
msg_ok "Restarted Services"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if ! grep -Fq "www-data /usr/bin/php /opt/domain-monitor/cron/check_domains.php" /etc/crontab; then
|
if ! grep -Fq "www-data /usr/bin/php /opt/domain-monitor/cron/check_domains.php" /etc/crontab; then
|
||||||
echo "0 0 * * * www-data /usr/bin/php /opt/domain-monitor/cron/check_domains.php" >>/etc/crontab
|
echo "0 0 * * * www-data /usr/bin/php /opt/domain-monitor/cron/check_domains.php" >> /etc/crontab
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "domain-monitor" "Hosteroid/domain-monitor"; then
|
if check_for_gh_release "domain-monitor" "Hosteroid/domain-monitor"; then
|
||||||
@@ -52,7 +52,6 @@ function update_script() {
|
|||||||
msg_info "Updating Domain Monitor"
|
msg_info "Updating Domain Monitor"
|
||||||
cd /opt/domain-monitor
|
cd /opt/domain-monitor
|
||||||
$STD composer install
|
$STD composer install
|
||||||
chown -R www-data:www-data /opt/domain-monitor
|
|
||||||
msg_ok "Updated Domain Monitor"
|
msg_ok "Updated Domain Monitor"
|
||||||
|
|
||||||
msg_info "Restoring backup"
|
msg_info "Restoring backup"
|
||||||
|
|||||||
@@ -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: Slaviša Arežina (tremor021)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/foldergram/foldergram
|
|
||||||
|
|
||||||
APP="Foldergram"
|
|
||||||
var_tags="${var_tags:-photos}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -d /opt/foldergram ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "foldergram" "foldergram/foldergram"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop foldergram
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "foldergram" "foldergram/foldergram" "tarball"
|
|
||||||
|
|
||||||
msg_info "Installing Foldergram"
|
|
||||||
cd /opt/foldergram
|
|
||||||
$STD pnpm install --frozen-lockfile
|
|
||||||
$STD pnpm run build
|
|
||||||
msg_ok "Installed Foldergram"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start foldergram
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
cleanup_lxc
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4141${CL}"
|
|
||||||
@@ -25,7 +25,7 @@ function update_script() {
|
|||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
setup_mariadb
|
setup_mariadb
|
||||||
NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
ensure_dependencies git
|
ensure_dependencies git
|
||||||
|
|
||||||
msg_info "Updating Ghost"
|
msg_info "Updating Ghost"
|
||||||
|
|||||||
@@ -1,71 +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/actions/runner
|
|
||||||
|
|
||||||
APP="GitHub-Runner"
|
|
||||||
var_tags="${var_tags:-ci}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
var_nesting="${var_nesting:-1}"
|
|
||||||
var_keyctl="${var_keyctl:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /opt/actions-runner/run.sh ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "actions-runner" "actions/runner"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop actions-runner
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up runner configuration"
|
|
||||||
BACKUP_DIR="/opt/actions-runner.backup"
|
|
||||||
mkdir -p "$BACKUP_DIR"
|
|
||||||
for f in .runner .credentials .credentials_rsaparams .env .path; do
|
|
||||||
[[ -f /opt/actions-runner/$f ]] && cp -a /opt/actions-runner/$f "$BACKUP_DIR/"
|
|
||||||
done
|
|
||||||
msg_ok "Backed up configuration"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "actions-runner" "actions/runner" "prebuild" "latest" "/opt/actions-runner" "actions-runner-linux-x64-*.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Restoring runner configuration"
|
|
||||||
for f in .runner .credentials .credentials_rsaparams .env .path; do
|
|
||||||
[[ -f "$BACKUP_DIR/$f" ]] && cp -a "$BACKUP_DIR/$f" /opt/actions-runner/
|
|
||||||
done
|
|
||||||
rm -rf "$BACKUP_DIR"
|
|
||||||
msg_ok "Restored configuration"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start actions-runner
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} After first boot, run config.sh with your token and start the service.${CL}"
|
|
||||||
65
ct/gogs.sh
65
ct/gogs.sh
@@ -1,65 +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://gogs.io/
|
|
||||||
|
|
||||||
APP="Gogs"
|
|
||||||
var_tags="${var_tags:-git;code;devops}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-1024}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /opt/gogs/gogs ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "gogs" "gogs/gogs"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop gogs
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
cp -r /opt/gogs/custom /opt/gogs_custom_backup
|
|
||||||
cp -r /opt/gogs/data /opt/gogs_data_backup
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
cp -r /opt/gogs_custom_backup/. /opt/gogs/custom
|
|
||||||
cp -r /opt/gogs_data_backup/. /opt/gogs/data
|
|
||||||
rm -rf /opt/gogs_custom_backup /opt/gogs_data_backup
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start gogs
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
@@ -53,6 +53,7 @@ function update_script() {
|
|||||||
[[ -f /opt/grist_bak/landing.db ]] && cp /opt/grist_bak/landing.db /opt/grist/landing.db
|
[[ -f /opt/grist_bak/landing.db ]] && cp /opt/grist_bak/landing.db /opt/grist/landing.db
|
||||||
cd /opt/grist
|
cd /opt/grist
|
||||||
$STD yarn install
|
$STD yarn install
|
||||||
|
$STD yarn run install:ee
|
||||||
$STD yarn run build:prod
|
$STD yarn run build:prod
|
||||||
$STD yarn run install:python
|
$STD yarn run install:python
|
||||||
msg_ok "Updated Grist"
|
msg_ok "Updated Grist"
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
___ __ _ ____ ________
|
|
||||||
/ | / /___ (_)___ ___ / _/________ ____ / ____/ /___ __ __
|
|
||||||
/ /| | / / __ \/ / __ \/ _ \______ / // ___/ __ \/ __ \/ / / / __ `/ | /| / /
|
|
||||||
/ ___ |/ / /_/ / / / / / __/_____// // / / /_/ / / / / /___/ / /_/ /| |/ |/ /
|
|
||||||
/_/ |_/_/ .___/_/_/ /_/\___/ /___/_/ \____/_/ /_/\____/_/\__,_/ |__/|__/
|
|
||||||
/_/
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
___ __
|
|
||||||
/ | ____ _____/ /_ ____ _____
|
|
||||||
/ /| | / __ \/ ___/ __ \/ __ \/ ___/
|
|
||||||
/ ___ |/ / / / /__/ / / / /_/ / /
|
|
||||||
/_/ |_/_/ /_/\___/_/ /_/\____/_/
|
|
||||||
|
|
||||||
6
ct/headers/daemonsync
Normal file
6
ct/headers/daemonsync
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ _____
|
||||||
|
/ __ \____ ____ ____ ___ ____ ____ / ___/__ ______ _____
|
||||||
|
/ / / / __ `/ _ \/ __ `__ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/
|
||||||
|
/ /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__
|
||||||
|
/_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/
|
||||||
|
/____/
|
||||||
@@ -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 @@
|
|||||||
__ __ __ __ __
|
|
||||||
/ / / /___ ____ ___ ___ / /___ _/ /_ / /__
|
|
||||||
/ /_/ / __ \/ __ `__ \/ _ \/ / __ `/ __ \/ / _ \
|
|
||||||
/ __ / /_/ / / / / / / __/ / /_/ / /_/ / / __/
|
|
||||||
/_/ /_/\____/_/ /_/ /_/\___/_/\__,_/_.___/_/\___/
|
|
||||||
|
|
||||||
@@ -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 @@
|
|||||||
____ _ __
|
|
||||||
____ _ ______ / __/___ (_) /
|
|
||||||
/ __ \ | /| / / __ \/ /_/ __ \/ / /
|
|
||||||
/ /_/ / |/ |/ / / / / __/ /_/ / / /
|
|
||||||
\____/|__/|__/_/ /_/_/ \____/_/_/
|
|
||||||
|
|
||||||
6
ct/headers/pf2etools
Normal file
6
ct/headers/pf2etools
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ _______ ______ __
|
||||||
|
/ __ \/ __/__ \ ___/_ __/___ ____ / /____
|
||||||
|
/ /_/ / /_ __/ // _ \/ / / __ \/ __ \/ / ___/
|
||||||
|
/ ____/ __// __// __/ / / /_/ / /_/ / (__ )
|
||||||
|
/_/ /_/ /____/\___/_/ \____/\____/_/____/
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
__
|
|
||||||
_____/ /____ ____ _________ _
|
|
||||||
/ ___/ __/ _ \/ __ \______/ ___/ __ `/
|
|
||||||
(__ ) /_/ __/ /_/ /_____/ /__/ /_/ /
|
|
||||||
/____/\__/\___/ .___/ \___/\__,_/
|
|
||||||
/_/
|
|
||||||
6
ct/headers/typesense
Normal file
6
ct/headers/typesense
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
______ _____
|
||||||
|
/_ __/_ ______ ___ / ___/___ ____ ________
|
||||||
|
/ / / / / / __ \/ _ \\__ \/ _ \/ __ \/ ___/ _ \
|
||||||
|
/ / / /_/ / /_/ / __/__/ / __/ / / (__ ) __/
|
||||||
|
/_/ \__, / .___/\___/____/\___/_/ /_/____/\___/
|
||||||
|
/____/_/
|
||||||
6
ct/headers/verdaccio
Normal file
6
ct/headers/verdaccio
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ __ _
|
||||||
|
| | / /__ _________/ /___ ___________(_)___
|
||||||
|
| | / / _ \/ ___/ __ / __ `/ ___/ ___/ / __ \
|
||||||
|
| |/ / __/ / / /_/ / /_/ / /__/ /__/ / /_/ /
|
||||||
|
|___/\___/_/ \__,_/\__,_/\___/\___/_/\____/
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
_ ____ ____ ____
|
|
||||||
| | / / /_ ____ / __ \/ __ )
|
|
||||||
| | /| / / __ \/ __ \/ / / / __ |
|
|
||||||
| |/ |/ / / / / /_/ / /_/ / /_/ /
|
|
||||||
|__/|__/_/ /_/\____/_____/_____/
|
|
||||||
|
|
||||||
@@ -65,8 +65,6 @@ EOF
|
|||||||
|
|
||||||
msg_info "Updating Homarr"
|
msg_info "Updating Homarr"
|
||||||
cp /opt/homarr/redis.conf /etc/redis/redis.conf
|
cp /opt/homarr/redis.conf /etc/redis/redis.conf
|
||||||
sed -i -e '$a\' /etc/redis/redis.conf
|
|
||||||
grep -q '^bind 127.0.0.1 -::1$' /etc/redis/redis.conf || echo "bind 127.0.0.1 -::1" >> /etc/redis/redis.conf
|
|
||||||
rm /etc/nginx/nginx.conf
|
rm /etc/nginx/nginx.conf
|
||||||
cp /opt/homarr/nginx.conf /etc/nginx/templates/nginx.conf
|
cp /opt/homarr/nginx.conf /etc/nginx/templates/nginx.conf
|
||||||
msg_ok "Updated Homarr"
|
msg_ok "Updated Homarr"
|
||||||
|
|||||||
@@ -1,78 +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
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/Pouzor/homelable
|
|
||||||
|
|
||||||
APP="Homelable"
|
|
||||||
var_tags="${var_tags:-monitoring;network;visualization}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/homelable ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "homelable" "Pouzor/homelable"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop homelable
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration and Data"
|
|
||||||
cp /opt/homelable/backend/.env /opt/homelable.env.bak
|
|
||||||
cp -r /opt/homelable/data /opt/homelable_data_bak
|
|
||||||
msg_ok "Backed up Configuration and Data"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homelable" "Pouzor/homelable" "tarball" "latest" "/opt/homelable"
|
|
||||||
|
|
||||||
msg_info "Updating Python Dependencies"
|
|
||||||
cd /opt/homelable/backend
|
|
||||||
$STD uv venv --clear /opt/homelable/backend/.venv
|
|
||||||
$STD uv pip install --python /opt/homelable/backend/.venv/bin/python -r requirements.txt
|
|
||||||
msg_ok "Updated Python Dependencies"
|
|
||||||
|
|
||||||
msg_info "Rebuilding Frontend"
|
|
||||||
cd /opt/homelable/frontend
|
|
||||||
$STD npm ci
|
|
||||||
$STD npm run build
|
|
||||||
msg_ok "Rebuilt Frontend"
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration and Data"
|
|
||||||
cp /opt/homelable.env.bak /opt/homelable/backend/.env
|
|
||||||
cp -r /opt/homelable_data_bak/. /opt/homelable/data/
|
|
||||||
rm -f /opt/homelable.env.bak
|
|
||||||
rm -rf /opt/homelable_data_bak
|
|
||||||
msg_ok "Restored Configuration and Data"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start homelable
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
@@ -1,63 +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: pfassina
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/androidseb25/iGotify-Notification-Assistent
|
|
||||||
|
|
||||||
APP="iGotify"
|
|
||||||
var_tags="${var_tags:-notifications;gotify}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/igotify ]]; then
|
|
||||||
msg_error "No iGotify Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "igotify" "androidseb25/iGotify-Notification-Assistent"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop igotify
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
|
||||||
cp /opt/igotify/.env /opt/igotify.env.bak
|
|
||||||
msg_ok "Backed up Configuration"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "igotify" "androidseb25/iGotify-Notification-Assistent" "prebuild" "latest" "/opt/igotify" "iGotify-Notification-Service-amd64-v*.zip"
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration"
|
|
||||||
cp /opt/igotify.env.bak /opt/igotify/.env
|
|
||||||
rm -f /opt/igotify.env.bak
|
|
||||||
msg_ok "Restored Configuration"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start igotify
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
|
||||||
21
ct/immich.sh
21
ct/immich.sh
@@ -109,7 +109,7 @@ EOF
|
|||||||
msg_ok "Image-processing libraries up to date"
|
msg_ok "Image-processing libraries up to date"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v2.7.5"
|
RELEASE="v2.6.3"
|
||||||
if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
|
if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
|
||||||
if [[ $(cat ~/.immich) > "2.5.1" ]]; then
|
if [[ $(cat ~/.immich) > "2.5.1" ]]; then
|
||||||
msg_info "Enabling Maintenance Mode"
|
msg_info "Enabling Maintenance Mode"
|
||||||
@@ -181,12 +181,6 @@ EOF
|
|||||||
unset SHARP_IGNORE_GLOBAL_LIBVIPS
|
unset SHARP_IGNORE_GLOBAL_LIBVIPS
|
||||||
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
||||||
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
||||||
|
|
||||||
# Patch helmet.json: disable upgrade-insecure-requests for HTTP access
|
|
||||||
if [[ -f "$APP_DIR/helmet.json" ]]; then
|
|
||||||
jq '.contentSecurityPolicy.directives["upgrade-insecure-requests"] = null' "$APP_DIR/helmet.json" >"$APP_DIR/helmet.json.tmp" && mv "$APP_DIR/helmet.json.tmp" "$APP_DIR/helmet.json"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
||||||
sed -i "s|^start|${APP_DIR}/bin/start|" "$APP_DIR"/bin/immich-admin
|
sed -i "s|^start|${APP_DIR}/bin/start|" "$APP_DIR"/bin/immich-admin
|
||||||
|
|
||||||
@@ -275,10 +269,6 @@ EOF
|
|||||||
if ! grep -q '^DB_HOSTNAME=' "$INSTALL_DIR"/.env; then
|
if ! grep -q '^DB_HOSTNAME=' "$INSTALL_DIR"/.env; then
|
||||||
sed -i '/^DB_DATABASE_NAME/a DB_HOSTNAME=127.0.0.1' "$INSTALL_DIR"/.env
|
sed -i '/^DB_DATABASE_NAME/a DB_HOSTNAME=127.0.0.1' "$INSTALL_DIR"/.env
|
||||||
fi
|
fi
|
||||||
if ! grep -q 'HELMET_FILE' "$INSTALL_DIR"/.env; then
|
|
||||||
sed -i -e '$a\' "$INSTALL_DIR"/.env
|
|
||||||
echo "IMMICH_HELMET_FILE=true" >>"$INSTALL_DIR"/.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
if grep -q 'ExecStart=/usr/bin/node' /etc/systemd/system/immich-web.service; then
|
if grep -q 'ExecStart=/usr/bin/node' /etc/systemd/system/immich-web.service; then
|
||||||
sed -i '/^EnvironmentFile=/d' /etc/systemd/system/immich-web.service
|
sed -i '/^EnvironmentFile=/d' /etc/systemd/system/immich-web.service
|
||||||
@@ -309,8 +299,7 @@ function compile_libjxl() {
|
|||||||
SOURCE=${SOURCE_DIR}/libjxl
|
SOURCE=${SOURCE_DIR}/libjxl
|
||||||
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
||||||
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
||||||
LIBJXL_REVISION="794a5dcf0d54f9f0b20d288a12e87afb91d20dfc"
|
: "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
||||||
# : "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
|
||||||
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libjxl"
|
msg_info "Recompiling libjxl"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
@@ -354,8 +343,7 @@ function compile_libjxl() {
|
|||||||
function compile_libheif() {
|
function compile_libheif() {
|
||||||
SOURCE=${SOURCE_DIR}/libheif
|
SOURCE=${SOURCE_DIR}/libheif
|
||||||
ensure_dependencies libaom-dev
|
ensure_dependencies libaom-dev
|
||||||
LIBHEIF_REVISION="35dad50a9145332a7bfdf1ff6aef6801fb613d68"
|
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
||||||
# : "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
|
||||||
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libheif"
|
msg_info "Recompiling libheif"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
@@ -386,8 +374,7 @@ function compile_libheif() {
|
|||||||
|
|
||||||
function compile_libraw() {
|
function compile_libraw() {
|
||||||
SOURCE=${SOURCE_DIR}/libraw
|
SOURCE=${SOURCE_DIR}/libraw
|
||||||
LIBRAW_REVISION="0b56545a4f828743f28a4345cdfdd4c49f9f9a2a"
|
: "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
||||||
# : "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
|
||||||
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libraw"
|
msg_info "Recompiling libraw"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
|
|||||||
@@ -27,9 +27,6 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
|
||||||
|
|
||||||
msg_info "Updating ${APP} LXC"
|
msg_info "Updating ${APP} LXC"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt -y upgrade
|
$STD apt -y upgrade
|
||||||
|
|||||||
@@ -1,71 +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/nearai/ironclaw
|
|
||||||
|
|
||||||
APP="IronClaw"
|
|
||||||
var_tags="${var_tags:-ai;agent;security}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /usr/local/bin/ironclaw ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "ironclaw-bin" "nearai/ironclaw"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop ironclaw
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
|
||||||
cp /root/.ironclaw/.env /root/ironclaw.env.bak
|
|
||||||
msg_ok "Backed up Configuration"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "ironclaw-bin" "nearai/ironclaw" "prebuild" "latest" "/usr/local/bin" \
|
|
||||||
"ironclaw-$(uname -m)-unknown-linux-$([[ -f /etc/alpine-release ]] && echo "musl" || echo "gnu").tar.gz"
|
|
||||||
chmod +x /usr/local/bin/ironclaw
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration"
|
|
||||||
cp /root/ironclaw.env.bak /root/.ironclaw/.env
|
|
||||||
rm -f /root/ironclaw.env.bak
|
|
||||||
msg_ok "Restored Configuration"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start ironclaw
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Complete setup by running:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}ironclaw onboard${CL}"
|
|
||||||
echo -e "${INFO}${YW} Then start the service:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}systemctl start ironclaw${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access the Web UI at:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
echo -e "${INFO}${YW} Auth token and database credentials:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}cat /root/.ironclaw/.env${CL}"
|
|
||||||
@@ -32,16 +32,10 @@ function update_script() {
|
|||||||
if ! grep -qEi 'ubuntu' /etc/os-release; then
|
if ! grep -qEi 'ubuntu' /etc/os-release; then
|
||||||
msg_info "Updating Intel Dependencies"
|
msg_info "Updating Intel Dependencies"
|
||||||
rm -f ~/.intel-* || true
|
rm -f ~/.intel-* || true
|
||||||
|
fetch_and_deploy_gh_release "intel-igc-core-2" "intel/intel-graphics-compiler" "binary" "latest" "" "intel-igc-core-2_*_amd64.deb"
|
||||||
# Fetch compute-runtime first so /tmp/gh_rel.json is populated for IGC tag resolution
|
fetch_and_deploy_gh_release "intel-igc-opencl-2" "intel/intel-graphics-compiler" "binary" "latest" "" "intel-igc-opencl-2_*_amd64.deb"
|
||||||
fetch_and_deploy_gh_release "intel-libgdgmm12" "intel/compute-runtime" "binary" "latest" "" "libigdgmm12_*_amd64.deb"
|
fetch_and_deploy_gh_release "intel-libgdgmm12" "intel/compute-runtime" "binary" "latest" "" "libigdgmm12_*_amd64.deb"
|
||||||
fetch_and_deploy_gh_release "intel-opencl-icd" "intel/compute-runtime" "binary" "latest" "" "intel-opencl-icd_*_amd64.deb"
|
fetch_and_deploy_gh_release "intel-opencl-icd" "intel/compute-runtime" "binary" "latest" "" "intel-opencl-icd_*_amd64.deb"
|
||||||
|
|
||||||
local igc_tag
|
|
||||||
_resolve_igc_tag igc_tag
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "intel-igc-core-2" "intel/intel-graphics-compiler" "binary" "$igc_tag" "" "intel-igc-core-2_*_amd64.deb"
|
|
||||||
fetch_and_deploy_gh_release "intel-igc-opencl-2" "intel/intel-graphics-compiler" "binary" "$igc_tag" "" "intel-igc-opencl-2_*_amd64.deb"
|
|
||||||
msg_ok "Updated Intel Dependencies"
|
msg_ok "Updated Intel Dependencies"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
26
ct/kasm.sh
26
ct/kasm.sh
@@ -15,7 +15,6 @@ var_version="${var_version:-13}"
|
|||||||
var_unprivileged="${var_unprivileged:-0}"
|
var_unprivileged="${var_unprivileged:-0}"
|
||||||
var_fuse="${var_fuse:-yes}"
|
var_fuse="${var_fuse:-yes}"
|
||||||
var_tun="${var_tun:-yes}"
|
var_tun="${var_tun:-yes}"
|
||||||
var_kasm_version="${var_kasm_version:-}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
variables
|
variables
|
||||||
@@ -33,21 +32,18 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Checking for new version"
|
msg_info "Checking for new version"
|
||||||
CURRENT_VERSION=$(readlink -f /opt/kasm/current | awk -F'/' '{print $4}')
|
CURRENT_VERSION=$(readlink -f /opt/kasm/current | awk -F'/' '{print $4}')
|
||||||
KASM_VERSION=$(curl -s https://kasm.com/downloads | grep -oP '<h1[^>]*>.*?</h1>' | sed -E 's/<\/?h1[^>]*>//g' | grep -oP '\d+\.\d+\.\d+')
|
KASM_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_[0-9]+\.[0-9]+\.[0-9]+\.[a-z0-9]+\.tar\.gz' | head -n 1)
|
||||||
KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION:-var_kasm_version}.tar.gz"
|
if [[ -z "$KASM_URL" ]]; then
|
||||||
|
SERVICE_IMAGE_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_service_images_amd64_[0-9]+\.[0-9]+\.[0-9]+\.tar\.gz' | head -n 1)
|
||||||
|
if [[ -n "$SERVICE_IMAGE_URL" ]]; then
|
||||||
|
KASM_VERSION=$(echo "$SERVICE_IMAGE_URL" | sed -E 's/.*kasm_release_service_images_amd64_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
|
||||||
|
KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
KASM_VERSION=$(echo "$KASM_URL" | sed -E 's/.*kasm_release_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
|
||||||
|
fi
|
||||||
|
|
||||||
# KASM_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_[0-9]+\.[0-9]+\.[0-9]+\.[a-z0-9]+\.tar\.gz' | head -n 1)
|
if [[ -z "$KASM_URL" ]] || [[ -z "$KASM_VERSION" ]]; then
|
||||||
# if [[ -z "$KASM_URL" ]]; then
|
|
||||||
# SERVICE_IMAGE_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_service_images_amd64_[0-9]+\.[0-9]+\.[0-9]+\.tar\.gz' | head -n 1)
|
|
||||||
# if [[ -n "$SERVICE_IMAGE_URL" ]]; then
|
|
||||||
# KASM_VERSION=$(echo "$SERVICE_IMAGE_URL" | sed -E 's/.*kasm_release_service_images_amd64_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
|
|
||||||
# KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz"
|
|
||||||
# fi
|
|
||||||
# else
|
|
||||||
# KASM_VERSION=$(echo "$KASM_URL" | sed -E 's/.*kasm_release_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
|
|
||||||
# fi
|
|
||||||
|
|
||||||
if [[ -z "$KASM_VERSION" ]] || [[ -z "$KASM_URL" ]]; then
|
|
||||||
msg_error "Unable to detect latest Kasm release URL."
|
msg_error "Unable to detect latest Kasm release URL."
|
||||||
exit 250
|
exit 250
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -29,8 +29,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
|
|
||||||
if check_for_gh_release "kima-hub" "Chevron7Locked/kima-hub"; then
|
if check_for_gh_release "kima-hub" "Chevron7Locked/kima-hub"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop kima-frontend kima-backend kima-analyzer kima-analyzer-clap
|
systemctl stop kima-frontend kima-backend kima-analyzer kima-analyzer-clap
|
||||||
|
|||||||
@@ -38,18 +38,12 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating LiteLLM"
|
msg_info "Updating LiteLLM"
|
||||||
$STD "$VENV_PATH/bin/python" -m pip install --upgrade litellm[proxy] prisma
|
$STD "$VENV_PATH/bin/python" -m pip install --upgrade litellm[proxy] prisma
|
||||||
$STD "$VENV_PATH/bin/prisma" generate
|
|
||||||
msg_ok "LiteLLM updated"
|
msg_ok "LiteLLM updated"
|
||||||
|
|
||||||
msg_info "Updating DB Schema"
|
msg_info "Updating DB Schema"
|
||||||
$STD /opt/litellm/.venv/bin/litellm --config /opt/litellm/litellm.yaml --use_prisma_db_push --skip_server_startup
|
$STD uv --directory=/opt/litellm run litellm --config /opt/litellm/litellm.yaml --use_prisma_db_push --skip_server_startup
|
||||||
msg_ok "DB Schema Updated"
|
msg_ok "DB Schema Updated"
|
||||||
|
|
||||||
msg_info "Updating Service"
|
|
||||||
sed -i 's|ExecStart=uv --directory=/opt/litellm run litellm|ExecStart=/opt/litellm/.venv/bin/litellm|' /etc/systemd/system/litellm.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
msg_ok "Updated Service"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start litellm
|
systemctl start litellm
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
@@ -30,16 +30,16 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP '<a\s[^>]*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
|
DEB_URL=$(curl -s 'https://lyrion.org/getting-started/' | grep -oP '<a\s[^>]*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
|
||||||
RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
|
RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
|
||||||
DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
|
DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
|
||||||
if [[ ! -f /opt/lyrion_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/lyrion_version.txt)" ]]; then
|
if [[ ! -f /opt/lyrion_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/lyrion_version.txt)" ]]; then
|
||||||
msg_info "Updating $APP to ${RELEASE}"
|
msg_info "Updating $APP to ${RELEASE}"
|
||||||
curl_with_retry "$DEB_URL" "$DEB_FILE"
|
curl -fsSL -o "$DEB_FILE" "$DEB_URL"
|
||||||
$STD apt install "$DEB_FILE" -y
|
$STD apt install "$DEB_FILE" -y
|
||||||
systemctl restart lyrionmusicserver
|
systemctl restart lyrion
|
||||||
rm -f "$DEB_FILE"
|
$STD rm -f "$DEB_FILE"
|
||||||
echo "${RELEASE}" >/opt/lyrion_version.txt
|
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||||
msg_ok "Updated $APP to ${RELEASE}"
|
msg_ok "Updated $APP to ${RELEASE}"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
else
|
||||||
|
|||||||
10
ct/mealie.sh
10
ct/mealie.sh
@@ -40,7 +40,7 @@ function update_script() {
|
|||||||
cp -f /opt/mealie/mealie.env /opt/mealie.env
|
cp -f /opt/mealie/mealie.env /opt/mealie.env
|
||||||
msg_ok "Backup completed"
|
msg_ok "Backup completed"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" "latest" "/opt/mealie"
|
||||||
|
|
||||||
msg_info "Installing Python Dependencies with uv"
|
msg_info "Installing Python Dependencies with uv"
|
||||||
cd /opt/mealie
|
cd /opt/mealie
|
||||||
@@ -49,10 +49,9 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Building Frontend"
|
msg_info "Building Frontend"
|
||||||
MEALIE_VERSION=$(<$HOME/.mealie)
|
MEALIE_VERSION=$(<$HOME/.mealie)
|
||||||
SITE_SETTINGS=$(find /opt/mealie/frontend -name "site-settings.vue" -path "*/admin/*" | head -1)
|
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
||||||
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" "$SITE_SETTINGS"
|
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
||||||
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" "$SITE_SETTINGS"
|
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
||||||
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" "$SITE_SETTINGS"
|
|
||||||
export NUXT_TELEMETRY_DISABLED=1
|
export NUXT_TELEMETRY_DISABLED=1
|
||||||
cd /opt/mealie/frontend
|
cd /opt/mealie/frontend
|
||||||
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
||||||
@@ -98,3 +97,4 @@ 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} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ function update_script() {
|
|||||||
$STD corepack enable
|
$STD corepack enable
|
||||||
$STD corepack prepare pnpm --activate || true
|
$STD corepack prepare pnpm --activate || true
|
||||||
fi
|
fi
|
||||||
echo 'onlyBuiltDependencies=*' >> .npmrc
|
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm run build
|
$STD pnpm run build
|
||||||
msg_ok "Built Frontend"
|
msg_ok "Built Frontend"
|
||||||
|
|||||||
@@ -28,8 +28,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
|
||||||
|
|
||||||
if check_for_gh_release "myip" "jason5ng32/MyIP"; then
|
if check_for_gh_release "myip" "jason5ng32/MyIP"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop myip
|
systemctl stop myip
|
||||||
|
|||||||
@@ -1,83 +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
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/mattogodoy/nametag
|
|
||||||
|
|
||||||
APP="Nametag"
|
|
||||||
var_tags="${var_tags:-contacts;crm}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-8}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/nametag ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "nametag" "mattogodoy/nametag"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop nametag
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
cp /opt/nametag/.env /opt/nametag.env.bak
|
|
||||||
cp -r /opt/nametag/data /opt/nametag_data_bak
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nametag" "mattogodoy/nametag" "tarball" "latest" "/opt/nametag"
|
|
||||||
|
|
||||||
msg_info "Rebuilding Application"
|
|
||||||
cd /opt/nametag
|
|
||||||
$STD npm ci
|
|
||||||
set -a
|
|
||||||
source /opt/nametag/.env
|
|
||||||
set +a
|
|
||||||
$STD npx prisma generate
|
|
||||||
$STD npm run build
|
|
||||||
cp -r /opt/nametag/.next/static /opt/nametag/.next/standalone/.next/static
|
|
||||||
cp -r /opt/nametag/public /opt/nametag/.next/standalone/public
|
|
||||||
msg_ok "Rebuilt Application"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
cp /opt/nametag.env.bak /opt/nametag/.env
|
|
||||||
cp -r /opt/nametag_data_bak/. /opt/nametag/data/
|
|
||||||
rm -f /opt/nametag.env.bak
|
|
||||||
rm -rf /opt/nametag_data_bak
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Running Migrations"
|
|
||||||
cd /opt/nametag
|
|
||||||
$STD npx prisma migrate deploy
|
|
||||||
msg_ok "Ran Migrations"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start nametag
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
@@ -86,14 +86,12 @@ Wants=network-online.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
ExecStartPre=-/bin/mkdir -p /tmp/nginx/body /run/nginx
|
|
||||||
ExecStartPre=/usr/local/openresty/nginx/sbin/nginx -t
|
ExecStartPre=/usr/local/openresty/nginx/sbin/nginx -t
|
||||||
ExecStart=/usr/local/openresty/nginx/sbin/nginx -g 'daemon off;'
|
ExecStart=/usr/local/openresty/nginx/sbin/nginx -g 'daemon off;'
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl unmask openresty 2>/dev/null || true
|
systemctl unmask openresty 2>/dev/null || true
|
||||||
systemctl restart openresty
|
systemctl restart openresty
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v6.1.0"
|
RELEASE="v5.2.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,87 +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://openthread.io/guides/border-router
|
|
||||||
|
|
||||||
APP="OpenThread-BR"
|
|
||||||
var_tags="${var_tags:-thread;iot;border-router;matter}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-0}"
|
|
||||||
var_tun="${var_tun:-yes}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/ot-br-posix ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd /opt/ot-br-posix
|
|
||||||
LOCAL_COMMIT=$(git rev-parse HEAD)
|
|
||||||
$STD git fetch --depth 1 origin main
|
|
||||||
REMOTE_COMMIT=$(git rev-parse origin/main)
|
|
||||||
|
|
||||||
if [[ "${LOCAL_COMMIT}" == "${REMOTE_COMMIT}" ]]; then
|
|
||||||
msg_ok "Already up to date (${LOCAL_COMMIT:0:7})"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop otbr-web
|
|
||||||
systemctl stop otbr-agent
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
|
|
||||||
msg_info "Updating Source"
|
|
||||||
$STD git reset --hard origin/main
|
|
||||||
$STD git submodule update --depth 1 --init --recursive
|
|
||||||
msg_ok "Updated Source"
|
|
||||||
|
|
||||||
msg_info "Rebuilding OpenThread Border Router (Patience)"
|
|
||||||
cd /opt/ot-br-posix/build
|
|
||||||
$STD cmake -GNinja \
|
|
||||||
-DBUILD_TESTING=OFF \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
||||||
-DOTBR_DBUS=ON \
|
|
||||||
-DOTBR_MDNS=openthread \
|
|
||||||
-DOTBR_REST=ON \
|
|
||||||
-DOTBR_WEB=ON \
|
|
||||||
-DOTBR_BORDER_ROUTING=ON \
|
|
||||||
-DOTBR_BACKBONE_ROUTER=ON \
|
|
||||||
-DOT_FIREWALL=ON \
|
|
||||||
-DOT_POSIX_NAT64_CIDR="192.168.255.0/24" \
|
|
||||||
..
|
|
||||||
$STD ninja
|
|
||||||
$STD ninja install
|
|
||||||
msg_ok "Rebuilt OpenThread Border Router"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start otbr-agent
|
|
||||||
systemctl start otbr-web
|
|
||||||
msg_ok "Started Services"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
|
||||||
@@ -28,7 +28,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
if check_for_gh_release "outline" "outline/outline"; then
|
if check_for_gh_release "outline" "outline/outline"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
|
|||||||
@@ -1,69 +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: pajjski
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/a1ex4/ownfoil
|
|
||||||
|
|
||||||
APP="ownfoil"
|
|
||||||
var_tags="${var_tags:-gaming}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-1024}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -d /opt/ownfoil ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "ownfoil" "a1ex4/ownfoil"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop ownfoil
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
cp -r /opt/ownfoil/app/config /opt/ownfoil_data_backup
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ownfoil" "a1ex4/ownfoil" "tarball"
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
cd /opt/ownfoil
|
|
||||||
$STD source .venv/bin/activate
|
|
||||||
$STD uv pip install -r requirements.txt
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
cp -r /opt/ownfoil_data_backup /opt/ownfoil/app/config
|
|
||||||
rm -rf /opt/ownfoil_data_backup
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start ownfoil
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8465${CL}"
|
|
||||||
@@ -69,33 +69,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Running database migrations"
|
msg_info "Running database migrations"
|
||||||
cd /opt/pangolin
|
cd /opt/pangolin
|
||||||
|
ENVIRONMENT=prod $STD npx drizzle-kit push --config drizzle.sqlite.config.ts
|
||||||
# Pre-apply potentially destructive schema changes safely so drizzle-kit
|
|
||||||
# does not recreate tables (which would delete all rows).
|
|
||||||
local DB="/opt/pangolin/config/db/db.sqlite"
|
|
||||||
if [[ -f "$DB" ]]; then
|
|
||||||
sqlite3 "$DB" "ALTER TABLE 'orgs' ADD COLUMN 'settingsLogRetentionDaysConnection' integer DEFAULT 0 NOT NULL;" 2>/dev/null || true
|
|
||||||
sqlite3 "$DB" "ALTER TABLE 'clientSitesAssociationsCache' ADD COLUMN 'isJitMode' integer DEFAULT 0 NOT NULL;" 2>/dev/null || true
|
|
||||||
|
|
||||||
# Create new role-mapping tables and migrate data before drizzle-kit
|
|
||||||
# drops the roleId columns from userOrgs and userInvites.
|
|
||||||
sqlite3 "$DB" "CREATE TABLE IF NOT EXISTS 'userOrgRoles' (
|
|
||||||
'userId' text NOT NULL REFERENCES 'user'('id') ON DELETE CASCADE,
|
|
||||||
'orgId' text NOT NULL REFERENCES 'orgs'('orgId') ON DELETE CASCADE,
|
|
||||||
'roleId' integer NOT NULL REFERENCES 'roles'('roleId') ON DELETE CASCADE,
|
|
||||||
UNIQUE('userId', 'orgId', 'roleId')
|
|
||||||
);" 2>/dev/null || true
|
|
||||||
sqlite3 "$DB" "INSERT OR IGNORE INTO 'userOrgRoles' (userId, orgId, roleId) SELECT userId, orgId, roleId FROM 'userOrgs' WHERE roleId IS NOT NULL;" 2>/dev/null || true
|
|
||||||
|
|
||||||
sqlite3 "$DB" "CREATE TABLE IF NOT EXISTS 'userInviteRoles' (
|
|
||||||
'inviteId' text NOT NULL REFERENCES 'userInvites'('inviteId') ON DELETE CASCADE,
|
|
||||||
'roleId' integer NOT NULL REFERENCES 'roles'('roleId') ON DELETE CASCADE,
|
|
||||||
PRIMARY KEY('inviteId', 'roleId')
|
|
||||||
);" 2>/dev/null || true
|
|
||||||
sqlite3 "$DB" "INSERT OR IGNORE INTO 'userInviteRoles' (inviteId, roleId) SELECT inviteId, roleId FROM 'userInvites' WHERE roleId IS NOT NULL;" 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
ENVIRONMENT=prod $STD npx drizzle-kit push --force --config drizzle.sqlite.config.ts
|
|
||||||
msg_ok "Ran database migrations"
|
msg_ok "Ran database migrations"
|
||||||
|
|
||||||
msg_info "Updating Badger plugin version"
|
msg_info "Updating Badger plugin version"
|
||||||
|
|||||||
27
ct/papra.sh
27
ct/papra.sh
@@ -35,37 +35,14 @@ function update_script() {
|
|||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
msg_info "Backing up Configuration"
|
||||||
if [[ -f /opt/papra/apps/papra-server/.env ]]; then
|
cp /opt/papra/apps/papra-server/.env /opt/papra_env.bak
|
||||||
cp /opt/papra/apps/papra-server/.env /opt/papra_env.bak
|
|
||||||
fi
|
|
||||||
msg_ok "Backed up Configuration"
|
msg_ok "Backed up Configuration"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "papra" "papra-hq/papra" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "papra" "papra-hq/papra" "tarball"
|
||||||
|
|
||||||
msg_info "Building Application"
|
msg_info "Building Application"
|
||||||
cd /opt/papra
|
cd /opt/papra
|
||||||
if [[ -f /opt/papra_env.bak ]]; then
|
cp /opt/papra_env.bak /opt/papra/apps/papra-server/.env
|
||||||
cp /opt/papra_env.bak /opt/papra/apps/papra-server/.env
|
|
||||||
else
|
|
||||||
msg_warn ".env missing, regenerating from defaults"
|
|
||||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
|
||||||
cat <<EOF >/opt/papra/apps/papra-server/.env
|
|
||||||
NODE_ENV=production
|
|
||||||
SERVER_SERVE_PUBLIC_DIR=true
|
|
||||||
PORT=1221
|
|
||||||
DATABASE_URL=file:/opt/papra_data/db/db.sqlite
|
|
||||||
DOCUMENT_STORAGE_FILESYSTEM_ROOT=/opt/papra_data/documents
|
|
||||||
PAPRA_CONFIG_DIR=/opt/papra_data
|
|
||||||
AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
|
||||||
BETTER_AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
|
||||||
BETTER_AUTH_TELEMETRY=0
|
|
||||||
CLIENT_BASE_URL=http://${LOCAL_IP}:1221
|
|
||||||
SERVER_BASE_URL=http://${LOCAL_IP}:1221
|
|
||||||
EMAILS_DRY_RUN=true
|
|
||||||
INGESTION_FOLDER_IS_ENABLED=true
|
|
||||||
INGESTION_FOLDER_ROOT_PATH=/opt/papra_data/ingestion
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm --filter "@papra/app-client..." run build
|
$STD pnpm --filter "@papra/app-client..." run build
|
||||||
$STD pnpm --filter "@papra/app-server..." run build
|
$STD pnpm --filter "@papra/app-server..." run build
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: doge0420
|
# Author: TheRealVira
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/lyqht/mini-qr
|
# Source: https://pf2etools.com/ | Github: https://github.com/Pf2eToolsOrg/Pf2eTools
|
||||||
|
|
||||||
APP="Mini-QR"
|
APP="Pf2eTools"
|
||||||
var_tags="${var_tags:-QRcode;}"
|
var_tags="${var_tags:-wiki}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-1}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-512}"
|
||||||
var_disk="${var_disk:-6}"
|
var_disk="${var_disk:-6}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
@@ -24,30 +24,26 @@ function update_script() {
|
|||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
if [[ ! -d /opt/mini-qr ]]; then
|
if [[ ! -d "/opt/${APP}" ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
if check_for_gh_release "pf2etools" "Pf2eToolsOrg/Pf2eTools"; then
|
||||||
|
msg_info "Updating System"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
msg_ok "Updated System"
|
||||||
|
|
||||||
if check_for_gh_release "mini-qr" "lyqht/mini-qr"; then
|
rm -rf /opt/Pf2eTools
|
||||||
msg_info "Stopping Service"
|
fetch_and_deploy_gh_release "pf2etools" "Pf2eToolsOrg/Pf2eTools" "tarball" "latest" "/opt/Pf2eTools"
|
||||||
systemctl stop caddy
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mini-qr" "lyqht/mini-qr" "tarball"
|
msg_info "Updating ${APP}"
|
||||||
|
cd /opt/Pf2eTools
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
cd /opt/mini-qr
|
|
||||||
$STD npm install
|
$STD npm install
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Building MiniQR"
|
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
msg_ok "Built MiniQR"
|
chown -R www-data: "/opt/${APP}"
|
||||||
|
chmod -R 755 "/opt/${APP}"
|
||||||
msg_info "Starting Service"
|
msg_ok "Updated ${APP}"
|
||||||
systemctl start caddy
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
@@ -44,7 +44,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Installing Python Dependencies"
|
msg_info "Installing Python Dependencies"
|
||||||
cd /opt/profilarr/backend
|
cd /opt/profilarr/backend
|
||||||
$STD uv venv --clear /opt/profilarr/backend/.venv
|
$STD uv venv /opt/profilarr/backend/.venv
|
||||||
sed 's/==/>=/g' requirements.txt >requirements-relaxed.txt
|
sed 's/==/>=/g' requirements.txt >requirements-relaxed.txt
|
||||||
$STD uv pip install --python /opt/profilarr/backend/.venv/bin/python -r requirements-relaxed.txt
|
$STD uv pip install --python /opt/profilarr/backend/.venv/bin/python -r requirements-relaxed.txt
|
||||||
rm -f requirements-relaxed.txt
|
rm -f requirements-relaxed.txt
|
||||||
|
|||||||
210
ct/reitti.sh
210
ct/reitti.sh
@@ -37,136 +37,39 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Migrate v3 -> v4: Remove RabbitMQ (no longer required) / Photon / Spring Settings
|
if [ ! -d /var/cache/nginx/tiles ]; then
|
||||||
if systemctl is-enabled --quiet rabbitmq-server 2>/dev/null; then
|
msg_info "Installing Nginx Tile Cache"
|
||||||
msg_info "Migrating to v4: Removing RabbitMQ"
|
mkdir -p /var/cache/nginx/tiles
|
||||||
systemctl stop rabbitmq-server
|
$STD apt install -y nginx
|
||||||
systemctl disable rabbitmq-server
|
cat <<EOF >/etc/nginx/nginx.conf
|
||||||
$STD apt-get purge -y rabbitmq-server erlang-base
|
user www-data;
|
||||||
$STD apt-get autoremove -y
|
|
||||||
msg_ok "Removed RabbitMQ"
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
http {
|
||||||
|
proxy_cache_path /var/cache/nginx/tiles levels=1:2 keys_zone=tiles:10m max_size=1g inactive=30d use_temp_path=off;
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
location / {
|
||||||
|
proxy_pass https://tile.openstreetmap.org/;
|
||||||
|
proxy_set_header Host tile.openstreetmap.org;
|
||||||
|
proxy_set_header User-Agent "Reitti/1.0";
|
||||||
|
proxy_cache tiles;
|
||||||
|
proxy_cache_valid 200 30d;
|
||||||
|
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chown -R www-data:www-data /var/cache/nginx
|
||||||
|
chmod -R 750 /var/cache/nginx
|
||||||
|
systemctl restart nginx
|
||||||
|
echo "reitti.ui.tiles.cache.url=http://127.0.0.1" >> /opt/reitti/application.properties
|
||||||
|
systemctl restart reitti
|
||||||
|
msg_info "Installed Nginx Tile Cache"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if systemctl is-enabled --quiet photon 2>/dev/null; then
|
|
||||||
msg_info "Migrating to v4: Removing Photon service"
|
|
||||||
systemctl stop photon
|
|
||||||
systemctl disable photon
|
|
||||||
rm -f /etc/systemd/system/photon.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
msg_ok "Removed Photon service"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if grep -q "spring.rabbitmq\|PHOTON_BASE_URL\|PROCESSING_WAIT_TIME\|DANGEROUS_LIFE" /opt/reitti/application.properties 2>/dev/null; then
|
|
||||||
msg_info "Migrating to v4: Rewriting application.properties"
|
|
||||||
local DB_URL DB_USER DB_PASS
|
|
||||||
DB_URL=$(grep '^spring.datasource.url=' /opt/reitti/application.properties | cut -d'=' -f2-)
|
|
||||||
DB_USER=$(grep '^spring.datasource.username=' /opt/reitti/application.properties | cut -d'=' -f2-)
|
|
||||||
DB_PASS=$(grep '^spring.datasource.password=' /opt/reitti/application.properties | cut -d'=' -f2-)
|
|
||||||
cp /opt/reitti/application.properties /opt/reitti/application.properties.bak
|
|
||||||
cat <<PROPEOF >/opt/reitti/application.properties
|
|
||||||
# Server configuration
|
|
||||||
server.port=8080
|
|
||||||
server.servlet.context-path=/
|
|
||||||
server.forward-headers-strategy=framework
|
|
||||||
server.compression.enabled=true
|
|
||||||
server.compression.min-response-size=1024
|
|
||||||
server.compression.mime-types=text/plain,application/json
|
|
||||||
|
|
||||||
# Logging configuration
|
|
||||||
logging.level.root=INFO
|
|
||||||
logging.level.org.hibernate.engine.jdbc.spi.SqlExceptionHelper=FATAL
|
|
||||||
logging.level.com.dedicatedcode.reitti=INFO
|
|
||||||
|
|
||||||
# Internationalization
|
|
||||||
spring.messages.basename=messages
|
|
||||||
spring.messages.encoding=UTF-8
|
|
||||||
spring.messages.cache-duration=3600
|
|
||||||
spring.messages.fallback-to-system-locale=false
|
|
||||||
|
|
||||||
# PostgreSQL configuration
|
|
||||||
spring.datasource.url=${DB_URL}
|
|
||||||
spring.datasource.username=${DB_USER}
|
|
||||||
spring.datasource.password=${DB_PASS}
|
|
||||||
spring.datasource.hikari.maximum-pool-size=20
|
|
||||||
|
|
||||||
# Redis configuration
|
|
||||||
spring.data.redis.host=127.0.0.1
|
|
||||||
spring.data.redis.port=6379
|
|
||||||
spring.data.redis.username=
|
|
||||||
spring.data.redis.password=
|
|
||||||
spring.data.redis.database=0
|
|
||||||
spring.cache.redis.key-prefix=
|
|
||||||
|
|
||||||
spring.cache.cache-names=processed-visits,significant-places,users,magic-links,configurations,transport-mode-configs,avatarThumbnails,avatarData,user-settings
|
|
||||||
spring.cache.redis.time-to-live=1d
|
|
||||||
|
|
||||||
# Upload configuration
|
|
||||||
spring.servlet.multipart.max-file-size=5GB
|
|
||||||
spring.servlet.multipart.max-request-size=5GB
|
|
||||||
server.tomcat.max-part-count=100
|
|
||||||
|
|
||||||
# Rqueue configuration
|
|
||||||
rqueue.web.enable=false
|
|
||||||
rqueue.job.enabled=false
|
|
||||||
rqueue.message.durability.in-terminal-state=0
|
|
||||||
rqueue.key.prefix=\${spring.cache.redis.key-prefix}
|
|
||||||
rqueue.message.converter.provider.class=com.dedicatedcode.reitti.config.RQueueCustomMessageConverter
|
|
||||||
|
|
||||||
# Application-specific settings
|
|
||||||
reitti.server.advertise-uri=
|
|
||||||
|
|
||||||
reitti.security.local-login.disable=false
|
|
||||||
|
|
||||||
# OIDC / Security Settings
|
|
||||||
reitti.security.oidc.enabled=false
|
|
||||||
reitti.security.oidc.registration.enabled=false
|
|
||||||
|
|
||||||
reitti.import.batch-size=10000
|
|
||||||
reitti.import.processing-idle-start-time=10
|
|
||||||
|
|
||||||
reitti.geo-point-filter.max-speed-kmh=1000
|
|
||||||
reitti.geo-point-filter.max-accuracy-meters=100
|
|
||||||
reitti.geo-point-filter.history-lookback-hours=24
|
|
||||||
reitti.geo-point-filter.window-size=50
|
|
||||||
|
|
||||||
reitti.process-data.schedule=0 */10 * * * *
|
|
||||||
reitti.process-data.refresh-views.schedule=0 0 4 * * *
|
|
||||||
reitti.imports.schedule=0 5/10 * * * *
|
|
||||||
reitti.imports.owntracks-recorder.schedule=\${reitti.imports.schedule}
|
|
||||||
|
|
||||||
# Geocoding service configuration
|
|
||||||
reitti.geocoding.max-errors=10
|
|
||||||
reitti.geocoding.photon.base-url=
|
|
||||||
|
|
||||||
# Tiles Configuration
|
|
||||||
reitti.ui.tiles.cache.url=http://127.0.0.1
|
|
||||||
reitti.ui.tiles.default.service=https://tile.openstreetmap.org/{z}/{x}/{y}.png
|
|
||||||
reitti.ui.tiles.default.attribution=© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors
|
|
||||||
|
|
||||||
# Data management configuration
|
|
||||||
reitti.data-management.enabled=false
|
|
||||||
reitti.data-management.preview-cleanup.cron=0 0 4 * * *
|
|
||||||
|
|
||||||
reitti.storage.path=data/
|
|
||||||
reitti.storage.cleanup.cron=0 0 4 * * *
|
|
||||||
|
|
||||||
# Location data density normalization
|
|
||||||
reitti.location.density.target-points-per-minute=4
|
|
||||||
|
|
||||||
# Logging buffer
|
|
||||||
reitti.logging.buffer-size=1000
|
|
||||||
reitti.logging.max-buffer-size=10000
|
|
||||||
|
|
||||||
spring.config.import=optional:oidc.properties
|
|
||||||
PROPEOF
|
|
||||||
# Update reitti.service dependencies
|
|
||||||
if [[ -f /etc/systemd/system/reitti.service ]]; then
|
|
||||||
sed -i 's/ rabbitmq-server\.service//g; s/ photon\.service//g' /etc/systemd/system/reitti.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
fi
|
|
||||||
msg_ok "Rewrote application.properties (backup: application.properties.bak)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "reitti" "dedicatedcode/reitti"; then
|
if check_for_gh_release "reitti" "dedicatedcode/reitti"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop reitti
|
systemctl stop reitti
|
||||||
@@ -180,6 +83,55 @@ PROPEOF
|
|||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start reitti
|
systemctl start reitti
|
||||||
|
chown -R www-data:www-data /var/cache/nginx
|
||||||
|
chmod -R 750 /var/cache/nginx
|
||||||
|
systemctl restart nginx
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "photon" "komoot/photon"; then
|
||||||
|
if [[ -f "$HOME/.photon" ]] && [[ "$(cat "$HOME/.photon")" == 0.7 ]]; then
|
||||||
|
CURRENT_VERSION="$(<"$HOME/.photon")"
|
||||||
|
echo
|
||||||
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
|
echo "Photon v1 upgrade detected (breaking change)"
|
||||||
|
echo
|
||||||
|
echo "Your current version: $CURRENT_VERSION"
|
||||||
|
echo
|
||||||
|
echo "Photon v1 requires a manual migration before updating."
|
||||||
|
echo
|
||||||
|
echo "You need to:"
|
||||||
|
echo " 1. Remove existing geocoding data (not actual reitti data):"
|
||||||
|
echo " rm -rf /opt/photon_data"
|
||||||
|
echo
|
||||||
|
echo " 2. Follow the inial setup guide again:"
|
||||||
|
echo " https://github.com/community-scripts/ProxmoxVE/discussions/8737"
|
||||||
|
echo
|
||||||
|
echo " 3. Re-download and import Photon data for v1"
|
||||||
|
echo
|
||||||
|
read -rp "Do you want to continue anyway? (y/N): " CONTINUE
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then
|
||||||
|
msg_info "Migration required. Update cancelled."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "Continuing without migration may break Photon in the future!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop photon
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
rm -f /opt/photon/photon.jar
|
||||||
|
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "photon" "komoot/photon" "singlefile" "latest" "/opt/photon" "photon-*.jar"
|
||||||
|
mv /opt/photon/photon-*.jar /opt/photon/photon.jar
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start photon
|
||||||
|
systemctl restart nginx
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -54,12 +54,8 @@ function update_script() {
|
|||||||
# Merge static assets into dist folder
|
# Merge static assets into dist folder
|
||||||
cp -rf /opt/romm/frontend/assets/* /opt/romm/frontend/dist/assets/
|
cp -rf /opt/romm/frontend/assets/* /opt/romm/frontend/dist/assets/
|
||||||
mkdir -p /opt/romm/frontend/dist/assets/romm
|
mkdir -p /opt/romm/frontend/dist/assets/romm
|
||||||
ROMM_BASE=$(grep '^ROMM_BASE_PATH=' /opt/romm/.env | cut -d'=' -f2)
|
ln -sfn /var/lib/romm/resources /opt/romm/frontend/dist/assets/romm/resources
|
||||||
ROMM_BASE=${ROMM_BASE:-/var/lib/romm}
|
ln -sfn /var/lib/romm/assets /opt/romm/frontend/dist/assets/romm/assets
|
||||||
ln -sfn "$ROMM_BASE"/resources /opt/romm/frontend/dist/assets/romm/resources
|
|
||||||
ln -sfn "$ROMM_BASE"/assets /opt/romm/frontend/dist/assets/romm/assets
|
|
||||||
sed -i "s|alias .*/library/;|alias ${ROMM_BASE}/library/;|" /etc/nginx/sites-available/romm
|
|
||||||
systemctl reload nginx
|
|
||||||
msg_ok "Updated ROMM"
|
msg_ok "Updated ROMM"
|
||||||
|
|
||||||
msg_info "Starting Services"
|
msg_info "Starting Services"
|
||||||
|
|||||||
@@ -29,38 +29,40 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "semaphore" "semaphoreui/semaphore"; then
|
if [[ -f /opt/semaphore/semaphore_db.bolt ]]; then
|
||||||
if [[ -f /opt/semaphore/semaphore_db.bolt ]]; then
|
msg_warn "WARNING: Due to bugs with BoltDB database, update script will move your application"
|
||||||
msg_warn "WARNING: Due to bugs with BoltDB database, update script will move your application"
|
msg_warn "to use SQLite database instead. Unfortunately, this will reset your application and make it a fresh"
|
||||||
msg_warn "to use SQLite database instead. Make sure you have a backup of your data!"
|
msg_warn "installation. All your data will be lost!"
|
||||||
echo ""
|
echo ""
|
||||||
read -r -p "${TAB3}Do you want to continue? (y/N): " CONFIRM
|
read -r -p "${TAB3}Do you want to continue? (y/N): " CONFIRM
|
||||||
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
msg_info "Moving from BoltDB to SQLite"
|
msg_info "Moving from BoltDB to SQLite"
|
||||||
sed -i \
|
systemctl stop semaphore
|
||||||
-e 's|"bolt": {|"sqlite": {|' \
|
rm -rf /opt/semaphore/semaphore_db.bolt
|
||||||
-e 's|/semaphore_db.bolt"|/database.sqlite"|' \
|
sed -i \
|
||||||
-e '/semaphore_db.bolt/d' \
|
-e 's|"bolt": {|"sqlite": {|' \
|
||||||
-e '/"dialect"/d' \
|
-e 's|/semaphore_db.bolt"|/database.sqlite"|' \
|
||||||
-e '/^ },$/a\ "dialect": "sqlite",' \
|
-e '/semaphore_db.bolt/d' \
|
||||||
/opt/semaphore/config.json
|
-e '/"dialect"/d' \
|
||||||
msg_ok "Moved from BoltDB to SQLite"
|
-e '/^ },$/a\ "dialect": "sqlite",' \
|
||||||
fi
|
/opt/semaphore/config.json
|
||||||
fi
|
SEM_PW=$(cat ~/semaphore.creds)
|
||||||
|
systemctl start semaphore
|
||||||
|
$STD semaphore user add --admin --login admin --email admin@community-scripts.org --name Administrator --password "${SEM_PW}" --config /opt/semaphore/config.json
|
||||||
|
|
||||||
|
msg_ok "Moved from BoltDB to SQLite"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "semaphore" "semaphoreui/semaphore"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop semaphore
|
systemctl stop semaphore
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
|
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
|
||||||
|
|
||||||
if [[ -f /opt/semaphore/semaphore_db.bolt ]]; then
|
|
||||||
$STD semaphore migrate --from-boltdb /opt/semaphore/semaphore_db.bolt --config /opt/semaphore/config.json
|
|
||||||
rm -f /opt/semaphore/semaphore_db.bolt
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start semaphore
|
systemctl start semaphore
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
|
|
||||||
if check_for_gh_release "shelfmark" "calibrain/shelfmark"; then
|
if check_for_gh_release "shelfmark" "calibrain/shelfmark"; then
|
||||||
|
|||||||
@@ -43,10 +43,6 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Restoring config"
|
msg_info "Restoring config"
|
||||||
mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml
|
mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml
|
||||||
|
|
||||||
# Migrate 0.25.0 breaking config key renames
|
|
||||||
sed -i 's/^global:/transfers:/' /opt/slskd/config/slskd.yml
|
|
||||||
sed -i 's/^integration:/integrations:/' /opt/slskd/config/slskd.yml
|
|
||||||
msg_ok "Restored config"
|
msg_ok "Restored config"
|
||||||
|
|
||||||
msg_info "Starting Service(s)"
|
msg_info "Starting Service(s)"
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ function update_script() {
|
|||||||
RELEASE=$(get_latest_github_release "SonarSource/sonarqube")
|
RELEASE=$(get_latest_github_release "SonarSource/sonarqube")
|
||||||
curl -fsSL "https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-${RELEASE}.zip" -o $temp_file
|
curl -fsSL "https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-${RELEASE}.zip" -o $temp_file
|
||||||
unzip -q "$temp_file" -d /opt
|
unzip -q "$temp_file" -d /opt
|
||||||
rm -f "$temp_file"
|
|
||||||
mv /opt/sonarqube-${RELEASE} /opt/sonarqube
|
mv /opt/sonarqube-${RELEASE} /opt/sonarqube
|
||||||
echo "${RELEASE}" > ~/.sonarqube
|
echo "${RELEASE}" > ~/.sonarqube
|
||||||
msg_ok "Updated SonarQube"
|
msg_ok "Updated SonarQube"
|
||||||
|
|||||||
@@ -1,50 +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: Joerg Heinemann (heinemannj)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/smallstep/certificates
|
|
||||||
|
|
||||||
APP="step-ca"
|
|
||||||
var_tags="${var_tags:-certificate-authority;pki;acme-server}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-512}"
|
|
||||||
var_disk="${var_disk:-2}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/smallstep.sources ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
msg_info "Updating step-ca and step-cli"
|
|
||||||
$STD apt update
|
|
||||||
$STD apt upgrade -y step-ca step-cli
|
|
||||||
$STD systemctl restart step-ca
|
|
||||||
msg_ok "Updated step-ca and step-cli"
|
|
||||||
|
|
||||||
if check_for_gh_release "step-badger" "lukasz-lobocki/step-badger"; then
|
|
||||||
fetch_and_deploy_gh_release "step-badger" "lukasz-lobocki/step-badger" "prebuild" "latest" "/opt/step-badger" "step-badger_Linux_x86_64.tar.gz"
|
|
||||||
msg_ok "Updated step-badger"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}/provisioners${CL}"
|
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: MickLesk (CanbiZ)
|
# Author: tlissak | Co-Author MickLesk
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://whodb.com/
|
# Source: https://typesense.org/
|
||||||
|
|
||||||
APP="WhoDB"
|
APP="TypeSense"
|
||||||
var_tags="${var_tags:-database;management;gui}"
|
var_tags="${var_tags:-database}"
|
||||||
var_cpu="${var_cpu:-1}"
|
var_cpu="${var_cpu:-1}"
|
||||||
var_ram="${var_ram:-512}"
|
var_ram="${var_ram:-1024}"
|
||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
@@ -23,22 +23,14 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
if [[ ! -f /etc/typesense/typesense-server.ini ]]; then
|
||||||
if [[ ! -f /opt/whodb/whodb ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
if check_for_gh_release "typesense" "typesense/typesense"; then
|
||||||
if check_for_gh_release "whodb" "clidey/whodb"; then
|
msg_info "Updating Typesense"
|
||||||
msg_info "Stopping Service"
|
$STD apt update
|
||||||
systemctl stop whodb
|
$STD apt -y upgrade
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-amd64"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start whodb
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
@@ -48,7 +40,7 @@ start
|
|||||||
build_container
|
build_container
|
||||||
description
|
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} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}${IP}:8108${CL}"
|
||||||
@@ -38,14 +38,8 @@ function update_script() {
|
|||||||
$STD apt -y upgrade
|
$STD apt -y upgrade
|
||||||
msg_ok "Updated LXC"
|
msg_ok "Updated LXC"
|
||||||
|
|
||||||
msg_info "Updating UHF Server"
|
|
||||||
if dpkg -l ffmpeg 2>&1 | grep -q "ii"; then
|
|
||||||
apt remove ffmpeg -y && apt autoremove -y
|
|
||||||
fi
|
|
||||||
setup_ffmpeg
|
|
||||||
fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-x64-*.zip"
|
fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-x64-*.zip"
|
||||||
fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-x64-*.zip"
|
fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-x64-*.zip"
|
||||||
msg_ok "Updated UHF Server"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start uhf-server
|
systemctl start uhf-server
|
||||||
|
|||||||
@@ -33,9 +33,7 @@ function update_script() {
|
|||||||
systemctl stop umami
|
systemctl stop umami
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
mv /opt/umami/.env /opt/.env.bak
|
fetch_and_deploy_gh_release "umami" "umami-software/umami" "tarball"
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "umami" "umami-software/umami" "tarball"
|
|
||||||
mv /opt/.env.bak /opt/umami/.env
|
|
||||||
|
|
||||||
msg_info "Updating Umami"
|
msg_info "Updating Umami"
|
||||||
cd /opt/umami
|
cd /opt/umami
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: MickLesk (CanbiZ)
|
# Author: BrynnJKnight
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/frappe/erpnext
|
# Source: https://verdaccio.org/ | Github: https://github.com/verdaccio/verdaccio
|
||||||
|
|
||||||
APP="ERPNext"
|
APP="Verdaccio"
|
||||||
var_tags="${var_tags:-erp;business;accounting}"
|
var_tags="${var_tags:-dev-tools;npm;registry}"
|
||||||
var_cpu="${var_cpu:-4}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-4096}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_disk="${var_disk:-20}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
@@ -24,13 +23,19 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -d /opt/frappe-bench ]]; then
|
if [[ ! -f /etc/systemd/system/verdaccio.service ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_info "Updating ERPNext"
|
|
||||||
$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt/frappe-bench && bench update --reset'
|
msg_info "Updating LXC Container"
|
||||||
msg_ok "Updated ERPNext"
|
$STD apt update
|
||||||
|
$STD apt upgrade -y
|
||||||
|
msg_ok "Updated LXC Container"
|
||||||
|
|
||||||
|
NODE_VERSION="24" NODE_MODULE="verdaccio" setup_nodejs
|
||||||
|
systemctl restart verdaccio
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,10 +43,7 @@ start
|
|||||||
build_container
|
build_container
|
||||||
description
|
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} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4873${CL}"
|
||||||
echo -e "${INFO}${YW} Credentials:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}Username: Administrator${CL}"
|
|
||||||
echo -e "${TAB}${BGN}Password: see ~/erpnext.creds${CL}"
|
|
||||||
@@ -43,7 +43,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Installing Python Dependencies"
|
msg_info "Installing Python Dependencies"
|
||||||
cd /opt/yamtrack
|
cd /opt/yamtrack
|
||||||
$STD uv venv --clear .venv
|
$STD uv venv .venv
|
||||||
$STD uv pip install --no-cache-dir -r requirements.txt
|
$STD uv pip install --no-cache-dir -r requirements.txt
|
||||||
msg_ok "Installed Python Dependencies"
|
msg_ok "Installed Python Dependencies"
|
||||||
|
|
||||||
@@ -61,10 +61,7 @@ function update_script() {
|
|||||||
msg_info "Updating Nginx Configuration"
|
msg_info "Updating Nginx Configuration"
|
||||||
cp /opt/yamtrack/nginx.conf /etc/nginx/nginx.conf
|
cp /opt/yamtrack/nginx.conf /etc/nginx/nginx.conf
|
||||||
sed -i 's|user abc;|user www-data;|' /etc/nginx/nginx.conf
|
sed -i 's|user abc;|user www-data;|' /etc/nginx/nginx.conf
|
||||||
sed -i 's|pid /tmp/nginx.pid;|pid /run/nginx.pid;|' /etc/nginx/nginx.conf
|
|
||||||
sed -i 's|/yamtrack/staticfiles/|/opt/yamtrack/src/staticfiles/|' /etc/nginx/nginx.conf
|
sed -i 's|/yamtrack/staticfiles/|/opt/yamtrack/src/staticfiles/|' /etc/nginx/nginx.conf
|
||||||
sed -i 's|error_log /dev/stderr|error_log /var/log/nginx/error.log|' /etc/nginx/nginx.conf
|
|
||||||
sed -i 's|access_log /dev/stdout|access_log /var/log/nginx/access.log|' /etc/nginx/nginx.conf
|
|
||||||
$STD systemctl reload nginx
|
$STD systemctl reload nginx
|
||||||
msg_ok "Updated Nginx Configuration"
|
msg_ok "Updated Nginx Configuration"
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ function update_script() {
|
|||||||
cp /opt/zerobyte/.env /opt/zerobyte.env.bak
|
cp /opt/zerobyte/.env /opt/zerobyte.env.bak
|
||||||
msg_ok "Backed up Configuration"
|
msg_ok "Backed up Configuration"
|
||||||
|
|
||||||
ensure_dependencies git
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "zerobyte" "nicotsx/zerobyte" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "zerobyte" "nicotsx/zerobyte" "tarball"
|
||||||
|
|
||||||
|
|||||||
532
docs/DEV_MODE.md
Normal file
532
docs/DEV_MODE.md
Normal file
@@ -0,0 +1,532 @@
|
|||||||
|
# Dev Mode - Debugging & Development Guide
|
||||||
|
|
||||||
|
Development modes provide powerful debugging and testing capabilities for container creation and installation processes.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Single mode
|
||||||
|
export dev_mode="motd"
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||||
|
|
||||||
|
# Multiple modes (comma-separated)
|
||||||
|
export dev_mode="motd,keep,trace"
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||||
|
|
||||||
|
# Combine with verbose output
|
||||||
|
export var_verbose="yes"
|
||||||
|
export dev_mode="pause,logs"
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available Modes
|
||||||
|
|
||||||
|
### 1. **motd** - Early SSH/MOTD Setup
|
||||||
|
|
||||||
|
Sets up SSH access and MOTD **before** the main application installation.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Quick access to container for manual debugging
|
||||||
|
- Continue installation manually if something goes wrong
|
||||||
|
- Verify container networking before main install
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
✔ Container created
|
||||||
|
✔ Network configured
|
||||||
|
[DEV] Setting up MOTD and SSH before installation
|
||||||
|
✔ [DEV] MOTD/SSH ready - container accessible
|
||||||
|
# Container is now accessible via SSH while installation proceeds
|
||||||
|
```
|
||||||
|
|
||||||
|
**Combined with**: `keep`, `breakpoint`, `logs`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. **keep** - Preserve Container on Failure
|
||||||
|
|
||||||
|
Never delete the container when installation fails. Skips cleanup prompt.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Repeated tests of the same installation
|
||||||
|
- Debugging failed installations
|
||||||
|
- Manual fix attempts
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
✖ Installation failed in container 107 (exit code: 1)
|
||||||
|
✔ Container creation log: /tmp/create-lxc-107-abc12345.log
|
||||||
|
✔ Installation log: /tmp/install-lxc-107-abc12345.log
|
||||||
|
|
||||||
|
🔧 [DEV] Keep mode active - container 107 preserved
|
||||||
|
root@proxmox:~#
|
||||||
|
```
|
||||||
|
|
||||||
|
**Container remains**: `pct enter 107` to access and debug
|
||||||
|
|
||||||
|
**Combined with**: `motd`, `trace`, `logs`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. **trace** - Bash Command Tracing
|
||||||
|
|
||||||
|
Enables `set -x` for complete command-line tracing. Shows every command before execution.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Deep debugging of installation logic
|
||||||
|
- Understanding script flow
|
||||||
|
- Identifying where errors occur exactly
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
+(/opt/wallabag/bin/console): /opt/wallabag/bin/console cache:warmup
|
||||||
|
+(/opt/wallabag/bin/console): env APP_ENV=prod /opt/wallabag/bin/console cache:warmup
|
||||||
|
+(/opt/wallabag/bin/console): [[ -d /opt/wallabag/app/cache ]]
|
||||||
|
+(/opt/wallabag/bin/console): rm -rf /opt/wallabag/app/cache/*
|
||||||
|
```
|
||||||
|
|
||||||
|
**⚠️ Warning**: Exposes passwords and secrets in log output! Only use in isolated environments.
|
||||||
|
|
||||||
|
**Log Output**: All trace output saved to logs (see `logs` mode)
|
||||||
|
|
||||||
|
**Combined with**: `keep`, `pause`, `logs`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. **pause** - Step-by-Step Execution
|
||||||
|
|
||||||
|
Pauses after each major step (`msg_info`). Requires manual Enter press to continue.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Inspect container state between steps
|
||||||
|
- Understand what each step does
|
||||||
|
- Identify which step causes problems
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
⏳ Setting up Container OS
|
||||||
|
[PAUSE] Press Enter to continue...
|
||||||
|
⏳ Updating Container OS
|
||||||
|
[PAUSE] Press Enter to continue...
|
||||||
|
⏳ Installing Dependencies
|
||||||
|
[PAUSE] Press Enter to continue...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Between pauses**: You can open another terminal and inspect the container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In another terminal while paused
|
||||||
|
pct enter 107
|
||||||
|
root@container:~# df -h # Check disk usage
|
||||||
|
root@container:~# ps aux # Check running processes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Combined with**: `motd`, `keep`, `logs`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. **breakpoint** - Interactive Shell on Error
|
||||||
|
|
||||||
|
Opens interactive shell inside the container when an error occurs instead of cleanup prompt.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Live debugging in the actual container
|
||||||
|
- Manual command testing
|
||||||
|
- Inspect container state at point of failure
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
✖ Installation failed in container 107 (exit code: 1)
|
||||||
|
✔ Container creation log: /tmp/create-lxc-107-abc12345.log
|
||||||
|
✔ Installation log: /tmp/install-lxc-107-abc12345.log
|
||||||
|
|
||||||
|
🐛 [DEV] Breakpoint mode - opening shell in container 107
|
||||||
|
Type 'exit' to return to host
|
||||||
|
root@wallabag:~#
|
||||||
|
|
||||||
|
# Now you can debug:
|
||||||
|
root@wallabag:~# tail -f /root/.install-abc12345.log
|
||||||
|
root@wallabag:~# mysql -u root -p$PASSWORD wallabag
|
||||||
|
root@wallabag:~# apt-get install -y strace
|
||||||
|
root@wallabag:~# exit
|
||||||
|
|
||||||
|
Container 107 still running. Remove now? (y/N): n
|
||||||
|
🔧 Container 107 kept for debugging
|
||||||
|
```
|
||||||
|
|
||||||
|
**Combined with**: `keep`, `logs`, `trace`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. **logs** - Persistent Logging
|
||||||
|
|
||||||
|
Saves all logs to `/var/log/community-scripts/` with timestamps. Logs persist even on successful installation.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Post-mortem analysis
|
||||||
|
- Performance analysis
|
||||||
|
- Automated testing with log collection
|
||||||
|
- CI/CD integration
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
Logs location: /var/log/community-scripts/
|
||||||
|
|
||||||
|
create-lxc-abc12345-20251117_143022.log (host-side creation)
|
||||||
|
install-abc12345-20251117_143022.log (container-side installation)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Access logs**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View creation log
|
||||||
|
tail -f /var/log/community-scripts/create-lxc-*.log
|
||||||
|
|
||||||
|
# Search for errors
|
||||||
|
grep ERROR /var/log/community-scripts/*.log
|
||||||
|
|
||||||
|
# Analyze performance
|
||||||
|
grep "msg_info\|msg_ok" /var/log/community-scripts/create-*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
**With trace mode**: Creates detailed trace of all commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
grep "^+" /var/log/community-scripts/install-*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
**Combined with**: All other modes (recommended for CI/CD)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. **dryrun** - Simulation Mode
|
||||||
|
|
||||||
|
Shows all commands that would be executed without actually running them.
|
||||||
|
|
||||||
|
**Use Case**:
|
||||||
|
|
||||||
|
- Test script logic without making changes
|
||||||
|
- Verify command syntax
|
||||||
|
- Understand what will happen
|
||||||
|
- Pre-flight checks
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
```
|
||||||
|
[DRYRUN] apt-get update
|
||||||
|
[DRYRUN] apt-get install -y curl
|
||||||
|
[DRYRUN] mkdir -p /opt/wallabag
|
||||||
|
[DRYRUN] cd /opt/wallabag
|
||||||
|
[DRYRUN] git clone https://github.com/wallabag/wallabag.git .
|
||||||
|
```
|
||||||
|
|
||||||
|
**No actual changes made**: Container/system remains unchanged
|
||||||
|
|
||||||
|
**Combined with**: `trace` (shows dryrun trace), `logs` (shows what would run)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mode Combinations
|
||||||
|
|
||||||
|
### Development Workflow
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# First test: See what would happen
|
||||||
|
export dev_mode="dryrun,logs"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
|
||||||
|
# Then test with tracing and pauses
|
||||||
|
export dev_mode="pause,trace,logs"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
|
||||||
|
# Finally full debug with early SSH access
|
||||||
|
export dev_mode="motd,keep,breakpoint,logs"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### CI/CD Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Automated testing with full logging
|
||||||
|
export dev_mode="logs"
|
||||||
|
export var_verbose="yes"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
|
||||||
|
# Capture logs for analysis
|
||||||
|
tar czf installation-logs-$(date +%s).tar.gz /var/log/community-scripts/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production-like Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Keep containers for manual verification
|
||||||
|
export dev_mode="keep,logs"
|
||||||
|
for i in {1..5}; do
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Inspect all created containers
|
||||||
|
pct list
|
||||||
|
pct enter 100
|
||||||
|
```
|
||||||
|
|
||||||
|
### Live Debugging
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH in early, step through installation, debug on error
|
||||||
|
export dev_mode="motd,pause,breakpoint,keep"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Environment Variables Reference
|
||||||
|
|
||||||
|
### Dev Mode Variables
|
||||||
|
|
||||||
|
- `dev_mode` (string): Comma-separated list of modes
|
||||||
|
- Format: `"motd,keep,trace"`
|
||||||
|
- Default: Empty (no dev modes)
|
||||||
|
|
||||||
|
### Output Control
|
||||||
|
|
||||||
|
- `var_verbose="yes"`: Show all command output (disables silent mode)
|
||||||
|
- Pairs well with: `trace`, `pause`, `logs`
|
||||||
|
|
||||||
|
### Examples with vars
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Maximum verbosity and debugging
|
||||||
|
export var_verbose="yes"
|
||||||
|
export dev_mode="motd,trace,pause,logs"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
|
||||||
|
# Silent debug (logs only)
|
||||||
|
export dev_mode="keep,logs"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
|
||||||
|
# Interactive debugging
|
||||||
|
export var_verbose="yes"
|
||||||
|
export dev_mode="motd,breakpoint"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting with Dev Mode
|
||||||
|
|
||||||
|
### "Installation failed at step X"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export dev_mode="pause,logs"
|
||||||
|
# Step through until the failure point
|
||||||
|
# Check container state between pauses
|
||||||
|
pct enter 107
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Password/credentials not working"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export dev_mode="motd,keep,trace"
|
||||||
|
# With trace mode, see exact password handling (be careful with logs!)
|
||||||
|
# Use motd to SSH in and test manually
|
||||||
|
ssh root@container-ip
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Permission denied errors"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export dev_mode="breakpoint,keep"
|
||||||
|
# Get shell at failure point
|
||||||
|
# Check file permissions, user context, SELinux status
|
||||||
|
ls -la /path/to/file
|
||||||
|
whoami
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Networking issues"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export dev_mode="motd"
|
||||||
|
# SSH in with motd mode before main install
|
||||||
|
ssh root@container-ip
|
||||||
|
ping 8.8.8.8
|
||||||
|
nslookup example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Need to manually complete installation"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export dev_mode="motd,keep"
|
||||||
|
# Container accessible via SSH while installation runs
|
||||||
|
# After failure, SSH in and manually continue
|
||||||
|
ssh root@container-ip
|
||||||
|
# ... manual commands ...
|
||||||
|
exit
|
||||||
|
# Then use 'keep' mode to preserve container for inspection
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Log Files Locations
|
||||||
|
|
||||||
|
### Default (without `logs` mode)
|
||||||
|
|
||||||
|
- Host creation: `/tmp/create-lxc-<SESSION_ID>.log`
|
||||||
|
- Container install: Copied to `/tmp/install-lxc-<CTID>-<SESSION_ID>.log` on failure
|
||||||
|
|
||||||
|
### With `logs` mode
|
||||||
|
|
||||||
|
- Host creation: `/var/log/community-scripts/create-lxc-<SESSION_ID>-<TIMESTAMP>.log`
|
||||||
|
- Container install: `/var/log/community-scripts/install-<SESSION_ID>-<TIMESTAMP>.log`
|
||||||
|
|
||||||
|
### View logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tail in real-time
|
||||||
|
tail -f /var/log/community-scripts/*.log
|
||||||
|
|
||||||
|
# Search for errors
|
||||||
|
grep -r "exit code [1-9]" /var/log/community-scripts/
|
||||||
|
|
||||||
|
# Filter by session
|
||||||
|
grep "ed563b19" /var/log/community-scripts/*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### ✅ DO
|
||||||
|
|
||||||
|
- Use `logs` mode for CI/CD and automated testing
|
||||||
|
- Use `motd` for early SSH access during long installations
|
||||||
|
- Use `pause` when learning the installation flow
|
||||||
|
- Use `trace` when debugging logic issues (watch for secrets!)
|
||||||
|
- Combine modes for comprehensive debugging
|
||||||
|
- Archive logs after successful tests
|
||||||
|
|
||||||
|
### ❌ DON'T
|
||||||
|
|
||||||
|
- Use `trace` in production or with untrusted networks (exposes secrets)
|
||||||
|
- Leave `keep` mode enabled for unattended scripts (containers accumulate)
|
||||||
|
- Use `dryrun` and expect actual changes
|
||||||
|
- Commit `dev_mode` exports to production deployment scripts
|
||||||
|
- Use `breakpoint` in non-interactive environments (will hang)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Example 1: Debug a Failed Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Initial test to see the failure
|
||||||
|
export dev_mode="keep,logs"
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wallabag.sh)"
|
||||||
|
|
||||||
|
# Container 107 kept, check logs
|
||||||
|
tail /var/log/community-scripts/install-*.log
|
||||||
|
|
||||||
|
# SSH in to debug
|
||||||
|
pct enter 107
|
||||||
|
root@wallabag:~# cat /root/.install-*.log | tail -100
|
||||||
|
root@wallabag:~# apt-get update # Retry the failing command
|
||||||
|
root@wallabag:~# exit
|
||||||
|
|
||||||
|
# Re-run with manual step-through
|
||||||
|
export dev_mode="motd,pause,keep"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 2: Verify Installation Steps
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export dev_mode="pause,logs"
|
||||||
|
export var_verbose="yes"
|
||||||
|
bash -c "$(curl ...)"
|
||||||
|
|
||||||
|
# Press Enter through each step
|
||||||
|
# Monitor container in another terminal
|
||||||
|
# pct enter 107
|
||||||
|
# Review logs in real-time
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 3: CI/CD Pipeline Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
export dev_mode="logs"
|
||||||
|
export var_verbose="no"
|
||||||
|
|
||||||
|
for app in wallabag nextcloud wordpress; do
|
||||||
|
echo "Testing $app installation..."
|
||||||
|
APP="$app" bash -c "$(curl ...)" || {
|
||||||
|
echo "FAILED: $app"
|
||||||
|
tar czf logs-$app.tar.gz /var/log/community-scripts/
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
echo "SUCCESS: $app"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All installations successful"
|
||||||
|
tar czf all-logs.tar.gz /var/log/community-scripts/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Custom Log Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extract all errors
|
||||||
|
grep "ERROR\|exit code [1-9]" /var/log/community-scripts/*.log
|
||||||
|
|
||||||
|
# Performance timeline
|
||||||
|
grep "^$(date +%Y-%m-%d)" /var/log/community-scripts/*.log | grep "msg_"
|
||||||
|
|
||||||
|
# Memory usage during install
|
||||||
|
grep "free\|available" /var/log/community-scripts/*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration with External Tools
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Send logs to Elasticsearch
|
||||||
|
curl -X POST "localhost:9200/installation-logs/_doc" \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-d @/var/log/community-scripts/install-*.log
|
||||||
|
|
||||||
|
# Archive for compliance
|
||||||
|
tar czf installation-records-$(date +%Y%m).tar.gz \
|
||||||
|
/var/log/community-scripts/
|
||||||
|
gpg --encrypt installation-records-*.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Support & Issues
|
||||||
|
|
||||||
|
When reporting installation issues, always include:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Collect all relevant information
|
||||||
|
export dev_mode="logs"
|
||||||
|
# Run the failing installation
|
||||||
|
# Then provide:
|
||||||
|
tar czf debug-logs.tar.gz /var/log/community-scripts/
|
||||||
|
```
|
||||||
|
|
||||||
|
Include the `debug-logs.tar.gz` when reporting issues for better diagnostics.
|
||||||
298
docs/EXIT_CODES.md
Normal file
298
docs/EXIT_CODES.md
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
# Exit Code Reference
|
||||||
|
|
||||||
|
Comprehensive documentation of all exit codes used in ProxmoxVE scripts.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [Generic/Shell Errors (1-255)](#genericshell-errors)
|
||||||
|
- [Package Manager Errors (100-101, 255)](#package-manager-errors)
|
||||||
|
- [Node.js/npm Errors (243-254)](#nodejsnpm-errors)
|
||||||
|
- [Python/pip Errors (210-212)](#pythonpip-errors)
|
||||||
|
- [Database Errors (231-254)](#database-errors)
|
||||||
|
- [Proxmox Custom Codes (200-231)](#proxmox-custom-codes)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Generic/Shell Errors
|
||||||
|
|
||||||
|
Standard Unix/Linux exit codes used across all scripts.
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | --------------------------------------- | ----------------------------------------- | ---------------------------------------------- |
|
||||||
|
| **1** | General error / Operation not permitted | Permission denied, general failure | Check user permissions, run as root if needed |
|
||||||
|
| **2** | Misuse of shell builtins | Syntax error in script | Review script syntax, check bash version |
|
||||||
|
| **126** | Command cannot execute | Permission problem, not executable | `chmod +x script.sh` or check file permissions |
|
||||||
|
| **127** | Command not found | Missing binary, wrong PATH | Install required package, check PATH variable |
|
||||||
|
| **128** | Invalid argument to exit | Invalid exit code passed | Use exit codes 0-255 only |
|
||||||
|
| **130** | Terminated by Ctrl+C (SIGINT) | User interrupted script | Expected behavior, no action needed |
|
||||||
|
| **137** | Killed (SIGKILL) | Out of memory, forced termination | Check memory usage, increase RAM allocation |
|
||||||
|
| **139** | Segmentation fault | Memory access violation, corrupted binary | Reinstall package, check system stability |
|
||||||
|
| **143** | Terminated (SIGTERM) | Graceful shutdown signal | Expected during container stops |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Package Manager Errors
|
||||||
|
|
||||||
|
APT, DPKG, and package installation errors.
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | -------------------------- | --------------------------------------- | ------------------------------------------------- |
|
||||||
|
| **100** | APT: Package manager error | Broken packages, dependency conflicts | `apt --fix-broken install`, `dpkg --configure -a` |
|
||||||
|
| **101** | APT: Configuration error | Malformed sources.list, bad repo config | Check `/etc/apt/sources.list`, run `apt update` |
|
||||||
|
| **255** | DPKG: Fatal internal error | Corrupted package database | `dpkg --configure -a`, restore from backup |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Node.js/npm Errors
|
||||||
|
|
||||||
|
Node.js runtime and package manager errors.
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------- |
|
||||||
|
| **243** | Node.js: Out of memory | JavaScript heap exhausted | Increase `--max-old-space-size`, optimize code |
|
||||||
|
| **245** | Node.js: Invalid command-line option | Wrong Node.js flags | Check Node.js version, verify CLI options |
|
||||||
|
| **246** | Node.js: Internal JavaScript Parse Error | Syntax error in JS code | Review JavaScript syntax, check dependencies |
|
||||||
|
| **247** | Node.js: Fatal internal error | Node.js runtime crash | Update Node.js, check for known bugs |
|
||||||
|
| **248** | Node.js: Invalid C++ addon / N-API failure | Native module incompatibility | Rebuild native modules, update packages |
|
||||||
|
| **249** | Node.js: Inspector error | Debug/inspect protocol failure | Disable inspector, check port conflicts |
|
||||||
|
| **254** | npm/pnpm/yarn: Unknown fatal error | Package manager crash | Clear cache, reinstall package manager |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Python/pip Errors
|
||||||
|
|
||||||
|
Python runtime and package installation errors.
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ------------------------------------ | --------------------------------------- | -------------------------------------------------------- |
|
||||||
|
| **210** | Python: Virtualenv missing or broken | venv not created, corrupted environment | `python3 -m venv venv`, recreate virtualenv |
|
||||||
|
| **211** | Python: Dependency resolution failed | Conflicting package versions | Use `pip install --upgrade`, check requirements.txt |
|
||||||
|
| **212** | Python: Installation aborted | EXTERNALLY-MANAGED, permission denied | Use `--break-system-packages` or venv, check permissions |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Database Errors
|
||||||
|
|
||||||
|
### PostgreSQL (231-234)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ----------------------- | ---------------------------------- | ----------------------------------------------------- |
|
||||||
|
| **231** | Connection failed | Server not running, wrong socket | `systemctl start postgresql`, check connection string |
|
||||||
|
| **232** | Authentication failed | Wrong credentials | Verify username/password, check `pg_hba.conf` |
|
||||||
|
| **233** | Database does not exist | Database not created | `CREATE DATABASE`, restore from backup |
|
||||||
|
| **234** | Fatal error in query | Syntax error, constraint violation | Review SQL syntax, check constraints |
|
||||||
|
|
||||||
|
### MySQL/MariaDB (241-244)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ----------------------- | ---------------------------------- | ---------------------------------------------------- |
|
||||||
|
| **241** | Connection failed | Server not running, wrong socket | `systemctl start mysql`, check connection parameters |
|
||||||
|
| **242** | Authentication failed | Wrong credentials | Verify username/password, grant privileges |
|
||||||
|
| **243** | Database does not exist | Database not created | `CREATE DATABASE`, restore from backup |
|
||||||
|
| **244** | Fatal error in query | Syntax error, constraint violation | Review SQL syntax, check constraints |
|
||||||
|
|
||||||
|
### MongoDB (251-254)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | --------------------- | -------------------- | ------------------------------------------ |
|
||||||
|
| **251** | Connection failed | Server not running | `systemctl start mongod`, check port 27017 |
|
||||||
|
| **252** | Authentication failed | Wrong credentials | Verify username/password, create user |
|
||||||
|
| **253** | Database not found | Database not created | Database auto-created on first write |
|
||||||
|
| **254** | Fatal query error | Invalid query syntax | Review MongoDB query syntax |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Proxmox Custom Codes
|
||||||
|
|
||||||
|
Custom exit codes specific to ProxmoxVE scripts.
|
||||||
|
|
||||||
|
### Container Creation Errors (200-209)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ---------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- |
|
||||||
|
| **200** | Failed to create lock file | Permission denied, disk full | Check `/tmp` permissions, free disk space |
|
||||||
|
| **203** | Missing CTID variable | Script configuration error | Set CTID in script or via prompt |
|
||||||
|
| **204** | Missing PCT_OSTYPE variable | Template selection failed | Verify template availability |
|
||||||
|
| **205** | Invalid CTID (<100) | CTID below minimum value | Use CTID ≥ 100 (1-99 reserved for Proxmox) |
|
||||||
|
| **206** | CTID already in use | Container/VM with same ID exists | Check `pct list` and `/etc/pve/lxc/`, use different ID |
|
||||||
|
| **207** | Password contains unescaped special characters | Special chars like `-`, `/`, `\`, `*` at start/end | Avoid leading special chars, use alphanumeric passwords |
|
||||||
|
| **208** | Invalid configuration | DNS format (`.home` vs `home`), MAC format (`-` vs `:`) | Remove leading dots from DNS, use `:` in MAC addresses |
|
||||||
|
| **209** | Container creation failed | Multiple possible causes | Check logs in `/tmp/pct_create_*.log`, verify template |
|
||||||
|
|
||||||
|
### Cluster & Storage Errors (210, 214, 217)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | --------------------------------- | ---------------------------------- | ----------------------------------------------------------- |
|
||||||
|
| **210** | Cluster not quorate | Cluster nodes down, network issues | Check cluster status: `pvecm status`, fix node connectivity |
|
||||||
|
| **211** | Timeout waiting for template lock | Concurrent download in progress | Wait for other download to complete (60s timeout) |
|
||||||
|
| **214** | Not enough storage space | Disk full, quota exceeded | Free disk space, increase storage allocation |
|
||||||
|
| **217** | Storage does not support rootdir | Wrong storage type selected | Use storage supporting containers (dir, zfspool, lvm-thin) |
|
||||||
|
|
||||||
|
### Container Verification Errors (215-216)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | -------------------------------- | -------------------------------- | --------------------------------------------------------- |
|
||||||
|
| **215** | Container created but not listed | Ghost state, incomplete creation | Check `/etc/pve/lxc/CTID.conf`, remove manually if needed |
|
||||||
|
| **216** | RootFS entry missing in config | Incomplete container creation | Delete container, retry creation |
|
||||||
|
|
||||||
|
### Template Errors (218, 220-223, 225)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ----------------------------------------- | ------------------------------------------------ | ----------------------------------------------------------- |
|
||||||
|
| **218** | Template file corrupted or incomplete | Download interrupted, file <1MB, invalid archive | Delete template, run `pveam update && pveam download` |
|
||||||
|
| **220** | Unable to resolve template path | Template storage not accessible | Check storage availability, verify permissions |
|
||||||
|
| **221** | Template file exists but not readable | Permission denied | `chmod 644 template.tar.zst`, check storage permissions |
|
||||||
|
| **222** | Template download failed after 3 attempts | Network issues, storage problems | Check internet connectivity, verify storage space |
|
||||||
|
| **223** | Template not available after download | Storage sync issue, I/O delay | Wait a few seconds, verify storage is mounted |
|
||||||
|
| **225** | No template available for OS/Version | Unsupported OS version, catalog outdated | Run `pveam update`, check `pveam available -section system` |
|
||||||
|
|
||||||
|
### LXC Stack Errors (231)
|
||||||
|
|
||||||
|
| Code | Description | Common Causes | Solutions |
|
||||||
|
| ------- | ------------------------------ | ------------------------------------------- | -------------------------------------------- |
|
||||||
|
| **231** | LXC stack upgrade/retry failed | Outdated `pve-container`, Debian 13.1 issue | See [Debian 13.1 Fix Guide](#debian-131-fix) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Special Case: Debian 13.1 "unsupported version" Error
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
```
|
||||||
|
TASK ERROR: unable to create CT 129 - unsupported debian version '13.1'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Root Cause
|
||||||
|
|
||||||
|
Outdated `pve-container` package doesn't recognize Debian 13 (Trixie).
|
||||||
|
|
||||||
|
### Solutions
|
||||||
|
|
||||||
|
#### Option 1: Full System Upgrade (Recommended)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt update
|
||||||
|
apt full-upgrade -y
|
||||||
|
reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify fix:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dpkg -l pve-container
|
||||||
|
# PVE 8: Should show 5.3.3+
|
||||||
|
# PVE 9: Should show 6.0.13+
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Option 2: Update Only pve-container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt update
|
||||||
|
apt install --only-upgrade pve-container -y
|
||||||
|
```
|
||||||
|
|
||||||
|
**Warning:** If Proxmox fails to boot after this, your system was inconsistent. Perform Option 1 instead.
|
||||||
|
|
||||||
|
#### Option 3: Verify Repository Configuration
|
||||||
|
|
||||||
|
Many users disable Enterprise repos but forget to add no-subscription repos.
|
||||||
|
|
||||||
|
**For PVE 9 (Trixie):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /etc/apt/sources.list.d/pve-no-subscription.list
|
||||||
|
```
|
||||||
|
|
||||||
|
Should contain:
|
||||||
|
|
||||||
|
```
|
||||||
|
deb http://download.proxmox.com/debian/pve trixie pve-no-subscription
|
||||||
|
deb http://download.proxmox.com/debian/ceph-squid trixie no-subscription
|
||||||
|
```
|
||||||
|
|
||||||
|
**For PVE 8 (Bookworm):**
|
||||||
|
|
||||||
|
```
|
||||||
|
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
|
||||||
|
deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
|
||||||
|
```
|
||||||
|
|
||||||
|
Then:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt update
|
||||||
|
apt full-upgrade -y
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reference
|
||||||
|
|
||||||
|
Official discussion: [GitHub #8126](https://github.com/community-scripts/ProxmoxVE/discussions/8126)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting Tips
|
||||||
|
|
||||||
|
### Finding Error Details
|
||||||
|
|
||||||
|
1. **Check logs:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tail -n 50 /tmp/pct_create_*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Enable verbose mode:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash -x script.sh # Shows every command executed
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check container status:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pct list
|
||||||
|
pct status CTID
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Verify storage:**
|
||||||
|
```bash
|
||||||
|
pvesm status
|
||||||
|
df -h
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common Patterns
|
||||||
|
|
||||||
|
- **Exit 0 with error message:** Configuration validation failed (check DNS, MAC, password format)
|
||||||
|
- **Exit 206 but container not visible:** Ghost container state - check `/etc/pve/lxc/` manually
|
||||||
|
- **Exit 209 generic error:** Check `/tmp/pct_create_*.log` for specific `pct create` failure reason
|
||||||
|
- **Exit 218 or 222:** Template issues - delete and re-download template
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Reference Chart
|
||||||
|
|
||||||
|
| Exit Code Range | Category | Typical Issue |
|
||||||
|
| --------------- | ------------------ | ------------------------------------------- |
|
||||||
|
| 1-2, 126-143 | Shell/System | Permissions, signals, missing commands |
|
||||||
|
| 100-101, 255 | Package Manager | APT/DPKG errors, broken packages |
|
||||||
|
| 200-209 | Container Creation | CTID, password, configuration |
|
||||||
|
| 210-217 | Storage/Cluster | Disk space, quorum, storage type |
|
||||||
|
| 218-225 | Templates | Download, corruption, availability |
|
||||||
|
| 231-254 | Databases/Runtime | PostgreSQL, MySQL, MongoDB, Node.js, Python |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Found an undocumented exit code or have a solution to share? Please:
|
||||||
|
|
||||||
|
1. Open an issue on [GitHub](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||||
|
2. Include:
|
||||||
|
- Exit code number
|
||||||
|
- Error message
|
||||||
|
- Steps to reproduce
|
||||||
|
- Solution that worked for you
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_Last updated: November 2025_
|
||||||
|
_ProxmoxVE Version: 2.x_
|
||||||
298
docs/README.md
Normal file
298
docs/README.md
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
# 📚 ProxmoxVE Documentation
|
||||||
|
|
||||||
|
Complete guide to all ProxmoxVE documentation - quickly find what you need.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 **Quick Navigation by Goal**
|
||||||
|
|
||||||
|
### 👤 **I want to...**
|
||||||
|
|
||||||
|
**Contribute a new application**
|
||||||
|
→ Start with: [contribution/README.md](contribution/README.md)
|
||||||
|
→ Then: [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md) + [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||||
|
|
||||||
|
**Understand the architecture**
|
||||||
|
→ Read: [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||||
|
→ Then: [misc/README.md](misc/README.md)
|
||||||
|
|
||||||
|
**Debug a failed installation**
|
||||||
|
→ Check: [EXIT_CODES.md](EXIT_CODES.md)
|
||||||
|
→ Then: [DEV_MODE.md](DEV_MODE.md)
|
||||||
|
→ See also: [misc/error_handler.func/](misc/error_handler.func/)
|
||||||
|
|
||||||
|
**Configure system defaults**
|
||||||
|
→ Read: [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md)
|
||||||
|
|
||||||
|
**Deploy containers automatically**
|
||||||
|
→ Read: [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md)
|
||||||
|
|
||||||
|
**Develop a function library**
|
||||||
|
→ Study: [misc/](misc/) documentation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👤 **Quick Start by Role**
|
||||||
|
|
||||||
|
### **I'm a...**
|
||||||
|
|
||||||
|
**New Contributor**
|
||||||
|
→ Start: [contribution/README.md](contribution/README.md)
|
||||||
|
→ Then: Choose your path below
|
||||||
|
|
||||||
|
**Container Creator**
|
||||||
|
→ Read: [ct/README.md](ct/README.md)
|
||||||
|
→ Deep Dive: [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md)
|
||||||
|
→ Reference: [misc/build.func/](misc/build.func/)
|
||||||
|
|
||||||
|
**Installation Script Developer**
|
||||||
|
→ Read: [install/README.md](install/README.md)
|
||||||
|
→ Deep Dive: [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||||
|
→ Reference: [misc/tools.func/](misc/tools.func/)
|
||||||
|
|
||||||
|
**VM Provisioner**
|
||||||
|
→ Read: [vm/README.md](vm/README.md)
|
||||||
|
→ Reference: [misc/cloud-init.func/](misc/cloud-init.func/)
|
||||||
|
|
||||||
|
**Tools Developer**
|
||||||
|
→ Read: [tools/README.md](tools/README.md)
|
||||||
|
→ Reference: [misc/build.func/](misc/build.func/)
|
||||||
|
|
||||||
|
**API Integrator**
|
||||||
|
→ Read: [api/README.md](api/README.md)
|
||||||
|
→ Reference: [misc/api.func/](misc/api.func/)
|
||||||
|
|
||||||
|
**System Operator**
|
||||||
|
→ Start: [EXIT_CODES.md](EXIT_CODES.md)
|
||||||
|
→ Then: [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md)
|
||||||
|
→ Automate: [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md)
|
||||||
|
→ Debug: [DEV_MODE.md](DEV_MODE.md)
|
||||||
|
|
||||||
|
**Architect**
|
||||||
|
→ Read: [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||||
|
→ Deep Dive: [misc/README.md](misc/README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📂 **Documentation Structure**
|
||||||
|
|
||||||
|
### Project-Mirrored Directories
|
||||||
|
|
||||||
|
Each major project directory has documentation:
|
||||||
|
|
||||||
|
```
|
||||||
|
ProxmoxVE/
|
||||||
|
├─ ct/ ↔ docs/ct/ (README.md + DETAILED_GUIDE.md)
|
||||||
|
├─ install/ ↔ docs/install/ (README.md + DETAILED_GUIDE.md)
|
||||||
|
├─ vm/ ↔ docs/vm/ (README.md)
|
||||||
|
├─ tools/ ↔ docs/tools/ (README.md)
|
||||||
|
├─ api/ ↔ docs/api/ (README.md)
|
||||||
|
├─ misc/ ↔ docs/misc/ (9 function libraries)
|
||||||
|
└─ [system-wide] ↔ docs/guides/ (configuration & deployment guides)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Core Documentation
|
||||||
|
|
||||||
|
| Document | Purpose | Audience |
|
||||||
|
|----------|---------|----------|
|
||||||
|
| [contribution/README.md](contribution/README.md) | How to contribute | Contributors |
|
||||||
|
| [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md) | Create ct scripts | Container developers |
|
||||||
|
| [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md) | Create install scripts | Installation developers |
|
||||||
|
| [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md) | Architecture deep-dive | Architects, advanced users |
|
||||||
|
| [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md) | Configuration system | Operators, power users |
|
||||||
|
| [guides/CONFIGURATION_REFERENCE.md](guides/CONFIGURATION_REFERENCE.md) | Configuration options reference | Advanced users |
|
||||||
|
| [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md) | Automated deployments | DevOps, automation |
|
||||||
|
| [EXIT_CODES.md](EXIT_CODES.md) | Exit code reference | Troubleshooters |
|
||||||
|
| [DEV_MODE.md](DEV_MODE.md) | Debugging tools | Developers |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📂 **Directory Guide**
|
||||||
|
|
||||||
|
### [ct/](ct/) - Container Scripts
|
||||||
|
Documentation for `/ct` - Container creation scripts that run on the Proxmox host.
|
||||||
|
|
||||||
|
**Includes**:
|
||||||
|
- Overview of container creation process
|
||||||
|
- Deep dive: [DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md) - Complete reference with examples
|
||||||
|
- Reference to [misc/build.func/](misc/build.func/)
|
||||||
|
- Quick start for creating new containers
|
||||||
|
|
||||||
|
### [install/](install/) - Installation Scripts
|
||||||
|
Documentation for `/install` - Scripts that run inside containers to install applications.
|
||||||
|
|
||||||
|
**Includes**:
|
||||||
|
- Overview of 10-phase installation pattern
|
||||||
|
- Deep dive: [DETAILED_GUIDE.md](install/DETAILED_GUIDE.md) - Complete reference with examples
|
||||||
|
- Reference to [misc/tools.func/](misc/tools.func/)
|
||||||
|
- Alpine vs Debian differences
|
||||||
|
|
||||||
|
### [vm/](vm/) - Virtual Machine Scripts
|
||||||
|
Documentation for `/vm` - VM creation scripts using cloud-init provisioning.
|
||||||
|
|
||||||
|
**Includes**:
|
||||||
|
- Overview of VM provisioning
|
||||||
|
- Link to [misc/cloud-init.func/](misc/cloud-init.func/)
|
||||||
|
- VM vs Container comparison
|
||||||
|
- Cloud-init examples
|
||||||
|
|
||||||
|
### [tools/](tools/) - Tools & Utilities
|
||||||
|
Documentation for `/tools` - Management tools and add-ons.
|
||||||
|
|
||||||
|
**Includes**:
|
||||||
|
- Overview of tools structure
|
||||||
|
- Integration points
|
||||||
|
- Contributing new tools
|
||||||
|
- Common operations
|
||||||
|
|
||||||
|
### [api/](api/) - API Integration
|
||||||
|
Documentation for `/api` - Telemetry and API backend.
|
||||||
|
|
||||||
|
**Includes**:
|
||||||
|
- API overview
|
||||||
|
- Integration methods
|
||||||
|
- API endpoints
|
||||||
|
- Privacy information
|
||||||
|
|
||||||
|
### [misc/](misc/) - Function Libraries
|
||||||
|
Documentation for `/misc` - 9 core function libraries with complete references.
|
||||||
|
|
||||||
|
**Contains**:
|
||||||
|
- **build.func/** - Container orchestration (7 files)
|
||||||
|
- **core.func/** - Utilities and messaging (5 files)
|
||||||
|
- **error_handler.func/** - Error handling (5 files)
|
||||||
|
- **api.func/** - API integration (5 files)
|
||||||
|
- **install.func/** - Container setup (5 files)
|
||||||
|
- **tools.func/** - Package installation (6 files)
|
||||||
|
- **alpine-install.func/** - Alpine setup (5 files)
|
||||||
|
- **alpine-tools.func/** - Alpine tools (5 files)
|
||||||
|
- **cloud-init.func/** - VM provisioning (5 files)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎓 **Learning Paths**
|
||||||
|
|
||||||
|
### Path 1: First-Time Contributor (2-3 hours)
|
||||||
|
|
||||||
|
1. [contribution/README.md](contribution/README.md) - Quick Start
|
||||||
|
2. Pick your area:
|
||||||
|
- Containers → [ct/README.md](ct/README.md) + [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md)
|
||||||
|
- Installation → [install/README.md](install/README.md) + [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||||
|
- VMs → [vm/README.md](vm/README.md)
|
||||||
|
3. Study existing similar script
|
||||||
|
4. Create your contribution
|
||||||
|
5. Submit PR
|
||||||
|
|
||||||
|
### Path 2: Intermediate Developer (4-6 hours)
|
||||||
|
|
||||||
|
1. [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||||
|
2. Dive into function libraries:
|
||||||
|
- [misc/build.func/README.md](misc/build.func/README.md)
|
||||||
|
- [misc/tools.func/README.md](misc/tools.func/README.md)
|
||||||
|
- [misc/install.func/README.md](misc/install.func/README.md)
|
||||||
|
3. Study advanced examples
|
||||||
|
4. Create complex applications
|
||||||
|
|
||||||
|
### Path 3: Advanced Architect (8+ hours)
|
||||||
|
|
||||||
|
1. All of Intermediate Path
|
||||||
|
2. Study all 9 function libraries in depth
|
||||||
|
3. [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md) - Configuration system
|
||||||
|
4. [DEV_MODE.md](DEV_MODE.md) - Debugging and development
|
||||||
|
5. Design new features or function libraries
|
||||||
|
|
||||||
|
### Path 4: Troubleshooter (30 minutes - 1 hour)
|
||||||
|
|
||||||
|
1. [EXIT_CODES.md](EXIT_CODES.md) - Find error code
|
||||||
|
2. [DEV_MODE.md](DEV_MODE.md) - Run with debugging
|
||||||
|
3. Check relevant function library docs
|
||||||
|
4. Review logs and fix
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 **By the Numbers**
|
||||||
|
|
||||||
|
| Metric | Count |
|
||||||
|
|--------|:---:|
|
||||||
|
| **Documentation Files** | 63 |
|
||||||
|
| **Total Lines** | 15,000+ |
|
||||||
|
| **Function Libraries** | 9 |
|
||||||
|
| **Functions Documented** | 150+ |
|
||||||
|
| **Code Examples** | 50+ |
|
||||||
|
| **Flowcharts** | 15+ |
|
||||||
|
| **Do/Don't Sections** | 20+ |
|
||||||
|
| **Real-World Examples** | 30+ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 **Find It Fast**
|
||||||
|
|
||||||
|
### By Feature
|
||||||
|
- **How do I create a container?** → [ct/DETAILED_GUIDE.md](ct/DETAILED_GUIDE.md)
|
||||||
|
- **How do I create an install script?** → [install/DETAILED_GUIDE.md](install/DETAILED_GUIDE.md)
|
||||||
|
- **How do I create a VM?** → [vm/README.md](vm/README.md)
|
||||||
|
- **How do I install Node.js?** → [misc/tools.func/](misc/tools.func/)
|
||||||
|
- **How do I debug?** → [DEV_MODE.md](DEV_MODE.md)
|
||||||
|
|
||||||
|
### By Error
|
||||||
|
- **Exit code 206?** → [EXIT_CODES.md](EXIT_CODES.md)
|
||||||
|
- **Network failed?** → [misc/install.func/](misc/install.func/)
|
||||||
|
- **Package error?** → [misc/tools.func/](misc/tools.func/)
|
||||||
|
|
||||||
|
### By Role
|
||||||
|
- **Contributor** → [contribution/README.md](contribution/README.md)
|
||||||
|
- **Operator** → [guides/DEFAULTS_SYSTEM_GUIDE.md](guides/DEFAULTS_SYSTEM_GUIDE.md)
|
||||||
|
- **Automation** → [guides/UNATTENDED_DEPLOYMENTS.md](guides/UNATTENDED_DEPLOYMENTS.md)
|
||||||
|
- **Developer** → [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||||
|
- **Architect** → [misc/README.md](misc/README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ **Documentation Features**
|
||||||
|
|
||||||
|
- ✅ **Project-mirrored structure** - Organized like the actual project
|
||||||
|
- ✅ **Complete function references** - Every function documented
|
||||||
|
- ✅ **Real-world examples** - Copy-paste ready code
|
||||||
|
- ✅ **Visual flowcharts** - ASCII diagrams of workflows
|
||||||
|
- ✅ **Integration guides** - How components connect
|
||||||
|
- ✅ **Troubleshooting** - Common issues and solutions
|
||||||
|
- ✅ **Best practices** - DO/DON'T sections throughout
|
||||||
|
- ✅ **Learning paths** - Structured curriculum by role
|
||||||
|
- ✅ **Quick references** - Fast lookup by error code
|
||||||
|
- ✅ **Comprehensive navigation** - This page
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 **Start Here**
|
||||||
|
|
||||||
|
**New to ProxmoxVE?** → [contribution/README.md](contribution/README.md)
|
||||||
|
|
||||||
|
**Looking for something specific?** → Choose your role above or browse by directory
|
||||||
|
|
||||||
|
**Need to debug?** → [EXIT_CODES.md](EXIT_CODES.md)
|
||||||
|
|
||||||
|
**Want to understand architecture?** → [TECHNICAL_REFERENCE.md](TECHNICAL_REFERENCE.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 **Contributing Documentation**
|
||||||
|
|
||||||
|
Found an error? Want to improve docs?
|
||||||
|
|
||||||
|
1. See: [contribution/README.md](contribution/README.md) for full contribution guide
|
||||||
|
2. Open issue: [GitHub Issues](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||||
|
3. Or submit PR with improvements
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 **Status**
|
||||||
|
|
||||||
|
- **Last Updated**: December 2025
|
||||||
|
- **Version**: 2.3 (Consolidated & Reorganized)
|
||||||
|
- **Completeness**: ✅ 100% - All components documented
|
||||||
|
- **Quality**: ✅ Production-ready
|
||||||
|
- **Structure**: ✅ Clean and organized
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Welcome to ProxmoxVE! Start with [CONTRIBUTION_GUIDE.md](CONTRIBUTION_GUIDE.md) or choose your role above.** 🚀
|
||||||
897
docs/TECHNICAL_REFERENCE.md
Normal file
897
docs/TECHNICAL_REFERENCE.md
Normal file
@@ -0,0 +1,897 @@
|
|||||||
|
# Technical Reference: Configuration System Architecture
|
||||||
|
|
||||||
|
> **For Developers and Advanced Users**
|
||||||
|
>
|
||||||
|
> _Deep dive into how the defaults and configuration system works_
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
1. [System Architecture](#system-architecture)
|
||||||
|
2. [File Format Specifications](#file-format-specifications)
|
||||||
|
3. [Function Reference](#function-reference)
|
||||||
|
4. [Variable Precedence](#variable-precedence)
|
||||||
|
5. [Data Flow Diagrams](#data-flow-diagrams)
|
||||||
|
6. [Security Model](#security-model)
|
||||||
|
7. [Implementation Details](#implementation-details)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## System Architecture
|
||||||
|
|
||||||
|
### Component Overview
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ Installation Script │
|
||||||
|
│ (pihole-install.sh, docker-install.sh, etc.) │
|
||||||
|
└────────────────────┬────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ build.func Library │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ variables() │ │
|
||||||
|
│ │ - Initialize NSAPP, var_install, etc. │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ install_script() │ │
|
||||||
|
│ │ - Display mode menu │ │
|
||||||
|
│ │ - Route to appropriate workflow │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ base_settings() │ │
|
||||||
|
│ │ - Apply built-in defaults │ │
|
||||||
|
│ │ - Read environment variables (var_*) │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ load_vars_file() │ │
|
||||||
|
│ │ - Safe file parsing (NO source/eval) │ │
|
||||||
|
│ │ - Whitelist validation │ │
|
||||||
|
│ │ - Value sanitization │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ default_var_settings() │ │
|
||||||
|
│ │ - Load user defaults │ │
|
||||||
|
│ │ - Display summary │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ maybe_offer_save_app_defaults() │ │
|
||||||
|
│ │ - Offer to save current settings │ │
|
||||||
|
│ │ - Handle updates vs. new saves │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ Configuration Files (on Disk) │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ /usr/local/community-scripts/default.vars │ │
|
||||||
|
│ │ (User global defaults) │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ /usr/local/community-scripts/defaults/*.vars │ │
|
||||||
|
│ │ (App-specific defaults) │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Format Specifications
|
||||||
|
|
||||||
|
### User Defaults: `default.vars`
|
||||||
|
|
||||||
|
**Location**: `/usr/local/community-scripts/default.vars`
|
||||||
|
|
||||||
|
**MIME Type**: `text/plain`
|
||||||
|
|
||||||
|
**Encoding**: UTF-8 (no BOM)
|
||||||
|
|
||||||
|
**Format Specification**:
|
||||||
|
|
||||||
|
```
|
||||||
|
# File Format: Simple key=value pairs
|
||||||
|
# Purpose: Store global user defaults
|
||||||
|
# Security: Sanitized values, whitelist validation
|
||||||
|
|
||||||
|
# Comments and blank lines are ignored
|
||||||
|
# Line format: var_name=value
|
||||||
|
# No spaces around the equals sign
|
||||||
|
# String values do not need quoting (but may be quoted)
|
||||||
|
|
||||||
|
[CONTENT]
|
||||||
|
var_cpu=4
|
||||||
|
var_ram=2048
|
||||||
|
var_disk=20
|
||||||
|
var_hostname=mydefault
|
||||||
|
var_brg=vmbr0
|
||||||
|
var_gateway=192.168.1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Formal Grammar**:
|
||||||
|
|
||||||
|
```
|
||||||
|
FILE := (BLANK_LINE | COMMENT_LINE | VAR_LINE)*
|
||||||
|
BLANK_LINE := \n
|
||||||
|
COMMENT_LINE := '#' [^\n]* \n
|
||||||
|
VAR_LINE := VAR_NAME '=' VAR_VALUE \n
|
||||||
|
VAR_NAME := 'var_' [a-z_]+
|
||||||
|
VAR_VALUE := [^\n]* # Any printable characters except newline
|
||||||
|
```
|
||||||
|
|
||||||
|
**Constraints**:
|
||||||
|
|
||||||
|
| Constraint | Value |
|
||||||
|
| ----------------- | ------------------------ |
|
||||||
|
| Max file size | 64 KB |
|
||||||
|
| Max line length | 1024 bytes |
|
||||||
|
| Max variables | 100 |
|
||||||
|
| Allowed var names | `var_[a-z_]+` |
|
||||||
|
| Value validation | Whitelist + Sanitization |
|
||||||
|
|
||||||
|
**Example Valid File**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Global User Defaults
|
||||||
|
# Created: 2024-11-28
|
||||||
|
|
||||||
|
# Resource defaults
|
||||||
|
var_cpu=4
|
||||||
|
var_ram=2048
|
||||||
|
var_disk=20
|
||||||
|
|
||||||
|
# Network defaults
|
||||||
|
var_brg=vmbr0
|
||||||
|
var_gateway=192.168.1.1
|
||||||
|
var_mtu=1500
|
||||||
|
var_vlan=100
|
||||||
|
|
||||||
|
# System defaults
|
||||||
|
var_timezone=Europe/Berlin
|
||||||
|
var_hostname=default-container
|
||||||
|
|
||||||
|
# Storage
|
||||||
|
var_container_storage=local
|
||||||
|
var_template_storage=local
|
||||||
|
|
||||||
|
# Security
|
||||||
|
var_ssh=yes
|
||||||
|
var_protection=0
|
||||||
|
var_unprivileged=1
|
||||||
|
```
|
||||||
|
|
||||||
|
### App Defaults: `<app>.vars`
|
||||||
|
|
||||||
|
**Location**: `/usr/local/community-scripts/defaults/<appname>.vars`
|
||||||
|
|
||||||
|
**Format**: Identical to `default.vars`
|
||||||
|
|
||||||
|
**Naming Convention**: `<nsapp>.vars`
|
||||||
|
|
||||||
|
- `nsapp` = lowercase app name with spaces removed
|
||||||
|
- Examples:
|
||||||
|
- `pihole` → `pihole.vars`
|
||||||
|
- `opnsense` → `opnsense.vars`
|
||||||
|
- `docker compose` → `dockercompose.vars`
|
||||||
|
|
||||||
|
**Example App Defaults**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# App-specific defaults for PiHole (pihole)
|
||||||
|
# Generated on 2024-11-28T15:32:00Z
|
||||||
|
# These override user defaults when installing pihole
|
||||||
|
|
||||||
|
var_unprivileged=1
|
||||||
|
var_cpu=2
|
||||||
|
var_ram=1024
|
||||||
|
var_disk=10
|
||||||
|
var_brg=vmbr0
|
||||||
|
var_net=veth
|
||||||
|
var_gateway=192.168.1.1
|
||||||
|
var_hostname=pihole
|
||||||
|
var_timezone=Europe/Berlin
|
||||||
|
var_container_storage=local
|
||||||
|
var_template_storage=local
|
||||||
|
var_tags=dns,pihole
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Function Reference
|
||||||
|
|
||||||
|
### `load_vars_file()`
|
||||||
|
|
||||||
|
**Purpose**: Safely load variables from .vars files without using `source` or `eval`
|
||||||
|
|
||||||
|
**Signature**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
load_vars_file(filepath)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**:
|
||||||
|
|
||||||
|
| Param | Type | Required | Example |
|
||||||
|
| -------- | ------ | -------- | ------------------------------------------- |
|
||||||
|
| filepath | String | Yes | `/usr/local/community-scripts/default.vars` |
|
||||||
|
|
||||||
|
**Returns**:
|
||||||
|
|
||||||
|
- `0` on success
|
||||||
|
- `1` on error (file missing, parse error, etc.)
|
||||||
|
|
||||||
|
**Environment Side Effects**:
|
||||||
|
|
||||||
|
- Sets all parsed `var_*` variables as shell variables
|
||||||
|
- Does NOT unset variables if file missing (safe)
|
||||||
|
- Does NOT affect other variables
|
||||||
|
|
||||||
|
**Implementation Pattern**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
load_vars_file() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
# File must exist
|
||||||
|
[ -f "$file" ] || return 0
|
||||||
|
|
||||||
|
# Parse line by line (not with source/eval)
|
||||||
|
local line key val
|
||||||
|
while IFS='=' read -r key val || [ -n "$key" ]; do
|
||||||
|
# Skip comments and empty lines
|
||||||
|
[[ "$key" =~ ^[[:space:]]*# ]] && continue
|
||||||
|
[[ -z "$key" ]] && continue
|
||||||
|
|
||||||
|
# Validate key is in whitelist
|
||||||
|
_is_whitelisted_key "$key" || continue
|
||||||
|
|
||||||
|
# Sanitize and export value
|
||||||
|
val="$(_sanitize_value "$val")"
|
||||||
|
[ $? -eq 0 ] && export "$key=$val"
|
||||||
|
done < "$file"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Load user defaults
|
||||||
|
load_vars_file "/usr/local/community-scripts/default.vars"
|
||||||
|
|
||||||
|
# Load app-specific defaults
|
||||||
|
load_vars_file "$(get_app_defaults_path)"
|
||||||
|
|
||||||
|
# Check if successful
|
||||||
|
if load_vars_file "$vars_path"; then
|
||||||
|
echo "Settings loaded successfully"
|
||||||
|
else
|
||||||
|
echo "Failed to load settings"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Values are now available as variables
|
||||||
|
echo "Using $var_cpu cores"
|
||||||
|
echo "Allocating ${var_ram} MB RAM"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `get_app_defaults_path()`
|
||||||
|
|
||||||
|
**Purpose**: Get the full path for app-specific defaults file
|
||||||
|
|
||||||
|
**Signature**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
get_app_defaults_path()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**: None
|
||||||
|
|
||||||
|
**Returns**:
|
||||||
|
|
||||||
|
- String: Full path to app defaults file
|
||||||
|
|
||||||
|
**Implementation**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
get_app_defaults_path() {
|
||||||
|
local n="${NSAPP:-${APP,,}}"
|
||||||
|
echo "/usr/local/community-scripts/defaults/${n}.vars"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get app defaults path
|
||||||
|
app_defaults="$(get_app_defaults_path)"
|
||||||
|
echo "App defaults at: $app_defaults"
|
||||||
|
|
||||||
|
# Check if app defaults exist
|
||||||
|
if [ -f "$(get_app_defaults_path)" ]; then
|
||||||
|
echo "App defaults available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Load app defaults
|
||||||
|
load_vars_file "$(get_app_defaults_path)"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `default_var_settings()`
|
||||||
|
|
||||||
|
**Purpose**: Load and display user global defaults
|
||||||
|
|
||||||
|
**Signature**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
default_var_settings()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**: None
|
||||||
|
|
||||||
|
**Returns**:
|
||||||
|
|
||||||
|
- `0` on success
|
||||||
|
- `1` on error
|
||||||
|
|
||||||
|
**Workflow**:
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Find default.vars location
|
||||||
|
(usually /usr/local/community-scripts/default.vars)
|
||||||
|
|
||||||
|
2. Create if missing
|
||||||
|
|
||||||
|
3. Load variables from file
|
||||||
|
|
||||||
|
4. Map var_verbose → VERBOSE variable
|
||||||
|
|
||||||
|
5. Call base_settings (apply to container config)
|
||||||
|
|
||||||
|
6. Call echo_default (display summary)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Implementation Pattern**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
default_var_settings() {
|
||||||
|
local VAR_WHITELIST=(
|
||||||
|
var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_gpu
|
||||||
|
var_gateway var_hostname var_ipv6_method var_mac var_mtu
|
||||||
|
var_net var_ns var_pw var_ram var_tags var_tun var_unprivileged
|
||||||
|
var_verbose var_vlan var_ssh var_ssh_authorized_key
|
||||||
|
var_container_storage var_template_storage
|
||||||
|
)
|
||||||
|
|
||||||
|
# Ensure file exists
|
||||||
|
_ensure_default_vars
|
||||||
|
|
||||||
|
# Find and load
|
||||||
|
local dv="$(_find_default_vars)"
|
||||||
|
load_vars_file "$dv"
|
||||||
|
|
||||||
|
# Map verbose flag
|
||||||
|
if [[ -n "${var_verbose:-}" ]]; then
|
||||||
|
case "${var_verbose,,}" in
|
||||||
|
1 | yes | true | on) VERBOSE="yes" ;;
|
||||||
|
*) VERBOSE="${var_verbose}" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Apply and display
|
||||||
|
base_settings "$VERBOSE"
|
||||||
|
echo_default
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `maybe_offer_save_app_defaults()`
|
||||||
|
|
||||||
|
**Purpose**: Offer to save current settings as app-specific defaults
|
||||||
|
|
||||||
|
**Signature**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
maybe_offer_save_app_defaults()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**: None
|
||||||
|
|
||||||
|
**Returns**: None (side effects only)
|
||||||
|
|
||||||
|
**Behavior**:
|
||||||
|
|
||||||
|
1. After advanced installation completes
|
||||||
|
2. Offers user: "Save as App Defaults for <APP>?"
|
||||||
|
3. If yes:
|
||||||
|
- Saves to `/usr/local/community-scripts/defaults/<app>.vars`
|
||||||
|
- Only whitelisted variables included
|
||||||
|
- Previous defaults backed up (if exists)
|
||||||
|
4. If no:
|
||||||
|
- No action taken
|
||||||
|
|
||||||
|
**Flow**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
maybe_offer_save_app_defaults() {
|
||||||
|
local app_vars_path="$(get_app_defaults_path)"
|
||||||
|
|
||||||
|
# Build current settings from memory
|
||||||
|
local new_tmp="$(_build_current_app_vars_tmp)"
|
||||||
|
|
||||||
|
# Check if already exists
|
||||||
|
if [ -f "$app_vars_path" ]; then
|
||||||
|
# Show diff and ask: Update? Keep? View Diff?
|
||||||
|
_show_app_defaults_diff_menu "$new_tmp" "$app_vars_path"
|
||||||
|
else
|
||||||
|
# New defaults - just save
|
||||||
|
if whiptail --yesno "Save as App Defaults for $APP?" 10 60; then
|
||||||
|
mv "$new_tmp" "$app_vars_path"
|
||||||
|
chmod 644 "$app_vars_path"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `_sanitize_value()`
|
||||||
|
|
||||||
|
**Purpose**: Remove dangerous characters/patterns from configuration values
|
||||||
|
|
||||||
|
**Signature**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
_sanitize_value(value)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**:
|
||||||
|
|
||||||
|
| Param | Type | Required |
|
||||||
|
| ----- | ------ | -------- |
|
||||||
|
| value | String | Yes |
|
||||||
|
|
||||||
|
**Returns**:
|
||||||
|
|
||||||
|
- `0` (success) + sanitized value on stdout
|
||||||
|
- `1` (failure) + nothing if dangerous
|
||||||
|
|
||||||
|
**Dangerous Patterns**:
|
||||||
|
|
||||||
|
| Pattern | Threat | Example |
|
||||||
|
| --------- | -------------------- | -------------------- |
|
||||||
|
| `$(...)` | Command substitution | `$(rm -rf /)` |
|
||||||
|
| `` ` ` `` | Command substitution | `` `whoami` `` |
|
||||||
|
| `;` | Command separator | `value; rm -rf /` |
|
||||||
|
| `&` | Background execution | `value & malicious` |
|
||||||
|
| `<(` | Process substitution | `<(cat /etc/passwd)` |
|
||||||
|
|
||||||
|
**Implementation**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
_sanitize_value() {
|
||||||
|
case "$1" in
|
||||||
|
*'$('* | *'`'* | *';'* | *'&'* | *'<('*)
|
||||||
|
echo ""
|
||||||
|
return 1 # Reject dangerous value
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo "$1"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Safe value
|
||||||
|
_sanitize_value "192.168.1.1" # Returns: 192.168.1.1 (status: 0)
|
||||||
|
|
||||||
|
# Dangerous value
|
||||||
|
_sanitize_value "$(whoami)" # Returns: (empty) (status: 1)
|
||||||
|
|
||||||
|
# Usage in code
|
||||||
|
if val="$(_sanitize_value "$user_input")"; then
|
||||||
|
export var_hostname="$val"
|
||||||
|
else
|
||||||
|
msg_error "Invalid value: contains dangerous characters"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `_is_whitelisted_key()`
|
||||||
|
|
||||||
|
**Purpose**: Check if variable name is in allowed whitelist
|
||||||
|
|
||||||
|
**Signature**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
_is_whitelisted_key(key)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**:
|
||||||
|
|
||||||
|
| Param | Type | Required | Example |
|
||||||
|
| ----- | ------ | -------- | --------- |
|
||||||
|
| key | String | Yes | `var_cpu` |
|
||||||
|
|
||||||
|
**Returns**:
|
||||||
|
|
||||||
|
- `0` if key is whitelisted
|
||||||
|
- `1` if key is NOT whitelisted
|
||||||
|
|
||||||
|
**Implementation**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
_is_whitelisted_key() {
|
||||||
|
local k="$1"
|
||||||
|
local w
|
||||||
|
for w in "${VAR_WHITELIST[@]}"; do
|
||||||
|
[ "$k" = "$w" ] && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Examples**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check if variable can be saved
|
||||||
|
if _is_whitelisted_key "var_cpu"; then
|
||||||
|
echo "var_cpu can be saved"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reject unknown variables
|
||||||
|
if ! _is_whitelisted_key "var_custom"; then
|
||||||
|
msg_error "var_custom is not supported"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Variable Precedence
|
||||||
|
|
||||||
|
### Loading Order
|
||||||
|
|
||||||
|
When a container is being created, variables are resolved in this order:
|
||||||
|
|
||||||
|
```
|
||||||
|
Step 1: Read ENVIRONMENT VARIABLES
|
||||||
|
├─ Check if var_cpu is already set in shell environment
|
||||||
|
├─ Check if var_ram is already set
|
||||||
|
└─ ...all var_* variables
|
||||||
|
|
||||||
|
Step 2: Load APP-SPECIFIC DEFAULTS
|
||||||
|
├─ Check if /usr/local/community-scripts/defaults/pihole.vars exists
|
||||||
|
├─ Load all var_* from that file
|
||||||
|
└─ These override built-ins but NOT environment variables
|
||||||
|
|
||||||
|
Step 3: Load USER GLOBAL DEFAULTS
|
||||||
|
├─ Check if /usr/local/community-scripts/default.vars exists
|
||||||
|
├─ Load all var_* from that file
|
||||||
|
└─ These override built-ins but NOT app-specific
|
||||||
|
|
||||||
|
Step 4: Use BUILT-IN DEFAULTS
|
||||||
|
└─ Hardcoded in script (lowest priority)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Precedence Examples
|
||||||
|
|
||||||
|
**Example 1: Environment Variable Wins**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Shell environment has highest priority
|
||||||
|
$ export var_cpu=16
|
||||||
|
$ bash pihole-install.sh
|
||||||
|
|
||||||
|
# Result: Container gets 16 cores
|
||||||
|
# (ignores app defaults, user defaults, built-ins)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example 2: App Defaults Override User Defaults**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# User Defaults: var_cpu=4
|
||||||
|
# App Defaults: var_cpu=2
|
||||||
|
$ bash pihole-install.sh
|
||||||
|
|
||||||
|
# Result: Container gets 2 cores
|
||||||
|
# (app-specific setting takes precedence)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example 3: All Defaults Missing (Built-ins Used)**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# No environment variables set
|
||||||
|
# No app defaults file
|
||||||
|
# No user defaults file
|
||||||
|
$ bash pihole-install.sh
|
||||||
|
|
||||||
|
# Result: Uses built-in defaults
|
||||||
|
# (var_cpu might be 2 by default)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Implementation in Code
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Typical pattern in build.func
|
||||||
|
|
||||||
|
base_settings() {
|
||||||
|
# Priority 1: Environment variables (already set if export used)
|
||||||
|
CT_TYPE=${var_unprivileged:-"1"} # Use existing or default
|
||||||
|
|
||||||
|
# Priority 2: Load app defaults (may override above)
|
||||||
|
if [ -f "$(get_app_defaults_path)" ]; then
|
||||||
|
load_vars_file "$(get_app_defaults_path)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Priority 3: Load user defaults
|
||||||
|
if [ -f "/usr/local/community-scripts/default.vars" ]; then
|
||||||
|
load_vars_file "/usr/local/community-scripts/default.vars"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Priority 4: Apply built-in defaults (lowest)
|
||||||
|
CORE_COUNT=${var_cpu:-"${APP_CPU_DEFAULT:-2}"}
|
||||||
|
RAM_SIZE=${var_ram:-"${APP_RAM_DEFAULT:-1024}"}
|
||||||
|
|
||||||
|
# Result: var_cpu has been set through precedence chain
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Data Flow Diagrams
|
||||||
|
|
||||||
|
### Installation Flow: Advanced Settings
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────┐
|
||||||
|
│ Start Script│
|
||||||
|
└──────┬───────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌──────────────────────────────┐
|
||||||
|
│ Display Installation Mode │
|
||||||
|
│ Menu (5 options) │
|
||||||
|
└──────┬───────────────────────┘
|
||||||
|
│ User selects "Advanced Settings"
|
||||||
|
v
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ Call: base_settings() │
|
||||||
|
│ (Apply built-in defaults) │
|
||||||
|
└──────┬───────────────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ Call: advanced_settings() │
|
||||||
|
│ (Show 19-step wizard) │
|
||||||
|
│ - Ask CPU, RAM, Disk, Network... │
|
||||||
|
└──────┬───────────────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ Show Summary │
|
||||||
|
│ Review all chosen values │
|
||||||
|
└──────┬───────────────────────────┘
|
||||||
|
│ User confirms
|
||||||
|
v
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ Create Container │
|
||||||
|
│ Using current variable values │
|
||||||
|
└──────┬───────────────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌──────────────────────────────────┐
|
||||||
|
│ Installation Complete │
|
||||||
|
└──────┬───────────────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌──────────────────────────────────────┐
|
||||||
|
│ Offer: Save as App Defaults? │
|
||||||
|
│ (Save current settings) │
|
||||||
|
└──────┬───────────────────────────────┘
|
||||||
|
│
|
||||||
|
├─ YES → Save to defaults/<app>.vars
|
||||||
|
│
|
||||||
|
└─ NO → Exit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variable Resolution Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
CONTAINER CREATION STARTED
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌─────────────────────┐
|
||||||
|
│ Check ENVIRONMENT │
|
||||||
|
│ for var_cpu, var_..│
|
||||||
|
└──────┬──────────────┘
|
||||||
|
│ Found? Use them (Priority 1)
|
||||||
|
│ Not found? Continue...
|
||||||
|
v
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Load App Defaults │
|
||||||
|
│ /defaults/<app>.vars │
|
||||||
|
└──────┬───────────────────┘
|
||||||
|
│ File exists? Parse & load (Priority 2)
|
||||||
|
│ Not found? Continue...
|
||||||
|
v
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Load User Defaults │
|
||||||
|
│ /default.vars │
|
||||||
|
└──────┬───────────────────┘
|
||||||
|
│ File exists? Parse & load (Priority 3)
|
||||||
|
│ Not found? Continue...
|
||||||
|
v
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Use Built-in Defaults │
|
||||||
|
│ (Hardcoded values) │
|
||||||
|
└──────┬───────────────────┘
|
||||||
|
│
|
||||||
|
v
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ All Variables Resolved │
|
||||||
|
│ Ready for container │
|
||||||
|
│ creation │
|
||||||
|
└──────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Security Model
|
||||||
|
|
||||||
|
### Threat Model
|
||||||
|
|
||||||
|
| Threat | Mitigation |
|
||||||
|
| ---------------------------- | ------------------------------------------------- |
|
||||||
|
| **Arbitrary Code Execution** | No `source` or `eval`; manual parsing only |
|
||||||
|
| **Variable Injection** | Whitelist of allowed variable names |
|
||||||
|
| **Command Substitution** | `_sanitize_value()` blocks `$()`, backticks, etc. |
|
||||||
|
| **Path Traversal** | Files locked to `/usr/local/community-scripts/` |
|
||||||
|
| **Permission Escalation** | Files created with restricted permissions |
|
||||||
|
| **Information Disclosure** | Sensitive variables not logged |
|
||||||
|
|
||||||
|
### Security Controls
|
||||||
|
|
||||||
|
#### 1. Input Validation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Only specific variables allowed
|
||||||
|
if ! _is_whitelisted_key "$key"; then
|
||||||
|
skip_this_variable
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Values sanitized
|
||||||
|
if ! val="$(_sanitize_value "$value")"; then
|
||||||
|
reject_entire_line
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Safe File Parsing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ DANGEROUS (OLD)
|
||||||
|
source /path/to/config.conf
|
||||||
|
# Could execute: rm -rf / or any code
|
||||||
|
|
||||||
|
# ✅ SAFE (NEW)
|
||||||
|
load_vars_file "/path/to/config.conf"
|
||||||
|
# Only reads var_name=value pairs, no execution
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Whitelisting
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Only these variables can be configured
|
||||||
|
var_cpu, var_ram, var_disk, var_brg, ...
|
||||||
|
var_hostname, var_pw, var_ssh, ...
|
||||||
|
|
||||||
|
# NOT allowed:
|
||||||
|
var_malicious, var_hack, custom_var, ...
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. Value Constraints
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# No command injection patterns
|
||||||
|
if [[ "$value" =~ ($|`|;|&|<\() ]]; then
|
||||||
|
reject_value
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation Details
|
||||||
|
|
||||||
|
### Module: `build.func`
|
||||||
|
|
||||||
|
**Load Order** (in actual scripts):
|
||||||
|
|
||||||
|
1. `#!/usr/bin/env bash` - Shebang
|
||||||
|
2. `source /dev/stdin <<<$(curl ... api.func)` - API functions
|
||||||
|
3. `source /dev/stdin <<<$(curl ... build.func)` - Build functions
|
||||||
|
4. `variables()` - Initialize variables
|
||||||
|
5. `check_root()` - Security check
|
||||||
|
6. `install_script()` - Main flow
|
||||||
|
|
||||||
|
**Key Sections**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Section 1: Initialization & Variables
|
||||||
|
- variables()
|
||||||
|
- NSAPP, var_install, INTEGER pattern, etc.
|
||||||
|
|
||||||
|
# Section 2: Storage Management
|
||||||
|
- storage_selector()
|
||||||
|
- ensure_storage_selection_for_vars_file()
|
||||||
|
|
||||||
|
# Section 3: Base Settings
|
||||||
|
- base_settings() # Apply defaults to all var_*
|
||||||
|
- echo_default() # Display current settings
|
||||||
|
|
||||||
|
# Section 4: Variable Loading
|
||||||
|
- load_vars_file() # Safe parsing
|
||||||
|
- _is_whitelisted_key() # Validation
|
||||||
|
- _sanitize_value() # Threat mitigation
|
||||||
|
|
||||||
|
# Section 5: Defaults Management
|
||||||
|
- default_var_settings() # Load user defaults
|
||||||
|
- get_app_defaults_path() # Get app defaults path
|
||||||
|
- maybe_offer_save_app_defaults() # Save option
|
||||||
|
|
||||||
|
# Section 6: Installation Flow
|
||||||
|
- install_script() # Main entry point
|
||||||
|
- advanced_settings() # 20-step wizard
|
||||||
|
```
|
||||||
|
|
||||||
|
### Regex Patterns Used
|
||||||
|
|
||||||
|
| Pattern | Purpose | Example Match |
|
||||||
|
| ---------------------- | --------------------- | ----------------------- |
|
||||||
|
| `^[0-9]+([.][0-9]+)?$` | Integer validation | `4`, `192.168` |
|
||||||
|
| `^var_[a-z_]+$` | Variable name | `var_cpu`, `var_ssh` |
|
||||||
|
| `*'$('*` | Command substitution | `$(whoami)` |
|
||||||
|
| `*\`\*` | Backtick substitution | `` `cat /etc/passwd` `` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix: Migration Reference
|
||||||
|
|
||||||
|
### Old Pattern (Deprecated)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ OLD: config-file.func
|
||||||
|
source config-file.conf # Executes arbitrary code
|
||||||
|
if [ "$USE_DEFAULTS" = "yes" ]; then
|
||||||
|
apply_settings_directly
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### New Pattern (Current)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ✅ NEW: load_vars_file()
|
||||||
|
if load_vars_file "$(get_app_defaults_path)"; then
|
||||||
|
echo "Settings loaded securely"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Function Mapping
|
||||||
|
|
||||||
|
| Old | New | Location |
|
||||||
|
| ---------------- | --------------------------------- | ---------- |
|
||||||
|
| `read_config()` | `load_vars_file()` | build.func |
|
||||||
|
| `write_config()` | `_build_current_app_vars_tmp()` | build.func |
|
||||||
|
| None | `maybe_offer_save_app_defaults()` | build.func |
|
||||||
|
| None | `get_app_defaults_path()` | build.func |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**End of Technical Reference**
|
||||||
146
docs/api/README.md
Normal file
146
docs/api/README.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# API Integration Documentation (/api)
|
||||||
|
|
||||||
|
This directory contains comprehensive documentation for API integration and the `/api` directory.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The `/api` directory contains the Proxmox Community Scripts API backend for diagnostic reporting, telemetry, and analytics integration.
|
||||||
|
|
||||||
|
## Key Components
|
||||||
|
|
||||||
|
### Main API Service
|
||||||
|
Located in `/api/main.go`:
|
||||||
|
- RESTful API for receiving telemetry data
|
||||||
|
- Installation statistics tracking
|
||||||
|
- Error reporting and analytics
|
||||||
|
- Performance monitoring
|
||||||
|
|
||||||
|
### Integration with Scripts
|
||||||
|
The API is integrated into all installation scripts via `api.func`:
|
||||||
|
- Sends installation start/completion events
|
||||||
|
- Reports errors and exit codes
|
||||||
|
- Collects anonymous usage statistics
|
||||||
|
- Enables project analytics
|
||||||
|
|
||||||
|
## Documentation Structure
|
||||||
|
|
||||||
|
API documentation covers:
|
||||||
|
- API endpoint specifications
|
||||||
|
- Integration methods
|
||||||
|
- Data formats and schemas
|
||||||
|
- Error handling
|
||||||
|
- Privacy and data handling
|
||||||
|
|
||||||
|
## Key Resources
|
||||||
|
|
||||||
|
- **[misc/api.func/](../misc/api.func/)** - API function library documentation
|
||||||
|
- **[misc/api.func/README.md](../misc/api.func/README.md)** - Quick reference
|
||||||
|
- **[misc/api.func/API_FUNCTIONS_REFERENCE.md](../misc/api.func/API_FUNCTIONS_REFERENCE.md)** - Complete function reference
|
||||||
|
|
||||||
|
## API Functions
|
||||||
|
|
||||||
|
The `api.func` library provides:
|
||||||
|
|
||||||
|
### `post_to_api()`
|
||||||
|
Send container installation data to API.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
```bash
|
||||||
|
post_to_api CTID STATUS APP_NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
### `post_update_to_api()`
|
||||||
|
Report application update status.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
```bash
|
||||||
|
post_update_to_api CTID APP_NAME VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
### `get_error_description()`
|
||||||
|
Get human-readable error description from exit code.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
```bash
|
||||||
|
ERROR_DESC=$(get_error_description EXIT_CODE)
|
||||||
|
```
|
||||||
|
|
||||||
|
## API Integration Points
|
||||||
|
|
||||||
|
### In Container Creation (`ct/AppName.sh`)
|
||||||
|
- Called by build.func to report container creation
|
||||||
|
- Sends initial container setup data
|
||||||
|
- Reports success or failure
|
||||||
|
|
||||||
|
### In Installation Scripts (`install/appname-install.sh`)
|
||||||
|
- Called at start of installation
|
||||||
|
- Called on installation completion
|
||||||
|
- Called on error conditions
|
||||||
|
|
||||||
|
### Data Collected
|
||||||
|
- Container/VM ID
|
||||||
|
- Application name and version
|
||||||
|
- Installation duration
|
||||||
|
- Success/failure status
|
||||||
|
- Error codes (if failure)
|
||||||
|
- Anonymous usage metrics
|
||||||
|
|
||||||
|
## Privacy
|
||||||
|
|
||||||
|
All API data:
|
||||||
|
- ✅ Anonymous (no personal data)
|
||||||
|
- ✅ Aggregated for statistics
|
||||||
|
- ✅ Used only for project improvement
|
||||||
|
- ✅ No tracking of user identities
|
||||||
|
- ✅ Can be disabled if desired
|
||||||
|
|
||||||
|
## API Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
Installation Scripts
|
||||||
|
│
|
||||||
|
├─ Call: api.func functions
|
||||||
|
│
|
||||||
|
└─ POST to: https://api.community-scripts.org
|
||||||
|
│
|
||||||
|
├─ Receives data
|
||||||
|
├─ Validates format
|
||||||
|
├─ Stores metrics
|
||||||
|
└─ Aggregates statistics
|
||||||
|
│
|
||||||
|
└─ Used for:
|
||||||
|
├─ Download tracking
|
||||||
|
├─ Error trending
|
||||||
|
├─ Feature usage stats
|
||||||
|
└─ Project health monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common API Tasks
|
||||||
|
|
||||||
|
- **Enable API reporting** → Built-in by default, no configuration needed
|
||||||
|
- **Disable API** → Set `api_disable="yes"` before running
|
||||||
|
- **View API data** → Visit https://community-scripts.org/stats
|
||||||
|
- **Report API errors** → [GitHub Issues](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||||
|
|
||||||
|
## Debugging API Issues
|
||||||
|
|
||||||
|
If API calls fail:
|
||||||
|
1. Check internet connectivity
|
||||||
|
2. Verify API endpoint availability
|
||||||
|
3. Review error codes in [EXIT_CODES.md](../EXIT_CODES.md)
|
||||||
|
4. Check API function logs
|
||||||
|
5. Report issues on GitHub
|
||||||
|
|
||||||
|
## API Endpoint
|
||||||
|
|
||||||
|
**Base URL**: `https://api.community-scripts.org`
|
||||||
|
|
||||||
|
**Endpoints**:
|
||||||
|
- `POST /install` - Report container installation
|
||||||
|
- `POST /update` - Report application update
|
||||||
|
- `GET /stats` - Public statistics
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated**: December 2025
|
||||||
|
**Maintainers**: community-scripts team
|
||||||
868
docs/contribution/AI.md
Normal file
868
docs/contribution/AI.md
Normal file
@@ -0,0 +1,868 @@
|
|||||||
|
# 🤖 AI Contribution Guidelines for ProxmoxVE
|
||||||
|
|
||||||
|
> **This documentation is intended for all AI assistants (GitHub Copilot, Claude, ChatGPT, etc.) contributing to this project.**
|
||||||
|
|
||||||
|
## 🎯 Core Principles
|
||||||
|
|
||||||
|
### 1. **Maximum Use of `tools.func` Functions**
|
||||||
|
|
||||||
|
We have an extensive library of helper functions. **NEVER** implement your own solutions when a function already exists!
|
||||||
|
|
||||||
|
### 2. **No Pointless Variables**
|
||||||
|
|
||||||
|
Only create variables when they:
|
||||||
|
|
||||||
|
- Are used multiple times
|
||||||
|
- Improve readability
|
||||||
|
- Are intended for configuration
|
||||||
|
|
||||||
|
### 3. **Consistent Script Structure**
|
||||||
|
|
||||||
|
All scripts follow an identical structure. Deviations are not acceptable.
|
||||||
|
|
||||||
|
### 4. **Bare-Metal Installation**
|
||||||
|
|
||||||
|
We do **NOT use Docker** for our installation scripts. All applications are installed directly on the system.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 Script Types and Their Structure
|
||||||
|
|
||||||
|
### CT Script (`ct/AppName.sh`)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/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: AuthorName (GitHubUsername)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://application-url.com
|
||||||
|
|
||||||
|
APP="AppName"
|
||||||
|
var_tags="${var_tags:-tag1;tag2;tag3}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/appname ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "appname" "YourUsername/YourRepo"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop appname
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp -r /opt/appname/data /opt/appname_data_backup
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
|
||||||
|
# Build steps...
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp -r /opt/appname_data_backup/. /opt/appname/data
|
||||||
|
rm -rf /opt/appname_data_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start appname
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:PORT${CL}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install Script (`install/AppName-install.sh`)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: AuthorName (GitHubUsername)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://application-url.com
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt-get install -y \
|
||||||
|
dependency1 \
|
||||||
|
dependency2
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
# Runtime Setup (ALWAYS use our functions!)
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
# or
|
||||||
|
PG_VERSION="16" setup_postgresql
|
||||||
|
# or
|
||||||
|
setup_uv
|
||||||
|
# etc.
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
|
||||||
|
msg_info "Setting up Application"
|
||||||
|
cd /opt/appname
|
||||||
|
# Build/Setup Schritte...
|
||||||
|
msg_ok "Set up Application"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/appname.service
|
||||||
|
[Unit]
|
||||||
|
Description=AppName Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/appname
|
||||||
|
ExecStart=/path/to/executable
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now appname
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Available Helper Functions
|
||||||
|
|
||||||
|
### Release Management
|
||||||
|
|
||||||
|
| Function | Description | Example |
|
||||||
|
| ----------------------------- | ----------------------------------- | ------------------------------------------------------------- |
|
||||||
|
| `fetch_and_deploy_gh_release` | Fetches and installs GitHub Release | `fetch_and_deploy_gh_release "app" "owner/repo"` |
|
||||||
|
| `check_for_gh_release` | Checks for new version | `if check_for_gh_release "app" "YourUsername/YourRepo"; then` |
|
||||||
|
|
||||||
|
**Modes for `fetch_and_deploy_gh_release`:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tarball/Source (Standard)
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo"
|
||||||
|
|
||||||
|
# Binary (.deb)
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo" "binary"
|
||||||
|
|
||||||
|
# Prebuilt Archive
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo" "prebuild" "latest" "/opt/appname" "filename.tar.gz"
|
||||||
|
|
||||||
|
# Single Binary
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo" "singlefile" "latest" "/opt/appname" "binary-linux-amd64"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clean Install Flag:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Runtime/Language Setup
|
||||||
|
|
||||||
|
| Function | Variable(s) | Example |
|
||||||
|
| -------------- | ----------------------------- | ---------------------------------------------------- |
|
||||||
|
| `setup_nodejs` | `NODE_VERSION`, `NODE_MODULE` | `NODE_VERSION="22" setup_nodejs` |
|
||||||
|
| `setup_uv` | `PYTHON_VERSION` | `PYTHON_VERSION="3.12" setup_uv` |
|
||||||
|
| `setup_go` | `GO_VERSION` | `GO_VERSION="1.22" setup_go` |
|
||||||
|
| `setup_rust` | `RUST_VERSION`, `RUST_CRATES` | `RUST_CRATES="monolith" setup_rust` |
|
||||||
|
| `setup_ruby` | `RUBY_VERSION` | `RUBY_VERSION="3.3" setup_ruby` |
|
||||||
|
| `setup_java` | `JAVA_VERSION` | `JAVA_VERSION="21" setup_java` |
|
||||||
|
| `setup_php` | `PHP_VERSION`, `PHP_MODULES` | `PHP_VERSION="8.3" PHP_MODULES="redis,gd" setup_php` |
|
||||||
|
|
||||||
|
### Database Setup
|
||||||
|
|
||||||
|
| Function | Variable(s) | Example |
|
||||||
|
| --------------------- | ------------------------------------ | ----------------------------------------------------------- |
|
||||||
|
| `setup_postgresql` | `PG_VERSION`, `PG_MODULES` | `PG_VERSION="16" setup_postgresql` |
|
||||||
|
| `setup_postgresql_db` | `PG_DB_NAME`, `PG_DB_USER` | `PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db` |
|
||||||
|
| `setup_mariadb_db` | `MARIADB_DB_NAME`, `MARIADB_DB_USER` | `MARIADB_DB_NAME="mydb" setup_mariadb_db` |
|
||||||
|
| `setup_mysql` | `MYSQL_VERSION` | `setup_mysql` |
|
||||||
|
| `setup_mongodb` | `MONGO_VERSION` | `setup_mongodb` |
|
||||||
|
| `setup_clickhouse` | - | `setup_clickhouse` |
|
||||||
|
|
||||||
|
### Tools & Utilities
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
| ------------------- | ---------------------------------- |
|
||||||
|
| `setup_adminer` | Installs Adminer for DB management |
|
||||||
|
| `setup_composer` | Install PHP Composer |
|
||||||
|
| `setup_ffmpeg` | Install FFmpeg |
|
||||||
|
| `setup_imagemagick` | Install ImageMagick |
|
||||||
|
| `setup_gs` | Install Ghostscript |
|
||||||
|
| `setup_hwaccel` | Configure hardware acceleration |
|
||||||
|
|
||||||
|
### Helper Utilities
|
||||||
|
|
||||||
|
| Function | Description | Example |
|
||||||
|
| ----------------------------- | ---------------------------- | ----------------------------------------- |
|
||||||
|
| `import_local_ip` | Sets `$LOCAL_IP` variable | `import_local_ip` |
|
||||||
|
| `ensure_dependencies` | Checks/installs dependencies | `ensure_dependencies curl jq` |
|
||||||
|
| `install_packages_with_retry` | APT install with retry | `install_packages_with_retry nginx redis` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ❌ Anti-Patterns (NEVER use!)
|
||||||
|
|
||||||
|
### 1. Pointless Variables
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - unnecessary variables
|
||||||
|
APP_NAME="myapp"
|
||||||
|
APP_DIR="/opt/${APP_NAME}"
|
||||||
|
APP_USER="root"
|
||||||
|
APP_PORT="3000"
|
||||||
|
cd $APP_DIR
|
||||||
|
|
||||||
|
# ✅ CORRECT - use directly
|
||||||
|
cd /opt/myapp
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Custom Download Logic
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - custom wget/curl logic
|
||||||
|
RELEASE=$(curl -s https://api.github.com/repos/YourUsername/YourRepo/releases/latest | jq -r '.tag_name')
|
||||||
|
wget https://github.com/YourUsername/YourRepo/archive/${RELEASE}.tar.gz
|
||||||
|
tar -xzf ${RELEASE}.tar.gz
|
||||||
|
mv repo-${RELEASE} /opt/myapp
|
||||||
|
|
||||||
|
# ✅ CORRECT - use our function
|
||||||
|
fetch_and_deploy_gh_release "myapp" "YourUsername/YourRepo" "tarball" "latest" "/opt/myapp"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Custom Version-Check Logic
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - custom version check
|
||||||
|
CURRENT=$(cat /opt/myapp/version.txt)
|
||||||
|
LATEST=$(curl -s https://api.github.com/repos/YourUsername/YourRepo/releases/latest | jq -r '.tag_name')
|
||||||
|
if [[ "$CURRENT" != "$LATEST" ]]; then
|
||||||
|
# update...
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ✅ CORRECT - use our function
|
||||||
|
if check_for_gh_release "myapp" "YourUsername/YourRepo"; then
|
||||||
|
# update...
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Docker-based Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - using Docker
|
||||||
|
docker pull myapp/myapp:latest
|
||||||
|
docker run -d --name myapp myapp/myapp:latest
|
||||||
|
|
||||||
|
# ✅ CORRECT - Bare-Metal Installation
|
||||||
|
fetch_and_deploy_gh_release "myapp" "YourUsername/YourRepo"
|
||||||
|
npm install && npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Custom Runtime Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - custom Node.js installation
|
||||||
|
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
|
||||||
|
apt install -y nodejs
|
||||||
|
|
||||||
|
# ✅ CORRECT - use our function
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Redundant echo Statements
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - custom logging messages
|
||||||
|
echo "Installing dependencies..."
|
||||||
|
apt install -y curl
|
||||||
|
echo "Done!"
|
||||||
|
|
||||||
|
# ✅ CORRECT - use msg_info/msg_ok
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y curl
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Missing $STD Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - apt without $STD
|
||||||
|
apt install -y nginx
|
||||||
|
|
||||||
|
# ✅ CORRECT - with $STD for silent output
|
||||||
|
$STD apt install -y nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. Wrapping `tools.func` Functions in msg Blocks
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - tools.func functions have their own msg_info/msg_ok!
|
||||||
|
msg_info "Installing Node.js"
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
msg_ok "Installed Node.js"
|
||||||
|
|
||||||
|
msg_info "Updating Application"
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
msg_ok "Updated Application"
|
||||||
|
|
||||||
|
# ✅ CORRECT - call directly without msg wrapper
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Functions with built-in messages (NEVER wrap in msg blocks):**
|
||||||
|
|
||||||
|
- `fetch_and_deploy_gh_release`
|
||||||
|
- `check_for_gh_release`
|
||||||
|
- `setup_nodejs`
|
||||||
|
- `setup_postgresql` / `setup_postgresql_db`
|
||||||
|
- `setup_mariadb` / `setup_mariadb_db`
|
||||||
|
- `setup_mongodb`
|
||||||
|
- `setup_mysql`
|
||||||
|
- `setup_ruby`
|
||||||
|
- `setup_go`
|
||||||
|
- `setup_java`
|
||||||
|
- `setup_php`
|
||||||
|
- `setup_uv`
|
||||||
|
- `setup_rust`
|
||||||
|
- `setup_composer`
|
||||||
|
- `setup_ffmpeg`
|
||||||
|
- `setup_imagemagick`
|
||||||
|
- `setup_gs`
|
||||||
|
- `setup_adminer`
|
||||||
|
- `setup_hwaccel`
|
||||||
|
|
||||||
|
### 9. Creating Unnecessary System Users
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - LXC containers run as root, no separate user needed
|
||||||
|
useradd -m -s /usr/bin/bash appuser
|
||||||
|
chown -R appuser:appuser /opt/appname
|
||||||
|
sudo -u appuser npm install
|
||||||
|
|
||||||
|
# ✅ CORRECT - run directly as root
|
||||||
|
cd /opt/appname
|
||||||
|
$STD npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. Using `export` in .env Files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - export is unnecessary in .env files
|
||||||
|
cat <<EOF >/opt/appname/.env
|
||||||
|
export DATABASE_URL=postgres://...
|
||||||
|
export SECRET_KEY=abc123
|
||||||
|
export NODE_ENV=production
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# ✅ CORRECT - simple KEY=VALUE format (files are sourced with set -a)
|
||||||
|
cat <<EOF >/opt/appname/.env
|
||||||
|
DATABASE_URL=postgres://...
|
||||||
|
SECRET_KEY=abc123
|
||||||
|
NODE_ENV=production
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### 11. Using External Shell Scripts
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - external script that gets executed
|
||||||
|
cat <<'EOF' >/opt/appname/install_script.sh
|
||||||
|
#!/bin/bash
|
||||||
|
cd /opt/appname
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
EOF
|
||||||
|
chmod +x /opt/appname/install_script.sh
|
||||||
|
$STD bash /opt/appname/install_script.sh
|
||||||
|
rm -f /opt/appname/install_script.sh
|
||||||
|
|
||||||
|
# ✅ CORRECT - run commands directly
|
||||||
|
cd /opt/appname
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 12. Using `sudo` in LXC Containers
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - sudo is unnecessary in LXC (already root)
|
||||||
|
sudo -u postgres psql -c "CREATE DATABASE mydb;"
|
||||||
|
sudo -u appuser npm install
|
||||||
|
|
||||||
|
# ✅ CORRECT - use functions or run directly as root
|
||||||
|
PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db
|
||||||
|
|
||||||
|
cd /opt/appname
|
||||||
|
$STD npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 13. Unnecessary `systemctl daemon-reload`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - daemon-reload is only needed when MODIFYING existing services
|
||||||
|
cat <<EOF >/etc/systemd/system/appname.service
|
||||||
|
# ... service config ...
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload # Unnecessary for new services!
|
||||||
|
systemctl enable -q --now appname
|
||||||
|
|
||||||
|
# ✅ CORRECT - new services don't need daemon-reload
|
||||||
|
cat <<EOF >/etc/systemd/system/appname.service
|
||||||
|
# ... service config ...
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now appname
|
||||||
|
```
|
||||||
|
|
||||||
|
### 14. Creating Custom Credentials Files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - custom credentials file is not part of the standard template
|
||||||
|
msg_info "Saving Credentials"
|
||||||
|
cat <<EOF >~/appname.creds
|
||||||
|
Database User: ${DB_USER}
|
||||||
|
Database Pass: ${DB_PASS}
|
||||||
|
EOF
|
||||||
|
msg_ok "Saved Credentials"
|
||||||
|
|
||||||
|
# ✅ CORRECT - credentials are stored in .env or shown in final message only
|
||||||
|
# If you use setup_postgresql_db / setup_mariadb_db, a standard ~/[appname].creds is created automatically
|
||||||
|
```
|
||||||
|
|
||||||
|
### 15. Wrong Footer Pattern
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - old cleanup pattern with msg blocks
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt-get -y autoremove
|
||||||
|
$STD apt-get -y autoclean
|
||||||
|
msg_ok "Cleaned"
|
||||||
|
|
||||||
|
# ✅ CORRECT - use cleanup_lxc function
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
|
```
|
||||||
|
|
||||||
|
### 16. Manual Database Creation Instead of Functions
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - manual database creation
|
||||||
|
DB_USER="myuser"
|
||||||
|
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||||
|
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
|
||||||
|
$STD sudo -u postgres psql -c "CREATE DATABASE mydb WITH OWNER $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -d mydb -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
||||||
|
|
||||||
|
# ✅ CORRECT - use setup_postgresql_db function
|
||||||
|
# This sets PG_DB_USER, PG_DB_PASS, PG_DB_NAME automatically
|
||||||
|
PG_DB_NAME="mydb" PG_DB_USER="myuser" PG_DB_EXTENSIONS="postgis" setup_postgresql_db
|
||||||
|
```
|
||||||
|
|
||||||
|
### 17. Writing Files Without Heredocs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ WRONG - echo / printf / tee
|
||||||
|
echo "# Config" > /opt/app/config.yml
|
||||||
|
echo "port: 3000" >> /opt/app/config.yml
|
||||||
|
|
||||||
|
printf "# Config\nport: 3000\n" > /opt/app/config.yml
|
||||||
|
cat config.yml | tee /opt/app/config.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ✅ CORRECT - always use a single heredoc
|
||||||
|
cat <<EOF >/opt/app/config.yml
|
||||||
|
# Config
|
||||||
|
port: 3000
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 Important Rules
|
||||||
|
|
||||||
|
### Variable Declarations (CT Script)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Standard declarations (ALWAYS present)
|
||||||
|
APP="AppName"
|
||||||
|
var_tags="${var_tags:-tag1;tag2}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update-Script Pattern
|
||||||
|
|
||||||
|
```bash
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
# 1. Check if installation exists
|
||||||
|
if [[ ! -d /opt/appname ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Check for update
|
||||||
|
if check_for_gh_release "appname" "YourUsername/YourRepo"; then
|
||||||
|
# 3. Stop service
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop appname
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
# 4. Backup data (if present)
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
cp -r /opt/appname/data /opt/appname_data_backup
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
# 5. Perform clean install
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
|
||||||
|
# 6. Rebuild (if needed)
|
||||||
|
cd /opt/appname
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
|
||||||
|
# 7. Restore data
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp -r /opt/appname_data_backup/. /opt/appname/data
|
||||||
|
rm -rf /opt/appname_data_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
# 8. Start service
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start appname
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit # IMPORTANT: Always end with exit!
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Systemd Service Pattern
|
||||||
|
|
||||||
|
```bash
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/appname.service
|
||||||
|
[Unit]
|
||||||
|
Description=AppName Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/appname
|
||||||
|
Environment=NODE_ENV=production
|
||||||
|
ExecStart=/usr/bin/node /opt/appname/server.js
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now appname
|
||||||
|
msg_ok "Created Service"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installation Script Footer
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ALWAYS at the end of the install script:
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 Reference: Good Example Scripts
|
||||||
|
|
||||||
|
Look at these recent well-implemented applications as reference:
|
||||||
|
|
||||||
|
### Container Scripts (Latest 10)
|
||||||
|
|
||||||
|
- [ct/thingsboard.sh](../ct/thingsboard.sh) - IoT platform with proper update_script
|
||||||
|
- [ct/unifi-os-server.sh](../ct/unifi-os-server.sh) - Complex setup with podman
|
||||||
|
- [ct/trip.sh](../ct/trip.sh) - Simple Ruby app
|
||||||
|
- [ct/fladder.sh](../ct/fladder.sh) - Media app with database
|
||||||
|
- [ct/qui.sh](../ct/qui.sh) - Lightweight utility
|
||||||
|
- [ct/kutt.sh](../ct/kutt.sh) - Node.js with PostgreSQL
|
||||||
|
- [ct/flatnotes.sh](../ct/flatnotes.sh) - Python notes app
|
||||||
|
- [ct/investbrain.sh](../ct/investbrain.sh) - Finance app
|
||||||
|
- [ct/gwn-manager.sh](../ct/gwn-manager.sh) - Network management
|
||||||
|
- [ct/sportarr.sh](../ct/sportarr.sh) - Specialized \*Arr variant
|
||||||
|
|
||||||
|
### Install Scripts (Latest)
|
||||||
|
|
||||||
|
- [install/unifi-os-server-install.sh](../install/unifi-os-server-install.sh) - Complex setup with API integration
|
||||||
|
- [install/trip-install.sh](../install/trip-install.sh) - Rails application setup
|
||||||
|
- [install/mail-archiver-install.sh](../install/mail-archiver-install.sh) - Email-related service
|
||||||
|
|
||||||
|
**Key things to notice:**
|
||||||
|
|
||||||
|
- Proper error handling with `catch_errors`
|
||||||
|
- Use of `check_for_gh_release` and `fetch_and_deploy_gh_release`
|
||||||
|
- Correct backup/restore patterns in `update_script`
|
||||||
|
- Footer always ends with `motd_ssh`, `customize`, `cleanup_lxc`
|
||||||
|
- Website metadata requested via the website (Report issue on script page) if needed
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Website Metadata (Reference)
|
||||||
|
|
||||||
|
Website metadata (name, slug, description, logo, categories, etc.) is **not** added as files in the repo. Contributors request or update it via the **website**: go to the script's page and use the **Report issue** button; the flow will guide you. The structure below is a **reference** for what metadata exists (e.g. for the form or when describing what you need).
|
||||||
|
|
||||||
|
### JSON Structure (Reference)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "AppName",
|
||||||
|
"slug": "appname",
|
||||||
|
"categories": [1],
|
||||||
|
"date_created": "2026-01-16",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 3000,
|
||||||
|
"documentation": "https://docs.appname.com/",
|
||||||
|
"website": "https://appname.com/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/appname.webp",
|
||||||
|
"config_path": "/opt/appname/.env",
|
||||||
|
"description": "Short description of the application and its purpose.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/appname.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Required Fields
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
| --------------------- | ------- | -------------------------------------------------- |
|
||||||
|
| `name` | string | Display name of the application |
|
||||||
|
| `slug` | string | Lowercase, no spaces, used for filenames |
|
||||||
|
| `categories` | array | Category ID(s) - see category list below |
|
||||||
|
| `date_created` | string | Creation date (YYYY-MM-DD) |
|
||||||
|
| `type` | string | `ct` for container, `vm` for virtual machine |
|
||||||
|
| `updateable` | boolean | Whether update_script is implemented |
|
||||||
|
| `privileged` | boolean | Whether container needs privileged mode |
|
||||||
|
| `interface_port` | number | Primary web interface port (or `null`) |
|
||||||
|
| `documentation` | string | Link to official docs |
|
||||||
|
| `website` | string | Link to official website |
|
||||||
|
| `logo` | string | URL to application logo (preferably selfhst icons) |
|
||||||
|
| `config_path` | string | Path to main config file (or empty string) |
|
||||||
|
| `description` | string | Brief description of the application |
|
||||||
|
| `install_methods` | array | Installation configurations |
|
||||||
|
| `default_credentials` | object | Default username/password (or null) |
|
||||||
|
| `notes` | array | Additional notes/warnings |
|
||||||
|
|
||||||
|
### Categories
|
||||||
|
|
||||||
|
| ID | Category |
|
||||||
|
| --- | ------------------------- |
|
||||||
|
| 0 | Miscellaneous |
|
||||||
|
| 1 | Proxmox & Virtualization |
|
||||||
|
| 2 | Operating Systems |
|
||||||
|
| 3 | Containers & Docker |
|
||||||
|
| 4 | Network & Firewall |
|
||||||
|
| 5 | Adblock & DNS |
|
||||||
|
| 6 | Authentication & Security |
|
||||||
|
| 7 | Backup & Recovery |
|
||||||
|
| 8 | Databases |
|
||||||
|
| 9 | Monitoring & Analytics |
|
||||||
|
| 10 | Dashboards & Frontends |
|
||||||
|
| 11 | Files & Downloads |
|
||||||
|
| 12 | Documents & Notes |
|
||||||
|
| 13 | Media & Streaming |
|
||||||
|
| 14 | \*Arr Suite |
|
||||||
|
| 15 | NVR & Cameras |
|
||||||
|
| 16 | IoT & Smart Home |
|
||||||
|
| 17 | ZigBee, Z-Wave & Matter |
|
||||||
|
| 18 | MQTT & Messaging |
|
||||||
|
| 19 | Automation & Scheduling |
|
||||||
|
| 20 | AI / Coding & Dev-Tools |
|
||||||
|
| 21 | Webservers & Proxies |
|
||||||
|
| 22 | Bots & ChatOps |
|
||||||
|
| 23 | Finance & Budgeting |
|
||||||
|
| 24 | Gaming & Leisure |
|
||||||
|
| 25 | Business & ERP |
|
||||||
|
|
||||||
|
### Notes Format
|
||||||
|
|
||||||
|
```json
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Change the default password after first login!",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Requires at least 4GB RAM for optimal performance.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note types:** `info`, `warning`, `error`
|
||||||
|
|
||||||
|
### Examples with Credentials
|
||||||
|
|
||||||
|
```json
|
||||||
|
"default_credentials": {
|
||||||
|
"username": "admin",
|
||||||
|
"password": "admin"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or no credentials:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Checklist Before PR Creation
|
||||||
|
|
||||||
|
- [ ] No Docker installation used
|
||||||
|
- [ ] `fetch_and_deploy_gh_release` used for GitHub releases
|
||||||
|
- [ ] `check_for_gh_release` used for update checks
|
||||||
|
- [ ] `setup_*` functions used for runtimes (nodejs, postgresql, etc.)
|
||||||
|
- [ ] **`tools.func` functions NOT wrapped in msg_info/msg_ok blocks**
|
||||||
|
- [ ] No redundant variables (only when used multiple times)
|
||||||
|
- [ ] `$STD` before all apt/npm/build commands
|
||||||
|
- [ ] `msg_info`/`msg_ok`/`msg_error` for logging (only for custom code)
|
||||||
|
- [ ] Correct script structure followed (see templates)
|
||||||
|
- [ ] Update function present and functional (CT scripts)
|
||||||
|
- [ ] Data backup implemented in update function (if applicable)
|
||||||
|
- [ ] `motd_ssh`, `customize`, `cleanup_lxc` at the end of install scripts
|
||||||
|
- [ ] No custom download/version-check logic
|
||||||
|
- [ ] All links point to `community-scripts/ProxmoxVE` (not `ProxmoxVED`!)
|
||||||
|
- [ ] Website metadata requested via the website (Report issue) if needed
|
||||||
|
- [ ] Category IDs are valid (0-25)
|
||||||
|
- [ ] Default OS version is Debian 13 or newer (unless special requirement)
|
||||||
|
- [ ] Default resources are reasonable for the application
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 Tips for AI Assistants
|
||||||
|
|
||||||
|
1. **ALWAYS search `tools.func` first** before implementing custom solutions
|
||||||
|
2. **Use recent scripts as reference** (Thingsboard, UniFi OS, Trip, Flatnotes, etc.)
|
||||||
|
3. **Ask when uncertain** instead of introducing wrong patterns
|
||||||
|
4. **Test via GitHub** - push to your fork and test with curl (not local bash)
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||||
|
# Wait 10-30 seconds after pushing - GitHub takes time to update files
|
||||||
|
```
|
||||||
|
5. **Consistency > Creativity** - follow established patterns strictly
|
||||||
|
6. **Check the templates** - they show the correct structure
|
||||||
|
7. **Don't wrap tools.func functions** - they handle their own msg_info/msg_ok output
|
||||||
|
8. **Minimal variables** - only create variables that are truly reused multiple times
|
||||||
|
9. **Always use $STD** - ensures silent/non-interactive execution
|
||||||
|
10. **Reference good examples** - look at recent additions in each category
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🍒 Important: Cherry-Picking Your Files for PR Submission
|
||||||
|
|
||||||
|
⚠️ **CRITICAL**: When you submit your PR, you must use git cherry-pick to send ONLY your 2 files!
|
||||||
|
|
||||||
|
Why? Because `setup-fork.sh` modifies 600+ files to update links. If you commit all changes, your PR will be impossible to merge.
|
||||||
|
|
||||||
|
**See**: [README.md - Cherry-Pick Section](README.md#-cherry-pick-submitting-only-your-changes) for complete instructions on:
|
||||||
|
|
||||||
|
- Creating a clean submission branch
|
||||||
|
- Cherry-picking only your files (ct/myapp.sh, install/myapp-install.sh)
|
||||||
|
- Verifying your PR has only 2 file changes (not 600+)
|
||||||
|
|
||||||
|
**Quick reference**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create clean branch from upstream
|
||||||
|
git fetch upstream
|
||||||
|
git checkout -b submit/myapp upstream/main
|
||||||
|
|
||||||
|
# Cherry-pick your commit(s) or manually add your 2 files
|
||||||
|
# Then push to your fork and create PR
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Further Documentation
|
||||||
|
|
||||||
|
- [CONTRIBUTING.md](CONTRIBUTING.md) - General contribution guidelines
|
||||||
|
- [GUIDE.md](GUIDE.md) - Detailed developer documentation
|
||||||
|
- [HELPER_FUNCTIONS.md](HELPER_FUNCTIONS.md) - Complete tools.func reference
|
||||||
|
- [README.md](README.md) - Cherry-pick guide and workflow instructions
|
||||||
|
- [../TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md) - Technical deep dive
|
||||||
|
- [../EXIT_CODES.md](../EXIT_CODES.md) - Exit code reference
|
||||||
|
- [templates_ct/](templates_ct/) - CT script templates
|
||||||
|
- [templates_install/](templates_install/) - Install script templates
|
||||||
|
- [templates_json/](templates_json/) - Metadata structure reference; submit via website
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user