Compare commits

..

113 Commits

Author SHA1 Message Date
community-scripts-pr-app[bot]
edfbc82048 Update CHANGELOG.md (#3792) 2025-04-09 19:42:20 +02:00
community-scripts-pr-app[bot]
2c36a13af1 Update CHANGELOG.md (#3789)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-09 19:36:06 +02:00
CanbiZ
607ab48f79 paperless_fix_granian_env (#3790) 2025-04-09 19:31:27 +02:00
CanbiZ
30fbcb5ba8 quickfix broken vms 2025-04-09 19:29:12 +02:00
CanbiZ
ef81b82d87 Update debian-vm.sh 2025-04-09 19:17:26 +02:00
CanbiZ
f1a29c1ebb revert & fix missing git push for vms 2025-04-09 18:59:56 +02:00
CanbiZ
404ae5dbcf fix pvecheck 2025-04-09 18:50:27 +02:00
CanbiZ
84478921e7 quickfix vm's for pve 8.4 2025-04-09 18:35:17 +02:00
CanbiZ
2b8d10a4d9 quickfix_quotes 2025-04-09 18:27:42 +02:00
community-scripts-pr-app[bot]
fefdcbbad1 Update CHANGELOG.md (#3786)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-09 17:17:45 +02:00
Tobias
6c239ceb56 Update linkwarden.json (#3783) 2025-04-09 17:10:51 +02:00
CanbiZ
b520c0ab5f Paperless-NGX: remove gunicorn, use python3 for webserver (#3785) 2025-04-09 17:08:34 +02:00
community-scripts-pr-app[bot]
d329666a88 Update CHANGELOG.md (#3780)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-09 17:00:25 +02:00
CanbiZ
874b61d4d5 harmonize pve versions check & vm vars (#3779)
* harmonize proxmox ve version check

* Update openwrt.sh

* push 0-4 and 1-4
2025-04-09 16:13:01 +02:00
community-scripts-pr-app[bot]
a536c4a5a0 Update CHANGELOG.md (#3776)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-09 15:40:30 +02:00
quentinvnk
e4ef18ccfc HomeAssistantOS: allow Proxmox version 8.4 (#3773)
* Allow Proxmox version 8.4

* Update haos-vm.sh

* fix typo

---------

Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-04-09 15:31:45 +02:00
CanbiZ
d949e836b5 core: Removal of OS/Version Selection from Advanced Settings (#3771)
* core: remove os selection in advanced_settings

* debian/ubuntu vars
2025-04-09 15:30:54 +02:00
CanbiZ
ed29ba3409 core: a few path corrections (#3769) 2025-04-09 14:13:18 +02:00
community-scripts-pr-app[bot]
495da1bf98 Update versions.json (#3760) 2025-04-09 14:05:50 +02:00
community-scripts-pr-app[bot]
cc17c2618d Update CHANGELOG.md (#3767) 2025-04-09 14:05:29 +02:00
CanbiZ
3dffd02f08 core: move misc scripts to structured addon/pve paths | Refactor JSON Editor & Script Mapping (#3765)
* Move Scripts to Tools / Add-Ons

* fix json editor slug generating

* update type in jsons

* remove wrong method

* move copy-data to tools
2025-04-09 13:10:02 +02:00
Slaviša Arežina
f2f10376ac Add xmlsec as dependency (#3762) 2025-04-09 12:34:38 +02:00
community-scripts-pr-app[bot]
3ab2ecc3ef Update CHANGELOG.md (#3754)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 17:05:37 +02:00
community-scripts-pr-app[bot]
5413498759 Update CHANGELOG.md (#3752)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 17:05:03 +02:00
community-scripts-pr-app[bot]
44a944f4b3 Update .app files (#3753)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-04-08 17:04:43 +02:00
CanbiZ
bf1966f578 Alpine-PostgreSQL (#3751) 2025-04-08 17:03:21 +02:00
community-scripts-pr-app[bot]
3504cda21c Update CHANGELOG.md (#3750)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 16:00:38 +02:00
Michel Roegl-Brunner
6c1b5d3144 Update meilisearch.json (#3749) 2025-04-08 15:54:20 +02:00
community-scripts-pr-app[bot]
146b0fcb3f Update CHANGELOG.md (#3747)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 15:52:02 +02:00
CanbiZ
aa3d6f4f8b quickfix: remove wrong comma 2025-04-08 15:50:44 +02:00
juronja
542f93437a Alpine-Wireguard: Fix for sysctl and ip_forward (#3744)
* moved ip forwarding to wireguard install and removed silent before echo command, testing if this was a bug

* Adding $STD before echo command

* Update install/alpine-wireguard-install.sh

Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>

---------

Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2025-04-08 15:41:27 +02:00
community-scripts-pr-app[bot]
9ef7ad5d2a Update CHANGELOG.md (#3737)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 14:57:44 +02:00
community-scripts-pr-app[bot]
7ab476e034 Update versions.json (#3742)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 14:56:25 +02:00
Danny Ellis
4ce9551f60 Updating to 4GB with higher old heap size (#3730) 2025-04-08 10:31:00 +02:00
CanbiZ
efcd660e55 TriliumNext: fix dump-db (#3741) 2025-04-08 10:27:56 +02:00
Slaviša Arežina
125f843b19 Added logging to service file (#3738) 2025-04-08 09:35:17 +02:00
CanbiZ
a5acfd25f6 Alpine-MariaDB: better handling of adminer installation (#3739)
* Update alpine-mariadb-install.sh

* remove spaces
2025-04-08 09:29:56 +02:00
CanbiZ
895edccf28 quickfix: remove echo in alpine-mariadb 2025-04-08 08:44:10 +02:00
community-scripts-pr-app[bot]
5a74f2970b Update versions.json (#3734)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-08 07:54:26 +02:00
community-scripts-pr-app[bot]
9a906d35e2 Update CHANGELOG.md (#3726)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-07 18:56:50 +02:00
CanbiZ
97674cfae7 Alpine-MariaDB: Fix Install Service startup (#3701) 2025-04-07 17:51:12 +01:00
John Sturgeon
89ae467364 Changed the category of Channels DVR and NextPVR (#3729)
This resolves #3727
2025-04-07 17:36:20 +02:00
CanbiZ
42a7c00bca Kimai: bump php to 8.4 (#3724) 2025-04-07 16:23:23 +02:00
community-scripts-pr-app[bot]
d28368b596 Update versions.json (#3725)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-07 14:25:14 +02:00
community-scripts-pr-app[bot]
9786bfb55e Update CHANGELOG.md (#3722)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-07 13:02:37 +02:00
CanbiZ
26ea046ba2 Redesign: Zabbix, get always latest version (#3720) 2025-04-07 12:50:37 +02:00
community-scripts-pr-app[bot]
061c7ebd2e Update CHANGELOG.md (#3710) 2025-04-07 11:41:56 +01:00
Slaviša Arežina
5313bb0103 Zitadel: Fix release tarball crawling (#3716) 2025-04-07 11:41:10 +01:00
CanbiZ
86577a0d0d Actual: Increase RAM and add heap-space var for nodejs (#3713)
* Actual: Increase RAM and add heap-space var for nodejs

* Update actualbudget.json

* increase hdd size

* node options
2025-04-07 09:06:46 +02:00
community-scripts-pr-app[bot]
4ae0352304 Update .app files (#3715)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-04-07 07:52:33 +02:00
community-scripts-pr-app[bot]
0c202066f5 Update versions.json (#3711)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-07 07:51:52 +02:00
community-scripts-pr-app[bot]
9bac1398b2 Update date in json (#3714)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-04-07 07:51:31 +02:00
CanbiZ
251f3c411d Breaking: Hoarder > Karakeep (#3699)
* Breaking: Hoarder > Karakeep

* json

* Update hoarder.sh

* formatting
2025-04-07 07:50:45 +02:00
community-scripts-pr-app[bot]
5b73662d9c Update CHANGELOG.md (#3697)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-06 22:42:25 +02:00
Bram Suurd
4ef88cd051 Implement FAQ component and integrate it into the main page (#3709)
* Implement FAQ component and integrate it into the main page; update package-lock.json for development dependencies.

* Adjust Footer component padding for improved layout consistency

* Update FAQ section div to include an ID for improved accessibility and navigation

* Adjust ScriptAccordion max height for improved layout consistency

* Remove default value from Accordion in FAQ component

* Refactor FAQ items for clarity and consistency; update titles and content for improved user understanding.

* Refactor FAQ component to use index as key for Accordion items; remove IDs from FAQ_Items for simplified mapping.
2025-04-06 22:28:04 +02:00
CanbiZ
427ce771d7 Actual: Add git dependency & change yarn commands (#3703) 2025-04-06 16:00:08 +02:00
CanbiZ
c08ebc48e8 Pelican-Panel: Fix PHP 8.4 Repository (#3700) 2025-04-06 15:48:27 +02:00
community-scripts-pr-app[bot]
421248ccf3 Update versions.json (#3702)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-06 14:07:16 +02:00
community-scripts-pr-app[bot]
b395a1846c Update CHANGELOG.md (#3686) 2025-04-06 10:17:23 +01:00
community-scripts-pr-app[bot]
c2893f3edf Update versions.json (#3693) 2025-04-06 10:17:05 +01:00
community-scripts-pr-app[bot]
00f91843ec Update CHANGELOG.md (#3677) 2025-04-05 17:01:57 +01:00
community-scripts-pr-app[bot]
5451047f44 Update versions.json (#3679) 2025-04-05 17:01:36 +01:00
dependabot[bot]
d8848464be Bump vite from 6.2.4 to 6.2.5 in /frontend (#3668) 2025-04-05 17:01:20 +01:00
community-scripts-pr-app[bot]
019e1ac8a0 Update versions.json (#3674)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-05 08:46:31 +02:00
community-scripts-pr-app[bot]
d4b67e0c7e Update CHANGELOG.md (#3673)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-05 08:45:54 +02:00
community-scripts-pr-app[bot]
112fa215fb Update CHANGELOG.md (#3670)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-05 01:10:52 +02:00
community-scripts-pr-app[bot]
f6a77ec41f Update .app files (#3671)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-04-05 01:10:38 +02:00
community-scripts-pr-app[bot]
71a37368b0 Update date in json (#3672)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-04-05 01:10:26 +02:00
push-app-to-main[bot]
214d21f91e meilisearch (#3638)
* 'Add new script'

* change license

* change license

* Update install/meilisearch-install.sh

Co-authored-by: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com>

* Update frontend/public/json/meilisearch.json

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Bas van den Berg <74251551+bvdberg01@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2025-04-05 00:22:49 +02:00
Bas van den Berg
8b1cdd1f3f Pelican Panel: Bump php to 8.4 (#3669) 2025-04-04 22:48:15 +02:00
community-scripts-pr-app[bot]
2a24d53b54 Update CHANGELOG.md (#3658)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-04 17:40:47 +02:00
CanbiZ
51692da70f Pterodactyl: Pump Php to 8.4 (#3655) 2025-04-04 17:40:02 +02:00
CanbiZ
481156275b Caddy: add git for xcaddy (#3657) 2025-04-04 17:39:37 +02:00
CanbiZ
23c01141db core: fix raw path (#3656) 2025-04-04 16:05:12 +02:00
community-scripts-pr-app[bot]
109235f720 Update versions.json (#3659)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-04 14:23:16 +02:00
community-scripts-pr-app[bot]
4912f76bc5 Update versions.json (#3652)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-04 13:45:12 +02:00
community-scripts-pr-app[bot]
b62a673ff2 Update CHANGELOG.md (#3649)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-03 23:07:47 +02:00
verbumfeit
f0c59f8cba Correct URL (#3648) 2025-04-03 23:06:24 +02:00
community-scripts-pr-app[bot]
56093ed951 Update CHANGELOG.md (#3643)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-03 16:15:53 +02:00
CanbiZ
e55f3f77fd VM: show progress bar while downloading (#3634) 2025-04-03 15:01:23 +01:00
community-scripts-pr-app[bot]
c231e56302 Update CHANGELOG.md (#3641)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-03 14:13:34 +02:00
community-scripts-pr-app[bot]
69c1a64855 Update versions.json (#3642)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-03 14:13:10 +02:00
Albert Ribera
01ff0a2dc7 Update prowlarr.sh (#3640)
Fixed a typo in a link
2025-04-03 13:05:05 +02:00
community-scripts-pr-app[bot]
8884514ab6 Update CHANGELOG.md (#3639)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-03 12:27:24 +02:00
Slaviša Arežina
f5e9d761c9 Fix typo (#3636) 2025-04-03 11:17:21 +02:00
CanbiZ
3d4ba758a9 slskd: fix typo fore config note (#3633) 2025-04-03 10:04:15 +02:00
community-scripts-pr-app[bot]
7539566dc5 Update CHANGELOG.md (#3632)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-03 07:59:40 +02:00
Slaviša Arežina
5b0cfaab83 *Arr: Move Arr apps to github release crawling and provide update functionality (#3625)
* Move Arr apps to github release crawling

* Update website, show updateable
2025-04-03 07:58:43 +02:00
dependabot[bot]
a5dd2b3176 Bump next from 15.2.3 to 15.2.4 in /frontend (#3628)
Bumps [next](https://github.com/vercel/next.js) from 15.2.3 to 15.2.4.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.2.3...v15.2.4)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 15.2.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-03 07:52:24 +02:00
community-scripts-pr-app[bot]
b6593792c0 Update CHANGELOG.md (#3622) 2025-04-03 06:49:11 +01:00
Slaviša Arežina
47fb1c03de Fixes (#3624) 2025-04-03 06:44:05 +01:00
Slaviša Arežina
9c7858601e BookStack: Fix path to downloaded release file (#3627) 2025-04-03 06:43:35 +01:00
community-scripts-pr-app[bot]
ce3ed8a1c1 Update versions.json (#3629) 2025-04-03 06:42:25 +01:00
Bram Suurd
138d0c48b1 Update Footer.tsx to redirect to frontend page instead of home page (#3621) 2025-04-02 20:12:43 +02:00
Bram Suurd
763a58aeb9 fix missing favicon (#3620) 2025-04-02 20:12:09 +02:00
Slaviša Arežina
629b9df30a CrowdSec: Update install URL and script refresh (#3604)
* Update install URL and script refresh

* Fine, have it your way
2025-04-02 19:23:58 +02:00
community-scripts-pr-app[bot]
b8ad603a75 Update date in json (#3617) 2025-04-02 18:13:32 +01:00
community-scripts-pr-app[bot]
49c3eb83c6 Update .app files (#3619) 2025-04-02 18:13:16 +01:00
community-scripts-pr-app[bot]
9a559f869a Update CHANGELOG.md (#3618) 2025-04-02 18:13:02 +01:00
push-app-to-main[bot]
bb6e947ff6 'Add new script' (#3610) 2025-04-02 17:58:50 +01:00
community-scripts-pr-app[bot]
7cb2320ccf Update CHANGELOG.md (#3615) 2025-04-02 17:58:30 +01:00
community-scripts-pr-app[bot]
c1f816a57c Update .app files (#3616)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-04-02 18:57:00 +02:00
CanbiZ
6260be8425 Alpine-Wireguard (#3611) 2025-04-02 17:53:21 +01:00
CanbiZ
bcbe73f99f Authelia: fix incorrect rights for email.txt (#3612) 2025-04-02 17:52:38 +01:00
community-scripts-pr-app[bot]
71c337ed86 Update CHANGELOG.md (#3609) 2025-04-02 14:43:31 +01:00
community-scripts-pr-app[bot]
f9618cf24c Update versions.json (#3608) 2025-04-02 14:42:34 +01:00
CanbiZ
b0d81f3b22 Photoprism: harmonize curl (#3601) 2025-04-02 14:42:14 +01:00
community-scripts-pr-app[bot]
dd4af32587 Update CHANGELOG.md (#3596) 2025-04-02 09:08:23 +01:00
CanbiZ
08911cfb19 UI-Fix: verbose without useless space in header (#3598) 2025-04-02 09:07:25 +01:00
community-scripts-pr-app[bot]
86ba0c8976 Update versions.json (#3591)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-04-02 09:16:05 +02:00
Thalatam Sainath
8fd300e340 Fix link in clean-lxcs.sh (#3593) 2025-04-02 07:29:18 +02:00
Slaviša Arežina
059a3d0bcf Fix dependencies (#3589) 2025-04-02 07:20:07 +02:00
Slaviša Arežina
ea9f19d5f4 More fixes (#3587) 2025-04-02 07:19:50 +02:00
181 changed files with 3985 additions and 3079 deletions

View File

@@ -99,9 +99,9 @@ to\
Example: `https://raw.githubusercontent.com/tremor021/PromoxVE/refs/heads/testbranch` Example: `https://raw.githubusercontent.com/tremor021/PromoxVE/refs/heads/testbranch`
Also you need to change:\ Also you need to change:\
`https://github.com/community-scripts/ProxmoxVE/raw/main`\ `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/raw/main`\
to\ to\
`https://github.com/[USER]/[REPOSITORY]/raw/[BRANCH]`\ `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/raw/[BRANCH]`\
in `misc/install.func` in order for `update` shell command to work.\ in `misc/install.func` in order for `update` shell command to work.\
These changes are only while writing and testing your scripts. Before opening a Pull Request, you should change all above mentioned paths in `misc/build.func`, `misc/install.func` and `ct/AppName.sh` to point to the original paths. These changes are only while writing and testing your scripts. Before opening a Pull Request, you should change all above mentioned paths in `misc/build.func`, `misc/install.func` and `ct/AppName.sh` to point to the original paths.

View File

@@ -14,6 +14,179 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
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. 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.
## 2025-04-09
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Paperless-NGX: Extend Granian Service Env [@MickLesk](https://github.com/MickLesk) ([#3790](https://github.com/community-scripts/ProxmoxVE/pull/3790))
- Paperless-NGX: remove gunicorn, use python3 for webserver [@MickLesk](https://github.com/MickLesk) ([#3785](https://github.com/community-scripts/ProxmoxVE/pull/3785))
- HomeAssistantOS: allow Proxmox version 8.4 [@quentinvnk](https://github.com/quentinvnk) ([#3773](https://github.com/community-scripts/ProxmoxVE/pull/3773))
- Tandoor: Add xmlsec as dependency [@tremor021](https://github.com/tremor021) ([#3762](https://github.com/community-scripts/ProxmoxVE/pull/3762))
- #### 🔧 Refactor
- harmonize pve versions check & vm vars [@MickLesk](https://github.com/MickLesk) ([#3779](https://github.com/community-scripts/ProxmoxVE/pull/3779))
### 🧰 Maintenance
- #### 💥 Breaking Changes
- core: Removal of OS/Version Selection from Advanced Settings [@MickLesk](https://github.com/MickLesk) ([#3771](https://github.com/community-scripts/ProxmoxVE/pull/3771))
- core: move misc scripts to structured addon/pve paths | Refactor JSON Editor & Script Mapping [@MickLesk](https://github.com/MickLesk) ([#3765](https://github.com/community-scripts/ProxmoxVE/pull/3765))
## 2025-04-08
### 🆕 New Scripts
- Alpine-PostgreSQL [@MickLesk](https://github.com/MickLesk) ([#3751](https://github.com/community-scripts/ProxmoxVE/pull/3751))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Alpine-Wireguard: Fix for sysctl and ip_forward [@juronja](https://github.com/juronja) ([#3744](https://github.com/community-scripts/ProxmoxVE/pull/3744))
- TriliumNext: fix dump-db [@MickLesk](https://github.com/MickLesk) ([#3741](https://github.com/community-scripts/ProxmoxVE/pull/3741))
- Actual: Reduce RAM to 4GB and old space to 3072MB [@dannyellis](https://github.com/dannyellis) ([#3730](https://github.com/community-scripts/ProxmoxVE/pull/3730))
- #### ✨ New Features
- Alpine-MariaDB: better handling of adminer installation [@MickLesk](https://github.com/MickLesk) ([#3739](https://github.com/community-scripts/ProxmoxVE/pull/3739))
- Paperless-GPT: Add logging to service file [@tremor021](https://github.com/tremor021) ([#3738](https://github.com/community-scripts/ProxmoxVE/pull/3738))
### 🌐 Website
- #### 📝 Script Information
- Meilisearch: Fix Typo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3749](https://github.com/community-scripts/ProxmoxVE/pull/3749))
## 2025-04-07
### 🆕 New Scripts
- Breaking: Hoarder > Karakeep [@MickLesk](https://github.com/MickLesk) ([#3699](https://github.com/community-scripts/ProxmoxVE/pull/3699))
### 🚀 Updated Scripts
- Actual: Increase RAM and add heap-space var for nodejs [@MickLesk](https://github.com/MickLesk) ([#3713](https://github.com/community-scripts/ProxmoxVE/pull/3713))
- #### 🐞 Bug Fixes
- Alpine-MariaDB: Fix Install Service startup [@MickLesk](https://github.com/MickLesk) ([#3701](https://github.com/community-scripts/ProxmoxVE/pull/3701))
- Zitadel: Fix release tarball crawling [@tremor021](https://github.com/tremor021) ([#3716](https://github.com/community-scripts/ProxmoxVE/pull/3716))
- #### ✨ New Features
- Kimai: bump php to 8.4 [@MickLesk](https://github.com/MickLesk) ([#3724](https://github.com/community-scripts/ProxmoxVE/pull/3724))
- #### 🔧 Refactor
- Refactor: Zabbix, get always latest version [@MickLesk](https://github.com/MickLesk) ([#3720](https://github.com/community-scripts/ProxmoxVE/pull/3720))
### 🌐 Website
- #### 📝 Script Information
- Changed the category of Channels DVR and NextPVR [@johnsturgeon](https://github.com/johnsturgeon) ([#3729](https://github.com/community-scripts/ProxmoxVE/pull/3729))
## 2025-04-06
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Actual: Add git dependency & change yarn commands [@MickLesk](https://github.com/MickLesk) ([#3703](https://github.com/community-scripts/ProxmoxVE/pull/3703))
- Pelican-Panel: Fix PHP 8.4 Repository [@MickLesk](https://github.com/MickLesk) ([#3700](https://github.com/community-scripts/ProxmoxVE/pull/3700))
### 🌐 Website
- #### 🐞 Bug Fixes
- Implement FAQ component and integrate it into the main page [@BramSuurdje](https://github.com/BramSuurdje) ([#3709](https://github.com/community-scripts/ProxmoxVE/pull/3709))
## 2025-04-05
### 🌐 Website
- Bump vite from 6.2.4 to 6.2.5 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3668](https://github.com/community-scripts/ProxmoxVE/pull/3668))
## 2025-04-04
### 🆕 New Scripts
- meilisearch [@MickLesk](https://github.com/MickLesk) ([#3638](https://github.com/community-scripts/ProxmoxVE/pull/3638))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Pelican Panel: Bump php to 8.4 [@bvdberg01](https://github.com/bvdberg01) ([#3669](https://github.com/community-scripts/ProxmoxVE/pull/3669))
- Pterodactyl: Bump php to 8.4 [@MickLesk](https://github.com/MickLesk) ([#3655](https://github.com/community-scripts/ProxmoxVE/pull/3655))
- #### ✨ New Features
- Caddy: add git for xcaddy [@MickLesk](https://github.com/MickLesk) ([#3657](https://github.com/community-scripts/ProxmoxVE/pull/3657))
### 🧰 Maintenance
- #### 💾 Core
- core: fix raw path [@MickLesk](https://github.com/MickLesk) ([#3656](https://github.com/community-scripts/ProxmoxVE/pull/3656))
## 2025-04-03
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Prowlarr: Fix Typo in URL (update_function) [@ribera96](https://github.com/ribera96) ([#3640](https://github.com/community-scripts/ProxmoxVE/pull/3640))
- Prowlarr: Fix typo in release URL [@tremor021](https://github.com/tremor021) ([#3636](https://github.com/community-scripts/ProxmoxVE/pull/3636))
- GoMFT: Fix the node_modules deletion command [@tremor021](https://github.com/tremor021) ([#3624](https://github.com/community-scripts/ProxmoxVE/pull/3624))
- BookStack: Fix path to downloaded release file [@tremor021](https://github.com/tremor021) ([#3627](https://github.com/community-scripts/ProxmoxVE/pull/3627))
- #### ✨ New Features
- VM: show progress bar while downloading [@MickLesk](https://github.com/MickLesk) ([#3634](https://github.com/community-scripts/ProxmoxVE/pull/3634))
- *Arr: Move Arr apps to github release crawling and provide update functionality [@tremor021](https://github.com/tremor021) ([#3625](https://github.com/community-scripts/ProxmoxVE/pull/3625))
### 🧰 Maintenance
- #### 📂 Github
- Correct URL in contributing docs [@verbumfeit](https://github.com/verbumfeit) ([#3648](https://github.com/community-scripts/ProxmoxVE/pull/3648))
### 🌐 Website
- Bump next from 15.2.3 to 15.2.4 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3628](https://github.com/community-scripts/ProxmoxVE/pull/3628))
- #### 📝 Script Information
- slskd: fix typo for config note [@MickLesk](https://github.com/MickLesk) ([#3633](https://github.com/community-scripts/ProxmoxVE/pull/3633))
## 2025-04-02
### 🆕 New Scripts
- openziti-tunnel [@emoscardini](https://github.com/emoscardini) ([#3610](https://github.com/community-scripts/ProxmoxVE/pull/3610))
- Alpine-Wireguard [@MickLesk](https://github.com/MickLesk) ([#3611](https://github.com/community-scripts/ProxmoxVE/pull/3611))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Authelia: fix incorrect rights for email.txt [@MickLesk](https://github.com/MickLesk) ([#3612](https://github.com/community-scripts/ProxmoxVE/pull/3612))
- Photoprism: harmonize curl [@MickLesk](https://github.com/MickLesk) ([#3601](https://github.com/community-scripts/ProxmoxVE/pull/3601))
- Fix link in clean-lxcs.sh [@thalatamsainath](https://github.com/thalatamsainath) ([#3593](https://github.com/community-scripts/ProxmoxVE/pull/3593))
- Fileflows: Add ImageMagick dependecy [@tremor021](https://github.com/tremor021) ([#3589](https://github.com/community-scripts/ProxmoxVE/pull/3589))
- General fixes for several scripts [@tremor021](https://github.com/tremor021) ([#3587](https://github.com/community-scripts/ProxmoxVE/pull/3587))
### 🧰 Maintenance
- #### 💾 Core
- UI-Fix: verbose without useless space in header [@MickLesk](https://github.com/MickLesk) ([#3598](https://github.com/community-scripts/ProxmoxVE/pull/3598))
## 2025-04-01 ## 2025-04-01
### 🆕 New Scripts ### 🆕 New Scripts

View File

@@ -8,8 +8,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="Actual Budget" APP="Actual Budget"
var_tags="finance" var_tags="finance"
var_cpu="2" var_cpu="2"
var_ram="2048" var_ram="4096"
var_disk="4" var_disk="7"
var_os="debian" var_os="debian"
var_version="12" var_version="12"
var_unprivileged="1" var_unprivileged="1"
@@ -20,52 +20,59 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /opt/actualbudget ]]; then if [[ ! -d /opt/actualbudget ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop actualbudget
msg_ok "${APP} Stopped"
if ! command -v git &>/dev/null; then
msg_info "Installing git"
$STD apt-get update
$STD apt-get install -y git
msg_ok "Installed git"
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') msg_info "Updating ${APP} to ${RELEASE}"
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then cd /tmp || exit
msg_info "Stopping ${APP}" curl -fsSL "https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz" -o "v${RELEASE}.tar.gz"
systemctl stop actualbudget
msg_ok "${APP} Stopped"
msg_info "Updating ${APP} to ${RELEASE}" mv /opt/actualbudget /opt/actualbudget_bak
cd /tmp tar -xzf "v${RELEASE}.tar.gz"
curl -fsSL -O https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz mv "actual-${RELEASE}" /opt/actualbudget
mv /opt/actualbudget /opt/actualbudget_bak mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
tar -xzf "v${RELEASE}.tar.gz" for dir in server-files .migrate user-files migrations; do
mv actual-${RELEASE} /opt/actualbudget if [[ -d /opt/actualbudget_bak/$dir ]]; then
mv /opt/actualbudget_bak/$dir/* /opt/actualbudget-data/$dir/ || true
fi
done
if [[ -f /opt/actualbudget-data/migrate/.migrations ]]; then
sed -i 's/null/1732656575219/g' /opt/actualbudget-data/migrate/.migrations
sed -i 's/null/1732656575220/g' /opt/actualbudget-data/migrate/.migrations
fi
if [[ -f /opt/actualbudget/server-files/account.sqlite ]] && [[ ! -f /opt/actualbudget-data/server-files/account.sqlite ]]; then
mv /opt/actualbudget/server-files/account.sqlite /opt/actualbudget-data/server-files/account.sqlite
fi
mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config} if [[ -f /opt/actualbudget_bak/selfhost.key ]]; then
for dir in server-files .migrate user-files migrations; do mv /opt/actualbudget_bak/selfhost.key /opt/actualbudget/selfhost.key
if [[ -d /opt/actualbudget_bak/$dir ]]; then mv /opt/actualbudget_bak/selfhost.crt /opt/actualbudget/selfhost.crt
mv /opt/actualbudget_bak/$dir/* /opt/actualbudget-data/$dir/ || true fi
fi
done
if [[ -f /opt/actualbudget-data/migrate/.migrations ]]; then
sed -i 's/null/1732656575219/g' /opt/actualbudget-data/migrate/.migrations
sed -i 's/null/1732656575220/g' /opt/actualbudget-data/migrate/.migrations
fi
if [[ -f /opt/actualbudget/server-files/account.sqlite ]] && [[ ! -f /opt/actualbudget-data/server-files/account.sqlite ]]; then
mv /opt/actualbudget/server-files/account.sqlite /opt/actualbudget-data/server-files/account.sqlite
fi
if [[ -f /opt/actualbudget_bak/selfhost.key ]]; then if [[ -f /opt/actualbudget_bak/.env ]]; then
mv /opt/actualbudget_bak/selfhost.key /opt/actualbudget/selfhost.key mv /opt/actualbudget_bak/.env /opt/actualbudget-data/.env
mv /opt/actualbudget_bak/selfhost.crt /opt/actualbudget/selfhost.crt else
fi cat <<EOF >/opt/actualbudget-data/.env
if [[ -f /opt/actualbudget_bak/.env ]]; then
mv /opt/actualbudget_bak/.env /opt/actualbudget-data/.env
else
cat <<EOF >/opt/actualbudget-data/.env
ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload
ACTUAL_DATA_DIR=/opt/actualbudget-data ACTUAL_DATA_DIR=/opt/actualbudget-data
ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files
@@ -75,14 +82,17 @@ ACTUAL_TRUSTED_PROXIES="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.1/32,::1
ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key
ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt
EOF EOF
fi fi
cd /opt/actualbudget cd /opt/actualbudget || exit
$STD yarn workspaces focus @actual-app/sync-server --production export NODE_OPTIONS="--max_old_space_size=3072"
echo "${RELEASE}" >/opt/actualbudget_version.txt $STD yarn install
msg_ok "Updated ${APP}" $STD yarn run build:server
#$STD yarn workspaces focus @actual-app/sync-server --production
echo "${RELEASE}" >/opt/actualbudget_version.txt
msg_ok "Updated ${APP}"
msg_info "Starting ${APP}" msg_info "Starting ${APP}"
cat <<EOF >/etc/systemd/system/actualbudget.service cat <<EOF >/etc/systemd/system/actualbudget.service
[Unit] [Unit]
Description=Actual Budget Service Description=Actual Budget Service
After=network.target After=network.target
@@ -101,19 +111,19 @@ RestartSec=10
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
systemctl start actualbudget systemctl start actualbudget
msg_ok "Started ${APP}" msg_ok "Started ${APP}"
msg_info "Cleaning Up" msg_info "Cleaning Up"
rm -rf /opt/actualbudget_bak rm -rf /opt/actualbudget_bak
rm -rf "/tmp/v${RELEASE}.tar.gz" rm -rf "/tmp/v${RELEASE}.tar.gz"
msg_ok "Cleaned" msg_ok "Cleaned"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
else else
msg_ok "No update required. ${APP} is already at ${RELEASE}" msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi fi
exit exit
} }
start start
@@ -123,4 +133,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:5006${CL}" echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:5006${CL}"

46
ct/alpine-postgresql.sh Normal file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://postgresql.org/
APP="Alpine-PostgreSQL"
var_tags="${var_tags:-alpine;database}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-256}"
var_disk="${var_disk:-1}"
var_os="${var_os:-alpine}"
var_version="${var_version:-3.21}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
msg_info "Updating Alpine Packages"
$STD apk update
$STD apk upgrade
msg_ok "Updated Alpine Packages"
msg_info "Updating PostgreSQL"
$STD apk upgrade postgresql postgresql-contrib
msg_ok "Updated PostgreSQL"
msg_info "Restarting PostgreSQL"
$STD rc-service postgresql restart
msg_ok "Restarted PostgreSQL"
exit 0
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}${IP}:5432${CL}"

50
ct/alpine-wireguard.sh Normal file
View File

@@ -0,0 +1,50 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.wireguard.com/
APP="Alpine-Wireguard"
var_tags="${var_tags:-alpine;vpn}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-256}"
var_disk="${var_disk:-1}"
var_os="${var_os:-alpine}"
var_version="${var_version:-3.21}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
msg_info "Updating Alpine Packages"
$STD apk update
$STD apk upgrade
msg_ok "Updated Alpine Packages"
msg_info "update wireguard-tools"
$STD apk add --no-cache --upgrade wireguard-tools
msg_ok "wireguard-tools updated"
if [[ -d /etc/wgdashboard/src ]]; then
msg_info "update WGDashboard"
cd /etc/wgdashboard/src || exit
$STD echo "y" | ./wgd.sh update
$STD ./wgd.sh start
msg_ok "WGDashboard updated"
fi
exit 0
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} WGDashboard Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:10086${CL}"

View File

@@ -36,13 +36,13 @@ function update_script() {
msg_info "Updating ${APP} to v${RELEASE}" msg_info "Updating ${APP} to v${RELEASE}"
mv /opt/bookstack /opt/bookstack-backup mv /opt/bookstack /opt/bookstack-backup
curl -fsSL "https://github.com/BookStackApp/BookStack/archive/refs/tags/v${RELEASE}.zip" -o "/opt/BookStack-${RELEASE}.zip" curl -fsSL "https://github.com/BookStackApp/BookStack/archive/refs/tags/v${RELEASE}.zip" -o "/opt/BookStack-${RELEASE}.zip"
unzip -q /opt/v${RELEASE}.zip -d /opt unzip -q "/opt/BookStack-${RELEASE}.zip" -d /opt
mv /opt/BookStack-${RELEASE} /opt/bookstack mv "/opt/BookStack-${RELEASE}" /opt/bookstack
cp /opt/bookstack-backup/.env /opt/bookstack/.env cp /opt/bookstack-backup/.env /opt/bookstack/.env
cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true
cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true
cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true
cd /opt/bookstack cd /opt/bookstack || exit
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev $STD composer install --no-dev
$STD php artisan migrate --force $STD php artisan migrate --force
@@ -59,7 +59,7 @@ function update_script() {
msg_info "Cleaning Up" msg_info "Cleaning Up"
rm -rf /opt/bookstack-backup rm -rf /opt/bookstack-backup
rm -rf /opt/v${RELEASE}.zip rm -rf "/opt/BookStack-${RELEASE}.zip"
msg_ok "Cleaned" msg_ok "Cleaned"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
else else

View File

@@ -6,13 +6,13 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
# Source: https://www.debian.org/ # Source: https://www.debian.org/
APP="Debian" APP="Debian"
var_tags="os" var_tags="${var_tags:-os}"
var_cpu="1" var_cpu="${var_cpu:-1}"
var_ram="512" var_ram="${var_ram:-512}"
var_disk="2" var_disk="${var_disk:-2}"
var_os="debian" var_os="${var_os:-debian}"
var_version="12" var_version="${var_version:-12}"
var_unprivileged="1" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
variables variables
@@ -20,18 +20,18 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /var ]]; then if [[ ! -d /var ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Updating $APP LXC"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated $APP LXC"
exit exit
fi
msg_info "Updating $APP LXC"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated $APP LXC"
exit
} }
start start
@@ -39,4 +39,4 @@ build_container
description description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"

View File

@@ -20,29 +20,29 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /opt/emby-server ]]; then if [[ ! -d /opt/emby-server ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
LATEST=$(curl -fsSL https://api.github.com/repos/MediaBrowser/Emby.Releases/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
msg_info "Stopping ${APP}"
systemctl stop emby-server
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP}"
$STD curl -fsSL "https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb" -O
$STD dpkg -i emby-server-deb_${LATEST}_amd64.deb
rm emby-server-deb_${LATEST}_amd64.deb
msg_ok "Updated ${APP}"
msg_info "Starting ${APP}"
systemctl start emby-server
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
exit exit
fi
LATEST=$(curl -fsSL https://api.github.com/repos/MediaBrowser/Emby.Releases/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
msg_info "Stopping ${APP}"
systemctl stop emby-server
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP}"
$STD curl -fsSL "https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb" -o "emby-server-deb_${LATEST}_amd64.deb"
$STD dpkg -i "emby-server-deb_${LATEST}_amd64.deb"
rm "emby-server-deb_${LATEST}_amd64.deb"
msg_ok "Updated ${APP}"
msg_info "Starting ${APP}"
systemctl start emby-server
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
exit
} }
start start

View File

@@ -33,12 +33,12 @@ function update_script() {
fi fi
if [[ ! -f "/usr/bin/node" ]]; then if [[ ! -f "/usr/bin/node" ]]; then
mkdir -p /etc/apt/keyrings mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg curl -fsSL "https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
$STD apt-get update $STD apt-get update
$STD apt-get install -y nodejs $STD apt-get install -y nodejs
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL "https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest" | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP" msg_info "Stopping $APP"
systemctl stop gomft systemctl stop gomft
@@ -47,16 +47,16 @@ function update_script() {
msg_info "Updating $APP to ${RELEASE}" msg_info "Updating $APP to ${RELEASE}"
rm -f /opt/gomft/gomft rm -f /opt/gomft/gomft
temp_file=$(mktemp) temp_file=$(mktemp)
curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o $temp_file curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar -xzf $temp_file tar -xzf "$temp_file"
cp -rf GoMFT-${RELEASE}/* /opt/gomft cp -rf "GoMFT-${RELEASE}"/* /opt/gomft/
cd /opt/gomft cd /opt/gomft || exit
rm -f /opt/gomft/node_modules rm -rf /opt/gomft/node_modules
$STD npm ci $STD npm ci
$STD node build.js $STD node build.js
$STD go mod download $STD go mod download
$STD go get -u github.com/a-h/templ $STD go get -u github.com/a-h/templ
$STD $HOME/go/bin/templ generate $STD "$HOME"/go/bin/templ generate
export CGO_ENABLED=1 export CGO_ENABLED=1
export GOOS=linux export GOOS=linux
$STD go build -o gomft $STD go build -o gomft
@@ -65,8 +65,8 @@ function update_script() {
msg_ok "Updated $APP to ${RELEASE}" msg_ok "Updated $APP to ${RELEASE}"
msg_info "Cleaning Up" msg_info "Cleaning Up"
rm -f $temp_file rm -f "$temp_file"
rm -rf $HOME/GoMFT-v.${RELEASE} rm -rf "$HOME/GoMFT-v.${RELEASE}/"
msg_ok "Cleanup Complete" msg_ok "Cleanup Complete"
msg_info "Starting $APP" msg_info "Starting $APP"

View File

@@ -0,0 +1,6 @@
___ __ _ ____ __ _____ ____ __
/ | / /___ (_)___ ___ / __ \____ _____/ /_____ _________ / ___// __ \ / /
/ /| | / / __ \/ / __ \/ _ \______/ /_/ / __ \/ ___/ __/ __ `/ ___/ _ \\__ \/ / / / / /
/ ___ |/ / /_/ / / / / / __/_____/ ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___
/_/ |_/_/ .___/_/_/ /_/\___/ /_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/
/_/ /____/

View File

@@ -0,0 +1,6 @@
___ __ _ _ ___ __
/ | / /___ (_)___ ___ | | / (_)_______ ____ ___ ______ __________/ /
/ /| | / / __ \/ / __ \/ _ \_____| | /| / / / ___/ _ \/ __ `/ / / / __ `/ ___/ __ /
/ ___ |/ / /_/ / / / / / __/_____/ |/ |/ / / / / __/ /_/ / /_/ / /_/ / / / /_/ /
/_/ |_/_/ .___/_/_/ /_/\___/ |__/|__/_/_/ \___/\__, /\__,_/\__,_/_/ \__,_/
/_/ /____/

6
ct/headers/karakeep Normal file
View File

@@ -0,0 +1,6 @@
__ __
/ /______ __________ _/ /_____ ___ ____
/ //_/ __ `/ ___/ __ `/ //_/ _ \/ _ \/ __ \
/ ,< / /_/ / / / /_/ / ,< / __/ __/ /_/ /
/_/|_|\__,_/_/ \__,_/_/|_|\___/\___/ .___/
/_/

6
ct/headers/meilisearch Normal file
View File

@@ -0,0 +1,6 @@
__ ___ _ ___ __
/ |/ /__ (_) (_)_______ ____ ___________/ /_
/ /|_/ / _ \/ / / / ___/ _ \/ __ `/ ___/ ___/ __ \
/ / / / __/ / / (__ ) __/ /_/ / / / /__/ / / /
/_/ /_/\___/_/_/_/____/\___/\__,_/_/ \___/_/ /_/

View File

@@ -0,0 +1,6 @@
_ __ _ __ __
____ ____ ___ ____ ____ (_) /_(_) / /___ ______ ____ ___ / /
/ __ \/ __ \/ _ \/ __ \/_ / / / __/ /_____/ __/ / / / __ \/ __ \/ _ \/ /
/ /_/ / /_/ / __/ / / / / /_/ / /_/ /_____/ /_/ /_/ / / / / / / / __/ /
\____/ .___/\___/_/ /_/ /___/_/\__/_/ \__/\__,_/_/ /_/_/ /_/\___/_/
/_/

View File

@@ -40,23 +40,23 @@ function update_script() {
if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then
$STD apt-get install -y graphicsmagick ghostscript $STD apt-get install -y graphicsmagick ghostscript
fi fi
cd /opt cd /opt || exit
if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then
mkdir -p /etc/hoarder mkdir -p /etc/hoarder
mv /opt/hoarder/.env /etc/hoarder/hoarder.env mv /opt/hoarder/.env /etc/hoarder/hoarder.env
fi fi
rm -rf /opt/hoarder rm -rf /opt/hoarder
curl -fsSL "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip") curl -fsSL "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip"
unzip -q v${RELEASE}.zip unzip -q v"${RELEASE}".zip
mv hoarder-${RELEASE} /opt/hoarder mv karakeep-"${RELEASE}" /opt/hoarder
cd /opt/hoarder/apps/web cd /opt/hoarder/apps/web || exit
$STD pnpm install --frozen-lockfile $STD pnpm install --frozen-lockfile
$STD pnpm exec next build --experimental-build-mode compile $STD pnpm exec next build --experimental-build-mode compile
cp -r /opt/hoarder/apps/web/.next/standalone/apps/web/server.js /opt/hoarder/apps/web cp -r /opt/hoarder/apps/web/.next/standalone/apps/web/server.js /opt/hoarder/apps/web
cd /opt/hoarder/apps/workers cd /opt/hoarder/apps/workers || exit
$STD pnpm install --frozen-lockfile $STD pnpm install --frozen-lockfile
export DATA_DIR=/opt/hoarder_data export DATA_DIR=/opt/hoarder_data
cd /opt/hoarder/packages/db cd /opt/hoarder/packages/db || exit
$STD pnpm migrate $STD pnpm migrate
sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/hoarder/hoarder.env sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/hoarder/hoarder.env
msg_ok "Updated ${APP} to v${RELEASE}" msg_ok "Updated ${APP} to v${RELEASE}"
@@ -65,7 +65,7 @@ function update_script() {
systemctl start hoarder-browser hoarder-workers hoarder-web systemctl start hoarder-browser hoarder-workers hoarder-web
msg_ok "Started Services" msg_ok "Started Services"
msg_info "Cleaning up" msg_info "Cleaning up"
rm -R /opt/v${RELEASE}.zip rm -R /opt/v"${RELEASE}".zip
echo "${RELEASE}" >/opt/${APP}_version.txt echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Cleaned" msg_ok "Cleaned"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"

85
ct/karakeep.sh Normal file
View File

@@ -0,0 +1,85 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck
# Author: MickLesk (Canbiz) & vhsdream
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://karakeep.app/
APP="karakeep"
var_tags="bookmark"
var_cpu="2"
var_ram="4096"
var_disk="10"
var_os="debian"
var_version="12"
var_unprivileged="1"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/karakeep ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/karakeep-app/karakeep/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
PREV_RELEASE=$(cat /opt/${APP}_version.txt)
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "${PREV_RELEASE}" ]]; then
msg_info "Stopping Services"
systemctl stop karakeep-web karakeep-workers karakeep-browser
msg_ok "Stopped Services"
msg_info "Updating ${APP} to v${RELEASE}"
if [[ $(corepack -v) < "0.31.0" ]]; then
$STD npm install -g corepack@0.31.0
fi
if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then
$STD apt-get install -y graphicsmagick ghostscript
fi
cd /opt || exit
if [[ -f /opt/karakeep/.env ]] && [[ ! -f /etc/karakeep/karakeep.env ]]; then
mkdir -p /etc/karakeep
mv /opt/karakeep/.env /etc/karakeep/karakeep.env
fi
rm -rf /opt/karakeep
curl -fsSL "https://github.com/karakeep-app/karakeep/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip"
unzip -q "v${RELEASE}.zip"
mv karakeep-"${RELEASE}" /opt/karakeep
cd /opt/karakeep/apps/web || exit
$STD pnpm install --frozen-lockfile
$STD pnpm exec next build --experimental-build-mode compile
cp -r /opt/karakeep/apps/web/.next/standalone/apps/web/server.js /opt/karakeep/apps/web
cd /opt/karakeep/apps/workers || exit
$STD pnpm install --frozen-lockfile
export DATA_DIR=/opt/karakeep_data
cd /opt/karakeep/packages/db || exit
$STD pnpm migrate
sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/karakeep/karakeep.env
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting Services"
systemctl start karakeep-browser karakeep-workers karakeep-web
msg_ok "Started Services"
msg_info "Cleaning up"
rm -R /opt/v"${RELEASE}".zip
echo "${RELEASE}" >/opt/${APP}_version.txt
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 "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

View File

@@ -20,64 +20,79 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /opt/kimai ]]; then if [[ ! -d /opt/kimai ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/kimai/kimai/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
BACKUP_DIR="/opt/kimai_backup"
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Apache2"
systemctl stop apache2
msg_ok "Stopped Apache2"
msg_info "Backing up Kimai configuration and var directory"
mkdir -p "$BACKUP_DIR"
[ -d /opt/kimai/var ] && cp -r /opt/kimai/var "$BACKUP_DIR/"
[ -f /opt/kimai/.env ] && cp /opt/kimai/.env "$BACKUP_DIR/"
[ -f /opt/kimai/config/packages/local.yaml ] && cp /opt/kimai/config/packages/local.yaml "$BACKUP_DIR/"
msg_ok "Backup completed"
msg_info "Updating ${APP} to ${RELEASE}"
rm -rf /opt/kimai
curl -fsSL "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip")
unzip -q ${RELEASE}.zip
mv kimai-${RELEASE} /opt/kimai
[ -d "$BACKUP_DIR/var" ] && cp -r "$BACKUP_DIR/var" /opt/kimai/
[ -f "$BACKUP_DIR/.env" ] && cp "$BACKUP_DIR/.env" /opt/kimai/
[ -f "$BACKUP_DIR/local.yaml" ] && cp "$BACKUP_DIR/local.yaml" /opt/kimai/config/packages/
rm -rf "$BACKUP_DIR"
cd /opt/kimai
$STD composer install --no-dev --optimize-autoloader
$STD bin/console kimai:update
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting Apache2"
systemctl start apache2
msg_ok "Started Apache2"
msg_info "Setup Permissions"
chown -R :www-data /opt/*
chmod -R g+r /opt/*
chmod -R g+rw /opt/*
chown -R www-data:www-data /opt/*
chmod -R 777 /opt/*
msg_ok "Setup Permissions"
msg_info "Cleaning Up"
rm -rf ${RELEASE}.zip
rm -rf "$BACKUP_DIR"
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit exit
fi
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
if [[ "$CURRENT_PHP" != "8.4" ]]; then
msg_info "Migrating PHP $CURRENT_PHP to 8.4"
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
$STD apt-get update
$STD apt-get remove -y php"${CURRENT_PHP//./}"*
$STD apt-get install -y \
php8.4 \
php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl} \
libapache2-mod-php8.4
msg_ok "Migrated PHP $CURRENT_PHP to 8.4"
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/kimai/kimai/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
BACKUP_DIR="/opt/kimai_backup"
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Apache2"
systemctl stop apache2
msg_ok "Stopped Apache2"
msg_info "Backing up Kimai configuration and var directory"
mkdir -p "$BACKUP_DIR"
[ -d /opt/kimai/var ] && cp -r /opt/kimai/var "$BACKUP_DIR/"
[ -f /opt/kimai/.env ] && cp /opt/kimai/.env "$BACKUP_DIR/"
[ -f /opt/kimai/config/packages/local.yaml ] && cp /opt/kimai/config/packages/local.yaml "$BACKUP_DIR/"
msg_ok "Backup completed"
msg_info "Updating ${APP} to ${RELEASE}"
rm -rf /opt/kimai
curl -fsSL "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip")
unzip -q "${RELEASE}".zip
mv kimai-"${RELEASE}" /opt/kimai
[ -d "$BACKUP_DIR/var" ] && cp -r "$BACKUP_DIR/var" /opt/kimai/
[ -f "$BACKUP_DIR/.env" ] && cp "$BACKUP_DIR/.env" /opt/kimai/
[ -f "$BACKUP_DIR/local.yaml" ] && cp "$BACKUP_DIR/local.yaml" /opt/kimai/config/packages/
rm -rf "$BACKUP_DIR"
cd /opt/kimai || exit
$STD composer install --no-dev --optimize-autoloader
$STD bin/console kimai:update
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_info "Starting Apache2"
systemctl start apache2
msg_ok "Started Apache2"
msg_info "Setup Permissions"
chown -R :www-data /opt/*
chmod -R g+r /opt/*
chmod -R g+rw /opt/*
chown -R www-data:www-data /opt/*
chmod -R 777 /opt/*
msg_ok "Setup Permissions"
msg_info "Cleaning Up"
rm -rf "${RELEASE}".zip
rm -rf "$BACKUP_DIR"
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
} }
start start

View File

@@ -20,18 +20,29 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /var/lib/lidarr/ ]]; then
msg_error "No ${APP} Installation Found!" if [[ ! -d /var/lib/lidarr/ ]]; then
exit msg_error "No ${APP} Installation Found!"
fi
msg_info "Updating $APP LXC"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated $APP LXC"
exit exit
fi
msg_info "Updating $APP LXC"
temp_file="$(mktemp)"
rm -rf /opt/Lidarr
RELEASE=$(curl -fsSL https://api.github.com/repos/Lidarr/Lidarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSL "https://github.com/Lidarr/Lidarr/releases/download/v${RELEASE}/Lidarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file"
$STD tar -xvzf "$temp_file"
mv Lidarr /opt
chmod 775 /opt/Lidarr
msg_ok "Updated $APP LXC"
msg_info "Cleaning up"
rm -rf "$temp_file"
msg_ok "Cleaned up"
exit
} }
start start
@@ -41,4 +52,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8686${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8686${CL}"

95
ct/meilisearch.sh Normal file
View File

@@ -0,0 +1,95 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.meilisearch.com/
APP="Meilisearch"
var_tags="${var_tags:-full-text-search}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-7}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /opt/Meilisearch_version.txt ]]; then
msg_error "No Meilisearch Installation Found!"
exit
fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Meilisearch Update" --radiolist --cancel-button Exit-Script "Spacebar = Select" 10 58 2 \
"1" "Update Meilisearch" ON \
"2" "Update Meilisearch-UI" OFF \
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then
msg_info "Stopping Meilisearch"
systemctl stop meilisearch
msg_ok "Stopped Meilisearch"
msg_info "Updating Meilisearch"
tmp_file=$(mktemp)
RELEASE=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
curl -fsSL https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb -o $tmp_file
$STD dpkg -i $tmp_file
echo "$RELEASE" >/opt/meilisearch_version.txt
msg_ok "Updated Meilisearch"
msg_info "Starting Meilisearch"
systemctl start meilisearch
msg_ok "Started Meilisearch"
exit
fi
if [ "$UPD" == "2" ]; then
if [[ ! -f /opt/Meilisearch-ui_version.txt ]]; then
msg_error "No Meilisearch-UI Installation Found!"
exit
fi
msg_info "Stopping Meilisearch-UI"
systemctl stop meilisearch-ui
msg_ok "Stopped Meilisearch-UI"
msg_info "Updating Meilisearch-UI"
tmp_file=$(mktemp)
tmp_dir=$(mktemp -d)
RELEASE_UI=$(curl -s https://api.github.com/repos/riccox/meilisearch-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
cp /opt/meilisearch-ui/.env.local /tmp/.env.local.bak
rm -rf /opt/meilisearch-ui
mkdir -p /opt/meilisearch-ui
curl -fsSL "https://github.com/riccox/meilisearch-ui/archive/refs/tags/${RELEASE_UI}.zip" -o $tmp_file
unzip -q "$tmp_file" -d "$tmp_dir"
mv "$tmp_dir"/*/* /opt/meilisearch-ui/
cd /opt/meilisearch-ui
sed -i 's|const hash = execSync("git rev-parse HEAD").toString().trim();|const hash = "unknown";|' /opt/meilisearch-ui/vite.config.ts
mv /tmp/.env.local.bak /opt/meilisearch-ui/.env.local
$STD pnpm install
echo "$RELEASE_UI" >/opt/meilisearch-ui_version.txt
msg_ok "Updated Meilisearch-UI"
msg_info "Starting Meilisearch-UI"
systemctl start meilisearch-ui
msg_ok "Started Meilisearch-UI"
exit
fi
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}meilisearch: http://${IP}:7700$ | meilisearch-ui: http://${IP}:24900${CL}"

44
ct/openziti-tunnel.sh Normal file
View File

@@ -0,0 +1,44 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: emoscardini
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/openziti/ziti
APP="openziti-tunnel"
var_tags="${var_tags:-network;openziti-tunnel}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/openziti ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Updating $APP LXC"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated $APP LXC"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Application was assigned the following IP:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}Address: ${IP}${CL}"

View File

@@ -27,10 +27,27 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
if [[ "$CURRENT_PHP" != "8.4" ]]; then
msg_info "Migrating PHP $CURRENT_PHP to 8.4"
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
$STD apt-get update
$STD apt-get remove -y php"${CURRENT_PHP//./}"*
$STD apt-get install -y \
php8.4 \
php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,fpm} \
libapache2-mod-php8.4
msg_ok "Migrated PHP $CURRENT_PHP to 8.4"
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/pelican-dev/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/pelican-dev/panel/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 if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service" msg_info "Stopping Service"
cd /opt/pelican-panel cd /opt/pelican-panel || exit
$STD php artisan down $STD php artisan down
msg_ok "Stopped Service" msg_ok "Stopped Service"

View File

@@ -33,7 +33,7 @@ function update_script() {
msg_info "Updating PhotoPrism" msg_info "Updating PhotoPrism"
$STD apt-get install -y libvips42 $STD apt-get install -y libvips42
curl -fsSL "-cO - https://dl.photoprism.app/pkg/linux/amd64.tar.gz | tar -xzf - -C /opt/photoprism --strip-components=1" -o $(basename "-cO - https://dl.photoprism.app/pkg/linux/amd64.tar.gz | tar -xzf - -C /opt/photoprism --strip-components=1") curl -fsSL https://dl.photoprism.app/pkg/linux/amd64.tar.gz | tar -xzf - -C /opt/photoprism --strip-components=1
msg_ok "Updated PhotoPrism" msg_ok "Updated PhotoPrism"
msg_info "Starting PhotoPrism" msg_info "Starting PhotoPrism"

View File

@@ -20,15 +20,29 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /var/lib/prowlarr/ ]]; then
msg_error "No ${APP} Installation Found!" if [[ ! -d /var/lib/prowlarr/ ]]; then
exit msg_error "No ${APP} Installation Found!"
fi
msg_error "Currently we don't provide an update function for this ${APP}."
exit exit
fi
msg_info "Updating $APP LXC"
temp_file="$(mktemp)"
rm -rf /opt/Prowlarr
RELEASE=$(curl -fsSL https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSL "https://github.com/Prowlarr/Prowlarr/releases/download/v${RELEASE}/Prowlarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file"
$STD tar -xvzf "$temp_file"
mv Prowlarr /opt
chmod 775 /opt/Prowlarr
msg_ok "Updated $APP LXC"
msg_info "Cleaning up"
rm -f "$temp_file"
msg_ok "Cleaned up"
exit
} }
start start
@@ -38,4 +52,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9696${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9696${CL}"

View File

@@ -27,10 +27,27 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
if [[ "$CURRENT_PHP" != "8.4" ]]; then
msg_info "Migrating PHP $CURRENT_PHP to 8.4"
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
$STD apt-get update
$STD apt-get remove -y php"${CURRENT_PHP//./}"*
$STD apt-get install -y \
php8.4 \
php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,fpm} \
libapache2-mod-php8.4
msg_ok "Migrated PHP $CURRENT_PHP to 8.4"
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/panel/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 if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service" msg_info "Stopping Service"
cd /opt/pterodactyl-panel cd /opt/pterodactyl-panel || exit
$STD php artisan down $STD php artisan down
msg_ok "Stopped Service" msg_ok "Stopped Service"

View File

@@ -20,15 +20,29 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /var/lib/radarr/ ]]; then
msg_error "No ${APP} Installation Found!" if [[ ! -d /var/lib/radarr/ ]]; then
exit msg_error "No ${APP} Installation Found!"
fi
msg_error "Currently we don't provide an update function for this ${APP}."
exit exit
fi
msg_info "Updating $APP LXC"
temp_file="$(mktemp)"
rm -rf /opt/Radarr
RELEASE=$(curl -fsSL https://api.github.com/repos/Radarr/Radarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSL "https://github.com/Radarr/Radarr/releases/download/v${RELEASE}/Radarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file"
$STD tar -xvzf "$temp_file"
mv Radarr /opt
chmod 775 /opt/Radarr
msg_ok "Updated $APP LXC"
msg_info "Cleaning up"
rm -rf "$temp_file"
msg_ok "Cleaned up"
exit
} }
start start
@@ -38,4 +52,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7878${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7878${CL}"

View File

@@ -39,15 +39,12 @@ function update_script() {
mv /opt/snipe-it /opt/snipe-it-backup mv /opt/snipe-it /opt/snipe-it-backup
temp_file=$(mktemp) temp_file=$(mktemp)
curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar zxf $temp_file tar zxf "$temp_file"
mv snipe-it-${RELEASE} /opt/snipe-it mv "snipe-it-${RELEASE}" /opt/snipe-it
$STD curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip" -O
unzip -q v${RELEASE}.zip
mv snipe-it-${RELEASE} /opt/snipe-it
cp /opt/snipe-it-backup/.env /opt/snipe-it/.env cp /opt/snipe-it-backup/.env /opt/snipe-it/.env
cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/ cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/
cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads
cd /opt/snipe-it/ cd /opt/snipe-it/ || exit
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --optimize-autoloader --no-interaction $STD composer install --no-dev --optimize-autoloader --no-interaction
$STD composer dump-autoload $STD composer dump-autoload
@@ -58,7 +55,7 @@ function update_script() {
$STD php artisan view:clear $STD php artisan view:clear
chown -R www-data: /opt/snipe-it chown -R www-data: /opt/snipe-it
chmod -R 755 /opt/snipe-it chmod -R 755 /opt/snipe-it
rm -rf /opt/v${RELEASE}.zip rm -rf "$temp_file"
rm -rf /opt/snipe-it-backup rm -rf /opt/snipe-it-backup
msg_ok "Updated ${APP}" msg_ok "Updated ${APP}"

View File

@@ -27,20 +27,24 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
if ! [[ $(dpkg -s python3-xmlsec 2>/dev/null) ]]; then
$STD apt-get update
$STD apt-get install -y python3-xmlsec
fi
if cd /opt/tandoor && git pull | grep -q 'Already up to date'; then if cd /opt/tandoor && git pull | grep -q 'Already up to date'; then
msg_ok "There is currently no update available." msg_ok "There is currently no update available."
else else
msg_info "Updating ${APP} (Patience)" msg_info "Updating ${APP} (Patience)"
export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs) export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs)
cd /opt/tandoor/ cd /opt/tandoor/ || exit
$STD pip3 install -r requirements.txt $STD pip3 install -r requirements.txt
$STD /usr/bin/python3 /opt/tandoor/manage.py migrate $STD /usr/bin/python3 /opt/tandoor/manage.py migrate
$STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input
$STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse
cd /opt/tandoor/vue cd /opt/tandoor/vue || exit
$STD yarn install $STD yarn install
$STD yarn build $STD yarn build
cd /opt/tandoor cd /opt/tandoor || exit
$STD python3 version.py $STD python3 version.py
systemctl restart gunicorn_tandoor systemctl restart gunicorn_tandoor
msg_ok "Updated ${APP}" msg_ok "Updated ${APP}"
@@ -55,4 +59,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8002${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8002${CL}"

View File

@@ -37,13 +37,13 @@ function update_script() {
msg_info "Updating to ${RELEASE}" msg_info "Updating to ${RELEASE}"
mkdir -p /opt/trilium_backup mkdir -p /opt/trilium_backup
mv /opt/trilium/{db,dump-db} /opt/trilium_backup/ mv /opt/trilium/db /opt/trilium_backup/
rm -rf /opt/trilium rm -rf /opt/trilium
cd /tmp cd /tmp
curl -fsSL "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" -o $(basename "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz") curl -fsSL "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" -o $(basename "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz")
tar -xf TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz tar -xf TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz
mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium
cp -r /opt/trilium_backup/{db,dump-db} /opt/trilium/ cp -r /opt/trilium_backup/db /opt/trilium/
echo "v${RELEASE}" >/opt/${APP}_version.txt echo "v${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated to ${RELEASE}" msg_ok "Updated to ${RELEASE}"

View File

@@ -5,14 +5,14 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://ubuntu.com/ # Source: https://ubuntu.com/
echo -e "Loading..."
APP="Ubuntu" APP="Ubuntu"
var_tags="os" var_tags="${var_tags:-os}"
var_cpu="1" var_cpu="${var_cpu:-1}"
var_ram="512" var_ram="${var_ram:-512}"
var_disk="2" var_disk="${var_disk:-2}"
var_os="ubuntu" var_os="${var_os:-ubuntu}"
var_version="24.04" var_version="${var_version:-24.04}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"
variables variables
@@ -20,18 +20,18 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /var ]]; then if [[ ! -d /var ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Updating ${APP} LXC"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated ${APP} LXC"
exit exit
fi
msg_info "Updating ${APP} LXC"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated ${APP} LXC"
exit
} }
start start
@@ -39,4 +39,4 @@ build_container
description description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck # Copyright (c) 2021-2025 community-scripts ORG
# Author: tteck (tteckster) # Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.zabbix.com/ # Source: https://www.zabbix.com/
@@ -20,40 +20,43 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /etc/zabbix/zabbix_server.conf ]]; then if [[ ! -f /etc/zabbix/zabbix_server.conf ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Stopping ${APP} Services"
systemctl stop zabbix-server zabbix-agent2
msg_ok "Stopped ${APP} Services"
msg_info "Updating $APP LXC"
mkdir -p /opt/zabbix-backup/
cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/
cp /etc/apache2/conf-enabled/zabbix.conf /opt/zabbix-backup/
cp -R /usr/share/zabbix/ /opt/zabbix-backup/
#cp -R /usr/share/zabbix-* /opt/zabbix-backup/ Remove temporary
rm -Rf /etc/apt/sources.list.d/zabbix.list
cd /tmp
curl -fsSL "https://repo.zabbix.com/zabbix/7.2/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb" -o $(basename "https://repo.zabbix.com/zabbix/7.2/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb")
$STD dpkg -i zabbix-release_latest+debian12_all.deb
$STD apt-get update
$STD apt-get install --only-upgrade zabbix-server-pgsql zabbix-frontend-php zabbix-agent2 zabbix-agent2-plugin-*
msg_info "Starting ${APP} Services"
systemctl start zabbix-server zabbix-agent2
systemctl restart apache2
msg_ok "Started ${APP} Services"
msg_info "Cleaning Up"
rm -rf /tmp/zabbix-release_latest+debian12_all.deb
msg_ok "Cleaned"
msg_ok "Updated Successfully"
exit exit
fi
msg_info "Stopping ${APP} Services"
systemctl stop zabbix-server zabbix-agent2
msg_ok "Stopped ${APP} Services"
msg_info "Updating $APP LXC"
mkdir -p /opt/zabbix-backup/
cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/
cp /etc/apache2/conf-enabled/zabbix.conf /opt/zabbix-backup/
cp -R /usr/share/zabbix/ /opt/zabbix-backup/
#cp -R /usr/share/zabbix-* /opt/zabbix-backup/ Remove temporary
rm -Rf /etc/apt/sources.list.d/zabbix.list
cd /tmp || exit
curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ |
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 |
xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb")" \
-o /tmp/zabbix-release_latest+debian12_all.deb
$STD dpkg -i zabbix-release_latest+debian12_all.deb
$STD apt-get update
$STD apt-get install --only-upgrade zabbix-server-pgsql zabbix-frontend-php zabbix-agent2 zabbix-agent2-plugin-*
msg_info "Starting ${APP} Services"
systemctl start zabbix-server zabbix-agent2
systemctl restart apache2
msg_ok "Started ${APP} Services"
msg_info "Cleaning Up"
rm -rf /tmp/zabbix-release_latest+debian12_all.deb
msg_ok "Cleaned"
msg_ok "Updated Successfully"
exit
} }
start start

View File

@@ -20,39 +20,39 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /etc/systemd/system/zitadel.service ]]; then if [[ ! -f /etc/systemd/system/zitadel.service ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -fsSL https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt | grep -oP '\d+\.\d+\.\d+')" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP"
systemctl stop zitadel
msg_ok "Stopped $APP"
msg_info "Updating $APP to ${RELEASE}"
cd /tmp || exit
curl -fsSL https://github.com/zitadel/zitadel/releases/download/"$RELEASE"/zitadel-linux-amd64.tar.gz | tar -xz
mv zitadel-linux-amd64/zitadel /usr/local/bin
$STD zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to ${RELEASE}"
msg_info "Starting $APP"
systemctl start zitadel
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -rf /tmp/zitadel-linux-amd64
msg_ok "Cleanup Completed"
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/zitadel/zitadel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt | grep -oP '\d+\.\d+\.\d+')" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP"
systemctl stop zitadel
msg_ok "Stopped $APP"
msg_info "Updating $APP to ${RELEASE}"
cd /tmp || exit
curl -fsSL "https://github.com/zitadel/zitadel/releases/download/v$RELEASE/zitadel-linux-amd64.tar.gz" | tar -xz
mv zitadel-linux-amd64/zitadel /usr/local/bin
$STD zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to ${RELEASE}"
msg_info "Starting $APP"
systemctl start zitadel
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -rf /tmp/zitadel-linux-amd64
msg_ok "Cleanup Completed"
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
} }
start start

View File

@@ -33,7 +33,7 @@
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"lucide-react": "^0.453.0", "lucide-react": "^0.453.0",
"mini-svg-data-uri": "^1.4.4", "mini-svg-data-uri": "^1.4.4",
"next": "15.2.3", "next": "15.2.4",
"next-themes": "^0.3.0", "next-themes": "^0.3.0",
"nuqs": "^2.4.1", "nuqs": "^2.4.1",
"pocketbase": "^0.21.5", "pocketbase": "^0.21.5",
@@ -1598,9 +1598,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz",
"integrity": "sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==", "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@next/eslint-plugin-next": { "node_modules/@next/eslint-plugin-next": {
@@ -1644,9 +1644,9 @@
} }
}, },
"node_modules/@next/swc-darwin-arm64": { "node_modules/@next/swc-darwin-arm64": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz",
"integrity": "sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==", "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1660,9 +1660,9 @@
} }
}, },
"node_modules/@next/swc-darwin-x64": { "node_modules/@next/swc-darwin-x64": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz",
"integrity": "sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==", "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1676,9 +1676,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-gnu": { "node_modules/@next/swc-linux-arm64-gnu": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz",
"integrity": "sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==", "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1692,9 +1692,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-musl": { "node_modules/@next/swc-linux-arm64-musl": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz",
"integrity": "sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==", "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1708,9 +1708,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-gnu": { "node_modules/@next/swc-linux-x64-gnu": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz",
"integrity": "sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==", "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1724,9 +1724,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-musl": { "node_modules/@next/swc-linux-x64-musl": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz",
"integrity": "sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==", "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -1740,9 +1740,9 @@
} }
}, },
"node_modules/@next/swc-win32-arm64-msvc": { "node_modules/@next/swc-win32-arm64-msvc": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz",
"integrity": "sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==", "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1756,9 +1756,9 @@
} }
}, },
"node_modules/@next/swc-win32-x64-msvc": { "node_modules/@next/swc-win32-x64-msvc": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.3.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz",
"integrity": "sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==", "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -7194,12 +7194,12 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/next": { "node_modules/next": {
"version": "15.2.3", "version": "15.2.4",
"resolved": "https://registry.npmjs.org/next/-/next-15.2.3.tgz", "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz",
"integrity": "sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==", "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@next/env": "15.2.3", "@next/env": "15.2.4",
"@swc/counter": "0.1.3", "@swc/counter": "0.1.3",
"@swc/helpers": "0.5.15", "@swc/helpers": "0.5.15",
"busboy": "1.6.0", "busboy": "1.6.0",
@@ -7214,14 +7214,14 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0" "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@next/swc-darwin-arm64": "15.2.3", "@next/swc-darwin-arm64": "15.2.4",
"@next/swc-darwin-x64": "15.2.3", "@next/swc-darwin-x64": "15.2.4",
"@next/swc-linux-arm64-gnu": "15.2.3", "@next/swc-linux-arm64-gnu": "15.2.4",
"@next/swc-linux-arm64-musl": "15.2.3", "@next/swc-linux-arm64-musl": "15.2.4",
"@next/swc-linux-x64-gnu": "15.2.3", "@next/swc-linux-x64-gnu": "15.2.4",
"@next/swc-linux-x64-musl": "15.2.3", "@next/swc-linux-x64-musl": "15.2.4",
"@next/swc-win32-arm64-msvc": "15.2.3", "@next/swc-win32-arm64-msvc": "15.2.4",
"@next/swc-win32-x64-msvc": "15.2.3", "@next/swc-win32-x64-msvc": "15.2.4",
"sharp": "^0.33.5" "sharp": "^0.33.5"
}, },
"peerDependencies": { "peerDependencies": {
@@ -9667,9 +9667,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "6.2.4", "version": "6.2.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz",
"integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

View File

@@ -44,7 +44,7 @@
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"lucide-react": "^0.453.0", "lucide-react": "^0.453.0",
"mini-svg-data-uri": "^1.4.4", "mini-svg-data-uri": "^1.4.4",
"next": "15.2.3", "next": "15.2.4",
"next-themes": "^0.3.0", "next-themes": "^0.3.0",
"nuqs": "^2.4.1", "nuqs": "^2.4.1",
"pocketbase": "^0.21.5", "pocketbase": "^0.21.5",

View File

@@ -19,8 +19,8 @@
"script": "ct/actualbudget.sh", "script": "ct/actualbudget.sh",
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 2048, "ram": 4096,
"hdd": 4, "hdd": 7,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }

View File

@@ -1,47 +1,45 @@
{ {
"name": "Proxmox VE LXC IP-Tag", "name": "Proxmox VE LXC IP-Tag",
"slug": "add-lxc-iptag", "slug": "add-lxc-iptag",
"categories": [ "categories": [1],
1 "date_created": "2024-12-16",
], "type": "pve",
"date_created": "2024-12-16", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "This script automatically adds IP address as tags to LXC containers using a Systemd service. The service also updates the tags if a LXC IP address is changed.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "This script automatically adds IP address as tags to LXC containers using a Systemd service. The service also updates the tags if a LXC IP address is changed.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/add-lxc-iptag.sh",
"type": "default", "resources": {
"script": "misc/add-lxc-iptag.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "Configuration: `nano /opt/lxc-iptag/iptag.conf`. iptag.service must be restarted after change.",
"text": "Execute within the Proxmox shell", "type": "info"
"type": "info" },
}, {
{ "text": "The Proxmox Node must contain ipcalc and net-tools. `apt-get install -y ipcalc net-tools`",
"text": "Configuration: `nano /opt/lxc-iptag/iptag.conf`. iptag.service must be restarted after change.", "type": "warning"
"type": "info" }
}, ]
{
"text": "The Proxmox Node must contain ipcalc and net-tools. `apt-get install -y ipcalc net-tools`",
"type": "warning"
}
]
} }

View File

@@ -1,47 +1,45 @@
{ {
"name": "NetBird", "name": "NetBird",
"slug": "add-netbird-lxc", "slug": "add-netbird-lxc",
"categories": [ "categories": [1],
1 "date_created": "2024-05-19",
], "type": "addon",
"date_created": "2024-05-19", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": "https://docs.netbird.io/",
"interface_port": null, "website": "https://netbird.io/",
"documentation": "https://docs.netbird.io/", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/netbird.svg",
"website": "https://netbird.io/", "description": "NetBird combines a configuration-free peer-to-peer private network and a centralized access control system in a single platform, making it easy to create secure private networks for your organization or home.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/netbird.svg", "install_methods": [
"description": "NetBird combines a configuration-free peer-to-peer private network and a centralized access control system in a single platform, making it easy to create secure private networks for your organization or home.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/add-netbird-lxc.sh",
"type": "default", "resources": {
"script": "misc/add-netbird-lxc.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "After the script finishes, reboot the LXC then run `netbird up` in the LXC console",
"type": "info"
}, },
"notes": [ {
{ "text": "Execute within the Proxmox main shell",
"text": "After the script finishes, reboot the LXC then run `netbird up` in the LXC console", "type": "info"
"type": "info" },
}, {
{ "text": "The script only works in Debian/Ubuntu, not in Alpine!",
"text": "Execute within the Proxmox main shell", "type": "warning"
"type": "info" }
}, ]
{
"text": "The script only works in Debian/Ubuntu, not in Alpine!",
"type": "warning"
}
]
} }

View File

@@ -1,47 +1,45 @@
{ {
"name": "Tailscale", "name": "Tailscale",
"slug": "add-tailscale-lxc", "slug": "add-tailscale-lxc",
"categories": [ "categories": [1],
1 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": "https://tailscale.com/",
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/tailscale.svg",
"website": "https://tailscale.com/", "description": "Tailscale is a software-defined networking solution that enables secure communication between devices over the internet. It creates a virtual private network (VPN) that enables devices to communicate with each other as if they were on the same local network. Tailscale works even when the devices are separated by firewalls or subnets, and provides secure and encrypted communication between devices. With Tailscale, users can connect devices, servers, computers, and cloud instances to create a secure network, making it easier to manage and control access to resources. Tailscale is designed to be easy to set up and use, providing a streamlined solution for secure communication between devices over the internet.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/tailscale.svg", "install_methods": [
"description": "Tailscale is a software-defined networking solution that enables secure communication between devices over the internet. It creates a virtual private network (VPN) that enables devices to communicate with each other as if they were on the same local network. Tailscale works even when the devices are separated by firewalls or subnets, and provides secure and encrypted communication between devices. With Tailscale, users can connect devices, servers, computers, and cloud instances to create a secure network, making it easier to manage and control access to resources. Tailscale is designed to be easy to set up and use, providing a streamlined solution for secure communication between devices over the internet.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/add-tailscale-lxc.sh",
"type": "default", "resources": {
"script": "misc/add-tailscale-lxc.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Only supported on Debian 12 LXCs",
"type": "warning"
}, },
"notes": [ {
{ "text": "After the script finishes, reboot the LXC then run `tailscale up` in the LXC console",
"text": "Only supported on Debian 12 LXCs", "type": "info"
"type": "warning" },
}, {
{ "text": "Execute within the Proxmox shell",
"text": "After the script finishes, reboot the LXC then run `tailscale up` in the LXC console", "type": "info"
"type": "info" }
}, ]
{
"text": "Execute within the Proxmox shell",
"type": "info"
}
]
} }

View File

@@ -1,39 +1,37 @@
{ {
"name": "All Templates", "name": "All Templates",
"slug": "all-templates", "slug": "all-templates",
"categories": [ "categories": [1],
1 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/proxmox.svg",
"website": null, "description": "A script designed to allow for the creation of one of the many free LXC templates. Great for creating system LXCs.\r\nThe script creates a `*.creds` file in the Proxmox root directory with the password of the newly created LXC.\r\nPlease take note that if you plan to use this script for creating TurnKey LXCs, you'll need to modify the hostname after creation.",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/proxmox.svg", "install_methods": [
"description": "A script designed to allow for the creation of one of the many free LXC templates. Great for creating system LXCs.\r\nThe script creates a `*.creds` file in the Proxmox root directory with the password of the newly created LXC.\r\nPlease take note that if you plan to use this script for creating TurnKey LXCs, you'll need to modify the hostname after creation.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/all-templates.sh",
"type": "default", "resources": {
"script": "misc/all-templates.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Resource and network settings are adjustable post LXC creation.",
{ "type": "info"
"text": "Resource and network settings are adjustable post LXC creation.", }
"type": "info" ]
} }
]
}

View File

@@ -2,7 +2,7 @@
"name": "Channels DVR Server", "name": "Channels DVR Server",
"slug": "channels", "slug": "channels",
"categories": [ "categories": [
15 13
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
@@ -36,4 +36,4 @@
"type": "warning" "type": "warning"
} }
] ]
} }

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox VE LXC Cleaner", "name": "Proxmox VE LXC Cleaner",
"slug": "clean-lxcs", "slug": "clean-lxcs",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "addon",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg",
"website": null, "description": "This script provides options to delete logs and cache, and repopulate apt lists for Ubuntu and Debian systems.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", "install_methods": [
"description": "This script provides options to delete logs and cache, and repopulate apt lists for Ubuntu and Debian systems.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/clean-lxcs.sh",
"type": "default", "resources": {
"script": "misc/clean-lxcs.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
} }
]
}

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox Clean Orphaned LVM", "name": "Proxmox Clean Orphaned LVM",
"slug": "clean-orphaned-lvm", "slug": "clean-orphaned-lvm",
"categories": [ "categories": [1],
1 "date_created": "2025-01-29",
], "type": "pve",
"date_created": "2025-01-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "This script helps Proxmox users identify and remove orphaned LVM volumes that are no longer associated with any VM or LXC container. It scans all LVM volumes, detects unused ones, and provides an interactive prompt to delete them safely. System-critical volumes like root, swap, and data are excluded to prevent accidental deletion.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "This script helps Proxmox users identify and remove orphaned LVM volumes that are no longer associated with any VM or LXC container. It scans all LVM volumes, detects unused ones, and provides an interactive prompt to delete them safely. System-critical volumes like root, swap, and data are excluded to prevent accidental deletion.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/clean-orphaned-lvm.sh",
"type": "default", "resources": {
"script": "misc/clean-orphaned-lvm.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
}
]
} }

View File

@@ -1,41 +1,37 @@
{ {
"name": "VS Code Server", "name": "VS Code Server",
"slug": "code-server", "slug": "code-server",
"categories": [ "categories": [1, 20, 11],
1, "date_created": "2024-05-02",
20, "type": "addon",
11 "updateable": false,
], "privileged": false,
"date_created": "2024-05-02", "interface_port": 8680,
"type": "misc", "documentation": null,
"updateable": false, "website": null,
"privileged": false, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/visual-studio-code.svg",
"interface_port": 8680, "description": "VS Code Server is a service you can run on a remote development machine, like your desktop PC or a virtual machine (VM). It allows you to securely connect to that remote machine from anywhere through a vscode.dev URL, without the requirement of SSH.",
"documentation": null, "install_methods": [
"website": null, {
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/visual-studio-code.svg", "type": "default",
"description": "VS Code Server is a service you can run on a remote development machine, like your desktop PC or a virtual machine (VM). It allows you to securely connect to that remote machine from anywhere through a vscode.dev URL, without the requirement of SSH.", "script": "tools/addon/code-server.sh",
"install_methods": [ "resources": {
{ "cpu": null,
"type": "default", "ram": null,
"script": "misc/code-server.sh", "hdd": null,
"resources": { "os": null,
"cpu": null, "version": null
"ram": null, }
"hdd": null, }
"os": null, ],
"version": null "default_credentials": {
} "username": null,
} "password": null
], },
"default_credentials": { "notes": [
"username": null, {
"password": null "text": "Execute within an existing LXC Console",
}, "type": "warning"
"notes": [ }
{ ]
"text": "Execute within an existing LXC Console",
"type": "warning"
}
]
} }

View File

@@ -1,44 +1,41 @@
{ {
"name": "Proxmox VE Cron LXC Updater", "name": "Proxmox VE Cron LXC Updater",
"slug": "cron-update-lxcs", "slug": "cron-update-lxcs",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/lxc.svg",
"website": null, "description": "This script will add/remove a crontab schedule that updates all LXCs every Sunday at midnight.",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/lxc.svg", "install_methods": [
"description": "This script will add/remove a crontab schedule that updates all LXCs every Sunday at midnight.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/cron-update-lxcs.sh",
"type": "default", "resources": {
"script": "misc/cron-update-lxcs.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "To exclude LXCs from updating, edit the crontab using `crontab -e` and add CTID as shown in the example below:\n\n\n\n`0 0 * * 0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/update-lxcs-cron.sh)' -s 103 111 >>/var/log/update-lxcs-cron.log 2>/dev/null`",
"text": "Execute within the Proxmox shell", "type": "info"
"type": "info" }
}, ]
{ }
"text": "To exclude LXCs from updating, edit the crontab using `crontab -e` and add CTID as shown in the example below:\n\n\n\n`0 0 * * 0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/raw/main/misc/update-lxcs-cron.sh)' -s 103 111 >>/var/log/update-lxcs-cron.log 2>/dev/null`",
"type": "info"
}
]
}

View File

@@ -1,39 +1,37 @@
{ {
"name": "CrowdSec", "name": "CrowdSec",
"slug": "crowdsec", "slug": "crowdsec",
"categories": [ "categories": [6],
6 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": "https://crowdsec.net/",
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/crowdsec.svg",
"website": "https://crowdsec.net/", "description": "CrowdSec is a free and open-source intrusion prevention system (IPS) designed to provide network security against malicious traffic. It is a collaborative IPS that analyzes behaviors and responses to attacks by sharing signals across a community of users. CrowdSec leverages the collective intelligence of its users to detect and respond to security threats in real-time. With CrowdSec, network administrators can set up protection against a wide range of threats, including malicious traffic, bots, and denial-of-service (DoS) attacks. The software is designed to be easy to use and integrate with existing security systems, making it a valuable tool for enhancing the security of any network.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/crowdsec.svg", "install_methods": [
"description": "CrowdSec is a free and open-source intrusion prevention system (IPS) designed to provide network security against malicious traffic. It is a collaborative IPS that analyzes behaviors and responses to attacks by sharing signals across a community of users. CrowdSec leverages the collective intelligence of its users to detect and respond to security threats in real-time. With CrowdSec, network administrators can set up protection against a wide range of threats, including malicious traffic, bots, and denial-of-service (DoS) attacks. The software is designed to be easy to use and integrate with existing security systems, making it a valuable tool for enhancing the security of any network.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/crowdsec.sh",
"type": "default", "resources": {
"script": "misc/crowdsec.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within an existing LXC Console. Debian only!",
{ "type": "warning"
"text": "Execute within an existing LXC Console. Debian only!", }
"type": "warning" ]
} }
]
}

View File

@@ -1,50 +1,48 @@
{ {
"name": "File Browser", "name": "File Browser",
"slug": "filebrowser", "slug": "filebrowser",
"categories": [ "categories": [1],
1 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": 8080,
"privileged": false, "documentation": null,
"interface_port": 8080, "website": "https://filebrowser.org/features",
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/file-browser.svg",
"website": "https://filebrowser.org/features", "description": "File Browser offers a user-friendly web interface for managing files within a designated directory. It allows you to perform various actions such as uploading, deleting, previewing, renaming, and editing files.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/file-browser.svg", "install_methods": [
"description": "File Browser offers a user-friendly web interface for managing files within a designated directory. It allows you to perform various actions such as uploading, deleting, previewing, renaming, and editing files.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/filebrowser.sh",
"type": "default", "resources": {
"script": "misc/filebrowser.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null
}
},
{
"type": "alpine",
"script": "misc/filebrowser.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
}
],
"default_credentials": {
"username": "admin",
"password": "helper-scripts.com"
}, },
"notes": [ {
{ "type": "alpine",
"text": "Execute within an existing LXC Console", "script": "tools/addon/filebrowser.sh",
"type": "warning" "resources": {
} "cpu": null,
] "ram": null,
"hdd": null,
"os": null,
"version": null
}
}
],
"default_credentials": {
"username": "admin",
"password": "helper-scripts.com"
},
"notes": [
{
"text": "Execute within an existing LXC Console",
"type": "warning"
}
]
} }

View File

@@ -1,43 +1,41 @@
{ {
"name": "Proxmox VE LXC Filesystem Trim", "name": "Proxmox VE LXC Filesystem Trim",
"slug": "fstrim", "slug": "fstrim",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/805",
"interface_port": null, "website": null,
"documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/805", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg",
"website": null, "description": "This maintains SSD performance by managing unused blocks. Thin-provisioned storage systems also require management to prevent unnecessary storage use. VMs automate fstrim, while LXC containers need manual or automated fstrim processes for optimal performance.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", "install_methods": [
"description": "This maintains SSD performance by managing unused blocks. Thin-provisioned storage systems also require management to prevent unnecessary storage use. VMs automate fstrim, while LXC containers need manual or automated fstrim processes for optimal performance.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/fstrim.sh",
"type": "default", "resources": {
"script": "misc/fstrim.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "This is designed to work with SSDs on ext4 filesystems only.",
"text": "Execute within the Proxmox shell", "type": "warning"
"type": "info" }
}, ]
{
"text": "This is designed to work with SSDs on ext4 filesystems only.",
"type": "warning"
}
]
} }

View File

@@ -1,43 +1,41 @@
{ {
"name": "Glances", "name": "Glances",
"slug": "glances", "slug": "glances",
"categories": [ "categories": [9],
9 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": 61208,
"privileged": false, "documentation": null,
"interface_port": 61208, "website": "https://nicolargo.github.io/glances/",
"documentation": null, "logo": "https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/Glances%20Logo.svg",
"website": "https://nicolargo.github.io/glances/", "description": "Glances is an open-source system cross-platform monitoring tool. It allows real-time monitoring of various aspects of your system such as CPU, memory, disk, network usage etc.",
"logo": "https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/Glances%20Logo.svg", "install_methods": [
"description": "Glances is an open-source system cross-platform monitoring tool. It allows real-time monitoring of various aspects of your system such as CPU, memory, disk, network usage etc.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/glances.sh",
"type": "default", "resources": {
"script": "misc/glances.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within an existing LXC Console",
"type": "warning"
}, },
"notes": [ {
{ "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
"text": "Execute within an existing LXC Console", "type": "warning"
"type": "warning" }
}, ]
{ }
"text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
"type": "warning"
}
]
}

View File

@@ -1,34 +0,0 @@
{
"name": "Hoarder",
"slug": "hoarder",
"categories": [
12
],
"date_created": "2024-12-02",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": "https://docs.hoarder.app/",
"website": "https://hoarder.app/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/hoarder.svg",
"description": "Hoarder is an AI-powered bookmarking tool that helps you save and organize your digital content. It automatically tags your links, notes, and images, making them easy to find later. With features like auto-fetching, lists, and full-text search, Hoarder is the perfect tool for anyone who wants to keep track of their digital life.",
"install_methods": [
{
"type": "default",
"script": "ct/hoarder.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 10,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -1,43 +1,41 @@
{ {
"name": "Proxmox VE Host Backup", "name": "Proxmox VE Host Backup",
"slug": "host-backup", "slug": "host-backup",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/bash-dark.svg",
"website": null, "description": "This script serves as a versatile backup utility, enabling users to specify both the backup path and the directory they want to work in. This flexibility empowers users to select the specific files and directories they wish to back up, making it compatible with a wide range of hosts, not limited to Proxmox.",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/bash-dark.svg", "install_methods": [
"description": "This script serves as a versatile backup utility, enabling users to specify both the backup path and the directory they want to work in. This flexibility empowers users to select the specific files and directories they wish to back up, making it compatible with a wide range of hosts, not limited to Proxmox.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/host-backup.sh",
"type": "default", "resources": {
"script": "misc/host-backup.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "A backup is rendered ineffective when it remains stored on the host",
"text": "Execute within the Proxmox shell", "type": "info"
"type": "info" }
}, ]
{ }
"text": "A backup is rendered ineffective when it remains stored on the host",
"type": "info"
}
]
}

View File

@@ -0,0 +1,34 @@
{
"name": "karakeep",
"slug": "karakeep",
"categories": [
12
],
"date_created": "2025-04-07",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": "https://docs.karakeep.app/",
"website": "https://karakeep.app/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/karakeep.svg",
"description": "karakeep (formerly: hoarder) is an AI-powered bookmarking tool that helps you save and organize your digital content. It automatically tags your links, notes, and images, making them easy to find later. With features like auto-fetching, lists, and full-text search, karakeep is the perfect tool for anyone who wants to keep track of their digital life.",
"install_methods": [
{
"type": "default",
"script": "ct/karakeep.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 10,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox VE Kernel Clean", "name": "Proxmox VE Kernel Clean",
"slug": "kernel-clean", "slug": "kernel-clean",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "Cleaning unused kernel images is beneficial for reducing the length of the GRUB menu and freeing up disk space. By removing old, unused kernels, the system is able to conserve disk space and streamline the boot process.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "Cleaning unused kernel images is beneficial for reducing the length of the GRUB menu and freeing up disk space. By removing old, unused kernels, the system is able to conserve disk space and streamline the boot process.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/kernel-clean.sh",
"type": "default", "resources": {
"script": "misc/kernel-clean.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
}
]
} }

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox VE Kernel Pin", "name": "Proxmox VE Kernel Pin",
"slug": "kernel-pin", "slug": "kernel-pin",
"categories": [ "categories": [1],
1 "date_created": "2024-05-08",
], "type": "pve",
"date_created": "2024-05-08", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "Kernel Pin is an essential tool for effortlessly managing kernel pinning and unpinning.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "Kernel Pin is an essential tool for effortlessly managing kernel pinning and unpinning.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/kernel-pin.sh",
"type": "default", "resources": {
"script": "misc/kernel-pin.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
}
]
} }

View File

@@ -1,34 +1,34 @@
{ {
"name": "Lidarr", "name": "Lidarr",
"slug": "lidarr", "slug": "lidarr",
"categories": [ "categories": [
14 14
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
"updateable": false, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 8686, "interface_port": 8686,
"documentation": null, "documentation": null,
"website": "https://lidarr.audio/", "website": "https://lidarr.audio/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/lidarr.svg", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/lidarr.svg",
"description": "Lidarr is a music management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their music collection with ease. Lidarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Radarr, to automate the downloading and organizing of music files. The software provides a web-based interface for managing and organizing music, making it easy to search and find songs, albums, and artists. Lidarr also supports metadata management, including album art, artist information, and lyrics, making it easy for users to keep their music collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing music collections, making it a valuable tool for music lovers who want to keep their collection organized and up-to-date. With Lidarr, users can enjoy their music collection from anywhere, making it a powerful tool for managing and sharing music files.", "description": "Lidarr is a music management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their music collection with ease. Lidarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Radarr, to automate the downloading and organizing of music files. The software provides a web-based interface for managing and organizing music, making it easy to search and find songs, albums, and artists. Lidarr also supports metadata management, including album art, artist information, and lyrics, making it easy for users to keep their music collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing music collections, making it a valuable tool for music lovers who want to keep their collection organized and up-to-date. With Lidarr, users can enjoy their music collection from anywhere, making it a powerful tool for managing and sharing music files.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/lidarr.sh", "script": "ct/lidarr.sh",
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
} }
], ],
"default_credentials": { "default_credentials": {
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": []
} }

View File

@@ -6,7 +6,7 @@
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
"updateable": false, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 3000, "interface_port": 3000,
"documentation": "https://docs.linkwarden.app/", "documentation": "https://docs.linkwarden.app/",

View File

@@ -1,39 +1,37 @@
{ {
"name": "Container LXC Deletion", "name": "Container LXC Deletion",
"slug": "lxc-delete", "slug": "lxc-delete",
"categories": [ "categories": [1],
1 "date_created": "2025-01-21",
], "type": "pve",
"date_created": "2025-01-21", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg",
"website": null, "description": "This script helps manage and delete LXC containers on a Proxmox VE server. It lists all available containers, allowing the user to select one or more for deletion through an interactive menu. Running containers are automatically stopped before deletion, and the user is asked to confirm each action. The script ensures a controlled and efficient container management process.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", "install_methods": [
"description": "This script helps manage and delete LXC containers on a Proxmox VE server. It lists all available containers, allowing the user to select one or more for deletion through an interactive menu. Running containers are automatically stopped before deletion, and the user is asked to confirm each action. The script ensures a controlled and efficient container management process.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/lxc-delete.sh",
"type": "default", "resources": {
"script": "misc/lxc-delete.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
}
]
} }

View File

@@ -0,0 +1,43 @@
{
"name": "Meilisearch",
"slug": "meilisearch",
"categories": [
8
],
"date_created": "2025-04-04",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 7700,
"documentation": "https://www.meilisearch.com/docs",
"website": "https://www.meilisearch.com/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/meilisearch.svg",
"description": "Meilisearch is a fast, open-source search engine designed for instant, full-text search with typo tolerance. It provides an API that allows developers to integrate powerful search features into applications. Meilisearch-UI is an optional web-based interface that provides a simple way to interact with Meilisearch, visualize indexed data, and test queries without needing to use the API directly.",
"install_methods": [
{
"type": "default",
"script": "ct/meilisearch.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 7,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Meilisearch-UI can optionally be installed for a web-based search interface",
"type": "info"
},
{
"text": "Meilisearch-UI has early development status and can cause performance issues",
"type": "warn"
}
]
}

View File

@@ -1,43 +1,41 @@
{ {
"name": "Proxmox VE Processor Microcode", "name": "Proxmox VE Processor Microcode",
"slug": "microcode", "slug": "microcode",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/processor.png?raw=true",
"website": null, "description": "Processor Microcode is a layer of low-level software that runs on the processor and provides patches or updates to its firmware. Microcode updates can fix hardware bugs, improve performance, and enhance security features of the processor.\r\n\r\nIt's important to note that the availability of firmware update mechanisms, such as Intel's Management Engine (ME) or AMD's Platform Security Processor (PSP), may vary depending on the processor and its specific implementation. Therefore, it's recommended to consult the documentation for your processor to confirm whether firmware updates can be applied through the operating system.",
"logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/processor.png?raw=true", "install_methods": [
"description": "Processor Microcode is a layer of low-level software that runs on the processor and provides patches or updates to its firmware. Microcode updates can fix hardware bugs, improve performance, and enhance security features of the processor.\r\n\r\nIt's important to note that the availability of firmware update mechanisms, such as Intel's Management Engine (ME) or AMD's Platform Security Processor (PSP), may vary depending on the processor and its specific implementation. Therefore, it's recommended to consult the documentation for your processor to confirm whether firmware updates can be applied through the operating system.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/microcode.sh",
"type": "default", "resources": {
"script": "misc/microcode.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "After a reboot, you can check whether any microcode updates are currently in effect by running the following command. `journalctl -k | grep -E \"microcode\" | head -n 1`",
"text": "Execute within the Proxmox shell", "type": "info"
"type": "info" }
}, ]
{
"text": "After a reboot, you can check whether any microcode updates are currently in effect by running the following command. `journalctl -k | grep -E \"microcode\" | head -n 1`",
"type": "info"
}
]
} }

View File

@@ -1,67 +1,65 @@
{ {
"name": "Proxmox VE Monitor-All", "name": "Proxmox VE Monitor-All",
"slug": "monitor-all", "slug": "monitor-all",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/monitor.png?raw=true",
"website": null, "description": "This script will add Monitor-All to Proxmox VE, which will monitor the status of all your instances, both containers and virtual machines, excluding templates and user-defined ones, and automatically restart or reset them if they become unresponsive. This is particularly useful if you're experiencing problems with Home Assistant becoming non-responsive every few days/weeks. Monitor-All also maintains a log of the entire process, which can be helpful for troubleshooting and monitoring purposes.\r\n\r\n\ud83d\udec8 Virtual machines without the QEMU guest agent installed must be excluded.\r\n\ud83d\udec8 Prior to generating any new CT/VM not found in this repository, it's necessary to halt Proxmox VE Monitor-All by running systemctl stop ping-instances.",
"logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/monitor.png?raw=true", "install_methods": [
"description": "This script will add Monitor-All to Proxmox VE, which will monitor the status of all your instances, both containers and virtual machines, excluding templates and user-defined ones, and automatically restart or reset them if they become unresponsive. This is particularly useful if you're experiencing problems with Home Assistant becoming non-responsive every few days/weeks. Monitor-All also maintains a log of the entire process, which can be helpful for troubleshooting and monitoring purposes.\r\n\r\n\ud83d\udec8 Virtual machines without the QEMU guest agent installed must be excluded.\r\n\ud83d\udec8 Prior to generating any new CT/VM not found in this repository, it's necessary to halt Proxmox VE Monitor-All by running systemctl stop ping-instances.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/monitor-all.sh",
"type": "default", "resources": {
"script": "misc/monitor-all.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "Virtual machines without the QEMU guest agent installed must be excluded.",
"text": "Execute within the Proxmox shell", "type": "warning"
"type": "info" },
}, {
{ "text": "Prior to generating any new CT/VM not found in this repository, it's necessary to halt Proxmox VE Monitor-All by running `systemctl stop ping-instances`.",
"text": "Virtual machines without the QEMU guest agent installed must be excluded.", "type": "warning"
"type": "warning" },
}, {
{ "text": "To make setup changes, first stop the service: `systemctl stop ping-instances`",
"text": "Prior to generating any new CT/VM not found in this repository, it's necessary to halt Proxmox VE Monitor-All by running `systemctl stop ping-instances`.", "type": "info"
"type": "warning" },
}, {
{ "text": "To edit pause time: `nano /usr/local/bin/ping-instances.sh`",
"text": "To make setup changes, first stop the service: `systemctl stop ping-instances`", "type": "info"
"type": "info" },
}, {
{ "text": "To add excluded instances: `nano /etc/systemd/system/ping-instances.service`",
"text": "To edit pause time: `nano /usr/local/bin/ping-instances.sh`", "type": "info"
"type": "info" },
}, {
{ "text": "After changes have been saved, `systemctl daemon-reload` and start the service: `systemctl start ping-instances`",
"text": "To add excluded instances: `nano /etc/systemd/system/ping-instances.service`", "type": "info"
"type": "info" },
}, {
{ "text": "Monitor-All logs: `cat /var/log/ping-instances.log`",
"text": "After changes have been saved, `systemctl daemon-reload` and start the service: `systemctl start ping-instances`", "type": "info"
"type": "info" }
}, ]
{
"text": "Monitor-All logs: `cat /var/log/ping-instances.log`",
"type": "info"
}
]
} }

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox VE Netdata", "name": "Proxmox VE Netdata",
"slug": "netdata", "slug": "netdata",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "addon",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": "https://www.netdata.cloud/",
"documentation": null, "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/netdata.svg",
"website": "https://www.netdata.cloud/", "description": "Netdata is an open-source, real-time performance monitoring tool designed to provide insights into the performance and health of systems and applications. It is often used by system administrators, DevOps professionals, and developers to monitor and troubleshoot issues on servers and other devices.",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/netdata.svg", "install_methods": [
"description": "Netdata is an open-source, real-time performance monitoring tool designed to provide insights into the performance and health of systems and applications. It is often used by system administrators, DevOps professionals, and developers to monitor and troubleshoot issues on servers and other devices.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/netdata.sh",
"type": "default", "resources": {
"script": "misc/netdata.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
} }
]
}

View File

@@ -2,7 +2,7 @@
"name": "NextPVR", "name": "NextPVR",
"slug": "nextpvr", "slug": "nextpvr",
"categories": [ "categories": [
15 13
], ],
"date_created": "2024-11-20", "date_created": "2024-11-20",
"type": "ct", "type": "ct",

View File

@@ -1,39 +1,37 @@
{ {
"name": "OliveTin", "name": "OliveTin",
"slug": "olivetin", "slug": "olivetin",
"categories": [ "categories": [10],
10 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": 1337,
"privileged": false, "documentation": null,
"interface_port": 1337, "website": "https://www.olivetin.app/",
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/olivetin.svg",
"website": "https://www.olivetin.app/", "description": "OliveTin provides a secure and straightforward way to execute pre-determined shell commands through a web-based interface.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/olivetin.svg", "install_methods": [
"description": "OliveTin provides a secure and straightforward way to execute pre-determined shell commands through a web-based interface.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/olivetin.sh",
"type": "default", "resources": {
"script": "misc/olivetin.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Configuration Path: `/etc/OliveTin/config.yaml`",
{ "type": "info"
"text": "Configuration Path: `/etc/OliveTin/config.yaml`", }
"type": "info" ]
} }
]
}

View File

@@ -0,0 +1,43 @@
{
"name": "openziti-tunnel",
"slug": "openziti-tunnel",
"categories": [
4
],
"date_created": "2025-04-02",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": null,
"documentation": "https://openziti.io/docs/reference/tunnelers/docker/",
"website": "https://www.openziti.io/",
"logo": "https://raw.githubusercontent.com/openziti/ziti-doc/main/docusaurus/static/img/ziti-logo-dark.svg",
"description": "OpenZiti is an open-source, zero trust networking platform that enables secure connectivity between applications, services, and devices. It provides secure, encrypted connections between clients and services, and can be used to create secure, zero trust networks.",
"install_methods": [
{
"type": "default",
"script": "ct/openziti-tunnel.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 2,
"os": "Ubuntu",
"version": "24.04"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "The Openziti tunnel is installed in host mode; please see documentation for more information",
"type": "info"
},
{
"text": "Openziti tunnel prompts for identity enrollment token during installation",
"type": "info"
}
]
}

View File

@@ -1,43 +1,41 @@
{ {
"name": "Proxmox Backup Server Processor Microcode", "name": "Proxmox Backup Server Processor Microcode",
"slug": "pbs-microcode", "slug": "pbs-microcode",
"categories": [ "categories": [1],
1 "date_created": "2025-02-07",
], "type": "pve",
"date_created": "2025-02-07", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/processor.png?raw=true",
"website": null, "description": "Processor Microcode is a layer of low-level software that runs on the processor and provides patches or updates to its firmware. Microcode updates can fix hardware bugs, improve performance, and enhance security features of the processor. This script is adapted for the Proxmox Backup Server environment and will only run on bare metal systems. If running in a virtualized environment, the script will exit. Note that firmware update mechanisms, such as Intel's Management Engine (ME) or AMD's Platform Security Processor (PSP), may vary depending on your processor and its implementation. Please consult your processor's documentation to verify if firmware updates can be applied through the operating system.",
"logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/processor.png?raw=true", "install_methods": [
"description": "Processor Microcode is a layer of low-level software that runs on the processor and provides patches or updates to its firmware. Microcode updates can fix hardware bugs, improve performance, and enhance security features of the processor. This script is adapted for the Proxmox Backup Server environment and will only run on bare metal systems. If running in a virtualized environment, the script will exit. Note that firmware update mechanisms, such as Intel's Management Engine (ME) or AMD's Platform Security Processor (PSP), may vary depending on your processor and its implementation. Please consult your processor's documentation to verify if firmware updates can be applied through the operating system.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/pbs_microcode.sh",
"type": "default", "resources": {
"script": "misc/pbs_microcode.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox Backup Server shell on a bare metal system. The script will exit if it detects that it is running in a virtualized environment.",
"type": "info"
}, },
"notes": [ {
{ "text": "After a reboot, you can check whether any microcode updates are currently in effect by running the following command: `journalctl -k | grep -E \"microcode\" | head -n 1`",
"text": "Execute within the Proxmox Backup Server shell on a bare metal system. The script will exit if it detects that it is running in a virtualized environment.", "type": "info"
"type": "info" }
}, ]
{
"text": "After a reboot, you can check whether any microcode updates are currently in effect by running the following command: `journalctl -k | grep -E \"microcode\" | head -n 1`",
"type": "info"
}
]
} }

View File

@@ -1,47 +1,45 @@
{ {
"name": "Proxmox Backup Server Post Install", "name": "Proxmox Backup Server Post Install",
"slug": "post-pbs-install", "slug": "post-pbs-install",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "The script will give options to Disable the Enterprise Repo, Add/Correct PBS Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Backup Server and Reboot PBS.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "The script will give options to Disable the Enterprise Repo, Add/Correct PBS Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Backup Server and Reboot PBS.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/post-pbs-install.sh",
"type": "default", "resources": {
"script": "misc/post-pbs-install.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Proxmox Backup Server ONLY",
"type": "info"
}, },
"notes": [ {
{ "text": "Execute within the Proxmox Backup Server Shell",
"text": "Proxmox Backup Server ONLY", "type": "info"
"type": "info" },
}, {
{ "text": "It is recommended to answer “yes” (y) to all options presented during the process.",
"text": "Execute within the Proxmox Backup Server Shell", "type": "info"
"type": "info" }
}, ]
{ }
"text": "It is recommended to answer “yes” (y) to all options presented during the process.",
"type": "info"
}
]
}

View File

@@ -1,47 +1,45 @@
{ {
"name": "Proxmox Mail Gateway Post Install", "name": "Proxmox Mail Gateway Post Install",
"slug": "post-pmg-install", "slug": "post-pmg-install",
"categories": [ "categories": [1],
1 "date_created": "2025-01-20",
], "type": "pve",
"date_created": "2025-01-20", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "The script will give options to Disable the Enterprise Repo, Add/Correct PMG Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Mail Gateway and Reboot PMG.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "The script will give options to Disable the Enterprise Repo, Add/Correct PMG Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Mail Gateway and Reboot PMG.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/post-pmg-install.sh",
"type": "default", "resources": {
"script": "misc/post-pmg-install.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Proxmox Mail Gateway ONLY",
"type": "warning"
}, },
"notes": [ {
{ "text": "Execute within the Proxmox Mail Gateway Shell",
"text": "Proxmox Mail Gateway ONLY", "type": "info"
"type": "warning" },
}, {
{ "text": "It is recommended to answer “yes” (y) to all options presented during the process.",
"text": "Execute within the Proxmox Mail Gateway Shell", "type": "info"
"type": "info" }
}, ]
{ }
"text": "It is recommended to answer “yes” (y) to all options presented during the process.",
"type": "info"
}
]
}

View File

@@ -1,43 +1,41 @@
{ {
"name": "Proxmox VE Post Install", "name": "Proxmox VE Post Install",
"slug": "post-pve-install", "slug": "post-pve-install",
"categories": [ "categories": [1],
1 "date_created": "2024-04-28",
], "type": "pve",
"date_created": "2024-04-28", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg",
"website": null, "description": "This script provides options for managing Proxmox VE repositories, including disabling the Enterprise Repo, adding or correcting PVE sources, enabling the No-Subscription Repo, adding the test Repo, disabling the subscription nag, updating Proxmox VE, and rebooting the system.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", "install_methods": [
"description": "This script provides options for managing Proxmox VE repositories, including disabling the Enterprise Repo, adding or correcting PVE sources, enabling the No-Subscription Repo, adding the test Repo, disabling the subscription nag, updating Proxmox VE, and rebooting the system.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/post-pve-install.sh",
"type": "default", "resources": {
"script": "misc/post-pve-install.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}, },
"notes": [ {
{ "text": "It is recommended to answer “yes” (y) to all options presented during the process.",
"text": "Execute within the Proxmox shell", "type": "info"
"type": "info" }
}, ]
{ }
"text": "It is recommended to answer “yes” (y) to all options presented during the process.",
"type": "info"
}
]
}

View File

@@ -1,39 +1,48 @@
{ {
"name": "PostgreSQL", "name": "PostgreSQL",
"slug": "postgresql", "slug": "postgresql",
"categories": [ "categories": [8],
8 "date_created": "2024-05-02",
], "type": "ct",
"date_created": "2024-05-02", "updateable": false,
"type": "ct", "privileged": false,
"updateable": false, "interface_port": 5432,
"privileged": false, "documentation": null,
"interface_port": 5432, "website": "https://www.postgresql.org/",
"documentation": null, "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/postgresql.svg",
"website": "https://www.postgresql.org/", "description": "PostgreSQL (often referred to as Postgres) is an open-source relational database management system that is known for its extensibility and strict adherence to SQL standards. It is a free and powerful database solution, suitable for a wide range of applications, from small projects to large enterprise systems. PostgreSQL is widely used for its reliability, feature-richness, and robustness.",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/postgresql.svg", "install_methods": [
"description": "PostgreSQL (often referred to as Postgres) is an open-source relational database management system that is known for its extensibility and strict adherence to SQL standards. It is a free and powerful database solution, suitable for a wide range of applications, from small projects to large enterprise systems. PostgreSQL is widely used for its reliability, feature-richness, and robustness.", {
"install_methods": [ "type": "default",
{ "script": "ct/postgresql.sh",
"type": "default", "resources": {
"script": "ct/postgresql.sh", "cpu": 1,
"resources": { "ram": 1024,
"cpu": 1, "hdd": 4,
"ram": 1024, "os": "debian",
"hdd": 4, "version": "12"
"os": "debian", }
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
}, },
"notes": [ {
{ "type": "alpine",
"text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`", "script": "ct/alpine-postgresql.sh",
"type": "info" "resources": {
} "cpu": 1,
] "ram": 256,
} "hdd": 1,
"os": "alpine",
"version": "3.21"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`",
"type": "info"
}
]
}

View File

@@ -1,34 +1,34 @@
{ {
"name": "Prowlarr", "name": "Prowlarr",
"slug": "prowlarr", "slug": "prowlarr",
"categories": [ "categories": [
14 14
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
"updateable": false, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 9696, "interface_port": 9696,
"documentation": null, "documentation": null,
"website": "https://github.com/Prowlarr/Prowlarr", "website": "https://github.com/Prowlarr/Prowlarr",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/prowlarr.svg", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/prowlarr.svg",
"description": "Prowlarr is a software tool designed to integrate with various PVR (Personal Video Recorder) apps. It is built on a popular *arr .net/ReactJS base stack and serves as an indexer manager and proxy. Prowlarr makes it easy to manage and organize TV show and movie collections, by integrating with popular PVR apps and automating the downloading and organizing of media files. The software provides a web-based interface for managing and organizing TV shows and movies, making it easy to search and find content. Prowlarr also supports metadata management, including show and movie information, making it easy for users to keep their media collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing media collections, making it a valuable tool for media enthusiasts who want to keep their collection organized and up-to-date. With Prowlarr, users can enjoy their media collection from anywhere, making it a powerful tool for managing and sharing media files.", "description": "Prowlarr is a software tool designed to integrate with various PVR (Personal Video Recorder) apps. It is built on a popular *arr .net/ReactJS base stack and serves as an indexer manager and proxy. Prowlarr makes it easy to manage and organize TV show and movie collections, by integrating with popular PVR apps and automating the downloading and organizing of media files. The software provides a web-based interface for managing and organizing TV shows and movies, making it easy to search and find content. Prowlarr also supports metadata management, including show and movie information, making it easy for users to keep their media collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing media collections, making it a valuable tool for media enthusiasts who want to keep their collection organized and up-to-date. With Prowlarr, users can enjoy their media collection from anywhere, making it a powerful tool for managing and sharing media files.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/prowlarr.sh", "script": "ct/prowlarr.sh",
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
} }
], ],
"default_credentials": { "default_credentials": {
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": []
} }

View File

@@ -1,34 +1,34 @@
{ {
"name": "Radarr", "name": "Radarr",
"slug": "radarr", "slug": "radarr",
"categories": [ "categories": [
14 14
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
"updateable": false, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 7878, "interface_port": 7878,
"documentation": null, "documentation": null,
"website": "https://radarr.video/", "website": "https://radarr.video/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/radarr.svg", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/radarr.svg",
"description": "Radarr is a movie management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their movie collection with ease. Radarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Lidarr, to automate the downloading and organizing of movie files. The software provides a web-based interface for managing and organizing movies, making it easy to search and find titles, genres, and release dates. Radarr also supports metadata management, including movie posters and information, making it easy for users to keep their movie collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing movie collections, making it a valuable tool for movie enthusiasts who want to keep their collection organized and up-to-date. With Radarr, users can enjoy their movie collection from anywhere, making it a powerful tool for managing and sharing movie files.", "description": "Radarr is a movie management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their movie collection with ease. Radarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Lidarr, to automate the downloading and organizing of movie files. The software provides a web-based interface for managing and organizing movies, making it easy to search and find titles, genres, and release dates. Radarr also supports metadata management, including movie posters and information, making it easy for users to keep their movie collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing movie collections, making it a valuable tool for movie enthusiasts who want to keep their collection organized and up-to-date. With Radarr, users can enjoy their movie collection from anywhere, making it a powerful tool for managing and sharing movie files.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/radarr.sh", "script": "ct/radarr.sh",
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 1024, "ram": 1024,
"hdd": 4, "hdd": 4,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
} }
], ],
"default_credentials": { "default_credentials": {
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": []
} }

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox VE CPU Scaling Governor", "name": "Proxmox VE CPU Scaling Governor",
"slug": "scaling-governor", "slug": "scaling-governor",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": "https://www.kernel.org/doc/html/latest/admin-guide/pm/cpufreq.html?#generic-scaling-governors",
"interface_port": null, "website": null,
"documentation": "https://www.kernel.org/doc/html/latest/admin-guide/pm/cpufreq.html?#generic-scaling-governors", "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/cpu.png?raw=true",
"website": null, "description": "The CPU scaling governor determines how the CPU frequency is adjusted based on the workload, with the goal of either conserving power or improving performance. By scaling the frequency up or down, the operating system can optimize the CPU usage and conserve energy when possible. Generic Scaling Governors",
"logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/cpu.png?raw=true", "install_methods": [
"description": "The CPU scaling governor determines how the CPU frequency is adjusted based on the workload, with the goal of either conserving power or improving performance. By scaling the frequency up or down, the operating system can optimize the CPU usage and conserve energy when possible. Generic Scaling Governors", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/scaling-governor.sh",
"type": "default", "resources": {
"script": "misc/scaling-governor.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
}
]
} }

View File

@@ -32,7 +32,7 @@
}, },
"notes": [ "notes": [
{ {
"text": "See /opt/slskd/config/sksld.yml to add your Soulseek credentials", "text": "See /opt/slskd/config/slskd.yml to add your Soulseek credentials",
"type": "info" "type": "info"
}, },
{ {

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox VE LXC Updater", "name": "Proxmox VE LXC Updater",
"slug": "update-lxcs", "slug": "update-lxcs",
"categories": [ "categories": [1],
1 "date_created": "2024-04-29",
], "type": "pve",
"date_created": "2024-04-29", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg",
"website": null, "description": "This script has been created to simplify and speed up the process of updating all LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", "install_methods": [
"description": "This script has been created to simplify and speed up the process of updating all LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/update-lxcs.sh",
"type": "default", "resources": {
"script": "misc/update-lxcs.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
} }
]
}

View File

@@ -1,39 +1,37 @@
{ {
"name": "Proxmox Update Repositories", "name": "Proxmox Update Repositories",
"slug": "update-repo", "slug": "update-repo",
"categories": [ "categories": [1],
1 "date_created": "2024-11-04",
], "type": "pve",
"date_created": "2024-11-04", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": null,
"privileged": false, "documentation": null,
"interface_port": null, "website": null,
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg",
"website": null, "description": "This script updates repository links in LXC containers, replacing old links from the tteck repository with links to the new community-scripts repository to fix issues related to updating scripts.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", "install_methods": [
"description": "This script updates repository links in LXC containers, replacing old links from the tteck repository with links to the new community-scripts repository to fix issues related to updating scripts.", {
"install_methods": [ "type": "default",
{ "script": "tools/pve/update-repo.sh",
"type": "default", "resources": {
"script": "misc/update-repo.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": null,
"default_credentials": { "password": null
"username": null, },
"password": null "notes": [
}, {
"notes": [ "text": "Execute within the Proxmox shell",
{ "type": "info"
"text": "Execute within the Proxmox shell", }
"type": "info" ]
} }
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,39 +1,37 @@
{ {
"name": "Webmin System Administration", "name": "Webmin System Administration",
"slug": "webmin", "slug": "webmin",
"categories": [ "categories": [1],
1 "date_created": "2024-05-02",
], "type": "addon",
"date_created": "2024-05-02", "updateable": false,
"type": "misc", "privileged": false,
"updateable": false, "interface_port": 10000,
"privileged": false, "documentation": null,
"interface_port": 10000, "website": "https://webmin.com/",
"documentation": null, "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/webmin.svg",
"website": "https://webmin.com/", "description": "Webmin provides a graphical user interface (GUI) for tasks such as user account management, package management, file system configuration, network configuration, and more.",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/webmin.svg", "install_methods": [
"description": "Webmin provides a graphical user interface (GUI) for tasks such as user account management, package management, file system configuration, network configuration, and more.", {
"install_methods": [ "type": "default",
{ "script": "tools/addon/webmin.sh",
"type": "default", "resources": {
"script": "misc/webmin.sh", "cpu": null,
"resources": { "ram": null,
"cpu": null, "hdd": null,
"ram": null, "os": null,
"hdd": null, "version": null
"os": null, }
"version": null }
} ],
} "default_credentials": {
], "username": "root",
"default_credentials": { "password": "root"
"username": "root", },
"password": "root" "notes": [
}, {
"notes": [ "text": "Execute within an existing LXC Console",
{ "type": "info"
"text": "Execute within an existing LXC Console", }
"type": "info" ]
} }
]
}

View File

@@ -24,6 +24,17 @@
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
},
{
"type": "alpine",
"script": "ct/alpine-wireguard.sh",
"resources": {
"cpu": 1,
"ram": 256,
"hdd": 1,
"os": "alpine",
"version": "3.21"
}
} }
], ],
"default_credentials": { "default_credentials": {

View File

@@ -1,12 +1,12 @@
"use client"; "use client";
import React, { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import { Card, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { ChevronLeft, ChevronRight } from "lucide-react"; import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { Category } from "@/lib/types"; import { Category } from "@/lib/types";
import { ChevronLeft, ChevronRight } from "lucide-react";
import { useRouter } from "next/navigation";
import React, { useEffect, useState } from "react";
const defaultLogo = "/default-logo.png"; // Fallback logo path const defaultLogo = "/default-logo.png"; // Fallback logo path
const MAX_DESCRIPTION_LENGTH = 100; // Set max length for description const MAX_DESCRIPTION_LENGTH = 100; // Set max length for description
@@ -17,11 +17,11 @@ const formattedBadge = (type: string) => {
case "vm": case "vm":
return <Badge className="text-blue-500/75 border-blue-500/75 badge">VM</Badge>; return <Badge className="text-blue-500/75 border-blue-500/75 badge">VM</Badge>;
case "ct": case "ct":
return ( return <Badge className="text-yellow-500/75 border-yellow-500/75 badge">LXC</Badge>;
<Badge className="text-yellow-500/75 border-yellow-500/75 badge">LXC</Badge> case "pve":
); return <Badge className="text-orange-500/75 border-orange-500/75 badge">PVE</Badge>;
case "misc": case "addon":
return <Badge className="text-green-500/75 border-green-500/75 badge">MISC</Badge>; return <Badge className="text-green-500/75 border-green-500/75 badge">ADDON</Badge>;
} }
return null; return null;
}; };
@@ -100,9 +100,7 @@ const CategoryView = () => {
}; };
const truncateDescription = (text: string) => { const truncateDescription = (text: string) => {
return text.length > MAX_DESCRIPTION_LENGTH return text.length > MAX_DESCRIPTION_LENGTH ? `${text.slice(0, MAX_DESCRIPTION_LENGTH)}...` : text;
? `${text.slice(0, MAX_DESCRIPTION_LENGTH)}...`
: text;
}; };
const renderResources = (script: any) => { const renderResources = (script: any) => {
@@ -111,9 +109,24 @@ const CategoryView = () => {
const hdd = script.install_methods[0]?.resources.hdd; const hdd = script.install_methods[0]?.resources.hdd;
const resourceParts = []; const resourceParts = [];
if (cpu) resourceParts.push(<span key="cpu"><b>CPU:</b> {cpu}vCPU</span>); if (cpu)
if (ram) resourceParts.push(<span key="ram"><b>RAM:</b> {ram}MB</span>); resourceParts.push(
if (hdd) resourceParts.push(<span key="hdd"><b>HDD:</b> {hdd}GB</span>); <span key="cpu">
<b>CPU:</b> {cpu}vCPU
</span>,
);
if (ram)
resourceParts.push(
<span key="ram">
<b>RAM:</b> {ram}MB
</span>,
);
if (hdd)
resourceParts.push(
<span key="hdd">
<b>HDD:</b> {hdd}GB
</span>,
);
return resourceParts.length > 0 ? ( return resourceParts.length > 0 ? (
<div className="text-sm text-gray-400"> <div className="text-sm text-gray-400">

View File

@@ -1,12 +1,6 @@
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { OperatingSystems } from "@/config/siteConfig"; import { OperatingSystems } from "@/config/siteConfig";
import { PlusCircle, Trash2 } from "lucide-react"; import { PlusCircle, Trash2 } from "lucide-react";
import { memo, useCallback, useRef } from "react"; import { memo, useCallback, useRef } from "react";
@@ -20,21 +14,29 @@ type InstallMethodProps = {
setZodErrors: (zodErrors: z.ZodError | null) => void; setZodErrors: (zodErrors: z.ZodError | null) => void;
}; };
function InstallMethod({ function InstallMethod({ script, setScript, setIsValid, setZodErrors }: InstallMethodProps) {
script,
setScript,
setIsValid,
setZodErrors,
}: InstallMethodProps) {
const cpuRefs = useRef<(HTMLInputElement | null)[]>([]); const cpuRefs = useRef<(HTMLInputElement | null)[]>([]);
const ramRefs = useRef<(HTMLInputElement | null)[]>([]); const ramRefs = useRef<(HTMLInputElement | null)[]>([]);
const hddRefs = useRef<(HTMLInputElement | null)[]>([]); const hddRefs = useRef<(HTMLInputElement | null)[]>([]);
const addInstallMethod = useCallback(() => { const addInstallMethod = useCallback(() => {
setScript((prev) => { setScript((prev) => {
const { type, slug } = prev;
const newMethodType = "default";
let scriptPath = "";
if (type === "pve") {
scriptPath = `tools/pve/${slug}.sh`;
} else if (type === "addon") {
scriptPath = `tools/addon/${slug}.sh`;
} else {
scriptPath = `${type}/${slug}.sh`;
}
const method = InstallMethodSchema.parse({ const method = InstallMethodSchema.parse({
type: "default", type: newMethodType,
script: `${prev.type}/${prev.slug}.sh`, script: scriptPath,
resources: { resources: {
cpu: null, cpu: null,
ram: null, ram: null,
@@ -43,6 +45,7 @@ function InstallMethod({
version: null, version: null,
}, },
}); });
return { return {
...prev, ...prev,
install_methods: [...prev.install_methods, method], install_methods: [...prev.install_methods, method],
@@ -63,9 +66,7 @@ function InstallMethod({
if (key === "type") { if (key === "type") {
updatedMethod.script = updatedMethod.script =
value === "alpine" value === "alpine" ? `${prev.type}/alpine-${prev.slug}.sh` : `${prev.type}/${prev.slug}.sh`;
? `${prev.type}/alpine-${prev.slug}.sh`
: `${prev.type}/${prev.slug}.sh`;
// Set OS to Alpine and reset version if type is alpine // Set OS to Alpine and reset version if type is alpine
if (value === "alpine") { if (value === "alpine") {
@@ -112,10 +113,7 @@ function InstallMethod({
<h3 className="text-xl font-semibold">Install Methods</h3> <h3 className="text-xl font-semibold">Install Methods</h3>
{script.install_methods.map((method, index) => ( {script.install_methods.map((method, index) => (
<div key={index} className="space-y-2 border p-4 rounded"> <div key={index} className="space-y-2 border p-4 rounded">
<Select <Select value={method.type} onValueChange={(value) => updateInstallMethod(index, "type", value)}>
value={method.type}
onValueChange={(value) => updateInstallMethod(index, "type", value)}
>
<SelectTrigger> <SelectTrigger>
<SelectValue placeholder="Type" /> <SelectValue placeholder="Type" />
</SelectTrigger> </SelectTrigger>
@@ -205,9 +203,7 @@ function InstallMethod({
<SelectValue placeholder="Version" /> <SelectValue placeholder="Version" />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
{OperatingSystems.find( {OperatingSystems.find((os) => os.name === method.resources.os)?.versions.map((version) => (
(os) => os.name === method.resources.os,
)?.versions.map((version) => (
<SelectItem key={version.slug} value={version.name}> <SelectItem key={version.slug} value={version.name}>
{version.name} {version.name}
</SelectItem> </SelectItem>
@@ -215,22 +211,12 @@ function InstallMethod({
</SelectContent> </SelectContent>
</Select> </Select>
</div> </div>
<Button <Button variant="destructive" size="sm" type="button" onClick={() => removeInstallMethod(index)}>
variant="destructive"
size="sm"
type="button"
onClick={() => removeInstallMethod(index)}
>
<Trash2 className="mr-2 h-4 w-4" /> Remove Install Method <Trash2 className="mr-2 h-4 w-4" /> Remove Install Method
</Button> </Button>
</div> </div>
))} ))}
<Button <Button type="button" size="sm" disabled={script.install_methods.length >= 2} onClick={addInstallMethod}>
type="button"
size="sm"
disabled={script.install_methods.length >= 2}
onClick={addInstallMethod}
>
<PlusCircle className="mr-2 h-4 w-4" /> Add Install Method <PlusCircle className="mr-2 h-4 w-4" /> Add Install Method
</Button> </Button>
</> </>

View File

@@ -24,8 +24,8 @@ export const ScriptSchema = z.object({
slug: z.string().min(1, "Slug is required"), slug: z.string().min(1, "Slug is required"),
categories: z.array(z.number()), 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"), 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"], { type: z.enum(["vm", "ct", "pve", "addon", "turnkey"], {
errorMap: () => ({ message: "Type must be either 'vm', 'ct', 'misc' or 'turnkey'" }) errorMap: () => ({ message: "Type must be either 'vm', 'ct', 'pve', 'addon' or 'turnkey'" })
}), }),
updateable: z.boolean(), updateable: z.boolean(),
privileged: z.boolean(), privileged: z.boolean(),

View File

@@ -5,18 +5,8 @@ import { Button } from "@/components/ui/button";
import { Calendar } from "@/components/ui/calendar"; import { Calendar } from "@/components/ui/calendar";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
Popover, import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Switch } from "@/components/ui/switch"; import { Switch } from "@/components/ui/switch";
import { Textarea } from "@/components/ui/textarea"; import { Textarea } from "@/components/ui/textarea";
import { fetchCategories } from "@/lib/data"; import { fetchCategories } from "@/lib/data";
@@ -66,29 +56,37 @@ export default function JSONGenerator() {
.catch((error) => console.error("Error fetching categories:", error)); .catch((error) => console.error("Error fetching categories:", error));
}, []); }, []);
const updateScript = useCallback( const updateScript = useCallback((key: keyof Script, value: Script[keyof Script]) => {
(key: keyof Script, value: Script[keyof Script]) => { setScript((prev) => {
setScript((prev) => { const updated = { ...prev, [key]: value };
const updated = { ...prev, [key]: value };
if (key === "type" || key === "slug") { if (updated.slug && updated.type) {
updated.install_methods = updated.install_methods.map((method) => ({ updated.install_methods = updated.install_methods.map((method) => {
let scriptPath = "";
if (updated.type === "pve") {
scriptPath = `tools/pve/${updated.slug}.sh`;
} else if (updated.type === "addon") {
scriptPath = `tools/addon/${updated.slug}.sh`;
} else if (method.type === "alpine") {
scriptPath = `${updated.type}/alpine-${updated.slug}.sh`;
} else {
scriptPath = `${updated.type}/${updated.slug}.sh`;
}
return {
...method, ...method,
script: script: scriptPath,
method.type === "alpine" };
? `${updated.type}/alpine-${updated.slug}.sh` });
: `${updated.type}/${updated.slug}.sh`, }
}));
}
const result = ScriptSchema.safeParse(updated); const result = ScriptSchema.safeParse(updated);
setIsValid(result.success); setIsValid(result.success);
setZodErrors(result.success ? null : result.error); setZodErrors(result.success ? null : result.error);
return updated; return updated;
}); });
}, }, []);
[],
);
const handleCopy = useCallback(() => { const handleCopy = useCallback(() => {
navigator.clipboard.writeText(JSON.stringify(script, null, 2)); navigator.clipboard.writeText(JSON.stringify(script, null, 2));
@@ -101,13 +99,13 @@ export default function JSONGenerator() {
const jsonString = JSON.stringify(script, null, 2); const jsonString = JSON.stringify(script, null, 2);
const blob = new Blob([jsonString], { type: "application/json" }); const blob = new Blob([jsonString], { type: "application/json" });
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
const a = document.createElement("a"); const a = document.createElement("a");
a.href = url; a.href = url;
a.download = `${script.slug || "script"}.json`; a.download = `${script.slug || "script"}.json`;
document.body.appendChild(a); document.body.appendChild(a);
a.click(); a.click();
URL.revokeObjectURL(url); URL.revokeObjectURL(url);
document.body.removeChild(a); document.body.removeChild(a);
}, [script]); }, [script]);
@@ -120,16 +118,13 @@ export default function JSONGenerator() {
); );
const formattedDate = useMemo( const formattedDate = useMemo(
() => () => (script.date_created ? format(script.date_created, "PPP") : undefined),
script.date_created ? format(script.date_created, "PPP") : undefined,
[script.date_created], [script.date_created],
); );
const validationAlert = useMemo( const validationAlert = useMemo(
() => ( () => (
<Alert <Alert className={cn("text-black", isValid ? "bg-green-100" : "bg-red-100")}>
className={cn("text-black", isValid ? "bg-green-100" : "bg-red-100")}
>
<AlertTitle>{isValid ? "Valid JSON" : "Invalid JSON"}</AlertTitle> <AlertTitle>{isValid ? "Valid JSON" : "Invalid JSON"}</AlertTitle>
<AlertDescription> <AlertDescription>
{isValid {isValid
@@ -160,21 +155,13 @@ export default function JSONGenerator() {
<Label> <Label>
Name <span className="text-red-500">*</span> Name <span className="text-red-500">*</span>
</Label> </Label>
<Input <Input placeholder="Example" value={script.name} onChange={(e) => updateScript("name", e.target.value)} />
placeholder="Example"
value={script.name}
onChange={(e) => updateScript("name", e.target.value)}
/>
</div> </div>
<div> <div>
<Label> <Label>
Slug <span className="text-red-500">*</span> Slug <span className="text-red-500">*</span>
</Label> </Label>
<Input <Input placeholder="example" value={script.slug} onChange={(e) => updateScript("slug", e.target.value)} />
placeholder="example"
value={script.slug}
onChange={(e) => updateScript("slug", e.target.value)}
/>
</div> </div>
</div> </div>
<div> <div>
@@ -197,11 +184,7 @@ export default function JSONGenerator() {
onChange={(e) => updateScript("description", e.target.value)} onChange={(e) => updateScript("description", e.target.value)}
/> />
</div> </div>
<Categories <Categories script={script} setScript={setScript} categories={categories} />
script={script}
setScript={setScript}
categories={categories}
/>
<div className="flex gap-2"> <div className="flex gap-2">
<div className="flex flex-col gap-2 w-full"> <div className="flex flex-col gap-2 w-full">
<Label>Date Created</Label> <Label>Date Created</Label>
@@ -209,10 +192,7 @@ export default function JSONGenerator() {
<PopoverTrigger asChild className="flex-1"> <PopoverTrigger asChild className="flex-1">
<Button <Button
variant={"outline"} variant={"outline"}
className={cn( className={cn("pl-3 text-left font-normal w-full", !script.date_created && "text-muted-foreground")}
"pl-3 text-left font-normal w-full",
!script.date_created && "text-muted-foreground",
)}
> >
{formattedDate || <span>Pick a date</span>} {formattedDate || <span>Pick a date</span>}
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" /> <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
@@ -230,38 +210,26 @@ export default function JSONGenerator() {
</div> </div>
<div className="flex flex-col gap-2 w-full"> <div className="flex flex-col gap-2 w-full">
<Label>Type</Label> <Label>Type</Label>
<Select <Select value={script.type} onValueChange={(value) => updateScript("type", value)}>
value={script.type}
onValueChange={(value) => updateScript("type", value)}
>
<SelectTrigger className="flex-1"> <SelectTrigger className="flex-1">
<SelectValue placeholder="Type" /> <SelectValue placeholder="Type" />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectItem value="ct">LXC Container</SelectItem> <SelectItem value="ct">LXC Container</SelectItem>
<SelectItem value="vm">Virtual Machine</SelectItem> <SelectItem value="vm">Virtual Machine</SelectItem>
<SelectItem value="misc">Miscellaneous</SelectItem> <SelectItem value="pve">PVE-Tool</SelectItem>
<SelectItem value="addon">Add-On</SelectItem>
</SelectContent> </SelectContent>
</Select> </Select>
</div> </div>
</div> </div>
<div className="w-full flex gap-5"> <div className="w-full flex gap-5">
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<Switch <Switch checked={script.updateable} onCheckedChange={(checked) => updateScript("updateable", checked)} />
checked={script.updateable}
onCheckedChange={(checked) =>
updateScript("updateable", checked)
}
/>
<label>Updateable</label> <label>Updateable</label>
</div> </div>
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<Switch <Switch checked={script.privileged} onCheckedChange={(checked) => updateScript("privileged", checked)} />
checked={script.privileged}
onCheckedChange={(checked) =>
updateScript("privileged", checked)
}
/>
<label>Privileged</label> <label>Privileged</label>
</div> </div>
</div> </div>
@@ -269,12 +237,7 @@ export default function JSONGenerator() {
placeholder="Interface Port" placeholder="Interface Port"
type="number" type="number"
value={script.interface_port || ""} value={script.interface_port || ""}
onChange={(e) => onChange={(e) => updateScript("interface_port", e.target.value ? Number(e.target.value) : null)}
updateScript(
"interface_port",
e.target.value ? Number(e.target.value) : null,
)
}
/> />
<div className="flex gap-2"> <div className="flex gap-2">
<Input <Input
@@ -285,17 +248,10 @@ export default function JSONGenerator() {
<Input <Input
placeholder="Documentation URL" placeholder="Documentation URL"
value={script.documentation || ""} value={script.documentation || ""}
onChange={(e) => onChange={(e) => updateScript("documentation", e.target.value || null)}
updateScript("documentation", e.target.value || null)
}
/> />
</div> </div>
<InstallMethod <InstallMethod script={script} setScript={setScript} setIsValid={setIsValid} setZodErrors={setZodErrors} />
script={script}
setScript={setScript}
setIsValid={setIsValid}
setZodErrors={setZodErrors}
/>
<h3 className="text-xl font-semibold">Default Credentials</h3> <h3 className="text-xl font-semibold">Default Credentials</h3>
<Input <Input
placeholder="Username" placeholder="Username"
@@ -317,34 +273,21 @@ export default function JSONGenerator() {
}) })
} }
/> />
<Note <Note script={script} setScript={setScript} setIsValid={setIsValid} setZodErrors={setZodErrors} />
script={script}
setScript={setScript}
setIsValid={setIsValid}
setZodErrors={setZodErrors}
/>
</form> </form>
</div> </div>
<div className="w-1/2 p-4 bg-background overflow-y-auto"> <div className="w-1/2 p-4 bg-background overflow-y-auto">
{validationAlert} {validationAlert}
<div className="relative"> <div className="relative">
<div className="absolute right-2 top-2 flex gap-1"> <div className="absolute right-2 top-2 flex gap-1">
<Button <Button size="icon" variant="outline" onClick={handleCopy}>
size="icon"
variant="outline"
onClick={handleCopy}
>
{isCopied ? <Check className="h-4 w-4" /> : <Clipboard className="h-4 w-4" />} {isCopied ? <Check className="h-4 w-4" /> : <Clipboard className="h-4 w-4" />}
</Button> </Button>
<Button <Button size="icon" variant="outline" onClick={handleDownload}>
size="icon"
variant="outline"
onClick={handleDownload}
>
<Download className="h-4 w-4" /> <Download className="h-4 w-4" />
</Button> </Button>
</div> </div>
<pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll"> <pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll">
{JSON.stringify(script, null, 2)} {JSON.stringify(script, null, 2)}
</pre> </pre>

View File

@@ -42,10 +42,6 @@ export const metadata : Metadata = {
alternates: { alternates: {
canonical: `https://community-scripts.github.io/${basePath}/`, canonical: `https://community-scripts.github.io/${basePath}/`,
}, },
icons: {
icon: "/favicon.ico",
apple: "/apple-touch-icon.png",
},
viewport: { viewport: {
width: "device-width", width: "device-width",
initialScale: 1, initialScale: 1,

View File

@@ -1,4 +1,5 @@
"use client"; "use client";
import FAQ from "@/components/FAQ";
import AnimatedGradientText from "@/components/ui/animated-gradient-text"; import AnimatedGradientText from "@/components/ui/animated-gradient-text";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { CardFooter } from "@/components/ui/card"; import { CardFooter } from "@/components/ui/card";
@@ -34,104 +35,109 @@ export default function Page() {
}, [theme]); }, [theme]);
return ( return (
<div className="w-full mt-16"> <>
<Particles <div className="w-full mt-16">
className="absolute inset-0 -z-40" <Particles className="absolute inset-0 -z-40" quantity={100} ease={80} color={color} refresh />
quantity={100} <div className="container mx-auto">
ease={80} <div className="flex h-[80vh] flex-col items-center justify-center gap-4 py-20 lg:py-40">
color={color} <Dialog>
refresh <DialogTrigger>
/> <div>
<div className="container mx-auto"> <AnimatedGradientText>
<div className="flex h-[80vh] flex-col items-center justify-center gap-4 py-20 lg:py-40"> <div
<Dialog> className={cn(
<DialogTrigger> `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)]`,
<div> `p-px ![mask-composite:subtract]`,
<AnimatedGradientText> )}
<div />
className={cn( <Separator className="mx-2 h-4" orientation="vertical" />
`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)]`, <span
`p-px ![mask-composite:subtract]`, 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`,
<Separator className="mx-2 h-4" orientation="vertical" /> )}
<span >
className={cn( Scripts by tteck
`animate-gradient bg-gradient-to-r from-[#ffaa40] via-[#9c40ff] to-[#ffaa40] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent`, </span>
`inline`, </AnimatedGradientText>
)} </div>
> </DialogTrigger>
Scripts by tteck <DialogContent>
</span> <DialogHeader>
</AnimatedGradientText> <DialogTitle>Thank You!</DialogTitle>
</div> <DialogDescription>
</DialogTrigger> A big thank you to tteck and the many contributors who have made this project possible. Your hard
<DialogContent> work is truly appreciated by the entire Proxmox community!
<DialogHeader> </DialogDescription>
<DialogTitle>Thank You!</DialogTitle> </DialogHeader>
<DialogDescription> <CardFooter className="flex flex-col gap-2">
A big thank you to tteck and the many contributors who have <Button className="w-full" variant="outline" asChild>
made this project possible. Your hard work is truly <a
appreciated by the entire Proxmox community! href="https://github.com/tteck"
</DialogDescription> target="_blank"
</DialogHeader> rel="noopener noreferrer"
<CardFooter className="flex flex-col gap-2"> className="flex items-center justify-center"
<Button className="w-full" variant="outline" asChild> >
<a <FaGithub className="mr-2 h-4 w-4" /> Tteck&apos;s GitHub
href="https://github.com/tteck" </a>
target="_blank" </Button>
rel="noopener noreferrer" <Button className="w-full" asChild>
className="flex items-center justify-center" <a
> href={`https://github.com/community-scripts/${basePath}`}
<FaGithub className="mr-2 h-4 w-4" /> Tteck&apos;s GitHub target="_blank"
</a> rel="noopener noreferrer"
</Button> className="flex items-center justify-center"
<Button className="w-full" asChild> >
<a <ExternalLink className="mr-2 h-4 w-4" /> Proxmox Helper Scripts
href={`https://github.com/community-scripts/${basePath}`} </a>
target="_blank" </Button>
rel="noopener noreferrer" </CardFooter>
className="flex items-center justify-center" </DialogContent>
> </Dialog>
<ExternalLink className="mr-2 h-4 w-4" /> Proxmox Helper
Scripts
</a>
</Button>
</CardFooter>
</DialogContent>
</Dialog>
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
<h1 className="max-w-2xl text-center text-3xl font-semibold tracking-tighter md:text-7xl"> <h1 className="max-w-2xl text-center text-3xl font-semibold tracking-tighter md:text-7xl">
Make managing your Homelab a breeze Make managing your Homelab a breeze
</h1> </h1>
<div className="max-w-2xl gap-2 flex flex-col text-center sm:text-lg text-sm leading-relaxed tracking-tight text-muted-foreground md:text-xl"> <div className="max-w-2xl gap-2 flex flex-col text-center sm:text-lg text-sm leading-relaxed tracking-tight text-muted-foreground md:text-xl">
<p> <p>
We are a community-driven initiative that simplifies the setup We are a community-driven initiative that simplifies the setup of Proxmox Virtual Environment (VE).
of Proxmox Virtual Environment (VE). </p>
</p> <p>
<p> With 300+ scripts to help you manage your <b>Proxmox VE environment</b>. Whether you&#39;re a seasoned
With 300+ scripts to help you manage your{" "} user or a newcomer, we&#39;ve got you covered.
<b>Proxmox VE environment</b>. Whether you&#39;re a seasoned </p>
user or a newcomer, we&#39;ve got you covered. </div>
</p> </div>
</div> <div className="flex flex-row gap-3">
</div> <Link href="/scripts">
<div className="flex flex-row gap-3"> <Button
<Link href="/scripts"> size="lg"
<Button variant="expandIcon"
size="lg" Icon={CustomArrowRightIcon}
variant="expandIcon" iconPlacement="right"
Icon={CustomArrowRightIcon} className="hover:"
iconPlacement="right" >
className="hover:" View Scripts
> </Button>
View Scripts </Link>
</Button> </div>
</Link> </div>
</div>
</div> {/* FAQ Section */}
</div> <div className="py-20" id="faq">
</div> <div className="max-w-4xl mx-auto px-4">
); <div className="text-center mb-12">
<h2 className="text-3xl font-bold tracking-tighter md:text-5xl mb-4">Frequently Asked Questions</h2>
<p className="text-muted-foreground text-lg">
Find answers to common questions about our Proxmox VE scripts
</p>
</div>
<FAQ />
</div>
</div>
</div>
</div>
</>
);
} }

View File

@@ -56,7 +56,7 @@ export default function ScriptAccordion({
value={expandedItem} value={expandedItem}
onValueChange={handleAccordionChange} onValueChange={handleAccordionChange}
collapsible collapsible
className="overflow-y-scroll max-h-[calc(100vh-220px)] overflow-x-hidden mt-3 p-2" className="overflow-y-scroll max-h-[calc(100vh-225px)] overflow-x-hidden mt-3 p-2"
> >
{items.map((category) => ( {items.map((category) => (
<AccordionItem <AccordionItem

View File

@@ -1,12 +1,5 @@
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card";
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { basePath, mostPopularScripts } from "@/config/siteConfig"; import { basePath, mostPopularScripts } from "@/config/siteConfig";
import { extractDate } from "@/lib/time"; import { extractDate } from "@/lib/time";
import { Category, Script } from "@/lib/types"; import { Category, Script } from "@/lib/types";
@@ -23,7 +16,8 @@ export const getDisplayValueFromType = (type: string) => {
return "LXC"; return "LXC";
case "vm": case "vm":
return "VM"; return "VM";
case "misc": case "pve":
case "addon":
return ""; return "";
default: default:
return ""; return "";
@@ -35,7 +29,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
const latestScripts = useMemo(() => { const latestScripts = useMemo(() => {
if (!items) return []; if (!items) return [];
const scripts = items.flatMap((category) => category.scripts || []); const scripts = items.flatMap((category) => category.scripts || []);
// Filter out duplicates by slug // Filter out duplicates by slug
@@ -47,8 +41,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
}); });
return Array.from(uniqueScriptsMap.values()).sort( return Array.from(uniqueScriptsMap.values()).sort(
(a, b) => (a, b) => new Date(b.date_created).getTime() - new Date(a.date_created).getTime(),
new Date(b.date_created).getTime() - new Date(a.date_created).getTime(),
); );
}, [items]); }, [items]);
@@ -59,7 +52,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
const goToPreviousPage = () => { const goToPreviousPage = () => {
setPage((prevPage) => prevPage - 1); setPage((prevPage) => prevPage - 1);
}; };
const startIndex = (page - 1) * ITEMS_PER_PAGE; const startIndex = (page - 1) * ITEMS_PER_PAGE;
const endIndex = page * ITEMS_PER_PAGE; const endIndex = page * ITEMS_PER_PAGE;
@@ -74,18 +67,12 @@ export function LatestScripts({ items }: { items: Category[] }) {
<h2 className="text-lg font-semibold">Newest Scripts</h2> <h2 className="text-lg font-semibold">Newest Scripts</h2>
<div className="flex items-center justify-end gap-1"> <div className="flex items-center justify-end gap-1">
{page > 1 && ( {page > 1 && (
<div <div className="cursor-pointer select-none p-2 text-sm font-semibold" onClick={goToPreviousPage}>
className="cursor-pointer select-none p-2 text-sm font-semibold"
onClick={goToPreviousPage}
>
Previous Previous
</div> </div>
)} )}
{endIndex < latestScripts.length && ( {endIndex < latestScripts.length && (
<div <div onClick={goToNextPage} className="cursor-pointer select-none p-2 text-sm font-semibold">
onClick={goToNextPage}
className="cursor-pointer select-none p-2 text-sm font-semibold"
>
{page === 1 ? "More.." : "Next"} {page === 1 ? "More.." : "Next"}
</div> </div>
)} )}
@@ -94,10 +81,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
)} )}
<div className="min-w flex w-full flex-row flex-wrap gap-4"> <div className="min-w flex w-full flex-row flex-wrap gap-4">
{latestScripts.slice(startIndex, endIndex).map((script) => ( {latestScripts.slice(startIndex, endIndex).map((script) => (
<Card <Card key={script.slug} className="min-w-[250px] flex-1 flex-grow bg-accent/30">
key={script.slug}
className="min-w-[250px] flex-1 flex-grow bg-accent/30"
>
<CardHeader> <CardHeader>
<CardTitle className="flex items-center gap-3"> <CardTitle className="flex items-center gap-3">
<div className="flex h-16 w-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1"> <div className="flex h-16 w-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1">
@@ -107,10 +91,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
height={64} height={64}
width={64} width={64}
alt="" alt=""
onError={(e) => onError={(e) => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
className="h-11 w-11 object-contain" className="h-11 w-11 object-contain"
/> />
</div> </div>
@@ -126,9 +107,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
</CardTitle> </CardTitle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<CardDescription className="line-clamp-3 text-card-foreground"> <CardDescription className="line-clamp-3 text-card-foreground">{script.description}</CardDescription>
{script.description}
</CardDescription>
</CardContent> </CardContent>
<CardFooter className=""> <CardFooter className="">
<Button asChild variant="outline"> <Button asChild variant="outline">
@@ -151,9 +130,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
export function MostViewedScripts({ items }: { items: Category[] }) { export function MostViewedScripts({ items }: { items: Category[] }) {
const mostViewedScripts = items.reduce((acc: Script[], category) => { const mostViewedScripts = items.reduce((acc: Script[], category) => {
const foundScripts = category.scripts.filter((script) => const foundScripts = category.scripts.filter((script) => mostPopularScripts.includes(script.slug));
mostPopularScripts.includes(script.slug),
);
return acc.concat(foundScripts); return acc.concat(foundScripts);
}, []); }, []);
@@ -166,10 +143,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) {
)} )}
<div className="min-w flex w-full flex-row flex-wrap gap-4"> <div className="min-w flex w-full flex-row flex-wrap gap-4">
{mostViewedScripts.map((script) => ( {mostViewedScripts.map((script) => (
<Card <Card key={script.slug} className="min-w-[250px] flex-1 flex-grow bg-accent/30">
key={script.slug}
className="min-w-[250px] flex-1 flex-grow bg-accent/30"
>
<CardHeader> <CardHeader>
<CardTitle className="flex items-center gap-3"> <CardTitle className="flex items-center gap-3">
<div className="flex size-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1"> <div className="flex size-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1">
@@ -179,10 +153,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) {
height={64} height={64}
width={64} width={64}
alt="" alt=""
onError={(e) => onError={(e) => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
className="h-11 w-11 object-contain" className="h-11 w-11 object-contain"
/> />
</div> </div>

View File

@@ -14,12 +14,12 @@ import { Suspense } from "react";
import { ResourceDisplay } from "./ResourceDisplay"; import { ResourceDisplay } from "./ResourceDisplay";
import { getDisplayValueFromType } from "./ScriptInfoBlocks"; import { getDisplayValueFromType } from "./ScriptInfoBlocks";
import Alerts from "./ScriptItems/Alerts"; import Alerts from "./ScriptItems/Alerts";
import Buttons from "./ScriptItems/Buttons";
import DefaultPassword from "./ScriptItems/DefaultPassword"; import DefaultPassword from "./ScriptItems/DefaultPassword";
import Description from "./ScriptItems/Description"; import Description from "./ScriptItems/Description";
import InstallCommand from "./ScriptItems/InstallCommand"; import InstallCommand from "./ScriptItems/InstallCommand";
import Tooltips from "./ScriptItems/Tooltips";
import InterFaces from "./ScriptItems/InterFaces"; import InterFaces from "./ScriptItems/InterFaces";
import Buttons from "./ScriptItems/Buttons"; import Tooltips from "./ScriptItems/Tooltips";
interface ScriptItemProps { interface ScriptItemProps {
item: Script; item: Script;
@@ -142,7 +142,9 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
<div className="mt-4 rounded-lg border shadow-sm"> <div className="mt-4 rounded-lg border shadow-sm">
<div className="flex gap-3 px-4 py-2 bg-accent/25"> <div className="flex gap-3 px-4 py-2 bg-accent/25">
<h2 className="text-lg font-semibold">How to {item.type === "misc" ? "use" : "install"}</h2> <h2 className="text-lg font-semibold">
How to {item.type === "pve" ? "use" : item.type === "addon" ? "apply" : "install"}
</h2>
<Tooltips item={item} /> <Tooltips item={item} />
</div> </div>
<Separator /> <Separator />

View File

@@ -16,7 +16,17 @@ const generateInstallSourceUrl = (slug: string) => {
const generateSourceUrl = (slug: string, type: string) => { const generateSourceUrl = (slug: string, type: string) => {
const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`; const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`;
return type === "vm" ? `${baseUrl}/vm/${slug}.sh` : `${baseUrl}/misc/${slug}.sh`;
switch (type) {
case "vm":
return `${baseUrl}/vm/${slug}.sh`;
case "pve":
return `${baseUrl}/tools/pve/${slug}.sh`;
case "addon":
return `${baseUrl}/tools/addon/${slug}.sh`;
default:
return `${baseUrl}/ct/${slug}.sh`; // fallback for "ct"
}
}; };
const generateUpdateUrl = (slug: string) => { const generateUpdateUrl = (slug: string) => {

View File

@@ -5,85 +5,73 @@ import { Script } from "@/lib/types";
import { getDisplayValueFromType } from "../ScriptInfoBlocks"; import { getDisplayValueFromType } from "../ScriptInfoBlocks";
const getInstallCommand = (scriptPath = "", isAlpine = false) => { const getInstallCommand = (scriptPath = "", isAlpine = false) => {
const url = `https://raw.githubusercontent.com/community-scripts/${basePath}/main/${scriptPath}`; const url = `https://raw.githubusercontent.com/community-scripts/${basePath}/main/${scriptPath}`;
return isAlpine return isAlpine ? `bash -c "$(curl -fsSL ${url})"` : `bash -c "$(curl -fsSL ${url})"`;
? `bash -c "$(curl -fsSL ${url})"`
: `bash -c "$(curl -fsSL ${url})"`;
}; };
export default function InstallCommand({ item }: { item: Script }) { export default function InstallCommand({ item }: { item: Script }) {
const alpineScript = item.install_methods.find( const alpineScript = item.install_methods.find((method) => method.type === "alpine");
(method) => method.type === "alpine",
);
const defaultScript = item.install_methods.find( const defaultScript = item.install_methods.find((method) => method.type === "default");
(method) => method.type === "default",
);
const renderInstructions = (isAlpine = false) => ( const renderInstructions = (isAlpine = false) => (
<>
<p className="text-sm mt-2">
{isAlpine ? (
<>
As an alternative option, you can use Alpine Linux and the {item.name} package to create a {item.name}{" "}
{getDisplayValueFromType(item.type)} container with faster creation time and minimal system resource usage.
You are also obliged to adhere to updates provided by the package maintainer.
</>
) : item.type === "pve" ? (
<>
To use the {item.name} script, run the command below **only** in the Proxmox VE Shell. This script is
intended for managing or enhancing the host system directly.
</>
) : item.type === "addon" ? (
<>
This script enhances an existing setup. You can use it inside a running LXC container or directly on the
Proxmox VE host to extend functionality with {item.name}.
</>
) : (
<>
To create a new Proxmox VE {item.name} {getDisplayValueFromType(item.type)}, run the command below in the
Proxmox VE Shell.
</>
)}
</p>
{isAlpine && (
<p className="mt-2 text-sm">
To create a new Proxmox VE Alpine-{item.name} {getDisplayValueFromType(item.type)}, run the command below in
the Proxmox VE Shell.
</p>
)}
</>
);
return (
<div className="p-4">
{alpineScript ? (
<Tabs defaultValue="default" className="mt-2 w-full max-w-4xl">
<TabsList>
<TabsTrigger value="default">Default</TabsTrigger>
<TabsTrigger value="alpine">Alpine Linux</TabsTrigger>
</TabsList>
<TabsContent value="default">
{renderInstructions()}
<CodeCopyButton>{getInstallCommand(defaultScript?.script)}</CodeCopyButton>
</TabsContent>
<TabsContent value="alpine">
{renderInstructions(true)}
<CodeCopyButton>{getInstallCommand(alpineScript.script, true)}</CodeCopyButton>
</TabsContent>
</Tabs>
) : defaultScript?.script ? (
<> <>
<p className="text-sm mt-2"> {renderInstructions()}
{isAlpine ? ( <CodeCopyButton>{getInstallCommand(defaultScript.script)}</CodeCopyButton>
<>
As an alternative option, you can use Alpine Linux and the{" "}
{item.name} package to create a {item.name}{" "}
{getDisplayValueFromType(item.type)} container with faster creation
time and minimal system resource usage. You are also obliged to
adhere to updates provided by the package maintainer.
</>
) : item.type == "misc" ? (
<>
To use the {item.name} script, run the command below in the shell.
</>
) : (
<>
{" "}
To create a new Proxmox VE {item.name}{" "}
{getDisplayValueFromType(item.type)}, run the command below in the
Proxmox VE Shell.
</>
)}
</p>
{isAlpine && (
<p className="mt-2 text-sm">
To create a new Proxmox VE Alpine-{item.name}{" "}
{getDisplayValueFromType(item.type)}, run the command below in the
Proxmox VE Shell
</p>
)}
</> </>
); ) : null}
</div>
return ( );
<div className="p-4"> }
{alpineScript ? (
<Tabs defaultValue="default" className="mt-2 w-full max-w-4xl">
<TabsList>
<TabsTrigger value="default">Default</TabsTrigger>
<TabsTrigger value="alpine">Alpine Linux</TabsTrigger>
</TabsList>
<TabsContent value="default">
{renderInstructions()}
<CodeCopyButton>
{getInstallCommand(defaultScript?.script)}
</CodeCopyButton>
</TabsContent>
<TabsContent value="alpine">
{renderInstructions(true)}
<CodeCopyButton>
{getInstallCommand(alpineScript.script, true)}
</CodeCopyButton>
</TabsContent>
</Tabs>
) : defaultScript?.script ? (
<>
{renderInstructions()}
<CodeCopyButton>
{getInstallCommand(defaultScript.script)}
</CodeCopyButton>
</>
) : null}
</div>
);
}

View File

@@ -6,6 +6,7 @@ import {
CommandItem, CommandItem,
CommandList, CommandList,
} from "@/components/ui/command"; } from "@/components/ui/command";
import { basePath } from "@/config/siteConfig";
import { fetchCategories } from "@/lib/data"; import { fetchCategories } from "@/lib/data";
import { Category } from "@/lib/types"; import { Category } from "@/lib/types";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
@@ -15,18 +16,17 @@ import React from "react";
import { Badge } from "./ui/badge"; import { Badge } from "./ui/badge";
import { Button } from "./ui/button"; import { Button } from "./ui/button";
import { DialogTitle } from "./ui/dialog"; import { DialogTitle } from "./ui/dialog";
import { basePath } from "@/config/siteConfig";
export const formattedBadge = (type: string) => { export const formattedBadge = (type: string) => {
switch (type) { switch (type) {
case "vm": case "vm":
return <Badge className="text-blue-500/75 border-blue-500/75">VM</Badge>; return <Badge className="text-blue-500/75 border-blue-500/75">VM</Badge>;
case "ct": case "ct":
return ( return <Badge className="text-yellow-500/75 border-yellow-500/75">LXC</Badge>;
<Badge className="text-yellow-500/75 border-yellow-500/75">LXC</Badge> case "pve":
); return <Badge className="text-orange-500/75 border-orange-500/75">PVE</Badge>;
case "misc": case "addon":
return <Badge className="text-green-500/75 border-green-500/75">MISC</Badge>; return <Badge className="text-green-500/75 border-green-500/75">ADDON</Badge>;
} }
return null; return null;
}; };
@@ -84,14 +84,9 @@ export default function CommandMenu() {
<DialogTitle className="sr-only">Search scripts</DialogTitle> <DialogTitle className="sr-only">Search scripts</DialogTitle>
<CommandInput placeholder="Search for a script..." /> <CommandInput placeholder="Search for a script..." />
<CommandList> <CommandList>
<CommandEmpty> <CommandEmpty>{isLoading ? "Loading..." : "No scripts found."}</CommandEmpty>
{isLoading ? "Loading..." : "No scripts found."}
</CommandEmpty>
{links.map((category) => ( {links.map((category) => (
<CommandGroup <CommandGroup key={`category:${category.name}`} heading={category.name}>
key={`category:${category.name}`}
heading={category.name}
>
{category.scripts.map((script) => ( {category.scripts.map((script) => (
<CommandItem <CommandItem
key={`script:${script.slug}`} key={`script:${script.slug}`}
@@ -104,10 +99,7 @@ export default function CommandMenu() {
<div className="flex gap-2" onClick={() => setOpen(false)}> <div className="flex gap-2" onClick={() => setOpen(false)}>
<Image <Image
src={script.logo || `/${basePath}/logo.png`} src={script.logo || `/${basePath}/logo.png`}
onError={(e) => onError={(e) => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
((e.currentTarget as HTMLImageElement).src =
`/${basePath}/logo.png`)
}
unoptimized unoptimized
width={16} width={16}
height={16} height={16}

View File

@@ -0,0 +1,29 @@
import * as AccordionPrimitive from "@radix-ui/react-accordion";
import { Plus } from "lucide-react";
import { FAQ_Items } from "../config/faqConfig";
import { Accordion, AccordionContent, AccordionItem } from "./ui/accordion";
export default function FAQ() {
return (
<div className="space-y-4">
<Accordion type="single" collapsible className="w-full">
{FAQ_Items.map((item, index) => (
<AccordionItem value={index.toString()} key={index} className="py-2">
<AccordionPrimitive.Header className="flex">
<AccordionPrimitive.Trigger className="flex flex-1 items-center gap-3 py-2 text-left text-[15px] font-semibold leading-6 transition-all [&>svg>path:last-child]:origin-center [&>svg>path:last-child]:transition-all [&>svg>path:last-child]:duration-200 [&>svg]:-order-1 [&[data-state=open]>svg>path:last-child]:rotate-90 [&[data-state=open]>svg>path:last-child]:opacity-0 [&[data-state=open]>svg]:rotate-180">
{item.title}
<Plus
size={16}
strokeWidth={2}
className="shrink-0 opacity-60 transition-transform duration-200"
aria-hidden="true"
/>
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>
<AccordionContent className="pb-2 ps-7 text-muted-foreground">{item.content}</AccordionContent>
</AccordionItem>
))}
</Accordion>
</div>
);
}

View File

@@ -6,13 +6,13 @@ import { cn } from "@/lib/utils";
export default function Footer() { export default function Footer() {
return ( return (
<div className="supports-backdrop-blur:bg-background/90 mt-auto border-t w-full flex justify-between border-border bg-background/40 py-6 backdrop-blur-lg"> <div className="supports-backdrop-blur:bg-background/90 mt-auto border-t w-full flex justify-between border-border bg-background/40 py-4 backdrop-blur-lg">
<div className="mx-6 w-full flex justify-between text-xs sm:text-sm text-muted-foreground"> <div className="mx-6 w-full flex justify-between text-xs sm:text-sm text-muted-foreground">
<div className="flex items-center"> <div className="flex items-center">
<p> <p>
Website built by the community. The source code is available on{" "} Website built by the community. The source code is available on{" "}
<Link <Link
href={`https://github.com/community-scripts/${basePath}`} href={`https://github.com/community-scripts/${basePath}/frontend`}
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
className="font-semibold underline-offset-2 duration-300 hover:underline" className="font-semibold underline-offset-2 duration-300 hover:underline"

View File

@@ -0,0 +1,37 @@
export const FAQ_Items = [
{
title: "Why do you use tarballs instead of git pull for installation?",
content:
"Our LXC scripts install applications using release tarballs. Tarballs contain stable code versions tested for release. Using `git pull` directly fetches the latest development code, which might be unstable or contain bugs. Tarballs offer a more reliable installation.",
},
{
title: "Why do the scripts install applications using HTTP by default?",
content:
"Our LXC scripts install applications using HTTP by default. Setting up HTTPS often requires manual configuration specific to your setup, which our automated scripts cannot handle reliably. If an application requires HTTPS, the script will configure it. For others, you need to enable HTTPS yourself, often following the application's official documentation.",
},
{
title: "Where can I find documentation for the installed application?",
content:
"We link to the official documentation for each application whenever possible. You can usually find this link on the script's information page for the specific LXC script. If you notice a missing link for an application that has official docs, please report it so we can add it.",
},
{
title: "What should I do if I find a bug in an LXC script?",
content:
"Our LXC scripts are maintained by volunteers in their free time. Bugs can occur due to our errors or changes in the applications themselves. If you find a bug in one of our LXC scripts, please report it on our GitHub issues page. Your feedback helps us improve the scripts.",
},
{
title: "Why isn't the application updating to the very latest version?",
content:
"Updates via our LXC scripts might not pull the absolute latest version for a few reasons:\n- A bug in the application's release naming on GitHub.\n- A bug in our update script.\n- We intentionally pinned the version. This happens if a newer version has breaking changes or serious bugs that could affect your data or LXC stability. We wait for fixes before allowing the update.",
},
{
title: 'Why am I getting a "502 Bad Gateway" error?',
content:
'A "502 Bad Gateway" error usually means the application inside the LXC is not running or responding correctly. Check the application\'s logs first. If you use a reverse proxy, check its logs too. If you still have problems after checking the logs, report the issue, providing details from the logs.',
},
{
title: "What should I do if a script fails during execution?",
content:
"If an LXC script fails, run it again using Verbose mode. Standard mode hides detailed output for neatness, showing only progress. Verbose mode displays all messages, which helps you (and us) diagnose the error. Include this verbose output if you report the issue.",
},
];

View File

@@ -5,7 +5,7 @@ export type Script = {
slug: string; slug: string;
categories: number[]; categories: number[];
date_created: string; date_created: string;
type: "vm" | "ct" | "misc"; type: "vm" | "ct" | "pve" | "addon";
updateable: boolean; updateable: boolean;
privileged: boolean; privileged: boolean;
interface_port: number | null; interface_port: number | null;
@@ -61,4 +61,4 @@ export interface AppVersion {
name: string; name: string;
version: string; version: string;
date: Date; date: Date;
} }

View File

@@ -17,7 +17,8 @@ msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y \
tini \ tini \
gpg \ gpg \
build-essential build-essential \
git
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository" msg_info "Setting up Node.js Repository"
@@ -33,11 +34,11 @@ $STD npm install --global yarn
msg_ok "Installed Node.js" msg_ok "Installed Node.js"
msg_info "Installing Actual Budget" msg_info "Installing Actual Budget"
cd /opt cd /opt || exit
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSL "https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz") curl -fsSL "https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz")
tar -xzf v${RELEASE}.tar.gz tar -xzf v"${RELEASE}".tar.gz
mv actual-${RELEASE} /opt/actualbudget mv actual-"${RELEASE}" /opt/actualbudget
mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config} mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
chown -R root:root /opt/actualbudget-data chown -R root:root /opt/actualbudget-data
@@ -53,8 +54,10 @@ ACTUAL_TRUSTED_PROXIES="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.1/32,::1
ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key
ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt
EOF EOF
cd /opt/actualbudget cd /opt/actualbudget || exit
$STD yarn workspaces focus @actual-app/sync-server --production export NODE_OPTIONS="--max_old_space_size=3072"
$STD yarn install
$STD yarn run build:server
$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF $STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
US US
California California
@@ -93,7 +96,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf /opt/v${RELEASE}.tar.gz rm -rf /opt/v"${RELEASE}".tar.gz
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@@ -15,41 +15,51 @@ update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apk add \ $STD apk add \
gpg \ gpg \
sudo sudo
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Installing MariaDB" msg_info "Installing MariaDB"
$STD apk add --no-cache mariadb mariadb-client $STD apk add --no-cache mariadb mariadb-client
$STD rc-update add mariadb default $STD rc-update add mariadb default
$STD rc-service mariadb start
msg_ok "Installed MariaDB" msg_ok "Installed MariaDB"
msg_info "Configuring MariaDB" msg_info "Configuring MariaDB"
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql >/dev/null 2>&1 mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql >/dev/null 2>&1
$STD rc-service mariadb restart $STD rc-service mariadb start
msg_ok "MariaDB Configured" msg_ok "MariaDB Configured"
read -r -p "Would you like to install Adminer with lighthttpd? <y/N>: " prompt read -r -p "Would you like to install Adminer with lighttpd? <y/N>: " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
msg_info "Installing Adminer" msg_info "Installing Adminer and dependencies"
$STD apk add --no-cache lighttpd php php-cgi php-mysqli php-mbstring php-zip php-gd php-json php-curl jq $STD apk add --no-cache \
sed -i 's|server.modules += ( "mod_cgi" )|server.modules += ( "mod_cgi", "mod_fastcgi" )|' /etc/lighttpd/lighttpd.conf lighttpd \
echo 'fastcgi.server += ( ".php" => (( "bin-path" => "/usr/bin/php-cgi", "socket" => "/var/run/php-cgi.sock" )))' >>/etc/lighttpd/lighttpd.conf lighttpd-openrc \
ADMINER_VERSION=$(curl -s https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/v//') php83 \
wget -q -O /var/www/adminer.php "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" php83-cgi \
chown lighttpd:lighttpd /var/www/adminer.php php83-common \
chmod 755 /var/www/adminer.php php83-curl \
msg_ok "Adminer Installed" php83-gd \
php83-mbstring \
php83-mysqli \
php83-mysqlnd \
php83-openssl \
php83-zip \
php83-session \
jq
msg_info "Starting Lighttpd" sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
$STD rc-update add lighttpd default mkdir -p /var/www/localhost/htdocs
$STD rc-service lighttpd restart ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
msg_ok "Lighttpd Started" curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
chown lighttpd:lighttpd /var/www/localhost/htdocs/adminer.php
chmod 755 /var/www/localhost/htdocs/adminer.php
msg_ok "Adminer Installed"
echo -e "Adminer is available at: ${BL}http://$(hostname -I | awk '{print $1}')/adminer${CL}" msg_info "Starting Lighttpd"
else $STD rc-update add lighttpd default
echo -e "Skipped Adminer Installation..." $STD rc-service lighttpd restart
msg_ok "Lighttpd Started"
fi fi
motd_ssh motd_ssh

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.postgresql.org/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing PostgreSQL"
$STD apk add --no-cache postgresql16 postgresql16-contrib postgresql16-openrc sudo
msg_ok "Installed PostgreSQL"
msg_info "Enabling PostgreSQL Service"
$STD rc-update add postgresql default
msg_ok "Enabled PostgreSQL Service"
msg_info "Starting PostgreSQL"
$STD rc-service postgresql start
msg_ok "Started PostgreSQL"
msg_info "Configuring PostgreSQL for External Access"
conf_file="/etc/postgresql16/postgresql.conf"
hba_file="/etc/postgresql16/pg_hba.conf"
sed -i 's/^#listen_addresses =.*/listen_addresses = '\''*'\''/' "$conf_file"
sed -i '/^host\s\+all\s\+all\s\+127.0.0.1\/32\s\+md5/ s/.*/host all all 0.0.0.0\/0 md5/' "$hba_file"
$STD rc-service postgresql restart
msg_ok "Configured and Restarted PostgreSQL"
read -r -p "Would you like to install Adminer with lighttpd? <y/N>: " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
msg_info "Installing Adminer and dependencies"
$STD apk add --no-cache \
lighttpd \
lighttpd-openrc \
php83 \
php83-cgi \
php83-common \
php83-curl \
php83-gd \
php83-mbstring \
php83-pdo \
php83-pgsql \
php83-openssl \
php83-zip \
php83-session \
jq
sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
mkdir -p /var/www/localhost/htdocs
ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
chown lighttpd:lighttpd /var/www/localhost/htdocs/adminer.php
chmod 755 /var/www/localhost/htdocs/adminer.php
msg_ok "Adminer Installed"
msg_info "Starting Lighttpd"
$STD rc-update add lighttpd default
$STD rc-service lighttpd restart
msg_ok "Lighttpd Started"
fi
motd_ssh
customize

View File

@@ -0,0 +1,106 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.wireguard.com/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apk add \
newt \
curl \
openssh \
nano \
mc \
gpg \
iptables \
openrc
msg_ok "Installed Dependencies"
msg_info "Installing WireGuard"
$STD apk add --no-cache wireguard-tools
if [[ ! -L /etc/init.d/wg-quick.wg0 ]]; then
ln -s /etc/init.d/wg-quick /etc/init.d/wg-quick.wg0
fi
private_key=$(wg genkey)
cat <<EOF >/etc/wireguard/wg0.conf
[Interface]
PrivateKey = ${private_key}
Address = 10.0.0.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;
ListenPort = 51820
EOF
echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
$STD rc-update add sysctl
$STD sysctl -p /etc/sysctl.conf
msg_ok "Installed WireGuard"
read -rp "Do you want to install WGDashboard? (y/N): " INSTALL_WGD
if [[ "$INSTALL_WGD" =~ ^[Yy]$ ]]; then
msg_info "Installing additional dependencies for WGDashboard"
$STD apk add --no-cache \
python3 \
py3-pip \
git \
sudo \
musl-dev \
linux-headers \
gcc \
python3-dev
msg_ok "Installed additional dependencies for WGDashboard"
msg_info "Installing WGDashboard"
git clone -q https://github.com/donaldzou/WGDashboard.git /etc/wgdashboard
cd /etc/wgdashboard/src || exit
chmod u+x wgd.sh
$STD ./wgd.sh install
msg_ok "Installed WGDashboard"
msg_info "Creating Service for WGDashboard"
cat <<EOF >/etc/init.d/wg-dashboard
#!/sbin/openrc-run
description="WireGuard Dashboard Service"
depend() {
need net
after firewall
}
start() {
ebegin "Starting WGDashboard"
cd /etc/wgdashboard/src/ || exit 1
./wgd.sh start &
eend $?
}
stop() {
ebegin "Stopping WGDashboard"
pkill -f "wgd.sh"
eend $?
}
EOF
chmod +x /etc/init.d/wg-dashboard
$STD rc-update add wg-dashboard default
$STD rc-service wg-dashboard start
msg_ok "Created Service for WGDashboard"
fi
msg_info "Starting Services"
$STD rc-update add wg-quick.wg0 default
$STD rc-service wg-quick.wg0 start
msg_ok "Started Services"
motd_ssh
customize

View File

@@ -34,7 +34,6 @@ users:
password: "\$argon2id\$v=19\$m=65536,t=3,p=4\$ZBopMzXrzhHXPEZxRDVT2w\$SxWm96DwhOsZyn34DLocwQEIb4kCDsk632PuiMdZnig" password: "\$argon2id\$v=19\$m=65536,t=3,p=4\$ZBopMzXrzhHXPEZxRDVT2w\$SxWm96DwhOsZyn34DLocwQEIb4kCDsk632PuiMdZnig"
groups: [] groups: []
EOF EOF
cat <<EOF >/etc/authelia/configuration.yml cat <<EOF >/etc/authelia/configuration.yml
authentication_backend: authentication_backend:
file: file:
@@ -64,6 +63,8 @@ notifier:
filesystem: filesystem:
filename: /etc/authelia/emails.txt filename: /etc/authelia/emails.txt
EOF EOF
touch /etc/authelia/emails.txt
chown -R authelia:authelia /etc/authelia
systemctl enable -q --now authelia systemctl enable -q --now authelia
msg_ok "Authelia Setup completed" msg_ok "Authelia Setup completed"

View File

@@ -42,6 +42,7 @@ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
msg_ok "Installed Golang" msg_ok "Installed Golang"
msg_info "Setup xCaddy" msg_info "Setup xCaddy"
$STD apt-get install -y git
cd /opt cd /opt
RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
curl -fsSL "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.deb" -o $(basename "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.deb") curl -fsSL "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.deb" -o $(basename "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.deb")

View File

@@ -18,7 +18,7 @@ $STD apt-get install -y g++-multilib
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Installing Daemon Sync Server" msg_info "Installing Daemon Sync Server"
curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/raw/main/misc/daemonsync_2.2.0.0059_amd64.deb -O "daemonsync_2.2.0.0059_amd64.deb" curl -fsSL "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/daemonsync_2.2.0.0059_amd64.deb" -o "daemonsync_2.2.0.0059_amd64.deb"
$STD dpkg -i daemonsync_2.2.0.0059_amd64.deb $STD dpkg -i daemonsync_2.2.0.0059_amd64.deb
msg_ok "Installed Daemon Sync Server" msg_ok "Installed Daemon Sync Server"

View File

@@ -15,14 +15,14 @@ update_os
msg_info "Setting Phoscon Repository" msg_info "Setting Phoscon Repository"
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
curl -fsSL http://phoscon.de/apt/deconz.pub.key >/etc/apt/trusted.gpg.d/deconz.pub.asc curl -fsSL "http://phoscon.de/apt/deconz.pub.key" >/etc/apt/trusted.gpg.d/deconz.pub.asc
echo "deb [arch=amd64] http://phoscon.de/apt/deconz $VERSION main" >/etc/apt/sources.list.d/deconz.list echo "deb [arch=amd64] http://phoscon.de/apt/deconz $VERSION main" >/etc/apt/sources.list.d/deconz.list
msg_ok "Setup Phoscon Repository" msg_ok "Setup Phoscon Repository"
msg_info "Installing deConz" msg_info "Installing deConz"
libssl=$(curl -fsSL "http://security.ubuntu.com/ubuntu/pool/main/o/openssl/" | grep -o 'libssl1\.1_1\.1\.1f-1ubuntu2\.2[^"]*amd64\.deb' | head -n1) libssl=$(curl -fsSL "http://security.ubuntu.com/ubuntu/pool/main/o/openssl/" | grep -o 'libssl1\.1_1\.1\.1f-1ubuntu2\.2[^"]*amd64\.deb' | head -n1)
curl -fsSL "http://security.ubuntu.com/ubuntu/pool/main/o/openssl/$libssl" -O curl -fsSL "http://security.ubuntu.com/ubuntu/pool/main/o/openssl/$libssl" -o "$libssl"
$STD dpkg -i $libssl $STD dpkg -i "$libssl"
$STD apt-get update $STD apt-get update
$STD apt-get install -y deconz $STD apt-get install -y deconz
msg_ok "Installed deConz" msg_ok "Installed deConz"
@@ -51,7 +51,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf $libssl rm -rf "$libssl"
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

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