354 Commits

Author SHA1 Message Date
Sam Heinz 64d78b1ab4 Frontend from upstream 2025-01-09 13:59:16 +10:00
Sam Heinz a1d51ea790 Update openwrt.sh 2024-12-31 03:02:48 +10:00
Sam Heinz 414ccb5d4c Update agentdvr-install.sh 2024-12-28 13:08:34 +10:00
Sam Heinz 728cf1ce73 Update nginxproxymanager-install.sh 2024-12-12 10:08:08 +10:00
Sam Heinz fc4c76f78e Update nginxproxymanager-install.sh 2024-12-12 09:21:19 +10:00
Sam Heinz 3ff7d0b403 Fix for nginx proxy manager
close #87
2024-12-11 17:36:28 +10:00
nιcнolaѕ wιlde 33e7fcf048 Tweak: Patch Prometheus for v.3.0.0 (#94) @nicholaswilde
* fix: remove cp -rf consoles/ console_libraries/ /etc/prometheus/

Signed-off-by: nιcнolaѕ wιlde <ncwilde43@gmail.com>

* fix: remove mv console

Signed-off-by: nιcнolaѕ wιlde <ncwilde43@gmail.com>

* fix: remove console from ExecStart

Signed-off-by: nιcнolaѕ wιlde <ncwilde43@gmail.com>

---------

Signed-off-by: nιcнolaѕ wιlde <ncwilde43@gmail.com>
2024-12-09 13:09:51 +10:00
Sam Heinz 35eefd7680 Fix Post Install
Credit to @Crosant https://github.com/Crosant/Proxmox/commit/0f559af3e8b093d663e2c03da36a376c722306d1
2024-11-30 11:20:47 +01:00
Sam Heinz d8f7b01640 Update rdtclient-install.sh
updated to dotnet 9
2024-11-22 12:07:13 +00:00
Sam Heinz 695835d19d Update flaresolverr-install.sh 2024-11-14 07:26:10 +03:00
Sam Heinz 0ce02f98d3 Update Flaresolverr | Closes #90 2024-11-14 07:25:25 +03:00
Sam Heinz 2d5484e233 Merge remote-tracking branch 'upstream/main' 2024-11-03 12:01:14 +10:00
tteckster 930760840c Update README.md 2024-11-02 01:39:01 -04:00
tteckster 9ef8058194 Update CHANGELOG.md 2024-11-01 03:46:13 -04:00
tteckster 7452b47c9f Update README.md 2024-11-01 03:45:32 -04:00
CanbiZ f4c9cc1156 Tweak (#4024) 2024-11-01 03:44:02 -04:00
Sam Heinz e7cca5c779 Revert to old nginx proxy manager script 2024-11-01 14:37:24 +10:00
Sam Heinz 5bef4f7b2a Update nginxproxymanager-install.sh 2024-10-31 16:46:38 +10:00
Sam Heinz 32c2b49569 Possible fix for #87 - ngpm 2024-10-31 16:36:44 +10:00
tteckster 38d3f2c868 Update nginxproxymanager-install.sh
tweak
2024-10-31 02:18:28 -04:00
CanbiZ 57b9cde44d Add new LXC: Memos (#4013) 2024-10-30 10:25:02 -04:00
tteckster f26410759a Update build.func
tweak
2024-10-30 06:09:28 -04:00
Håvard Gjøby Thom d22879b5e9 Add new LXC: NZBGet (#4000) 2024-10-30 06:04:23 -04:00
CanbiZ 8cdb218e38 Tweak: Fix Paperless Ghostscript (#4012) 2024-10-30 06:03:12 -04:00
tteckster 409936a9fc Update README.md 2024-10-29 11:51:45 -04:00
Jacob eceb52a67a Change update script (#4005)
Change update script to make sure that it overwrites all the local changes in the local browserless git folder
2024-10-29 09:45:40 -04:00
tteckster 2d3cae43cb Update pihole-install.sh
Correct interface IP
2024-10-28 15:10:48 -04:00
CanbiZ b603da7778 Tweak (#3997)
Removed wrong line
2024-10-28 11:50:52 -04:00
tteckster 902aee0c0b Update tianji.sh
tweak
2024-10-28 11:23:32 -04:00
CanbiZ 6881f07437 Tweak / Remove Git and get complete project file (#3996) 2024-10-28 11:17:11 -04:00
tteckster 06742f7ef5 Update CHANGELOG.md 2024-10-28 05:49:42 -04:00
tteckster 32cd74e49f Update CHANGELOG.md 2024-10-27 19:05:32 -04:00
Håvard Gjøby Thom 28896707bc Add max-old-space-size in openwebui.sh (#3993) 2024-10-27 18:36:01 -04:00
Håvard Gjøby Thom 0340aec142 Adjust max-old-space-size in openwebui-install.sh (#3992) 2024-10-27 18:24:22 -04:00
Håvard Gjøby Thom 8a21f6e7f0 Add option to install Ollama in Open WebUI LXC (#3991) 2024-10-27 18:14:57 -04:00
Håvard Gjøby Thom 77b06ee3f9 Add update path to Gotify LXC (#3989) 2024-10-27 13:29:28 -04:00
tteckster 399786c5bd Update nginxproxymanager-install.sh
fixes https://github.com/tteck/Proxmox/issues/3982
2024-10-27 04:57:06 -04:00
tteckster e4912cec78 Update nginxproxymanager-install.sh
tweak
2024-10-27 01:16:41 -04:00
tteckster 846d75dca1 Update CHANGELOG.md 2024-10-26 15:20:57 -04:00
Håvard Gjøby Thom af0376f25b Add new LXC: Ollama (#3979) 2024-10-26 15:20:48 -04:00
CanbiZ 5ae25108ef Add new LXC: AdventureLog (#3971) 2024-10-25 12:00:35 -04:00
tteckster 55c8d1187b Update paperless-ngx-install.sh
tweak
2024-10-25 07:35:07 -04:00
tteckster 9a5d43e4d3 Update paperless-ngx-install.sh
fixes https://github.com/tteck/Proxmox/issues/3974
2024-10-25 07:32:56 -04:00
tteckster bb2c143cc8 Update CHANGELOG.md 2024-10-25 05:38:49 -04:00
tteckster 2a844122d0 Update zoraxy.sh
tweak
2024-10-25 05:31:13 -04:00
tteckster 540fcd24f2 Update zoraxy.sh
tweak
2024-10-25 05:25:19 -04:00
tteckster c2c48b52c7 Update zoraxy.sh
tweak
2024-10-25 05:22:56 -04:00
tteckster 744e183eea Update zoraxy.sh
tweak
2024-10-25 05:20:49 -04:00
tteckster 468a5d367d Update zoraxy-install.sh
- breaking change
- switch to binary install
2024-10-25 05:16:08 -04:00
tteckster edf0753120 Update zoraxy.sh
- breaking change
- switch to binary install
2024-10-25 05:14:53 -04:00
tteckster 64eab60a4c Update openwebui-install.sh
tweak
2024-10-24 21:32:06 -04:00
tteckster 5c711293b9 Update paperless-ngx-install.sh
fixes https://github.com/tteck/Proxmox/issues/3964
2024-10-24 06:13:39 -04:00
tteckster 1d83562661 Update actualbudget-install.sh
fix install
2024-10-24 02:34:54 -04:00
Sam Heinz 4626a17332 Port Gitea to arm64
Missed also
2024-10-24 12:51:57 +10:00
Sam Heinz 276ac07651 Port headscale to arm64
Also somehow missed this one
2024-10-24 12:45:34 +10:00
Sam Heinz d26994c597 Port Bunkerweb to arm64
somehow missed it
2024-10-24 12:37:32 +10:00
Sam Heinz 875297b7d2 Remove amd64 proxmox repos from post-inst 2024-10-24 12:33:58 +10:00
tteckster f5978717d4 Update CHANGELOG.md 2024-10-23 21:23:15 -04:00
tteckster 7176eaa99d Update CHANGELOG.md 2024-10-23 14:16:41 -04:00
CanbiZ 2184eab0c5 Add new LXC: Wallos (#3956) 2024-10-23 13:19:53 -04:00
pull[bot] 88da093cf5 Merge pull request #84 from tteck/main
[pull] main from tteck:main
2024-10-23 06:59:48 +00:00
Rémi Bédard-Couture 612979a040 Fix update path for PeaNUT following v3 fix (#3954) 2024-10-22 18:13:10 -04:00
Rémi Bédard-Couture b4732cd8e9 Fix Peanut script following latest release (v3) (#3953) 2024-10-22 16:38:48 -04:00
tteckster 0ab3151825 Update vaultwarden.sh
tweak
2024-10-22 15:26:32 -04:00
Håvard Gjøby Thom 226697f810 Add new LXC: Open WebUI (#3944) 2024-10-22 12:39:54 -04:00
Carmine aadcb5b264 Update USER_SUBMITTED_GUIDES.md (#3948) 2024-10-22 11:46:56 -04:00
Sam Heinz e3ea08b788 Archivebox: externally managed fix 2024-10-22 16:42:09 +10:00
Sam Heinz b097bd0c8b Change containers to privileged
few issues with unprivileged containers, users can manually select if they wish
2024-10-22 16:38:46 +10:00
Sam Heinz 8dd3861a96 Port new scripts to arm64 2024-10-22 16:36:38 +10:00
tteckster c9f7f6447d Update peanut-install.sh
revert test
2024-10-21 21:29:20 -04:00
tteckster 34917b15f5 Update peanut-install.sh
pin version v2.6.1 (test)
2024-10-21 21:20:52 -04:00
tteckster d11ad56158 Update bunkerweb.sh
fixes https://github.com/tteck/Proxmox/issues/3942
2024-10-21 13:02:14 -04:00
tteckster 824710ddd4 Update bunkerweb-install.sh
Update NGINX version to v1.26.2
2024-10-21 12:59:55 -04:00
Sam Heinz 8a4bb5d35d Update README.md 2024-10-21 13:59:44 +10:00
Sam Heinz 007c4cab49 Add unsupported to lldap 2024-10-21 13:55:40 +10:00
Sam Heinz f9f4a53a74 Merge remote-tracking branch 'upstream/main' 2024-10-21 13:41:27 +10:00
tteckster 8206f0b3dc Update zoraxy.sh
"SET RESOURCES" whiptail
2024-10-20 22:16:26 -04:00
tteckster 30a5147fba Update vaultwarden.sh
"SET RESOURCES" whiptail
2024-10-20 22:14:50 -04:00
tteckster 09721e7cae Update umami.sh
"SET RESOURCES" whiptail
2024-10-20 22:13:27 -04:00
tteckster 50ce6fd6df Update nginxproxymanager.sh
"SET RESOURCES" whiptail
2024-10-20 22:09:28 -04:00
tteckster e9940cc535 Update mafl.sh
"SET RESOURCES" whiptail
2024-10-20 22:06:55 -04:00
tteckster 087d635fd4 Update flowiseai.sh
"SET RESOURCES" whiptail
2024-10-20 22:03:56 -04:00
tteckster f75fbc8d50 Update flaresolverr.sh
"SET RESOURCES" whiptail
2024-10-20 22:02:26 -04:00
tteckster 128b076731 Update peanut.sh
"SET RESOURCES" whiptail
2024-10-20 19:17:22 -04:00
ngarafol 95dbf93591 use pm2 with systemd to make pingvin-share survive reboots (#3935) 2024-10-20 17:03:21 -04:00
Jacob 9a0cb6b8f5 Changedetection update enhancements (#3933) 2024-10-20 14:02:09 -04:00
tteckster dbcb900da4 Update tianji.sh
Revert "no update path available"
2024-10-19 21:03:50 -04:00
tteckster cac29c8f5c Update CHANGELOG.md 2024-10-19 20:50:17 -04:00
tteckster 1fb144306c Update CHANGELOG.md 2024-10-19 20:23:11 -04:00
Håvard Gjøby Thom 5b22df5c8e Add new LXC: Neo4j (#3932) 2024-10-19 20:22:35 -04:00
tteckster e2e4784136 Update tianji.sh
no update path available
2024-10-19 13:51:56 -04:00
tteckster e995fb4f30 Update tianji-install.sh
tweak
2024-10-19 13:49:36 -04:00
tteckster dd3a32986a Update cockpit-install.sh
tweak
2024-10-19 11:19:13 -04:00
tteckster 7d26b42163 Update cockpit-install.sh
tweak
2024-10-19 11:10:43 -04:00
tteckster ec24441a2a Update cockpit-install.sh
test
2024-10-19 11:02:23 -04:00
tteckster f3408ed4f3 Update cockpit.sh
increase resources
2024-10-19 10:36:23 -04:00
tteckster efd6d74edb Update cockpit-install.sh
tweak
2024-10-19 10:34:53 -04:00
tteckster dbc4ce0231 Update cockpit-install.sh
use backports
2024-10-19 10:25:42 -04:00
tteckster e643fe6699 Update trilium-install.sh
fix release path
2024-10-19 08:55:49 -04:00
tteckster fe9736fd38 Update trilium.sh
- fix release path changes
- fixes https://github.com/tteck/Proxmox/issues/3930
2024-10-19 08:52:08 -04:00
tteckster 1ec52d08a3 Update changeme to helper-scripts.com 2024-10-18 22:24:27 -04:00
Jacob 32c24f69a7 Fix changedetection install script to support Browserless v2.x (#3928) 2024-10-18 19:10:16 -04:00
Håvard Gjøby Thom 3e2dc1cc1c Add new LXC: Cockpit (#3925) 2024-10-18 12:21:51 -04:00
tteckster 7ae803092e Update archivebox.sh
tweak
2024-10-18 11:24:40 -04:00
tteckster 6ead7e1e5f Update CHANGELOG.md 2024-10-18 09:50:13 -04:00
tteckster e705fb6805 Create archivebox-install.sh 2024-10-18 09:43:42 -04:00
tteckster 23b391b21d Create archivebox.sh 2024-10-18 09:42:23 -04:00
tteckster e377e065a4 Revert "Add new LXC: Kibana (#3920)" (#3922)
This reverts commit 3237e6aced.
2024-10-18 08:30:12 -04:00
T. H. 3237e6aced Add new LXC: Kibana (#3920) 2024-10-18 07:06:17 -04:00
tteckster 22e7ff1f17 Update jellyseerr.sh
tweak
2024-10-17 05:40:01 -04:00
tteckster badff00ee2 Update jellyseerr.sh
add low storage check
2024-10-17 05:30:29 -04:00
tteckster 0665e77a1c Update jellyseerr.sh
more tweaks
2024-10-17 05:15:34 -04:00
tteckster 6e7b5d8022 Update jellyseerr.sh
tweak
2024-10-17 04:27:26 -04:00
tteckster 11c5f518a0 Update jellyseerr.sh
tweak
2024-10-16 23:29:32 -04:00
tteckster 0618c89147 Update evcc.sh
change upgrade command
2024-10-16 12:47:01 -04:00
tteckster b7baf2d1ed Update jellyseerr.sh
tweak
2024-10-16 11:18:05 -04:00
tteckster b323313d6e Update jellyseerr.sh
tweak
2024-10-16 11:05:50 -04:00
tteckster e3160b56af Update jellyseerr.sh
tweak
2024-10-16 11:03:01 -04:00
tteckster d442fa49f5 Update jellyseerr.sh 2024-10-16 10:57:23 -04:00
tteckster 7e061a112f Update jellyseerr.sh
refactor update function
2024-10-16 10:55:49 -04:00
tteckster 221ed9d260 Update jellyseerr-install.sh
- refactor code to utilize `pnpm`
- fixes https://github.com/tteck/Proxmox/issues/3904
2024-10-16 10:33:45 -04:00
tteckster 8847505782 Update jellyseerr.sh
increase build resources
2024-10-16 10:30:50 -04:00
pull[bot] 9703f8d88d Merge pull request #81 from tteck/main
[pull] main from tteck:main
2024-10-15 23:21:02 +00:00
tteckster a9042ffdc1 Update CHANGELOG.md 2024-10-15 17:31:07 -04:00
CanbiZ 301fc39a85 Add new LXC: evcc (#3896) 2024-10-15 05:49:56 -04:00
pull[bot] af5a84fbe0 Merge pull request #80 from tteck/main
[pull] main from tteck:main
2024-10-15 08:30:56 +00:00
tteckster 5dbb000070 Update frigate-install.sh
Add a placeholder for the Frigate+ key in the service file.
2024-10-14 17:47:39 -04:00
Sam Heinz f3d8f9fa76 Merge branch 'main' into main_local 2024-10-14 12:45:44 +10:00
Sam Heinz 715868bda2 Merge remote-tracking branch 'upstream/main' 2024-10-14 12:43:15 +10:00
tteckster d9789d1685 Update README.md 2024-10-11 11:24:01 -04:00
tteckster 80f678a2b3 Update CHANGELOG.md 2024-10-11 11:23:16 -04:00
tteckster f5d1d21ac6 Update build.func
tweak
2024-10-11 11:14:11 -04:00
leiweibau 8d8b152f6f Update pialert-install.sh (#3888)
Future versions will use these packages
2024-10-11 10:33:01 -04:00
CanbiZ 79e0c29e33 Optional Installing of phpMyAdmin for MariaDB (#3885) 2024-10-11 05:01:11 -04:00
tteckster af5218d0a1 Update mysql-install.sh
tweak
2024-10-11 04:51:43 -04:00
tteckster 6fbb8ab4a2 Update CHANGELOG.md 2024-10-10 09:55:32 -04:00
tteckster 36805ae6bb Update tianji.sh
switch to `systemd`
2024-10-10 09:50:54 -04:00
tteckster 4c83a790ac Update tianji-install.sh
switch from `pm2` process management to `systemd`
fixes https://github.com/tteck/Proxmox/issues/3876
2024-10-10 09:49:09 -04:00
tteckster b7fe85cd5b Update CHANGELOG.md 2024-10-10 08:03:13 -04:00
tteckster a10a0f09dd Update mysql-install.sh
tweak
2024-10-10 08:00:58 -04:00
tteckster e9ec4c4f8e Update mysql-install.sh
tweak
2024-10-09 09:24:53 -04:00
tteckster 741f38fe2f Update mysql-install.sh
Create exactly 32 characters of Base64 output
2024-10-09 06:48:53 -04:00
CanbiZ eb881fefa6 Add new LXC: MySQL (#3870) 2024-10-09 06:23:36 -04:00
CanbiZ 6bee7e291e Update tianji-install.sh 2024-10-08 09:41:12 +02:00
CanbiZ 5420269e97 Fix Tianji Installation & Performance-Boost 2024-10-08 09:39:48 +02:00
tteckster 2554560082 Update paperless-ngx-install.sh
test
2024-10-06 20:50:58 -04:00
Rémi Bédard-Couture 6f98a65692 Fix the nginx logs by keeping the process output to stdout instead of pushing directly into log file (#3851) 2024-10-06 14:37:01 -04:00
Sam Heinz 906e01b846 Update Debian VM EFI size 2024-10-06 12:51:59 +10:00
Sam Heinz 7e4d7597df Update EFI size 2024-10-05 19:45:24 +10:00
Sam Heinz 79d77bb22d Remove CPU type from Debian VM 2024-10-05 19:39:50 +10:00
tteckster 72b3876fee Update nginxproxymanager-install.sh
add symlink
2024-10-04 20:53:22 -04:00
tteckster 542a8a619b Update nginxproxymanager-install.sh
tweak
2024-10-04 19:59:20 -04:00
tteckster 97d48dd4b7 Update nginxproxymanager-install.sh
fixes https://github.com/tteck/Proxmox/issues/3841
2024-10-04 18:51:35 -04:00
tteckster 6bb46a5365 Update spoolman.sh
revert https://github.com/tteck/Proxmox/commit/9a17e03a38afbce588b130ceb81b4e0e61d5dafd
2024-10-04 17:49:59 -04:00
tteckster 05062bab40 Update spoolman-install.sh
fixes https://github.com/tteck/Proxmox/issues/3840
2024-10-04 17:40:13 -04:00
Elad Bar 71107fedc4 Update keycloak - Fixes #3833 (#3834) 2024-10-04 03:40:00 -04:00
Elad Bar 8335fbd3d5 Restart traefik after update (#3831)
Fixes #3830
2024-10-04 03:28:13 -04:00
Max Slotov bb6759aae8 Fix Nginx Proxy Manager logrotate user (#3818)
Logs are not rotated and services freeze/die because disk is full. This happens because `npm` user/group doesn't exist and `logrotate.service` can't start.
2024-10-03 12:18:56 -04:00
tteckster 9aec831f92 Update CHANGELOG.md 2024-10-03 06:49:47 -04:00
tteckster f2966ced7f Update homeassistant-core-install.sh
Code refactor
2024-10-03 06:16:12 -04:00
tteckster 6191d8e792 Update homeassistant-core.sh
- Breaking Change 
- Home Assistant has transitioned to using `uv` for module updates.
- No upgrade to 2024.10.0 from old versions. Please create a new LXC.
2024-10-02 22:39:04 -04:00
tteckster f2937febe6 Update homeassistant-core-install.sh
- Breaking Change 
- Home Assistant has transitioned to using `uv` for managing the virtual environment and installing additional modules.
- No upgrade to 2024.10.0 from old versions. Please create a new LXC.
- Fixes https://github.com/tteck/Proxmox/issues/3817
2024-10-02 22:34:56 -04:00
tteckster f2fe361224 remove k0s scripts 2024-10-02 03:58:27 -04:00
tteckster 87a8d9c2d8 Update whoogle.sh
fixes https://github.com/tteck/Proxmox/issues/3810
2024-10-01 12:15:09 -04:00
tteckster 9a17e03a38 Update spoolman.sh
fix upgrade
2024-10-01 12:08:50 -04:00
tteckster 015e8f4393 Update spoolman-install.sh
fix install
2024-10-01 12:03:18 -04:00
pull[bot] 16f5154705 Merge pull request #77 from tteck/main
[pull] main from tteck:main
2024-09-29 06:05:56 +00:00
tteckster 1ff0979cee Update build.func
tweak
2024-09-28 13:18:02 -04:00
Sam Heinz 479a7104fa Update flaresolverr.sh 2024-09-28 16:53:27 +10:00
pull[bot] a0686277f7 Merge pull request #76 from tteck/main
[pull] main from tteck:main
2024-09-28 03:52:06 +00:00
tteckster 1a14c87209 Update postgresql-install.sh
PostgreSQL version 17
2024-09-27 06:00:26 -04:00
pull[bot] 499d564d29 Merge pull request #75 from tteck/main
[pull] main from tteck:main
2024-09-27 07:37:39 +00:00
CanbiZ 4ead590cf4 Tweak for Tianji Update Script (#3794) 2024-09-26 07:06:07 -04:00
CanbiZ 5f34c2c7c8 Tweak for Zipline (#3779)
Zipline is sensitiv with special characters
2024-09-24 13:18:21 -04:00
Jens Bodal f2662027a8 Update changedetection-install.sh (#3778)
The path to this file changed a while back: https://github.com/browserless/browserless/pull/3723/files#diff-81165fc8abb0ab49496bbf329e9efeedc7df0e667f85b4dcfa5c77f6f2c2e799
2024-09-24 07:50:43 -04:00
Sam Heinz 0cea52ddb9 Merge remote-tracking branch 'upstream/main' 2024-09-20 21:18:55 +10:00
tteckster 6a02ba1335 Update stirling-pdf-install.sh
fixes https://github.com/tteck/Proxmox/issues/3756
2024-09-19 13:10:24 -04:00
tteckster e140642b1f Update ersatztv-install.sh
tweak
2024-09-18 15:02:48 -04:00
tteckster 61b0ca67cc Update ersatztv-install.sh
add Hardware Acceleration
2024-09-18 15:00:53 -04:00
tteckster 649590eea7 Update build.func
add ErsatzTV to VAAPI hardware transcoding group
2024-09-18 14:59:21 -04:00
tteckster da30cd5c1e Update build.func
tweak
2024-09-17 15:41:27 -04:00
tteckster ae7217048f Update ersatztv-install.sh
tweak
2024-09-17 05:24:31 -04:00
tteckster 1ea00c4775 Update ersatztv-install.sh
fixes https://github.com/tteck/Proxmox/issues/3741
2024-09-17 05:08:55 -04:00
tteckster 72d3d64a48 Update CHANGELOG.md 2024-09-16 16:06:00 -04:00
CanbiZ 085f1965a3 Add new LXC: Zipline (#3735) 2024-09-16 16:04:30 -04:00
tteckster 9543941d07 Update CHANGELOG.md 2024-09-16 07:21:47 -04:00
CanbiZ 695793a151 Add new LXC: HomeBox (#3734) 2024-09-16 07:18:55 -04:00
tteckster 93ed909fff Update build.func
add warning
2024-09-16 04:11:54 -04:00
tteckster abe337e52d Cleanup 2024-09-16 03:28:45 -04:00
tteckster 8ace224138 Update wireguard.sh
create update path
2024-09-16 03:14:42 -04:00
tteckster 620b652864 Update frigate-install.sh
tweak
2024-09-15 17:13:03 -04:00
tteckster fa2e4786af Update dashy.sh
make update verbose
2024-09-15 17:00:13 -04:00
tteckster e4d342c819 Update CHANGELOG.md 2024-09-15 13:58:15 -04:00
tteckster c567efe374 Add Frigate
Add back to website
2024-09-15 13:57:50 -04:00
tteckster 27bfa24cfe Update frigate-install.sh
fix `install_deps.sh`
2024-09-15 13:46:41 -04:00
tteckster a773864a1a Update CHANGELOG.md 2024-09-15 10:59:24 -04:00
tteckster fe3b17b59d Update CHANGELOG.md 2024-09-15 10:56:35 -04:00
tteckster 02468cc44d Remove Frigate
- Removed from website
  - Nonfunctional
2024-09-15 10:56:25 -04:00
tteckster 1fd5114183 Update tianji-install.sh
- refactor
- fixes https://github.com/tteck/Proxmox/issues/3729
2024-09-15 08:05:19 -04:00
tteckster 80feaf6fa5 Update tianji.sh
increase storage
2024-09-14 16:06:43 -04:00
tteckster b6890ccfbe Update CHANGELOG.md 2024-09-13 17:38:04 -04:00
CanbiZ 3bd32110d9 Add new LXC: Tianji (#3726) 2024-09-13 17:35:36 -04:00
tteckster dc1adaba01 Update nginxproxymanager.sh
comment out `export NODE_OPTIONS=--openssl-legacy-provider`
2024-09-11 13:43:15 -04:00
tteckster b14a33ffac Update spoolman-install.sh
fix `.env` path
2024-09-11 13:23:48 -04:00
tteckster 07df1c8373 Update spoolman.sh
fix `.env` path
fixes https://github.com/tteck/Proxmox/issues/3712
2024-09-11 13:22:38 -04:00
tteckster 0ee61aa092 Update spoolman.sh
revert tweak
2024-09-11 12:22:23 -04:00
tteckster 389b03568d Update spoolman.sh
tweak
2024-09-11 12:07:46 -04:00
Sam Heinz d623c08825 Update flaresolverr.sh 2024-09-11 19:01:34 +10:00
Loren Burkholder c502e413de Add openSUSE support to LXC update scripts (#3683) 2024-09-09 14:15:31 -04:00
Volodymyr Lavrynovych 30850b67f9 Guide about Docker and Portainer was added (#3680) 2024-09-09 06:12:35 -04:00
tteckster 73eaf2e6a5 Update collabora.sh
https://github.com/tteck/Proxmox/discussions/3651
2024-09-07 22:11:14 -04:00
towerhand 6d89c2de12 Update sabnzbd only if a new version is available. (#3664) 2024-09-06 03:05:57 -04:00
tteckster 1e5f4b152e Update sabnzbd-install.sh
add version.txt
2024-09-06 03:04:44 -04:00
tteckster 4cddfa3b12 Update collabora.sh
adjust resources
2024-09-05 11:44:26 -04:00
tteckster 4d9d7a8242 Update pull_request_template.md
tweak
2024-09-05 10:16:14 -04:00
tteckster b129cb1767 Update update-lxcs-cron.sh
tweak
2024-09-05 06:07:26 -04:00
Sam Heinz b7295d7015 Port Lldap and Collabora to arm64 2024-09-04 14:15:02 +10:00
Sam Heinz 4b824b4d5f Update flaresolverr-install.sh
should close #72
2024-09-04 14:09:09 +10:00
Sam Heinz eeb50db0e7 Merge remote-tracking branch 'upstream/main' 2024-09-04 14:08:25 +10:00
tteckster 07895a7c23 Update prometheus-install.sh
Add `version.txt`
2024-09-03 19:59:28 -04:00
tteckster 103ac46a9f Update prometheus.sh
Create update path
2024-09-03 19:58:20 -04:00
Rémi Bédard-Couture 5fb1be4e41 Add scripts for Collabora Online (#3648) 2024-09-03 15:09:57 -04:00
tteckster 86a5c8c1ba Update ubuntu2404-vm.sh
tweak
2024-09-03 14:14:02 -04:00
tteckster c926ed1fbc Update prometheus-install.sh
tweak
2024-09-03 10:54:34 -04:00
Sam Heinz 890be3afbc Update flaresolverr-install.sh
should close #72
2024-09-03 16:31:46 +10:00
tteckster ef55baf25a Revert "Update wireguard-install.sh adding resolvconf (#3642)" (#3645)
This reverts commit cb8318bf08.
2024-09-02 11:59:20 -04:00
tteckster 2d6f2d0e94 Update wireguard-install.sh
revert tweak
2024-09-02 11:56:17 -04:00
tteckster f23b3cea13 Update wireguard-install.sh
tweak
2024-09-02 11:51:54 -04:00
tteckster 030d477cc3 Update wireguard-install.sh
test
2024-09-02 11:36:21 -04:00
Amir cb8318bf08 Update wireguard-install.sh adding resolvconf (#3642) 2024-09-02 08:40:29 -04:00
tteckster e680dab28f Update mariadb-install.sh
fixes https://github.com/tteck/Proxmox/issues/3635
2024-09-01 06:02:16 -04:00
tteckster c9e271dac7 Update CHANGELOG.md 2024-08-31 12:29:04 -04:00
tteckster 75c98d8e68 Update README.md 2024-08-31 11:20:17 -04:00
tteckster 7f66b187fd Update CHANGELOG.md 2024-08-31 11:19:08 -04:00
cmar7945 6cb0bc59d9 Update mikrotik-routeros.sh (#3629)
Update the ZIP extracted from 7.15.2 to 7.15.3, keeping it up to date in the stable branch of the routerOS
2024-08-31 06:07:22 -04:00
tteckster 96c8062405 Update frigate.sh
To update Frigate, create a new container and transfer your configuration.
2024-08-30 11:41:17 -04:00
tteckster 4696040e93 Update jellyfin-install.sh
tweak
2024-08-28 11:42:30 -04:00
tteckster df3047e295 Update jellyfin-install.sh
tweak
2024-08-28 11:35:08 -04:00
tteckster 158c309d71 Update jellyfin-install.sh
https://github.com/tteck/Proxmox/issues/3592
2024-08-28 11:28:46 -04:00
tteckster 253da053fe Update wireguard-install.sh
tweak
2024-08-24 11:02:04 -04:00
tteckster 3fc4aa4a6e Update wireguard-install.sh
tweak
2024-08-24 10:48:37 -04:00
tteckster 9ad778ca52 Update wireguard-install.sh
tweak
2024-08-24 10:38:08 -04:00
tteckster 9d76662d76 Update wireguard-install.sh
try again to configure Network Address Translation
2024-08-24 10:26:56 -04:00
tteckster fef858ed7b Update wireguard-install.sh
revert changes
2024-08-24 10:12:57 -04:00
tteckster 4844a00316 Update wireguard-install.sh
tweak
2024-08-24 10:08:27 -04:00
tteckster d5e66a25ff Update wireguard-install.sh
tweak
2024-08-24 09:52:59 -04:00
tteckster 2281a20b75 Update wireguard-install.sh
tweak
2024-08-24 09:47:37 -04:00
tteckster 21abd09052 Update wireguard-install.sh
configure Network Address Translation
2024-08-24 09:15:31 -04:00
kabroxiko 7d77be87d5 Update plex-install.sh (#3580)
- install gpg to avoid plexupdate warning
2024-08-24 08:24:06 -04:00
pull[bot] cbde1b8419 Merge pull request #70 from tteck/main
[pull] main from tteck:main
2024-08-23 20:14:57 +00:00
tteckster bb0a39e3c4 Update calibre-web.sh
fixes https://github.com/tteck/Proxmox/issues/3576
2024-08-23 11:39:31 -04:00
Sam Heinz 553e514ed8 Merge remote-tracking branch 'upstream/main' 2024-08-22 19:08:47 +10:00
tteckster 561419f1a2 Update CHANGELOG.md 2024-08-21 16:14:24 -04:00
tteckster 723365a79d Update wireguard-install.sh
- refactor code
- breaking change
2024-08-21 16:12:01 -04:00
tteckster 9d579083bf Update wireguard.sh
- refactor code
- breaking change
2024-08-21 16:10:49 -04:00
tteckster de1a4b0914 Update CHANGELOG.md 2024-08-19 08:09:44 -04:00
tteckster aec826bbb3 Update commafeed.sh
tweak
2024-08-19 08:03:54 -04:00
tteckster 9db6aa8fbb Update commafeed-install.sh
add rsync as a dependency
2024-08-19 08:01:36 -04:00
tteckster bfa2b0c0ee Update commafeed.sh
tweak
2024-08-19 07:58:58 -04:00
tteckster 52bfc1725f Update commafeed.sh
refactor
2024-08-19 07:56:39 -04:00
tteckster 0a33d1739e Update commafeed-install.sh
refactor
closes https://github.com/tteck/Proxmox/issues/3551
2024-08-19 07:35:44 -04:00
tteckster 28085bb2e7 Update alpine-vaultwarden.sh
restart vaultwarden
2024-08-18 22:30:57 -04:00
tteckster 631ef46466 Update bunkerweb.sh
nginx=1.26.1*
2024-08-17 06:47:34 -04:00
tteckster 604b7ee628 Update bunkerweb-install.sh
Install nginx=1.26.1*
2024-08-17 06:44:53 -04:00
tteckster 72dfc20090 Update changedetection-install.sh
use browserless v2
https://github.com/dgtlmoon/changedetection.io/discussions/1953
2024-08-13 08:43:41 -04:00
tteckster aca97a3da3 Update frigate-install.sh
revert service files
2024-08-12 10:19:08 -04:00
tteckster e4ad002ce5 Update frigate-install.sh
make `ln` command silent
2024-08-12 07:24:04 -04:00
tteckster 448cf93163 Update matterbridge.sh
tweak
2024-08-11 08:50:55 -04:00
tteckster 41b63495db Update matterbridge.sh
refactor update
2024-08-11 08:49:29 -04:00
tteckster 08debd9442 Update matterbridge-install.sh
create directory
2024-08-11 08:42:40 -04:00
tteckster a28eb2fd46 Update matterbridge-install.sh
refactor
fixes https://github.com/tteck/Proxmox/issues/3499
2024-08-11 08:34:02 -04:00
tteckster 3c41499074 Update frigate-install.sh
clean up code
2024-08-11 05:51:33 -04:00
Sam Heinz 858e58d7fd Merge pull request #68 from tteck/main
[pull] main from tteck:main
2024-08-11 18:41:40 +10:00
tteckster 88de3536ab Update frigate-install.sh
test
2024-08-10 12:55:05 -04:00
Sam Heinz d43e2ca4e1 Merge remote-tracking branch 'upstream/main' 2024-08-09 23:27:37 +10:00
Rémi Bédard-Couture 23ebc32489 Support frigate latest release (#3495) 2024-08-09 01:06:02 -04:00
tteckster 2782502e06 Update frigate-install.sh
pin version to 13.2
2024-08-08 13:41:56 -04:00
tteckster 9c88dcdbd6 Update trilium.sh
Switch to TriliumNext
2024-08-08 12:23:46 -04:00
tteckster e428bb8604 Update trilium-install.sh
switch to TriliumNext
2024-08-08 12:21:17 -04:00
indiscreettuna daa896894d Allow git clone over SSH (#3490) 2024-08-08 04:36:34 -04:00
Sam Heinz 34fb023df4 Handle frigate CT stopped gracefully
Should close #64
2024-08-08 07:08:39 +10:00
Sam Heinz f95165b5ce Revert Wastebin changes
No arm64 binaries available
2024-08-08 06:57:34 +10:00
Sam Heinz 43a3e0ef23 Merge branch 'main-upstream' 2024-08-08 06:56:12 +10:00
Florian Pitance 6d1cc92b59 BunkerWeb Use repo.bunkerweb.io instead of packagecloud.io (#3484)
We have fixed the issues with our repository at repo.bunkerweb.io, you can now use the new address.
2024-08-07 11:27:19 -04:00
tteckster 92452db3e5 Update CHANGELOG.md 2024-08-06 15:32:57 -04:00
tteckster d26e474ccb Update install.func
add a one second delay before checking internet connectivity
2024-08-06 13:25:55 -04:00
tteckster b66590f976 Update linkwarden.sh
add `yarn playwright install`
2024-08-05 17:09:26 -04:00
tteckster 4a1e02a9ab Update linkwarden-install.sh
add `yarn playwright install`
2024-08-05 17:06:48 -04:00
tteckster ddb6551565 Update lldap-install.sh
Refactor
2024-08-05 06:03:44 -04:00
tteckster 20fb0ce808 Update lldap.sh
tweak
2024-08-05 05:03:19 -04:00
Rémi Bédard-Couture c4b6ea33aa Add script for Lldap (#3455) 2024-08-05 04:58:22 -04:00
tteckster a5fece4292 Update n8n.sh
fixes https://github.com/tteck/Proxmox/issues/3470
2024-08-04 23:21:49 -04:00
tteckster 232919d6be Update wastebin-install.sh
tweak
2024-08-04 17:10:38 -04:00
tteckster d21760cc65 Update wastebin-install.sh
Refactor
Fixes https://github.com/tteck/Proxmox/issues/3465
2024-08-04 17:07:52 -04:00
tteckster 341e873eba Update wastebin.sh
Refactor
2024-08-04 17:06:19 -04:00
tteckster d073535346 Update bunkerweb-install.sh
switch repo back to packagecloud
2024-07-30 07:48:03 -04:00
Kieran Hannigan b567bd848b Allow octoprint user to perform system functions (#3444) 2024-07-30 06:58:21 -04:00
tteckster bfce73c0ed Update README.md 2024-07-28 09:01:04 -04:00
tteckster 880a0f52ec Update CHANGELOG.md 2024-07-28 08:58:38 -04:00
Sam Heinz ea1cef7db5 Merge branch 'main-upstream' 2024-07-28 21:15:21 +10:00
tteckster 026b0f4105 Update radarr.sh
tweak
2024-07-27 12:51:12 -04:00
tteckster b108b6e373 Update update-lxcs.sh
tweak
2024-07-27 12:48:42 -04:00
tteckster fabbe5925b Update README.md
tweak
2024-07-27 07:07:09 -04:00
tteckster 5e561a1b78 Update traefik.sh
tweak
2024-07-27 06:55:30 -04:00
Peter Stalman a35e23916e Update traefik-install.sh (#3431) 2024-07-27 06:54:20 -04:00
vrozaksen f59c1227be Update gitea.sh (#3426)
Fix permissions
https://docs.gitea.com/installation/install-from-binary
2024-07-26 12:04:40 -04:00
tteckster 32ae8c1f4f Update CHANGELOG.md 2024-07-26 06:03:56 -04:00
tteckster 2c58bc987c Update gitea.sh
increase ram to 1024
2024-07-26 05:37:09 -04:00
tteckster 136f667126 Update gitea-install.sh
add SQLite3
2024-07-26 05:22:40 -04:00
Miguel Muniz ae49faec93 Add new LXC: Gitea (#3419) 2024-07-26 05:07:38 -04:00
tteckster b73557c14f Update ersatztv-install.sh
fixes https://github.com/tteck/Proxmox/issues/3422
2024-07-25 13:50:00 -04:00
tteckster 8db7e57819 Update keycloak.sh
fix URL
2024-07-23 12:13:35 -04:00
tteckster d18e37166d Update bunkerweb-install.sh
Refactor to eliminate script execution within another script, making the code easier to review.
2024-07-22 06:39:34 -04:00
tteckster 80fb3ee841 Update update-lxcs-cron.sh
fixes https://github.com/tteck/Proxmox/issues/3408
2024-07-21 07:11:36 -04:00
Sam Heinz 2af0be0e0f Merge branch 'main-upstream' 2024-07-21 15:58:56 +10:00
tteckster 6c155c7463 Update ersatztv.sh
Refactor `function update_script ()`
fixes https://github.com/tteck/Proxmox/issues/3404
2024-07-20 12:44:27 -04:00
tteckster 2febf2c39b Update unifi.sh
add AVX instruction set check
2024-07-20 06:20:20 -04:00
tteckster cfa1b2e04d Update vaultwarden.sh
tweak
2024-07-17 13:48:42 -04:00
tteckster 9deea7a983 Update vaultwarden.sh
add Admin Token to `/opt/vaultwarden/data/config.json`
2024-07-17 13:32:26 -04:00
tteckster 00a8f07170 Update CHANGELOG.md 2024-07-16 14:04:50 -04:00
tteckster 9cbd0f3037 Update install.func
fixes https://github.com/tteck/Proxmox/issues/3386
2024-07-16 11:27:55 -04:00
tteckster bf40c30fff Update haos-vm.sh
add local-zfs
2024-07-16 01:19:16 -04:00
pull[bot] 466f994bb3 Merge pull request #62 from tteck/main
[pull] main from tteck:main
2024-07-14 02:37:59 +00:00
tteckster e3da97472e Update CHANGELOG.md 2024-07-13 16:11:36 -04:00
tteckster 2446b6599f Update pingvin-install.sh
fixes https://github.com/tteck/Proxmox/issues/3373
2024-07-13 13:28:19 -04:00
tteckster 19fef65ac0 Update CHANGELOG.md 2024-07-13 00:26:39 -04:00
tteckster 8892fd960f Update CHANGELOG.md 2024-07-12 23:44:56 -04:00
Sam Heinz 7dbdd43781 Merge branch 'main-upstream' 2024-07-09 12:13:33 +10:00
Sam Heinz e46374a045 [Overseerr] Change default RAM
#60
2024-07-08 21:25:43 +10:00
tteckster 22c7801217 Update mikrotik-routeros.sh
chr-7.15.2
2024-07-07 16:40:15 -04:00
Mathijs Groothuis 3a65f89cab Update calibre-web.sh (#3346) 2024-07-07 11:50:10 -04:00
pull[bot] dea64a66cf Merge pull request #59 from tteck/main
[pull] main from tteck:main
2024-07-06 15:38:47 +00:00
Sam Heinz 0442f78b86 Update Flaresolverr status 2024-07-06 23:27:13 +10:00
Sam Heinz 8ecee69f79 Fix typo in wget command 2024-07-06 16:21:37 +10:00
Sam Heinz 446e874dc1 [Flaresolverr] Change Chrome Webdriver to arm64 vers 2024-07-06 16:13:57 +10:00
Sam Heinz 0ee5ec3d84 Update Flaresolverr status 2024-07-05 22:59:40 +10:00
tteckster 186f186e8b Update pingvin.sh
fixes https://github.com/tteck/Proxmox/issues/3331
2024-07-05 01:09:30 -04:00
Sam Heinz 9487fff510 Merge pull request #58 from tteck/main
[pull] main from tteck:main
2024-07-05 08:21:59 +10:00
tteckster 8562dd1b93 Update jellyseerr-install.sh
switch back to the main branch
2024-07-04 10:56:52 -04:00
tteckster dad9da5e67 Update jellyseerr.sh
tweak update (main branch)
2024-07-04 10:55:39 -04:00
tteckster 496b9bf92c Update traefik.sh
hard-code version
2024-07-03 13:14:12 -04:00
tteckster 6596850918 Update traefik-install.sh
hard-code version
2024-07-03 13:12:59 -04:00
tteckster fc5ea73e45 Update bunkerweb.sh
change the "hold" method
2024-07-03 10:24:42 -04:00
tteckster f64e8ef47b Update bunkerweb-install.sh
change the "hold" method
2024-07-03 10:22:46 -04:00
tteckster e6b86f3d47 Update bunkerweb.sh
tweak
2024-07-03 10:04:23 -04:00
tteckster 7daad62fad Update bunkerweb-install.sh
hold bunkerweb version
2024-07-03 10:01:49 -04:00
tteckster 15be0761ff Update bunkerweb-install.sh
fix curly braces
2024-07-03 09:38:44 -04:00
tteckster 5ef5f0086e Update bunkerweb.sh
- works for 1.5.8 and newer
- if the update fails with 1.5.7 execute 
`RELEASE=$(curl -s https://api.github.com/repos/bunkerity/bunkerweb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
apt-get install -y bunkerweb=${RELEASE}` in the LXC console
2024-07-03 09:26:20 -04:00
tteckster 85418addac Update bunkerweb-install.sh
always install the newest release
2024-07-03 09:21:41 -04:00
tteckster ef27851d31 Update bunkerweb.sh
tweak `function update_script()`
2024-07-03 09:06:30 -04:00
pull[bot] e53542834f Merge pull request #57 from tteck/main
[pull] main from tteck:main
2024-07-03 04:28:02 +00:00
tteckster 5fcae037c2 Update photoprism-install.sh
tweak
2024-07-02 20:23:52 -04:00
Sam Heinz cd0df16a32 Fix LXC updates 2024-07-02 19:19:21 +10:00
tteckster eab4160c33 Update frigate-install.sh
fixes https://github.com/tteck/Proxmox/issues/3315
2024-07-02 02:59:33 -04:00
212 changed files with 19007 additions and 791 deletions
+136 -14
View File
@@ -3,27 +3,149 @@
<img src="https://raw.githubusercontent.com/tteck/Proxmox/main/misc/images/logo.png" height="100px" />
</a>
</div>
<h1 align="center">Change Log</h1>
<h1 align="center">Changelog</h1>
<h3 align="center">All notable changes to this project will be documented in this file.</h3>
- All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
> [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
> [!NOTE]
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
## 2024-10-27
### Changed
- **Open WebUI LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/8a21f6e7f025a911865395d4c0fa9a001bd0d512)
- Refactor Script to add an option to install Ollama.
## 2024-10-26
### Changed
- **AdventureLog LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/adventurelog-install.sh)
- NEW Script
## 2024-10-25
### Changed
- **Zoraxy LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/468a5d367ded4cf453a1507452e112ac3e234e2a)
- Switch built from source to a pre-compiled binary version.
- Breaking Change
## 2024-10-23
### Changed
- **Wallos LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/wallos-install.sh)
- NEW Script
- **Open WebUI LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/openwebui-install.sh)
- NEW Script
## 2024-10-19
### Changed
- **Cockpit LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/cockpit-install.sh)
- NEW Script
- **Neo4j LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/neo4j-install.sh)
- NEW Script
## 2024-10-18
### Changed
- **ArchiveBox LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/archivebox-install.sh)
- NEW Script
## 2024-10-15
### Changed
- **evcc LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/evcc-install.sh)
- NEW Script
## 2024-10-10
### Changed
- **MySQL LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/mysql-install.sh)
- NEW Script
- **Tianji LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/4c83a790ac9b040da1f11ad2cbe13d3fc5f480e9)
- Breaking Change
- Switch from `pm2` process management to `systemd`
## 2024-10-03
### Changed
- **Home Assistant Core LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/f2937febe69b2bad8b3a14eb84aa562a8f14cc6a) [(Commit)](https://github.com/tteck/Proxmox/commit/f2966ced7f457fd506f865f7f5b70ea12c4b0049)
- Refactor Code
- Breaking Change
- Home Assistant has transitioned to using `uv` for managing the virtual environment and installing additional modules.
## 2024-09-16
### Changed
- **HomeBox LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/homebox-install.sh)
- NEW Script
- **Zipline LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/zipline-install.sh)
- NEW Script
## 2024-09-13
### Changed
- **Tianji LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/tianji-install.sh)
- NEW Script
## 2024-08-21
### Changed
- **WireGuard LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/723365a79df7cc0fd29b1af8f7ef200a7e0921b1)
- Refactor Code
- Breaking Change
## 2024-08-19
### Changed
- **CommaFeed LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/0a33d1739ec3a49011411929bd46a260e92e99f9)
- Refactor Code
- Breaking Change
## 2024-08-06
### Changed
- **lldap LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/lldap-install.sh)
- NEW Script
## 2024-07-26
### Changed
- **Gitea LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/gitea-install.sh)
- NEW Script
## 2024-06-30
### Changed
- **All Scripts**
- **All Scripts** [(Commit)](https://github.com/tteck/Proxmox/commit/39ea1d4a20b83c07d084ebafdc811eec3548f289)
- Requires Proxmox Virtual Environment version 8.1 or later.
## 2024-06-27
### Changed
- **Kubo LXC**
- **Kubo LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/kubo-install.sh)
- NEW Script
- **RabbitMQ LXC**
- **RabbitMQ LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/rabbitmq-install.sh)
- NEW Script
- **Scrutiny LXC**
- Removed from website, broken.
@@ -39,27 +161,27 @@
### Changed
- **MySpeed LXC**
- **MySpeed LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/myspeed-install.sh)
- NEW Script
## 2024-06-13
### Changed
- **PeaNUT LXC**
- **PeaNUT LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/peanut-install.sh)
- NEW Script
- **Website**
- If the Changelog has changed recently, the link on the website will pulse.
- **Spoolman LXC**
- **Spoolman LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/spoolman-install.sh)
- NEW Script
## 2024-06-12
### Changed
- **MeTube LXC**
- **MeTube LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/metube-install.sh)
- NEW Script
- **Matterbridge LXC**
- **Matterbridge LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/matterbridge-install.sh)
- NEW Script
- **Website**
- Reopen the gh-pages site (https://tteck.github.io/Proxmox/)
@@ -68,14 +190,14 @@
### Changed
- **Zabbix LXC**
- **Zabbix LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/zabbix-install.sh)
- NEW Script
## 2024-06-06
### Changed
- **Petio LXC**
- **Petio LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/petio-install.sh)
- NEW Script
- **Website**
- Important notices will now be displayed on the landing page.
@@ -84,14 +206,14 @@
### Changed
- **FlareSolverr LXC**
- **FlareSolverr LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/flaresolverr-install.sh)
- NEW Script
## 2024-05-31
### Changed
- **Advanced Settings**
- **Advanced Settings** [(Commit)](https://github.com/tteck/Proxmox/commit/fc9dff220b4ea426d3a75178ad8accacae4683ca)
- Passwords are now masked
## 2024-05-30
+2 -195
View File
@@ -31,199 +31,6 @@ Any issues with the scripts, please put an issue within this repository rather t
If you would like to offer support, I would appreciate a star on the repository, or for you to support the creator of the Proxmox scripts [tteck on Ko-Fi](https://ko-fi.com/D1D7EP4GF)!
## VM Compatibility Guide
## Compatibility Guide
| Icon | Description |
| ---- | -------------------------------------------------- |
| ☑️ | Creating the LXC using the script has been tested. |
| ⭕ | Install script is ported, but has not been tested. |
| ❌ | Unsupported. View notes for reason. |
| 🔘 | Install script not ported to ARM64. |
| OS | Status | Notes |
| ------------------------------- | ------ | -------------------------------------------------------------------------------------------------------- |
| Debian | ⭕ | Needs testing. |
| Home Assistant OS | ❌ | Use Pimox HAOS VM script. |
| Mikrotik RouterOS | ❌ | No arm64 image available. |
| NextCloud | ❌ | No arm64 image available. Not present on website. |
| OpenWRT | ⭕ | Needs testing. |
| OwnCloud | ❌ | No arm64 image available. |
| Pimox HAOS | ☑️ | |
| Ubuntu 22.04 | ⭕ | Needs testing. |
| Ubuntu 24.04 | ⭕ | Needs testing. |
## LXC Compatibility Guide
| App | Status | Notes |
| ------------------------------- | ------ | -------------------------------------------------------------------------------------------------------- |
| Actual Budget | ☑️ | |
| AdGuard Home | ☑️ | |
| AgentDVR | ☑️ | |
| Apache-Cassandra | ☑️ | |
| Alpine Docker | ☑️ | |
| Alpine Grafana | ☑️ | |
| Alpine | ☑️ | |
| Alpine Nextcloud | ☑️ | |
| Alpine Vaultwarden | ☑️ | |
| Alpine Zigbee2mqtt | ☑️ | |
| Apache-CouchDB | ☑️ | |
| Apt-Cacher-NG | ☑️ | Won't work with Debian template from before 2024/06/08 (need to delete tar /var/lib/vz/template/cache/). |
| Aria2 | ☑️ | |
| Audiobookshelf | ☑️ | |
| Autobrr | ☑️ | |
| Bazarr | ☑️ | |
| Blocky | ☑️ | |
| Caddy | ☑️ | |
| Calibre-Web | ☑️ | |
| CasaOS | ☑️ | |
| Change Detection | ☑️ | |
| Channels DVR Server | ☑️ | |
| Cloudflared | ☑️ | |
| CommaFeed | ☑️ | |
| Cronicle Primary | ☑️ | |
| Dashy | ☑️ | |
| deCONZ | ☑️ | |
| Daemon Sync Server | ❌ | Built for x64 only. |
| Debian | ☑️ | |
| Deluge | ☑️ | |
| Docker | ☑️ | |
| Dockge | ☑️ | |
| Emby Media Server | ☑️ | |
| EMQX | ☑️ | |
| ErsatzTV | ☑️ | |
| ESPHome | ☑️ | |
| Fenrus | ☑️ | |
| FHEM | ☑️ | |
| FlareSolverr | ☑️ | |
| FlowiseAI | ☑️ | |
| Forgejo | ☑️ | |
| Frigate | ☑️ | |
| go2rtc | ☑️ | |
| Gokapi | ☑️ | |
| Gotify | ☑️ | |
| Grafana | ☑️ | |
| grocy | ☑️ | |
| Heimdall Dashboard | ☑️ | |
| HiveMQ CE | ☑️ | |
| Homarr | ☑️ | |
| Home Assistant Core | ☑️ | |
| Home Assistant Container | ☑️ | |
| Homebridge | ☑️ | |
| Homepage | ☑️ | |
| Homer | ☑️ | |
| HyperHDR | ☑️ | |
| Hyperion | ☑️ | |
| InfluxDB | ☑️ | |
| ioBroker | ☑️ | |
| iVentoy | ☑️ | |
| Jackett | ☑️ | |
| Jellyfin Media Server | ☑️ | |
| Jellyseerr | ☑️ | |
| k0s | ☑️ | |
| Kavita | ☑️ | |
| Keycloak | ☑️ | |
| Kubo | ☑️ | |
| LazyLibrarian | ☑️ | |
| Lidarr | ☑️ | |
| Linkwarden | ☑️ | |
| Mafl | ☑️ | |
| MagicMirror Server | ☑️ | |
| Mariadb | ☑️ | |
| Matterbridge | ☑️ | |
| MediaMTX | ☑️ | |
| Medusa | ☑️ | |
| MeshCentral | ☑️ | |
| MeTube | ☑️ | |
| MongoDB | ☑️ | Only supports ARMv8.2-a currently. (no RPI4 support). |
| MotionEye NVR | ☑️ | |
| MQTT | ☑️ | |
| n8n | ☑️ | |
| MySpeed | ☑️ | |
| Navidrome | ☑️ | |
| NextCloudPi | ☑️ | |
| Nginx Proxy Manager | ☑️ | |
| NocoDB | ☑️ | |
| Node-Red | ☑️ | |
| Notifiarr | ☑️ | |
| ntfy | ☑️ | |
| OctoPrint | ☑️ | |
| Omada Controller | ☑️ | |
| Ombi | ☑️ | |
| OpenMediaVault | ☑️ | |
| openHAB | ☑️ | |
| OpenObserve | ☑️ | |
| Overseerr | ☑️ | |
| Owncast | ☑️ | |
| PairDrop | ☑️ | |
| Paperless-ngx | ☑️ | |
| PBS | ☑️ | Proxmox Backup Server |
| PeaNUT | ☑️ | |
| Petio | ☑️ | Only supports ARMv8.2-a currently. (no RPI4 support). |
| PhotoPrism | ☑️ | |
| Pi.Alert | ☑️ | |
| Pi-Hole | ☑️ | |
| Pingvin Share | ☑️ | |
| Plex Media Server | ☑️ | |
| Pocketbase | ☑️ | |
| Podman Home Assistant Container | ☑️ | |
| Podman | ☑️ | |
| PostgreSQL | ☑️ | |
| Prometheus | ☑️ | |
| Prowlarr | ☑️ | |
| qBittorrent | ☑️ | |
| RabbitMQ | ☑️ | |
| Radarr | ☑️ | |
| RDTClient | ☑️ | Real-Debrid Torrent Client |
| Readarr | ☑️ | |
| Readeck | ☑️ | |
| Redis | ☑️ | |
| RTSPtoWeb | ☑️ | |
| Runtipi | ☑️ | |
| SABnzbd | ☑️ | |
| Scrypted | ☑️ | |
| Scrutiny | ☑️ | |
| SFTPGo | ☑️ | |
| Shinobi NVR | ☑️ | |
| SmokePing | ☑️ | |
| Sonarr | ☑️ | |
| SpoolMan | ☑️ | |
| Stirling-PDF | ☑️ | |
| Syncthing | ☑️ | |
| Tandoor Recipes | ☑️ | |
| TasmoAdmin | ☑️ | |
| Tautulli | ☑️ | |
| Tdarr | ☑️ | |
| Technitium DNS | ☑️ | |
| Threadfin | ☑️ | |
| Traccar | ☑️ | |
| Traefik | ☑️ | |
| Transmission | ☑️ | |
| Trilium | ❌ | Built for x64 only. |
| Umami | ☑️ | |
| Ubuntu | ☑️ | |
| Umbrel | ☑️ | |
| UniFi Network Server | ☑️ | |
| Unmanic | ☑️ | |
| Uptime Kuma | ☑️ | |
| Vaultwarden | ☑️ | Will probably work on default install if you have a lot of ram. Otherwise use the Alpine Linux version. |
| Wastebin | ☑️ | |
| WatchYourLAN | ☑️ | |
| Whisparr | ☑️ | |
| Whoogle | ☑️ | |
| Wiki.js | ☑️ | |
| WireGuard | ☑️ | |
| YunoHost | ☑️ | |
| Zabbix | ☑️ | |
| Zigbee2MQTT | ☑️ | |
| Zoraxy | ☑️ | |
| Z-Wave JS UI | ☑️ | |
## Miscellaneous Compatibility Guide
| Script | Status | Notes |
| -------------- | ------ | -------------------- |
| File Browser | ☑️ | |
| OliveTin | ☑️ | |
| NetBird | ☑️ | No changes required. |
| Tailscale | ☑️ | No changes required. |
| VS Code Server | ☑️ | |
[View Compatibility Guide here](https://pimox-scripts.com)
+4
View File
@@ -38,3 +38,7 @@
[Proxmox + NetData](<https://dbt3ch.com/books/proxmox-netdata-for-better-insights-and-notifications/page/proxmox-netdata-for-better-insights-and-notifications>)
[Proxmox Homelab Series](<https://blog.kye.dev/proxmox-series>)
[The fastest installation of Docker and Portainer on Proxmox VE](https://lavr.site/en-fastest-install-docker-portainer-proxmox/)
[How To Setup Proxmox Backuper Server Using Helper Scripts](<https://youtu.be/6C2JOsrZZZw?si=kkrrcL_nLCDBJkOB>)
+110
View File
@@ -0,0 +1,110 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
___ __ __ __
/ | ____/ / _____ ____ / /___ __________ / / ____ ____ _
/ /| |/ __ / | / / _ \/ __ \/ __/ / / / ___/ _ \/ / / __ \/ __ `/
/ ___ / /_/ /| |/ / __/ / / / /_/ /_/ / / / __/ /___/ /_/ / /_/ /
/_/ |_\__,_/ |___/\___/_/ /_/\__/\__,_/_/ \___/_____/\____/\__, /
/____/
EOF
}
header_info
echo -e "Loading..."
APP="AdventureLog"
var_disk="7"
var_cpu="2"
var_ram="2048"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/adventurelog ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
RELEASE=$(curl -s https://api.github.com/repos/seanmorley15/AdventureLog/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Services"
systemctl stop adventurelog-backend
systemctl stop adventurelog-frontend
msg_ok "Services Stopped"
msg_info "Updating ${APP} to ${RELEASE}"
cp /opt/adventurelog/backend/server/.env /opt/server.env
cp /opt/adventurelog/frontend/env /opt/frontend.env
wget -q "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
unzip -q v${RELEASE}.zip
mv AdventureLog-${RELEASE} /opt/adventurelog
mv /opt/server.env /opt/adventurelog/backend/server/.env
cd /opt/adventurelog/backend/server
pip install --upgrade pip &>/dev/null
pip install -r requirements.txt &>/dev/null
python3 manage.py collectstatic --noinput &>/dev/null
python3 manage.py migrate &>/dev/null
mv /opt/frontend.env /opt/adventurelog/frontend/.env
cd /opt/adventurelog/frontend
pnpm install &>/dev/null
pnpm run build &>/dev/null
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP}"
msg_info "Starting Services"
systemctl start adventurelog-backend
systemctl start adventurelog-frontend
msg_ok "Started Services"
msg_info "Cleaning Up"
rm -rf v${RELEASE}.zip
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} Setup should be reachable by going to the following URL.
${BL}http://${IP}:3000${CL} \n"
+1 -1
View File
@@ -71,7 +71,7 @@ function update_script() {
header_info
case $CHOICE in
1)
apk update && apk upgrade
apk update && apk upgrade && rc-service vaultwarden restart -q
exit
;;
2)
+86
View File
@@ -0,0 +1,86 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
___ __ _ ____
/ | __________/ /_ (_) _____ / __ )____ _ __
/ /| | / ___/ ___/ __ \/ / | / / _ \/ __ / __ \| |/_/
/ ___ |/ / / /__/ / / / /| |/ / __/ /_/ / /_/ /> <
/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_|
EOF
}
header_info
echo -e "Loading..."
APP="ArchiveBox"
var_disk="8"
var_cpu="2"
var_ram="1024"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/archivebox ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
msg_info "Stopping ${APP}"
systemctl stop archivebox
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP}"
cd /opt/archivebox/data
pip install --upgrade --ignore-installed archivebox
sudo -u archivebox archivebox init
msg_ok "Updated ${APP}"
msg_info "Starting ${APP}"
systemctl start archivebox
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:8000/admin/login${CL} \n"
+20 -5
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
# License: MIT
@@ -55,10 +55,25 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /etc/bunkerweb ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated $APP"
RELEASE=$(curl -s https://api.github.com/repos/bunkerity/bunkerweb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to ${RELEASE}"
cat <<EOF >/etc/apt/preferences.d/bunkerweb
Package: bunkerweb
Pin: version ${RELEASE}
Pin-Priority: 1001
EOF
apt-get update
apt-get install -y nginx=1.26.2*
apt-get install -y bunkerweb=${RELEASE}
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
+2 -4
View File
@@ -65,8 +65,6 @@ function update_script() {
rm kepubify-linux-arm64
curl -fsSLO https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-arm64 &>/dev/null
chmod +x kepubify-linux-arm64
rm /opt/calibre-web/metadata.db
wget https://github.com/janeczku/calibre-web/raw/master/library/metadata.db -P /opt/calibre-web
menu_array=("1" "Enables gdrive as storage backend for your ebooks" OFF \
"2" "Enables sending emails via a googlemail account without enabling insecure apps" OFF \
"3" "Enables displaying of additional author infos on the authors page" OFF \
@@ -83,7 +81,7 @@ function update_script() {
line=0
elif [ $i == "gmail" ]; then
line=1
elif [ $i == "goodreads" ]; then
elif [ $i == "goodreads" ]; then
line=2
elif [ $i == "ldap" ]; then
line=3
@@ -104,8 +102,8 @@ function update_script() {
CHOICES=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CALIBRE-WEB OPTIONS" --separate-output --checklist "Choose Additional Options" 15 125 8 "${menu_array[@]}" 3>&1 1>&2 2>&3)
spinner &
SPINNER_PID=$!
options=()
if [ ! -z "$CHOICES" ]; then
declare -a options
for CHOICE in $CHOICES; do
case "$CHOICE" in
"1")
+11
View File
@@ -62,6 +62,17 @@ if ! dpkg -s libjpeg-dev >/dev/null 2>&1; then
fi
pip3 install changedetection.io --upgrade &>/dev/null
pip3 install playwright --upgrade &>/dev/null
if [[ -f /etc/systemd/system/browserless.service ]]; then
git -C /opt/browserless/ fetch --all &>/dev/null
git -C /opt/browserless/ reset --hard origin/main &>/dev/null
npm update --prefix /opt/browserless &>/dev/null
npm run build --prefix /opt/browserless &>/dev/null
npm run build:function --prefix /opt/browserless &>/dev/null
npm prune production --prefix /opt/browserless &>/dev/null
systemctl restart browserless
else
msg_error "No Browserless Installation Found!"
fi
systemctl restart changedetection
msg_ok "Updated Successfully"
exit
+125
View File
@@ -0,0 +1,125 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: havardthom
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
______ __ _ __
/ ____/___ _____/ /______ (_) /_
/ / / __ \/ ___/ //_/ __ \/ / __/
/ /___/ /_/ / /__/ ,< / /_/ / / /_
\____/\____/\___/_/|_/ .___/_/\__/
/_/
EOF
}
header_info
echo -e "Loading..."
APP="Cockpit"
var_disk="4"
var_cpu="2"
var_ram="1024"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
if [[ ! -d /etc/cockpit ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
"1" "Update LXC" ON \
"2" "Install cockpit-file-sharing" OFF \
"3" "Install cockpit-identities" OFF \
"4" "Install cockpit-navigator" OFF \
3>&1 1>&2 2>&3)
header_info
if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated ${APP} LXC"
exit
fi
if [ "$UPD" == "2" ]; then
msg_info "Installing dependencies (patience)"
apt-get install -y attr &>/dev/null
apt-get install -y nfs-kernel-server &>/dev/null
apt-get install -y samba &>/dev/null
apt-get install -y samba-common-bin &>/dev/null
apt-get install -y winbind &>/dev/null
apt-get install -y gawk &>/dev/null
msg_ok "Installed dependencies"
msg_info "Installing Cockpit file sharing"
LATEST=$(curl -s https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q https://github.com/45Drives/cockpit-file-sharing/releases/download/v${LATEST}/cockpit-file-sharing_${LATEST}-1focal_all.deb
dpkg -i cockpit-file-sharing_${LATEST}-1focal_all.deb &>/dev/null
rm cockpit-file-sharing_${LATEST}-1focal_all.deb
msg_ok "Installed Cockpit file sharing"
exit
fi
if [ "$UPD" == "3" ]; then
msg_info "Installing dependencies (patience)"
apt-get install -y psmisc &>/dev/null
apt-get install -y samba &>/dev/null
apt-get install -y samba-common-bin &>/dev/null
msg_ok "Installed dependencies"
msg_info "Installing Cockpit identities"
LATEST=$(curl -s https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q https://github.com/45Drives/cockpit-identities/releases/download/v${LATEST}/cockpit-identities_${LATEST}-1focal_all.deb
dpkg -i cockpit-identities_${LATEST}-1focal_all.deb &>/dev/null
rm cockpit-identities_${LATEST}-1focal_all.deb
msg_ok "Installed Cockpit identities"
exit
fi
if [ "$UPD" == "4" ]; then
msg_info "Installing dependencies"
apt-get install -y rsync &>/dev/null
apt-get install -y zip &>/dev/null
msg_ok "Installed dependencies"
msg_info "Installing Cockpit navigator"
LATEST=$(curl -s https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q https://github.com/45Drives/cockpit-navigator/releases/download/v${LATEST}/cockpit-navigator_${LATEST}-1focal_all.deb
dpkg -i cockpit-navigator_${LATEST}-1focal_all.deb &>/dev/null
rm cockpit-navigator_${LATEST}-1focal_all.deb
msg_ok "Installed Cockpit navigator"
exit
fi
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:9090${CL} \n"
+19 -11
View File
@@ -55,19 +55,27 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/commafeed ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Stopping CommaFeed"
systemctl stop commafeed
msg_ok "Stopped CommaFeed"
RELEASE=$(curl -sL https://api.github.com/repos/Athou/commafeed/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop commafeed
msg_ok "Stopped ${APP}"
msg_info "Updating CommaFeed"
cd /opt/commafeed
rm commafeed.jar
wget -q https://github.com/Athou/commafeed/releases/latest/download/commafeed.jar
msg_ok "Updated CommaFeed"
msg_info "Updating ${APP} to ${RELEASE}"
wget -q https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip
unzip -q commafeed-${RELEASE}-h2-jvm.zip
rsync -a --exclude 'data/' commafeed-${RELEASE}-h2/ /opt/commafeed/
rm -rf commafeed-${RELEASE}-h2 commafeed-${RELEASE}-h2-jvm.zip
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting CommaFeed"
systemctl start commafeed
msg_ok "Update Completed Successfully"
msg_info "Starting ${APP}"
systemctl start commafeed
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
+2 -2
View File
@@ -76,8 +76,8 @@ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}
mkdir -p /opt/dashy
wget -qO- https://github.com/Lissy93/dashy/archive/refs/tags/${RELEASE}.tar.gz | tar -xz -C /opt/dashy --strip-components=1
cd /opt/dashy
npm install &>/dev/null
npm run build &>/dev/null
npm install
npm run build
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
+1 -1
View File
@@ -29,7 +29,7 @@ color
catch_errors
function default_settings() {
CT_TYPE="1"
CT_TYPE="0"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
+7 -9
View File
@@ -32,7 +32,7 @@ color
catch_errors
function default_settings() {
CT_TYPE="1"
CT_TYPE="0"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
@@ -57,22 +57,20 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/ErsatzTV ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
msg_info "Stopping ErsatzTV"
systemctl stop ersatzTV
msg_ok "Stopped ErsatzTV"
msg_info "Updating ErsatzTV"
RELEASE=$(curl -s https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1)
if [ -d /opt/ErsatzTV/ErsatzTV_bak ]; then
rm -rf /opt/ErsatzTV/ErsatzTV_bak
fi
mv /opt/ErsatzTV/ErsatzTV /opt/ErsatzTV/ErsatzTV_bak
cp -R /opt/ErsatzTV/ ErsatzTV-backup
rm ErsatzTV-backup/ErsatzTV
rm -rf /opt/ErsatzTV
wget -qO- "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-arm64.tar.gz" | tar -xz -C /opt
mv "/opt/ErsatzTV-${RELEASE}-linux-arm64" /opt/ErsatzTV
cp -R ErsatzTV-backup/* /opt/ErsatzTV/
rm -rf ErsatzTV-backup
msg_ok "Updated ErsatzTV"
msg_info "Starting ErsatzTV"
+70
View File
@@ -0,0 +1,70 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
___ _ ____________
/ _ \ | / / ___/ ___/
/ __/ |/ / /__/ /__
\___/|___/\___/\___/
EOF
}
header_info
echo -e "Loading..."
APP="evcc"
var_disk="4"
var_cpu="1"
var_ram="1024"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -f /etc/apt/sources.list.d/evcc-stable.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating evcc LXC"
apt update &>/dev/null
apt --only-upgrade install -y evcc &>/dev/null
msg_ok "Updated Successfully"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} Setup should be reachable by going to the following URL.
${BL}http://${IP}:7070${CL} \n"
+1
View File
@@ -56,6 +56,7 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -f /etc/systemd/system/flaresolverr.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
RELEASE=$(wget -q https://github.com/FlareSolverr/FlareSolverr/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
if [[ ! -d /opt/flaresolverr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP LXC"
+1
View File
@@ -55,6 +55,7 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -f /etc/systemd/system/flowise.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
msg_info "Updating ${APP}"
systemctl stop flowise
npm install -g flowise --upgrade
+8 -3
View File
@@ -55,7 +55,7 @@ function default_settings() {
function update_script() {
if [[ ! -f /etc/systemd/system/frigate.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_error "There is currently no update path available."
msg_error "To update Frigate, create a new container and transfer your configuration."
exit
}
@@ -64,8 +64,13 @@ build_container
description
msg_info "Setting Container to Normal Resources"
pct set $CTID -memory 1024
msg_ok "Set Container to Normal Resources"
STATUS=$(pct status $CTID | grep -oP '(?<=status: ).*')
if [ "$STATUS" == "running" ]; then
pct set $CTID -memory 1024
else
echo -e " ⚠️ ${RD}Container is not running. Will need to change memory to 1024MB manually.${CL}"
fi
msg_ok "Set Normal Resources"
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:5000${CL} \n"
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
# Co-author: Rogue-King
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
______ _ __
/ ____/(_)/ /____ ____ _
/ / __// // __/ _ \/ __ /
/ /_/ // // /_/ __/ /_/ /
\____//_/ \__/\___/\__,_/
EOF
}
header_info
echo -e "Loading..."
APP="Gitea"
var_disk="8"
var_cpu="1"
var_ram="1024"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -f /usr/local/bin/gitea ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
RELEASE=$(wget -q https://github.com/go-gitea/gitea/releases/latest -O - | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//')
msg_info "Updating $APP to ${RELEASE}"
wget -q https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-arm64
systemctl stop gitea
rm -rf /usr/local/bin/gitea
mv gitea* /usr/local/bin/gitea
chmod +x /usr/local/bin/gitea
systemctl start gitea
msg_ok "Updated $APP Successfully"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:3000${CL} \n"
+23 -1
View File
@@ -55,7 +55,29 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/gotify ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_error "There is currently no update path available."
RELEASE=$(curl -s https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop gotify
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP} to ${RELEASE}"
cd /opt/gotify
wget -q https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip
unzip -oq gotify-linux-amd64.zip
rm -rf gotify-linux-amd64.zip
chmod +x gotify-linux-amd64
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting ${APP}"
systemctl start gotify
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
+4 -4
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
# License: MIT
@@ -63,9 +63,9 @@ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}
msg_ok "Stopped ${APP}"
msg_info "Updating $APP to v${RELEASE}"
wget -q https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb
dpkg -i headscale_${RELEASE}_linux_amd64.deb
rm headscale_${RELEASE}_linux_amd64.deb
wget -q https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_arm64.deb
dpkg -i headscale_${RELEASE}_linux_arm64.deb
rm headscale_${RELEASE}_linux_arm64.deb
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to ${RELEASE}"
+3 -3
View File
@@ -85,7 +85,7 @@ function update_script() {
msg_info "Updating Home Assistant"
source /srv/homeassistant/bin/activate
pip install ${BR}--upgrade homeassistant &>/dev/null
uv pip install ${BR}--upgrade homeassistant &>/dev/null
msg_ok "Updated Home Assistant"
msg_info "Starting Home Assistant"
@@ -121,7 +121,7 @@ function update_script() {
else
filebrowser config init -a '0.0.0.0' &>/dev/null
filebrowser config set -a '0.0.0.0' &>/dev/null
filebrowser users add admin changeme --perm.admin &>/dev/null
filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
fi
msg_ok "Installed FileBrowser"
@@ -142,7 +142,7 @@ WantedBy=default.target" >$service_path
msg_ok "Completed Successfully!\n"
echo -e "FileBrowser should be reachable by going to the following URL.
${BL}http://$IP:8080${CL} admin|changeme\n"
${BL}http://$IP:8080${CL} admin|helper-scripts.com\n"
exit
fi
}
+2 -2
View File
@@ -105,7 +105,7 @@ function update_script() {
curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-arm64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
filebrowser config init -a '0.0.0.0' &>/dev/null
filebrowser config set -a '0.0.0.0' &>/dev/null
filebrowser users add admin changeme --perm.admin &>/dev/null
filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
msg_ok "Installed FileBrowser"
msg_info "Creating Service"
@@ -125,7 +125,7 @@ WantedBy=default.target" >$service_path
msg_ok "Completed Successfully!\n"
echo -e "FileBrowser should be reachable by going to the following URL.
${BL}http://$IP:8080${CL} admin|changeme\n"
${BL}http://$IP:8080${CL} admin|helper-scripts.com\n"
exit
fi
}
+94
View File
@@ -0,0 +1,94 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
__ __ ____
/ / / /___ ____ ___ ___ / __ )____ _ __
/ /_/ / __ \/ __ `__ \/ _ \/ __ / __ \| |/_/
/ __ / /_/ / / / / / / __/ /_/ / /_/ /> <
/_/ /_/\____/_/ /_/ /_/\___/_____/\____/_/|_|
EOF
}
header_info
echo -e "Loading..."
APP="HomeBox"
var_disk="4"
var_cpu="1"
var_ram="1024"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -f /opt/homebox ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
RELEASE=$(curl -s https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop homebox
msg_ok "${APP} Stopped"
msg_info "Updating ${APP} to ${RELEASE}"
cd /opt
rm -rf homebox_bak
mv homebox homebox_bak
wget -qO- https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_x86_64.tar.gz | tar -xzf - -C /opt
chmod +x /opt/homebox
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated Homebox"
msg_info "Starting ${APP}"
systemctl start homebox
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} Setup should be reachable by going to the following URL.
${BL}http://${IP}:7745${CL} \n"
+1 -1
View File
@@ -30,7 +30,7 @@ color
catch_errors
function default_settings() {
CT_TYPE="1"
CT_TYPE="0"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
+36 -8
View File
@@ -20,7 +20,7 @@ header_info
echo -e "Loading..."
APP="Jellyseerr"
var_disk="8"
var_cpu="2"
var_cpu="4"
var_ram="4096"
var_os="debian"
var_version="12"
@@ -55,19 +55,46 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/jellyseerr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your Jellyseerr LXC to 4vcpu and 4096RAM for the build process before continuing" 10 75
if ! command -v pnpm &> /dev/null; then
msg_error "pnpm not found. Installing..."
npm install -g pnpm &>/dev/null
else
msg_ok "pnpm is already installed."
fi
msg_info "Updating $APP"
systemctl stop jellyseerr
cd /opt/jellyseerr
output=$(git pull)
git pull &>/dev/null
output=$(git pull --no-rebase)
if echo "$output" | grep -q "Already up to date."
then
msg_ok " $APP is already up to date."
systemctl start jellyseerr
msg_ok "$APP is already up to date."
exit
fi
yarn install &>/dev/null
yarn build &>/dev/null
systemctl stop jellyseerr
export CYPRESS_INSTALL_BINARY=0
pnpm install --frozen-lockfile &>/dev/null
export NODE_OPTIONS="--max-old-space-size=3072"
pnpm build &>/dev/null
cat <<EOF >/etc/systemd/system/jellyseerr.service
[Unit]
Description=jellyseerr Service
After=network.target
[Service]
EnvironmentFile=/etc/jellyseerr/jellyseerr.conf
Environment=NODE_ENV=production
Type=exec
WorkingDirectory=/opt/jellyseerr
ExecStart=/usr/bin/node dist/index.js
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start jellyseerr
msg_ok "Updated $APP"
exit
@@ -79,6 +106,7 @@ description
msg_info "Setting Container to Normal Resources"
pct set $CTID -memory 2048
pct set $CTID -cores 2
msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
+25 -1
View File
@@ -57,8 +57,32 @@ function update_script() {
header_info
if [[ ! -f /etc/systemd/system/keycloak.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating ${APP} LXC"
msg_info "Updating packages"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
RELEASE=$(curl -s https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
msg_info "Downloading Keycloak v$RELEASE"
cd /opt
wget -q https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz
$STD tar -xvf keycloak-$RELEASE.tar.gz
msg_info "Merging configuration files"
cp -r keycloak/conf keycloak-$RELEASE
cp -r keycloak/providers keycloak-$RELEASE
cp -r keycloak/themes keycloak-$RELEASE
msg_info "Updating Keycloak"
mv keycloak keycloak.old
mv keycloak-$RELEASE keycloak
msg_info "Delete temporary installation files"
rm keycloak-$RELEASE.tar.gz
rm -rf keycloak.old
msg_info "Restating Keycloak"
systemctl restart keycloak
msg_ok "Updated Successfully"
exit
}
@@ -69,4 +93,4 @@ description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:8080${CL} \n"
${BL}http://${IP}:8080/admin${CL} \n"
+1
View File
@@ -67,6 +67,7 @@ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}
git pull
yarn
npx playwright install-deps
yarn playwright install
yarn prisma generate
yarn build
yarn prisma migrate deploy
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/env bash
# source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# # Copyright (c) 2021-2024 tteck
# # Author: tteck (tteckster)
# # Co-Author: remz1337
# # License: MIT
# # https://github.com/tteck/Proxmox/raw/main/LICENSE
echo "Unsupported."
# function header_info {
# clear
# cat <<"EOF"
# ____ __
# / / /___/ /___ _____
# / / / __ / __ `/ __ \
# / / / /_/ / /_/ / /_/ /
# /_/_/\__,_/\__,_/ .___/
# /_/
# EOF
# }
# header_info
# echo -e "Loading..."
# APP="lldap"
# var_disk="4"
# var_cpu="1"
# var_ram="512"
# var_os="debian"
# var_version="12"
# variables
# color
# catch_errors
# function default_settings() {
# CT_TYPE="1"
# PW=""
# CT_ID=$NEXTID
# HN=$NSAPP
# DISK_SIZE="$var_disk"
# CORE_COUNT="$var_cpu"
# RAM_SIZE="$var_ram"
# BRG="vmbr0"
# NET="dhcp"
# GATE=""
# APT_CACHER=""
# APT_CACHER_IP=""
# DISABLEIP6="no"
# MTU=""
# SD=""
# NS=""
# MAC=""
# VLAN=""
# SSH="no"
# VERB="no"
# echo_default
# }
# function update_script() {
# header_info
# if [[ ! -f /etc/systemd/system/lldap.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
# msg_info "Updating $APP"
# apt update
# apt upgrade -y lldap
# msg_ok "Updated $APP"
# exit
# }
# start
# build_container
# description
# msg_ok "Completed Successfully!\n"
# echo -e "${APP} should be reachable by going to the following URL.
# ${BL}http://${IP}:17170${CL} \n"
+1 -1
View File
@@ -55,7 +55,7 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/mafl ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
RELEASE=$(curl -s https://api.github.com/repos/hywax/mafl/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
msg_info "Updating Mafl to v${RELEASE} (Patience)"
systemctl stop mafl
+2 -31
View File
@@ -54,37 +54,8 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/matterbridge ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
RELEASE=$(curl -s https://api.github.com/repos/Luligu/matterbridge/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP} Service"
systemctl stop matterbridge
msg_ok "Stopped ${APP} Service"
msg_info "Updating ${APP} to ${RELEASE}"
cd /opt/matterbridge
wget -q "https://github.com/Luligu/matterbridge/archive/refs/tags/${RELEASE}.zip"
unzip -q ${RELEASE}.zip
mv matterbridge-${RELEASE} /opt/matterbridge
cd /opt/matterbridge
npm ci >/dev/null 2>&1
npm run build >/dev/null 2>&1
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Cleaning up"
rm /opt/${RELEASE}.zip
msg_ok "Cleaned"
msg_info "Starting ${APP} Service"
systemctl start matterbridge
sleep 1
msg_ok "Started ${APP} Service"
msg_ok "Updated Successfully!\n"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
if [[ ! -d /root/Matterbridge ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_error "Update via the Matterbridge UI"
exit
}
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
__ ___
/ |/ /__ ____ ___ ____ _____
/ /|_/ / _ \/ __ `__ \/ __ \/ ___/
/ / / / __/ / / / / / /_/ (__ )
/_/ /_/\___/_/ /_/ /_/\____/____/
EOF
}
header_info
echo -e "Loading..."
APP="Memos"
var_disk="7"
var_cpu="2"
var_ram="2048"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/memos ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP (Patience)"
cd /opt/memos
output=$(git pull --no-rebase)
if echo "$output" | grep -q "Already up to date."
then
msg_ok "$APP is already up to date."
exit
fi
systemctl stop memos
cd /opt/memos/web
pnpm i --frozen-lockfile &>/dev/null
pnpm build &>/dev/null
cd /opt/memos
mkdir -p /opt/memos/server/dist
cp -r web/dist/* /opt/memos/server/dist/
cp -r web/dist/* /opt/memos/server/router/frontend/dist/
go build -o /opt/memos/memos -tags=embed bin/memos/main.go &>/dev/null
systemctl start memos
msg_ok "Updated $APP"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:9030${CL} \n"
+72
View File
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
# source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# # Copyright (c) 2021-2024 tteck
# # Author: tteck
# # Co-Author: MickLesk (Canbiz)
# # License: MIT
# # https://github.com/tteck/Proxmox/raw/main/LICENSE
echo "Unsupported."
# function header_info {
# clear
# cat <<"EOF"
# __ ___ _____ ____ __
# / |/ /_ __/ ___// __ \ / /
# / /|_/ / / / /\__ \/ / / / / /
# / / / / /_/ /___/ / /_/ / / /___
# /_/ /_/\__, //____/\___\_\/_____/
# /____/
# EOF
# }
# header_info
# echo -e "Loading..."
# APP="MySQL"
# var_disk="4"
# var_cpu="1"
# var_ram="1024"
# var_os="debian"
# var_version="12"
# variables
# color
# catch_errors
# function default_settings() {
# CT_TYPE="1"
# PW=""
# CT_ID=$NEXTID
# HN=$NSAPP
# DISK_SIZE="$var_disk"
# CORE_COUNT="$var_cpu"
# RAM_SIZE="$var_ram"
# BRG="vmbr0"
# NET="dhcp"
# GATE=""
# APT_CACHER=""
# APT_CACHER_IP=""
# DISABLEIP6="no"
# MTU=""
# SD=""
# NS=""
# MAC=""
# VLAN=""
# SSH="no"
# VERB="no"
# echo_default
# }
# function update_script() {
# header_info
# if [[ ! -f /usr/share/keyrings/mysql.gpg ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
# msg_info "Updating ${APP} LXC"
# apt-get update &>/dev/null
# apt-get -y upgrade &>/dev/null
# msg_ok "Updated Successfully"
# exit
# }
# start
# build_container
# description
# msg_ok "Completed Successfully!\n"
+1
View File
@@ -65,6 +65,7 @@ if [[ ! -f /etc/systemd/system/n8n.service ]]; then msg_error "No ${APP} Install
fi
msg_info "Updating ${APP} LXC"
npm update -g n8n &>/dev/null
systemctl restart n8n
msg_ok "Updated Successfully"
exit
}
+17 -14
View File
@@ -1,29 +1,30 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
# Author: tteck
# Co-Author: havardthom
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
__ ____ __ __ __ __
/ /__/ __ \_____ / //_/_ __/ /_ ___ _________ ___ / /____ _____
/ //_/ / / / ___/ / ,< / / / / __ \/ _ \/ ___/ __ \/ _ \/ __/ _ \/ ___/
/ ,< / /_/ (__ ) / /| / /_/ / /_/ / __/ / / / / / __/ /_/ __(__ )
/_/|_|\____/____/ /_/ |_\__,_/_.___/\___/_/ /_/ /_/\___/\__/\___/____/
cat <<"EOF"
_ __ __ __ _
/ | / /__ ____ / // / (_)
/ |/ / _ \/ __ \/ // /_/ /
/ /| / __/ /_/ /__ __/ /
/_/ |_/\___/\____/ /_/_/ /
/___/
EOF
}
header_info
echo -e "Loading..."
APP="k0s"
APP="Neo4j"
var_disk="4"
var_cpu="2"
var_ram="2048"
var_cpu="1"
var_ram="1024"
var_os="debian"
var_version="11"
var_version="12"
variables
color
catch_errors
@@ -54,8 +55,8 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -f /etc/k0s/k0s.yaml ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating ${APP} LXC"
if [[ ! -d /etc/neo4j ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating ${APP}"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated Successfully"
@@ -67,3 +68,5 @@ build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} Browser should be reachable by going to the following URL.
${BL}http://${IP}:7474${CL} \n"
+4 -6
View File
@@ -23,8 +23,8 @@ APP="Nginx Proxy Manager"
var_disk="4"
var_cpu="2"
var_ram="1024"
var_os="ubuntu"
var_version="22.04"
var_os="debian"
var_version="12"
variables
color
catch_errors
@@ -61,7 +61,7 @@ function update_script() {
fi
if ! command -v pnpm &> /dev/null; then
msg_info "Installing pnpm"
export NODE_OPTIONS=--openssl-legacy-provider
#export NODE_OPTIONS=--openssl-legacy-provider
npm install -g pnpm@8.15 &>/dev/null
msg_ok "Installed pnpm"
fi
@@ -168,6 +168,7 @@ EOF
msg_info "Starting Services"
sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf
sed -i 's/su npm npm/su root root/g' /etc/logrotate.d/nginx-proxy-manager
sed -i 's/include-system-site-packages = false/include-system-site-packages = true/g' /opt/certbot/pyvenv.cfg
systemctl enable -q --now openresty
systemctl enable -q --now npm
@@ -185,9 +186,6 @@ start
build_container
description
msg_info "Setting Container to Normal Resources"
pct set $CTID -cores 1
msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:81${CL}\n"
+72
View File
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: havardthom
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
_ _______ ____ ______ __
/ | / /__ / / __ )/ ____/__ / /_
/ |/ / / / / __ / / __/ _ \/ __/
/ /| / / /__/ /_/ / /_/ / __/ /_
/_/ |_/ /____/_____/\____/\___/\__/
EOF
}
header_info
echo -e "Loading..."
APP="NZBGet"
var_disk="4"
var_cpu="2"
var_ram="2048"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -f /lib/systemd/system/nzbget.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP LXC"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated $APP LXC"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:6789${CL} \n"
+72
View File
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: havardthom
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
____ ____
/ __ \/ / /___ _____ ___ ____ _
/ / / / / / __ `/ __ `__ \/ __ `/
/ /_/ / / / /_/ / / / / / / /_/ /
\____/_/_/\__,_/_/ /_/ /_/\__,_/
EOF
}
header_info
echo -e "Loading..."
APP="Ollama"
var_disk="24"
var_cpu="4"
var_ram="4096"
var_os="ubuntu"
var_version="22.04"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/ollama ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating ${APP}"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated Successfully"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:11434${CL} \n"
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: havardthom
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
____ _ __ __ __ ______
/ __ \____ ___ ____ | | / /__ / /_ / / / / _/
/ / / / __ \/ _ \/ __ \ | | /| / / _ \/ __ \/ / / // /
/ /_/ / /_/ / __/ / / / | |/ |/ / __/ /_/ / /_/ // /
\____/ .___/\___/_/ /_/ |__/|__/\___/_.___/\____/___/
/_/
EOF
}
header_info
echo -e "Loading..."
APP="Open WebUI"
var_disk="16"
var_cpu="4"
var_ram="4096"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/open-webui ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating ${APP} (Patience)"
cd /opt/open-webui
output=$(git pull --no-rebase)
if echo "$output" | grep -q "Already up to date."
then
msg_ok "$APP is already up to date."
exit
fi
systemctl stop open-webui.service
npm install &>/dev/null
export NODE_OPTIONS="--max-old-space-size=3584"
npm run build &>/dev/null
cd ./backend
pip install -r requirements.txt -U &>/dev/null
systemctl start open-webui.service
msg_ok "Updated Successfully"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:8080${CL} \n"
+1 -1
View File
@@ -21,7 +21,7 @@ echo -e "Loading..."
APP="Overseerr"
var_disk="8"
var_cpu="2"
var_ram="2048"
var_ram="3072"
var_os="debian"
var_version="12"
variables
+12
View File
@@ -67,6 +67,18 @@ function update_script() {
header_info
if [ "$UPD" == "1" ]; then
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
if [[ "$(gs --version 2>/dev/null)" != "10.04.0" ]]; then
msg_info "Updating Ghostscript"
cd /tmp
wget -q https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz
tar -xzf ghostscript-10.04.0.tar.gz
cd ghostscript-10.04.0
./configure &>/dev/null
make &>/dev/null
sudo make install &>/dev/null
rm -rf /tmp/ghostscript*
msg_ok "Ghostscript updated to 10.04.0"
fi
msg_info "Stopping all Paperless-ngx Services"
systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
msg_ok "Stopped all Paperless-ngx Services"
+3
View File
@@ -55,6 +55,7 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -f /etc/systemd/system/peanut.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
RELEASE=$(curl -sL https://api.github.com/repos/Brandawg93/PeaNUT/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating $APP to ${RELEASE}"
@@ -66,6 +67,8 @@ function update_script() {
pnpm i &>/dev/null
pnpm run build &>/dev/null
cp -r .next/static .next/standalone/.next/
mkdir -p /opt/peanut/.next/standalone/config
ln -sf /etc/peanut/settings.yml /opt/peanut/.next/standalone/config/settings.yml
systemctl start peanut
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to ${RELEASE}"
+4 -2
View File
@@ -56,7 +56,7 @@ function update_script() {
header_info
if [[ ! -d /opt/pingvin-share ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Stopping Pingvin Share"
pm2 stop pingvin-share-backend pingvin-share-frontend &>/dev/null
systemctl stop pm2-root.service
msg_ok "Stopped Pingvin Share"
msg_info "Updating Pingvin Share"
@@ -64,13 +64,15 @@ cd /opt/pingvin-share
git fetch --tags
git checkout $(git describe --tags `git rev-list --tags --max-count=1`) &>/dev/null
cd backend
npm install &>/dev/null
npm run build &>/dev/null
cd ../frontend
npm install &>/dev/null
npm run build &>/dev/null
msg_ok "Updated Pingvin Share"
msg_info "Starting Pingvin Share"
pm2 start pingvin-share-backend pingvin-share-frontend &>/dev/null
systemctl start pm2-root.service
msg_ok "Started Pingvin Share"
msg_ok "Updated Successfully"
+1 -1
View File
@@ -29,7 +29,7 @@ color
catch_errors
function default_settings() {
CT_TYPE="1"
CT_TYPE="0"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
+2 -2
View File
@@ -102,7 +102,7 @@ if [ "$UPD" == "3" ]; then
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &>/dev/null
filebrowser config init -a '0.0.0.0' &>/dev/null
filebrowser config set -a '0.0.0.0' &>/dev/null
filebrowser users add admin changeme --perm.admin &>/dev/null
filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
msg_ok "Installed FileBrowser"
msg_info "Creating Service"
@@ -122,7 +122,7 @@ if [ "$UPD" == "3" ]; then
msg_ok "Completed Successfully!\n"
echo -e "FileBrowser should be reachable by going to the following URL.
${BL}http://$IP:8080${CL} admin|changeme\n"
${BL}http://$IP:8080${CL} admin|helper-scripts.com\n"
exit
fi
if [ "$UPD" == "4" ]; then
+23 -1
View File
@@ -55,7 +55,29 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -f /etc/systemd/system/prometheus.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_error "There is currently no update path available."
RELEASE=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop prometheus
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP} to ${RELEASE}"
wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz
cd prometheus-${RELEASE}.linux-amd64
cp -rf prometheus promtool /usr/local/bin/
cd ~
rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting ${APP}"
systemctl start prometheus
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
+1 -4
View File
@@ -55,10 +55,7 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /var/lib/radarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP LXC"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated $APP LXC"
msg_error "There is currently no update path available."
exit
}
+14 -9
View File
@@ -55,16 +55,21 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/sabnzbd ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP"
systemctl stop sabnzbd.service
RELEASE=$(curl -s https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz) &>/dev/null
\cp -r SABnzbd-${RELEASE}/* /opt/sabnzbd &>/dev/null
rm -rf SABnzbd-${RELEASE}
cd /opt/sabnzbd
python3 -m pip install -r requirements.txt &>/dev/null
systemctl start sabnzbd.service
msg_ok "Updated $APP"
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating $APP to ${RELEASE}"
systemctl stop sabnzbd.service
tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz) &>/dev/null
\cp -r SABnzbd-${RELEASE}/* /opt/sabnzbd &>/dev/null
rm -rf SABnzbd-${RELEASE}
cd /opt/sabnzbd
python3 -m pip install -r requirements.txt &>/dev/null
echo "${RELEASE}" >/opt/${APP}_version.txt
systemctl start sabnzbd.service
msg_ok "Updated ${APP} to ${RELEASE}"
else
msg_info "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
+1 -1
View File
@@ -30,7 +30,7 @@ color
catch_errors
function default_settings() {
CT_TYPE="1"
CT_TYPE="0"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
+2 -2
View File
@@ -71,10 +71,10 @@ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_v
rm -rf spoolman_bak
mv spoolman spoolman_bak
wget -q https://github.com/Donkie/Spoolman/releases/download/${RELEASE}/spoolman.zip
unzip -q spoolman.zip -d spoolman
unzip -q spoolman.zip -d spoolman
cd spoolman
pip3 install -r requirements.txt >/dev/null 2>&1
cp .env.example .env
wget -q https://raw.githubusercontent.com/Donkie/Spoolman/master/.env.example -O .env
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
+1 -1
View File
@@ -29,7 +29,7 @@ color
catch_errors
function default_settings() {
CT_TYPE="1"
CT_TYPE="0"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
+115
View File
@@ -0,0 +1,115 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
_______ _ _
/_ __(_)___ _____ (_|_)
/ / / / __ `/ __ \ / / /
/ / / / /_/ / / / / / / /
/_/ /_/\__,_/_/ /_/_/ /_/
/___/
EOF
}
header_info
echo -e "Loading..."
APP="Tianji"
var_disk="12"
var_cpu="4"
var_ram="4096"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/tianji ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
RELEASE=$(curl -s https://api.github.com/repos/msgbyte/tianji/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
msg_info "Stopping ${APP} Service"
systemctl stop tianji
msg_ok "Stopped ${APP} Service"
msg_info "Updating ${APP} to ${RELEASE}"
cd /opt
cp /opt/tianji/src/server/.env /opt/.env
mv /opt/tianji /opt/tianji_bak
wget -q "https://github.com/msgbyte/tianji/archive/refs/tags/v${RELEASE}.zip"
unzip -q v${RELEASE}.zip
mv tianji-${RELEASE} /opt/tianji
cd tianji
pnpm install --filter @tianji/client... --config.dedupe-peer-dependents=false --frozen-lockfile >/dev/null 2>&1
pnpm build:static >/dev/null 2>&1
pnpm install --filter @tianji/server... --config.dedupe-peer-dependents=false >/dev/null 2>&1
mkdir -p ./src/server/public >/dev/null 2>&1
cp -r ./geo ./src/server/public >/dev/null 2>&1
pnpm build:server >/dev/null 2>&1
mv /opt/.env /opt/tianji/src/server/.env
cd src/server
pnpm db:migrate:apply >/dev/null 2>&1
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting ${APP}"
systemctl start tianji
msg_ok "Started ${APP}"
msg_info "Cleaning up"
rm -R /opt/v${RELEASE}.zip
rm -rf /opt/tianji_bak
rm -rf /opt/tianji/src/client
rm -rf /opt/tianji/website
rm -rf /opt/tianji/reporter
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}."
fi
exit
}
start
build_container
description
msg_info "Setting Container to Normal Resources"
pct set $CTID -memory 1024
pct set $CTID -cores 1
msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
echo -e "${APP} Setup should be reachable by going to the following URL.
${BL}http://${IP}:12345${CL} \n"
+2 -1
View File
@@ -55,13 +55,14 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -f /etc/systemd/system/traefik.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
RELEASE=$(curl -s https://api.github.com/repos/traefik/traefik/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
RELEASE=$(curl -s https://api.github.com/repos/traefik/traefik/releases | grep -oP '"tag_name":\s*"v\K[\d.]+?(?=")' | sort -V | tail -n 1)
msg_info "Updating $APP LXC"
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
wget -q https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_arm64.tar.gz
tar -C /tmp -xzf traefik*.tar.gz
mv /tmp/traefik /usr/bin/
rm -rf traefik*.tar.gz
systemctl restart traefik.service
msg_ok "Updated $APP LXC"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
+8 -10
View File
@@ -1,11 +1,11 @@
# #!/usr/bin/env bash
#!/usr/bin/env bash
# source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# # Copyright (c) 2021-2024 tteck
# # Author: tteck (tteckster)
# # License: MIT
# # https://github.com/tteck/Proxmox/raw/main/LICENSE
echo "Unsupported. View notes on GitHub."
echo "Unsupported."
# function header_info {
# clear
@@ -57,23 +57,21 @@ echo "Unsupported. View notes on GitHub."
# function update_script() {
# header_info
# if [[ ! -d /opt/trilium ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
# RELEASE=$(curl -s https://api.github.com/repos/zadam/trilium/releases/latest |
# grep "tag_name" |
# awk '{print substr($2, 3, length($2)-4) }')
# RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
# msg_info "Stopping ${APP}"
# systemctl stop trilium.service
# sleep 1
# msg_ok "Stopped ${APP}"
# msg_info "Updating to v${RELEASE}"
# wget -q https://github.com/zadam/trilium/releases/download/v$RELEASE/trilium-linux-x64-server-$RELEASE.tar.xz
# tar -xvf trilium-linux-x64-server-$RELEASE.tar.xz &>/dev/null
# msg_info "Updating to ${RELEASE}"
# wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz
# tar -xf TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz
# cp -r trilium-linux-x64-server/* /opt/trilium/
# msg_ok "Updated to v${RELEASE}"
# msg_ok "Updated to ${RELEASE}"
# msg_info "Cleaning up"
# rm -rf trilium-linux-x64-server-$RELEASE.tar.xz trilium-linux-x64-server
# rm -rf TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz trilium-linux-x64-server
# msg_ok "Cleaned"
# msg_info "Starting ${APP}"
+1
View File
@@ -55,6 +55,7 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/umami ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
+4
View File
@@ -17,6 +17,10 @@ cat <<"EOF"
EOF
}
header_info
if ! grep -q -m1 'avx[^ ]*' /proc/cpuinfo; then
echo "AVX instruction set is not supported on this CPU."
exit
fi
echo -e "Loading..."
APP="Unifi"
var_disk="8"
+5 -1
View File
@@ -57,6 +57,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
VAULT=$(curl -s https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest |
grep "tag_name" |
awk '{print substr($2, 2, length($2)-3) }')
@@ -72,7 +73,7 @@ function update_script() {
header_info
if [ "$UPD" == "1" ]; then
echo -e "\n ⚠️ Ensure you set 4vCPU & 4096MiB RAM minimum!!! \n"
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
msg_info "Stopping Vaultwarden"
systemctl stop vaultwarden.service
msg_ok "Stopped Vaultwarden"
@@ -128,6 +129,9 @@ function update_script() {
if ! command -v argon2 >/dev/null 2>&1; then apt-get install -y argon2 &>/dev/null; fi
TOKEN=$(echo -n ${NEWTOKEN} | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e)
sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env
if [[ -f /opt/vaultwarden/data/config.json ]]; then
sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
fi
systemctl restart vaultwarden
fi
exit
+99
View File
@@ -0,0 +1,99 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
_ __ ____
| | / /___ _/ / /___ _____
| | /| / / __ `/ / / __ \/ ___/
| |/ |/ / /_/ / / / /_/ (__ )
|__/|__/\__,_/_/_/\____/____/
EOF
}
header_info
echo -e "Loading..."
APP="Wallos"
var_disk="5"
var_cpu="1"
var_ram="1024"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/wallos ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
RELEASE=$(curl -s https://api.github.com/repos/ellite/Wallos/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to ${RELEASE}"
cd /opt
wget -q "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip"
mv /opt/wallos/db/wallos.db /opt/wallos.db
unzip -q v${RELEASE}.zip
mv Wallos-${RELEASE} /opt/wallos
rm -rf /opt/wallos/db/wallos.empty.db
mv /opt/wallos.db /opt/wallos/db/wallos.db
chown -R www-data:www-data /opt/wallos
chmod -R 755 /opt/wallos
curl http://localhost/endpoints/db/migrate.php &>/dev/null
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP}"
msg_info "Reload Apache2"
systemctl reload apache2
msg_ok "Apache2 Reloaded"
msg_info "Cleaning Up"
rm -R /opt/v${RELEASE}.zip
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP} ${CL} \n"
+25 -37
View File
@@ -23,8 +23,8 @@ header_info
echo -e "Loading..."
APP="Wastebin"
var_disk="4"
var_cpu="4"
var_ram="2048"
var_cpu="1"
var_ram="1024"
var_os="debian"
var_version="12"
variables
@@ -58,39 +58,31 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/wastebin ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
msg_info "Stopping Wastebin"
systemctl stop wastebin
msg_ok "Wastebin Stopped"
msg_info "Updating Wastebin"
RELEASE=$(curl -s https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
cd /opt
if [ -d wastebin_bak ]; then
rm -rf wastebin_bak
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Wastebin"
systemctl stop wastebin
msg_ok "Wastebin Stopped"
msg_info "Updating Wastebin"
wget -q https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
tar -xf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
cp -f wastebin /opt/wastebin/
chmod +x /opt/wastebin/wastebin
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated Wastebin"
msg_info "Starting Wastebin"
systemctl start wastebin
msg_ok "Started Wastebin"
msg_info "Cleaning Up"
rm -rf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
mv wastebin wastebin_bak
wget -q "https://github.com/matze/wastebin/archive/refs/tags/${RELEASE}.zip"
unzip -q ${RELEASE}.zip
mv wastebin-${RELEASE} /opt/wastebin
cd /opt/wastebin
cargo update -q
cargo build -q --release
msg_ok "Updated Wastebin"
msg_info "Starting Wastebin"
systemctl start wastebin
msg_ok "Started Wastebin"
msg_info "Cleaning Up"
cd /opt
rm -R ${RELEASE}.zip
rm -R wastebin_bak
msg_ok "Cleaned"
msg_ok "Updated Successfully"
exit
}
@@ -98,10 +90,6 @@ start
build_container
description
msg_info "Setting Container to Normal Resources"
pct set $CTID -cores 2
msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
echo -e "${APP} Setup should be reachable by going to the following URL.
${BL}http://${IP}:8088${CL} \n"
+1
View File
@@ -57,6 +57,7 @@ header_info
if [[ ! -f /usr/local/bin/whoogle-search ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating ${APP} LXC"
pip3 install whoogle-search --upgrade &>/dev/null
systemctl restart whoogle.service
msg_ok "Updated Successfully"
exit
}
+10 -66
View File
@@ -19,11 +19,11 @@ EOF
header_info
echo -e "Loading..."
APP="Wireguard"
var_disk="2"
var_disk="4"
var_cpu="1"
var_ram="512"
var_os="ubuntu"
var_version="20.04"
var_os="debian"
var_version="12"
variables
color
catch_errors
@@ -53,71 +53,13 @@ function default_settings() {
}
function update_script() {
if [[ ! -d /etc/pivpn/wireguard ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
"1" "Update ${APP} LXC" ON \
"2" "Install WGDashboard" OFF \
3>&1 1>&2 2>&3)
header_info
if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
msg_ok "Updated ${APP} LXC"
exit
fi
if [ "$UPD" == "2" ]; then
if [[ -f /etc/systemd/system/wg-dashboard.service ]]; then
cd /etc/wgdashboard/src
chmod u+x wgd.sh
./wgd.sh update
msg_ok "Updated Successfully"
exit
fi
IP=$(hostname -I | awk '{print $1}')
msg_info "Installing Python3-pip"
apt-get install -y python3-pip &>/dev/null
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
pip install flask &>/dev/null
pip install ifcfg &>/dev/null
pip install flask_qrcode &>/dev/null
pip install icmplib &>/dev/null
msg_ok "Installed Python3-pip"
msg_info "Installing WGDashboard"
WGDREL=$(curl -s https://api.github.com/repos/donaldzou/WGDashboard/releases/latest |
grep "tag_name" |
awk '{print substr($2, 2, length($2)-3) }')
git clone -b ${WGDREL} https://github.com/donaldzou/WGDashboard.git /etc/wgdashboard &>/dev/null
if [[ ! -d /etc/wireguard ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
apt-get update
apt-get -y upgrade
sleep 2
cd /etc/wgdashboard/src
chmod u+x wgd.sh
./wgd.sh install &>/dev/null
chmod -R 755 /etc/wireguard
msg_ok "Installed WGDashboard"
msg_info "Creating Service"
service_path="/etc/systemd/system/wg-dashboard.service"
echo "[Unit]
After=systemd-networkd.service
[Service]
WorkingDirectory=/etc/wgdashboard/src
ExecStart=/usr/bin/python3 /etc/wgdashboard/src/dashboard.py
Restart=always
[Install]
WantedBy=default.target" >$service_path
chmod 664 /etc/systemd/system/wg-dashboard.service
systemctl daemon-reload
systemctl enable wg-dashboard.service &>/dev/null
systemctl start wg-dashboard.service &>/dev/null
msg_ok "Created Service"
echo -e "WGDashboard should be reachable by going to the following URL.
${BL}http://${IP}:10086${CL} admin|admin \n"
./wgd.sh update
exit
fi
}
start
@@ -125,3 +67,5 @@ build_container
description
msg_ok "Completed Successfully!\n"
echo -e "WGDashboard should be reachable by going to the following URL.
${BL}http://${IP}:10086${CL} admin|admin \n"
+1
View File
@@ -58,6 +58,7 @@ if [[ ! -f /etc/zabbix/zabbix_server.conf ]]; then msg_error "No ${APP} Installa
msg_info "Updating $APP LXC"
apt-get update &>/dev/null
apt-get -y upgrade &>/dev/null
systemctl restart zabbix-server
msg_ok "Updated $APP LXC"
exit
}
+101
View File
@@ -0,0 +1,101 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck
# Co-Author: MickLesk (Canbiz)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
_____ _ ___
/__ / (_)___ / (_)___ ___
/ / / / __ \/ / / __ \/ _ \
/ /__/ / /_/ / / / / / / __/
/____/_/ .___/_/_/_/ /_/\___/
/_/
EOF
}
header_info
echo -e "Loading..."
APP="Zipline"
var_disk="5"
var_cpu="2"
var_ram="2048"
var_os="debian"
var_version="12"
variables
color
catch_errors
function default_settings() {
CT_TYPE="1"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
DISK_SIZE="$var_disk"
CORE_COUNT="$var_cpu"
RAM_SIZE="$var_ram"
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
VERB="no"
echo_default
}
function update_script() {
header_info
if [[ ! -d /opt/zipline ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
read -r -p "Warning: Storage is dangerously low, continue anyway? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
fi
RELEASE=$(curl -s https://api.github.com/repos/diced/zipline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop zipline
msg_ok "${APP} Stopped"
msg_info "Updating ${APP} to ${RELEASE}"
cp /opt/zipline/.env /opt/
rm -R /opt/zipline
wget -q "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip"
unzip -q v${RELEASE}.zip
mv zipline-${RELEASE} /opt/zipline
cd /opt/zipline
mv /opt/.env /opt/zipline/.env
yarn install &>/dev/null
yarn build &>/dev/null
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP}"
msg_info "Starting ${APP}"
systemctl start zipline
msg_ok "Started ${APP}"
msg_info "Cleaning Up"
rm -rf v${RELEASE}.zip
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${APP} Setup should be reachable by going to the following URL.
${BL}http://${IP}:3000${CL} \n"
+16 -17
View File
@@ -20,7 +20,7 @@ header_info
echo -e "Loading..."
APP="Zoraxy"
var_disk="6"
var_cpu="4"
var_cpu="2"
var_ram="2048"
var_os="debian"
var_version="12"
@@ -54,29 +54,28 @@ function default_settings() {
function update_script() {
header_info
if [[ ! -d /opt/zoraxy/src ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
msg_info "Updating $APP"
systemctl stop zoraxy
cd /opt/zoraxy/src
systemctl stop zoraxy
if git pull | grep -q 'Already up to date.'; then
msg_ok "Already up to date. No update required."
else
go mod tidy
go build
if [[ ! -d /opt/zoraxy/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
RELEASE=$(curl -s https://api.github.com/repos/tobychui/zoraxy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating $APP to ${RELEASE}"
systemctl stop zoraxy
wget -q "https://github.com/tobychui/zoraxy/releases/download/${RELEASE}/zoraxy_linux_amd64"
rm /opt/zoraxy/zoraxy
mv zoraxy_linux_amd64 /opt/zoraxy/zoraxy
chmod +x /opt/zoraxy/zoraxy
systemctl start zoraxy
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP"
fi
systemctl start zoraxy
exit
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
start
build_container
description
msg_info "Setting Container to Normal Resources"
pct set $CTID -cores 2
msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:8000${CL} \n"
+5
View File
@@ -0,0 +1,5 @@
{
"extends": ["next/core-web-vitals"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"]
}
+39
View File
@@ -0,0 +1,39 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
.yarn/install-state.gz
# wrangler
.worker-next
.wrangler
# testing
/coverage
# next.js
/.next/
out
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# # local env files
# .env*.local
# .env
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
+5
View File
@@ -0,0 +1,5 @@
dist
node_modules
.next
build
.contentlayer
+3
View File
@@ -0,0 +1,3 @@
{
"plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-imports"]
}
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 Bram Suurd
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+17
View File
@@ -0,0 +1,17 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "default",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "tailwind.config.ts",
"css": "@/styles/globals.css",
"baseColor": "slate",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils"
}
}
+25
View File
@@ -0,0 +1,25 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
webpack: (config) => {
config.resolve.alias.canvas = false;
return config;
},
images: {
remotePatterns: [
{
protocol: "https",
hostname: "**",
},
],
},
env: {
BASE_PATH: "ProxmoxVE",
},
output: "export",
basePath: `/ProxmoxVE`,
};
export default nextConfig;
+10090
View File
File diff suppressed because it is too large Load Diff
+88
View File
@@ -0,0 +1,88 @@
{
"name": "proxmox-helper-scripts-website",
"version": "1.0.0",
"license": "MIT",
"private": true,
"author": {
"name": "Bram Suurd",
"url": "https://github.com/community-scripts"
},
"type": "module",
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint",
"test": "vitest",
"deploy": "next build && touch out/.nojekyll && git add out/ && git commit -m \"Deploy\" && git subtree push --prefix out origin gh-pages",
"format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
"format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-icons": "^1.3.1",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-navigation-menu": "^1.1.4",
"@radix-ui/react-popover": "^1.1.2",
"@radix-ui/react-select": "^2.1.2",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.1.1",
"@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"@vercel/analytics": "^1.2.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cmdk": "^1.0.0",
"date-fns": "^4.1.0",
"framer-motion": "^11.11.11",
"fuse.js": "^7.0.0",
"lucide-react": "^0.453.0",
"mini-svg-data-uri": "^1.4.4",
"next": "15.1.3",
"next-themes": "^0.3.0",
"nuqs": "^2.1.1",
"pocketbase": "^0.21.4",
"prettier-plugin-organize-imports": "^4.1.0",
"react": "19.0.0-rc-02c0e824-20241028",
"react-code-blocks": "^0.1.6",
"react-day-picker": "8.10.1",
"react-dom": "19.0.0-rc-02c0e824-20241028",
"react-icons": "^5.1.0",
"react-simple-typewriter": "^5.0.1",
"sharp": "^0.33.5",
"simple-icons": "^13.5.0",
"sonner": "^1.5.0",
"tailwind-merge": "^2.3.0",
"zod": "^3.23.8"
},
"devDependencies": {
"@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.0.1",
"@types/node": "^22",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@typescript-eslint/eslint-plugin": "^8.8.1",
"@typescript-eslint/parser": "^8.8.1",
"@vitejs/plugin-react": "^4.3.4",
"eslint-config-next": "15.0.2",
"eslint": "^9.13.0",
"jsdom": "^25.0.1",
"postcss": "^8",
"prettier-plugin-tailwindcss": "^0.6.5",
"prettier": "^3.2.5",
"tailwindcss-animate": "^1.0.7",
"tailwindcss-animated": "^1.1.2",
"tailwindcss": "^3.4.9",
"typescript": "^5",
"vite-tsconfig-paths": "^5.1.3",
"vitest": "^2.1.6"
},
"overrides": {
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
}
}
+8
View File
@@ -0,0 +1,8 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
},
};
export default config;
Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

+1
View File
@@ -0,0 +1 @@
../../json
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

+11
View File
@@ -0,0 +1,11 @@
import { screen } from "@testing-library/dom";
import { render } from "@testing-library/react";
import { describe, expect, it } from "vitest";
import Page from "@/app/page";
describe("Page", () => {
it("should show button to view scripts", () => {
render(<Page />);
expect(screen.getByRole("button", { name: "View Scripts" })).toBeDefined();
});
});
@@ -0,0 +1,53 @@
import { describe, it, assert, beforeAll } from "vitest";
import { promises as fs } from "fs";
import path from "path";
import { ScriptSchema, type Script } from "@/app/json-editor/_schemas/schemas";
import { Metadata } from "@/lib/types";
const jsonDir = "public/json";
const metadataFileName = "metadata.json";
const encoding = "utf-8";
const fileNames = (await fs.readdir(jsonDir))
.filter((fileName) => fileName !== metadataFileName)
describe.each(fileNames)("%s", async (fileName) => {
let script: Script;
beforeAll(async () => {
const filePath = path.resolve(jsonDir, fileName);
const fileContent = await fs.readFile(filePath, encoding)
script = JSON.parse(fileContent);
})
it("should have valid json according to script schema", () => {
ScriptSchema.parse(script);
});
it("should have a corresponding script file", () => {
script.install_methods.forEach((method) => {
const scriptPath = path.resolve("..", method.script)
assert(fs.stat(scriptPath), `Script file not found: ${scriptPath}`)
})
});
})
describe(`${metadataFileName}`, async () => {
let metadata: Metadata;
beforeAll(async () => {
const filePath = path.resolve(jsonDir, metadataFileName);
const fileContent = await fs.readFile(filePath, encoding)
metadata = JSON.parse(fileContent);
})
it("should have valid json according to metadata schema", () => {
// TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts
assert(metadata.categories.length > 0);
metadata.categories.forEach((category) => {
assert.isString(category.name)
assert.isNumber(category.id)
assert.isNumber(category.sort_order)
});
});
})
+4
View File
@@ -0,0 +1,4 @@
import { vi } from "vitest";
// Mock canvas getContext
HTMLCanvasElement.prototype.getContext = vi.fn();
+56
View File
@@ -0,0 +1,56 @@
import { Metadata, Script } from "@/lib/types";
import { promises as fs } from "fs";
import { NextResponse } from "next/server";
import path from "path";
export const dynamic = "force-static";
const jsonDir = "public/json";
const metadataFileName = "metadata.json";
const encoding = "utf-8";
const getMetadata = async () => {
const filePath = path.resolve(jsonDir, metadataFileName);
const fileContent = await fs.readFile(filePath, encoding);
const metadata: Metadata = JSON.parse(fileContent);
return metadata;
};
const getScripts = async () => {
const filePaths = (await fs.readdir(jsonDir))
.filter((fileName) => fileName !== metadataFileName)
.map((fileName) => path.resolve(jsonDir, fileName));
const scripts = await Promise.all(
filePaths.map(async (filePath) => {
const fileContent = await fs.readFile(filePath, encoding);
const script: Script = JSON.parse(fileContent);
return script;
}),
);
return scripts;
};
export async function GET() {
try {
const metadata = await getMetadata();
const scripts = await getScripts();
const categories = metadata.categories
.map((category) => {
category.scripts = scripts.filter((script) =>
script.categories.includes(category.id),
);
return category;
})
.sort((a, b) => a.sort_order - b.sort_order);
return NextResponse.json(categories);
} catch (error) {
console.error(error as Error);
return NextResponse.json(
{ error: "Failed to fetch categories" },
{ status: 500 },
);
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,117 @@
import { Label } from "@/components/ui/label";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Category } from "@/lib/types";
import { cn } from "@/lib/utils";
import { z } from "zod";
import { type Script } from "../_schemas/schemas";
import { memo } from "react";
type CategoryProps = {
script: Script;
setScript: (script: Script) => void;
setIsValid: (isValid: boolean) => void;
setZodErrors: (zodErrors: z.ZodError | null) => void;
categories: Category[];
};
const CategoryTag = memo(({
category,
onRemove
}: {
category: Category;
onRemove: () => void;
}) => (
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800">
{category.name}
<button
type="button"
className="ml-1 inline-flex text-blue-400 hover:text-blue-600"
onClick={onRemove}
>
<span className="sr-only">Remove</span>
<svg
className="h-3 w-3"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</span>
));
CategoryTag.displayName = 'CategoryTag';
function Categories({
script,
setScript,
categories,
}: Omit<CategoryProps, "setIsValid" | "setZodErrors">) {
const addCategory = (categoryId: number) => {
setScript({
...script,
categories: [...new Set([...script.categories, categoryId])],
});
};
const removeCategory = (categoryId: number) => {
setScript({
...script,
categories: script.categories.filter((id: number) => id !== categoryId),
});
};
const categoryMap = new Map(categories.map(c => [c.id, c]));
return (
<div>
<Label>
Category <span className="text-red-500">*</span>
</Label>
<Select onValueChange={(value) => addCategory(Number(value))}>
<SelectTrigger>
<SelectValue placeholder="Select a category" />
</SelectTrigger>
<SelectContent>
{categories.map((category) => (
<SelectItem key={category.id} value={category.id.toString()}>
{category.name}
</SelectItem>
))}
</SelectContent>
</Select>
<div
className={cn(
"flex flex-wrap gap-2",
script.categories.length !== 0 && "mt-2",
)}
>
{script.categories.map((categoryId) => {
const category = categoryMap.get(categoryId);
return category ? (
<CategoryTag
key={categoryId}
category={category}
onRemove={() => removeCategory(categoryId)}
/>
) : null;
})}
</div>
</div>
);
}
export default memo(Categories);
@@ -0,0 +1,240 @@
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { OperatingSystems } from "@/config/siteConfig";
import { PlusCircle, Trash2 } from "lucide-react";
import { memo, useCallback, useRef } from "react";
import { z } from "zod";
import { InstallMethodSchema, ScriptSchema, type Script } from "../_schemas/schemas";
type InstallMethodProps = {
script: Script;
setScript: (value: Script | ((prevState: Script) => Script)) => void;
setIsValid: (isValid: boolean) => void;
setZodErrors: (zodErrors: z.ZodError | null) => void;
};
function InstallMethod({
script,
setScript,
setIsValid,
setZodErrors,
}: InstallMethodProps) {
const cpuRefs = useRef<(HTMLInputElement | null)[]>([]);
const ramRefs = useRef<(HTMLInputElement | null)[]>([]);
const hddRefs = useRef<(HTMLInputElement | null)[]>([]);
const addInstallMethod = useCallback(() => {
setScript((prev) => {
const method = InstallMethodSchema.parse({
type: "default",
script: `${prev.type}/${prev.slug}.sh`,
resources: {
cpu: null,
ram: null,
hdd: null,
os: null,
version: null,
},
});
return {
...prev,
install_methods: [...prev.install_methods, method],
};
});
}, [setScript]);
const updateInstallMethod = useCallback(
(
index: number,
key: keyof Script["install_methods"][number],
value: Script["install_methods"][number][keyof Script["install_methods"][number]],
) => {
setScript((prev) => {
const updatedMethods = prev.install_methods.map((method, i) => {
if (i === index) {
const updatedMethod = { ...method, [key]: value };
if (key === "type") {
updatedMethod.script =
value === "alpine"
? `/${prev.type}/alpine-${prev.slug}.sh`
: `/${prev.type}/${prev.slug}.sh`;
// Set OS to Alpine and reset version if type is alpine
if (value === "alpine") {
updatedMethod.resources.os = "Alpine";
updatedMethod.resources.version = null;
}
}
return updatedMethod;
}
return method;
});
const updated = {
...prev,
install_methods: updatedMethods,
};
const result = ScriptSchema.safeParse(updated);
setIsValid(result.success);
if (!result.success) {
setZodErrors(result.error);
} else {
setZodErrors(null);
}
return updated;
});
},
[setScript, setIsValid, setZodErrors],
);
const removeInstallMethod = useCallback(
(index: number) => {
setScript((prev) => ({
...prev,
install_methods: prev.install_methods.filter((_, i) => i !== index),
}));
},
[setScript],
);
return (
<>
<h3 className="text-xl font-semibold">Install Methods</h3>
{script.install_methods.map((method, index) => (
<div key={index} className="space-y-2 border p-4 rounded">
<Select
value={method.type}
onValueChange={(value) => updateInstallMethod(index, "type", value)}
>
<SelectTrigger>
<SelectValue placeholder="Type" />
</SelectTrigger>
<SelectContent>
<SelectItem value="default">Default</SelectItem>
<SelectItem value="alpine">Alpine</SelectItem>
</SelectContent>
</Select>
<div className="flex gap-2">
<Input
ref={(el) => {
cpuRefs.current[index] = el;
}}
placeholder="CPU in Cores"
type="number"
value={method.resources.cpu || ""}
onChange={(e) =>
updateInstallMethod(index, "resources", {
...method.resources,
cpu: e.target.value ? Number(e.target.value) : null,
})
}
/>
<Input
ref={(el) => {
ramRefs.current[index] = el;
}}
placeholder="RAM in MB"
type="number"
value={method.resources.ram || ""}
onChange={(e) =>
updateInstallMethod(index, "resources", {
...method.resources,
ram: e.target.value ? Number(e.target.value) : null,
})
}
/>
<Input
ref={(el) => {
hddRefs.current[index] = el;
}}
placeholder="HDD in GB"
type="number"
value={method.resources.hdd || ""}
onChange={(e) =>
updateInstallMethod(index, "resources", {
...method.resources,
hdd: e.target.value ? Number(e.target.value) : null,
})
}
/>
</div>
<div className="flex gap-2">
<Select
value={method.resources.os || undefined}
onValueChange={(value) =>
updateInstallMethod(index, "resources", {
...method.resources,
os: value || null,
version: null, // Reset version when OS changes
})
}
disabled={method.type === "alpine"}
>
<SelectTrigger>
<SelectValue placeholder="OS" />
</SelectTrigger>
<SelectContent>
{OperatingSystems.map((os) => (
<SelectItem key={os.name} value={os.name}>
{os.name}
</SelectItem>
))}
</SelectContent>
</Select>
<Select
value={method.resources.version || undefined}
onValueChange={(value) =>
updateInstallMethod(index, "resources", {
...method.resources,
version: value || null,
})
}
disabled={method.type === "alpine"}
>
<SelectTrigger>
<SelectValue placeholder="Version" />
</SelectTrigger>
<SelectContent>
{OperatingSystems.find(
(os) => os.name === method.resources.os,
)?.versions.map((version) => (
<SelectItem key={version.slug} value={version.name}>
{version.name}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<Button
variant="destructive"
size="sm"
type="button"
onClick={() => removeInstallMethod(index)}
>
<Trash2 className="mr-2 h-4 w-4" /> Remove Install Method
</Button>
</div>
))}
<Button
type="button"
size="sm"
disabled={script.install_methods.length >= 2}
onClick={addInstallMethod}
>
<PlusCircle className="mr-2 h-4 w-4" /> Add Install Method
</Button>
</>
);
}
export default memo(InstallMethod);
@@ -0,0 +1,130 @@
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { AlertColors } from "@/config/siteConfig";
import { cn } from "@/lib/utils";
import { PlusCircle, Trash2 } from "lucide-react";
import { z } from "zod";
import { ScriptSchema, type Script } from "../_schemas/schemas";
import { memo, useCallback, useRef } from "react";
type NoteProps = {
script: Script;
setScript: (script: Script) => void;
setIsValid: (isValid: boolean) => void;
setZodErrors: (zodErrors: z.ZodError | null) => void;
};
function Note({
script,
setScript,
setIsValid,
setZodErrors,
}: NoteProps) {
const inputRefs = useRef<(HTMLInputElement | null)[]>([]);
const addNote = useCallback(() => {
setScript({
...script,
notes: [...script.notes, { text: "", type: "" }],
});
}, [script, setScript]);
const updateNote = useCallback((
index: number,
key: keyof Script["notes"][number],
value: string,
) => {
const updated: Script = {
...script,
notes: script.notes.map((note, i) =>
i === index ? { ...note, [key]: value } : note,
),
};
const result = ScriptSchema.safeParse(updated);
setIsValid(result.success);
setZodErrors(result.success ? null : result.error);
setScript(updated);
// Restore focus after state update
if (key === "text") {
setTimeout(() => {
inputRefs.current[index]?.focus();
}, 0);
}
}, [script, setScript, setIsValid, setZodErrors]);
const removeNote = useCallback((index: number) => {
setScript({
...script,
notes: script.notes.filter((_, i) => i !== index),
});
}, [script, setScript]);
const NoteItem = memo(
({ note, index }: { note: Script["notes"][number]; index: number }) => (
<div className="space-y-2 border p-4 rounded">
<Input
placeholder="Note Text"
value={note.text}
onChange={(e) => updateNote(index, "text", e.target.value)}
ref={(el) => {
inputRefs.current[index] = el;
}}
/>
<Select
value={note.type}
onValueChange={(value) => updateNote(index, "type", value)}
>
<SelectTrigger className="flex-1">
<SelectValue placeholder="Type" />
</SelectTrigger>
<SelectContent>
{Object.keys(AlertColors).map((type) => (
<SelectItem key={type} value={type}>
<span className="flex items-center gap-2">
{type.charAt(0).toUpperCase() + type.slice(1)}{" "}
<div
className={cn(
"size-4 rounded-full border",
AlertColors[type as keyof typeof AlertColors],
)}
/>
</span>
</SelectItem>
))}
</SelectContent>
</Select>
<Button
size="sm"
variant="destructive"
type="button"
onClick={() => removeNote(index)}
>
<Trash2 className="mr-2 h-4 w-4" /> Remove Note
</Button>
</div>
),
);
NoteItem.displayName = 'NoteItem';
return (
<>
<h3 className="text-xl font-semibold">Notes</h3>
{script.notes.map((note, index) => (
<NoteItem key={index} note={note} index={index} />
))}
<Button type="button" size="sm" onClick={addNote}>
<PlusCircle className="mr-2 h-4 w-4" /> Add Note
</Button>
</>
);
}
export default memo(Note);
@@ -0,0 +1,45 @@
import { z } from "zod";
export const InstallMethodSchema = z.object({
type: z.enum(["default", "alpine"], {
errorMap: () => ({ message: "Type must be either 'default' or 'alpine'" })
}),
script: z.string().min(1, "Script content cannot be empty"),
resources: z.object({
cpu: z.number().nullable(),
ram: z.number().nullable(),
hdd: z.number().nullable(),
os: z.string().nullable(),
version: z.string().nullable(),
}),
});
const NoteSchema = z.object({
text: z.string().min(1, "Note text cannot be empty"),
type: z.string().min(1, "Note type cannot be empty"),
});
export const ScriptSchema = z.object({
name: z.string().min(1, "Name is required"),
slug: z.string().min(1, "Slug is required"),
categories: z.array(z.number()),
date_created: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format").min(1, "Date is required"),
type: z.enum(["vm", "ct", "misc", "turnkey"], {
errorMap: () => ({ message: "Type must be either 'vm', 'ct', 'misc' or 'turnkey'" })
}),
updateable: z.boolean(),
privileged: z.boolean(),
interface_port: z.number().nullable(),
documentation: z.string().nullable(),
website: z.string().url().nullable(),
logo: z.string().url().nullable(),
description: z.string().min(1, "Description is required"),
install_methods: z.array(InstallMethodSchema).min(1, "At least one install method is required"),
default_credentials: z.object({
username: z.string().nullable(),
password: z.string().nullable(),
}),
notes: z.array(NoteSchema),
});
export type Script = z.infer<typeof ScriptSchema>;
+335
View File
@@ -0,0 +1,335 @@
"use client";
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import { Calendar } from "@/components/ui/calendar";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Switch } from "@/components/ui/switch";
import { Textarea } from "@/components/ui/textarea";
import { fetchCategories } from "@/lib/data";
import { Category } from "@/lib/types";
import { cn } from "@/lib/utils";
import { format } from "date-fns";
import { CalendarIcon, Check, Clipboard } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { toast } from "sonner";
import { z } from "zod";
import Categories from "./_components/Categories";
import InstallMethod from "./_components/InstallMethod";
import Note from "./_components/Note";
import { ScriptSchema, type Script } from "./_schemas/schemas";
const initialScript: Script = {
name: "",
slug: "",
categories: [],
date_created: "",
type: "ct",
updateable: false,
privileged: false,
interface_port: null,
documentation: null,
website: null,
logo: null,
description: "",
install_methods: [],
default_credentials: {
username: null,
password: null,
},
notes: [],
};
export default function JSONGenerator() {
const [script, setScript] = useState<Script>(initialScript);
const [isCopied, setIsCopied] = useState(false);
const [isValid, setIsValid] = useState(false);
const [categories, setCategories] = useState<Category[]>([]);
const [zodErrors, setZodErrors] = useState<z.ZodError | null>(null);
useEffect(() => {
fetchCategories()
.then(setCategories)
.catch((error) => console.error("Error fetching categories:", error));
}, []);
const updateScript = useCallback(
(key: keyof Script, value: Script[keyof Script]) => {
setScript((prev) => {
const updated = { ...prev, [key]: value };
if (key === "type" || key === "slug") {
updated.install_methods = updated.install_methods.map((method) => ({
...method,
script:
method.type === "alpine"
? `/${updated.type}/alpine-${updated.slug}.sh`
: `/${updated.type}/${updated.slug}.sh`,
}));
}
const result = ScriptSchema.safeParse(updated);
setIsValid(result.success);
setZodErrors(result.success ? null : result.error);
return updated;
});
},
[],
);
const handleCopy = useCallback(() => {
navigator.clipboard.writeText(JSON.stringify(script, null, 2));
setIsCopied(true);
setTimeout(() => setIsCopied(false), 2000);
toast.success("Copied metadata to clipboard");
}, [script]);
const handleDateSelect = useCallback(
(date: Date | undefined) => {
updateScript("date_created", format(date || new Date(), "yyyy-MM-dd"));
},
[updateScript],
);
const formattedDate = useMemo(
() =>
script.date_created ? format(script.date_created, "PPP") : undefined,
[script.date_created],
);
const validationAlert = useMemo(
() => (
<Alert
className={cn("text-black", isValid ? "bg-green-100" : "bg-red-100")}
>
<AlertTitle>{isValid ? "Valid JSON" : "Invalid JSON"}</AlertTitle>
<AlertDescription>
{isValid
? "The current JSON is valid according to the schema."
: "The current JSON does not match the required schema."}
</AlertDescription>
{zodErrors && (
<div className="mt-2 space-y-1">
{zodErrors.errors.map((error, index) => (
<AlertDescription key={index} className="p-1 text-red-500">
{error.path.join(".")} - {error.message}
</AlertDescription>
))}
</div>
)}
</Alert>
),
[isValid, zodErrors],
);
return (
<div className="flex h-screen mt-20">
<div className="w-1/2 p-4 overflow-y-auto">
<h2 className="text-2xl font-bold mb-4">JSON Generator</h2>
<form className="space-y-4">
<div className="grid grid-cols-2 gap-4">
<div>
<Label>
Name <span className="text-red-500">*</span>
</Label>
<Input
placeholder="Example"
value={script.name}
onChange={(e) => updateScript("name", e.target.value)}
/>
</div>
<div>
<Label>
Slug <span className="text-red-500">*</span>
</Label>
<Input
placeholder="example"
value={script.slug}
onChange={(e) => updateScript("slug", e.target.value)}
/>
</div>
</div>
<div>
<Label>
Logo <span className="text-red-500">*</span>
</Label>
<Input
placeholder="Full logo URL"
value={script.logo || ""}
onChange={(e) => updateScript("logo", e.target.value || null)}
/>
</div>
<div>
<Label>
Description <span className="text-red-500">*</span>
</Label>
<Textarea
placeholder="Example"
value={script.description}
onChange={(e) => updateScript("description", e.target.value)}
/>
</div>
<Categories
script={script}
setScript={setScript}
categories={categories}
/>
<div className="flex gap-2">
<div className="flex flex-col gap-2 w-full">
<Label>Date Created</Label>
<Popover>
<PopoverTrigger asChild className="flex-1">
<Button
variant={"outline"}
className={cn(
"pl-3 text-left font-normal w-full",
!script.date_created && "text-muted-foreground",
)}
>
{formattedDate || <span>Pick a date</span>}
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar
mode="single"
selected={new Date(script.date_created)}
onSelect={handleDateSelect}
initialFocus
/>
</PopoverContent>
</Popover>
</div>
<div className="flex flex-col gap-2 w-full">
<Label>Type</Label>
<Select
value={script.type}
onValueChange={(value) => updateScript("type", value)}
>
<SelectTrigger className="flex-1">
<SelectValue placeholder="Type" />
</SelectTrigger>
<SelectContent>
<SelectItem value="ct">LXC Container</SelectItem>
<SelectItem value="vm">Virtual Machine</SelectItem>
<SelectItem value="misc">Miscellaneous</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<div className="w-full flex gap-5">
<div className="flex items-center space-x-2">
<Switch
checked={script.updateable}
onCheckedChange={(checked) =>
updateScript("updateable", checked)
}
/>
<label>Updateable</label>
</div>
<div className="flex items-center space-x-2">
<Switch
checked={script.privileged}
onCheckedChange={(checked) =>
updateScript("privileged", checked)
}
/>
<label>Privileged</label>
</div>
</div>
<Input
placeholder="Interface Port"
type="number"
value={script.interface_port || ""}
onChange={(e) =>
updateScript(
"interface_port",
e.target.value ? Number(e.target.value) : null,
)
}
/>
<div className="flex gap-2">
<Input
placeholder="Website URL"
value={script.website || ""}
onChange={(e) => updateScript("website", e.target.value || null)}
/>
<Input
placeholder="Documentation URL"
value={script.documentation || ""}
onChange={(e) =>
updateScript("documentation", e.target.value || null)
}
/>
</div>
<InstallMethod
script={script}
setScript={setScript}
setIsValid={setIsValid}
setZodErrors={setZodErrors}
/>
<h3 className="text-xl font-semibold">Default Credentials</h3>
<Input
placeholder="Username"
value={script.default_credentials.username || ""}
onChange={(e) =>
updateScript("default_credentials", {
...script.default_credentials,
username: e.target.value || null,
})
}
/>
<Input
placeholder="Password"
value={script.default_credentials.password || ""}
onChange={(e) =>
updateScript("default_credentials", {
...script.default_credentials,
password: e.target.value || null,
})
}
/>
<Note
script={script}
setScript={setScript}
setIsValid={setIsValid}
setZodErrors={setZodErrors}
/>
</form>
</div>
<div className="w-1/2 p-4 bg-background overflow-y-auto">
{validationAlert}
<div className="relative">
<Button
className="absolute right-2 top-2"
size="icon"
variant="outline"
onClick={handleCopy}
>
{isCopied ? (
<Check className="h-4 w-4" />
) : (
<Clipboard className="h-4 w-4" />
)}
</Button>
<pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll">
{JSON.stringify(script, null, 2)}
</pre>
</div>
</div>
</div>
);
}
+94
View File
@@ -0,0 +1,94 @@
import Footer from "@/components/Footer";
import Navbar from "@/components/Navbar";
import { ThemeProvider } from "@/components/theme-provider";
import { Toaster } from "@/components/ui/sonner";
import { analytics, basePath } from "@/config/siteConfig";
import "@/styles/globals.css";
import { Inter } from "next/font/google";
import { NuqsAdapter } from "nuqs/adapters/next/app";
import React from "react";
const inter = Inter({ subsets: ["latin"] });
export const metadata = {
title: "Proxmox VE Helper-Scripts",
generator: "Next.js",
applicationName: "Proxmox VE Helper-Scripts",
referrer: "origin-when-cross-origin",
keywords: [
"Proxmox VE",
"Helper-Scripts",
"tteck",
"helper",
"scripts",
"proxmox",
"VE",
],
authors: { name: "Bram Suurd" },
creator: "Bram Suurd",
publisher: "Bram Suurd",
description:
"A Front-end for the Proxmox VE Helper-Scripts (Community) Repository. Featuring over 200+ scripts to help you manage your Proxmox VE environment.",
favicon: "/app/favicon.ico",
formatDetection: {
email: false,
address: false,
telephone: false,
},
metadataBase: new URL(`https://community-scripts.github.io/${basePath}/`),
openGraph: {
title: "Proxmox VE Helper-Scripts",
description:
"A Front-end for the Proxmox VE Helper-Scripts (Community) Repository. Featuring over 200+ scripts to help you manage your Proxmox VE environment.",
url: "/defaultimg.png",
images: [
{
url: `https://community-scripts.github.io/${basePath}/defaultimg.png`,
},
],
locale: "en_US",
type: "website",
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" suppressHydrationWarning>
<head>
<script
defer
src={`https://${analytics.url}/script.js`}
data-website-id={analytics.token}
></script>
<link rel="canonical" href={metadata.metadataBase.href} />
<link rel="manifest" href="manifest.webmanifest" />
<link rel="preconnect" href="https://api.github.com" />
</head>
<body className={inter.className}>
<ThemeProvider
attribute="class"
defaultTheme="dark"
enableSystem
disableTransitionOnChange
>
<div className="flex w-full flex-col justify-center">
<Navbar />
<div className="flex min-h-screen flex-col justify-center">
<div className="flex w-full justify-center">
<div className="w-full max-w-7xl ">
<NuqsAdapter>{children}</NuqsAdapter>
<Toaster richColors />
</div>
</div>
<Footer />
</div>
</div>
</ThemeProvider>
</body>
</html>
);
}
+28
View File
@@ -0,0 +1,28 @@
import { basePath } from "@/config/siteConfig";
import type { MetadataRoute } from "next";
export const generateStaticParams = () => {
return [];
};
export default function manifest(): MetadataRoute.Manifest {
return {
name: "Proxmox VE Helper-Scripts",
short_name: "Proxmox VE Helper-Scripts",
description:
"A Re-designed Front-end for the Proxmox VE Helper-Scripts Repository. Featuring over 200+ scripts to help you manage your Proxmox VE environment.",
theme_color: "#030712",
background_color: "#030712",
display: "standalone",
orientation: "portrait",
scope: `${basePath}`,
start_url: `${basePath}`,
icons: [
{
src: "logo.png",
sizes: "512x512",
type: "image/png",
},
],
};
}
+20
View File
@@ -0,0 +1,20 @@
"use client";
import { Button } from "@/components/ui/button";
export default function NotFoundPage() {
return (
<div className="flex h-screen w-full flex-col items-center justify-center gap-5 bg-background px-4 md:px-6">
<div className="space-y-2 text-center">
<h1 className="text-4xl font-bold tracking-tighter sm:text-5xl md:text-6xl">
404
</h1>
<p className="text-muted-foreground md:text-xl">
Oops, the page you are looking for could not be found.
</p>
</div>
<Button onClick={() => window.history.back()} variant="secondary">
Go Back
</Button>
</div>
);
}
+146
View File
@@ -0,0 +1,146 @@
"use client";
import AnimatedGradientText from "@/components/ui/animated-gradient-text";
import { Button } from "@/components/ui/button";
import { CardFooter } from "@/components/ui/card";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog";
import Particles from "@/components/ui/particles";
import { Separator } from "@/components/ui/separator";
import { basePath } from "@/config/siteConfig";
import { cn } from "@/lib/utils";
import { ArrowRightIcon, ExternalLink } from "lucide-react";
import { useTheme } from "next-themes";
import Link from "next/link";
import { useEffect, useState } from "react";
import { FaGithub } from "react-icons/fa";
function CustomArrowRightIcon() {
return <ArrowRightIcon className="h-4 w-4" width={1} />;
}
export default function Page() {
const { theme } = useTheme();
const [color, setColor] = useState("#000000");
useEffect(() => {
setColor(theme === "dark" ? "#ffffff" : "#000000");
}, [theme]);
return (
<div className="w-full mt-16">
<Particles
className="absolute inset-0 -z-40"
quantity={100}
ease={80}
color={color}
refresh
/>
<div className="container mx-auto">
<div className="flex h-[80vh] flex-col items-center justify-center gap-4 py-20 lg:py-40">
<Dialog>
<DialogTrigger>
<div>
<AnimatedGradientText>
<div
className={cn(
`absolute inset-0 block size-full animate-gradient bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:var(--bg-size)_100%] [border-radius:inherit] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]`,
`p-px ![mask-composite:subtract]`,
)}
/>
<Separator className="mx-2 h-4" orientation="vertical" />
<span
className={cn(
`animate-gradient bg-gradient-to-r from-[#ffaa40] via-[#9c40ff] to-[#ffaa40] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent`,
`inline`,
)}
>
Scripts by Tteck
</span>
</AnimatedGradientText>
</div>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Thank You!</DialogTitle>
<DialogDescription>
A big thank you to Tteck and the many contributors who have
made this project possible. Your hard work is truly
appreciated by the entire Proxmox community!
</DialogDescription>
</DialogHeader>
<CardFooter className="flex flex-col gap-2">
<Button className="w-full" variant="outline" asChild>
<a
href="https://github.com/tteck"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center"
>
<FaGithub className="mr-2 h-4 w-4" /> Tteck&apos;s GitHub
</a>
</Button>
<Button className="w-full" asChild>
<a
href={`https://github.com/community-scripts/${basePath}`}
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center"
>
<ExternalLink className="mr-2 h-4 w-4" /> Proxmox Helper
Scripts
</a>
</Button>
</CardFooter>
</DialogContent>
</Dialog>
<div className="flex flex-col gap-4">
<h1 className="max-w-2xl text-center text-5xl font-semibold tracking-tighter md:text-7xl">
Make managing your Homelab a breeze
</h1>
<p className="max-w-2xl text-center text-lg leading-relaxed tracking-tight text-muted-foreground md:text-xl">
We are a community-driven initiative that simplifies the setup of
Proxmox Virtual Environment (VE).
<br />
<br />
Originally created by{" "}
<a href="https://github.com/tteck" target="_blank">
tteck
</a>
, these scripts automate and streamline
<br />
the process of creating and configuring Linux containers (LXC) and
virtual machines (VMs) on Proxmox VE.
<br />
<br />
With 200+ scripts to help you manage your{" "}
<b>Proxmox VE environment</b>.<br />
Whether you&#39;re a seasoned user or a newcomer, we&#39;ve got
you covered.
</p>
</div>
<div className="flex flex-row gap-3">
<Link href="/scripts">
<Button
size="lg"
variant="expandIcon"
Icon={CustomArrowRightIcon}
iconPlacement="right"
className="hover:"
>
View Scripts
</Button>
</Link>
</div>
</div>
</div>
</div>
);
}
+14
View File
@@ -0,0 +1,14 @@
import { basePath } from "@/config/siteConfig";
import type { MetadataRoute } from "next";
export const dynamic = "force-static";
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: "*",
allow: "/",
},
sitemap: `https://community-scripts.github.io/${basePath}/sitemap.xml`,
};
}
@@ -0,0 +1,132 @@
import { useCallback, useEffect, useRef } from "react";
import { formattedBadge } from "@/components/CommandMenu";
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
} from "@/components/ui/accordion";
import { Category } from "@/lib/types";
import { cn } from "@/lib/utils";
import Image from "next/image";
import Link from "next/link";
import { useState } from "react";
import { basePath } from "@/config/siteConfig";
export default function ScriptAccordion({
items,
selectedScript,
setSelectedScript,
}: {
items: Category[];
selectedScript: string | null;
setSelectedScript: (script: string | null) => void;
}) {
const [expandedItem, setExpandedItem] = useState<string | undefined>(
undefined,
);
const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({});
const handleAccordionChange = (value: string | undefined) => {
setExpandedItem(value);
};
const handleSelected = useCallback(
(slug: string) => {
setSelectedScript(slug);
},
[setSelectedScript],
);
useEffect(() => {
if (selectedScript) {
const category = items.find((category) =>
category.scripts.some((script) => script.slug === selectedScript),
);
if (category) {
setExpandedItem(category.name);
handleSelected(selectedScript);
}
}
}, [selectedScript, items, handleSelected]);
return (
<Accordion
type="single"
value={expandedItem}
onValueChange={handleAccordionChange}
collapsible
className="overflow-y-scroll max-h-[calc(100vh-220px)] overflow-x-hidden mt-3 p-2"
>
{items.map((category) => (
<AccordionItem
key={category.id + ":category"}
value={category.name}
className={cn("sm:text-md flex flex-col border-none", {
"rounded-lg bg-accent/30": expandedItem === category.name,
})}
>
<AccordionTrigger
className={cn(
"duration-250 rounded-lg transition ease-in-out hover:-translate-y-1 hover:scale-105 hover:bg-accent",
)}
>
<div className="mr-2 flex w-full items-center justify-between">
<span className="pl-2">{category.name} </span>
<span className="rounded-full bg-gray-200 px-2 py-1 text-xs text-muted-foreground hover:no-underline dark:bg-blue-800/20">
{category.scripts.length}
</span>
</div>{" "}
</AccordionTrigger>
<AccordionContent
data-state={expandedItem === category.name ? "open" : "closed"}
className="pt-0"
>
{category.scripts
.slice()
.sort((a, b) => a.name.localeCompare(b.name))
.map((script, index) => (
<div key={index}>
<Link
href={{
pathname: "/scripts",
query: { id: script.slug },
}}
prefetch={false}
className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 hover:dark:bg-accent/20 ${
selectedScript === script.slug
? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white"
: ""
}`}
onClick={() => handleSelected(script.slug)}
ref={(el) => {
linkRefs.current[script.slug] = el;
}}
>
<div className="flex items-center">
<Image
src={script.logo || `/${basePath}/logo.png`}
height={16}
width={16}
unoptimized
onError={(e) =>
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
alt={script.name}
className="mr-1 w-4 h-4 rounded-full"
/>
<span className="flex items-center gap-2">
{script.name}
</span>
</div>
{formattedBadge(script.type)}
</Link>
</div>
))}
</AccordionContent>
</AccordionItem>
))}
</Accordion>
);
}
@@ -0,0 +1,213 @@
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { basePath, mostPopularScripts } from "@/config/siteConfig";
import { extractDate } from "@/lib/time";
import { Category, Script } from "@/lib/types";
import { CalendarPlus } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import { useMemo, useState } from "react";
const ITEMS_PER_PAGE = 3;
export const getDisplayValueFromType = (type: string) => {
switch (type) {
case "ct":
return "LXC";
case "vm":
return "VM";
case "misc":
return "";
default:
return "";
}
};
export function LatestScripts({ items }: { items: Category[] }) {
const [page, setPage] = useState(1);
const latestScripts = useMemo(() => {
if (!items) return [];
const scripts = items.flatMap((category) => category.scripts || []);
return scripts.sort(
(a, b) =>
new Date(b.date_created).getTime() - new Date(a.date_created).getTime(),
);
}, [items]);
const goToNextPage = () => {
setPage((prevPage) => prevPage + 1);
};
const goToPreviousPage = () => {
setPage((prevPage) => prevPage - 1);
};
const startIndex = (page - 1) * ITEMS_PER_PAGE;
const endIndex = page * ITEMS_PER_PAGE;
if (!items) {
return null;
}
return (
<div className="">
{latestScripts.length > 0 && (
<div className="flex w-full items-center justify-between">
<h2 className="text-lg font-semibold">Newest Scripts</h2>
<div className="flex items-center justify-end gap-1">
{page > 1 && (
<div
className="cursor-pointer select-none p-2 text-sm font-semibold"
onClick={goToPreviousPage}
>
Previous
</div>
)}
{endIndex < latestScripts.length && (
<div
onClick={goToNextPage}
className="cursor-pointer select-none p-2 text-sm font-semibold"
>
{page === 1 ? "More.." : "Next"}
</div>
)}
</div>
</div>
)}
<div className="min-w flex w-full flex-row flex-wrap gap-4">
{latestScripts.slice(startIndex, endIndex).map((script) => (
<Card
key={script.slug}
className="min-w-[250px] flex-1 flex-grow bg-accent/30"
>
<CardHeader>
<CardTitle className="flex items-center gap-3">
<div className="flex h-16 w-16 items-center justify-center rounded-lg bg-accent p-1">
<Image
src={script.logo || `/${basePath}/logo.png`}
unoptimized
height={64}
width={64}
alt=""
onError={(e) =>
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
className="h-11 w-11 object-contain"
/>
</div>
<div className="flex flex-col">
<p className="text-lg line-clamp-1">
{script.name} {getDisplayValueFromType(script.type)}
</p>
<p className="text-sm text-muted-foreground flex items-center gap-1">
<CalendarPlus className="h-4 w-4" />
{extractDate(script.date_created)}
</p>
</div>
</CardTitle>
</CardHeader>
<CardContent>
<CardDescription className="line-clamp-3 text-card-foreground">
{script.description}
</CardDescription>
</CardContent>
<CardFooter className="">
<Button asChild variant="outline">
<Link
href={{
pathname: "/scripts",
query: { id: script.slug },
}}
>
View Script
</Link>
</Button>
</CardFooter>
</Card>
))}
</div>
</div>
);
}
export function MostViewedScripts({ items }: { items: Category[] }) {
const mostViewedScripts = items.reduce((acc: Script[], category) => {
const foundScripts = category.scripts.filter((script) =>
mostPopularScripts.includes(script.name),
);
return acc.concat(foundScripts);
}, []);
return (
<div className="">
{mostViewedScripts.length > 0 && (
<>
<h2 className="text-lg font-semibold">Most Viewed Scripts</h2>
</>
)}
<div className="min-w flex w-full flex-row flex-wrap gap-4">
{mostViewedScripts.map((script) => (
<Card
key={script.slug}
className="min-w-[250px] flex-1 flex-grow bg-accent/30"
>
<CardHeader>
<CardTitle className="flex items-center gap-3">
<div className="flex max-h-16 min-h-16 min-w-16 max-w-16 items-center justify-center rounded-lg bg-accent p-1">
<Image
unoptimized
src={script.logo || `/${basePath}/logo.png`}
height={64}
width={64}
alt=""
onError={(e) =>
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
className="h-11 w-11 object-contain"
/>
</div>
<div className="flex flex-col">
<p className="line-clamp-1 text-lg">
{script.name} {getDisplayValueFromType(script.type)}
</p>
<p className="flex items-center gap-1 text-sm text-muted-foreground">
<CalendarPlus className="h-4 w-4" />
{extractDate(script.date_created)}
</p>
</div>
</CardTitle>
</CardHeader>
<CardContent>
<CardDescription className="line-clamp-3 text-card-foreground break-words">
{script.description}
</CardDescription>
</CardContent>
<CardFooter className="">
<Button asChild variant="outline">
<Link
href={{
pathname: "/scripts",
query: { id: script.slug },
}}
prefetch={false}
>
View Script
</Link>
</Button>
</CardFooter>
</Card>
))}
</div>
</div>
);
}
@@ -0,0 +1,100 @@
"use client";
import { Separator } from "@/components/ui/separator";
import { extractDate } from "@/lib/time";
import { Script } from "@/lib/types";
import { X } from "lucide-react";
import Image from "next/image";
import { getDisplayValueFromType } from "./ScriptInfoBlocks";
import Alerts from "./ScriptItems/Alerts";
import Buttons from "./ScriptItems/Buttons";
import DefaultPassword from "./ScriptItems/DefaultPassword";
import DefaultSettings from "./ScriptItems/DefaultSettings";
import Description from "./ScriptItems/Description";
import InstallCommand from "./ScriptItems/InstallCommand";
import InterFaces from "./ScriptItems/InterFaces";
import Tooltips from "./ScriptItems/Tooltips";
import { basePath } from "@/config/siteConfig";
function ScriptItem({
item,
setSelectedScript,
}: {
item: Script;
setSelectedScript: (script: string | null) => void;
}) {
const closeScript = () => {
window.history.pushState({}, document.title, window.location.pathname);
setSelectedScript(null);
};
return (
<div className="mr-7 mt-0 flex w-full min-w-fit">
<div className="flex w-full min-w-fit">
<div className="flex w-full flex-col">
<div className="flex h-[36px] min-w-max items-center justify-between">
<h2 className="text-lg font-semibold">Selected Script</h2>
<X onClick={closeScript} className="cursor-pointer" />
</div>
<div className="rounded-lg border bg-accent/20 p-4">
<div className="flex justify-between">
<div className="flex">
<Image
className="h-32 w-32 rounded-lg bg-accent/60 object-contain p-3 shadow-md"
src={item.logo || `/${basePath}/logo.png`}
width={400}
onError={(e) =>
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
height={400}
alt={item.name}
unoptimized
/>
<div className="ml-4 flex flex-col justify-between">
<div className="flex h-full w-full flex-col justify-between">
<div>
<h1 className="text-lg font-semibold">
{item.name} {getDisplayValueFromType(item.type)}
</h1>
<p className="w-full text-sm text-muted-foreground">
Date added: {extractDate(item.date_created)}
</p>
</div>
<div className="flex gap-5">
<DefaultSettings item={item} />
</div>
</div>
</div>
</div>
<div className="hidden flex-col justify-between gap-2 sm:flex">
<InterFaces item={item} />
<Buttons item={item} />
</div>
</div>
<Separator className="mt-4" />
<div>
<div className="mt-4">
<Description item={item} />
<Alerts item={item} />
</div>
<div className="mt-4 rounded-lg border bg-accent/50">
<div className="flex gap-3 px-4 py-2">
<h2 className="text-lg font-semibold">
How to {item.type == "misc" ? "use" : "install"}
</h2>
<Tooltips item={item} />
</div>
<Separator className="w-full"></Separator>
<InstallCommand item={item} />
</div>
</div>
<DefaultPassword item={item} />
</div>
</div>
</div>
</div>
);
}
export default ScriptItem;
@@ -0,0 +1,35 @@
import TextCopyBlock from "@/components/TextCopyBlock";
import { AlertColors } from "@/config/siteConfig";
import { Script } from "@/lib/types";
import { cn } from "@/lib/utils";
import { AlertCircle, NotepadText } from "lucide-react";
type NoteProps = {
text: string;
type: keyof typeof AlertColors;
}
export default function Alerts({ item }: { item: Script }) {
return (
<>
{item?.notes?.length > 0 &&
item.notes.map((note: NoteProps, index: number) => (
<div key={index} className="mt-4 flex flex-col gap-2">
<p
className={cn(
"inline-flex items-center gap-2 rounded-lg border p-2 pl-4 text-sm",
AlertColors[note.type],
)}
>
{note.type == "info" ? (
<NotepadText className="h-4 min-h-4 w-4 min-w-4" />
) : (
<AlertCircle className="h-4 min-h-4 w-4 min-w-4" />
)}
<span>{TextCopyBlock(note.text)}</span>
</p>
</div>
))}
</>
);
}
@@ -0,0 +1,57 @@
import { Button } from "@/components/ui/button";
import { basePath } from "@/config/siteConfig";
import { Script } from "@/lib/types";
import { BookOpenText, Code, Globe } from "lucide-react";
import Link from "next/link";
const generateSourceUrl = (slug: string, type: string) => {
const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`;
return type === "ct"
? `${baseUrl}/install/${slug}-install.sh`
: `${baseUrl}/${type}/${slug}.sh`;
};
interface ButtonLinkProps {
href: string;
icon: React.ReactNode;
text: string;
}
const ButtonLink = ({ href, icon, text }: ButtonLinkProps) => (
<Button variant="secondary" asChild>
<Link target="_blank" href={href}>
<span className="flex items-center gap-2">
{icon}
{text}
</span>
</Link>
</Button>
);
export default function Buttons({ item }: { item: Script }) {
const buttons = [
item.website && {
href: item.website,
icon: <Globe className="h-4 w-4" />,
text: "Website",
},
item.documentation && {
href: item.documentation,
icon: <BookOpenText className="h-4 w-4" />,
text: "Documentation",
},
{
href: generateSourceUrl(item.slug, item.type),
icon: <Code className="h-4 w-4" />,
text: "Source Code",
},
].filter(Boolean) as ButtonLinkProps[];
return (
<div className="flex flex-wrap justify-end gap-2">
{buttons.map((props, index) => (
<ButtonLink key={index} {...props} />
))}
</div>
);
}
@@ -0,0 +1,42 @@
import handleCopy from "@/components/handleCopy";
import { Button } from "@/components/ui/button";
import { Separator } from "@/components/ui/separator";
import { Script } from "@/lib/types";
export default function DefaultPassword({ item }: { item: Script }) {
const { username, password } = item.default_credentials;
const hasDefaultLogin = username && password;
if (!hasDefaultLogin) return null;
const copyCredential = (type: "username" | "password") => {
handleCopy(type, item.default_credentials[type] ?? "");
};
return (
<div className="mt-4 rounded-lg border bg-accent/50">
<div className="flex gap-3 px-4 py-2">
<h2 className="text-lg font-semibold">Default Login Credentials</h2>
</div>
<Separator className="w-full" />
<div className="flex flex-col gap-2 p-4">
<p className="mb-2 text-sm">
You can use the following credentials to login to the {item.name}{" "}
{item.type}.
</p>
{["username", "password"].map((type) => (
<div key={type} className="text-sm">
{type.charAt(0).toUpperCase() + type.slice(1)}:{" "}
<Button
variant="secondary"
size="null"
onClick={() => copyCredential(type as "username" | "password")}
>
{item.default_credentials[type as "username" | "password"]}
</Button>
</div>
))}
</div>
</div>
);
}
@@ -0,0 +1,51 @@
import { Script } from "@/lib/types";
export default function DefaultSettings({ item }: { item: Script }) {
const getDisplayValueFromRAM = (ram: number) =>
ram >= 1024 ? `${Math.floor(ram / 1024)}GB` : `${ram}MB`;
const ResourceDisplay = ({
settings,
title,
}: {
settings: (typeof item.install_methods)[0];
title: string;
}) => {
const { cpu, ram, hdd } = settings.resources;
return (
<div>
<h2 className="text-md font-semibold">{title}</h2>
<p className="text-sm text-muted-foreground">CPU: {cpu}vCPU</p>
<p className="text-sm text-muted-foreground">
RAM: {getDisplayValueFromRAM(ram ?? 0)}
</p>
<p className="text-sm text-muted-foreground">HDD: {hdd}GB</p>
</div>
);
};
const defaultSettings = item.install_methods.find(
(method) => method.type === "default",
);
const defaultAlpineSettings = item.install_methods.find(
(method) => method.type === "alpine",
);
const hasDefaultSettings =
defaultSettings?.resources &&
Object.values(defaultSettings.resources).some(Boolean);
return (
<>
{hasDefaultSettings && (
<ResourceDisplay settings={defaultSettings} title="Default settings" />
)}
{defaultAlpineSettings && (
<ResourceDisplay
settings={defaultAlpineSettings}
title="Default Alpine settings"
/>
)}
</>
);
}
@@ -0,0 +1,13 @@
import TextCopyBlock from "@/components/TextCopyBlock";
import { Script } from "@/lib/types";
export default function Description({ item }: { item: Script }) {
return (
<div className="p-2">
<h2 className="mb-2 max-w-prose text-lg font-semibold">Description</h2>
<p className="text-sm text-muted-foreground">
{TextCopyBlock(item.description)}
</p>
</div>
);
}

Some files were not shown because too many files have changed in this diff Show More