Compare commits

..

142 Commits

Author SHA1 Message Date
654508eb94 Update CHANGELOG.md (#5239)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-18 01:15:31 +01:00
acfb9d6ea1 Update versions.json (#5238)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-18 02:14:53 +02:00
0d56db2d3d Update CHANGELOG.md (#5237)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 22:06:45 +01:00
4a1ae51446 gitea-mirror: increase build ressources (#5235) 2025-06-17 23:06:06 +02:00
6520b7f4d4 Update CHANGELOG.md (#5230)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 15:57:51 +01:00
48da94f77a Update CHANGELOG.md (#5229)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 15:57:35 +01:00
2ea372f034 Immich: ensure in proper working dir when updating (#5227) 2025-06-17 16:57:08 +02:00
5773459a39 Update CHANGELOG.md (#5228)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 15:57:05 +01:00
40f083ea40 Resolve issue #5212 (#5226) 2025-06-17 16:56:27 +02:00
219a7853e1 Update CHANGELOG.md (#5221)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 13:36:02 +01:00
TJ
6d1d903345 trilium: fix update function after db changes folder (#5207)
* Update trilium.sh

Fixed issue with db location

* Update ct/trilium.sh

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>

* Update trilium.sh

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-06-17 14:35:17 +02:00
ef9ca48477 Update versions.json (#5220)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 14:07:50 +02:00
8ac24981a6 Update CHANGELOG.md (#5219)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 13:02:31 +01:00
7e046d830d IPTag: Better explanation (#5213) 2025-06-17 14:01:46 +02:00
1691fafcc1 Update CHANGELOG.md (#5218)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 12:45:47 +01:00
4400cd2b97 Add .env (#5216) 2025-06-17 13:45:20 +02:00
795fe72768 Update CHANGELOG.md (#5209)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 01:15:30 +01:00
6d7d15ce46 Update versions.json (#5208)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-17 02:14:58 +02:00
a648b9abc4 Change wrong Type of iptag 2025-06-16 19:16:24 +02:00
4057fadfe0 Update CHANGELOG.md (#5200)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 16:15:16 +01:00
9b700195e4 Update CHANGELOG.md (#5199)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 16:14:35 +01:00
906a0a0fbc Refactor ScriptItem and ConfigFile components to conditionally render config file location. Update ConfigFile to accept configPath prop instead of item. (#5197) 2025-06-16 17:14:17 +02:00
8df55a03f4 Update CHANGELOG.md (#5198)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 16:14:01 +01:00
8241ed932d Refactor layout and component styles for improved responsiveness (#5195) 2025-06-16 17:13:33 +02:00
0b3c645ffb Update .app files (#5191)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-16 17:03:00 +02:00
0c17402efc Update CHANGELOG.md (#5194)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 16:02:00 +01:00
ccad7a2cd8 Update CHANGELOG.md (#5193)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 16:01:33 +01:00
15772d8802 Update default image asset in the public directory (#5189)
* Update default image asset in the public directory

* update background to be blue instead of black
2025-06-16 17:01:18 +02:00
c7e0faa33b Update CHANGELOG.md (#5192)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 16:00:57 +01:00
13b1c684ee Refactor: 2FAuth (#5184)
* Refactor: 2fauth

* Update
2025-06-16 17:00:14 +02:00
5e649d7cb1 Update CHANGELOG.md (#5188)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 15:02:08 +01:00
ec8a8b1908 add optional Cloud-init support to Debian VM script (#5137)
* Edit Debian VM script to use Cloud-init

* Edit Debian VM page to point to Cloud-init guide

* Revert "Edit Debian VM page to point to Cloud-init guide"

This reverts commit 3f99b2def1.

* Edit Debian VM script to ask for cloud-init
2025-06-16 16:01:27 +02:00
d850dde4ef Update CHANGELOG.md (#5186)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 14:40:49 +01:00
fb4075ac12 Fix missing dependencies (#5185) 2025-06-16 15:40:12 +02:00
8576463522 Update CHANGELOG.md (#5183)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 13:21:14 +01:00
2a4353fa13 [core] Move install_php() from VED to main (#5182) 2025-06-16 14:20:46 +02:00
d21cbf1d40 Update versions.json (#5181)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 14:07:47 +02:00
e97c96d0bb Update CHANGELOG.md (#5180)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 12:46:32 +01:00
04dab68e17 Update default image asset in the public directory and update api route to only search for files that end with .json (#5179)
* Update default image asset in the public directory

* Enhance file filtering in getScripts function to include only JSON files
2025-06-16 13:46:05 +02:00
b001687f5c Update CHANGELOG.md (#5174)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 09:17:21 +01:00
9f26e25126 Kasm: Storing Creds Fix (#5162)
* this should do it.

* Update kasm-install.sh

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-06-16 10:16:51 +02:00
5671d8e957 Update CHANGELOG.md (#5173)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 06:42:19 +01:00
0bf641f02c Update CHANGELOG.md (#5172)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 06:41:00 +01:00
7fc39a442b Update date in json (#5171)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-16 06:40:57 +01:00
6e1ee7d16e Refactor: IP-Tag (#5152) 2025-06-16 07:40:21 +02:00
5ee48aba1e Update CHANGELOG.md (#5170)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 06:32:05 +01:00
e6c21811bb Firefly: Add Data Importer to LXC (#5159)
* Add Data Importer to Firefly LXC

* Remove useless var
2025-06-16 07:31:22 +02:00
142fea21bd Update CHANGELOG.md (#5168)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 05:59:43 +01:00
df43101b4e Intel NIC offload Fix by @rcastley (#5155)
* Create nic-offloading-fix.sh

* Update nic-offloading-fix.json
2025-06-16 06:59:18 +02:00
3044a774c2 Update CHANGELOG.md (#5165)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 01:16:08 +01:00
65e4c027b8 Update versions.json (#5164)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-16 02:15:31 +02:00
dabfb57173 Update CHANGELOG.md (#5158)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-15 19:56:47 +01:00
63dfc2bd7b Update CHANGELOG.md (#5157)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-15 19:55:39 +01:00
89399ef421 Update date in json (#5156)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-15 19:55:36 +01:00
d9474c3dd6 LibreTranslate (#5154)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2025-06-15 20:55:01 +02:00
f5a5e4854c Update date in json (#5153)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-15 19:39:27 +01:00
632e823749 Create nic-offloading-fix.json 2025-06-15 20:39:06 +02:00
a128f3c43d Update versions.json (#5150)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-15 14:07:03 +02:00
9c90699ca2 Update CHANGELOG.md (#5146)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-15 01:17:09 +01:00
f6f6ca6bac Update versions.json (#5145)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-15 02:16:25 +02:00
b6d0b1ae6a Update CHANGELOG.md (#5144)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 22:15:15 +01:00
93906db2d1 Update CHANGELOG.md (#5143)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 22:15:02 +01:00
4ab71ccf00 flowiseai: set NodeJS to Version 20 (#5130)
doesnt Work with 2w
2025-06-14 23:14:38 +02:00
e058badee6 Update CHANGELOG.md (#5142)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 22:14:33 +01:00
74c6df5aa6 Update install_mariadb func (#5138) 2025-06-14 23:13:59 +02:00
c2484b7c60 Update versions.json (#5136)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 14:06:48 +02:00
b064127323 Update CHANGELOG.md (#5134)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 11:47:34 +01:00
TJ
138f90f09c Update dolibarr-install.sh (#5127)
On the sourceforge page Dolibar v18.0.7 was modified after v21.0.1 even though v21.0.1 is the latest version. The original line get the lastest modified folder, this line gets the largest numbered folder.

https://sourceforge.net/projects/dolibarr/files/Dolibarr%20installer%20for%20Debian-Ubuntu%20%28DoliDeb%29/
2025-06-14 12:46:59 +02:00
84469e2b5b Update CHANGELOG.md (#5132)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 01:15:11 +01:00
a164d259e0 Update versions.json (#5131)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-14 02:14:32 +02:00
34aa360920 Update CHANGELOG.md (#5126)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-13 18:09:10 +01:00
f0dde5a42d Update umbrel-os-vm.json (#5125) 2025-06-13 19:08:28 +02:00
e0ccc1a0af Update versions.json (#5123)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-13 14:07:32 +02:00
4fa7483d8b Update CHANGELOG.md (#5122)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-13 11:35:08 +01:00
cd835c6791 Update alpine-zigbee2mqtt-install.sh (#5120) 2025-06-13 12:34:42 +02:00
abf233c94f Update CHANGELOG.md (#5117)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-13 01:15:50 +01:00
edd4fb3cc2 Update versions.json (#5116)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-13 02:15:05 +02:00
d97620a390 Update CHANGELOG.md (#5115)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-12 22:13:21 +01:00
c2c5159a2d Kasm: Increase Ressources & Hint for Fuse / Swap (#5112)
* Kasm: Increase Ressources & Hint for Fuse / Swap

* extend info
2025-06-12 21:31:32 +02:00
46d9f85f5e Update date in json (#5111)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-12 16:28:37 +01:00
ba7ec5aa68 Update CHANGELOG.md (#5110)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-12 16:28:32 +01:00
dd4c556959 Manage my Damn Life (#5100)
* 'Add new script'

* fix curl

* curl

* Update managemydamnlife-install.sh

Remove unneeded msg

---------

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: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-06-12 17:28:05 +02:00
0e63437154 install.func (#5109) 2025-06-12 17:26:12 +02:00
0769320146 Update versions.json (#5107)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-12 14:07:39 +02:00
d6da26c640 Update CHANGELOG.md (#5104)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-12 01:15:39 +01:00
d9facc0e62 Update versions.json (#5103)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-12 02:14:56 +02:00
31e0b5fae3 Update versions.json (#5099)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-11 14:07:38 +02:00
b0bd2f4804 Update CHANGELOG.md (#5098)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-11 01:15:34 +01:00
3aefe199f7 Update versions.json (#5097)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-11 02:14:59 +02:00
677008c779 Update CHANGELOG.md (#5094)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 19:13:25 +01:00
b8ba409e5c Element Synapse: switched from development to production mode and fixed update (#5066)
* Update elementsynapse.sh

* Update elementsynapse-install.sh

* Update elementsynapse.sh

removed comment
2025-06-10 20:13:00 +02:00
7cf8300b47 Update CHANGELOG.md (#5093)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 18:37:20 +01:00
77fb5ea516 Update CHANGELOG.md (#5092)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 18:37:00 +01:00
e92dfe1b2b Update dolibarr-install.sh (#5091) 2025-06-10 19:36:48 +02:00
61bfa16645 Update alpine-tinyauth-install.sh (#5090) 2025-06-10 19:36:33 +02:00
84c295a10b Update CHANGELOG.md (#5086)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 15:02:17 +01:00
ed834bf424 Immich: Update JSON (#5085)
- Provide more clarity around OpenVINO, hardware transcoding, and how to
change upload locations
2025-06-10 16:01:48 +02:00
b1f8992933 Update versions.json (#5084)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 14:07:47 +02:00
201f7c4651 Update CHANGELOG.md (#5081)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 08:24:46 +01:00
2574e41ee8 Prevent api from posing if disabled (#5080) 2025-06-10 09:24:20 +02:00
2aeb7cf79a Update CHANGELOG.md (#5079)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 01:15:38 +01:00
98c277f471 Update versions.json (#5078)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-10 02:14:55 +02:00
78a2201a93 Update CHANGELOG.md (#5076)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-09 20:21:31 +01:00
2de03f5734 Remove GoMFT from website temporarily (#5065) 2025-06-09 21:04:22 +02:00
c59f9f421c Update minarca.json (#5070) 2025-06-09 21:03:03 +02:00
598acc2048 Update versions.json (#5071)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-09 14:07:42 +02:00
6e6b279b88 Update CHANGELOG.md (#5069)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-09 08:19:41 +01:00
943a5f4d8f Authelia: Fix the URL of the container (#5064)
* Update authelia.sh

* Update authelia.json
2025-06-09 09:19:15 +02:00
4efa882558 Update CHANGELOG.md (#5068)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-09 01:16:16 +01:00
eff985ca02 Update versions.json (#5067)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-09 02:15:39 +02:00
ff239ff3cd Update CHANGELOG.md (#5061)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 21:16:48 +01:00
45bb824101 Update CHANGELOG.md (#5060)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 22:16:28 +02:00
1956c8740b Update date in json (#5059)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-08 21:15:16 +01:00
f6638b095d Minarca (#5058) 2025-06-08 22:14:41 +02:00
6a1738c52a Update CHANGELOG.md (#5057)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 16:10:46 +01:00
a9e3520df1 zot: fix missing var (Dev -> Main) (#5056) 2025-06-08 17:10:20 +02:00
08230e9089 Update CHANGELOG.md (#5055)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 14:29:18 +01:00
a5c6984087 karakeep: Add more configuration defaults (#5054) 2025-06-08 15:28:50 +02:00
99174cb9c2 Update versions.json (#5053)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 14:06:49 +02:00
336e70f059 Update CHANGELOG.md (#5049)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 01:16:43 +01:00
ce8b9aa5b4 Update versions.json (#5048)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-08 02:16:07 +02:00
70d6815d91 Remove storage checks (#5047) 2025-06-07 23:32:38 +02:00
75273e86b6 Align read -p text (#5046) 2025-06-07 23:32:22 +02:00
37a2f6a715 Update CHANGELOG.md (#5045)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-07 19:58:31 +01:00
4b7c734b9a Fix typo in build.func (#5041) 2025-06-07 20:57:55 +02:00
590db0d148 Update CHANGELOG.md (#5044)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-07 19:20:43 +01:00
50ad6410d5 Update CHANGELOG.md (#5043)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-07 19:20:22 +01:00
85b80bfb22 declare pingvin-share as updateable (#5038) 2025-06-07 20:20:14 +02:00
33e49b7556 fix alpine-it-tools update (#5039) 2025-06-07 20:19:56 +02:00
0a6f7e6426 Update versions.json (#5036)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-07 14:06:43 +02:00
5fd5d78a2a Update CHANGELOG.md (#5031)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-07 01:15:20 +01:00
ab32878b63 Update versions.json (#5030)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-07 02:14:48 +02:00
ee7090f271 Update lyrionmusicserver.json (#5028) 2025-06-06 23:29:01 +02:00
df6bd2a68a Update versions.json (#5021)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-06 14:07:32 +02:00
e46e9a3372 Update CHANGELOG.md (#5020)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-06 12:30:31 +01:00
6c08814cc5 zipline: fix old upload copy from v3 to v4 (#5015)
* zipline: fix old upload copy from v3 to v4

* rm for install
2025-06-06 13:30:01 +02:00
4cca5062af Update CHANGELOG.md (#5019)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-06 11:07:32 +01:00
dc2b585e6b Update CHANGELOG.md (#5018)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-06-06 11:06:07 +01:00
cc4f5c4478 Update date in json (#5017)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-06-06 11:06:02 +01:00
01ced07bff Zot-Registry (#5016)
* 'Add new script'

* fix curl call

* update 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>
2025-06-06 12:05:28 +02:00
85e13c9ac5 Rename metube.json to metube.json.bak (#5014) 2025-06-06 09:35:05 +02:00
1ac4b0c10f Update emby.json (#4998) 2025-06-06 07:59:14 +02:00
73 changed files with 2062 additions and 1237 deletions

View File

@ -14,8 +14,185 @@ 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-06-18
## 2025-06-17
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- gitea-mirror: increase build ressources [@CrazyWolf13](https://github.com/CrazyWolf13) ([#5235](https://github.com/community-scripts/ProxmoxVE/pull/5235))
- Immich: ensure in proper working dir when updating [@vhsdream](https://github.com/vhsdream) ([#5227](https://github.com/community-scripts/ProxmoxVE/pull/5227))
- Update IP-Tag [@DesertGamer](https://github.com/DesertGamer) ([#5226](https://github.com/community-scripts/ProxmoxVE/pull/5226))
- trilium: fix update function after db changes folder [@tjcomserv](https://github.com/tjcomserv) ([#5207](https://github.com/community-scripts/ProxmoxVE/pull/5207))
- #### ✨ New Features
- LibreTranslate: Add .env for easier configuration [@tremor021](https://github.com/tremor021) ([#5216](https://github.com/community-scripts/ProxmoxVE/pull/5216))
### 🌐 Website
- #### 📝 Script Information
- IPTag: Better explanation [@MickLesk](https://github.com/MickLesk) ([#5213](https://github.com/community-scripts/ProxmoxVE/pull/5213))
## 2025-06-16
### 🆕 New Scripts
- Intel NIC offload Fix by @rcastley [@MickLesk](https://github.com/MickLesk) ([#5155](https://github.com/community-scripts/ProxmoxVE/pull/5155))
### 🚀 Updated Scripts
- [core] Move install_php() from VED to main [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#5182](https://github.com/community-scripts/ProxmoxVE/pull/5182))
- Firefly: Add Data Importer to LXC [@tremor021](https://github.com/tremor021) ([#5159](https://github.com/community-scripts/ProxmoxVE/pull/5159))
- #### 🐞 Bug Fixes
- Wastebin: Fix missing dependencies [@tremor021](https://github.com/tremor021) ([#5185](https://github.com/community-scripts/ProxmoxVE/pull/5185))
- Kasm: Storing Creds Fix [@omiinaya](https://github.com/omiinaya) ([#5162](https://github.com/community-scripts/ProxmoxVE/pull/5162))
- #### ✨ New Features
- add optional Cloud-init support to Debian VM script [@koendiender](https://github.com/koendiender) ([#5137](https://github.com/community-scripts/ProxmoxVE/pull/5137))
- #### 🔧 Refactor
- Refactor: 2FAuth [@tremor021](https://github.com/tremor021) ([#5184](https://github.com/community-scripts/ProxmoxVE/pull/5184))
### 🌐 Website
- Refactor layout and component styles for improved responsiveness [@BramSuurdje](https://github.com/BramSuurdje) ([#5195](https://github.com/community-scripts/ProxmoxVE/pull/5195))
- #### 🐞 Bug Fixes
- Refactor ScriptItem and ConfigFile components to conditionally render config file location. Update ConfigFile to accept configPath prop instead of item. [@BramSuurdje](https://github.com/BramSuurdje) ([#5197](https://github.com/community-scripts/ProxmoxVE/pull/5197))
- Update default image asset in the public directory and update api route to only search for files that end with .json [@BramSuurdje](https://github.com/BramSuurdje) ([#5179](https://github.com/community-scripts/ProxmoxVE/pull/5179))
- #### ✨ New Features
- Update default image asset in the public directory [@BramSuurdje](https://github.com/BramSuurdje) ([#5189](https://github.com/community-scripts/ProxmoxVE/pull/5189))
## 2025-06-15
### 🆕 New Scripts
- LibreTranslate ([#5154](https://github.com/community-scripts/ProxmoxVE/pull/5154))
## 2025-06-14
### 🚀 Updated Scripts
- [core] Update install_mariadb func [@tremor021](https://github.com/tremor021) ([#5138](https://github.com/community-scripts/ProxmoxVE/pull/5138))
- #### 🐞 Bug Fixes
- flowiseai: set NodeJS to Version 20 [@MickLesk](https://github.com/MickLesk) ([#5130](https://github.com/community-scripts/ProxmoxVE/pull/5130))
- Update dolibarr-install.sh - Get largest version number [@tjcomserv](https://github.com/tjcomserv) ([#5127](https://github.com/community-scripts/ProxmoxVE/pull/5127))
## 2025-06-13
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Zigbee2MQTT: Fix missing directory [@tremor021](https://github.com/tremor021) ([#5120](https://github.com/community-scripts/ProxmoxVE/pull/5120))
### 🌐 Website
- #### 📝 Script Information
- Umbrel OS: Fix bad disk size shown on website [@tremor021](https://github.com/tremor021) ([#5125](https://github.com/community-scripts/ProxmoxVE/pull/5125))
## 2025-06-12
### 🆕 New Scripts
- Manage my Damn Life ([#5100](https://github.com/community-scripts/ProxmoxVE/pull/5100))
### 🚀 Updated Scripts
- Kasm: Increase Ressources & Hint for Fuse / Swap [@MickLesk](https://github.com/MickLesk) ([#5112](https://github.com/community-scripts/ProxmoxVE/pull/5112))
## 2025-06-11
## 2025-06-10
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Element Synapse: switched from development to production mode and fixed update [@Frankmaaan](https://github.com/Frankmaaan) ([#5066](https://github.com/community-scripts/ProxmoxVE/pull/5066))
- Tinyauth: Fix creation of service file [@tremor021](https://github.com/tremor021) ([#5090](https://github.com/community-scripts/ProxmoxVE/pull/5090))
- Dolibarr: Fix typo in SQL command [@tremor021](https://github.com/tremor021) ([#5091](https://github.com/community-scripts/ProxmoxVE/pull/5091))
### 🧰 Maintenance
- #### 📡 API
- [core] Prevent API form sending Data when disabled [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#5080](https://github.com/community-scripts/ProxmoxVE/pull/5080))
### 🌐 Website
- #### 📝 Script Information
- Immich: Update JSON [@vhsdream](https://github.com/vhsdream) ([#5085](https://github.com/community-scripts/ProxmoxVE/pull/5085))
## 2025-06-09
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Authelia: Fix the URL of the container [@tremor021](https://github.com/tremor021) ([#5064](https://github.com/community-scripts/ProxmoxVE/pull/5064))
### 🌐 Website
- GoMFT: Remove from website temporarily [@tremor021](https://github.com/tremor021) ([#5065](https://github.com/community-scripts/ProxmoxVE/pull/5065))
## 2025-06-08
### 🆕 New Scripts
- Minarca ([#5058](https://github.com/community-scripts/ProxmoxVE/pull/5058))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- zot: fix missing var (Dev -> Main) [@MickLesk](https://github.com/MickLesk) ([#5056](https://github.com/community-scripts/ProxmoxVE/pull/5056))
- #### ✨ New Features
- karakeep: Add more configuration defaults [@vhsdream](https://github.com/vhsdream) ([#5054](https://github.com/community-scripts/ProxmoxVE/pull/5054))
## 2025-06-07
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- alpine-it-tools fix update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#5039](https://github.com/community-scripts/ProxmoxVE/pull/5039))
### 🧰 Maintenance
- #### 💾 Core
- Fix typo in build.func [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#5041](https://github.com/community-scripts/ProxmoxVE/pull/5041))
## 2025-06-06 ## 2025-06-06
### 🆕 New Scripts
- Zot-Registry ([#5016](https://github.com/community-scripts/ProxmoxVE/pull/5016))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- zipline: fix old upload copy from v3 to v4 [@MickLesk](https://github.com/MickLesk) ([#5015](https://github.com/community-scripts/ProxmoxVE/pull/5015))
## 2025-06-05 ## 2025-06-05
### 🆕 New Scripts ### 🆕 New Scripts

View File

@ -24,21 +24,16 @@ function update_script() {
check_container_storage check_container_storage
check_container_resources check_container_resources
# Check if installation is present | -f for file, -d for folder
if [[ ! -d "/opt/2fauth" ]]; then if [[ ! -d "/opt/2fauth" ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
# Crawling the new version and checking whether an update is required
RELEASE=$(curl -fsSL https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') RELEASE=$(curl -fsSL https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ "${RELEASE}" != "$(cat /opt/2fauth_version.txt)" ]] || [[ ! -f /opt/2fauth_version.txt ]]; then if [[ "${RELEASE}" != "$(cat /opt/2fauth_version.txt)" ]] || [[ ! -f /opt/2fauth_version.txt ]]; then
msg_info "Updating $APP to ${RELEASE}" msg_info "Updating $APP to ${RELEASE}"
$STD apt-get update $STD apt-get update
$STD apt-get -y upgrade $STD apt-get -y upgrade
# Creating Backup
msg_info "Creating Backup" msg_info "Creating Backup"
mv "/opt/2fauth" "/opt/2fauth-backup" mv "/opt/2fauth" "/opt/2fauth-backup"
if ! dpkg -l | grep -q 'php8.3'; then if ! dpkg -l | grep -q 'php8.3'; then
@ -46,37 +41,24 @@ function update_script() {
fi fi
msg_ok "Backup Created" msg_ok "Backup Created"
# Upgrade PHP
if ! dpkg -l | grep -q 'php8.3'; then if ! dpkg -l | grep -q 'php8.3'; then
$STD apt-get install -y \ $STD apt-get install -y \
lsb-release \ lsb-release \
gpg gnupg2
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpg PHP_VERSION="8.3" PHP_MODULE="common,ctype,fileinfo,fpm,mysql,cli" install_php
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 install -y php8.3-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli,intl}
sed -i 's/php8.2/php8.3/g' /etc/nginx/conf.d/2fauth.conf sed -i 's/php8.2/php8.3/g' /etc/nginx/conf.d/2fauth.conf
fi fi
fetch_and_deploy_gh_release "Bubka/2FAuth"
# Execute Update
curl -fsSL -o "${RELEASE}.zip" "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip"
$STD unzip "${RELEASE}.zip"
mv "2FAuth-${RELEASE//v/}/" "/opt/2fauth"
mv "/opt/2fauth-backup/.env" "/opt/2fauth/.env" mv "/opt/2fauth-backup/.env" "/opt/2fauth/.env"
mv "/opt/2fauth-backup/storage" "/opt/2fauth/storage" mv "/opt/2fauth-backup/storage" "/opt/2fauth/storage"
cd "/opt/2fauth" || return cd "/opt/2fauth" || return
chown -R www-data: "/opt/2fauth" chown -R www-data: "/opt/2fauth"
chmod -R 755 "/opt/2fauth" chmod -R 755 "/opt/2fauth"
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --prefer-source $STD composer install --no-dev --prefer-source
php artisan 2fauth:install php artisan 2fauth:install
$STD systemctl restart nginx $STD systemctl restart nginx
# Cleaning up
msg_info "Cleaning Up" msg_info "Cleaning Up"
rm -rf "v${RELEASE}.zip" rm -rf "v${RELEASE}.zip"
if dpkg -l | grep -q 'php8.2'; then if dpkg -l | grep -q 'php8.2'; then
@ -86,7 +68,6 @@ function update_script() {
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleanup Completed" msg_ok "Cleanup Completed"
# Last Action
echo "${RELEASE}" >/opt/2fauth_version.txt echo "${RELEASE}" >/opt/2fauth_version.txt
msg_ok "Updated $APP to ${RELEASE}" msg_ok "Updated $APP to ${RELEASE}"
else else

View File

@ -21,8 +21,6 @@ catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage
check_container_resources
if [ ! -d /usr/share/nginx/html ]; then if [ ! -d /usr/share/nginx/html ]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"

View File

@ -22,9 +22,6 @@ catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage
check_container_resources
if [ ! -d /opt/rclone ]; then if [ ! -d /opt/rclone ]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit 1 exit 1

View File

@ -55,4 +55,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}:9091${CL}" echo -e "${TAB}${GATEWAY}${BGN}https://YOUR_AUTHELIA_URL${CL}"

View File

@ -47,7 +47,7 @@ function update_script() {
$STD apt-get -y upgrade $STD apt-get -y upgrade
msg_ok "Updated $APP LXC" msg_ok "Updated $APP LXC"
if [[ -f /systemd/system/synapse-admin.service ]]; then if [[ -f /etc/systemd/system/synapse-admin.service ]]; then
msg_info "Updating Synapse-Admin" msg_info "Updating Synapse-Admin"
RELEASE=$(curl -fsSL https://api.github.com/repos/etkecc/synapse-admin/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/etkecc/synapse-admin/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
@ -58,7 +58,16 @@ function update_script() {
curl -fsSL "https://github.com/etkecc/synapse-admin/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" curl -fsSL "https://github.com/etkecc/synapse-admin/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar xzf "$temp_file" -C /opt/synapse-admin --strip-components=1 tar xzf "$temp_file" -C /opt/synapse-admin --strip-components=1
cd /opt/synapse-admin cd /opt/synapse-admin
$STD yarn global add serve
$STD yarn install --ignore-engines $STD yarn install --ignore-engines
$STD yarn build
mv ./dist ../ && \
rm -rf * && \
mv ../dist ./
if [[ -z $(grep "ExecStart=/usr/local/bin/serve" /etc/systemd/system/synapse-admin.service) ]]; then
sed -i 's|^ExecStart=.*|ExecStart=/usr/local/bin/serve -s dist -l 5173|' /etc/systemd/system/synapse-admin.service
systemctl reenable synapse-admin
fi
systemctl start synapse-admin systemctl start synapse-admin
echo "${RELEASE}" >/opt/"${APP}"_version.txt echo "${RELEASE}" >/opt/"${APP}"_version.txt
rm -f "$temp_file" rm -f "$temp_file"

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 community-scripts ORG # Copyright (c) 2021-2025 community-scripts ORG
# Author: quantumryuu # Author: quantumryuu | Co-Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://firefly-iii.org/ # Source: https://firefly-iii.org/

View File

@ -7,9 +7,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="gitea-mirror" APP="gitea-mirror"
var_tags="${var_tags:-mirror;gitea}" var_tags="${var_tags:-mirror;gitea}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-5}" var_disk="${var_disk:-6}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"

View File

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

View File

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

6
ct/headers/minarca Normal file
View File

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

6
ct/headers/zot-registry Normal file
View File

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

View File

@ -30,6 +30,7 @@ function update_script() {
STAGING_DIR=/opt/staging STAGING_DIR=/opt/staging
BASE_DIR=${STAGING_DIR}/base-images BASE_DIR=${STAGING_DIR}/base-images
SOURCE_DIR=${STAGING_DIR}/image-source SOURCE_DIR=${STAGING_DIR}/image-source
cd /root
if [[ -f ~/.intel_version ]]; then if [[ -f ~/.intel_version ]]; then
curl -fsSLO https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/machine-learning/Dockerfile curl -fsSLO https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/machine-learning/Dockerfile
readarray -t INTEL_URLS < <(sed -n "/intel/p" ./Dockerfile | awk '{print $3}') readarray -t INTEL_URLS < <(sed -n "/intel/p" ./Dockerfile | awk '{print $3}')

View File

@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="Kasm" APP="Kasm"
var_tags="${var_tags:-os}" var_tags="${var_tags:-os}"
var_cpu="${var_cpu:-2}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4192}" var_ram="${var_ram:-8192}"
var_disk="${var_disk:-30}" var_disk="${var_disk:-30}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-12}"

61
ct/libretranslate.sh Normal file
View File

@ -0,0 +1,61 @@
#!/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: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/LibreTranslate/LibreTranslate
APP="LibreTranslate"
var_tags="${var_tags:-Arr}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-20}"
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 [[ ! -d /opt/libretranslate ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/LibreTranslate/LibreTranslate/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat $HOME/.libretranslate)" ]] || [[ ! -f $HOME/.libretranslate ]]; then
msg_info "Stopping $APP"
systemctl stop libretranslate
msg_ok "Stopped $APP"
msg_info "Updating $APP to ${RELEASE}"
cd /opt/libretranslate
source .venv/bin/activate
$STD pip install -U libretranslate
msg_ok "Updated $APP to ${RELEASE}"
msg_info "Starting $APP"
systemctl start libretranslate
msg_ok "Started $APP"
msg_ok "Update Successful"
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}:5000${CL}"

78
ct/managemydamnlife.sh Normal file
View File

@ -0,0 +1,78 @@
#!/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: vhsdream
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/intri-in/manage-my-damn-life-nextjs
APP="Manage My Damn Life"
var_tags="${var_tags:-calendar;tasks}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}"
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 [[ ! -d /opt/mmdl ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/intri-in/manage-my-damn-life-nextjs/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat /opt/mmdl_version.txt)" ]] || [[ ! -f /opt/mmdl_version.txt ]]; then
msg_info "Stopping $APP"
systemctl stop mmdl
msg_ok "Stopped $APP"
msg_info "Creating Backup"
cp /opt/mmdl/.env /opt/mmdl.env
msg_ok "Backup Created"
msg_info "Updating $APP to v${RELEASE}"
curl -fsSLO "https://github.com/intri-in/manage-my-damn-life-nextjs/archive/refs/tags/v${RELEASE}.zip"
rm -r /opt/mmdl
unzip -q v"$RELEASE".zip
mv manage-my-damn-life-nextjs-"$RELEASE"/ /opt/mmdl
mv /opt/mmdl.env /opt/mmdl/.env
cd /opt/mmdl
$STD npm install
$STD npm run migrate
$STD npm run build
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting $APP"
systemctl start mmdl
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -f ~/v"$RELEASE".zip
msg_ok "Cleanup Completed"
# Last Action
echo "$RELEASE" >/opt/mmdl_version.txt
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${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}"

54
ct/minarca.sh Normal file
View File

@ -0,0 +1,54 @@
#!/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: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://minarca.org/en_CA
APP="Minarca"
var_tags="${var_tags:-backup}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
var_fuse="${var_fuse:-yes}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/minarca-server ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Stopping ${APP}"
systemctl stop minarca-server
msg_ok "${APP} Stopped"
msg_info "Updating ${APP} LXC"
$STD apt-get update
$STD apt-get upgrade -y
msg_ok "Updated ${APP} LXC"
msg_info "Starting ${APP}"
systemctl start minarca-server
msg_ok "Restarted ${APP}"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"

View File

@ -29,7 +29,19 @@ function update_script() {
fi fi
if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi
RELEASE=$(curl -fsSL https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "v${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then if [[ "v${RELEASE}" != "$(cat /opt/${APP}_version.txt 2>/dev/null)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
if [[ -d /opt/trilium/db ]]; then
DB_PATH="/opt/trilium/db"
DB_RESTORE_PATH="/opt/trilium/db"
elif [[ -d /opt/trilium/assets/db ]]; then
DB_PATH="/opt/trilium/assets/db"
DB_RESTORE_PATH="/opt/trilium/assets/db"
else
msg_error "Database not found in either /opt/trilium/db or /opt/trilium/assets/db"
exit 1
fi
msg_info "Stopping ${APP}" msg_info "Stopping ${APP}"
systemctl stop trilium systemctl stop trilium
sleep 1 sleep 1
@ -37,18 +49,22 @@ 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 /opt/trilium_backup/ cp -r "${DB_PATH}" /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 "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 /opt/trilium/
# Restore database
mkdir -p "$(dirname "${DB_RESTORE_PATH}")"
cp -r /opt/trilium_backup/$(basename "${DB_PATH}") "${DB_RESTORE_PATH}"
echo "v${RELEASE}" >/opt/${APP}_version.txt echo "v${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated to ${RELEASE}" msg_ok "Updated to ${RELEASE}"
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf /tmp/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz rm -rf "/tmp/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz"
rm -rf /opt/trilium_backup rm -rf /opt/trilium_backup
msg_ok "Cleaned" msg_ok "Cleaned"
@ -60,6 +76,7 @@ function update_script() {
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
} }

View File

@ -41,7 +41,9 @@ function update_script() {
msg_info "Updating ${APP} to ${RELEASE}" msg_info "Updating ${APP} to ${RELEASE}"
cp /opt/zipline/.env /opt/ cp /opt/zipline/.env /opt/
mkdir -p /opt/zipline-upload mkdir -p /opt/zipline-upload
if [ -d /opt/zipline/upload ] && [ "$(ls -A /opt/zipline/upload)" ]; then
cp -R /opt/zipline/upload/* /opt/zipline-upload/ cp -R /opt/zipline/upload/* /opt/zipline-upload/
fi
curl -fsSL "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip") curl -fsSL "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip")
$STD unzip v"${RELEASE}".zip $STD unzip v"${RELEASE}".zip
rm -R /opt/zipline rm -R /opt/zipline

59
ct/zot-registry.sh Normal file
View File

@ -0,0 +1,59 @@
#!/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://zotregistry.dev/
APP="Zot-Registry"
var_tags="${var_tags:-registry;oci}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-5}"
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 /usr/bin/zot ]]; then
msg_error "No ${APP} installation found!"
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/project-zot/zot/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
if [[ ! -f ~/.${APP} ]] || [[ "${RELEASE}" != "$(cat ~/.${APP})" ]]; then
msg_info "Stopping Zot service"
systemctl stop zot
msg_ok "Stopped Zot service"
msg_info "Updating Zot to ${RELEASE}"
curl -fsSL "https://github.com/project-zot/zot/releases/download/${RELEASE}/zot-linux-amd64" -o /usr/bin/zot
chmod +x /usr/bin/zot
chown root:root /usr/bin/zot
echo "${RELEASE}" >~/.${APP}
systemctl restart zot
msg_ok "Updated Zot to ${RELEASE}"
else
msg_ok "Zot is already up to date (${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}:8080${CL}"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -1,23 +1,23 @@
{ {
"name": "Proxmox VE LXC IP-Tag", "name": "Proxmox VE LXC Tag",
"slug": "add-lxc-iptag", "slug": "add-iptag",
"categories": [ "categories": [
1 1
], ],
"date_created": "2024-12-16", "date_created": "2025-06-16",
"type": "pve", "type": "pve",
"updateable": false, "updateable": false,
"privileged": false, "privileged": false,
"interface_port": null, "interface_port": null,
"documentation": null, "documentation": null,
"website": null, "website": null,
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/proxmox.webp", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/proxmox.svg",
"config_path": "/opt/lxc-iptag/iptag.conf", "config_path": "/opt/iptag/iptag.conf",
"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.", "description": "This script automatically adds IP address as tags to LXC containers or VM's using a systemd service. The service also updates the tags if a LXC/VM IP address is changed.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "tools/pve/add-lxc-iptag.sh", "script": "tools/pve/add-iptag.sh",
"resources": { "resources": {
"cpu": null, "cpu": null,
"ram": null, "ram": null,
@ -36,6 +36,10 @@
"text": "Execute within the Proxmox shell", "text": "Execute within the Proxmox shell",
"type": "info" "type": "info"
}, },
{
"text": "Configuration: `nano /opt/iptag/iptag.conf`. iptag.service must be restarted after change.",
"type": "info"
},
{ {
"text": "The Proxmox Node must contain ipcalc and net-tools. `apt-get install -y ipcalc net-tools`", "text": "The Proxmox Node must contain ipcalc and net-tools. `apt-get install -y ipcalc net-tools`",
"type": "warning" "type": "warning"

View File

@ -8,7 +8,7 @@
"type": "ct", "type": "ct",
"updateable": true, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 9091, "interface_port": 443,
"documentation": "https://www.authelia.com/integration/deployment/bare-metal/", "documentation": "https://www.authelia.com/integration/deployment/bare-metal/",
"website": "https://www.authelia.com/", "website": "https://www.authelia.com/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/authelia.webp", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/authelia.webp",

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": 8096, "interface_port": 8096,
"documentation": "https://emby.media/support/articles/Home.html", "documentation": "https://emby.media/support/articles/Home.html",

View File

@ -32,6 +32,10 @@
"password": null "password": null
}, },
"notes": [ "notes": [
{
"text": "Data Importer is at `http://<LXC_IP>/dataimporter/`",
"type": "info"
},
{ {
"text": "Database credentials: `cat ~/firefly.creds`", "text": "Database credentials: `cat ~/firefly.creds`",
"type": "info" "type": "info"

View File

@ -19,9 +19,9 @@
"type": "default", "type": "default",
"script": "ct/gitea-mirror.sh", "script": "ct/gitea-mirror.sh",
"resources": { "resources": {
"cpu": 1, "cpu": 2,
"ram": 1024, "ram": 2048,
"hdd": 5, "hdd": 6,
"os": "Debian", "os": "Debian",
"version": "12" "version": "12"
} }

View File

@ -33,15 +33,15 @@
}, },
"notes": [ "notes": [
{ {
"text": "During installation, HW-accelerated machine-learning (with OpenVINO) is an available option. This also allows for HW-accelerated transcoding, but it must be enabled in Video Transcoding Settings", "text": "During installation, you will be prompted with the option to install Intel OpenVINO for hardware-accelerated machine-learning. If you opt in, increase your LXC RAM after installation, as OpenVINO is memory-intensive",
"type": "info" "type": "info"
}, },
{ {
"text": "If using OpenVINO HW machine-learning, increase RAM because OpenVINO is memory-intensive", "text": "HW-accelerated video transcoding is supported, but must be enabled in Immich Settings",
"type": "info" "type": "info"
}, },
{ {
"text": "To change upload location, edit 'IMMICH_MEDIA_LOCATION' in `/opt/immich/.env`", "text": "To change upload location, edit 'IMMICH_MEDIA_LOCATION' in `/opt/immich/.env`, and create the symlink 'upload' in /opt/immich/app & /opt/immich/app/machine-learning to your new upload location",
"type": "info" "type": "info"
} }
] ]

View File

@ -20,7 +20,7 @@
"script": "ct/kasm.sh", "script": "ct/kasm.sh",
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 4096, "ram": 8192,
"hdd": 50, "hdd": 50,
"os": "Debian", "os": "Debian",
"version": "12" "version": "12"
@ -36,6 +36,10 @@
"text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
"type": "warning" "type": "warning"
}, },
{
"text": "Kasm needs swap (on Proxmox host) and activated FUSE to be installed successfully!",
"type": "warning"
},
{ {
"text": "Show password: `cat ~/kasm.creds`", "text": "Show password: `cat ~/kasm.creds`",
"type": "info" "type": "info"

View File

@ -0,0 +1,44 @@
{
"name": "LibreTranslate",
"slug": "libretranslate",
"categories": [
0
],
"date_created": "2025-06-15",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 5000,
"documentation": "https://github.com/LibreTranslate/LibreTranslate?tab=readme-ov-file#settings--flags",
"website": "https://libretranslate.com/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/libretranslate.webp",
"config_path": "",
"description": "Free and Open Source Machine Translation API, entirely self-hosted. Unlike other APIs, it doesn't rely on proprietary providers such as Google or Azure to perform translations. Instead, its translation engine is powered by the open source Argos Translate library.",
"install_methods": [
{
"type": "default",
"script": "ct/libretranslate.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 20,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "During the installation, application will download language models used for translation. Depending on how fast your internet/host is, this can take 5-10 minutes.",
"type": "info"
},
{
"text": "At every boot of LXC, application will look for updates for language models installed. This can prolong the startup of the LXC.",
"type": "info"
}
]
}

View File

@ -2,7 +2,7 @@
"name": "Lyrion Music Server", "name": "Lyrion Music Server",
"slug": "lyrionmusicserver", "slug": "lyrionmusicserver",
"categories": [ "categories": [
9 13
], ],
"date_created": "2025-06-05", "date_created": "2025-06-05",
"type": "ct", "type": "ct",

View File

@ -0,0 +1,35 @@
{
"name": "Manage My Damn Life",
"slug": "managemydamnlife",
"categories": [
0
],
"date_created": "2025-06-12",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": "https://manage-my-damn-life-nextjs.readthedocs.io/en/latest/",
"config_path": "/opt/mmdl/.env",
"website": "https://github.com/intri-in/manage-my-damn-life-nextjs",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/manage-my-damn-life.webp",
"description": "Manage My Damn Life (MMDL) is a self-hosted front end for managing your CalDAV tasks and calendars.",
"install_methods": [
{
"type": "default",
"script": "ct/managemydamnlife.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 6,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@ -0,0 +1,35 @@
{
"name": "Minarca",
"slug": "minarca",
"categories": [
7
],
"date_created": "2025-06-08",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://nexus.ikus-soft.com/repository/archive/minarca/6.0.3/doc/index.html",
"config_path": "/etc/minarca/minarca-server.conf",
"website": "https://minarca.org/en_CA",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/minarca.webp",
"description": "Minarca is a self-hosted open source data backup software that allows you to manage your computer and server backups for free from a direct online accessible centralized view of your data with easy retrieval.",
"install_methods": [
{
"type": "default",
"script": "ct/minarca.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 10,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": "admin",
"password": "admin123"
},
"notes": []
}

View File

@ -0,0 +1,40 @@
{
"name": "NIC Offloading Fix",
"slug": "nic-offloading-fix",
"categories": [
1
],
"date_created": "2025-05-25",
"type": "pve",
"updateable": false,
"privileged": false,
"interface_port": null,
"documentation": null,
"config_path": "",
"website": null,
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/proxmox.webp",
"description": "This script automates the process of disabling network interface card (NIC) offloading features specifically for Intel e1000e network interfaces on Linux systems.",
"install_methods": [
{
"type": "default",
"script": "tools/pve/nic-offloading-fix.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Execute within the Proxmox shell",
"type": "info"
}
]
}

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://stonith404.github.io/pingvin-share/introduction", "documentation": "https://stonith404.github.io/pingvin-share/introduction",

View File

@ -21,7 +21,7 @@
"resources": { "resources": {
"cpu": 2, "cpu": 2,
"ram": 4096, "ram": 4096,
"hdd": 20, "hdd": 32,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,35 @@
{
"name": "Zot Registry",
"slug": "zot",
"categories": [
13
],
"date_created": "2025-06-06",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://zotregistry.dev/docs/intro/",
"website": "https://zotregistry.dev/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/zot-registry.webp",
"config_path": "/etc/zot/config.json",
"description": "Zot is a cloud-native OCI image registry focused on extensibility, maintainability, and performance. It supports advanced features such as Web UI, security scanning, authentication via htpasswd and OIDC, and more.",
"install_methods": [
{
"type": "default",
"script": "ct/zot-registry.sh",
"resources": {
"cpu": 1,
"ram": 2048,
"hdd": 5,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@ -19,7 +19,11 @@ const getMetadata = async () => {
const getScripts = async () => { const getScripts = async () => {
const filePaths = (await fs.readdir(jsonDir)) const filePaths = (await fs.readdir(jsonDir))
.filter((fileName) => fileName !== metadataFileName && fileName !== versionFileName) .filter((fileName) =>
fileName.endsWith(".json") &&
fileName !== metadataFileName &&
fileName !== versionFileName
)
.map((fileName) => path.resolve(jsonDir, fileName)); .map((fileName) => path.resolve(jsonDir, fileName));
const scripts = await Promise.all( const scripts = await Promise.all(

View File

@ -104,7 +104,7 @@ export default function RootLayout({
<Navbar /> <Navbar />
<div className="flex min-h-screen flex-col justify-center"> <div className="flex min-h-screen flex-col justify-center">
<div className="flex w-full justify-center"> <div className="flex w-full justify-center">
<div className="w-full max-w-7xl "> <div className="w-full max-w-[1440px] ">
<QueryProvider> <QueryProvider>
<NuqsAdapter>{children}</NuqsAdapter> <NuqsAdapter>{children}</NuqsAdapter>
</QueryProvider> </QueryProvider>

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-225px)] overflow-x-hidden mt-3 p-2" className="overflow-y-scroll max-h-[calc(100vh-225px)] overflow-x-hidden p-2"
> >
{items.map((category) => ( {items.map((category) => (
<AccordionItem <AccordionItem

View File

@ -15,12 +15,12 @@ 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 Buttons from "./ScriptItems/Buttons";
import ConfigFile from "./ScriptItems/ConfigFile";
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 InterFaces from "./ScriptItems/InterFaces"; import InterFaces from "./ScriptItems/InterFaces";
import Tooltips from "./ScriptItems/Tooltips"; import Tooltips from "./ScriptItems/Tooltips";
import ConfigFile from "./ScriptItems/ConfigFile";
interface ScriptItemProps { interface ScriptItemProps {
item: Script; item: Script;
@ -120,7 +120,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
}; };
return ( return (
<div className="w-full max-w-5xl mx-auto"> <div className="w-full mx-auto">
<div className="flex w-full flex-col"> <div className="flex w-full flex-col">
<div className="mb-3 flex items-center justify-between"> <div className="mb-3 flex items-center justify-between">
<h2 className="text-2xl font-semibold tracking-tight text-foreground/90">Selected Script</h2> <h2 className="text-2xl font-semibold tracking-tight text-foreground/90">Selected Script</h2>
@ -132,7 +132,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
</button> </button>
</div> </div>
<div className="rounded-xl border border-border/40 bg-gradient-to-b from-card/30 to-background/50 backdrop-blur-sm shadow-sm"> <div className="rounded-xl border border-border bg-gradient-to-b from-card/30 to-background/50 backdrop-blur-sm shadow-sm">
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}> <Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}>
<ScriptHeader item={item} /> <ScriptHeader item={item} />
@ -152,16 +152,18 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
<div className=""> <div className="">
<InstallCommand item={item} /> <InstallCommand item={item} />
</div> </div>
{item.config_path && (
<>
<Separator /> <Separator />
<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"> <h2 className="text-lg font-semibold">Location of config file</h2>
Location of config file
</h2>
</div> </div>
<Separator /> <Separator />
<div className=""> <div className="">
<ConfigFile item={item} /> <ConfigFile configPath={item.config_path} />
</div> </div>
</>
)}
</div> </div>
<DefaultPassword item={item} /> <DefaultPassword item={item} />

View File

@ -1,10 +1,9 @@
import ConfigCopyButton from "@/components/ui/config-copy-button"; import ConfigCopyButton from "@/components/ui/config-copy-button";
import { Script } from "@/lib/types";
export default function ConfigFile({ item }: { item: Script }) { export default function ConfigFile({ configPath }: { configPath: string }) {
return ( return (
<div className="px-4 pb-4"> <div className="px-4 pb-4">
<ConfigCopyButton>{item.config_path ? item.config_path : "No config path set"}</ConfigCopyButton> <ConfigCopyButton>{configPath}</ConfigCopyButton>
</div> </div>
); );
} }

View File

@ -22,7 +22,7 @@ const Sidebar = ({
}, [] as Script[]); }, [] as Script[]);
return ( return (
<div className="flex min-w-72 flex-col sm:max-w-72"> <div className="flex min-w-[350px] flex-col sm:max-w-[350px]">
<div className="flex items-end justify-between pb-4"> <div className="flex items-end justify-between pb-4">
<h1 className="text-xl font-bold">Categories</h1> <h1 className="text-xl font-bold">Categories</h1>
<p className="text-xs italic text-muted-foreground"> <p className="text-xs italic text-muted-foreground">

View File

@ -47,7 +47,7 @@ function ScriptContent() {
setSelectedScript={setSelectedScript} setSelectedScript={setSelectedScript}
/> />
</div> </div>
<div className="mx-7 w-full sm:mx-0 sm:ml-7"> <div className="mx-4 w-full sm:mx-0 sm:ml-4">
{selectedScript && item ? ( {selectedScript && item ? (
<ScriptItem item={item} setSelectedScript={setSelectedScript} /> <ScriptItem item={item} setSelectedScript={setSelectedScript} />
) : ( ) : (

View File

@ -34,7 +34,7 @@ function Navbar() {
isScrolled ? "glass border-b bg-background/50" : "" isScrolled ? "glass border-b bg-background/50" : ""
}`} }`}
> >
<div className="flex h-20 w-full max-w-7xl items-center justify-between sm:flex-row"> <div className="flex h-20 w-full max-w-[1440px] items-center justify-between sm:flex-row">
<Link <Link
href={"/"} href={"/"}
className="flex cursor-pointer w-full justify-center sm:justify-start flex-row-reverse items-center gap-2 font-semibold sm:flex-row" className="flex cursor-pointer w-full justify-center sm:justify-start flex-row-reverse items-center gap-2 font-semibold sm:flex-row"

View File

@ -15,17 +15,12 @@ update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y \
lsb-release lsb-release \
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpg nginx
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 install -y \
nginx \
composer \
php8.3-{bcmath,common,ctype,curl,fileinfo,fpm,gd,intl,mbstring,mysql,xml,cli}
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
PHP_VERSION="8.3" PHP_MODULE="common,ctype,fileinfo,fpm,mysql,cli" install_php
install_composer
install_mariadb install_mariadb
msg_info "Setting up Database" msg_info "Setting up Database"
@ -43,16 +38,12 @@ $STD mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUS
} >>~/2FAuth.creds } >>~/2FAuth.creds
msg_ok "Set up Database" msg_ok "Set up Database"
msg_info "Setup 2FAuth" fetch_and_deploy_gh_release "Bubka/2FAuth"
RELEASE=$(curl -fsSL https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
curl -fsSL "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip" -o "${RELEASE}.zip"
$STD unzip "${RELEASE}.zip"
mv "2FAuth-${RELEASE//v/}/" /opt/2fauth
cd "/opt/2fauth" || return msg_info "Setup 2FAuth"
cd /opt/2fauth
cp .env.example .env cp .env.example .env
IPADDRESS=$(hostname -I | awk '{print $1}') IPADDRESS=$(hostname -I | awk '{print $1}')
sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \ sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \
-e "s|^DB_CONNECTION=$|DB_CONNECTION=mysql|" \ -e "s|^DB_CONNECTION=$|DB_CONNECTION=mysql|" \
-e "s|^DB_DATABASE=$|DB_DATABASE=$DB_NAME|" \ -e "s|^DB_DATABASE=$|DB_DATABASE=$DB_NAME|" \
@ -60,22 +51,16 @@ sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \
-e "s|^DB_PORT=$|DB_PORT=3306|" \ -e "s|^DB_PORT=$|DB_PORT=3306|" \
-e "s|^DB_USERNAME=$|DB_USERNAME=$DB_USER|" \ -e "s|^DB_USERNAME=$|DB_USERNAME=$DB_USER|" \
-e "s|^DB_PASSWORD=$|DB_PASSWORD=$DB_PASS|" .env -e "s|^DB_PASSWORD=$|DB_PASSWORD=$DB_PASS|" .env
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer update --no-plugins --no-scripts $STD composer update --no-plugins --no-scripts
$STD composer install --no-dev --prefer-source --no-plugins --no-scripts $STD composer install --no-dev --prefer-source --no-plugins --no-scripts
$STD php artisan key:generate --force $STD php artisan key:generate --force
$STD php artisan migrate:refresh $STD php artisan migrate:refresh
$STD php artisan passport:install -q -n $STD php artisan passport:install -q -n
$STD php artisan storage:link $STD php artisan storage:link
$STD php artisan config:cache $STD php artisan config:cache
chown -R www-data: /opt/2fauth chown -R www-data: /opt/2fauth
chmod -R 755 /opt/2fauth chmod -R 755 /opt/2fauth
echo "${RELEASE}" >"/opt/2fauth_version.txt"
msg_ok "Setup 2fauth" msg_ok "Setup 2fauth"
msg_info "Configure Service" msg_info "Configure Service"
@ -107,7 +92,6 @@ server {
} }
} }
EOF EOF
systemctl reload nginx systemctl reload nginx
msg_ok "Configured Service" msg_ok "Configured Service"
@ -115,7 +99,6 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -f "/opt/v${RELEASE}.zip"
$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

@ -49,7 +49,7 @@ EOF
sed -i -e 's/\$/\$\$/g' /opt/tinyauth/.env sed -i -e 's/\$/\$\$/g' /opt/tinyauth/.env
cat <<EOF >/etc/init.d/tinyauth cat <<'EOF' >/etc/init.d/tinyauth
#!/sbin/openrc-run #!/sbin/openrc-run
description="Tinyauth Service" description="Tinyauth Service"

View File

@ -14,8 +14,8 @@ network_check
update_os update_os
msg_info "Installing Alpine-Zigbee2MQTT" msg_info "Installing Alpine-Zigbee2MQTT"
mkdir -p /root/.z2m /etc/zigbee2mqtt
$STD apk add zigbee2mqtt $STD apk add zigbee2mqtt
mkdir -p /root/.z2m
ln -s /etc/zigbee2mqtt/ /root/.z2m ln -s /etc/zigbee2mqtt/ /root/.z2m
chown -R root:root /etc/zigbee2mqtt /root/.z2m chown -R root:root /etc/zigbee2mqtt /root/.z2m
sed -i -e 's/#datadir="\/var\/lib\/zigbee2mqtt"/datadir="\/etc\/zigbee2mqtt"/' -e 's/#command_user="zigbee2mqtt"/command_user="root"/' /etc/conf.d/zigbee2mqtt sed -i -e 's/#datadir="\/var\/lib\/zigbee2mqtt"/datadir="\/etc\/zigbee2mqtt"/' -e 's/#command_user="zigbee2mqtt"/command_user="root"/' /etc/conf.d/zigbee2mqtt

View File

@ -23,7 +23,7 @@ install_mariadb
msg_info "Setting up Database" msg_info "Setting up Database"
ROOT_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) ROOT_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
$STD mariadb -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$ROOT_PASS'); flush privileges;" $STD mariadb -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$ROOT_PASS'; flush privileges;"
{ {
echo "Dolibarr DB Credentials" echo "Dolibarr DB Credentials"
echo "MariaDB Root Password: $ROOT_PASS" echo "MariaDB Root Password: $ROOT_PASS"
@ -32,7 +32,7 @@ msg_ok "Set up database"
msg_info "Setup Dolibarr" msg_info "Setup Dolibarr"
BASE="https://sourceforge.net/projects/dolibarr/files/Dolibarr%20installer%20for%20Debian-Ubuntu%20(DoliDeb)/" BASE="https://sourceforge.net/projects/dolibarr/files/Dolibarr%20installer%20for%20Debian-Ubuntu%20(DoliDeb)/"
RELEASE=$(curl -fsSL "$BASE" | grep -oP '(?<=/Dolibarr%20installer%20for%20Debian-Ubuntu%20%28DoliDeb%29/)[^/"]+' | head -n1) RELEASE=$(curl -fsSL "$BASE" | grep -oP '(?<=/Dolibarr%20installer%20for%20Debian-Ubuntu%20%28DoliDeb%29/)\d+(\.\d+)+(?=/)' | sort -V | tail -n1)
FILE=$(curl -fsSL "${BASE}${RELEASE}/" | grep -oP 'dolibarr_[^"]+_all.deb' | head -n1) FILE=$(curl -fsSL "${BASE}${RELEASE}/" | grep -oP 'dolibarr_[^"]+_all.deb' | head -n1)
curl -fsSL "https://netcologne.dl.sourceforge.net/project/dolibarr/Dolibarr%20installer%20for%20Debian-Ubuntu%20(DoliDeb)/${RELEASE}/${FILE}?viasf=1" -o ""$FILE"" curl -fsSL "https://netcologne.dl.sourceforge.net/project/dolibarr/Dolibarr%20installer%20for%20Debian-Ubuntu%20(DoliDeb)/${RELEASE}/${FILE}?viasf=1" -o ""$FILE""
echo "dolibarr dolibarr/reconfigure-webserver multiselect apache2" | debconf-set-selections echo "dolibarr dolibarr/reconfigure-webserver multiselect apache2" | debconf-set-selections

View File

@ -54,7 +54,12 @@ RELEASE=$(curl -fsSL https://api.github.com/repos/etkecc/synapse-admin/releases/
curl -fsSL "https://github.com/etkecc/synapse-admin/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" curl -fsSL "https://github.com/etkecc/synapse-admin/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar xzf "$temp_file" -C /opt/synapse-admin --strip-components=1 tar xzf "$temp_file" -C /opt/synapse-admin --strip-components=1
cd /opt/synapse-admin cd /opt/synapse-admin
$STD yarn global add serve
$STD yarn install --ignore-engines $STD yarn install --ignore-engines
$STD yarn build
mv ./dist ../ && \
rm -rf * && \
mv ../dist ./
msg_ok "Installed Element Synapse" msg_ok "Installed Element Synapse"
msg_info "Creating Service" msg_info "Creating Service"
@ -67,7 +72,7 @@ Requires=matrix-synapse.service
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=/opt/synapse-admin WorkingDirectory=/opt/synapse-admin
ExecStart=/usr/bin/yarn start --host ExecStart=/usr/local/bin/serve -s dist -l 5173
Restart=always Restart=always
[Install] [Install]

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG # Copyright (c) 2021-2025 community-scripts ORG
# Author: quantumryuu # Author: quantumryuu | Co-Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://firefly-iii.org/ # Source: https://firefly-iii.org/
@ -30,7 +30,6 @@ msg_info "Setting up database"
DB_NAME=firefly DB_NAME=firefly
DB_USER=firefly DB_USER=firefly
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
MYSQL_VERSION=$(mariadb --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)
$STD mariadb -u root -e "CREATE DATABASE $DB_NAME;" $STD mariadb -u root -e "CREATE DATABASE $DB_NAME;"
$STD mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" $STD mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
@ -43,6 +42,7 @@ mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRI
msg_ok "Set up database" msg_ok "Set up database"
msg_info "Installing Firefly III (Patience)" msg_info "Installing Firefly III (Patience)"
LOCAL_IP=$(hostname -I | awk '{print $1}')
RELEASE=$(curl -fsSL https://api.github.com/repos/firefly-iii/firefly-iii/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') RELEASE=$(curl -fsSL https://api.github.com/repos/firefly-iii/firefly-iii/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
cd /opt cd /opt
curl -fsSL "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz" -o "FireflyIII-v${RELEASE}.tar.gz" curl -fsSL "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz" -o "FireflyIII-v${RELEASE}.tar.gz"
@ -61,6 +61,14 @@ $STD php artisan firefly:upgrade-database
$STD php artisan firefly:correct-database $STD php artisan firefly:correct-database
$STD php artisan firefly:report-integrity $STD php artisan firefly:report-integrity
$STD php artisan firefly:laravel-passport-keys $STD php artisan firefly:laravel-passport-keys
IMPORTER_RELEASE=$(curl -fsSL https://api.github.com/repos/firefly-iii/data-importer/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
mkdir -p /opt/firefly/dataimporter
cd /opt
curl -fsSL "https://github.com/firefly-iii/data-importer/releases/download/v${IMPORTER_RELEASE}/DataImporter-v${IMPORTER_RELEASE}.tar.gz" -o "DataImporter-v${IMPORTER_RELEASE}.tar.gz"
tar -xzf "DataImporter-v${IMPORTER_RELEASE}.tar.gz" -C /opt/firefly/dataimporter
cp /opt/firefly/dataimporter/.env.example /opt/firefly/dataimporter/.env
sed -i "s#FIREFLY_III_URL=#FIREFLY_III_URL=http://${LOCAL_IP}#g" /opt/firefly/dataimporter/.env
chown -R www-data:www-data /opt/firefly
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed Firefly III" msg_ok "Installed Firefly III"
@ -76,6 +84,17 @@ cat <<EOF >/etc/apache2/sites-available/firefly.conf
Require all granted Require all granted
</Directory> </Directory>
Alias /dataimporter/ /opt/firefly/dataimporter/public/
<Directory /opt/firefly/dataimporter/public/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
ErrorLog /var/log/apache2/error.log ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined CustomLog /var/log/apache2/access.log combined
@ -93,7 +112,8 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -rf /opt/FireflyIII-v${RELEASE}.tar.gz rm -rf "/opt/FireflyIII-v${RELEASE}.tar.gz"
rm -rf "/opt/DataImporter-v${IMPORTER_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

@ -13,7 +13,7 @@ setting_up_container
network_check network_check
update_os update_os
NODE_VERSION="22" install_node_and_modules NODE_VERSION="20" install_node_and_modules
msg_info "Installing FlowiseAI (Patience)" msg_info "Installing FlowiseAI (Patience)"
$STD npm install -g flowise \ $STD npm install -g flowise \

View File

@ -87,7 +87,7 @@ msg_ok "Dependencies Installed"
NODE_VERSION="22" install_node_and_modules NODE_VERSION="22" install_node_and_modules
PG_VERSION="16" install_postgresql PG_VERSION="16" install_postgresql
read -r -p "Install OpenVINO dependencies for Intel HW-accelerated machine-learning? " prompt read -r -p "${TAB3}Install OpenVINO dependencies for Intel HW-accelerated machine-learning? " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
msg_info "Installing OpenVINO dependencies" msg_info "Installing OpenVINO dependencies"
touch ~/.openvino touch ~/.openvino

View File

@ -91,10 +91,26 @@ BROWSER_WEB_URL="http://127.0.0.1:9222"
# If you're planning to use ollama for tagging, uncomment the following lines: # If you're planning to use ollama for tagging, uncomment the following lines:
# OLLAMA_BASE_URL="<OLLAMA_ADDR>" # OLLAMA_BASE_URL="<OLLAMA_ADDR>"
# OLLAMA_KEEP_ALIVE="5m"
# You can change the models used by uncommenting the following lines, and changing them according to your needs: # You can change the models used by uncommenting the following lines, and changing them according to your needs:
# INFERENCE_TEXT_MODEL="gpt-4o-mini" # INFERENCE_TEXT_MODEL="gpt-4o-mini"
# INFERENCE_IMAGE_MODEL="gpt-4o-mini" # INFERENCE_IMAGE_MODEL="gpt-4o-mini"
# Additional inference defaults
# INFERENCE_CONTEXT_LENGTH="2048"
# INFERENCE_ENABLE_AUTO_TAGGING=true
# INFERENCE_ENABLE_AUTO_SUMMARIZATION=false
# Crawler defaults
# CRAWLER_NUM_WORKERS="1"
# CRAWLER_DOWNLOAD_BANNER_IMAGE=true
# CRAWLER_STORE_SCREENSHOT=true
# CRAWLER_FULL_PAGE_SCREENSHOT=false
# CRAWLER_FULL_PAGE_ARCHIVE=false
# CRAWLER_VIDEO_DOWNLOAD=false
# CRAWLER_VIDEO_DOWNLOAD_MAX_SIZE="50"
# CRAWLER_ENABLE_ADBLOCKER=true
EOF EOF
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed karakeep" msg_ok "Installed karakeep"

View File

@ -16,17 +16,25 @@ update_os
msg_info "Installing Kasm Workspaces" msg_info "Installing Kasm Workspaces"
KASM_VERSION=$(curl -fsSL 'https://www.kasmweb.com/downloads' | grep -o 'https://kasm-static-content.s3.amazonaws.com/kasm_release_[^"]*\.tar\.gz' | head -n 1 | sed -E 's/.*release_(.*)\.tar\.gz/\1/') KASM_VERSION=$(curl -fsSL 'https://www.kasmweb.com/downloads' | grep -o 'https://kasm-static-content.s3.amazonaws.com/kasm_release_[^"]*\.tar\.gz' | head -n 1 | sed -E 's/.*release_(.*)\.tar\.gz/\1/')
curl -fsSL -o "/opt/kasm_release_${KASM_VERSION}.tar.gz" "https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz" curl -fsSL -o "/opt/kasm_release_${KASM_VERSION}.tar.gz" "https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz"
tar -xf "/opt/kasm_release_${KASM_VERSION}.tar.gz" -C /opt
printf 'y\ny\ny\n4\n' | bash /opt/kasm_release/install.sh cd /opt
touch ~/kasm-install.output tar -xf "kasm_release_${KASM_VERSION}.tar.gz"
sed -n '/Kasm UI Login Credentials/,$p' ~/kasm-install.output >~/kasm.creds chmod +x /opt/kasm_release/install.sh
printf 'y\ny\ny\n4\n' | bash /opt/kasm_release/install.sh > ~/kasm-install.output 2>&1
cat ~/kasm-install.output | grep -A 20 -i "credentials\|login\|password\|admin" | sed '1i Kasm-Workspaces-Credentials' >~/kasm.creds
msg_ok "Installed Kasm Workspaces" msg_ok "Installed Kasm Workspaces"
motd_ssh motd_ssh
customize customize
msg_info "Displaying Kasm Credentials"
cat ~/kasm.creds
msg_ok "Kasm Credentials displayed"
msg_info "Cleaning up" msg_info "Cleaning up"
$STD rm -f "/opt/kasm_release_${KASM_VERSION}.tar.gz" rm -f /opt/kasm_release_${KASM_VERSION}.tar.gz
rm -f ~/kasm-install.output
$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

@ -0,0 +1,81 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/LibreTranslate/LibreTranslate
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing dependencies"
$STD apt-get install -y --no-install-recommends \
pkg-config \
gcc \
g++ \
libicu-dev
msg_ok "Installed dependencies"
msg_info "Setup Python3"
$STD apt-get install -y \
python3-pip \
python3-dev \
python3-icu
msg_ok "Setup Python3"
setup_uv
fetch_and_deploy_gh_release "LibreTranslate/LibreTranslate"
msg_info "Setup LibreTranslate (Patience)"
cd /opt/libretranslate
$STD uv venv .venv
$STD source .venv/bin/activate
$STD uv pip install --upgrade pip setuptools
$STD uv pip install Babel==2.12.1
$STD .venv/bin/python scripts/compile_locales.py
$STD uv pip install torch==2.2.0 --extra-index-url https://download.pytorch.org/whl/cpu
$STD uv pip install "numpy<2"
$STD uv pip install .
$STD uv pip install libretranslate
$STD .venv/bin/python scripts/install_models.py
cat <<EOF >/opt/libretranslate/.env
LT_PORT=5000
EOF
msg_ok "Installed LibreTranslate"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/libretranslate.service
[Unit]
Description=LibreTranslate
After=network.target
[Service]
User=root
Type=idle
Restart=always
Environment="PATH=/usr/local/lib/python3.11/dist-packages/libretranslate"
EnvironmentFile=/opt/libretranslate/.env
ExecStart=/opt/libretranslate/.venv/bin/python3 /opt/libretranslate/.venv/bin/libretranslate --host * --update-models
ExecReload=/bin/kill -s HUP
KillMode=mixed
TimeoutStopSec=1
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now libretranslate
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -0,0 +1,84 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: vhsdream
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/intri-in/manage-my-damn-life-nextjs
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
NODE_VERSION="20" install_node_and_modules
MYSQL_VERSION="8.0" install_mysql
msg_info "Setting up Database"
DB_NAME="mmdl"
DB_USER="mmdl"
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED by '$DB_PASS';"
$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
{
echo "Manage My Damn Life Credentials"
echo "Database User: $DB_USER"
echo "Database Password: $DB_PASS"
echo "Database Name: $DB_NAME"
} >>~/mmdl.creds
msg_ok "Set up Database"
msg_info "Installing ${APPLICATION}"
RELEASE=$(curl -fsSL https://api.github.com/repos/intri-in/manage-my-damn-life-nextjs/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSLO "https://github.com/intri-in/manage-my-damn-life-nextjs/archive/refs/tags/v${RELEASE}.zip"
unzip -q v"$RELEASE".zip
mv manage-my-damn-life-nextjs-"$RELEASE"/ /opt/mmdl
cp /opt/mmdl/sample.env.local /opt/mmdl/.env
sed -i -e 's|db|localhost|' \
-e "s|myuser|${DB_USER}|" \
-e "s|mypassword|${DB_PASS}|" \
-e 's|5433|3306|' \
-e 's|DB_DIALECT=postgres|DB_DIALECT=mysql|' \
-e "s|sample_install_mmdm|${DB_NAME}|" \
-e "s|=PASSWORD|=$(openssl rand -base64 40 | tr -dc 'a-zA-Z0-9' | head -c40)|" \
/opt/mmdl/.env
cd /opt/mmdl
export NEXT_TELEMETRY_DISABLE=1
export CI="true"
$STD npm install
$STD npm run migrate
$STD npm run build
echo "${RELEASE}" >/opt/mmdl_version.txt
msg_ok "Installed ${APPLICATION}"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/mmdl.service
[Unit]
Description=${APPLICATION} Service
After=network.target mysql.service
[Service]
WorkingDirectory=/opt/mmdl
EnvironmentFile=/opt/mmdl/.env
ExecStart=/usr/bin/npm run start
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now mmdl
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
rm -f ~/v${RELEASE}.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -0,0 +1,36 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://minarca.org/en_CA
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
apt-transport-https \
ca-certificates \
lsb-release
msg_ok "Installed Dependencies"
msg_info "Installing Minarca"
curl -fsSL https://www.ikus-soft.com/archive/minarca/public.key | gpg --dearmor >/usr/share/keyrings/minarca-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/minarca-keyring.gpg] https://nexus.ikus-soft.com/repository/apt-release-$(lsb_release -sc)/ $(lsb_release -sc) main" >/etc/apt/sources.list.d/minarca.list
$STD apt-get update
$STD apt-get install -y minarca-server
msg_ok "Installed Minarca"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -13,6 +13,10 @@ setting_up_container
network_check network_check
update_os update_os
msg_info "Installing dependencies"
$STD apt-get install -y zstd
msg_ok "Installed dependencies"
msg_info "Installing Wastebin" msg_info "Installing Wastebin"
temp_file=$(mktemp) temp_file=$(mktemp)
RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')

View File

@ -78,6 +78,7 @@ msg_ok "Created Service"
motd_ssh motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -f /opt/v${RELEASE}.zip
$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

@ -0,0 +1,65 @@
#!/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://zotregistry.dev/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y apache2-utils
msg_ok "Installed Dependencies"
msg_info "Installing Zot Registry"
RELEASE=$(curl -fsSL https://api.github.com/repos/project-zot/zot/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
curl -fsSL "https://github.com/project-zot/zot/releases/download/${RELEASE}/zot-linux-amd64" -o /usr/bin/zot
chmod +x /usr/bin/zot
chown root:root /usr/bin/zot
mkdir -p /etc/zot
curl -fsSL https://raw.githubusercontent.com/project-zot/zot/refs/heads/main/examples/config-ui.json -o /etc/zot/config.json
ZOTPASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
$STD htpasswd -b -B -c /etc/zot/htpasswd admin "$ZOTPASSWORD"
{
echo "Zot-Credentials"
echo "Zot User: admin"
echo "Zot Password: $ZOTPASSWORD"
} >>~/zot.creds
echo "${RELEASE}" >~/.${APPLICATION}
msg_ok "Installed Zot Registry"
msg_info "Setup Service"
cat <<EOF >/etc/systemd/system/zot.service
[Unit]
Description=OCI Distribution Registry
Documentation=https://zotregistry.dev/
After=network.target auditd.service local-fs.target
[Service]
Type=simple
ExecStart=/usr/bin/zot serve /etc/zot/config.json
Restart=on-failure
User=root
LimitNOFILE=500000
MemoryHigh=2G
MemoryMax=4G
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now zot
msg_ok "Setup Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -39,9 +39,11 @@ post_to_api() {
EOF EOF
) )
RESPONSE=$(curl -fsSL -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \ if [[ "$DIAGNOSTICS" == "yes" ]]; then
RESPONSE=$(curl -s -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "$JSON_PAYLOAD") || true -d "$JSON_PAYLOAD") || true
fi
} }
post_to_api_vm() { post_to_api_vm() {
@ -87,9 +89,11 @@ post_to_api_vm() {
EOF EOF
) )
RESPONSE=$(curl -fsSL -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \ if [[ "$DIAGNOSTICS" == "yes" ]]; then
RESPONSE=$(curl -s -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "$JSON_PAYLOAD") || true -d "$JSON_PAYLOAD") || true
fi
} }
POST_UPDATE_DONE=false POST_UPDATE_DONE=false
@ -115,9 +119,11 @@ post_update_to_api() {
EOF EOF
) )
RESPONSE=$(curl -fsSL -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \ if [[ "$DIAGNOSTICS" == "yes" ]]; then
RESPONSE=$(curl -s -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "$JSON_PAYLOAD") || true -d "$JSON_PAYLOAD") || true
fi
POST_UPDATE_DONE=true POST_UPDATE_DONE=true
} }

View File

@ -379,7 +379,7 @@ write_config() {
CT_TYPE="${CT_TYPE}" CT_TYPE="${CT_TYPE}"
DISK_SIZE="${DISK_SIZE}" DISK_SIZE="${DISK_SIZE}"
CORE_COUNT="${DISK_SIZE}" CORE_COUNT="${CORE_COUNT}"
RAM_SIZE="${RAM_SIZE}" RAM_SIZE="${RAM_SIZE}"
HN="${HN}" HN="${HN}"
BRG="${BRG}" BRG="${BRG}"
@ -411,7 +411,7 @@ EOF
CT_TYPE="${CT_TYPE}" CT_TYPE="${CT_TYPE}"
DISK_SIZE="${DISK_SIZE}" DISK_SIZE="${DISK_SIZE}"
CORE_COUNT="${DISK_SIZE}" CORE_COUNT="${CORE_COUNT}"
RAM_SIZE="${RAM_SIZE}" RAM_SIZE="${RAM_SIZE}"
HN="${HN}" HN="${HN}"
BRG="${BRG}" BRG="${BRG}"
@ -1090,6 +1090,8 @@ build_container() {
else else
export FUNCTIONS_FILE_PATH="$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)" export FUNCTIONS_FILE_PATH="$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)"
fi fi
export DIAGNOSTICS="$DIAGNOSTICS"
export RANDOM_UUID="$RANDOM_UUID" export RANDOM_UUID="$RANDOM_UUID"
export CACHER="$APT_CACHER" export CACHER="$APT_CACHER"
export CACHER_IP="$APT_CACHER_IP" export CACHER_IP="$APT_CACHER_IP"

View File

@ -77,7 +77,7 @@ error_handler() {
local command="$2" local command="$2"
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
echo -e "\n$error_message" echo -e "\n$error_message"
if [[ "$line_number" -eq 50 ]]; then if [[ "$line_number" -eq 51 ]]; then
echo -e "The silent function has suppressed the error, run the script with verbose mode enabled, which will provide more detailed output.\n" echo -e "The silent function has suppressed the error, run the script with verbose mode enabled, which will provide more detailed output.\n"
post_update_to_api "failed" "No error message, script ran in silent mode" post_update_to_api "failed" "No error message, script ran in silent mode"
else else

View File

@ -227,6 +227,7 @@ install_mariadb() {
local MARIADB_VERSION="${MARIADB_VERSION:-latest}" local MARIADB_VERSION="${MARIADB_VERSION:-latest}"
local DISTRO_CODENAME local DISTRO_CODENAME
DISTRO_CODENAME="$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)" DISTRO_CODENAME="$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)"
CURRENT_OS="$(awk -F= '/^ID=/{print $2}' /etc/os-release)"
# grab dynamic latest LTS version # grab dynamic latest LTS version
if [[ "$MARIADB_VERSION" == "latest" ]]; then if [[ "$MARIADB_VERSION" == "latest" ]]; then
@ -270,7 +271,7 @@ install_mariadb() {
curl -fsSL "https://mariadb.org/mariadb_release_signing_key.asc" | curl -fsSL "https://mariadb.org/mariadb_release_signing_key.asc" |
gpg --dearmor -o /etc/apt/trusted.gpg.d/mariadb.gpg gpg --dearmor -o /etc/apt/trusted.gpg.d/mariadb.gpg
echo "deb [signed-by=/etc/apt/trusted.gpg.d/mariadb.gpg] http://mirror.mariadb.org/repo/${MARIADB_VERSION}/debian ${DISTRO_CODENAME} main" \ echo "deb [signed-by=/etc/apt/trusted.gpg.d/mariadb.gpg] http://mirror.mariadb.org/repo/${MARIADB_VERSION}/${CURRENT_OS} ${DISTRO_CODENAME} main" \
>/etc/apt/sources.list.d/mariadb.list >/etc/apt/sources.list.d/mariadb.list
$STD apt-get update $STD apt-get update
@ -379,17 +380,19 @@ install_php() {
# Deduplicate modules # Deduplicate modules
COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -) COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
local CURRENT_PHP local CURRENT_PHP=""
if command -v php >/dev/null 2>&1; then if command -v php >/dev/null 2>&1; then
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
else
CURRENT_PHP=""
fi fi
if [[ -z "$CURRENT_PHP" ]]; then if [[ -z "$CURRENT_PHP" ]]; then
msg_info "Setup PHP $PHP_VERSION" msg_info "No PHP found, setting up PHP $PHP_VERSION"
elif [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then elif [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
msg_info "PHP $CURRENT_PHP detected, migrating to PHP $PHP_VERSION" msg_info "PHP $CURRENT_PHP detected, migrating to PHP $PHP_VERSION"
$STD apt-get purge -y "php${CURRENT_PHP//./}"* || true
fi
# Ensure Sury repo is available
if [[ ! -f /etc/apt/sources.list.d/php.list ]]; then if [[ ! -f /etc/apt/sources.list.d/php.list ]]; then
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb $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 dpkg -i /tmp/debsuryorg-archive-keyring.deb
@ -398,26 +401,23 @@ install_php() {
$STD apt-get update $STD apt-get update
fi fi
$STD apt-get purge -y "php${CURRENT_PHP//./}"* || true
fi
local MODULE_LIST="php${PHP_VERSION}" local MODULE_LIST="php${PHP_VERSION}"
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES" IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
for mod in "${MODULES[@]}"; do for mod in "${MODULES[@]}"; do
MODULE_LIST+=" php${PHP_VERSION}-${mod}" MODULE_LIST+=" php${PHP_VERSION}-${mod}"
done done
if [[ "$PHP_FPM" == "YES" ]]; then if [[ "$PHP_FPM" == "YES" ]]; then
MODULE_LIST+=" php${PHP_VERSION}-fpm" MODULE_LIST+=" php${PHP_VERSION}-fpm"
fi fi
if [[ "$PHP_APACHE" == "YES" ]]; then if [[ "$PHP_APACHE" == "YES" ]] && [[ -n "$CURRENT_PHP" ]]; then
# Optionally disable old Apache PHP module
if [[ -f /etc/apache2/mods-enabled/php${CURRENT_PHP}.load ]]; then if [[ -f /etc/apache2/mods-enabled/php${CURRENT_PHP}.load ]]; then
$STD a2dismod php${CURRENT_PHP} || true $STD a2dismod php${CURRENT_PHP} || true
fi fi
fi fi
if [[ "$PHP_FPM" == "YES" ]]; then if [[ "$PHP_FPM" == "YES" ]] && [[ -n "$CURRENT_PHP" ]]; then
$STD systemctl stop php${CURRENT_PHP}-fpm || true $STD systemctl stop php${CURRENT_PHP}-fpm || true
$STD systemctl disable php${CURRENT_PHP}-fpm || true $STD systemctl disable php${CURRENT_PHP}-fpm || true
fi fi
@ -435,8 +435,7 @@ install_php() {
fi fi
# Patch all relevant php.ini files # Patch all relevant php.ini files
local PHP_INI_PATHS=() local PHP_INI_PATHS=("/etc/php/${PHP_VERSION}/cli/php.ini")
PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/cli/php.ini")
[[ "$PHP_FPM" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/fpm/php.ini") [[ "$PHP_FPM" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/fpm/php.ini")
[[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini") [[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini")
@ -451,7 +450,6 @@ install_php() {
fi fi
done done
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Installs or updates Composer globally. # Installs or updates Composer globally.
# #

6
tools/headers/add-iptag Normal file
View File

@ -0,0 +1,6 @@
________ ______
/ _/ __ \ /_ __/___ _____ _
/ // /_/ /_____/ / / __ `/ __ `/
_/ // ____/_____/ / / /_/ / /_/ /
/___/_/ /_/ \__,_/\__, /
/____/

View File

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

View File

@ -531,7 +531,9 @@ if [[ ! -f /opt/iptag/iptag ]]; then
cat <<'EOF' >/opt/iptag/iptag cat <<'EOF' >/opt/iptag/iptag
#!/bin/bash #!/bin/bash
# =============== CONFIGURATION =============== # # =============== CONFIGURATION =============== #
CONFIG_FILE="/opt/iptag/iptag.conf" readonly CONFIG_FILE="/opt/iptag/iptag.conf"
readonly DEFAULT_TAG_FORMAT="full"
readonly DEFAULT_CHECK_INTERVAL=60
# Load the configuration file if it exists # Load the configuration file if it exists
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
@ -549,65 +551,40 @@ ip_to_int() {
# Check if IP is in CIDR # Check if IP is in CIDR
ip_in_cidr() { ip_in_cidr() {
local ip="$1" local ip="$1" cidr="$2"
local cidr="$2" ipcalc -c "$ip" "$cidr" >/dev/null 2>&1 || return 1
# Use ipcalc with the -c option (check), which returns 0 if the IP is in the network local network prefix ip_parts net_parts
if ipcalc -c "$ip" "$cidr" >/dev/null 2>&1; then
# Get network address and mask from CIDR
local network prefix
network=$(echo "$cidr" | cut -d/ -f1) network=$(echo "$cidr" | cut -d/ -f1)
prefix=$(echo "$cidr" | cut -d/ -f2) prefix=$(echo "$cidr" | cut -d/ -f2)
IFS=. read -r -a ip_parts <<< "$ip"
IFS=. read -r -a net_parts <<< "$network"
# Check if IP is in the network case $prefix in
local ip_a ip_b ip_c ip_d net_a net_b net_c net_d 8) [[ "${ip_parts[0]}" == "${net_parts[0]}" ]] ;;
IFS=. read -r ip_a ip_b ip_c ip_d <<< "$ip" 16) [[ "${ip_parts[0]}.${ip_parts[1]}" == "${net_parts[0]}.${net_parts[1]}" ]] ;;
IFS=. read -r net_a net_b net_c net_d <<< "$network" 24) [[ "${ip_parts[0]}.${ip_parts[1]}.${ip_parts[2]}" == "${net_parts[0]}.${net_parts[1]}.${net_parts[2]}" ]] ;;
32) [[ "$ip" == "$network" ]] ;;
# Check octets match based on prefix length *) return 1 ;;
local result=0 esac
if (( prefix >= 8 )); then
[[ "$ip_a" != "$net_a" ]] && result=1
fi
if (( prefix >= 16 )); then
[[ "$ip_b" != "$net_b" ]] && result=1
fi
if (( prefix >= 24 )); then
[[ "$ip_c" != "$net_c" ]] && result=1
fi
return $result
fi
return 1
} }
# Format IP address according to the configuration # Format IP address according to the configuration
format_ip_tag() { format_ip_tag() {
local ip="$1" local ip="$1"
local format="${TAG_FORMAT:-full}" local format="${TAG_FORMAT:-$DEFAULT_TAG_FORMAT}"
case "$format" in case "$format" in
"last_octet") "last_octet") echo "${ip##*.}" ;;
echo "${ip##*.}" "last_two_octets") echo "${ip#*.*.}" ;;
;; *) echo "$ip" ;;
"last_two_octets")
echo "${ip#*.*.}"
;;
*)
echo "$ip"
;;
esac esac
} }
# Check if IP is in any CIDRs # Check if IP is in any CIDRs
ip_in_cidrs() { ip_in_cidrs() {
local ip="$1" local ip="$1" cidrs="$2"
local cidrs="$2"
# Check that cidrs is not empty
[[ -z "$cidrs" ]] && return 1 [[ -z "$cidrs" ]] && return 1
local IFS=' ' local IFS=' '
for cidr in $cidrs; do for cidr in $cidrs; do
ip_in_cidr "$ip" "$cidr" && return 0 ip_in_cidr "$ip" "$cidr" && return 0
@ -619,182 +596,162 @@ ip_in_cidrs() {
is_valid_ipv4() { is_valid_ipv4() {
local ip="$1" local ip="$1"
[[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || return 1 [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || return 1
local IFS='.'
local IFS='.' parts
read -ra parts <<< "$ip" read -ra parts <<< "$ip"
for part in "${parts[@]}"; do for part in "${parts[@]}"; do
[[ "$part" =~ ^[0-9]+$ ]] && ((part >= 0 && part <= 255)) || return 1 (( part >= 0 && part <= 255 )) || return 1
done done
return 0 return 0
} }
lxc_status_changed() {
current_lxc_status=$(pct list 2>/dev/null)
if [ "${last_lxc_status}" == "${current_lxc_status}" ]; then
return 1
else
last_lxc_status="${current_lxc_status}"
return 0
fi
}
vm_status_changed() {
current_vm_status=$(qm list 2>/dev/null)
if [ "${last_vm_status}" == "${current_vm_status}" ]; then
return 1
else
last_vm_status="${current_vm_status}"
return 0
fi
}
fw_net_interface_changed() {
current_net_interface=$(ifconfig | grep "^fw")
if [ "${last_net_interface}" == "${current_net_interface}" ]; then
return 1
else
last_net_interface="${current_net_interface}"
return 0
fi
}
# Get VM IPs using MAC addresses and ARP table # Get VM IPs using MAC addresses and ARP table
get_vm_ips() { get_vm_ips() {
local vmid=$1 local vmid=$1 ips="" macs found_ip=false
local ips=""
# Check if VM is running
qm status "$vmid" 2>/dev/null | grep -q "status: running" || return qm status "$vmid" 2>/dev/null | grep -q "status: running" || return
# Get MAC addresses from VM configuration macs=$(qm config "$vmid" 2>/dev/null | grep -E 'net[0-9]+' | grep -oE '[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}')
local macs [[ -z "$macs" ]] && return
macs=$(qm config "$vmid" 2>/dev/null | grep -E 'net[0-9]+' | grep -o -E '[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}')
# Look up IPs from ARP table using MAC addresses
for mac in $macs; do for mac in $macs; do
local ip local ip
ip=$(arp -an 2>/dev/null | grep -i "$mac" | grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}') ip=$(arp -an 2>/dev/null | grep -i "$mac" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}')
if [ -n "$ip" ]; then [[ -n "$ip" ]] && { ips+="$ip "; found_ip=true; }
ips+="$ip "
fi
done done
echo "$ips" if ! $found_ip; then
local agent_ip
agent_ip=$(qm agent "$vmid" network-get-interfaces 2>/dev/null | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' || true)
[[ -n "$agent_ip" ]] && ips+="$agent_ip "
fi
echo "${ips% }"
} }
# Update tags for container or VM # Update tags for container or VM
update_tags() { update_tags() {
local type="$1" local type="$1" vmid="$2" config_cmd="pct"
local vmid="$2"
local config_cmd="pct"
[[ "$type" == "vm" ]] && config_cmd="qm" [[ "$type" == "vm" ]] && config_cmd="qm"
# Get current IPs
local current_ips_full local current_ips_full
if [[ "$type" == "lxc" ]]; then if [[ "$type" == "lxc" ]]; then
# Redirect error output to suppress AppArmor warnings
current_ips_full=$(lxc-info -n "${vmid}" -i 2>/dev/null | grep -E "^IP:" | awk '{print $2}') current_ips_full=$(lxc-info -n "${vmid}" -i 2>/dev/null | grep -E "^IP:" | awk '{print $2}')
else else
current_ips_full=$(get_vm_ips "${vmid}") current_ips_full=$(get_vm_ips "${vmid}")
fi fi
[[ -z "$current_ips_full" ]] && return
# Parse current tags and get valid IPs local current_tags=() next_tags=() current_ip_tags=()
local current_tags=()
local next_tags=()
mapfile -t current_tags < <($config_cmd config "${vmid}" 2>/dev/null | grep tags | awk '{print $2}' | sed 's/;/\n/g') mapfile -t current_tags < <($config_cmd config "${vmid}" 2>/dev/null | grep tags | awk '{print $2}' | sed 's/;/\n/g')
# Separate IP and non-IP tags
for tag in "${current_tags[@]}"; do for tag in "${current_tags[@]}"; do
# Skip tag if it looks like an IP (full or partial) if is_valid_ipv4 "${tag}" || [[ "$tag" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then
if ! is_valid_ipv4 "${tag}" && ! [[ "$tag" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then current_ip_tags+=("${tag}")
else
next_tags+=("${tag}") next_tags+=("${tag}")
fi fi
done done
# Add valid IPs to tags local formatted_ips=() needs_update=false added_ips=()
local added_ips=()
local skipped_ips=()
for ip in ${current_ips_full}; do for ip in ${current_ips_full}; do
if is_valid_ipv4 "${ip}"; then if is_valid_ipv4 "$ip" && ip_in_cidrs "$ip" "${CIDR_LIST[*]}"; then
if ip_in_cidrs "${ip}" "${CIDR_LIST[*]}"; then
local formatted_ip=$(format_ip_tag "$ip") local formatted_ip=$(format_ip_tag "$ip")
next_tags+=("${formatted_ip}") formatted_ips+=("$formatted_ip")
added_ips+=("${formatted_ip}") if [[ ! " ${current_ip_tags[*]} " =~ " ${formatted_ip} " ]]; then
else needs_update=true
skipped_ips+=("${ip}") added_ips+=("$formatted_ip")
next_tags+=("$formatted_ip")
fi fi
fi fi
done done
# Log only if there are changes [[ ${#formatted_ips[@]} -eq 0 ]] && return
if [ ${#added_ips[@]} -gt 0 ]; then
echo "${type^} ${vmid}: added IP tags: ${added_ips[*]}"
fi
# Update if changed # Add existing IP tags that are still valid
if [[ "$(IFS=';'; echo "${current_tags[*]}")" != "$(IFS=';'; echo "${next_tags[*]}")" ]]; then for tag in "${current_ip_tags[@]}"; do
if [[ " ${formatted_ips[*]} " =~ " ${tag} " ]]; then
if [[ ! " ${next_tags[*]} " =~ " ${tag} " ]]; then
next_tags+=("$tag")
fi
fi
done
if [[ "$needs_update" == true ]]; then
echo "${type^} ${vmid}: adding IP tags: ${added_ips[*]}"
$config_cmd set "${vmid}" -tags "$(IFS=';'; echo "${next_tags[*]}")" &>/dev/null $config_cmd set "${vmid}" -tags "$(IFS=';'; echo "${next_tags[*]}")" &>/dev/null
fi fi
} }
# Update all instances of specified type
update_all_tags() {
local type="$1" list_cmd="pct" vmids count=0
[[ "$type" == "vm" ]] && list_cmd="qm"
vmids=$($list_cmd list 2>/dev/null | grep -v VMID | awk '{print $1}')
for vmid in $vmids; do ((count++)); done
echo "Found ${count} running ${type}s"
[[ $count -eq 0 ]] && return
for vmid in $vmids; do
update_tags "$type" "$vmid"
done
}
# Check if status changed # Check if status changed
check_status_changed() { check_status_changed() {
local type="$1" local type="$1" current
local current_status
case "$type" in case "$type" in
"lxc") "lxc") current=$(pct list 2>/dev/null | grep -v VMID) ;;
current_status=$(pct list 2>/dev/null | grep -v VMID) "vm") current=$(qm list 2>/dev/null | grep -v VMID) ;;
[[ "${last_lxc_status}" == "${current_status}" ]] && return 1 "fw") current=$(ifconfig 2>/dev/null | grep "^fw") ;;
last_lxc_status="${current_status}"
;;
"vm")
current_status=$(qm list 2>/dev/null | grep -v VMID)
[[ "${last_vm_status}" == "${current_status}" ]] && return 1
last_vm_status="${current_status}"
;;
"fw")
current_status=$(ifconfig 2>/dev/null | grep "^fw")
[[ "${last_net_interface}" == "${current_status}" ]] && return 1
last_net_interface="${current_status}"
;;
esac esac
local last_var="last_${type}_status"
[[ "${!last_var}" == "$current" ]] && return 1
eval "$last_var='$current'"
return 0 return 0
} }
# Main check function
check() { check() {
local current_time changes_detected=false
current_time=$(date +%s) current_time=$(date +%s)
# Check LXC status # Check LXC status
time_since_last_lxc_status_check=$((current_time - last_lxc_status_check_time)) local time_since_last_lxc_check=$((current_time - last_lxc_status_check_time))
if [[ "${LXC_STATUS_CHECK_INTERVAL}" -gt 0 ]] \ if [[ "${LXC_STATUS_CHECK_INTERVAL:-60}" -gt 0 ]] && \
&& [[ "${time_since_last_lxc_status_check}" -ge "${LXC_STATUS_CHECK_INTERVAL}" ]]; then [[ "${time_since_last_lxc_check}" -ge "${LXC_STATUS_CHECK_INTERVAL:-60}" ]]; then
echo "Checking LXC status..." echo "Checking LXC status..."
last_lxc_status_check_time=${current_time} last_lxc_status_check_time=${current_time}
if check_status_changed "lxc"; then if check_status_changed "lxc"; then
changes_detected=true
update_all_tags "lxc" update_all_tags "lxc"
last_update_lxc_time=${current_time} last_update_lxc_time=${current_time}
fi fi
fi fi
# Check VM status # Check VM status
time_since_last_vm_status_check=$((current_time - last_vm_status_check_time)) local time_since_last_vm_check=$((current_time - last_vm_status_check_time))
if [[ "${VM_STATUS_CHECK_INTERVAL}" -gt 0 ]] \ if [[ "${VM_STATUS_CHECK_INTERVAL:-60}" -gt 0 ]] && \
&& [[ "${time_since_last_vm_status_check}" -ge "${VM_STATUS_CHECK_INTERVAL}" ]]; then [[ "${time_since_last_vm_check}" -ge "${VM_STATUS_CHECK_INTERVAL:-60}" ]]; then
echo "Checking VM status..." echo "Checking VM status..."
last_vm_status_check_time=${current_time} last_vm_status_check_time=${current_time}
if check_status_changed "vm"; then if check_status_changed "vm"; then
changes_detected=true
update_all_tags "vm" update_all_tags "vm"
last_update_vm_time=${current_time} last_update_vm_time=${current_time}
fi fi
fi fi
# Check network interface changes # Check network interface changes
time_since_last_fw_net_interface_check=$((current_time - last_fw_net_interface_check_time)) local time_since_last_fw_check=$((current_time - last_fw_net_interface_check_time))
if [[ "${FW_NET_INTERFACE_CHECK_INTERVAL}" -gt 0 ]] \ if [[ "${FW_NET_INTERFACE_CHECK_INTERVAL:-60}" -gt 0 ]] && \
&& [[ "${time_since_last_fw_net_interface_check}" -ge "${FW_NET_INTERFACE_CHECK_INTERVAL}" ]]; then [[ "${time_since_last_fw_check}" -ge "${FW_NET_INTERFACE_CHECK_INTERVAL:-60}" ]]; then
echo "Checking network interfaces..." echo "Checking network interfaces..."
last_fw_net_interface_check_time=${current_time} last_fw_net_interface_check_time=${current_time}
if check_status_changed "fw"; then if check_status_changed "fw"; then
changes_detected=true
update_all_tags "lxc" update_all_tags "lxc"
update_all_tags "vm" update_all_tags "vm"
last_update_lxc_time=${current_time} last_update_lxc_time=${current_time}
@ -806,26 +763,27 @@ check() {
for type in "lxc" "vm"; do for type in "lxc" "vm"; do
local last_update_var="last_update_${type}_time" local last_update_var="last_update_${type}_time"
local time_since_last_update=$((current_time - ${!last_update_var})) local time_since_last_update=$((current_time - ${!last_update_var}))
if [ ${time_since_last_update} -ge ${FORCE_UPDATE_INTERVAL} ]; then if [[ ${time_since_last_update} -ge ${FORCE_UPDATE_INTERVAL:-1800} ]]; then
echo "Force updating ${type} tags..." echo "Force updating ${type} tags..."
changes_detected=true
update_all_tags "$type" update_all_tags "$type"
eval "${last_update_var}=${current_time}" eval "${last_update_var}=${current_time}"
fi fi
done done
$changes_detected || echo "No changes detected in system status"
} }
# Initialize time variables # Initialize time variables
last_lxc_status_check_time=0 declare -g last_lxc_status="" last_vm_status="" last_fw_status=""
last_vm_status_check_time=0 declare -g last_lxc_status_check_time=0 last_vm_status_check_time=0 last_fw_net_interface_check_time=0
last_fw_net_interface_check_time=0 declare -g last_update_lxc_time=0 last_update_vm_time=0
last_update_lxc_time=0
last_update_vm_time=0
# main: Set the IP tags for all LXC containers and VMs # Main loop
main() { main() {
while true; do while true; do
check check
sleep "${LOOP_INTERVAL}" sleep "${LOOP_INTERVAL:-$DEFAULT_CHECK_INTERVAL}"
done done
} }

View File

@ -1,357 +0,0 @@
#!/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://github.com/gitsang/lxc-iptag
function header_info {
clear
cat <<"EOF"
__ _ ________ ________ ______
/ / | |/ / ____/ / _/ __ \ /_ __/___ _____ _
/ / | / / / // /_/ /_____/ / / __ `/ __ `/
/ /___/ / /___ _/ // ____/_____/ / / /_/ / /_/ /
/_____/_/|_\____/ /___/_/ /_/ \__,_/\__, /
/____/
EOF
}
clear
header_info
APP="LXC IP-Tag"
hostname=$(hostname)
# Farbvariablen
YW=$(echo "\033[33m")
GN=$(echo "\033[1;92m")
RD=$(echo "\033[01;31m")
CL=$(echo "\033[m")
BFR="\\r\\033[K"
HOLD=" "
CM=" ✔️ ${CL}"
CROSS=" ✖️ ${CL}"
# This function enables error handling in the script by setting options and defining a trap for the ERR signal.
catch_errors() {
set -Eeuo pipefail
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
}
# This function is called when an error occurs. It receives the exit code, line number, and command that caused the error, and displays an error message.
error_handler() {
if [ -n "$SPINNER_PID" ] && ps -p "$SPINNER_PID" >/dev/null; then kill "$SPINNER_PID" >/dev/null; fi
printf "\e[?25h"
local exit_code="$?"
local line_number="$1"
local command="$2"
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
echo -e "\n$error_message\n"
}
# This function displays a spinner.
spinner() {
local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local spin_i=0
local interval=0.1
printf "\e[?25l"
local color="${YWB}"
while true; do
printf "\r ${color}%s${CL}" "${frames[spin_i]}"
spin_i=$(((spin_i + 1) % ${#frames[@]}))
sleep "$interval"
done
}
# This function displays an informational message with a yellow color.
msg_info() {
local msg="$1"
echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}"
spinner &
SPINNER_PID=$!
}
# This function displays a success message with a green color.
msg_ok() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
printf "\e[?25h"
local msg="$1"
echo -e "${BFR}${CM}${GN}${msg}${CL}"
}
# This function displays a error message with a red color.
msg_error() {
if [ -n "$SPINNER_PID" ] && ps -p "$SPINNER_PID" >/dev/null; then kill "$SPINNER_PID" >/dev/null; fi
printf "\e[?25h"
local msg="$1"
echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
}
while true; do
read -p "This will install ${APP} on ${hostname}. Proceed? (y/n): " yn
case $yn in
[Yy]*) break ;;
[Nn]*)
msg_error "Installation cancelled."
exit
;;
*) msg_error "Please answer yes or no." ;;
esac
done
if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then
msg_error "This version of Proxmox Virtual Environment is not supported"
msg_error "⚠️ Requires Proxmox Virtual Environment Version 8.0 or later."
msg_error "Exiting..."
sleep 2
exit
fi
FILE_PATH="/usr/local/bin/iptag"
if [[ -f "$FILE_PATH" ]]; then
msg_info "The file already exists: '$FILE_PATH'. Skipping installation."
exit 0
fi
msg_info "Installing Dependencies"
apt-get update &>/dev/null
apt-get install -y ipcalc net-tools &>/dev/null
msg_ok "Installed Dependencies"
msg_info "Setting up IP-Tag Scripts"
mkdir -p /opt/lxc-iptag
msg_ok "Setup IP-Tag Scripts"
msg_info "Setup Default Config"
if [[ ! -f /opt/lxc-iptag/iptag.conf ]]; then
cat <<EOF >/opt/lxc-iptag/iptag.conf
# Configuration file for LXC IP tagging
# List of allowed CIDRs
CIDR_LIST=(
192.168.0.0/16
172.16.0.0/12
10.0.0.0/8
100.64.0.0/10
)
# Interval settings (in seconds)
LOOP_INTERVAL=60
FW_NET_INTERFACE_CHECK_INTERVAL=60
LXC_STATUS_CHECK_INTERVAL=-1
FORCE_UPDATE_INTERVAL=1800
EOF
msg_ok "Setup default config"
else
msg_ok "Default config already exists"
fi
msg_info "Setup Main Function"
if [[ ! -f /opt/lxc-iptag/iptag ]]; then
cat <<'EOF' >/opt/lxc-iptag/iptag
#!/bin/bash
# =============== CONFIGURATION =============== #
CONFIG_FILE="/opt/lxc-iptag/iptag.conf"
# Load the configuration file if it exists
if [ -f "$CONFIG_FILE" ]; then
# shellcheck source=./lxc-iptag.conf
source "$CONFIG_FILE"
fi
# Convert IP to integer for comparison
ip_to_int() {
local ip="${1}"
local a b c d
IFS=. read -r a b c d <<< "${ip}"
echo "$((a << 24 | b << 16 | c << 8 | d))"
}
# Check if IP is in CIDR
ip_in_cidr() {
local ip="${1}"
local cidr="${2}"
ip_int=$(ip_to_int "${ip}")
netmask_int=$(ip_to_int "$(ipcalc -b "${cidr}" | grep Broadcast | awk '{print $2}')")
masked_ip_int=$(( "${ip_int}" & "${netmask_int}" ))
[[ ${ip_int} -eq ${masked_ip_int} ]] && return 0 || return 1
}
# Check if IP is in any CIDRs
ip_in_cidrs() {
local ip="${1}"
local cidrs=()
mapfile -t cidrs < <(echo "${2}" | tr ' ' '\n')
for cidr in "${cidrs[@]}"; do
ip_in_cidr "${ip}" "${cidr}" && return 0
done
return 1
}
# Check if IP is valid
is_valid_ipv4() {
local ip=$1
local regex="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ $ip =~ $regex ]]; then
IFS='.' read -r -a parts <<< "$ip"
for part in "${parts[@]}"; do
if ! [[ $part =~ ^[0-9]+$ ]] || ((part < 0 || part > 255)); then
return 1
fi
done
return 0
else
return 1
fi
}
lxc_status_changed() {
current_lxc_status=$(pct list 2>/dev/null)
if [ "${last_lxc_status}" == "${current_lxc_status}" ]; then
return 1
else
last_lxc_status="${current_lxc_status}"
return 0
fi
}
fw_net_interface_changed() {
current_net_interface=$(ifconfig | grep "^fw")
if [ "${last_net_interface}" == "${current_net_interface}" ]; then
return 1
else
last_net_interface="${current_net_interface}"
return 0
fi
}
# =============== MAIN =============== #
update_lxc_iptags() {
vmid_list=$(pct list 2>/dev/null | grep -v VMID | awk '{print $1}')
for vmid in ${vmid_list}; do
last_tagged_ips=()
current_valid_ips=()
next_tags=()
# Parse current tags
mapfile -t current_tags < <(pct config "${vmid}" | grep tags | awk '{print $2}' | sed 's/;/\n/g')
for current_tag in "${current_tags[@]}"; do
if is_valid_ipv4 "${current_tag}"; then
last_tagged_ips+=("${current_tag}")
continue
fi
next_tags+=("${current_tag}")
done
# Get current IPs
current_ips_full=$(lxc-info -n "${vmid}" -i | awk '{print $2}')
for ip in ${current_ips_full}; do
if is_valid_ipv4 "${ip}" && ip_in_cidrs "${ip}" "${CIDR_LIST[*]}"; then
current_valid_ips+=("${ip}")
next_tags+=("${ip}")
fi
done
# Skip if no ip change
if [[ "$(echo "${last_tagged_ips[@]}" | tr ' ' '\n' | sort -u)" == "$(echo "${current_valid_ips[@]}" | tr ' ' '\n' | sort -u)" ]]; then
echo "Skipping ${vmid} cause ip no changes"
continue
fi
# Set tags
echo "Setting ${vmid} tags from ${current_tags[*]} to ${next_tags[*]}"
pct set "${vmid}" -tags "$(IFS=';'; echo "${next_tags[*]}")"
done
}
check() {
current_time=$(date +%s)
time_since_last_lxc_status_check=$((current_time - last_lxc_status_check_time))
if [[ "${LXC_STATUS_CHECK_INTERVAL}" -gt 0 ]] \
&& [[ "${time_since_last_lxc_status_check}" -ge "${STATUS_CHECK_INTERVAL}" ]]; then
echo "Checking lxc status..."
last_lxc_status_check_time=${current_time}
if lxc_status_changed; then
update_lxc_iptags
last_update_time=${current_time}
return
fi
fi
time_since_last_fw_net_interface_check=$((current_time - last_fw_net_interface_check_time))
if [[ "${FW_NET_INTERFACE_CHECK_INTERVAL}" -gt 0 ]] \
&& [[ "${time_since_last_fw_net_interface_check}" -ge "${FW_NET_INTERFACE_CHECK_INTERVAL}" ]]; then
echo "Checking fw net interface..."
last_fw_net_interface_check_time=${current_time}
if fw_net_interface_changed; then
update_lxc_iptags
last_update_time=${current_time}
return
fi
fi
time_since_last_update=$((current_time - last_update_time))
if [ ${time_since_last_update} -ge ${FORCE_UPDATE_INTERVAL} ]; then
echo "Force updating lxc iptags..."
update_lxc_iptags
last_update_time=${current_time}
return
fi
}
# main: Set the IP tags for all LXC containers
main() {
while true; do
check
sleep "${LOOP_INTERVAL}"
done
}
main
EOF
msg_ok "Setup Main Function"
else
msg_ok "Main Function already exists"
fi
chmod +x /opt/lxc-iptag/iptag
msg_info "Creating Service"
if [[ ! -f /lib/systemd/system/iptag.service ]]; then
cat <<EOF >/lib/systemd/system/iptag.service
[Unit]
Description=LXC IP-Tag service
After=network.target
[Service]
Type=simple
ExecStart=/opt/lxc-iptag/iptag
Restart=always
[Install]
WantedBy=multi-user.target
EOF
msg_ok "Created Service"
else
msg_ok "Service already exists."
fi
msg_ok "Setup IP-Tag Scripts"
msg_info "Starting Service"
systemctl daemon-reload &>/dev/null
systemctl enable -q --now iptag.service &>/dev/null
msg_ok "Started Service"
SPINNER_PID=""
echo -e "\n${APP} installation completed successfully! ${CL}\n"

View File

@ -0,0 +1,227 @@
#!/usr/bin/env bash
# Creates a systemd service to disable NIC offloading features for Intel e1000e interfaces
# Author: rcastley
# License: MIT
YW=$(echo "\033[33m")
YWB=$'\e[93m'
BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m")
CL=$(echo "\033[m")
TAB=" "
CM="${TAB}✔️${TAB}"
CROSS="${TAB}✖️${TAB}"
INFO="${TAB}${TAB}${CL}"
WARN="${TAB}⚠️${TAB}${CL}"
function header_info {
clear
cat <<"EOF"
_ ____________ ____ __________ ___ ____ _ __ __
/ | / / _/ ____/ / __ \/ __/ __/ /___ ____ _____/ (_)___ ____ _ / __ \(_)________ _/ /_ / /__ _____
/ |/ // // / / / / / /_/ /_/ / __ \/ __ `/ __ / / __ \/ __ `/ / / / / / ___/ __ `/ __ \/ / _ \/ ___/
/ /| // // /___ / /_/ / __/ __/ / /_/ / /_/ / /_/ / / / / / /_/ / / /_/ / (__ ) /_/ / /_/ / / __/ /
/_/ |_/___/\____/ \____/_/ /_/ /_/\____/\__,_/\__,_/_/_/ /_/\__, / /_____/_/____/\__,_/_.___/_/\___/_/
/____/
EOF
}
header_info
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
function msg_ok() { echo -e "${CM} ${GN}${1}${CL}"; }
function msg_error() { echo -e "${CROSS} ${RD}${1}${CL}"; }
function msg_warn() { echo -e "${WARN} ${YWB}${1}"; }
# Check for root privileges
if [ "$(id -u)" -ne 0 ]; then
msg_error "Error: This script must be run as root."
exit 1
fi
if ! command -v ethtool >/dev/null 2>&1; then
msg_info "Installing ethtool"
apt-get update &>/dev/null
apt-get install -y ethtool &>/dev/null || { msg_error "Failed to install ethtool. Exiting."; exit 1; }
msg_ok "ethtool installed successfully"
fi
# Get list of network interfaces using Intel e1000e driver
INTERFACES=()
COUNT=0
msg_info "Searching for Intel e1000e interfaces"
for device in /sys/class/net/*; do
interface="$(basename "$device")" # or adjust the rest of the usages below, as mostly you'll use the path anyway
# Skip loopback interface and virtual interfaces
if [[ "$interface" != "lo" ]] && [[ ! "$interface" =~ ^(tap|fwbr|veth|vmbr|bonding_masters) ]]; then
# Check if the interface uses the e1000e driver
driver=$(basename $(readlink -f /sys/class/net/$interface/device/driver 2>/dev/null) 2>/dev/null)
if [[ "$driver" == "e1000e" ]]; then
# Get MAC address for additional identification
mac=$(cat /sys/class/net/$interface/address 2>/dev/null)
INTERFACES+=("$interface" "Intel e1000e NIC ($mac)")
((COUNT++))
fi
fi
done
# Check if any Intel e1000e interfaces were found
if [ ${#INTERFACES[@]} -eq 0 ]; then
whiptail --title "Error" --msgbox "No Intel e1000e network interfaces found!" 10 60
msg_error "No Intel e1000e network interfaces found! Exiting."
exit 1
fi
msg_ok "Found ${BL}$COUNT${GN} Intel e1000e interfaces"
# Create a checklist for interface selection with all interfaces initially checked
INTERFACES_CHECKLIST=()
for ((i=0; i<${#INTERFACES[@]}; i+=2)); do
INTERFACES_CHECKLIST+=("${INTERFACES[i]}" "${INTERFACES[i+1]}" "ON")
done
# Show interface selection checklist
SELECTED_INTERFACES=$(whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --title "Network Interfaces" \
--separate-output --checklist "Select Intel e1000e network interfaces\n(Space to toggle, Enter to confirm):" 15 80 6 \
"${INTERFACES_CHECKLIST[@]}" 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus != 0 ]; then
msg_info "User canceled. Exiting."
exit 0
fi
# Check if any interfaces were selected
if [ -z "$SELECTED_INTERFACES" ]; then
msg_error "No interfaces selected. Exiting."
exit 0
fi
# Convert the selected interfaces into an array
readarray -t INTERFACE_ARRAY <<< "$SELECTED_INTERFACES"
# Show the number of selected interfaces
INTERFACE_COUNT=${#INTERFACE_ARRAY[@]}
# Print selected interfaces
for iface in "${INTERFACE_ARRAY[@]}"; do
msg_ok "Selected interface: ${BL}$iface${CL}"
done
# Ask for confirmation with the list of selected interfaces
CONFIRMATION_MSG="You have selected the following interface(s):\n\n"
for iface in "${INTERFACE_ARRAY[@]}"; do
SPEED=$(cat /sys/class/net/$iface/speed 2>/dev/null)
MAC=$(cat /sys/class/net/$iface/address 2>/dev/null)
CONFIRMATION_MSG+="- $iface (MAC: $MAC, Speed: ${SPEED}Mbps)\n"
done
CONFIRMATION_MSG+="\nThis will create systemd service(s) to disable offloading features.\n\nProceed?"
if ! whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --title "Confirmation" \
--yesno "$CONFIRMATION_MSG" 20 80; then
msg_info "User canceled. Exiting."
exit 0
fi
# Loop through all selected interfaces and create services for each
for SELECTED_INTERFACE in "${INTERFACE_ARRAY[@]}"; do
# Create service name for this interface
SERVICE_NAME="disable-nic-offload-$SELECTED_INTERFACE.service"
SERVICE_PATH="/etc/systemd/system/$SERVICE_NAME"
# Create the service file with e1000e specific optimizations
msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW}"
# Start with the common part of the service file
cat > "$SERVICE_PATH" << EOF
[Unit]
Description=Disable NIC offloading for Intel e1000e interface $SELECTED_INTERFACE
After=network.target
[Service]
Type=oneshot
# Disable all offloading features for Intel e1000e
ExecStart=/sbin/ethtool -K $SELECTED_INTERFACE gso off gro off tso off tx off rx off rxvlan off txvlan off sg off
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
EOF
# Check if service file was created successfully
if [ ! -f "$SERVICE_PATH" ]; then
whiptail --title "Error" --msgbox "Failed to create service file for $SELECTED_INTERFACE!" 10 50
msg_error "Failed to create service file for $SELECTED_INTERFACE! Skipping to next interface."
continue
fi
# Configure this service
{
echo "25"; sleep 0.2
# Reload systemd to recognize the new service
systemctl daemon-reload
echo "50"; sleep 0.2
# Start the service
systemctl start "$SERVICE_NAME"
echo "75"; sleep 0.2
# Enable the service to start on boot
systemctl enable "$SERVICE_NAME"
echo "100"; sleep 0.2
} | whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
# Individual service status
if systemctl is-active --quiet "$SERVICE_NAME"; then
SERVICE_STATUS="Active"
else
SERVICE_STATUS="Inactive"
fi
if systemctl is-enabled --quiet "$SERVICE_NAME"; then
BOOT_STATUS="Enabled"
else
BOOT_STATUS="Disabled"
fi
# Show individual service results
msg_ok "Service for ${BL}$SELECTED_INTERFACE${GN} created and enabled!"
msg_info "${TAB}Service: ${BL}$SERVICE_NAME${YW}"
msg_info "${TAB}Status: ${BL}$SERVICE_STATUS${YW}"
msg_info "${TAB}Start on boot: ${BL}$BOOT_STATUS${YW}"
done
# Prepare summary of all interfaces
SUMMARY_MSG="Services created successfully!\n\n"
SUMMARY_MSG+="Configured Interfaces:\n"
for iface in "${INTERFACE_ARRAY[@]}"; do
SERVICE_NAME="disable-nic-offload-$iface.service"
if systemctl is-active --quiet "$SERVICE_NAME"; then
SVC_STATUS="Active"
else
SVC_STATUS="Inactive"
fi
if systemctl is-enabled --quiet "$SERVICE_NAME"; then
BOOT_SVC_STATUS="Enabled"
else
BOOT_SVC_STATUS="Disabled"
fi
SUMMARY_MSG+="- $iface: $SVC_STATUS, Boot: $BOOT_SVC_STATUS\n"
done
# Show summary results
whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --title "Success" --msgbox "$SUMMARY_MSG" 20 80
msg_ok "Intel e1000e optimization complete for ${#INTERFACE_ARRAY[@]} interface(s)!"
exit 0

View File

@ -57,6 +57,7 @@ MACADDRESS="${TAB}🔗${TAB}${CL}"
VLANTAG="${TAB}🏷️${TAB}${CL}" VLANTAG="${TAB}🏷️${TAB}${CL}"
CREATING="${TAB}🚀${TAB}${CL}" CREATING="${TAB}🚀${TAB}${CL}"
ADVANCED="${TAB}🧩${TAB}${CL}" ADVANCED="${TAB}🧩${TAB}${CL}"
CLOUD="${TAB}☁️${TAB}${CL}"
THIN="discard=on,ssd=1," THIN="discard=on,ssd=1,"
set -e set -e
@ -191,6 +192,7 @@ function default_settings() {
VLAN="" VLAN=""
MTU="" MTU=""
START_VM="yes" START_VM="yes"
CLOUD_INIT="no"
METHOD="default" METHOD="default"
echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
@ -204,6 +206,7 @@ function default_settings() {
echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}"
echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}"
echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}"
echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}no${CL}"
echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above default settings${CL}" echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above default settings${CL}"
} }
@ -373,6 +376,14 @@ function advanced_settings() {
exit-script exit-script
fi fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "CLOUD-INIT" --yesno "Configure the VM with Cloud-init?" --defaultno 10 58); then
echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}yes${CL}"
CLOUD_INIT="yes"
else
echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}no${CL}"
CLOUD_INIT="no"
fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then
echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
START_VM="yes" START_VM="yes"
@ -439,7 +450,11 @@ fi
msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."
msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
msg_info "Retrieving the URL for the Debian 12 Qcow2 Disk Image" msg_info "Retrieving the URL for the Debian 12 Qcow2 Disk Image"
if [ "$CLOUD_INIT" == "yes" ]; then
URL=https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
else
URL=https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-amd64.qcow2 URL=https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-amd64.qcow2
fi
sleep 2 sleep 2
msg_ok "${CL}${BL}${URL}${CL}" msg_ok "${CL}${BL}${URL}${CL}"
curl -f#SL -o "$(basename "$URL")" "$URL" curl -f#SL -o "$(basename "$URL")" "$URL"
@ -474,11 +489,20 @@ qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE}
-name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
if [ "$CLOUD_INIT" == "yes" ]; then
qm set $VMID \
-efidisk0 ${DISK0_REF}${FORMAT} \
-scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
-scsi1 ${STORAGE}:cloudinit \
-boot order=scsi0 \
-serial0 socket >/dev/null
else
qm set $VMID \ qm set $VMID \
-efidisk0 ${DISK0_REF}${FORMAT} \ -efidisk0 ${DISK0_REF}${FORMAT} \
-scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
-boot order=scsi0 \ -boot order=scsi0 \
-serial0 socket >/dev/null -serial0 socket >/dev/null
fi
DESCRIPTION=$( DESCRIPTION=$(
cat <<EOF cat <<EOF
<div align='center'> <div align='center'>