mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-05-26 18:29:35 +02:00
Compare commits
7 Commits
node_js_ve
...
improve/bu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c05f7f858 | ||
|
|
be52f8e223 | ||
|
|
2008b1b458 | ||
|
|
a02bdf083d | ||
|
|
21e215dc1b | ||
|
|
6b9930c8df | ||
|
|
c3cb983085 |
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
|
||||||
|
|||||||
187
.github/changelogs/2026/03.md
generated
vendored
187
.github/changelogs/2026/03.md
generated
vendored
@@ -1,190 +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
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Fix: Update gokapi binary name for v2.2.4+ and add migration step [@krazos](https://github.com/krazos) ([#13377](https://github.com/community-scripts/ProxmoxVE/pull/13377))
|
|
||||||
- Fix: update gokapi asset matching for v2.2.4+ naming convention [@krazos](https://github.com/krazos) ([#13369](https://github.com/community-scripts/ProxmoxVE/pull/13369))
|
|
||||||
- Tandoor Recipes: Add missing env variable [@tremor021](https://github.com/tremor021) ([#13365](https://github.com/community-scripts/ProxmoxVE/pull/13365))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- FileFlows: add option to install Node [@tremor021](https://github.com/tremor021) ([#13368](https://github.com/community-scripts/ProxmoxVE/pull/13368))
|
|
||||||
|
|
||||||
## 2026-03-27
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Matter-Server ([#13355](https://github.com/community-scripts/ProxmoxVE/pull/13355))
|
|
||||||
- GeoPulse ([#13320](https://github.com/community-scripts/ProxmoxVE/pull/13320))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- RevealJS: Switch from gulp to vite [@tremor021](https://github.com/tremor021) ([#13336](https://github.com/community-scripts/ProxmoxVE/pull/13336))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Dispatcharr add custom Postgres port support for upgrade [@MickLesk](https://github.com/MickLesk) ([#13347](https://github.com/community-scripts/ProxmoxVE/pull/13347))
|
|
||||||
- Immich: bump to v2.6.3 [@MickLesk](https://github.com/MickLesk) ([#13324](https://github.com/community-scripts/ProxmoxVE/pull/13324))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Refactor/Feature-Bump/Security: Update-Cron-LXCs (Now Local Mode!) [@MickLesk](https://github.com/MickLesk) ([#13339](https://github.com/community-scripts/ProxmoxVE/pull/13339))
|
|
||||||
|
|
||||||
## 2026-03-26
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- BirdNET ([#13313](https://github.com/community-scripts/ProxmoxVE/pull/13313))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Immich: Bump to 2.6.2 | use start.sh in service, ensure DB_HOSTNAME in .env | Fix Rights Issue with ZFS Shares [@MickLesk](https://github.com/MickLesk) ([#13199](https://github.com/community-scripts/ProxmoxVE/pull/13199))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- SparkyFitness: add garmin microservice as addon [@tomfrenzel](https://github.com/tomfrenzel) ([#12642](https://github.com/community-scripts/ProxmoxVE/pull/12642))
|
|
||||||
- Frigate: bump to v0.17.1 & change build order [@MickLesk](https://github.com/MickLesk) ([#13304](https://github.com/community-scripts/ProxmoxVE/pull/13304))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- tools.func: pin npm to 11.11.0 to work around Node.js 22.22.2 regression [@MickLesk](https://github.com/MickLesk) ([#13296](https://github.com/community-scripts/ProxmoxVE/pull/13296))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: APT/APK Mirror Fallback for CDN Failures [@MickLesk](https://github.com/MickLesk) ([#13316](https://github.com/community-scripts/ProxmoxVE/pull/13316))
|
|
||||||
- core/tools: replace generic return 1 exit_codes with more specific exit_codes [@MickLesk](https://github.com/MickLesk) ([#13311](https://github.com/community-scripts/ProxmoxVE/pull/13311))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: use /usr/bin/install to prevent function shadowing [@MickLesk](https://github.com/MickLesk) ([#13299](https://github.com/community-scripts/ProxmoxVE/pull/13299))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- SparkyFitness-Garmin: fix app name [@tomfrenzel](https://github.com/tomfrenzel) ([#13325](https://github.com/community-scripts/ProxmoxVE/pull/13325))
|
|
||||||
|
|
||||||
## 2026-03-25
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Komodo v2: migrate env vars to v2 and update source [@MickLesk](https://github.com/MickLesk) ([#13262](https://github.com/community-scripts/ProxmoxVE/pull/13262))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: make shell command substitutions safe with || true [@MickLesk](https://github.com/MickLesk) ([#13279](https://github.com/community-scripts/ProxmoxVE/pull/13279))
|
|
||||||
|
|
||||||
## 2026-03-24
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Homebrew (Addon) ([#13249](https://github.com/community-scripts/ProxmoxVE/pull/13249))
|
|
||||||
- NextExplorer ([#13252](https://github.com/community-scripts/ProxmoxVE/pull/13252))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Turnkey: modernize turnkey.sh with shared libraries [@MickLesk](https://github.com/MickLesk) ([#13242](https://github.com/community-scripts/ProxmoxVE/pull/13242))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- chore: replace helper-scripts.com with community-scripts.com [@MickLesk](https://github.com/MickLesk) ([#13244](https://github.com/community-scripts/ProxmoxVE/pull/13244))
|
|
||||||
|
|
||||||
### 🗑️ Deleted Scripts
|
|
||||||
|
|
||||||
- Remove: Booklore [@MickLesk](https://github.com/MickLesk) ([#13265](https://github.com/community-scripts/ProxmoxVE/pull/13265))
|
|
||||||
|
|
||||||
## 2026-03-23
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: harden shell scripts against injection and insecure permissions [@MickLesk](https://github.com/MickLesk) ([#13239](https://github.com/community-scripts/ProxmoxVE/pull/13239))
|
|
||||||
|
|
||||||
## 2026-03-22
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- versitygw ([#13180](https://github.com/community-scripts/ProxmoxVE/pull/13180))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Adventurelog: pin DRF <3.15 to fix coreapi module removal [@MickLesk](https://github.com/MickLesk) ([#13194](https://github.com/community-scripts/ProxmoxVE/pull/13194))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- ConvertX: add libreoffice-writer for ODT/document conversions [@MickLesk](https://github.com/MickLesk) ([#13196](https://github.com/community-scripts/ProxmoxVE/pull/13196))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- iSponsorblockTV: add AVX CPU check before installation [@MickLesk](https://github.com/MickLesk) ([#13197](https://github.com/community-scripts/ProxmoxVE/pull/13197))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: guard against empty IPv6 address in static mode [@MickLesk](https://github.com/MickLesk) ([#13195](https://github.com/community-scripts/ProxmoxVE/pull/13195))
|
|
||||||
|
|
||||||
## 2026-03-21
|
## 2026-03-21
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
590
.github/changelogs/2026/04.md
generated
vendored
590
.github/changelogs/2026/04.md
generated
vendored
@@ -1,590 +0,0 @@
|
|||||||
## 2026-04-30
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Nagios ([#14126](https://github.com/community-scripts/ProxmoxVE/pull/14126))
|
|
||||||
- Neko ([#14121](https://github.com/community-scripts/ProxmoxVE/pull/14121))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- alpine-docker: install openssl as core dependency | alpine-komodo: check & install openssl if missing [@MickLesk](https://github.com/MickLesk) ([#14134](https://github.com/community-scripts/ProxmoxVE/pull/14134))
|
|
||||||
- endurain: update source references to Codeberg [@MickLesk](https://github.com/MickLesk) ([#14128](https://github.com/community-scripts/ProxmoxVE/pull/14128))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- tools.func: Manage minor versions for MongoDB 8.x [@tremor021](https://github.com/tremor021) ([#14131](https://github.com/community-scripts/ProxmoxVE/pull/14131))
|
|
||||||
|
|
||||||
## 2026-04-29
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- GrayLog: MongoDB update to 8.2.x [@tremor021](https://github.com/tremor021) ([#14114](https://github.com/community-scripts/ProxmoxVE/pull/14114))
|
|
||||||
- Graylog: Better information in the log file [@tremor021](https://github.com/tremor021) ([#14110](https://github.com/community-scripts/ProxmoxVE/pull/14110))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Refactor: checkMK [@MickLesk](https://github.com/MickLesk) ([#14105](https://github.com/community-scripts/ProxmoxVE/pull/14105))
|
|
||||||
- PatchMon: Unpin release [@tremor021](https://github.com/tremor021) ([#14097](https://github.com/community-scripts/ProxmoxVE/pull/14097))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: add guidance when storage lacks rootdir support [@MickLesk](https://github.com/MickLesk) ([#14108](https://github.com/community-scripts/ProxmoxVE/pull/14108))
|
|
||||||
|
|
||||||
## 2026-04-28
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- StoryBook ([#14081](https://github.com/community-scripts/ProxmoxVE/pull/14081))
|
|
||||||
- CoreDNS ([#14082](https://github.com/community-scripts/ProxmoxVE/pull/14082))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- Fix Dawarich Install/Update [@Jerry1098](https://github.com/Jerry1098) ([#14078](https://github.com/community-scripts/ProxmoxVE/pull/14078))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- PatchMon Version 2.0.2 Script update [@9technologygroup](https://github.com/9technologygroup) ([#14095](https://github.com/community-scripts/ProxmoxVE/pull/14095))
|
|
||||||
|
|
||||||
## 2026-04-27
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- Add pamUsername column to userOrgs table [@JVKeller](https://github.com/JVKeller) ([#14075](https://github.com/community-scripts/ProxmoxVE/pull/14075))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Dawarich: run db:migrate before assets:precompile [@MickLesk](https://github.com/MickLesk) ([#14051](https://github.com/community-scripts/ProxmoxVE/pull/14051))
|
|
||||||
- TechnitiumDNS: always install .NET 10 if not already present [@MickLesk](https://github.com/MickLesk) ([#14049](https://github.com/community-scripts/ProxmoxVE/pull/14049))
|
|
||||||
|
|
||||||
- #### 💥 Breaking Changes
|
|
||||||
|
|
||||||
- PatchMon: v2.0.0 migration [@vhsdream](https://github.com/vhsdream) ([#14015](https://github.com/community-scripts/ProxmoxVE/pull/14015))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Update build.func - fixed spelling mistake [@m1ckywill](https://github.com/m1ckywill) ([#14047](https://github.com/community-scripts/ProxmoxVE/pull/14047))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- update-lxcs/apps: avoid pct exec on containers mid-shutdown [@MickLesk](https://github.com/MickLesk) ([#14050](https://github.com/community-scripts/ProxmoxVE/pull/14050))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Add patchmon-agent report execution in update script [@heinemannj](https://github.com/heinemannj) ([#14054](https://github.com/community-scripts/ProxmoxVE/pull/14054))
|
|
||||||
|
|
||||||
## 2026-04-26
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- TREK ([#14017](https://github.com/community-scripts/ProxmoxVE/pull/14017))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- fix(2fauth): handle stale backup directory on update [@omertahaoztop](https://github.com/omertahaoztop) ([#14018](https://github.com/community-scripts/ProxmoxVE/pull/14018))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Increase Frigate default CPU cores from 4 to 8 [@MickLesk](https://github.com/MickLesk) ([#14039](https://github.com/community-scripts/ProxmoxVE/pull/14039))
|
|
||||||
- Technitium DNS: Ensure directories exist before running service [@tremor021](https://github.com/tremor021) ([#14030](https://github.com/community-scripts/ProxmoxVE/pull/14030))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: Correct deb822 repository flat path detection [@MickLesk](https://github.com/MickLesk) ([#14037](https://github.com/community-scripts/ProxmoxVE/pull/14037))
|
|
||||||
|
|
||||||
## 2026-04-25
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- VictoriaMetrics: Stop vmagent/vmalert before update [@irishpadres](https://github.com/irishpadres) ([#14016](https://github.com/community-scripts/ProxmoxVE/pull/14016))
|
|
||||||
- Domain-Monitor: start apache2 after stop instead of reload [@omertahaoztop](https://github.com/omertahaoztop) ([#14019](https://github.com/community-scripts/ProxmoxVE/pull/14019))
|
|
||||||
- Transmute: Fix ffmpeg detection [@tremor021](https://github.com/tremor021) ([#14008](https://github.com/community-scripts/ProxmoxVE/pull/14008))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Refactor: Technitium DNS [@tremor021](https://github.com/tremor021) ([#14013](https://github.com/community-scripts/ProxmoxVE/pull/14013))
|
|
||||||
|
|
||||||
## 2026-04-24
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Apprise-API ([#13934](https://github.com/community-scripts/ProxmoxVE/pull/13934))
|
|
||||||
- fireshare ([#13995](https://github.com/community-scripts/ProxmoxVE/pull/13995))
|
|
||||||
- Transmute ([#13935](https://github.com/community-scripts/ProxmoxVE/pull/13935))
|
|
||||||
- Jitsi-Meet ([#13897](https://github.com/community-scripts/ProxmoxVE/pull/13897))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- Update wger.sh [@Soppster1029](https://github.com/Soppster1029) ([#13977](https://github.com/community-scripts/ProxmoxVE/pull/13977))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Refactor: Ghostfolio [@MickLesk](https://github.com/MickLesk) ([#13990](https://github.com/community-scripts/ProxmoxVE/pull/13990))
|
|
||||||
|
|
||||||
## 2026-04-23
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- mealie: start.sh missing after failed update [@MickLesk](https://github.com/MickLesk) ([#13958](https://github.com/community-scripts/ProxmoxVE/pull/13958))
|
|
||||||
- twingate-connector: perform real apt upgrade during update flow [@MickLesk](https://github.com/MickLesk) ([#13959](https://github.com/community-scripts/ProxmoxVE/pull/13959))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: auto-size NODE_OPTIONS heap [@MickLesk](https://github.com/MickLesk) ([#13960](https://github.com/community-scripts/ProxmoxVE/pull/13960))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Update scripts to match standard [@tremor021](https://github.com/tremor021) ([#13956](https://github.com/community-scripts/ProxmoxVE/pull/13956))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- tools.func: upgrade Node.js minor/patch on same major version [@MickLesk](https://github.com/MickLesk) ([#13957](https://github.com/community-scripts/ProxmoxVE/pull/13957))
|
|
||||||
- core: hotfix - prefer silent mode on PHS env conflict [@MickLesk](https://github.com/MickLesk) ([#13951](https://github.com/community-scripts/ProxmoxVE/pull/13951))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- core: improve system update information / lxc stack upgrade [@MickLesk](https://github.com/MickLesk) ([#13970](https://github.com/community-scripts/ProxmoxVE/pull/13970))
|
|
||||||
|
|
||||||
## 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
|
|
||||||
|
|
||||||
### 🆕 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))
|
|
||||||
298
.github/changelogs/2026/05.md
generated
vendored
298
.github/changelogs/2026/05.md
generated
vendored
@@ -1,298 +0,0 @@
|
|||||||
## 2026-05-16
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Homelable: replace passlib with bcrypt for password hashing [@MickLesk](https://github.com/MickLesk) ([#14530](https://github.com/community-scripts/ProxmoxVE/pull/14530))
|
|
||||||
- dashy: fix: restore [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14527](https://github.com/community-scripts/ProxmoxVE/pull/14527))
|
|
||||||
- Update Tinyauth source URL in installation script [@MehrunesSky](https://github.com/MehrunesSky) ([#14483](https://github.com/community-scripts/ProxmoxVE/pull/14483))
|
|
||||||
- Excalidraw: Fix build [@tremor021](https://github.com/tremor021) ([#14509](https://github.com/community-scripts/ProxmoxVE/pull/14509))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Update authentik version to 2026.2.3 [@thieneret](https://github.com/thieneret) ([#14517](https://github.com/community-scripts/ProxmoxVE/pull/14517))
|
|
||||||
|
|
||||||
## 2026-05-15
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- OPNsense: replace undefined msg_warn with inline echo in alloc retry [@MickLesk](https://github.com/MickLesk) ([#14500](https://github.com/community-scripts/ProxmoxVE/pull/14500))
|
|
||||||
- Checkmk: detect OMD version suffix dynamically on update [@MickLesk](https://github.com/MickLesk) ([#14496](https://github.com/community-scripts/ProxmoxVE/pull/14496))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- SearXNG: enable JSON format by default for API integrations [@MickLesk](https://github.com/MickLesk) ([#14498](https://github.com/community-scripts/ProxmoxVE/pull/14498))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Refactor: Ollama use tools.func [@MickLesk](https://github.com/MickLesk) ([#14501](https://github.com/community-scripts/ProxmoxVE/pull/14501))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: fall back to silent mode when no TTY or whiptail unavailable [@MickLesk](https://github.com/MickLesk) ([#14497](https://github.com/community-scripts/ProxmoxVE/pull/14497))
|
|
||||||
|
|
||||||
## 2026-05-14
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- CLIProxyAPI ([#14443](https://github.com/community-scripts/ProxmoxVE/pull/14443))
|
|
||||||
|
|
||||||
## 2026-05-13
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Fix: Broken Manifold update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14468](https://github.com/community-scripts/ProxmoxVE/pull/14468))
|
|
||||||
- SoulSync: Fix update function [@tremor021](https://github.com/tremor021) ([#14465](https://github.com/community-scripts/ProxmoxVE/pull/14465))
|
|
||||||
- Reactive-Resume: fix PDF generation timeout in LXC containers [@MickLesk](https://github.com/MickLesk) ([#14416](https://github.com/community-scripts/ProxmoxVE/pull/14416))
|
|
||||||
- (calibre-web) Add --no-sandbox for PDF conversion [@jamesmyatt](https://github.com/jamesmyatt) ([#14461](https://github.com/community-scripts/ProxmoxVE/pull/14461))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- tools.func: encode GitHub tag, refine pin logic, add Codeberg [@MickLesk](https://github.com/MickLesk) ([#14473](https://github.com/community-scripts/ProxmoxVE/pull/14473))
|
|
||||||
|
|
||||||
## 2026-05-12
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- DocuSeal ([#14445](https://github.com/community-scripts/ProxmoxVE/pull/14445))
|
|
||||||
- Authentik ([#14440](https://github.com/community-scripts/ProxmoxVE/pull/14440))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Save Omada version [@lucacome](https://github.com/lucacome) ([#14433](https://github.com/community-scripts/ProxmoxVE/pull/14433))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- OpenCloud: bump version to 6.2.0 [@vhsdream](https://github.com/vhsdream) ([#14451](https://github.com/community-scripts/ProxmoxVE/pull/14451))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- misc: bump node versions [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14447](https://github.com/community-scripts/ProxmoxVE/pull/14447))
|
|
||||||
|
|
||||||
## 2026-05-11
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Lychee ([#14424](https://github.com/community-scripts/ProxmoxVE/pull/14424))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Termix: fix nginx pid path and log paths on update (#) [@MickLesk](https://github.com/MickLesk) ([#14419](https://github.com/community-scripts/ProxmoxVE/pull/14419))
|
|
||||||
- Nginxproxymanager: restore NPM nginx.conf after OpenResty rebuid [@MickLesk](https://github.com/MickLesk) ([#14421](https://github.com/community-scripts/ProxmoxVE/pull/14421))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- InvestBrain: add commented reverse proxy config hints to .env [@MickLesk](https://github.com/MickLesk) ([#14422](https://github.com/community-scripts/ProxmoxVE/pull/14422))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Cronmaster: fix unexpected EOF in update_cronmaster script [@MickLesk](https://github.com/MickLesk) ([#14420](https://github.com/community-scripts/ProxmoxVE/pull/14420))
|
|
||||||
|
|
||||||
## 2026-05-10
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Save Beszel version [@lucacome](https://github.com/lucacome) ([#14389](https://github.com/community-scripts/ProxmoxVE/pull/14389))
|
|
||||||
- karakeep: Fix SERVER_VERSION update [@MickLesk](https://github.com/MickLesk) ([#14378](https://github.com/community-scripts/ProxmoxVE/pull/14378))
|
|
||||||
- inspIRCd: Fix service not autostarting [@tremor021](https://github.com/tremor021) ([#14368](https://github.com/community-scripts/ProxmoxVE/pull/14368))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- refactor: webcheck [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14391](https://github.com/community-scripts/ProxmoxVE/pull/14391))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- [tools.func]: Pin `pnpm` version [@tremor021](https://github.com/tremor021) ([#14386](https://github.com/community-scripts/ProxmoxVE/pull/14386))
|
|
||||||
|
|
||||||
## 2026-05-09
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- FlowiseAI: Migrate to pnpm [@MickLesk](https://github.com/MickLesk) ([#14344](https://github.com/community-scripts/ProxmoxVE/pull/14344))
|
|
||||||
- Purge openresty [@lucacome](https://github.com/lucacome) ([#14353](https://github.com/community-scripts/ProxmoxVE/pull/14353))
|
|
||||||
- Check for release for Sonarr [@lucacome](https://github.com/lucacome) ([#14354](https://github.com/community-scripts/ProxmoxVE/pull/14354))
|
|
||||||
- fix(termix-install.sh): add tmpfiles.d persistence and systemd PIDFile path [@runnylogan](https://github.com/runnylogan) ([#14350](https://github.com/community-scripts/ProxmoxVE/pull/14350))
|
|
||||||
- ERPNext: start bench Redis services before bench new-site [@MickLesk](https://github.com/MickLesk) ([#14343](https://github.com/community-scripts/ProxmoxVE/pull/14343))
|
|
||||||
- [Hotfix]Jotty: use absolute path when creating data dir [@vhsdream](https://github.com/vhsdream) ([#14355](https://github.com/community-scripts/ProxmoxVE/pull/14355))
|
|
||||||
|
|
||||||
## 2026-05-08
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- wishlist: pin pnpm to v10 to match engine requirements [@MickLesk](https://github.com/MickLesk) ([#14342](https://github.com/community-scripts/ProxmoxVE/pull/14342))
|
|
||||||
- [pelican] fix env copy regression [@LetterN](https://github.com/LetterN) ([#14328](https://github.com/community-scripts/ProxmoxVE/pull/14328))
|
|
||||||
- fix(homepage): fix ERR_PNPM_IGNORED_BUILDS error [@Sergih28](https://github.com/Sergih28) ([#14315](https://github.com/community-scripts/ProxmoxVE/pull/14315))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- tools.func: add setup_nltk as new function [@MickLesk](https://github.com/MickLesk) ([#14314](https://github.com/community-scripts/ProxmoxVE/pull/14314))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- tools.func: fix meilisearch import-dump background process handling [@MickLesk](https://github.com/MickLesk) ([#14341](https://github.com/community-scripts/ProxmoxVE/pull/14341))
|
|
||||||
|
|
||||||
## 2026-05-07
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- termix: create /tmp/nginx before nginx -t [@MickLesk](https://github.com/MickLesk) ([#14312](https://github.com/community-scripts/ProxmoxVE/pull/14312))
|
|
||||||
- The Lounge: Fix service not starting automaticaly [@tremor021](https://github.com/tremor021) ([#14311](https://github.com/community-scripts/ProxmoxVE/pull/14311))
|
|
||||||
- netbird-lxc: fix installation check [@MickLesk](https://github.com/MickLesk) ([#14309](https://github.com/community-scripts/ProxmoxVE/pull/14309))
|
|
||||||
- databasus: Backup and secure configuration file [@MickLesk](https://github.com/MickLesk) ([#14308](https://github.com/community-scripts/ProxmoxVE/pull/14308))
|
|
||||||
- vm: update disk image URL for Ubuntu 25.04 [@MickLesk](https://github.com/MickLesk) ([#14290](https://github.com/community-scripts/ProxmoxVE/pull/14290))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- pangolin: bump version to 1.18.3 [@MickLesk](https://github.com/MickLesk) ([#14297](https://github.com/community-scripts/ProxmoxVE/pull/14297))
|
|
||||||
|
|
||||||
### 🗑️ Deleted Scripts
|
|
||||||
|
|
||||||
- Remove: LiteLLM [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14294](https://github.com/community-scripts/ProxmoxVE/pull/14294))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- update-apps: some improvements [@MickLesk](https://github.com/MickLesk) ([#14275](https://github.com/community-scripts/ProxmoxVE/pull/14275))
|
|
||||||
|
|
||||||
## 2026-05-06
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- Hoodik ([#14279](https://github.com/community-scripts/ProxmoxVE/pull/14279))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Pelican-Panel: create backup subdirectory before copying storage [@MickLesk](https://github.com/MickLesk) ([#14274](https://github.com/community-scripts/ProxmoxVE/pull/14274))
|
|
||||||
- Rustdeskserver: remove redundant else with undefined RELEASE var [@MickLesk](https://github.com/MickLesk) ([#14272](https://github.com/community-scripts/ProxmoxVE/pull/14272))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- AdguardHome-Sync replace ifconfig with hostname -I for IP detection [@MickLesk](https://github.com/MickLesk) ([#14273](https://github.com/community-scripts/ProxmoxVE/pull/14273))
|
|
||||||
|
|
||||||
## 2026-05-05
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- LibreChat ([#14247](https://github.com/community-scripts/ProxmoxVE/pull/14247))
|
|
||||||
- Matomo ([#14248](https://github.com/community-scripts/ProxmoxVE/pull/14248))
|
|
||||||
- Storyteller ([#14122](https://github.com/community-scripts/ProxmoxVE/pull/14122))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- Fix container count message in update-apps.sh [@Quotacious](https://github.com/Quotacious) ([#14265](https://github.com/community-scripts/ProxmoxVE/pull/14265))
|
|
||||||
|
|
||||||
## 2026-05-04
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Databasus: move .env to filesystem root so service starts correctly [@Copilot](https://github.com/Copilot) ([#14252](https://github.com/community-scripts/ProxmoxVE/pull/14252))
|
|
||||||
- Databasus: update mongo-tools fallback to 100.16.1 and use now pnpm instead of npm ci [@MickLesk](https://github.com/MickLesk) ([#14240](https://github.com/community-scripts/ProxmoxVE/pull/14240))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- tools.func get_latest_gh_tag - add pagination to find prefixed tags beyond first 50 [@MickLesk](https://github.com/MickLesk) ([#14241](https://github.com/community-scripts/ProxmoxVE/pull/14241))
|
|
||||||
- tools.func: add GitLab release check/fetch/deploy helpers [@MickLesk](https://github.com/MickLesk) ([#14242](https://github.com/community-scripts/ProxmoxVE/pull/14242))
|
|
||||||
|
|
||||||
## 2026-05-03
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Hortusfox: fix update issues [@tomfrenzel](https://github.com/tomfrenzel) ([#14214](https://github.com/community-scripts/ProxmoxVE/pull/14214))
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- Refactor: PeaNUT for v6 [@MickLesk](https://github.com/MickLesk) ([#14224](https://github.com/community-scripts/ProxmoxVE/pull/14224))
|
|
||||||
- pangolin: pin version, drop manual SQL, use upstream migrator [@MickLesk](https://github.com/MickLesk) ([#14223](https://github.com/community-scripts/ProxmoxVE/pull/14223))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- core: fix validate_bridge function [@MichaelOultram](https://github.com/MichaelOultram) ([#14206](https://github.com/community-scripts/ProxmoxVE/pull/14206))
|
|
||||||
|
|
||||||
### 🧰 Tools
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- pve/pbs scripts: guard sed against missing /etc/apt/sources.list [@MickLesk](https://github.com/MickLesk) ([#14222](https://github.com/community-scripts/ProxmoxVE/pull/14222))
|
|
||||||
|
|
||||||
## 2026-05-02
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- protonmail-bridge ([#14136](https://github.com/community-scripts/ProxmoxVE/pull/14136))
|
|
||||||
- Tube Archivist ([#14123](https://github.com/community-scripts/ProxmoxVE/pull/14123))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Nagios: Ping fix [@tremor021](https://github.com/tremor021) ([#14186](https://github.com/community-scripts/ProxmoxVE/pull/14186))
|
|
||||||
- opnsense-vm: retry pvesm alloc on transient zfs 'got timeout' errors [@MickLesk](https://github.com/MickLesk) ([#14157](https://github.com/community-scripts/ProxmoxVE/pull/14157))
|
|
||||||
- ImmichFrame: fix update by reinstalling dotnet-sdk before publish [@MickLesk](https://github.com/MickLesk) ([#14158](https://github.com/community-scripts/ProxmoxVE/pull/14158))
|
|
||||||
- [FIX]ShelfMark: Use UV sync for shelfmark backend build; update to Python 3.14 [@vhsdream](https://github.com/vhsdream) ([#14170](https://github.com/community-scripts/ProxmoxVE/pull/14170))
|
|
||||||
- alpine: remove deb/ubuntu-only resource & storage checks from update-script [@MickLesk](https://github.com/MickLesk) ([#14166](https://github.com/community-scripts/ProxmoxVE/pull/14166))
|
|
||||||
- Threadfin: use 'threadfin-app' as app name to avoid version-file clash [@MickLesk](https://github.com/MickLesk) ([#14159](https://github.com/community-scripts/ProxmoxVE/pull/14159))
|
|
||||||
|
|
||||||
### 💾 Core
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- core: prompt to also run installed addon update scripts (…/bin/update_*) after update_script [@MickLesk](https://github.com/MickLesk) ([#14162](https://github.com/community-scripts/ProxmoxVE/pull/14162))
|
|
||||||
|
|
||||||
## 2026-05-01
|
|
||||||
|
|
||||||
### 🆕 New Scripts
|
|
||||||
|
|
||||||
- SoulSync ([#14124](https://github.com/community-scripts/ProxmoxVE/pull/14124))
|
|
||||||
- Teable ([#14125](https://github.com/community-scripts/ProxmoxVE/pull/14125))
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- Step ca update [@heinemannj](https://github.com/heinemannj) ([#14058](https://github.com/community-scripts/ProxmoxVE/pull/14058))
|
|
||||||
- paperless-ngx: refresh NLTK data on update [@kurtislanderson](https://github.com/kurtislanderson) ([#14144](https://github.com/community-scripts/ProxmoxVE/pull/14144))
|
|
||||||
- [Pelican Panel] stop deleting the public storage [@LetterN](https://github.com/LetterN) ([#14145](https://github.com/community-scripts/ProxmoxVE/pull/14145))
|
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
|
||||||
|
|
||||||
- Mail-Archiver: update dependencies [@tremor021](https://github.com/tremor021) ([#14152](https://github.com/community-scripts/ProxmoxVE/pull/14152))
|
|
||||||
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.
|
||||||
|
|||||||
2
.github/workflows/close-tteck-issues.yaml
generated
vendored
2
.github/workflows/close-tteck-issues.yaml
generated
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
const message = `Hello, it looks like you are referencing the **old tteck repo**.
|
const message = `Hello, it looks like you are referencing the **old tteck repo**.
|
||||||
|
|
||||||
This repository is no longer used for active scripts.
|
This repository is no longer used for active scripts.
|
||||||
**Please update your bookmarks** and use: [https://community-scripts.com](https://community-scripts.com)
|
**Please update your bookmarks** and use: [https://helper-scripts.com](https://helper-scripts.com)
|
||||||
|
|
||||||
Also make sure your Bash command starts with:
|
Also make sure your Bash command starts with:
|
||||||
\`\`\`bash
|
\`\`\`bash
|
||||||
|
|||||||
16
.github/workflows/close_issue_in_dev.yaml
generated
vendored
16
.github/workflows/close_issue_in_dev.yaml
generated
vendored
@@ -113,8 +113,7 @@ jobs:
|
|||||||
const http = require('http');
|
const http = require('http');
|
||||||
const url = require('url');
|
const url = require('url');
|
||||||
|
|
||||||
function request(fullUrl, opts, redirectsLeft) {
|
function request(fullUrl, opts) {
|
||||||
if (redirectsLeft === undefined) redirectsLeft = 5;
|
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
const u = url.parse(fullUrl);
|
const u = url.parse(fullUrl);
|
||||||
const isHttps = u.protocol === 'https:';
|
const isHttps = u.protocol === 'https:';
|
||||||
@@ -129,19 +128,6 @@ jobs:
|
|||||||
if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
|
if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
|
||||||
const lib = isHttps ? https : http;
|
const lib = isHttps ? https : http;
|
||||||
const req = lib.request(options, function(res) {
|
const req = lib.request(options, function(res) {
|
||||||
// Follow redirects (301/302/307/308)
|
|
||||||
if ([301, 302, 307, 308].indexOf(res.statusCode) !== -1 && res.headers.location && redirectsLeft > 0) {
|
|
||||||
res.resume();
|
|
||||||
const nextUrl = url.resolve(fullUrl, res.headers.location);
|
|
||||||
// For 301/302, browsers historically downgrade to GET; preserve method for 307/308.
|
|
||||||
const nextOpts = Object.assign({}, opts);
|
|
||||||
if (res.statusCode === 301 || res.statusCode === 302) {
|
|
||||||
nextOpts.method = 'GET';
|
|
||||||
delete nextOpts.body;
|
|
||||||
}
|
|
||||||
resolve(request(nextUrl, nextOpts, redirectsLeft - 1));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let data = '';
|
let data = '';
|
||||||
res.on('data', function(chunk) { data += chunk; });
|
res.on('data', function(chunk) { data += chunk; });
|
||||||
res.on('end', function() {
|
res.on('end', function() {
|
||||||
|
|||||||
568
.github/workflows/pocketbase-bot.yml
generated
vendored
568
.github/workflows/pocketbase-bot.yml
generated
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
issues: write
|
issues: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
contents: write
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pocketbase-bot:
|
pocketbase-bot:
|
||||||
@@ -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 () {
|
||||||
@@ -95,149 +93,6 @@ jobs:
|
|||||||
return request('https://api.github.com' + path, { method: method || 'GET', headers, body: bodyStr });
|
return request('https://api.github.com' + path, { method: method || 'GET', headers, body: bodyStr });
|
||||||
}
|
}
|
||||||
|
|
||||||
function encodeContentPath(filePath) {
|
|
||||||
return filePath.split('/').map(encodeURIComponent).join('/');
|
|
||||||
}
|
|
||||||
|
|
||||||
function decodeGitHubContent(content) {
|
|
||||||
return Buffer.from((content || '').replace(/\n/g, ''), 'base64').toString('utf8');
|
|
||||||
}
|
|
||||||
|
|
||||||
function sanitizeBranchPart(value) {
|
|
||||||
return (value || '')
|
|
||||||
.toLowerCase()
|
|
||||||
.replace(/[^a-z0-9._/-]+/g, '-')
|
|
||||||
.replace(/\/+/g, '/')
|
|
||||||
.replace(/^-+|-+$/g, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function applyCtDefaultChanges(scriptText, varChanges) {
|
|
||||||
let nextText = scriptText;
|
|
||||||
const updatedVars = [];
|
|
||||||
const unchangedVars = [];
|
|
||||||
for (const [varName, rawValue] of Object.entries(varChanges)) {
|
|
||||||
const newValue = String(rawValue);
|
|
||||||
const pattern = new RegExp('(^\\s*' + varName + '="\\$\\{' + varName + ':-)([^"}]*)(\\}"\\s*$)', 'm');
|
|
||||||
const match = nextText.match(pattern);
|
|
||||||
if (!match) continue;
|
|
||||||
if (match[2] === newValue) {
|
|
||||||
unchangedVars.push(varName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
nextText = nextText.replace(pattern, '$1' + newValue + '$3');
|
|
||||||
updatedVars.push(varName);
|
|
||||||
}
|
|
||||||
return { nextText, updatedVars, unchangedVars };
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureBranch(defaultBranch, branchName) {
|
|
||||||
const branchRefRes = await ghRequest('/repos/' + owner + '/' + repo + '/git/ref/heads/' + encodeURIComponent(branchName));
|
|
||||||
if (branchRefRes.ok) return;
|
|
||||||
|
|
||||||
const defaultRefRes = await ghRequest('/repos/' + owner + '/' + repo + '/git/ref/heads/' + encodeURIComponent(defaultBranch));
|
|
||||||
if (!defaultRefRes.ok) {
|
|
||||||
throw new Error('Could not read default branch ref: ' + defaultRefRes.body);
|
|
||||||
}
|
|
||||||
const defaultRef = JSON.parse(defaultRefRes.body);
|
|
||||||
const createBranchRes = await ghRequest('/repos/' + owner + '/' + repo + '/git/refs', 'POST', {
|
|
||||||
ref: 'refs/heads/' + branchName,
|
|
||||||
sha: defaultRef.object.sha
|
|
||||||
});
|
|
||||||
if (!createBranchRes.ok) {
|
|
||||||
throw new Error('Could not create branch: ' + createBranchRes.body);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function upsertCtDefaultsPr(slugValue, varChanges) {
|
|
||||||
const wantedEntries = Object.entries(varChanges || {}).filter(function ([, v]) {
|
|
||||||
return v !== undefined && v !== null && String(v) !== '';
|
|
||||||
});
|
|
||||||
if (wantedEntries.length === 0) {
|
|
||||||
return { status: 'skipped', reason: 'No mapped CT defaults changed.' };
|
|
||||||
}
|
|
||||||
|
|
||||||
const repoRes = await ghRequest('/repos/' + owner + '/' + repo);
|
|
||||||
if (!repoRes.ok) {
|
|
||||||
throw new Error('Could not read repository metadata: ' + repoRes.body);
|
|
||||||
}
|
|
||||||
const repoInfo = JSON.parse(repoRes.body);
|
|
||||||
const defaultBranch = repoInfo.default_branch;
|
|
||||||
|
|
||||||
const ctPath = 'ct/' + slugValue + '.sh';
|
|
||||||
const encodedCtPath = encodeContentPath(ctPath);
|
|
||||||
const defaultFileRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath + '?ref=' + encodeURIComponent(defaultBranch));
|
|
||||||
if (defaultFileRes.statusCode === 404) {
|
|
||||||
return { status: 'skipped', reason: 'No matching CT file found at `' + ctPath + '`.' };
|
|
||||||
}
|
|
||||||
if (!defaultFileRes.ok) {
|
|
||||||
throw new Error('Could not read CT file from default branch: ' + defaultFileRes.body);
|
|
||||||
}
|
|
||||||
|
|
||||||
const branchName = 'pocketbase-sync/' + sanitizeBranchPart(slugValue || 'unknown');
|
|
||||||
await ensureBranch(defaultBranch, branchName);
|
|
||||||
|
|
||||||
const branchFileRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath + '?ref=' + encodeURIComponent(branchName));
|
|
||||||
if (!branchFileRes.ok) {
|
|
||||||
throw new Error('Could not read CT file from sync branch: ' + branchFileRes.body);
|
|
||||||
}
|
|
||||||
const branchFile = JSON.parse(branchFileRes.body);
|
|
||||||
const currentBranchText = decodeGitHubContent(branchFile.content);
|
|
||||||
|
|
||||||
const updateResult = applyCtDefaultChanges(currentBranchText, Object.fromEntries(wantedEntries));
|
|
||||||
if (updateResult.updatedVars.length === 0) {
|
|
||||||
return { status: 'skipped', reason: 'CT defaults already up to date.', unchangedVars: updateResult.unchangedVars };
|
|
||||||
}
|
|
||||||
|
|
||||||
const commitMessage = 'chore(ct): sync ' + slugValue + ' defaults from PocketBase';
|
|
||||||
const putRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath, 'PUT', {
|
|
||||||
message: commitMessage,
|
|
||||||
content: Buffer.from(updateResult.nextText, 'utf8').toString('base64'),
|
|
||||||
sha: branchFile.sha,
|
|
||||||
branch: branchName
|
|
||||||
});
|
|
||||||
if (!putRes.ok) {
|
|
||||||
throw new Error('Could not update CT file: ' + putRes.body);
|
|
||||||
}
|
|
||||||
|
|
||||||
const openPrRes = await ghRequest(
|
|
||||||
'/repos/' + owner + '/' + repo + '/pulls?state=open&head=' + encodeURIComponent(owner + ':' + branchName) + '&base=' + encodeURIComponent(defaultBranch)
|
|
||||||
);
|
|
||||||
if (!openPrRes.ok) {
|
|
||||||
throw new Error('Could not query existing PRs: ' + openPrRes.body);
|
|
||||||
}
|
|
||||||
const openPrs = JSON.parse(openPrRes.body);
|
|
||||||
if (openPrs.length > 0) {
|
|
||||||
return { status: 'updated', prUrl: openPrs[0].html_url, updatedVars: updateResult.updatedVars };
|
|
||||||
}
|
|
||||||
|
|
||||||
const prTitle = 'chore(ct): sync ' + slugValue + ' defaults with PocketBase';
|
|
||||||
const prBody =
|
|
||||||
'## Summary\n' +
|
|
||||||
'- Sync default CT variables for `' + slugValue + '` after `/pocketbase` update.\n' +
|
|
||||||
'- Updated vars: `' + updateResult.updatedVars.join('`, `') + '`.\n\n' +
|
|
||||||
'## Source\n' +
|
|
||||||
'- Triggered by @' + actor + ' via PocketBase bot.\n';
|
|
||||||
const createPrRes = await ghRequest('/repos/' + owner + '/' + repo + '/pulls', 'POST', {
|
|
||||||
title: prTitle,
|
|
||||||
body: prBody,
|
|
||||||
head: branchName,
|
|
||||||
base: defaultBranch
|
|
||||||
});
|
|
||||||
if (!createPrRes.ok) {
|
|
||||||
throw new Error('Could not create PR: ' + createPrRes.body);
|
|
||||||
}
|
|
||||||
const pr = JSON.parse(createPrRes.body);
|
|
||||||
return { status: 'created', prUrl: pr.html_url, updatedVars: updateResult.updatedVars };
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatCtSyncResult(syncResult) {
|
|
||||||
if (!syncResult) return '';
|
|
||||||
if (syncResult.status === 'created') return '\n\n**CT sync PR:** ' + syncResult.prUrl;
|
|
||||||
if (syncResult.status === 'updated') return '\n\n**CT sync PR updated:** ' + syncResult.prUrl;
|
|
||||||
if (syncResult.status === 'skipped') return '\n\n**CT sync skipped:** ' + syncResult.reason;
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
async function addReaction(content) {
|
async function addReaction(content) {
|
||||||
try {
|
try {
|
||||||
await ghRequest(
|
await ghRequest(
|
||||||
@@ -258,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');
|
||||||
@@ -272,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;
|
||||||
@@ -284,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' +
|
||||||
@@ -301,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` ' +
|
||||||
@@ -332,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;
|
||||||
@@ -352,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', {
|
||||||
@@ -370,42 +228,26 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Shared helpers ─────────────────────────────────────────────────
|
// ── Route: dispatch to subcommand handler ──────────────────────────
|
||||||
|
const noteMatch = rest.match(/^note\s+(list|add|edit|remove)\b/i);
|
||||||
|
const methodMatch = rest.match(/^method\b/i);
|
||||||
|
const setMatch = rest.match(/^set\s+(\S+)/i);
|
||||||
|
|
||||||
// Key=value parser: handles unquoted and "quoted" values
|
if (noteMatch) {
|
||||||
function parseKVPairs(str) {
|
// ── NOTE SUBCOMMAND (reads/writes notes_json on script record) ────
|
||||||
const fields = {};
|
const noteAction = noteMatch[1].toLowerCase();
|
||||||
let pos = 0;
|
const noteArgsStr = rest.substring(noteMatch[0].length).trim();
|
||||||
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"
|
// Parse notes_json from the already-fetched script record
|
||||||
function parseTokens(str) {
|
// 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 = [];
|
const tokens = [];
|
||||||
let pos = 0;
|
let pos = 0;
|
||||||
while (pos < str.length) {
|
while (pos < str.length) {
|
||||||
@@ -429,27 +271,6 @@ jobs:
|
|||||||
return tokens;
|
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) {
|
function formatNotesList(arr) {
|
||||||
if (arr.length === 0) return '*None*';
|
if (arr.length === 0) return '*None*';
|
||||||
return arr.map(function (n, i) {
|
return arr.map(function (n, i) {
|
||||||
@@ -457,85 +278,15 @@ jobs:
|
|||||||
}).join('\n');
|
}).join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format install methods list for display
|
async function patchNotesJson(arr) {
|
||||||
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 ──────────────────────────
|
|
||||||
const infoMatch = rest.match(/^info$/i);
|
|
||||||
const noteMatch = rest.match(/^note\s+(list|add|edit|remove)\b/i);
|
|
||||||
const methodMatch = rest.match(/^method\b/i);
|
|
||||||
const setMatch = rest.match(/^set\s+(\S+)/i);
|
|
||||||
|
|
||||||
if (infoMatch) {
|
|
||||||
// ── INFO SUBCOMMAND ──────────────────────────────────────────────
|
|
||||||
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 noteArgsStr = rest.substring(noteMatch[0].length).trim();
|
|
||||||
let notesArr = readJsonBlob(record.notes);
|
|
||||||
|
|
||||||
async function patchNotes(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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -548,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(
|
||||||
@@ -560,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' +
|
||||||
@@ -571,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(
|
||||||
@@ -596,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' +
|
||||||
@@ -608,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(
|
||||||
@@ -632,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' +
|
||||||
@@ -644,37 +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 RESOURCE_TO_CT_VAR = { cpu: 'var_cpu', ram: 'var_ram', hdd: 'var_disk', os: 'var_os', version: 'var_version' };
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -685,144 +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) {
|
||||||
|
|
||||||
if (addMatch) {
|
|
||||||
// ── METHOD ADD ───────────────────────────────────────────────
|
|
||||||
const newType = addMatch[1];
|
|
||||||
const parsed = addMatch[2] ? parseKVPairs(addMatch[2]) : {};
|
|
||||||
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 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);
|
|
||||||
const addCtChanges = {};
|
|
||||||
for (const [k, v] of Object.entries(parsed)) {
|
|
||||||
if (RESOURCE_TO_CT_VAR[k]) addCtChanges[RESOURCE_TO_CT_VAR[k]] = v;
|
|
||||||
}
|
|
||||||
let addCtSync = null;
|
|
||||||
try {
|
|
||||||
addCtSync = await upsertCtDefaultsPr(slug, addCtChanges);
|
|
||||||
} catch (e) {
|
|
||||||
addCtSync = { status: 'skipped', reason: 'CT sync failed: ' + e.message };
|
|
||||||
}
|
|
||||||
await addReaction('+1');
|
|
||||||
await postComment(
|
|
||||||
'✅ **PocketBase Bot**: Added install method **`' + newType + '`** to **`' + slug + '`**\n\n' +
|
|
||||||
formatMethodsList([newMethod]) + '\n\n' +
|
|
||||||
formatCtSyncResult(addCtSync) + '\n\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 addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'❌ **PocketBase Bot**: Invalid `method` syntax.\n\n' +
|
'❌ **PocketBase Bot**: Invalid `method` syntax.\n\n' +
|
||||||
'**Usage:**\n```\n/pocketbase ' + slug + ' method list\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```'
|
||||||
'/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);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
const targetType = editParts[1].toLowerCase();
|
const targetType = methodParts[1].toLowerCase();
|
||||||
const parsed = parseKVPairs(editParts[2]);
|
const resourcesStr = methodParts[2];
|
||||||
|
|
||||||
const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; });
|
// Parse resource fields (only cpu/ram/hdd allowed)
|
||||||
if (unknown.length > 0) {
|
const RESOURCE_FIELDS = { cpu: true, ram: true, hdd: true };
|
||||||
await addReaction('-1');
|
const resourceChanges = {};
|
||||||
await postComment('❌ **PocketBase Bot**: Unknown method field(s): `' + unknown.join('`, `') + '`\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
const rePairs = /([a-z]+)=(\d+)/gi;
|
||||||
process.exit(0);
|
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(parsed).length === 0) {
|
if (Object.keys(resourceChanges).length === 0) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment('❌ **PocketBase Bot**: No valid `key=value` pairs found.\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
await postComment('❌ **PocketBase Bot**: No valid resource fields found. Use `cpu=N`, `ram=N`, `hdd=N`.');
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const idx = methodsArr.findIndex(function (im) { return (im.type || '').toLowerCase() === targetType; });
|
// Find matching method by type name (case-insensitive)
|
||||||
|
const idx = methodsArr.findIndex(function (im) {
|
||||||
|
return (im.type || '').toLowerCase() === targetType;
|
||||||
|
});
|
||||||
if (idx === -1) {
|
if (idx === -1) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
const available = methodsArr.map(function (im) { return im.type || '?'; });
|
const availableTypes = methodsArr.map(function (im) { return im.type || '?'; });
|
||||||
await postComment(
|
await postComment(
|
||||||
'❌ **PocketBase Bot**: No install method `' + targetType + '` found for `' + slug + '`.\n\n' +
|
'❌ **PocketBase Bot**: No install method with type `' + targetType + '` found for `' + slug + '`.\n\n' +
|
||||||
'**Available:** `' + (available.length ? available.join('`, `') : '(none)') + '`\n\n' +
|
'**Available types:** `' + (availableTypes.length ? availableTypes.join('`, `') : '(none)') + '`\n\n' +
|
||||||
'Use `/pocketbase ' + slug + ' method list` to see all methods.'
|
'Use `/pocketbase ' + slug + ' method list` to see all methods.'
|
||||||
);
|
);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyMethodChanges(methodsArr[idx], parsed);
|
if (!methodsArr[idx].resources) methodsArr[idx].resources = {};
|
||||||
await patchMethods(methodsArr);
|
if (resourceChanges.cpu != null) methodsArr[idx].resources.cpu = resourceChanges.cpu;
|
||||||
await revalidate(slug);
|
if (resourceChanges.ram != null) methodsArr[idx].resources.ram = resourceChanges.ram;
|
||||||
const editCtChanges = {};
|
if (resourceChanges.hdd != null) methodsArr[idx].resources.hdd = resourceChanges.hdd;
|
||||||
for (const [k, v] of Object.entries(parsed)) {
|
|
||||||
if (RESOURCE_TO_CT_VAR[k]) editCtChanges[RESOURCE_TO_CT_VAR[k]] = v;
|
|
||||||
}
|
|
||||||
let editCtSync = null;
|
|
||||||
try {
|
|
||||||
editCtSync = await upsertCtDefaultsPr(slug, editCtChanges);
|
|
||||||
} catch (e) {
|
|
||||||
editCtSync = { status: 'skipped', reason: 'CT sync failed: ' + e.message };
|
|
||||||
}
|
|
||||||
|
|
||||||
const changesLines = Object.entries(parsed)
|
await patchInstallMethodsJson(methodsArr);
|
||||||
.map(function ([k, v]) {
|
|
||||||
const unit = k === 'ram' ? ' MB' : k === 'hdd' ? ' GB' : '';
|
const changesLines = Object.entries(resourceChanges)
|
||||||
return '- `' + k + '` → `' + v + unit + '`';
|
.map(function ([k, v]) { return '- `' + k + '` → `' + v + (k === 'ram' ? ' MB' : k === 'hdd' ? ' GB' : '') + '`'; })
|
||||||
}).join('\n');
|
.join('\n');
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
|
||||||
'**Changes applied:**\n' + changesLines + '\n\n' +
|
'**Changes applied:**\n' + changesLines + '\n\n' +
|
||||||
formatCtSyncResult(editCtSync) + '\n\n' +
|
|
||||||
'*Executed by @' + actor + '*'
|
'*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',
|
||||||
@@ -858,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(
|
||||||
@@ -869,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',
|
||||||
@@ -878,11 +555,9 @@ jobs:
|
|||||||
project_url: 'string',
|
project_url: 'string',
|
||||||
github: 'string',
|
github: 'string',
|
||||||
config_path: 'string',
|
config_path: 'string',
|
||||||
tags: 'string',
|
|
||||||
port: 'number',
|
port: 'number',
|
||||||
default_user: 'nullable_string',
|
default_user: 'nullable_string',
|
||||||
default_passwd: 'nullable_string',
|
default_passwd: 'nullable_string',
|
||||||
unprivileged: 'number',
|
|
||||||
updateable: 'boolean',
|
updateable: 'boolean',
|
||||||
privileged: 'boolean',
|
privileged: 'boolean',
|
||||||
has_arm: 'boolean',
|
has_arm: 'boolean',
|
||||||
@@ -893,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) {
|
||||||
@@ -948,18 +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);
|
|
||||||
const FIELD_TO_CT_VAR = { tags: 'var_tags', unprivileged: 'var_unprivileged' };
|
|
||||||
const fieldCtChanges = {};
|
|
||||||
for (const [k, v] of Object.entries(payload)) {
|
|
||||||
if (FIELD_TO_CT_VAR[k]) fieldCtChanges[FIELD_TO_CT_VAR[k]] = v;
|
|
||||||
}
|
|
||||||
let fieldCtSync = null;
|
|
||||||
try {
|
|
||||||
fieldCtSync = await upsertCtDefaultsPr(slug, fieldCtChanges);
|
|
||||||
} catch (e) {
|
|
||||||
fieldCtSync = { status: 'skipped', reason: 'CT sync failed: ' + e.message };
|
|
||||||
}
|
|
||||||
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) + '`'; })
|
||||||
@@ -967,7 +662,6 @@ jobs:
|
|||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Updated **`' + slug + '`** successfully!\n\n' +
|
'✅ **PocketBase Bot**: Updated **`' + slug + '`** successfully!\n\n' +
|
||||||
'**Changes applied:**\n' + changesLines + '\n\n' +
|
'**Changes applied:**\n' + changesLines + '\n\n' +
|
||||||
formatCtSyncResult(fieldCtSync) + '\n\n' +
|
|
||||||
'*Executed by @' + actor + '*'
|
'*Executed by @' + actor + '*'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
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
1197
CHANGELOG.md
1197
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
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.
|
|
||||||
398
README.md
398
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://helper-scripts.com">
|
||||||
<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>
|
||||||
|
|||||||
17
ct/2fauth.sh
17
ct/2fauth.sh
@@ -24,7 +24,7 @@ function update_script() {
|
|||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
if [[ ! -d /opt/2fauth ]]; then
|
if [[ ! -d "/opt/2fauth" ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
@@ -34,8 +34,7 @@ function update_script() {
|
|||||||
$STD apt -y upgrade
|
$STD apt -y upgrade
|
||||||
|
|
||||||
msg_info "Creating Backup"
|
msg_info "Creating Backup"
|
||||||
rm -rf /opt/2fauth-backup
|
mv "/opt/2fauth" "/opt/2fauth-backup"
|
||||||
mv /opt/2fauth /opt/2fauth-backup
|
|
||||||
if ! dpkg -l | grep -q 'php8.4'; then
|
if ! dpkg -l | grep -q 'php8.4'; then
|
||||||
cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak
|
cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak
|
||||||
fi
|
fi
|
||||||
@@ -47,17 +46,15 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" "tarball"
|
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" "tarball"
|
||||||
setup_composer
|
setup_composer
|
||||||
cp /opt/2fauth-backup/.env /opt/2fauth/.env
|
mv "/opt/2fauth-backup/.env" "/opt/2fauth/.env"
|
||||||
cp -r /opt/2fauth-backup/storage /opt/2fauth/storage
|
mv "/opt/2fauth-backup/storage" "/opt/2fauth/storage"
|
||||||
cd /opt/2fauth || return
|
cd "/opt/2fauth" || return
|
||||||
|
chown -R www-data: "/opt/2fauth"
|
||||||
|
chmod -R 755 "/opt/2fauth"
|
||||||
export COMPOSER_ALLOW_SUPERUSER=1
|
export COMPOSER_ALLOW_SUPERUSER=1
|
||||||
$STD composer install --no-dev --prefer-dist
|
$STD composer install --no-dev --prefer-dist
|
||||||
php artisan 2fauth:install
|
php artisan 2fauth:install
|
||||||
chown -R www-data: /opt/2fauth
|
|
||||||
chmod -R 755 /opt/2fauth
|
|
||||||
$STD systemctl restart php8.4-fpm
|
|
||||||
$STD systemctl restart nginx
|
$STD systemctl restart nginx
|
||||||
rm -rf /opt/2fauth-backup
|
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -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,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: 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
|
|
||||||
|
|
||||||
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}"
|
|
||||||
@@ -35,8 +35,6 @@ function update_script() {
|
|||||||
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
read -r -p "${TAB}Migrate update function now? [y/N]: " CONFIRM
|
||||||
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
if [[ ! "${CONFIRM,,}" =~ ^(y|yes)$ ]]; then
|
||||||
msg_warn "Migration skipped. The old update will continue to work for now."
|
msg_warn "Migration skipped. The old update will continue to work for now."
|
||||||
msg_warn "⚠️ Komodo v2 uses :2 image tags. The :latest tag is deprecated and will not receive v2 updates."
|
|
||||||
msg_warn "Please migrate to the addon script to receive Komodo v2."
|
|
||||||
msg_info "Updating ${APP} (legacy)"
|
msg_info "Updating ${APP} (legacy)"
|
||||||
COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
|
||||||
if [[ -z "$COMPOSE_FILE" ]]; then
|
if [[ -z "$COMPOSE_FILE" ]]; then
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ catch_errors
|
|||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
if [[ ! -d /etc/ntfy ]]; then
|
if [[ ! -d /etc/ntfy ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ catch_errors
|
|||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
if [[ ! -d /opt/redlib ]]; then
|
if [[ ! -d /opt/redlib ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ catch_errors
|
|||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
if ! apk info -e rustypaste >/dev/null 2>&1; then
|
if ! apk info -e rustypaste >/dev/null 2>&1; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: Slaviša Arežina (tremor021) | Co-Author: Stavros (steveiliop56)
|
# Author: Slaviša Arežina (tremor021) | Co-Author: Stavros (steveiliop56)
|
||||||
# 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/tinyauthapp/tinyauth
|
# Source: https://github.com/steveiliop56/tinyauth
|
||||||
|
|
||||||
APP="Alpine-Tinyauth"
|
APP="Alpine-Tinyauth"
|
||||||
var_tags="${var_tags:-alpine;auth}"
|
var_tags="${var_tags:-alpine;auth}"
|
||||||
@@ -29,7 +29,7 @@ function update_script() {
|
|||||||
$STD apk -U upgrade
|
$STD apk -U upgrade
|
||||||
msg_ok "Updated packages"
|
msg_ok "Updated packages"
|
||||||
|
|
||||||
RELEASE=$(curl -s https://api.github.com/repos/tinyauthapp/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -s https://api.github.com/repos/steveiliop56/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
if [ "${RELEASE}" != "$(cat ~/.tinyauth 2>/dev/null)" ] || [ ! -f ~/.tinyauth ]; then
|
if [ "${RELEASE}" != "$(cat ~/.tinyauth 2>/dev/null)" ] || [ ! -f ~/.tinyauth ]; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
$STD service tinyauth stop
|
$STD service tinyauth stop
|
||||||
@@ -51,7 +51,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating Tinyauth"
|
msg_info "Updating Tinyauth"
|
||||||
rm -f /opt/tinyauth/tinyauth
|
rm -f /opt/tinyauth/tinyauth
|
||||||
curl -fsSL "https://github.com/tinyauthapp/tinyauth/releases/download/v${RELEASE}/tinyauth-amd64" -o /opt/tinyauth/tinyauth
|
curl -fsSL "https://github.com/steveiliop56/tinyauth/releases/download/v${RELEASE}/tinyauth-amd64" -o /opt/tinyauth/tinyauth
|
||||||
chmod +x /opt/tinyauth/tinyauth
|
chmod +x /opt/tinyauth/tinyauth
|
||||||
echo "${RELEASE}" >~/.tinyauth
|
echo "${RELEASE}" >~/.tinyauth
|
||||||
msg_ok "Updated Tinyauth"
|
msg_ok "Updated Tinyauth"
|
||||||
|
|||||||
@@ -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}"
|
|
||||||
@@ -89,7 +89,7 @@ function update_script() {
|
|||||||
# Auth JDBC follows server version
|
# Auth JDBC follows server version
|
||||||
msg_info "Updating Guacamole Auth JDBC"
|
msg_info "Updating Guacamole Auth JDBC"
|
||||||
rm -f /etc/guacamole/extensions/guacamole-auth-jdbc-mysql-*.jar
|
rm -f /etc/guacamole/extensions/guacamole-auth-jdbc-mysql-*.jar
|
||||||
curl_download "/tmp/guacamole-auth-jdbc.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-jdbc-${LATEST_SERVER}.tar.gz"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-jdbc-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-jdbc.tar.gz"
|
||||||
$STD tar -xf /tmp/guacamole-auth-jdbc.tar.gz -C /tmp
|
$STD tar -xf /tmp/guacamole-auth-jdbc.tar.gz -C /tmp
|
||||||
mv /tmp/guacamole-auth-jdbc-"${LATEST_SERVER}"/mysql/guacamole-auth-jdbc-mysql-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
mv /tmp/guacamole-auth-jdbc-"${LATEST_SERVER}"/mysql/guacamole-auth-jdbc-mysql-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
||||||
echo "${LATEST_SERVER}" >~/.guacamole_auth_jdbc
|
echo "${LATEST_SERVER}" >~/.guacamole_auth_jdbc
|
||||||
@@ -101,7 +101,7 @@ function update_script() {
|
|||||||
# Update Guacamole Client
|
# Update Guacamole Client
|
||||||
if [[ "$CURRENT_CLIENT" != "$LATEST_CLIENT" ]]; then
|
if [[ "$CURRENT_CLIENT" != "$LATEST_CLIENT" ]]; then
|
||||||
msg_info "Updating Guacamole Client (${CURRENT_CLIENT} → ${LATEST_CLIENT})"
|
msg_info "Updating Guacamole Client (${CURRENT_CLIENT} → ${LATEST_CLIENT})"
|
||||||
curl_download "/opt/apache-guacamole/tomcat9/webapps/guacamole.war" "https://downloads.apache.org/guacamole/${LATEST_CLIENT}/binary/guacamole-${LATEST_CLIENT}.war"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_CLIENT}/binary/guacamole-${LATEST_CLIENT}.war" -o "/opt/apache-guacamole/tomcat9/webapps/guacamole.war"
|
||||||
echo "${LATEST_CLIENT}" >~/.guacamole_client
|
echo "${LATEST_CLIENT}" >~/.guacamole_client
|
||||||
msg_ok "Updated Guacamole Client"
|
msg_ok "Updated Guacamole Client"
|
||||||
else
|
else
|
||||||
@@ -111,7 +111,7 @@ function update_script() {
|
|||||||
# Update MySQL Connector
|
# Update MySQL Connector
|
||||||
if [[ "$CURRENT_MYSQL_CONNECTOR" != "$LATEST_MYSQL_CONNECTOR" ]]; then
|
if [[ "$CURRENT_MYSQL_CONNECTOR" != "$LATEST_MYSQL_CONNECTOR" ]]; then
|
||||||
msg_info "Updating MySQL Connector (${CURRENT_MYSQL_CONNECTOR} → ${LATEST_MYSQL_CONNECTOR})"
|
msg_info "Updating MySQL Connector (${CURRENT_MYSQL_CONNECTOR} → ${LATEST_MYSQL_CONNECTOR})"
|
||||||
curl_download "/etc/guacamole/lib/mysql-connector-j.jar" "https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/${LATEST_MYSQL_CONNECTOR}/mysql-connector-j-${LATEST_MYSQL_CONNECTOR}.jar"
|
curl -fsSL "https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/${LATEST_MYSQL_CONNECTOR}/mysql-connector-j-${LATEST_MYSQL_CONNECTOR}.jar" -o "/etc/guacamole/lib/mysql-connector-j.jar"
|
||||||
echo "${LATEST_MYSQL_CONNECTOR}" >~/.guacamole_mysql_connector
|
echo "${LATEST_MYSQL_CONNECTOR}" >~/.guacamole_mysql_connector
|
||||||
msg_ok "Updated MySQL Connector"
|
msg_ok "Updated MySQL Connector"
|
||||||
else
|
else
|
||||||
@@ -148,7 +148,7 @@ function update_script() {
|
|||||||
if [[ -f /etc/guacamole/extensions/guacamole-auth-totp-*.jar ]]; then
|
if [[ -f /etc/guacamole/extensions/guacamole-auth-totp-*.jar ]]; then
|
||||||
msg_info "Updating TOTP Extension"
|
msg_info "Updating TOTP Extension"
|
||||||
rm -f /etc/guacamole/extensions/guacamole-auth-totp-*.jar
|
rm -f /etc/guacamole/extensions/guacamole-auth-totp-*.jar
|
||||||
curl_download "/tmp/guacamole-auth-totp.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-totp-${LATEST_SERVER}.tar.gz"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-totp-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-totp.tar.gz"
|
||||||
$STD tar -xf /tmp/guacamole-auth-totp.tar.gz -C /tmp
|
$STD tar -xf /tmp/guacamole-auth-totp.tar.gz -C /tmp
|
||||||
mv /tmp/guacamole-auth-totp-"${LATEST_SERVER}"/guacamole-auth-totp-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
mv /tmp/guacamole-auth-totp-"${LATEST_SERVER}"/guacamole-auth-totp-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
||||||
chmod 664 /etc/guacamole/extensions/guacamole-auth-totp-"${LATEST_SERVER}".jar
|
chmod 664 /etc/guacamole/extensions/guacamole-auth-totp-"${LATEST_SERVER}".jar
|
||||||
@@ -160,7 +160,7 @@ function update_script() {
|
|||||||
if [[ -f /etc/guacamole/extensions/guacamole-auth-duo-*.jar ]]; then
|
if [[ -f /etc/guacamole/extensions/guacamole-auth-duo-*.jar ]]; then
|
||||||
msg_info "Updating DUO Extension"
|
msg_info "Updating DUO Extension"
|
||||||
rm -f /etc/guacamole/extensions/guacamole-auth-duo-*.jar
|
rm -f /etc/guacamole/extensions/guacamole-auth-duo-*.jar
|
||||||
curl_download "/tmp/guacamole-auth-duo.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-duo-${LATEST_SERVER}.tar.gz"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-duo-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-duo.tar.gz"
|
||||||
$STD tar -xf /tmp/guacamole-auth-duo.tar.gz -C /tmp
|
$STD tar -xf /tmp/guacamole-auth-duo.tar.gz -C /tmp
|
||||||
mv /tmp/guacamole-auth-duo-"${LATEST_SERVER}"/guacamole-auth-duo-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
mv /tmp/guacamole-auth-duo-"${LATEST_SERVER}"/guacamole-auth-duo-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
||||||
chmod 664 /etc/guacamole/extensions/guacamole-auth-duo-"${LATEST_SERVER}".jar
|
chmod 664 /etc/guacamole/extensions/guacamole-auth-duo-"${LATEST_SERVER}".jar
|
||||||
@@ -172,7 +172,7 @@ function update_script() {
|
|||||||
if [[ -f /etc/guacamole/extensions/guacamole-auth-ldap-*.jar ]]; then
|
if [[ -f /etc/guacamole/extensions/guacamole-auth-ldap-*.jar ]]; then
|
||||||
msg_info "Updating LDAP Extension"
|
msg_info "Updating LDAP Extension"
|
||||||
rm -f /etc/guacamole/extensions/guacamole-auth-ldap-*.jar
|
rm -f /etc/guacamole/extensions/guacamole-auth-ldap-*.jar
|
||||||
curl_download "/tmp/guacamole-auth-ldap.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-ldap-${LATEST_SERVER}.tar.gz"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-ldap-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-ldap.tar.gz"
|
||||||
$STD tar -xf /tmp/guacamole-auth-ldap.tar.gz -C /tmp
|
$STD tar -xf /tmp/guacamole-auth-ldap.tar.gz -C /tmp
|
||||||
mv /tmp/guacamole-auth-ldap-"${LATEST_SERVER}"/guacamole-auth-ldap-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
mv /tmp/guacamole-auth-ldap-"${LATEST_SERVER}"/guacamole-auth-ldap-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
||||||
chmod 664 /etc/guacamole/extensions/guacamole-auth-ldap-"${LATEST_SERVER}".jar
|
chmod 664 /etc/guacamole/extensions/guacamole-auth-ldap-"${LATEST_SERVER}".jar
|
||||||
@@ -184,7 +184,7 @@ function update_script() {
|
|||||||
if [[ -f /etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar ]]; then
|
if [[ -f /etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar ]]; then
|
||||||
msg_info "Updating Quick Connect Extension"
|
msg_info "Updating Quick Connect Extension"
|
||||||
rm -f /etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar
|
rm -f /etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar
|
||||||
curl_download "/tmp/guacamole-auth-quickconnect.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-quickconnect-${LATEST_SERVER}.tar.gz"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-quickconnect-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-quickconnect.tar.gz"
|
||||||
$STD tar -xf /tmp/guacamole-auth-quickconnect.tar.gz -C /tmp
|
$STD tar -xf /tmp/guacamole-auth-quickconnect.tar.gz -C /tmp
|
||||||
mv /tmp/guacamole-auth-quickconnect-"${LATEST_SERVER}"/guacamole-auth-quickconnect-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
mv /tmp/guacamole-auth-quickconnect-"${LATEST_SERVER}"/guacamole-auth-quickconnect-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
||||||
chmod 664 /etc/guacamole/extensions/guacamole-auth-quickconnect-"${LATEST_SERVER}".jar
|
chmod 664 /etc/guacamole/extensions/guacamole-auth-quickconnect-"${LATEST_SERVER}".jar
|
||||||
@@ -196,7 +196,7 @@ function update_script() {
|
|||||||
if [[ -f /etc/guacamole/extensions/guacamole-history-recording-storage-*.jar ]]; then
|
if [[ -f /etc/guacamole/extensions/guacamole-history-recording-storage-*.jar ]]; then
|
||||||
msg_info "Updating History Recording Storage Extension"
|
msg_info "Updating History Recording Storage Extension"
|
||||||
rm -f /etc/guacamole/extensions/guacamole-history-recording-storage-*.jar
|
rm -f /etc/guacamole/extensions/guacamole-history-recording-storage-*.jar
|
||||||
curl_download "/tmp/guacamole-history-recording-storage.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-history-recording-storage-${LATEST_SERVER}.tar.gz"
|
curl -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-history-recording-storage-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-history-recording-storage.tar.gz"
|
||||||
$STD tar -xf /tmp/guacamole-history-recording-storage.tar.gz -C /tmp
|
$STD tar -xf /tmp/guacamole-history-recording-storage.tar.gz -C /tmp
|
||||||
mv /tmp/guacamole-history-recording-storage-"${LATEST_SERVER}"/guacamole-history-recording-storage-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
mv /tmp/guacamole-history-recording-storage-"${LATEST_SERVER}"/guacamole-history-recording-storage-"${LATEST_SERVER}".jar /etc/guacamole/extensions/
|
||||||
chmod 664 /etc/guacamole/extensions/guacamole-history-recording-storage-"${LATEST_SERVER}".jar
|
chmod 664 /etc/guacamole/extensions/guacamole-history-recording-storage-"${LATEST_SERVER}".jar
|
||||||
|
|||||||
@@ -1,75 +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: SystemIdleProcess
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/caronc/apprise-api
|
|
||||||
|
|
||||||
APP="Apprise-API"
|
|
||||||
var_tags="${var_tags:-notification}"
|
|
||||||
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 [[ ! -d "/opt/apprise" ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if check_for_gh_release "apprise" "caronc/apprise-api"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop apprise-api
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "apprise" "caronc/apprise-api" "tarball"
|
|
||||||
|
|
||||||
msg_info "Updating Apprise-API"
|
|
||||||
cd /opt/apprise
|
|
||||||
cp ./requirements.txt /etc/requirements.txt
|
|
||||||
$STD apt install -y nginx git
|
|
||||||
$STD uv pip install -r requirements.txt gunicorn supervisor --system
|
|
||||||
cp -fr apprise_api/static /usr/share/nginx/html/s/
|
|
||||||
mv apprise_api/ webapp
|
|
||||||
touch /etc/nginx/server-override.conf
|
|
||||||
touch /etc/nginx/location-override.conf
|
|
||||||
mkdir -p /config/store /attach /plugin /tmp/apprise /opt/apprise/logs
|
|
||||||
chmod 1777 /tmp/apprise && chmod 777 /config /config/store /attach /plugin /opt/apprise/logs
|
|
||||||
sed -i \
|
|
||||||
-e '/[[]program:nginx]/,/^[[]/ s|stdout_logfile=/dev/stdout|stdout_logfile=/opt/apprise/logs/nginx.log|' \
|
|
||||||
-e '/[[]program:nginx]/,/^[[]/ s|stderr_logfile=/dev/stderr|stderr_logfile=/opt/apprise/logs/nginx_error.log|' \
|
|
||||||
-e '/[[]program:gunicorn]/,/^[[]/ s|stdout_logfile=/dev/stdout|stdout_logfile=/opt/apprise/logs/gunicorn.log|' \
|
|
||||||
-e '/[[]program:gunicorn]/,/^[[]/ s|stderr_logfile=/dev/stderr|stderr_logfile=/opt/apprise/logs/gunicorn_error.log|' \
|
|
||||||
-e '/[[]supervisord]/,/^[[]/ s|logfile=/dev/null|logfile=/opt/apprise/logs/supervisor.log|' \
|
|
||||||
-e 's|_maxbytes=0|_maxbytes=10485760|g' \
|
|
||||||
/opt/apprise/webapp/etc/supervisord.conf
|
|
||||||
msg_ok "Updated Apprise-API"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start apprise-api
|
|
||||||
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}:8000${CL}"
|
|
||||||
155
ct/authentik.sh
155
ct/authentik.sh
@@ -1,155 +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: Thieneret
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/goauthentik/authentik
|
|
||||||
|
|
||||||
APP="authentik"
|
|
||||||
var_tags="${var_tags:-auth}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
var_disk="${var_disk:-16}"
|
|
||||||
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/authentik ]]; then
|
|
||||||
msg_error "No authentik Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
|
||||||
setup_go
|
|
||||||
UV_PYTHON_INSTALL_DIR="/usr/local/bin" PYTHON_VERSION="3.14.3" setup_uv
|
|
||||||
setup_rust
|
|
||||||
|
|
||||||
AUTHENTIK_VERSION="version/2026.2.3"
|
|
||||||
XMLSEC_VERSION="1.3.11"
|
|
||||||
|
|
||||||
if check_for_gh_release "geoipupdate" "maxmind/geoipupdate"; then
|
|
||||||
fetch_and_deploy_gh_release "geoipupdate" "maxmind/geoipupdate" "binary"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "xmlsec" "lsh123/xmlsec" "${XMLSEC_VERSION}"; then
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "xmlsec" "lsh123/xmlsec" "tarball" "${XMLSEC_VERSION}" "/opt/xmlsec"
|
|
||||||
|
|
||||||
msg_info "Updating xmlsec"
|
|
||||||
cd /opt/xmlsec
|
|
||||||
$STD ./autogen.sh
|
|
||||||
$STD make -j $(nproc)
|
|
||||||
$STD make check
|
|
||||||
$STD make install
|
|
||||||
$STD ldconfig
|
|
||||||
msg_ok "Updated xmlsec"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "authentik" "goauthentik/authentik" "${AUTHENTIK_VERSION}"; then
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop authentik-server authentik-worker
|
|
||||||
if [[ $(systemctl is-active authentik-ldap) == active ]]; then
|
|
||||||
systemctl stop authentik-ldap
|
|
||||||
fi
|
|
||||||
if [[ $(systemctl is-active authentik-rac) == active ]]; then
|
|
||||||
systemctl stop authentik-rac
|
|
||||||
fi
|
|
||||||
if [[ $(systemctl is-active authentik-radius) == active ]]; then
|
|
||||||
systemctl stop authentik-radius
|
|
||||||
fi
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "authentik" "goauthentik/authentik" "tarball" "${AUTHENTIK_VERSION}" "/opt/authentik"
|
|
||||||
|
|
||||||
msg_info "Updating web"
|
|
||||||
cd /opt/authentik/web
|
|
||||||
export NODE_ENV="production"
|
|
||||||
$STD npm install
|
|
||||||
$STD npm run build
|
|
||||||
$STD npm run build:sfe
|
|
||||||
msg_ok "Updated web"
|
|
||||||
|
|
||||||
msg_info "Updating go proxy"
|
|
||||||
cd /opt/authentik
|
|
||||||
export CGO_ENABLED="1"
|
|
||||||
$STD go mod download
|
|
||||||
$STD go build -o /opt/authentik/authentik-server ./cmd/server
|
|
||||||
$STD go build -o /opt/authentik/ldap ./cmd/ldap
|
|
||||||
$STD go build -o /opt/authentik/rac ./cmd/rac
|
|
||||||
$STD go build -o /opt/authentik/radius ./cmd/radius
|
|
||||||
msg_ok "Updated go proxy"
|
|
||||||
|
|
||||||
msg_info "Updating python server"
|
|
||||||
export UV_NO_BINARY_PACKAGE="cryptography lxml python-kadmin-rs xmlsec"
|
|
||||||
export UV_COMPILE_BYTECODE="1"
|
|
||||||
export UV_LINK_MODE="copy"
|
|
||||||
export UV_NATIVE_TLS="1"
|
|
||||||
export RUSTUP_PERMIT_COPY_RENAME="true"
|
|
||||||
export UV_PYTHON_INSTALL_DIR="/usr/local/bin"
|
|
||||||
cd /opt/authentik
|
|
||||||
$STD uv sync --frozen --no-install-project --no-dev
|
|
||||||
chown -R authentik:authentik /opt/authentik
|
|
||||||
msg_ok "Updated python server"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start authentik-server authentik-worker
|
|
||||||
if [[ $(systemctl is-enabled authentik-ldap) == enabled ]]; then
|
|
||||||
systemctl start authentik-ldap
|
|
||||||
fi
|
|
||||||
if [[ $(systemctl is-enabled authentik-rac) == enabled ]]; then
|
|
||||||
systemctl start authentik-rac
|
|
||||||
fi
|
|
||||||
if [[ $(systemctl is-enabled authentik-radius) == enabled ]]; then
|
|
||||||
systemctl start authentik-radius
|
|
||||||
fi
|
|
||||||
msg_ok "Started Services"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
|
|
||||||
msg_info "Attaching data storage volume"
|
|
||||||
$STD pct stop "$CTID"
|
|
||||||
if [ "${PROTECT_CT:-}" == "1" ] || [ "${PROTECT_CT:-}" == "yes" ]; then
|
|
||||||
$STD pct set "$CTID" --protection 0
|
|
||||||
$STD pct set "$CTID" -mp0 "${CONTAINER_STORAGE}":1,mp=/opt/authentik-data,backup=1
|
|
||||||
$STD pct set "$CTID" --protection 1
|
|
||||||
else
|
|
||||||
$STD pct set "$CTID" -mp0 "${CONTAINER_STORAGE}":1,mp=/opt/authentik-data,backup=1
|
|
||||||
fi
|
|
||||||
$STD pct start "$CTID"
|
|
||||||
for i in {1..10}; do
|
|
||||||
pct status "$CTID" | grep -q "status: running" && break
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
$STD pct exec "$CTID" -- bash -c "mkdir -p /opt/authentik-data/{certs,media,geoip,templates}; \
|
|
||||||
cp /opt/authentik/tests/GeoLite2-ASN-Test.mmdb /opt/authentik-data/geoip/GeoLite2-ASN.mmdb; \
|
|
||||||
cp /opt/authentik/tests/GeoLite2-City-Test.mmdb /opt/authentik-data/geoip/GeoLite2-City.mmdb; \
|
|
||||||
chown authentik:authentik /opt/authentik-data; \
|
|
||||||
chown -R authentik:authentik /opt/authentik-data/{certs,media,geoip,templates}"
|
|
||||||
msg_ok "Attached data storage volume"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
pct exec "$CTID" -- systemctl enable -q --now authentik-server authentik-worker
|
|
||||||
msg_ok "Started Services"
|
|
||||||
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Initial setup URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000/if/flow/initial-setup/${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${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}"
|
||||||
|
|
||||||
|
|||||||
@@ -1,90 +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: Adrian-RDA
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/maziggy/bambuddy
|
|
||||||
|
|
||||||
APP="Bambuddy"
|
|
||||||
var_tags="${var_tags:-media;3d-printing}"
|
|
||||||
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 [[ ! -d /opt/bambuddy ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
ensure_dependencies ffmpeg
|
|
||||||
|
|
||||||
if check_for_gh_release "bambuddy" "maziggy/bambuddy"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop bambuddy
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration and Data"
|
|
||||||
cp /opt/bambuddy/.env /opt/bambuddy.env.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"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bambuddy" "maziggy/bambuddy" "tarball" "latest" "/opt/bambuddy"
|
|
||||||
|
|
||||||
msg_info "Updating Python Dependencies"
|
|
||||||
cd /opt/bambuddy
|
|
||||||
$STD uv venv --clear
|
|
||||||
$STD uv pip install -r requirements.txt
|
|
||||||
msg_ok "Updated Python Dependencies"
|
|
||||||
|
|
||||||
msg_info "Rebuilding Frontend"
|
|
||||||
cd /opt/bambuddy/frontend
|
|
||||||
$STD npm install
|
|
||||||
$STD npm run build
|
|
||||||
msg_ok "Rebuilt Frontend"
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration and Data"
|
|
||||||
mkdir -p /opt/bambuddy/data
|
|
||||||
cp /opt/bambuddy.env.bak /opt/bambuddy/.env
|
|
||||||
cp -r /opt/bambuddy_data_bak/. /opt/bambuddy/data/
|
|
||||||
[[ -f /opt/bambuddy.db.bak ]] && cp /opt/bambuddy.db.bak /opt/bambuddy/bambuddy.db
|
|
||||||
[[ -f /opt/bambutrack.db.bak ]] && cp /opt/bambutrack.db.bak /opt/bambuddy/bambutrack.db
|
|
||||||
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_info "Starting Service"
|
|
||||||
systemctl start bambuddy
|
|
||||||
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}:8000${CL}"
|
|
||||||
@@ -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 \
|
|
||||||
-out /etc/ssl/certs/bentopdf-selfsigned.crt \
|
|
||||||
-subj "/CN=${CERT_CN}"
|
|
||||||
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 daemon-reload
|
||||||
|
fi
|
||||||
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}"
|
||||||
|
|||||||
@@ -36,9 +36,7 @@ function update_script() {
|
|||||||
msg_info "Updating Beszel"
|
msg_info "Updating Beszel"
|
||||||
$STD /opt/beszel/beszel update
|
$STD /opt/beszel/beszel update
|
||||||
sleep 2 && chmod +x /opt/beszel/beszel
|
sleep 2 && chmod +x /opt/beszel/beszel
|
||||||
VERSION=$(/opt/beszel/beszel -v | awk '{print $3}')
|
msg_ok "Updated Beszel"
|
||||||
echo "${VERSION}" >$HOME/.beszel
|
|
||||||
msg_ok "Updated Beszel to ${VERSION}"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start beszel-hub
|
systemctl start beszel-hub
|
||||||
|
|||||||
80
ct/bichon.sh
80
ct/bichon.sh
@@ -28,95 +28,15 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CURRENT_VERSION="unknown"
|
|
||||||
if [[ -f /root/.bichon ]]; then
|
|
||||||
CURRENT_VERSION=$(cat /root/.bichon)
|
|
||||||
fi
|
|
||||||
|
|
||||||
MIGRATE_V1=0
|
|
||||||
if [[ "$CURRENT_VERSION" == 0.* ]]; then
|
|
||||||
MIGRATE_V1=1
|
|
||||||
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
|
||||||
if [ "$DISK_USAGE" -gt 50 ]; then
|
|
||||||
echo -e "\n${RD}Warning: Less than 50% free storage remaining on the root disk.${CL}"
|
|
||||||
echo -e "${RD}Bichon v1 data migration temporarily duplicates data and requires free space for it.${CL}"
|
|
||||||
read -r -p "Are you sure you want to proceed with the update? (y/N): " proceed
|
|
||||||
if [[ ! "$proceed" =~ ^[Yy]$ ]]; then
|
|
||||||
msg_error "Update cancelled by user."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
RAM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')
|
|
||||||
if [ "$RAM_TOTAL" -lt 2000 ]; then
|
|
||||||
echo -e "\n${RD}Warning: LXC has less than 2GB of RAM allocated (${RAM_TOTAL}MB).${CL}"
|
|
||||||
echo -e "${RD}Bichon v1 data migration consumes significant memory and may crash if insufficient.${CL}"
|
|
||||||
read -r -p "Are you sure you want to proceed with the update? (y/N): " proceed_ram
|
|
||||||
if [[ ! "$proceed_ram" =~ ^[Yy]$ ]]; then
|
|
||||||
msg_error "Update cancelled by user."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "bichon" "rustmailer/bichon"; then
|
if check_for_gh_release "bichon" "rustmailer/bichon"; then
|
||||||
msg_info "Stopping service"
|
msg_info "Stopping service"
|
||||||
systemctl stop bichon
|
systemctl stop bichon
|
||||||
msg_ok "Stopped service"
|
msg_ok "Stopped service"
|
||||||
|
|
||||||
cp /opt/bichon/bichon.env /tmp/bichon.env.backup
|
cp /opt/bichon/bichon.env /tmp/bichon.env.backup
|
||||||
|
|
||||||
if [ "$MIGRATE_V1" -eq 1 ] && [ "$CURRENT_VERSION" != "0.3.7" ]; then
|
|
||||||
msg_info "Updating to intermediate version v0.3.7"
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bichon" "rustmailer/bichon" "prebuild" "v0.3.7" "/opt/bichon" "bichon-*-x86_64-unknown-linux-gnu.tar.gz"
|
|
||||||
cp /tmp/bichon.env.backup /opt/bichon/bichon.env
|
|
||||||
systemctl start bichon
|
|
||||||
sleep 30
|
|
||||||
systemctl stop bichon
|
|
||||||
msg_ok "Intermediate update completed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bichon" "rustmailer/bichon" "prebuild" "latest" "/opt/bichon" "bichon-*-x86_64-unknown-linux-gnu.tar.gz"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bichon" "rustmailer/bichon" "prebuild" "latest" "/opt/bichon" "bichon-*-x86_64-unknown-linux-gnu.tar.gz"
|
||||||
cp /tmp/bichon.env.backup /opt/bichon/bichon.env
|
cp /tmp/bichon.env.backup /opt/bichon/bichon.env
|
||||||
|
|
||||||
if [ "$MIGRATE_V1" -eq 1 ]; then
|
|
||||||
msg_info "Running Bichon v1 Data Migration (patience)"
|
|
||||||
$STD apt install -y expect
|
|
||||||
$STD expect <<'EOF'
|
|
||||||
set timeout -1
|
|
||||||
spawn /opt/bichon/bichon-admin
|
|
||||||
expect "*Select an operation*"
|
|
||||||
send "\033\[B\r"
|
|
||||||
expect "*--bichon-root-dir*"
|
|
||||||
send "/opt/bichon-data\r"
|
|
||||||
expect "*--bichon-index-dir*"
|
|
||||||
send "\r"
|
|
||||||
expect "*--bichon-data-dir*"
|
|
||||||
send "\r"
|
|
||||||
expect "*Ready to migrate?*"
|
|
||||||
send "y"
|
|
||||||
expect "*Enter batch size*"
|
|
||||||
send "1000\r"
|
|
||||||
expect eof
|
|
||||||
catch wait
|
|
||||||
EOF
|
|
||||||
$STD apt remove --purge expect -y
|
|
||||||
$STD apt autoremove -y
|
|
||||||
msg_ok "Migration completed"
|
|
||||||
|
|
||||||
msg_info "Cleaning up legacy Bichon v0.x storage files"
|
|
||||||
rm -rf /opt/bichon-data/envelope
|
|
||||||
rm -rf /opt/bichon-data/eml
|
|
||||||
rm -f /opt/bichon-data/mailbox.db
|
|
||||||
rm -f /opt/bichon-data/meta.db
|
|
||||||
msg_ok "Cleanup completed"
|
|
||||||
|
|
||||||
msg_info "Updating Bichon service for v1"
|
|
||||||
sed -i 's|ExecStart=/opt/bichon/bichon|ExecStart=/opt/bichon/bichon-server|g; s|RestartSec=5|RestartSec=5\n\nLimitNOFILE=65536|g' /etc/systemd/system/bichon.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
msg_ok "Service updated"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Starting service"
|
msg_info "Starting service"
|
||||||
systemctl start bichon
|
systemctl start bichon
|
||||||
msg_ok "Service started"
|
msg_ok "Service started"
|
||||||
|
|||||||
@@ -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: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/tphakala/birdnet-go
|
|
||||||
|
|
||||||
APP="BirdNET-Go"
|
|
||||||
var_tags="${var_tags:-monitoring;ai;nature}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-12}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
var_gpu="${var_gpu:-no}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /usr/local/bin/birdnet-go ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "birdnet" "tphakala/birdnet-go"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop birdnet
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "birdnet" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet" "birdnet-go-linux-amd64.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Deploying Binary"
|
|
||||||
cp /opt/birdnet/birdnet-go /usr/local/bin/birdnet-go
|
|
||||||
chmod +x /usr/local/bin/birdnet-go
|
|
||||||
cp -r /opt/birdnet/libtensorflowlite_c.so /usr/local/lib/ || true
|
|
||||||
ldconfig
|
|
||||||
msg_ok "Deployed Binary"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start birdnet
|
|
||||||
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}"
|
|
||||||
113
ct/booklore.sh
Normal file
113
ct/booklore.sh
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#!/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/booklore-app/BookLore
|
||||||
|
|
||||||
|
APP="BookLore"
|
||||||
|
var_tags="${var_tags:-books;library}"
|
||||||
|
var_cpu="${var_cpu:-3}"
|
||||||
|
var_ram="${var_ram:-3072}"
|
||||||
|
var_disk="${var_disk:-7}"
|
||||||
|
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/booklore ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "booklore" "booklore-app/BookLore"; then
|
||||||
|
JAVA_VERSION="25" setup_java
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
setup_mariadb
|
||||||
|
setup_yq
|
||||||
|
ensure_dependencies ffmpeg
|
||||||
|
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop booklore
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
if grep -qE "^BOOKLORE_(DATA_PATH|BOOKDROP_PATH|BOOKS_PATH|PORT)=" /opt/booklore_storage/.env 2>/dev/null; then
|
||||||
|
msg_info "Migrating old environment variables"
|
||||||
|
sed -i 's/^BOOKLORE_DATA_PATH=/APP_PATH_CONFIG=/g' /opt/booklore_storage/.env
|
||||||
|
sed -i 's/^BOOKLORE_BOOKDROP_PATH=/APP_BOOKDROP_FOLDER=/g' /opt/booklore_storage/.env
|
||||||
|
sed -i '/^BOOKLORE_BOOKS_PATH=/d' /opt/booklore_storage/.env
|
||||||
|
sed -i '/^BOOKLORE_PORT=/d' /opt/booklore_storage/.env
|
||||||
|
msg_ok "Migrated old environment variables"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Backing up old installation"
|
||||||
|
mv /opt/booklore /opt/booklore_bak
|
||||||
|
msg_ok "Backed up old installation"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore" "tarball"
|
||||||
|
|
||||||
|
msg_info "Building Frontend"
|
||||||
|
cd /opt/booklore/booklore-ui
|
||||||
|
$STD npm install --force
|
||||||
|
$STD npm run build --configuration=production
|
||||||
|
msg_ok "Built Frontend"
|
||||||
|
|
||||||
|
msg_info "Embedding Frontend into Backend"
|
||||||
|
mkdir -p /opt/booklore/booklore-api/src/main/resources/static
|
||||||
|
cp -r /opt/booklore/booklore-ui/dist/booklore/browser/* /opt/booklore/booklore-api/src/main/resources/static/
|
||||||
|
msg_ok "Embedded Frontend into Backend"
|
||||||
|
|
||||||
|
msg_info "Building Backend"
|
||||||
|
cd /opt/booklore/booklore-api
|
||||||
|
APP_VERSION=$(get_latest_github_release "booklore-app/BookLore")
|
||||||
|
yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
|
||||||
|
$STD ./gradlew clean build -x test --no-daemon
|
||||||
|
mkdir -p /opt/booklore/dist
|
||||||
|
JAR_PATH=$(find /opt/booklore/booklore-api/build/libs -maxdepth 1 -type f -name "booklore-api-*.jar" ! -name "*plain*" | head -n1)
|
||||||
|
if [[ -z "$JAR_PATH" ]]; then
|
||||||
|
msg_error "Backend JAR not found"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
cp "$JAR_PATH" /opt/booklore/dist/app.jar
|
||||||
|
msg_ok "Built Backend"
|
||||||
|
|
||||||
|
if systemctl is-active --quiet nginx 2>/dev/null; then
|
||||||
|
msg_info "Removing Nginx (no longer needed)"
|
||||||
|
systemctl disable --now nginx
|
||||||
|
$STD apt-get purge -y nginx nginx-common
|
||||||
|
msg_ok "Removed Nginx"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "^SERVER_PORT=" /opt/booklore_storage/.env 2>/dev/null; then
|
||||||
|
echo "SERVER_PORT=6060" >>/opt/booklore_storage/.env
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i 's|ExecStart=.*|ExecStart=/usr/bin/java -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompactObjectHeaders -XX:MaxRAMPercentage=75.0 -XX:+ExitOnOutOfMemoryError -jar /opt/booklore/dist/app.jar|' /etc/systemd/system/booklore.service
|
||||||
|
systemctl daemon-reload
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start booklore
|
||||||
|
rm -rf /opt/booklore_bak
|
||||||
|
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}:6060${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,30 +29,14 @@ 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
|
||||||
|
read -rp "${TAB3}Did you make a backup via application WebUI? (y/n): " backuped
|
||||||
|
if [[ "$backuped" =~ ^[Yy]$ ]]; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop bytestash-backend bytestash-frontend
|
systemctl stop bytestash-backend bytestash-frontend
|
||||||
msg_ok "Services Stopped"
|
msg_ok "Services Stopped"
|
||||||
|
|
||||||
msg_info "Backing up data"
|
|
||||||
tmp_dir="/opt/bytestash-data-backup"
|
|
||||||
mkdir -p "$tmp_dir"
|
|
||||||
if [[ -d /opt/bytestash/data ]]; then
|
|
||||||
cp -r /opt/bytestash/data "$tmp_dir"/data
|
|
||||||
elif [[ -d /opt/data ]]; then
|
|
||||||
cp -r /opt/data "$tmp_dir"/data
|
|
||||||
fi
|
|
||||||
msg_ok "Data backed up"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bytestash" "jordan-dalby/ByteStash" "tarball"
|
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"
|
msg_info "Configuring ByteStash"
|
||||||
cd /opt/bytestash/server
|
cd /opt/bytestash/server
|
||||||
$STD npm install
|
$STD npm install
|
||||||
@@ -63,7 +47,10 @@ function update_script() {
|
|||||||
msg_info "Starting Services"
|
msg_info "Starting Services"
|
||||||
systemctl start bytestash-backend bytestash-frontend
|
systemctl start bytestash-backend bytestash-frontend
|
||||||
msg_ok "Started Services"
|
msg_ok "Started Services"
|
||||||
|
else
|
||||||
|
msg_error "PLEASE MAKE A BACKUP FIRST!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
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
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ function update_script() {
|
|||||||
[ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
|
[ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
|
||||||
msg_ok "Backed up Data"
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
|
||||||
|
|
||||||
msg_info "Updating Checkmate Server"
|
msg_info "Updating Checkmate Server"
|
||||||
cd /opt/checkmate/server
|
cd /opt/checkmate/server
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -23,30 +23,25 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if ! command -v omd &>/dev/null; then
|
if [[ ! -f /opt/checkmk_version.txt ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl_with_retry "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 checkmk"
|
|
||||||
$STD omd stop monitoring
|
$STD omd stop monitoring
|
||||||
$STD omd cp monitoring monitoringbackup
|
$STD omd cp monitoring monitoringbackup
|
||||||
curl_download "/opt/checkmk.deb" "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-community-${RELEASE}_0.$(get_os_info codename)_amd64.deb"
|
curl -fsSL "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb" -o "/opt/checkmk.deb"
|
||||||
$STD apt install -y /opt/checkmk.deb
|
$STD apt-get install -y /opt/checkmk.deb
|
||||||
OMD_VERSION=$(omd versions 2>/dev/null | grep "^${RELEASE}" | awk '{print $1}')
|
$STD omd --force -V ${RELEASE}.cre update --conflict=install monitoring
|
||||||
if [[ -z "${OMD_VERSION}" ]]; then
|
|
||||||
msg_error "Could not find installed OMD version for release ${RELEASE}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
$STD omd --force -V "${OMD_VERSION}" update --conflict=install monitoring
|
|
||||||
$STD omd start monitoring
|
$STD omd start monitoring
|
||||||
$STD omd -f rm monitoringbackup
|
$STD omd -f rm monitoringbackup
|
||||||
$STD omd cleanup
|
$STD omd cleanup
|
||||||
rm -rf /opt/checkmk.deb
|
rm -rf /opt/checkmk.deb
|
||||||
msg_ok "Updated checkmk"
|
msg_ok "Updated ${APP}"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
|
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,55 +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: mathiasnagler
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/router-for-me/CLIProxyAPI
|
|
||||||
|
|
||||||
APP="CLIProxyAPI"
|
|
||||||
var_tags="${var_tags:-ai;proxy}"
|
|
||||||
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 [[ ! -d /opt/cliproxyapi ]]; then
|
|
||||||
msg_error "No CLIProxyAPI Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "cliproxyapi" "router-for-me/CLIProxyAPI"; then
|
|
||||||
msg_info "Stopping CLIProxyAPI"
|
|
||||||
systemctl stop cliproxyapi
|
|
||||||
msg_ok "Stopped CLIProxyAPI"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cliproxyapi" "router-for-me/CLIProxyAPI" "prebuild" "latest" "/opt/cliproxyapi" "CLIProxyAPI_*_linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Starting CLIProxyAPI"
|
|
||||||
systemctl start cliproxyapi
|
|
||||||
msg_ok "Started CLIProxyAPI"
|
|
||||||
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}:8317${CL}"
|
|
||||||
@@ -1,56 +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/coredns/coredns
|
|
||||||
|
|
||||||
APP="CoreDNS"
|
|
||||||
var_tags="${var_tags:-dns;network}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-256}"
|
|
||||||
var_disk="${var_disk:-1}"
|
|
||||||
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/coredns ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "coredns" "coredns/coredns"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop coredns
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "coredns" "coredns/coredns" "prebuild" "latest" "/usr/local/bin" \
|
|
||||||
"coredns_*_linux_$(dpkg --print-architecture).tgz"
|
|
||||||
chmod +x /usr/local/bin/coredns
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start coredns
|
|
||||||
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} CoreDNS is listening on port 53 (DNS)${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}dns://${IP}${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 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}"
|
|
||||||
70
ct/dashy.sh
70
ct/dashy.sh
@@ -1,70 +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 ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
|
|
||||||
|
|
||||||
if check_for_gh_release "dashy" "Lissy93/dashy"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop dashy
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up user-data"
|
|
||||||
rm -rf /opt/dashy_user_data_backup
|
|
||||||
cp -r /opt/dashy/user-data /opt/dashy_user_data_backup
|
|
||||||
msg_ok "Backed up user-data"
|
|
||||||
|
|
||||||
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 user-data"
|
|
||||||
cp -r /opt/dashy_user_data_backup/. /opt/dashy/user-data/
|
|
||||||
rm -rf /opt/dashy_user_data_backup
|
|
||||||
msg_ok "Restored user-data"
|
|
||||||
|
|
||||||
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}"
|
|
||||||
@@ -35,10 +35,7 @@ function update_script() {
|
|||||||
msg_ok "Stopped Databasus"
|
msg_ok "Stopped Databasus"
|
||||||
|
|
||||||
msg_info "Backing up Configuration"
|
msg_info "Backing up Configuration"
|
||||||
[[ ! -f /.env && -f /opt/databasus/.env ]] && cp /opt/databasus/.env /.env
|
cp /opt/databasus/.env /opt/databasus.env.bak
|
||||||
chmod 600 /.env
|
|
||||||
cp /.env /opt/databasus.env.bak
|
|
||||||
chmod 600 /opt/databasus.env.bak
|
|
||||||
msg_ok "Backed up Configuration"
|
msg_ok "Backed up Configuration"
|
||||||
|
|
||||||
msg_info "Ensuring Database Clients"
|
msg_info "Ensuring Database Clients"
|
||||||
@@ -49,7 +46,7 @@ function update_script() {
|
|||||||
# Install MongoDB Database Tools via direct .deb (no APT repo for Debian 13)
|
# Install MongoDB Database Tools via direct .deb (no APT repo for Debian 13)
|
||||||
if ! command -v mongodump &>/dev/null; then
|
if ! command -v mongodump &>/dev/null; then
|
||||||
[[ "$(get_os_info id)" == "ubuntu" ]] && MONGO_DIST="ubuntu2204" || MONGO_DIST="debian12"
|
[[ "$(get_os_info id)" == "ubuntu" ]] && MONGO_DIST="ubuntu2204" || MONGO_DIST="debian12"
|
||||||
fetch_and_deploy_from_url "https://fastdl.mongodb.org/tools/db/mongodb-database-tools-${MONGO_DIST}-x86_64-100.16.1.deb"
|
fetch_and_deploy_from_url "https://fastdl.mongodb.org/tools/db/mongodb-database-tools-${MONGO_DIST}-x86_64-100.14.1.deb"
|
||||||
fi
|
fi
|
||||||
[[ -f /usr/bin/mongodump ]] && ln -sf /usr/bin/mongodump /usr/local/mongodb-database-tools/bin/mongodump
|
[[ -f /usr/bin/mongodump ]] && ln -sf /usr/bin/mongodump /usr/local/mongodb-database-tools/bin/mongodump
|
||||||
[[ -f /usr/bin/mongorestore ]] && ln -sf /usr/bin/mongorestore /usr/local/mongodb-database-tools/bin/mongorestore
|
[[ -f /usr/bin/mongorestore ]] && ln -sf /usr/bin/mongorestore /usr/local/mongodb-database-tools/bin/mongorestore
|
||||||
@@ -69,12 +66,9 @@ function update_script() {
|
|||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||||
|
|
||||||
msg_info "Updating Databasus"
|
msg_info "Updating Databasus"
|
||||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
|
||||||
cd /opt/databasus/frontend
|
cd /opt/databasus/frontend
|
||||||
$STD corepack enable
|
$STD npm ci
|
||||||
$STD corepack prepare pnpm@latest --activate
|
$STD npm run build
|
||||||
$STD pnpm install --frozen-lockfile
|
|
||||||
$STD pnpm run build
|
|
||||||
cd /opt/databasus/backend
|
cd /opt/databasus/backend
|
||||||
$STD go mod download
|
$STD go mod download
|
||||||
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||||
@@ -87,18 +81,11 @@ function update_script() {
|
|||||||
msg_ok "Updated Databasus"
|
msg_ok "Updated Databasus"
|
||||||
|
|
||||||
msg_info "Restoring Configuration"
|
msg_info "Restoring Configuration"
|
||||||
cp /opt/databasus.env.bak /.env
|
cp /opt/databasus.env.bak /opt/databasus/.env
|
||||||
rm -f /opt/databasus.env.bak
|
rm -f /opt/databasus.env.bak
|
||||||
chmod 600 /.env
|
chown postgres:postgres /opt/databasus/.env
|
||||||
msg_ok "Restored Configuration"
|
msg_ok "Restored Configuration"
|
||||||
|
|
||||||
if ! grep -q "EnvironmentFile=/.env" /etc/systemd/system/databasus.service; then
|
|
||||||
msg_info "Updating Service"
|
|
||||||
sed -i 's|EnvironmentFile=.*|EnvironmentFile=/.env|' /etc/systemd/system/databasus.service
|
|
||||||
$STD systemctl daemon-reload
|
|
||||||
msg_ok "Updated Service"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Starting Databasus"
|
msg_info "Starting Databasus"
|
||||||
$STD systemctl start databasus
|
$STD systemctl start databasus
|
||||||
msg_ok "Started Databasus"
|
msg_ok "Started Databasus"
|
||||||
|
|||||||
@@ -45,26 +45,14 @@ function update_script() {
|
|||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dawarich" "Freika/dawarich" "tarball" "latest" "/opt/dawarich/app"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dawarich" "Freika/dawarich" "tarball" "latest" "/opt/dawarich/app"
|
||||||
|
|
||||||
RUBY_VERSION=$(cat /opt/dawarich/app/.ruby-version 2>/dev/null || echo "3.4.6")
|
RUBY_VERSION=$(cat /opt/dawarich/app/.ruby-version 2>/dev/null || echo "3.4.6")
|
||||||
RUBY_VERSION=${RUBY_VERSION} RUBY_INSTALL_RAILS="false" HOME=/root setup_ruby
|
RUBY_VERSION=${RUBY_VERSION} RUBY_INSTALL_RAILS="false" setup_ruby
|
||||||
|
|
||||||
msg_info "Running Migrations"
|
msg_info "Running Migrations"
|
||||||
cd /opt/dawarich/app
|
cd /opt/dawarich/app
|
||||||
source /root/.profile
|
source /root/.profile
|
||||||
export PATH="/root/.rbenv/shims:/root/.rbenv/bin:${PATH}"
|
export PATH="/root/.rbenv/shims:/root/.rbenv/bin:$PATH"
|
||||||
eval "$(/root/.rbenv/bin/rbenv init - bash)"
|
eval "$(/root/.rbenv/bin/rbenv init - bash)"
|
||||||
|
|
||||||
if ! grep -q "OTP_ENCRYPTION_PRIMARY_KEY" /opt/dawarich/.env; then
|
|
||||||
echo "OTP_ENCRYPTION_PRIMARY_KEY=$(openssl rand -hex 64)" >>/opt/dawarich/.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! grep -q "OTP_ENCRYPTION_DETERMINISTIC_KEY" /opt/dawarich/.env; then
|
|
||||||
echo "OTP_ENCRYPTION_DETERMINISTIC_KEY=$(openssl rand -hex 64)" >>/opt/dawarich/.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! grep -q "OTP_ENCRYPTION_KEY_DERIVATION_SALT" /opt/dawarich/.env; then
|
|
||||||
echo "OTP_ENCRYPTION_KEY_DERIVATION_SALT=$(openssl rand -hex 64)" >>/opt/dawarich/.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -a && source /opt/dawarich/.env && set +a
|
set -a && source /opt/dawarich/.env && set +a
|
||||||
|
|
||||||
$STD bundle config set --local deployment 'true'
|
$STD bundle config set --local deployment 'true'
|
||||||
@@ -79,8 +67,8 @@ function update_script() {
|
|||||||
$STD npm install
|
$STD npm install
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$STD bundle exec rails db:migrate
|
|
||||||
$STD bundle exec rake assets:precompile
|
$STD bundle exec rake assets:precompile
|
||||||
|
$STD bundle exec rails db:migrate
|
||||||
$STD bundle exec rake data:migrate
|
$STD bundle exec rake data:migrate
|
||||||
msg_ok "Ran Migrations"
|
msg_ok "Ran Migrations"
|
||||||
|
|
||||||
|
|||||||
73
ct/degoog.sh
73
ct/degoog.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: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/fccview/degoog
|
|
||||||
|
|
||||||
APP="degoog"
|
|
||||||
var_tags="${var_tags:-search;privacy}"
|
|
||||||
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/degoog ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "degoog" "fccview/degoog"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop degoog
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Backing up Configuration & Data"
|
|
||||||
[[ -f /opt/degoog/.env ]] && cp /opt/degoog/.env /opt/degoog.env.bak
|
|
||||||
[[ -d /opt/degoog/data ]] && mv /opt/degoog/data /opt/degoog_data_backup
|
|
||||||
msg_ok "Backed up Configuration & Data"
|
|
||||||
|
|
||||||
if ! command -v bun >/dev/null 2>&1; then
|
|
||||||
msg_info "Installing Bun"
|
|
||||||
export BUN_INSTALL="/root/.bun"
|
|
||||||
curl -fsSL https://bun.sh/install | $STD bash
|
|
||||||
ln -sf /root/.bun/bin/bun /usr/local/bin/bun
|
|
||||||
ln -sf /root/.bun/bin/bunx /usr/local/bin/bunx
|
|
||||||
msg_ok "Installed Bun"
|
|
||||||
fi
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Restoring Configuration & Data"
|
|
||||||
[[ -f /opt/degoog.env.bak ]] && mv /opt/degoog.env.bak /opt/degoog/.env
|
|
||||||
[[ -d /opt/degoog_data_backup ]] && mv /opt/degoog_data_backup /opt/degoog/data
|
|
||||||
msg_ok "Restored Configuration & Data"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start degoog
|
|
||||||
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}:4444${CL}"
|
|
||||||
@@ -70,7 +70,7 @@ function update_script() {
|
|||||||
source /opt/dispatcharr/.env
|
source /opt/dispatcharr/.env
|
||||||
set +o allexport
|
set +o allexport
|
||||||
if [[ -n "$POSTGRES_DB" ]] && [[ -n "$POSTGRES_USER" ]] && [[ -n "$POSTGRES_PASSWORD" ]]; then
|
if [[ -n "$POSTGRES_DB" ]] && [[ -n "$POSTGRES_USER" ]] && [[ -n "$POSTGRES_PASSWORD" ]]; then
|
||||||
PGPASSWORD=$POSTGRES_PASSWORD pg_dump -U "$POSTGRES_USER" -h "${POSTGRES_HOST:-localhost}" -p "${POSTGRES_PORT:-5432}" "$POSTGRES_DB" >/tmp/dispatcharr_db_$(date +%F).sql
|
PGPASSWORD=$POSTGRES_PASSWORD pg_dump -U $POSTGRES_USER -h ${POSTGRES_HOST:-localhost} $POSTGRES_DB >/tmp/dispatcharr_db_$(date +%F).sql
|
||||||
msg_info "Database backup created"
|
msg_info "Database backup created"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,84 +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://www.docuseal.com/
|
|
||||||
|
|
||||||
APP="DocuSeal"
|
|
||||||
var_tags="${var_tags:-document;esignature;pdf}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
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 [[ ! -d /opt/docuseal ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "docuseal" "docusealco/docuseal"; then
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop docuseal docuseal-sidekiq
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
cp /opt/docuseal/.env /opt/docuseal.env.bak
|
|
||||||
[[ -d /opt/docuseal/data ]] && mv /opt/docuseal/data /opt/docuseal_data.bak
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "docuseal" "docusealco/docuseal" "tarball"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
mv /opt/docuseal.env.bak /opt/docuseal/.env
|
|
||||||
[[ -d /opt/docuseal_data.bak ]] && mv /opt/docuseal_data.bak /opt/docuseal/data
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Building Application"
|
|
||||||
cd /opt/docuseal
|
|
||||||
export PATH="/root/.rbenv/bin:/root/.rbenv/shims:${PATH}"
|
|
||||||
eval "$(rbenv init - bash)" 2>/dev/null || true
|
|
||||||
export RAILS_ENV=production
|
|
||||||
export NODE_ENV=production
|
|
||||||
export SECRET_KEY_BASE_DUMMY=1
|
|
||||||
set -a
|
|
||||||
source /opt/docuseal/.env
|
|
||||||
set +a
|
|
||||||
$STD bundle config set --local deployment 'true'
|
|
||||||
$STD bundle config set --local without 'development:test'
|
|
||||||
$STD bundle install -j"$(nproc)"
|
|
||||||
$STD yarn install --network-timeout 1000000
|
|
||||||
$STD ./bin/shakapacker
|
|
||||||
$STD bundle exec rails db:migrate
|
|
||||||
$STD bundle exec bootsnap precompile -j 1 --gemfile app/ lib/
|
|
||||||
chown -R docuseal:docuseal /opt/docuseal
|
|
||||||
msg_ok "Built Application"
|
|
||||||
|
|
||||||
msg_info "Starting Services"
|
|
||||||
systemctl start docuseal docuseal-sidekiq
|
|
||||||
msg_ok "Started Services"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
|
||||||
@@ -28,8 +28,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ensure_dependencies whois
|
|
||||||
|
|
||||||
if check_for_gh_release "domain-locker" "Lissy93/domain-locker"; then
|
if check_for_gh_release "domain-locker" "Lissy93/domain-locker"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop domain-locker
|
systemctl stop domain-locker
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -60,7 +59,7 @@ function update_script() {
|
|||||||
msg_ok "Restored backup"
|
msg_ok "Restored backup"
|
||||||
|
|
||||||
msg_info "Restarting Services"
|
msg_info "Restarting Services"
|
||||||
systemctl start apache2
|
systemctl reload apache2
|
||||||
msg_ok "Restarted Services"
|
msg_ok "Restarted Services"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
|
|||||||
53
ct/drawdb.sh
53
ct/drawdb.sh
@@ -1,53 +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/drawdb-io/drawdb
|
|
||||||
|
|
||||||
APP="DrawDB"
|
|
||||||
var_tags="${var_tags:-database;dev-tools}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-6144}"
|
|
||||||
var_disk="${var_disk:-5}"
|
|
||||||
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/drawdb ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_tag "drawdb" "drawdb-io/drawdb"; then
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_tag "drawdb" "drawdb-io/drawdb" "latest" "/opt/drawdb"
|
|
||||||
|
|
||||||
msg_info "Rebuilding Frontend"
|
|
||||||
cd /opt/drawdb
|
|
||||||
$STD npm ci
|
|
||||||
NODE_OPTIONS="--max-old-space-size=4096" $STD npm run build
|
|
||||||
sed -i '/<head>/a <script>if(!crypto.randomUUID){crypto.randomUUID=function(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(c){return(c^(crypto.getRandomValues(new Uint8Array(1))[0]&(15>>c/4))).toString(16)})}};</script>' /opt/drawdb/dist/index.html
|
|
||||||
msg_ok "Rebuilt Frontend"
|
|
||||||
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}"
|
|
||||||
@@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: johanngrobe
|
# Author: johanngrobe
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://codeberg.org/endurain-project/endurain
|
# Source: https://github.com/joaovitoriasilva/endurain
|
||||||
|
|
||||||
APP="Endurain"
|
APP="Endurain"
|
||||||
var_tags="${var_tags:-sport;social-media}"
|
var_tags="${var_tags:-sport;social-media}"
|
||||||
@@ -28,7 +28,7 @@ function update_script() {
|
|||||||
msg_error "No ${APP} installation found!"
|
msg_error "No ${APP} installation found!"
|
||||||
exit 233
|
exit 233
|
||||||
fi
|
fi
|
||||||
if check_for_codeberg_release "endurain" "endurain-project/endurain"; then
|
if check_for_gh_release "endurain" "endurain-project/endurain"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop endurain
|
systemctl stop endurain
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
@@ -38,7 +38,7 @@ function update_script() {
|
|||||||
cp /opt/endurain/frontend/app/dist/env.js /opt/endurain.env.js
|
cp /opt/endurain/frontend/app/dist/env.js /opt/endurain.env.js
|
||||||
msg_ok "Created Backup"
|
msg_ok "Created Backup"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_codeberg_release "endurain" "endurain-project/endurain" "tarball" "latest" "/opt/endurain"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "endurain" "endurain-project/endurain" "tarball" "latest" "/opt/endurain"
|
||||||
|
|
||||||
msg_info "Preparing Update"
|
msg_info "Preparing Update"
|
||||||
cd /opt/endurain
|
cd /opt/endurain
|
||||||
|
|||||||
@@ -1,47 +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/frappe/erpnext
|
|
||||||
|
|
||||||
APP="ERPNext"
|
|
||||||
var_tags="${var_tags:-erp;business;accounting}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
var_disk="${var_disk:-20}"
|
|
||||||
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/frappe-bench ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
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_ok "Updated ERPNext"
|
|
||||||
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}"
|
|
||||||
echo -e "${INFO}${YW} Credentials:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}Username: Administrator${CL}"
|
|
||||||
echo -e "${TAB}${BGN}Password: see ~/erpnext.creds${CL}"
|
|
||||||
@@ -1,54 +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: John Lombardo (programbo)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/thelastoutpostworkshop/ESPConnect
|
|
||||||
|
|
||||||
APP="ESPConnect"
|
|
||||||
var_tags="${var_tags:-iot;esp32;flash}"
|
|
||||||
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 [[ ! -d /opt/espconnect ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "espconnect" "thelastoutpostworkshop/ESPConnect"; then
|
|
||||||
msg_info "Stopping Nginx"
|
|
||||||
systemctl stop nginx
|
|
||||||
msg_ok "Stopped Nginx"
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "espconnect" "thelastoutpostworkshop/ESPConnect" "prebuild" "latest" "/opt/espconnect" "dist.zip"
|
|
||||||
|
|
||||||
msg_info "Starting Nginx"
|
|
||||||
systemctl start nginx
|
|
||||||
msg_ok "Started Nginx"
|
|
||||||
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}https://${IP}${CL}"
|
|
||||||
@@ -28,9 +28,6 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
|
|
||||||
|
|
||||||
if check_for_gh_release "excalidraw" "excalidraw/excalidraw"; then
|
if check_for_gh_release "excalidraw" "excalidraw/excalidraw"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop excalidraw
|
systemctl stop excalidraw
|
||||||
@@ -40,7 +37,6 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating Excalidraw"
|
msg_info "Updating Excalidraw"
|
||||||
cd /opt/excalidraw
|
cd /opt/excalidraw
|
||||||
$STD yarn config set ignore-engines true
|
|
||||||
$STD yarn
|
$STD yarn
|
||||||
msg_ok "Updated Excalidraw"
|
msg_ok "Updated Excalidraw"
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ function update_script() {
|
|||||||
update_available=$(curl -fsSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable)
|
update_available=$(curl -fsSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable)
|
||||||
if [[ "${update_available}" == "true" ]]; then
|
if [[ "${update_available}" == "true" ]]; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop fileflows*
|
systemctl stop fileflows
|
||||||
msg_info "Stopped Service"
|
msg_info "Stopped Service"
|
||||||
|
|
||||||
msg_info "Creating Backup"
|
msg_info "Creating Backup"
|
||||||
@@ -45,7 +45,7 @@ function update_script() {
|
|||||||
fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows"
|
fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start fileflows*
|
systemctl start fileflows
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,74 +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/ShaneIsrael/fireshare
|
|
||||||
|
|
||||||
APP="Fireshare"
|
|
||||||
var_tags="${var_tags:-sharing;video}"
|
|
||||||
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 [[ ! -d /opt/fireshare ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "fireshare" "ShaneIsrael/fireshare"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop fireshare
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
mv /opt/fireshare/fireshare.env /opt
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "fireshare" "ShaneIsrael/fireshare" "tarball"
|
|
||||||
mv /opt/fireshare.env /opt/fireshare
|
|
||||||
rm -f /usr/local/bin/fireshare
|
|
||||||
|
|
||||||
msg_info "Updating Fireshare"
|
|
||||||
cd /opt/fireshare
|
|
||||||
$STD uv venv --clear
|
|
||||||
$STD .venv/bin/python -m ensurepip --upgrade
|
|
||||||
$STD .venv/bin/python -m pip install --upgrade --break-system-packages pip
|
|
||||||
$STD .venv/bin/python -m pip install --no-cache-dir --break-system-packages --ignore-installed app/server
|
|
||||||
cp .venv/bin/fireshare /usr/local/bin/fireshare
|
|
||||||
export FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
|
|
||||||
export DATA_DIRECTORY=/opt/fireshare-data
|
|
||||||
export IMAGE_DIRECTORY=/opt/fireshare-images
|
|
||||||
export VIDEO_DIRECTORY=/opt/fireshare-videos
|
|
||||||
export PROCESSED_DIRECTORY=/opt/fireshare-processed
|
|
||||||
$STD uv run flask db upgrade
|
|
||||||
msg_ok "Updated Fireshare"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start fireshare
|
|
||||||
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}${CL}"
|
|
||||||
@@ -38,7 +38,7 @@ function update_script() {
|
|||||||
cp -r /opt/flatnotes/data /opt/flatnotes_data_backup
|
cp -r /opt/flatnotes/data /opt/flatnotes_data_backup
|
||||||
msg_ok "Backed up Configuration and Data"
|
msg_ok "Backed up Configuration and Data"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball"
|
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes"
|
||||||
|
|
||||||
msg_info "Updating Flatnotes"
|
msg_info "Updating Flatnotes"
|
||||||
cd /opt/flatnotes/client
|
cd /opt/flatnotes/client
|
||||||
|
|||||||
@@ -27,16 +27,9 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="20" NODE_MODULE="pnpm" setup_nodejs
|
|
||||||
|
|
||||||
msg_info "Updating FlowiseAI (this may take some time)"
|
msg_info "Updating FlowiseAI (this may take some time)"
|
||||||
systemctl stop flowise
|
systemctl stop flowise
|
||||||
$STD pnpm add -g flowise
|
$STD npm install -g flowise --upgrade
|
||||||
if grep -q 'ExecStart=npx flowise start' /etc/systemd/system/flowise.service; then
|
|
||||||
sed -i 's|ExecStart=npx flowise start|ExecStart=flowise start|' /etc/systemd/system/flowise.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
fi
|
|
||||||
systemctl start flowise
|
systemctl start flowise
|
||||||
msg_ok "Updated FlowiseAI"
|
msg_ok "Updated FlowiseAI"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
|
|||||||
@@ -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}"
|
|
||||||
@@ -7,7 +7,7 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxV
|
|||||||
|
|
||||||
APP="Frigate"
|
APP="Frigate"
|
||||||
var_tags="${var_tags:-nvr}"
|
var_tags="${var_tags:-nvr}"
|
||||||
var_cpu="${var_cpu:-8}"
|
var_cpu="${var_cpu:-4}"
|
||||||
var_ram="${var_ram:-4096}"
|
var_ram="${var_ram:-4096}"
|
||||||
var_disk="${var_disk:-20}"
|
var_disk="${var_disk:-20}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||||
PROJECT_NAME=$(</opt/fumadocs/.projectname)
|
PROJECT_NAME=$(</opt/fumadocs/.projectname)
|
||||||
PROJECT_DIR="/opt/fumadocs/${PROJECT_NAME}"
|
PROJECT_DIR="/opt/fumadocs/${PROJECT_NAME}"
|
||||||
SERVICE_NAME="fumadocs_${PROJECT_NAME}.service"
|
SERVICE_NAME="fumadocs_${PROJECT_NAME}.service"
|
||||||
|
|||||||
@@ -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: CrazyWolf13
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/tess1o/geopulse
|
|
||||||
|
|
||||||
APP="GeoPulse"
|
|
||||||
var_tags="${var_tags:-location;tracking;gps}"
|
|
||||||
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/geopulse/backend/geopulse-backend ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "geopulse-backend" "tess1o/geopulse"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop geopulse-backend
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
if [[ "$(uname -m)" == "aarch64" ]]; then
|
|
||||||
if grep -qi "raspberry\|bcm" /proc/cpuinfo 2>/dev/null; then
|
|
||||||
BINARY_PATTERN="geopulse-backend-native-arm64-compat-*"
|
|
||||||
else
|
|
||||||
BINARY_PATTERN="geopulse-backend-native-arm64-[!c]*"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if grep -q avx2 /proc/cpuinfo && grep -q bmi2 /proc/cpuinfo && grep -q fma /proc/cpuinfo; then
|
|
||||||
BINARY_PATTERN="geopulse-backend-native-amd64-[!c]*"
|
|
||||||
else
|
|
||||||
BINARY_PATTERN="geopulse-backend-native-amd64-compat-*"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "geopulse-backend" "tess1o/geopulse" "singlefile" "latest" "/opt/geopulse/backend" "${BINARY_PATTERN}"
|
|
||||||
fetch_and_deploy_gh_release "geopulse-frontend" "tess1o/geopulse" "prebuild" "latest" "/var/www/geopulse" "geopulse-frontend-*.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start geopulse-backend
|
|
||||||
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}"
|
|
||||||
echo -e "${INFO}${YW} To create an admin account, run:${CL}"
|
|
||||||
echo -e "${TAB}${BGN}/usr/local/bin/create-geopulse-admin${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"
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating Ghostfolio"
|
msg_info "Updating Ghostfolio"
|
||||||
mv /opt/env.backup /opt/ghostfolio/.env
|
mv /opt/env.backup /opt/ghostfolio/.env
|
||||||
sed -i -E '/^DATABASE_URL=/ s/[?&]sslmode=prefer//g' /opt/ghostfolio/.env
|
|
||||||
cd /opt/ghostfolio
|
cd /opt/ghostfolio
|
||||||
$STD npm ci
|
$STD npm ci
|
||||||
$STD npm run build:production
|
$STD npm run build:production
|
||||||
|
|||||||
@@ -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}"
|
|
||||||
11
ct/gokapi.sh
11
ct/gokapi.sh
@@ -32,16 +32,7 @@ function update_script() {
|
|||||||
systemctl stop gokapi
|
systemctl stop gokapi
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "*linux*amd64.zip"
|
fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "gokapi-linux_amd64.zip"
|
||||||
|
|
||||||
# Migrate from pre-v2.2.4 binary name (gokapi-linux_amd64 -> gokapi)
|
|
||||||
if [[ -f /opt/gokapi/gokapi-linux_amd64 ]]; then
|
|
||||||
rm -f /opt/gokapi/gokapi-linux_amd64
|
|
||||||
fi
|
|
||||||
if grep -q "gokapi-linux_amd64" /etc/systemd/system/gokapi.service 2>/dev/null; then
|
|
||||||
sed -i 's|gokapi-linux_amd64|gokapi|g' /etc/systemd/system/gokapi.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start gokapi
|
systemctl start gokapi
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ function update_script() {
|
|||||||
CURRENT_VERSION=$(apt list --installed 2>/dev/null | grep graylog-server | grep -oP '\d+\.\d+\.\d+')
|
CURRENT_VERSION=$(apt list --installed 2>/dev/null | grep graylog-server | grep -oP '\d+\.\d+\.\d+')
|
||||||
|
|
||||||
if dpkg --compare-versions "$CURRENT_VERSION" lt "6.3"; then
|
if dpkg --compare-versions "$CURRENT_VERSION" lt "6.3"; then
|
||||||
MONGO_VERSION="8.2" setup_mongodb
|
MONGO_VERSION="8.0" setup_mongodb
|
||||||
|
|
||||||
msg_info "Updating Graylog"
|
msg_info "Updating Graylog"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
@@ -64,12 +64,6 @@ function update_script() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|
||||||
if [[ $(sysctl -n vm.max_map_count 2>/dev/null) -lt 262144 ]]; then
|
|
||||||
sysctl -w vm.max_map_count=262144 >/dev/null 2>&1
|
|
||||||
echo "vm.max_map_count=262144" >/etc/sysctl.d/graylog.conf
|
|
||||||
fi
|
|
||||||
|
|
||||||
build_container
|
build_container
|
||||||
description
|
description
|
||||||
|
|
||||||
|
|||||||
@@ -46,13 +46,12 @@ function update_script() {
|
|||||||
msg_info "Updating Grist"
|
msg_info "Updating Grist"
|
||||||
mkdir -p /opt/grist/docs
|
mkdir -p /opt/grist/docs
|
||||||
cp -n /opt/grist_bak/.env /opt/grist/.env
|
cp -n /opt/grist_bak/.env /opt/grist/.env
|
||||||
if ls /opt/grist_bak/docs/* &>/dev/null; then
|
|
||||||
cp -r /opt/grist_bak/docs/* /opt/grist/docs/
|
cp -r /opt/grist_bak/docs/* /opt/grist/docs/
|
||||||
fi
|
cp /opt/grist_bak/grist-sessions.db /opt/grist/grist-sessions.db
|
||||||
[[ -f /opt/grist_bak/grist-sessions.db ]] && cp /opt/grist_bak/grist-sessions.db /opt/grist/grist-sessions.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 @@
|
|||||||
___ __
|
|
||||||
/ | ____ _____/ /_ ____ _____
|
|
||||||
/ /| | / __ \/ ___/ __ \/ __ \/ ___/
|
|
||||||
/ ___ |/ / / / /__/ / / / /_/ / /
|
|
||||||
/_/ |_/_/ /_/\___/_/ /_/\____/_/
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
___ _ ___ ____ ____
|
|
||||||
/ | ____ ____ _____(_)_______ / | / __ \/ _/
|
|
||||||
/ /| | / __ \/ __ \/ ___/ / ___/ _ \______/ /| | / /_/ // /
|
|
||||||
/ ___ |/ /_/ / /_/ / / / (__ ) __/_____/ ___ |/ ____// /
|
|
||||||
/_/ |_/ .___/ .___/_/ /_/____/\___/ /_/ |_/_/ /___/
|
|
||||||
/_/ /_/
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
__ __ __ _ __
|
|
||||||
____ ___ __/ /_/ /_ ___ ____ / /_(_) /__
|
|
||||||
/ __ `/ / / / __/ __ \/ _ \/ __ \/ __/ / //_/
|
|
||||||
/ /_/ / /_/ / /_/ / / / __/ / / / /_/ / ,<
|
|
||||||
\__,_/\__,_/\__/_/ /_/\___/_/ /_/\__/_/_/|_|
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ __ __ __
|
|
||||||
/ __ )____ _____ ___ / /_ __ ______/ /___/ /_ __
|
|
||||||
/ __ / __ `/ __ `__ \/ __ \/ / / / __ / __ / / / /
|
|
||||||
/ /_/ / /_/ / / / / / / /_/ / /_/ / /_/ / /_/ / /_/ /
|
|
||||||
/_____/\__,_/_/ /_/ /_/_.___/\__,_/\__,_/\__,_/\__, /
|
|
||||||
/____/
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ _ ___ ______________ ______
|
|
||||||
/ __ )(_)________/ / | / / ____/_ __/ / ____/___
|
|
||||||
/ __ / / ___/ __ / |/ / __/ / /_____/ / __/ __ \
|
|
||||||
/ /_/ / / / / /_/ / /| / /___ / /_____/ /_/ / /_/ /
|
|
||||||
/_____/_/_/ \__,_/_/ |_/_____/ /_/ \____/\____/
|
|
||||||
|
|
||||||
6
ct/headers/booklore
Normal file
6
ct/headers/booklore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ __ __
|
||||||
|
/ __ )____ ____ / /__/ / ____ ________
|
||||||
|
/ __ / __ \/ __ \/ //_/ / / __ \/ ___/ _ \
|
||||||
|
/ /_/ / /_/ / /_/ / ,< / /___/ /_/ / / / __/
|
||||||
|
/_____/\____/\____/_/|_/_____/\____/_/ \___/
|
||||||
|
|
||||||
@@ -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 @@
|
|||||||
__ __ ___ __
|
|
||||||
/ / / /___ ____ ____/ (_) /__
|
|
||||||
/ /_/ / __ \/ __ \/ __ / / //_/
|
|
||||||
/ __ / /_/ / /_/ / /_/ / / ,<
|
|
||||||
/_/ /_/\____/\____/\__,_/_/_/|_|
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
_ ______ __ _ ____
|
|
||||||
(_) ____/___ / /_(_) __/_ __
|
|
||||||
/ / / __/ __ \/ __/ / /_/ / / /
|
|
||||||
/ / /_/ / /_/ / /_/ / __/ /_/ /
|
|
||||||
/_/\____/\____/\__/_/_/ \__, /
|
|
||||||
/____/
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ ________
|
|
||||||
/ _/________ ____ / ____/ /___ __ __
|
|
||||||
/ // ___/ __ \/ __ \/ / / / __ `/ | /| / /
|
|
||||||
_/ // / / /_/ / / / / /___/ / /_/ /| |/ |/ /
|
|
||||||
/___/_/ \____/_/ /_/\____/_/\__,_/ |__/|__/
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user