mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-06-02 21:59:35 +02:00
Compare commits
245 Commits
bump-node
...
pocketbase
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f42110d827 | ||
|
|
cdc428dd60 | ||
|
|
354ceef128 | ||
|
|
1a6dbb0bf8 | ||
|
|
f14eca3bc9 | ||
|
|
d4b4880e0d | ||
|
|
9dc08aa8c1 | ||
|
|
06af8cca46 | ||
|
|
5668ad9a8d | ||
|
|
bd9bae075d | ||
|
|
7cdb6c8133 | ||
|
|
6315547e65 | ||
|
|
e9a9bf17ee | ||
|
|
40b86bef63 | ||
|
|
a43ca27d2f | ||
|
|
ee06ac1819 | ||
|
|
1a63343a17 | ||
|
|
cd8a6f1de0 | ||
|
|
da64475612 | ||
|
|
a2aea34aa7 | ||
|
|
839fba1e0c | ||
|
|
83398645ca | ||
|
|
06cf2ec50d | ||
|
|
bdc968e86d | ||
|
|
0b7d64b240 | ||
|
|
e013403db1 | ||
|
|
465996653a | ||
|
|
6a7391f430 | ||
|
|
aed34659c9 | ||
|
|
cd4a3e854e | ||
|
|
be46da731a | ||
|
|
58179050a8 | ||
|
|
955cb97a3b | ||
|
|
04e618798e | ||
|
|
4c358450d8 | ||
|
|
fa238ddbdd | ||
|
|
0fe653f8de | ||
|
|
278e8315f3 | ||
|
|
ded4bba04d | ||
|
|
5b6f8e2674 | ||
|
|
162cb9b887 | ||
|
|
5776f3fef5 | ||
|
|
26377b7a7f | ||
|
|
151cd6581f | ||
|
|
69641d322d | ||
|
|
6608deeb92 | ||
|
|
de7c00e285 | ||
|
|
eb74ba2edb | ||
|
|
203131d042 | ||
|
|
44db73c58d | ||
|
|
d074d3f292 | ||
|
|
65f3a23cff | ||
|
|
4da4a47eb7 | ||
|
|
cf3d8f902c | ||
|
|
8c0333151b | ||
|
|
dc355d07bf | ||
|
|
4e51373669 | ||
|
|
256020b847 | ||
|
|
19cd2b3dad | ||
|
|
9c06910526 | ||
|
|
d3feeb4900 | ||
|
|
4926d426a8 | ||
|
|
7fea6cc9eb | ||
|
|
b59ab46000 | ||
|
|
d41fd37f1a | ||
|
|
b065c5e081 | ||
|
|
1f9c670648 | ||
|
|
fdfb603930 | ||
|
|
9a05da0b60 | ||
|
|
38a14454c4 | ||
|
|
c3294436b5 | ||
|
|
44a4c97a4c | ||
|
|
8c9477506c | ||
|
|
f7224f3db8 | ||
|
|
03dd5e7e88 | ||
|
|
7b5e2f9656 | ||
|
|
7703edf4b6 | ||
|
|
32f1956023 | ||
|
|
49817d14f8 | ||
|
|
d64b9f6878 | ||
|
|
1fde72e141 | ||
|
|
ceb50e3528 | ||
|
|
287c60bc08 | ||
|
|
9764462f06 | ||
|
|
dc7ea8f526 | ||
|
|
0c8c11f6b4 | ||
|
|
b2bcffbb05 | ||
|
|
6a91a57cb2 | ||
|
|
7e5f7a329e | ||
|
|
80a73c0ec0 | ||
|
|
d9f88aba7f | ||
|
|
8ed57f08bf | ||
|
|
c6dcd986ce | ||
|
|
a36b2c9be7 | ||
|
|
e04a9dc13e | ||
|
|
c6f2c2b7d0 | ||
|
|
f78c2be766 | ||
|
|
edfa7c8c45 | ||
|
|
f378e76329 | ||
|
|
faf073d3b5 | ||
|
|
43fc5c27e1 | ||
|
|
37649c1e0a | ||
|
|
bb5f531761 | ||
|
|
48b34d4c2e | ||
|
|
54e13bca94 | ||
|
|
9aa76e8ea4 | ||
|
|
219c4e80b0 | ||
|
|
35cd953ed7 | ||
|
|
f9f21c1b79 | ||
|
|
62a6122fa6 | ||
|
|
45953e857a | ||
|
|
d984a5828d | ||
|
|
8492ca5805 | ||
|
|
9ec0864d32 | ||
|
|
6a9081726f | ||
|
|
514fece0df | ||
|
|
9c1f80e3c9 | ||
|
|
4dc5dfb366 | ||
|
|
4b2cacf78f | ||
|
|
e5c66aa4d2 | ||
|
|
b00ae8c350 | ||
|
|
7cfa47d138 | ||
|
|
639dc9efc4 | ||
|
|
5bf9cfb800 | ||
|
|
6c7e7ae1af | ||
|
|
a73aefa8fd | ||
|
|
599e841e1a | ||
|
|
cf5db6b687 | ||
|
|
26b1adfbcc | ||
|
|
b97f8b9236 | ||
|
|
de2806ca54 | ||
|
|
a28fec825b | ||
|
|
69aa93a83a | ||
|
|
fcd77d9332 | ||
|
|
202f1c7e84 | ||
|
|
274505536f | ||
|
|
563209cf87 | ||
|
|
465b4ea2a2 | ||
|
|
d7c9065fc8 | ||
|
|
5f0914d32c | ||
|
|
bacdd0b99f | ||
|
|
3a18573a6d | ||
|
|
8b80ab2534 | ||
|
|
fa4fc95a74 | ||
|
|
2fa9ae03a1 | ||
|
|
83859e2219 | ||
|
|
82abeac9fb | ||
|
|
8aca89b8dc | ||
|
|
35953b6d51 | ||
|
|
a80e215262 | ||
|
|
51468821f9 | ||
|
|
2c9f6c5305 | ||
|
|
bc43c262a8 | ||
|
|
0e00444cb9 | ||
|
|
9d0c174de1 | ||
|
|
60d1998765 | ||
|
|
1cdfdea583 | ||
|
|
878b09f5ec | ||
|
|
c17d376aae | ||
|
|
d80d0fb285 | ||
|
|
62b4b5f260 | ||
|
|
56c97cdf80 | ||
|
|
9ac2eda0bb | ||
|
|
f2266d8f53 | ||
|
|
d6af82ff60 | ||
|
|
d38c5ceb56 | ||
|
|
c5aaf72c9b | ||
|
|
f0b1afca69 | ||
|
|
3b142e5dc9 | ||
|
|
b8822e9123 | ||
|
|
a6533d2f2c | ||
|
|
b65bd1a8cb | ||
|
|
2944aa9100 | ||
|
|
afa59595f0 | ||
|
|
ff4a9d423b | ||
|
|
59d4ab70c3 | ||
|
|
7ecb1eb305 | ||
|
|
7076d03ab3 | ||
|
|
c874324f06 | ||
|
|
0cab1f7f89 | ||
|
|
f7432990cf | ||
|
|
39e67bc874 | ||
|
|
4ffa551202 | ||
|
|
0374da39f7 | ||
|
|
ade578edad | ||
|
|
c33dd2ae39 | ||
|
|
3a5f4454e6 | ||
|
|
c9d0196fee | ||
|
|
404463be21 | ||
|
|
5dc2b090d9 | ||
|
|
1c216fc582 | ||
|
|
1e795835fc | ||
|
|
e234f411c7 | ||
|
|
89025c9f28 | ||
|
|
3b308af40a | ||
|
|
1a93de8674 | ||
|
|
ebf755031b | ||
|
|
131a9d60f1 | ||
|
|
f7a69ac92d | ||
|
|
8f1c4a27a6 | ||
|
|
16cc639e1e | ||
|
|
168894e6a9 | ||
|
|
2a86c7e54e | ||
|
|
f16db2d515 | ||
|
|
cf56af0834 | ||
|
|
b05fd7889b | ||
|
|
369f901308 | ||
|
|
0d47f336b0 | ||
|
|
15377bb283 | ||
|
|
6f4cb4e9c9 | ||
|
|
b707d6c05b | ||
|
|
1b285e9b6f | ||
|
|
38b664fa85 | ||
|
|
e8b9d40b92 | ||
|
|
3b3ab1b8f9 | ||
|
|
6b60624b2d | ||
|
|
df37781e9a | ||
|
|
2448723d19 | ||
|
|
cfd9a8132b | ||
|
|
02f5589ff5 | ||
|
|
e68ea29996 | ||
|
|
79926030ae | ||
|
|
4fde0c0427 | ||
|
|
0a81ff53fd | ||
|
|
cd5816b263 | ||
|
|
d18d473583 | ||
|
|
af529716b1 | ||
|
|
2c950db3ac | ||
|
|
904f0bdd3c | ||
|
|
de08fc45d4 | ||
|
|
9e009c1dfd | ||
|
|
03ca1543d9 | ||
|
|
dd5ddb2b40 | ||
|
|
34edee92b2 | ||
|
|
355826a528 | ||
|
|
a4bfe6a8e2 | ||
|
|
506c729667 | ||
|
|
9aee7bcbf4 | ||
|
|
251df84840 | ||
|
|
5a1053fe08 | ||
|
|
757acde352 | ||
|
|
1c7a925b31 | ||
|
|
ce12ac0f71 | ||
|
|
8d706791ea | ||
|
|
3edaa3e3f2 |
12
.github/ISSUE_TEMPLATE/bug_report.yml
generated
vendored
12
.github/ISSUE_TEMPLATE/bug_report.yml
generated
vendored
@@ -79,6 +79,18 @@ body:
|
|||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: host_arm64
|
||||||
|
attributes:
|
||||||
|
label: 🧱 Is this Proxmox host running arm64?
|
||||||
|
description: "Run `dpkg --print-architecture` on your Proxmox host if unsure."
|
||||||
|
options:
|
||||||
|
- ""
|
||||||
|
- "No"
|
||||||
|
- "Yes"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
- type: input
|
- type: input
|
||||||
id: pve_version
|
id: pve_version
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
389
.github/changelogs/2026/05.md
generated
vendored
389
.github/changelogs/2026/05.md
generated
vendored
@@ -1,3 +1,392 @@
|
|||||||
|
## 2026-05-30
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Flatnotes: fix empty package name in pyproject.toml [@MickLesk](https://github.com/MickLesk) ([#14814](https://github.com/community-scripts/ProxmoxVE/pull/14814))
|
||||||
|
|
||||||
|
## 2026-05-29
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Kan ([#14776](https://github.com/community-scripts/ProxmoxVE/pull/14776))
|
||||||
|
- Dynacat ([#14777](https://github.com/community-scripts/ProxmoxVE/pull/14777))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Fix lobehub docker path [@dannyyy](https://github.com/dannyyy) ([#14793](https://github.com/community-scripts/ProxmoxVE/pull/14793))
|
||||||
|
- karakeep: add more hdd space [@MickLesk](https://github.com/MickLesk) ([#14797](https://github.com/community-scripts/ProxmoxVE/pull/14797))
|
||||||
|
- Grist: Revert installation of EE [@tremor021](https://github.com/tremor021) ([#14784](https://github.com/community-scripts/ProxmoxVE/pull/14784))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Sure: Remove `$STD` for `systemctl enable -q` [@tremor021](https://github.com/tremor021) ([#14801](https://github.com/community-scripts/ProxmoxVE/pull/14801))
|
||||||
|
|
||||||
|
## 2026-05-28
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- RomM: remove nginx default.conf during installation [@MickLesk](https://github.com/MickLesk) ([#14766](https://github.com/community-scripts/ProxmoxVE/pull/14766))
|
||||||
|
- Open-Archiver: replace pnpm approve-builds --yes with --all [@MickLesk](https://github.com/MickLesk) ([#14765](https://github.com/community-scripts/ProxmoxVE/pull/14765))
|
||||||
|
- fix(hermesagent): set npm_config_yes=true to suppress interactive pro… [@steveonjava](https://github.com/steveonjava) ([#14763](https://github.com/community-scripts/ProxmoxVE/pull/14763))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Yamtrack: migrate to uv [@MickLesk](https://github.com/MickLesk) ([#14767](https://github.com/community-scripts/ProxmoxVE/pull/14767))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- chore(ct): sync adventurelog defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#14772](https://github.com/community-scripts/ProxmoxVE/pull/14772))
|
||||||
|
|
||||||
|
## 2026-05-27
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- MusicSeerr ([#14746](https://github.com/community-scripts/ProxmoxVE/pull/14746))
|
||||||
|
- Hermes Agent ([#14751](https://github.com/community-scripts/ProxmoxVE/pull/14751))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- grist: restore install:ee step [@paulfitz](https://github.com/paulfitz) ([#14759](https://github.com/community-scripts/ProxmoxVE/pull/14759))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [tools.func]: `setup_gs()` fix getting dotted release format [@tremor021](https://github.com/tremor021) ([#14745](https://github.com/community-scripts/ProxmoxVE/pull/14745))
|
||||||
|
|
||||||
|
## 2026-05-26
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Add directory creation to Profilarr update script [@ryansully](https://github.com/ryansully) ([#14740](https://github.com/community-scripts/ProxmoxVE/pull/14740))
|
||||||
|
- profilarr: Fix ARCH assignment in profilarr.sh to support Profilarr build usage [@mpeleshenko](https://github.com/mpeleshenko) ([#14709](https://github.com/community-scripts/ProxmoxVE/pull/14709))
|
||||||
|
- Jackett: Remove quotes in Service File [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14729](https://github.com/community-scripts/ProxmoxVE/pull/14729))
|
||||||
|
- Open-archiver: approve pnpm build scripts and run build:oss without subshell [@MickLesk](https://github.com/MickLesk) ([#14711](https://github.com/community-scripts/ProxmoxVE/pull/14711))
|
||||||
|
- Docuseal: read Ruby version from Gemfile, upgrade on update if needed [@MickLesk](https://github.com/MickLesk) ([#14715](https://github.com/community-scripts/ProxmoxVE/pull/14715))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Birdnet-GO: install libonnxruntime.so from release tarball [@MickLesk](https://github.com/MickLesk) ([#14716](https://github.com/community-scripts/ProxmoxVE/pull/14716))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: better error diagnostics, consistent OS detection, setup function ordering [@MickLesk](https://github.com/MickLesk) ([#14692](https://github.com/community-scripts/ProxmoxVE/pull/14692))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- IPTag-Tool: use qm set for VM tags to handle snapshot sections crrectly [@MickLesk](https://github.com/MickLesk) ([#14713](https://github.com/community-scripts/ProxmoxVE/pull/14713))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Netdata: extend PVE version support to 9.x [@MickLesk](https://github.com/MickLesk) ([#14714](https://github.com/community-scripts/ProxmoxVE/pull/14714))
|
||||||
|
|
||||||
|
## 2026-05-25
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- karakeep: fix: pip config [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14703](https://github.com/community-scripts/ProxmoxVE/pull/14703))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: replace raw GitHub API curl calls with get_latest_github_release [@MickLesk](https://github.com/MickLesk) ([#14690](https://github.com/community-scripts/ProxmoxVE/pull/14690))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Kernel-Clean: detect meta-packages and fix silent removal failures [@MickLesk](https://github.com/MickLesk) ([#14674](https://github.com/community-scripts/ProxmoxVE/pull/14674))
|
||||||
|
|
||||||
|
## 2026-05-24
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- RomM: add installation steps for Nginx mod_zip module [@MickLesk](https://github.com/MickLesk) ([#14678](https://github.com/community-scripts/ProxmoxVE/pull/14678))
|
||||||
|
- ISponsorblockTV: detect CPU capabilities to select compatible binary [@MickLesk](https://github.com/MickLesk) ([#14677](https://github.com/community-scripts/ProxmoxVE/pull/14677))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: MQTT [@tremor021](https://github.com/tremor021) ([#14673](https://github.com/community-scripts/ProxmoxVE/pull/14673))
|
||||||
|
|
||||||
|
## 2026-05-23
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- IronClaw: Extra configuration during install to ensure Web Gateway can run [@SystemIdleProcess](https://github.com/SystemIdleProcess) ([#14635](https://github.com/community-scripts/ProxmoxVE/pull/14635))
|
||||||
|
- Tunarr: fix path to backup during update [@SystemIdleProcess](https://github.com/SystemIdleProcess) ([#14655](https://github.com/community-scripts/ProxmoxVE/pull/14655))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- wealthfolio: add: prebuild [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14658](https://github.com/community-scripts/ProxmoxVE/pull/14658))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- kernel-clean: support range syntax in selection prompt [@djhojd](https://github.com/djhojd) ([#14656](https://github.com/community-scripts/ProxmoxVE/pull/14656))
|
||||||
|
|
||||||
|
## 2026-05-22
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- bitfocus-companion ([#14603](https://github.com/community-scripts/ProxmoxVE/pull/14603))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix(the-lounge): install Node.js 22 before deb package [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14648](https://github.com/community-scripts/ProxmoxVE/pull/14648))
|
||||||
|
- Docmost: Fix duplicate STORAGE_DRIVER [@MickLesk](https://github.com/MickLesk) ([#14645](https://github.com/community-scripts/ProxmoxVE/pull/14645))
|
||||||
|
- Profilarr: pin Deno version to v2.7.5 [@MickLesk](https://github.com/MickLesk) ([#14632](https://github.com/community-scripts/ProxmoxVE/pull/14632))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- add: karakeep cli wrapper [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14618](https://github.com/community-scripts/ProxmoxVE/pull/14618))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- OpenCloud: v7.0.0 changes [@vhsdream](https://github.com/vhsdream) ([#14650](https://github.com/community-scripts/ProxmoxVE/pull/14650))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- workflows: update workflows, templates to support arm64. [@asylumexp](https://github.com/asylumexp) ([#14653](https://github.com/community-scripts/ProxmoxVE/pull/14653))
|
||||||
|
- SoulSync: setup Node v22 and build WebUI [@MickLesk](https://github.com/MickLesk) ([#14639](https://github.com/community-scripts/ProxmoxVE/pull/14639))
|
||||||
|
- Refactor: Dispatcharr [@MickLesk](https://github.com/MickLesk) ([#14313](https://github.com/community-scripts/ProxmoxVE/pull/14313))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: make LXC banner OS detection dynamic via /etc/os-release [@atahan99](https://github.com/atahan99) ([#14269](https://github.com/community-scripts/ProxmoxVE/pull/14269))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: suppress MOTD for non-interactive shells [@MickLesk](https://github.com/MickLesk) ([#14638](https://github.com/community-scripts/ProxmoxVE/pull/14638))
|
||||||
|
|
||||||
|
## 2026-05-21
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- snowshare: use mv instead of cp for uploads backup to prevent disk fill [@TuroYT](https://github.com/TuroYT) ([#14558](https://github.com/community-scripts/ProxmoxVE/pull/14558))
|
||||||
|
- Technitium DNS: download release before stopping the service on update [@w-gitops](https://github.com/w-gitops) ([#14616](https://github.com/community-scripts/ProxmoxVE/pull/14616))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Proxmox VE 9.2 support [@MickLesk](https://github.com/MickLesk) ([#14624](https://github.com/community-scripts/ProxmoxVE/pull/14624))
|
||||||
|
|
||||||
|
## 2026-05-20
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Update mylar3 to point to new Repo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14606](https://github.com/community-scripts/ProxmoxVE/pull/14606))
|
||||||
|
- Ollama: Fix for latest version [@tremor021](https://github.com/tremor021) ([#14596](https://github.com/community-scripts/ProxmoxVE/pull/14596))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Profilarr v2: Update and Refactor whole Script [@MickLesk](https://github.com/MickLesk) ([#14584](https://github.com/community-scripts/ProxmoxVE/pull/14584))
|
||||||
|
|
||||||
|
## 2026-05-19
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- LobeHub ([#14441](https://github.com/community-scripts/ProxmoxVE/pull/14441))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Update nodejs Versions [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14582](https://github.com/community-scripts/ProxmoxVE/pull/14582))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- ESPConnect: Fix paths to SSL certificates [@tremor021](https://github.com/tremor021) ([#14591](https://github.com/community-scripts/ProxmoxVE/pull/14591))
|
||||||
|
- ReactiveResume: set correct WorkingDirectory for systemd service [@MickLesk](https://github.com/MickLesk) ([#14579](https://github.com/community-scripts/ProxmoxVE/pull/14579))
|
||||||
|
- Sparkyfitness: add missing nginx template variable substitutions [@MickLesk](https://github.com/MickLesk) ([#14578](https://github.com/community-scripts/ProxmoxVE/pull/14578))
|
||||||
|
- Wanderer: include dev dependencies during build [@MickLesk](https://github.com/MickLesk) ([#14577](https://github.com/community-scripts/ProxmoxVE/pull/14577))
|
||||||
|
- Whisparr: switch from nightly to stable GitHub release [@MickLesk](https://github.com/MickLesk) ([#14581](https://github.com/community-scripts/ProxmoxVE/pull/14581))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: SonarQube [@tremor021](https://github.com/tremor021) ([#14594](https://github.com/community-scripts/ProxmoxVE/pull/14594))
|
||||||
|
|
||||||
|
## 2026-05-18
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- ESPconnect ([#14444](https://github.com/community-scripts/ProxmoxVE/pull/14444))
|
||||||
|
- degoog ([#14533](https://github.com/community-scripts/ProxmoxVE/pull/14533))
|
||||||
|
- Webtrees ([#14532](https://github.com/community-scripts/ProxmoxVE/pull/14532))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Bichon: Support v1 migration [@tomfrenzel](https://github.com/tomfrenzel) ([#14524](https://github.com/community-scripts/ProxmoxVE/pull/14524))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Pangolin: bump to 1.18.4, fix missing statusHistory migration [@MickLesk](https://github.com/MickLesk) ([#14566](https://github.com/community-scripts/ProxmoxVE/pull/14566))
|
||||||
|
|
||||||
|
## 2026-05-17
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- dashy: fix yarn-missing on update and back up full user-data [@lissy93](https://github.com/lissy93) ([#14548](https://github.com/community-scripts/ProxmoxVE/pull/14548))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: replace max-time with speed-limit stall detection in curl_download [@MickLesk](https://github.com/MickLesk) ([#14545](https://github.com/community-scripts/ProxmoxVE/pull/14545))
|
||||||
|
|
||||||
|
## 2026-05-16
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Homelable: replace passlib with bcrypt for password hashing [@MickLesk](https://github.com/MickLesk) ([#14530](https://github.com/community-scripts/ProxmoxVE/pull/14530))
|
||||||
|
- dashy: fix: restore [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14527](https://github.com/community-scripts/ProxmoxVE/pull/14527))
|
||||||
|
- Update Tinyauth source URL in installation script [@MehrunesSky](https://github.com/MehrunesSky) ([#14483](https://github.com/community-scripts/ProxmoxVE/pull/14483))
|
||||||
|
- Excalidraw: Fix build [@tremor021](https://github.com/tremor021) ([#14509](https://github.com/community-scripts/ProxmoxVE/pull/14509))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Update authentik version to 2026.2.3 [@thieneret](https://github.com/thieneret) ([#14517](https://github.com/community-scripts/ProxmoxVE/pull/14517))
|
||||||
|
|
||||||
|
## 2026-05-15
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- OPNsense: replace undefined msg_warn with inline echo in alloc retry [@MickLesk](https://github.com/MickLesk) ([#14500](https://github.com/community-scripts/ProxmoxVE/pull/14500))
|
||||||
|
- Checkmk: detect OMD version suffix dynamically on update [@MickLesk](https://github.com/MickLesk) ([#14496](https://github.com/community-scripts/ProxmoxVE/pull/14496))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- SearXNG: enable JSON format by default for API integrations [@MickLesk](https://github.com/MickLesk) ([#14498](https://github.com/community-scripts/ProxmoxVE/pull/14498))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Ollama use tools.func [@MickLesk](https://github.com/MickLesk) ([#14501](https://github.com/community-scripts/ProxmoxVE/pull/14501))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: fall back to silent mode when no TTY or whiptail unavailable [@MickLesk](https://github.com/MickLesk) ([#14497](https://github.com/community-scripts/ProxmoxVE/pull/14497))
|
||||||
|
|
||||||
|
## 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
|
## 2026-05-09
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
46
.github/workflows/check-node-versions.yml
generated
vendored
46
.github/workflows/check-node-versions.yml
generated
vendored
@@ -49,18 +49,26 @@ jobs:
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local url="https://pkgs.alpinelinux.org/package/v${alpine_ver}/main/x86_64/nodejs"
|
|
||||||
local page
|
|
||||||
page=$(curl -sf "$url" 2>/dev/null || echo "")
|
|
||||||
local full_ver=""
|
local full_ver=""
|
||||||
if [[ -n "$page" ]]; then
|
local arch_label url_arch url page
|
||||||
# Parse: "Version | 24.13.0-r1" or similar table row
|
for arch_pair in "amd64:x86_64" "arm64:aarch64"; do
|
||||||
full_ver=$(echo "$page" | grep -oP 'Version\s*\|\s*\K[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
arch_label="${arch_pair%%:*}"
|
||||||
if [[ -z "$full_ver" ]]; then
|
url_arch="${arch_pair#*:}"
|
||||||
# Fallback: look for version pattern after "Version"
|
url="https://pkgs.alpinelinux.org/package/v${alpine_ver}/main/${url_arch}/nodejs"
|
||||||
full_ver=$(echo "$page" | grep -oP '(?<=Version</td><td>)[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
page=$(curl -sf "$url" 2>/dev/null || echo "")
|
||||||
|
if [[ -n "$page" ]]; then
|
||||||
|
# Parse: "Version | 24.13.0-r1" or similar table row.
|
||||||
|
full_ver=$(echo "$page" | grep -oP 'Version\s*\|\s*\K[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
||||||
|
if [[ -z "$full_ver" ]]; then
|
||||||
|
# Fallback: look for version pattern after "Version".
|
||||||
|
full_ver=$(echo "$page" | grep -oP '(?<=Version</td><td>)[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
if [[ -n "$full_ver" ]]; then
|
||||||
|
echo "Resolved Alpine ${alpine_ver} nodejs via ${arch_label}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
local major=""
|
local major=""
|
||||||
if [[ -n "$full_ver" ]]; then
|
if [[ -n "$full_ver" ]]; then
|
||||||
@@ -328,14 +336,18 @@ jobs:
|
|||||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||||
drift_count=$((drift_count + 1))
|
drift_count=$((drift_count + 1))
|
||||||
elif [[ -n "$upstream_major" && "$our_version" != "$upstream_major" ]]; then
|
elif [[ -n "$upstream_major" && "$our_version" != "$upstream_major" ]]; then
|
||||||
# Check if engines.node is a minimum constraint that our version satisfies
|
if (( our_version < upstream_major )); then
|
||||||
if [[ -z "$DF_NODE_MAJOR" && "$ENGINES_IS_MINIMUM" == "true" ]] && \
|
# Check if engines.node is a minimum constraint that our version satisfies
|
||||||
version_satisfies_engines "$our_version" "$ENGINES_MIN_MAJOR" "$ENGINES_IS_MINIMUM"; then
|
if [[ -z "$DF_NODE_MAJOR" && "$ENGINES_IS_MINIMUM" == "true" ]] && \
|
||||||
status="✅ (engines: $ENGINES_NODE_RAW — ours: $our_version satisfies)"
|
version_satisfies_engines "$our_version" "$ENGINES_MIN_MAJOR" "$ENGINES_IS_MINIMUM"; then
|
||||||
|
status="✅ (engines: $ENGINES_NODE_RAW — ours: $our_version satisfies)"
|
||||||
|
else
|
||||||
|
status="🔸 Drift → upstream=$upstream_major ($upstream_hint)"
|
||||||
|
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||||
|
drift_count=$((drift_count + 1))
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
status="🔸 Drift → upstream=$upstream_major ($upstream_hint)"
|
status="✅ Ahead of upstream ($upstream_major via $upstream_hint)"
|
||||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
|
||||||
drift_count=$((drift_count + 1))
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
71
.github/workflows/close-new-script-prs.yml
generated
vendored
71
.github/workflows/close-new-script-prs.yml
generated
vendored
@@ -3,7 +3,7 @@ name: Close Unauthorized New Script PRs
|
|||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
types: [opened, labeled]
|
types: [opened, labeled, reopened, synchronize]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-new-script:
|
check-new-script:
|
||||||
@@ -24,13 +24,6 @@ jobs:
|
|||||||
const owner = context.repo.owner;
|
const owner = context.repo.owner;
|
||||||
const repo = context.repo.repo;
|
const repo = context.repo.repo;
|
||||||
|
|
||||||
// --- Only act on PRs with the "new script" label ---
|
|
||||||
const labels = pr.labels.map(l => l.name);
|
|
||||||
if (!labels.includes("new script")) {
|
|
||||||
core.info(`PR #${prNumber} does not have "new script" label — skipping.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Allow our bots ---
|
// --- Allow our bots ---
|
||||||
const allowedBots = [
|
const allowedBots = [
|
||||||
"push-app-to-main[bot]",
|
"push-app-to-main[bot]",
|
||||||
@@ -42,38 +35,40 @@ jobs:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Check if author is a member of the contributor team ---
|
// --- Exempt contributors via author_association ---
|
||||||
const teamSlug = "contributor";
|
// OWNER/MEMBER/COLLABORATOR are trusted; CONTRIBUTOR ("has merged before")
|
||||||
let isMember = false;
|
// and NONE are not — their new-script PRs are still closed.
|
||||||
|
const association = pr.author_association;
|
||||||
try {
|
const exempt = ["OWNER", "MEMBER", "COLLABORATOR"];
|
||||||
const { status } = await github.rest.teams.getMembershipForUserInOrg({
|
if (exempt.includes(association)) {
|
||||||
org: owner,
|
core.info(`PR #${prNumber} by ${association} "${author}" — skipping.`);
|
||||||
team_slug: teamSlug,
|
return;
|
||||||
username: author,
|
|
||||||
});
|
|
||||||
// status 200 means the user is a member (active or pending)
|
|
||||||
isMember = true;
|
|
||||||
} catch (error) {
|
|
||||||
if (error.status === 404) {
|
|
||||||
isMember = false;
|
|
||||||
} else {
|
|
||||||
core.warning(`Could not check team membership for ${author}: ${error.message}`);
|
|
||||||
// Fallback: check org membership
|
|
||||||
try {
|
|
||||||
await github.rest.orgs.checkMembershipForUser({
|
|
||||||
org: owner,
|
|
||||||
username: author,
|
|
||||||
});
|
|
||||||
isMember = true;
|
|
||||||
} catch {
|
|
||||||
isMember = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMember) {
|
// --- Detect a new-script PR: "new script" label OR a newly-added
|
||||||
core.info(`PR #${prNumber} by contributor "${author}" — skipping.`);
|
// script file under ct/ install/ turnkey/ vm/ (mirrors
|
||||||
|
// autolabeler-config.json). Removes the label-timing dependency. ---
|
||||||
|
const labels = pr.labels.map(l => l.name);
|
||||||
|
const hasNewScriptLabel = labels.includes("new script");
|
||||||
|
|
||||||
|
const scriptPrefixes = ["ct/", "install/", "turnkey/", "vm/"];
|
||||||
|
let hasAddedScriptFile = false;
|
||||||
|
try {
|
||||||
|
const files = await github.paginate(github.rest.pulls.listFiles, {
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
pull_number: prNumber,
|
||||||
|
per_page: 100,
|
||||||
|
});
|
||||||
|
hasAddedScriptFile = files.some(
|
||||||
|
f => f.status === "added" && scriptPrefixes.some(p => f.filename.startsWith(p))
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
core.warning(`Could not list files for PR #${prNumber}: ${error.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasNewScriptLabel && !hasAddedScriptFile) {
|
||||||
|
core.info(`PR #${prNumber} is not a new-script submission (no label, no added script file) — skipping.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
71
.github/workflows/close_issue_in_dev.yaml
generated
vendored
71
.github/workflows/close_issue_in_dev.yaml
generated
vendored
@@ -56,46 +56,57 @@ jobs:
|
|||||||
echo "$slugs" > pocketbase_slugs.txt
|
echo "$slugs" > pocketbase_slugs.txt
|
||||||
echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT"
|
echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Search for Issues with Similar Titles
|
- name: Find matching issues in ProxmoxVED by slug
|
||||||
id: find_issue
|
id: find_issue
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
issues=$(gh issue list --repo community-scripts/ProxmoxVED --json number,title --jq '.[] | {number, title}')
|
if [[ ! -s pocketbase_slugs.txt ]]; then
|
||||||
|
echo "No slugs derived from PR — nothing to match."
|
||||||
best_match_score=0
|
echo "issue_numbers=" >> "$GITHUB_OUTPUT"
|
||||||
best_match_number=0
|
|
||||||
|
|
||||||
for issue in $(echo "$issues" | jq -r '. | @base64'); do
|
|
||||||
_jq() {
|
|
||||||
echo ${issue} | base64 --decode | jq -r ${1}
|
|
||||||
}
|
|
||||||
|
|
||||||
issue_title=$(_jq '.title' | tr '[:upper:]' '[:lower:]' | sed 's/ //g' | sed 's/-//g')
|
|
||||||
issue_number=$(_jq '.number')
|
|
||||||
|
|
||||||
match_score=$(echo "$title" | grep -o "$issue_title" | wc -l)
|
|
||||||
|
|
||||||
if [ "$match_score" -gt "$best_match_score" ]; then
|
|
||||||
best_match_score=$match_score
|
|
||||||
best_match_number=$issue_number
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$best_match_number" != "0" ]; then
|
|
||||||
echo "issue_number=$best_match_number" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "No matching issue found."
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
slugs=$(cat pocketbase_slugs.txt)
|
||||||
|
|
||||||
- name: Comment on the Best-Matching Issue and Close It
|
# Normalize: lowercase, strip spaces and hyphens (same shape as the slug derivation)
|
||||||
if: env.issue_number != ''
|
norm() { echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[[:space:]]//g; s/-//g'; }
|
||||||
|
|
||||||
|
issues=$(gh issue list --repo community-scripts/ProxmoxVED --state open --limit 1000 --json number,title,body)
|
||||||
|
|
||||||
|
matched=""
|
||||||
|
for slug in $slugs; do
|
||||||
|
nslug=$(norm "$slug")
|
||||||
|
[[ -z "$nslug" ]] && continue
|
||||||
|
while IFS= read -r row; do
|
||||||
|
num=$(echo "$row" | jq -r '.number')
|
||||||
|
ntitle=$(norm "$(echo "$row" | jq -r '.title')")
|
||||||
|
body=$(echo "$row" | jq -r '.body // ""' | tr '[:upper:]' '[:lower:]')
|
||||||
|
# Match when the issue title contains the slug, or the body mentions it verbatim
|
||||||
|
if [[ "$ntitle" == *"$nslug"* ]] || [[ "$body" == *"$slug"* ]]; then
|
||||||
|
matched="$matched $num"
|
||||||
|
fi
|
||||||
|
done < <(echo "$issues" | jq -c '.[]')
|
||||||
|
done
|
||||||
|
|
||||||
|
matched=$(echo $matched | xargs -n1 2>/dev/null | sort -un | tr '\n' ' ')
|
||||||
|
if [[ -z "$matched" ]]; then
|
||||||
|
echo "No matching ProxmoxVED issues found for slugs: $slugs"
|
||||||
|
echo "issue_numbers=" >> "$GITHUB_OUTPUT"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo "Matched ProxmoxVED issues: $matched"
|
||||||
|
echo "issue_numbers=$matched" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Comment on and close matching ProxmoxVED issues
|
||||||
|
if: steps.find_issue.outputs.issue_numbers != ''
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.PAT_MICHEL }}
|
GH_TOKEN: ${{ secrets.PAT_MICHEL }}
|
||||||
run: |
|
run: |
|
||||||
gh issue comment $issue_number --repo community-scripts/ProxmoxVED --body "Merged with #${{ github.event.pull_request.number }} in ProxmoxVE"
|
for issue_number in ${{ steps.find_issue.outputs.issue_numbers }}; do
|
||||||
gh issue close $issue_number --repo community-scripts/ProxmoxVED
|
echo "Closing ProxmoxVED issue #$issue_number"
|
||||||
|
gh issue comment "$issue_number" --repo community-scripts/ProxmoxVED --body "Merged with #${{ github.event.pull_request.number }} in ProxmoxVE"
|
||||||
|
gh issue close "$issue_number" --repo community-scripts/ProxmoxVED
|
||||||
|
done
|
||||||
|
|
||||||
- name: Set is_dev to false in PocketBase
|
- name: Set is_dev to false in PocketBase
|
||||||
if: steps.get_slugs.outputs.count != '0'
|
if: steps.get_slugs.outputs.count != '0'
|
||||||
|
|||||||
4
.github/workflows/lock-issue.yaml
generated
vendored
4
.github/workflows/lock-issue.yaml
generated
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const daysBeforeLock = 3;
|
const daysBeforeLock = 7;
|
||||||
const lockDate = new Date();
|
const lockDate = new Date();
|
||||||
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
/dependabot/i
|
/dependabot/i
|
||||||
];
|
];
|
||||||
|
|
||||||
// Search for closed, unlocked issues older than 3 days (paginated, oldest first)
|
// Search for closed, unlocked issues older than 7 days (paginated, oldest first)
|
||||||
let page = 1;
|
let page = 1;
|
||||||
let totalLocked = 0;
|
let totalLocked = 0;
|
||||||
|
|
||||||
|
|||||||
610
.github/workflows/pocketbase-ai-bot.yml
generated
vendored
Normal file
610
.github/workflows/pocketbase-ai-bot.yml
generated
vendored
Normal file
@@ -0,0 +1,610 @@
|
|||||||
|
name: PocketBase AI Bot
|
||||||
|
|
||||||
|
# Natural-language companion to pocketbase-bot.yml.
|
||||||
|
# Mention the bot in plain English, e.g.:
|
||||||
|
# @pocketbase-bot change RAM to 4096 on zigbee2mqtt
|
||||||
|
# @pocketbase-bot disable script Nextcloud because upstream is broken
|
||||||
|
# The bot parses the request with GitHub Models, replies with the exact change(s)
|
||||||
|
# it understood, and only applies them after you reply "@pocketbase-bot confirm".
|
||||||
|
# The slash-command bot (/pocketbase ...) is unaffected; triggers do not overlap.
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
models: read # lets the built-in GITHUB_TOKEN call GitHub Models inference
|
||||||
|
contents: write # built-in token opens the CT-defaults sync PR (like the slash bot)
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ai-bot:
|
||||||
|
runs-on: self-hosted
|
||||||
|
# Broad gate; the script does precise keyword + self-author checks.
|
||||||
|
if: contains(github.event.comment.body, '@pocketbase-bot')
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Mint GitHub App token (bot identity)
|
||||||
|
id: app-token
|
||||||
|
uses: actions/create-github-app-token@v1
|
||||||
|
with:
|
||||||
|
app-id: ${{ secrets.PB_BOT_APP_ID }}
|
||||||
|
private-key: ${{ secrets.PB_BOT_APP_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- name: Run PocketBase AI bot
|
||||||
|
env:
|
||||||
|
# GitHub REST as the bot identity
|
||||||
|
GH_APP_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||||
|
PB_BOT_APP_ID: ${{ secrets.PB_BOT_APP_ID }}
|
||||||
|
# GitHub Models inference uses the built-in token (needs models: read)
|
||||||
|
MODELS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# Built-in token for git/PR ops (CT-defaults sync), mirroring the slash bot
|
||||||
|
GH_DEFAULT_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
AI_MODEL: openai/gpt-4o
|
||||||
|
# PocketBase
|
||||||
|
POCKETBASE_URL: ${{ secrets.POCKETBASE_URL }}
|
||||||
|
POCKETBASE_COLLECTION: ${{ secrets.POCKETBASE_COLLECTION }}
|
||||||
|
POCKETBASE_ADMIN_EMAIL: ${{ secrets.POCKETBASE_ADMIN_EMAIL }}
|
||||||
|
POCKETBASE_ADMIN_PASSWORD: ${{ secrets.POCKETBASE_ADMIN_PASSWORD }}
|
||||||
|
FRONTEND_URL: ${{ secrets.FRONTEND_URL }}
|
||||||
|
REVALIDATE_SECRET: ${{ secrets.REVALIDATE_SECRET }}
|
||||||
|
# Event context
|
||||||
|
COMMENT_BODY: ${{ github.event.comment.body }}
|
||||||
|
COMMENT_ID: ${{ github.event.comment.id }}
|
||||||
|
COMMENT_AUTHOR_TYPE: ${{ github.event.comment.user.type }}
|
||||||
|
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||||
|
REPO_OWNER: ${{ github.repository_owner }}
|
||||||
|
REPO_NAME: ${{ github.event.repository.name }}
|
||||||
|
ACTOR: ${{ github.event.comment.user.login }}
|
||||||
|
ACTOR_ASSOCIATION: ${{ github.event.comment.author_association }}
|
||||||
|
run: |
|
||||||
|
node << 'ENDSCRIPT'
|
||||||
|
(async function () {
|
||||||
|
const https = require('https');
|
||||||
|
const http = require('http');
|
||||||
|
const url = require('url');
|
||||||
|
|
||||||
|
// ── HTTP helper with redirect following ────────────────────────────
|
||||||
|
function request(fullUrl, opts, redirectCount) {
|
||||||
|
redirectCount = redirectCount || 0;
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
const u = url.parse(fullUrl);
|
||||||
|
const isHttps = u.protocol === 'https:';
|
||||||
|
const body = opts.body;
|
||||||
|
const options = {
|
||||||
|
hostname: u.hostname,
|
||||||
|
port: u.port || (isHttps ? 443 : 80),
|
||||||
|
path: u.path,
|
||||||
|
method: opts.method || 'GET',
|
||||||
|
headers: opts.headers || {}
|
||||||
|
};
|
||||||
|
if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
|
||||||
|
const lib = isHttps ? https : http;
|
||||||
|
const req = lib.request(options, function (res) {
|
||||||
|
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
||||||
|
if (redirectCount >= 5) return reject(new Error('Too many redirects from ' + fullUrl));
|
||||||
|
const redirectUrl = url.resolve(fullUrl, res.headers.location);
|
||||||
|
res.resume();
|
||||||
|
resolve(request(redirectUrl, opts, redirectCount + 1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let data = '';
|
||||||
|
res.on('data', function (chunk) { data += chunk; });
|
||||||
|
res.on('end', function () {
|
||||||
|
resolve({ ok: res.statusCode >= 200 && res.statusCode < 300, statusCode: res.statusCode, body: data });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
req.on('error', reject);
|
||||||
|
if (body) req.write(body);
|
||||||
|
req.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── GitHub REST (as the bot app) ───────────────────────────────────
|
||||||
|
const owner = process.env.REPO_OWNER;
|
||||||
|
const repo = process.env.REPO_NAME;
|
||||||
|
const issueNumber = parseInt(process.env.ISSUE_NUMBER, 10);
|
||||||
|
const commentId = parseInt(process.env.COMMENT_ID, 10);
|
||||||
|
const actor = process.env.ACTOR;
|
||||||
|
|
||||||
|
function ghRequest(path, method, body) {
|
||||||
|
const headers = {
|
||||||
|
'Authorization': 'Bearer ' + process.env.GH_APP_TOKEN,
|
||||||
|
'Accept': 'application/vnd.github+json',
|
||||||
|
'X-GitHub-Api-Version': '2022-11-28',
|
||||||
|
'User-Agent': 'PocketBase-AI-Bot'
|
||||||
|
};
|
||||||
|
const bodyStr = body ? JSON.stringify(body) : undefined;
|
||||||
|
if (bodyStr) headers['Content-Type'] = 'application/json';
|
||||||
|
return request('https://api.github.com' + path, { method: method || 'GET', headers, body: bodyStr });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same as ghRequest but authenticated with the built-in GITHUB_TOKEN.
|
||||||
|
// Used for the CT-defaults sync branch/PR (the App token lacks contents:write).
|
||||||
|
function ghDefault(path, method, body) {
|
||||||
|
const headers = {
|
||||||
|
'Authorization': 'Bearer ' + process.env.GH_DEFAULT_TOKEN,
|
||||||
|
'Accept': 'application/vnd.github+json',
|
||||||
|
'X-GitHub-Api-Version': '2022-11-28',
|
||||||
|
'User-Agent': 'PocketBase-AI-Bot'
|
||||||
|
};
|
||||||
|
const bodyStr = body ? JSON.stringify(body) : undefined;
|
||||||
|
if (bodyStr) headers['Content-Type'] = 'application/json';
|
||||||
|
return request('https://api.github.com' + path, { method: method || 'GET', headers, body: bodyStr });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function addReaction(content) {
|
||||||
|
try {
|
||||||
|
await ghRequest('/repos/' + owner + '/' + repo + '/issues/comments/' + commentId + '/reactions', 'POST', { content });
|
||||||
|
} catch (e) { console.warn('Could not add reaction:', e.message); }
|
||||||
|
}
|
||||||
|
async function postComment(text) {
|
||||||
|
const res = await ghRequest('/repos/' + owner + '/' + repo + '/issues/' + issueNumber + '/comments', 'POST', { body: text });
|
||||||
|
if (!res.ok) console.warn('Could not post comment:', res.body);
|
||||||
|
return res.ok ? JSON.parse(res.body) : null;
|
||||||
|
}
|
||||||
|
async function updateComment(id, text) {
|
||||||
|
const res = await ghRequest('/repos/' + owner + '/' + repo + '/issues/comments/' + id, 'PATCH', { body: text });
|
||||||
|
if (!res.ok) console.warn('Could not update comment:', res.body);
|
||||||
|
}
|
||||||
|
async function listIssueComments() {
|
||||||
|
const all = [];
|
||||||
|
let page = 1;
|
||||||
|
while (page <= 10) {
|
||||||
|
const res = await ghRequest('/repos/' + owner + '/' + repo + '/issues/' + issueNumber + '/comments?per_page=100&page=' + page);
|
||||||
|
if (!res.ok) break;
|
||||||
|
const batch = JSON.parse(res.body);
|
||||||
|
all.push.apply(all, batch);
|
||||||
|
if (batch.length < 100) break;
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
return all;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 1. Self-trigger guard (App-token comments DO re-fire this event) ─
|
||||||
|
if (process.env.COMMENT_AUTHOR_TYPE === 'Bot') {
|
||||||
|
console.log('Comment authored by a bot — skipping to avoid loops.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 2. Permission gate (mirrors the slash bot) ─────────────────────
|
||||||
|
const association = process.env.ACTOR_ASSOCIATION;
|
||||||
|
if (association !== 'OWNER' && association !== 'MEMBER') {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment(
|
||||||
|
'❌ **PocketBase AI Bot**: @' + actor + ' is not authorized to use this command.\n' +
|
||||||
|
'Only org members (Contributors team) can use `@pocketbase-bot`.'
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 3. Extract the instruction after the @pocketbase-bot handle ────
|
||||||
|
const commentBody = process.env.COMMENT_BODY || '';
|
||||||
|
const handleMatch = commentBody.match(/@pocketbase-bot(\[bot\])?/i);
|
||||||
|
if (!handleMatch) {
|
||||||
|
console.log('No @pocketbase-bot handle found — ignoring.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const instruction = commentBody.slice(handleMatch.index + handleMatch[0].length).trim();
|
||||||
|
if (!instruction) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment(
|
||||||
|
'ℹ️ **PocketBase AI Bot**: Tell me what to do, e.g.\n' +
|
||||||
|
'`@pocketbase-bot change RAM to 4096 on zigbee2mqtt` or `@pocketbase-bot disable script Nextcloud`.'
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── PocketBase auth + low-level helpers ────────────────────────────
|
||||||
|
const pbRaw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
||||||
|
const apiBase = /\/api$/i.test(pbRaw) ? pbRaw : pbRaw + '/api';
|
||||||
|
const coll = process.env.POCKETBASE_COLLECTION;
|
||||||
|
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
||||||
|
|
||||||
|
async function pbAuth() {
|
||||||
|
const res = await request(apiBase + '/collections/users/auth-with-password', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ identity: process.env.POCKETBASE_ADMIN_EMAIL, password: process.env.POCKETBASE_ADMIN_PASSWORD })
|
||||||
|
});
|
||||||
|
if (!res.ok) throw new Error('PocketBase auth failed: ' + res.body);
|
||||||
|
return JSON.parse(res.body).token;
|
||||||
|
}
|
||||||
|
async function pbFindRecord(token, slug) {
|
||||||
|
const filter = "(slug='" + String(slug).replace(/'/g, "''") + "')";
|
||||||
|
const res = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', { headers: { 'Authorization': token } });
|
||||||
|
const list = JSON.parse(res.body);
|
||||||
|
return list.items && list.items[0];
|
||||||
|
}
|
||||||
|
async function pbPatch(token, id, payload) {
|
||||||
|
return request(recordsUrl + '/' + id, {
|
||||||
|
method: 'PATCH',
|
||||||
|
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify(payload)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function readJsonBlob(val) {
|
||||||
|
if (Array.isArray(val)) return val;
|
||||||
|
try { return JSON.parse(val || '[]'); } catch (e) { return []; }
|
||||||
|
}
|
||||||
|
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); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── CT-defaults sync PR (copied from slash bot) ────────────────────
|
||||||
|
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 = [], 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 ghRequest = ghDefault; // git ops run as the built-in token
|
||||||
|
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 ghRequest = ghDefault; // contents/PR ops run as the built-in token
|
||||||
|
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 defaultBranch = JSON.parse(repoRes.body).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.' };
|
||||||
|
const putRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath, 'PUT', {
|
||||||
|
message: 'chore(ct): sync ' + slugValue + ' defaults from PocketBase',
|
||||||
|
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 createPrRes = await ghRequest('/repos/' + owner + '/' + repo + '/pulls', 'POST', {
|
||||||
|
title: 'chore(ct): sync ' + slugValue + ' defaults with PocketBase',
|
||||||
|
body: '## Summary\n- Sync default CT variables for `' + slugValue + '` after an `@pocketbase-bot` update.\n- Updated vars: `' + updateResult.updatedVars.join('`, `') + '`.\n\n## Source\n- Triggered by @' + actor + ' via PocketBase AI bot.\n',
|
||||||
|
head: branchName,
|
||||||
|
base: defaultBranch
|
||||||
|
});
|
||||||
|
if (!createPrRes.ok) throw new Error('Could not create PR: ' + createPrRes.body);
|
||||||
|
return { status: 'created', prUrl: JSON.parse(createPrRes.body).html_url, updatedVars: updateResult.updatedVars };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Allow-lists (mirror the slash bot) ─────────────────────────────
|
||||||
|
const ALLOWED_FIELDS = {
|
||||||
|
name: 'string', description: 'string', logo: 'string', documentation: 'string',
|
||||||
|
website: 'string', project_url: 'string', github: 'string', config_path: 'string',
|
||||||
|
tags: 'string', port: 'number', default_user: 'nullable_string', default_passwd: 'nullable_string',
|
||||||
|
unprivileged: 'number', updateable: 'boolean', privileged: 'boolean', has_arm: 'boolean',
|
||||||
|
is_dev: 'boolean', is_disabled: 'boolean', disable_message: 'string',
|
||||||
|
is_deleted: 'boolean', deleted_message: 'string'
|
||||||
|
};
|
||||||
|
const FIELD_TO_CT_VAR = { tags: 'var_tags', unprivileged: 'var_unprivileged' };
|
||||||
|
const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' };
|
||||||
|
const METHOD_KEYS = { config_path: 'string', script: 'string' };
|
||||||
|
const ALL_METHOD_KEYS = Object.assign({}, RESOURCE_KEYS, METHOD_KEYS);
|
||||||
|
const RESOURCE_TO_CT_VAR = { cpu: 'var_cpu', ram: 'var_ram', hdd: 'var_disk', os: 'var_os', version: 'var_version' };
|
||||||
|
|
||||||
|
function castFieldValue(key, rawVal) {
|
||||||
|
const type = ALLOWED_FIELDS[key];
|
||||||
|
if (!type) return { error: 'Unknown field `' + key + '`' };
|
||||||
|
if (type === 'boolean') {
|
||||||
|
if (rawVal === true || rawVal === 'true') return { value: true };
|
||||||
|
if (rawVal === false || rawVal === 'false') return { value: false };
|
||||||
|
return { error: '`' + key + '` must be true/false' };
|
||||||
|
}
|
||||||
|
if (type === 'number') {
|
||||||
|
const n = parseInt(rawVal, 10);
|
||||||
|
if (isNaN(n)) return { error: '`' + key + '` must be a number' };
|
||||||
|
return { value: n };
|
||||||
|
}
|
||||||
|
if (type === 'nullable_string') return { value: rawVal === '' || rawVal == null ? null : String(rawVal) };
|
||||||
|
return { value: String(rawVal) };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Operation validation (used at propose AND confirm time) ────────
|
||||||
|
// Never trust raw operations: enforce the field/op allow-lists and
|
||||||
|
// re-cast values. Returns only well-formed, allowed operations.
|
||||||
|
function sanitizeOperations(ops) {
|
||||||
|
const validOps = [], problems = [];
|
||||||
|
for (const op of (Array.isArray(ops) ? ops : [])) {
|
||||||
|
if (op && op.kind === 'field') {
|
||||||
|
const cast = castFieldValue(op.field, op.value);
|
||||||
|
if (cast.error) { problems.push(cast.error); continue; }
|
||||||
|
validOps.push({ kind: 'field', field: op.field, value: cast.value });
|
||||||
|
} else if (op && op.kind === 'note' && ['add', 'edit', 'remove'].includes(op.action)) {
|
||||||
|
validOps.push({ kind: 'note', action: op.action, type: String(op.type || ''), text: op.text, newText: op.newText });
|
||||||
|
} else if (op && op.kind === 'method' && ['add', 'edit', 'remove'].includes(op.action)) {
|
||||||
|
const changes = {};
|
||||||
|
for (const [k, v] of Object.entries(op.changes || {})) { if (ALL_METHOD_KEYS[k]) changes[k] = v; }
|
||||||
|
validOps.push({ kind: 'method', action: op.action, type: String(op.type || 'default'), changes });
|
||||||
|
} else {
|
||||||
|
problems.push('Unsupported operation: `' + JSON.stringify(op) + '`');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { validOps, problems };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Executor: apply a validated {slug, operations} set ─────────────
|
||||||
|
async function applyOperations(action) {
|
||||||
|
const token = await pbAuth();
|
||||||
|
const record = await pbFindRecord(token, action.slug);
|
||||||
|
if (!record) return { ok: false, summary: '❌ No PocketBase record for slug `' + action.slug + '`.' };
|
||||||
|
|
||||||
|
const fieldPayload = {};
|
||||||
|
let notesArr = readJsonBlob(record.notes);
|
||||||
|
let methodsArr = readJsonBlob(record.install_methods);
|
||||||
|
let notesChanged = false, methodsChanged = false;
|
||||||
|
const ctChanges = {};
|
||||||
|
const lines = [];
|
||||||
|
|
||||||
|
for (const op of action.operations) {
|
||||||
|
if (op.kind === 'field') {
|
||||||
|
const cast = castFieldValue(op.field, op.value);
|
||||||
|
if (cast.error) { lines.push('- ⚠️ skipped field: ' + cast.error); continue; }
|
||||||
|
fieldPayload[op.field] = cast.value;
|
||||||
|
if (FIELD_TO_CT_VAR[op.field]) ctChanges[FIELD_TO_CT_VAR[op.field]] = cast.value;
|
||||||
|
lines.push('- `' + op.field + '` → `' + JSON.stringify(cast.value) + '`');
|
||||||
|
} else if (op.kind === 'note') {
|
||||||
|
const type = String(op.type || '').toLowerCase();
|
||||||
|
if (op.action === 'add') {
|
||||||
|
notesArr.push({ type, text: String(op.text || '') });
|
||||||
|
notesChanged = true; lines.push('- note add `' + type + '`: ' + op.text);
|
||||||
|
} else if (op.action === 'remove') {
|
||||||
|
const before = notesArr.length;
|
||||||
|
notesArr = notesArr.filter(function (n) { return !(String(n.type).toLowerCase() === type && n.text === op.text); });
|
||||||
|
if (notesArr.length !== before) { notesChanged = true; lines.push('- note remove `' + type + '`: ' + op.text); }
|
||||||
|
else lines.push('- ⚠️ note remove: no `' + type + '` note matched');
|
||||||
|
} else if (op.action === 'edit') {
|
||||||
|
const idx = notesArr.findIndex(function (n) { return String(n.type).toLowerCase() === type && n.text === op.text; });
|
||||||
|
if (idx !== -1) { notesArr[idx].text = String(op.newText || ''); notesChanged = true; lines.push('- note edit `' + type + '`'); }
|
||||||
|
else lines.push('- ⚠️ note edit: no `' + type + '` note matched');
|
||||||
|
}
|
||||||
|
} else if (op.kind === 'method') {
|
||||||
|
const type = String(op.type || '').toLowerCase();
|
||||||
|
const changes = op.changes || {};
|
||||||
|
if (op.action === 'remove') {
|
||||||
|
const before = methodsArr.length;
|
||||||
|
methodsArr = methodsArr.filter(function (im) { return String(im.type || '').toLowerCase() !== type; });
|
||||||
|
if (methodsArr.length !== before) { methodsChanged = true; lines.push('- method remove `' + type + '`'); }
|
||||||
|
else lines.push('- ⚠️ method remove: `' + type + '` not found');
|
||||||
|
} else {
|
||||||
|
let method = methodsArr.find(function (im) { return String(im.type || '').toLowerCase() === type; });
|
||||||
|
if (!method && op.action === 'add') { method = { type, resources: { cpu: 1, ram: 512, hdd: 4, os: 'debian', version: '13' } }; methodsArr.push(method); }
|
||||||
|
if (!method) { lines.push('- ⚠️ method edit: `' + type + '` not found'); continue; }
|
||||||
|
if (!method.resources) method.resources = {};
|
||||||
|
for (const [k, v] of Object.entries(changes)) {
|
||||||
|
if (RESOURCE_KEYS[k]) {
|
||||||
|
method.resources[k] = RESOURCE_KEYS[k] === 'number' ? parseInt(v, 10) : String(v);
|
||||||
|
if (RESOURCE_TO_CT_VAR[k]) ctChanges[RESOURCE_TO_CT_VAR[k]] = method.resources[k];
|
||||||
|
} else if (METHOD_KEYS[k]) {
|
||||||
|
method[k] = v === '' ? null : String(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
methodsChanged = true;
|
||||||
|
lines.push('- method `' + (op.action === 'add' ? 'add' : 'edit') + '` `' + type + '`: ' + JSON.stringify(changes));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(fieldPayload).length) {
|
||||||
|
const r = await pbPatch(token, record.id, fieldPayload);
|
||||||
|
if (!r.ok) return { ok: false, summary: '❌ Field update failed:\n```\n' + r.body + '\n```' };
|
||||||
|
}
|
||||||
|
if (notesChanged) {
|
||||||
|
const r = await pbPatch(token, record.id, { notes: notesArr });
|
||||||
|
if (!r.ok) return { ok: false, summary: '❌ Notes update failed:\n```\n' + r.body + '\n```' };
|
||||||
|
}
|
||||||
|
if (methodsChanged) {
|
||||||
|
const r = await pbPatch(token, record.id, { install_methods: methodsArr });
|
||||||
|
if (!r.ok) return { ok: false, summary: '❌ Install-method update failed:\n```\n' + r.body + '\n```' };
|
||||||
|
}
|
||||||
|
await revalidate(action.slug);
|
||||||
|
|
||||||
|
let ctNote = '';
|
||||||
|
if (Object.keys(ctChanges).length) {
|
||||||
|
try {
|
||||||
|
const sync = await upsertCtDefaultsPr(action.slug, ctChanges);
|
||||||
|
if (sync.status === 'created') ctNote = '\n\n**CT sync PR:** ' + sync.prUrl;
|
||||||
|
else if (sync.status === 'updated') ctNote = '\n\n**CT sync PR updated:** ' + sync.prUrl;
|
||||||
|
else if (sync.status === 'skipped') ctNote = '\n\n**CT sync skipped:** ' + sync.reason;
|
||||||
|
} catch (e) { ctNote = '\n\n**CT sync failed:** ' + e.message; }
|
||||||
|
}
|
||||||
|
return { ok: true, summary: lines.join('\n') + ctNote };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 4. Confirm branch ──────────────────────────────────────────────
|
||||||
|
const PENDING_RE = /<!--\s*pocketbase-pending:\s*([A-Za-z0-9+/=]+)\s*-->/;
|
||||||
|
const isConfirm = /^(confirm|yes|apply|do it|y)\b/i.test(instruction);
|
||||||
|
|
||||||
|
if (isConfirm) {
|
||||||
|
const comments = await listIssueComments();
|
||||||
|
const appId = String(process.env.PB_BOT_APP_ID || '');
|
||||||
|
let pending = null, pendingComment = null;
|
||||||
|
for (let i = comments.length - 1; i >= 0; i--) {
|
||||||
|
const c = comments[i];
|
||||||
|
// Only trust a marker in a comment THIS bot app authored — otherwise a
|
||||||
|
// user could hand-craft a forged pocketbase-pending marker and confirm it.
|
||||||
|
const byBotApp = c.user && c.user.type === 'Bot' &&
|
||||||
|
c.performed_via_github_app && String(c.performed_via_github_app.id) === appId;
|
||||||
|
if (!byBotApp) continue;
|
||||||
|
const m = c.body && c.body.match(PENDING_RE);
|
||||||
|
if (m) { pending = m[1]; pendingComment = c; break; }
|
||||||
|
}
|
||||||
|
if (!pending) {
|
||||||
|
await addReaction('confused');
|
||||||
|
await postComment('🤔 **PocketBase AI Bot**: I have no pending change to confirm in this thread.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let action;
|
||||||
|
try { action = JSON.parse(Buffer.from(pending, 'base64').toString('utf8')); }
|
||||||
|
catch (e) { await postComment('❌ **PocketBase AI Bot**: Could not decode the pending change.'); return; }
|
||||||
|
|
||||||
|
// Re-validate the decoded operations before applying (defense-in-depth).
|
||||||
|
const recheck = sanitizeOperations(action.operations);
|
||||||
|
if (!action.slug || recheck.validOps.length === 0) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase AI Bot**: The pending change is no longer valid. Please restate the request.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
action.operations = recheck.validOps;
|
||||||
|
|
||||||
|
let result;
|
||||||
|
try { result = await applyOperations(action); }
|
||||||
|
catch (e) { await addReaction('-1'); await postComment('❌ **PocketBase AI Bot**: ' + e.message); return; }
|
||||||
|
|
||||||
|
if (!result.ok) { await addReaction('-1'); await postComment(result.summary); return; }
|
||||||
|
await updateComment(pendingComment.id, pendingComment.body.replace(PENDING_RE, '<!-- pocketbase-applied -->'));
|
||||||
|
await addReaction('+1');
|
||||||
|
await postComment(
|
||||||
|
'✅ **PocketBase AI Bot**: Applied to **`' + action.slug + '`**\n\n' + result.summary +
|
||||||
|
'\n\n*Confirmed by @' + actor + '*'
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 5. New request: acknowledge, fetch script list, call the model ─
|
||||||
|
await addReaction('eyes');
|
||||||
|
|
||||||
|
const token0 = await pbAuth();
|
||||||
|
const scripts = [];
|
||||||
|
let page = 1;
|
||||||
|
while (page <= 5) {
|
||||||
|
const res = await request(recordsUrl + '?fields=slug,name&perPage=500&page=' + page, { headers: { 'Authorization': token0 } });
|
||||||
|
if (!res.ok) break;
|
||||||
|
const data = JSON.parse(res.body);
|
||||||
|
(data.items || []).forEach(function (it) { if (it.slug) scripts.push({ slug: it.slug, name: it.name || it.slug }); });
|
||||||
|
if (!data.items || data.items.length < 500) break;
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SYSTEM_PROMPT =
|
||||||
|
'You translate a maintainer\'s natural-language request into a STRICT JSON change-set for a ' +
|
||||||
|
'script catalog (PocketBase). Respond with a SINGLE JSON object and nothing else.\n\n' +
|
||||||
|
'Schema:\n' +
|
||||||
|
'{\n' +
|
||||||
|
' "slug": string|null, // MUST be one of the known slugs below, chosen from the request\n' +
|
||||||
|
' "operations": [ ... ], // [] if you cannot determine concrete changes\n' +
|
||||||
|
' "human_summary": string, // short plain-English description\n' +
|
||||||
|
' "clarification": string|null // a question to ask if ambiguous/unsupported; else null\n' +
|
||||||
|
'}\n\n' +
|
||||||
|
'Operation kinds:\n' +
|
||||||
|
'- {"kind":"field","field":<one of: ' + Object.keys(ALLOWED_FIELDS).join(', ') + '>,"value":<bool|number|string>}\n' +
|
||||||
|
' (booleans true/false; "is_disabled"/"is_deleted"/"is_dev" are booleans; "port"/"unprivileged" are numbers; rest strings.)\n' +
|
||||||
|
'- {"kind":"note","action":"add"|"edit"|"remove","type":string,"text":string,"newText":string?}\n' +
|
||||||
|
'- {"kind":"method","action":"add"|"edit"|"remove","type":string,"changes":{cpu?:number,ram?:number,hdd?:number,os?:string,version?:string,config_path?:string,script?:string}}\n' +
|
||||||
|
' (RAM/HDD are in MB/GB; method "type" defaults to "default" if the user does not name one.)\n\n' +
|
||||||
|
'Rules:\n' +
|
||||||
|
'- Only use fields/operations listed above. If the request needs something else, set clarification and operations=[].\n' +
|
||||||
|
'- "disable"/"enable" map to is_disabled true/false. If disabling and the user gave a reason, also set disable_message.\n' +
|
||||||
|
'- Resolve the target script to a slug from the list. If you cannot confidently match exactly one, set slug=null and ask via clarification.\n\n' +
|
||||||
|
'Known scripts (slug — name):\n' +
|
||||||
|
scripts.map(function (s) { return s.slug + ' — ' + s.name; }).join('\n');
|
||||||
|
|
||||||
|
const modelRes = await request('https://models.github.ai/inference/chat/completions', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Authorization': 'Bearer ' + process.env.MODELS_TOKEN, 'Content-Type': 'application/json', 'Accept': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
model: process.env.AI_MODEL || 'openai/gpt-4o',
|
||||||
|
temperature: 0.1,
|
||||||
|
response_format: { type: 'json_object' },
|
||||||
|
messages: [{ role: 'system', content: SYSTEM_PROMPT }, { role: 'user', content: instruction }]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
if (!modelRes.ok) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase AI Bot**: Model request failed (' + modelRes.statusCode + ').\n```\n' + modelRes.body.slice(0, 500) + '\n```');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed;
|
||||||
|
try {
|
||||||
|
const content = JSON.parse(modelRes.body).choices[0].message.content;
|
||||||
|
const cleaned = content.replace(/^```(?:json)?\s*/i, '').replace(/```\s*$/i, '').trim();
|
||||||
|
parsed = JSON.parse(cleaned);
|
||||||
|
} catch (e) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase AI Bot**: Could not parse the model response. Please rephrase.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 6. Validate ────────────────────────────────────────────────────
|
||||||
|
const knownSlugs = new Set(scripts.map(function (s) { return s.slug; }));
|
||||||
|
const problems = [];
|
||||||
|
if (parsed.clarification) problems.push(parsed.clarification);
|
||||||
|
if (!parsed.slug || !knownSlugs.has(parsed.slug)) problems.push('I could not match the request to a known script.');
|
||||||
|
const sanitized = sanitizeOperations(parsed.operations);
|
||||||
|
const validOps = sanitized.validOps;
|
||||||
|
problems.push.apply(problems, sanitized.problems);
|
||||||
|
if (validOps.length === 0) problems.push('No concrete, supported change was found.');
|
||||||
|
|
||||||
|
if (problems.length) {
|
||||||
|
await addReaction('confused');
|
||||||
|
await postComment(
|
||||||
|
'🤔 **PocketBase AI Bot**: I need a bit more to act on that.\n\n- ' + problems.join('\n- ') +
|
||||||
|
'\n\nTry naming the script and the exact change, e.g. `@pocketbase-bot set RAM to 4096 on zigbee2mqtt`.'
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 7. Propose (do NOT apply yet) ──────────────────────────────────
|
||||||
|
const action = { slug: parsed.slug, operations: validOps };
|
||||||
|
const bullets = validOps.map(function (op) {
|
||||||
|
if (op.kind === 'field') return '- `' + op.field + '` → `' + JSON.stringify(op.value) + '`';
|
||||||
|
if (op.kind === 'note') return '- note ' + op.action + ' `' + op.type + '`' + (op.text ? ': ' + op.text : '');
|
||||||
|
return '- method ' + op.action + ' `' + op.type + '`: ' + JSON.stringify(op.changes);
|
||||||
|
}).join('\n');
|
||||||
|
const marker = '<!-- pocketbase-pending: ' + Buffer.from(JSON.stringify(action), 'utf8').toString('base64') + ' -->';
|
||||||
|
await addReaction('+1');
|
||||||
|
await postComment(
|
||||||
|
'🤖 **PocketBase AI Bot** — please confirm\n\n' +
|
||||||
|
(parsed.human_summary ? '> ' + parsed.human_summary + '\n\n' : '') +
|
||||||
|
'**Target:** `' + action.slug + '`\n**Proposed changes:**\n' + bullets + '\n\n' +
|
||||||
|
'Reply **`@pocketbase-bot confirm`** to apply, or restate the request to adjust.\n' + marker
|
||||||
|
);
|
||||||
|
})().catch(function (e) {
|
||||||
|
console.error('Fatal error:', e && (e.message || e));
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
ENDSCRIPT
|
||||||
24
.github/workflows/pocketbase-bot.yml
generated
vendored
24
.github/workflows/pocketbase-bot.yml
generated
vendored
@@ -13,8 +13,8 @@ jobs:
|
|||||||
pocketbase-bot:
|
pocketbase-bot:
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
|
|
||||||
# Only act on /pocketbase commands
|
# Act on comments that contain a /pocketbase command line (precise line check happens in-script)
|
||||||
if: startsWith(github.event.comment.body, '/pocketbase')
|
if: contains(github.event.comment.body, '/pocketbase')
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Execute PocketBase bot command
|
- name: Execute PocketBase bot command
|
||||||
@@ -257,6 +257,22 @@ jobs:
|
|||||||
if (!res.ok) console.warn('Could not post comment:', res.body);
|
if (!res.ok) console.warn('Could not post comment:', res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Locate the command line ────────────────────────────────────────
|
||||||
|
// Accept /pocketbase at the start of ANY line (leading whitespace ok),
|
||||||
|
// so the command works even when preceded by other text. Mid-sentence
|
||||||
|
// mentions and blockquoted ("> ...") examples are ignored.
|
||||||
|
const commentBody = process.env.COMMENT_BODY || '';
|
||||||
|
const cmdLine = commentBody
|
||||||
|
.split('\n')
|
||||||
|
.map(l => l.trim())
|
||||||
|
.find(l => l.startsWith('/pocketbase'));
|
||||||
|
|
||||||
|
if (!cmdLine) {
|
||||||
|
console.log('No /pocketbase command line found — ignoring comment.');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
const withoutCmd = cmdLine.replace(/^\/pocketbase\s*/, '').trim();
|
||||||
|
|
||||||
// ── Permission check ───────────────────────────────────────────────
|
// ── Permission check ───────────────────────────────────────────────
|
||||||
const association = process.env.ACTOR_ASSOCIATION;
|
const association = process.env.ACTOR_ASSOCIATION;
|
||||||
if (association !== 'OWNER' && association !== 'MEMBER') {
|
if (association !== 'OWNER' && association !== 'MEMBER') {
|
||||||
@@ -272,10 +288,6 @@ jobs:
|
|||||||
await addReaction('eyes');
|
await addReaction('eyes');
|
||||||
|
|
||||||
// ── Parse command ──────────────────────────────────────────────────
|
// ── Parse command ──────────────────────────────────────────────────
|
||||||
const commentBody = process.env.COMMENT_BODY || '';
|
|
||||||
const lines = commentBody.trim().split('\n');
|
|
||||||
const firstLine = lines[0].trim();
|
|
||||||
const withoutCmd = firstLine.replace(/^\/pocketbase\s+/, '').trim();
|
|
||||||
|
|
||||||
function extractCodeBlock(body) {
|
function extractCodeBlock(body) {
|
||||||
const m = body.match(/```[^\n]*\n([\s\S]*?)```/);
|
const m = body.match(/```[^\n]*\n([\s\S]*?)```/);
|
||||||
|
|||||||
1
.github/workflows/push-json-to-pocketbase.yml
generated
vendored
1
.github/workflows/push-json-to-pocketbase.yml
generated
vendored
@@ -179,6 +179,7 @@ jobs:
|
|||||||
if (resolvedType) payload.type = resolvedType;
|
if (resolvedType) payload.type = resolvedType;
|
||||||
var resolvedCats = (data.categories || []).map(function(n) { return categoryNameToPbId[categoryIdToName[n]]; }).filter(Boolean);
|
var resolvedCats = (data.categories || []).map(function(n) { return categoryNameToPbId[categoryIdToName[n]]; }).filter(Boolean);
|
||||||
if (resolvedCats.length) payload.categories = resolvedCats;
|
if (resolvedCats.length) payload.categories = resolvedCats;
|
||||||
|
if (data.has_arm !== undefined) payload.has_arm = data.has_arm === true || data.has_arm === 'true';
|
||||||
if (data.version !== undefined) payload.version = data.version;
|
if (data.version !== undefined) payload.version = data.version;
|
||||||
if (data.changelog !== undefined) payload.changelog = data.changelog;
|
if (data.changelog !== undefined) payload.changelog = data.changelog;
|
||||||
if (data.screenshots !== undefined) payload.screenshots = data.screenshots;
|
if (data.screenshots !== undefined) payload.screenshots = data.screenshots;
|
||||||
|
|||||||
853
CHANGELOG.md
853
CHANGELOG.md
@@ -44,6 +44,15 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -63,7 +72,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><h4>May (9 entries)</h4></summary>
|
<summary><h4>May (30 entries)</h4></summary>
|
||||||
|
|
||||||
[View May 2026 Changelog](.github/changelogs/2026/05.md)
|
[View May 2026 Changelog](.github/changelogs/2026/05.md)
|
||||||
|
|
||||||
@@ -461,14 +470,418 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-06-02
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- infisical: fix update abort due to creds field mismatch (#14868) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14870](https://github.com/community-scripts/ProxmoxVE/pull/14870))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- feat(degoog): enable default valkey cache integration [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14871](https://github.com/community-scripts/ProxmoxVE/pull/14871))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- chore: bump Node version in selected scripts [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14873](https://github.com/community-scripts/ProxmoxVE/pull/14873))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: add support for Rust installation profile in setup_rust [@MickLesk](https://github.com/MickLesk) ([#14872](https://github.com/community-scripts/ProxmoxVE/pull/14872))
|
||||||
|
|
||||||
|
### 📂 Github
|
||||||
|
|
||||||
|
- fix(workflow): only flag node drift when local is behind upstream [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14874](https://github.com/community-scripts/ProxmoxVE/pull/14874))
|
||||||
|
|
||||||
|
## 2026-06-01
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix(dispatcharr): forward nginx port for M3U URLs on new installs [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14862](https://github.com/community-scripts/ProxmoxVE/pull/14862))
|
||||||
|
- Set environment paths in service for apprise-api-install.sh [@SystemIdleProcess](https://github.com/SystemIdleProcess) ([#14805](https://github.com/community-scripts/ProxmoxVE/pull/14805))
|
||||||
|
- fix(fireshare): rebuild client on update to fix nginx 500 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14848](https://github.com/community-scripts/ProxmoxVE/pull/14848))
|
||||||
|
- Fix Kan build failure (TS7016 nodemailer) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14856](https://github.com/community-scripts/ProxmoxVE/pull/14856))
|
||||||
|
- fix(firefly): set Data Importer APP_URL for subdirectory install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14847](https://github.com/community-scripts/ProxmoxVE/pull/14847))
|
||||||
|
- kan: extend fetch_and_deploy_gh_tag to use 'latest' tag [@MickLesk](https://github.com/MickLesk) ([#14853](https://github.com/community-scripts/ProxmoxVE/pull/14853))
|
||||||
|
- Glance: preserve glance.yml across updates [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14845](https://github.com/community-scripts/ProxmoxVE/pull/14845))
|
||||||
|
- NginxProxymanager: set Certbot version in npm.service environment variable (2.15.0) [@MickLesk](https://github.com/MickLesk) ([#14843](https://github.com/community-scripts/ProxmoxVE/pull/14843))
|
||||||
|
- [FileFlows] Fix service handling by using systemctl --all with quoted glob [@adrianmusante](https://github.com/adrianmusante) ([#14838](https://github.com/community-scripts/ProxmoxVE/pull/14838))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Kometa: also update Quickstart in update_script [@MickLesk](https://github.com/MickLesk) ([#14529](https://github.com/community-scripts/ProxmoxVE/pull/14529))
|
||||||
|
|
||||||
|
## 2026-05-31
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Manyfold: regenerate Rails credentials on update to fix encryption mimatch [@MickLesk](https://github.com/MickLesk) ([#14817](https://github.com/community-scripts/ProxmoxVE/pull/14817))
|
||||||
|
- OpenThread-BR: use correct ipv6 configuration [@tomfrenzel](https://github.com/tomfrenzel) ([#14829](https://github.com/community-scripts/ProxmoxVE/pull/14829))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Webtrees: use PHP CLI for initial setup instead of curl to setup wizard [@MickLesk](https://github.com/MickLesk) ([#14818](https://github.com/community-scripts/ProxmoxVE/pull/14818))
|
||||||
|
- Kima-Hub: use curl_with_retry for ML model downloads to fix possible timeout issues [@MickLesk](https://github.com/MickLesk) ([#14816](https://github.com/community-scripts/ProxmoxVE/pull/14816))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- PBS4-Upgrade: update current PBS3 packages before switching to Trixie repos [@MickLesk](https://github.com/MickLesk) ([#14815](https://github.com/community-scripts/ProxmoxVE/pull/14815))
|
||||||
|
|
||||||
|
## 2026-05-30
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Flatnotes: fix empty package name in pyproject.toml [@MickLesk](https://github.com/MickLesk) ([#14814](https://github.com/community-scripts/ProxmoxVE/pull/14814))
|
||||||
|
|
||||||
|
## 2026-05-29
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Kan ([#14776](https://github.com/community-scripts/ProxmoxVE/pull/14776))
|
||||||
|
- Dynacat ([#14777](https://github.com/community-scripts/ProxmoxVE/pull/14777))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Fix lobehub docker path [@dannyyy](https://github.com/dannyyy) ([#14793](https://github.com/community-scripts/ProxmoxVE/pull/14793))
|
||||||
|
- karakeep: add more hdd space [@MickLesk](https://github.com/MickLesk) ([#14797](https://github.com/community-scripts/ProxmoxVE/pull/14797))
|
||||||
|
- Grist: Revert installation of EE [@tremor021](https://github.com/tremor021) ([#14784](https://github.com/community-scripts/ProxmoxVE/pull/14784))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Sure: Remove `$STD` for `systemctl enable -q` [@tremor021](https://github.com/tremor021) ([#14801](https://github.com/community-scripts/ProxmoxVE/pull/14801))
|
||||||
|
|
||||||
|
## 2026-05-28
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- RomM: remove nginx default.conf during installation [@MickLesk](https://github.com/MickLesk) ([#14766](https://github.com/community-scripts/ProxmoxVE/pull/14766))
|
||||||
|
- Open-Archiver: replace pnpm approve-builds --yes with --all [@MickLesk](https://github.com/MickLesk) ([#14765](https://github.com/community-scripts/ProxmoxVE/pull/14765))
|
||||||
|
- fix(hermesagent): set npm_config_yes=true to suppress interactive pro… [@steveonjava](https://github.com/steveonjava) ([#14763](https://github.com/community-scripts/ProxmoxVE/pull/14763))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Yamtrack: migrate to uv [@MickLesk](https://github.com/MickLesk) ([#14767](https://github.com/community-scripts/ProxmoxVE/pull/14767))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- chore(ct): sync adventurelog defaults with PocketBase [@github-actions[bot]](https://github.com/github-actions[bot]) ([#14772](https://github.com/community-scripts/ProxmoxVE/pull/14772))
|
||||||
|
|
||||||
|
## 2026-05-27
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- MusicSeerr ([#14746](https://github.com/community-scripts/ProxmoxVE/pull/14746))
|
||||||
|
- Hermes Agent ([#14751](https://github.com/community-scripts/ProxmoxVE/pull/14751))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- grist: restore install:ee step [@paulfitz](https://github.com/paulfitz) ([#14759](https://github.com/community-scripts/ProxmoxVE/pull/14759))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [tools.func]: `setup_gs()` fix getting dotted release format [@tremor021](https://github.com/tremor021) ([#14745](https://github.com/community-scripts/ProxmoxVE/pull/14745))
|
||||||
|
|
||||||
|
## 2026-05-26
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Add directory creation to Profilarr update script [@ryansully](https://github.com/ryansully) ([#14740](https://github.com/community-scripts/ProxmoxVE/pull/14740))
|
||||||
|
- profilarr: Fix ARCH assignment in profilarr.sh to support Profilarr build usage [@mpeleshenko](https://github.com/mpeleshenko) ([#14709](https://github.com/community-scripts/ProxmoxVE/pull/14709))
|
||||||
|
- Jackett: Remove quotes in Service File [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14729](https://github.com/community-scripts/ProxmoxVE/pull/14729))
|
||||||
|
- Open-archiver: approve pnpm build scripts and run build:oss without subshell [@MickLesk](https://github.com/MickLesk) ([#14711](https://github.com/community-scripts/ProxmoxVE/pull/14711))
|
||||||
|
- Docuseal: read Ruby version from Gemfile, upgrade on update if needed [@MickLesk](https://github.com/MickLesk) ([#14715](https://github.com/community-scripts/ProxmoxVE/pull/14715))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Birdnet-GO: install libonnxruntime.so from release tarball [@MickLesk](https://github.com/MickLesk) ([#14716](https://github.com/community-scripts/ProxmoxVE/pull/14716))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: better error diagnostics, consistent OS detection, setup function ordering [@MickLesk](https://github.com/MickLesk) ([#14692](https://github.com/community-scripts/ProxmoxVE/pull/14692))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- IPTag-Tool: use qm set for VM tags to handle snapshot sections crrectly [@MickLesk](https://github.com/MickLesk) ([#14713](https://github.com/community-scripts/ProxmoxVE/pull/14713))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Netdata: extend PVE version support to 9.x [@MickLesk](https://github.com/MickLesk) ([#14714](https://github.com/community-scripts/ProxmoxVE/pull/14714))
|
||||||
|
|
||||||
|
## 2026-05-25
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- karakeep: fix: pip config [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14703](https://github.com/community-scripts/ProxmoxVE/pull/14703))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: replace raw GitHub API curl calls with get_latest_github_release [@MickLesk](https://github.com/MickLesk) ([#14690](https://github.com/community-scripts/ProxmoxVE/pull/14690))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Kernel-Clean: detect meta-packages and fix silent removal failures [@MickLesk](https://github.com/MickLesk) ([#14674](https://github.com/community-scripts/ProxmoxVE/pull/14674))
|
||||||
|
|
||||||
|
## 2026-05-24
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- RomM: add installation steps for Nginx mod_zip module [@MickLesk](https://github.com/MickLesk) ([#14678](https://github.com/community-scripts/ProxmoxVE/pull/14678))
|
||||||
|
- ISponsorblockTV: detect CPU capabilities to select compatible binary [@MickLesk](https://github.com/MickLesk) ([#14677](https://github.com/community-scripts/ProxmoxVE/pull/14677))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: MQTT [@tremor021](https://github.com/tremor021) ([#14673](https://github.com/community-scripts/ProxmoxVE/pull/14673))
|
||||||
|
|
||||||
|
## 2026-05-23
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- IronClaw: Extra configuration during install to ensure Web Gateway can run [@SystemIdleProcess](https://github.com/SystemIdleProcess) ([#14635](https://github.com/community-scripts/ProxmoxVE/pull/14635))
|
||||||
|
- Tunarr: fix path to backup during update [@SystemIdleProcess](https://github.com/SystemIdleProcess) ([#14655](https://github.com/community-scripts/ProxmoxVE/pull/14655))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- wealthfolio: add: prebuild [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14658](https://github.com/community-scripts/ProxmoxVE/pull/14658))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- kernel-clean: support range syntax in selection prompt [@djhojd](https://github.com/djhojd) ([#14656](https://github.com/community-scripts/ProxmoxVE/pull/14656))
|
||||||
|
|
||||||
|
## 2026-05-22
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- bitfocus-companion ([#14603](https://github.com/community-scripts/ProxmoxVE/pull/14603))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix(the-lounge): install Node.js 22 before deb package [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14648](https://github.com/community-scripts/ProxmoxVE/pull/14648))
|
||||||
|
- Docmost: Fix duplicate STORAGE_DRIVER [@MickLesk](https://github.com/MickLesk) ([#14645](https://github.com/community-scripts/ProxmoxVE/pull/14645))
|
||||||
|
- Profilarr: pin Deno version to v2.7.5 [@MickLesk](https://github.com/MickLesk) ([#14632](https://github.com/community-scripts/ProxmoxVE/pull/14632))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- add: karakeep cli wrapper [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14618](https://github.com/community-scripts/ProxmoxVE/pull/14618))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- OpenCloud: v7.0.0 changes [@vhsdream](https://github.com/vhsdream) ([#14650](https://github.com/community-scripts/ProxmoxVE/pull/14650))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- workflows: update workflows, templates to support arm64. [@asylumexp](https://github.com/asylumexp) ([#14653](https://github.com/community-scripts/ProxmoxVE/pull/14653))
|
||||||
|
- SoulSync: setup Node v22 and build WebUI [@MickLesk](https://github.com/MickLesk) ([#14639](https://github.com/community-scripts/ProxmoxVE/pull/14639))
|
||||||
|
- Refactor: Dispatcharr [@MickLesk](https://github.com/MickLesk) ([#14313](https://github.com/community-scripts/ProxmoxVE/pull/14313))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix: make LXC banner OS detection dynamic via /etc/os-release [@atahan99](https://github.com/atahan99) ([#14269](https://github.com/community-scripts/ProxmoxVE/pull/14269))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- core: suppress MOTD for non-interactive shells [@MickLesk](https://github.com/MickLesk) ([#14638](https://github.com/community-scripts/ProxmoxVE/pull/14638))
|
||||||
|
|
||||||
|
## 2026-05-21
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- snowshare: use mv instead of cp for uploads backup to prevent disk fill [@TuroYT](https://github.com/TuroYT) ([#14558](https://github.com/community-scripts/ProxmoxVE/pull/14558))
|
||||||
|
- Technitium DNS: download release before stopping the service on update [@w-gitops](https://github.com/w-gitops) ([#14616](https://github.com/community-scripts/ProxmoxVE/pull/14616))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Proxmox VE 9.2 support [@MickLesk](https://github.com/MickLesk) ([#14624](https://github.com/community-scripts/ProxmoxVE/pull/14624))
|
||||||
|
|
||||||
|
## 2026-05-20
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Update mylar3 to point to new Repo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14606](https://github.com/community-scripts/ProxmoxVE/pull/14606))
|
||||||
|
- Ollama: Fix for latest version [@tremor021](https://github.com/tremor021) ([#14596](https://github.com/community-scripts/ProxmoxVE/pull/14596))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Profilarr v2: Update and Refactor whole Script [@MickLesk](https://github.com/MickLesk) ([#14584](https://github.com/community-scripts/ProxmoxVE/pull/14584))
|
||||||
|
|
||||||
|
## 2026-05-19
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- LobeHub ([#14441](https://github.com/community-scripts/ProxmoxVE/pull/14441))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Update nodejs Versions [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14582](https://github.com/community-scripts/ProxmoxVE/pull/14582))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- ESPConnect: Fix paths to SSL certificates [@tremor021](https://github.com/tremor021) ([#14591](https://github.com/community-scripts/ProxmoxVE/pull/14591))
|
||||||
|
- ReactiveResume: set correct WorkingDirectory for systemd service [@MickLesk](https://github.com/MickLesk) ([#14579](https://github.com/community-scripts/ProxmoxVE/pull/14579))
|
||||||
|
- Sparkyfitness: add missing nginx template variable substitutions [@MickLesk](https://github.com/MickLesk) ([#14578](https://github.com/community-scripts/ProxmoxVE/pull/14578))
|
||||||
|
- Wanderer: include dev dependencies during build [@MickLesk](https://github.com/MickLesk) ([#14577](https://github.com/community-scripts/ProxmoxVE/pull/14577))
|
||||||
|
- Whisparr: switch from nightly to stable GitHub release [@MickLesk](https://github.com/MickLesk) ([#14581](https://github.com/community-scripts/ProxmoxVE/pull/14581))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: SonarQube [@tremor021](https://github.com/tremor021) ([#14594](https://github.com/community-scripts/ProxmoxVE/pull/14594))
|
||||||
|
|
||||||
|
## 2026-05-18
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- ESPconnect ([#14444](https://github.com/community-scripts/ProxmoxVE/pull/14444))
|
||||||
|
- degoog ([#14533](https://github.com/community-scripts/ProxmoxVE/pull/14533))
|
||||||
|
- Webtrees ([#14532](https://github.com/community-scripts/ProxmoxVE/pull/14532))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Bichon: Support v1 migration [@tomfrenzel](https://github.com/tomfrenzel) ([#14524](https://github.com/community-scripts/ProxmoxVE/pull/14524))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Pangolin: bump to 1.18.4, fix missing statusHistory migration [@MickLesk](https://github.com/MickLesk) ([#14566](https://github.com/community-scripts/ProxmoxVE/pull/14566))
|
||||||
|
|
||||||
|
## 2026-05-17
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- dashy: fix yarn-missing on update and back up full user-data [@lissy93](https://github.com/lissy93) ([#14548](https://github.com/community-scripts/ProxmoxVE/pull/14548))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: replace max-time with speed-limit stall detection in curl_download [@MickLesk](https://github.com/MickLesk) ([#14545](https://github.com/community-scripts/ProxmoxVE/pull/14545))
|
||||||
|
|
||||||
|
## 2026-05-16
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Homelable: replace passlib with bcrypt for password hashing [@MickLesk](https://github.com/MickLesk) ([#14530](https://github.com/community-scripts/ProxmoxVE/pull/14530))
|
||||||
|
- dashy: fix: restore [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14527](https://github.com/community-scripts/ProxmoxVE/pull/14527))
|
||||||
|
- Update Tinyauth source URL in installation script [@MehrunesSky](https://github.com/MehrunesSky) ([#14483](https://github.com/community-scripts/ProxmoxVE/pull/14483))
|
||||||
|
- Excalidraw: Fix build [@tremor021](https://github.com/tremor021) ([#14509](https://github.com/community-scripts/ProxmoxVE/pull/14509))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Update authentik version to 2026.2.3 [@thieneret](https://github.com/thieneret) ([#14517](https://github.com/community-scripts/ProxmoxVE/pull/14517))
|
||||||
|
|
||||||
|
## 2026-05-15
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- OPNsense: replace undefined msg_warn with inline echo in alloc retry [@MickLesk](https://github.com/MickLesk) ([#14500](https://github.com/community-scripts/ProxmoxVE/pull/14500))
|
||||||
|
- Checkmk: detect OMD version suffix dynamically on update [@MickLesk](https://github.com/MickLesk) ([#14496](https://github.com/community-scripts/ProxmoxVE/pull/14496))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- SearXNG: enable JSON format by default for API integrations [@MickLesk](https://github.com/MickLesk) ([#14498](https://github.com/community-scripts/ProxmoxVE/pull/14498))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Ollama use tools.func [@MickLesk](https://github.com/MickLesk) ([#14501](https://github.com/community-scripts/ProxmoxVE/pull/14501))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: fall back to silent mode when no TTY or whiptail unavailable [@MickLesk](https://github.com/MickLesk) ([#14497](https://github.com/community-scripts/ProxmoxVE/pull/14497))
|
||||||
|
|
||||||
|
## 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
|
## 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
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- Save Omada version [@lucacome](https://github.com/lucacome) ([#14433](https://github.com/community-scripts/ProxmoxVE/pull/14433))
|
- 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
|
## 2026-05-11
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
@@ -685,441 +1098,3 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
- #### 🔧 Refactor
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
- Mail-Archiver: update dependencies [@tremor021](https://github.com/tremor021) ([#14152](https://github.com/community-scripts/ProxmoxVE/pull/14152))
|
- Mail-Archiver: update dependencies [@tremor021](https://github.com/tremor021) ([#14152](https://github.com/community-scripts/ProxmoxVE/pull/14152))
|
||||||
|
|
||||||
## 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))
|
|
||||||
@@ -30,7 +30,7 @@ The collection covers hundreds of services across categories like home automatio
|
|||||||
|
|
||||||
| Component | Details |
|
| Component | Details |
|
||||||
| -------------- | ------------------------------------------------ |
|
| -------------- | ------------------------------------------------ |
|
||||||
| **Proxmox VE** | Version 8.4, 9.0, or 9.1 |
|
| **Proxmox VE** | Version 8.4, 9.0, 9.1, or 9.2 |
|
||||||
| **Host OS** | Proxmox VE (Debian-based) |
|
| **Host OS** | Proxmox VE (Debian-based) |
|
||||||
| **Access** | Root shell access on the Proxmox host |
|
| **Access** | Root shell access on the Proxmox host |
|
||||||
| **Network** | Internet connection required during installation |
|
| **Network** | Internet connection required during installation |
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ This project currently supports the following versions of Proxmox VE (PVE):
|
|||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ------------------ |
|
||||||
|
| 9.2.x | :white_check_mark: |
|
||||||
| 9.1.x | :white_check_mark: |
|
| 9.1.x | :white_check_mark: |
|
||||||
| 9.0.x | :white_check_mark: |
|
| 9.0.x | :white_check_mark: |
|
||||||
| 8.4.x | :white_check_mark: |
|
| 8.4.x | :white_check_mark: |
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ APP="AdventureLog"
|
|||||||
var_tags="${var_tags:-traveling}"
|
var_tags="${var_tags:-traveling}"
|
||||||
var_disk="${var_disk:-7}"
|
var_disk="${var_disk:-7}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-4096}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-8}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-ubuntu}"
|
var_os="${var_os:-ubuntu}"
|
||||||
var_version="${var_version:-24.04}"
|
var_version="${var_version:-24.04}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-0}"
|
var_unprivileged="${var_unprivileged:-0}"
|
||||||
var_gpu="${var_gpu:-yes}"
|
var_gpu="${var_gpu:-yes}"
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-3}"
|
var_disk="${var_disk:-3}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-20}"
|
var_disk="${var_disk:-20}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-3}"
|
var_disk="${var_disk:-3}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-5}"
|
var_disk="${var_disk:-5}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-3}"
|
var_disk="${var_disk:-3}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-8}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -59,11 +60,12 @@ 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} Complete setup by running:${CL}"
|
echo -e "${INFO}${YW} Next Steps:${CL}"
|
||||||
echo -e "${TAB}${BGN}ironclaw onboard${CL}"
|
echo -e "${TAB}1. Complete setup by running:${CL}"
|
||||||
echo -e "${INFO}${YW} Then start the service:${CL}"
|
echo -e "${TAB}${TAB}${BGN}/usr/local/bin/ironclaw onboard${CL}"
|
||||||
echo -e "${TAB}${BGN}rc-service ironclaw start${CL}"
|
echo -e "${TAB}2. Start the service:${CL}"
|
||||||
echo -e "${INFO}${YW} Access the Web UI at:${CL}"
|
echo -e "${TAB}${TAB}${BGN}rc-service ironclaw start${CL}"
|
||||||
|
echo -e "${TAB}3. Access the Web UI at:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
||||||
echo -e "${INFO}${YW} Auth token and database credentials:${CL}"
|
echo -e "${INFO}${YW} Use Gateway Authentication Token to login:${CL}"
|
||||||
echo -e "${TAB}${BGN}cat /root/.ironclaw/.env${CL}"
|
echo -e "${TAB}${TAB}${BGN}cat /root/.ironclaw/gateway.creds${CL}"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
var_fuse="${var_fuse:-yes}"
|
var_fuse="${var_fuse:-yes}"
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-3}"
|
var_disk="${var_disk:-3}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -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/steveiliop56/tinyauth
|
# Source: https://github.com/tinyauthapp/tinyauth
|
||||||
|
|
||||||
APP="Alpine-Tinyauth"
|
APP="Alpine-Tinyauth"
|
||||||
var_tags="${var_tags:-alpine;auth}"
|
var_tags="${var_tags:-alpine;auth}"
|
||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -29,7 +30,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/steveiliop56/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -s https://api.github.com/repos/tinyauthapp/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 +52,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/steveiliop56/tinyauth/releases/download/v${RELEASE}/tinyauth-amd64" -o /opt/tinyauth/tinyauth
|
curl -fsSL "https://github.com/tinyauthapp/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"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-256}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
var_tun="${var_tun:-1}"
|
var_tun="${var_tun:-1}"
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_cpu="${var_cpu:-1}"
|
|||||||
var_ram="${var_ram:-256}"
|
var_ram="${var_ram:-256}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-0}"
|
var_unprivileged="${var_unprivileged:-0}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-1}"
|
var_disk="${var_disk:-1}"
|
||||||
var_os="${var_os:-alpine}"
|
var_os="${var_os:-alpine}"
|
||||||
var_version="${var_version:-3.23}"
|
var_version="${var_version:-3.23}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_cpu="${var_cpu:-4}"
|
|||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}"
|
|||||||
var_disk="${var_disk:-16}"
|
var_disk="${var_disk:-16}"
|
||||||
var_os="${var_os:-ubuntu}"
|
var_os="${var_os:-ubuntu}"
|
||||||
var_version="${var_version:-24.04}"
|
var_version="${var_version:-24.04}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_cpu="${var_cpu:-1}"
|
|||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -89,7 +90,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 -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-jdbc-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-jdbc.tar.gz"
|
curl_download "/tmp/guacamole-auth-jdbc.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-jdbc-${LATEST_SERVER}.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 +102,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 -fsSL "https://downloads.apache.org/guacamole/${LATEST_CLIENT}/binary/guacamole-${LATEST_CLIENT}.war" -o "/opt/apache-guacamole/tomcat9/webapps/guacamole.war"
|
curl_download "/opt/apache-guacamole/tomcat9/webapps/guacamole.war" "https://downloads.apache.org/guacamole/${LATEST_CLIENT}/binary/guacamole-${LATEST_CLIENT}.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 +112,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 -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"
|
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"
|
||||||
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 +149,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 -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-totp-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-totp.tar.gz"
|
curl_download "/tmp/guacamole-auth-totp.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-totp-${LATEST_SERVER}.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 +161,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 -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-duo-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-duo.tar.gz"
|
curl_download "/tmp/guacamole-auth-duo.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-duo-${LATEST_SERVER}.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 +173,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 -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-ldap-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-ldap.tar.gz"
|
curl_download "/tmp/guacamole-auth-ldap.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-ldap-${LATEST_SERVER}.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 +185,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 -fsSL "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-quickconnect-${LATEST_SERVER}.tar.gz" -o "/tmp/guacamole-auth-quickconnect.tar.gz"
|
curl_download "/tmp/guacamole-auth-quickconnect.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-quickconnect-${LATEST_SERVER}.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 +197,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 -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"
|
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"
|
||||||
$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
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_cpu="${var_cpu:-1}"
|
|||||||
var_ram="${var_ram:-1024}"
|
var_ram="${var_ram:-1024}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-8}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-3}"
|
var_disk="${var_disk:-3}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-8}"
|
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_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-5}"
|
var_disk="${var_disk:-5}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
156
ct/authentik.sh
Normal file
156
ct/authentik.sh
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
#!/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_arm64="${var_arm64:-no}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/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}"
|
||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-8}"
|
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_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ 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:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_cpu="${var_cpu:-2}"
|
|||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-8}"
|
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_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-5}"
|
var_disk="${var_disk:-5}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
81
ct/bichon.sh
81
ct/bichon.sh
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -28,15 +29,95 @@ 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"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-12}"
|
var_disk="${var_disk:-12}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
var_gpu="${var_gpu:-no}"
|
var_gpu="${var_gpu:-no}"
|
||||||
|
|
||||||
@@ -42,6 +43,7 @@ function update_script() {
|
|||||||
cp /opt/birdnet/birdnet-go /usr/local/bin/birdnet-go
|
cp /opt/birdnet/birdnet-go /usr/local/bin/birdnet-go
|
||||||
chmod +x /usr/local/bin/birdnet-go
|
chmod +x /usr/local/bin/birdnet-go
|
||||||
cp -r /opt/birdnet/libtensorflowlite_c.so /usr/local/lib/ || true
|
cp -r /opt/birdnet/libtensorflowlite_c.so /usr/local/lib/ || true
|
||||||
|
cp -r /opt/birdnet/libonnxruntime.so /usr/local/lib/ || true
|
||||||
ldconfig
|
ldconfig
|
||||||
msg_ok "Deployed Binary"
|
msg_ok "Deployed Binary"
|
||||||
|
|
||||||
|
|||||||
71
ct/bitfocus-companion.sh
Normal file
71
ct/bitfocus-companion.sh
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
#!/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: glabutis
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/bitfocus/companion
|
||||||
|
|
||||||
|
APP="Bitfocus-Companion"
|
||||||
|
var_tags="${var_tags:-automation;media}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -f /opt/bitfocus-companion/companion_headless.sh ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
RELEASE_JSON=$(curl -fsSL "https://api.bitfocus.io/v1/product/companion/packages?limit=20")
|
||||||
|
PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c '(if type == "array" then . else .packages end) | [.[] | select(.target=="linux-tgz" and (.uri | contains("linux-x64")))] | first')
|
||||||
|
RELEASE=$(echo "$PACKAGE_JSON" | jq -r '.version // empty')
|
||||||
|
ASSET_URL=$(echo "$PACKAGE_JSON" | jq -r '.uri // empty')
|
||||||
|
if [[ -z "$RELEASE" || -z "$ASSET_URL" ]]; then
|
||||||
|
msg_error "Could not resolve a matching Linux x64 Companion package from the Bitfocus API."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${RELEASE}" == "$(cat ~/.bitfocus-companion 2>/dev/null)" ]]; then
|
||||||
|
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop bitfocus-companion
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
msg_info "Updating ${APP} to v${RELEASE}"
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_from_url "$ASSET_URL" "/opt/bitfocus-companion"
|
||||||
|
echo "${RELEASE}" >~/.bitfocus-companion
|
||||||
|
msg_ok "Updated ${APP} to v${RELEASE}"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
systemctl start bitfocus-companion
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
|
||||||
|
msg_ok "Update Successful"
|
||||||
|
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}"
|
||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-8192}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_cpu="${var_cpu:-1}"
|
|||||||
var_ram="${var_ram:-1024}"
|
var_ram="${var_ram:-1024}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-6}"
|
var_disk="${var_disk:-6}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-8}"
|
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_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}"
|
|||||||
var_disk="${var_disk:-8}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-8}"
|
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_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-0}"
|
var_unprivileged="${var_unprivileged:-0}"
|
||||||
var_gpu="${var_gpu:-yes}"
|
var_gpu="${var_gpu:-yes}"
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}"
|
|||||||
var_disk="${var_disk:-10}"
|
var_disk="${var_disk:-10}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ 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:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -33,9 +34,14 @@ function update_script() {
|
|||||||
msg_info "Updating checkmk"
|
msg_info "Updating checkmk"
|
||||||
$STD omd stop monitoring
|
$STD omd stop monitoring
|
||||||
$STD omd cp monitoring monitoringbackup
|
$STD omd cp monitoring monitoringbackup
|
||||||
curl_with_retry "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-community-${RELEASE}_0.$(get_os_info codename)_amd64.deb" "/opt/checkmk.deb"
|
curl_download "/opt/checkmk.deb" "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-community-${RELEASE}_0.$(get_os_info codename)_amd64.deb"
|
||||||
$STD apt install -y /opt/checkmk.deb
|
$STD apt install -y /opt/checkmk.deb
|
||||||
$STD omd --force -V ${RELEASE}.cre update --conflict=install monitoring
|
OMD_VERSION=$(omd versions 2>/dev/null | grep "^${RELEASE}" | awk '{print $1}')
|
||||||
|
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
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
56
ct/cliproxyapi.sh
Normal file
56
ct/cliproxyapi.sh
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/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_arm64="${var_arm64:-no}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/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}"
|
||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}"
|
|||||||
var_disk="${var_disk:-3}"
|
var_disk="${var_disk:-3}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var_ram="${var_ram:-512}"
|
|||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-13}"
|
var_version="${var_version:-13}"
|
||||||
|
var_arm64="${var_arm64:-no}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user