mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-05 21:03:24 +01:00
Compare commits
146 Commits
2026-01-31
...
github-act
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ee050c70e | ||
|
|
ed2876ff59 | ||
|
|
bbaf0e448c | ||
|
|
822de63f48 | ||
|
|
cb939861b8 | ||
|
|
c576728833 | ||
|
|
1953f4c1c2 | ||
|
|
6ef18a47cb | ||
|
|
161e17e856 | ||
|
|
f5103852f5 | ||
|
|
464cabc035 | ||
|
|
8640dd97cd | ||
|
|
6ed9afb40b | ||
|
|
fbf04bee6a | ||
|
|
c9bb2788be | ||
|
|
93e4eb5b22 | ||
|
|
f4d4a00180 | ||
|
|
101f882022 | ||
|
|
8f97908896 | ||
|
|
833a6a248b | ||
|
|
9a65218900 | ||
|
|
b61abacb76 | ||
|
|
273c5c75ee | ||
|
|
06d9199d89 | ||
|
|
5d5c273fb6 | ||
|
|
92506cdc34 | ||
|
|
5db509eb16 | ||
|
|
129f2f6329 | ||
|
|
be9d26885a | ||
|
|
ddd130dbe3 | ||
|
|
93c52abebd | ||
|
|
a74f6ee3c3 | ||
|
|
b36051375b | ||
|
|
7b8a3a111d | ||
|
|
be994ce84f | ||
|
|
4bd5c7b54b | ||
|
|
868446a4b6 | ||
|
|
5f31954d91 | ||
|
|
b025fd049c | ||
|
|
3046eb000d | ||
|
|
472439ce6e | ||
|
|
43044c60f0 | ||
|
|
36bf5cb57e | ||
|
|
338c054112 | ||
|
|
17ac4f5ae7 | ||
|
|
5210d1bb71 | ||
|
|
c599fd7551 | ||
|
|
0644bef572 | ||
|
|
27ab446926 | ||
|
|
81abf70851 | ||
|
|
c570cbe0be | ||
|
|
fa86809863 | ||
|
|
c6dfa052ee | ||
|
|
2e9624fdfb | ||
|
|
e99702977c | ||
|
|
757a54e23a | ||
|
|
0029ad0dee | ||
|
|
65e50542b0 | ||
|
|
ce22e8ae8b | ||
|
|
56e626c897 | ||
|
|
75e79b2100 | ||
|
|
057523aabb | ||
|
|
0b48fdf7fd | ||
|
|
f9c5c1d0b4 | ||
|
|
fb368bc2d8 | ||
|
|
18f6df752f | ||
|
|
45aa75afc0 | ||
|
|
baabbc4d53 | ||
|
|
89e53f9245 | ||
|
|
7c0a812b3d | ||
|
|
6411ae1d37 | ||
|
|
6967029ae3 | ||
|
|
3621a4ef35 | ||
|
|
586a436f3d | ||
|
|
97e37cfb1f | ||
|
|
24b2a945d5 | ||
|
|
40780edbd2 | ||
|
|
3b1b703561 | ||
|
|
991b56d412 | ||
|
|
4b9adbb249 | ||
|
|
13b4094ff8 | ||
|
|
3d0243adb0 | ||
|
|
c612bfefcd | ||
|
|
d7872a8240 | ||
|
|
abfd57f486 | ||
|
|
7c8abb5c68 | ||
|
|
474f1e8886 | ||
|
|
1b941f36f1 | ||
|
|
4e27213df1 | ||
|
|
b0d9864ebd | ||
|
|
8fd1826e87 | ||
|
|
ba2d3e5030 | ||
|
|
dd240c4b3c | ||
|
|
a9121c9572 | ||
|
|
b86fabf8ab | ||
|
|
2be8b94176 | ||
|
|
f3dad5163f | ||
|
|
be42ee40fb | ||
|
|
632aa1991f | ||
|
|
7fc77fe5be | ||
|
|
ac74b760f0 | ||
|
|
f84c9960bb | ||
|
|
29e90da2bc | ||
|
|
0773114aeb | ||
|
|
ea264f673b | ||
|
|
3f769c6492 | ||
|
|
742248dabd | ||
|
|
8226360700 | ||
|
|
b706775a4b | ||
|
|
2f907cc4e0 | ||
|
|
b1927d2678 | ||
|
|
a35b0fbd79 | ||
|
|
4418ed4615 | ||
|
|
19d8592104 | ||
|
|
627587c54b | ||
|
|
b36609dfd5 | ||
|
|
98dc00a1a0 | ||
|
|
ff9f0ed21d | ||
|
|
bc83a37124 | ||
|
|
e0593caa02 | ||
|
|
99e19d4422 | ||
|
|
f8d8769a73 | ||
|
|
8a1b05ccac | ||
|
|
0b167e386c | ||
|
|
edef7f179a | ||
|
|
a5bf7d9fdc | ||
|
|
10e5f99965 | ||
|
|
c82d792a79 | ||
|
|
8589afb17e | ||
|
|
2d5e9592d7 | ||
|
|
6f171f29de | ||
|
|
aebe478fe9 | ||
|
|
ab1d0c78c3 | ||
|
|
5705d2bd87 | ||
|
|
e4a4329d1a | ||
|
|
72b54447c3 | ||
|
|
ddbe93fdcc | ||
|
|
6bb55c6e54 | ||
|
|
7e4e0b8941 | ||
|
|
54b9d8d3e8 | ||
|
|
c4116a16e9 | ||
|
|
2f80620a12 | ||
|
|
686210ef7b | ||
|
|
c64e5bb1a7 | ||
|
|
61964c264e | ||
|
|
f9cf742c25 |
310
.github/changelogs/2026/01.md
generated
vendored
310
.github/changelogs/2026/01.md
generated
vendored
@@ -1,14 +1,156 @@
|
||||
## 2026-01-27
|
||||
## 2026-01-31
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- shelfmark ([#11371](https://github.com/community-scripts/ProxmoxVE/pull/11371))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix: yubal: add git [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11394](https://github.com/community-scripts/ProxmoxVE/pull/11394))
|
||||
|
||||
## 2026-01-30
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- languagetool ([#11370](https://github.com/community-scripts/ProxmoxVE/pull/11370))
|
||||
- Ampache ([#11369](https://github.com/community-scripts/ProxmoxVE/pull/11369))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: remove redundant PHP_MODULE entries in several scripts [@MickLesk](https://github.com/MickLesk) ([#11362](https://github.com/community-scripts/ProxmoxVE/pull/11362))
|
||||
- Refactor: Koillection [@MickLesk](https://github.com/MickLesk) ([#11361](https://github.com/community-scripts/ProxmoxVE/pull/11361))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: meilisearch - add data migration for version upgrades [@MickLesk](https://github.com/MickLesk) ([#11356](https://github.com/community-scripts/ProxmoxVE/pull/11356))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [tools] Add `fetch_and_deploy_from_url()` [@tremor021](https://github.com/tremor021) ([#11376](https://github.com/community-scripts/ProxmoxVE/pull/11376))
|
||||
- core: php - improve module handling and prevent installation failures [@MickLesk](https://github.com/MickLesk) ([#11358](https://github.com/community-scripts/ProxmoxVE/pull/11358))
|
||||
|
||||
## 2026-01-29
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Alpine-Valkey [@MickLesk](https://github.com/MickLesk) ([#11320](https://github.com/community-scripts/ProxmoxVE/pull/11320))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Immich: Pin version to 2.5.2 [@vhsdream](https://github.com/vhsdream) ([#11335](https://github.com/community-scripts/ProxmoxVE/pull/11335))
|
||||
- Kollection: Update to php 8.5 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11315](https://github.com/community-scripts/ProxmoxVE/pull/11315))
|
||||
- Notifiarr: change installation check from apt to systemd service [@MickLesk](https://github.com/MickLesk) ([#11319](https://github.com/community-scripts/ProxmoxVE/pull/11319))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [FEAT] Immich: Enable Maintenance Mode before update [@vhsdream](https://github.com/vhsdream) ([#11342](https://github.com/community-scripts/ProxmoxVE/pull/11342))
|
||||
- jellyfin: add logrotate instead of reducing log level [@MickLesk](https://github.com/MickLesk) ([#11326](https://github.com/community-scripts/ProxmoxVE/pull/11326))
|
||||
- core: Add config file handling options | Fix Vikunja update with interactive overwrite [@MickLesk](https://github.com/MickLesk) ([#11317](https://github.com/community-scripts/ProxmoxVE/pull/11317))
|
||||
- Immich: v2.5.0 [@vhsdream](https://github.com/vhsdream) ([#11240](https://github.com/community-scripts/ProxmoxVE/pull/11240))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- fix: vikunja v1 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11308](https://github.com/community-scripts/ProxmoxVE/pull/11308))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Byparr [@vhsdream](https://github.com/vhsdream) ([#11338](https://github.com/community-scripts/ProxmoxVE/pull/11338))
|
||||
- cloudflare: Remove deprecated DNS-over-HTTPS proxy option [@MickLesk](https://github.com/MickLesk) ([#11068](https://github.com/community-scripts/ProxmoxVE/pull/11068))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- build.func: Replace storage variable with searchdomain variable [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11322](https://github.com/community-scripts/ProxmoxVE/pull/11322))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
- Add workflow to lock closed issues [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11316](https://github.com/community-scripts/ProxmoxVE/pull/11316))
|
||||
|
||||
## 2026-01-28
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- nodecast-tv ([#11287](https://github.com/community-scripts/ProxmoxVE/pull/11287))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Ubuntu 25.04 VM - Change default start from yes to no [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11292](https://github.com/community-scripts/ProxmoxVE/pull/11292))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- various scripts: use setup_meilisearch function [@MickLesk](https://github.com/MickLesk) ([#11259](https://github.com/community-scripts/ProxmoxVE/pull/11259))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: NPMPlus / Default Login [@MickLesk](https://github.com/MickLesk) ([#11262](https://github.com/community-scripts/ProxmoxVE/pull/11262))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: sed patch for ram [@lavacano](https://github.com/lavacano) ([#11285](https://github.com/community-scripts/ProxmoxVE/pull/11285))
|
||||
- Fix installer loop caused by invalid whiptail menu separator [@Mesteriis](https://github.com/Mesteriis) ([#11237](https://github.com/community-scripts/ProxmoxVE/pull/11237))
|
||||
- core: fix Debian 13 LXC template root ownership bug [@MickLesk](https://github.com/MickLesk) ([#11277](https://github.com/community-scripts/ProxmoxVE/pull/11277))
|
||||
- tools.func: prevent systemd-tmpfiles failure in unprivileged LXC during deb install [@MickLesk](https://github.com/MickLesk) ([#11271](https://github.com/community-scripts/ProxmoxVE/pull/11271))
|
||||
- tools.func: fix php "wait_for" hint [@MickLesk](https://github.com/MickLesk) ([#11254](https://github.com/community-scripts/ProxmoxVE/pull/11254))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: update dynamic values in LXC profile on update_motd_ip [@MickLesk](https://github.com/MickLesk) ([#11268](https://github.com/community-scripts/ProxmoxVE/pull/11268))
|
||||
- tools.func: add new function - setup_meilisearch [@MickLesk](https://github.com/MickLesk) ([#11258](https://github.com/community-scripts/ProxmoxVE/pull/11258))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
- github: add GitHub-based versions.json updater [@MickLesk](https://github.com/MickLesk) ([#10021](https://github.com/community-scripts/ProxmoxVE/pull/10021))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Frontend: use github-versions.json for version display [@MickLesk](https://github.com/MickLesk) ([#11281](https://github.com/community-scripts/ProxmoxVE/pull/11281))
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- fix: homarr: conf location [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11253](https://github.com/community-scripts/ProxmoxVE/pull/11253))
|
||||
|
||||
## 2026-01-27
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- [FIX] Jotty: backup and restore custom config [@vhsdream](https://github.com/vhsdream) ([#11212](https://github.com/community-scripts/ProxmoxVE/pull/11212))
|
||||
- Immich: update libraw [@vhsdream](https://github.com/vhsdream) ([#11233](https://github.com/community-scripts/ProxmoxVE/pull/11233))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- grist: enable optional enterprise features toggle [@MickLesk](https://github.com/MickLesk) ([#11239](https://github.com/community-scripts/ProxmoxVE/pull/11239))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Termix: use nginx.conf from upstream repo [@MickLesk](https://github.com/MickLesk) ([#11228](https://github.com/community-scripts/ProxmoxVE/pull/11228))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat: add NVIDIA driver install prompt for GPU-enabled containers [@devdecrux](https://github.com/devdecrux) ([#11184](https://github.com/community-scripts/ProxmoxVE/pull/11184))
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- doc setup_deb822_repo arg order [@chrnie](https://github.com/chrnie) ([#11215](https://github.com/community-scripts/ProxmoxVE/pull/11215))
|
||||
- changelog: archive old entries to year/month files [@MickLesk](https://github.com/MickLesk) ([#11225](https://github.com/community-scripts/ProxmoxVE/pull/11225))
|
||||
|
||||
## 2026-01-26
|
||||
|
||||
@@ -100,7 +242,7 @@
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Tracearr ([#11079](https://github.com/community-scripts/ProxmoxVE/pull/11079))
|
||||
- Dawarich ([#11075](https://github.com/community-scripts/ProxmoxVE/pull/11075))
|
||||
- Dawarich ([#11075](https://github.com/community-scripts/ProxmoxVE/pull/11075))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
@@ -250,7 +392,7 @@
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Termix ([#10887](https://github.com/community-scripts/ProxmoxVE/pull/10887))
|
||||
- ThingsBoard ([#10904](https://github.com/community-scripts/ProxmoxVE/pull/10904))
|
||||
- ThingsBoard ([#10904](https://github.com/community-scripts/ProxmoxVE/pull/10904))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
@@ -319,7 +461,7 @@
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Flatnotes ([#10857](https://github.com/community-scripts/ProxmoxVE/pull/10857))
|
||||
- Unifi OS Server ([#10856](https://github.com/community-scripts/ProxmoxVE/pull/10856))
|
||||
- Unifi OS Server ([#10856](https://github.com/community-scripts/ProxmoxVE/pull/10856))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
@@ -385,7 +527,7 @@
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Investbrain ([#10774](https://github.com/community-scripts/ProxmoxVE/pull/10774))
|
||||
- Fladder ([#10768](https://github.com/community-scripts/ProxmoxVE/pull/10768))
|
||||
- Fladder ([#10768](https://github.com/community-scripts/ProxmoxVE/pull/10768))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
@@ -574,7 +716,7 @@
|
||||
### 📚 Documentation
|
||||
|
||||
- [gh] New Script template update [@tremor021](https://github.com/tremor021) ([#10607](https://github.com/community-scripts/ProxmoxVE/pull/10607))
|
||||
- chore: bump copyright to 2026 - happy new year [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10585](https://github.com/community-scripts/ProxmoxVE/pull/10585))
|
||||
- chore: bump copyright to 2026 - happy new year [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10585](https://github.com/community-scripts/ProxmoxVE/pull/10585))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
@@ -655,7 +797,7 @@
|
||||
### ❔ Uncategorized
|
||||
|
||||
- Wireguard: Update WGDashboard notes URL to the new link [@tremor021](https://github.com/tremor021) ([#10496](https://github.com/community-scripts/ProxmoxVE/pull/10496))
|
||||
- InvoiceNinja: Update database credentias information [@tremor021](https://github.com/tremor021) ([#10497](https://github.com/community-scripts/ProxmoxVE/pull/10497))
|
||||
- InvoiceNinja: Update database credentias information [@tremor021](https://github.com/tremor021) ([#10497](https://github.com/community-scripts/ProxmoxVE/pull/10497))
|
||||
|
||||
## 2026-01-02
|
||||
|
||||
@@ -684,157 +826,3 @@
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix MariaDB runtime directory persistence on container reboot [@Copilot](https://github.com/Copilot) ([#10468](https://github.com/community-scripts/ProxmoxVE/pull/10468))
|
||||
|
||||
|
||||
## 2026-01-31
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- shelfmark ([#11371](https://github.com/community-scripts/ProxmoxVE/pull/11371))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix: yubal: add git [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11394](https://github.com/community-scripts/ProxmoxVE/pull/11394))
|
||||
|
||||
## 2026-01-30
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- languagetool ([#11370](https://github.com/community-scripts/ProxmoxVE/pull/11370))
|
||||
- Ampache ([#11369](https://github.com/community-scripts/ProxmoxVE/pull/11369))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: remove redundant PHP_MODULE entries in several scripts [@MickLesk](https://github.com/MickLesk) ([#11362](https://github.com/community-scripts/ProxmoxVE/pull/11362))
|
||||
- Refactor: Koillection [@MickLesk](https://github.com/MickLesk) ([#11361](https://github.com/community-scripts/ProxmoxVE/pull/11361))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: meilisearch - add data migration for version upgrades [@MickLesk](https://github.com/MickLesk) ([#11356](https://github.com/community-scripts/ProxmoxVE/pull/11356))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [tools] Add `fetch_and_deploy_from_url()` [@tremor021](https://github.com/tremor021) ([#11376](https://github.com/community-scripts/ProxmoxVE/pull/11376))
|
||||
- core: php - improve module handling and prevent installation failures [@MickLesk](https://github.com/MickLesk) ([#11358](https://github.com/community-scripts/ProxmoxVE/pull/11358))
|
||||
|
||||
## 2026-01-29
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Alpine-Valkey [@MickLesk](https://github.com/MickLesk) ([#11320](https://github.com/community-scripts/ProxmoxVE/pull/11320))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Immich: Pin version to 2.5.2 [@vhsdream](https://github.com/vhsdream) ([#11335](https://github.com/community-scripts/ProxmoxVE/pull/11335))
|
||||
- Kollection: Update to php 8.5 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11315](https://github.com/community-scripts/ProxmoxVE/pull/11315))
|
||||
- Notifiarr: change installation check from apt to systemd service [@MickLesk](https://github.com/MickLesk) ([#11319](https://github.com/community-scripts/ProxmoxVE/pull/11319))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [FEAT] Immich: Enable Maintenance Mode before update [@vhsdream](https://github.com/vhsdream) ([#11342](https://github.com/community-scripts/ProxmoxVE/pull/11342))
|
||||
- jellyfin: add logrotate instead of reducing log level [@MickLesk](https://github.com/MickLesk) ([#11326](https://github.com/community-scripts/ProxmoxVE/pull/11326))
|
||||
- core: Add config file handling options | Fix Vikunja update with interactive overwrite [@MickLesk](https://github.com/MickLesk) ([#11317](https://github.com/community-scripts/ProxmoxVE/pull/11317))
|
||||
- Immich: v2.5.0 [@vhsdream](https://github.com/vhsdream) ([#11240](https://github.com/community-scripts/ProxmoxVE/pull/11240))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- fix: vikunja v1 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11308](https://github.com/community-scripts/ProxmoxVE/pull/11308))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Byparr [@vhsdream](https://github.com/vhsdream) ([#11338](https://github.com/community-scripts/ProxmoxVE/pull/11338))
|
||||
- cloudflare: Remove deprecated DNS-over-HTTPS proxy option [@MickLesk](https://github.com/MickLesk) ([#11068](https://github.com/community-scripts/ProxmoxVE/pull/11068))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- build.func: Replace storage variable with searchdomain variable [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11322](https://github.com/community-scripts/ProxmoxVE/pull/11322))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
- Add workflow to lock closed issues [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11316](https://github.com/community-scripts/ProxmoxVE/pull/11316))
|
||||
|
||||
## 2026-01-28
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- nodecast-tv ([#11287](https://github.com/community-scripts/ProxmoxVE/pull/11287))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Ubuntu 25.04 VM - Change default start from yes to no [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11292](https://github.com/community-scripts/ProxmoxVE/pull/11292))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- various scripts: use setup_meilisearch function [@MickLesk](https://github.com/MickLesk) ([#11259](https://github.com/community-scripts/ProxmoxVE/pull/11259))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: NPMPlus / Default Login [@MickLesk](https://github.com/MickLesk) ([#11262](https://github.com/community-scripts/ProxmoxVE/pull/11262))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: sed patch for ram [@lavacano](https://github.com/lavacano) ([#11285](https://github.com/community-scripts/ProxmoxVE/pull/11285))
|
||||
- Fix installer loop caused by invalid whiptail menu separator [@Mesteriis](https://github.com/Mesteriis) ([#11237](https://github.com/community-scripts/ProxmoxVE/pull/11237))
|
||||
- core: fix Debian 13 LXC template root ownership bug [@MickLesk](https://github.com/MickLesk) ([#11277](https://github.com/community-scripts/ProxmoxVE/pull/11277))
|
||||
- tools.func: prevent systemd-tmpfiles failure in unprivileged LXC during deb install [@MickLesk](https://github.com/MickLesk) ([#11271](https://github.com/community-scripts/ProxmoxVE/pull/11271))
|
||||
- tools.func: fix php "wait_for" hint [@MickLesk](https://github.com/MickLesk) ([#11254](https://github.com/community-scripts/ProxmoxVE/pull/11254))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: update dynamic values in LXC profile on update_motd_ip [@MickLesk](https://github.com/MickLesk) ([#11268](https://github.com/community-scripts/ProxmoxVE/pull/11268))
|
||||
- tools.func: add new function - setup_meilisearch [@MickLesk](https://github.com/MickLesk) ([#11258](https://github.com/community-scripts/ProxmoxVE/pull/11258))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
- github: add GitHub-based versions.json updater [@MickLesk](https://github.com/MickLesk) ([#10021](https://github.com/community-scripts/ProxmoxVE/pull/10021))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Frontend: use github-versions.json for version display [@MickLesk](https://github.com/MickLesk) ([#11281](https://github.com/community-scripts/ProxmoxVE/pull/11281))
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- fix: homarr: conf location [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11253](https://github.com/community-scripts/ProxmoxVE/pull/11253))
|
||||
|
||||
## 2026-01-27
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Immich: update libraw [@vhsdream](https://github.com/vhsdream) ([#11233](https://github.com/community-scripts/ProxmoxVE/pull/11233))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- grist: enable optional enterprise features toggle [@MickLesk](https://github.com/MickLesk) ([#11239](https://github.com/community-scripts/ProxmoxVE/pull/11239))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Termix: use nginx.conf from upstream repo [@MickLesk](https://github.com/MickLesk) ([#11228](https://github.com/community-scripts/ProxmoxVE/pull/11228))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat: add NVIDIA driver install prompt for GPU-enabled containers [@devdecrux](https://github.com/devdecrux) ([#11184](https://github.com/community-scripts/ProxmoxVE/pull/11184))
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- doc setup_deb822_repo arg order [@chrnie](https://github.com/chrnie) ([#11215](https://github.com/community-scripts/ProxmoxVE/pull/11215))
|
||||
- changelog: archive old entries to year/month files [@MickLesk](https://github.com/MickLesk) ([#11225](https://github.com/community-scripts/ProxmoxVE/pull/11225))
|
||||
121
.github/changelogs/2026/02.md
generated
vendored
Normal file
121
.github/changelogs/2026/02.md
generated
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
## 2026-02-04
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527))
|
||||
- WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(frontend): implement weighted search scoring for command menu [@ls-root](https://github.com/ls-root) ([#11534](https://github.com/community-scripts/ProxmoxVE/pull/11534))
|
||||
|
||||
## 2026-02-03
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Wealthfolio ([#11511](https://github.com/community-scripts/ProxmoxVE/pull/11511))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- [FIX] Shelfmark: unpin Chromium version [@vhsdream](https://github.com/vhsdream) ([#11505](https://github.com/community-scripts/ProxmoxVE/pull/11505))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [FEAT] Scanopy: automatically update integrated daemon [@vhsdream](https://github.com/vhsdream) ([#11506](https://github.com/community-scripts/ProxmoxVE/pull/11506))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- [FIX] tools.func: trim spaces in app_lc when checking for gh release [@vhsdream](https://github.com/vhsdream) ([#11512](https://github.com/community-scripts/ProxmoxVE/pull/11512))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(frontend): decouple table pagination from summary fetching [@ls-root](https://github.com/ls-root) ([#11495](https://github.com/community-scripts/ProxmoxVE/pull/11495))
|
||||
|
||||
## 2026-02-02
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- rustypaste | Alpine-rustypaste ([#11457](https://github.com/community-scripts/ProxmoxVE/pull/11457))
|
||||
- KitchenOwl ([#11453](https://github.com/community-scripts/ProxmoxVE/pull/11453))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Grist: Update dependencies [@tremor021](https://github.com/tremor021) ([#11489](https://github.com/community-scripts/ProxmoxVE/pull/11489))
|
||||
- Allow "downgrade" of libigdgmm12 [@vhsdream](https://github.com/vhsdream) ([#11478](https://github.com/community-scripts/ProxmoxVE/pull/11478))
|
||||
- Disable NPM install and update due to OpenResty SHA-1 signature issues [@MickLesk](https://github.com/MickLesk) ([#11471](https://github.com/community-scripts/ProxmoxVE/pull/11471))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Refactor: Forgejo & readeck - migrate to codeberg functions [@MickLesk](https://github.com/MickLesk) ([#11460](https://github.com/community-scripts/ProxmoxVE/pull/11460))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- [FIX] Scanopy: remove daemon build [@vhsdream](https://github.com/vhsdream) ([#11444](https://github.com/community-scripts/ProxmoxVE/pull/11444))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Vaultwarden [@MickLesk](https://github.com/MickLesk) ([#11445](https://github.com/community-scripts/ProxmoxVE/pull/11445))
|
||||
- various scripts: use ensure_dependencies instead of apt [@MickLesk](https://github.com/MickLesk) ([#11463](https://github.com/community-scripts/ProxmoxVE/pull/11463))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- cleanup(frontend): remove unused /category-view route [@ls-root](https://github.com/ls-root) ([#11461](https://github.com/community-scripts/ProxmoxVE/pull/11461))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(frontend): preview tab [@ls-root](https://github.com/ls-root) ([#11475](https://github.com/community-scripts/ProxmoxVE/pull/11475))
|
||||
|
||||
## 2026-02-01
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- fix headers [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11422](https://github.com/community-scripts/ProxmoxVE/pull/11422))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- 2fauth: export PHP_VERSION for nginx config [@MickLesk](https://github.com/MickLesk) ([#11441](https://github.com/community-scripts/ProxmoxVE/pull/11441))
|
||||
- Prometheus Paperless NGX Exporter: Set correct binary path in systemd unit file [@andygrunwald](https://github.com/andygrunwald) ([#11438](https://github.com/community-scripts/ProxmoxVE/pull/11438))
|
||||
- tracearr: install/update new prestart script from upstream [@durzo](https://github.com/durzo) ([#11433](https://github.com/community-scripts/ProxmoxVE/pull/11433))
|
||||
- n8n: Fix dependencies [@tremor021](https://github.com/tremor021) ([#11429](https://github.com/community-scripts/ProxmoxVE/pull/11429))
|
||||
- [Hotfix] Bunkerweb update [@vhsdream](https://github.com/vhsdream) ([#11402](https://github.com/community-scripts/ProxmoxVE/pull/11402))
|
||||
- [Hotfix] Immich: revert healthcheck feature [@vhsdream](https://github.com/vhsdream) ([#11427](https://github.com/community-scripts/ProxmoxVE/pull/11427))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- tools.func: add codeberg functions & autocaliweb: migrate from GitHub to Codeberg [@MickLesk](https://github.com/MickLesk) ([#11440](https://github.com/community-scripts/ProxmoxVE/pull/11440))
|
||||
- Immich Refactor #2 [@vhsdream](https://github.com/vhsdream) ([#11375](https://github.com/community-scripts/ProxmoxVE/pull/11375))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- WordPress: Refactor [@tremor021](https://github.com/tremor021) ([#11408](https://github.com/community-scripts/ProxmoxVE/pull/11408))
|
||||
- Refactor: Whisparr [@tremor021](https://github.com/tremor021) ([#11411](https://github.com/community-scripts/ProxmoxVE/pull/11411))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [tools]: Update `fetch_and_deply_from_url()` [@tremor021](https://github.com/tremor021) ([#11410](https://github.com/community-scripts/ProxmoxVE/pull/11410))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- feat(frontend): implement UX refinements and syntax highlighting [@ls-root](https://github.com/ls-root) ([#11423](https://github.com/community-scripts/ProxmoxVE/pull/11423))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(frontend): add contribution CTA to empty search state [@ls-root](https://github.com/ls-root) ([#11412](https://github.com/community-scripts/ProxmoxVE/pull/11412))
|
||||
97
.github/workflows/changelog-archive.yml
generated
vendored
97
.github/workflows/changelog-archive.yml
generated
vendored
@@ -54,8 +54,9 @@ jobs:
|
||||
|
||||
console.log(`Cutoff date: ${cutoffDate.toISOString().split('T')[0]}`);
|
||||
|
||||
// Read changelog
|
||||
const content = await fs.readFile(CHANGELOG_PATH, 'utf-8');
|
||||
// Read changelog and normalize line endings
|
||||
let content = await fs.readFile(CHANGELOG_PATH, 'utf-8');
|
||||
content = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
||||
const lines = content.split('\n');
|
||||
|
||||
// Parse entries
|
||||
@@ -66,9 +67,39 @@ jobs:
|
||||
let currentDate = null;
|
||||
let currentContent = [];
|
||||
let inHeader = true;
|
||||
let inOldHistory = false;
|
||||
let historyDetailsDepth = 0;
|
||||
|
||||
for (const line of lines) {
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
const line = lines[i];
|
||||
const match = line.match(datePattern);
|
||||
|
||||
// Detect the start of History section: <details> followed by line with 📜 History
|
||||
if (inHeader && !inOldHistory && line.trim() === '<details>') {
|
||||
// Look ahead to see if this is the History section
|
||||
const nextLine = lines[i + 1] || '';
|
||||
if (nextLine.includes('📜 History')) {
|
||||
inOldHistory = true;
|
||||
historyDetailsDepth = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Track nested details tags to find the end of History section
|
||||
if (inOldHistory) {
|
||||
if (line.trim() === '<details>') {
|
||||
historyDetailsDepth++;
|
||||
}
|
||||
if (line.trim() === '</details>') {
|
||||
historyDetailsDepth--;
|
||||
if (historyDetailsDepth === 0) {
|
||||
// We've closed the main History details tag
|
||||
inOldHistory = false;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (match) {
|
||||
inHeader = false;
|
||||
|
||||
@@ -148,30 +179,55 @@ jobs:
|
||||
let existingContent = '';
|
||||
try {
|
||||
existingContent = await fs.readFile(monthPath, 'utf-8');
|
||||
// Normalize line endings to prevent regex issues
|
||||
existingContent = existingContent.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
||||
} catch (e) {
|
||||
// File doesn't exist
|
||||
}
|
||||
|
||||
// Merge new entries with existing (avoid duplicates)
|
||||
const existingDates = new Set();
|
||||
const existingDatePattern = /^## (\d{4}-\d{2}-\d{2})$/gm;
|
||||
let match;
|
||||
while ((match = existingDatePattern.exec(existingContent)) !== null) {
|
||||
existingDates.add(match[1]);
|
||||
// Parse existing entries into a Map (date -> content) for deduplication
|
||||
const allEntries = new Map();
|
||||
|
||||
// Helper function to parse entries from content
|
||||
const parseEntries = (content) => {
|
||||
const entries = new Map();
|
||||
const parts = content.split(/(?=^## \d{4}-\d{2}-\d{2}$)/m);
|
||||
for (const part of parts) {
|
||||
const trimmed = part.trim();
|
||||
if (!trimmed) continue;
|
||||
const dateMatch = trimmed.match(/^## (\d{4}-\d{2}-\d{2})/);
|
||||
if (dateMatch) {
|
||||
entries.set(dateMatch[1], trimmed);
|
||||
}
|
||||
}
|
||||
return entries;
|
||||
};
|
||||
|
||||
// Parse existing content
|
||||
if (existingContent) {
|
||||
const existingEntries = parseEntries(existingContent);
|
||||
for (const [date, content] of existingEntries) {
|
||||
allEntries.set(date, content);
|
||||
}
|
||||
}
|
||||
|
||||
const newEntries = archiveData[year][month].filter(entry => {
|
||||
// Add new entries (existing entries take precedence to avoid overwriting)
|
||||
let addedCount = 0;
|
||||
for (const entry of archiveData[year][month]) {
|
||||
const dateMatch = entry.match(/^## (\d{4}-\d{2}-\d{2})/);
|
||||
return dateMatch && !existingDates.has(dateMatch[1]);
|
||||
});
|
||||
if (dateMatch && !allEntries.has(dateMatch[1])) {
|
||||
allEntries.set(dateMatch[1], entry.trim());
|
||||
addedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (newEntries.length > 0) {
|
||||
const allContent = existingContent
|
||||
? existingContent + '\n\n' + newEntries.join('\n\n')
|
||||
: newEntries.join('\n\n');
|
||||
|
||||
await fs.writeFile(monthPath, allContent, 'utf-8');
|
||||
console.log(`Updated: ${monthPath} (+${newEntries.length} entries)`);
|
||||
// Sort entries by date (newest first) and write
|
||||
const sortedDates = [...allEntries.keys()].sort().reverse();
|
||||
const sortedContent = sortedDates.map(date => allEntries.get(date)).join('\n\n');
|
||||
|
||||
if (addedCount > 0 || !existingContent) {
|
||||
await fs.writeFile(monthPath, sortedContent + '\n', 'utf-8');
|
||||
console.log(`Updated: ${monthPath} (${allEntries.size} total entries, +${addedCount} new)`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -218,7 +274,8 @@ jobs:
|
||||
// Count entries in month file
|
||||
let entryCount = 0;
|
||||
try {
|
||||
const monthContent = await fs.readFile(monthPath, 'utf-8');
|
||||
let monthContent = await fs.readFile(monthPath, 'utf-8');
|
||||
monthContent = monthContent.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
||||
entryCount = (monthContent.match(/^## \d{4}-\d{2}-\d{2}$/gm) || []).length;
|
||||
} catch (e) {
|
||||
entryCount = (archiveData[year]?.[month] || []).length;
|
||||
|
||||
79
.github/workflows/lock-issue.yaml
generated
vendored
79
.github/workflows/lock-issue.yaml
generated
vendored
@@ -18,7 +18,6 @@ jobs:
|
||||
with:
|
||||
script: |
|
||||
const daysBeforeLock = 3;
|
||||
const cutoffDate = new Date('2026-01-27T00:00:00Z');
|
||||
const lockDate = new Date();
|
||||
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
||||
|
||||
@@ -29,48 +28,50 @@ jobs:
|
||||
/dependabot/i
|
||||
];
|
||||
|
||||
// Search for closed, unlocked issues older than 3 days
|
||||
const issues = await github.rest.search.issuesAndPullRequests({
|
||||
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
|
||||
per_page: 50
|
||||
});
|
||||
// Search for closed, unlocked issues older than 3 days (paginated, oldest first)
|
||||
let page = 1;
|
||||
let totalLocked = 0;
|
||||
|
||||
console.log(`Found ${issues.data.items.length} issues/PRs to process`);
|
||||
|
||||
for (const item of issues.data.items) {
|
||||
// Skip excluded items
|
||||
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
|
||||
if (shouldExclude) {
|
||||
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
|
||||
continue;
|
||||
}
|
||||
while (true) {
|
||||
const issues = await github.rest.search.issuesAndPullRequests({
|
||||
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
|
||||
sort: 'updated',
|
||||
order: 'asc',
|
||||
per_page: 100,
|
||||
page: page
|
||||
});
|
||||
|
||||
const createdAt = new Date(item.created_at);
|
||||
const isNew = createdAt >= cutoffDate;
|
||||
if (issues.data.items.length === 0) break;
|
||||
|
||||
try {
|
||||
// Add comment only for new issues (created after 2026-01-27)
|
||||
if (isNew) {
|
||||
const comment = item.pull_request
|
||||
? 'This pull request has been automatically locked. Please open a new issue for related bugs.'
|
||||
: 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.';
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
...context.repo,
|
||||
issue_number: item.number,
|
||||
body: comment
|
||||
});
|
||||
console.log(`Page ${page}: ${issues.data.items.length} items (total available: ${issues.data.total_count})`);
|
||||
|
||||
for (const item of issues.data.items) {
|
||||
// Skip excluded items
|
||||
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
|
||||
if (shouldExclude) {
|
||||
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Lock the issue/PR
|
||||
await github.rest.issues.lock({
|
||||
...context.repo,
|
||||
issue_number: item.number,
|
||||
lock_reason: 'resolved'
|
||||
});
|
||||
|
||||
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
||||
} catch (error) {
|
||||
console.log(`Failed to lock #${item.number}: ${error.message}`);
|
||||
try {
|
||||
// Lock the issue/PR silently
|
||||
await github.rest.issues.lock({
|
||||
...context.repo,
|
||||
issue_number: item.number,
|
||||
lock_reason: 'resolved'
|
||||
});
|
||||
|
||||
totalLocked++;
|
||||
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
||||
} catch (error) {
|
||||
console.log(`Failed to lock #${item.number}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
page++;
|
||||
|
||||
// GitHub search API limit: max 10000 results (100 pages * 100) - temporarily increased
|
||||
if (page > 100) break;
|
||||
}
|
||||
|
||||
console.log(`Total locked: ${totalLocked} issues/PRs`);
|
||||
|
||||
497
CHANGELOG.md
497
CHANGELOG.md
@@ -21,7 +21,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
|
||||
<details>
|
||||
<summary><h4>January - 27 entries</h4></summary>
|
||||
<summary><h4>February (4 entries)</h4></summary>
|
||||
|
||||
[View February 2026 Changelog](.github/changelogs/2026/02.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>January (31 entries)</h4></summary>
|
||||
|
||||
[View January 2026 Changelog](.github/changelogs/2026/01.md)
|
||||
|
||||
@@ -391,389 +398,182 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-02-05
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
<details>
|
||||
<summary><h2>📜 History</h2></summary>
|
||||
- OpenCloud ([#11538](https://github.com/community-scripts/ProxmoxVE/pull/11538))
|
||||
- Nginx-UI ([#11573](https://github.com/community-scripts/ProxmoxVE/pull/11573))
|
||||
- New: SQL-Server 2025 | Refactor SQL-Server 2022 [@MickLesk](https://github.com/MickLesk) ([#11546](https://github.com/community-scripts/ProxmoxVE/pull/11546))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
<details>
|
||||
<summary><h3>2026</h3></summary>
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- OpenCloud: pin version to 5.0.2; Collabora CSP fix [@vhsdream](https://github.com/vhsdream) ([#11585](https://github.com/community-scripts/ProxmoxVE/pull/11585))
|
||||
- Wanderer: Fix repo [@tremor021](https://github.com/tremor021) ([#11567](https://github.com/community-scripts/ProxmoxVE/pull/11567))
|
||||
|
||||
<details>
|
||||
<summary><h4>January (31 entries)</h4></summary>
|
||||
- #### ✨ New Features
|
||||
|
||||
[View January 2026 Changelog](.github/changelogs/2026/01.md)
|
||||
- Refactor: Docker-VM (Multi-OS / Cloud-Init / Stabilization) [@MickLesk](https://github.com/MickLesk) ([#9047](https://github.com/community-scripts/ProxmoxVE/pull/9047))
|
||||
|
||||
</details>
|
||||
### 💾 Core
|
||||
|
||||
</details>
|
||||
- #### ✨ New Features
|
||||
|
||||
<details>
|
||||
<summary><h3>2025</h3></summary>
|
||||
- cloud-init: add interactive SSH key discovery and selection [@MickLesk](https://github.com/MickLesk) ([#11547](https://github.com/community-scripts/ProxmoxVE/pull/11547))
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
<details>
|
||||
<summary><h4>December (31 entries)</h4></summary>
|
||||
- github: extend docs / contribution / templates [@MickLesk](https://github.com/MickLesk) ([#10921](https://github.com/community-scripts/ProxmoxVE/pull/10921))
|
||||
|
||||
[View December 2025 Changelog](.github/changelogs/2025/12.md)
|
||||
### 🌐 Website
|
||||
|
||||
</details>
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
<details>
|
||||
<summary><h4>November (29 entries)</h4></summary>
|
||||
- fix(frontend): theme respective syntax highlighting [@ls-root](https://github.com/ls-root) ([#11565](https://github.com/community-scripts/ProxmoxVE/pull/11565))
|
||||
|
||||
[View November 2025 Changelog](.github/changelogs/2025/11.md)
|
||||
## 2026-02-04
|
||||
|
||||
</details>
|
||||
### 🆕 New Scripts
|
||||
|
||||
<details>
|
||||
<summary><h4>October (30 entries)</h4></summary>
|
||||
- Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527))
|
||||
- WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524))
|
||||
|
||||
[View October 2025 Changelog](.github/changelogs/2025/10.md)
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
</details>
|
||||
- Add log directory and permissions for koillection [@shineangelic](https://github.com/shineangelic) ([#11553](https://github.com/community-scripts/ProxmoxVE/pull/11553))
|
||||
|
||||
<details>
|
||||
<summary><h4>September (29 entries)</h4></summary>
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
[View September 2025 Changelog](.github/changelogs/2025/09.md)
|
||||
- [FIX] Scanopy: ensure Scanopy Daemon update [@vhsdream](https://github.com/vhsdream) ([#11541](https://github.com/community-scripts/ProxmoxVE/pull/11541))
|
||||
- Immich: pin version to 2.5.3 [@vhsdream](https://github.com/vhsdream) ([#11515](https://github.com/community-scripts/ProxmoxVE/pull/11515))
|
||||
|
||||
</details>
|
||||
### 💾 Core
|
||||
|
||||
<details>
|
||||
<summary><h4>August (30 entries)</h4></summary>
|
||||
- #### ✨ New Features
|
||||
|
||||
[View August 2025 Changelog](.github/changelogs/2025/08.md)
|
||||
- core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528))
|
||||
|
||||
</details>
|
||||
### 🧰 Tools
|
||||
|
||||
<details>
|
||||
<summary><h4>July (29 entries)</h4></summary>
|
||||
- #### ✨ New Features
|
||||
|
||||
[View July 2025 Changelog](.github/changelogs/2025/07.md)
|
||||
- [ADDON] Immich Public Proxy addon [@vhsdream](https://github.com/vhsdream) ([#11518](https://github.com/community-scripts/ProxmoxVE/pull/11518))
|
||||
|
||||
</details>
|
||||
### 🌐 Website
|
||||
|
||||
<details>
|
||||
<summary><h4>June (29 entries)</h4></summary>
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
[View June 2025 Changelog](.github/changelogs/2025/06.md)
|
||||
- fix(frontend): implement weighted search scoring for command menu [@ls-root](https://github.com/ls-root) ([#11534](https://github.com/community-scripts/ProxmoxVE/pull/11534))
|
||||
|
||||
</details>
|
||||
### ❔ Uncategorized
|
||||
|
||||
<details>
|
||||
<summary><h4>May (30 entries)</h4></summary>
|
||||
- [FIX] Immich Public Proxy docs link [@vhsdream](https://github.com/vhsdream) ([#11543](https://github.com/community-scripts/ProxmoxVE/pull/11543))
|
||||
|
||||
[View May 2025 Changelog](.github/changelogs/2025/05.md)
|
||||
## 2026-02-03
|
||||
|
||||
</details>
|
||||
### 🆕 New Scripts
|
||||
|
||||
<details>
|
||||
<summary><h4>April (25 entries)</h4></summary>
|
||||
- Wealthfolio ([#11511](https://github.com/community-scripts/ProxmoxVE/pull/11511))
|
||||
|
||||
[View April 2025 Changelog](.github/changelogs/2025/04.md)
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
</details>
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
<details>
|
||||
<summary><h4>March (30 entries)</h4></summary>
|
||||
- [FIX] Shelfmark: unpin Chromium version [@vhsdream](https://github.com/vhsdream) ([#11505](https://github.com/community-scripts/ProxmoxVE/pull/11505))
|
||||
|
||||
[View March 2025 Changelog](.github/changelogs/2025/03.md)
|
||||
- #### ✨ New Features
|
||||
|
||||
</details>
|
||||
- [FEAT] Scanopy: automatically update integrated daemon [@vhsdream](https://github.com/vhsdream) ([#11506](https://github.com/community-scripts/ProxmoxVE/pull/11506))
|
||||
|
||||
<details>
|
||||
<summary><h4>February (26 entries)</h4></summary>
|
||||
### 💾 Core
|
||||
|
||||
[View February 2025 Changelog](.github/changelogs/2025/02.md)
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
</details>
|
||||
- [FIX] tools.func: trim spaces in app_lc when checking for gh release [@vhsdream](https://github.com/vhsdream) ([#11512](https://github.com/community-scripts/ProxmoxVE/pull/11512))
|
||||
|
||||
<details>
|
||||
<summary><h4>January (27 entries)</h4></summary>
|
||||
### 🌐 Website
|
||||
|
||||
[View January 2025 Changelog](.github/changelogs/2025/01.md)
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
</details>
|
||||
- fix(frontend): decouple table pagination from summary fetching [@ls-root](https://github.com/ls-root) ([#11495](https://github.com/community-scripts/ProxmoxVE/pull/11495))
|
||||
|
||||
</details>
|
||||
## 2026-02-02
|
||||
|
||||
<details>
|
||||
<summary><h3>2024</h3></summary>
|
||||
### 🆕 New Scripts
|
||||
|
||||
- rustypaste | Alpine-rustypaste ([#11457](https://github.com/community-scripts/ProxmoxVE/pull/11457))
|
||||
- KitchenOwl ([#11453](https://github.com/community-scripts/ProxmoxVE/pull/11453))
|
||||
|
||||
<details>
|
||||
<summary><h4>December (22 entries)</h4></summary>
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
[View December 2024 Changelog](.github/changelogs/2024/12.md)
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
</details>
|
||||
- Grist: Update dependencies [@tremor021](https://github.com/tremor021) ([#11489](https://github.com/community-scripts/ProxmoxVE/pull/11489))
|
||||
- Allow "downgrade" of libigdgmm12 [@vhsdream](https://github.com/vhsdream) ([#11478](https://github.com/community-scripts/ProxmoxVE/pull/11478))
|
||||
- Disable NPM install and update due to OpenResty SHA-1 signature issues [@MickLesk](https://github.com/MickLesk) ([#11471](https://github.com/community-scripts/ProxmoxVE/pull/11471))
|
||||
|
||||
<details>
|
||||
<summary><h4>November (15 entries)</h4></summary>
|
||||
- #### ✨ New Features
|
||||
|
||||
[View November 2024 Changelog](.github/changelogs/2024/11.md)
|
||||
- Refactor: Forgejo & readeck - migrate to codeberg functions [@MickLesk](https://github.com/MickLesk) ([#11460](https://github.com/community-scripts/ProxmoxVE/pull/11460))
|
||||
|
||||
</details>
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
<details>
|
||||
<summary><h4>October (9 entries)</h4></summary>
|
||||
- [FIX] Scanopy: remove daemon build [@vhsdream](https://github.com/vhsdream) ([#11444](https://github.com/community-scripts/ProxmoxVE/pull/11444))
|
||||
|
||||
[View October 2024 Changelog](.github/changelogs/2024/10.md)
|
||||
- #### 🔧 Refactor
|
||||
|
||||
</details>
|
||||
- Refactor: Vaultwarden [@MickLesk](https://github.com/MickLesk) ([#11445](https://github.com/community-scripts/ProxmoxVE/pull/11445))
|
||||
- various scripts: use ensure_dependencies instead of apt [@MickLesk](https://github.com/MickLesk) ([#11463](https://github.com/community-scripts/ProxmoxVE/pull/11463))
|
||||
|
||||
<details>
|
||||
<summary><h4>September (1 entries)</h4></summary>
|
||||
### 🌐 Website
|
||||
|
||||
[View September 2024 Changelog](.github/changelogs/2024/09.md)
|
||||
- cleanup(frontend): remove unused /category-view route [@ls-root](https://github.com/ls-root) ([#11461](https://github.com/community-scripts/ProxmoxVE/pull/11461))
|
||||
|
||||
</details>
|
||||
- #### ✨ New Features
|
||||
|
||||
<details>
|
||||
<summary><h4>August (2 entries)</h4></summary>
|
||||
|
||||
[View August 2024 Changelog](.github/changelogs/2024/08.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>July (0 entries)</h4></summary>
|
||||
|
||||
[View July 2024 Changelog](.github/changelogs/2024/07.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>June (8 entries)</h4></summary>
|
||||
|
||||
[View June 2024 Changelog](.github/changelogs/2024/06.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>May (16 entries)</h4></summary>
|
||||
|
||||
[View May 2024 Changelog](.github/changelogs/2024/05.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>April (14 entries)</h4></summary>
|
||||
|
||||
[View April 2024 Changelog](.github/changelogs/2024/04.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>March (5 entries)</h4></summary>
|
||||
|
||||
[View March 2024 Changelog](.github/changelogs/2024/03.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>February (9 entries)</h4></summary>
|
||||
|
||||
[View February 2024 Changelog](.github/changelogs/2024/02.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>January (9 entries)</h4></summary>
|
||||
|
||||
[View January 2024 Changelog](.github/changelogs/2024/01.md)
|
||||
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h3>2023</h3></summary>
|
||||
|
||||
|
||||
<details>
|
||||
<summary><h4>December (3 entries)</h4></summary>
|
||||
|
||||
[View December 2023 Changelog](.github/changelogs/2023/12.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>November (3 entries)</h4></summary>
|
||||
|
||||
[View November 2023 Changelog](.github/changelogs/2023/11.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>October (7 entries)</h4></summary>
|
||||
|
||||
[View October 2023 Changelog](.github/changelogs/2023/10.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>September (10 entries)</h4></summary>
|
||||
|
||||
[View September 2023 Changelog](.github/changelogs/2023/09.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>August (7 entries)</h4></summary>
|
||||
|
||||
[View August 2023 Changelog](.github/changelogs/2023/08.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>July (5 entries)</h4></summary>
|
||||
|
||||
[View July 2023 Changelog](.github/changelogs/2023/07.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>June (5 entries)</h4></summary>
|
||||
|
||||
[View June 2023 Changelog](.github/changelogs/2023/06.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>May (8 entries)</h4></summary>
|
||||
|
||||
[View May 2023 Changelog](.github/changelogs/2023/05.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>April (8 entries)</h4></summary>
|
||||
|
||||
[View April 2023 Changelog](.github/changelogs/2023/04.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>March (8 entries)</h4></summary>
|
||||
|
||||
[View March 2023 Changelog](.github/changelogs/2023/03.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>February (6 entries)</h4></summary>
|
||||
|
||||
[View February 2023 Changelog](.github/changelogs/2023/02.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>January (15 entries)</h4></summary>
|
||||
|
||||
[View January 2023 Changelog](.github/changelogs/2023/01.md)
|
||||
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h3>2022</h3></summary>
|
||||
|
||||
|
||||
<details>
|
||||
<summary><h4>December (7 entries)</h4></summary>
|
||||
|
||||
[View December 2022 Changelog](.github/changelogs/2022/12.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>November (7 entries)</h4></summary>
|
||||
|
||||
[View November 2022 Changelog](.github/changelogs/2022/11.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>October (2 entries)</h4></summary>
|
||||
|
||||
[View October 2022 Changelog](.github/changelogs/2022/10.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>September (9 entries)</h4></summary>
|
||||
|
||||
[View September 2022 Changelog](.github/changelogs/2022/09.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>August (7 entries)</h4></summary>
|
||||
|
||||
[View August 2022 Changelog](.github/changelogs/2022/08.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>July (10 entries)</h4></summary>
|
||||
|
||||
[View July 2022 Changelog](.github/changelogs/2022/07.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>June (1 entries)</h4></summary>
|
||||
|
||||
[View June 2022 Changelog](.github/changelogs/2022/06.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>May (8 entries)</h4></summary>
|
||||
|
||||
[View May 2022 Changelog](.github/changelogs/2022/05.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>April (13 entries)</h4></summary>
|
||||
|
||||
[View April 2022 Changelog](.github/changelogs/2022/04.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>March (20 entries)</h4></summary>
|
||||
|
||||
[View March 2022 Changelog](.github/changelogs/2022/03.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>February (15 entries)</h4></summary>
|
||||
|
||||
[View February 2022 Changelog](.github/changelogs/2022/02.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><h4>January (3 entries)</h4></summary>
|
||||
|
||||
[View January 2022 Changelog](.github/changelogs/2022/01.md)
|
||||
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
</details>
|
||||
- feat(frontend): preview tab [@ls-root](https://github.com/ls-root) ([#11475](https://github.com/community-scripts/ProxmoxVE/pull/11475))
|
||||
|
||||
## 2026-02-01
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- fix headers [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11422](https://github.com/community-scripts/ProxmoxVE/pull/11422))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- 2fauth: export PHP_VERSION for nginx config [@MickLesk](https://github.com/MickLesk) ([#11441](https://github.com/community-scripts/ProxmoxVE/pull/11441))
|
||||
- Prometheus Paperless NGX Exporter: Set correct binary path in systemd unit file [@andygrunwald](https://github.com/andygrunwald) ([#11438](https://github.com/community-scripts/ProxmoxVE/pull/11438))
|
||||
- tracearr: install/update new prestart script from upstream [@durzo](https://github.com/durzo) ([#11433](https://github.com/community-scripts/ProxmoxVE/pull/11433))
|
||||
- n8n: Fix dependencies [@tremor021](https://github.com/tremor021) ([#11429](https://github.com/community-scripts/ProxmoxVE/pull/11429))
|
||||
- [Hotfix] Bunkerweb update [@vhsdream](https://github.com/vhsdream) ([#11402](https://github.com/community-scripts/ProxmoxVE/pull/11402))
|
||||
- [Hotfix] Immich: revert healthcheck feature [@vhsdream](https://github.com/vhsdream) ([#11427](https://github.com/community-scripts/ProxmoxVE/pull/11427))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- tools.func: add codeberg functions & autocaliweb: migrate from GitHub to Codeberg [@MickLesk](https://github.com/MickLesk) ([#11440](https://github.com/community-scripts/ProxmoxVE/pull/11440))
|
||||
- Immich Refactor #2 [@vhsdream](https://github.com/vhsdream) ([#11375](https://github.com/community-scripts/ProxmoxVE/pull/11375))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- WordPress: Refactor [@tremor021](https://github.com/tremor021) ([#11408](https://github.com/community-scripts/ProxmoxVE/pull/11408))
|
||||
- Refactor: Whisparr [@tremor021](https://github.com/tremor021) ([#11411](https://github.com/community-scripts/ProxmoxVE/pull/11411))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [tools]: Update `fetch_and_deply_from_url()` [@tremor021](https://github.com/tremor021) ([#11410](https://github.com/community-scripts/ProxmoxVE/pull/11410))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- feat(frontend): implement UX refinements and syntax highlighting [@ls-root](https://github.com/ls-root) ([#11423](https://github.com/community-scripts/ProxmoxVE/pull/11423))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(frontend): add contribution CTA to empty search state [@ls-root](https://github.com/ls-root) ([#11412](https://github.com/community-scripts/ProxmoxVE/pull/11412))
|
||||
|
||||
## 2026-01-31
|
||||
|
||||
### 🆕 New Scripts
|
||||
@@ -1524,64 +1324,3 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: IP-Tag (Multiple IP / Performance / Execution Time) [@MickLesk](https://github.com/MickLesk) ([#10558](https://github.com/community-scripts/ProxmoxVE/pull/10558))
|
||||
|
||||
## 2026-01-04
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- PocketID: Update PocketID for 2.x [@tremor021](https://github.com/tremor021) ([#10506](https://github.com/community-scripts/ProxmoxVE/pull/10506))
|
||||
- fix: reitti: nginx [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10511](https://github.com/community-scripts/ProxmoxVE/pull/10511))
|
||||
- MagicMirror: bump to nodejs 24 [@MickLesk](https://github.com/MickLesk) ([#10534](https://github.com/community-scripts/ProxmoxVE/pull/10534))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: SFTPGo [@tremor021](https://github.com/tremor021) ([#10518](https://github.com/community-scripts/ProxmoxVE/pull/10518))
|
||||
- Refactor: Pelican Wings [@tremor021](https://github.com/tremor021) ([#10517](https://github.com/community-scripts/ProxmoxVE/pull/10517))
|
||||
- Refactor: Pelican Panel [@tremor021](https://github.com/tremor021) ([#10516](https://github.com/community-scripts/ProxmoxVE/pull/10516))
|
||||
- Refactor: Audiobookshelf [@tremor021](https://github.com/tremor021) ([#10519](https://github.com/community-scripts/ProxmoxVE/pull/10519))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Export IPV6_METHOD to trigger verb_ip6() function [@remz1337](https://github.com/remz1337) ([#10538](https://github.com/community-scripts/ProxmoxVE/pull/10538))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Prowlarr: Update config_path [@tremor021](https://github.com/tremor021) ([#10504](https://github.com/community-scripts/ProxmoxVE/pull/10504))
|
||||
|
||||
## 2026-01-03
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix ownership and permissions for InvoiceNinja setup [@twinzdragonz](https://github.com/twinzdragonz) ([#10298](https://github.com/community-scripts/ProxmoxVE/pull/10298))
|
||||
- Fix headscale Caddyfile to pass non-API URLs [@IlyaSemenov](https://github.com/IlyaSemenov) ([#10493](https://github.com/community-scripts/ProxmoxVE/pull/10493))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- [core]: Preserve log files [@tremor021](https://github.com/tremor021) ([#10509](https://github.com/community-scripts/ProxmoxVE/pull/10509))
|
||||
|
||||
### ❔ Uncategorized
|
||||
|
||||
- Wireguard: Update WGDashboard notes URL to the new link [@tremor021](https://github.com/tremor021) ([#10496](https://github.com/community-scripts/ProxmoxVE/pull/10496))
|
||||
- InvoiceNinja: Update database credentias information [@tremor021](https://github.com/tremor021) ([#10497](https://github.com/community-scripts/ProxmoxVE/pull/10497))
|
||||
|
||||
## 2026-01-02
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix Intel Level Zero package conflict on Debian 13 [@Copilot](https://github.com/Copilot) ([#10467](https://github.com/community-scripts/ProxmoxVE/pull/10467))
|
||||
|
||||
### ❔ Uncategorized
|
||||
|
||||
- Extend guidance for changing the immich upload location for #10447 [@jshprentz](https://github.com/jshprentz) ([#10475](https://github.com/community-scripts/ProxmoxVE/pull/10475))
|
||||
@@ -27,10 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if ! command -v memcached >/dev/null 2>&1; then
|
||||
$STD apt update
|
||||
$STD apt install -y memcached libmemcached-tools
|
||||
fi
|
||||
ensure_dependencies memcached libmemcached-tools
|
||||
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop adventurelog-backend
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: hoholms
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/grafana/loki
|
||||
|
||||
51
ct/alpine-rustypaste.sh
Normal file
51
ct/alpine-rustypaste.sh
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/orhun/rustypaste
|
||||
|
||||
APP="Alpine-RustyPaste"
|
||||
var_tags="${var_tags:-alpine;pastebin;storage}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-256}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-alpine}"
|
||||
var_version="${var_version:-3.23}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if ! apk info -e rustypaste >/dev/null 2>&1; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating RustyPaste"
|
||||
$STD apk update
|
||||
$STD apk upgrade rustypaste --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
|
||||
msg_ok "Updated RustyPaste"
|
||||
|
||||
msg_info "Restarting Services"
|
||||
$STD rc-service rustypaste restart
|
||||
msg_ok "Restarted Services"
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
||||
@@ -31,11 +31,7 @@ function update_script() {
|
||||
NODE_VERSION="22" NODE_MODULE="@postlight/parser@latest,single-file-cli@latest" setup_nodejs
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
|
||||
if ! dpkg -l | grep -q "^ii chromium "; then
|
||||
msg_info "Installing System Dependencies"
|
||||
$STD apt-get install -y chromium
|
||||
msg_ok "Installed System Dependencies"
|
||||
fi
|
||||
ensure_dependencies chromium
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop archivebox
|
||||
|
||||
@@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: vhsdream
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/gelbphoenix/autocaliweb
|
||||
# Source: https://codeberg.org/gelbphoenix/autocaliweb
|
||||
|
||||
APP="Autocaliweb"
|
||||
var_tags="${var_tags:-ebooks}"
|
||||
@@ -30,8 +30,8 @@ function update_script() {
|
||||
|
||||
setup_uv
|
||||
|
||||
RELEASE=$(get_latest_github_release "gelbphoenix/autocaliweb")
|
||||
if check_for_gh_release "autocaliweb" "gelbphoenix/autocaliweb"; then
|
||||
RELEASE=$(get_latest_codeberg_release "gelbphoenix/autocaliweb")
|
||||
if check_for_codeberg_release "autocaliweb" "gelbphoenix/autocaliweb"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop autocaliweb metadata-change-detector acw-ingest-service acw-auto-zipper
|
||||
msg_ok "Stopped Services"
|
||||
@@ -39,7 +39,7 @@ function update_script() {
|
||||
INSTALL_DIR="/opt/autocaliweb"
|
||||
export VIRTUAL_ENV="${INSTALL_DIR}/venv"
|
||||
$STD tar -cf ~/autocaliweb_bkp.tar "$INSTALL_DIR"/{metadata_change_logs,dirs.json,.env,scripts/ingest_watcher.sh,scripts/auto_zipper_wrapper.sh,scripts/metadata_change_detector_wrapper.sh}
|
||||
fetch_and_deploy_gh_release "autocaliweb" "gelbphoenix/autocaliweb" "tarball" "latest" "/opt/autocaliweb"
|
||||
fetch_and_deploy_codeberg_release "autocaliweb" "gelbphoenix/autocaliweb" "tarball" "latest" "/opt/autocaliweb"
|
||||
|
||||
msg_info "Updating Autocaliweb"
|
||||
cd "$INSTALL_DIR"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) community-scripts ORG
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Michelle Zitzerman (Sinofage)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://beszel.dev/
|
||||
|
||||
@@ -30,7 +30,7 @@ function update_script() {
|
||||
|
||||
if check_for_gh_release "bunkerweb" "bunkerity/bunkerweb"; then
|
||||
msg_info "Updating BunkerWeb"
|
||||
RELEASE=$(get_latest_github_release "bunkerweb" "bunkerity/bunkerweb")
|
||||
RELEASE=$(get_latest_github_release "bunkerity/bunkerweb")
|
||||
cat <<EOF >/etc/apt/preferences.d/bunkerweb
|
||||
Package: bunkerweb
|
||||
Pin: version ${RELEASE}
|
||||
|
||||
@@ -29,12 +29,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
if ! dpkg -s libjpeg-dev >/dev/null 2>&1; then
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y libjpeg-dev
|
||||
msg_ok "Updated Dependencies"
|
||||
fi
|
||||
ensure_dependencies libjpeg-dev
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
|
||||
@@ -34,12 +34,7 @@ function update_script() {
|
||||
systemctl stop commafeed
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
if ! [[ $(dpkg -s rsync 2>/dev/null) ]]; then
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt update
|
||||
$STD apt install -y rsync
|
||||
msg_ok "Installed Dependencies"
|
||||
fi
|
||||
ensure_dependencies rsync
|
||||
|
||||
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
|
||||
msg_info "Backing up existing data"
|
||||
|
||||
@@ -44,10 +44,7 @@ function update_script() {
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
if check_for_gh_release "cronicle" "jhuckaby/Cronicle"; then
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
git \
|
||||
build-essential \
|
||||
ca-certificates
|
||||
ensure_dependencies git build-essential ca-certificates
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
|
||||
@@ -38,9 +38,7 @@ function update_script() {
|
||||
systemctl reload nginx
|
||||
fi
|
||||
|
||||
if ! dpkg -s vlc-bin vlc-plugin-base &>/dev/null; then
|
||||
$STD apt update && $STD apt install -y vlc-bin vlc-plugin-base
|
||||
fi
|
||||
ensure_dependencies vlc-bin vlc-plugin-base
|
||||
|
||||
if check_for_gh_release "Dispatcharr" "Dispatcharr/Dispatcharr"; then
|
||||
msg_info "Stopping Services"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: wendyliga
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/DonutWare/Fladder
|
||||
|
||||
@@ -27,35 +27,28 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop forgejo
|
||||
msg_ok "Stopped Service"
|
||||
if check_for_codeberg_release "forgejo" "forgejo/forgejo"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop forgejo
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
RELEASE=$(curl -fsSL https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//')
|
||||
curl -fsSL "https://codeberg.org/forgejo/forgejo/releases/download/v${RELEASE}/forgejo-${RELEASE}-linux-amd64" -o "forgejo-$RELEASE-linux-amd64"
|
||||
rm -rf /opt/forgejo/*
|
||||
cp -r forgejo-$RELEASE-linux-amd64 /opt/forgejo/forgejo-$RELEASE-linux-amd64
|
||||
chmod +x /opt/forgejo/forgejo-$RELEASE-linux-amd64
|
||||
ln -sf /opt/forgejo/forgejo-$RELEASE-linux-amd64 /usr/local/bin/forgejo
|
||||
msg_ok "Updated ${APP}"
|
||||
fetch_and_deploy_codeberg_release "forgejo" "forgejo/forgejo" "singlefile" "latest" "/opt/forgejo" "forgejo-*-linux-amd64"
|
||||
ln -sf /opt/forgejo/forgejo /usr/local/bin/forgejo
|
||||
|
||||
msg_info "Cleaning"
|
||||
rm -rf forgejo-$RELEASE-linux-amd64
|
||||
msg_ok "Cleaned"
|
||||
if grep -q "GITEA_WORK_DIR" /etc/systemd/system/forgejo.service; then
|
||||
msg_info "Updating Service File"
|
||||
sed -i "s/GITEA_WORK_DIR/FORGEJO_WORK_DIR/g" /etc/systemd/system/forgejo.service
|
||||
systemctl daemon-reload
|
||||
msg_ok "Updated Service File"
|
||||
fi
|
||||
|
||||
# Fix env var from older version of community script
|
||||
if grep -q "GITEA_WORK_DIR" /etc/systemd/system/forgejo.service; then
|
||||
msg_info "Updating Service File"
|
||||
sed -i "s/GITEA_WORK_DIR/FORGEJO_WORK_DIR/g" /etc/systemd/system/forgejo.service
|
||||
systemctl daemon-reload
|
||||
msg_ok "Updated Service File"
|
||||
msg_info "Starting Service"
|
||||
systemctl start forgejo
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at the latest version."
|
||||
fi
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start forgejo
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
@@ -43,9 +43,7 @@ function update_script() {
|
||||
msg_error "Project directory does not exist: $PROJECT_DIR"
|
||||
exit
|
||||
fi
|
||||
if ! command -v git &>/dev/null; then
|
||||
$STD apt install -y git
|
||||
fi
|
||||
ensure_dependencies git
|
||||
|
||||
msg_info "Stopping service $SERVICE_NAME"
|
||||
systemctl stop "$SERVICE_NAME"
|
||||
|
||||
@@ -45,7 +45,7 @@ function update_script() {
|
||||
curl -fsSL "https://packages.graylog2.org/repo/packages/graylog-7.0-repository_latest.deb" -o "graylog-7.0-repository_latest.deb"
|
||||
$STD dpkg -i graylog-7.0-repository_latest.deb
|
||||
$STD apt update
|
||||
$STD apt install -y graylog-server graylog-datanode
|
||||
ensure_dependencies graylog-server graylog-datanode
|
||||
rm -f graylog-7.0-repository_latest.deb
|
||||
msg_ok "Updated Graylog"
|
||||
elif dpkg --compare-versions "$CURRENT_VERSION" ge "7.0"; then
|
||||
|
||||
@@ -29,6 +29,8 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
ensure_dependencies git
|
||||
|
||||
if check_for_gh_release "grist" "gristlabs/grist-core"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop grist
|
||||
|
||||
6
ct/headers/alpine-rustypaste
Normal file
6
ct/headers/alpine-rustypaste
Normal file
@@ -0,0 +1,6 @@
|
||||
___ __ _ ____ __ ____ __
|
||||
/ | / /___ (_)___ ___ / __ \__ _______/ /___ __/ __ \____ ______/ /____
|
||||
/ /| | / / __ \/ / __ \/ _ \______/ /_/ / / / / ___/ __/ / / / /_/ / __ `/ ___/ __/ _ \
|
||||
/ ___ |/ / /_/ / / / / / __/_____/ _, _/ /_/ (__ ) /_/ /_/ / ____/ /_/ (__ ) /_/ __/
|
||||
/_/ |_/_/ .___/_/_/ /_/\___/ /_/ |_|\__,_/____/\__/\__, /_/ \__,_/____/\__/\___/
|
||||
/_/ /____/
|
||||
6
ct/headers/kitchenowl
Normal file
6
ct/headers/kitchenowl
Normal file
@@ -0,0 +1,6 @@
|
||||
__ __ _ __ __ ____ __
|
||||
/ //_/(_) /______/ /_ ___ ____ / __ \_ __/ /
|
||||
/ ,< / / __/ ___/ __ \/ _ \/ __ \/ / / / | /| / / /
|
||||
/ /| |/ / /_/ /__/ / / / __/ / / / /_/ /| |/ |/ / /
|
||||
/_/ |_/_/\__/\___/_/ /_/\___/_/ /_/\____/ |__/|__/_/
|
||||
|
||||
6
ct/headers/nginx-ui
Normal file
6
ct/headers/nginx-ui
Normal file
@@ -0,0 +1,6 @@
|
||||
_ __ _ __ ______
|
||||
/ | / /___ _(_)___ _ __ / / / / _/
|
||||
/ |/ / __ `/ / __ \| |/_/_____/ / / // /
|
||||
/ /| / /_/ / / / / /> </_____/ /_/ // /
|
||||
/_/ |_/\__, /_/_/ /_/_/|_| \____/___/
|
||||
/____/
|
||||
6
ct/headers/opencloud
Normal file
6
ct/headers/opencloud
Normal file
@@ -0,0 +1,6 @@
|
||||
____ ________ __
|
||||
/ __ \____ ___ ____ / ____/ /___ __ ______/ /
|
||||
/ / / / __ \/ _ \/ __ \/ / / / __ \/ / / / __ /
|
||||
/ /_/ / /_/ / __/ / / / /___/ / /_/ / /_/ / /_/ /
|
||||
\____/ .___/\___/_/ /_/\____/_/\____/\__,_/\__,_/
|
||||
/_/
|
||||
6
ct/headers/rustypaste
Normal file
6
ct/headers/rustypaste
Normal file
@@ -0,0 +1,6 @@
|
||||
__ __
|
||||
_______ _______/ /___ ______ ____ ______/ /____
|
||||
/ ___/ / / / ___/ __/ / / / __ \/ __ `/ ___/ __/ _ \
|
||||
/ / / /_/ (__ ) /_/ /_/ / /_/ / /_/ (__ ) /_/ __/
|
||||
/_/ \__,_/____/\__/\__, / .___/\__,_/____/\__/\___/
|
||||
/____/_/
|
||||
6
ct/headers/shelfmark
Normal file
6
ct/headers/shelfmark
Normal file
@@ -0,0 +1,6 @@
|
||||
__ ______ __
|
||||
_____/ /_ ___ / / __/___ ___ ____ ______/ /__
|
||||
/ ___/ __ \/ _ \/ / /_/ __ `__ \/ __ `/ ___/ //_/
|
||||
(__ ) / / / __/ / __/ / / / / / /_/ / / / ,<
|
||||
/____/_/ /_/\___/_/_/ /_/ /_/ /_/\__,_/_/ /_/|_|
|
||||
|
||||
6
ct/headers/sqlserver2025
Normal file
6
ct/headers/sqlserver2025
Normal file
@@ -0,0 +1,6 @@
|
||||
_____ ____ __ _____ ___ ____ ___ ______
|
||||
/ ___// __ \ / / / ___/___ ______ _____ _____ |__ \ / __ \__ \ / ____/
|
||||
\__ \/ / / / / / \__ \/ _ \/ ___/ | / / _ \/ ___/ __/ // / / /_/ //___ \
|
||||
___/ / /_/ / / /___ ___/ / __/ / | |/ / __/ / / __// /_/ / __/____/ /
|
||||
/____/\___\_\/_____/ /____/\___/_/ |___/\___/_/ /____/\____/____/_____/
|
||||
|
||||
6
ct/headers/wealthfolio
Normal file
6
ct/headers/wealthfolio
Normal file
@@ -0,0 +1,6 @@
|
||||
_ __ ____ __ ____ ___
|
||||
| | / /__ ____ _/ / /_/ /_ / __/___ / (_)___
|
||||
| | /| / / _ \/ __ `/ / __/ __ \/ /_/ __ \/ / / __ \
|
||||
| |/ |/ / __/ /_/ / / /_/ / / / __/ /_/ / / / /_/ /
|
||||
|__/|__/\___/\__,_/_/\__/_/ /_/_/ \____/_/_/\____/
|
||||
|
||||
6
ct/headers/wishlist
Normal file
6
ct/headers/wishlist
Normal file
@@ -0,0 +1,6 @@
|
||||
_ ___ __ ___ __
|
||||
| | / (_)____/ /_ / (_)____/ /_
|
||||
| | /| / / / ___/ __ \/ / / ___/ __/
|
||||
| |/ |/ / (__ ) / / / / (__ ) /_
|
||||
|__/|__/_/____/_/ /_/_/_/____/\__/
|
||||
|
||||
6
ct/headers/writefreely
Normal file
6
ct/headers/writefreely
Normal file
@@ -0,0 +1,6 @@
|
||||
_ __ _ __ ______ __
|
||||
| | / /____(_) /____ / ____/_______ ___ / /_ __
|
||||
| | /| / / ___/ / __/ _ \/ /_ / ___/ _ \/ _ \/ / / / /
|
||||
| |/ |/ / / / / /_/ __/ __/ / / / __/ __/ / /_/ /
|
||||
|__/|__/_/ /_/\__/\___/_/ /_/ \___/\___/_/\__, /
|
||||
/____/
|
||||
@@ -30,14 +30,7 @@ function update_script() {
|
||||
|
||||
get_lxc_ip
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
if ! command -v jq &>/dev/null; then
|
||||
$STD msg_info "Installing jq..."
|
||||
$STD apt-get update -qq &>/dev/null
|
||||
$STD apt-get install -y jq &>/dev/null || {
|
||||
msg_error "Failed to install jq"
|
||||
exit
|
||||
}
|
||||
fi
|
||||
ensure_dependencies jq
|
||||
|
||||
if check_for_gh_release "homepage" "gethomepage/homepage"; then
|
||||
msg_info "Stopping service"
|
||||
|
||||
68
ct/immich.sh
68
ct/immich.sh
@@ -36,10 +36,6 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
setup_uv
|
||||
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')"
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
||||
|
||||
if [[ ! -f /etc/apt/preferences.d/preferences ]]; then
|
||||
msg_info "Adding Debian Testing repo"
|
||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||
@@ -52,9 +48,7 @@ Package: *
|
||||
Pin:release a=testing
|
||||
Pin-Priority: 450
|
||||
EOF
|
||||
if [[ -f /etc/apt/preferences.d/immich ]]; then
|
||||
rm /etc/apt/preferences.d/immich
|
||||
fi
|
||||
[[ -f /etc/apt/preferences.d/immich ]] && rm /etc/apt/preferences.d/immich
|
||||
$STD apt update
|
||||
msg_ok "Added Debian Testing repo"
|
||||
fi
|
||||
@@ -69,8 +63,7 @@ EOF
|
||||
msg_info "Installing Mise"
|
||||
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
||||
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
||||
$STD apt update
|
||||
$STD apt install -y mise
|
||||
ensure_dependencies mise
|
||||
msg_ok "Installed Mise"
|
||||
fi
|
||||
|
||||
@@ -91,7 +84,7 @@ EOF
|
||||
curl -fsSLO "$url"
|
||||
done
|
||||
$STD apt-mark unhold libigdgmm12
|
||||
$STD apt install -y ./libigdgmm12*.deb
|
||||
$STD apt install -y --allow-downgrades ./libigdgmm12*.deb
|
||||
rm ./libigdgmm12*.deb
|
||||
$STD apt install -y ./*.deb
|
||||
rm ./*.deb
|
||||
@@ -112,12 +105,12 @@ EOF
|
||||
msg_ok "Image-processing libraries up to date"
|
||||
fi
|
||||
|
||||
RELEASE="2.5.2"
|
||||
RELEASE="2.5.3"
|
||||
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
||||
if [[ $(cat ~/.immich) > "2.5.1" ]]; then
|
||||
msg_info "Enabling Maintenance Mode"
|
||||
cd /opt/immich/app/bin
|
||||
$STD bash ./immich-admin enable-maintenance-mode
|
||||
$STD ./immich-admin enable-maintenance-mode
|
||||
export MAINT_MODE=1
|
||||
$STD cd -
|
||||
msg_ok "Enabled Maintenance Mode"
|
||||
@@ -127,22 +120,16 @@ EOF
|
||||
systemctl stop immich-ml
|
||||
msg_ok "Stopped Services"
|
||||
VCHORD_RELEASE="0.5.3"
|
||||
if [[ ! -f ~/.vchord_version ]] || [[ "$VCHORD_RELEASE" != "$(cat ~/.vchord_version)" ]]; then
|
||||
msg_info "Upgrading VectorChord"
|
||||
curl -fsSL "https://github.com/tensorchord/vectorchord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
||||
$STD apt install -y ./vchord.deb
|
||||
[[ -f ~/.vchord_version ]] && mv ~/.vchord_version ~/.vectorchord
|
||||
if check_for_gh_release "VectorChord" "tensorchord/VectorChord" "${VCHORD_RELEASE}"; then
|
||||
fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-16-vchord_*_amd64.deb"
|
||||
systemctl restart postgresql
|
||||
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vector UPDATE;"
|
||||
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;"
|
||||
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX face_index;"
|
||||
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX clip_index;"
|
||||
echo "$VCHORD_RELEASE" >~/.vchord_version
|
||||
rm ./vchord.deb
|
||||
msg_ok "Upgraded VectorChord to v${VCHORD_RELEASE}"
|
||||
fi
|
||||
if ! dpkg -l | grep -q ccache; then
|
||||
$STD apt install -yqq ccache
|
||||
fi
|
||||
ensure_dependencies ccache
|
||||
|
||||
INSTALL_DIR="/opt/${APP}"
|
||||
UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)"
|
||||
@@ -152,7 +139,7 @@ EOF
|
||||
ML_DIR="${APP_DIR}/machine-learning"
|
||||
GEO_DIR="${INSTALL_DIR}/geodata"
|
||||
|
||||
cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR"
|
||||
[[ -f "$ML_DIR"/ml_start.sh ]] && cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR"
|
||||
if grep -qs "set -a" "$APP_DIR"/bin/start.sh; then
|
||||
cp "$APP_DIR"/bin/start.sh "$INSTALL_DIR"
|
||||
else
|
||||
@@ -173,7 +160,10 @@ EOF
|
||||
rm -rf "${APP_DIR:?}"/*
|
||||
)
|
||||
|
||||
setup_uv
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v${RELEASE}" "$SRC_DIR"
|
||||
PNPM_VERSION="$(jq -r '.packageManager | split("@")[1]' ${SRC_DIR}/package.json)"
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
||||
|
||||
msg_info "Updating Immich web and microservices"
|
||||
cd "$SRC_DIR"/server
|
||||
@@ -188,7 +178,7 @@ EOF
|
||||
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
||||
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
||||
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
||||
sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin
|
||||
sed -i "s|^start|${APP_DIR}/bin/start|" "$APP_DIR"/bin/immich-admin
|
||||
|
||||
# openapi & web build
|
||||
cd "$SRC_DIR"
|
||||
@@ -204,8 +194,7 @@ EOF
|
||||
$STD pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install
|
||||
$STD pnpm --filter @immich/sdk --filter @immich/cli build
|
||||
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
|
||||
cd "$APP_DIR"
|
||||
mv "$INSTALL_DIR"/start.sh "$APP_DIR"/bin
|
||||
[[ -f "$INSTALL_DIR"/start.sh ]] && mv "$INSTALL_DIR"/start.sh "$APP_DIR"/bin
|
||||
|
||||
# plugins
|
||||
cd "$SRC_DIR"
|
||||
@@ -236,10 +225,8 @@ EOF
|
||||
fi
|
||||
cd "$SRC_DIR"
|
||||
cp -a machine-learning/{ann,immich_ml} "$ML_DIR"
|
||||
mv "$INSTALL_DIR"/ml_start.sh "$ML_DIR"
|
||||
if [[ -f ~/.openvino ]]; then
|
||||
sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py
|
||||
fi
|
||||
[[ -f "$INSTALL_DIR"/ml_start.sh ]] && mv "$INSTALL_DIR"/ml_start.sh "$ML_DIR"
|
||||
[[ -f ~/.openvino ]] && sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py
|
||||
ln -sf "$APP_DIR"/resources "$INSTALL_DIR"
|
||||
cd "$APP_DIR"
|
||||
grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g"
|
||||
@@ -248,12 +235,14 @@ EOF
|
||||
ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$APP_DIR"/upload
|
||||
ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$ML_DIR"/upload
|
||||
ln -s "$GEO_DIR" "$APP_DIR"
|
||||
[[ ! -f /usr/bin/immich ]] && ln -sf "$APP_DIR"/cli/bin/immich /usr/bin/immich
|
||||
[[ ! -f /usr/bin/immich-admin ]] && ln -sf "$APP_DIR"/bin/immich-admin /usr/bin/immich-admin
|
||||
|
||||
chown -R immich:immich "$INSTALL_DIR"
|
||||
if [[ "${MAINT_MODE:-0}" == 1 ]]; then
|
||||
msg_info "Disabling Maintenance Mode"
|
||||
cd /opt/immich/app/bin
|
||||
$STD bash ./immich-admin disable-maintenance-mode
|
||||
$STD ./immich-admin disable-maintenance-mode
|
||||
unset MAINT_MODE
|
||||
$STD cd -
|
||||
msg_ok "Disabled Maintenance Mode"
|
||||
@@ -271,7 +260,7 @@ function compile_libjxl() {
|
||||
: "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
||||
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||
msg_info "Recompiling libjxl"
|
||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
||||
cd "$SOURCE"
|
||||
$STD git reset --hard "$LIBJXL_REVISION"
|
||||
@@ -311,14 +300,11 @@ function compile_libjxl() {
|
||||
|
||||
function compile_libheif() {
|
||||
SOURCE=${SOURCE_DIR}/libheif
|
||||
if ! dpkg -l | grep -q libaom; then
|
||||
$STD apt install -y libaom-dev
|
||||
local update="required"
|
||||
fi
|
||||
ensure_dependencies libaom-dev
|
||||
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
||||
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||
msg_info "Recompiling libheif"
|
||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
||||
cd "$SOURCE"
|
||||
$STD git reset --hard "$LIBHEIF_REVISION"
|
||||
@@ -334,7 +320,7 @@ function compile_libheif() {
|
||||
-DWITH_X265=OFF \
|
||||
-DWITH_EXAMPLES=OFF \
|
||||
..
|
||||
$STD make install -j "$(nproc)"
|
||||
$STD make install -j"$(nproc)"
|
||||
ldconfig /usr/local/lib
|
||||
$STD make clean
|
||||
cd "$STAGING_DIR"
|
||||
@@ -349,7 +335,7 @@ function compile_libraw() {
|
||||
: "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
||||
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||
msg_info "Recompiling libraw"
|
||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||
$STD git clone https://github.com/libraw/libraw.git "$SOURCE"
|
||||
cd "$SOURCE"
|
||||
$STD git reset --hard "$LIBRAW_REVISION"
|
||||
@@ -371,7 +357,7 @@ function compile_imagemagick() {
|
||||
if [[ "$IMAGEMAGICK_REVISION" != "$(grep 'imagemagick' ~/.immich_library_revisions | awk '{print $2}')" ]] ||
|
||||
! grep -q 'DMAGICK_LIBRAW' /usr/local/lib/ImageMagick-7*/config-Q16HDRI/configure.xml; then
|
||||
msg_info "Recompiling ImageMagick"
|
||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||
$STD git clone https://github.com/ImageMagick/ImageMagick.git "$SOURCE"
|
||||
cd "$SOURCE"
|
||||
$STD git reset --hard "$IMAGEMAGICK_REVISION"
|
||||
@@ -391,7 +377,7 @@ function compile_libvips() {
|
||||
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libvips.json)}"
|
||||
if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||
msg_info "Recompiling libvips"
|
||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
||||
cd "$SOURCE"
|
||||
$STD git reset --hard "$LIBVIPS_REVISION"
|
||||
|
||||
@@ -40,9 +40,7 @@ function update_script() {
|
||||
fi
|
||||
|
||||
msg_info "Updating Jellyfin"
|
||||
if ! dpkg -s libjemalloc2 >/dev/null 2>&1; then
|
||||
$STD apt install -y libjemalloc2
|
||||
fi
|
||||
ensure_dependencies libjemalloc2
|
||||
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
||||
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
||||
fi
|
||||
|
||||
@@ -38,7 +38,7 @@ function update_script() {
|
||||
msg_ok "Updated yt-dlp"
|
||||
|
||||
msg_info "Prepare update"
|
||||
$STD apt install -y graphicsmagick ghostscript
|
||||
ensure_dependencies graphicsmagick ghostscript
|
||||
if [[ -f /opt/karakeep/.env ]] && [[ ! -f /etc/karakeep/karakeep.env ]]; then
|
||||
mkdir -p /etc/karakeep
|
||||
mv /opt/karakeep/.env /etc/karakeep/karakeep.env
|
||||
|
||||
@@ -23,9 +23,7 @@ function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if ! command -v lsb_release; then
|
||||
apt install -y lsb-release
|
||||
fi
|
||||
ensure_dependencies lsb-release
|
||||
if [[ ! -d /opt/kimai ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
|
||||
79
ct/kitchenowl.sh
Normal file
79
ct/kitchenowl.sh
Normal file
@@ -0,0 +1,79 @@
|
||||
#!/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: snazzybean
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/TomBursch/kitchenowl
|
||||
|
||||
APP="KitchenOwl"
|
||||
var_tags="${var_tags:-food;recipes}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-6}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/kitchenowl ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "kitchenowl" "TomBursch/kitchenowl"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop kitchenowl
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
mkdir -p /opt/kitchenowl_backup
|
||||
cp -r /opt/kitchenowl/data /opt/kitchenowl_backup/
|
||||
cp -f /opt/kitchenowl/kitchenowl.env /opt/kitchenowl_backup/
|
||||
msg_ok "Created Backup"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kitchenowl" "TomBursch/kitchenowl" "tarball" "latest" "/opt/kitchenowl"
|
||||
rm -rf /opt/kitchenowl/web
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kitchenowl-web" "TomBursch/kitchenowl" "prebuild" "latest" "/opt/kitchenowl/web" "kitchenowl_Web.tar.gz"
|
||||
|
||||
msg_info "Restoring data"
|
||||
sed -i 's/default=True/default=False/' /opt/kitchenowl/backend/wsgi.py
|
||||
cp -r /opt/kitchenowl_backup/data /opt/kitchenowl/
|
||||
cp -f /opt/kitchenowl_backup/kitchenowl.env /opt/kitchenowl/
|
||||
rm -rf /opt/kitchenowl_backup
|
||||
msg_ok "Restored data"
|
||||
|
||||
msg_info "Updating KitchenOwl"
|
||||
cd /opt/kitchenowl/backend
|
||||
$STD uv sync --frozen
|
||||
cd /opt/kitchenowl/backend
|
||||
set -a
|
||||
source /opt/kitchenowl/kitchenowl.env
|
||||
set +a
|
||||
$STD uv run flask db upgrade
|
||||
msg_ok "Updated KitchenOwl"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start kitchenowl
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}"
|
||||
@@ -59,6 +59,8 @@ function update_script() {
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
mkdir -p /opt/koillection/public/uploads
|
||||
mkdir -p /opt/koillection/var/log
|
||||
chown -R www-data:www-data /opt/koillection/var/log
|
||||
chown -R www-data:www-data /opt/koillection/public/uploads
|
||||
rm -r /opt/koillection-backup
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: hoholms
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/grafana/loki
|
||||
|
||||
@@ -27,6 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
ensure_dependencies graphicsmagick
|
||||
if [ ! -f /opt/n8n.env ]; then
|
||||
sed -i 's|^Environment="N8N_SECURE_COOKIE=false"$|EnvironmentFile=/opt/n8n.env|' /etc/systemd/system/n8n.service
|
||||
mkdir -p /opt
|
||||
@@ -37,6 +38,7 @@ N8N_PROTOCOL=http
|
||||
N8N_HOST=$LOCAL_IP
|
||||
EOF
|
||||
fi
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
|
||||
msg_info "Updating ${APP} LXC"
|
||||
|
||||
@@ -27,9 +27,8 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if ! dpkg -l | grep -q temurin-21-jre; then
|
||||
JAVA_VERSION="21" setup_java
|
||||
fi
|
||||
JAVA_VERSION="21" setup_java
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
$STD apt update
|
||||
$STD apt -y upgrade
|
||||
|
||||
@@ -36,12 +36,7 @@ function update_script() {
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy"
|
||||
|
||||
if ! dpkg -l | grep -q "pkg-config"; then
|
||||
$STD apt install -y pkg-config
|
||||
fi
|
||||
if ! dpkg -l | grep -q "libssl-dev"; then
|
||||
$STD apt install -y libssl-dev
|
||||
fi
|
||||
ensure_dependencies pkg-config libssl-dev
|
||||
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
|
||||
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
|
||||
|
||||
|
||||
68
ct/nginx-ui.sh
Normal file
68
ct/nginx-ui.sh
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://nginxui.com
|
||||
|
||||
APP="Nginx-UI"
|
||||
var_tags="${var_tags:-webserver;nginx;proxy}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /usr/local/bin/nginx-ui ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "nginx-ui" "0xJacky/nginx-ui"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop nginx-ui
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Configuration"
|
||||
cp /usr/local/etc/nginx-ui/app.ini /tmp/nginx-ui-app.ini.bak
|
||||
msg_ok "Backed up Configuration"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nginx-ui" "0xJacky/nginx-ui" "prebuild" "latest" "/opt/nginx-ui" "nginx-ui-linux-64.tar.gz"
|
||||
|
||||
msg_info "Updating Binary"
|
||||
cp /opt/nginx-ui/nginx-ui /usr/local/bin/nginx-ui
|
||||
chmod +x /usr/local/bin/nginx-ui
|
||||
rm -rf /opt/nginx-ui
|
||||
msg_ok "Updated Binary"
|
||||
|
||||
msg_info "Restoring Configuration"
|
||||
mv /tmp/nginx-ui-app.ini.bak /usr/local/etc/nginx-ui/app.ini
|
||||
msg_ok "Restored Configuration"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start nginx-ui
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
|
||||
@@ -28,6 +28,12 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_error "This script is currently disabled due to an external issue with the OpenResty APT repository."
|
||||
msg_error "The repository's GPG key uses SHA-1 signatures, which are no longer accepted by Debian as of February 1, 2026."
|
||||
msg_error "The issue is tracked in openresty/openresty#1097"
|
||||
msg_error "For more details, see: https://github.com/community-scripts/ProxmoxVE/issues/11406"
|
||||
exit 1
|
||||
|
||||
if [[ $(grep -E '^VERSION_ID=' /etc/os-release) == *"12"* ]]; then
|
||||
msg_error "Wrong Debian version detected!"
|
||||
msg_error "Please create a snapshot first. You must upgrade your LXC to Debian Trixie before updating. Visit: https://github.com/community-scripts/ProxmoxVE/discussions/7489"
|
||||
|
||||
@@ -28,8 +28,8 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
ensure_dependencies python3-lxml
|
||||
if ! [[ $(dpkg -s python3-lxml-html-clean 2>/dev/null) ]]; then
|
||||
$STD apt install python3-lxml
|
||||
curl -fsSL "http://archive.ubuntu.com/ubuntu/pool/universe/l/lxml-html-clean/python3-lxml-html-clean_0.1.1-1_all.deb" -o /opt/python3-lxml-html-clean.deb
|
||||
$STD dpkg -i /opt/python3-lxml-html-clean.deb
|
||||
rm -f /opt/python3-lxml-html-clean.deb
|
||||
|
||||
@@ -32,11 +32,7 @@ function update_script() {
|
||||
if [[ ! -f /opt/Ollama_version.txt ]]; then
|
||||
touch /opt/Ollama_version.txt
|
||||
fi
|
||||
if ! command -v zstd &>/dev/null; then
|
||||
msg_info "Installing zstd"
|
||||
$STD apt install -y zstd
|
||||
msg_ok "Installed zstd"
|
||||
fi
|
||||
ensure_dependencies zstd
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop ollama
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
60
ct/opencloud.sh
Normal file
60
ct/opencloud.sh
Normal file
@@ -0,0 +1,60 @@
|
||||
#!/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: vhsdream
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://opencloud.eu
|
||||
|
||||
APP="OpenCloud"
|
||||
var_tags="${var_tags:-files;cloud}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /etc/opencloud ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
RELEASE="v5.0.2"
|
||||
if check_for_gh_release "opencloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
||||
msg_info "Stopping services"
|
||||
systemctl stop opencloud opencloud-wopi
|
||||
msg_ok "Stopped services"
|
||||
|
||||
msg_info "Updating packages"
|
||||
$STD apt-get update
|
||||
$STD apt-get dist-upgrade -y
|
||||
msg_ok "Updated packages"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64"
|
||||
|
||||
msg_info "Starting services"
|
||||
systemctl start opencloud opencloud-wopi
|
||||
msg_ok "Started services"
|
||||
msg_ok "Updated successfully"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}https://<your-OpenCloud-FQDN>${CL}"
|
||||
@@ -92,11 +92,7 @@ EOF
|
||||
OLLAMA_VERSION=$(ollama -v | awk '{print $NF}')
|
||||
RELEASE=$(curl -s https://api.github.com/repos/ollama/ollama/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
|
||||
if [ "$OLLAMA_VERSION" != "$RELEASE" ]; then
|
||||
if ! command -v zstd &>/dev/null; then
|
||||
msg_info "Installing zstd"
|
||||
$STD apt install -y zstd
|
||||
msg_ok "Installed zstd"
|
||||
fi
|
||||
ensure_dependencies zstd
|
||||
msg_info "Ollama update available: v$OLLAMA_VERSION -> v$RELEASE"
|
||||
msg_info "Downloading Ollama v$RELEASE \n"
|
||||
curl -fS#LO https://github.com/ollama/ollama/releases/download/v${RELEASE}/ollama-linux-amd64.tar.zst
|
||||
|
||||
@@ -69,7 +69,7 @@ function update_script() {
|
||||
if [ "$VERSION_CODENAME" = "bookworm" ]; then
|
||||
setup_gs
|
||||
else
|
||||
$STD apt install -y ghostscript
|
||||
ensure_dependencies ghostscript
|
||||
fi
|
||||
|
||||
msg_info "Updating Paperless-ngx"
|
||||
@@ -145,7 +145,7 @@ function update_script() {
|
||||
setup_gs
|
||||
else
|
||||
msg_info "Installing Ghostscript"
|
||||
$STD apt install -y ghostscript
|
||||
ensure_dependencies ghostscript
|
||||
msg_ok "Installed Ghostscript"
|
||||
fi
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ function update_script() {
|
||||
LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-bookworm-amd64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1)
|
||||
if [[ "${LIBHEIF_URL}" != "$(cat ~/.photoprism_libheif 2>/dev/null)" ]] || [[ ! -f ~/.photoprism_libheif ]]; then
|
||||
msg_info "Updating PhotoPrism LibHeif"
|
||||
$STD apt install -y libvips42
|
||||
ensure_dependencies libvips42
|
||||
curl -fsSL "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" -o /tmp/libheif.tar.gz
|
||||
tar -xzf /tmp/libheif.tar.gz -C /usr/local
|
||||
ldconfig
|
||||
|
||||
@@ -41,7 +41,7 @@ function update_script() {
|
||||
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
||||
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
||||
$STD apt remove --purge -y dotnet-sdk-8.0
|
||||
$STD apt install -y aspnetcore-runtime-9.0
|
||||
ensure_dependencies aspnetcore-runtime-9.0
|
||||
fi
|
||||
rm -rf /opt/rdtc-backup
|
||||
|
||||
|
||||
@@ -27,22 +27,20 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop readeck
|
||||
msg_ok "Stopped Service"
|
||||
if check_for_codeberg_release "readeck" "readeck/readeck"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop readeck
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating Readeck"
|
||||
LATEST=$(curl -fsSL https://codeberg.org/readeck/readeck/releases/ | grep -oP '/releases/tag/\K\d+\.\d+\.\d+' | head -1)
|
||||
rm -rf /opt/readeck/readeck
|
||||
cd /opt/readeck
|
||||
curl -fsSL "https://codeberg.org/readeck/readeck/releases/download/${LATEST}/readeck-${LATEST}-linux-amd64" -o "readeck"
|
||||
chmod a+x readeck
|
||||
msg_ok "Updated Readeck"
|
||||
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start readeck
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
msg_info "Starting Service"
|
||||
systemctl start readeck
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at the latest version."
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
69
ct/rustypaste.sh
Normal file
69
ct/rustypaste.sh
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: GoldenSpringness
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/orhun/rustypaste
|
||||
|
||||
APP="rustypaste"
|
||||
var_tags="${var_tags:-pastebin;storage}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /opt/rustypaste/rustypaste ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "rustypaste" "orhun/rustypaste"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop rustypaste
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
tar -czf "/opt/rustypaste_backup_$(date +%F).tar.gz" /opt/rustypaste/upload 2>/dev/null || true
|
||||
cp /opt/rustypaste/config.toml /tmp/rustypaste_config.toml.bak
|
||||
msg_ok "Backup Created"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
mv /tmp/rustypaste_config.toml.bak /opt/rustypaste/config.toml
|
||||
tar -xzf "/opt/rustypaste_backup_$(date +%F).tar.gz" -C /opt/rustypaste/upload 2>/dev/null || true
|
||||
rm -rf /opt/rustypaste_backup_$(date +%F).tar.gz
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start rustypaste
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
|
||||
if check_for_gh_release "rustypaste-cli" "orhun/rustypaste-cli"; then
|
||||
fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}rustypaste 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}"
|
||||
@@ -29,7 +29,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "scanopy" "scanopy/scanopy"; then
|
||||
if check_for_gh_release "Scanopy" "scanopy/scanopy"; then
|
||||
msg_info "Stopping services"
|
||||
systemctl stop scanopy-server
|
||||
[[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl stop scanopy-daemon
|
||||
@@ -40,14 +40,9 @@ function update_script() {
|
||||
[[ -f /opt/scanopy/oidc.toml ]] && cp /opt/scanopy/oidc.toml /opt/scanopy.oidc.toml
|
||||
msg_ok "Backed up configurations"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy"
|
||||
|
||||
if ! dpkg -l | grep -q "pkg-config"; then
|
||||
$STD apt install -y pkg-config
|
||||
fi
|
||||
if ! dpkg -l | grep -q "libssl-dev"; then
|
||||
$STD apt install -y libssl-dev
|
||||
fi
|
||||
ensure_dependencies pkg-config libssl-dev
|
||||
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
|
||||
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
|
||||
|
||||
@@ -66,16 +61,22 @@ function update_script() {
|
||||
$STD npm run build
|
||||
msg_ok "Created frontend UI"
|
||||
|
||||
msg_info "Building scanopy-server (patience)"
|
||||
msg_info "Building Scanopy Server (patience)"
|
||||
cd /opt/scanopy/backend
|
||||
$STD cargo build --release --bin server
|
||||
mv ./target/release/server /usr/bin/scanopy-server
|
||||
msg_ok "Built scanopy-server"
|
||||
msg_ok "Built Scanopy Server"
|
||||
|
||||
msg_info "Building scanopy-daemon"
|
||||
$STD cargo build --release --bin daemon
|
||||
cp ./target/release/daemon /usr/bin/scanopy-daemon
|
||||
msg_ok "Built scanopy-daemon"
|
||||
if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then
|
||||
fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64"
|
||||
mv "/usr/local/bin/Scanopy Daemon" /usr/local/bin/scanopy-daemon
|
||||
rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh
|
||||
sed -i -e 's|usr/bin|usr/local/bin|' \
|
||||
-e 's/push/daemon_poll/' \
|
||||
-e 's/pull/server_poll/' /etc/systemd/system/scanopy-daemon.service
|
||||
systemctl daemon-reload
|
||||
msg_ok "Updated Scanopy Daemon"
|
||||
fi
|
||||
|
||||
msg_info "Starting services"
|
||||
systemctl start scanopy-server
|
||||
|
||||
@@ -27,7 +27,8 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating ${APP} LXC"
|
||||
msg_info "Updating SQL Server 2022"
|
||||
rm -f /etc/profile.d/debuginfod.sh /etc/profile.d/debuginfod.csh
|
||||
$STD apt update
|
||||
$STD apt -y upgrade
|
||||
msg_ok "Updated successfully!"
|
||||
|
||||
45
ct/sqlserver2025.sh
Normal file
45
ct/sqlserver2025.sh
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://www.microsoft.com/en-us/sql-server/sql-server-2025
|
||||
|
||||
APP="SQL Server 2025"
|
||||
var_tags="${var_tags:-sql;database}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/mssql ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating SQL Server 2025"
|
||||
rm -f /etc/profile.d/debuginfod.sh /etc/profile.d/debuginfod.csh
|
||||
$STD apt update
|
||||
$STD apt -y upgrade
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:1433${CL}"
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: durzo
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/connorgallopo/Tracearr
|
||||
@@ -30,6 +30,55 @@ function update_script() {
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Updating prestart script"
|
||||
cat <<EOF >/data/tracearr/prestart.sh
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# Tune PostgreSQL for available resources (runs every startup)
|
||||
# =============================================================================
|
||||
# timescaledb-tune automatically optimizes PostgreSQL settings based on
|
||||
# available RAM and CPU. Safe to run repeatedly - recalculates if resources change.
|
||||
if command -v timescaledb-tune &> /dev/null; then
|
||||
total_ram_kb=\$(grep MemTotal /proc/meminfo | awk '{print \$2}')
|
||||
ram_for_tsdb=\$((total_ram_kb / 1024 / 2))
|
||||
timescaledb-tune -yes -memory "\$ram_for_tsdb"MB --quiet 2>/dev/null \
|
||||
|| echo "Warning: timescaledb-tune failed (non-fatal)"
|
||||
fi
|
||||
# =============================================================================
|
||||
# Ensure required PostgreSQL settings for Tracearr
|
||||
# =============================================================================
|
||||
pg_config_file="/etc/postgresql/18/main/postgresql.conf"
|
||||
if [ -f \$pg_config_file ]; then
|
||||
# Ensure max_tuples_decompressed_per_dml_transaction is set
|
||||
if grep -q "^timescaledb\.max_tuples_decompressed_per_dml_transaction" \$pg_config_file; then
|
||||
# Setting exists (uncommented) - update if not 0
|
||||
current_value=\$(grep "^timescaledb\.max_tuples_decompressed_per_dml_transaction" \$pg_config_file | grep -oE '[0-9]+' | head -1)
|
||||
if [ -n "\$current_value" ] && [ "\$current_value" -ne 0 ]; then
|
||||
sed -i "s/^timescaledb\.max_tuples_decompressed_per_dml_transaction.*/timescaledb.max_tuples_decompressed_per_dml_transaction = 0/" \$pg_config_file
|
||||
fi
|
||||
elif ! grep -q "^timescaledb\.max_tuples_decompressed_per_dml_transaction" \$pg_config_file; then
|
||||
echo "" >> \$pg_config_file
|
||||
echo "# Allow unlimited tuple decompression for migrations on compressed hypertables" >> \$pg_config_file
|
||||
echo "timescaledb.max_tuples_decompressed_per_dml_transaction = 0" >> \$pg_config_file
|
||||
fi
|
||||
# Ensure max_locks_per_transaction is set (for existing databases)
|
||||
if grep -q "^max_locks_per_transaction" \$pg_config_file; then
|
||||
# Setting exists (uncommented) - update if below 4096
|
||||
current_value=\$(grep "^max_locks_per_transaction" \$pg_config_file | grep -oE '[0-9]+' | head -1)
|
||||
if [ -n "\$current_value" ] && [ "\$current_value" -lt 4096 ]; then
|
||||
sed -i "s/^max_locks_per_transaction.*/max_locks_per_transaction = 4096/" \$pg_config_file
|
||||
fi
|
||||
elif ! grep -q "^max_locks_per_transaction" \$pg_config_file; then
|
||||
echo "" >> \$pg_config_file
|
||||
echo "# Increase lock table size for TimescaleDB hypertables with many chunks" >> \$pg_config_file
|
||||
echo "max_locks_per_transaction = 4096" >> \$pg_config_file
|
||||
fi
|
||||
fi
|
||||
systemctl restart postgresql
|
||||
EOF
|
||||
chmod +x /data/tracearr/prestart.sh
|
||||
msg_ok "Updated prestart script"
|
||||
|
||||
if check_for_gh_release "tracearr" "connorgallopo/Tracearr"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop tracearr postgresql redis
|
||||
@@ -74,10 +123,15 @@ function update_script() {
|
||||
chown -R tracearr:tracearr /data/tracearr
|
||||
msg_ok "Configured Tracearr"
|
||||
|
||||
msg_info "Starting Services"
|
||||
msg_info "Starting services"
|
||||
systemctl start postgresql redis tracearr
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Started services"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
# no new release, just restart service to apply prestart changes
|
||||
msg_info "Restarting service"
|
||||
systemctl restart tracearr
|
||||
msg_ok "Restarted service"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
@@ -30,8 +30,7 @@ function update_script() {
|
||||
fi
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
$STD apt update
|
||||
$STD apt install -yq twingate-connector
|
||||
ensure_dependencies twingate-connector
|
||||
$STD systemctl restart twingate-connector
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
|
||||
@@ -32,7 +32,7 @@ function update_script() {
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
$STD apt update --allow-releaseinfo-change
|
||||
$STD apt install -y unifi
|
||||
ensure_dependencies unifi
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
}
|
||||
|
||||
@@ -30,12 +30,9 @@ function update_script() {
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
|
||||
if ! dpkg -s chromium >/dev/null 2>&1; then
|
||||
msg_info "Installing Chromium"
|
||||
$STD apt update
|
||||
$STD apt install -y chromium
|
||||
ensure_dependencies chromium
|
||||
if [[ ! -L /opt/uptime-kuma/chromium ]]; then
|
||||
ln -s /usr/bin/chromium /opt/uptime-kuma/chromium
|
||||
msg_ok "Installed Chromium"
|
||||
fi
|
||||
|
||||
if check_for_gh_release "uptime-kuma" "louislam/uptime-kuma"; then
|
||||
|
||||
@@ -28,12 +28,8 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
VAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest |
|
||||
grep "tag_name" |
|
||||
awk '{print substr($2, 2, length($2)-3) }')
|
||||
WVRELEASE=$(curl -fsSL https://api.github.com/repos/dani-garcia/bw_web_builds/releases/latest |
|
||||
grep "tag_name" |
|
||||
awk '{print substr($2, 2, length($2)-3) }')
|
||||
VAULT=$(get_latest_github_release "dani-garcia/vaultwarden")
|
||||
WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds")
|
||||
|
||||
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \
|
||||
"1" "VaultWarden $VAULT" ON \
|
||||
@@ -42,57 +38,70 @@ function update_script() {
|
||||
3>&1 1>&2 2>&3)
|
||||
|
||||
if [ "$UPD" == "1" ]; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop vaultwarden
|
||||
msg_ok "Stopped Service"
|
||||
if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop vaultwarden
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
||||
cd ~ && rm -rf vaultwarden
|
||||
$STD git clone https://github.com/dani-garcia/vaultwarden
|
||||
cd vaultwarden
|
||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||
DIR=/usr/bin/vaultwarden
|
||||
if [ -d "$DIR" ]; then
|
||||
cp target/release/vaultwarden /usr/bin/
|
||||
fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
|
||||
|
||||
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
||||
cd /tmp/vaultwarden-src
|
||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||
if [[ -f /usr/bin/vaultwarden ]]; then
|
||||
cp target/release/vaultwarden /usr/bin/
|
||||
else
|
||||
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
||||
fi
|
||||
cd ~ && rm -rf /tmp/vaultwarden-src
|
||||
msg_ok "Updated VaultWarden to ${VAULT}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start vaultwarden
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
||||
msg_ok "VaultWarden is already up-to-date"
|
||||
fi
|
||||
cd ~ && rm -rf vaultwarden
|
||||
msg_ok "Updated VaultWarden"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start vaultwarden
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$UPD" == "2" ]; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop vaultwarden
|
||||
msg_ok "Stopped Service"
|
||||
if check_for_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop vaultwarden
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating Web-Vault to $WVRELEASE"
|
||||
$STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/"$WVRELEASE"/bw_web_"$WVRELEASE".tar.gz
|
||||
$STD tar -zxf bw_web_"$WVRELEASE".tar.gz -C /opt/vaultwarden/
|
||||
rm bw_web_"$WVRELEASE".tar.gz
|
||||
msg_ok "Updated Web-Vault"
|
||||
msg_info "Updating Web-Vault to $WVRELEASE"
|
||||
rm -rf /opt/vaultwarden/web-vault
|
||||
mkdir -p /opt/vaultwarden/web-vault
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start vaultwarden
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
|
||||
|
||||
chown -R root:root /opt/vaultwarden/web-vault/
|
||||
msg_ok "Updated Web-Vault to ${WVRELEASE}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start vaultwarden
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "Web-Vault is already up-to-date"
|
||||
fi
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$UPD" == "3" ]; then
|
||||
if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then
|
||||
if [[ -z "$NEWTOKEN" ]]; then exit; fi
|
||||
if ! command -v argon2 >/dev/null 2>&1; then $STD apt-get install -y argon2; fi
|
||||
ensure_dependencies argon2
|
||||
TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e)
|
||||
sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env
|
||||
if [[ -f /opt/vaultwarden/data/config.json ]]; then
|
||||
sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
|
||||
fi
|
||||
systemctl restart vaultwarden
|
||||
msg_ok "Admin token updated"
|
||||
fi
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -20,50 +20,50 @@ color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /opt/wanderer/start.sh ]]; then
|
||||
msg_error "No wanderer Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "wanderer" "Flomp/wanderer"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
fetch_and_deploy_gh_release "wanderer" "Flomp/wanderer" "tarball" "latest" "/opt/wanderer/source"
|
||||
|
||||
msg_info "Updating wanderer"
|
||||
cd /opt/wanderer/source/db
|
||||
$STD go mod tidy
|
||||
$STD go build
|
||||
cd /opt/wanderer/source/web
|
||||
$STD npm ci --omit=dev
|
||||
$STD npm run build
|
||||
msg_ok "Updated wanderer"
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start wanderer-web
|
||||
msg_ok "Started service"
|
||||
msg_ok "Update Successful"
|
||||
fi
|
||||
if check_for_gh_release "meilisearch" "meilisearch/meilisearch"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
|
||||
grep -q -- '--experimental-dumpless-upgrade' /opt/wanderer/start.sh || sed -i 's|meilisearch --master-key|meilisearch --experimental-dumpless-upgrade --master-key|' /opt/wanderer/start.sh
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start wanderer-web
|
||||
msg_ok "Started service"
|
||||
msg_ok "Update Successful"
|
||||
fi
|
||||
if [[ ! -f /opt/wanderer/start.sh ]]; then
|
||||
msg_error "No wanderer Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "wanderer" "Flomp/wanderer"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source"
|
||||
|
||||
msg_info "Updating wanderer"
|
||||
cd /opt/wanderer/source/db
|
||||
$STD go mod tidy
|
||||
$STD go build
|
||||
cd /opt/wanderer/source/web
|
||||
$STD npm ci --omit=dev
|
||||
$STD npm run build
|
||||
msg_ok "Updated wanderer"
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start wanderer-web
|
||||
msg_ok "Started service"
|
||||
msg_ok "Update Successful"
|
||||
fi
|
||||
if check_for_gh_release "meilisearch" "meilisearch/meilisearch"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop wanderer-web
|
||||
msg_ok "Stopped service"
|
||||
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
|
||||
grep -q -- '--experimental-dumpless-upgrade' /opt/wanderer/start.sh || sed -i 's|meilisearch --master-key|meilisearch --experimental-dumpless-upgrade --master-key|' /opt/wanderer/start.sh
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start wanderer-web
|
||||
msg_ok "Started service"
|
||||
msg_ok "Update Successful"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
|
||||
@@ -27,10 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if ! [[ $(dpkg -s zstd 2>/dev/null) ]]; then
|
||||
$STD apt update
|
||||
$STD apt install -y zstd
|
||||
fi
|
||||
ensure_dependencies zstd
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
# Dirty-Fix 03/2025 for missing APP_version.txt on old installations, set to pre-latest release
|
||||
msg_info "Running Migration"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2025 community-scripts ORG
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: Omar Minaya
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://wazuh.com/
|
||||
|
||||
86
ct/wealthfolio.sh
Normal file
86
ct/wealthfolio.sh
Normal file
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://wealthfolio.app/
|
||||
|
||||
APP="Wealthfolio"
|
||||
var_tags="${var_tags:-finance;portfolio}"
|
||||
var_cpu="${var_cpu:-4}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/wealthfolio ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "wealthfolio" "afadil/wealthfolio"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop wealthfolio
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Data"
|
||||
cp -r /opt/wealthfolio_data /opt/wealthfolio_data_backup
|
||||
cp /opt/wealthfolio/.env /opt/wealthfolio_env_backup
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball"
|
||||
|
||||
msg_info "Building Frontend (patience)"
|
||||
cd /opt/wealthfolio
|
||||
$STD pnpm install --frozen-lockfile
|
||||
$STD pnpm tsc
|
||||
$STD pnpm vite build
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Building Backend (patience)"
|
||||
cd /opt/wealthfolio/src-server
|
||||
source ~/.cargo/env
|
||||
$STD cargo build --release --manifest-path Cargo.toml
|
||||
cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
|
||||
chmod +x /usr/local/bin/wealthfolio-server
|
||||
msg_ok "Built Backend"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
cp -r /opt/wealthfolio_data_backup/. /opt/wealthfolio_data
|
||||
cp /opt/wealthfolio_env_backup /opt/wealthfolio/.env
|
||||
rm -rf /opt/wealthfolio_data_backup /opt/wealthfolio_env_backup
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Cleaning Up"
|
||||
rm -rf /opt/wealthfolio/src-server/target
|
||||
rm -rf /root/.cargo/registry
|
||||
rm -rf /opt/wealthfolio/node_modules
|
||||
msg_ok "Cleaned Up"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start wealthfolio
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||
@@ -27,11 +27,8 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating Whisparr"
|
||||
$STD apt update
|
||||
$STD apt -y upgrade
|
||||
msg_ok "Updated Whisparr"
|
||||
msg_ok "Updated successfully!"
|
||||
|
||||
msg_custom "🚀" "${GN}" "The app offers a built-in updater. Please use it."
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
82
ct/wishlist.sh
Normal file
82
ct/wishlist.sh
Normal file
@@ -0,0 +1,82 @@
|
||||
#!/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: Dunky13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/cmintey/wishlist
|
||||
|
||||
APP="Wishlist"
|
||||
var_tags="${var_tags:-sharing}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/wishlist ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "wishlist" "cmintey/wishlist"; then
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop wishlist
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
mkdir -p /opt/wishlist-backup
|
||||
cp /opt/wishlist/.env /opt/wishlist-backup/.env
|
||||
cp -a /opt/wishlist/uploads /opt/wishlist-backup
|
||||
cp -a /opt/wishlist/data /opt/wishlist-backup
|
||||
msg_ok "Created Backup"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
|
||||
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist")
|
||||
|
||||
msg_info "Updating Wishlist"
|
||||
cd /opt/wishlist
|
||||
$STD pnpm install
|
||||
$STD pnpm svelte-kit sync
|
||||
$STD pnpm prisma generate
|
||||
sed -i 's|/usr/src/app/|/opt/wishlist/|g' $(grep -rl '/usr/src/app/' /opt/wishlist)
|
||||
export VERSION="v${LATEST_APP_VERSION}"
|
||||
export SHA="v${LATEST_APP_VERSION}"
|
||||
$STD pnpm run build
|
||||
$STD pnpm prune --prod
|
||||
chmod +x /opt/wishlist/entrypoint.sh
|
||||
|
||||
msg_info "Restoring Backup"
|
||||
cp /opt/wishlist-backup/.env /opt/wishlist/.env
|
||||
cp -a /opt/wishlist-backup/uploads /opt/wishlist
|
||||
cp -a /opt/wishlist-backup/data /opt/wishlist
|
||||
rm -rf /opt/wishlist-backup
|
||||
msg_ok "Restored Backup"
|
||||
|
||||
msg_ok "Updated Wishlist"
|
||||
msg_info "Starting Service"
|
||||
systemctl start wishlist
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3280${CL}"
|
||||
72
ct/writefreely.sh
Normal file
72
ct/writefreely.sh
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/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: StellaeAlis
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/writefreely/writefreely
|
||||
|
||||
APP="WriteFreely"
|
||||
var_tags="${var_tags:-writing}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/writefreely ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "writefreely" "writefreely/writefreely"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop writefreely
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
mkdir -p /tmp/writefreely_backup
|
||||
cp /opt/writefreely/keys /tmp/writefreely_backup/ 2>/dev/null
|
||||
cp /opt/writefreely/config.ini /tmp/writefreely_backup/ 2>/dev/null
|
||||
msg_ok "Created Backup"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
cp /tmp/writefreely_backup/config.ini /opt/writefreely/ 2>/dev/null
|
||||
cp /tmp/writefreely_backup/keys/* /opt/writefreely/keys/ 2>/dev/null
|
||||
rm -rf /tmp/writefreely_backup
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Running Post-Update Tasks"
|
||||
cd /opt/writefreely
|
||||
$STD ./writefreely db migrate
|
||||
ln -s /opt/writefreely/writefreely /usr/local/bin/writefreely
|
||||
msg_ok "Ran Post-Update Tasks"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start writefreely
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
868
docs/contribution/AI.md
Normal file
868
docs/contribution/AI.md
Normal file
@@ -0,0 +1,868 @@
|
||||
# 🤖 AI Contribution Guidelines for ProxmoxVE
|
||||
|
||||
> **This documentation is intended for all AI assistants (GitHub Copilot, Claude, ChatGPT, etc.) contributing to this project.**
|
||||
|
||||
## 🎯 Core Principles
|
||||
|
||||
### 1. **Maximum Use of `tools.func` Functions**
|
||||
|
||||
We have an extensive library of helper functions. **NEVER** implement your own solutions when a function already exists!
|
||||
|
||||
### 2. **No Pointless Variables**
|
||||
|
||||
Only create variables when they:
|
||||
|
||||
- Are used multiple times
|
||||
- Improve readability
|
||||
- Are intended for configuration
|
||||
|
||||
### 3. **Consistent Script Structure**
|
||||
|
||||
All scripts follow an identical structure. Deviations are not acceptable.
|
||||
|
||||
### 4. **Bare-Metal Installation**
|
||||
|
||||
We do **NOT use Docker** for our installation scripts. All applications are installed directly on the system.
|
||||
|
||||
---
|
||||
|
||||
## 📁 Script Types and Their Structure
|
||||
|
||||
### CT Script (`ct/AppName.sh`)
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: AuthorName (GitHubUsername)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://application-url.com
|
||||
|
||||
APP="AppName"
|
||||
var_tags="${var_tags:-tag1;tag2;tag3}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/appname ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "appname" "YourUsername/YourRepo"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop appname
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Data"
|
||||
cp -r /opt/appname/data /opt/appname_data_backup
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
|
||||
# Build steps...
|
||||
|
||||
msg_info "Restoring Data"
|
||||
cp -r /opt/appname_data_backup/. /opt/appname/data
|
||||
rm -rf /opt/appname_data_backup
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start appname
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:PORT${CL}"
|
||||
```
|
||||
|
||||
### Install Script (`install/AppName-install.sh`)
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: AuthorName (GitHubUsername)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://application-url.com
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
dependency1 \
|
||||
dependency2
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
# Runtime Setup (ALWAYS use our functions!)
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
# or
|
||||
PG_VERSION="16" setup_postgresql
|
||||
# or
|
||||
setup_uv
|
||||
# etc.
|
||||
|
||||
fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
|
||||
msg_info "Setting up Application"
|
||||
cd /opt/appname
|
||||
# Build/Setup Schritte...
|
||||
msg_ok "Set up Application"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/appname.service
|
||||
[Unit]
|
||||
Description=AppName Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/appname
|
||||
ExecStart=/path/to/executable
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now appname
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Available Helper Functions
|
||||
|
||||
### Release Management
|
||||
|
||||
| Function | Description | Example |
|
||||
| ----------------------------- | ----------------------------------- | ------------------------------------------------------------- |
|
||||
| `fetch_and_deploy_gh_release` | Fetches and installs GitHub Release | `fetch_and_deploy_gh_release "app" "owner/repo"` |
|
||||
| `check_for_gh_release` | Checks for new version | `if check_for_gh_release "app" "YourUsername/YourRepo"; then` |
|
||||
|
||||
**Modes for `fetch_and_deploy_gh_release`:**
|
||||
|
||||
```bash
|
||||
# Tarball/Source (Standard)
|
||||
fetch_and_deploy_gh_release "appname" "owner/repo"
|
||||
|
||||
# Binary (.deb)
|
||||
fetch_and_deploy_gh_release "appname" "owner/repo" "binary"
|
||||
|
||||
# Prebuilt Archive
|
||||
fetch_and_deploy_gh_release "appname" "owner/repo" "prebuild" "latest" "/opt/appname" "filename.tar.gz"
|
||||
|
||||
# Single Binary
|
||||
fetch_and_deploy_gh_release "appname" "owner/repo" "singlefile" "latest" "/opt/appname" "binary-linux-amd64"
|
||||
```
|
||||
|
||||
**Clean Install Flag:**
|
||||
|
||||
```bash
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo"
|
||||
```
|
||||
|
||||
### Runtime/Language Setup
|
||||
|
||||
| Function | Variable(s) | Example |
|
||||
| -------------- | ----------------------------- | ---------------------------------------------------- |
|
||||
| `setup_nodejs` | `NODE_VERSION`, `NODE_MODULE` | `NODE_VERSION="22" setup_nodejs` |
|
||||
| `setup_uv` | `PYTHON_VERSION` | `PYTHON_VERSION="3.12" setup_uv` |
|
||||
| `setup_go` | `GO_VERSION` | `GO_VERSION="1.22" setup_go` |
|
||||
| `setup_rust` | `RUST_VERSION`, `RUST_CRATES` | `RUST_CRATES="monolith" setup_rust` |
|
||||
| `setup_ruby` | `RUBY_VERSION` | `RUBY_VERSION="3.3" setup_ruby` |
|
||||
| `setup_java` | `JAVA_VERSION` | `JAVA_VERSION="21" setup_java` |
|
||||
| `setup_php` | `PHP_VERSION`, `PHP_MODULES` | `PHP_VERSION="8.3" PHP_MODULES="redis,gd" setup_php` |
|
||||
|
||||
### Database Setup
|
||||
|
||||
| Function | Variable(s) | Example |
|
||||
| --------------------- | ------------------------------------ | ----------------------------------------------------------- |
|
||||
| `setup_postgresql` | `PG_VERSION`, `PG_MODULES` | `PG_VERSION="16" setup_postgresql` |
|
||||
| `setup_postgresql_db` | `PG_DB_NAME`, `PG_DB_USER` | `PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db` |
|
||||
| `setup_mariadb_db` | `MARIADB_DB_NAME`, `MARIADB_DB_USER` | `MARIADB_DB_NAME="mydb" setup_mariadb_db` |
|
||||
| `setup_mysql` | `MYSQL_VERSION` | `setup_mysql` |
|
||||
| `setup_mongodb` | `MONGO_VERSION` | `setup_mongodb` |
|
||||
| `setup_clickhouse` | - | `setup_clickhouse` |
|
||||
|
||||
### Tools & Utilities
|
||||
|
||||
| Function | Description |
|
||||
| ------------------- | ---------------------------------- |
|
||||
| `setup_adminer` | Installs Adminer for DB management |
|
||||
| `setup_composer` | Install PHP Composer |
|
||||
| `setup_ffmpeg` | Install FFmpeg |
|
||||
| `setup_imagemagick` | Install ImageMagick |
|
||||
| `setup_gs` | Install Ghostscript |
|
||||
| `setup_hwaccel` | Configure hardware acceleration |
|
||||
|
||||
### Helper Utilities
|
||||
|
||||
| Function | Description | Example |
|
||||
| ----------------------------- | ---------------------------- | ----------------------------------------- |
|
||||
| `import_local_ip` | Sets `$LOCAL_IP` variable | `import_local_ip` |
|
||||
| `ensure_dependencies` | Checks/installs dependencies | `ensure_dependencies curl jq` |
|
||||
| `install_packages_with_retry` | APT install with retry | `install_packages_with_retry nginx redis` |
|
||||
|
||||
---
|
||||
|
||||
## ❌ Anti-Patterns (NEVER use!)
|
||||
|
||||
### 1. Pointless Variables
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - unnecessary variables
|
||||
APP_NAME="myapp"
|
||||
APP_DIR="/opt/${APP_NAME}"
|
||||
APP_USER="root"
|
||||
APP_PORT="3000"
|
||||
cd $APP_DIR
|
||||
|
||||
# ✅ CORRECT - use directly
|
||||
cd /opt/myapp
|
||||
```
|
||||
|
||||
### 2. Custom Download Logic
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - custom wget/curl logic
|
||||
RELEASE=$(curl -s https://api.github.com/repos/YourUsername/YourRepo/releases/latest | jq -r '.tag_name')
|
||||
wget https://github.com/YourUsername/YourRepo/archive/${RELEASE}.tar.gz
|
||||
tar -xzf ${RELEASE}.tar.gz
|
||||
mv repo-${RELEASE} /opt/myapp
|
||||
|
||||
# ✅ CORRECT - use our function
|
||||
fetch_and_deploy_gh_release "myapp" "YourUsername/YourRepo" "tarball" "latest" "/opt/myapp"
|
||||
```
|
||||
|
||||
### 3. Custom Version-Check Logic
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - custom version check
|
||||
CURRENT=$(cat /opt/myapp/version.txt)
|
||||
LATEST=$(curl -s https://api.github.com/repos/YourUsername/YourRepo/releases/latest | jq -r '.tag_name')
|
||||
if [[ "$CURRENT" != "$LATEST" ]]; then
|
||||
# update...
|
||||
fi
|
||||
|
||||
# ✅ CORRECT - use our function
|
||||
if check_for_gh_release "myapp" "YourUsername/YourRepo"; then
|
||||
# update...
|
||||
fi
|
||||
```
|
||||
|
||||
### 4. Docker-based Installation
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - using Docker
|
||||
docker pull myapp/myapp:latest
|
||||
docker run -d --name myapp myapp/myapp:latest
|
||||
|
||||
# ✅ CORRECT - Bare-Metal Installation
|
||||
fetch_and_deploy_gh_release "myapp" "YourUsername/YourRepo"
|
||||
npm install && npm run build
|
||||
```
|
||||
|
||||
### 5. Custom Runtime Installation
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - custom Node.js installation
|
||||
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
|
||||
apt install -y nodejs
|
||||
|
||||
# ✅ CORRECT - use our function
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
```
|
||||
|
||||
### 6. Redundant echo Statements
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - custom logging messages
|
||||
echo "Installing dependencies..."
|
||||
apt install -y curl
|
||||
echo "Done!"
|
||||
|
||||
# ✅ CORRECT - use msg_info/msg_ok
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y curl
|
||||
msg_ok "Installed Dependencies"
|
||||
```
|
||||
|
||||
### 7. Missing $STD Usage
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - apt without $STD
|
||||
apt install -y nginx
|
||||
|
||||
# ✅ CORRECT - with $STD for silent output
|
||||
$STD apt install -y nginx
|
||||
```
|
||||
|
||||
### 8. Wrapping `tools.func` Functions in msg Blocks
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - tools.func functions have their own msg_info/msg_ok!
|
||||
msg_info "Installing Node.js"
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
msg_ok "Installed Node.js"
|
||||
|
||||
msg_info "Updating Application"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
msg_ok "Updated Application"
|
||||
|
||||
# ✅ CORRECT - call directly without msg wrapper
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
```
|
||||
|
||||
**Functions with built-in messages (NEVER wrap in msg blocks):**
|
||||
|
||||
- `fetch_and_deploy_gh_release`
|
||||
- `check_for_gh_release`
|
||||
- `setup_nodejs`
|
||||
- `setup_postgresql` / `setup_postgresql_db`
|
||||
- `setup_mariadb` / `setup_mariadb_db`
|
||||
- `setup_mongodb`
|
||||
- `setup_mysql`
|
||||
- `setup_ruby`
|
||||
- `setup_go`
|
||||
- `setup_java`
|
||||
- `setup_php`
|
||||
- `setup_uv`
|
||||
- `setup_rust`
|
||||
- `setup_composer`
|
||||
- `setup_ffmpeg`
|
||||
- `setup_imagemagick`
|
||||
- `setup_gs`
|
||||
- `setup_adminer`
|
||||
- `setup_hwaccel`
|
||||
|
||||
### 9. Creating Unnecessary System Users
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - LXC containers run as root, no separate user needed
|
||||
useradd -m -s /usr/bin/bash appuser
|
||||
chown -R appuser:appuser /opt/appname
|
||||
sudo -u appuser npm install
|
||||
|
||||
# ✅ CORRECT - run directly as root
|
||||
cd /opt/appname
|
||||
$STD npm install
|
||||
```
|
||||
|
||||
### 10. Using `export` in .env Files
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - export is unnecessary in .env files
|
||||
cat <<EOF >/opt/appname/.env
|
||||
export DATABASE_URL=postgres://...
|
||||
export SECRET_KEY=abc123
|
||||
export NODE_ENV=production
|
||||
EOF
|
||||
|
||||
# ✅ CORRECT - simple KEY=VALUE format (files are sourced with set -a)
|
||||
cat <<EOF >/opt/appname/.env
|
||||
DATABASE_URL=postgres://...
|
||||
SECRET_KEY=abc123
|
||||
NODE_ENV=production
|
||||
EOF
|
||||
```
|
||||
|
||||
### 11. Using External Shell Scripts
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - external script that gets executed
|
||||
cat <<'EOF' >/opt/appname/install_script.sh
|
||||
#!/bin/bash
|
||||
cd /opt/appname
|
||||
npm install
|
||||
npm run build
|
||||
EOF
|
||||
chmod +x /opt/appname/install_script.sh
|
||||
$STD bash /opt/appname/install_script.sh
|
||||
rm -f /opt/appname/install_script.sh
|
||||
|
||||
# ✅ CORRECT - run commands directly
|
||||
cd /opt/appname
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
```
|
||||
|
||||
### 12. Using `sudo` in LXC Containers
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - sudo is unnecessary in LXC (already root)
|
||||
sudo -u postgres psql -c "CREATE DATABASE mydb;"
|
||||
sudo -u appuser npm install
|
||||
|
||||
# ✅ CORRECT - use functions or run directly as root
|
||||
PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db
|
||||
|
||||
cd /opt/appname
|
||||
$STD npm install
|
||||
```
|
||||
|
||||
### 13. Unnecessary `systemctl daemon-reload`
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - daemon-reload is only needed when MODIFYING existing services
|
||||
cat <<EOF >/etc/systemd/system/appname.service
|
||||
# ... service config ...
|
||||
EOF
|
||||
systemctl daemon-reload # Unnecessary for new services!
|
||||
systemctl enable -q --now appname
|
||||
|
||||
# ✅ CORRECT - new services don't need daemon-reload
|
||||
cat <<EOF >/etc/systemd/system/appname.service
|
||||
# ... service config ...
|
||||
EOF
|
||||
systemctl enable -q --now appname
|
||||
```
|
||||
|
||||
### 14. Creating Custom Credentials Files
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - custom credentials file is not part of the standard template
|
||||
msg_info "Saving Credentials"
|
||||
cat <<EOF >~/appname.creds
|
||||
Database User: ${DB_USER}
|
||||
Database Pass: ${DB_PASS}
|
||||
EOF
|
||||
msg_ok "Saved Credentials"
|
||||
|
||||
# ✅ CORRECT - credentials are stored in .env or shown in final message only
|
||||
# If you use setup_postgresql_db / setup_mariadb_db, a standard ~/[appname].creds is created automatically
|
||||
```
|
||||
|
||||
### 15. Wrong Footer Pattern
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - old cleanup pattern with msg blocks
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
|
||||
# ✅ CORRECT - use cleanup_lxc function
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### 16. Manual Database Creation Instead of Functions
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - manual database creation
|
||||
DB_USER="myuser"
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
|
||||
$STD sudo -u postgres psql -c "CREATE DATABASE mydb WITH OWNER $DB_USER;"
|
||||
$STD sudo -u postgres psql -d mydb -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
||||
|
||||
# ✅ CORRECT - use setup_postgresql_db function
|
||||
# This sets PG_DB_USER, PG_DB_PASS, PG_DB_NAME automatically
|
||||
PG_DB_NAME="mydb" PG_DB_USER="myuser" PG_DB_EXTENSIONS="postgis" setup_postgresql_db
|
||||
```
|
||||
|
||||
### 17. Writing Files Without Heredocs
|
||||
|
||||
```bash
|
||||
# ❌ WRONG - echo / printf / tee
|
||||
echo "# Config" > /opt/app/config.yml
|
||||
echo "port: 3000" >> /opt/app/config.yml
|
||||
|
||||
printf "# Config\nport: 3000\n" > /opt/app/config.yml
|
||||
cat config.yml | tee /opt/app/config.yml
|
||||
```
|
||||
|
||||
```bash
|
||||
# ✅ CORRECT - always use a single heredoc
|
||||
cat <<EOF >/opt/app/config.yml
|
||||
# Config
|
||||
port: 3000
|
||||
EOF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Important Rules
|
||||
|
||||
### Variable Declarations (CT Script)
|
||||
|
||||
```bash
|
||||
# Standard declarations (ALWAYS present)
|
||||
APP="AppName"
|
||||
var_tags="${var_tags:-tag1;tag2}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
```
|
||||
|
||||
### Update-Script Pattern
|
||||
|
||||
```bash
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
# 1. Check if installation exists
|
||||
if [[ ! -d /opt/appname ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
# 2. Check for update
|
||||
if check_for_gh_release "appname" "YourUsername/YourRepo"; then
|
||||
# 3. Stop service
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop appname
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
# 4. Backup data (if present)
|
||||
msg_info "Backing up Data"
|
||||
cp -r /opt/appname/data /opt/appname_data_backup
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
# 5. Perform clean install
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
|
||||
# 6. Rebuild (if needed)
|
||||
cd /opt/appname
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
|
||||
# 7. Restore data
|
||||
msg_info "Restoring Data"
|
||||
cp -r /opt/appname_data_backup/. /opt/appname/data
|
||||
rm -rf /opt/appname_data_backup
|
||||
msg_ok "Restored Data"
|
||||
|
||||
# 8. Start service
|
||||
msg_info "Starting Service"
|
||||
systemctl start appname
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit # IMPORTANT: Always end with exit!
|
||||
}
|
||||
```
|
||||
|
||||
### Systemd Service Pattern
|
||||
|
||||
```bash
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/appname.service
|
||||
[Unit]
|
||||
Description=AppName Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/appname
|
||||
Environment=NODE_ENV=production
|
||||
ExecStart=/usr/bin/node /opt/appname/server.js
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now appname
|
||||
msg_ok "Created Service"
|
||||
```
|
||||
|
||||
### Installation Script Footer
|
||||
|
||||
```bash
|
||||
# ALWAYS at the end of the install script:
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 Reference: Good Example Scripts
|
||||
|
||||
Look at these recent well-implemented applications as reference:
|
||||
|
||||
### Container Scripts (Latest 10)
|
||||
|
||||
- [ct/thingsboard.sh](../ct/thingsboard.sh) - IoT platform with proper update_script
|
||||
- [ct/unifi-os-server.sh](../ct/unifi-os-server.sh) - Complex setup with podman
|
||||
- [ct/trip.sh](../ct/trip.sh) - Simple Ruby app
|
||||
- [ct/fladder.sh](../ct/fladder.sh) - Media app with database
|
||||
- [ct/qui.sh](../ct/qui.sh) - Lightweight utility
|
||||
- [ct/kutt.sh](../ct/kutt.sh) - Node.js with PostgreSQL
|
||||
- [ct/flatnotes.sh](../ct/flatnotes.sh) - Python notes app
|
||||
- [ct/investbrain.sh](../ct/investbrain.sh) - Finance app
|
||||
- [ct/gwn-manager.sh](../ct/gwn-manager.sh) - Network management
|
||||
- [ct/sportarr.sh](../ct/sportarr.sh) - Specialized \*Arr variant
|
||||
|
||||
### Install Scripts (Latest)
|
||||
|
||||
- [install/unifi-os-server-install.sh](../install/unifi-os-server-install.sh) - Complex setup with API integration
|
||||
- [install/trip-install.sh](../install/trip-install.sh) - Rails application setup
|
||||
- [install/mail-archiver-install.sh](../install/mail-archiver-install.sh) - Email-related service
|
||||
|
||||
**Key things to notice:**
|
||||
|
||||
- Proper error handling with `catch_errors`
|
||||
- Use of `check_for_gh_release` and `fetch_and_deploy_gh_release`
|
||||
- Correct backup/restore patterns in `update_script`
|
||||
- Footer always ends with `motd_ssh`, `customize`, `cleanup_lxc`
|
||||
- JSON metadata files created for each app
|
||||
|
||||
---
|
||||
|
||||
## <20> JSON Metadata Files
|
||||
|
||||
Every application requires a JSON metadata file in `frontend/public/json/<appname>.json`.
|
||||
|
||||
### JSON Structure
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "AppName",
|
||||
"slug": "appname",
|
||||
"categories": [1],
|
||||
"date_created": "2026-01-16",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docs.appname.com/",
|
||||
"website": "https://appname.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/appname.webp",
|
||||
"config_path": "/opt/appname/.env",
|
||||
"description": "Short description of the application and its purpose.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/appname.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
```
|
||||
|
||||
### Required Fields
|
||||
|
||||
| Field | Type | Description |
|
||||
| --------------------- | ------- | -------------------------------------------------- |
|
||||
| `name` | string | Display name of the application |
|
||||
| `slug` | string | Lowercase, no spaces, used for filenames |
|
||||
| `categories` | array | Category ID(s) - see category list below |
|
||||
| `date_created` | string | Creation date (YYYY-MM-DD) |
|
||||
| `type` | string | `ct` for container, `vm` for virtual machine |
|
||||
| `updateable` | boolean | Whether update_script is implemented |
|
||||
| `privileged` | boolean | Whether container needs privileged mode |
|
||||
| `interface_port` | number | Primary web interface port (or `null`) |
|
||||
| `documentation` | string | Link to official docs |
|
||||
| `website` | string | Link to official website |
|
||||
| `logo` | string | URL to application logo (preferably selfhst icons) |
|
||||
| `config_path` | string | Path to main config file (or empty string) |
|
||||
| `description` | string | Brief description of the application |
|
||||
| `install_methods` | array | Installation configurations |
|
||||
| `default_credentials` | object | Default username/password (or null) |
|
||||
| `notes` | array | Additional notes/warnings |
|
||||
|
||||
### Categories
|
||||
|
||||
| ID | Category |
|
||||
| --- | ------------------------- |
|
||||
| 0 | Miscellaneous |
|
||||
| 1 | Proxmox & Virtualization |
|
||||
| 2 | Operating Systems |
|
||||
| 3 | Containers & Docker |
|
||||
| 4 | Network & Firewall |
|
||||
| 5 | Adblock & DNS |
|
||||
| 6 | Authentication & Security |
|
||||
| 7 | Backup & Recovery |
|
||||
| 8 | Databases |
|
||||
| 9 | Monitoring & Analytics |
|
||||
| 10 | Dashboards & Frontends |
|
||||
| 11 | Files & Downloads |
|
||||
| 12 | Documents & Notes |
|
||||
| 13 | Media & Streaming |
|
||||
| 14 | \*Arr Suite |
|
||||
| 15 | NVR & Cameras |
|
||||
| 16 | IoT & Smart Home |
|
||||
| 17 | ZigBee, Z-Wave & Matter |
|
||||
| 18 | MQTT & Messaging |
|
||||
| 19 | Automation & Scheduling |
|
||||
| 20 | AI / Coding & Dev-Tools |
|
||||
| 21 | Webservers & Proxies |
|
||||
| 22 | Bots & ChatOps |
|
||||
| 23 | Finance & Budgeting |
|
||||
| 24 | Gaming & Leisure |
|
||||
| 25 | Business & ERP |
|
||||
|
||||
### Notes Format
|
||||
|
||||
```json
|
||||
"notes": [
|
||||
{
|
||||
"text": "Change the default password after first login!",
|
||||
"type": "warning"
|
||||
},
|
||||
{
|
||||
"text": "Requires at least 4GB RAM for optimal performance.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
**Note types:** `info`, `warning`, `error`
|
||||
|
||||
### Examples with Credentials
|
||||
|
||||
```json
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": "admin"
|
||||
}
|
||||
```
|
||||
|
||||
Or no credentials:
|
||||
|
||||
```json
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Checklist Before PR Creation
|
||||
|
||||
- [ ] No Docker installation used
|
||||
- [ ] `fetch_and_deploy_gh_release` used for GitHub releases
|
||||
- [ ] `check_for_gh_release` used for update checks
|
||||
- [ ] `setup_*` functions used for runtimes (nodejs, postgresql, etc.)
|
||||
- [ ] **`tools.func` functions NOT wrapped in msg_info/msg_ok blocks**
|
||||
- [ ] No redundant variables (only when used multiple times)
|
||||
- [ ] `$STD` before all apt/npm/build commands
|
||||
- [ ] `msg_info`/`msg_ok`/`msg_error` for logging (only for custom code)
|
||||
- [ ] Correct script structure followed (see templates)
|
||||
- [ ] Update function present and functional (CT scripts)
|
||||
- [ ] Data backup implemented in update function (if applicable)
|
||||
- [ ] `motd_ssh`, `customize`, `cleanup_lxc` at the end of install scripts
|
||||
- [ ] No custom download/version-check logic
|
||||
- [ ] All links point to `community-scripts/ProxmoxVE` (not `ProxmoxVED`!)
|
||||
- [ ] JSON metadata file created in `frontend/public/json/<appname>.json`
|
||||
- [ ] Category IDs are valid (0-25)
|
||||
- [ ] Default OS version is Debian 13 or newer (unless special requirement)
|
||||
- [ ] Default resources are reasonable for the application
|
||||
|
||||
---
|
||||
|
||||
## 💡 Tips for AI Assistants
|
||||
|
||||
1. **ALWAYS search `tools.func` first** before implementing custom solutions
|
||||
2. **Use recent scripts as reference** (Thingsboard, UniFi OS, Trip, Flatnotes, etc.)
|
||||
3. **Ask when uncertain** instead of introducing wrong patterns
|
||||
4. **Test via GitHub** - push to your fork and test with curl (not local bash)
|
||||
```bash
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# Wait 10-30 seconds after pushing - GitHub takes time to update files
|
||||
```
|
||||
5. **Consistency > Creativity** - follow established patterns strictly
|
||||
6. **Check the templates** - they show the correct structure
|
||||
7. **Don't wrap tools.func functions** - they handle their own msg_info/msg_ok output
|
||||
8. **Minimal variables** - only create variables that are truly reused multiple times
|
||||
9. **Always use $STD** - ensures silent/non-interactive execution
|
||||
10. **Reference good examples** - look at recent additions in each category
|
||||
|
||||
---
|
||||
|
||||
## 🍒 Important: Cherry-Picking Your Files for PR Submission
|
||||
|
||||
⚠️ **CRITICAL**: When you submit your PR, you must use git cherry-pick to send ONLY your 3-4 files!
|
||||
|
||||
Why? Because `setup-fork.sh` modifies 600+ files to update links. If you commit all changes, your PR will be impossible to merge.
|
||||
|
||||
**See**: [README.md - Cherry-Pick Section](README.md#-cherry-pick-submitting-only-your-changes) for complete instructions on:
|
||||
|
||||
- Creating a clean submission branch
|
||||
- Cherry-picking only your files (ct/myapp.sh, install/myapp-install.sh, frontend/public/json/myapp.json)
|
||||
- Verifying your PR has only 3 file changes (not 600+)
|
||||
|
||||
**Quick reference**:
|
||||
|
||||
```bash
|
||||
# Create clean branch from upstream
|
||||
git fetch upstream
|
||||
git checkout -b submit/myapp upstream/main
|
||||
|
||||
# Cherry-pick your commit(s) or manually add your 3-4 files
|
||||
# Then push to your fork and create PR
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Further Documentation
|
||||
|
||||
- [CONTRIBUTING.md](CONTRIBUTING.md) - General contribution guidelines
|
||||
- [GUIDE.md](GUIDE.md) - Detailed developer documentation
|
||||
- [HELPER_FUNCTIONS.md](HELPER_FUNCTIONS.md) - Complete tools.func reference
|
||||
- [README.md](README.md) - Cherry-pick guide and workflow instructions
|
||||
- [../TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md) - Technical deep dive
|
||||
- [../EXIT_CODES.md](../EXIT_CODES.md) - Exit code reference
|
||||
- [templates_ct/](templates_ct/) - CT script templates
|
||||
- [templates_install/](templates_install/) - Install script templates
|
||||
- [templates_json/](templates_json/) - JSON metadata templates
|
||||
@@ -1,14 +1,41 @@
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo.png" height="100px" />
|
||||
</div>
|
||||
<h2><div align="center">Exploring the Scripts and Steps Involved in an Application LXC Installation</div></h2>
|
||||
# 🧪 Code Audit: LXC Script Flow
|
||||
|
||||
1) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh): This script collects system parameters. (Also holds the function to update the application.)
|
||||
2) [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func): Adds user settings and integrates collected information.
|
||||
3) [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh): Constructs the LXC container.
|
||||
4) [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh): Executes functions from [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), and installs the application.
|
||||
5) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh) (again): To display the completion message.
|
||||
This guide explains the current execution flow and what to verify during reviews.
|
||||
|
||||
The installation process uses reusable scripts: [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func), [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh), and [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), which are not specific to any particular application.
|
||||
## Execution Flow (CT + Install)
|
||||
|
||||
To gain a better understanding, focus on reviewing [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh). This script contains the commands and configurations for installing and configuring AdGuard Home within the LXC container.
|
||||
1. `ct/appname.sh` runs on the Proxmox host and sources `misc/build.func`.
|
||||
2. `build.func` orchestrates prompts, container creation, and invokes the install script.
|
||||
3. Inside the container, `misc/install.func` exposes helper functions via `$FUNCTIONS_FILE_PATH`.
|
||||
4. `install/appname-install.sh` performs the application install.
|
||||
5. The CT script prints the completion message.
|
||||
|
||||
## Audit Checklist
|
||||
|
||||
### CT Script (ct/)
|
||||
|
||||
- Sources `misc/build.func` from `community-scripts/ProxmoxVE/main` (setup-fork.sh updates for forks).
|
||||
- Uses `check_for_gh_release` + `fetch_and_deploy_gh_release` for updates.
|
||||
- No Docker-based installs.
|
||||
|
||||
### Install Script (install/)
|
||||
|
||||
- Sources `$FUNCTIONS_FILE_PATH`.
|
||||
- Uses `tools.func` helpers (setup\_\*).
|
||||
- Ends with `motd_ssh`, `customize`, `cleanup_lxc`.
|
||||
|
||||
### JSON Metadata
|
||||
|
||||
- File in `frontend/public/json/<appname>.json` matches template schema.
|
||||
|
||||
### Testing
|
||||
|
||||
- Test via curl from your fork (CT script only).
|
||||
- Wait 10-30 seconds after push.
|
||||
|
||||
## References
|
||||
|
||||
- `docs/contribution/templates_ct/AppName.sh`
|
||||
- `docs/contribution/templates_install/AppName-install.sh`
|
||||
- `docs/contribution/templates_json/AppName.json`
|
||||
- `docs/contribution/GUIDE.md`
|
||||
|
||||
@@ -81,11 +81,22 @@ git clone https://github.com/yourUserName/ForkName
|
||||
git switch -c your-feature-branch
|
||||
```
|
||||
|
||||
### 4. Change paths in build.func install.func and AppName.sh
|
||||
### 4. Run setup-fork.sh to auto-configure your fork
|
||||
|
||||
To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`.
|
||||
```bash
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
### 4. Commit changes (without build.func and install.func!)
|
||||
This script automatically:
|
||||
|
||||
- Detects your GitHub username
|
||||
- Updates ALL curl URLs to point to your fork (for testing)
|
||||
- Creates `.git-setup-info` with your config
|
||||
- Backs up all modified files (\*.backup)
|
||||
|
||||
**IMPORTANT**: This modifies 600+ files! Use cherry-pick when submitting your PR (see below).
|
||||
|
||||
### 5. Commit ONLY your new application files
|
||||
|
||||
```bash
|
||||
git commit -m "Your commit message"
|
||||
@@ -97,9 +108,66 @@ git commit -m "Your commit message"
|
||||
git push origin your-feature-branch
|
||||
```
|
||||
|
||||
### 6. Create a Pull Request
|
||||
### 6. Cherry-Pick: Submit Only Your Files for PR
|
||||
|
||||
Open a Pull Request from your feature branch to the main repository branch. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
|
||||
⚠️ **IMPORTANT**: setup-fork.sh modified 600+ files. You MUST only submit your 3 new files!
|
||||
|
||||
See [README.md - Cherry-Pick Guide](README.md#-cherry-pick-submitting-only-your-changes) for step-by-step instructions.
|
||||
|
||||
Quick version:
|
||||
|
||||
```bash
|
||||
# Create clean branch from upstream
|
||||
git fetch upstream
|
||||
git checkout -b submit/myapp upstream/main
|
||||
|
||||
# Copy only your files
|
||||
cp ../your-work-branch/ct/myapp.sh ct/myapp.sh
|
||||
cp ../your-work-branch/install/myapp-install.sh install/myapp-install.sh
|
||||
cp ../your-work-branch/frontend/public/json/myapp.json frontend/public/json/myapp.json
|
||||
|
||||
# Commit and verify
|
||||
git add ct/myapp.sh install/myapp-install.sh frontend/public/json/myapp.json
|
||||
git commit -m "feat: add MyApp"
|
||||
git diff upstream/main --name-only # Should show ONLY your 3 files
|
||||
|
||||
# Push and create PR
|
||||
git push origin submit/myapp
|
||||
```
|
||||
|
||||
### 7. Create a Pull Request
|
||||
|
||||
Open a Pull Request from `submit/myapp` → `community-scripts/ProxmoxVE/main`.
|
||||
|
||||
Verify the PR shows ONLY these 3 files:
|
||||
|
||||
- `ct/myapp.sh`
|
||||
- `install/myapp-install.sh`
|
||||
- `frontend/public/json/myapp.json`
|
||||
|
||||
---
|
||||
|
||||
# 🛠️ Developer Mode & Debugging
|
||||
|
||||
When building or testing scripts, you can use the `dev_mode` variable to enable powerful debugging features. These flags can be combined (comma-separated).
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Example: Run with trace and keep the container even if it fails
|
||||
dev_mode="trace,keep" bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/myapp.sh)"
|
||||
```
|
||||
|
||||
### Available Flags:
|
||||
|
||||
| Flag | Description |
|
||||
| :--- | :--- |
|
||||
| `trace` | Enables `set -x` for maximum verbosity during execution. |
|
||||
| `keep` | Prevents the container from being deleted if the build fails. |
|
||||
| `pause` | Pauses execution at key points (e.g., before customization). |
|
||||
| `breakpoint` | Allows hardcoded `breakpoint` calls in scripts to drop to a shell. |
|
||||
| `logs` | Saves detailed build logs to `/var/log/community-scripts/`. |
|
||||
| `dryrun` | Bypasses actual container creation (limited support). |
|
||||
| `motd` | Forces an update of the Message of the Day (MOTD). |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
|
||||
# Run setup script (auto-detects your username from git)
|
||||
bash setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
That's it! ✅
|
||||
@@ -22,64 +22,101 @@ That's it! ✅
|
||||
The `setup-fork.sh` script automatically:
|
||||
|
||||
1. **Detects** your GitHub username from git config
|
||||
2. **Updates** 22 hardcoded links in documentation to point to your fork
|
||||
3. **Creates** `.git-setup-info` with recommended git workflows
|
||||
4. **Backs up** all modified files (*.backup)
|
||||
2. **Updates ALL hardcoded links** to point to your fork:
|
||||
- Documentation links pointing to `community-scripts/ProxmoxVE`
|
||||
- **Curl download URLs** in scripts (e.g., `curl ... github.com/community-scripts/ProxmoxVE/main/...`)
|
||||
3. **Creates** `.git-setup-info` with your configuration details
|
||||
4. **Backs up** all modified files (\*.backup for safety)
|
||||
|
||||
### Why Updating Curl Links Matters
|
||||
|
||||
Your scripts contain `curl` commands that download dependencies from GitHub (build.func, tools.func, etc.):
|
||||
|
||||
```bash
|
||||
# First line of ct/myapp.sh
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
```
|
||||
|
||||
**WITHOUT setup-fork.sh:**
|
||||
|
||||
- Script URLs still point to `community-scripts/ProxmoxVE/main`
|
||||
- If you test locally with `bash ct/myapp.sh`, you're testing local files, but the script's curl commands would download from **upstream** repo
|
||||
- Your modifications aren't actually being tested via the curl commands! ❌
|
||||
|
||||
**AFTER setup-fork.sh:**
|
||||
|
||||
- Script URLs are updated to `YourUsername/ProxmoxVE/main`
|
||||
- When you test via curl from GitHub: `bash -c "$(curl ... YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"`, it downloads from **your fork**
|
||||
- The script's curl commands also point to your fork, so you're actually testing your changes! ✅
|
||||
- ⏱️ **Important:** GitHub takes 10-30 seconds to recognize pushed files - wait before testing!
|
||||
|
||||
```bash
|
||||
# Example: What setup-fork.sh changes
|
||||
|
||||
# BEFORE (points to upstream):
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
|
||||
# AFTER (points to your fork):
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/john/ProxmoxVE/main/misc/build.func)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Usage
|
||||
|
||||
### Auto-Detect (Recommended)
|
||||
|
||||
```bash
|
||||
bash setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
Automatically reads your GitHub username from `git remote origin url`
|
||||
|
||||
### Specify Username
|
||||
|
||||
```bash
|
||||
bash setup-fork.sh john
|
||||
bash docs/contribution/setup-fork.sh --full john
|
||||
```
|
||||
|
||||
Updates links to `github.com/john/ProxmoxVE`
|
||||
|
||||
### Custom Repository Name
|
||||
|
||||
```bash
|
||||
bash setup-fork.sh john my-fork
|
||||
bash docs/contribution/setup-fork.sh --full john my-fork
|
||||
```
|
||||
|
||||
Updates links to `github.com/john/my-fork`
|
||||
|
||||
---
|
||||
|
||||
## What Gets Updated?
|
||||
|
||||
The script updates these documentation files:
|
||||
- `docs/CONTRIBUTION_GUIDE.md` (4 links)
|
||||
- `docs/README.md` (1 link)
|
||||
- `docs/INDEX.md` (3 links)
|
||||
- `docs/EXIT_CODES.md` (2 links)
|
||||
- `docs/DEFAULTS_SYSTEM_GUIDE.md` (2 links)
|
||||
- `docs/api/README.md` (1 link)
|
||||
- `docs/APP-ct.md` (1 link)
|
||||
- `docs/APP-install.md` (1 link)
|
||||
- `docs/alpine-install.func.md` (2 links)
|
||||
- `docs/install.func.md` (1 link)
|
||||
- And code examples in documentation
|
||||
The script updates hardcoded links in these areas when using `--full`:
|
||||
|
||||
- `ct/`, `install/`, `vm/` scripts
|
||||
- `misc/` function libraries
|
||||
- `docs/` (including `docs/contribution/`)
|
||||
- Code examples in documentation
|
||||
|
||||
---
|
||||
|
||||
## After Setup
|
||||
|
||||
1. **Review changes**
|
||||
|
||||
```bash
|
||||
git diff docs/
|
||||
```
|
||||
|
||||
2. **Read git workflow tips**
|
||||
|
||||
```bash
|
||||
cat .git-setup-info
|
||||
```
|
||||
|
||||
3. **Start contributing**
|
||||
|
||||
```bash
|
||||
git checkout -b feature/my-app
|
||||
# Make your changes...
|
||||
@@ -88,7 +125,7 @@ The script updates these documentation files:
|
||||
|
||||
4. **Follow the guide**
|
||||
```bash
|
||||
cat docs/CONTRIBUTION_GUIDE.md
|
||||
cat docs/contribution/GUIDE.md
|
||||
```
|
||||
|
||||
---
|
||||
@@ -96,6 +133,7 @@ The script updates these documentation files:
|
||||
## Common Workflows
|
||||
|
||||
### Keep Your Fork Updated
|
||||
|
||||
```bash
|
||||
# Add upstream if you haven't already
|
||||
git remote add upstream https://github.com/community-scripts/ProxmoxVE.git
|
||||
@@ -107,6 +145,7 @@ git push origin main
|
||||
```
|
||||
|
||||
### Create a Feature Branch
|
||||
|
||||
```bash
|
||||
git checkout -b feature/docker-improvements
|
||||
# Make changes...
|
||||
@@ -115,6 +154,7 @@ git push origin feature/docker-improvements
|
||||
```
|
||||
|
||||
### Sync Before Contributing
|
||||
|
||||
```bash
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
@@ -127,14 +167,16 @@ git checkout -b feature/my-feature
|
||||
## Troubleshooting
|
||||
|
||||
### "Git is not installed" or "not a git repository"
|
||||
|
||||
```bash
|
||||
# Make sure you cloned the repo first
|
||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
bash setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
### "Could not auto-detect GitHub username"
|
||||
|
||||
```bash
|
||||
# Your git origin URL isn't set up correctly
|
||||
git remote -v
|
||||
@@ -142,29 +184,32 @@ git remote -v
|
||||
|
||||
# Fix it:
|
||||
git remote set-url origin https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
bash setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
### "Permission denied"
|
||||
|
||||
```bash
|
||||
# Make script executable
|
||||
chmod +x setup-fork.sh
|
||||
bash setup-fork.sh
|
||||
chmod +x docs/contribution/setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
### Reverted Changes by Accident?
|
||||
|
||||
```bash
|
||||
# Backups are created automatically
|
||||
git checkout docs/*.backup
|
||||
# Or just re-run setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. ✅ Run `bash setup-fork.sh`
|
||||
2. 📖 Read [docs/CONTRIBUTION_GUIDE.md](docs/CONTRIBUTION_GUIDE.md)
|
||||
1. ✅ Run `bash docs/contribution/setup-fork.sh --full`
|
||||
2. 📖 Read [docs/contribution/GUIDE.md](GUIDE.md)
|
||||
3. 🍴 Choose your contribution path:
|
||||
- **Containers** → [docs/ct/README.md](docs/ct/README.md)
|
||||
- **Installation** → [docs/install/README.md](docs/install/README.md)
|
||||
@@ -177,10 +222,10 @@ git checkout docs/*.backup
|
||||
## Questions?
|
||||
|
||||
- **Fork Setup Issues?** → See [Troubleshooting](#troubleshooting) above
|
||||
- **How to Contribute?** → [docs/CONTRIBUTION_GUIDE.md](docs/CONTRIBUTION_GUIDE.md)
|
||||
- **How to Contribute?** → [docs/contribution/GUIDE.md](GUIDE.md)
|
||||
- **Git Workflows?** → `cat .git-setup-info`
|
||||
- **Project Structure?** → [docs/README.md](docs/README.md)
|
||||
|
||||
---
|
||||
|
||||
**Happy Contributing! 🚀**
|
||||
## Happy Contributing! 🚀
|
||||
|
||||
@@ -38,8 +38,8 @@ git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
|
||||
# 3. Run fork setup script (automatically configures everything)
|
||||
bash setup-fork.sh
|
||||
# This auto-detects your username and updates all documentation links
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
# --full updates ct/, install/, vm/, docs/, misc/ links for fork testing
|
||||
|
||||
# 4. Read the git workflow tips
|
||||
cat .git-setup-info
|
||||
@@ -51,28 +51,29 @@ cat .git-setup-info
|
||||
# 1. Create feature branch
|
||||
git checkout -b add/my-awesome-app
|
||||
|
||||
# 2. Create application scripts
|
||||
cp ct/example.sh ct/myapp.sh
|
||||
cp install/example-install.sh install/myapp-install.sh
|
||||
# 2. Create application scripts from templates
|
||||
cp docs/contribution/templates_ct/AppName.sh ct/myapp.sh
|
||||
cp docs/contribution/templates_install/AppName-install.sh install/myapp-install.sh
|
||||
cp docs/contribution/templates_json/AppName.json frontend/public/json/myapp.json
|
||||
|
||||
# 3. Edit your scripts
|
||||
nano ct/myapp.sh
|
||||
nano install/myapp-install.sh
|
||||
nano frontend/public/json/myapp.json
|
||||
|
||||
# 4. Test locally
|
||||
bash ct/myapp.sh # Will prompt for container creation
|
||||
|
||||
# 5. Commit and push
|
||||
git add ct/myapp.sh install/myapp-install.sh
|
||||
git commit -m "feat: add MyApp container"
|
||||
# 4. Commit and push to your fork
|
||||
git add ct/myapp.sh install/myapp-install.sh frontend/public/json/myapp.json
|
||||
git commit -m "feat: add MyApp container and install scripts"
|
||||
git push origin add/my-awesome-app
|
||||
|
||||
# 6. Open Pull Request on GitHub
|
||||
# Click: New Pull Request (GitHub will show this automatically)
|
||||
# 5. Test via curl from your fork (GitHub may take 10-30 seconds)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
|
||||
# 7. Keep your fork updated
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
# 6. Use cherry-pick to submit only your files (see Cherry-Pick section)
|
||||
# DO NOT submit the 600+ files modified by setup-fork.sh!
|
||||
|
||||
# 7. Open Pull Request on GitHub
|
||||
# Create PR from: your-fork/add/my-awesome-app → community-scripts/ProxmoxVE/main
|
||||
```
|
||||
|
||||
**💡 Tip**: See `../FORK_SETUP.md` for detailed fork setup and troubleshooting
|
||||
@@ -112,9 +113,9 @@ ProxmoxVE/
|
||||
│ └── alpine-tools.func # Alpine tools
|
||||
│
|
||||
├── docs/ # 📚 Documentation
|
||||
│ ├── UPDATED_APP-ct.md # Container script guide
|
||||
│ ├── UPDATED_APP-install.md # Install script guide
|
||||
│ └── CONTRIBUTING.md # (This file!)
|
||||
│ ├── ct/DETAILED_GUIDE.md # Container script guide
|
||||
│ ├── install/DETAILED_GUIDE.md # Install script guide
|
||||
│ └── contribution/README.md # Contribution overview
|
||||
│
|
||||
├── tools/ # 🔧 Proxmox management tools
|
||||
│ └── pve/
|
||||
@@ -137,6 +138,7 @@ Examples:
|
||||
```
|
||||
|
||||
**Rules**:
|
||||
|
||||
- Container script name: **Title Case** (PiHole, Docker, NextCloud)
|
||||
- Install script name: **lowercase** with **hyphens** (pihole-install, docker-install)
|
||||
- Must match: `ct/AppName.sh` ↔ `install/appname-install.sh`
|
||||
@@ -156,6 +158,7 @@ Examples:
|
||||
- Ubuntu 20.04 / Debian 11+ on host
|
||||
|
||||
2. **Git** installed
|
||||
|
||||
```bash
|
||||
apt-get install -y git
|
||||
```
|
||||
@@ -198,32 +201,33 @@ git rebase upstream/main
|
||||
git push origin feat/add-myapp
|
||||
```
|
||||
|
||||
#### Option B: Local Testing on Proxmox Host
|
||||
#### Option B: Testing on a Proxmox Host (still via curl)
|
||||
|
||||
```bash
|
||||
# 1. SSH into Proxmox host
|
||||
ssh root@192.168.1.100
|
||||
|
||||
# 2. Download your script
|
||||
curl -O https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/feat/myapp/ct/myapp.sh
|
||||
|
||||
# 3. Make it executable
|
||||
chmod +x myapp.sh
|
||||
|
||||
# 4. Update URLs to your fork
|
||||
# Edit: curl -s https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/feat/myapp/...
|
||||
|
||||
# 5. Run and test
|
||||
bash myapp.sh
|
||||
|
||||
# 6. If container created successfully, script is working!
|
||||
# 2. Test via curl from your fork (CT script only)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# ⏱️ Wait 10-30 seconds after pushing - GitHub takes time to update
|
||||
```
|
||||
|
||||
#### Option C: Docker Testing (Without Proxmox)
|
||||
> **Note:** Do not edit URLs manually or run install scripts directly. The CT script calls the install script inside the container.
|
||||
|
||||
#### Option C: Using Curl (Recommended for Real Testing)
|
||||
|
||||
```bash
|
||||
# You can test script syntax/functionality locally
|
||||
# Note: Won't fully test (no Proxmox, no actual container)
|
||||
# Always test via curl from your fork (GitHub takes 10-30 seconds after push)
|
||||
git push origin feature/myapp
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# This tests the actual GitHub URLs, not local files
|
||||
```
|
||||
|
||||
#### Option D: Static Checks (Without Proxmox)
|
||||
|
||||
```bash
|
||||
# You can validate syntax and linting locally (limited)
|
||||
# Note: This does NOT replace real Proxmox testing
|
||||
|
||||
# Run ShellCheck
|
||||
shellcheck ct/myapp.sh
|
||||
@@ -241,18 +245,18 @@ bash -n install/myapp-install.sh
|
||||
### Step 1: Choose Your Template
|
||||
|
||||
**For Simple Web Apps** (Node.js, Python, PHP):
|
||||
|
||||
```bash
|
||||
cp ct/example.sh ct/myapp.sh
|
||||
cp install/example-install.sh install/myapp-install.sh
|
||||
```
|
||||
|
||||
**For Database Apps** (PostgreSQL, MongoDB):
|
||||
```bash
|
||||
cp ct/docker.sh ct/myapp.sh # Use Docker container
|
||||
# OR manual setup for more control
|
||||
```
|
||||
**For Database Apps** (PostgreSQL, MariaDB, MongoDB):
|
||||
|
||||
Use the standard templates and the database helpers from `tools.func` (no Docker).
|
||||
|
||||
**For Alpine Linux Apps** (lightweight):
|
||||
|
||||
```bash
|
||||
# Use ct/alpine.sh as reference
|
||||
# Edit install script to use Alpine packages (apk not apt)
|
||||
@@ -264,7 +268,7 @@ cp ct/docker.sh ct/myapp.sh # Use Docker container
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/feat/myapp/misc/build.func)
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/misc/build.func)
|
||||
|
||||
# Update these:
|
||||
APP="MyAwesomeApp" # Display name
|
||||
@@ -291,17 +295,19 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
# Get latest version
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/user/repo/releases/latest | \
|
||||
grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
|
||||
if check_for_gh_release "myapp" "owner/repo"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop myapp
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
# ... update logic ...
|
||||
echo "${RELEASE}" > /opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP}"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}."
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "myapp" "owner/repo" "tarball" "latest" "/opt/myapp"
|
||||
|
||||
# ... update logic (migrations, rebuilds, etc.) ...
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start myapp
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
@@ -317,6 +323,7 @@ echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:PORT${CL}"
|
||||
```
|
||||
|
||||
**Checklist**:
|
||||
|
||||
- [ ] APP variable matches filename
|
||||
- [ ] var_tags semicolon-separated (no spaces)
|
||||
- [ ] Realistic CPU/RAM/disk values
|
||||
@@ -345,24 +352,12 @@ update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
wget \
|
||||
git \
|
||||
build-essential
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up Node.js"
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
msg_ok "Node.js installed"
|
||||
|
||||
msg_info "Downloading Application"
|
||||
cd /opt
|
||||
wget -q "https://github.com/user/repo/releases/download/v1.0.0/myapp.tar.gz"
|
||||
tar -xzf myapp.tar.gz
|
||||
rm -f myapp.tar.gz
|
||||
msg_ok "Application installed"
|
||||
|
||||
echo "1.0.0" > /opt/${APP}_version.txt
|
||||
fetch_and_deploy_gh_release "myapp" "owner/repo" "tarball" "latest" "/opt/myapp"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
@@ -370,6 +365,7 @@ cleanup_lxc
|
||||
```
|
||||
|
||||
**Checklist**:
|
||||
|
||||
- [ ] Functions loaded from `$FUNCTIONS_FILE_PATH`
|
||||
- [ ] All installation phases present (deps, tools, app, config, cleanup)
|
||||
- [ ] Using `$STD` for output suppression
|
||||
@@ -437,26 +433,44 @@ $STD apt-get install -y newdependency
|
||||
# 4. Test thoroughly before committing
|
||||
```
|
||||
|
||||
### Step 3: Update Update Function (if applicable)
|
||||
### Step 3: The Standard Update Pattern
|
||||
|
||||
The `update_script()` function in `ct/appname.sh` should follow a robust pattern:
|
||||
|
||||
1. **Check for updates**: Use `check_for_gh_release` to skip logic if no new version exists.
|
||||
2. **Stop services**: Stop all relevant services (`systemctl stop appname`).
|
||||
3. **Backup existing installation**: Move the old folder (e.g., `mv /opt/app /opt/app_bak`).
|
||||
4. **Deploy new version**: Use `CLEAN_INSTALL=1 fetch_and_deploy_gh_release`.
|
||||
5. **Restore configuration**: Copy `.env` or config files back from the backup.
|
||||
6. **Rebuild/Migrate**: Run `npm install`, `composer install`, or DB migrations.
|
||||
7. **Start services**: Restart services and cleanup the backup.
|
||||
|
||||
**Example from `ct/bookstack.sh`**:
|
||||
```bash
|
||||
# Edit: ct/existingapp.sh → update_script()
|
||||
|
||||
# 1. Update GitHub API URL if repo changed
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/user/repo/releases/latest | ...)
|
||||
|
||||
# 2. Update backup/restore logic (if structure changed)
|
||||
# 3. Update cleanup paths
|
||||
|
||||
# 4. Test update on existing installation
|
||||
```
|
||||
|
||||
### Step 4: Document Your Changes
|
||||
|
||||
```bash
|
||||
# Add comment at top of script
|
||||
# Co-Author: YourUsername
|
||||
# Updated: YYYY-MM-DD - Description of changes
|
||||
function update_script() {
|
||||
if check_for_gh_release "bookstack" "BookStackApp/BookStack"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop apache2
|
||||
|
||||
msg_info "Backing up data"
|
||||
mv /opt/bookstack /opt/bookstack-backup
|
||||
|
||||
fetch_and_deploy_gh_release "bookstack" "BookStackApp/BookStack" "tarball"
|
||||
|
||||
msg_info "Restoring backup"
|
||||
cp /opt/bookstack-backup/.env /opt/bookstack/.env
|
||||
# ... restore uploads ...
|
||||
|
||||
msg_info "Configuring"
|
||||
cd /opt/bookstack
|
||||
$STD composer install --no-dev
|
||||
$STD php artisan migrate --force
|
||||
|
||||
systemctl start apache2
|
||||
rm -rf /opt/bookstack-backup
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
@@ -656,27 +670,19 @@ shellcheck install/myapp-install.sh
|
||||
# 1. SSH into Proxmox host
|
||||
ssh root@YOUR_PROXMOX_IP
|
||||
|
||||
# 2. Download your script
|
||||
curl -O https://raw.githubusercontent.com/YOUR_USER/ProxmoxVE/feat/myapp/ct/myapp.sh
|
||||
# 2. Test via curl from your fork (CT script only)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# ⏱️ Wait 10-30 seconds after pushing - GitHub takes time to update
|
||||
|
||||
# 3. Make executable
|
||||
chmod +x myapp.sh
|
||||
|
||||
# 4. UPDATE URLS IN SCRIPT to point to your fork
|
||||
sed -i 's|community-scripts|YOUR_USER|g' myapp.sh
|
||||
|
||||
# 5. Run script
|
||||
bash myapp.sh
|
||||
|
||||
# 6. Test interaction:
|
||||
# 3. Test interaction:
|
||||
# - Select installation mode
|
||||
# - Confirm settings
|
||||
# - Monitor installation
|
||||
|
||||
# 7. Verify container created
|
||||
# 4. Verify container created
|
||||
pct list | grep myapp
|
||||
|
||||
# 8. Log into container and verify app
|
||||
# 5. Log into container and verify app
|
||||
pct exec 100 bash
|
||||
```
|
||||
|
||||
@@ -697,9 +703,9 @@ pct exec 100 bash
|
||||
# Verify script handles gracefully
|
||||
|
||||
# Test 4: Update function
|
||||
# Create initial container
|
||||
# Create initial container (via curl from fork)
|
||||
# Wait for new release
|
||||
# Run update: bash ct/myapp.sh
|
||||
# Test update: bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# Verify it detects and applies update
|
||||
```
|
||||
|
||||
@@ -774,16 +780,19 @@ Use this template:
|
||||
|
||||
```markdown
|
||||
## Description
|
||||
|
||||
Brief description of what this PR adds/fixes
|
||||
|
||||
## Type of Change
|
||||
|
||||
- [ ] New application (ct/AppName.sh + install/appname-install.sh)
|
||||
- [ ] Update existing application
|
||||
- [ ] Bug fix
|
||||
- [ ] Documentation update
|
||||
- [ ] Other: _______
|
||||
- [ ] Other: **\_\_\_**
|
||||
|
||||
## Testing
|
||||
|
||||
- [ ] Tested on Proxmox VE 8.x
|
||||
- [ ] Container creation successful
|
||||
- [ ] Application installation successful
|
||||
@@ -792,6 +801,7 @@ Brief description of what this PR adds/fixes
|
||||
- [ ] No temporary files left after installation
|
||||
|
||||
## Application Details (for new apps only)
|
||||
|
||||
- **App Name**: MyApp
|
||||
- **Source**: https://github.com/app/repo
|
||||
- **Default OS**: Debian 12
|
||||
@@ -800,9 +810,11 @@ Brief description of what this PR adds/fixes
|
||||
- **Access URL**: http://IP:PORT/path
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] My code follows the style guidelines
|
||||
- [ ] I have performed a self-review
|
||||
- [ ] I have tested the script locally
|
||||
- [ ] I have tested the script via curl from my fork (after git push)
|
||||
- [ ] GitHub had time to update (waited 10-30 seconds)
|
||||
- [ ] ShellCheck shows no critical warnings
|
||||
- [ ] Documentation is accurate and complete
|
||||
- [ ] I have added/updated relevant documentation
|
||||
@@ -811,6 +823,7 @@ Brief description of what this PR adds/fixes
|
||||
### Step 5: Respond to Review Comments
|
||||
|
||||
**Maintainers may request changes**:
|
||||
|
||||
- Fix syntax/style issues
|
||||
- Add better error handling
|
||||
- Optimize resource usage
|
||||
@@ -922,6 +935,7 @@ pct exec CTID netstat -tlnp | grep LISTEN
|
||||
### Q: Can I test without a Proxmox system?
|
||||
|
||||
**A**: Partially. You can verify syntax and ShellCheck compliance locally, but real container testing requires Proxmox. Consider using:
|
||||
|
||||
- Proxmox in a VM (VirtualBox/KVM)
|
||||
- Test instances on Hetzner/DigitalOcean
|
||||
- Ask maintainers to test for you
|
||||
@@ -929,6 +943,7 @@ pct exec CTID netstat -tlnp | grep LISTEN
|
||||
### Q: My update function is very complex - is that OK?
|
||||
|
||||
**A**: Yes! Update functions can be complex if needed. Just ensure:
|
||||
|
||||
- Backup user data before updating
|
||||
- Restore user data after update
|
||||
- Test thoroughly before submitting
|
||||
@@ -937,6 +952,7 @@ pct exec CTID netstat -tlnp | grep LISTEN
|
||||
### Q: Can I add new dependencies to build.func?
|
||||
|
||||
**A**: Generally no. build.func is the orchestrator and should remain stable. New functions should go in:
|
||||
|
||||
- `tools.func` - Tool installation
|
||||
- `core.func` - Utility functions
|
||||
- `install.func` - Container setup
|
||||
@@ -948,11 +964,13 @@ Ask in an issue first if you're unsure.
|
||||
**A**: You have options:
|
||||
|
||||
**Option 1**: Use Advanced mode (19-step wizard)
|
||||
|
||||
```bash
|
||||
# Extend advanced_settings() if app needs special vars
|
||||
```
|
||||
|
||||
**Option 2**: Create custom setup menu
|
||||
|
||||
```bash
|
||||
function custom_config() {
|
||||
OPTION=$(whiptail --inputbox "Enter database name:" 8 60)
|
||||
@@ -961,6 +979,7 @@ function custom_config() {
|
||||
```
|
||||
|
||||
**Option 3**: Leave as defaults + documentation
|
||||
|
||||
```bash
|
||||
# In success message:
|
||||
echo "Edit /opt/myapp/config.json to customize settings"
|
||||
@@ -969,9 +988,10 @@ echo "Edit /opt/myapp/config.json to customize settings"
|
||||
### Q: Can I contribute Windows/macOS/ARM support?
|
||||
|
||||
**A**:
|
||||
|
||||
- **Windows**: Not planned (ProxmoxVE is Linux/Proxmox focused)
|
||||
- **macOS**: Can contribute Docker-based alternatives
|
||||
- **ARM**: Yes! Many apps work on ARM. Add to vm/pimox-*.sh scripts
|
||||
- **ARM**: Yes! Many apps work on ARM. Add to vm/pimox-\*.sh scripts
|
||||
|
||||
---
|
||||
|
||||
@@ -995,6 +1015,7 @@ echo "Edit /opt/myapp/config.json to customize settings"
|
||||
### Report Bugs
|
||||
|
||||
When reporting bugs, include:
|
||||
|
||||
- Which application
|
||||
- What happened (error message)
|
||||
- What you expected
|
||||
@@ -1002,6 +1023,7 @@ When reporting bugs, include:
|
||||
- Container OS and version
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
Title: pihole-install.sh fails on Alpine 3.20
|
||||
|
||||
@@ -1025,6 +1047,7 @@ Error Output:
|
||||
## Contribution Statistics
|
||||
|
||||
**ProxmoxVE by the Numbers**:
|
||||
|
||||
- 🎯 40+ applications supported
|
||||
- 👥 100+ contributors
|
||||
- 📊 10,000+ GitHub stars
|
||||
@@ -1038,6 +1061,7 @@ Error Output:
|
||||
## Code of Conduct
|
||||
|
||||
By contributing, you agree to:
|
||||
|
||||
- ✅ Be respectful and inclusive
|
||||
- ✅ Follow the style guidelines
|
||||
- ✅ Test your changes thoroughly
|
||||
|
||||
@@ -30,61 +30,79 @@
|
||||
|
||||
> ⚠️ **Both files are ALWAYS required!** The CT script calls the install script automatically during container creation.
|
||||
|
||||
Install scripts are **not** run directly by users; they are invoked by the CT script inside the container.
|
||||
|
||||
### Node.js + PostgreSQL
|
||||
|
||||
**Koel** - Music streaming with PHP + Node.js + PostgreSQL
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | -------------------------------------------------------- |
|
||||
| CT (update logic) | [ct/koel.sh](../../ct/koel.sh) |
|
||||
| Install | [install/koel-install.sh](../../install/koel-install.sh) |
|
||||
| CT (update logic) | [ct/koel.sh](../../ct/koel.sh) |
|
||||
| Install | [install/koel-install.sh](../../install/koel-install.sh) |
|
||||
|
||||
**Actual Budget** - Finance app with npm global install
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ------------------------------------------------------------------------ |
|
||||
| CT (update logic) | [ct/actualbudget.sh](../../ct/actualbudget.sh) |
|
||||
| Install | [install/actualbudget-install.sh](../../install/actualbudget-install.sh) |
|
||||
| CT (update logic) | [ct/actualbudget.sh](../../ct/actualbudget.sh) |
|
||||
| Install | [install/actualbudget-install.sh](../../install/actualbudget-install.sh) |
|
||||
|
||||
### Python + uv
|
||||
|
||||
**MeTube** - YouTube downloader with Python uv + Node.js + Deno
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ------------------------------------------------------------ |
|
||||
| CT (update logic) | [ct/metube.sh](../../ct/metube.sh) |
|
||||
| Install | [install/metube-install.sh](../../install/metube-install.sh) |
|
||||
| CT (update logic) | [ct/metube.sh](../../ct/metube.sh) |
|
||||
| Install | [install/metube-install.sh](../../install/metube-install.sh) |
|
||||
|
||||
**Endurain** - Fitness tracker with Python uv + PostgreSQL/PostGIS
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ---------------------------------------------------------------- |
|
||||
| CT (update logic) | [ct/endurain.sh](../../ct/endurain.sh) |
|
||||
| Install | [install/endurain-install.sh](../../install/endurain-install.sh) |
|
||||
| CT (update logic) | [ct/endurain.sh](../../ct/endurain.sh) |
|
||||
| Install | [install/endurain-install.sh](../../install/endurain-install.sh) |
|
||||
|
||||
### Java + Gradle
|
||||
|
||||
**BookLore** - Book management with Java 21 + Gradle + MariaDB + Nginx
|
||||
| File | Link |
|
||||
| ----------------- | -------------------------------------------------------------- |
|
||||
| CT (update logic) | [ct/booklore.sh](../../ct/booklore.sh) |
|
||||
| Install | [install/booklore-install.sh](../../install/booklore-install.sh) |
|
||||
|
||||
### Pnpm + Meilisearch
|
||||
|
||||
**KaraKeep** - Bookmark manager with Pnpm + Meilisearch + Puppeteer
|
||||
| File | Link |
|
||||
| ----------------- | -------------------------------------------------------------- |
|
||||
| CT (update logic) | [ct/karakeep.sh](../../ct/karakeep.sh) |
|
||||
| Install | [install/karakeep-install.sh](../../install/karakeep-install.sh) |
|
||||
|
||||
### PHP + MariaDB/MySQL
|
||||
|
||||
**Wallabag** - Read-it-later with PHP + MariaDB + Redis + Nginx
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ---------------------------------------------------------------- |
|
||||
| CT (update logic) | [ct/wallabag.sh](../../ct/wallabag.sh) |
|
||||
| Install | [install/wallabag-install.sh](../../install/wallabag-install.sh) |
|
||||
| CT (update logic) | [ct/wallabag.sh](../../ct/wallabag.sh) |
|
||||
| Install | [install/wallabag-install.sh](../../install/wallabag-install.sh) |
|
||||
|
||||
**InvoiceNinja** - Invoicing with PHP + MariaDB + Supervisor
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ------------------------------------------------------------------------ |
|
||||
| CT (update logic) | [ct/invoiceninja.sh](../../ct/invoiceninja.sh) |
|
||||
| Install | [install/invoiceninja-install.sh](../../install/invoiceninja-install.sh) |
|
||||
| CT (update logic) | [ct/invoiceninja.sh](../../ct/invoiceninja.sh) |
|
||||
| Install | [install/invoiceninja-install.sh](../../install/invoiceninja-install.sh) |
|
||||
|
||||
**BookStack** - Wiki/Docs with PHP + MariaDB + Apache
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ------------------------------------------------------------------ |
|
||||
| CT (update logic) | [ct/bookstack.sh](../../ct/bookstack.sh) |
|
||||
| Install | [install/bookstack-install.sh](../../install/bookstack-install.sh) |
|
||||
| CT (update logic) | [ct/bookstack.sh](../../ct/bookstack.sh) |
|
||||
| Install | [install/bookstack-install.sh](../../install/bookstack-install.sh) |
|
||||
|
||||
### PHP + SQLite (Simple)
|
||||
|
||||
**Speedtest Tracker** - Speedtest with PHP + SQLite + Nginx
|
||||
| File | Link |
|
||||
| File | Link |
|
||||
| ----------------- | ---------------------------------------------------------------------------------- |
|
||||
| CT (update logic) | [ct/speedtest-tracker.sh](../../ct/speedtest-tracker.sh) |
|
||||
| Install | [install/speedtest-tracker-install.sh](../../install/speedtest-tracker-install.sh) |
|
||||
| CT (update logic) | [ct/speedtest-tracker.sh](../../ct/speedtest-tracker.sh) |
|
||||
| Install | [install/speedtest-tracker-install.sh](../../install/speedtest-tracker-install.sh) |
|
||||
|
||||
---
|
||||
|
||||
@@ -95,7 +113,7 @@
|
||||
Install Node.js from NodeSource repository.
|
||||
|
||||
```bash
|
||||
# Default (Node.js 22)
|
||||
# Default (Node.js 24)
|
||||
setup_nodejs
|
||||
|
||||
# Specific version
|
||||
@@ -135,8 +153,12 @@ $STD cargo build --release
|
||||
Install Python uv package manager (fast pip/venv replacement).
|
||||
|
||||
```bash
|
||||
# Default
|
||||
setup_uv
|
||||
|
||||
# Install a specific Python version
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
# Use in script
|
||||
setup_uv
|
||||
cd /opt/myapp
|
||||
@@ -160,7 +182,7 @@ Install PHP with configurable modules and FPM/Apache support.
|
||||
setup_php
|
||||
|
||||
# Full configuration
|
||||
PHP_VERSION="8.3" \
|
||||
PHP_VERSION="8.4" \
|
||||
PHP_MODULE="mysqli,gd,curl,mbstring,xml,zip,ldap" \
|
||||
PHP_FPM="YES" \
|
||||
PHP_APACHE="YES" \
|
||||
@@ -168,12 +190,12 @@ setup_php
|
||||
```
|
||||
|
||||
**Environment Variables:**
|
||||
| Variable | Default | Description |
|
||||
| Variable | Default | Description |
|
||||
| ------------- | ------- | ------------------------------- |
|
||||
| `PHP_VERSION` | `8.3` | PHP version to install |
|
||||
| `PHP_MODULE` | `""` | Comma-separated list of modules |
|
||||
| `PHP_FPM` | `NO` | Install PHP-FPM |
|
||||
| `PHP_APACHE` | `NO` | Install Apache module |
|
||||
| `PHP_VERSION` | `8.4` | PHP version to install |
|
||||
| `PHP_MODULE` | `""` | Comma-separated list of modules |
|
||||
| `PHP_FPM` | `NO` | Install PHP-FPM |
|
||||
| `PHP_APACHE` | `NO` | Install Apache module |
|
||||
|
||||
### `setup_composer`
|
||||
|
||||
@@ -239,12 +261,12 @@ setup_mysql
|
||||
Install PostgreSQL server.
|
||||
|
||||
```bash
|
||||
# Default (PostgreSQL 17)
|
||||
# Default (PostgreSQL 16)
|
||||
setup_postgresql
|
||||
|
||||
# Specific version
|
||||
PG_VERSION="16" setup_postgresql
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_VERSION="16" setup_postgresql
|
||||
```
|
||||
|
||||
### `setup_postgresql_db`
|
||||
@@ -279,6 +301,43 @@ setup_clickhouse
|
||||
|
||||
---
|
||||
|
||||
## Advanced Repository Management
|
||||
|
||||
### `setup_deb822_repo`
|
||||
|
||||
The modern standard (Debian 12+) for adding external repositories. Automatically handles GPG keys and sources.
|
||||
|
||||
```bash
|
||||
setup_deb822_repo \
|
||||
"nodejs" \
|
||||
"https://deb.nodesource.com/gpgkey/nodesource.gpg.key" \
|
||||
"https://deb.nodesource.com/node_22.x" \
|
||||
"bookworm" \
|
||||
"main"
|
||||
```
|
||||
|
||||
### `prepare_repository_setup`
|
||||
|
||||
A high-level helper that performs three critical tasks before adding a new repo:
|
||||
1. Cleans up old repo files matching the names provided.
|
||||
2. Removes old GPG keyrings from all standard locations.
|
||||
3. Ensures APT is in a working state (fixes locks, runs update).
|
||||
|
||||
```bash
|
||||
# Clean up old mysql/mariadb artifacts before setup
|
||||
prepare_repository_setup "mariadb" "mysql"
|
||||
```
|
||||
|
||||
### `cleanup_tool_keyrings`
|
||||
|
||||
Force-removes GPG keys for specific tools from `/usr/share/keyrings/`, `/etc/apt/keyrings/`, and `/etc/apt/trusted.gpg.d/`.
|
||||
|
||||
```bash
|
||||
cleanup_tool_keyrings "docker" "kubernetes"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## GitHub Release Helpers
|
||||
|
||||
> **Note**: `fetch_and_deploy_gh_release` is the **preferred method** for downloading GitHub releases. It handles version tracking automatically. Only use `get_latest_github_release` if you need the version number separately.
|
||||
@@ -302,17 +361,17 @@ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "la
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
| Parameter | Default | Description |
|
||||
| --------------- | ------------- | ----------------------------------------------------------------- |
|
||||
| `name` | required | App name (for version tracking) |
|
||||
| `repo` | required | GitHub repo (`owner/repo`) |
|
||||
| `type` | `tarball` | Release type: `tarball`, `zipball`, `prebuild`, `binary` |
|
||||
| `version` | `latest` | Version tag or `latest` |
|
||||
| `dest` | `/opt/[name]` | Destination directory |
|
||||
| `asset_pattern` | `""` | For `prebuild`: glob pattern to match asset (e.g. `app-*.tar.gz`) |
|
||||
| `name` | required | App name (for version tracking) |
|
||||
| `repo` | required | GitHub repo (`owner/repo`) |
|
||||
| `type` | `tarball` | Release type: `tarball`, `zipball`, `prebuild`, `binary` |
|
||||
| `version` | `latest` | Version tag or `latest` |
|
||||
| `dest` | `/opt/[name]` | Destination directory |
|
||||
| `asset_pattern` | `""` | For `prebuild`: glob pattern to match asset (e.g. `app-*.tar.gz`) |
|
||||
|
||||
**Environment Variables:**
|
||||
| Variable | Description |
|
||||
| Variable | Description |
|
||||
| ----------------- | ------------------------------------------------------------ |
|
||||
| `CLEAN_INSTALL=1` | Remove destination directory before extracting (for updates) |
|
||||
|
||||
@@ -339,26 +398,21 @@ RELEASE=$(get_latest_github_release "owner/repo")
|
||||
echo "Latest version: $RELEASE"
|
||||
```
|
||||
|
||||
# Examples
|
||||
|
||||
fetch_and_deploy_gh_release "bookstack" "BookStackApp/BookStack"
|
||||
fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/myapp"
|
||||
|
||||
````
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
| --------- | ------------- | -------------------------------------------- |
|
||||
| `name` | required | App name (for version tracking) |
|
||||
| `repo` | required | GitHub repo (`owner/repo`) |
|
||||
| `type` | `tarball` | Release type: `tarball`, `zipball`, `binary` |
|
||||
| `version` | `latest` | Version tag or `latest` |
|
||||
| `dest` | `/opt/[name]` | Destination directory |
|
||||
|
||||
---
|
||||
|
||||
## Tools & Utilities
|
||||
|
||||
### `setup_meilisearch`
|
||||
|
||||
Install Meilisearch, a lightning-fast search engine.
|
||||
|
||||
```bash
|
||||
setup_meilisearch
|
||||
|
||||
# Use in script
|
||||
$STD php artisan scout:sync-index-settings
|
||||
```
|
||||
|
||||
### `setup_yq`
|
||||
|
||||
Install yq YAML processor.
|
||||
@@ -434,6 +488,15 @@ create_self_signed_cert
|
||||
|
||||
## Utility Functions
|
||||
|
||||
### `verify_tool_version`
|
||||
|
||||
Validate that the installed major version matches the expected version. Useful during upgrades or troubleshooting.
|
||||
|
||||
```bash
|
||||
# Verify Node.js is version 22
|
||||
verify_tool_version "nodejs" "22" "$(node -v | grep -oP '^v\K[0-9]+')"
|
||||
```
|
||||
|
||||
### `get_lxc_ip`
|
||||
|
||||
Set the `$LOCAL_IP` variable with the container's IP address.
|
||||
@@ -526,7 +589,7 @@ msg_ok "Installed Dependencies"
|
||||
|
||||
# Setup runtimes and databases FIRST
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_VERSION="16" setup_postgresql
|
||||
PG_DB_NAME="myapp" PG_DB_USER="myapp" setup_postgresql_db
|
||||
get_lxc_ip
|
||||
|
||||
|
||||
@@ -17,7 +17,9 @@ Complete guide to contributing to the ProxmoxVE project - from your first fork t
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### 60 Seconds to Contributing
|
||||
### 60 Seconds to Contributing (Development)
|
||||
|
||||
When developing and testing **in your fork**:
|
||||
|
||||
```bash
|
||||
# 1. Fork on GitHub
|
||||
@@ -27,8 +29,8 @@ Complete guide to contributing to the ProxmoxVE project - from your first fork t
|
||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
|
||||
# 3. Auto-configure your fork
|
||||
bash docs/contribution/setup-fork.sh
|
||||
# 3. Auto-configure your fork (IMPORTANT - updates all links!)
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
|
||||
# 4. Create a feature branch
|
||||
git checkout -b feature/my-awesome-app
|
||||
@@ -39,19 +41,73 @@ cat docs/ct/DETAILED_GUIDE.md # For container scripts
|
||||
cat docs/install/DETAILED_GUIDE.md # For install scripts
|
||||
|
||||
# 6. Create your contribution
|
||||
cp ct/example.sh ct/myapp.sh
|
||||
cp install/example-install.sh install/myapp-install.sh
|
||||
cp docs/contribution/templates_ct/AppName.sh ct/myapp.sh
|
||||
cp docs/contribution/templates_install/AppName-install.sh install/myapp-install.sh
|
||||
# ... edit files ...
|
||||
|
||||
# 7. Test and commit
|
||||
bash ct/myapp.sh
|
||||
git add ct/myapp.sh install/myapp-install.sh
|
||||
git commit -m "feat: add MyApp"
|
||||
# 7. Push to your fork and test via GitHub
|
||||
git push origin feature/my-awesome-app
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# ⏱️ GitHub may take 10-30 seconds to update files - be patient!
|
||||
|
||||
# 8. Create your JSON metadata file
|
||||
cp docs/contribution/templates_json/AppName.json frontend/public/json/myapp.json
|
||||
# Edit metadata: name, slug, categories, description, resources, etc.
|
||||
|
||||
# 9. No direct install-script test
|
||||
# Install scripts are executed by the CT script inside the container
|
||||
|
||||
# 10. Commit ONLY your new files (see Cherry-Pick section below!)
|
||||
git add ct/myapp.sh install/myapp-install.sh frontend/public/json/myapp.json
|
||||
git commit -m "feat: add MyApp container and install scripts"
|
||||
git push origin feature/my-awesome-app
|
||||
|
||||
# 8. Create Pull Request on GitHub
|
||||
# 11. Create Pull Request on GitHub
|
||||
```
|
||||
|
||||
⚠️ **IMPORTANT: After setup-fork.sh, many files are modified!**
|
||||
|
||||
See the **Cherry-Pick: Submitting Only Your Changes** section below to learn how to push ONLY your 3-4 files instead of 600+ modified files!
|
||||
|
||||
### How Users Run Scripts (After Merged)
|
||||
|
||||
Once your script is merged to the main repository, users download and run it from GitHub like this:
|
||||
|
||||
```bash
|
||||
# ✅ Users run from GitHub (normal usage after PR merged)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/myapp.sh)"
|
||||
|
||||
# Install scripts are called by the CT script and are not run directly by users
|
||||
```
|
||||
|
||||
### Development vs. Production Execution
|
||||
|
||||
**During Development (you, in your fork):**
|
||||
|
||||
```bash
|
||||
# You MUST test via curl from your GitHub fork (not local files!)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
|
||||
# The script's curl commands are updated by setup-fork.sh to point to YOUR fork
|
||||
# This ensures you're testing your actual changes
|
||||
# ⏱️ Wait 10-30 seconds after pushing - GitHub updates slowly
|
||||
```
|
||||
|
||||
**After Merge (users, from GitHub):**
|
||||
|
||||
```bash
|
||||
# Users download the script from upstream via curl
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/myapp.sh)"
|
||||
|
||||
# The script's curl commands now point back to upstream (community-scripts)
|
||||
# This is the stable, tested version
|
||||
```
|
||||
|
||||
**Summary:**
|
||||
|
||||
- **Development**: Push to fork, test via curl → setup-fork.sh changes curl URLs to your fork
|
||||
- **Production**: curl | bash from upstream → curl URLs point to community-scripts repo
|
||||
|
||||
---
|
||||
|
||||
## 🍴 Setting Up Your Fork
|
||||
@@ -61,14 +117,35 @@ git push origin feature/my-awesome-app
|
||||
When you clone your fork, run the setup script to automatically configure everything:
|
||||
|
||||
```bash
|
||||
bash docs/contribution/setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
This will:
|
||||
**What it does:**
|
||||
|
||||
- Auto-detect your GitHub username
|
||||
- Update all documentation links to point to your fork
|
||||
- Create `.git-setup-info` with recommended git workflows
|
||||
- Auto-detects your GitHub username from git config
|
||||
- Auto-detects your fork repository name
|
||||
- Updates **ALL** hardcoded links to point to your fork instead of the main repo (`--full`)
|
||||
- Creates `.git-setup-info` with your configuration
|
||||
- Allows you to develop and test independently in your fork
|
||||
|
||||
**Why this matters:**
|
||||
|
||||
Without running this script, all links in your fork will still point to the upstream repository (community-scripts). This is a problem when testing because:
|
||||
|
||||
- Installation links will pull from upstream, not your fork
|
||||
- Updates will target the wrong repository
|
||||
- Your contributions won't be properly tested
|
||||
|
||||
**After running setup-fork.sh:**
|
||||
|
||||
Your fork is fully configured and ready to develop. You can:
|
||||
|
||||
- Push changes to your fork
|
||||
- Test via curl: `bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"`
|
||||
- All links will reference your fork for development
|
||||
- ⏱️ Wait 10-30 seconds after pushing - GitHub takes time to update
|
||||
- Commit and push with confidence
|
||||
- Create a PR to merge into upstream
|
||||
|
||||
**See**: [FORK_SETUP.md](FORK_SETUP.md) for detailed instructions
|
||||
|
||||
@@ -81,11 +158,12 @@ If the script doesn't work, manually configure:
|
||||
git config user.name "Your Name"
|
||||
git config user.email "your.email@example.com"
|
||||
|
||||
# Add upstream remote for syncing
|
||||
# Add upstream remote for syncing with main repo
|
||||
git remote add upstream https://github.com/community-scripts/ProxmoxVE.git
|
||||
|
||||
# Verify remotes
|
||||
git remote -v
|
||||
# Should show: origin (your fork) and upstream (main repo)
|
||||
```
|
||||
|
||||
---
|
||||
@@ -102,7 +180,7 @@ All scripts and configurations must follow our coding standards to ensure consis
|
||||
- **[HELPER_FUNCTIONS.md](HELPER_FUNCTIONS.md)** - Reference for all tools.func helper functions
|
||||
- **Container Scripts** - `/ct/` templates and guidelines
|
||||
- **Install Scripts** - `/install/` templates and guidelines
|
||||
- **JSON Configurations** - `/json/` structure and format
|
||||
- **JSON Configurations** - `frontend/public/json/` structure and format
|
||||
|
||||
### Quick Checklist
|
||||
|
||||
@@ -112,7 +190,7 @@ All scripts and configurations must follow our coding standards to ensure consis
|
||||
- ✅ Include proper shebang: `#!/usr/bin/env bash`
|
||||
- ✅ Add copyright header with author
|
||||
- ✅ Handle errors properly with `msg_error`, `msg_ok`, etc.
|
||||
- ✅ Test before submitting PR
|
||||
- ✅ Test before submitting PR (via curl from your fork, not local bash)
|
||||
- ✅ Update documentation if needed
|
||||
|
||||
---
|
||||
@@ -133,7 +211,172 @@ Key points:
|
||||
|
||||
---
|
||||
|
||||
## 📚 Guides & Resources
|
||||
## 🍒 Cherry-Pick: Submitting Only Your Changes
|
||||
|
||||
**Problem**: `setup-fork.sh` modifies 600+ files to update links. You don't want to submit all of those changes - only your new 3-4 files!
|
||||
|
||||
**Solution**: Use git cherry-pick to select only YOUR files.
|
||||
|
||||
### Step-by-Step Cherry-Pick Guide
|
||||
|
||||
#### 1. Check what changed
|
||||
|
||||
```bash
|
||||
# See all modified files
|
||||
git status
|
||||
|
||||
# Verify your files are there
|
||||
git status | grep -E "ct/myapp|install/myapp|json/myapp"
|
||||
```
|
||||
|
||||
#### 2. Create a clean feature branch for submission
|
||||
|
||||
```bash
|
||||
# Go back to upstream main (clean slate)
|
||||
git fetch upstream
|
||||
git checkout -b submit/myapp upstream/main
|
||||
|
||||
# Don't use your modified main branch!
|
||||
```
|
||||
|
||||
#### 3. Cherry-pick ONLY your files
|
||||
|
||||
Cherry-picking extracts specific changes from commits:
|
||||
|
||||
```bash
|
||||
# Option A: Cherry-pick commits that added your files
|
||||
# (if you committed your files separately)
|
||||
git cherry-pick <commit-hash-of-your-files>
|
||||
|
||||
# Option B: Manually copy and commit only your files
|
||||
# From your work branch, get the file contents
|
||||
git show feature/my-awesome-app:ct/myapp.sh > /tmp/myapp.sh
|
||||
git show feature/my-awesome-app:install/myapp-install.sh > /tmp/myapp-install.sh
|
||||
git show feature/my-awesome-app:frontend/public/json/myapp.json > /tmp/myapp.json
|
||||
|
||||
# Add them to the clean branch
|
||||
cp /tmp/myapp.sh ct/myapp.sh
|
||||
cp /tmp/myapp-install.sh install/myapp-install.sh
|
||||
cp /tmp/myapp.json frontend/public/json/myapp.json
|
||||
|
||||
# Commit
|
||||
git add ct/myapp.sh install/myapp-install.sh frontend/public/json/myapp.json
|
||||
git commit -m "feat: add MyApp"
|
||||
```
|
||||
|
||||
#### 4. Verify only your files are in the PR
|
||||
|
||||
```bash
|
||||
# Check git diff against upstream
|
||||
git diff upstream/main --name-only
|
||||
# Should show ONLY:
|
||||
# ct/myapp.sh
|
||||
# install/myapp-install.sh
|
||||
# frontend/public/json/myapp.json
|
||||
```
|
||||
|
||||
#### 5. Push and create PR
|
||||
|
||||
```bash
|
||||
# Push your clean submission branch
|
||||
git push origin submit/myapp
|
||||
|
||||
# Create PR on GitHub from: submit/myapp → main
|
||||
```
|
||||
|
||||
### Why This Matters
|
||||
|
||||
- ✅ Clean PR with only your changes
|
||||
- ✅ Easier for maintainers to review
|
||||
- ✅ Faster merge without conflicts
|
||||
- ❌ Without cherry-pick: PR has 600+ file changes (won't merge!)
|
||||
|
||||
### If You Made a Mistake
|
||||
|
||||
```bash
|
||||
# Delete the messy branch
|
||||
git branch -D submit/myapp
|
||||
|
||||
# Go back to clean branch
|
||||
git checkout -b submit/myapp upstream/main
|
||||
|
||||
# Try cherry-picking again
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
If you're using **Visual Studio Code** with an AI assistant, you can leverage our detailed guidelines to generate high-quality contributions automatically.
|
||||
|
||||
### How to Use AI Assistance
|
||||
|
||||
1. **Open the AI Guidelines**
|
||||
|
||||
```
|
||||
docs/contribution/AI.md
|
||||
```
|
||||
|
||||
This file contains all requirements, patterns, and examples for writing proper scripts.
|
||||
|
||||
2. **Prepare Your Information**
|
||||
|
||||
Before asking the AI to generate code, gather:
|
||||
- **Repository URL**: e.g., `https://github.com/owner/myapp`
|
||||
- **Dockerfile/Script**: Paste the app's installation instructions (if available)
|
||||
- **Dependencies**: What packages does it need? (Node, Python, Java, PostgreSQL, etc.)
|
||||
- **Ports**: What port does it listen on? (e.g., 3000, 8080, 5000)
|
||||
- **Configuration**: Any environment variables or config files?
|
||||
|
||||
3. **Tell the AI Assistant**
|
||||
|
||||
Share with the AI:
|
||||
- The repository URL
|
||||
- The Dockerfile or install instructions
|
||||
- Link to [docs/contribution/AI.md](AI.md) with instructions to follow
|
||||
|
||||
**Example prompt:**
|
||||
|
||||
```
|
||||
I want to contribute a container script for MyApp to ProxmoxVE.
|
||||
Repository: https://github.com/owner/myapp
|
||||
|
||||
Here's the Dockerfile:
|
||||
[paste Dockerfile content]
|
||||
|
||||
Please follow the guidelines in docs/contribution/AI.md to create:
|
||||
1. ct/myapp.sh (container script)
|
||||
2. install/myapp-install.sh (installation script)
|
||||
3. frontend/public/json/myapp.json (metadata)
|
||||
```
|
||||
|
||||
4. **AI Will Generate**
|
||||
|
||||
The AI will produce scripts that:
|
||||
- Follow all ProxmoxVE patterns and conventions
|
||||
- Use helper functions from `tools.func` correctly
|
||||
- Include proper error handling and messages
|
||||
- Have correct update mechanisms
|
||||
- Are ready to submit as a PR
|
||||
|
||||
### Key Points for AI Assistants
|
||||
|
||||
- **Templates Location**: `docs/contribution/templates_ct/AppName.sh`, `templates_install/`, `templates_json/`
|
||||
- **Guidelines**: Must follow `docs/contribution/AI.md` exactly
|
||||
- **Helper Functions**: Use only functions from `misc/tools.func` - never write custom ones
|
||||
- **Testing**: Always test before submission via curl from your fork
|
||||
```bash
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
# Wait 10-30 seconds after pushing changes
|
||||
```
|
||||
- **No Docker**: Container scripts must be bare-metal, not Docker-based
|
||||
|
||||
### Benefits
|
||||
|
||||
- **Speed**: AI generates boilerplate in seconds
|
||||
- **Consistency**: Follows same patterns as 200+ existing scripts
|
||||
- **Quality**: Less bugs and more maintainable code
|
||||
- **Learning**: See how your app should be structured
|
||||
|
||||
---
|
||||
|
||||
### Documentation
|
||||
|
||||
@@ -221,15 +464,15 @@ git push origin feature/my-feature
|
||||
git rebase upstream/main
|
||||
```
|
||||
|
||||
2. **Test your changes**
|
||||
2. **Test your changes** (via curl from your fork)
|
||||
|
||||
```bash
|
||||
bash ct/my-app.sh
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/my-app.sh)"
|
||||
# Follow prompts and test the container
|
||||
# ⏱️ Wait 10-30 seconds after pushing - GitHub takes time to update
|
||||
```
|
||||
|
||||
3. **Check code standards**
|
||||
|
||||
- [ ] Follows template structure
|
||||
- [ ] Proper error handling
|
||||
- [ ] Documentation updated (if needed)
|
||||
@@ -260,23 +503,66 @@ Before opening a PR:
|
||||
|
||||
## ❓ FAQ
|
||||
|
||||
### How do I test my changes?
|
||||
### ❌ Why can't I test with `bash ct/myapp.sh` locally?
|
||||
|
||||
You might try:
|
||||
|
||||
```bash
|
||||
# For container scripts
|
||||
bash ct/my-app.sh
|
||||
|
||||
# For install scripts (runs inside container)
|
||||
# The ct script will call it automatically
|
||||
|
||||
# For advanced debugging
|
||||
VERBOSE=yes bash ct/my-app.sh
|
||||
# ❌ WRONG - This won't test your actual changes!
|
||||
bash ct/myapp.sh
|
||||
./ct/myapp.sh
|
||||
sh ct/myapp.sh
|
||||
```
|
||||
|
||||
**Why this fails:**
|
||||
|
||||
- `bash ct/myapp.sh` uses the LOCAL clone file
|
||||
- The LOCAL file doesn't execute the curl commands - it's already on disk
|
||||
- The curl URLs INSIDE the script are modified by setup-fork.sh, but they're not executed
|
||||
- So you can't verify if your curl URLs actually work
|
||||
- Users will get the curl URL version (which may be broken)
|
||||
|
||||
**Solution:** Always test via curl from GitHub:
|
||||
|
||||
```bash
|
||||
# ✅ CORRECT - Tests the actual GitHub URLs
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/myapp.sh)"
|
||||
```
|
||||
|
||||
### ❓ How do I test my changes?
|
||||
|
||||
You **cannot** test locally with `bash ct/myapp.sh` from your cloned directory!
|
||||
|
||||
You **must** push to GitHub and test via curl from your fork:
|
||||
|
||||
```bash
|
||||
# 1. Push your changes to your fork
|
||||
git push origin feature/my-awesome-app
|
||||
|
||||
# 2. Test via curl (this loads the script from GitHub, not local files)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/my-app.sh)"
|
||||
|
||||
# 3. For verbose/debug output, pass environment variables
|
||||
VERBOSE=yes bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/my-app.sh)"
|
||||
DEV_MODE_LOGS=true bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/my-app.sh)"
|
||||
```
|
||||
|
||||
**Why?**
|
||||
|
||||
- Local `bash ct/myapp.sh` uses local files from your clone
|
||||
- But the script's INTERNAL curl commands have been modified by setup-fork.sh to point to your fork
|
||||
- This discrepancy means you're not actually testing the curl URLs
|
||||
- Testing via curl ensures the script downloads from YOUR fork GitHub URLs
|
||||
- ⏱️ **Important:** GitHub takes 10-30 seconds to recognize newly pushed files. Wait before testing!
|
||||
|
||||
**What if local bash worked?**
|
||||
|
||||
You'd be testing local files only, not the actual GitHub URLs that users will download. This means broken curl links wouldn't be caught during testing.
|
||||
|
||||
### What if my PR has conflicts?
|
||||
|
||||
```bash
|
||||
# Sync with upstream
|
||||
# Sync with upstream main repository
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
|
||||
@@ -288,17 +574,27 @@ git push -f origin your-branch
|
||||
|
||||
### How do I keep my fork updated?
|
||||
|
||||
See "Keep Your Fork Updated" section above, or run:
|
||||
Two ways:
|
||||
|
||||
**Option 1: Run setup script again**
|
||||
|
||||
```bash
|
||||
bash docs/contribution/setup-fork.sh
|
||||
bash docs/contribution/setup-fork.sh --full
|
||||
```
|
||||
|
||||
**Option 2: Manual sync**
|
||||
|
||||
```bash
|
||||
git fetch upstream
|
||||
git rebase upstream/main
|
||||
git push -f origin main
|
||||
```
|
||||
|
||||
### Where do I ask questions?
|
||||
|
||||
- **GitHub Issues**: For bugs and feature requests
|
||||
- **GitHub Discussions**: For general questions
|
||||
- **Discord**: Community-scripts server
|
||||
- **GitHub Discussions**: For general questions and ideas
|
||||
- **Discord**: Community-scripts server for real-time chat
|
||||
|
||||
---
|
||||
|
||||
@@ -307,7 +603,7 @@ bash docs/contribution/setup-fork.sh
|
||||
### For First-Time Contributors
|
||||
|
||||
1. Read: [docs/README.md](../README.md) - Documentation overview
|
||||
2. Read: [docs/contribution/FORK_SETUP.md](FORK_SETUP.md) - Fork setup guide
|
||||
2. Read: [CONTRIBUTING.md](CONTRIBUTING.md) - Essential coding standards
|
||||
3. Choose your path:
|
||||
- Containers → [docs/ct/DETAILED_GUIDE.md](../ct/DETAILED_GUIDE.md)
|
||||
- Installation → [docs/install/DETAILED_GUIDE.md](../install/DETAILED_GUIDE.md)
|
||||
@@ -318,21 +614,24 @@ bash docs/contribution/setup-fork.sh
|
||||
|
||||
1. Review [CONTRIBUTING.md](CONTRIBUTING.md) - Coding standards
|
||||
2. Review [CODE_AUDIT.md](CODE_AUDIT.md) - Audit checklist
|
||||
3. Check templates in `/ct/` and `/install/`
|
||||
4. Submit PR with confidence
|
||||
3. Check templates in `/docs/contribution/templates_*/`
|
||||
4. Use AI assistants with [AI.md](AI.md) for code generation
|
||||
5. Submit PR with confidence
|
||||
|
||||
### For Reviewers/Maintainers
|
||||
### For Using AI Assistants
|
||||
|
||||
1. Use [CODE_AUDIT.md](CODE_AUDIT.md) as review guide
|
||||
2. Reference [docs/TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md) for architecture
|
||||
3. Check [docs/EXIT_CODES.md](../EXIT_CODES.md) for error handling
|
||||
See "Using AI Assistants" section above for:
|
||||
|
||||
- How to structure prompts
|
||||
- What information to provide
|
||||
- How to validate AI output
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Ready to Contribute?
|
||||
|
||||
1. **Fork** the repository
|
||||
2. **Clone** your fork and **setup** with `bash docs/contribution/setup-fork.sh`
|
||||
2. **Clone** your fork and **setup** with `bash docs/contribution/setup-fork.sh --full`
|
||||
3. **Choose** your contribution type (container, installation, tools, etc.)
|
||||
4. **Read** the appropriate detailed guide
|
||||
5. **Create** your feature branch
|
||||
@@ -345,9 +644,9 @@ bash docs/contribution/setup-fork.sh
|
||||
|
||||
## 📞 Contact & Support
|
||||
|
||||
- **GitHub**: https://github.com/community-scripts/ProxmoxVE
|
||||
- **Issues**: https://github.com/community-scripts/ProxmoxVE/issues
|
||||
- **Discussions**: https://github.com/community-scripts/ProxmoxVE/discussions
|
||||
- **GitHub**: [community-scripts/ProxmoxVE](https://github.com/community-scripts/ProxmoxVE)
|
||||
- **Issues**: [GitHub Issues](https://github.com/community-scripts/ProxmoxVE/issues)
|
||||
- **Discussions**: [GitHub Discussions](https://github.com/community-scripts/ProxmoxVE/discussions)
|
||||
- **Discord**: [Join Server](https://discord.gg/UHrpNWGwkH)
|
||||
|
||||
---
|
||||
|
||||
@@ -8,13 +8,15 @@
|
||||
# Updates all hardcoded links to point to your fork
|
||||
#
|
||||
# Usage:
|
||||
# ./setup-fork.sh # Auto-detect from git config
|
||||
# ./setup-fork.sh YOUR_USERNAME # Specify username
|
||||
# ./setup-fork.sh YOUR_USERNAME REPO_NAME # Specify both
|
||||
# ./setup-fork.sh # Auto-detect from git config (updates misc/ only)
|
||||
# ./setup-fork.sh YOUR_USERNAME # Specify username (updates misc/ only)
|
||||
# ./setup-fork.sh YOUR_USERNAME REPO_NAME # Specify both (updates misc/ only)
|
||||
# ./setup-fork.sh --full # Update all files including ct/, install/, vm/, etc.
|
||||
#
|
||||
# Examples:
|
||||
# ./setup-fork.sh john # Uses john/ProxmoxVE
|
||||
# ./setup-fork.sh john my-fork # Uses john/my-fork
|
||||
# ./setup-fork.sh john # Uses john/ProxmoxVE, updates misc/ only
|
||||
# ./setup-fork.sh john my-fork # Uses john/my-fork, updates misc/ only
|
||||
# ./setup-fork.sh --full # Auto-detect + update all files
|
||||
################################################################################
|
||||
|
||||
set -e
|
||||
@@ -30,131 +32,136 @@ NC='\033[0m' # No Color
|
||||
REPO_NAME="ProxmoxVE"
|
||||
USERNAME=""
|
||||
AUTO_DETECT=true
|
||||
UPDATE_ALL=false
|
||||
|
||||
################################################################################
|
||||
# FUNCTIONS
|
||||
################################################################################
|
||||
|
||||
print_header() {
|
||||
echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║${NC} ProxmoxVE Fork Setup Script"
|
||||
echo -e "${BLUE}║${NC} Configuring for your fork..."
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}\n"
|
||||
echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║${NC} ProxmoxVE Fork Setup Script"
|
||||
echo -e "${BLUE}║${NC} Configuring for your fork..."
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}\n"
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${BLUE}ℹ${NC} $1"
|
||||
echo -e "${BLUE}ℹ${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠${NC} $1"
|
||||
echo -e "${YELLOW}⚠${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
}
|
||||
|
||||
# Detect username from git remote
|
||||
detect_username() {
|
||||
local remote_url
|
||||
local remote_url
|
||||
|
||||
# Try to get from origin
|
||||
if ! remote_url=$(git config --get remote.origin.url 2>/dev/null); then
|
||||
return 1
|
||||
fi
|
||||
# Try to get from origin
|
||||
if ! remote_url=$(git config --get remote.origin.url 2>/dev/null); then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Extract username from SSH or HTTPS URL
|
||||
if [[ $remote_url =~ git@github.com:([^/]+) ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
elif [[ $remote_url =~ github.com/([^/]+) ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
# Extract username from SSH or HTTPS URL
|
||||
if [[ $remote_url =~ git@github.com:([^/]+) ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
elif [[ $remote_url =~ github.com/([^/]+) ]]; then
|
||||
echo "${BASH_REMATCH[1]}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Detect repo name from git remote
|
||||
detect_repo_name() {
|
||||
local remote_url
|
||||
local remote_url
|
||||
|
||||
if ! remote_url=$(git config --get remote.origin.url 2>/dev/null); then
|
||||
return 1
|
||||
fi
|
||||
if ! remote_url=$(git config --get remote.origin.url 2>/dev/null); then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Extract repo name (remove .git if present)
|
||||
if [[ $remote_url =~ /([^/]+?)(.git)?$ ]]; then
|
||||
local repo="${BASH_REMATCH[1]}"
|
||||
echo "${repo%.git}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
# Extract repo name (remove .git if present)
|
||||
if [[ $remote_url =~ /([^/]+?)(.git)?$ ]]; then
|
||||
local repo="${BASH_REMATCH[1]}"
|
||||
echo "${repo%.git}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Ask user for confirmation
|
||||
confirm() {
|
||||
local prompt="$1"
|
||||
local response
|
||||
local prompt="$1"
|
||||
local response
|
||||
|
||||
read -p "$(echo -e ${YELLOW})$prompt (y/n)${NC} " -r response
|
||||
[[ $response =~ ^[Yy]$ ]]
|
||||
echo -ne "${YELLOW}${prompt} (y/n)${NC} "
|
||||
read -r response
|
||||
[[ $response =~ ^[Yy]$ ]]
|
||||
}
|
||||
|
||||
# Update links in files
|
||||
update_links() {
|
||||
local old_repo="community-scripts"
|
||||
local old_name="ProxmoxVE"
|
||||
local new_owner="$1"
|
||||
local new_repo="$2"
|
||||
local files_updated=0
|
||||
local old_repo="community-scripts"
|
||||
local old_name="ProxmoxVE"
|
||||
local new_owner="$1"
|
||||
local new_repo="$2"
|
||||
local files_updated=0
|
||||
|
||||
print_info "Scanning for hardcoded links..."
|
||||
print_info "Scanning for hardcoded links..."
|
||||
|
||||
# Find all markdown and shell files
|
||||
local -a files_to_update=(
|
||||
"docs/DEFAULTS_SYSTEM_GUIDE.md"
|
||||
"docs/alpine-install.func.md"
|
||||
"docs/install.func.md"
|
||||
"docs/APP-install.md"
|
||||
"docs/APP-ct.md"
|
||||
"docs/CONTRIBUTION_GUIDE.md"
|
||||
"docs/INDEX.md"
|
||||
"docs/README.md"
|
||||
"docs/EXIT_CODES.md"
|
||||
"docs/api/README.md"
|
||||
)
|
||||
# Change to repo root
|
||||
local repo_root=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
||||
|
||||
echo ""
|
||||
# Determine search path
|
||||
local search_path="$repo_root/misc"
|
||||
if [[ "$UPDATE_ALL" == "true" ]]; then
|
||||
search_path="$repo_root"
|
||||
print_info "Searching all files (--full mode)"
|
||||
else
|
||||
print_info "Searching misc/ directory only (core functions)"
|
||||
fi
|
||||
|
||||
for file in "${files_to_update[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
# Count occurrences
|
||||
local count=$(grep -c "github.com/$old_repo/$old_name" "$file" 2>/dev/null || echo 0)
|
||||
echo ""
|
||||
|
||||
if [[ $count -gt 0 ]]; then
|
||||
# Backup original
|
||||
cp "$file" "$file.backup"
|
||||
# Find all files containing the old repo reference
|
||||
while IFS= read -r file; do
|
||||
# Count occurrences
|
||||
local count=$(grep -c "github.com/$old_repo/$old_name" "$file" 2>/dev/null || echo 0)
|
||||
|
||||
# Replace links
|
||||
sed -i "s|github.com/$old_repo/$old_name|github.com/$new_owner/$new_repo|g" "$file"
|
||||
if [[ $count -gt 0 ]]; then
|
||||
# Backup original
|
||||
cp "$file" "$file.backup"
|
||||
|
||||
((files_updated++))
|
||||
print_success "Updated $file ($count links)"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
# Replace links - use different sed syntax for BSD/macOS vs GNU sed
|
||||
if sed --version &>/dev/null 2>&1; then
|
||||
# GNU sed
|
||||
sed -i "s|github.com/$old_repo/$old_name|github.com/$new_owner/$new_repo|g" "$file"
|
||||
else
|
||||
# BSD sed (macOS)
|
||||
sed -i '' "s|github.com/$old_repo/$old_name|github.com/$new_owner/$new_repo|g" "$file"
|
||||
fi
|
||||
|
||||
return $files_updated
|
||||
((files_updated++))
|
||||
print_success "Updated $file ($count links)"
|
||||
fi
|
||||
done < <(find "$search_path" -type f \( -name "*.md" -o -name "*.sh" -o -name "*.func" -o -name "*.json" \) -not -path "*/.git/*" 2>/dev/null | xargs grep -l "github.com/$old_repo/$old_name" 2>/dev/null)
|
||||
|
||||
return $files_updated
|
||||
}
|
||||
|
||||
# Create user git config setup info
|
||||
create_git_setup_info() {
|
||||
local username="$1"
|
||||
local username="$1"
|
||||
|
||||
cat >.git-setup-info <<'EOF'
|
||||
cat >.git-setup-info <<'EOF'
|
||||
# Git Configuration for ProxmoxVE Development
|
||||
|
||||
## Recommended Git Configuration
|
||||
@@ -213,10 +220,10 @@ git merge upstream/main
|
||||
|
||||
---
|
||||
|
||||
For more help, see: docs/CONTRIBUTION_GUIDE.md
|
||||
For more help, see: docs/contribution/README.md
|
||||
EOF
|
||||
|
||||
print_success "Created .git-setup-info file"
|
||||
print_success "Created .git-setup-info file"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
@@ -227,65 +234,79 @@ print_header
|
||||
|
||||
# Parse command line arguments
|
||||
if [[ $# -gt 0 ]]; then
|
||||
# Check for --full flag
|
||||
if [[ "$1" == "--full" ]]; then
|
||||
UPDATE_ALL=true
|
||||
AUTO_DETECT=true
|
||||
shift # Remove --full from arguments
|
||||
fi
|
||||
|
||||
# Process remaining arguments
|
||||
if [[ $# -gt 0 ]]; then
|
||||
USERNAME="$1"
|
||||
AUTO_DETECT=false
|
||||
|
||||
if [[ $# -gt 1 ]]; then
|
||||
REPO_NAME="$2"
|
||||
REPO_NAME="$2"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Try auto-detection
|
||||
if username=$(detect_username); then
|
||||
USERNAME="$username"
|
||||
print_success "Detected GitHub username: $USERNAME"
|
||||
else
|
||||
print_error "Could not auto-detect GitHub username from git config"
|
||||
echo -e "${YELLOW}Please run:${NC}"
|
||||
echo " ./setup-fork.sh YOUR_USERNAME"
|
||||
exit 1
|
||||
fi
|
||||
# Try auto-detection
|
||||
if username=$(detect_username); then
|
||||
USERNAME="$username"
|
||||
print_success "Detected GitHub username: $USERNAME"
|
||||
else
|
||||
print_error "Could not auto-detect GitHub username from git config"
|
||||
echo -e "${YELLOW}Please run:${NC}"
|
||||
echo " ./setup-fork.sh YOUR_USERNAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if repo_name=$(detect_repo_name); then
|
||||
REPO_NAME="$repo_name"
|
||||
if [[ "$REPO_NAME" != "ProxmoxVE" ]]; then
|
||||
print_info "Detected custom repo name: $REPO_NAME"
|
||||
else
|
||||
print_success "Using default repo name: ProxmoxVE"
|
||||
fi
|
||||
if repo_name=$(detect_repo_name); then
|
||||
REPO_NAME="$repo_name"
|
||||
if [[ "$REPO_NAME" != "ProxmoxVE" ]]; then
|
||||
print_info "Detected custom repo name: $REPO_NAME"
|
||||
else
|
||||
print_success "Using default repo name: ProxmoxVE"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Validate inputs
|
||||
if [[ -z "$USERNAME" ]]; then
|
||||
print_error "Username cannot be empty"
|
||||
exit 1
|
||||
print_error "Username cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "$REPO_NAME" ]]; then
|
||||
print_error "Repository name cannot be empty"
|
||||
exit 1
|
||||
print_error "Repository name cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Show what we'll do
|
||||
echo -e "${BLUE}Configuration Summary:${NC}"
|
||||
echo " Repository URL: https://github.com/$USERNAME/$REPO_NAME"
|
||||
echo " Files to update: 10 files with documentation"
|
||||
if [[ "$UPDATE_ALL" == "true" ]]; then
|
||||
echo " Files to update: ALL files (ct/, install/, vm/, misc/, docs/, etc.)"
|
||||
else
|
||||
echo " Files to update: misc/ directory only (core functions)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Ask for confirmation
|
||||
if ! confirm "Apply these changes?"; then
|
||||
print_warning "Setup cancelled"
|
||||
exit 0
|
||||
print_warning "Setup cancelled"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Update all links
|
||||
if update_links "$USERNAME" "$REPO_NAME"; then
|
||||
links_changed=$?
|
||||
print_success "Updated $links_changed files"
|
||||
links_changed=$?
|
||||
print_success "Updated $links_changed files"
|
||||
else
|
||||
print_warning "No links needed updating or some files not found"
|
||||
print_warning "No links needed updating or some files not found"
|
||||
fi
|
||||
|
||||
# Create git setup info file
|
||||
@@ -307,7 +328,7 @@ echo -e "${BLUE}Next Steps:${NC}"
|
||||
echo " 1. Review the changes: git diff"
|
||||
echo " 2. Check .git-setup-info for recommended git workflow"
|
||||
echo " 3. Start developing: git checkout -b feature/my-app"
|
||||
echo " 4. Read: docs/CONTRIBUTION_GUIDE.md"
|
||||
echo " 4. Read: docs/contribution/README.md"
|
||||
echo ""
|
||||
|
||||
print_success "Happy contributing! 🚀"
|
||||
|
||||
@@ -1,197 +1,189 @@
|
||||
# **AppName<span></span>.sh Scripts**
|
||||
# CT Container Scripts - Quick Reference
|
||||
|
||||
`AppName.sh` scripts found in the `/ct` directory. These scripts are responsible for the installation of the desired application. For this guide we take `/ct/snipeit.sh` as example.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [**AppName.sh Scripts**](#appnamesh-scripts)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [1. **File Header**](#1-file-header)
|
||||
- [1.1 **Shebang**](#11-shebang)
|
||||
- [1.2 **Import Functions**](#12-import-functions)
|
||||
- [1.3 **Metadata**](#13-metadata)
|
||||
- [2 **Variables and function import**](#2-variables-and-function-import)
|
||||
- [2.1 **Default Values**](#21-default-values)
|
||||
- [2.2 **📋 App output \& base settings**](#22--app-output--base-settings)
|
||||
- [2.3 **🛠 Core functions**](#23--core-functions)
|
||||
- [3 **Update function**](#3-update-function)
|
||||
- [3.1 **Function Header**](#31-function-header)
|
||||
- [3.2 **Check APP**](#32-check-app)
|
||||
- [3.3 **Check version**](#33-check-version)
|
||||
- [3.4 **Verbosity**](#34-verbosity)
|
||||
- [3.5 **Backups**](#35-backups)
|
||||
- [3.6 **Cleanup**](#36-cleanup)
|
||||
- [3.7 **No update function**](#37-no-update-function)
|
||||
- [4 **End of the script**](#4-end-of-the-script)
|
||||
- [5. **Contribution checklist**](#5-contribution-checklist)
|
||||
|
||||
## 1. **File Header**
|
||||
|
||||
### 1.1 **Shebang**
|
||||
|
||||
- Use `#!/usr/bin/env bash` as the shebang.
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
```
|
||||
|
||||
### 1.2 **Import Functions**
|
||||
|
||||
- Import the build.func file.
|
||||
- When developing your own script, change the URL to your own repository.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> You also need to change all apperances of this URL in `misc/build.func` and `misc/install.func`
|
||||
|
||||
Example for development:
|
||||
|
||||
```bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/[USER]/[REPO]/refs/heads/[BRANCH]/misc/build.func)
|
||||
```
|
||||
|
||||
Final script:
|
||||
|
||||
```bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
> Before opening a Pull Request, change the URLs to point to the community-scripts repo.
|
||||
|
||||
### 1.3 **Metadata**
|
||||
|
||||
- Add clear comments for script metadata, including author, copyright, and license information.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: [YourUserName]
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL]
|
||||
```
|
||||
|
||||
> [!NOTE]:
|
||||
> [!WARNING]
|
||||
> **This is legacy documentation.** Refer to the **modern template** at [templates_ct/AppName.sh](AppName.sh) for best practices.
|
||||
>
|
||||
> - Add your username and source URL
|
||||
> - For existing scripts, add "| Co-Author [YourUserName]" after the current author
|
||||
> Current templates use:
|
||||
>
|
||||
> - `tools.func` helpers instead of manual patterns
|
||||
> - `check_for_gh_release` and `fetch_and_deploy_gh_release` from build.func
|
||||
> - Automatic setup-fork.sh configuration
|
||||
|
||||
---
|
||||
|
||||
## 2 **Variables and function import**
|
||||
>
|
||||
> [!NOTE]
|
||||
> You need to have all this set in your script, otherwise it will not work!
|
||||
## Before Creating a Script
|
||||
|
||||
### 2.1 **Default Values**
|
||||
1. **Fork & Clone:**
|
||||
|
||||
- This section sets the default values for the container.
|
||||
- `APP` needs to be set to the application name and must be equal to the filenames of your scripts.
|
||||
- `var_tags`: You can set Tags for the CT wich show up in the Proxmox UI. Don´t overdo it!
|
||||
```bash
|
||||
git clone https://github.com/YOUR_USERNAME/ProxmoxVE.git
|
||||
cd ProxmoxVE
|
||||
```
|
||||
|
||||
>[!NOTE]
|
||||
>Description for all Default Values
|
||||
>
|
||||
>| Variable | Description | Notes |
|
||||
>|----------|-------------|-------|
|
||||
>| `APP` | Application name | Must match ct\AppName.sh |
|
||||
>| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number |
|
||||
>| `var_cpu` | CPU cores | Number of cores |
|
||||
>| `var_ram` | RAM | In MB |
|
||||
>| `var_disk` | Disk capacity | In GB |
|
||||
>| `var_os` | Operating system | alpine, debian, ubuntu |
|
||||
>| `var_version` | OS version | e.g., 3.20, 11, 12, 20.04 |
|
||||
>| `var_unprivileged` | Container type | 1 = Unprivileged, 0 = Privileged |
|
||||
2. **Run setup-fork.sh** (updates all curl URLs to your fork):
|
||||
|
||||
Example:
|
||||
```bash
|
||||
bash docs/contribution/setup-fork.sh
|
||||
```
|
||||
|
||||
3. **Copy the Modern Template:**
|
||||
|
||||
```bash
|
||||
cp templates_ct/AppName.sh ct/MyApp.sh
|
||||
# Edit ct/MyApp.sh with your app details
|
||||
```
|
||||
|
||||
4. **Test Your Script (via GitHub):**
|
||||
|
||||
⚠️ **Important:** You must push to GitHub and test via curl, not `bash ct/MyApp.sh`!
|
||||
|
||||
```bash
|
||||
# Push your changes to your fork first
|
||||
git push origin feature/my-awesome-app
|
||||
|
||||
# Then test via curl (this loads from YOUR fork, not local files)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/MyApp.sh)"
|
||||
```
|
||||
|
||||
> 💡 **Why?** The script's curl commands are modified by setup-fork.sh, but local execution uses local files, not the updated GitHub URLs. Testing via curl ensures your script actually works.
|
||||
>
|
||||
> ⏱️ **Note:** GitHub sometimes takes 10-30 seconds to update files. If you don't see your changes, wait and try again.
|
||||
|
||||
5. **Cherry-Pick for PR** (submit ONLY your 3-4 files):
|
||||
- See [Cherry-Pick Guide](../README.md) for step-by-step git commands
|
||||
|
||||
---
|
||||
|
||||
## Template Structure
|
||||
|
||||
The modern template includes:
|
||||
|
||||
### Header
|
||||
|
||||
```bash
|
||||
APP="SnipeIT"
|
||||
var_tags="asset-management;foss"
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# (Note: setup-fork.sh changes this URL to point to YOUR fork during development)
|
||||
```
|
||||
|
||||
### Metadata
|
||||
|
||||
```bash
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: YourUsername
|
||||
# License: MIT
|
||||
APP="MyApp"
|
||||
var_tags="app-category;foss"
|
||||
var_cpu="2"
|
||||
var_ram="2048"
|
||||
var_disk="4"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_os="alpine"
|
||||
var_version="3.20"
|
||||
var_unprivileged="1"
|
||||
```
|
||||
|
||||
## 2.2 **📋 App output & base settings**
|
||||
### Core Setup
|
||||
|
||||
```bash
|
||||
header_info "$APP"
|
||||
```
|
||||
- `header_info`: Generates ASCII header for APP
|
||||
|
||||
## 2.3 **🛠 Core functions**
|
||||
|
||||
```bash
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
```
|
||||
|
||||
- `variables`: Processes input and prepares variables
|
||||
- `color`: Sets icons, colors, and formatting
|
||||
- `catch_errors`: Enables error handling
|
||||
### Update Function
|
||||
|
||||
---
|
||||
|
||||
## 3 **Update function**
|
||||
|
||||
### 3.1 **Function Header**
|
||||
|
||||
- If applicable write a function that updates the application and the OS in the container.
|
||||
- Each update function starts with the same code:
|
||||
The modern template provides a standard update pattern:
|
||||
|
||||
```bash
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
```
|
||||
|
||||
### 3.2 **Check APP**
|
||||
|
||||
- Before doing anything update-wise, check if the app is installed in the container.
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
if [[ ! -d /opt/snipe-it ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
```
|
||||
|
||||
### 3.3 **Check version**
|
||||
|
||||
- Before updating, check if a new version exists.
|
||||
- We use the `${APPLICATION}_version.txt` file created in `/opt` during the install to compare new versions against the currently installed version.
|
||||
|
||||
Example with a Github Release:
|
||||
|
||||
```bash
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
#DO UPDATE
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}."
|
||||
fi
|
||||
exit
|
||||
# Use tools.func helpers:
|
||||
check_for_gh_release "myapp" "owner/repo"
|
||||
fetch_and_deploy_gh_release "myapp" "owner/repo" "tarball" "latest" "/opt/myapp"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Patterns
|
||||
|
||||
### Check for Updates (App Repository)
|
||||
|
||||
Use `check_for_gh_release` with the **app repo**:
|
||||
|
||||
```bash
|
||||
check_for_gh_release "myapp" "owner/repo"
|
||||
```
|
||||
|
||||
### Deploy External App
|
||||
|
||||
Use `fetch_and_deploy_gh_release` with the **app repo**:
|
||||
|
||||
```bash
|
||||
fetch_and_deploy_gh_release "myapp" "owner/repo"
|
||||
```
|
||||
|
||||
### Avoid Manual Version Checking
|
||||
|
||||
❌ OLD (manual):
|
||||
|
||||
```bash
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/myapp/myapp/releases/latest | grep tag_name)
|
||||
```
|
||||
|
||||
✅ NEW (use tools.func):
|
||||
|
||||
```bash
|
||||
fetch_and_deploy_gh_release "myapp" "owner/repo"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use tools.func helpers** - Don't manually curl for versions
|
||||
2. **Only add app-specific dependencies** - Don't add ca-certificates, curl, gnupg (handled by build.func)
|
||||
3. **Test via curl from your fork** - Push first, then: `bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/MyApp.sh)"`
|
||||
4. **Wait for GitHub to update** - Takes 10-30 seconds after git push
|
||||
5. **Cherry-pick only YOUR files** - Submit only ct/MyApp.sh, install/MyApp-install.sh, frontend/public/json/myapp.json (3 files)
|
||||
6. **Verify before PR** - Run `git diff upstream/main --name-only` to confirm only your files changed
|
||||
|
||||
---
|
||||
|
||||
## Common Update Patterns
|
||||
|
||||
See the [modern template](AppName.sh) and [AI.md](../AI.md) for complete working examples.
|
||||
|
||||
Recent reference scripts with good update functions:
|
||||
|
||||
- [Trip](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/trip.sh)
|
||||
- [Thingsboard](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/thingsboard.sh)
|
||||
- [UniFi](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/unifi.sh)
|
||||
|
||||
---
|
||||
|
||||
## Need Help?
|
||||
|
||||
- **[README.md](../README.md)** - Full contribution workflow
|
||||
- **[AI.md](../AI.md)** - AI-generated script guidelines
|
||||
- **[FORK_SETUP.md](../FORK_SETUP.md)** - Why setup-fork.sh is important
|
||||
- **[Slack Community](https://discord.gg/your-link)** - Ask questions
|
||||
|
||||
````
|
||||
|
||||
### 3.4 **Verbosity**
|
||||
|
||||
- Use the appropriate flag (**-q** in the examples) for a command to suppress its output.
|
||||
Example:
|
||||
Example:
|
||||
|
||||
```bash
|
||||
curl -fsSL
|
||||
unzip -q
|
||||
```
|
||||
````
|
||||
|
||||
- If a command does not come with this functionality use `$STD` to suppress it's output.
|
||||
|
||||
@@ -207,8 +199,8 @@ $STD php artisan config:clear
|
||||
- Backup user data if necessary.
|
||||
- Move all user data back in the directory when the update is finished.
|
||||
|
||||
>[!NOTE]
|
||||
>This is not meant to be a permanent backup
|
||||
> [!NOTE]
|
||||
> This is not meant to be a permanent backup
|
||||
|
||||
Example backup:
|
||||
|
||||
@@ -227,7 +219,7 @@ Example config restore:
|
||||
### 3.6 **Cleanup**
|
||||
|
||||
- Do not forget to remove any temporary files/folders such as zip-files or temporary backups.
|
||||
Example:
|
||||
Example:
|
||||
|
||||
```bash
|
||||
rm -rf /opt/v${RELEASE}.zip
|
||||
@@ -277,7 +269,7 @@ echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
## 5. **Contribution checklist**
|
||||
|
||||
- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
|
||||
- [ ] Correct link to *build.func*
|
||||
- [ ] Correct link to _build.func_
|
||||
- [ ] Metadata (author, license) is included at the top.
|
||||
- [ ] Variables follow naming conventions.
|
||||
- [ ] Update function exists.
|
||||
|
||||
@@ -5,89 +5,133 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL e.g. https://github.com/example/app]
|
||||
|
||||
# App Default Values
|
||||
# ============================================================================
|
||||
# APP CONFIGURATION
|
||||
# ============================================================================
|
||||
# These values are sent to build.func and define default container resources.
|
||||
# Users can customize these during installation via the interactive prompts.
|
||||
# ============================================================================
|
||||
|
||||
APP="[AppName]"
|
||||
var_tags="${var_tags:-[category]}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_tags="${var_tags:-[category1];[category2]}" # Max 2 tags, semicolon-separated
|
||||
var_cpu="${var_cpu:-2}" # CPU cores: 1-4 typical
|
||||
var_ram="${var_ram:-2048}" # RAM in MB: 512, 1024, 2048, etc.
|
||||
var_disk="${var_disk:-8}" # Disk in GB: 6, 8, 10, 20 typical
|
||||
var_os="${var_os:-debian}" # OS: debian, ubuntu, alpine
|
||||
var_version="${var_version:-13}" # OS Version: 13 (Debian), 24.04 (Ubuntu), 3.21 (Alpine)
|
||||
var_unprivileged="${var_unprivileged:-1}" # 1=unprivileged (secure), 0=privileged (for Docker/Podman)
|
||||
|
||||
# =============================================================================
|
||||
# CONFIGURATION GUIDE
|
||||
# =============================================================================
|
||||
# APP - Display name, title case (e.g. "Koel", "Wallabag", "Actual Budget")
|
||||
# var_tags - Max 2 tags, semicolon separated (e.g. "music;streaming", "finance")
|
||||
# var_cpu - CPU cores: 1-4 typical
|
||||
# var_ram - RAM in MB: 512, 1024, 2048, 4096 typical
|
||||
# var_disk - Disk in GB: 4, 6, 8, 10, 20 typical
|
||||
# var_os - OS: debian, ubuntu, alpine
|
||||
# var_version - OS version: 12/13 (debian), 22.04/24.04 (ubuntu), 3.20/3.21 (alpine)
|
||||
# var_unprivileged - 1 = unprivileged (secure, default), 0 = privileged (for docker etc.)
|
||||
# ============================================================================
|
||||
# INITIALIZATION - These are required in all CT scripts
|
||||
# ============================================================================
|
||||
header_info "$APP" # Display app name and setup header
|
||||
variables # Initialize build.func variables
|
||||
color # Load color variables for output
|
||||
catch_errors # Enable error handling with automatic exit on failure
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
# ============================================================================
|
||||
# UPDATE SCRIPT - Called when user selects "Update" from web interface
|
||||
# ============================================================================
|
||||
# This function is triggered by the web interface to update the application.
|
||||
# It should:
|
||||
# 1. Check if installation exists
|
||||
# 2. Check for new GitHub releases
|
||||
# 3. Stop running services
|
||||
# 4. Backup critical data
|
||||
# 5. Deploy new version
|
||||
# 6. Run post-update commands (migrations, config updates, etc.)
|
||||
# 7. Restore data if needed
|
||||
# 8. Start services
|
||||
#
|
||||
# Exit with `exit` at the end to prevent container restart.
|
||||
# ============================================================================
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
# Check if installation exists
|
||||
# Step 1: Verify installation exists
|
||||
if [[ ! -d /opt/[appname] ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
# check_for_gh_release returns 0 (true) if update available, 1 (false) if not
|
||||
if check_for_gh_release "[appname]" "[owner/repo]"; then
|
||||
msg_info "Stopping Services"
|
||||
# Step 2: Check if update is available
|
||||
if check_for_gh_release "[appname]" "YourUsername/YourRepo"; then
|
||||
|
||||
# Step 3: Stop services before update
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop [appname]
|
||||
msg_ok "Stopped Services"
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
# Optional: Backup important data before update
|
||||
msg_info "Creating Backup"
|
||||
mkdir -p /tmp/[appname]_backup
|
||||
cp /opt/[appname]/.env /tmp/[appname]_backup/ 2>/dev/null || true
|
||||
cp -r /opt/[appname]/data /tmp/[appname]_backup/ 2>/dev/null || true
|
||||
msg_ok "Created Backup"
|
||||
# Step 4: Backup critical data before overwriting
|
||||
msg_info "Backing up Data"
|
||||
cp -r /opt/[appname]/data /opt/[appname]_data_backup 2>/dev/null || true
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
# CLEAN_INSTALL=1 removes old directory before extracting new version
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "[appname]" "[owner/repo]" "tarball" "latest" "/opt/[appname]"
|
||||
# Step 5: Download and deploy new version
|
||||
# CLEAN_INSTALL=1 removes old directory before extracting
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "[appname]" "owner/repo" "tarball" "latest" "/opt/[appname]"
|
||||
|
||||
# Restore configuration and data
|
||||
# Step 6: Run post-update commands (uncomment as needed)
|
||||
# These examples show common patterns - use what applies to your app:
|
||||
#
|
||||
# For Node.js apps:
|
||||
# msg_info "Installing Dependencies"
|
||||
# cd /opt/[appname]
|
||||
# $STD npm ci --production
|
||||
# msg_ok "Installed Dependencies"
|
||||
#
|
||||
# For Python apps:
|
||||
# msg_info "Installing Dependencies"
|
||||
# cd /opt/[appname]
|
||||
# $STD uv sync --frozen
|
||||
# msg_ok "Installed Dependencies"
|
||||
#
|
||||
# For database migrations:
|
||||
# msg_info "Running Database Migrations"
|
||||
# cd /opt/[appname]
|
||||
# $STD npm run migrate
|
||||
# msg_ok "Ran Database Migrations"
|
||||
#
|
||||
# For PHP apps:
|
||||
# msg_info "Installing Dependencies"
|
||||
# cd /opt/[appname]
|
||||
# $STD composer install --no-dev
|
||||
# msg_ok "Installed Dependencies"
|
||||
|
||||
# Step 7: Restore data from backup
|
||||
msg_info "Restoring Data"
|
||||
cp /tmp/[appname]_backup/.env /opt/[appname]/ 2>/dev/null || true
|
||||
cp -r /tmp/[appname]_backup/data/* /opt/[appname]/data/ 2>/dev/null || true
|
||||
rm -rf /tmp/[appname]_backup
|
||||
cp -r /opt/[appname]_data_backup/. /opt/[appname]/data/ 2>/dev/null || true
|
||||
rm -rf /opt/[appname]_data_backup
|
||||
msg_ok "Restored Data"
|
||||
|
||||
# Optional: Run any post-update commands
|
||||
msg_info "Running Post-Update Tasks"
|
||||
cd /opt/[appname]
|
||||
# Examples:
|
||||
# $STD npm ci --production
|
||||
# $STD php artisan migrate --force
|
||||
# $STD composer install --no-dev
|
||||
msg_ok "Ran Post-Update Tasks"
|
||||
|
||||
msg_info "Starting Services"
|
||||
# Step 8: Restart service with new version
|
||||
msg_info "Starting Service"
|
||||
systemctl start [appname]
|
||||
msg_ok "Started Services"
|
||||
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# MAIN EXECUTION - Container creation flow
|
||||
# ============================================================================
|
||||
# These are called by build.func and handle the full installation process:
|
||||
# 1. start - Initialize container creation
|
||||
# 2. build_container - Execute the install script inside container
|
||||
# 3. description - Display completion info and access details
|
||||
# ============================================================================
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
# ============================================================================
|
||||
# COMPLETION MESSAGE
|
||||
# ============================================================================
|
||||
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}"
|
||||
|
||||
@@ -1,54 +1,195 @@
|
||||
# Install Scripts - Quick Reference
|
||||
|
||||
# **AppName<span></span>-install.sh Scripts**
|
||||
> [!WARNING]
|
||||
> **This is legacy documentation.** Refer to the **modern template** at [templates_install/AppName-install.sh](AppName-install.sh) for best practices.
|
||||
>
|
||||
> Current templates use:
|
||||
>
|
||||
> - `tools.func` helpers (setup_nodejs, setup_uv, setup_postgresql_db, etc.)
|
||||
> - Automatic dependency installation via build.func
|
||||
> - Standardized environment variable patterns
|
||||
|
||||
`AppName-install.sh` scripts found in the `/install` directory. These scripts are responsible for the installation of the application. For this guide we take `/install/snipeit-install.sh` as example.
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
## Before Creating a Script
|
||||
|
||||
- [**AppName-install.sh Scripts**](#appname-installsh-scripts)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [1. **File header**](#1-file-header)
|
||||
- [1.1 **Shebang**](#11-shebang)
|
||||
- [1.2 **Comments**](#12-comments)
|
||||
- [1.3 **Variables and function import**](#13-variables-and-function-import)
|
||||
- [2. **Variable naming and management**](#2-variable-naming-and-management)
|
||||
- [2.1 **Naming conventions**](#21-naming-conventions)
|
||||
- [3. **Dependencies**](#3-dependencies)
|
||||
- [3.1 **Install all at once**](#31-install-all-at-once)
|
||||
- [3.2 **Collapse dependencies**](#32-collapse-dependencies)
|
||||
- [4. **Paths to application files**](#4-paths-to-application-files)
|
||||
- [5. **Version management**](#5-version-management)
|
||||
- [5.1 **Install the latest release**](#51-install-the-latest-release)
|
||||
- [5.2 **Save the version for update checks**](#52-save-the-version-for-update-checks)
|
||||
- [6. **Input and output management**](#6-input-and-output-management)
|
||||
- [6.1 **User feedback**](#61-user-feedback)
|
||||
- [6.2 **Verbosity**](#62-verbosity)
|
||||
- [7. **String/File Manipulation**](#7-stringfile-manipulation)
|
||||
- [7.1 **File Manipulation**](#71-file-manipulation)
|
||||
- [8. **Security practices**](#8-security-practices)
|
||||
- [8.1 **Password generation**](#81-password-generation)
|
||||
- [8.2 **File permissions**](#82-file-permissions)
|
||||
- [9. **Service Configuration**](#9-service-configuration)
|
||||
- [9.1 **Configuration files**](#91-configuration-files)
|
||||
- [9.2 **Credential management**](#92-credential-management)
|
||||
- [9.3 **Enviroment files**](#93-enviroment-files)
|
||||
- [9.4 **Services**](#94-services)
|
||||
- [10. **Cleanup**](#10-cleanup)
|
||||
- [10.1 **Remove temporary files**](#101-remove-temporary-files)
|
||||
- [10.2 **Autoremove and autoclean**](#102-autoremove-and-autoclean)
|
||||
- [11. **Best Practices Checklist**](#11-best-practices-checklist)
|
||||
- [Example: High-Level Script Flow](#example-high-level-script-flow)
|
||||
1. **Copy the Modern Template:**
|
||||
|
||||
## 1. **File header**
|
||||
```bash
|
||||
cp templates_install/AppName-install.sh install/MyApp-install.sh
|
||||
# Edit install/MyApp-install.sh
|
||||
```
|
||||
|
||||
### 1.1 **Shebang**
|
||||
2. **Key Pattern:**
|
||||
- CT scripts source build.func and call the install script
|
||||
- Install scripts use sourced FUNCTIONS_FILE_PATH (via build.func)
|
||||
- Both scripts work together in the container
|
||||
|
||||
- Use `#!/usr/bin/env bash` as the shebang.
|
||||
3. **Test via GitHub:**
|
||||
|
||||
```bash
|
||||
# Push your changes to your fork first
|
||||
git push origin feature/my-awesome-app
|
||||
|
||||
# Test the CT script via curl (it will call the install script)
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/YOUR_USERNAME/ProxmoxVE/main/ct/MyApp.sh)"
|
||||
# ⏱️ Wait 10-30 seconds after pushing - GitHub takes time to update
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Template Structure
|
||||
|
||||
### Header
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)
|
||||
# (setup-fork.sh modifies this URL to point to YOUR fork during development)
|
||||
```
|
||||
|
||||
### Dependencies (App-Specific Only)
|
||||
|
||||
```bash
|
||||
# Don't add: ca-certificates, curl, gnupg, wget, git, jq
|
||||
# These are handled by build.func
|
||||
msg_info "Installing dependencies"
|
||||
$STD apt-get install -y app-specific-deps
|
||||
msg_ok "Installed dependencies"
|
||||
```
|
||||
|
||||
### Runtime Setup
|
||||
|
||||
Use tools.func helpers instead of manual installation:
|
||||
|
||||
```bash
|
||||
# ✅ NEW (use tools.func):
|
||||
NODE_VERSION="20"
|
||||
setup_nodejs
|
||||
# OR
|
||||
PYTHON_VERSION="3.12"
|
||||
setup_uv
|
||||
# OR
|
||||
PG_DB_NAME="myapp_db"
|
||||
PG_DB_USER="myapp"
|
||||
setup_postgresql_db
|
||||
```
|
||||
|
||||
### Service Configuration
|
||||
|
||||
```bash
|
||||
# Create .env file
|
||||
msg_info "Configuring MyApp"
|
||||
cat << EOF > /opt/myapp/.env
|
||||
DEBUG=false
|
||||
PORT=8080
|
||||
DATABASE_URL=postgresql://...
|
||||
EOF
|
||||
msg_ok "Configuration complete"
|
||||
|
||||
# Create systemd service
|
||||
msg_info "Creating systemd service"
|
||||
cat << EOF > /etc/systemd/system/myapp.service
|
||||
[Unit]
|
||||
Description=MyApp
|
||||
[Service]
|
||||
ExecStart=/usr/bin/node /opt/myapp/app.js
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
msg_ok "Service created"
|
||||
```
|
||||
|
||||
### Finalization
|
||||
|
||||
```bash
|
||||
msg_info "Finalizing MyApp installation"
|
||||
systemctl enable --now myapp
|
||||
motd_ssh
|
||||
customize
|
||||
msg_ok "MyApp installation complete"
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Patterns
|
||||
|
||||
### Avoid Manual Version Checking
|
||||
|
||||
❌ OLD (manual):
|
||||
|
||||
```bash
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/app/repo/releases/latest | grep tag_name)
|
||||
wget https://github.com/app/repo/releases/download/$RELEASE/app.tar.gz
|
||||
```
|
||||
|
||||
✅ NEW (use tools.func via CT script's fetch_and_deploy_gh_release):
|
||||
|
||||
```bash
|
||||
# In CT script, not install script:
|
||||
fetch_and_deploy_gh_release "myapp" "app/repo" "app.tar.gz" "latest" "/opt/myapp"
|
||||
```
|
||||
|
||||
### Database Setup
|
||||
|
||||
```bash
|
||||
# Use setup_postgresql_db, setup_mysql_db, etc.
|
||||
PG_DB_NAME="myapp"
|
||||
PG_DB_USER="myapp"
|
||||
setup_postgresql_db
|
||||
```
|
||||
|
||||
### Node.js Setup
|
||||
|
||||
```bash
|
||||
NODE_VERSION="20"
|
||||
setup_nodejs
|
||||
npm install --no-save
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Only add app-specific dependencies**
|
||||
- Don't add: ca-certificates, curl, gnupg, wget, git, jq
|
||||
- These are handled by build.func
|
||||
|
||||
2. **Use tools.func helpers**
|
||||
- setup_nodejs, setup_python, setup_uv, setup_postgresql_db, setup_mysql_db, etc.
|
||||
|
||||
3. **Don't do version checks in install script**
|
||||
- Version checking happens in CT script's update_script()
|
||||
- Install script just installs the latest
|
||||
|
||||
4. **Structure:**
|
||||
- Dependencies
|
||||
- Runtime setup (tools.func)
|
||||
- Deployment (fetch from CT script)
|
||||
- Configuration files
|
||||
- Systemd service
|
||||
- Finalization
|
||||
|
||||
---
|
||||
|
||||
## Reference Scripts
|
||||
|
||||
See working examples:
|
||||
|
||||
- [Trip](https://github.com/community-scripts/ProxmoxVE/blob/main/install/trip-install.sh)
|
||||
- [Thingsboard](https://github.com/community-scripts/ProxmoxVE/blob/main/install/thingsboard-install.sh)
|
||||
- [UniFi](https://github.com/community-scripts/ProxmoxVE/blob/main/install/unifi-install.sh)
|
||||
|
||||
---
|
||||
|
||||
## Need Help?
|
||||
|
||||
- **[Modern Template](AppName-install.sh)** - Start here
|
||||
- **[CT Template](../templates_ct/AppName.sh)** - How CT scripts work
|
||||
- **[README.md](../README.md)** - Full contribution workflow
|
||||
- **[AI.md](../AI.md)** - AI-generated script guidelines
|
||||
|
||||
### 1.2 **Comments**
|
||||
|
||||
- Add clear comments for script metadata, including author, copyright, and license information.
|
||||
@@ -189,7 +330,7 @@ msg_ok "Installed Dependencies"
|
||||
### 6.2 **Verbosity**
|
||||
|
||||
- Use the appropiate flag (**-q** in the examples) for a command to suppres its output
|
||||
Example:
|
||||
Example:
|
||||
|
||||
```bash
|
||||
curl -fsSL
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: [SOURCE_URL e.g. https://github.com/example/app]
|
||||
|
||||
# Import Functions and Setup
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
@@ -15,48 +14,51 @@ network_check
|
||||
update_os
|
||||
|
||||
# =============================================================================
|
||||
# DEPENDENCIES
|
||||
# DEPENDENCIES - Only add app-specific dependencies here!
|
||||
# Don't add: ca-certificates, curl, gnupg, git, build-essential (handled by build.func)
|
||||
# =============================================================================
|
||||
# Only install what's actually needed - curl/sudo/mc are already in the base image
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
nginx \
|
||||
build-essential
|
||||
libharfbuzz0b \
|
||||
fontconfig
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
# =============================================================================
|
||||
# HELPER FUNCTIONS FROM tools.func
|
||||
# SETUP RUNTIMES & DATABASES (if needed)
|
||||
# =============================================================================
|
||||
# These functions are available via $FUNCTIONS_FILE_PATH (tools.func)
|
||||
# Call them with optional environment variables for configuration
|
||||
# Examples (uncomment as needed):
|
||||
#
|
||||
# --- Runtime & Language Setup ---
|
||||
# NODE_VERSION="22" setup_nodejs # Install Node.js (22, 24)
|
||||
# NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs # With pnpm
|
||||
# PYTHON_VERSION="3.13" setup_uv # Python with uv package manager
|
||||
# setup_go # Install Go (latest)
|
||||
# setup_rust # Install Rust via rustup
|
||||
# setup_ruby # Install Ruby
|
||||
# PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="mysqli,gd" setup_php
|
||||
# PHP_VERSION="8.3" PHP_FPM="YES" PHP_APACHE="YES" PHP_MODULE="bcmath,curl,gd,intl,mbstring,mysql,xml,zip" setup_php
|
||||
# setup_composer # Install PHP Composer
|
||||
# JAVA_VERSION="21" setup_java # Install Java (17, 21)
|
||||
# NODE_VERSION="22" setup_nodejs
|
||||
# NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs # Installs pnpm
|
||||
# PYTHON_VERSION="3.13" setup_uv
|
||||
# JAVA_VERSION="21" setup_java
|
||||
# GO_VERSION="1.22" setup_go
|
||||
# PHP_VERSION="8.4" PHP_FPM="YES" setup_php
|
||||
# setup_postgresql # Server only
|
||||
# setup_mariadb # Server only
|
||||
# setup_meilisearch # Search engine
|
||||
#
|
||||
# --- Database Setup ---
|
||||
# setup_mariadb # Install MariaDB server
|
||||
# MARIADB_DB_NAME="mydb" MARIADB_DB_USER="myuser" setup_mariadb_db
|
||||
# setup_mysql # Install MySQL server
|
||||
# PG_VERSION="17" setup_postgresql # Install PostgreSQL (16, 17)
|
||||
# PG_VERSION="17" PG_MODULES="postgis" setup_postgresql # With extensions
|
||||
# PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db
|
||||
# setup_mongodb # Install MongoDB
|
||||
#
|
||||
# --- GitHub Release (PREFERRED METHOD) ---
|
||||
# fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" # Downloads, extracts, tracks version
|
||||
# fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||
# fetch_and_deploy_gh_release "appname" "owner/repo" "prebuild" "latest" "/opt/appname" "app-*.tar.gz"
|
||||
# Then set up DB and user (sets $[DB]_DB_PASS):
|
||||
# PG_DB_NAME="myapp" PG_DB_USER="myapp" setup_postgresql_db
|
||||
# MARIADB_DB_NAME="myapp" MARIADB_DB_USER="myapp" setup_mariadb_db
|
||||
|
||||
# =============================================================================
|
||||
# DOWNLOAD & DEPLOY APPLICATION
|
||||
# =============================================================================
|
||||
# fetch_and_deploy_gh_release modes:
|
||||
# "tarball" - Source tarball (default if omitted)
|
||||
# "binary" - .deb package (auto-detects amd64/arm64)
|
||||
# "prebuild" - Pre-built archive (.tar.gz)
|
||||
# "singlefile" - Single binary file
|
||||
#
|
||||
# Examples:
|
||||
# fetch_and_deploy_gh_release "myapp" "YourUsername/myapp" "tarball" "latest" "/opt/myapp"
|
||||
# fetch_and_deploy_gh_release "myapp" "YourUsername/myapp" "binary" "latest" "/tmp"
|
||||
# fetch_and_deploy_gh_release "myapp" "YourUsername/myapp" "prebuild" "latest" "/opt/myapp" "myapp-*.tar.gz"
|
||||
|
||||
fetch_and_deploy_gh_release "[appname]" "owner/repo" "tarball" "latest" "/opt/[appname]"
|
||||
|
||||
# --- Tools & Utilities ---
|
||||
# get_lxc_ip # Sets $LOCAL_IP variable (call early!)
|
||||
# setup_ffmpeg # Install FFmpeg with codecs
|
||||
@@ -67,8 +69,11 @@ msg_ok "Installed Dependencies"
|
||||
# create_self_signed_cert # Creates cert in /etc/ssl/[appname]/
|
||||
|
||||
# =============================================================================
|
||||
# EXAMPLE 1: Node.js Application with PostgreSQL
|
||||
# EXAMPLES
|
||||
# =============================================================================
|
||||
#
|
||||
# EXAMPLE 1: Node.js Application with PostgreSQL
|
||||
# ---------------------------------------------
|
||||
# NODE_VERSION="22" setup_nodejs
|
||||
# PG_VERSION="17" setup_postgresql
|
||||
# PG_DB_NAME="myapp" PG_DB_USER="myapp" setup_postgresql_db
|
||||
@@ -84,10 +89,9 @@ msg_ok "Installed Dependencies"
|
||||
# PORT=3000
|
||||
# EOF
|
||||
# msg_ok "Configured MyApp"
|
||||
|
||||
# =============================================================================
|
||||
#
|
||||
# EXAMPLE 2: Python Application with uv
|
||||
# =============================================================================
|
||||
# ------------------------------------
|
||||
# PYTHON_VERSION="3.13" setup_uv
|
||||
# get_lxc_ip
|
||||
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "tarball" "latest" "/opt/myapp"
|
||||
@@ -141,7 +145,7 @@ fetch_and_deploy_gh_release "[appname]" "[owner/repo]" "tarball" "latest" "/opt/
|
||||
|
||||
msg_info "Setting up [AppName]"
|
||||
cd /opt/[appname]
|
||||
$STD npm ci
|
||||
# $STD npm ci
|
||||
msg_ok "Setup [AppName]"
|
||||
|
||||
# =============================================================================
|
||||
@@ -149,14 +153,25 @@ msg_ok "Setup [AppName]"
|
||||
# =============================================================================
|
||||
|
||||
msg_info "Configuring [AppName]"
|
||||
cd /opt/[appname]
|
||||
|
||||
# Install application dependencies (uncomment as needed):
|
||||
# $STD npm ci --production # Node.js apps
|
||||
# $STD uv sync --frozen # Python apps
|
||||
# $STD composer install --no-dev # PHP apps
|
||||
# $STD cargo build --release # Rust apps
|
||||
|
||||
# Create .env file if needed:
|
||||
cat <<EOF >/opt/[appname]/.env
|
||||
HOST=${LOCAL_IP}
|
||||
# Use import_local_ip to get container IP, or hardcode if building on Proxmox
|
||||
APP_URL=http://localhost
|
||||
PORT=8080
|
||||
EOF
|
||||
|
||||
msg_ok "Configured [AppName]"
|
||||
|
||||
# =============================================================================
|
||||
# SERVICE CREATION
|
||||
# CREATE SYSTEMD SERVICE
|
||||
# =============================================================================
|
||||
|
||||
msg_info "Creating Service"
|
||||
@@ -182,9 +197,11 @@ msg_ok "Created Service"
|
||||
# =============================================================================
|
||||
# CLEANUP & FINALIZATION
|
||||
# =============================================================================
|
||||
# These are called automatically, but shown here for clarity:
|
||||
# motd_ssh - Displays service info on SSH login
|
||||
# customize - Enables optional customizations
|
||||
# cleanup_lxc - Removes temp files, bash history, logs
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
# cleanup_lxc handles: apt autoremove, autoclean, temp files, bash history
|
||||
cleanup_lxc
|
||||
|
||||
28
docs/contribution/templates_json/AppName.json
generated
28
docs/contribution/templates_json/AppName.json
generated
@@ -4,25 +4,26 @@
|
||||
"categories": [
|
||||
0
|
||||
],
|
||||
"date_created": "DATE CREATED",
|
||||
"date_created": "2026-01-18",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": "DEFAULT-PORT",
|
||||
"documentation": null,
|
||||
"website": "LINK TO WEBSITE",
|
||||
"logo": "LINK TO LOGO",
|
||||
"description": "Description of the app",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docs.example.com/",
|
||||
"website": "https://example.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/appname.webp",
|
||||
"config_path": "/opt/appname/.env",
|
||||
"description": "Short description of what AppName does and its main features.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/AppName.sh",
|
||||
"script": "ct/appname.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 4,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -30,5 +31,10 @@
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
"notes": [
|
||||
{
|
||||
"text": "Change the default password after first login!",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,13 +1,165 @@
|
||||
# **AppName<span></span>.json Files**
|
||||
# JSON Metadata Files - Quick Reference
|
||||
|
||||
`AppName.json` files found in the `/json` directory. These files are used to provide informations for the website. For this guide we take `/json/snipeit.json` as example.
|
||||
The metadata file (`frontend/public/json/myapp.json`) tells the web interface how to display your application.
|
||||
|
||||
## Table of Contents
|
||||
---
|
||||
|
||||
- [**AppName.json Files**](#appnamejson-files)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [1. JSON Generator](#1-json-generator)
|
||||
## Quick Start
|
||||
|
||||
## 1. JSON Generator
|
||||
**Use the JSON Generator Tool:**
|
||||
[https://community-scripts.github.io/ProxmoxVE/json-editor](https://community-scripts.github.io/ProxmoxVE/json-editor)
|
||||
|
||||
Use the [JSON Generator](https://community-scripts.github.io/ProxmoxVE/json-editor) to create this file for your application.
|
||||
1. Enter application details
|
||||
2. Generator creates `frontend/public/json/myapp.json`
|
||||
3. Copy the output to your contribution
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "MyApp",
|
||||
"slug": "myapp",
|
||||
"categories": [1],
|
||||
"date_created": "2026-01-18",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docs.example.com/",
|
||||
"website": "https://example.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/myapp.webp",
|
||||
"config_path": "/opt/myapp/.env",
|
||||
"description": "Brief description of what MyApp does",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/myapp.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Change the default password after first login!",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Field Reference
|
||||
|
||||
| Field | Required | Example | Notes |
|
||||
| --------------------- | -------- | ----------------- | ---------------------------------------------- |
|
||||
| `name` | Yes | "MyApp" | Display name |
|
||||
| `slug` | Yes | "myapp" | URL-friendly identifier (lowercase, no spaces) |
|
||||
| `categories` | Yes | [1] | One or more category IDs |
|
||||
| `date_created` | Yes | "2026-01-18" | Format: YYYY-MM-DD |
|
||||
| `type` | Yes | "ct" | Container type: "ct" or "vm" |
|
||||
| `interface_port` | Yes | 3000 | Default web interface port |
|
||||
| `logo` | No | "https://..." | Logo URL (64px x 64px PNG) |
|
||||
| `config_path` | Yes | "/opt/myapp/.env" | Main config file location |
|
||||
| `description` | Yes | "App description" | Brief description (100 chars) |
|
||||
| `install_methods` | Yes | See below | Installation resources (array) |
|
||||
| `default_credentials` | No | See below | Optional default login |
|
||||
| `notes` | No | See below | Additional notes (array) |
|
||||
|
||||
---
|
||||
|
||||
## Install Methods
|
||||
|
||||
Each installation method specifies resource requirements:
|
||||
|
||||
```json
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/myapp.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
**Resource Defaults:**
|
||||
|
||||
- CPU: Cores (1-8)
|
||||
- RAM: Megabytes (256-4096)
|
||||
- Disk: Gigabytes (4-50)
|
||||
|
||||
---
|
||||
|
||||
## Common Categories
|
||||
|
||||
- `0` Miscellaneous
|
||||
- `1` Proxmox & Virtualization
|
||||
- `2` Operating Systems
|
||||
- `3` Containers & Docker
|
||||
- `4` Network & Firewall
|
||||
- `5` Adblock & DNS
|
||||
- `6` Authentication & Security
|
||||
- `7` Backup & Recovery
|
||||
- `8` Databases
|
||||
- `9` Monitoring & Analytics
|
||||
- `10` Dashboards & Frontends
|
||||
- `11` Files & Downloads
|
||||
- `12` Documents & Notes
|
||||
- `13` Media & Streaming
|
||||
- `14` \*Arr Suite
|
||||
- `15` NVR & Cameras
|
||||
- `16` IoT & Smart Home
|
||||
- `17` ZigBee, Z-Wave & Matter
|
||||
- `18` MQTT & Messaging
|
||||
- `19` Automation & Scheduling
|
||||
- `20` AI / Coding & Dev-Tools
|
||||
- `21` Webservers & Proxies
|
||||
- `22` Bots & ChatOps
|
||||
- `23` Finance & Budgeting
|
||||
- `24` Gaming & Leisure
|
||||
- `25` Business & ERP
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use the JSON Generator** - It validates structure
|
||||
2. **Keep descriptions short** - 100 characters max
|
||||
3. **Use real resource requirements** - Based on your testing
|
||||
4. **Include sensible defaults** - Pre-filled in install_methods
|
||||
5. **Slug must be lowercase** - No spaces, use hyphens
|
||||
|
||||
---
|
||||
|
||||
## Reference Examples
|
||||
|
||||
See actual examples in the repo:
|
||||
|
||||
- [frontend/public/json/trip.json](https://github.com/community-scripts/ProxmoxVE/blob/main/frontend/public/json/trip.json)
|
||||
- [frontend/public/json/thingsboard.json](https://github.com/community-scripts/ProxmoxVE/blob/main/frontend/public/json/thingsboard.json)
|
||||
- [frontend/public/json/unifi.json](https://github.com/community-scripts/ProxmoxVE/blob/main/frontend/public/json/unifi.json)
|
||||
|
||||
---
|
||||
|
||||
## Need Help?
|
||||
|
||||
- **[JSON Generator](https://community-scripts.github.io/ProxmoxVE/json-editor)** - Interactive tool
|
||||
- **[README.md](../README.md)** - Full contribution workflow
|
||||
- **[Quick Start](../README.md)** - Step-by-step guide
|
||||
|
||||
@@ -539,6 +539,69 @@ var_nesting=0 # Nested containers disabled
|
||||
|
||||
---
|
||||
|
||||
### var_diagnostics
|
||||
|
||||
**Type:** Boolean (yes or no)
|
||||
**Default:** `yes`
|
||||
**Description:** Determines if anonymous telemetry and diagnostic data is sent to Community-Scripts API.
|
||||
|
||||
```bash
|
||||
var_diagnostics=yes # Allow telemetry (helps us improve scripts)
|
||||
var_diagnostics=no # Disable all telemetry
|
||||
```
|
||||
|
||||
**Privacy & Usage:**
|
||||
- Data is strictly anonymous (random session ID)
|
||||
- Reports success/failure of installations
|
||||
- Maps error codes (e.g., APT lock, out of RAM)
|
||||
- No user-specific data, hostnames, or secret keys are ever sent
|
||||
|
||||
---
|
||||
|
||||
### var_gpu
|
||||
|
||||
**Type:** Boolean/Toggle
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Enable GPU passthrough for the container.
|
||||
|
||||
```bash
|
||||
var_gpu=yes # Enable GPU passthrough (auto-detect)
|
||||
var_gpu=no # Disable GPU passthrough (default)
|
||||
```
|
||||
|
||||
**Features enabled:**
|
||||
- Auto-detects Intel (QuickSync), NVIDIA, and AMD GPUs
|
||||
- Passes through `/dev/dri` and render nodes
|
||||
- Configures appropriate container permissions
|
||||
- Crucial for media servers (Plex, Jellyfin, Immich)
|
||||
|
||||
**Prerequisites:**
|
||||
- Host drivers installed correctly
|
||||
- Hardware present and visible to Proxmox
|
||||
- IOMMU enabled (for some configurations)
|
||||
|
||||
---
|
||||
|
||||
### var_tun
|
||||
|
||||
**Type:** Boolean/Toggle
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Enable TUN/TAP device support.
|
||||
|
||||
```bash
|
||||
var_tun=yes # Enable TUN/TAP support
|
||||
var_tun=no # Disable TUN/TAP support (default)
|
||||
```
|
||||
|
||||
**Required for:**
|
||||
- VPN software (WireGuard, OpenVPN)
|
||||
- Network tunneling (Tailscale, ZeroTier)
|
||||
- Custom network bridges
|
||||
|
||||
---
|
||||
|
||||
### var_keyctl
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
@@ -560,13 +623,14 @@ var_keyctl=0 # Keyctl disabled
|
||||
|
||||
### var_fuse
|
||||
|
||||
**Type:** Boolean (0 or 1)
|
||||
**Default:** `0`
|
||||
**Type:** Boolean/Toggle
|
||||
**Options:** `yes` or `no`
|
||||
**Default:** `no`
|
||||
**Description:** Enable FUSE filesystem support.
|
||||
|
||||
```bash
|
||||
var_fuse=1 # FUSE enabled
|
||||
var_fuse=0 # FUSE disabled
|
||||
var_fuse=yes # FUSE enabled
|
||||
var_fuse=no # FUSE disabled
|
||||
```
|
||||
|
||||
**Required for:**
|
||||
|
||||
@@ -57,7 +57,7 @@ pveversion
|
||||
### 2. Network Connectivity
|
||||
```bash
|
||||
# Test GitHub access
|
||||
curl -I https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh
|
||||
curl -I https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh
|
||||
|
||||
# Test internet connectivity
|
||||
ping -c 1 1.1.1.1
|
||||
@@ -108,6 +108,8 @@ var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
var_disk=30 \
|
||||
var_hostname=production-app \
|
||||
var_os=debian \
|
||||
var_version=13 \
|
||||
var_brg=vmbr0 \
|
||||
var_net=dhcp \
|
||||
var_ipv6_method=none \
|
||||
@@ -117,7 +119,7 @@ var_nesting=1 \
|
||||
var_tags=production,automated \
|
||||
var_protection=yes \
|
||||
var_verbose=no \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
|
||||
|
||||
echo "✓ Container deployed successfully"
|
||||
```
|
||||
@@ -151,7 +153,7 @@ var_gateway=192.168.1.1 \
|
||||
|
||||
**Step 1: Create defaults once (interactive)**
|
||||
```bash
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/pihole.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/pihole.sh)"
|
||||
# Select "Advanced Settings" → Configure → Save as "App Defaults"
|
||||
```
|
||||
|
||||
@@ -161,10 +163,30 @@ bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/Proxmo
|
||||
# deploy-with-defaults.sh
|
||||
|
||||
# App defaults are loaded automatically
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/pihole.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/pihole.sh)"
|
||||
# Script will use /usr/local/community-scripts/defaults/pihole.vars
|
||||
```
|
||||
|
||||
### Advanced Configuration Variables
|
||||
|
||||
Beyond the basic resource settings, you can control advanced container features:
|
||||
|
||||
| Variable | Description | Options |
|
||||
|----------|-------------|---------|
|
||||
| `var_os` | Operating system template | `debian`, `ubuntu`, `alpine` |
|
||||
| `var_version` | OS version | `12`, `13` (Debian), `22.04`, `24.04` (Ubuntu) |
|
||||
| `var_gpu` | Enable GPU passthrough | `yes`, `no` (Default: `no`) |
|
||||
| `var_tun` | Enable TUN/TAP device | `yes`, `no` (Default: `no`) |
|
||||
| `var_nesting` | Enable nesting | `1`, `0` (Default: `1`) |
|
||||
|
||||
**Example with GPU and TUN:**
|
||||
```bash
|
||||
var_gpu=yes \
|
||||
var_tun=yes \
|
||||
var_hostname=transcoder \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/plex.sh)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Batch Deployments
|
||||
@@ -177,14 +199,14 @@ bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/Proxmo
|
||||
#!/bin/bash
|
||||
# batch-deploy-simple.sh
|
||||
|
||||
apps=("debian" "ubuntu" "alpine")
|
||||
apps=("thingsboard" "qui" "flatnotes")
|
||||
|
||||
for app in "${apps[@]}"; do
|
||||
echo "Deploying $app..."
|
||||
var_hostname="$app-container" \
|
||||
var_hostname="$app-server" \
|
||||
var_cpu=2 \
|
||||
var_ram=2048 \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)"
|
||||
|
||||
echo "✓ $app deployed"
|
||||
sleep 5 # Wait between deployments
|
||||
@@ -198,10 +220,10 @@ done
|
||||
# batch-deploy-advanced.sh - Deploy multiple containers with individual configs
|
||||
|
||||
declare -A CONTAINERS=(
|
||||
["pihole"]="2:1024:8:vmbr0:dns,network"
|
||||
["homeassistant"]="4:4096:20:vmbr0:automation,ha"
|
||||
["docker"]="6:8192:50:vmbr1:containers,docker"
|
||||
["nginx"]="2:2048:10:vmbr0:webserver,proxy"
|
||||
["beszel"]="1:512:8:vmbr0:monitoring"
|
||||
["qui"]="2:1024:10:vmbr0:torrent,ui"
|
||||
["thingsboard"]="6:8192:50:vmbr1:iot,industrial"
|
||||
["dockge"]="2:2048:10:vmbr0:docker,management"
|
||||
)
|
||||
|
||||
for app in "${!CONTAINERS[@]}"; do
|
||||
@@ -228,7 +250,7 @@ for app in "${!CONTAINERS[@]}"; do
|
||||
var_ipv6_method=none \
|
||||
var_ssh=yes \
|
||||
var_tags="$tags,automated" \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)" 2>&1 | tee "deploy-${app}.log"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)" 2>&1 | tee "deploy-${app}.log"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✓ $app deployed successfully"
|
||||
@@ -263,7 +285,7 @@ deploy_container() {
|
||||
var_disk="$disk" \
|
||||
var_hostname="$app" \
|
||||
var_net=dhcp \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)" \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)" \
|
||||
&> "deploy-${app}.log"
|
||||
|
||||
echo "[$app] ✓ Completed"
|
||||
@@ -294,7 +316,7 @@ echo "All deployments complete!"
|
||||
```yaml
|
||||
---
|
||||
# playbook-proxmox.yml
|
||||
- name: Deploy ProxmoxVED Containers
|
||||
- name: Deploy ProxmoxVE Containers
|
||||
hosts: proxmox_hosts
|
||||
become: yes
|
||||
tasks:
|
||||
@@ -308,7 +330,7 @@ echo "All deployments complete!"
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
var_tags=ansible,automated \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
|
||||
args:
|
||||
executable: /bin/bash
|
||||
register: deploy_result
|
||||
@@ -365,7 +387,7 @@ echo "All deployments complete!"
|
||||
var_ssh=yes \
|
||||
var_ssh_authorized_key="{{ ssh_key }}" \
|
||||
var_tags="{{ item.tags }},ansible" \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/{{ item.name }}.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/{{ item.name }}.sh)"
|
||||
args:
|
||||
executable: /bin/bash
|
||||
loop: "{{ containers }}"
|
||||
@@ -417,7 +439,7 @@ resource "null_resource" "deploy_container" {
|
||||
"var_disk=${each.value.disk}",
|
||||
"var_hostname=${each.key}",
|
||||
"var_net=dhcp",
|
||||
"bash -c \"$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${each.value.template}.sh)\""
|
||||
"bash -c \"$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${each.value.template}.sh)\""
|
||||
]
|
||||
|
||||
connection {
|
||||
@@ -498,7 +520,7 @@ jobs:
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
var_tags=ci-cd,automated \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${{ github.event.inputs.container_type }}.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${{ github.event.inputs.container_type }}.sh)"
|
||||
|
||||
- name: Notify deployment status
|
||||
if: success()
|
||||
@@ -532,7 +554,7 @@ deploy_container:
|
||||
var_hostname=gitlab-ci-container \
|
||||
var_net=dhcp \
|
||||
var_tags=gitlab-ci,automated \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
|
||||
EOF
|
||||
only:
|
||||
- main
|
||||
@@ -564,7 +586,7 @@ deploy_container() {
|
||||
var_hostname="$HOSTNAME" \
|
||||
var_net=dhcp \
|
||||
var_ssh=yes \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${APP}.sh)" 2>&1 | tee deploy.log
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${APP}.sh)" 2>&1 | tee deploy.log
|
||||
|
||||
return ${PIPESTATUS[0]}
|
||||
}
|
||||
@@ -656,7 +678,7 @@ deploy() {
|
||||
var_hostname="$HOSTNAME" \
|
||||
var_cpu=4 \
|
||||
var_ram=4096 \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${APP}.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${APP}.sh)"
|
||||
return $?
|
||||
}
|
||||
|
||||
@@ -759,7 +781,7 @@ deploy_secure() {
|
||||
var_protection=yes \
|
||||
var_tags=production,secure,automated \
|
||||
var_verbose=no \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${APP}.sh)" 2>&1 | tee -a "$LOG_FILE"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${APP}.sh)" 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
||||
log "✓ Deployment successful"
|
||||
@@ -824,7 +846,7 @@ SSH_KEYS=$(load_ssh_keys)
|
||||
var_ssh=yes \
|
||||
var_ssh_authorized_key="$SSH_KEYS" \
|
||||
var_hostname=multi-key-server \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/debian.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
|
||||
```
|
||||
|
||||
---
|
||||
@@ -903,7 +925,7 @@ deploy_from_config() {
|
||||
var_ssh=yes \
|
||||
var_tags="$tags,automated" \
|
||||
var_protection=yes \
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/ct/${app}.sh)"
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log_success "Deployed: $name"
|
||||
|
||||
@@ -56,7 +56,7 @@ get_error_description 255 # "Unknown critical error, often due to missing perm
|
||||
- `DIAGNOSTICS` must be set to "yes"
|
||||
- `RANDOM_UUID` must be set and not empty
|
||||
|
||||
**API Endpoint**: `http://api.community-scripts.org/dev/upload`
|
||||
**API Endpoint**: `https://api.community-scripts.org/dev/upload`
|
||||
|
||||
**JSON Payload Structure**:
|
||||
```json
|
||||
@@ -110,7 +110,7 @@ post_to_api
|
||||
- `curl` command must be available
|
||||
- `RANDOM_UUID` must be set and not empty
|
||||
|
||||
**API Endpoint**: `http://api.community-scripts.org/dev/upload`
|
||||
**API Endpoint**: `https://api.community-scripts.org/dev/upload`
|
||||
|
||||
**JSON Payload Structure**:
|
||||
```json
|
||||
@@ -167,7 +167,7 @@ post_to_api_vm
|
||||
- `RANDOM_UUID` must be set and not empty
|
||||
- POST_UPDATE_DONE must be false (prevents duplicates)
|
||||
|
||||
**API Endpoint**: `http://api.community-scripts.org/dev/upload/updatestatus`
|
||||
**API Endpoint**: `https://api.community-scripts.org/dev/upload/updatestatus`
|
||||
|
||||
**JSON Payload Structure**:
|
||||
```json
|
||||
|
||||
@@ -461,7 +461,7 @@ check_api_health() {
|
||||
echo "Error description test: $test_error"
|
||||
|
||||
# Test API connectivity (without sending data)
|
||||
local api_url="http://api.community-scripts.org/dev/upload"
|
||||
local api_url="https://api.community-scripts.org/dev/upload"
|
||||
if curl -s --head "$api_url" >/dev/null 2>&1; then
|
||||
echo "API endpoint is reachable"
|
||||
else
|
||||
|
||||
@@ -438,6 +438,34 @@ default_var_settings() # Save global defaults
|
||||
maybe_offer_save_app_defaults() # Save app defaults
|
||||
```
|
||||
|
||||
### Container Resource & ID Management
|
||||
|
||||
#### `validate_container_id()`
|
||||
**Purpose**: Validates if a container ID is available for use.
|
||||
**Parameters**: `ctid` (Integer)
|
||||
**Returns**: `0` if available, `1` if already in use or invalid.
|
||||
**Description**: Checks for existing config files in `/etc/pve/lxc/` or `/etc/pve/qemu-server/`, and verifies LVM logical volumes.
|
||||
|
||||
#### `get_valid_container_id()`
|
||||
**Purpose**: Returns the next available, unused container ID.
|
||||
**Parameters**: `suggested_id` (Optional)
|
||||
**Returns**: A valid container ID string.
|
||||
**Description**: If the suggested ID is taken, it increments until it finds an available one.
|
||||
|
||||
#### `maxkeys_check()`
|
||||
**Purpose**: Ensures host kernel parameters support high numbers of keys (required for some apps).
|
||||
**Parameters**: None
|
||||
**Description**: Checks and optionally updates `kernel.keys.maxkeys` and `kernel.keys.maxbytes`.
|
||||
|
||||
#### `get_current_ip()`
|
||||
**Purpose**: Retrieves the current IP address of the container.
|
||||
**Parameters**: `ctid` (Integer)
|
||||
**Returns**: IP address string.
|
||||
|
||||
#### `update_motd_ip()`
|
||||
**Purpose**: Updates the Message of the Day (MOTD) file with the container's IP.
|
||||
**Parameters**: None
|
||||
|
||||
## Function Error Handling
|
||||
|
||||
### Validation Functions
|
||||
|
||||
@@ -60,10 +60,10 @@ export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.101"
|
||||
export var_vlan="100"
|
||||
export var_mtu="9000"
|
||||
export var_template_storage="nfs-storage"
|
||||
export var_template_storage="ssd-storage"
|
||||
export var_container_storage="ssd-storage"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
export var_fuse="yes"
|
||||
export var_tun="yes"
|
||||
export SSH="true"
|
||||
|
||||
# Execute build.func
|
||||
|
||||
@@ -20,14 +20,19 @@ Complete alphabetical reference of all functions in tools.func with parameters,
|
||||
- `setup_nodejs(VERSION)` - Install Node.js and npm
|
||||
- `setup_php(VERSION)` - Install PHP-FPM and CLI
|
||||
- `setup_python(VERSION)` - Install Python 3 with pip
|
||||
- `setup_uv()` - Install Python uv (modern & fast)
|
||||
- `setup_ruby(VERSION)` - Install Ruby with gem
|
||||
- `setup_golang(VERSION)` - Install Go programming language
|
||||
- `setup_java(VERSION)` - Install OpenJDK (Adoptium)
|
||||
|
||||
**Databases**:
|
||||
- `setup_mariadb()` - Install MariaDB server (distro packages by default)
|
||||
- `setup_mariadb()` - Install MariaDB server
|
||||
- `setup_mariadb_db()` - Create user/db in MariaDB
|
||||
- `setup_postgresql(VERSION)` - Install PostgreSQL
|
||||
- `setup_postgresql_db()` - Create user/db in PostgreSQL
|
||||
- `setup_mongodb(VERSION)` - Install MongoDB
|
||||
- `setup_redis(VERSION)` - Install Redis cache
|
||||
- `setup_meilisearch()` - Install Meilisearch engine
|
||||
|
||||
**Web Servers**:
|
||||
- `setup_nginx()` - Install Nginx
|
||||
@@ -44,6 +49,7 @@ Complete alphabetical reference of all functions in tools.func with parameters,
|
||||
- `setup_docker_compose()` - Install Docker Compose
|
||||
- `setup_composer()` - Install PHP Composer
|
||||
- `setup_build_tools()` - Install build-essential
|
||||
- `setup_yq()` - Install mikefarah/yq processor
|
||||
|
||||
**Monitoring**:
|
||||
- `setup_grafana()` - Install Grafana
|
||||
@@ -60,13 +66,13 @@ Complete alphabetical reference of all functions in tools.func with parameters,
|
||||
|
||||
## Core Functions
|
||||
|
||||
### pkg_install()
|
||||
### install_packages_with_retry()
|
||||
|
||||
Install one or more packages safely with automatic retry logic and error handling.
|
||||
Install one or more packages safely with automatic retry logic (3 attempts), APT refresh, and lock handling.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
pkg_install PACKAGE1 [PACKAGE2 ...]
|
||||
install_packages_with_retry PACKAGE1 [PACKAGE2 ...]
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
@@ -74,66 +80,122 @@ pkg_install PACKAGE1 [PACKAGE2 ...]
|
||||
|
||||
**Returns**:
|
||||
- `0` - All packages installed successfully
|
||||
- `1` - Installation failed after retries
|
||||
- `1` - Installation failed after all retries
|
||||
|
||||
**Features**:
|
||||
- Automatically sets `DEBIAN_FRONTEND=noninteractive`
|
||||
- Handles DPKG lock errors with `dpkg --configure -a`
|
||||
- Retries on transient network or APT failures
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
install_packages_with_retry curl wget git
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### upgrade_packages_with_retry()
|
||||
|
||||
Upgrades installed packages with the same robust retry logic as the installation helper.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
upgrade_packages_with_retry
|
||||
```
|
||||
|
||||
**Returns**:
|
||||
- `0` - Upgrade successful
|
||||
- `1` - Upgrade failed
|
||||
|
||||
---
|
||||
|
||||
### fetch_and_deploy_gh_release()
|
||||
|
||||
The primary tool for downloading and installing software from GitHub Releases. Supports binaries, tarballs, and Debian packages.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
fetch_and_deploy_gh_release APPREPO TYPE [VERSION] [DEST] [ASSET_PATTERN]
|
||||
```
|
||||
|
||||
**Environment Variables**:
|
||||
- `$STD` - Output suppression (`silent` or empty)
|
||||
- `APPREPO`: GitHub repository (e.g., `owner/repo`)
|
||||
- `TYPE`: Asset type (`binary`, `tarball`, `prebuild`, `singlefile`)
|
||||
- `VERSION`: Specific tag or `latest` (Default: `latest`)
|
||||
- `DEST`: Target directory (Default: `/opt/$APP`)
|
||||
- `ASSET_PATTERN`: Regex or string pattern to match the release asset (Required for `prebuild` and `singlefile`)
|
||||
|
||||
**Supported Operation Modes**:
|
||||
- `tarball`: Downloads and extracts the source tarball.
|
||||
- `binary`: Detects host architecture and installs a `.deb` package using `apt` or `dpkg`.
|
||||
- `prebuild`: Downloads and extracts a pre-built binary archive (supports `.tar.gz`, `.zip`, `.tgz`, `.txz`).
|
||||
- `singlefile`: Downloads a single binary file to the destination.
|
||||
|
||||
**Environment Variables**:
|
||||
- `CLEAN_INSTALL=1`: Removes all contents of the destination directory before extraction.
|
||||
- `DPKG_FORCE_CONFOLD=1`: Forces `dpkg` to keep old config files during package updates.
|
||||
- `SYSTEMD_OFFLINE=1`: Used automatically for `.deb` installs to prevent systemd-tmpfiles failures in unprivileged containers.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
pkg_install curl wget git
|
||||
fetch_and_deploy_gh_release "muesli/duf" "binary" "latest" "/opt/duf" "duf_.*_linux_amd64.tar.gz"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### pkg_update()
|
||||
### check_for_gh_release()
|
||||
|
||||
Update package lists with automatic retry logic for network failures.
|
||||
Checks if a newer version is available on GitHub compared to the installed version.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
pkg_update
|
||||
check_for_gh_release APP REPO
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
- `0` - Package lists updated
|
||||
- `1` - Failed after 3 retries
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
pkg_update
|
||||
if check_for_gh_release "nodejs" "nodesource/distributions"; then
|
||||
# update logic
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### pkg_remove()
|
||||
### prepare_repository_setup()
|
||||
|
||||
Remove packages completely including dependencies.
|
||||
Performs safe repository preparation by cleaning up old files, keyrings, and ensuring the APT system is in a working state.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
pkg_remove PACKAGE1 [PACKAGE2 ...]
|
||||
prepare_repository_setup REPO_NAME [REPO_NAME2 ...]
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `PACKAGE1, PACKAGE2, ...` - Package names to remove
|
||||
|
||||
**Returns**:
|
||||
- `0` - Packages removed
|
||||
- `1` - Removal failed
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
pkg_remove old-package outdated-tool
|
||||
prepare_repository_setup "mariadb" "mysql"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### verify_tool_version()
|
||||
|
||||
Validates if the installed major version matches the expected version.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
verify_tool_version NAME EXPECTED INSTALLED
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
verify_tool_version "nodejs" "22" "$(node -v | grep -oP '^v\K[0-9]+')"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_deb822_repo()
|
||||
|
||||
Add repository in modern deb822 format (recommended over legacy format).
|
||||
Add repository in modern deb822 format.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
@@ -188,12 +250,234 @@ cleanup_repo_metadata
|
||||
|
||||
## Tool Installation Functions
|
||||
|
||||
### setup_nodejs(VERSION)
|
||||
### setup_nodejs()
|
||||
|
||||
Install Node.js and npm from official repositories.
|
||||
Install Node.js and npm from official repositories. Handles legacy version cleanup (nvm) automatically.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_nodejs
|
||||
```
|
||||
|
||||
**Environment Variables**:
|
||||
- `NODE_VERSION`: Major version to install (e.g. "20", "22", "24"). Default: "24".
|
||||
- `NODE_MODULE`: Optional npm package to install globally during setup (e.g. "pnpm", "yarn").
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_php()
|
||||
|
||||
Install PHP with configurable extensions and FPM/Apache integration.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_php
|
||||
```
|
||||
|
||||
**Environment Variables**:
|
||||
- `PHP_VERSION`: Version to install (e.g. "8.3", "8.4"). Default: "8.4".
|
||||
- `PHP_MODULE`: Comma-separated list of additional extensions.
|
||||
- `PHP_FPM`: Set to "YES" to install php-fpm.
|
||||
- `PHP_APACHE`: Set to "YES" to install libapache2-mod-php.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULE="mysql,xml,zip" setup_php
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_mariadb_db()
|
||||
|
||||
Creates a new MariaDB database and a dedicated user with all privileges. Automatically generates a password if not provided and saves it to a credentials file.
|
||||
|
||||
**Environment Variables**:
|
||||
- `MARIADB_DB_NAME`: Name of the database (required)
|
||||
- `MARIADB_DB_USER`: Name of the database user (required)
|
||||
- `MARIADB_DB_PASS`: User password (optional, auto-generated if omitted)
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
MARIADB_DB_NAME="myapp" MARIADB_DB_USER="myapp_user" setup_mariadb_db
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_postgresql_db()
|
||||
|
||||
Creates a new PostgreSQL database and a dedicated user/role with all privileges. Automatically generates a password if not provided and saves it to a credentials file.
|
||||
|
||||
**Environment Variables**:
|
||||
- `PG_DB_NAME`: Name of the database (required)
|
||||
- `PG_DB_USER`: Name of the database user (required)
|
||||
- `PG_DB_PASS`: User password (optional, auto-generated if omitted)
|
||||
|
||||
---
|
||||
|
||||
### setup_java()
|
||||
|
||||
Installs Temurin JDK.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
JAVA_VERSION="21" setup_java
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `JAVA_VERSION` - JDK version (e.g., "17", "21") (default: "21")
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
JAVA_VERSION="17" setup_java
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_uv()
|
||||
|
||||
Installs `uv` (modern Python package manager).
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `PYTHON_VERSION` - Optional Python version to pre-install via uv (e.g., "3.12", "3.13")
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_go()
|
||||
|
||||
Installs Go programming language.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
GO_VERSION="1.23" setup_go
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `GO_VERSION` - Go version to install (default: "1.23")
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
GO_VERSION="1.24" setup_go
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_yq()
|
||||
|
||||
Installs `yq` (YAML processor).
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_yq
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_yq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_composer()
|
||||
|
||||
Installs PHP Composer.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_composer
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_composer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_meilisearch()
|
||||
|
||||
Install and configure Meilisearch search engine.
|
||||
|
||||
**Environment Variables**:
|
||||
- `MEILISEARCH_BIND`: Address and port to bind to (Default: "127.0.0.1:7700")
|
||||
- `MEILISEARCH_ENV`: Environment mode (Default: "production")
|
||||
|
||||
---
|
||||
|
||||
### setup_yq()
|
||||
|
||||
Install the `mikefarah/yq` YAML processor. Removes existing non-compliant versions.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_yq
|
||||
yq eval '.app.version = "1.0.0"' -i config.yaml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_composer()
|
||||
|
||||
Install or update the PHP Composer package manager. Handles `COMPOSER_ALLOW_SUPERUSER` automatically and performs self-updates if already installed.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_php
|
||||
setup_composer
|
||||
$STD composer install --no-dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_build_tools()
|
||||
|
||||
Install the `build-essential` package suite for compiling software.
|
||||
|
||||
---
|
||||
|
||||
### setup_uv()
|
||||
|
||||
Install the modern Python package manager `uv`. Extremely fast replacement for pip/venv.
|
||||
|
||||
**Environment Variables**:
|
||||
- `PYTHON_VERSION`: Major.Minor version to ensure is installed.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
uv sync --locked
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_java()
|
||||
|
||||
Install OpenJDK via the Adoptium repository.
|
||||
|
||||
**Environment Variables**:
|
||||
- `JAVA_VERSION`: Major version to install (e.g. "17", "21"). Default: "21".
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
JAVA_VERSION="21" setup_java
|
||||
```
|
||||
|
||||
---
|
||||
```bash
|
||||
setup_nodejs VERSION
|
||||
```
|
||||
|
||||
|
||||
@@ -40,14 +40,15 @@ vm/OsName-vm.sh (host-side)
|
||||
|
||||
See `/vm` directory for all VM creation scripts. Examples:
|
||||
|
||||
- `ubuntu2404-vm.sh` - Ubuntu 24.04 VM
|
||||
- `ubuntu2204-vm.sh` - Ubuntu 22.04 VM
|
||||
- `debian-vm.sh` - Debian VM
|
||||
- `debian-13-vm.sh` - Debian 13 VM
|
||||
- `opnsense-vm.sh` - OPNsense firewall
|
||||
- `ubuntu2504-vm.sh` - Ubuntu 25.04 VM (Latest)
|
||||
- `ubuntu2404-vm.sh` - Ubuntu 24.04 VM (LTS)
|
||||
- `debian-13-vm.sh` - Debian 13 VM (Trixie)
|
||||
- `archlinux-vm.sh` - Arch Linux VM
|
||||
- `haos-vm.sh` - Home Assistant OS
|
||||
- `unifi-os-vm.sh` - Unifi Dream Machine
|
||||
- `k3s-vm.sh` - Kubernetes lightweight
|
||||
- `mikrotik-routeros.sh` - MikroTik RouterOS
|
||||
- `openwrt-vm.sh` - OpenWrt VM
|
||||
- `opnsense-vm.sh` - OPNsense firewall
|
||||
- `umbrel-os-vm.sh` - Umbrel OS VM
|
||||
- And 10+ more...
|
||||
|
||||
## VM vs Container
|
||||
|
||||
84
frontend/bun.lock
generated
84
frontend/bun.lock
generated
@@ -20,6 +20,7 @@
|
||||
"@radix-ui/react-tabs": "^1.1.13",
|
||||
"@radix-ui/react-tooltip": "^1.2.8",
|
||||
"@tanstack/react-query": "^5.90.12",
|
||||
"@types/react-syntax-highlighter": "^15.5.13",
|
||||
"chart.js": "^4.5.1",
|
||||
"chartjs-plugin-datalabels": "^2.2.0",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
@@ -41,6 +42,7 @@
|
||||
"react-day-picker": "^9.12.0",
|
||||
"react-dom": "19.2.3",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-syntax-highlighter": "^16.1.0",
|
||||
"react-use-measure": "^2.1.7",
|
||||
"recharts": "3.6.0",
|
||||
"sharp": "^0.34.5",
|
||||
@@ -552,7 +554,7 @@
|
||||
|
||||
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
|
||||
|
||||
"@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
|
||||
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
||||
|
||||
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
|
||||
|
||||
@@ -564,10 +566,14 @@
|
||||
|
||||
"@types/node": ["@types/node@25.0.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="],
|
||||
|
||||
"@types/prismjs": ["@types/prismjs@1.26.5", "", {}, "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ=="],
|
||||
|
||||
"@types/react": ["types-react@19.0.0-rc.1", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ=="],
|
||||
|
||||
"@types/react-dom": ["types-react-dom@19.0.0-rc.1", "", { "dependencies": { "@types/react": "*" } }, "sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ=="],
|
||||
|
||||
"@types/react-syntax-highlighter": ["@types/react-syntax-highlighter@15.5.13", "", { "dependencies": { "@types/react": "*" } }, "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA=="],
|
||||
|
||||
"@types/stylis": ["@types/stylis@4.2.5", "", {}, "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="],
|
||||
|
||||
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
||||
@@ -742,9 +748,9 @@
|
||||
|
||||
"character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
|
||||
|
||||
"character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="],
|
||||
"character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
|
||||
|
||||
"character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="],
|
||||
"character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
|
||||
|
||||
"chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="],
|
||||
|
||||
@@ -768,7 +774,7 @@
|
||||
|
||||
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||
|
||||
"comma-separated-tokens": ["comma-separated-tokens@1.0.8", "", {}, "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="],
|
||||
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
|
||||
|
||||
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
|
||||
|
||||
@@ -1012,7 +1018,7 @@
|
||||
|
||||
"fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
|
||||
|
||||
"fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="],
|
||||
"fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="],
|
||||
|
||||
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||
|
||||
@@ -1088,9 +1094,9 @@
|
||||
|
||||
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||
|
||||
"hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="],
|
||||
"hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
|
||||
|
||||
"hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="],
|
||||
"hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
|
||||
|
||||
"hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="],
|
||||
|
||||
@@ -1124,9 +1130,9 @@
|
||||
|
||||
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
|
||||
|
||||
"is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="],
|
||||
"is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
|
||||
|
||||
"is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="],
|
||||
"is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
|
||||
|
||||
"is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
|
||||
|
||||
@@ -1150,7 +1156,7 @@
|
||||
|
||||
"is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
|
||||
|
||||
"is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="],
|
||||
"is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
@@ -1160,7 +1166,7 @@
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-hexadecimal": ["is-hexadecimal@1.0.4", "", {}, "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="],
|
||||
"is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
|
||||
|
||||
"is-immutable-type": ["is-immutable-type@5.0.1", "", { "dependencies": { "@typescript-eslint/type-utils": "^8.0.0", "ts-api-utils": "^2.0.0", "ts-declaration-location": "^1.0.4" }, "peerDependencies": { "eslint": "*", "typescript": ">=4.7.4" } }, "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg=="],
|
||||
|
||||
@@ -1416,7 +1422,7 @@
|
||||
|
||||
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
|
||||
|
||||
"parse-entities": ["parse-entities@2.0.0", "", { "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="],
|
||||
"parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
|
||||
|
||||
"parse-gitignore": ["parse-gitignore@2.0.0", "", {}, "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog=="],
|
||||
|
||||
@@ -1474,7 +1480,7 @@
|
||||
|
||||
"prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
|
||||
|
||||
"property-information": ["property-information@5.6.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="],
|
||||
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
|
||||
|
||||
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
|
||||
|
||||
@@ -1508,7 +1514,7 @@
|
||||
|
||||
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
||||
|
||||
"react-syntax-highlighter": ["react-syntax-highlighter@15.6.6", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw=="],
|
||||
"react-syntax-highlighter": ["react-syntax-highlighter@16.1.0", "", { "dependencies": { "@babel/runtime": "^7.28.4", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^5.0.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg=="],
|
||||
|
||||
"react-use-measure": ["react-use-measure@2.1.7", "", { "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" }, "optionalPeers": ["react-dom"] }, "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg=="],
|
||||
|
||||
@@ -1526,7 +1532,7 @@
|
||||
|
||||
"reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
|
||||
|
||||
"refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="],
|
||||
"refractor": ["refractor@5.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/prismjs": "^1.0.0", "hastscript": "^9.0.0", "parse-entities": "^4.0.0" } }, "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw=="],
|
||||
|
||||
"regexp-ast-analysis": ["regexp-ast-analysis@0.7.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.1" } }, "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A=="],
|
||||
|
||||
@@ -1598,7 +1604,7 @@
|
||||
|
||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||
|
||||
"space-separated-tokens": ["space-separated-tokens@1.1.5", "", {}, "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="],
|
||||
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
|
||||
|
||||
"spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
|
||||
|
||||
@@ -1836,8 +1842,6 @@
|
||||
|
||||
"@reduxjs/toolkit/immer": ["immer@11.0.1", "", {}, "sha512-naDCyggtcBWANtIrjQEajhhBEuL9b0Zg4zmlWK2CzS6xCWSE39/vvf4LqnMjUAWHBhot4m9MHCM/Z+mfWhUkiA=="],
|
||||
|
||||
"@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.50.0", "", { "dependencies": { "@typescript-eslint/types": "8.50.0", "@typescript-eslint/visitor-keys": "8.50.0" } }, "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.50.0", "", { "dependencies": { "@typescript-eslint/types": "8.50.0", "@typescript-eslint/typescript-estree": "8.50.0", "@typescript-eslint/utils": "8.50.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw=="],
|
||||
@@ -1912,25 +1916,25 @@
|
||||
|
||||
"jsonc-eslint-parser/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
|
||||
|
||||
"lowlight/fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="],
|
||||
|
||||
"mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
|
||||
|
||||
"mdast-util-frontmatter/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
|
||||
|
||||
"micromark-extension-frontmatter/fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="],
|
||||
|
||||
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
|
||||
|
||||
"next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
|
||||
|
||||
"parse-entities/character-entities": ["character-entities@1.2.4", "", {}, "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="],
|
||||
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
|
||||
|
||||
"prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
|
||||
|
||||
"readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
"react-code-blocks/react-syntax-highlighter": ["react-syntax-highlighter@15.6.6", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw=="],
|
||||
|
||||
"refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="],
|
||||
"readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"styled-components/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
||||
|
||||
@@ -1984,10 +1988,44 @@
|
||||
|
||||
"mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="],
|
||||
|
||||
"tailwindcss/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||
|
||||
"@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities": ["parse-entities@2.0.0", "", { "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript/comma-separated-tokens": ["comma-separated-tokens@1.0.8", "", {}, "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript/hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript/property-information": ["property-information@5.6.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript/space-separated-tokens": ["space-separated-tokens@1.1.5", "", {}, "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/character-entities": ["character-entities@1.2.4", "", {}, "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/is-hexadecimal": ["is-hexadecimal@1.0.4", "", {}, "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/hastscript/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
|
||||
|
||||
"react-code-blocks/react-syntax-highlighter/refractor/parse-entities/is-alphanumerical/is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="],
|
||||
}
|
||||
}
|
||||
|
||||
2
frontend/package.json
generated
2
frontend/package.json
generated
@@ -31,6 +31,7 @@
|
||||
"@radix-ui/react-tabs": "^1.1.13",
|
||||
"@radix-ui/react-tooltip": "^1.2.8",
|
||||
"@tanstack/react-query": "^5.90.12",
|
||||
"@types/react-syntax-highlighter": "^15.5.13",
|
||||
"chart.js": "^4.5.1",
|
||||
"chartjs-plugin-datalabels": "^2.2.0",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
@@ -52,6 +53,7 @@
|
||||
"react-day-picker": "^9.12.0",
|
||||
"react-dom": "19.2.3",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-syntax-highlighter": "^16.1.0",
|
||||
"react-use-measure": "^2.1.7",
|
||||
"recharts": "3.6.0",
|
||||
"sharp": "^0.34.5",
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8083,
|
||||
"documentation": "https://github.com/gelbphoenix/autocaliweb/wiki",
|
||||
"documentation": "https://codeberg.org/gelbphoenix/autocaliweb/wiki",
|
||||
"config_path": "/etc/autocaliweb",
|
||||
"website": "https://github.com/gelbphoenix/autocaliweb",
|
||||
"website": "https://codeberg.org/gelbphoenix/autocaliweb",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/autocaliweb.webp",
|
||||
"description": "A modern web management system for eBooks, eComics and PDFs",
|
||||
"install_methods": [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-02-01T00:23:35Z",
|
||||
"generated": "2026-02-05T18:19:13Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -95,30 +95,30 @@
|
||||
{
|
||||
"slug": "bar-assistant",
|
||||
"repo": "karlomikus/bar-assistant",
|
||||
"version": "v5.12.0",
|
||||
"version": "v5.13.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-11T09:37:23Z"
|
||||
"date": "2026-02-02T18:47:43Z"
|
||||
},
|
||||
{
|
||||
"slug": "bazarr",
|
||||
"repo": "morpheus65535/bazarr",
|
||||
"version": "v1.5.4",
|
||||
"version": "v1.5.5",
|
||||
"pinned": false,
|
||||
"date": "2026-01-04T22:41:00Z"
|
||||
"date": "2026-02-01T18:00:34Z"
|
||||
},
|
||||
{
|
||||
"slug": "bentopdf",
|
||||
"repo": "alam00000/bentopdf",
|
||||
"version": "v2.0.0",
|
||||
"version": "v2.1.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T10:13:47Z"
|
||||
"date": "2026-02-02T14:30:55Z"
|
||||
},
|
||||
{
|
||||
"slug": "beszel",
|
||||
"repo": "henrygd/beszel",
|
||||
"version": "v0.18.2",
|
||||
"version": "v0.18.3",
|
||||
"pinned": false,
|
||||
"date": "2026-01-12T23:58:00Z"
|
||||
"date": "2026-02-01T19:02:42Z"
|
||||
},
|
||||
{
|
||||
"slug": "bitmagnet",
|
||||
@@ -158,9 +158,9 @@
|
||||
{
|
||||
"slug": "bytestash",
|
||||
"repo": "jordan-dalby/ByteStash",
|
||||
"version": "v1.5.10",
|
||||
"version": "v1.5.11",
|
||||
"pinned": false,
|
||||
"date": "2026-01-26T14:07:59Z"
|
||||
"date": "2026-02-03T22:12:19Z"
|
||||
},
|
||||
{
|
||||
"slug": "caddy",
|
||||
@@ -179,16 +179,16 @@
|
||||
{
|
||||
"slug": "cloudreve",
|
||||
"repo": "cloudreve/cloudreve",
|
||||
"version": "4.12.1",
|
||||
"version": "4.13.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-28T07:29:16Z"
|
||||
"date": "2026-02-05T12:53:24Z"
|
||||
},
|
||||
{
|
||||
"slug": "comfyui",
|
||||
"repo": "comfyanonymous/ComfyUI",
|
||||
"version": "v0.11.1",
|
||||
"version": "v0.12.3",
|
||||
"pinned": false,
|
||||
"date": "2026-01-29T07:52:21Z"
|
||||
"date": "2026-02-05T07:04:07Z"
|
||||
},
|
||||
{
|
||||
"slug": "commafeed",
|
||||
@@ -221,9 +221,9 @@
|
||||
{
|
||||
"slug": "cronicle",
|
||||
"repo": "jhuckaby/Cronicle",
|
||||
"version": "v0.9.102",
|
||||
"version": "v0.9.105",
|
||||
"pinned": false,
|
||||
"date": "2025-12-19T03:45:13Z"
|
||||
"date": "2026-02-05T18:16:11Z"
|
||||
},
|
||||
{
|
||||
"slug": "cryptpad",
|
||||
@@ -235,16 +235,16 @@
|
||||
{
|
||||
"slug": "dawarich",
|
||||
"repo": "Freika/dawarich",
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.4",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T23:15:38Z"
|
||||
"date": "2026-02-01T11:37:27Z"
|
||||
},
|
||||
{
|
||||
"slug": "discopanel",
|
||||
"repo": "nickheyer/discopanel",
|
||||
"version": "v1.0.32",
|
||||
"version": "v1.0.35",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T22:24:53Z"
|
||||
"date": "2026-02-02T05:20:12Z"
|
||||
},
|
||||
{
|
||||
"slug": "dispatcharr",
|
||||
@@ -256,9 +256,9 @@
|
||||
{
|
||||
"slug": "docmost",
|
||||
"repo": "docmost/docmost",
|
||||
"version": "v0.24.1",
|
||||
"version": "v0.25.1",
|
||||
"pinned": false,
|
||||
"date": "2025-12-14T13:49:16Z"
|
||||
"date": "2026-02-04T15:19:51Z"
|
||||
},
|
||||
{
|
||||
"slug": "domain-locker",
|
||||
@@ -291,9 +291,9 @@
|
||||
{
|
||||
"slug": "elementsynapse",
|
||||
"repo": "etkecc/synapse-admin",
|
||||
"version": "v0.11.1-etke52",
|
||||
"version": "v0.11.1-etke53",
|
||||
"pinned": false,
|
||||
"date": "2026-01-09T08:41:29Z"
|
||||
"date": "2026-02-03T20:38:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "emby",
|
||||
@@ -312,9 +312,9 @@
|
||||
{
|
||||
"slug": "ersatztv",
|
||||
"repo": "ErsatzTV/ErsatzTV",
|
||||
"version": "v26.1.1",
|
||||
"version": "v26.2.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-08T22:02:15Z"
|
||||
"date": "2026-02-02T20:54:26Z"
|
||||
},
|
||||
{
|
||||
"slug": "excalidraw",
|
||||
@@ -375,9 +375,9 @@
|
||||
{
|
||||
"slug": "ghostfolio",
|
||||
"repo": "ghostfolio/ghostfolio",
|
||||
"version": "2.234.0",
|
||||
"version": "2.235.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T19:00:22Z"
|
||||
"date": "2026-02-03T19:27:17Z"
|
||||
},
|
||||
{
|
||||
"slug": "gitea",
|
||||
@@ -445,9 +445,9 @@
|
||||
{
|
||||
"slug": "headscale",
|
||||
"repo": "juanfont/headscale",
|
||||
"version": "v0.27.1",
|
||||
"version": "v0.28.0",
|
||||
"pinned": false,
|
||||
"date": "2025-11-11T19:32:29Z"
|
||||
"date": "2026-02-04T20:40:23Z"
|
||||
},
|
||||
{
|
||||
"slug": "healthchecks",
|
||||
@@ -487,16 +487,16 @@
|
||||
{
|
||||
"slug": "homebox",
|
||||
"repo": "sysadminsmedia/homebox",
|
||||
"version": "v0.23.0",
|
||||
"version": "v0.23.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T17:41:01Z"
|
||||
"date": "2026-02-01T22:53:32Z"
|
||||
},
|
||||
{
|
||||
"slug": "homepage",
|
||||
"repo": "gethomepage/homepage",
|
||||
"version": "v1.9.0",
|
||||
"version": "v1.10.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-19T05:46:09Z"
|
||||
"date": "2026-02-05T15:03:45Z"
|
||||
},
|
||||
{
|
||||
"slug": "homer",
|
||||
@@ -515,16 +515,9 @@
|
||||
{
|
||||
"slug": "huntarr",
|
||||
"repo": "plexguide/Huntarr.io",
|
||||
"version": "9.1.5",
|
||||
"version": "9.2.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T22:55:29Z"
|
||||
},
|
||||
{
|
||||
"slug": "immich",
|
||||
"repo": "immich-app/immich",
|
||||
"version": "v2.5.2",
|
||||
"pinned": true,
|
||||
"date": "2026-01-29T15:24:34Z"
|
||||
"date": "2026-02-05T16:39:35Z"
|
||||
},
|
||||
{
|
||||
"slug": "inspircd",
|
||||
@@ -543,16 +536,16 @@
|
||||
{
|
||||
"slug": "invoiceninja",
|
||||
"repo": "invoiceninja/invoiceninja",
|
||||
"version": "v5.12.51",
|
||||
"version": "v5.12.55",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T03:58:30Z"
|
||||
"date": "2026-02-05T01:06:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.993",
|
||||
"version": "v0.24.1032",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T05:55:28Z"
|
||||
"date": "2026-02-05T05:55:27Z"
|
||||
},
|
||||
{
|
||||
"slug": "joplin-server",
|
||||
@@ -603,6 +596,13 @@
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T18:10:59Z"
|
||||
},
|
||||
{
|
||||
"slug": "kitchenowl",
|
||||
"repo": "TomBursch/kitchenowl",
|
||||
"version": "v0.7.6",
|
||||
"pinned": false,
|
||||
"date": "2026-01-24T01:21:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "koel",
|
||||
"repo": "koel/koel",
|
||||
@@ -669,9 +669,9 @@
|
||||
{
|
||||
"slug": "libretranslate",
|
||||
"repo": "LibreTranslate/LibreTranslate",
|
||||
"version": "v1.8.3",
|
||||
"version": "v1.8.4",
|
||||
"pinned": false,
|
||||
"date": "2025-12-04T21:07:00Z"
|
||||
"date": "2026-02-02T17:45:16Z"
|
||||
},
|
||||
{
|
||||
"slug": "lidarr",
|
||||
@@ -746,9 +746,9 @@
|
||||
{
|
||||
"slug": "mealie",
|
||||
"repo": "mealie-recipes/mealie",
|
||||
"version": "v3.9.2",
|
||||
"version": "v3.10.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-02T19:40:09Z"
|
||||
"date": "2026-02-04T23:32:32Z"
|
||||
},
|
||||
{
|
||||
"slug": "mediamanager",
|
||||
@@ -767,9 +767,9 @@
|
||||
{
|
||||
"slug": "meilisearch",
|
||||
"repo": "riccox/meilisearch-ui",
|
||||
"version": "v0.15.0",
|
||||
"version": "v0.15.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-29T03:54:27Z"
|
||||
"date": "2026-02-04T03:56:59Z"
|
||||
},
|
||||
{
|
||||
"slug": "memos",
|
||||
@@ -781,9 +781,9 @@
|
||||
{
|
||||
"slug": "metube",
|
||||
"repo": "alexta69/metube",
|
||||
"version": "2026.02.01",
|
||||
"version": "2026.02.04",
|
||||
"pinned": false,
|
||||
"date": "2026-02-01T00:20:00Z"
|
||||
"date": "2026-02-04T20:01:18Z"
|
||||
},
|
||||
{
|
||||
"slug": "miniflux",
|
||||
@@ -823,16 +823,23 @@
|
||||
{
|
||||
"slug": "navidrome",
|
||||
"repo": "navidrome/navidrome",
|
||||
"version": "v0.59.0",
|
||||
"version": "v0.60.0",
|
||||
"pinned": false,
|
||||
"date": "2025-12-06T18:08:42Z"
|
||||
"date": "2026-02-03T18:57:04Z"
|
||||
},
|
||||
{
|
||||
"slug": "netbox",
|
||||
"repo": "netbox-community/netbox",
|
||||
"version": "v4.5.1",
|
||||
"version": "v4.5.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-20T19:45:05Z"
|
||||
"date": "2026-02-03T13:54:26Z"
|
||||
},
|
||||
{
|
||||
"slug": "nginx-ui",
|
||||
"repo": "0xJacky/nginx-ui",
|
||||
"version": "v2.3.2",
|
||||
"pinned": false,
|
||||
"date": "2025-12-09T09:47:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "nocodb",
|
||||
@@ -876,12 +883,19 @@
|
||||
"pinned": false,
|
||||
"date": "2026-01-17T12:24:31Z"
|
||||
},
|
||||
{
|
||||
"slug": "opencloud",
|
||||
"repo": "opencloud-eu/opencloud",
|
||||
"version": "v5.0.1",
|
||||
"pinned": true,
|
||||
"date": "2026-01-28T15:08:23Z"
|
||||
},
|
||||
{
|
||||
"slug": "opengist",
|
||||
"repo": "thomiceli/opengist",
|
||||
"version": "v1.12.0",
|
||||
"version": "v1.12.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-27T15:31:57Z"
|
||||
"date": "2026-02-03T09:00:43Z"
|
||||
},
|
||||
{
|
||||
"slug": "ots",
|
||||
@@ -1019,9 +1033,9 @@
|
||||
{
|
||||
"slug": "pocketbase",
|
||||
"repo": "pocketbase/pocketbase",
|
||||
"version": "v0.36.1",
|
||||
"version": "v0.36.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-18T17:09:58Z"
|
||||
"date": "2026-02-01T08:12:42Z"
|
||||
},
|
||||
{
|
||||
"slug": "pocketid",
|
||||
@@ -1054,9 +1068,9 @@
|
||||
{
|
||||
"slug": "prometheus-alertmanager",
|
||||
"repo": "prometheus/alertmanager",
|
||||
"version": "v0.30.1",
|
||||
"version": "v0.31.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-12T23:30:06Z"
|
||||
"date": "2026-02-02T13:34:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "prometheus-blackbox-exporter",
|
||||
@@ -1096,9 +1110,9 @@
|
||||
{
|
||||
"slug": "pulse",
|
||||
"repo": "rcourtman/Pulse",
|
||||
"version": "v5.0.17",
|
||||
"version": "v5.1.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-20T19:07:30Z"
|
||||
"date": "2026-02-05T00:18:57Z"
|
||||
},
|
||||
{
|
||||
"slug": "pve-scripts-local",
|
||||
@@ -1184,6 +1198,13 @@
|
||||
"pinned": false,
|
||||
"date": "2026-01-12T05:38:30Z"
|
||||
},
|
||||
{
|
||||
"slug": "rustypaste",
|
||||
"repo": "orhun/rustypaste",
|
||||
"version": "v0.16.1",
|
||||
"pinned": false,
|
||||
"date": "2025-03-21T20:44:47Z"
|
||||
},
|
||||
{
|
||||
"slug": "sabnzbd",
|
||||
"repo": "sabnzbd/sabnzbd",
|
||||
@@ -1194,9 +1215,9 @@
|
||||
{
|
||||
"slug": "scanopy",
|
||||
"repo": "scanopy/scanopy",
|
||||
"version": "v0.13.6",
|
||||
"version": "v0.14.3",
|
||||
"pinned": false,
|
||||
"date": "2026-01-15T23:34:51Z"
|
||||
"date": "2026-02-04T01:41:01Z"
|
||||
},
|
||||
{
|
||||
"slug": "scraparr",
|
||||
@@ -1264,16 +1285,16 @@
|
||||
{
|
||||
"slug": "speedtest-tracker",
|
||||
"repo": "alexjustesen/speedtest-tracker",
|
||||
"version": "v1.13.5",
|
||||
"version": "v1.13.8",
|
||||
"pinned": false,
|
||||
"date": "2026-01-08T22:35:28Z"
|
||||
"date": "2026-02-04T19:24:23Z"
|
||||
},
|
||||
{
|
||||
"slug": "spoolman",
|
||||
"repo": "Donkie/Spoolman",
|
||||
"version": "v0.23.0",
|
||||
"version": "v0.23.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-23T20:42:34Z"
|
||||
"date": "2026-02-03T19:03:55Z"
|
||||
},
|
||||
{
|
||||
"slug": "sportarr",
|
||||
@@ -1285,9 +1306,9 @@
|
||||
{
|
||||
"slug": "stirling-pdf",
|
||||
"repo": "Stirling-Tools/Stirling-PDF",
|
||||
"version": "v2.4.3",
|
||||
"version": "v2.4.4",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T22:19:14Z"
|
||||
"date": "2026-02-05T00:15:53Z"
|
||||
},
|
||||
{
|
||||
"slug": "streamlink-webui",
|
||||
@@ -1306,9 +1327,9 @@
|
||||
{
|
||||
"slug": "tandoor",
|
||||
"repo": "TandoorRecipes/recipes",
|
||||
"version": "2.4.1",
|
||||
"version": "2.4.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T06:52:26Z"
|
||||
"date": "2026-02-01T12:52:37Z"
|
||||
},
|
||||
{
|
||||
"slug": "tasmoadmin",
|
||||
@@ -1348,9 +1369,9 @@
|
||||
{
|
||||
"slug": "thingsboard",
|
||||
"repo": "thingsboard/thingsboard",
|
||||
"version": "v4.3",
|
||||
"version": "v4.3.0.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-20T14:27:07Z"
|
||||
"date": "2026-02-03T12:39:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "threadfin",
|
||||
@@ -1362,9 +1383,9 @@
|
||||
{
|
||||
"slug": "tianji",
|
||||
"repo": "msgbyte/tianji",
|
||||
"version": "v1.31.9",
|
||||
"version": "v1.31.10",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T18:22:40Z"
|
||||
"date": "2026-02-04T17:21:04Z"
|
||||
},
|
||||
{
|
||||
"slug": "traccar",
|
||||
@@ -1404,9 +1425,9 @@
|
||||
{
|
||||
"slug": "trip",
|
||||
"repo": "itskovacs/TRIP",
|
||||
"version": "1.38.0",
|
||||
"version": "1.38.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-31T15:56:30Z"
|
||||
"date": "2026-02-04T18:10:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "tududi",
|
||||
@@ -1418,9 +1439,9 @@
|
||||
{
|
||||
"slug": "tunarr",
|
||||
"repo": "chrisbenincasa/tunarr",
|
||||
"version": "v1.1.11",
|
||||
"version": "v1.1.12",
|
||||
"pinned": false,
|
||||
"date": "2026-01-30T22:34:30Z"
|
||||
"date": "2026-02-03T20:19:00Z"
|
||||
},
|
||||
{
|
||||
"slug": "uhf",
|
||||
@@ -1464,12 +1485,19 @@
|
||||
"pinned": false,
|
||||
"date": "2025-10-22T17:03:54Z"
|
||||
},
|
||||
{
|
||||
"slug": "vaultwarden",
|
||||
"repo": "dani-garcia/vaultwarden",
|
||||
"version": "1.35.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-09T18:37:04Z"
|
||||
},
|
||||
{
|
||||
"slug": "victoriametrics",
|
||||
"repo": "VictoriaMetrics/VictoriaMetrics",
|
||||
"version": "v1.134.0",
|
||||
"version": "v1.135.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-19T13:29:43Z"
|
||||
"date": "2026-02-02T14:20:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "vikunja",
|
||||
@@ -1495,9 +1523,9 @@
|
||||
{
|
||||
"slug": "wanderer",
|
||||
"repo": "meilisearch/meilisearch",
|
||||
"version": "v1.34.3",
|
||||
"version": "v1.35.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-28T17:52:24Z"
|
||||
"date": "2026-02-02T09:57:03Z"
|
||||
},
|
||||
{
|
||||
"slug": "warracker",
|
||||
@@ -1527,6 +1555,13 @@
|
||||
"pinned": false,
|
||||
"date": "2025-12-31T16:53:34Z"
|
||||
},
|
||||
{
|
||||
"slug": "wealthfolio",
|
||||
"repo": "afadil/wealthfolio",
|
||||
"version": "v2.1.0",
|
||||
"pinned": false,
|
||||
"date": "2025-12-01T21:57:36Z"
|
||||
},
|
||||
{
|
||||
"slug": "web-check",
|
||||
"repo": "CrazyWolf13/web-check",
|
||||
@@ -1541,6 +1576,13 @@
|
||||
"pinned": false,
|
||||
"date": "2026-01-08T09:50:00Z"
|
||||
},
|
||||
{
|
||||
"slug": "wishlist",
|
||||
"repo": "cmintey/wishlist",
|
||||
"version": "v0.59.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-19T16:42:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "wizarr",
|
||||
"repo": "wizarrrr/wizarr",
|
||||
@@ -1548,6 +1590,13 @@
|
||||
"pinned": false,
|
||||
"date": "2025-12-09T14:30:23Z"
|
||||
},
|
||||
{
|
||||
"slug": "writefreely",
|
||||
"repo": "writefreely/writefreely",
|
||||
"version": "v0.16.0",
|
||||
"pinned": false,
|
||||
"date": "2025-08-29T19:30:02Z"
|
||||
},
|
||||
{
|
||||
"slug": "yt-dlp-webui",
|
||||
"repo": "marcopiovanello/yt-dlp-web-ui",
|
||||
@@ -1565,9 +1614,9 @@
|
||||
{
|
||||
"slug": "zigbee2mqtt",
|
||||
"repo": "Koenkk/zigbee2mqtt",
|
||||
"version": "2.7.2",
|
||||
"version": "2.8.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-01T13:43:47Z"
|
||||
"date": "2026-02-01T19:27:25Z"
|
||||
},
|
||||
{
|
||||
"slug": "zipline",
|
||||
@@ -1593,9 +1642,9 @@
|
||||
{
|
||||
"slug": "zwave-js-ui",
|
||||
"repo": "zwave-js/zwave-js-ui",
|
||||
"version": "v11.10.1",
|
||||
"version": "v11.11.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-15T15:58:06Z"
|
||||
"date": "2026-02-03T13:13:05Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
44
frontend/public/json/immich-public-proxy.json
Normal file
44
frontend/public/json/immich-public-proxy.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "Immich Public Proxy",
|
||||
"slug": "immich-public-proxy",
|
||||
"categories": [
|
||||
21
|
||||
],
|
||||
"date_created": "2026-02-04",
|
||||
"type": "addon",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://github.com/alangrainger/immich-public-proxy/tree/main/docs",
|
||||
"website": "https://github.com/alangrainger/immich-public-proxy",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/immich-public-proxy.webp",
|
||||
"config_path": "/opt/immich-proxy/app/.env",
|
||||
"description": "Share your Immich photos and albums in a safe way without exposing your Immich instance to the public.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "tools/addon/immich-public-proxy.sh",
|
||||
"resources": {
|
||||
"cpu": null,
|
||||
"ram": null,
|
||||
"hdd": null,
|
||||
"os": null,
|
||||
"version": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Requires Node.js 24+",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Update with: update_immich-public-proxy",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
35
frontend/public/json/kitchenowl.json
Normal file
35
frontend/public/json/kitchenowl.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "KitchenOwl",
|
||||
"slug": "kitchenowl",
|
||||
"categories": [
|
||||
13
|
||||
],
|
||||
"date_created": "2026-02-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://docs.kitchenowl.org/",
|
||||
"website": "https://kitchenowl.org/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kitchenowl.webp",
|
||||
"config_path": "/opt/kitchenowl/kitchenowl.env",
|
||||
"description": "KitchenOwl is a smart self-hosted grocery list and recipe manager with real-time synchronization, recipe management, meal planning, and expense tracking.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/kitchenowl.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 2048,
|
||||
"hdd": 6,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
48
frontend/public/json/nginx-ui.json
Normal file
48
frontend/public/json/nginx-ui.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "Nginx UI",
|
||||
"slug": "nginx-ui",
|
||||
"categories": [
|
||||
21
|
||||
],
|
||||
"date_created": "2026-02-05",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 9000,
|
||||
"documentation": "https://nginxui.com/guide/",
|
||||
"website": "https://nginxui.com",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nginx-ui.webp",
|
||||
"config_path": "/usr/local/etc/nginx-ui/app.ini",
|
||||
"description": "Nginx UI is a comprehensive web-based interface designed to simplify the management and configuration of Nginx servers. It provides features like online statistics, ChatGPT-powered config assistant, automatic Let's Encrypt certificates, and config file editing with syntax highlighting.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/nginx-ui.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 512,
|
||||
"hdd": 4,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Nginx runs on ports 80/443, Nginx UI management interface on port 9000.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "SSL certificates can be managed automatically with Let's Encrypt integration.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Initial Login data: `cat ~/nginx-ui.creds`",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -13,6 +13,8 @@
|
||||
"website": "https://nginxproxymanager.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nginx-proxy-manager.webp",
|
||||
"config_path": "",
|
||||
"disable": true,
|
||||
"disable_description": "This script is temporarily disabled due to an external issue with the OpenResty APT repository. The repository's GPG key uses SHA-1 signatures, which are no longer accepted by Debian as of February 1, 2026. This causes installation to fail with APT errors. The issue is tracked in openresty/openresty#1097. A workaround exists but requires manual configuration. The script will be re-enabled once OpenResty updates their repository signing key. For more details, see: https://github.com/community-scripts/ProxmoxVE/issues/11406",
|
||||
"description": "Nginx Proxy Manager is a tool that provides a web-based interface to manage Nginx reverse proxies. It enables users to easily and securely expose their services to the internet by providing features such as HTTPS encryption, domain mapping, and access control. It eliminates the need for manual configuration of Nginx reverse proxies, making it easy for users to quickly and securely expose their services to the public.",
|
||||
"install_methods": [
|
||||
{
|
||||
|
||||
64
frontend/public/json/opencloud.json
Normal file
64
frontend/public/json/opencloud.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"name": "OpenCloud",
|
||||
"slug": "opencloud",
|
||||
"categories": [
|
||||
11
|
||||
],
|
||||
"date_created": "2026-02-05",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 443,
|
||||
"documentation": "https://docs.opencloud.eu",
|
||||
"config_path": "/etc/opencloud/opencloud.env, /etc/opencloud/opencloud.yaml, /etc/opencloud/csp.yaml",
|
||||
"website": "https://opencloud.eu",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/opencloud.webp",
|
||||
"description": "OpenCloud is the file sharing and collaboration solution of the Heinlein Group. Through intelligent file management and a strong open source community, files become valuable resources, effectively structured and usable in the long term. With flexible data rooms and intelligent access rights, teams can access and work together on data anytime, anywhere without barriers, but with a lot of productivity.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/opencloud.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 20,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "admin",
|
||||
"password": "randomly generated during the installation process"
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Valid TLS certificates and fully-qualified domain names behind a reverse proxy (Caddy) for 3 services - OpenCloud, Collabora, and WOPI are **REQUIRED**",
|
||||
"type": "warning"
|
||||
},
|
||||
{
|
||||
"text": "Forgot your admin password? Check `admin_password` in the 'idm' section in `/etc/opencloud/opencloud.yaml`",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "**Optional External Apps**: extract zip archives from App Store to `/etc/opencloud/assets/apps`",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "**Optional CalDAV and CardDAV**: requires separate Radicale install. Edit and rename `/opt/opencloud/proxy.yaml.bak` and change your Radicale config to use `http_x_remote_user` as the auth method",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "**Optional OpenID**: Authelia and PocketID supported. Uncomment relevant lines in `/opt/opencloud/opencloud.env` and consult OpenCloud GitHub discussions for configuration tips",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "**Optional Full-text Search with Apache Tika**: requires your own Tika LXC. See `https://community-scripts.github.io/ProxmoxVE/scripts?id=apache-tika`",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "**Relevant services**: `opencloud.service`, `opencloud-wopi.service`, `coolwsd.service`",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user