mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-05 12:53:27 +01:00
Compare commits
94 Commits
CrazyWolf1
...
feat/sqlse
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61cf475dd2 | ||
|
|
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 |
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
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- [FIX] Jotty: backup and restore custom config [@vhsdream](https://github.com/vhsdream) ([#11212](https://github.com/community-scripts/ProxmoxVE/pull/11212))
|
- [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
|
### 📚 Documentation
|
||||||
|
|
||||||
- doc setup_deb822_repo arg order [@chrnie](https://github.com/chrnie) ([#11215](https://github.com/community-scripts/ProxmoxVE/pull/11215))
|
- 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
|
## 2026-01-26
|
||||||
|
|
||||||
@@ -100,7 +242,7 @@
|
|||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|
||||||
- Tracearr ([#11079](https://github.com/community-scripts/ProxmoxVE/pull/11079))
|
- 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
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
@@ -250,7 +392,7 @@
|
|||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|
||||||
- Termix ([#10887](https://github.com/community-scripts/ProxmoxVE/pull/10887))
|
- 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
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
@@ -319,7 +461,7 @@
|
|||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|
||||||
- Flatnotes ([#10857](https://github.com/community-scripts/ProxmoxVE/pull/10857))
|
- 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
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
@@ -385,7 +527,7 @@
|
|||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|
||||||
- Investbrain ([#10774](https://github.com/community-scripts/ProxmoxVE/pull/10774))
|
- 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
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
@@ -574,7 +716,7 @@
|
|||||||
### 📚 Documentation
|
### 📚 Documentation
|
||||||
|
|
||||||
- [gh] New Script template update [@tremor021](https://github.com/tremor021) ([#10607](https://github.com/community-scripts/ProxmoxVE/pull/10607))
|
- [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
|
### 📂 Github
|
||||||
|
|
||||||
@@ -655,7 +797,7 @@
|
|||||||
### ❔ Uncategorized
|
### ❔ Uncategorized
|
||||||
|
|
||||||
- Wireguard: Update WGDashboard notes URL to the new link [@tremor021](https://github.com/tremor021) ([#10496](https://github.com/community-scripts/ProxmoxVE/pull/10496))
|
- 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
|
## 2026-01-02
|
||||||
|
|
||||||
@@ -684,157 +826,3 @@
|
|||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- Fix MariaDB runtime directory persistence on container reboot [@Copilot](https://github.com/Copilot) ([#10468](https://github.com/community-scripts/ProxmoxVE/pull/10468))
|
- 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))
|
||||||
95
.github/workflows/changelog-archive.yml
generated
vendored
95
.github/workflows/changelog-archive.yml
generated
vendored
@@ -54,8 +54,9 @@ jobs:
|
|||||||
|
|
||||||
console.log(`Cutoff date: ${cutoffDate.toISOString().split('T')[0]}`);
|
console.log(`Cutoff date: ${cutoffDate.toISOString().split('T')[0]}`);
|
||||||
|
|
||||||
// Read changelog
|
// Read changelog and normalize line endings
|
||||||
const content = await fs.readFile(CHANGELOG_PATH, 'utf-8');
|
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');
|
const lines = content.split('\n');
|
||||||
|
|
||||||
// Parse entries
|
// Parse entries
|
||||||
@@ -66,9 +67,39 @@ jobs:
|
|||||||
let currentDate = null;
|
let currentDate = null;
|
||||||
let currentContent = [];
|
let currentContent = [];
|
||||||
let inHeader = true;
|
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);
|
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) {
|
if (match) {
|
||||||
inHeader = false;
|
inHeader = false;
|
||||||
|
|
||||||
@@ -148,30 +179,55 @@ jobs:
|
|||||||
let existingContent = '';
|
let existingContent = '';
|
||||||
try {
|
try {
|
||||||
existingContent = await fs.readFile(monthPath, 'utf-8');
|
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) {
|
} catch (e) {
|
||||||
// File doesn't exist
|
// File doesn't exist
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge new entries with existing (avoid duplicates)
|
// Parse existing entries into a Map (date -> content) for deduplication
|
||||||
const existingDates = new Set();
|
const allEntries = new Map();
|
||||||
const existingDatePattern = /^## (\d{4}-\d{2}-\d{2})$/gm;
|
|
||||||
let match;
|
// Helper function to parse entries from content
|
||||||
while ((match = existingDatePattern.exec(existingContent)) !== null) {
|
const parseEntries = (content) => {
|
||||||
existingDates.add(match[1]);
|
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})/);
|
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) {
|
// Sort entries by date (newest first) and write
|
||||||
const allContent = existingContent
|
const sortedDates = [...allEntries.keys()].sort().reverse();
|
||||||
? existingContent + '\n\n' + newEntries.join('\n\n')
|
const sortedContent = sortedDates.map(date => allEntries.get(date)).join('\n\n');
|
||||||
: newEntries.join('\n\n');
|
|
||||||
|
|
||||||
await fs.writeFile(monthPath, allContent, 'utf-8');
|
if (addedCount > 0 || !existingContent) {
|
||||||
console.log(`Updated: ${monthPath} (+${newEntries.length} entries)`);
|
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
|
// Count entries in month file
|
||||||
let entryCount = 0;
|
let entryCount = 0;
|
||||||
try {
|
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;
|
entryCount = (monthContent.match(/^## \d{4}-\d{2}-\d{2}$/gm) || []).length;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
entryCount = (archiveData[year]?.[month] || []).length;
|
entryCount = (archiveData[year]?.[month] || []).length;
|
||||||
|
|||||||
75
.github/workflows/lock-issue.yaml
generated
vendored
75
.github/workflows/lock-issue.yaml
generated
vendored
@@ -18,7 +18,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const daysBeforeLock = 3;
|
const daysBeforeLock = 3;
|
||||||
const cutoffDate = new Date('2026-01-27T00:00:00Z');
|
|
||||||
const lockDate = new Date();
|
const lockDate = new Date();
|
||||||
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
||||||
|
|
||||||
@@ -29,48 +28,50 @@ jobs:
|
|||||||
/dependabot/i
|
/dependabot/i
|
||||||
];
|
];
|
||||||
|
|
||||||
// Search for closed, unlocked issues older than 3 days
|
// Search for closed, unlocked issues older than 3 days (paginated, oldest first)
|
||||||
const issues = await github.rest.search.issuesAndPullRequests({
|
let page = 1;
|
||||||
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
|
let totalLocked = 0;
|
||||||
per_page: 50
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(`Found ${issues.data.items.length} issues/PRs to process`);
|
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
|
||||||
|
});
|
||||||
|
|
||||||
for (const item of issues.data.items) {
|
if (issues.data.items.length === 0) break;
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
const createdAt = new Date(item.created_at);
|
console.log(`Page ${page}: ${issues.data.items.length} items (total available: ${issues.data.total_count})`);
|
||||||
const isNew = createdAt >= cutoffDate;
|
|
||||||
|
|
||||||
try {
|
for (const item of issues.data.items) {
|
||||||
// Add comment only for new issues (created after 2026-01-27)
|
// Skip excluded items
|
||||||
if (isNew) {
|
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
|
||||||
const comment = item.pull_request
|
if (shouldExclude) {
|
||||||
? 'This pull request has been automatically locked. Please open a new issue for related bugs.'
|
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
|
||||||
: 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.';
|
continue;
|
||||||
|
|
||||||
await github.rest.issues.createComment({
|
|
||||||
...context.repo,
|
|
||||||
issue_number: item.number,
|
|
||||||
body: comment
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lock the issue/PR
|
try {
|
||||||
await github.rest.issues.lock({
|
// Lock the issue/PR silently
|
||||||
...context.repo,
|
await github.rest.issues.lock({
|
||||||
issue_number: item.number,
|
...context.repo,
|
||||||
lock_reason: 'resolved'
|
issue_number: item.number,
|
||||||
});
|
lock_reason: 'resolved'
|
||||||
|
});
|
||||||
|
|
||||||
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
totalLocked++;
|
||||||
} catch (error) {
|
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
||||||
console.log(`Failed to lock #${item.number}: ${error.message}`);
|
} 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`);
|
||||||
|
|||||||
556
CHANGELOG.md
556
CHANGELOG.md
@@ -21,7 +21,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
|
|
||||||
<details>
|
<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)
|
[View January 2026 Changelog](.github/changelogs/2026/01.md)
|
||||||
|
|
||||||
@@ -391,397 +398,119 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-02-04
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
<details>
|
- Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527))
|
||||||
<summary><h2>📜 History</h2></summary>
|
- WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524))
|
||||||
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h3>2026</h3></summary>
|
|
||||||
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>January (31 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View January 2026 Changelog](.github/changelogs/2026/01.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h3>2025</h3></summary>
|
|
||||||
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>December (31 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View December 2025 Changelog](.github/changelogs/2025/12.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>November (29 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View November 2025 Changelog](.github/changelogs/2025/11.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>October (30 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View October 2025 Changelog](.github/changelogs/2025/10.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>September (29 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View September 2025 Changelog](.github/changelogs/2025/09.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>August (30 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View August 2025 Changelog](.github/changelogs/2025/08.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>July (29 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View July 2025 Changelog](.github/changelogs/2025/07.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>June (29 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View June 2025 Changelog](.github/changelogs/2025/06.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>May (30 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View May 2025 Changelog](.github/changelogs/2025/05.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>April (25 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View April 2025 Changelog](.github/changelogs/2025/04.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>March (30 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View March 2025 Changelog](.github/changelogs/2025/03.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>February (26 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View February 2025 Changelog](.github/changelogs/2025/02.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>January (27 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View January 2025 Changelog](.github/changelogs/2025/01.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h3>2024</h3></summary>
|
|
||||||
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>December (22 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View December 2024 Changelog](.github/changelogs/2024/12.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>November (15 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View November 2024 Changelog](.github/changelogs/2024/11.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>October (9 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View October 2024 Changelog](.github/changelogs/2024/10.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><h4>September (1 entries)</h4></summary>
|
|
||||||
|
|
||||||
[View September 2024 Changelog](.github/changelogs/2024/09.md)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
## 2026-02-01
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- [Hotfix] Bunkerweb update [@vhsdream](https://github.com/vhsdream) ([#11402](https://github.com/community-scripts/ProxmoxVE/pull/11402))
|
- Immich: pin version to 2.5.3 [@vhsdream](https://github.com/vhsdream) ([#11515](https://github.com/community-scripts/ProxmoxVE/pull/11515))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
- #### ✨ New Features
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- [ADDON] Immich Public Proxy addon [@vhsdream](https://github.com/vhsdream) ([#11518](https://github.com/community-scripts/ProxmoxVE/pull/11518))
|
||||||
|
|
||||||
|
### 🌐 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))
|
- Immich Refactor #2 [@vhsdream](https://github.com/vhsdream) ([#11375](https://github.com/community-scripts/ProxmoxVE/pull/11375))
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
- #### 🔧 Refactor
|
||||||
@@ -797,6 +526,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
### 🌐 Website
|
### 🌐 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
|
- #### ✨ 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))
|
- 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))
|
||||||
@@ -1551,64 +1282,3 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
- #### 🔧 Refactor
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
- Refactor: IP-Tag (Multiple IP / Performance / Execution Time) [@MickLesk](https://github.com/MickLesk) ([#10558](https://github.com/community-scripts/ProxmoxVE/pull/10558))
|
- 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!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if ! command -v memcached >/dev/null 2>&1; then
|
ensure_dependencies memcached libmemcached-tools
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y memcached libmemcached-tools
|
|
||||||
fi
|
|
||||||
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
|
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop adventurelog-backend
|
systemctl stop adventurelog-backend
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: hoholms
|
# Author: hoholms
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/grafana/loki
|
# 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
|
NODE_VERSION="22" NODE_MODULE="@postlight/parser@latest,single-file-cli@latest" setup_nodejs
|
||||||
PYTHON_VERSION="3.13" setup_uv
|
PYTHON_VERSION="3.13" setup_uv
|
||||||
|
|
||||||
if ! dpkg -l | grep -q "^ii chromium "; then
|
ensure_dependencies chromium
|
||||||
msg_info "Installing System Dependencies"
|
|
||||||
$STD apt-get install -y chromium
|
|
||||||
msg_ok "Installed System Dependencies"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop archivebox
|
systemctl stop archivebox
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: vhsdream
|
# Author: vhsdream
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/gelbphoenix/autocaliweb
|
# Source: https://codeberg.org/gelbphoenix/autocaliweb
|
||||||
|
|
||||||
APP="Autocaliweb"
|
APP="Autocaliweb"
|
||||||
var_tags="${var_tags:-ebooks}"
|
var_tags="${var_tags:-ebooks}"
|
||||||
@@ -30,8 +30,8 @@ function update_script() {
|
|||||||
|
|
||||||
setup_uv
|
setup_uv
|
||||||
|
|
||||||
RELEASE=$(get_latest_github_release "gelbphoenix/autocaliweb")
|
RELEASE=$(get_latest_codeberg_release "gelbphoenix/autocaliweb")
|
||||||
if check_for_gh_release "autocaliweb" "gelbphoenix/autocaliweb"; then
|
if check_for_codeberg_release "autocaliweb" "gelbphoenix/autocaliweb"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop autocaliweb metadata-change-detector acw-ingest-service acw-auto-zipper
|
systemctl stop autocaliweb metadata-change-detector acw-ingest-service acw-auto-zipper
|
||||||
msg_ok "Stopped Services"
|
msg_ok "Stopped Services"
|
||||||
@@ -39,7 +39,7 @@ function update_script() {
|
|||||||
INSTALL_DIR="/opt/autocaliweb"
|
INSTALL_DIR="/opt/autocaliweb"
|
||||||
export VIRTUAL_ENV="${INSTALL_DIR}/venv"
|
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}
|
$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"
|
msg_info "Updating Autocaliweb"
|
||||||
cd "$INSTALL_DIR"
|
cd "$INSTALL_DIR"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: Michelle Zitzerman (Sinofage)
|
# Author: Michelle Zitzerman (Sinofage)
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://beszel.dev/
|
# Source: https://beszel.dev/
|
||||||
|
|||||||
@@ -29,12 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! dpkg -s libjpeg-dev >/dev/null 2>&1; then
|
ensure_dependencies libjpeg-dev
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt-get update
|
|
||||||
$STD apt-get install -y libjpeg-dev
|
|
||||||
msg_ok "Updated Dependencies"
|
|
||||||
fi
|
|
||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
|
|||||||
@@ -34,12 +34,7 @@ function update_script() {
|
|||||||
systemctl stop commafeed
|
systemctl stop commafeed
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
if ! [[ $(dpkg -s rsync 2>/dev/null) ]]; then
|
ensure_dependencies rsync
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y rsync
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
|
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
|
||||||
msg_info "Backing up existing data"
|
msg_info "Backing up existing data"
|
||||||
|
|||||||
@@ -44,10 +44,7 @@ function update_script() {
|
|||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
if check_for_gh_release "cronicle" "jhuckaby/Cronicle"; then
|
if check_for_gh_release "cronicle" "jhuckaby/Cronicle"; then
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y \
|
ensure_dependencies git build-essential ca-certificates
|
||||||
git \
|
|
||||||
build-essential \
|
|
||||||
ca-certificates
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|||||||
@@ -38,9 +38,7 @@ function update_script() {
|
|||||||
systemctl reload nginx
|
systemctl reload nginx
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! dpkg -s vlc-bin vlc-plugin-base &>/dev/null; then
|
ensure_dependencies vlc-bin vlc-plugin-base
|
||||||
$STD apt update && $STD apt install -y vlc-bin vlc-plugin-base
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "Dispatcharr" "Dispatcharr/Dispatcharr"; then
|
if check_for_gh_release "Dispatcharr" "Dispatcharr/Dispatcharr"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: wendyliga
|
# Author: wendyliga
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/DonutWare/Fladder
|
# Source: https://github.com/DonutWare/Fladder
|
||||||
|
|||||||
@@ -27,35 +27,28 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_info "Stopping Service"
|
if check_for_codeberg_release "forgejo" "forgejo/forgejo"; then
|
||||||
systemctl stop forgejo
|
msg_info "Stopping Service"
|
||||||
msg_ok "Stopped Service"
|
systemctl stop forgejo
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
fetch_and_deploy_codeberg_release "forgejo" "forgejo/forgejo" "singlefile" "latest" "/opt/forgejo" "forgejo-*-linux-amd64"
|
||||||
RELEASE=$(curl -fsSL https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//')
|
ln -sf /opt/forgejo/forgejo /usr/local/bin/forgejo
|
||||||
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}"
|
|
||||||
|
|
||||||
msg_info "Cleaning"
|
if grep -q "GITEA_WORK_DIR" /etc/systemd/system/forgejo.service; then
|
||||||
rm -rf forgejo-$RELEASE-linux-amd64
|
msg_info "Updating Service File"
|
||||||
msg_ok "Cleaned"
|
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
|
msg_info "Starting Service"
|
||||||
if grep -q "GITEA_WORK_DIR" /etc/systemd/system/forgejo.service; then
|
systemctl start forgejo
|
||||||
msg_info "Updating Service File"
|
msg_ok "Started Service"
|
||||||
sed -i "s/GITEA_WORK_DIR/FORGEJO_WORK_DIR/g" /etc/systemd/system/forgejo.service
|
msg_ok "Updated successfully!"
|
||||||
systemctl daemon-reload
|
else
|
||||||
msg_ok "Updated Service File"
|
msg_ok "No update required. ${APP} is already at the latest version."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start forgejo
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,9 +43,7 @@ function update_script() {
|
|||||||
msg_error "Project directory does not exist: $PROJECT_DIR"
|
msg_error "Project directory does not exist: $PROJECT_DIR"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if ! command -v git &>/dev/null; then
|
ensure_dependencies git
|
||||||
$STD apt install -y git
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Stopping service $SERVICE_NAME"
|
msg_info "Stopping service $SERVICE_NAME"
|
||||||
systemctl stop "$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"
|
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 dpkg -i graylog-7.0-repository_latest.deb
|
||||||
$STD apt update
|
$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
|
rm -f graylog-7.0-repository_latest.deb
|
||||||
msg_ok "Updated Graylog"
|
msg_ok "Updated Graylog"
|
||||||
elif dpkg --compare-versions "$CURRENT_VERSION" ge "7.0"; then
|
elif dpkg --compare-versions "$CURRENT_VERSION" ge "7.0"; then
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ensure_dependencies git
|
||||||
|
|
||||||
if check_for_gh_release "grist" "gristlabs/grist-core"; then
|
if check_for_gh_release "grist" "gristlabs/grist-core"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop grist
|
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/rustypaste
Normal file
6
ct/headers/rustypaste
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
|
get_lxc_ip
|
||||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||||
if ! command -v jq &>/dev/null; then
|
ensure_dependencies jq
|
||||||
$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
|
|
||||||
|
|
||||||
if check_for_gh_release "homepage" "gethomepage/homepage"; then
|
if check_for_gh_release "homepage" "gethomepage/homepage"; then
|
||||||
msg_info "Stopping service"
|
msg_info "Stopping service"
|
||||||
|
|||||||
42
ct/immich.sh
42
ct/immich.sh
@@ -36,10 +36,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
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
|
if [[ ! -f /etc/apt/preferences.d/preferences ]]; then
|
||||||
msg_info "Adding Debian Testing repo"
|
msg_info "Adding Debian Testing repo"
|
||||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||||
@@ -67,8 +63,7 @@ EOF
|
|||||||
msg_info "Installing Mise"
|
msg_info "Installing Mise"
|
||||||
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
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
|
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
|
ensure_dependencies mise
|
||||||
$STD apt install -y mise
|
|
||||||
msg_ok "Installed Mise"
|
msg_ok "Installed Mise"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -89,7 +84,7 @@ EOF
|
|||||||
curl -fsSLO "$url"
|
curl -fsSLO "$url"
|
||||||
done
|
done
|
||||||
$STD apt-mark unhold libigdgmm12
|
$STD apt-mark unhold libigdgmm12
|
||||||
$STD apt install -y ./libigdgmm12*.deb
|
$STD apt install -y --allow-downgrades ./libigdgmm12*.deb
|
||||||
rm ./libigdgmm12*.deb
|
rm ./libigdgmm12*.deb
|
||||||
$STD apt install -y ./*.deb
|
$STD apt install -y ./*.deb
|
||||||
rm ./*.deb
|
rm ./*.deb
|
||||||
@@ -110,7 +105,7 @@ EOF
|
|||||||
msg_ok "Image-processing libraries up to date"
|
msg_ok "Image-processing libraries up to date"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="2.5.2"
|
RELEASE="2.5.3"
|
||||||
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
||||||
if [[ $(cat ~/.immich) > "2.5.1" ]]; then
|
if [[ $(cat ~/.immich) > "2.5.1" ]]; then
|
||||||
msg_info "Enabling Maintenance Mode"
|
msg_info "Enabling Maintenance Mode"
|
||||||
@@ -134,9 +129,7 @@ EOF
|
|||||||
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX face_index;"
|
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX face_index;"
|
||||||
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX clip_index;"
|
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX clip_index;"
|
||||||
fi
|
fi
|
||||||
if ! dpkg -l | grep -q ccache; then
|
ensure_dependencies ccache
|
||||||
$STD apt install -yqq ccache
|
|
||||||
fi
|
|
||||||
|
|
||||||
INSTALL_DIR="/opt/${APP}"
|
INSTALL_DIR="/opt/${APP}"
|
||||||
UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)"
|
UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)"
|
||||||
@@ -167,7 +160,10 @@ EOF
|
|||||||
rm -rf "${APP_DIR:?}"/*
|
rm -rf "${APP_DIR:?}"/*
|
||||||
)
|
)
|
||||||
|
|
||||||
|
setup_uv
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v${RELEASE}" "$SRC_DIR"
|
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"
|
msg_info "Updating Immich web and microservices"
|
||||||
cd "$SRC_DIR"/server
|
cd "$SRC_DIR"/server
|
||||||
@@ -253,25 +249,6 @@ EOF
|
|||||||
fi
|
fi
|
||||||
systemctl restart immich-ml immich-web
|
systemctl restart immich-ml immich-web
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
msg_info "Checking health of Immich-web & Immich-ml services"
|
|
||||||
sleep 5
|
|
||||||
web=0
|
|
||||||
until curl -fs localhost:2283/api/server/ping | grep -q "pong" || [[ $web -gt 1 ]]; do
|
|
||||||
msg_warn "Problem detected with Immich-web service, restarting..."
|
|
||||||
systemctl restart immich-web && sleep 5
|
|
||||||
[[ $(curl -fs localhost:2283/api/server/ping | grep "pong") ]] && break
|
|
||||||
((web++))
|
|
||||||
done
|
|
||||||
[[ $web -lt 1 ]] && msg_ok "Immich-web service is reachable!" || msg_error "Please check '/var/log/immich/web.log' for more details"
|
|
||||||
|
|
||||||
ml=0
|
|
||||||
until [[ $(curl -fs localhost:3003/ping) == "pong" ]] || [[ $ml -gt 1 ]]; do
|
|
||||||
msg_warn "Problem detected with Immich-ml service, restarting..."
|
|
||||||
systemctl restart immich-ml && sleep 5
|
|
||||||
[[ $(curl -fs localhost:3003/ping) == "pong" ]] && break
|
|
||||||
((ml++))
|
|
||||||
done
|
|
||||||
[[ $ml -lt 1 ]] && msg_ok "Immich-ml service is reachable!" || msg_error "Please check '/var/log/immich/ml.log' for more details"
|
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
@@ -323,10 +300,7 @@ function compile_libjxl() {
|
|||||||
|
|
||||||
function compile_libheif() {
|
function compile_libheif() {
|
||||||
SOURCE=${SOURCE_DIR}/libheif
|
SOURCE=${SOURCE_DIR}/libheif
|
||||||
if ! dpkg -l | grep -q libaom; then
|
ensure_dependencies libaom-dev
|
||||||
$STD apt install -y libaom-dev
|
|
||||||
local update="required"
|
|
||||||
fi
|
|
||||||
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
||||||
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libheif"
|
msg_info "Recompiling libheif"
|
||||||
|
|||||||
@@ -40,9 +40,7 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating Jellyfin"
|
msg_info "Updating Jellyfin"
|
||||||
if ! dpkg -s libjemalloc2 >/dev/null 2>&1; then
|
ensure_dependencies libjemalloc2
|
||||||
$STD apt install -y libjemalloc2
|
|
||||||
fi
|
|
||||||
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
if [[ ! -f /usr/lib/libjemalloc.so ]]; then
|
||||||
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
ln -sf /usr/lib/x86_64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ function update_script() {
|
|||||||
msg_ok "Updated yt-dlp"
|
msg_ok "Updated yt-dlp"
|
||||||
|
|
||||||
msg_info "Prepare update"
|
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
|
if [[ -f /opt/karakeep/.env ]] && [[ ! -f /etc/karakeep/karakeep.env ]]; then
|
||||||
mkdir -p /etc/karakeep
|
mkdir -p /etc/karakeep
|
||||||
mv /opt/karakeep/.env /etc/karakeep/karakeep.env
|
mv /opt/karakeep/.env /etc/karakeep/karakeep.env
|
||||||
|
|||||||
@@ -23,9 +23,7 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if ! command -v lsb_release; then
|
ensure_dependencies lsb-release
|
||||||
apt install -y lsb-release
|
|
||||||
fi
|
|
||||||
if [[ ! -d /opt/kimai ]]; then
|
if [[ ! -d /opt/kimai ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
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}"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: hoholms
|
# Author: hoholms
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/grafana/loki
|
# Source: https://github.com/grafana/loki
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
ensure_dependencies graphicsmagick
|
||||||
if [ ! -f /opt/n8n.env ]; then
|
if [ ! -f /opt/n8n.env ]; then
|
||||||
sed -i 's|^Environment="N8N_SECURE_COOKIE=false"$|EnvironmentFile=/opt/n8n.env|' /etc/systemd/system/n8n.service
|
sed -i 's|^Environment="N8N_SECURE_COOKIE=false"$|EnvironmentFile=/opt/n8n.env|' /etc/systemd/system/n8n.service
|
||||||
mkdir -p /opt
|
mkdir -p /opt
|
||||||
@@ -37,6 +38,7 @@ N8N_PROTOCOL=http
|
|||||||
N8N_HOST=$LOCAL_IP
|
N8N_HOST=$LOCAL_IP
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
msg_info "Updating ${APP} LXC"
|
msg_info "Updating ${APP} LXC"
|
||||||
|
|||||||
@@ -27,9 +27,8 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if ! dpkg -l | grep -q temurin-21-jre; then
|
JAVA_VERSION="21" setup_java
|
||||||
JAVA_VERSION="21" setup_java
|
|
||||||
fi
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt -y upgrade
|
$STD apt -y upgrade
|
||||||
|
|||||||
@@ -36,12 +36,7 @@ function update_script() {
|
|||||||
NODE_VERSION="24" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
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
|
ensure_dependencies pkg-config libssl-dev
|
||||||
$STD apt install -y pkg-config
|
|
||||||
fi
|
|
||||||
if ! dpkg -l | grep -q "libssl-dev"; then
|
|
||||||
$STD apt install -y libssl-dev
|
|
||||||
fi
|
|
||||||
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
|
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
|
||||||
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
|
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
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
|
if [[ $(grep -E '^VERSION_ID=' /etc/os-release) == *"12"* ]]; then
|
||||||
msg_error "Wrong Debian version detected!"
|
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"
|
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!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
ensure_dependencies python3-lxml
|
||||||
if ! [[ $(dpkg -s python3-lxml-html-clean 2>/dev/null) ]]; then
|
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
|
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
|
$STD dpkg -i /opt/python3-lxml-html-clean.deb
|
||||||
rm -f /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
|
if [[ ! -f /opt/Ollama_version.txt ]]; then
|
||||||
touch /opt/Ollama_version.txt
|
touch /opt/Ollama_version.txt
|
||||||
fi
|
fi
|
||||||
if ! command -v zstd &>/dev/null; then
|
ensure_dependencies zstd
|
||||||
msg_info "Installing zstd"
|
|
||||||
$STD apt install -y zstd
|
|
||||||
msg_ok "Installed zstd"
|
|
||||||
fi
|
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop ollama
|
systemctl stop ollama
|
||||||
msg_ok "Services Stopped"
|
msg_ok "Services Stopped"
|
||||||
|
|||||||
@@ -92,11 +92,7 @@ EOF
|
|||||||
OLLAMA_VERSION=$(ollama -v | awk '{print $NF}')
|
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)}')
|
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 [ "$OLLAMA_VERSION" != "$RELEASE" ]; then
|
||||||
if ! command -v zstd &>/dev/null; then
|
ensure_dependencies zstd
|
||||||
msg_info "Installing zstd"
|
|
||||||
$STD apt install -y zstd
|
|
||||||
msg_ok "Installed zstd"
|
|
||||||
fi
|
|
||||||
msg_info "Ollama update available: v$OLLAMA_VERSION -> v$RELEASE"
|
msg_info "Ollama update available: v$OLLAMA_VERSION -> v$RELEASE"
|
||||||
msg_info "Downloading Ollama v$RELEASE \n"
|
msg_info "Downloading Ollama v$RELEASE \n"
|
||||||
curl -fS#LO https://github.com/ollama/ollama/releases/download/v${RELEASE}/ollama-linux-amd64.tar.zst
|
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
|
if [ "$VERSION_CODENAME" = "bookworm" ]; then
|
||||||
setup_gs
|
setup_gs
|
||||||
else
|
else
|
||||||
$STD apt install -y ghostscript
|
ensure_dependencies ghostscript
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating Paperless-ngx"
|
msg_info "Updating Paperless-ngx"
|
||||||
@@ -145,7 +145,7 @@ function update_script() {
|
|||||||
setup_gs
|
setup_gs
|
||||||
else
|
else
|
||||||
msg_info "Installing Ghostscript"
|
msg_info "Installing Ghostscript"
|
||||||
$STD apt install -y ghostscript
|
ensure_dependencies ghostscript
|
||||||
msg_ok "Installed Ghostscript"
|
msg_ok "Installed Ghostscript"
|
||||||
fi
|
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)
|
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
|
if [[ "${LIBHEIF_URL}" != "$(cat ~/.photoprism_libheif 2>/dev/null)" ]] || [[ ! -f ~/.photoprism_libheif ]]; then
|
||||||
msg_info "Updating PhotoPrism LibHeif"
|
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
|
curl -fsSL "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" -o /tmp/libheif.tar.gz
|
||||||
tar -xzf /tmp/libheif.tar.gz -C /usr/local
|
tar -xzf /tmp/libheif.tar.gz -C /usr/local
|
||||||
ldconfig
|
ldconfig
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ function update_script() {
|
|||||||
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
||||||
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
||||||
$STD apt remove --purge -y dotnet-sdk-8.0
|
$STD apt remove --purge -y dotnet-sdk-8.0
|
||||||
$STD apt install -y aspnetcore-runtime-9.0
|
ensure_dependencies aspnetcore-runtime-9.0
|
||||||
fi
|
fi
|
||||||
rm -rf /opt/rdtc-backup
|
rm -rf /opt/rdtc-backup
|
||||||
|
|
||||||
|
|||||||
@@ -27,22 +27,20 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_info "Stopping Service"
|
if check_for_codeberg_release "readeck" "readeck/readeck"; then
|
||||||
systemctl stop readeck
|
msg_info "Stopping Service"
|
||||||
msg_ok "Stopped Service"
|
systemctl stop readeck
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating Readeck"
|
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
|
||||||
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"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start readeck
|
systemctl start readeck
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
|
else
|
||||||
|
msg_ok "No update required. ${APP} is already at the latest version."
|
||||||
|
fi
|
||||||
exit
|
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}"
|
||||||
@@ -42,12 +42,7 @@ function update_script() {
|
|||||||
|
|
||||||
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
|
ensure_dependencies pkg-config libssl-dev
|
||||||
$STD apt install -y pkg-config
|
|
||||||
fi
|
|
||||||
if ! dpkg -l | grep -q "libssl-dev"; then
|
|
||||||
$STD apt install -y libssl-dev
|
|
||||||
fi
|
|
||||||
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
|
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
|
||||||
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
|
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
|
||||||
|
|
||||||
@@ -72,10 +67,13 @@ function update_script() {
|
|||||||
mv ./target/release/server /usr/bin/scanopy-server
|
mv ./target/release/server /usr/bin/scanopy-server
|
||||||
msg_ok "Built scanopy-server"
|
msg_ok "Built scanopy-server"
|
||||||
|
|
||||||
msg_info "Building scanopy-daemon"
|
[[ -f /etc/systemd/system/scanopy-daemon.service ]] &&
|
||||||
$STD cargo build --release --bin daemon
|
fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64" &&
|
||||||
cp ./target/release/daemon /usr/bin/scanopy-daemon
|
rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh &&
|
||||||
msg_ok "Built scanopy-daemon"
|
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_info "Starting services"
|
msg_info "Starting services"
|
||||||
systemctl start scanopy-server
|
systemctl start scanopy-server
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
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 update
|
||||||
$STD apt -y upgrade
|
$STD apt -y upgrade
|
||||||
msg_ok "Updated successfully!"
|
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
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: durzo
|
# Author: durzo
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/connorgallopo/Tracearr
|
# Source: https://github.com/connorgallopo/Tracearr
|
||||||
@@ -30,6 +30,55 @@ function update_script() {
|
|||||||
|
|
||||||
NODE_VERSION="24" setup_nodejs
|
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
|
if check_for_gh_release "tracearr" "connorgallopo/Tracearr"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop tracearr postgresql redis
|
systemctl stop tracearr postgresql redis
|
||||||
@@ -74,10 +123,15 @@ function update_script() {
|
|||||||
chown -R tracearr:tracearr /data/tracearr
|
chown -R tracearr:tracearr /data/tracearr
|
||||||
msg_ok "Configured Tracearr"
|
msg_ok "Configured Tracearr"
|
||||||
|
|
||||||
msg_info "Starting Services"
|
msg_info "Starting services"
|
||||||
systemctl start postgresql redis tracearr
|
systemctl start postgresql redis tracearr
|
||||||
msg_ok "Started Services"
|
msg_ok "Started services"
|
||||||
msg_ok "Updated successfully!"
|
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
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,8 +30,7 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD apt update
|
ensure_dependencies twingate-connector
|
||||||
$STD apt install -yq twingate-connector
|
|
||||||
$STD systemctl restart twingate-connector
|
$STD systemctl restart twingate-connector
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD apt update --allow-releaseinfo-change
|
$STD apt update --allow-releaseinfo-change
|
||||||
$STD apt install -y unifi
|
ensure_dependencies unifi
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,12 +30,9 @@ function update_script() {
|
|||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
if ! dpkg -s chromium >/dev/null 2>&1; then
|
ensure_dependencies chromium
|
||||||
msg_info "Installing Chromium"
|
if [[ ! -L /opt/uptime-kuma/chromium ]]; then
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y chromium
|
|
||||||
ln -s /usr/bin/chromium /opt/uptime-kuma/chromium
|
ln -s /usr/bin/chromium /opt/uptime-kuma/chromium
|
||||||
msg_ok "Installed Chromium"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "uptime-kuma" "louislam/uptime-kuma"; then
|
if check_for_gh_release "uptime-kuma" "louislam/uptime-kuma"; then
|
||||||
|
|||||||
@@ -28,12 +28,8 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
VAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest |
|
VAULT=$(get_latest_github_release "dani-garcia/vaultwarden")
|
||||||
grep "tag_name" |
|
WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds")
|
||||||
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) }')
|
|
||||||
|
|
||||||
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \
|
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \
|
||||||
"1" "VaultWarden $VAULT" ON \
|
"1" "VaultWarden $VAULT" ON \
|
||||||
@@ -42,57 +38,70 @@ function update_script() {
|
|||||||
3>&1 1>&2 2>&3)
|
3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
if [ "$UPD" == "1" ]; then
|
if [ "$UPD" == "1" ]; then
|
||||||
msg_info "Stopping Service"
|
if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then
|
||||||
systemctl stop vaultwarden
|
msg_info "Stopping Service"
|
||||||
msg_ok "Stopped Service"
|
systemctl stop vaultwarden
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
|
||||||
cd ~ && rm -rf vaultwarden
|
|
||||||
$STD git clone https://github.com/dani-garcia/vaultwarden
|
msg_info "Updating VaultWarden to $VAULT (Patience)"
|
||||||
cd vaultwarden
|
cd /tmp/vaultwarden-src
|
||||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||||
DIR=/usr/bin/vaultwarden
|
if [[ -f /usr/bin/vaultwarden ]]; then
|
||||||
if [ -d "$DIR" ]; then
|
cp target/release/vaultwarden /usr/bin/
|
||||||
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
|
else
|
||||||
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
msg_ok "VaultWarden is already up-to-date"
|
||||||
fi
|
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
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UPD" == "2" ]; then
|
if [ "$UPD" == "2" ]; then
|
||||||
msg_info "Stopping Service"
|
if check_for_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds"; then
|
||||||
systemctl stop vaultwarden
|
msg_info "Stopping Service"
|
||||||
msg_ok "Stopped Service"
|
systemctl stop vaultwarden
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating Web-Vault to $WVRELEASE"
|
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
|
rm -rf /opt/vaultwarden/web-vault
|
||||||
$STD tar -zxf bw_web_"$WVRELEASE".tar.gz -C /opt/vaultwarden/
|
mkdir -p /opt/vaultwarden/web-vault
|
||||||
rm bw_web_"$WVRELEASE".tar.gz
|
|
||||||
msg_ok "Updated Web-Vault"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
|
||||||
systemctl start vaultwarden
|
|
||||||
msg_ok "Started Service"
|
chown -R root:root /opt/vaultwarden/web-vault/
|
||||||
msg_ok "Updated successfully!"
|
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
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UPD" == "3" ]; then
|
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 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 [[ -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)
|
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
|
sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env
|
||||||
if [[ -f /opt/vaultwarden/data/config.json ]]; then
|
if [[ -f /opt/vaultwarden/data/config.json ]]; then
|
||||||
sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
|
sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
|
||||||
fi
|
fi
|
||||||
systemctl restart vaultwarden
|
systemctl restart vaultwarden
|
||||||
|
msg_ok "Admin token updated"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -27,10 +27,7 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if ! [[ $(dpkg -s zstd 2>/dev/null) ]]; then
|
ensure_dependencies zstd
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y zstd
|
|
||||||
fi
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
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
|
# Dirty-Fix 03/2025 for missing APP_version.txt on old installations, set to pre-latest release
|
||||||
msg_info "Running Migration"
|
msg_info "Running Migration"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2025 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: Omar Minaya
|
# Author: Omar Minaya
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://wazuh.com/
|
# 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}"
|
||||||
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}"
|
||||||
84
frontend/bun.lock
generated
84
frontend/bun.lock
generated
@@ -20,6 +20,7 @@
|
|||||||
"@radix-ui/react-tabs": "^1.1.13",
|
"@radix-ui/react-tabs": "^1.1.13",
|
||||||
"@radix-ui/react-tooltip": "^1.2.8",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"@tanstack/react-query": "^5.90.12",
|
"@tanstack/react-query": "^5.90.12",
|
||||||
|
"@types/react-syntax-highlighter": "^15.5.13",
|
||||||
"chart.js": "^4.5.1",
|
"chart.js": "^4.5.1",
|
||||||
"chartjs-plugin-datalabels": "^2.2.0",
|
"chartjs-plugin-datalabels": "^2.2.0",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
@@ -41,6 +42,7 @@
|
|||||||
"react-day-picker": "^9.12.0",
|
"react-day-picker": "^9.12.0",
|
||||||
"react-dom": "19.2.3",
|
"react-dom": "19.2.3",
|
||||||
"react-icons": "^5.5.0",
|
"react-icons": "^5.5.0",
|
||||||
|
"react-syntax-highlighter": "^16.1.0",
|
||||||
"react-use-measure": "^2.1.7",
|
"react-use-measure": "^2.1.7",
|
||||||
"recharts": "3.6.0",
|
"recharts": "3.6.0",
|
||||||
"sharp": "^0.34.5",
|
"sharp": "^0.34.5",
|
||||||
@@ -552,7 +554,7 @@
|
|||||||
|
|
||||||
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
|
"@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=="],
|
"@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/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": ["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-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/stylis": ["@types/stylis@4.2.5", "", {}, "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="],
|
||||||
|
|
||||||
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
"@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": ["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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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-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=="],
|
"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-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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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-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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"@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/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=="],
|
"@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=="],
|
"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-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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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=="],
|
"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/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=="],
|
"@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-tabs": "^1.1.13",
|
||||||
"@radix-ui/react-tooltip": "^1.2.8",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"@tanstack/react-query": "^5.90.12",
|
"@tanstack/react-query": "^5.90.12",
|
||||||
|
"@types/react-syntax-highlighter": "^15.5.13",
|
||||||
"chart.js": "^4.5.1",
|
"chart.js": "^4.5.1",
|
||||||
"chartjs-plugin-datalabels": "^2.2.0",
|
"chartjs-plugin-datalabels": "^2.2.0",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
@@ -52,6 +53,7 @@
|
|||||||
"react-day-picker": "^9.12.0",
|
"react-day-picker": "^9.12.0",
|
||||||
"react-dom": "19.2.3",
|
"react-dom": "19.2.3",
|
||||||
"react-icons": "^5.5.0",
|
"react-icons": "^5.5.0",
|
||||||
|
"react-syntax-highlighter": "^16.1.0",
|
||||||
"react-use-measure": "^2.1.7",
|
"react-use-measure": "^2.1.7",
|
||||||
"recharts": "3.6.0",
|
"recharts": "3.6.0",
|
||||||
"sharp": "^0.34.5",
|
"sharp": "^0.34.5",
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 8083,
|
"interface_port": 8083,
|
||||||
"documentation": "https://github.com/gelbphoenix/autocaliweb/wiki",
|
"documentation": "https://codeberg.org/gelbphoenix/autocaliweb/wiki",
|
||||||
"config_path": "/etc/autocaliweb",
|
"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",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/autocaliweb.webp",
|
||||||
"description": "A modern web management system for eBooks, eComics and PDFs",
|
"description": "A modern web management system for eBooks, eComics and PDFs",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-02-01T12:08:49Z",
|
"generated": "2026-02-04T18:17:33Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -95,30 +95,30 @@
|
|||||||
{
|
{
|
||||||
"slug": "bar-assistant",
|
"slug": "bar-assistant",
|
||||||
"repo": "karlomikus/bar-assistant",
|
"repo": "karlomikus/bar-assistant",
|
||||||
"version": "v5.12.0",
|
"version": "v5.13.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-11T09:37:23Z"
|
"date": "2026-02-02T18:47:43Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "bazarr",
|
"slug": "bazarr",
|
||||||
"repo": "morpheus65535/bazarr",
|
"repo": "morpheus65535/bazarr",
|
||||||
"version": "v1.5.4",
|
"version": "v1.5.5",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-04T22:41:00Z"
|
"date": "2026-02-01T18:00:34Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "bentopdf",
|
"slug": "bentopdf",
|
||||||
"repo": "alam00000/bentopdf",
|
"repo": "alam00000/bentopdf",
|
||||||
"version": "v2.0.0",
|
"version": "v2.1.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T10:13:47Z"
|
"date": "2026-02-02T14:30:55Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "beszel",
|
"slug": "beszel",
|
||||||
"repo": "henrygd/beszel",
|
"repo": "henrygd/beszel",
|
||||||
"version": "v0.18.2",
|
"version": "v0.18.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-12T23:58:00Z"
|
"date": "2026-02-01T19:02:42Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "bitmagnet",
|
"slug": "bitmagnet",
|
||||||
@@ -158,9 +158,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "bytestash",
|
"slug": "bytestash",
|
||||||
"repo": "jordan-dalby/ByteStash",
|
"repo": "jordan-dalby/ByteStash",
|
||||||
"version": "v1.5.10",
|
"version": "v1.5.11",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-26T14:07:59Z"
|
"date": "2026-02-03T22:12:19Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "caddy",
|
"slug": "caddy",
|
||||||
@@ -186,9 +186,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "comfyui",
|
"slug": "comfyui",
|
||||||
"repo": "comfyanonymous/ComfyUI",
|
"repo": "comfyanonymous/ComfyUI",
|
||||||
"version": "v0.11.1",
|
"version": "v0.12.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T07:52:21Z"
|
"date": "2026-02-04T06:09:31Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "commafeed",
|
"slug": "commafeed",
|
||||||
@@ -242,9 +242,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "discopanel",
|
"slug": "discopanel",
|
||||||
"repo": "nickheyer/discopanel",
|
"repo": "nickheyer/discopanel",
|
||||||
"version": "v1.0.32",
|
"version": "v1.0.35",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T22:24:53Z"
|
"date": "2026-02-02T05:20:12Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "dispatcharr",
|
"slug": "dispatcharr",
|
||||||
@@ -256,9 +256,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "docmost",
|
"slug": "docmost",
|
||||||
"repo": "docmost/docmost",
|
"repo": "docmost/docmost",
|
||||||
"version": "v0.24.1",
|
"version": "v0.25.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-12-14T13:49:16Z"
|
"date": "2026-02-04T15:19:51Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "domain-locker",
|
"slug": "domain-locker",
|
||||||
@@ -291,9 +291,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "elementsynapse",
|
"slug": "elementsynapse",
|
||||||
"repo": "etkecc/synapse-admin",
|
"repo": "etkecc/synapse-admin",
|
||||||
"version": "v0.11.1-etke52",
|
"version": "v0.11.1-etke53",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-09T08:41:29Z"
|
"date": "2026-02-03T20:38:15Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "emby",
|
"slug": "emby",
|
||||||
@@ -312,9 +312,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "ersatztv",
|
"slug": "ersatztv",
|
||||||
"repo": "ErsatzTV/ErsatzTV",
|
"repo": "ErsatzTV/ErsatzTV",
|
||||||
"version": "v26.1.1",
|
"version": "v26.2.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-08T22:02:15Z"
|
"date": "2026-02-02T20:54:26Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "excalidraw",
|
"slug": "excalidraw",
|
||||||
@@ -375,9 +375,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "ghostfolio",
|
"slug": "ghostfolio",
|
||||||
"repo": "ghostfolio/ghostfolio",
|
"repo": "ghostfolio/ghostfolio",
|
||||||
"version": "2.234.0",
|
"version": "2.235.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-30T19:00:22Z"
|
"date": "2026-02-03T19:27:17Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "gitea",
|
"slug": "gitea",
|
||||||
@@ -487,9 +487,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "homebox",
|
"slug": "homebox",
|
||||||
"repo": "sysadminsmedia/homebox",
|
"repo": "sysadminsmedia/homebox",
|
||||||
"version": "v0.23.0",
|
"version": "v0.23.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-30T17:41:01Z"
|
"date": "2026-02-01T22:53:32Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "homepage",
|
"slug": "homepage",
|
||||||
@@ -515,9 +515,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "huntarr",
|
"slug": "huntarr",
|
||||||
"repo": "plexguide/Huntarr.io",
|
"repo": "plexguide/Huntarr.io",
|
||||||
"version": "9.1.5",
|
"version": "9.1.12",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T22:55:29Z"
|
"date": "2026-02-04T14:28:36Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "inspircd",
|
"slug": "inspircd",
|
||||||
@@ -536,16 +536,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "invoiceninja",
|
"slug": "invoiceninja",
|
||||||
"repo": "invoiceninja/invoiceninja",
|
"repo": "invoiceninja/invoiceninja",
|
||||||
"version": "v5.12.52",
|
"version": "v5.12.53",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-01T02:08:10Z"
|
"date": "2026-02-04T00:52:01Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
"repo": "Jackett/Jackett",
|
"repo": "Jackett/Jackett",
|
||||||
"version": "v0.24.1003",
|
"version": "v0.24.1027",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-01T05:55:30Z"
|
"date": "2026-02-04T05:56:22Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "joplin-server",
|
"slug": "joplin-server",
|
||||||
@@ -596,6 +596,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T18:10:59Z"
|
"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",
|
"slug": "koel",
|
||||||
"repo": "koel/koel",
|
"repo": "koel/koel",
|
||||||
@@ -662,9 +669,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "libretranslate",
|
"slug": "libretranslate",
|
||||||
"repo": "LibreTranslate/LibreTranslate",
|
"repo": "LibreTranslate/LibreTranslate",
|
||||||
"version": "v1.8.3",
|
"version": "v1.8.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-12-04T21:07:00Z"
|
"date": "2026-02-02T17:45:16Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "lidarr",
|
"slug": "lidarr",
|
||||||
@@ -739,9 +746,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "mealie",
|
"slug": "mealie",
|
||||||
"repo": "mealie-recipes/mealie",
|
"repo": "mealie-recipes/mealie",
|
||||||
"version": "v3.9.2",
|
"version": "v3.10.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-02T19:40:09Z"
|
"date": "2026-02-03T01:04:38Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "mediamanager",
|
"slug": "mediamanager",
|
||||||
@@ -760,9 +767,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "meilisearch",
|
"slug": "meilisearch",
|
||||||
"repo": "riccox/meilisearch-ui",
|
"repo": "riccox/meilisearch-ui",
|
||||||
"version": "v0.15.0",
|
"version": "v0.15.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T03:54:27Z"
|
"date": "2026-02-04T03:56:59Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "memos",
|
"slug": "memos",
|
||||||
@@ -774,9 +781,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "metube",
|
"slug": "metube",
|
||||||
"repo": "alexta69/metube",
|
"repo": "alexta69/metube",
|
||||||
"version": "2026.02.01",
|
"version": "2026.02.03",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-02-01T00:20:00Z"
|
"date": "2026-02-03T21:49:49Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "miniflux",
|
"slug": "miniflux",
|
||||||
@@ -816,16 +823,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "navidrome",
|
"slug": "navidrome",
|
||||||
"repo": "navidrome/navidrome",
|
"repo": "navidrome/navidrome",
|
||||||
"version": "v0.59.0",
|
"version": "v0.60.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-12-06T18:08:42Z"
|
"date": "2026-02-03T18:57:04Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "netbox",
|
"slug": "netbox",
|
||||||
"repo": "netbox-community/netbox",
|
"repo": "netbox-community/netbox",
|
||||||
"version": "v4.5.1",
|
"version": "v4.5.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-20T19:45:05Z"
|
"date": "2026-02-03T13:54:26Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "nocodb",
|
"slug": "nocodb",
|
||||||
@@ -872,9 +879,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "opengist",
|
"slug": "opengist",
|
||||||
"repo": "thomiceli/opengist",
|
"repo": "thomiceli/opengist",
|
||||||
"version": "v1.12.0",
|
"version": "v1.12.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-27T15:31:57Z"
|
"date": "2026-02-03T09:00:43Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "ots",
|
"slug": "ots",
|
||||||
@@ -1047,9 +1054,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "prometheus-alertmanager",
|
"slug": "prometheus-alertmanager",
|
||||||
"repo": "prometheus/alertmanager",
|
"repo": "prometheus/alertmanager",
|
||||||
"version": "v0.30.1",
|
"version": "v0.31.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-12T23:30:06Z"
|
"date": "2026-02-02T13:34:15Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "prometheus-blackbox-exporter",
|
"slug": "prometheus-blackbox-exporter",
|
||||||
@@ -1089,9 +1096,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pulse",
|
"slug": "pulse",
|
||||||
"repo": "rcourtman/Pulse",
|
"repo": "rcourtman/Pulse",
|
||||||
"version": "v5.0.17",
|
"version": "v5.1.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-20T19:07:30Z"
|
"date": "2026-02-04T17:43:59Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "pve-scripts-local",
|
"slug": "pve-scripts-local",
|
||||||
@@ -1177,6 +1184,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-12T05:38:30Z"
|
"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",
|
"slug": "sabnzbd",
|
||||||
"repo": "sabnzbd/sabnzbd",
|
"repo": "sabnzbd/sabnzbd",
|
||||||
@@ -1187,9 +1201,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "scanopy",
|
"slug": "scanopy",
|
||||||
"repo": "scanopy/scanopy",
|
"repo": "scanopy/scanopy",
|
||||||
"version": "v0.13.6",
|
"version": "v0.14.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-15T23:34:51Z"
|
"date": "2026-02-04T01:41:01Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "scraparr",
|
"slug": "scraparr",
|
||||||
@@ -1257,16 +1271,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "speedtest-tracker",
|
"slug": "speedtest-tracker",
|
||||||
"repo": "alexjustesen/speedtest-tracker",
|
"repo": "alexjustesen/speedtest-tracker",
|
||||||
"version": "v1.13.5",
|
"version": "v1.13.7",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-08T22:35:28Z"
|
"date": "2026-02-04T16:47:42Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "spoolman",
|
"slug": "spoolman",
|
||||||
"repo": "Donkie/Spoolman",
|
"repo": "Donkie/Spoolman",
|
||||||
"version": "v0.23.0",
|
"version": "v0.23.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-23T20:42:34Z"
|
"date": "2026-02-03T19:03:55Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "sportarr",
|
"slug": "sportarr",
|
||||||
@@ -1299,9 +1313,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tandoor",
|
"slug": "tandoor",
|
||||||
"repo": "TandoorRecipes/recipes",
|
"repo": "TandoorRecipes/recipes",
|
||||||
"version": "2.4.1",
|
"version": "2.4.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-30T06:52:26Z"
|
"date": "2026-02-01T12:52:37Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tasmoadmin",
|
"slug": "tasmoadmin",
|
||||||
@@ -1341,9 +1355,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "thingsboard",
|
"slug": "thingsboard",
|
||||||
"repo": "thingsboard/thingsboard",
|
"repo": "thingsboard/thingsboard",
|
||||||
"version": "v4.3",
|
"version": "v4.3.0.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-20T14:27:07Z"
|
"date": "2026-02-03T12:39:14Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "threadfin",
|
"slug": "threadfin",
|
||||||
@@ -1355,9 +1369,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tianji",
|
"slug": "tianji",
|
||||||
"repo": "msgbyte/tianji",
|
"repo": "msgbyte/tianji",
|
||||||
"version": "v1.31.9",
|
"version": "v1.31.10",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T18:22:40Z"
|
"date": "2026-02-04T17:21:04Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "traccar",
|
"slug": "traccar",
|
||||||
@@ -1397,9 +1411,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "trip",
|
"slug": "trip",
|
||||||
"repo": "itskovacs/TRIP",
|
"repo": "itskovacs/TRIP",
|
||||||
"version": "1.38.0",
|
"version": "1.38.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-31T15:56:30Z"
|
"date": "2026-02-04T18:10:15Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tududi",
|
"slug": "tududi",
|
||||||
@@ -1411,9 +1425,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tunarr",
|
"slug": "tunarr",
|
||||||
"repo": "chrisbenincasa/tunarr",
|
"repo": "chrisbenincasa/tunarr",
|
||||||
"version": "v1.1.11",
|
"version": "v1.1.12",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-30T22:34:30Z"
|
"date": "2026-02-03T20:19:00Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "uhf",
|
"slug": "uhf",
|
||||||
@@ -1457,12 +1471,19 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-10-22T17:03:54Z"
|
"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",
|
"slug": "victoriametrics",
|
||||||
"repo": "VictoriaMetrics/VictoriaMetrics",
|
"repo": "VictoriaMetrics/VictoriaMetrics",
|
||||||
"version": "v1.134.0",
|
"version": "v1.135.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-19T13:29:43Z"
|
"date": "2026-02-02T14:20:15Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "vikunja",
|
"slug": "vikunja",
|
||||||
@@ -1488,9 +1509,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "wanderer",
|
"slug": "wanderer",
|
||||||
"repo": "meilisearch/meilisearch",
|
"repo": "meilisearch/meilisearch",
|
||||||
"version": "v1.34.3",
|
"version": "v1.35.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-28T17:52:24Z"
|
"date": "2026-02-02T09:57:03Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "warracker",
|
"slug": "warracker",
|
||||||
@@ -1520,6 +1541,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-12-31T16:53:34Z"
|
"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",
|
"slug": "web-check",
|
||||||
"repo": "CrazyWolf13/web-check",
|
"repo": "CrazyWolf13/web-check",
|
||||||
@@ -1534,6 +1562,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-08T09:50:00Z"
|
"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",
|
"slug": "wizarr",
|
||||||
"repo": "wizarrrr/wizarr",
|
"repo": "wizarrrr/wizarr",
|
||||||
@@ -1541,6 +1576,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-12-09T14:30:23Z"
|
"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",
|
"slug": "yt-dlp-webui",
|
||||||
"repo": "marcopiovanello/yt-dlp-web-ui",
|
"repo": "marcopiovanello/yt-dlp-web-ui",
|
||||||
@@ -1558,9 +1600,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "zigbee2mqtt",
|
"slug": "zigbee2mqtt",
|
||||||
"repo": "Koenkk/zigbee2mqtt",
|
"repo": "Koenkk/zigbee2mqtt",
|
||||||
"version": "2.7.2",
|
"version": "2.8.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-01T13:43:47Z"
|
"date": "2026-02-01T19:27:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "zipline",
|
"slug": "zipline",
|
||||||
@@ -1586,9 +1628,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "zwave-js-ui",
|
"slug": "zwave-js-ui",
|
||||||
"repo": "zwave-js/zwave-js-ui",
|
"repo": "zwave-js/zwave-js-ui",
|
||||||
"version": "v11.10.1",
|
"version": "v11.11.0",
|
||||||
"pinned": false,
|
"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/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": []
|
||||||
|
}
|
||||||
@@ -13,6 +13,8 @@
|
|||||||
"website": "https://nginxproxymanager.com/",
|
"website": "https://nginxproxymanager.com/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nginx-proxy-manager.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nginx-proxy-manager.webp",
|
||||||
"config_path": "",
|
"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.",
|
"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": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
|
|||||||
51
frontend/public/json/rustypaste.json
Normal file
51
frontend/public/json/rustypaste.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"name": "RustyPaste",
|
||||||
|
"slug": "rustypaste",
|
||||||
|
"categories": [
|
||||||
|
11
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-02",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8000,
|
||||||
|
"documentation": "https://github.com/orhun/rustypaste",
|
||||||
|
"config_path": "/opt/rustypaste/config.toml",
|
||||||
|
"website": "https://github.com/orhun/rustypaste",
|
||||||
|
"logo": "https://github.com/orhun/rustypaste/raw/master/img/rustypaste_logo.png",
|
||||||
|
"description": "Rustypaste is a minimal file upload/pastebin service.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/rustypaste.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 20,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "alpine",
|
||||||
|
"script": "ct/alpine-rustypaste.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 256,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "Alpine",
|
||||||
|
"version": "3.23"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "When updating the script it will backup the whole project including all the uploaded files, make sure to extract it to a safe location or remove",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
"type": "info"
|
"type": "info"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"text": "The integrated daemon config is located at `/root/.config/daemon/config.json`",
|
"text": "The integrated daemon config is located at `/root/.config/daemon/`",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
52
frontend/public/json/sqlserver2025.json
Normal file
52
frontend/public/json/sqlserver2025.json
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"name": "SQL Server 2025",
|
||||||
|
"slug": "sqlserver2025",
|
||||||
|
"categories": [
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-04",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": true,
|
||||||
|
"interface_port": 1433,
|
||||||
|
"documentation": "https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver17",
|
||||||
|
"website": "https://www.microsoft.com/en-us/sql-server/sql-server-2025",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/microsoft-sql-server.webp",
|
||||||
|
"config_path": "",
|
||||||
|
"description": "Script to automatically set up a SQL Server 2025 installation with Ubuntu 24.04 support.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/sqlserver2025.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 10,
|
||||||
|
"os": "Ubuntu",
|
||||||
|
"version": "24.04"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "If you choose not to run the installation setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "You can setup the admin account 'SA' during installation",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Make sure you disable the SA account if you intend to use this in production!",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Ubuntu 24.04 support requires SQL Server 2025 CU1 or later",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
40
frontend/public/json/wealthfolio.json
Normal file
40
frontend/public/json/wealthfolio.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "Wealthfolio",
|
||||||
|
"slug": "wealthfolio",
|
||||||
|
"categories": [
|
||||||
|
23
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-03",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8080,
|
||||||
|
"documentation": "https://wealthfolio.app/docs/introduction/",
|
||||||
|
"config_path": "/opt/wealthfolio/.env",
|
||||||
|
"website": "https://wealthfolio.app/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/wealthfolio.webp",
|
||||||
|
"description": "Wealthfolio is a beautiful, privacy-focused investment tracker with local data storage. Track your portfolio across multiple accounts and asset types with detailed performance analytics, goal planning, and multi-currency support.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/wealthfolio.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 4,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 10,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": "See ~/wealthfolio.creds"
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Login password is stored in ~/wealthfolio.creds",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
35
frontend/public/json/wishlist.json
Normal file
35
frontend/public/json/wishlist.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "Wishlist",
|
||||||
|
"slug": "wishlist",
|
||||||
|
"categories": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-04",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 3280,
|
||||||
|
"documentation": "https://github.com/cmintey/wishlist/blob/main/README.md#getting-started",
|
||||||
|
"config_path": "/opt/wishlist/.env",
|
||||||
|
"website": "https://github.com/cmintey/wishlist",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cmintey-wishlist.webp",
|
||||||
|
"description": "Wishlist is a self-hosted wishlist application that you can share with your friends and family. You no longer have to wonder what to get your family for the holidays, simply check their wishlist and claim any available item!",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/wishlist.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 5,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
40
frontend/public/json/writefreely.json
Normal file
40
frontend/public/json/writefreely.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "WriteFreely",
|
||||||
|
"slug": "writefreely",
|
||||||
|
"categories": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"date_created": "2026-02-04",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": "https://writefreely.org/docs",
|
||||||
|
"config_path": "/opt/writefreely/config.ini",
|
||||||
|
"website": "https://writefreely.org/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/writefreely-light.webp",
|
||||||
|
"description": "WriteFreely is free and open source software for easily publishing writing on the web with support for the ActivityPub protocol. Use it to start a personal blog — or an entire community.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/writefreely.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 1024,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "After installation execute `writefreely user create --admin <username>:<password>` to create your user.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,320 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
||||||
import React, { useEffect, useState } from "react";
|
|
||||||
import { useRouter } from "next/navigation";
|
|
||||||
|
|
||||||
import type { Category } from "@/lib/types";
|
|
||||||
|
|
||||||
import { Card, CardContent } from "@/components/ui/card";
|
|
||||||
import { Button } from "@/components/ui/button";
|
|
||||||
import { Badge } from "@/components/ui/badge";
|
|
||||||
|
|
||||||
const defaultLogo = "/default-logo.png"; // Fallback logo path
|
|
||||||
const MAX_DESCRIPTION_LENGTH = 100; // Set max length for description
|
|
||||||
const MAX_LOGOS = 5; // Max logos to display at once
|
|
||||||
|
|
||||||
function formattedBadge(type: string) {
|
|
||||||
switch (type) {
|
|
||||||
case "vm":
|
|
||||||
return <Badge className="text-blue-500/75 border-blue-500/75 badge">VM</Badge>;
|
|
||||||
case "ct":
|
|
||||||
return <Badge className="text-yellow-500/75 border-yellow-500/75 badge">LXC</Badge>;
|
|
||||||
case "pve":
|
|
||||||
return <Badge className="text-orange-500/75 border-orange-500/75 badge">PVE</Badge>;
|
|
||||||
case "addon":
|
|
||||||
return <Badge className="text-green-500/75 border-green-500/75 badge">ADDON</Badge>;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function CategoryView() {
|
|
||||||
const [categories, setCategories] = useState<Category[]>([]);
|
|
||||||
const [selectedCategoryIndex, setSelectedCategoryIndex] = useState<number | null>(null);
|
|
||||||
const [currentScripts, setCurrentScripts] = useState<any[]>([]);
|
|
||||||
const [logoIndices, setLogoIndices] = useState<{ [key: string]: number }>({});
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const fetchCategories = async () => {
|
|
||||||
try {
|
|
||||||
// eslint-disable-next-line node/no-process-env
|
|
||||||
const basePath = process.env.NODE_ENV === "production" ? "/ProxmoxVE" : "";
|
|
||||||
const response = await fetch(`${basePath}/api/categories`);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error("Failed to fetch categories");
|
|
||||||
}
|
|
||||||
const data = await response.json();
|
|
||||||
setCategories(data);
|
|
||||||
|
|
||||||
// Initialize logo indices
|
|
||||||
const initialLogoIndices: { [key: string]: number } = {};
|
|
||||||
data.forEach((category: any) => {
|
|
||||||
initialLogoIndices[category.name] = 0;
|
|
||||||
});
|
|
||||||
setLogoIndices(initialLogoIndices);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
console.error("Error fetching categories:", error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchCategories();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const handleCategoryClick = (index: number) => {
|
|
||||||
setSelectedCategoryIndex(index);
|
|
||||||
setCurrentScripts(categories[index]?.scripts || []); // Update scripts for the selected category
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleBackClick = () => {
|
|
||||||
setSelectedCategoryIndex(null);
|
|
||||||
setCurrentScripts([]); // Clear scripts when going back
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleScriptClick = (scriptSlug: string) => {
|
|
||||||
// Include category context when navigating to scripts
|
|
||||||
const categoryName = selectedCategoryIndex !== null ? categories[selectedCategoryIndex]?.name : null;
|
|
||||||
const queryParams = new URLSearchParams({ id: scriptSlug });
|
|
||||||
if (categoryName) {
|
|
||||||
queryParams.append("category", categoryName);
|
|
||||||
}
|
|
||||||
router.push(`/scripts?${queryParams.toString()}`);
|
|
||||||
};
|
|
||||||
|
|
||||||
const navigateCategory = (direction: "prev" | "next") => {
|
|
||||||
if (selectedCategoryIndex !== null) {
|
|
||||||
const newIndex
|
|
||||||
= direction === "prev"
|
|
||||||
? (selectedCategoryIndex - 1 + categories.length) % categories.length
|
|
||||||
: (selectedCategoryIndex + 1) % categories.length;
|
|
||||||
setSelectedCategoryIndex(newIndex);
|
|
||||||
setCurrentScripts(categories[newIndex]?.scripts || []); // Update scripts for the new category
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const switchLogos = (categoryName: string, direction: "prev" | "next") => {
|
|
||||||
setLogoIndices((prev) => {
|
|
||||||
const currentIndex = prev[categoryName] || 0;
|
|
||||||
const category = categories.find(cat => cat.name === categoryName);
|
|
||||||
if (!category || !category.scripts)
|
|
||||||
return prev;
|
|
||||||
|
|
||||||
const totalLogos = category.scripts.length;
|
|
||||||
const newIndex
|
|
||||||
= direction === "prev"
|
|
||||||
? (currentIndex - MAX_LOGOS + totalLogos) % totalLogos
|
|
||||||
: (currentIndex + MAX_LOGOS) % totalLogos;
|
|
||||||
|
|
||||||
return { ...prev, [categoryName]: newIndex };
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const truncateDescription = (text: string) => {
|
|
||||||
return text.length > MAX_DESCRIPTION_LENGTH ? `${text.slice(0, MAX_DESCRIPTION_LENGTH)}...` : text;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderResources = (script: any) => {
|
|
||||||
const cpu = script.install_methods[0]?.resources.cpu;
|
|
||||||
const ram = script.install_methods[0]?.resources.ram;
|
|
||||||
const hdd = script.install_methods[0]?.resources.hdd;
|
|
||||||
|
|
||||||
const resourceParts = [];
|
|
||||||
if (cpu) {
|
|
||||||
resourceParts.push(
|
|
||||||
<span key="cpu">
|
|
||||||
<b>CPU:</b>
|
|
||||||
{" "}
|
|
||||||
{cpu}
|
|
||||||
vCPU
|
|
||||||
</span>,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (ram) {
|
|
||||||
resourceParts.push(
|
|
||||||
<span key="ram">
|
|
||||||
<b>RAM:</b>
|
|
||||||
{" "}
|
|
||||||
{ram}
|
|
||||||
MB
|
|
||||||
</span>,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (hdd) {
|
|
||||||
resourceParts.push(
|
|
||||||
<span key="hdd">
|
|
||||||
<b>HDD:</b>
|
|
||||||
{" "}
|
|
||||||
{hdd}
|
|
||||||
GB
|
|
||||||
</span>,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return resourceParts.length > 0
|
|
||||||
? (
|
|
||||||
<div className="text-sm text-gray-400">
|
|
||||||
{resourceParts.map((part, index) => (
|
|
||||||
<React.Fragment key={index}>
|
|
||||||
{part}
|
|
||||||
{index < resourceParts.length - 1 && " | "}
|
|
||||||
</React.Fragment>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
: null;
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="p-6 mt-20">
|
|
||||||
{categories.length === 0 && (
|
|
||||||
<p className="text-center text-gray-500">No categories available. Please check the API endpoint.</p>
|
|
||||||
)}
|
|
||||||
{selectedCategoryIndex !== null
|
|
||||||
? (
|
|
||||||
<div>
|
|
||||||
{/* Header with Navigation */}
|
|
||||||
<div className="flex items-center justify-between mb-6">
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
onClick={() => navigateCategory("prev")}
|
|
||||||
className="p-2 transition-transform duration-300 hover:scale-105"
|
|
||||||
>
|
|
||||||
<ChevronLeft className="h-6 w-6" />
|
|
||||||
</Button>
|
|
||||||
<h2 className="text-3xl font-semibold transition-opacity duration-300 hover:opacity-90">
|
|
||||||
{categories[selectedCategoryIndex].name}
|
|
||||||
</h2>
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
onClick={() => navigateCategory("next")}
|
|
||||||
className="p-2 transition-transform duration-300 hover:scale-105"
|
|
||||||
>
|
|
||||||
<ChevronRight className="h-6 w-6" />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Scripts Grid */}
|
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6">
|
|
||||||
{currentScripts
|
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
|
||||||
.map(script => (
|
|
||||||
<Card
|
|
||||||
key={script.name}
|
|
||||||
className="p-4 cursor-pointer hover:shadow-md transition-shadow duration-300"
|
|
||||||
onClick={() => handleScriptClick(script.slug)}
|
|
||||||
>
|
|
||||||
<CardContent className="flex flex-col gap-4">
|
|
||||||
<h3 className="text-lg font-bold script-text text-center hover:text-blue-600 transition-colors duration-300">
|
|
||||||
{script.name}
|
|
||||||
</h3>
|
|
||||||
<img
|
|
||||||
src={script.logo || defaultLogo}
|
|
||||||
alt={script.name || "Script logo"}
|
|
||||||
className="h-12 w-12 object-contain mx-auto"
|
|
||||||
/>
|
|
||||||
<p className="text-sm text-gray-500 text-center">
|
|
||||||
<b>Created at:</b>
|
|
||||||
{" "}
|
|
||||||
{script.date_created || "No date available"}
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
className="text-sm text-gray-700 hover:text-gray-900 text-center transition-colors duration-300"
|
|
||||||
title={script.description || "No description available."}
|
|
||||||
>
|
|
||||||
{truncateDescription(script.description || "No description available.")}
|
|
||||||
</p>
|
|
||||||
{renderResources(script)}
|
|
||||||
</CardContent>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Back to Categories Button */}
|
|
||||||
<div className="mt-8 text-center">
|
|
||||||
<Button
|
|
||||||
variant="default"
|
|
||||||
onClick={handleBackClick}
|
|
||||||
className="px-6 py-2 text-white bg-blue-600 hover:bg-blue-700 rounded-lg shadow-md transition-transform duration-300 hover:scale-105"
|
|
||||||
>
|
|
||||||
Back to Categories
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
: (
|
|
||||||
<div>
|
|
||||||
{/* Categories Grid */}
|
|
||||||
<div className="flex justify-between items-center mb-8">
|
|
||||||
<h1 className="text-3xl font-semibold mb-4">Categories</h1>
|
|
||||||
<p className="text-sm text-gray-500">
|
|
||||||
{categories.reduce((total, category) => total + (category.scripts?.length || 0), 0)}
|
|
||||||
{" "}
|
|
||||||
Total scripts
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-8">
|
|
||||||
{categories.map((category, index) => (
|
|
||||||
<Card
|
|
||||||
key={category.name}
|
|
||||||
onClick={() => handleCategoryClick(index)}
|
|
||||||
className="cursor-pointer hover:shadow-lg flex flex-col items-center justify-center py-6 transition-shadow duration-300"
|
|
||||||
>
|
|
||||||
<CardContent className="flex flex-col items-center">
|
|
||||||
<h3 className="text-xl font-bold mb-4 category-title transition-colors duration-300 hover:text-blue-600">
|
|
||||||
{category.name}
|
|
||||||
</h3>
|
|
||||||
<div className="flex justify-center items-center gap-2 mb-4">
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
switchLogos(category.name, "prev");
|
|
||||||
}}
|
|
||||||
className="p-1 transition-transform duration-300 hover:scale-110"
|
|
||||||
>
|
|
||||||
<ChevronLeft className="h-4 w-4" />
|
|
||||||
</Button>
|
|
||||||
{category.scripts
|
|
||||||
&& category.scripts
|
|
||||||
.slice(logoIndices[category.name] || 0, (logoIndices[category.name] || 0) + MAX_LOGOS)
|
|
||||||
.map((script, i) => (
|
|
||||||
<div key={i} className="flex flex-col items-center">
|
|
||||||
<img
|
|
||||||
src={script.logo || defaultLogo}
|
|
||||||
alt={script.name || "Script logo"}
|
|
||||||
title={script.name}
|
|
||||||
className="h-8 w-8 object-contain cursor-pointer"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
handleScriptClick(script.slug);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{formattedBadge(script.type)}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
switchLogos(category.name, "next");
|
|
||||||
}}
|
|
||||||
className="p-1 transition-transform duration-300 hover:scale-110"
|
|
||||||
>
|
|
||||||
<ChevronRight className="h-4 w-4" />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-gray-400 text-center">
|
|
||||||
{(category as any).description || "No description available."}
|
|
||||||
</p>
|
|
||||||
</CardContent>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CategoryView;
|
|
||||||
@@ -94,7 +94,8 @@ const chartConfigApps = {
|
|||||||
export default function DataPage() {
|
export default function DataPage() {
|
||||||
const [data, setData] = useState<DataModel[]>([]);
|
const [data, setData] = useState<DataModel[]>([]);
|
||||||
const [summary, setSummary] = useState<SummaryData | null>(null);
|
const [summary, setSummary] = useState<SummaryData | null>(null);
|
||||||
const [loading, setLoading] = useState<boolean>(true);
|
const [summaryLoading, setSummaryLoading] = useState<boolean>(true);
|
||||||
|
const [dataLoading, setDataLoading] = useState<boolean>(true);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
const [itemsPerPage, setItemsPerPage] = useState(25);
|
const [itemsPerPage, setItemsPerPage] = useState(25);
|
||||||
@@ -105,35 +106,40 @@ export default function DataPage() {
|
|||||||
|
|
||||||
const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 });
|
const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 });
|
||||||
|
|
||||||
|
// Fetch summary only once on mount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
const fetchSummary = async () => {
|
||||||
setLoading(true);
|
|
||||||
try {
|
try {
|
||||||
const [summaryRes, dataRes] = await Promise.all([
|
const summaryRes = await fetch("https://api.htl-braunau.at/data/summary");
|
||||||
fetch("https://api.htl-braunau.at/data/summary"),
|
|
||||||
fetch(
|
|
||||||
`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${
|
|
||||||
itemsPerPage === 0 ? "" : itemsPerPage
|
|
||||||
}`,
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!summaryRes.ok) {
|
if (!summaryRes.ok) {
|
||||||
throw new Error(`Failed to fetch summary: ${summaryRes.statusText}`);
|
throw new Error(`Failed to fetch summary: ${summaryRes.statusText}`);
|
||||||
}
|
}
|
||||||
|
const summaryData: SummaryData = await summaryRes.json();
|
||||||
|
setSummary(summaryData);
|
||||||
|
} catch (err) {
|
||||||
|
setError((err as Error).message);
|
||||||
|
} finally {
|
||||||
|
setSummaryLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fetchSummary();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchData = async () => {
|
||||||
|
setDataLoading(true);
|
||||||
|
try {
|
||||||
|
const dataRes = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage}`);
|
||||||
if (!dataRes.ok) {
|
if (!dataRes.ok) {
|
||||||
throw new Error(`Failed to fetch data: ${dataRes.statusText}`);
|
throw new Error(`Failed to fetch data: ${dataRes.statusText}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const summaryData: SummaryData = await summaryRes.json();
|
|
||||||
const pageData: DataModel[] = await dataRes.json();
|
const pageData: DataModel[] = await dataRes.json();
|
||||||
|
|
||||||
setSummary(summaryData);
|
|
||||||
setData(pageData);
|
setData(pageData);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError((err as Error).message);
|
setError((err as Error).message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setDataLoading(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -306,7 +312,7 @@ export default function DataPage() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="pl-2">
|
<CardContent className="pl-2">
|
||||||
<div className="h-[300px] w-full">
|
<div className="h-[300px] w-full">
|
||||||
{loading ? (
|
{summaryLoading ? (
|
||||||
<div className="flex h-full w-full items-center justify-center">
|
<div className="flex h-full w-full items-center justify-center">
|
||||||
<Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
|
<Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
|
||||||
</div>
|
</div>
|
||||||
@@ -411,7 +417,7 @@ export default function DataPage() {
|
|||||||
</TableRow>
|
</TableRow>
|
||||||
</TableHeader>
|
</TableHeader>
|
||||||
<TableBody>
|
<TableBody>
|
||||||
{loading ? (
|
{dataLoading ? (
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<TableCell colSpan={8} className="h-24 text-center">
|
<TableCell colSpan={8} className="h-24 text-center">
|
||||||
<div className="flex items-center justify-center gap-2">
|
<div className="flex items-center justify-center gap-2">
|
||||||
@@ -478,7 +484,7 @@ export default function DataPage() {
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
size="sm"
|
size="sm"
|
||||||
onClick={() => setCurrentPage((prev) => Math.max(prev - 1, 1))}
|
onClick={() => setCurrentPage((prev) => Math.max(prev - 1, 1))}
|
||||||
disabled={currentPage === 1 || loading}
|
disabled={currentPage === 1 || dataLoading}
|
||||||
>
|
>
|
||||||
<ChevronLeft className="mr-2 h-4 w-4" />
|
<ChevronLeft className="mr-2 h-4 w-4" />
|
||||||
Previous
|
Previous
|
||||||
@@ -488,7 +494,7 @@ export default function DataPage() {
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
size="sm"
|
size="sm"
|
||||||
onClick={() => setCurrentPage((prev) => prev + 1)}
|
onClick={() => setCurrentPage((prev) => prev + 1)}
|
||||||
disabled={loading || sortedData.length < itemsPerPage}
|
disabled={dataLoading || sortedData.length < itemsPerPage}
|
||||||
>
|
>
|
||||||
Next
|
Next
|
||||||
<ChevronRight className="ml-2 h-4 w-4" />
|
<ChevronRight className="ml-2 h-4 w-4" />
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ function Note({
|
|||||||
const addNote = useCallback(() => {
|
const addNote = useCallback(() => {
|
||||||
setScript({
|
setScript({
|
||||||
...script,
|
...script,
|
||||||
notes: [...script.notes, { text: "", type: "" }],
|
notes: [...script.notes, { text: "", type: "info" }],
|
||||||
});
|
});
|
||||||
}, [script, setScript]);
|
}, [script, setScript]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
import { AlertColors } from "@/config/site-config";
|
||||||
|
|
||||||
export const InstallMethodSchema = z.object({
|
export const InstallMethodSchema = z.object({
|
||||||
type: z.enum(["default", "alpine"], {
|
type: z.enum(["default", "alpine"], {
|
||||||
@@ -16,7 +17,9 @@ export const InstallMethodSchema = z.object({
|
|||||||
|
|
||||||
const NoteSchema = z.object({
|
const NoteSchema = z.object({
|
||||||
text: z.string().min(1, "Note text cannot be empty"),
|
text: z.string().min(1, "Note text cannot be empty"),
|
||||||
type: z.string().min(1, "Note type cannot be empty"),
|
type: z.enum(Object.keys(AlertColors) as [keyof typeof AlertColors, ...(keyof typeof AlertColors)[]], {
|
||||||
|
message: `Type must be one of: ${Object.keys(AlertColors).join(", ")}`,
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const ScriptSchema = z.object({
|
export const ScriptSchema = z.object({
|
||||||
@@ -31,8 +34,8 @@ export const ScriptSchema = z.object({
|
|||||||
privileged: z.boolean(),
|
privileged: z.boolean(),
|
||||||
interface_port: z.number().nullable(),
|
interface_port: z.number().nullable(),
|
||||||
documentation: z.string().nullable(),
|
documentation: z.string().nullable(),
|
||||||
website: z.string().url().nullable(),
|
website: z.url().nullable(),
|
||||||
logo: z.string().url().nullable(),
|
logo: z.url().nullable(),
|
||||||
config_path: z.string(),
|
config_path: z.string(),
|
||||||
description: z.string().min(1, "Description is required"),
|
description: z.string().min(1, "Description is required"),
|
||||||
disable: z.boolean().optional(),
|
disable: z.boolean().optional(),
|
||||||
@@ -42,7 +45,7 @@ export const ScriptSchema = z.object({
|
|||||||
username: z.string().nullable(),
|
username: z.string().nullable(),
|
||||||
password: z.string().nullable(),
|
password: z.string().nullable(),
|
||||||
}),
|
}),
|
||||||
notes: z.array(NoteSchema),
|
notes: z.array(NoteSchema).optional().default([]),
|
||||||
}).refine((data) => {
|
}).refine((data) => {
|
||||||
if (data.disable === true && !data.disable_description) {
|
if (data.disable === true && !data.disable_description) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { Button } from "@/components/ui/button";
|
|||||||
import { Switch } from "@/components/ui/switch";
|
import { Switch } from "@/components/ui/switch";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { Label } from "@/components/ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
||||||
import { fetchCategories } from "@/lib/data";
|
import { fetchCategories } from "@/lib/data";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
@@ -28,11 +29,15 @@ import { ScriptSchema } from "./_schemas/schemas";
|
|||||||
import Categories from "./_components/categories";
|
import Categories from "./_components/categories";
|
||||||
import Note from "./_components/note";
|
import Note from "./_components/note";
|
||||||
|
|
||||||
|
import { nord } from "react-syntax-highlighter/dist/esm/styles/hljs";
|
||||||
|
import SyntaxHighlighter from "react-syntax-highlighter";
|
||||||
|
import { ScriptItem } from "../scripts/_components/script-item";
|
||||||
|
|
||||||
const initialScript: Script = {
|
const initialScript: Script = {
|
||||||
name: "",
|
name: "",
|
||||||
slug: "",
|
slug: "",
|
||||||
categories: [],
|
categories: [],
|
||||||
date_created: "",
|
date_created: format(new Date(), "yyyy-MM-dd"),
|
||||||
type: "ct",
|
type: "ct",
|
||||||
updateable: false,
|
updateable: false,
|
||||||
privileged: false,
|
privileged: false,
|
||||||
@@ -57,6 +62,7 @@ export default function JSONGenerator() {
|
|||||||
const [isCopied, setIsCopied] = useState(false);
|
const [isCopied, setIsCopied] = useState(false);
|
||||||
const [isValid, setIsValid] = useState(false);
|
const [isValid, setIsValid] = useState(false);
|
||||||
const [categories, setCategories] = useState<Category[]>([]);
|
const [categories, setCategories] = useState<Category[]>([]);
|
||||||
|
const [currentTab, setCurrentTab] = useState<"json" | "preview">("json");
|
||||||
const [zodErrors, setZodErrors] = useState<z.ZodError | null>(null);
|
const [zodErrors, setZodErrors] = useState<z.ZodError | null>(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -65,6 +71,13 @@ export default function JSONGenerator() {
|
|||||||
.catch((error) => console.error("Error fetching categories:", error));
|
.catch((error) => console.error("Error fetching categories:", error));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!isValid && currentTab === "preview") {
|
||||||
|
setCurrentTab("json");
|
||||||
|
toast.error("Switched to JSON tab due to invalid configuration.");
|
||||||
|
}
|
||||||
|
}, [isValid, currentTab]);
|
||||||
|
|
||||||
const updateScript = useCallback((key: keyof Script, value: Script[keyof Script]) => {
|
const updateScript = useCallback((key: keyof Script, value: Script[keyof Script]) => {
|
||||||
setScript((prev) => {
|
setScript((prev) => {
|
||||||
const updated = { ...prev, [key]: value };
|
const updated = { ...prev, [key]: value };
|
||||||
@@ -98,13 +111,18 @@ export default function JSONGenerator() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const handleCopy = useCallback(() => {
|
const handleCopy = useCallback(() => {
|
||||||
|
if (!isValid) toast.warning("JSON schema is invalid. Copying anyway.");
|
||||||
navigator.clipboard.writeText(JSON.stringify(script, null, 2));
|
navigator.clipboard.writeText(JSON.stringify(script, null, 2));
|
||||||
setIsCopied(true);
|
setIsCopied(true);
|
||||||
setTimeout(() => setIsCopied(false), 2000);
|
setTimeout(() => setIsCopied(false), 2000);
|
||||||
toast.success("Copied metadata to clipboard");
|
if (isValid) toast.success("Copied metadata to clipboard");
|
||||||
}, [script]);
|
}, [script]);
|
||||||
|
|
||||||
const handleDownload = useCallback(() => {
|
const handleDownload = useCallback(() => {
|
||||||
|
if (isValid === false) {
|
||||||
|
toast.error("Cannot download invalid JSON");
|
||||||
|
return;
|
||||||
|
}
|
||||||
const jsonString = JSON.stringify(script, null, 2);
|
const jsonString = JSON.stringify(script, null, 2);
|
||||||
const blob = new Blob([jsonString], { type: "application/json" });
|
const blob = new Blob([jsonString], { type: "application/json" });
|
||||||
const url = URL.createObjectURL(blob);
|
const url = URL.createObjectURL(blob);
|
||||||
@@ -175,7 +193,7 @@ export default function JSONGenerator() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<Label>
|
<Label>
|
||||||
Logo <span className="text-red-500">*</span>
|
Logo
|
||||||
</Label>
|
</Label>
|
||||||
<Input
|
<Input
|
||||||
placeholder="Full logo URL"
|
placeholder="Full logo URL"
|
||||||
@@ -188,7 +206,7 @@ export default function JSONGenerator() {
|
|||||||
<Input
|
<Input
|
||||||
placeholder="Path to config file"
|
placeholder="Path to config file"
|
||||||
value={script.config_path || ""}
|
value={script.config_path || ""}
|
||||||
onChange={(e) => updateScript("config_path", e.target.value || null)}
|
onChange={(e) => updateScript("config_path", e.target.value || "")}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -204,7 +222,9 @@ export default function JSONGenerator() {
|
|||||||
<Categories script={script} setScript={setScript} categories={categories} />
|
<Categories script={script} setScript={setScript} categories={categories} />
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<div className="flex flex-col gap-2 w-full">
|
<div className="flex flex-col gap-2 w-full">
|
||||||
<Label>Date Created</Label>
|
<Label>
|
||||||
|
Date Created <span className="text-red-500">*</span>
|
||||||
|
</Label>
|
||||||
<Popover>
|
<Popover>
|
||||||
<PopoverTrigger asChild className="flex-1">
|
<PopoverTrigger asChild className="flex-1">
|
||||||
<Button
|
<Button
|
||||||
@@ -220,7 +240,7 @@ export default function JSONGenerator() {
|
|||||||
mode="single"
|
mode="single"
|
||||||
selected={new Date(script.date_created)}
|
selected={new Date(script.date_created)}
|
||||||
onSelect={handleDateSelect}
|
onSelect={handleDateSelect}
|
||||||
initialFocus
|
autoFocus
|
||||||
/>
|
/>
|
||||||
</PopoverContent>
|
</PopoverContent>
|
||||||
</Popover>
|
</Popover>
|
||||||
@@ -313,21 +333,41 @@ export default function JSONGenerator() {
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-1/2 p-4 bg-background overflow-y-auto">
|
<div className="w-1/2 p-4 bg-background overflow-y-auto">
|
||||||
{validationAlert}
|
<Tabs
|
||||||
<div className="relative">
|
defaultValue="json"
|
||||||
<div className="absolute right-2 top-2 flex gap-1">
|
className="w-full"
|
||||||
<Button size="icon" variant="outline" onClick={handleCopy}>
|
onValueChange={(value) => setCurrentTab(value as "json" | "preview")}
|
||||||
{isCopied ? <Check className="h-4 w-4" /> : <Clipboard className="h-4 w-4" />}
|
value={currentTab}
|
||||||
</Button>
|
>
|
||||||
<Button size="icon" variant="outline" onClick={handleDownload}>
|
<TabsList className="grid w-full grid-cols-2">
|
||||||
<Download className="h-4 w-4" />
|
<TabsTrigger value="json">JSON</TabsTrigger>
|
||||||
</Button>
|
<TabsTrigger disabled={!isValid} value="preview">Preview</TabsTrigger>
|
||||||
</div>
|
</TabsList>
|
||||||
|
<TabsContent value="json" className="h-full w-full">
|
||||||
|
{validationAlert}
|
||||||
|
<div className="relative">
|
||||||
|
<div className="absolute right-2 top-2 flex gap-1">
|
||||||
|
<Button size="icon" variant="outline" onClick={handleCopy}>
|
||||||
|
{isCopied ? <Check className="h-4 w-4" /> : <Clipboard className="h-4 w-4" />}
|
||||||
|
</Button>
|
||||||
|
<Button size="icon" variant="outline" onClick={handleDownload}>
|
||||||
|
<Download className="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll">
|
<SyntaxHighlighter
|
||||||
{JSON.stringify(script, null, 2)}
|
language="json"
|
||||||
</pre>
|
style={nord}
|
||||||
</div>
|
className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll"
|
||||||
|
>
|
||||||
|
{JSON.stringify(script, null, 2)}
|
||||||
|
</SyntaxHighlighter>
|
||||||
|
</div>
|
||||||
|
</TabsContent>
|
||||||
|
<TabsContent value="preview" className="h-full w-full">
|
||||||
|
<ScriptItem item={script} />
|
||||||
|
</TabsContent>
|
||||||
|
</Tabs>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import { X, HelpCircle } from "lucide-react";
|
|||||||
import { Suspense } from "react";
|
import { Suspense } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
|
||||||
import type { AppVersion, Script } from "@/lib/types";
|
import type { AppVersion } from "@/lib/types";
|
||||||
|
import type { Script } from "@/app/json-editor/_schemas/schemas";
|
||||||
|
|
||||||
import { Separator } from "@/components/ui/separator";
|
import { Separator } from "@/components/ui/separator";
|
||||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
|
||||||
@@ -26,7 +27,6 @@ import Alerts from "./script-items/alerts";
|
|||||||
|
|
||||||
type ScriptItemProps = {
|
type ScriptItemProps = {
|
||||||
item: Script;
|
item: Script;
|
||||||
setSelectedScript: (script: string | null) => void;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function ScriptHeader({ item }: { item: Script }) {
|
function ScriptHeader({ item }: { item: Script }) {
|
||||||
@@ -135,25 +135,10 @@ function VersionInfo({ item }: { item: Script }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
export function ScriptItem({ item }: ScriptItemProps) {
|
||||||
const closeScript = () => {
|
|
||||||
window.history.pushState({}, document.title, window.location.pathname);
|
|
||||||
setSelectedScript(null);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full mx-auto">
|
<div className="w-full mx-auto">
|
||||||
<div className="flex w-full flex-col">
|
<div className="flex w-full flex-col">
|
||||||
<div className="mb-3 flex items-center justify-between">
|
|
||||||
<h2 className="text-2xl font-semibold tracking-tight text-foreground/90">Selected Script</h2>
|
|
||||||
<button
|
|
||||||
onClick={closeScript}
|
|
||||||
className="rounded-full p-2 text-muted-foreground hover:bg-card/50 transition-colors"
|
|
||||||
>
|
|
||||||
<X className="h-5 w-5" />
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="rounded-xl border border-border bg-accent/30 backdrop-blur-sm shadow-sm">
|
<div className="rounded-xl border border-border bg-accent/30 backdrop-blur-sm shadow-sm">
|
||||||
<div className="p-6 space-y-6">
|
<div className="p-6 space-y-6">
|
||||||
<Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}>
|
<Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}>
|
||||||
@@ -162,7 +147,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
|||||||
|
|
||||||
{item.disable && item.disable_description && (
|
{item.disable && item.disable_description && (
|
||||||
<DisableDescription item={item} />
|
<DisableDescription item={item} />
|
||||||
) }
|
)}
|
||||||
|
|
||||||
{!item.disable && (
|
{!item.disable && (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { Suspense, useEffect, useState } from "react";
|
import { Suspense, useEffect, useState } from "react";
|
||||||
import { Loader2 } from "lucide-react";
|
import { Loader2, X } from "lucide-react";
|
||||||
import { useQueryState } from "nuqs";
|
import { useQueryState } from "nuqs";
|
||||||
|
|
||||||
import type { Category, Script } from "@/lib/types";
|
import type { Category, Script } from "@/lib/types";
|
||||||
@@ -20,6 +20,11 @@ function ScriptContent() {
|
|||||||
const [item, setItem] = useState<Script>();
|
const [item, setItem] = useState<Script>();
|
||||||
const [latestPage, setLatestPage] = useState(1);
|
const [latestPage, setLatestPage] = useState(1);
|
||||||
|
|
||||||
|
const closeScript = () => {
|
||||||
|
window.history.pushState({}, document.title, window.location.pathname);
|
||||||
|
setSelectedScript(null);
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (selectedScript && links.length > 0) {
|
if (selectedScript && links.length > 0) {
|
||||||
const script = links
|
const script = links
|
||||||
@@ -53,7 +58,18 @@ function ScriptContent() {
|
|||||||
<div className="px-4 w-full sm:max-w-[calc(100%-350px-16px)]">
|
<div className="px-4 w-full sm:max-w-[calc(100%-350px-16px)]">
|
||||||
{selectedScript && item
|
{selectedScript && item
|
||||||
? (
|
? (
|
||||||
<ScriptItem item={item} setSelectedScript={setSelectedScript} />
|
<div className="flex w-full flex-col">
|
||||||
|
<div className="mb-3 flex items-center justify-between">
|
||||||
|
<h2 className="text-2xl font-semibold tracking-tight text-foreground/90">Selected Script</h2>
|
||||||
|
<button
|
||||||
|
onClick={closeScript}
|
||||||
|
className="rounded-full p-2 text-muted-foreground hover:bg-card/50 transition-colors"
|
||||||
|
>
|
||||||
|
<X className="h-5 w-5" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<ScriptItem item={item} />
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
: (
|
: (
|
||||||
<div className="flex w-full flex-col gap-5">
|
<div className="flex w-full flex-col gap-5">
|
||||||
|
|||||||
@@ -23,6 +23,34 @@ import { Button } from "./ui/button";
|
|||||||
import { Badge } from "./ui/badge";
|
import { Badge } from "./ui/badge";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
|
||||||
|
function search(scripts: Script[], query: string): Script[] {
|
||||||
|
const queryLower = query.toLowerCase().trim();
|
||||||
|
const searchWords = queryLower.split(/\s+/).filter(Boolean);
|
||||||
|
|
||||||
|
return scripts
|
||||||
|
.map(script => {
|
||||||
|
const nameLower = script.name.toLowerCase();
|
||||||
|
const descriptionLower = (script.description || "").toLowerCase();
|
||||||
|
|
||||||
|
let score = 0;
|
||||||
|
|
||||||
|
for (const word of searchWords) {
|
||||||
|
if (nameLower.includes(word)) {
|
||||||
|
score += 10;
|
||||||
|
}
|
||||||
|
if (descriptionLower.includes(word)) {
|
||||||
|
score += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { script, score };
|
||||||
|
})
|
||||||
|
.filter(({ score }) => score > 0)
|
||||||
|
.sort((a, b) => b.score - a.score)
|
||||||
|
.slice(0, 20)
|
||||||
|
.map(({ script }) => script);
|
||||||
|
}
|
||||||
|
|
||||||
export function formattedBadge(type: string) {
|
export function formattedBadge(type: string) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "vm":
|
case "vm":
|
||||||
@@ -51,9 +79,11 @@ function getRandomScript(categories: Category[], previouslySelected: Set<string>
|
|||||||
}
|
}
|
||||||
|
|
||||||
function CommandMenu() {
|
function CommandMenu() {
|
||||||
|
const [query, setQuery] = React.useState("");
|
||||||
const [open, setOpen] = React.useState(false);
|
const [open, setOpen] = React.useState(false);
|
||||||
const [links, setLinks] = React.useState<Category[]>([]);
|
const [links, setLinks] = React.useState<Category[]>([]);
|
||||||
const [isLoading, setIsLoading] = React.useState(false);
|
const [isLoading, setIsLoading] = React.useState(false);
|
||||||
|
const [results, setResults] = React.useState<Script[]>([]);
|
||||||
const [selectedScripts, setSelectedScripts] = React.useState<Set<string>>(new Set());
|
const [selectedScripts, setSelectedScripts] = React.useState<Set<string>>(new Set());
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@@ -70,6 +100,27 @@ function CommandMenu() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (query.trim() === "") {
|
||||||
|
fetchSortedCategories();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const scriptMap = new Map<string, Script>();
|
||||||
|
|
||||||
|
for (const category of links) {
|
||||||
|
for (const script of category.scripts || []) {
|
||||||
|
if (!scriptMap.has(script.slug)) {
|
||||||
|
scriptMap.set(script.slug, script);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const uniqueScripts = Array.from(scriptMap.values());
|
||||||
|
const filteredResults = search(uniqueScripts, query);
|
||||||
|
setResults(filteredResults);
|
||||||
|
}
|
||||||
|
}, [query]);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
const handleKeyDown = (e: KeyboardEvent) => {
|
const handleKeyDown = (e: KeyboardEvent) => {
|
||||||
if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
|
if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
|
||||||
@@ -197,20 +248,20 @@ function CommandMenu() {
|
|||||||
|
|
||||||
<CommandDialog
|
<CommandDialog
|
||||||
open={open}
|
open={open}
|
||||||
onOpenChange={setOpen}
|
onOpenChange={(open) => {
|
||||||
filter={(value: string, search: string) => {
|
setOpen(open);
|
||||||
const searchLower = search.toLowerCase().trim();
|
if (open) {
|
||||||
if (!searchLower)
|
setQuery("");
|
||||||
return 1;
|
setResults([]);
|
||||||
const valueLower = value.toLowerCase();
|
}
|
||||||
const searchWords = searchLower.split(/\s+/).filter(Boolean);
|
|
||||||
// All search words must appear somewhere in the value (name + description)
|
|
||||||
const allWordsMatch = searchWords.every((word: string) => valueLower.includes(word));
|
|
||||||
return allWordsMatch ? 1 : 0;
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<DialogTitle className="sr-only">Search scripts</DialogTitle>
|
<DialogTitle className="sr-only">Search scripts</DialogTitle>
|
||||||
<CommandInput placeholder="Search for a script..." />
|
<CommandInput
|
||||||
|
placeholder="Search for a script..."
|
||||||
|
onValueChange={setQuery}
|
||||||
|
value={query}
|
||||||
|
/>
|
||||||
<CommandList>
|
<CommandList>
|
||||||
<CommandEmpty>
|
<CommandEmpty>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
@@ -233,9 +284,10 @@ function CommandMenu() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</CommandEmpty>
|
</CommandEmpty>
|
||||||
{Object.entries(uniqueScriptsByCategory).map(([categoryName, scripts]) => (
|
|
||||||
<CommandGroup key={`category:${categoryName}`} heading={categoryName}>
|
{results.length > 0 ? (
|
||||||
{scripts.map(script => (
|
<CommandGroup heading="Search Results">
|
||||||
|
{results.map(script => (
|
||||||
<CommandItem
|
<CommandItem
|
||||||
key={`script:${script.slug}`}
|
key={`script:${script.slug}`}
|
||||||
value={`${script.name} ${script.type} ${script.description || ""}`}
|
value={`${script.name} ${script.type} ${script.description || ""}`}
|
||||||
@@ -268,7 +320,44 @@ function CommandMenu() {
|
|||||||
</CommandItem>
|
</CommandItem>
|
||||||
))}
|
))}
|
||||||
</CommandGroup>
|
</CommandGroup>
|
||||||
))}
|
) : ( // When no search results, show all scripts grouped by category
|
||||||
|
Object.entries(uniqueScriptsByCategory).map(([categoryName, scripts]) => (
|
||||||
|
<CommandGroup key={`category:${categoryName}`} heading={categoryName}>
|
||||||
|
{scripts.map(script => (
|
||||||
|
<CommandItem
|
||||||
|
key={`script:${script.slug}`}
|
||||||
|
value={`${script.name} ${script.type} ${script.description || ""}`}
|
||||||
|
onSelect={() => {
|
||||||
|
setOpen(false);
|
||||||
|
router.push(`/scripts?id=${script.slug}`);
|
||||||
|
}}
|
||||||
|
tabIndex={0}
|
||||||
|
aria-label={`Open script ${script.name}`}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === "Enter" || e.key === " ") {
|
||||||
|
setOpen(false);
|
||||||
|
router.push(`/scripts?id=${script.slug}`);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className="flex gap-2" onClick={() => setOpen(false)}>
|
||||||
|
<Image
|
||||||
|
src={script.logo || `/${basePath}/logo.png`}
|
||||||
|
onError={e => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
|
||||||
|
unoptimized
|
||||||
|
width={16}
|
||||||
|
height={16}
|
||||||
|
alt=""
|
||||||
|
className="h-5 w-5"
|
||||||
|
/>
|
||||||
|
<span>{script.name}</span>
|
||||||
|
<span>{formattedBadge(script.type)}</span>
|
||||||
|
</div>
|
||||||
|
</CommandItem>
|
||||||
|
))}
|
||||||
|
</CommandGroup>
|
||||||
|
))
|
||||||
|
)}
|
||||||
</CommandList>
|
</CommandList>
|
||||||
</CommandDialog>
|
</CommandDialog>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ function MobileSidebar() {
|
|||||||
<p className="text-sm font-medium">Last Viewed</p>
|
<p className="text-sm font-medium">Last Viewed</p>
|
||||||
<ScriptItem
|
<ScriptItem
|
||||||
item={lastViewedScript}
|
item={lastViewedScript}
|
||||||
setSelectedScript={isOnScriptsPage ? setSelectedScript : setTempSelectedScript}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -131,3 +130,4 @@ function MobileSidebar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default MobileSidebar;
|
export default MobileSidebar;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ export type Script = {
|
|||||||
slug: string;
|
slug: string;
|
||||||
categories: number[];
|
categories: number[];
|
||||||
date_created: string;
|
date_created: string;
|
||||||
type: "vm" | "ct" | "pve" | "addon";
|
type: "vm" | "ct" | "pve" | "addon" | "turnkey";
|
||||||
updateable: boolean;
|
updateable: boolean;
|
||||||
privileged: boolean;
|
privileged: boolean;
|
||||||
interface_port: number | null;
|
interface_port: number | null;
|
||||||
@@ -31,12 +31,10 @@ export type Script = {
|
|||||||
username: string | null;
|
username: string | null;
|
||||||
password: string | null;
|
password: string | null;
|
||||||
};
|
};
|
||||||
notes: [
|
notes: {
|
||||||
{
|
text: string;
|
||||||
text: string;
|
type: keyof typeof AlertColors;
|
||||||
type: keyof typeof AlertColors;
|
}[];
|
||||||
},
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Category = {
|
export type Category = {
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ msg_info "Installing Dependencies"
|
|||||||
$STD apt install -y nginx
|
$STD apt install -y nginx
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
PHP_VERSION="8.4" PHP_FPM="YES" setup_php
|
export PHP_VERSION="8.4"
|
||||||
|
PHP_FPM="YES" setup_php
|
||||||
setup_composer
|
setup_composer
|
||||||
setup_mariadb
|
setup_mariadb
|
||||||
MARIADB_DB_NAME="2fauth_db" MARIADB_DB_USER="2fauth" setup_mariadb_db
|
MARIADB_DB_NAME="2fauth_db" MARIADB_DB_USER="2fauth" setup_mariadb_db
|
||||||
|
|||||||
55
install/alpine-rustypaste-install.sh
Normal file
55
install/alpine-rustypaste-install.sh
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/orhun/rustypaste
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing RustyPaste"
|
||||||
|
$STD apk add --no-cache rustypaste --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
|
||||||
|
msg_ok "Installed RustyPaste"
|
||||||
|
|
||||||
|
msg_info "Configuring RustyPaste"
|
||||||
|
mkdir -p /var/lib/rustypaste
|
||||||
|
sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' /etc/rustypaste/config.toml
|
||||||
|
msg_ok "Configured RustyPaste"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<'EOF' >/etc/init.d/rustypaste
|
||||||
|
#!/sbin/openrc-run
|
||||||
|
|
||||||
|
name="rustypaste"
|
||||||
|
description="RustyPaste - A minimal file upload/pastebin service"
|
||||||
|
command="/usr/bin/rustypaste"
|
||||||
|
command_args=""
|
||||||
|
command_user="root"
|
||||||
|
command_background=true
|
||||||
|
pidfile="/run/${RC_SVCNAME}.pid"
|
||||||
|
directory="/var/lib/rustypaste"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
need net
|
||||||
|
after firewall
|
||||||
|
}
|
||||||
|
|
||||||
|
start_pre() {
|
||||||
|
export CONFIG=/etc/rustypaste/config.toml
|
||||||
|
checkpath --directory --owner root:root --mode 0755 /var/lib/rustypaste
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod +x /etc/init.d/rustypaste
|
||||||
|
$STD rc-update add rustypaste default
|
||||||
|
$STD rc-service rustypaste start
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: vhsdream
|
# Author: vhsdream
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://github.com/gelbphoenix/autocaliweb
|
# Source: https://codeberg.org/gelbphoenix/autocaliweb
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
color
|
color
|
||||||
@@ -56,7 +56,7 @@ msg_ok "Installed Calibre"
|
|||||||
|
|
||||||
setup_uv
|
setup_uv
|
||||||
|
|
||||||
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 "Configuring Autocaliweb"
|
msg_info "Configuring Autocaliweb"
|
||||||
INSTALL_DIR="/opt/autocaliweb"
|
INSTALL_DIR="/opt/autocaliweb"
|
||||||
@@ -111,8 +111,8 @@ msg_info "Initializing databases"
|
|||||||
KEPUBIFY_PATH=$(command -v kepubify 2>/dev/null || echo "/usr/bin/kepubify")
|
KEPUBIFY_PATH=$(command -v kepubify 2>/dev/null || echo "/usr/bin/kepubify")
|
||||||
EBOOK_CONVERT_PATH=$(command -v ebook-convert 2>/dev/null || echo "/usr/bin/ebook-convert")
|
EBOOK_CONVERT_PATH=$(command -v ebook-convert 2>/dev/null || echo "/usr/bin/ebook-convert")
|
||||||
CALIBRE_BIN_DIR=$(dirname "$EBOOK_CONVERT_PATH")
|
CALIBRE_BIN_DIR=$(dirname "$EBOOK_CONVERT_PATH")
|
||||||
curl -fsSL https://github.com/gelbphoenix/autocaliweb/raw/refs/heads/main/library/metadata.db -o "$CALIBRE_LIB_DIR"/metadata.db
|
curl -fsSL https://codeberg.org/gelbphoenix/autocaliweb/raw/branch/main/library/metadata.db -o "$CALIBRE_LIB_DIR"/metadata.db
|
||||||
curl -fsSL https://github.com/gelbphoenix/autocaliweb/raw/refs/heads/main/library/app.db -o "$CONFIG_DIR"/app.db
|
curl -fsSL https://codeberg.org/gelbphoenix/autocaliweb/raw/branch/main/library/app.db -o "$CONFIG_DIR"/app.db
|
||||||
sqlite3 "$CONFIG_DIR/app.db" <<EOS
|
sqlite3 "$CONFIG_DIR/app.db" <<EOS
|
||||||
UPDATE settings SET
|
UPDATE settings SET
|
||||||
config_kepubifypath='$KEPUBIFY_PATH',
|
config_kepubifypath='$KEPUBIFY_PATH',
|
||||||
|
|||||||
@@ -14,17 +14,13 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y git
|
$STD apt install -y \
|
||||||
$STD apt-get install -y git-lfs
|
git \
|
||||||
|
git-lfs
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing Forgejo"
|
fetch_and_deploy_codeberg_release "forgejo" "forgejo/forgejo" "singlefile" "latest" "/opt/forgejo" "forgejo-*-linux-amd64"
|
||||||
mkdir -p /opt/forgejo
|
ln -sf /opt/forgejo/forgejo /usr/local/bin/forgejo
|
||||||
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 "/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 "Installed Forgejo"
|
|
||||||
|
|
||||||
msg_info "Setting up Forgejo"
|
msg_info "Setting up Forgejo"
|
||||||
$STD adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
|
$STD adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ msg_info "Installing Dependencies"
|
|||||||
$STD apt install -y \
|
$STD apt install -y \
|
||||||
make \
|
make \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
python3-venv
|
python3-venv \
|
||||||
|
git
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "grist" "gristlabs/grist-core" "tarball"
|
fetch_and_deploy_gh_release "grist" "gristlabs/grist-core" "tarball"
|
||||||
|
|||||||
@@ -13,44 +13,44 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
echo ""
|
if [ -d /dev/dri ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "🤖 ${BL}Immich Machine Learning Options${CL}"
|
echo ""
|
||||||
echo "─────────────────────────────────────────"
|
echo -e "🤖 ${BL}Immich Machine Learning Options${CL}"
|
||||||
echo "Please choose your machine-learning type:"
|
echo "─────────────────────────────────────────"
|
||||||
echo ""
|
echo "Please choose your machine-learning type:"
|
||||||
echo " 1) CPU only (default)"
|
echo ""
|
||||||
echo " 2) Intel OpenVINO (requires GPU passthrough)"
|
echo " 1) CPU only (default)"
|
||||||
echo ""
|
echo " 2) Intel OpenVINO (requires GPU passthrough)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE
|
read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE
|
||||||
ML_TYPE="${ML_TYPE:-1}"
|
ML_TYPE="${ML_TYPE:-1}"
|
||||||
if [[ "$ML_TYPE" == "2" ]]; then
|
if [[ "$ML_TYPE" == "2" ]]; then
|
||||||
msg_info "Installing OpenVINO dependencies"
|
msg_info "Installing OpenVINO dependencies"
|
||||||
touch ~/.openvino
|
touch ~/.openvino
|
||||||
$STD apt install -y --no-install-recommends patchelf
|
$STD apt install -y --no-install-recommends patchelf
|
||||||
tmp_dir=$(mktemp -d)
|
tmp_dir=$(mktemp -d)
|
||||||
$STD pushd "$tmp_dir"
|
$STD pushd "$tmp_dir"
|
||||||
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
||||||
readarray -t INTEL_URLS < <(
|
readarray -t INTEL_URLS < <(
|
||||||
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
||||||
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
||||||
)
|
)
|
||||||
for url in "${INTEL_URLS[@]}"; do
|
for url in "${INTEL_URLS[@]}"; do
|
||||||
curl -fsSLO "$url"
|
curl -fsSLO "$url"
|
||||||
done
|
done
|
||||||
$STD apt install -y ./libigdgmm12*.deb
|
$STD apt install -y ./libigdgmm12*.deb
|
||||||
rm ./libigdgmm12*.deb
|
rm ./libigdgmm12*.deb
|
||||||
$STD apt install -y ./*.deb
|
$STD apt install -y ./*.deb
|
||||||
$STD apt-mark hold libigdgmm12
|
$STD apt-mark hold libigdgmm12
|
||||||
$STD popd
|
$STD popd
|
||||||
rm -rf "$tmp_dir"
|
rm -rf "$tmp_dir"
|
||||||
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
||||||
msg_ok "Installed OpenVINO dependencies"
|
msg_ok "Installed OpenVINO dependencies"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
setup_uv
|
|
||||||
|
|
||||||
msg_info "Installing dependencies"
|
msg_info "Installing dependencies"
|
||||||
$STD apt install --no-install-recommends -y \
|
$STD apt install --no-install-recommends -y \
|
||||||
git \
|
git \
|
||||||
@@ -144,8 +144,7 @@ msg_info "Installing packages from Debian Testing repo"
|
|||||||
$STD apt install -t testing --no-install-recommends -yqq libmimalloc3 libde265-dev
|
$STD apt install -t testing --no-install-recommends -yqq libmimalloc3 libde265-dev
|
||||||
msg_ok "Installed packages from Debian Testing repo"
|
msg_ok "Installed packages from Debian Testing repo"
|
||||||
|
|
||||||
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')"
|
setup_uv
|
||||||
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
|
||||||
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
||||||
|
|
||||||
VCHORD_RELEASE="0.5.3"
|
VCHORD_RELEASE="0.5.3"
|
||||||
@@ -290,7 +289,9 @@ ML_DIR="${APP_DIR}/machine-learning"
|
|||||||
GEO_DIR="${INSTALL_DIR}/geodata"
|
GEO_DIR="${INSTALL_DIR}/geodata"
|
||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.5.2" "$SRC_DIR"
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.5.3" "$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 "Installing Immich (patience)"
|
msg_info "Installing Immich (patience)"
|
||||||
|
|
||||||
@@ -477,26 +478,6 @@ chown -R immich:immich "$INSTALL_DIR" /var/log/immich
|
|||||||
systemctl enable -q --now immich-ml.service immich-web.service
|
systemctl enable -q --now immich-ml.service immich-web.service
|
||||||
msg_ok "Modified user, created env file, scripts and services"
|
msg_ok "Modified user, created env file, scripts and services"
|
||||||
|
|
||||||
msg_info "Checking health of Immich-web & Immich-ml services"
|
|
||||||
sleep 5
|
|
||||||
web=0
|
|
||||||
until curl -fs localhost:2283/api/server/ping | grep -q "pong" || [[ $web -gt 1 ]]; do
|
|
||||||
msg_warn "Problem detected with Immich-web service, restarting..."
|
|
||||||
systemctl restart immich-web && sleep 5
|
|
||||||
[[ $(curl -fs localhost:2283/api/server/ping | grep "pong") ]] && break
|
|
||||||
((web++))
|
|
||||||
done
|
|
||||||
[[ $web -lt 1 ]] && msg_ok "Immich-web service is reachable!" || msg_error "Please check '/var/log/immich/web.log' for more details"
|
|
||||||
|
|
||||||
ml=0
|
|
||||||
until [[ $(curl -fs localhost:3003/ping) == "pong" ]] || [[ $ml -gt 1 ]]; do
|
|
||||||
msg_warn "Problem detected with Immich-ml service, restarting..."
|
|
||||||
systemctl restart immich-ml && sleep 5
|
|
||||||
[[ $(curl -fs localhost:3003/ping) == "pong" ]] && break
|
|
||||||
((ml++))
|
|
||||||
done
|
|
||||||
[[ $ml -lt 1 ]] && msg_ok "Immich-ml service is reachable!" || msg_error "Please check '/var/log/immich/ml.log' for more details"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|||||||
145
install/kitchenowl-install.sh
Normal file
145
install/kitchenowl-install.sh
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: snazzybean
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/TomBursch/kitchenowl
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
nginx \
|
||||||
|
build-essential \
|
||||||
|
gfortran \
|
||||||
|
pkg-config \
|
||||||
|
ninja-build \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
libpq-dev \
|
||||||
|
libffi-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libpcre2-dev \
|
||||||
|
libre2-dev \
|
||||||
|
libxml2-dev \
|
||||||
|
libxslt-dev \
|
||||||
|
libopenblas-dev \
|
||||||
|
liblapack-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
libjpeg62-turbo-dev \
|
||||||
|
libsqlite3-dev \
|
||||||
|
libexpat1-dev \
|
||||||
|
libicu-dev
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PYTHON_VERSION="3.14" setup_uv
|
||||||
|
fetch_and_deploy_gh_release "kitchenowl" "TomBursch/kitchenowl" "tarball" "latest" "/opt/kitchenowl"
|
||||||
|
rm -rf /opt/kitchenowl/web
|
||||||
|
fetch_and_deploy_gh_release "kitchenowl-web" "TomBursch/kitchenowl" "prebuild" "latest" "/opt/kitchenowl/web" "kitchenowl_Web.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Setting up KitchenOwl"
|
||||||
|
cd /opt/kitchenowl/backend
|
||||||
|
$STD uv sync --no-dev
|
||||||
|
sed -i 's/default=True/default=False/' /opt/kitchenowl/backend/wsgi.py
|
||||||
|
mkdir -p /nltk_data
|
||||||
|
$STD uv run python -m nltk.downloader -d /nltk_data averaged_perceptron_tagger_eng
|
||||||
|
JWT_SECRET=$(openssl rand -hex 32)
|
||||||
|
mkdir -p /opt/kitchenowl/data
|
||||||
|
cat <<EOF >/opt/kitchenowl/kitchenowl.env
|
||||||
|
STORAGE_PATH=/opt/kitchenowl/data
|
||||||
|
JWT_SECRET_KEY=${JWT_SECRET}
|
||||||
|
NLTK_DATA=/nltk_data
|
||||||
|
FRONT_URL=http://${LOCAL_IP}
|
||||||
|
FLASK_APP=wsgi.py
|
||||||
|
FLASK_ENV=production
|
||||||
|
EOF
|
||||||
|
set -a
|
||||||
|
source /opt/kitchenowl/kitchenowl.env
|
||||||
|
set +a
|
||||||
|
$STD uv run flask db upgrade
|
||||||
|
msg_ok "Set up KitchenOwl"
|
||||||
|
|
||||||
|
msg_info "Creating Systemd Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/kitchenowl.service
|
||||||
|
[Unit]
|
||||||
|
Description=KitchenOwl Backend
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/kitchenowl/backend
|
||||||
|
EnvironmentFile=/opt/kitchenowl/kitchenowl.env
|
||||||
|
ExecStart=/usr/local/bin/uv run wsgi.py
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now kitchenowl
|
||||||
|
msg_ok "Created and Started Service"
|
||||||
|
|
||||||
|
msg_info "Configuring Nginx"
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
cat <<'EOF' >/etc/nginx/sites-available/kitchenowl.conf
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
root /opt/kitchenowl/web;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
client_max_body_size 100M;
|
||||||
|
|
||||||
|
# Security Headers
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://127.0.0.1:5000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_connect_timeout 60s;
|
||||||
|
proxy_send_timeout 60s;
|
||||||
|
proxy_read_timeout 60s;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /socket.io {
|
||||||
|
proxy_pass http://127.0.0.1:5000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
# WebSocket Timeouts - allow long-lived connections
|
||||||
|
proxy_read_timeout 86400s;
|
||||||
|
proxy_send_timeout 86400s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
ln -sf /etc/nginx/sites-available/kitchenowl.conf /etc/nginx/sites-enabled/
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
$STD systemctl reload nginx
|
||||||
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -18,7 +18,8 @@ $STD apt install -y \
|
|||||||
ca-certificates \
|
ca-certificates \
|
||||||
build-essential \
|
build-essential \
|
||||||
python3 \
|
python3 \
|
||||||
python3-setuptools
|
python3-setuptools \
|
||||||
|
graphicsmagick
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ After=network-online.target
|
|||||||
User=root
|
User=root
|
||||||
Restart=always
|
Restart=always
|
||||||
Type=simple
|
Type=simple
|
||||||
ExecStart=/usr/local/bin/prometheus-paperless-exporter \
|
ExecStart=/usr/bin/prometheus-paperless-exporter \
|
||||||
--paperless_url=http://paperless.example.org \
|
--paperless_url=http://paperless.example.org \
|
||||||
--paperless_auth_token_file=/etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file
|
--paperless_auth_token_file=/etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file
|
||||||
ExecReload=/bin/kill -HUP \$MAINPID
|
ExecReload=/bin/kill -HUP \$MAINPID
|
||||||
|
|||||||
@@ -13,13 +13,7 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Readeck"
|
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
|
||||||
LATEST=$(curl -fsSL https://codeberg.org/readeck/readeck/releases/ | grep -oP '/releases/tag/\K\d+\.\d+\.\d+' | head -1)
|
|
||||||
mkdir -p /opt/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 "Installed Readeck"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/readeck.service
|
cat <<EOF >/etc/systemd/system/readeck.service
|
||||||
|
|||||||
43
install/rustypaste-install.sh
Normal file
43
install/rustypaste-install.sh
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: GoldenSpringness | MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/orhun/rustypaste
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Setting up RustyPaste"
|
||||||
|
cd /opt/rustypaste
|
||||||
|
sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' config.toml
|
||||||
|
msg_ok "Set up RustyPaste"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/rustypaste.service
|
||||||
|
[Unit]
|
||||||
|
Description=rustypaste Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/rustypaste
|
||||||
|
ExecStart=/opt/rustypaste/rustypaste
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now rustypaste
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -41,39 +41,34 @@ $STD cargo build --release --bin server
|
|||||||
mv ./target/release/server /usr/bin/scanopy-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"
|
|
||||||
|
|
||||||
msg_info "Configuring server for first-run"
|
msg_info "Configuring server for first-run"
|
||||||
cat <<EOF >/opt/scanopy/.env
|
cat <<EOF >/opt/scanopy/.env
|
||||||
### - SERVER
|
### - SERVER
|
||||||
scanopy_DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME
|
SCANOPY_DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME
|
||||||
scanopy_WEB_EXTERNAL_PATH="/opt/scanopy/ui/build"
|
SCANOPY_WEB_EXTERNAL_PATH="/opt/scanopy/ui/build"
|
||||||
scanopy_PUBLIC_URL=http://${LOCAL_IP}:60072
|
SCANOPY_PUBLIC_URL=http://${LOCAL_IP}:60072
|
||||||
scanopy_SERVER_PORT=60072
|
SCANOPY_SERVER_PORT=60072
|
||||||
scanopy_LOG_LEVEL=info
|
SCANOPY_LOG_LEVEL=info
|
||||||
scanopy_INTEGRATED_DAEMON_URL=http://127.0.0.1:60073
|
SCANOPY_INTEGRATED_DAEMON_URL=http://127.0.0.1:60073
|
||||||
## - uncomment to disable signups
|
## - uncomment to disable signups
|
||||||
# scanopy_DISABLE_REGISTRATION=true
|
# SCANOPY_DISABLE_REGISTRATION=true
|
||||||
## - uncomment when using TLS
|
## - uncomment when using TLS
|
||||||
# scanopy_USE_SECURE_SESSION_COOKIES=true
|
# SCANOPY_USE_SECURE_SESSION_COOKIES=true
|
||||||
## - see https://github.com/imbolc/axum-client-ip?tab=readme-ov-file#configurable-vs-specific-extractors
|
## - see https://github.com/imbolc/axum-client-ip?tab=readme-ov-file#configurable-vs-specific-extractors
|
||||||
## - before uncommenting the below
|
## - before uncommenting the below
|
||||||
# scanopy_CLIENT_IP_SOURCE=
|
# SCANOPY_CLIENT_IP_SOURCE=
|
||||||
|
|
||||||
### - SMTP (password reset and notifications - optional)
|
### - SMTP (password reset and notifications - optional)
|
||||||
# scanopy_SMTP_RELAY=smtp.gmail.com:587
|
# SCANOPY_SMTP_RELAY=smtp.gmail.com:587
|
||||||
# scanopy_SMTP_USERNAME=your-email@gmail.com
|
# SCANOPY_SMTP_USERNAME=your-email@gmail.com
|
||||||
# scanopy_SMTP_PASSWORD=your-app-password
|
# SCANOPY_SMTP_PASSWORD=your-app-password
|
||||||
# scanopy_SMTP_EMAIL=scanopy@yourdomain.tld
|
# SCANOPY_SMTP_EMAIL=scanopy@yourdomain.tld
|
||||||
|
|
||||||
### - INTEGRATED DAEMON
|
### - INTEGRATED DAEMON
|
||||||
scanopy_SERVER_URL=http://127.0.0.1:60072
|
SCANOPY_SERVER_URL=http://127.0.0.1:60072
|
||||||
scanopy_BIND_ADDRESS=0.0.0.0
|
SCANOPY_BIND_ADDRESS=0.0.0.0
|
||||||
scanopy_NAME="scanopy-daemon"
|
SCANOPY_NAME="scanopy-daemon"
|
||||||
scanopy_HEARTBEAT_INTERVAL=30
|
SCANOPY_HEARTBEAT_INTERVAL=30
|
||||||
|
|
||||||
### - see https://github.com/scanopy/scanopy/blob/main/docs/CONFIGURATION.md for more options
|
### - see https://github.com/scanopy/scanopy/blob/main/docs/CONFIGURATION.md for more options
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -105,14 +105,13 @@ elif [[ "$DEPLOYMENT_TYPE" == "4" ]]; then
|
|||||||
sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env
|
sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env
|
||||||
else
|
else
|
||||||
DEPLOYMENT_TYPE="1"
|
DEPLOYMENT_TYPE="1"
|
||||||
CHROME_VERSION=$(curl -fsSL https://raw.githubusercontent.com/calibrain/shelfmark/refs/heads/main/Dockerfile | sed -n '/chromium=/s/[^=]*=//p' | awk '{print $1}')
|
|
||||||
msg_info "Installing internal bypasser dependencies"
|
msg_info "Installing internal bypasser dependencies"
|
||||||
$STD apt install -y --no-install-recommends \
|
$STD apt install -y --no-install-recommends \
|
||||||
xvfb \
|
xvfb \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
chromium-common=${CHROME_VERSION} \
|
chromium-common \
|
||||||
chromium=${CHROME_VERSION} \
|
chromium \
|
||||||
chromium-driver=${CHROME_VERSION} \
|
chromium-driver \
|
||||||
python3-tk
|
python3-tk
|
||||||
msg_ok "Installed internal bypasser dependencies"
|
msg_ok "Installed internal bypasser dependencies"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -14,24 +14,32 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y \
|
$STD apt install -y coreutils
|
||||||
coreutils
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Setup SQL Server 2022"
|
msg_info "Setting up SQL Server 2022 Repository"
|
||||||
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc >/dev/null
|
setup_deb822_repo \
|
||||||
curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list >/dev/null
|
"mssql-server-2022" \
|
||||||
$STD apt-get update -y
|
"https://packages.microsoft.com/keys/microsoft.asc" \
|
||||||
$STD apt-get install -y mssql-server
|
"https://packages.microsoft.com/ubuntu/22.04/mssql-server-2022" \
|
||||||
msg_ok "Setup Server 2022"
|
"./" \
|
||||||
|
""
|
||||||
|
msg_ok "Repository configured"
|
||||||
|
|
||||||
|
msg_info "Installing SQL Server 2022"
|
||||||
|
$STD apt install -y mssql-server
|
||||||
|
msg_ok "Installed SQL Server 2022"
|
||||||
|
|
||||||
msg_info "Installing SQL Server Tools"
|
msg_info "Installing SQL Server Tools"
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
export ACCEPT_EULA=Y
|
export ACCEPT_EULA=Y
|
||||||
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc >/dev/null
|
setup_deb822_repo \
|
||||||
curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/mssql-release.list >/dev/null
|
"mssql-release" \
|
||||||
$STD apt-get update
|
"https://packages.microsoft.com/keys/microsoft.asc" \
|
||||||
$STD apt-get install -y -qq \
|
"https://packages.microsoft.com/ubuntu/22.04/prod" \
|
||||||
|
"jammy" \
|
||||||
|
"main"
|
||||||
|
$STD apt-get install -y \
|
||||||
mssql-tools18 \
|
mssql-tools18 \
|
||||||
unixodbc-dev
|
unixodbc-dev
|
||||||
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile
|
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile
|
||||||
@@ -49,6 +57,11 @@ msg_info "Start Service"
|
|||||||
systemctl enable -q --now mssql-server
|
systemctl enable -q --now mssql-server
|
||||||
msg_ok "Service started"
|
msg_ok "Service started"
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
rm -f /etc/profile.d/debuginfod.sh
|
||||||
|
rm -f /etc/profile.d/debuginfod.csh
|
||||||
|
msg_ok "Cleaned up"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|||||||
66
install/sqlserver2025-install.sh
Normal file
66
install/sqlserver2025-install.sh
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.microsoft.com/en-us/sql-server/sql-server-2025
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y coreutils
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Setting up SQL Server 2025 Repository"
|
||||||
|
setup_deb822_repo \
|
||||||
|
"mssql-server-2025" \
|
||||||
|
"https://packages.microsoft.com/keys/microsoft.asc" \
|
||||||
|
"https://packages.microsoft.com/ubuntu/24.04/mssql-server-2025" \
|
||||||
|
"./" \
|
||||||
|
""
|
||||||
|
msg_ok "Repository configured"
|
||||||
|
|
||||||
|
msg_info "Installing SQL Server 2025"
|
||||||
|
$STD apt install -y mssql-server
|
||||||
|
msg_ok "Installed SQL Server 2025"
|
||||||
|
|
||||||
|
msg_info "Installing SQL Server Tools"
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
export ACCEPT_EULA=Y
|
||||||
|
setup_deb822_repo \
|
||||||
|
"mssql-release" \
|
||||||
|
"https://packages.microsoft.com/keys/microsoft.asc" \
|
||||||
|
"https://packages.microsoft.com/ubuntu/24.04/prod" \
|
||||||
|
"noble" \
|
||||||
|
"main"
|
||||||
|
$STD apt-get install -y \
|
||||||
|
mssql-tools18 \
|
||||||
|
unixodbc-dev
|
||||||
|
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile
|
||||||
|
source ~/.bash_profile
|
||||||
|
msg_ok "Installed SQL Server Tools"
|
||||||
|
|
||||||
|
read -r -p "${TAB3}Do you want to run the SQL Server setup now? (Later is also possible) <y/N>" prompt
|
||||||
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
/opt/mssql/bin/mssql-conf setup
|
||||||
|
else
|
||||||
|
msg_ok "Skipping SQL Server setup. You can run it later with '/opt/mssql/bin/mssql-conf setup'."
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Starting SQL Server Service"
|
||||||
|
systemctl enable -q --now mssql-server
|
||||||
|
msg_ok "Service started"
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
rm -f /etc/profile.d/debuginfod.sh /etc/profile.d/debuginfod.csh
|
||||||
|
msg_ok "Cleaned up"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -109,18 +109,34 @@ if command -v timescaledb-tune &> /dev/null; then
|
|||||||
|| echo "Warning: timescaledb-tune failed (non-fatal)"
|
|| echo "Warning: timescaledb-tune failed (non-fatal)"
|
||||||
fi
|
fi
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Ensure TimescaleDB decompression limit is set (for existing databases)
|
# Ensure required PostgreSQL settings for Tracearr
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# This setting allows migrations to modify compressed hypertable data.
|
|
||||||
# Without it, bulk UPDATEs on compressed sessions will fail with
|
|
||||||
# "tuple decompression limit exceeded" errors.
|
|
||||||
pg_config_file="/etc/postgresql/18/main/postgresql.conf"
|
pg_config_file="/etc/postgresql/18/main/postgresql.conf"
|
||||||
if [ -f \$pg_config_file ]; then
|
if [ -f \$pg_config_file ]; then
|
||||||
if ! grep -q "max_tuples_decompressed_per_dml_transaction" \$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 "" >> \$pg_config_file
|
||||||
echo "# Allow unlimited tuple decompression for migrations on compressed hypertables" >> \$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
|
echo "timescaledb.max_tuples_decompressed_per_dml_transaction = 0" >> \$pg_config_file
|
||||||
fi
|
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
|
fi
|
||||||
systemctl restart postgresql
|
systemctl restart postgresql
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y git \
|
$STD apt install -y \
|
||||||
build-essential \
|
build-essential \
|
||||||
pkgconf \
|
pkgconf \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
@@ -24,34 +24,25 @@ $STD apt install -y git \
|
|||||||
ssl-cert
|
ssl-cert
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
WEBVAULT=$(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) }')
|
setup_rust
|
||||||
VAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
|
||||||
|
|
||||||
msg_info "Installing Rust"
|
msg_info "Building Vaultwarden (Patience)"
|
||||||
curl -fsSL https://sh.rustup.rs -o rustup-init.sh
|
cd /tmp/vaultwarden-src
|
||||||
$STD bash rustup-init.sh -y --profile minimal
|
|
||||||
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >>~/.bashrc
|
|
||||||
export PATH="$HOME/.cargo/bin:$PATH"
|
|
||||||
rm rustup-init.sh
|
|
||||||
msg_ok "Installed Rust"
|
|
||||||
|
|
||||||
msg_info "Building Vaultwarden ${VAULT} (Patience)"
|
|
||||||
$STD git clone https://github.com/dani-garcia/vaultwarden
|
|
||||||
cd vaultwarden
|
|
||||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
||||||
msg_ok "Built Vaultwarden ${VAULT}"
|
msg_ok "Built Vaultwarden"
|
||||||
|
|
||||||
|
msg_info "Setting up Vaultwarden"
|
||||||
$STD addgroup --system vaultwarden
|
$STD addgroup --system vaultwarden
|
||||||
$STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden
|
$STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden
|
||||||
mkdir -p /opt/vaultwarden/bin
|
mkdir -p /opt/vaultwarden/{bin,data,web-vault}
|
||||||
mkdir -p /opt/vaultwarden/data
|
|
||||||
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
||||||
|
cd ~ && rm -rf /tmp/vaultwarden-src
|
||||||
|
msg_ok "Set up Vaultwarden"
|
||||||
|
|
||||||
msg_info "Downloading Web-Vault ${WEBVAULT}"
|
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
|
||||||
$STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/"$WEBVAULT"/bw_web_"$WEBVAULT".tar.gz
|
|
||||||
$STD tar -xzf bw_web_"$WEBVAULT".tar.gz -C /opt/vaultwarden/
|
|
||||||
msg_ok "Downloaded Web-Vault ${WEBVAULT}"
|
|
||||||
|
|
||||||
|
msg_info "Configuring Vaultwarden"
|
||||||
cat <<EOF >/opt/vaultwarden/.env
|
cat <<EOF >/opt/vaultwarden/.env
|
||||||
ADMIN_TOKEN=''
|
ADMIN_TOKEN=''
|
||||||
ROCKET_ADDRESS=0.0.0.0
|
ROCKET_ADDRESS=0.0.0.0
|
||||||
@@ -61,22 +52,23 @@ DATABASE_MAX_CONNS=10
|
|||||||
WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
|
WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
|
||||||
WEB_VAULT_ENABLED=true
|
WEB_VAULT_ENABLED=true
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
|
mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
|
||||||
mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
|
mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
chown -R vaultwarden:vaultwarden /opt/vaultwarden/
|
chown -R vaultwarden:vaultwarden /opt/vaultwarden/
|
||||||
chown root:root /opt/vaultwarden/bin/vaultwarden
|
chown root:root /opt/vaultwarden/bin/vaultwarden
|
||||||
chmod +x /opt/vaultwarden/bin/vaultwarden
|
chmod +x /opt/vaultwarden/bin/vaultwarden
|
||||||
chown -R root:root /opt/vaultwarden/web-vault/
|
chown -R root:root /opt/vaultwarden/web-vault/
|
||||||
chmod +r /opt/vaultwarden/.env
|
chmod +r /opt/vaultwarden/.env
|
||||||
|
msg_ok "Configured Vaultwarden"
|
||||||
|
|
||||||
service_path="/etc/systemd/system/vaultwarden.service"
|
msg_info "Creating Service"
|
||||||
echo "[Unit]
|
cat <<EOF >/etc/systemd/system/vaultwarden.service
|
||||||
|
[Unit]
|
||||||
Description=Bitwarden Server (Powered by Vaultwarden)
|
Description=Bitwarden Server (Powered by Vaultwarden)
|
||||||
Documentation=https://github.com/dani-garcia/vaultwarden
|
Documentation=https://github.com/dani-garcia/vaultwarden
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
User=vaultwarden
|
User=vaultwarden
|
||||||
Group=vaultwarden
|
Group=vaultwarden
|
||||||
@@ -99,10 +91,11 @@ LockPersonality=yes
|
|||||||
WorkingDirectory=/opt/vaultwarden
|
WorkingDirectory=/opt/vaultwarden
|
||||||
ReadWriteDirectories=/opt/vaultwarden/data
|
ReadWriteDirectories=/opt/vaultwarden/data
|
||||||
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target" >$service_path
|
WantedBy=multi-user.target
|
||||||
systemctl daemon-reload
|
EOF
|
||||||
$STD systemctl enable --now vaultwarden
|
systemctl enable -q --now vaultwarden
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
89
install/wealthfolio-install.sh
Normal file
89
install/wealthfolio-install.sh
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://wealthfolio.app/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
pkg-config \
|
||||||
|
libssl-dev \
|
||||||
|
build-essential \
|
||||||
|
libsqlite3-dev \
|
||||||
|
argon2
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_rust
|
||||||
|
NODE_MODULE="pnpm" setup_nodejs
|
||||||
|
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
|
||||||
|
$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 "Configuring Wealthfolio"
|
||||||
|
mkdir -p /opt/wealthfolio_data
|
||||||
|
SECRET_KEY=$(openssl rand -base64 32)
|
||||||
|
WF_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-16)
|
||||||
|
WF_PASSWORD_HASH=$(echo -n "$WF_PASSWORD" | argon2 "$(openssl rand -base64 16)" -id -e)
|
||||||
|
cat <<EOF >/opt/wealthfolio/.env
|
||||||
|
WF_LISTEN_ADDR=0.0.0.0:8080
|
||||||
|
WF_DB_PATH=/opt/wealthfolio_data/wealthfolio.db
|
||||||
|
WF_SECRET_KEY=${SECRET_KEY}
|
||||||
|
WF_AUTH_PASSWORD_HASH=${WF_PASSWORD_HASH}
|
||||||
|
WF_STATIC_DIR=/opt/wealthfolio/dist
|
||||||
|
WF_CORS_ALLOW_ORIGINS=*
|
||||||
|
WF_REQUEST_TIMEOUT_MS=30000
|
||||||
|
EOF
|
||||||
|
echo "WF_PASSWORD=${WF_PASSWORD}" >~/wealthfolio.creds
|
||||||
|
msg_ok "Configured Wealthfolio"
|
||||||
|
|
||||||
|
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 "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/wealthfolio.service
|
||||||
|
[Unit]
|
||||||
|
Description=Wealthfolio Investment Tracker
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/wealthfolio
|
||||||
|
EnvironmentFile=/opt/wealthfolio/.env
|
||||||
|
ExecStart=/usr/local/bin/wealthfolio-server
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now wealthfolio
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
66
install/wishlist-install.sh
Normal file
66
install/wishlist-install.sh
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
openssl \
|
||||||
|
caddy
|
||||||
|
msg_ok "Installed dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball"
|
||||||
|
LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist")
|
||||||
|
|
||||||
|
msg_info "Installing Wishlist"
|
||||||
|
cd /opt/wishlist
|
||||||
|
cp .env.example .env
|
||||||
|
sed -i "s|^ORIGIN=.*|ORIGIN=http://${LOCAL_IP}:3280|" /opt/wishlist/.env
|
||||||
|
echo "" >>/opt/wishlist/.env
|
||||||
|
echo "NODE_ENV=production" >>/opt/wishlist/.env
|
||||||
|
$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
|
||||||
|
mkdir -p /opt/wishlist/uploads
|
||||||
|
mkdir -p /opt/wishlist/data
|
||||||
|
msg_ok "Installed Wishlist"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/wishlist.service
|
||||||
|
[Unit]
|
||||||
|
Description=Wishlist Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/wishlist
|
||||||
|
EnvironmentFile=/opt/wishlist/.env
|
||||||
|
ExecStart=/usr/bin/env sh -c './entrypoint.sh'
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now wishlist
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user