Compare commits

...

143 Commits

Author SHA1 Message Date
2f620240a8 Update CHANGELOG.md (#1457)
Some checks failed
Auto Update .app-headers and Create PR / update-app-headers (push) Waiting to run
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Merge main into update-app-headers / merge-main (push) Has been cancelled
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-13 16:58:45 +01:00
07c9dc4d0a Update Hoarder: Improvement .env location (see PR comment for little migration) (#1325)
* Update .env file location in hoarder-install.sh

* Update .env file location in hoarder.sh

No more need to move around the .env file

* migration of .env to hoarder.env in hoarder.sh

* Update ct/hoarder.sh

Co-authored-by: Mohamed Bassem <me@mbassem.com>

---------

Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <me@mbassem.com>
2025-01-13 16:58:14 +01:00
8caf5e59b3 feat: allow adding SSH authorized key for root (advanced settings) by @dsiebel (#1456)
* feat: allow adding SSH authorized key for root (advanced settings) by @dsiebel

* remove spaces
2025-01-13 16:04:59 +01:00
f8ab39e4d6 Update CHANGELOG.md (#1446)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-13 15:56:37 +01:00
e47d7c4452 Update tandoor.sh: Call version.py to write current version (#1454) 2025-01-13 14:51:46 +01:00
ac64a9de31 GitHub Actions: Fix Shellsheck workflow to only run on changes *.sh files (#1423)
Some checks are pending
Auto Update .app-headers and Create PR / update-app-headers (push) Waiting to run
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Frontend CI/CD / build (push) Waiting to run
Frontend CI/CD / deploy (push) Blocked by required conditions
Merge main into update-app-headers / merge-main (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
2025-01-13 13:02:42 +01:00
737625024e Update kavita.json (#1447) 2025-01-13 12:57:25 +01:00
6958021528 Fix inexistent folder on actualbudget update script (#1444) 2025-01-13 11:02:35 +01:00
cc40b5957d Update CHANGELOG.md (#1420)
Some checks failed
Auto Update .app-headers and Create PR / update-app-headers (push) Has been cancelled
Create Changelog Pull Request / update-changelog-pull-request (push) Has been cancelled
Merge main into update-app-headers / merge-main (push) Has been cancelled
Shellcheck / Shellcheck (push) Has been cancelled
2025-01-11 11:50:39 +01:00
92020fed07 Update CHANGELOG.md (#1419)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-11 10:06:26 +01:00
1476d1b6c4 Update prometheus-install.sh: Service creation fix (#1417) 2025-01-11 09:55:36 +01:00
0d8dcd5643 Update prometheus-alertmanager-install.sh: Service Creation Fix (#1418) 2025-01-11 09:55:06 +01:00
2347a669f2 Update CHANGELOG.md (#1415) 2025-01-11 09:35:02 +01:00
6decf14d2e Prometheus: Fix installation via creating the service file (#1416) 2025-01-11 09:33:21 +01:00
26d73317e8 LubeLogger CT vehicle tag typo fix (#1413) 2025-01-11 07:36:23 +01:00
c772f83e14 Update CHANGELOG.md (#1409)
Some checks failed
Auto Update .app-headers and Create PR / update-app-headers (push) Waiting to run
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Merge main into update-app-headers / merge-main (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Frontend CI/CD / build (push) Has been cancelled
Frontend CI/CD / deploy (push) Has been cancelled
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 18:58:48 +01:00
3051720f58 Fix user in ghost-cli install command (#1408) 2025-01-10 18:22:38 +01:00
1932f5ebcc Update CHANGELOG.md (#1405) 2025-01-10 18:15:03 +01:00
ca391d7448 little fix 2025-01-10 17:15:22 +01:00
376fd6522a Update ghost-install.sh 2025-01-10 17:13:49 +01:00
5855cff8e4 Update App_Header_Merge_update .app-headers_in_update-app-headers 2025-01-10 17:10:24 +01:00
6981774662 Update merge-main.yml 2025-01-10 17:09:58 +01:00
4ead90ef0b little fix tianji 2025-01-10 17:07:48 +01:00
5fc7885347 Update and rename App_Header_Merge_Main_Into_update-app-headers to merge-main.yml 2025-01-10 17:05:42 +01:00
e3d0fb58c9 Rename generate-app-headers.yaml to App_Header_Merge_Into_main.yaml 2025-01-10 17:03:46 +01:00
9b2180857d Rename App_Header_Merge_update .app-headers inupdate-app-headers to App_Header_Merge_update .app-headers_in_update-app-headers 2025-01-10 17:01:52 +01:00
5d7e524578 Create App_Header_Merge_update .app-headers inupdate-app-headers 2025-01-10 17:01:28 +01:00
ad3214acfb Create App_Header_Merge_Main_Into_update-app-headers 2025-01-10 17:00:16 +01:00
5090b62113 add mariadb-server 2025-01-10 16:57:04 +01:00
a0eb6b860c Update check_and_update_json_date.yml: Change path to /json (#1399) 2025-01-10 16:55:21 +01:00
9a4d35b1f2 Prometheus + Alertmanager: Unify scripts for easier maintenance (#1402) 2025-01-10 16:54:58 +01:00
b7a8d3453a Visual Studio Code: Set Workspace recommended extensions (#1398)
Codify the Recommended VS Code Extensions:

- [Shell Syntax](https://marketplace.visualstudio.com/items?itemName=bmalehorn.shell-syntax)
- [ShellCheck](https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck)
- [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)

Documentation: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions
2025-01-10 16:49:53 +01:00
111436c0a0 Update komodo.sh (#1403) 2025-01-10 16:47:06 +01:00
0c0225a052 Update generate-app-headers.yaml 2025-01-10 14:52:32 +01:00
aacb6ca2c9 Update generate-app-headers.yaml 2025-01-10 14:36:06 +01:00
7218c3b90a Update generate-app-headers.yaml 2025-01-10 14:34:18 +01:00
32bc4a3ab5 Update generate-app-headers.yaml 2025-01-10 14:31:45 +01:00
51cbfbdc4f Update generate-app-headers.yaml 2025-01-10 14:30:04 +01:00
d227277311 Update generate-app-headers.yaml 2025-01-10 14:28:50 +01:00
0d2db00dc6 Update generate-app-headers.yaml 2025-01-10 14:25:27 +01:00
1a9320ced8 Update generate-app-headers.yaml 2025-01-10 14:23:29 +01:00
d8931fef4d Update check_and_update_json_date.yml 2025-01-10 14:20:42 +01:00
70ab9ab09e Update generate-app-headers.yaml 2025-01-10 14:20:05 +01:00
02f480998e Update generate-app-headers.yaml 2025-01-10 14:17:40 +01:00
860c541606 Update CHANGELOG.md (#1396)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 14:15:53 +01:00
31b253e99f Update generate-app-headers.yaml 2025-01-10 14:15:22 +01:00
8c6f0ac1de Update generate-app-headers.yaml 2025-01-10 13:46:37 +01:00
cfda535a58 Update generate-app-headers.yaml 2025-01-10 13:45:36 +01:00
5d6bba3db8 Update generate-app-headers.yaml 2025-01-10 13:44:13 +01:00
7a2f5f55e8 Update generate-app-headers.yaml 2025-01-10 13:42:55 +01:00
f275cdd62c New script : Ghost (#1361)
* add Ghost installation and update scripts

* remove unnecessary installation check

* Fixed link for testing

* Set up testing.

* Refactor Ghost installation script to streamline MySQL configuration and consolidate Node.js and npm installation steps

* Update MySQL configuration in installation script to use password for flushing privileges

* Bug fix

* Remove separate npm installation step

* Add ghost-user creation and modify Ghost installation to run as new user

* Create ghost-user with proper permissions and update Ghost setup commands

* Update Ghost installation script to include URL and modify service execution

* Update Ghost installation to Ubuntu 24.04 and modify service execution

* Downgrade Ubuntu installation version from 24.04 to 22.04

* Add npm installation check to Ghost installation script

* Update Ghost installation script to install npm alongside Node.js

* Add update to package list

* Use ghost-cli's systemd set up

* Add NOPASSWD for ghost-user during install and enable Ghost on all interfaces

* Update ghost-user sudoers configuration to temporarely allow all commands without password

* Fix syntax error

* Update ghost version retrieval and configure MySQL with random password

* Update ghost.json and clean ghost-install.sh

* Update ghost installation script to use dynamic database password

* Fix MySQL flush privileges command to use dynamic database password

* Fix variable name for database password in ghost installation script

* Add update success message only if ghost was actually updated

* Remove unnecessary shellcheck directive from ghost.sh

* Change back to community-scripts URLs

* Update ct/ghost.sh

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

* Update install/ghost-install.sh

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

* Update ct/ghost.sh

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

* Update install/ghost-install.sh

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

* Update install/ghost-install.sh

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

* Update install/ghost-install.sh

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

* Update json/ghost.json

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

* Add link to detailed license + Change to Debian 12

* Update license comment format in ghost-install.sh

* remove unneeded spaces

* change date

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-01-10 13:38:03 +01:00
cb60c7fed2 Create check_and_update_json_date.yml (#1395) 2025-01-10 13:36:20 +01:00
88336a2c3b Update CHANGELOG.md (#1387)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 13:23:33 +01:00
34f375032a [core]: add support for custom tags (#1384)
* Add support for custom tags

* Add support for custom tags

* Update advanced Tags
2025-01-10 13:17:44 +01:00
0c44d2d23c Update generate-app-headers.yaml 2025-01-10 13:11:55 +01:00
f7d9fe7c3a Update generate-app-headers.yaml 2025-01-10 13:11:02 +01:00
2dddbaebe4 Update generate-app-headers.yaml 2025-01-10 13:09:46 +01:00
7930764ece [core]: update .app-headers to latest version (#1393)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 13:08:44 +01:00
42375390d6 Update generate-app-headers.yaml 2025-01-10 13:07:06 +01:00
cb8372da3d Update generate-app-headers.yaml 2025-01-10 13:06:06 +01:00
2c4a61d828 [core]: update .app-headers to latest version (#1390)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 13:04:57 +01:00
14cbba17f3 Fix bookstack.sh: Ignore empty folder (#1388) 2025-01-10 13:04:40 +01:00
2ba1bfa3f1 [core]: update .app-headers to latest version (#1389)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 13:04:06 +01:00
24722c7eb8 Update generate-app-headers.yaml 2025-01-10 13:03:26 +01:00
a1422379bd Update generate-app-headers.yaml 2025-01-10 13:02:36 +01:00
2e64b89a9b Update generate-app-headers.yaml 2025-01-10 13:00:27 +01:00
bcf981cb33 Update generate-app-headers.yaml 2025-01-10 12:57:42 +01:00
09f060eb69 Create .app-headers 2025-01-10 12:56:30 +01:00
7c08ec1fc6 Update generate-app-headers.yaml 2025-01-10 12:54:31 +01:00
6e56610e28 Update generate-app-headers.yaml 2025-01-10 12:52:59 +01:00
ece84cbe70 Update generate-app-headers.yaml 2025-01-10 12:51:19 +01:00
bd5cd844bf Update generate-app-headers.yaml 2025-01-10 12:49:58 +01:00
84042b7508 Update generate-app-headers.yaml 2025-01-10 12:46:07 +01:00
d411d965bd Update generate-app-headers.yaml
Some checks failed
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Frontend CI/CD / build (push) Waiting to run
Frontend CI/CD / deploy (push) Blocked by required conditions
Shellcheck / Shellcheck (push) Waiting to run
Update .app-headers in /misc / update-and-merge-pr (push) Has been cancelled
2025-01-10 12:44:25 +01:00
ef44c2d243 Delete misc/.app-headers 2025-01-10 12:41:06 +01:00
86b91f626c Update generate-app-headers.yaml 2025-01-10 12:39:51 +01:00
a65b9c7ba3 Update generate-app-headers.yaml 2025-01-10 12:37:52 +01:00
a46503209f Update generate-app-headers.yaml 2025-01-10 12:22:57 +01:00
a78633a0a4 Update generate-app-headers.yaml 2025-01-10 12:21:27 +01:00
5d0fa7aa16 Update generate-app-headers.yaml 2025-01-10 12:19:11 +01:00
4a3d4a055d Update generate-app-headers.yaml 2025-01-10 12:17:44 +01:00
10927e39ce Update generate-app-headers.yaml 2025-01-10 12:15:52 +01:00
6fc78dca57 Update generate-app-headers.yaml 2025-01-10 12:14:09 +01:00
7dc54da8a3 Update checkmk-install.sh (#1385) 2025-01-10 12:13:51 +01:00
45f241df2e Update generate-app-headers.yaml 2025-01-10 12:09:27 +01:00
535a1b0250 Update generate-app-headers.yaml 2025-01-10 12:08:30 +01:00
4b6b560bbd Update generate-app-headers.yaml 2025-01-10 12:06:37 +01:00
aa3da01005 Update generate-app-headers.yaml 2025-01-10 12:04:38 +01:00
97fb7941f8 Update .app-headers in /misc 2025-01-10 10:59:06 +00:00
626aa2f79e Update CHANGELOG.md (#1383)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 11:50:34 +01:00
775051b928 Update generate-app-headers.yaml 2025-01-10 11:48:08 +01:00
44994bb919 [Core] add Github Action for Generate AppHeaders (figlet remove part 1) (#1382)
* add figlet generation files

* Update generate-app-headers.yaml

* Update generate-app-headers.sh
2025-01-10 11:44:42 +01:00
6f763a5059 Update CHANGELOG.md (#1380)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 11:03:18 +01:00
160c546002 Add initial PR for Contributing & Coding Standard (#920)
* First Design: CONTRIBUTING

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Ideas for CONTRIBUTING.md (#768)

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Add files via upload

* fix var_tags

* add comments to AppName.sh

* Rework Contributing to merge the tow existing Versions

* Remove coding_standards.md

* Fix broken link

* Fix broken link

* UPDATE contributing

* UPDATE contributing

* UPDATE contributing

* Update

* UPDATE

* Update AppName.md

* UPDATE CONTRIBUTING.md

* UPDATE CONTRIBUTING.md

* Fixing some typos

* Update

Co-authored-by: Sébastiaan <se_bastiaan@outlook.com>

* Update Contributing

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <michel.roegl-brunner@htl-braunau.at>
Co-authored-by: Rémi Bédard-Couture <remi.bc@outlook.com>
Co-authored-by: Sébastiaan <se_bastiaan@outlook.com>
2025-01-10 10:33:33 +01:00
5e5a81d2ae Update nzbget.json (#1379) 2025-01-10 10:17:41 +01:00
b6402a0bd7 Update CHANGELOG.md (#1377)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-10 09:25:00 +01:00
77bac7a919 Fix Actualbudget Update (#1376) 2025-01-10 09:18:04 +01:00
749e487032 Update CHANGELOG.md (#1372)
Some checks are pending
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-09 23:07:00 +01:00
be1821b16f Add invalid/wontdo check 2025-01-09 23:05:53 +01:00
baa578c20a add invalid / wontdo check 2025-01-09 23:02:06 +01:00
d8f433c94a fix: unzip to /opt/ (#1370) 2025-01-09 22:53:58 +01:00
3ad50eb427 update CHANGELOG.md 2025-01-09 22:47:26 +01:00
2c24952cd2 Update CHANGELOG.md (#1364)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-09 20:38:09 +01:00
9d2ba6739b [Github Action] Update CHANGELOG.md (#1363)
* Update CHANGELOG.md

* Aktualisieren von CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-01-09 20:37:29 +01:00
3a9d55abf4 Delete calibre (#1362)
Some checks are pending
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Frontend CI/CD / build (push) Waiting to run
Frontend CI/CD / deploy (push) Blocked by required conditions
Shellcheck / Shellcheck (push) Waiting to run
* Delete ct/calibre-server.sh

* Delete json/calibre-server.json

* Delete install/calibre-server-install.sh
2025-01-09 20:09:07 +01:00
8a9e162e9b Update CHANGELOG.md (#1360)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-09 19:10:24 +01:00
0b85f26a4e Fix: Stirling-PDF > LibreOffice/unoconv Integration Issues (#1322)
* Modify install script to install core libreoffice components. Configure a running libreoffice service and setup env variables so they are accessible to StirlingPDF. Modify stirlingPDF service to wait for libreoffice service to start. Enable and explicitly start libreoffice and stirlingPDF services.

* Apply suggestions from code review

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

* Update stirling-pdf-install.sh

---------

Co-authored-by: Michel Roegl-Brunner <michel.roegl-brunner@htl-braunau.at>
2025-01-09 19:10:02 +01:00
14e185af85 Update calibre-server-install.sh (#1359) 2025-01-09 19:07:31 +01:00
5170056078 Update actualbudget.sh 2025-01-09 17:27:59 +01:00
9a7dcef25a Update calibre-server-install.sh 2025-01-09 17:20:47 +01:00
045ba81533 Update CHANGELOG.md (#1353)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-09 17:17:18 +01:00
4985fda206 Update prometheus-alertmanager.json 2025-01-09 17:14:09 +01:00
d8ad4545ad Update calibre-server.sh 2025-01-09 17:10:36 +01:00
179defdd88 Update calibre-server-install.sh 2025-01-09 17:09:47 +01:00
da071d800b Fix Dependency 2025-01-09 16:52:35 +01:00
6653b92972 Increase RAM 2025-01-09 16:48:29 +01:00
bfd6b58406 Increase RAM 2025-01-09 16:48:06 +01:00
189dbf67b6 add libegl1 2025-01-09 16:41:32 +01:00
b2ba72a906 fix certificate issue ps5mqtt 2025-01-09 16:33:44 +01:00
0ce45140c7 fix space in calbre script 2025-01-09 16:29:55 +01:00
c6efe42eee Update CHANGELOG.md (#1352)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-09 16:28:35 +01:00
5c1954c85d Install/update ActualBudget based on releases, not latest master (#1254)
* Install/update ActualBudget based on releases, not latest main

* Use tarballs for actualbudget install/update
2025-01-09 16:25:45 +01:00
e592b80716 New Script: Prometheus Alertmanager (#1272)
* New Script: Prometheus Alertmanager

* Alertmanager: Append v before Release-Version

* Alertmanager: Switch to `/opt` before updating release

* Alertmanager: Split `var_tags` by `;`

* Alertmanager: Change installation of curl, sudo and mc to a oneliner

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

* Alertmanager: Set correct copyright

* Alertmanager: Change the way how the systemd unit file is written to disk

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

* Alertmanager: Changed the way on how we move and delete files

* Alertmanager: Make files executable

* Alertmanager: Set correct license and source header

* Update prometheus-alertmanager.json

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-01-09 16:25:06 +01:00
8dd43ddb81 New script: ps5-mqtt (#1198)
* Add ps5-mqtt script

* Update location of currently installed version for ps5-mqtt script

* Add version number to update information for ps5-mqtt script

* Reformat dependencies when installing ps5-mqtt

* Remove superfluous information messages when installing ps5-mqtt

* Remove superfluous comment from ps5-mqtt install script

* Improve wording for the config location for the ps5-mqtt script

* Remove superfluous empty lines in ps5-mqtt install script

* Reorder code structure for ps5-mqtt script

* Remove superfluous .service string vom systemctl calls in ps5-mqtt script

* Refactor handling with folders in the ps5-mqtt script

* Reorder code in ps5-mqtt script

* Reorder the code for getting release version in ps5-mqtt script

* Update ps5-mqtt-install.sh

* Update ps5-mqtt-install.sh

* Update ps5-mqtt.json

* Update

* Update ps5-mqtt-install.sh

* Fix npm

* Fix Date in json

---------

Co-authored-by: Michel Roegl-Brunner <michel.roegl-brunner@htl-braunau.at>
2025-01-09 16:23:18 +01:00
eb8ebfe7e4 New Script: calibre-server (#960)
* init commit

* spaghetti

* Refactor calibre-server scripts: Update license link, correct variable tag case, and add newline in success message

* Update

* Update calibre-server.sh

* Update calibre-server-install.sh

* Update calibre-server.json

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-01-09 16:21:30 +01:00
d56d8dd369 Fix: AdventureLog - update script bug (#1334)
* refactor: move installation for backup and maintain media and env files

* fix: return to working directory

* Workdir

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

* Workdir

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

* Avoid Workdir

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

* Avoid Workdir

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

* Remove old installation (at request of @michelroegl-brunner)

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

* rm newline

* rm last version

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-01-09 15:53:47 +01:00
5af9dd9e45 Rename validate-formatting.yaml to validate-formatting.yaml.bak 2025-01-09 15:51:54 +01:00
ec1e5b3a4a Rename validate-scripts.yml to validate-scripts.yml.bak 2025-01-09 15:51:33 +01:00
37f4a841a6 Update validate-scripts.yml 2025-01-09 15:47:37 +01:00
02401aa35d Update validate-scripts.yml 2025-01-09 15:42:18 +01:00
2646ea6317 Update validate-formatting.yaml 2025-01-09 15:39:31 +01:00
6b183c9e4e Validate and auto-fix script formatting 2025-01-09 15:36:40 +01:00
19e7751fb9 Update CHANGELOG.md (#1345)
Some checks failed
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Validate script formatting / Check changed files (push) Has been cancelled
Validate scripts / Check changed files (push) Has been cancelled
2025-01-09 09:35:00 +01:00
3bb26b7b41 only validate scripts in validate-scripts workflow (#1344) 2025-01-09 09:33:50 +01:00
2d3506c7d3 Update CHANGELOG.md (#1343) 2025-01-09 09:33:13 +01:00
e70a3a4b4d Fix Checkmk Version grep (#1341) 2025-01-09 09:29:25 +01:00
f428146c47 Update CHANGELOG.md (#1336)
Some checks are pending
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Validate script formatting / Check changed files (push) Waiting to run
Validate scripts / Check changed files (push) Waiting to run
2025-01-08 23:05:14 +01:00
0059adecf1 fix(ci): formatting event & chmod +x (#1335) 2025-01-08 21:41:58 +01:00
e1daaa6409 Update CHANGELOG.md (#1328)
Some checks are pending
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Validate script formatting / Check changed files (push) Waiting to run
Validate scripts / Check changed files (push) Waiting to run
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-08 16:33:40 +01:00
ff712bc36e fix: correctly handle pull_request_target event (#1327)
* Fix workflow on pull_request_target

* fix fromJSON
2025-01-08 16:33:09 +01:00
9330e9a640 Update CHANGELOG.md (#1324)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-08 13:36:05 +01:00
5fc783da67 update postgresql json to add post install password setup (#1318)
Some checks failed
Create Changelog Pull Request / update-changelog-pull-request (push) Waiting to run
Shellcheck / Shellcheck (push) Waiting to run
Validate script formatting / Check changed files (push) Waiting to run
Validate scripts / Check changed files (push) Waiting to run
Frontend CI/CD / build (push) Has been cancelled
Frontend CI/CD / deploy (push) Has been cancelled
2025-01-08 08:14:15 +01:00
670d64ec43 Update CHANGELOG.md (#1320)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-01-08 08:13:40 +01:00
49 changed files with 4146 additions and 152 deletions

View File

@ -1,14 +1,105 @@
<div align="center">
<a href="#">
<img src="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo.png" height="100px" />
</a>
</div>
<h2 align="center">Contributing to Proxmox VE Helper Scripts</h2>
Everybody is invited and welcome to contribute to Proxmox VE Helper Scripts.
# Community Scripts Contribution Guide
- Pull requests submitted against [**main**](https://github.com/community-scripts/ProxmoxVE/tree/main) are meticulously scrutinized, so please do not take it personally if the project maintainer rejects your request. By adhering to the established patterns and conventions throughout the codebase, you greatly increase the likelihood that your changes will get merged into [**main**](https://github.com/community-scripts/ProxmoxVE/tree/main).
## **Welcome to the communty-scripts Repository!**
📜 These documents outline the essential coding standards for all our scripts and JSON files. Adhering to these standards ensures that our codebase remains consistent, readable, and maintainable. By following these guidelines, we can improve collaboration, reduce errors, and enhance the overall quality of our project.
### Why Coding Standards Matter
Coding standards are crucial for several reasons:
1. **Consistency**: Consistent code is easier to read, understand, and maintain. It helps new team members quickly get up to speed and reduces the learning curve.
2. **Readability**: Clear and well-structured code is easier to debug and extend. It allows developers to quickly identify and fix issues.
3. **Maintainability**: Code that follows a standard structure is easier to refactor and update. It ensures that changes can be made with minimal risk of introducing new bugs.
4. **Collaboration**: When everyone follows the same standards, it becomes easier to collaborate on code. It reduces friction and misunderstandings during code reviews and merges.
### Scope of These Documents
These documents cover the coding standards for the following types of files in our project:
- **`install/$AppName-install.sh` Scripts**: These scripts are responsible for the installation of applications.
- **`ct/$AppName.sh` Scripts**: These scripts handle the creation and updating of containers.
- **`json/$AppName.json`**: These files store structured data and are used for the website.
Each section provides detailed guidelines on various aspects of coding, including shebang usage, comments, variable naming, function naming, indentation, error handling, command substitution, quoting, script structure, and logging. Additionally, examples are provided to illustrate the application of these standards.
By following the coding standards outlined in this document, we ensure that our scripts and JSON files are of high quality, making our project more robust and easier to manage. Please refer to this guide whenever you create or update scripts and JSON files to maintain a high standard of code quality across the project. 📚🔍
Let's work together to keep our codebase clean, efficient, and maintainable! 💪🚀
## Getting Started
Before contributing, please ensure that you have the following setup:
1. **Visual Studio Code** (recommended for script development)
2. **Recommended VS Code Extensions:**
- [Shell Syntax](https://marketplace.visualstudio.com/items?itemName=bmalehorn.shell-syntax)
- [ShellCheck](https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck)
- [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
### Important Notes
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh) as templates when creating new scripts.
---
# 🚀 The Application Script (ct/AppName.sh)
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/ct/AppName.md).
- These scripts are responsible for container creation, setting the necessary variables and handling the update of the application once installed.
---
# 🛠 The Installation Script (install/AppName-install.sh)
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.md).
- These scripts are responsible for the installation of the application.
---
## 🚀 Building Your Own Scripts
Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh)
---
## 🤝 Contribution Process
### 1. Fork the repository
Fork to your GitHub account
### 2. Clone your fork on your local environment
```bash
git clone https://github.com/yourUserName/ForkName
```
### 3. Create a new branch
```bash
git switch -c your-feature-branch
```
### 4. Change paths in build.func install.func and AppName.sh
To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/head/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`.
### 4. Commit changes (without build.func and install.func!)
```bash
git commit -m "Your commit message"
```
### 5. Push to your fork
```bash
git push origin your-feature-branch
```
### 6. Create a Pull Request
Open a Pull Request from your feature branch to the main repository branch. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
---
## 📚 Pages
- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh)
- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh)
- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/json/AppName.json)
- It is important to stress that complaining about a decision after it has been made is not productive behavior for the pull request submitter. It is crucial for all contributors to respect the decision-making process and collaborate effectively towards achieving the best possible outcome for the project.
- The repository will only accept Alpine applications that make use of the Alpine Package Keeper.

288
.github/CONTRIBUTOR_GUIDE/ct/AppName.md vendored Normal file
View File

@ -0,0 +1,288 @@
# **AppName<span></span>.sh Scripts**
`AppName.sh` scripts found in the `/ct` directory. These scripts are responsible for the installation of the desired application. For this guide we take `/ct/snipeit.sh` as example.
## Table of Contents
- [**AppName.sh Scripts**](#appnamesh-scripts)
- [Table of Contents](#table-of-contents)
- [1. **File Header**](#1-file-header)
- [1.1 **Shebang**](#11-shebang)
- [1.2 **Import Functions**](#12-import-functions)
- [1.3 **Metadata**](#13-metadata)
- [2 **Variables and function import**](#2-variables-and-function-import)
- [2.1 **Default Values**](#21-default-values)
- [2.2 **📋 App output \& base settings**](#22--app-output--base-settings)
- [2.3 **🛠 Core functions**](#23--core-functions)
- [3 **Update function**](#3-update-function)
- [3.1 **Function Header**](#31-function-header)
- [3.2 **Check APP**](#32-check-app)
- [3.3 **Check version**](#33-check-version)
- [3.4 **Verbosity**](#34-verbosity)
- [3.5 **Backups**](#35-backups)
- [3.6 **Cleanup**](#36-cleanup)
- [3.7 **No update function**](#37-no-update-function)
- [4 **End of the script**](#4-end-of-the-script)
- [5. **Contribution checklist**](#5-contribution-checklist)
## 1. **File Header**
### 1.1 **Shebang**
- Use `#!/usr/bin/env bash` as the shebang.
```bash
#!/usr/bin/env bash
```
### 1.2 **Import Functions**
- Import the build.func file.
- When developing your own script, change the URL to your own repository.
> [!CAUTION]
> Before opening a Pull Request, change the URL to point to the community-scripts repo.
Example for development:
```bash
source <(curl -s https://raw.githubusercontent.com/[USER]/[REPO]/refs/heads/[BRANCH]/misc/build.func)
```
Final script:
```bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
```
### 1.3 **Metadata**
- Add clear comments for script metadata, including author, copyright, and license information.
Example:
```bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: [YourUserName]
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: [SOURCE_URL]
```
> [!NOTE]:
>
> - Add your username and source URL
> - For existing scripts, add "| Co-Author [YourUserName]" after the current author
---
## 2 **Variables and function import**
>
> [!NOTE]
> You need to have all this set in your script, otherwise it will not work!
### 2.1 **Default Values**
- This section sets the default values for the container.
- `APP` needs to be set to the application name and must be equal to the filenames of your scripts.
- `var_tags`: You can set Tags for the CT wich show up in the Proxmox UI. Don´t overdo it!
>[!NOTE]
>Description for all Default Values
>
>| Variable | Description | Notes |
>|----------|-------------|-------|
>| `APP` | Application name | Must match ct\AppName.sh |
>| `TAGS` | Proxmox display tags without Spaces, only ; | Limit the number |
>| `var_cpu` | CPU cores | Number of cores |
>| `var_ram` | RAM | In MB |
>| `var_disk` | Disk capacity | In GB |
>| `var_os` | Operating system | alpine, debian, ubuntu |
>| `var_version` | OS version | e.g., 3.20, 11, 12, 20.04 |
>| `var_unprivileged` | Container type | 1 = Unprivileged, 0 = Privileged |
Example:
```bash
APP="SnipeIT"
var_tags="asset-management;foss"
var_cpu="2"
var_ram="2048"
var_disk="4"
var_os="debian"
var_version="12"
var_unprivileged="1"
```
## 2.2 **📋 App output & base settings**
```bash
# App Output & Base Settings
header_info "$APP"
base_settings
```
- `header_info`: Generates ASCII header for APP
- `base_settings`: Allows overwriting variable values
## 2.3 **🛠 Core functions**
```bash
# Core
variables
color
catch_errors
```
- `variables`: Processes input and prepares variables
- `color`: Sets icons, colors, and formatting
- `catch_errors`: Enables error handling
---
## 3 **Update function**
### 3.1 **Function Header**
- If applicable write a function that updates the application and the OS in the container.
- Each update function starts with the same code:
```bash
function update_script() {
header_info
check_container_storage
check_container_resources
```
### 3.2 **Check APP**
- Before doing anything update-wise, check if the app is installed in the container.
Example:
```bash
if [[ ! -d /opt/snipe-it ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
```
### 3.3 **Check version**
- Befoer updating, check if a new version exists.
- We use the `${APPLICATION}_version.txt` file created in `/opt` during the install to compare new versions against the currently installed version.
Example with a Github Release:
```bash
RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to v${RELEASE}"
#DO UPDATE
else
msg_ok "No update required. ${APP} is already at v${RELEASE}."
fi
exit
}
```
### 3.4 **Verbosity**
- Use the appropriate flag (**-q** in the examples) for a command to suppress its output.
Example:
```bash
wget -q
unzip -q
```
- If a command does not come with this functionality use `&>/dev/null` to suppress it's output.
Example:
```bash
php artisan migrate --force &>/dev/null
php artisan config:clear &>/dev/null
```
### 3.5 **Backups**
- Backup user data if necessary.
- Move all user data back in the directory when the update is finished.
>[!NOTE]
>This is not meant to be a permanent backup
Example backup:
```bash
mv /opt/snipe-it /opt/snipe-it-backup
```
Example config restore:
```bash
cp /opt/snipe-it-backup/.env /opt/snipe-it/.env
cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/
cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads
```
### 3.6 **Cleanup**
- Do not forget to remove any temporary files/folders such as zip-files or temporary backups.
Example:
```bash
rm -rf /opt/v${RELEASE}.zip
rm -rf /opt/snipe-it-backup
```
### 3.7 **No update function**
- In case you can not provide a update function use the following code to provide user feedback.
```bash
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/snipeit ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_error "Ther is currently no automatic update function for ${APP}."
exit
}
```
---
## 4 **End of the script**
- `start`: Launches Whiptail dialogue
- `build_container`: Collects and integrates user settings
- `description`: Sets LXC container description
- With `echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"` you can point the user to the IP:PORT/folder needed to access the app.
```bash
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
```
---
## 5. **Contribution checklist**
- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
- [ ] Correct link to *build.func*
- [ ] Metadata (author, license) is included at the top.
- [ ] Variables follow naming conventions.
- [ ] Update function exists.
- [ ] Update functions checks if app is installed an for new version.
- [ ] Update function up temporary files.
- [ ] Script ends with a helpful message for the user to reach the application.

93
.github/CONTRIBUTOR_GUIDE/ct/AppName.sh vendored Normal file
View File

@ -0,0 +1,93 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2024 community-scripts ORG
# Author: [YourUserName]
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: [SOURCE_URL]
# App Default Values
APP="[APP_NAME]"
# Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
TAGS="[TAGS]"
# Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp)
var_cpu="[CPU]"
# Number of cores (1-X) (e.g. 4) - default are 2
var_ram="[RAM]"
# Amount of used RAM in MB (e.g. 2048 or 4096)
var_disk="[DISK]"
# Amount of used disk space in GB (e.g. 4 or 10)
var_os="[OS]"
# Default OS (e.g. debian, ubuntu, alpine)
var_version="[VERSION]"
# Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine)
var_unprivileged="[UNPRIVILEGED]"
# 1 = unprivileged container, 0 = privileged container
# App Output & Base Settings
header_info "$APP"
base_settings
# Core
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
# Check if installation is present | -f for file, -d for folder
if [[ ! -f [INSTALLATION_CHECK_PATH] ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
# Crawling the new version and checking whether an update is required
RELEASE=$(curl -fsSL [RELEASE_URL] | [PARSE_RELEASE_COMMAND])
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Updating $APP"
# Stopping Services
msg_info "Stopping $APP"
systemctl stop [SERVICE_NAME]
msg_ok "Stopped $APP"
# Creating Backup
msg_info "Creating Backup"
tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" [IMPORTANT_PATHS]
msg_ok "Backup Created"
# Execute Update
msg_info "Updating $APP to v${RELEASE}"
[UPDATE_COMMANDS]
msg_ok "Updated $APP to v${RELEASE}"
# Starting Services
msg_info "Starting $APP"
systemctl start [SERVICE_NAME]
sleep 2
msg_ok "Started $APP"
# Cleaning up
msg_info "Cleaning Up"
rm -rf [TEMP_FILES]
msg_ok "Cleanup Completed"
# Last Action
echo "${RELEASE}" >/opt/${APP}_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}:[PORT]${CL}"

View File

@ -0,0 +1,353 @@
# **AppName<span></span>-install.sh Scripts**
`AppName-install.sh` scripts found in the `/install` directory. These scripts are responsible for the installation of the application. For this guide we take `/install/snipeit-install.sh` as example.
## Table of Contents
- [**AppName-install.sh Scripts**](#appname-installsh-scripts)
- [Table of Contents](#table-of-contents)
- [1. **File header**](#1-file-header)
- [1.1 **Shebang**](#11-shebang)
- [1.2 **Comments**](#12-comments)
- [1.3 **Variables and function import**](#13-variables-and-function-import)
- [2. **Variable naming and management**](#2-variable-naming-and-management)
- [2.1 **Naming conventions**](#21-naming-conventions)
- [3. **Dependencies**](#3-dependencies)
- [3.1 **Install all at once**](#31-install-all-at-once)
- [3.2 **Collapse dependencies**](#32-collapse-dependencies)
- [4. **Paths to application files**](#4-paths-to-application-files)
- [5. **Version management**](#5-version-management)
- [5.1 **Install the latest release**](#51-install-the-latest-release)
- [5.2 **Save the version for update checks**](#52-save-the-version-for-update-checks)
- [6. **Input and output management**](#6-input-and-output-management)
- [6.1 **User feedback**](#61-user-feedback)
- [6.2 **Verbosity**](#62-verbosity)
- [7. **String/File Manipulation**](#7-stringfile-manipulation)
- [7.1 **File Manipulation**](#71-file-manipulation)
- [8. **Security practices**](#8-security-practices)
- [8.1 **Password generation**](#81-password-generation)
- [8.2 **File permissions**](#82-file-permissions)
- [9. **Service Configuration**](#9-service-configuration)
- [9.1 **Configuration files**](#91-configuration-files)
- [9.2 **Credential management**](#92-credential-management)
- [9.3 **Enviroment files**](#93-enviroment-files)
- [9.4 **Services**](#94-services)
- [10. **Cleanup**](#10-cleanup)
- [10.1 **Remove temporary files**](#101-remove-temporary-files)
- [10.2 **Autoremove and autoclean**](#102-autoremove-and-autoclean)
- [11. **Best Practices Checklist**](#11-best-practices-checklist)
- [Example: High-Level Script Flow](#example-high-level-script-flow)
## 1. **File header**
### 1.1 **Shebang**
- Use `#!/usr/bin/env bash` as the shebang.
```bash
#!/usr/bin/env bash
```
### 1.2 **Comments**
- Add clear comments for script metadata, including author, copyright, and license information.
- Use meaningful inline comments to explain complex commands or logic.
Example:
```bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: [YourUserName]
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: [SOURCE_URL]
```
> [!NOTE]:
>
> - Add your username
> - When updating/reworking scripts, add "| Co-Author [YourUserName]"
### 1.3 **Variables and function import**
- This sections adds the support for all needed functions and variables.
```bash
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
```
---
## 2. **Variable naming and management**
### 2.1 **Naming conventions**
- Use uppercase names for constants and environment variables.
- Use lowercase names for local script variables.
Example:
```bash
DB_NAME=snipeit_db # Environment-like variable (constant)
db_user="snipeit" # Local variable
```
---
## 3. **Dependencies**
### 3.1 **Install all at once**
- Install all dependencies with a single command if possible
Example:
```bash
$STD apt-get install -y \
curl \
composer \
git \
sudo \
mc \
nginx
```
### 3.2 **Collapse dependencies**
Collapse dependencies to keep the code readable.
Example:
Use
```bash
php8.2-{bcmath,common,ctype}
```
instead of
```bash
php8.2-bcmath php8.2-common php8.2-ctype
```
---
## 4. **Paths to application files**
If possible install the app and all necessary files in `/opt/`
---
## 5. **Version management**
### 5.1 **Install the latest release**
- Always try and install the latest release
- Do not hardcode any version if not absolutely necessary
Example for a git release:
```bash
RELEASE=$(curl -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"
```
### 5.2 **Save the version for update checks**
- Write the installed version into a file.
- This is used for the update function in **AppName.sh** to check for if a Update is needed.
Example:
```bash
echo "${RELEASE}" >"/opt/AppName_version.txt"
```
---
## 6. **Input and output management**
### 6.1 **User feedback**
- Use standard functions like `msg_info`, `msg_ok` or `msg_error` to print status messages.
- Each `msg_info` must be followed with a `msg_ok` before any other output is made.
- Display meaningful progress messages at key stages.
Example:
```bash
msg_info "Installing Dependencies"
$STD apt-get install -y ...
msg_ok "Installed Dependencies"
```
### 6.2 **Verbosity**
- Use the appropiate flag (**-q** in the examples) for a command to suppres its output
Example:
```bash
wget -q
unzip -q
```
- If a command dose not come with such a functionality use `$STD` (a custom standard redirection variable) for managing output verbosity.
Example:
```bash
$STD apt-get install -y nginx
```
---
## 7. **String/File Manipulation**
### 7.1 **File Manipulation**
- Use `sed` to replace placeholder values in configuration files.
Example:
```bash
sed -i -e "s|^DB_DATABASE=.*|DB_DATABASE=$DB_NAME|" \
-e "s|^DB_USERNAME=.*|DB_USERNAME=$DB_USER|" \
-e "s|^DB_PASSWORD=.*|DB_PASSWORD=$DB_PASS|" .env
```
---
## 8. **Security practices**
### 8.1 **Password generation**
- Use `openssl` to generate random passwords.
- Use only alphanumeric values to not introduce unknown behaviour.
Example:
```bash
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
```
### 8.2 **File permissions**
Explicitly set secure ownership and permissions for sensitive files.
Example:
```bash
chown -R www-data: /opt/snipe-it
chmod -R 755 /opt/snipe-it
```
---
## 9. **Service Configuration**
### 9.1 **Configuration files**
Use `cat <<EOF` to write configuration files in a clean and readable way.
Example:
```bash
cat <<EOF >/etc/nginx/conf.d/snipeit.conf
server {
listen 80;
root /opt/snipe-it/public;
index index.php;
}
EOF
```
### 9.2 **Credential management**
Store the generated credentials in a file.
Example:
```bash
USERNAME=username
PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
{
echo "Application-Credentials"
echo "Username: $USERNAME"
echo "Password: $PASSWORD"
} >> ~/application.creds
```
### 9.3 **Enviroment files**
Use `cat <<EOF` to write enviromental files in a clean and readable way.
Example:
```bash
cat <<EOF >/path/to/.env
VARIABLE="value"
PORT=3000
DB_NAME="${DB_NAME}"
EOF
```
### 9.4 **Services**
Enable affected services after configuration changes and start them right away.
Example:
```bash
systemctl enable -q --now nginx
```
---
## 10. **Cleanup**
### 10.1 **Remove temporary files**
Remove temporary files and downloads after use.
Example:
```bash
rm -rf /opt/v${RELEASE}.zip
```
### 10.2 **Autoremove and autoclean**
Remove unused dependencies to reduce disk space usage.
Example:
```bash
apt-get -y autoremove
apt-get -y autoclean
```
---
## 11. **Best Practices Checklist**
- [ ] Shebang is correctly set (`#!/usr/bin/env bash`).
- [ ] Metadata (author, license) is included at the top.
- [ ] Variables follow naming conventions.
- [ ] Sensitive values are dynamically generated.
- [ ] Files and services have proper permissions.
- [ ] Script cleans up temporary files.
---
### Example: High-Level Script Flow
1. Dependencies installation
2. Database setup
3. Download and configure application
4. Service configuration
5. Final cleanup

View File

@ -0,0 +1,86 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2024 community-scripts ORG
# Author: [YourUserName]
# License: MIT
# Source: [SOURCE_URL]
# Import Functions und Setup
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
# Installing Dependencies with the 3 core dependencies (curl;sudo;mc)
msg_info "Installing Dependencies"
$STD apt-get install -y \
curl \
sudo \
mc \
[PACKAGE_1] \
[PACKAGE_2] \
[PACKAGE_3]
msg_ok "Installed Dependencies"
# Template: MySQL Database
msg_info "Setting up Database"
DB_NAME=[DB_NAME]
DB_USER=[DB_USER]
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 WITH mysql_native_password AS PASSWORD('$DB_PASS');"
$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
{
echo "${APPLICATION} Credentials"
echo "Database User: $DB_USER"
echo "Database Password: $DB_PASS"
echo "Database Name: $DB_NAME"
} >> ~/$APP_NAME.creds
msg_ok "Set up Database"
# Temp
# Setup App
msg_info "Setup ${APPLICATION}"
RELEASE=$(curl -s https://api.github.com/repos/[REPO]/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
wget -q "https://github.com/[REPO]/archive/refs/tags/${RELEASE}.zip"
unzip -q ${RELEASE}.zip
mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION}
#
#
#
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Setup ${APPLICATION}"
# Creating Service (if needed)
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/${APPLICATION}.service
[Unit]
Description=${APPLICATION} Service
After=network.target
[Service]
ExecStart=[START_COMMAND]
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now ${APPLICATION}.service
msg_ok "Created Service"
motd_ssh
customize
# Cleanup
msg_info "Cleaning up"
rm -f ${RELEASE}.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
motd_ssh
customize

View File

@ -0,0 +1,34 @@
{
"name": "AppName",
"slug": "appname",
"categories": [
0
],
"date_created": "DATE CREATED",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": DEFAULT-PORT,
"documentation": null,
"website": "LINK TO WEBSITE",
"logo": "LINK TO LOGO",
"description": "Deescription of the app",
"install_methods": [
{
"type": "default",
"script": "ct/AppName.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 4,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@ -0,0 +1,13 @@
# **AppName<span></span>.json Files**
`AppName.json` files found in the `/json` directory. These files are used to provide informations for the website. For this guide we take `/json/snipeit.json` as example.
## Table of Contents
- [**AppName.json Files**](#appnamejson-files)
- [Table of Contents](#table-of-contents)
- [1. JSON Generator](#1-json-generator)
## 1. JSON Generator
Use the [JSON Generator](https://community-scripts.github.io/ProxmoxVE/json-editor) to create this file for your application.

View File

@ -0,0 +1,66 @@
name: Auto Update .app-headers and Create PR
on:
push:
branches:
- main
paths:
- 'ct/**.sh'
jobs:
update-app-headers:
runs-on: ubuntu-latest
steps:
# Step 1: Checkout the repository
- name: Checkout repository
uses: actions/checkout@v2
# Step 2: Set up Git user for committing changes
- name: Set up Git
run: |
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
# Step 3: Ensure .app-headers file exists
- name: Ensure .app-headers file exists
run: |
if [ ! -f ct/.app-headers ]; then
echo "Creating .app-headers file."
touch ct/.app-headers
fi
# Step 4: Process the ct/*.sh files and update .app-headers
- name: Update .app-headers with figlet output
run: |
echo "Updating .app-headers with figlet output."
for script in ct/*.sh; do
if grep -q 'APP=' "$script"; then
APP_NAME=$(grep -oP 'APP=\K\w+' "$script")
echo "Processing $script for APP: \"$APP_NAME\""
figlet "$APP_NAME" >> ct/.app-headers
fi
done
# Step 5: Check out and merge main into the update-app-headers branch without committing
- name: Merge main into update-app-headers
run: |
git fetch origin
git checkout update-app-headers
git merge origin/main --no-ff --no-commit -m "Merge main into update-app-headers"
echo "Merge complete. Please review and commit the changes manually."
# Step 6: Check if a PR exists and create one if it doesn't
- name: Create Pull Request if not exists
run: |
PR_EXISTS=$(gh pr list --head "update-app-headers" --json number --jq '.[].number')
if [ -z "$PR_EXISTS" ]; then
echo "Creating a new PR."
PR_URL=$(gh pr create --title "[core]: update .app-headers to latest version" \
--body "This PR automatically updates the .app-headers file." \
--head update-app-headers \
--base main)
echo "PR created: $PR_URL"
else
echo "PR already exists."
fi

View File

@ -0,0 +1,34 @@
name: Update .app-headers with figlet output
on:
workflow_run:
workflows: ["Merge main into update-app-headers"]
types:
- completed
jobs:
update-app-headers:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Ensure .app-headers file exists silently
run: |
if [ ! -f ct/.app-headers ]; then
touch ct/.app-headers
fi
- name: Update .app-headers with figlet output silently
run: |
for script in ct/*.sh; do
if grep -q 'APP=' "$script"; then
APP_NAME=$(grep -oP 'APP=\K\w+' "$script")
if [ ! -z "$APP_NAME" ]; then
echo "Adding $APP_NAME to .app-headers"
figlet "$APP_NAME" >> ct/.app-headers 2>/dev/null || echo "figlet failed for $APP_NAME"
fi
fi
done
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -71,7 +71,9 @@ jobs:
});
pulls.filter((pr) =>
pr.merged_at && new Date(pr.merged_at) > latestDateInChangelog
pr.merged_at &&
new Date(pr.merged_at) > latestDateInChangelog &&
!pr.labels.some((label) => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
).forEach((pr) => {
const prLabels = pr.labels.map((label) => label.name.toLowerCase());
const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`;
@ -79,12 +81,11 @@ jobs:
for (const { labels, notes } of categorizedPRs) {
const prHasCategoryLabel = labels.some((label) => prLabels.includes(label));
const isUnlabelledCategory = labels.length === 0;
const prShouldBeExcluded = prLabels.includes(process.env.AUTOMATED_PR_LABEL);
if ((prHasCategoryLabel || isUnlabelledCategory) && !prShouldBeExcluded) {
if (prHasCategoryLabel || isUnlabelledCategory) {
notes.push(prNote);
break;
}
};
}
});
return categorizedPRs;

View File

@ -0,0 +1,45 @@
name: Check and Update JSON Date
on:
pull_request:
types: [synchronize, opened, reopened, edited]
paths:
- "json/*.json"
jobs:
update-date:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.12
- name: Install dependencies
run: pip install jq
- name: Find and Update JSON files in /json folder
run: |
TODAY=$(date +%Y-%m-%d)
for file in $(git diff --diff-filter=A --name-only HEAD | grep '^json/.*\.json$'); do
if jq -e '.date_created' $file > /dev/null 2>&1; then
echo "Updating date_created in $file"
jq --arg date "$TODAY" '.date_created = $date' $file > temp.json && mv temp.json $file
git add $file
fi
done
- name: Commit changes
run: |
git config user.name "GitHub Action"
git config user.email "action@github.com"
git commit -m "Update date_created in new JSON files" || echo "No changes to commit"
- name: Push changes
uses: ad-m/github-push-action@v0.6.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -0,0 +1,33 @@
#!/usr/bin/env bash
output_file="./misc/.app-headers"
> "$output_file" # Clear or create the file
current_date=$(date +"%m-%d-%Y")
# Header with date
{
echo "### Generated on $current_date"
echo "##################################################"
echo
} >> "$output_file"
# Find only regular .sh files in ./ct, sort them alphabetically
find ./ct -type f -name "*.sh" | sort | while read -r script; do
# Extract the APP name from the APP line
app_name=$(grep -oP '^APP="\K[^"]+' "$script" 2>/dev/null)
if [[ -n "$app_name" ]]; then
# Generate figlet output
figlet_output=$(figlet -f slant "$app_name")
{
echo "### $(basename "$script")"
echo "APP=$app_name"
echo "$figlet_output"
echo
} >> "$output_file"
else
echo "No APP name found in $script, skipping."
fi
done
echo "Generated combined file at $output_file"

29
.github/workflows/merge-main.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: Merge main into update-app-headers
on:
push:
branches:
- main
paths:
- 'ct/**.sh'
jobs:
merge-main:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Git
run: |
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
- name: Merge main into update-app-headers silently
run: |
git fetch origin
git checkout update-app-headers
git merge origin/main --allow-unrelated-histories --no-commit -m "Merge main into update-app-headers"
git push origin update-app-headers > /dev/null 2>&1 || true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -18,15 +18,45 @@ jobs:
- uses: actions/checkout@v4
- name: Get changed files
id: changes
id: changed-files
uses: tj-actions/changed-files@v45
with:
files: |
**.sh
# This is a manual copy from https://github.com/ludeeus/action-shellcheck/blob/00b27aa7cb85167568cb48a3838b75f4265f2bca/action.yaml#L59
# Why? Because the action is not capable of adding ONLY a list of files.
# We aim to only check the files that have changed.
# This is used as we deal with a codebase that throws a lot of warnings.
# Checking only the changed files is a good compromise to improve the codebase over time.
- name: Download shellcheck
shell: bash
env:
INPUT_VERSION: "v0.10.0"
run: |
if ${{ github.event_name == 'pull_request' }}; then
echo "files=$(git diff --name-only -r HEAD^1 HEAD | xargs)" >> $GITHUB_OUTPUT
if [[ "${{ runner.os }}" == "macOS" ]]; then
osvariant="darwin"
else
echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT
osvariant="linux"
fi
- name: Run ShellCheck
if: steps.changes.outputs.files != ''
baseurl="https://github.com/koalaman/shellcheck/releases/download"
curl -Lso "${{ github.action_path }}/sc.tar.xz" \
"${baseurl}/${INPUT_VERSION}/shellcheck-${INPUT_VERSION}.${osvariant}.x86_64.tar.xz"
tar -xf "${{ github.action_path }}/sc.tar.xz" -C "${{ github.action_path }}"
mv "${{ github.action_path }}/shellcheck-${INPUT_VERSION}/shellcheck" \
"${{ github.action_path }}/shellcheck"
- name: Display shellcheck version
shell: bash
run: |
echo "${{ steps.changes.outputs.files }}" | xargs shellcheck
"${{ github.action_path }}/shellcheck" --version
- name: Run ShellCheck
if: steps.changed-files-specific.outputs.any_changed == 'true'
env:
ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
run: |
echo "${ALL_CHANGED_FILES}" | xargs shellcheck

View File

@ -16,6 +16,7 @@ jobs:
steps:
- name: Get pull request information
if: github.event_name == 'pull_request_target'
uses: actions/github-script@v7
id: pr
with:
@ -30,13 +31,13 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0 # Ensure the full history is fetched for accurate diffing
ref: ${{ fromJSON(steps.pr.outputs.result).merge_commit_sha }}
ref: ${{ github.event_name == 'pull_request_target' && fromJSON(steps.pr.outputs.result).merge_commit_sha || '' }}
- name: Get changed files
id: changed-files
run: |
if ${{ github.event_name == 'pull_request' }}; then
echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | xargs)" >> $GITHUB_OUTPUT
if ${{ github.event_name == 'pull_request_target' }}; then
echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ steps.pr.outputs.result && fromJSON(steps.pr.outputs.result).merge_commit_sha }} | xargs)" >> $GITHUB_OUTPUT
else
echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT
fi
@ -88,7 +89,7 @@ jobs:
fi
- name: Post results and comment
if: always() && steps.check-scripts.outputs.files != '' && steps.check-json.outputs.files != '' && github.event_name == 'pull_request'
if: always() && steps.check-scripts.outputs.files != '' && steps.check-json.outputs.files != '' && github.event_name == 'pull_request_target'
uses: actions/github-script@v7
with:
script: |

View File

@ -14,10 +14,12 @@ jobs:
name: Check changed files
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Get pull request information
if: github.event_name == 'pull_request_target'
uses: actions/github-script@v7
id: pr
with:
@ -32,13 +34,13 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0 # Ensure the full history is fetched for accurate diffing
ref: ${{ fromJSON(steps.pr.outputs.result).merge_commit_sha }}
ref: ${{ github.event_name == 'pull_request_target' && fromJSON(steps.pr.outputs.result).merge_commit_sha || '' }}
- name: Get changed files
id: changed-files
run: |
if ${{ github.event_name == 'pull_request' }}; then
echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
if ${{ github.event_name == 'pull_request_target' }}; then
echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ steps.pr.outputs.result && fromJSON(steps.pr.outputs.result).merge_commit_sha }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
else
echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
fi
@ -59,6 +61,7 @@ jobs:
run: |
set +e
shfmt_output=$(shfmt -d ${{ steps.changed-files.outputs.files }})
if [[ $? -eq 0 ]]; then
exit 0
@ -69,7 +72,7 @@ jobs:
fi
- name: Post comment with results
if: always() && steps.changed-files.outputs.files != '' && github.event_name == 'pull_request'
if: always() && steps.changed-files.outputs.files != '' && github.event_name == 'pull_request_target'
uses: actions/github-script@v7
with:
script: |
@ -101,6 +104,7 @@ jobs:
const existingComment = comments.find(
(comment) => comment.user.login === "github-actions[bot]",
);
if (existingComment) {

View File

@ -16,7 +16,13 @@ jobs:
pull-requests: write
steps:
- name: Debug event payload
run: |
echo "Event name: ${{ github.event_name }}"
echo "Payload: $(cat $GITHUB_EVENT_PATH)"
- name: Get pull request information
if: github.event_name == 'pull_request_target'
uses: actions/github-script@v7
id: pr
with:
@ -30,20 +36,16 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Ensure the full history is fetched for accurate diffing
ref: ${{fromJSON(steps.pr.outputs.result).merge_commit_sha}}
- name: Set execute permission for .sh files
run: |
chmod +x ct/*.sh
fetch-depth: 0
ref: ${{ github.event_name == 'pull_request_target' && fromJSON(steps.pr.outputs.result).merge_commit_sha || '' }}
- name: Get changed files
id: changed-files
run: |
if ${{ github.event_name == 'pull_request' }}; then
echo "files=$(git diff --name-only -r HEAD^1 HEAD | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
if [ "${{ github.event_name }}" == "pull_request_target" ]; then
echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ steps.pr.outputs.result && fromJSON(steps.pr.outputs.result).merge_commit_sha }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
else
echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT
fi
- name: Check build.func line
@ -167,18 +169,18 @@ jobs:
fi
- name: Post results and comment
if: always() && steps.changed-files.outputs.files != '' && github.event_name == 'pull_request'
if: always() && steps.changed-files.outputs.files != '' && github.event_name == 'pull_request_target'
uses: actions/github-script@v7
with:
script: |
const result = '${{ job.status }}' === 'success' ? 'success' : 'failure';
const nonCompliantFiles = {
'Invalid build.func source': "${{ steps.build-func.outputs.files }}",
'Not executable': "${{ steps.check-executable.outputs.files }}",
'Copyright header line missing or invalid': "${{ steps.check-copyright.outputs.files }}",
'Author header line missing or invalid': "${{ steps.check-author.outputs.files }}",
'License header line missing or invalid': "${{ steps.check-license.outputs.files }}",
'Source header line missing or invalid': "${{ steps.check-source.outputs.files }}"
'Invalid build.func source': "${{ steps.build-func.outputs.files || '' }}",
'Not executable': "${{ steps.check-executable.outputs.files || '' }}",
'Copyright header line missing or invalid': "${{ steps.check-copyright.outputs.files || '' }}",
'Author header line missing or invalid': "${{ steps.check-author.outputs.files || '' }}",
'License header line missing or invalid': "${{ steps.check-license.outputs.files || '' }}",
'Source header line missing or invalid': "${{ steps.check-source.outputs.files || '' }}"
};
const issueNumber = context.payload.pull_request ? context.payload.pull_request.number : null;
@ -189,7 +191,11 @@ jobs:
newCommentBody += ':x: We found issues in the following changed files:\n\n';
for (const [check, files] of Object.entries(nonCompliantFiles)) {
if (files) {
newCommentBody += `**${check}:**\n${files.trim().split(' ').map(file => `- ${file}`).join('\n')}\n\n`;
newCommentBody += `**${check}:**\n`;
files.trim().split(' ').forEach(file => {
newCommentBody += `- ${file}: ${check}\n`;
});
newCommentBody += `\n`;
}
}
} else {
@ -204,15 +210,14 @@ jobs:
issue_number: issueNumber
});
const existingComment = comments.find(comment => comment.user.login === 'github-actions[bot]');
const existingComment = comments.find(comment =>
comment.body.includes(`<!-- ${commentIdentifier}-start -->`) &&
comment.user.login === 'github-actions[bot]'
);
if (existingComment) {
if (existingComment.body.includes(commentIdentifier)) {
const re = new RegExp(String.raw`<!-- ${commentIdentifier}-start -->[\s\S]*?<!-- ${commentIdentifier}-end -->`, "");
newCommentBody = existingComment.body.replace(re, newCommentBody);
} else {
newCommentBody = existingComment.body + '\n\n---\n\n' + newCommentBody;
}
const re = new RegExp(String.raw`<!-- ${commentIdentifier}-start -->[\\s\\S]*?<!-- ${commentIdentifier}-end -->`, "m");
newCommentBody = existingComment.body.replace(re, newCommentBody);
await github.rest.issues.updateComment({
...context.repo,

8
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,8 @@
{
"recommendations": [
"bmalehorn.shell-syntax",
"timonwong.shellcheck",
"foxundermoon.shell-format"
],
"unwantedRecommendations": []
}

View File

@ -16,6 +16,110 @@ All LXC instances created using this repository come pre-installed with Midnight
> [!IMPORTANT]
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
## 2025-01-13
### Changed
### 💥 Breaking Changes
- Update Hoarder: Improvement .env location (see PR comment for little migration) [@MahrWe](https://github.com/MahrWe) ([#1325](https://github.com/community-scripts/ProxmoxVE/pull/1325))
### 🚀 Updated Scripts
- Fix: tandoor.sh: Call version.py to write current version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1454](https://github.com/community-scripts/ProxmoxVE/pull/1454))
- Fix inexistent folder on actualbudget update script [@dosten](https://github.com/dosten) ([#1444](https://github.com/community-scripts/ProxmoxVE/pull/1444))
### 🌐 Website
- Update kavita.json: Add info on how to enable folder adding. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1447](https://github.com/community-scripts/ProxmoxVE/pull/1447))
### 🧰 Maintenance
- GitHub Actions: Fix Shellsheck workflow to only run on changes `*.sh` files [@andygrunwald](https://github.com/andygrunwald) ([#1423](https://github.com/community-scripts/ProxmoxVE/pull/1423))
### ❔ Unlabelled
- feat: allow adding SSH authorized key for root (advanced settings) by @dsiebel [@MickLesk](https://github.com/MickLesk) ([#1456](https://github.com/community-scripts/ProxmoxVE/pull/1456))
## 2025-01-11
### Changed
### 🚀 Updated Scripts
- Prometheus: Fix installation via creating the service file [@andygrunwald](https://github.com/andygrunwald) ([#1416](https://github.com/community-scripts/ProxmoxVE/pull/1416))
- Update prometheus-install.sh: Service creation fix [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1417](https://github.com/community-scripts/ProxmoxVE/pull/1417))
- Update prometheus-alertmanager-install.sh: Service Creation Fix [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1418](https://github.com/community-scripts/ProxmoxVE/pull/1418))
- Fix: LubeLogger CT vehicle tag typo [@kkroboth](https://github.com/kkroboth) ([#1413](https://github.com/community-scripts/ProxmoxVE/pull/1413))
## 2025-01-10
### Changed
### ✨ New Scripts
- New script : Ghost [@fabrice1236](https://github.com/fabrice1236) ([#1361](https://github.com/community-scripts/ProxmoxVE/pull/1361))
### 🚀 Updated Scripts
- Fix user in ghost-cli install command [@fabrice1236](https://github.com/fabrice1236) ([#1408](https://github.com/community-scripts/ProxmoxVE/pull/1408))
- Update Prometheus + Alertmanager: Unify scripts for easier maintenance [@andygrunwald](https://github.com/andygrunwald) ([#1402](https://github.com/community-scripts/ProxmoxVE/pull/1402))
- Update komodo.sh: Fix broken paths in update_script(). [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1403](https://github.com/community-scripts/ProxmoxVE/pull/1403))
- Fix: ActualBudget Update-Function [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1376](https://github.com/community-scripts/ProxmoxVE/pull/1376))
- Fix: bookstack.sh - Ignore empty folder [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1388](https://github.com/community-scripts/ProxmoxVE/pull/1388))
- Fix: checkmk-install.sh: Version crawling. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1385](https://github.com/community-scripts/ProxmoxVE/pull/1385))
### 🌐 Website
- Change Website-Category of nzbget [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1379](https://github.com/community-scripts/ProxmoxVE/pull/1379))
### 🧰 Maintenance
- Update check_and_update_json_date.yml: Change path to /json [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1399](https://github.com/community-scripts/ProxmoxVE/pull/1399))
- Visual Studio Code: Set Workspace recommended extensions [@andygrunwald](https://github.com/andygrunwald) ([#1398](https://github.com/community-scripts/ProxmoxVE/pull/1398))
- [core]: add support for custom tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1384](https://github.com/community-scripts/ProxmoxVE/pull/1384))
- [core]: check json date of new prs & update it [@MickLesk](https://github.com/MickLesk) ([#1395](https://github.com/community-scripts/ProxmoxVE/pull/1395))
- Add initial PR for Contributing & Coding Standard [@MickLesk](https://github.com/MickLesk) ([#920](https://github.com/community-scripts/ProxmoxVE/pull/920))
- [Core] add Github Action for Generate AppHeaders (figlet remove part 1) [@MickLesk](https://github.com/MickLesk) ([#1382](https://github.com/community-scripts/ProxmoxVE/pull/1382))
## 2025-01-09
### Changed
### 💥 Breaking Changes
- Removal calibre-server (no Headless Support) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1362](https://github.com/community-scripts/ProxmoxVE/pull/1362))
### ✨ New Scripts
- New Script: Prometheus Alertmanager [@andygrunwald](https://github.com/andygrunwald) ([#1272](https://github.com/community-scripts/ProxmoxVE/pull/1272))
- New script: ps5-mqtt [@liecno](https://github.com/liecno) ([#1198](https://github.com/community-scripts/ProxmoxVE/pull/1198))
### 🚀 Updated Scripts
- Fix: AdventureLog: unzip to /opt/ [@JesperDramsch](https://github.com/JesperDramsch) ([#1370](https://github.com/community-scripts/ProxmoxVE/pull/1370))
- Fix: Stirling-PDF > LibreOffice/unoconv Integration Issues [@m6urns](https://github.com/m6urns) ([#1322](https://github.com/community-scripts/ProxmoxVE/pull/1322))
- Fix: AdventureLog - update script bug [@JesperDramsch](https://github.com/JesperDramsch) ([#1334](https://github.com/community-scripts/ProxmoxVE/pull/1334))
- Install/update ActualBudget based on releases, not latest master [@SpyrosRoum](https://github.com/SpyrosRoum) ([#1254](https://github.com/community-scripts/ProxmoxVE/pull/1254))
- Fix Checkmk: Version grep broken [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1341](https://github.com/community-scripts/ProxmoxVE/pull/1341))
### 🧰 Maintenance
- fix: only validate scripts in validate-scripts workflow [@se-bastiaan](https://github.com/se-bastiaan) ([#1344](https://github.com/community-scripts/ProxmoxVE/pull/1344))
## 2025-01-08
### Changed
### 🌐 Website
- update postgresql json to add post install password setup [@rdiazlugo](https://github.com/rdiazlugo) ([#1318](https://github.com/community-scripts/ProxmoxVE/pull/1318))
### 🧰 Maintenance
- fix(ci): formatting event & chmod +x [@se-bastiaan](https://github.com/se-bastiaan) ([#1335](https://github.com/community-scripts/ProxmoxVE/pull/1335))
- fix: correctly handle pull_request_target event [@se-bastiaan](https://github.com/se-bastiaan) ([#1327](https://github.com/community-scripts/ProxmoxVE/pull/1327))
## 2025-01-07
### Changed
@ -26,6 +130,7 @@ Do not break established syntax in this file, as it is automatically updated by
### 🧰 Maintenance
- fix: permissions of validate pipelines [@se-bastiaan](https://github.com/se-bastiaan) ([#1316](https://github.com/community-scripts/ProxmoxVE/pull/1316))
- Set Execution Rights for GH-Action: Validate Scripts [@MickLesk](https://github.com/MickLesk) ([#1312](https://github.com/community-scripts/ProxmoxVE/pull/1312))
## 2025-01-06

View File

@ -32,13 +32,29 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
if ! command -v jq >/dev/null 2>&1; then
echo "Installing jq..."
apt-get install -y jq >/dev/null 2>&1
echo "Installed jq..."
fi
msg_info "Updating ${APP}"
systemctl stop actualbudget.service
systemctl stop actualbudget
RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name')
TEMPD="$(mktemp -d)"
cd "${TEMPD}"
wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz
mv /opt/actualbudget /opt/actualbudget_bak
mkdir -p /opt/actualbudget/
mv actualbudget-actual-server-*/* /opt/actualbudget/
mv /opt/actualbudget_bak/.env /opt/actualbudget
mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files
cd /opt/actualbudget
git pull &>/dev/null
yarn install &>/dev/null
systemctl start actualbudget.service
msg_ok "Successfully Updated ${APP}"
systemctl start actualbudget
msg_ok "Successfully Updated ${APP} to ${RELEASE}"
rm -rf "${TEMPD}"
rm -rf /opt/actualbudget_bak
exit
}
@ -49,4 +65,4 @@ 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}:5006${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5006${CL}"

View File

@ -40,19 +40,20 @@ function update_script() {
msg_ok "Services Stopped"
msg_info "Updating ${APP} to ${RELEASE}"
cp /opt/adventurelog/backend/server/.env /opt/server.env
cp /opt/adventurelog/frontend/.env /opt/frontend.env
wget -q "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
unzip -q v${RELEASE}.zip
mv AdventureLog-${RELEASE} /opt/adventurelog
mv /opt/server.env /opt/adventurelog/backend/server/.env
mv /opt/adventurelog/ /opt/adventurelog-backup/
wget -qO /opt/v${RELEASE}.zip "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
unzip -q /opt/v${RELEASE}.zip -d /opt/
mv /opt/AdventureLog-${RELEASE} /opt/adventurelog
mv /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
mv /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
cd /opt/adventurelog/backend/server
pip install --upgrade pip &>/dev/null
pip install -r requirements.txt &>/dev/null
python3 manage.py collectstatic --noinput &>/dev/null
python3 manage.py migrate &>/dev/null
mv /opt/frontend.env /opt/adventurelog/frontend/.env
mv /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
cd /opt/adventurelog/frontend
pnpm install &>/dev/null
pnpm run build &>/dev/null
@ -65,7 +66,8 @@ function update_script() {
msg_ok "Started Services"
msg_info "Cleaning Up"
rm -rf v${RELEASE}.zip
rm -rf /opt/v${RELEASE}.zip
rm -rf /opt/adventurelog-backup
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
@ -81,4 +83,4 @@ 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}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

View File

@ -44,9 +44,9 @@ function update_script() {
unzip -q /opt/v${RELEASE}.zip -d /opt
mv /opt/BookStack-${RELEASE} /opt/bookstack
cp /opt/bookstack-backup/.env /opt/bookstack/.env
cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/
cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/
cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/
cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ 2>/dev/null || true
cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ 2>/dev/null || true
cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ 2>/dev/null || true
cd /opt/bookstack
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev &>/dev/null
php artisan migrate --force &>/dev/null

View File

@ -29,7 +29,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | grep -v "*-rc" | tail -n +2 | head -n 1)
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to v${RELEASE}"
omd stop monitoring &>/dev/null

57
ct/ghost.sh Normal file
View File

@ -0,0 +1,57 @@
#!/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: fabrice1236
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://ghost.org/
# App Default Values
APP="Ghost"
var_tags="cms;blog"
var_cpu="2"
var_ram="1024"
var_disk="5"
var_os="debian"
var_version="12"
var_unprivileged="1"
# App Output & Base Settings
header_info "$APP"
base_settings
# Core
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
msg_info "Updating ${APP} LXC"
if command -v ghost &> /dev/null; then
current_version=$(ghost version | grep 'Ghost-CLI version' | awk '{print $3}')
latest_version=$(npm show ghost-cli version)
if [ "$current_version" != "$latest_version" ]; then
msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
npm install -g ghost-cli@latest &> /dev/null
msg_ok "Updated Successfully"
else
msg_ok "${APP} is already at v${current_version}"
fi
else
msg_error "No ${APP} Installation Found!"
exit
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}:2368${CL}"

View File

@ -40,7 +40,10 @@ function update_script() {
msg_ok "Stopped Services"
msg_info "Updating ${APP} to v${RELEASE}"
cd /opt
mv /opt/hoarder/.env /opt/.env
if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then
mkdir -p /etc/hoarder
mv /opt/hoarder/.env /etc/hoarder/hoarder.env
fi
rm -rf /opt/hoarder
wget -q "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip"
unzip -q v${RELEASE}.zip
@ -54,8 +57,7 @@ function update_script() {
export DATA_DIR=/opt/hoarder_data
cd /opt/hoarder/packages/db
pnpm migrate &>/dev/null
mv /opt/.env /opt/hoarder/.env
sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /opt/hoarder/.env
sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/hoarder/hoarder.env
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting Services"
@ -79,4 +81,4 @@ 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}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

View File

@ -34,9 +34,9 @@ function update_script() {
fi
msg_info "Updating ${APP}"
COMPOSE_FILE=""
for file in *.compose.yaml; do
for file in /opt/komodo/*.compose.yaml; do
if [[ "$file" != "compose.env" ]]; then
COMPOSE_FILE="$file"
COMPOSE_FILE="${file#/opt/komodo/}"
break
fi
done
@ -47,15 +47,15 @@ function update_script() {
fi
BACKUP_FILE="${COMPOSE_FILE}.bak_$(date +%Y%m%d_%H%M%S)"
mv "$COMPOSE_FILE" "$BACKUP_FILE" || {
mv "/opt/komodo/$COMPOSE_FILE" "/opt/komodo/$BACKUP_FILE" || {
msg_error "Failed to create backup of $COMPOSE_FILE!"
exit 1
}
GITHUB_URL="https://raw.githubusercontent.com/mbecker20/komodo/main/compose/$COMPOSE_FILE"
wget -q -O "$COMPOSE_FILE" "$GITHUB_URL" || {
msg_error "Failed to download $COMPOSE_FILE from GitHub!"
mv "$BACKUP_FILE" "$COMPOSE_FILE"
GITHUB_URL="https://raw.githubusercontent.com/mbecker20/komodo/main/compose/${COMPOSE_FILE}"
wget -q -O "/opt/komodo/${COMPOSE_FILE}" "$GITHUB_URL" || {
msg_error "Failed to download ${COMPOSE_FILE} from GitHub!"
mv "/opt/komodo/${BACKUP_FILE}" "/opt/komodo/${COMPOSE_FILE}"
exit 1
}

View File

@ -7,7 +7,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
# App Default Values
APP="LubeLogger"
var_tags="verhicle;car"
var_tags="vehicle;car"
var_cpu="1"
var_ram="512"
var_disk="2"

67
ct/prometheus-alertmanager.sh Executable file
View File

@ -0,0 +1,67 @@
#!/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: Andy Grunwald (andygrunwald)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://prometheus.io/
# App Default Values
APP="Prometheus-Alertmanager"
var_tags="monitoring;alerting"
var_cpu="1"
var_ram="1024"
var_disk="2"
var_os="debian"
var_version="12"
var_unprivileged="1"
# App Output & Base Settings
header_info "$APP"
base_settings
# Core
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/systemd/system/prometheus-alertmanager.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping ${APP}"
systemctl stop prometheus-alertmanager
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP} to v${RELEASE}"
cd /opt
wget -q https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz
tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz
cp -rf alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/
rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting ${APP}"
systemctl start prometheus-alertmanager
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
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}:9093${CL}"

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck
# Copyright (c) 2021-2025 community-scripts ORG
# Author: tteck (tteckster)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://prometheus.io/
@ -38,22 +38,21 @@ function update_script() {
systemctl stop prometheus
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP} to ${RELEASE}"
msg_info "Updating ${APP} to v${RELEASE}"
cd /opt
wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz
cd prometheus-${RELEASE}.linux-amd64
cp -rf prometheus promtool /usr/local/bin/
cd ~
cp -rf prometheus-${RELEASE}.linux-amd64/prometheus prometheus-${RELEASE}.linux-amd64/promtool /usr/local/bin/
rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting ${APP}"
systemctl start prometheus
msg_ok "Started ${APP}"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}

76
ct/ps5-mqtt.sh Normal file
View File

@ -0,0 +1,76 @@
#!/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: liecno
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/FunkeyFlo/ps5-mqtt/
# App Default Values
APP="PS5-MQTT"
var_tags="smarthome;automation"
var_cpu="1"
var_ram="512"
var_disk="3"
var_os="debian"
var_version="12"
var_unprivileged="1"
# App Output & Base Settings
header_info "$APP"
base_settings
# Core
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/ps5-mqtt ]]; then
msg_error "No ${APP} installation found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/FunkeyFlo/ps5-mqtt/releases/latest | jq -r '.tag_name')
if [[ "${RELEASE}" != "$(cat /opt/ps5-mqtt_version.txt)" ]]; then
msg_info "Stopping service"
systemctl stop ps5-mqtt
msg_ok "Stopped service"
msg_info "Updating PS5-MQTT to ${RELEASE}"
wget -P /tmp -q https://github.com/FunkeyFlo/ps5-mqtt/archive/refs/tags/${RELEASE}.tar.gz
rm -rf /opt/ps5-mqtt
tar zxf /tmp/${RELEASE}.tar.gz -C /opt
mv /opt/ps5-mqtt-* /opt/ps5-mqtt
rm /tmp/${RELEASE}.tar.gz
echo ${RELEASE} > /opt/ps5-mqtt_version.txt
msg_ok "Updated PS5-MQTT"
msg_info "Building new PS5-MQTT version"
cd /opt/ps5-mqtt/ps5-mqtt/
npm install &>/dev/null
npm run build &>/dev/null
msg_ok "Built new PS5-MQTT version"
msg_info "Starting service"
systemctl start ps5-mqtt
msg_ok "Started service"
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}:8645${CL}"

View File

@ -45,6 +45,8 @@ function update_script() {
cd /opt/tandoor/vue
yarn install >/dev/null 2>&1
yarn build >/dev/null 2>&1
cd /opt/tandoor
python3 version.py &>/dev/null
systemctl restart gunicorn_tandoor
msg_ok "Updated ${APP}"
fi
@ -58,4 +60,4 @@ 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}:8002${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8002${CL}"

View File

@ -36,7 +36,8 @@ function update_script() {
msg_info "Stopping ${APP} Service"
systemctl stop tianji
msg_ok "Stopped ${APP} Service"
msg_info "Updating ${APP} to ${RELEASE}"
msg_info "Updating ${APP} to v${RELEASE}"
cd /opt
cp /opt/tianji/src/server/.env /opt/.env
mv /opt/tianji /opt/tianji_bak
@ -54,10 +55,12 @@ function update_script() {
cd src/server
pnpm db:migrate:apply >/dev/null 2>&1
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${RELEASE}"
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting ${APP}"
systemctl start tianji
msg_ok "Started ${APP}"
msg_info "Cleaning up"
rm -R /opt/v${RELEASE}.zip
rm -rf /opt/tianji_bak
@ -67,7 +70,7 @@ function update_script() {
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}."
msg_ok "No update required. ${APP} is already at v${RELEASE}."
fi
exit
}
@ -79,4 +82,4 @@ 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}:12345${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:12345${CL}"

View File

@ -55,7 +55,7 @@ function update_script() {
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}
@ -67,4 +67,4 @@ 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}:8088${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8088${CL}"

View File

@ -20,6 +20,7 @@ $STD apt-get install -y \
mc \
gpg \
git \
jq \
build-essential
msg_ok "Installed Dependencies"
@ -35,13 +36,18 @@ $STD apt-get install -y nodejs
$STD npm install --global yarn
msg_ok "Installed Node.js"
msg_info "Installing Actual Budget"
$STD git clone https://github.com/actualbudget/actual-server.git /opt/actualbudget
RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name')
msg_info "Installing Actual Budget $RELEASE"
wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz
mv actualbudget-actual-server-* /opt/actualbudget
mkdir -p /opt/actualbudget/server-files
mkdir -p /opt/actualbudget-data
chown -R root:root /opt/actualbudget/server-files
chmod 755 /opt/actualbudget/server-files
cat <<EOF > /opt/actualbudget/.env
ACTUAL_UPLOAD_DIR=/opt/actualbudget/server-files
ACTUAL_DATA_DIR=/opt/actualbudget-data
ACTUAL_SERVER_FILES_DIR=/opt/actualbudget/server-files
PORT=5006
EOF
cd /opt/actualbudget

View File

@ -22,7 +22,7 @@ $STD apt-get install -y \
msg_ok "Installed Dependencies"
msg_info "Install Checkmk"
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | grep -v "*-rc" | tail -n +2 | head -n 1)
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | head -n 1)
wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb -O /opt/checkmk.deb
$STD apt-get install -y /opt/checkmk.deb
echo "${RELEASE}" >"/opt/checkmk_version.txt"

78
install/ghost-install.sh Normal file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: fabrice1236
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://ghost.org/
# Import Functions und Setup
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 \
curl \
sudo \
mc \
nginx \
mariadb-server \
ca-certificates \
gnupg
msg_ok "Installed Dependencies"
msg_info "Configuring Database"
DB_NAME=ghost
DB_USER=ghostuser
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
mariadb -u root -e "CREATE DATABASE $DB_NAME;"
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;"
{
echo "Ghost-Credentials"
echo "Ghost Database User: $DB_USER"
echo "Ghost Database Password: $DB_PASS"
echo "Ghost Database Name: $DB_NAME"
} >> ~/ghost.creds
msg_ok "Configured MySQL"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
msg_info "Setup Node.js"
$STD apt-get update
$STD apt-get install -y nodejs
msg_ok "Setup Node.js"
msg_info "Installing Ghost CLI"
$STD npm install ghost-cli@latest -g
msg_ok "Installed Ghost CLI"
msg_info "Creating Service"
$STD adduser --disabled-password --gecos "Ghost user" ghost-user
$STD usermod -aG sudo ghost-user
echo "ghost-user ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/ghost-user
mkdir -p /var/www/ghost
chown -R ghost-user:ghost-user /var/www/ghost
chmod 775 /var/www/ghost
sudo -u ghost-user -H sh -c "cd /var/www/ghost && ghost install --db=mysql --dbhost=localhost --dbuser=$DB_USER --dbpass=$DB_PASS --dbname=ghost --url=http://localhost:2368 --no-prompt --no-setup-nginx --no-setup-ssl --no-setup-mysql --enable --start --ip 0.0.0.0"
rm /etc/sudoers.d/ghost-user
msg_ok "Creating Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -78,7 +78,8 @@ $STD pnpm install --frozen-lockfile
export DATA_DIR=/opt/hoarder_data
HOARDER_SECRET=$(openssl rand -base64 36 | cut -c1-24)
cat <<EOF >/opt/hoarder/.env
mkdir -p /etc/hoarder
cat <<EOF >/etc/hoarder/hoarder.env
SERVER_VERSION=$RELEASE
NEXTAUTH_SECRET="$HOARDER_SECRET"
NEXTAUTH_URL="http://localhost:3000"
@ -129,7 +130,7 @@ After=network.target hoarder-workers.service
[Service]
ExecStart=pnpm start
WorkingDirectory=/opt/hoarder/apps/web
EnvironmentFile=/opt/hoarder/.env
EnvironmentFile=/etc/hoarder/hoarder.env
Restart=always
[Install]
@ -159,7 +160,7 @@ After=network.target hoarder-browser.service meilisearch.service
[Service]
ExecStart=pnpm start:prod
WorkingDirectory=/opt/hoarder/apps/workers
EnvironmentFile=/opt/hoarder/.env
EnvironmentFile=/etc/hoarder/hoarder.env
Restart=always
TimeoutStopSec=5

View File

@ -0,0 +1,64 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Andy Grunwald (andygrunwald)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://prometheus.io/
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 \
curl \
sudo \
mc
msg_ok "Installed Dependencies"
msg_info "Installing Prometheus Alertmanager"
RELEASE=$(curl -s https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
mkdir -p /etc/alertmanager
mkdir -p /var/lib/alertmanager
wget -q https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz
tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz
mv alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/
mv alertmanager-${RELEASE}.linux-amd64/alertmanager.yml /etc/alertmanager/alertmanager.yml
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed Prometheus Alertmanager"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/prometheus-alertmanager.service
[Unit]
Description=Prometheus Alertmanager
Wants=network-online.target
After=network-online.target
[Service]
User=root
Restart=always
Type=simple
ExecStart=/usr/local/bin/alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager/ \
--web.listen-address=0.0.0.0:9093
ExecReload=/bin/kill -HUP \$MAINPID
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now prometheus-alertmanager
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz
msg_ok "Cleaned"

View File

@ -1,9 +1,9 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 tteck
# Copyright (c) 2021-2025 community-scripts ORG
# Author: tteck (tteckster)
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://prometheus.io/
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
color
@ -14,9 +14,10 @@ network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y curl
$STD apt-get install -y sudo
$STD apt-get install -y mc
$STD apt-get install -y \
curl \
sudo \
mc
msg_ok "Installed Dependencies"
msg_info "Installing Prometheus"
@ -25,15 +26,14 @@ mkdir -p /etc/prometheus
mkdir -p /var/lib/prometheus
wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz
cd prometheus-${RELEASE}.linux-amd64
mv prometheus promtool /usr/local/bin/
mv prometheus.yml /etc/prometheus/prometheus.yml
mv prometheus-${RELEASE}.linux-amd64/prometheus prometheus-${RELEASE}.linux-amd64/promtool /usr/local/bin/
mv prometheus-${RELEASE}.linux-amd64/prometheus.yml /etc/prometheus/prometheus.yml
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed Prometheus"
msg_info "Creating Service"
service_path="/etc/systemd/system/prometheus.service"
echo "[Unit]
cat <<EOF >/etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
@ -49,7 +49,8 @@ ExecStart=/usr/local/bin/prometheus \
ExecReload=/bin/kill -HUP \$MAINPID
[Install]
WantedBy=multi-user.target" >$service_path
WantedBy=multi-user.target
EOF
systemctl enable -q --now prometheus
msg_ok "Created Service"
@ -59,5 +60,5 @@ customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
rm -rf ../prometheus-${RELEASE}.linux-amd64 ../prometheus-${RELEASE}.linux-amd64.tar.gz
rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz
msg_ok "Cleaned"

111
install/ps5-mqtt-install.sh Normal file
View File

@ -0,0 +1,111 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: liecno
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/FunkeyFlo/ps5-mqtt/
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 \
curl \
sudo \
mc \
jq \
ca-certificates \
gnupg
msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
msg_info "Installing Node.js"
$STD apt-get update
$STD apt-get install -y nodejs
$STD npm i -g playactor
msg_ok "Installed Node.js"
msg_info "Installing PS5-MQTT"
RELEASE=$(curl -s https://api.github.com/repos/FunkeyFlo/ps5-mqtt/releases/latest | jq -r '.tag_name')
wget -P /tmp -q https://github.com/FunkeyFlo/ps5-mqtt/archive/refs/tags/${RELEASE}.tar.gz
tar zxf /tmp/${RELEASE}.tar.gz -C /opt
mv /opt/ps5-mqtt-* /opt/ps5-mqtt
cd /opt/ps5-mqtt/ps5-mqtt/
$STD npm install
$STD npm run build
echo ${RELEASE} > /opt/ps5-mqtt_version.txt
msg_ok "Installed PS5-MQTT"
msg_info "Creating Service"
mkdir -p /opt/.config/ps5-mqtt/
mkdir -p /opt/.config/ps5-mqtt/playactor
cat <<EOF > /opt/.config/ps5-mqtt/config.json
{
"mqtt": {
"host": "",
"port": "",
"user": "",
"pass": "",
"discovery_topic": "homeassistant"
},
"device_check_interval": 5000,
"device_discovery_interval": 60000,
"device_discovery_broadcast_address": "",
"include_ps4_devices": false,
"psn_accounts": [
{
"username": "",
"npsso":""
}
],
"account_check_interval": 5000,
"credentialsStoragePath": "/opt/.config/ps5-mqtt/credentials.json",
"frontendPort": "8645"
}
EOF
cat <<EOF >/etc/systemd/system/ps5-mqtt.service
[Unit]
Description=PS5-MQTT Daemon
After=syslog.target network.target
[Service]
WorkingDirectory=/opt/ps5-mqtt/ps5-mqtt
Environment="CONFIG_PATH=/opt/.config/ps5-mqtt/config.json"
Environment="DEBUG='@ha:ps5:*'"
Restart=always
RestartSec=5
Type=simple
ExecStart=node server/dist/index.js
KillMode=process
SyslogIdentifier=ps5-mqtt
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now ps5-mqtt
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
rm /tmp/${RELEASE}.tar.gz
msg_ok "Cleaned"

View File

@ -36,7 +36,11 @@ msg_info "Installing LibreOffice Components"
$STD apt-get install -y \
libreoffice-writer \
libreoffice-calc \
libreoffice-impress
libreoffice-impress \
libreoffice-core \
libreoffice-common \
libreoffice-base-core \
python3-uno
msg_ok "Installed LibreOffice Components"
msg_info "Installing Python Dependencies"
@ -75,8 +79,8 @@ msg_ok "Installed Language Packs"
msg_info "Installing Stirling-PDF (Additional Patience)"
RELEASE=$(curl -s https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz
tar -xzf v$RELEASE.tar.gz
wget -q https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v${RELEASE}.tar.gz
tar -xzf v${RELEASE}.tar.gz
cd Stirling-PDF-$RELEASE
chmod +x ./gradlew
$STD ./gradlew build
@ -86,37 +90,66 @@ mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/
mv scripts /opt/Stirling-PDF/
ln -s /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar /opt/Stirling-PDF/Stirling-PDF.jar
ln -s /usr/share/tesseract-ocr/5/tessdata/ /usr/share/tessdata
msg_ok "Installed Stirling-PDF v$RELEASE"
msg_ok "Installed Stirling-PDF"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/stirlingpdf.service
# Create LibreOffice listener service
cat <<EOF >/etc/systemd/system/libreoffice-listener.service
[Unit]
Description=Stirling-PDF service
After=syslog.target network.target
Description=LibreOffice Headless Listener Service
After=network.target
[Service]
SuccessExitStatus=143
Type=simple
User=root
Group=root
Type=simple
EnvironmentFile=/opt/Stirling-PDF/.env
WorkingDirectory=/opt/Stirling-PDF
ExecStart=/usr/bin/java -jar Stirling-PDF.jar
ExecStop=/bin/kill -15 %n
ExecStart=/usr/lib/libreoffice/program/soffice --headless --invisible --nodefault --nofirststartwizard --nolockcheck --nologo --accept="socket,host=127.0.0.1,port=2002;urp;StarOffice.ComponentContext"
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now stirlingpdf.service
# Set up environment variables
cat <<EOF >/opt/Stirling-PDF/.env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/libreoffice/program
UNO_PATH=/usr/lib/libreoffice/program
PYTHONPATH=/usr/lib/python3/dist-packages:/usr/lib/libreoffice/program
LD_LIBRARY_PATH=/usr/lib/libreoffice/program
EOF
cat <<EOF >/etc/systemd/system/stirlingpdf.service
[Unit]
Description=Stirling-PDF service
After=syslog.target network.target libreoffice-listener.service
Requires=libreoffice-listener.service
[Service]
SuccessExitStatus=143
Type=simple
User=root
Group=root
EnvironmentFile=/opt/Stirling-PDF/.env
WorkingDirectory=/opt/Stirling-PDF
ExecStart=/usr/bin/java -jar Stirling-PDF.jar
ExecStop=/bin/kill -15 %n
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Enable and start services
systemctl enable -q --now libreoffice-listener
systemctl enable -q --now stirlingpdf
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
rm -rf v$RELEASE.tar.gz /zulu-repo_1.0.0-3_all.deb
rm -rf v${RELEASE}.tar.gz /zulu-repo_1.0.0-3_all.deb
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

41
json/ghost.json Normal file
View File

@ -0,0 +1,41 @@
{
"name": "Ghost",
"slug": "ghost",
"categories": [
12
],
"date_created": "2025-01-10",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 2368,
"documentation": "https://ghost.org/docs/",
"website": "https://ghost.org",
"logo": "https://raw.githubusercontent.com/TryGhost/Ghost/b6fe724b577e84f7dd174646d0323dabdcdf576e/apps/shade/src/assets/images/ghost-orb.svg",
"description": "Ghost is a powerful app for professional publishers to create, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members.",
"install_methods": [
{
"type": "default",
"script": "ct/ghost.sh",
"resources": {
"cpu": 2,
"ram": 1024,
"hdd": 5,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "To run Ghost-CLI commands, first set a password for the ghost-user by running `sudo passwd ghost-user`. Then, switch to the ghost-user with `sudo -su ghost-user`.",
"type": "info"
}
]
}

View File

@ -30,5 +30,9 @@
"username": null,
"password": null
},
"notes": []
}
"notes": [{
"text": "To enable folder adding append your lxc.conf on your host with 'lxc.environment: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1'",
"type": "info"
}
]
}

View File

@ -2,7 +2,7 @@
"name": "NZBGet",
"slug": "nzbget",
"categories": [
0
16
],
"date_created": "2024-10-31",
"type": "ct",

View File

@ -30,5 +30,10 @@
"username": null,
"password": null
},
"notes": []
"notes": [
{
"text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`",
"type": "info"
}
]
}

View File

@ -0,0 +1,34 @@
{
"name": "Prometheus Alertmanager",
"slug": "prometheus-alertmanager",
"categories": [
7
],
"date_created": "2025-01-09",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 9093,
"documentation": "https://prometheus.io/docs/alerting/latest/overview/",
"website": "https://prometheus.io/",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/prometheus.svg",
"description": "Alerting with Prometheus is separated into two parts. Alerting rules in Prometheus servers send alerts to an Alertmanager. The Alertmanager then manages those alerts, including silencing, inhibition, aggregation and sending out notifications via methods such as email, on-call notification systems, and chat platforms.",
"install_methods": [
{
"type": "default",
"script": "ct/prometheus-alertmanager.sh",
"resources": {
"cpu": 1,
"ram": 1024,
"hdd": 2,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

39
json/ps5-mqtt.json Normal file
View File

@ -0,0 +1,39 @@
{
"name": "PS5-MQTT",
"slug": "ps5-mqtt",
"categories": [
3
],
"date_created": "2025-01-09",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8645,
"documentation": null,
"website": "https://github.com/FunkeyFlo/",
"logo": "https://github.com/FunkeyFlo/ps5-mqtt/blob/main/add-ons/ps5-mqtt/logo.png?raw=true",
"description": "Integrate your Sony Playstation 5 devices with Home Assistant using MQTT.",
"install_methods": [
{
"type": "default",
"script": "ct/ps5-mqtt.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 3,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "After installation, the MQTT endpoint must be configured. The configuration file is located within the LXC container at: `/opt/.config/ps5-mqtt/config.json`",
"type": "info"
}
]
}

2013
misc/.app-headers Normal file

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ color() {
INFO="${TAB}💡${TAB}${CL}"
OS="${TAB}🖥️${TAB}${CL}"
OSVERSION="${TAB}🌟${TAB}${CL}"
CONTAINERTYPE="${TAB}📦${TAB}${CL}"
CONTAINERTYPE="${TAB}📦${TAB}${CL}"
DISKSIZE="${TAB}💾${TAB}${CL}"
CPUCORE="${TAB}🧠${TAB}${CL}"
RAMSIZE="${TAB}🛠️${TAB}${CL}"
@ -283,8 +283,9 @@ base_settings() {
MAC=""
VLAN=""
SSH="no"
SSH_AUTHORIZED_KEY=""
TAGS="community-script;"
# Override default settings with variables from ct script
CT_TYPE=${var_unprivileged:-$CT_TYPE}
DISK_SIZE=${var_disk:-$DISK_SIZE}
@ -292,7 +293,7 @@ base_settings() {
RAM_SIZE=${var_ram:-$RAM_SIZE}
VERB=${var_verbose:-$VERBOSE}
TAGS="${TAGS}${var_tags:-}"
# Since these 2 are only defined outside of default_settings function, we add a temporary fallback. TODO: To align everything, we should add these as constant variables (e.g. OSTYPE and OSVERSION), but that would currently require updating the default_settings function for all existing scripts
if [ -z "$var_os" ]; then
var_os="debian"
@ -314,9 +315,9 @@ echo_default() {
echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}GB${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE} GB${CL}"
echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}MiB${CL}"
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE} MiB${CL}"
echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}${CT_ID}${CL}"
if [ "$VERB" == "yes" ]; then
echo -e "${SEARCH}${BOLD}${DGN}Verbose Mode: ${BGN}Enabled${CL}"
@ -463,13 +464,13 @@ advanced_settings() {
if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
if [ -z "$DISK_SIZE" ]; then
DISK_SIZE="$var_disk"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}GB${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE} GB${CL}"
else
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
echo -e "{INFO}${HOLD}${RD} DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
advanced_settings
fi
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}GB${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE} GB${CL}"
fi
else
exit_script
@ -489,9 +490,9 @@ advanced_settings() {
if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
if [ -z "$RAM_SIZE" ]; then
RAM_SIZE="$var_ram"
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}MiB${CL}"
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE} MiB${CL}"
else
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}MiB${CL}"
echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE} MiB${CL}"
fi
else
exit_script
@ -626,6 +627,17 @@ advanced_settings() {
exit_script
fi
if ADV_TAGS=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Custom Tags?[If you remove all, there will be no tags!]" 8 58 ${TAGS} --title "Advanced Tags" 3>&1 1>&2 2>&3); then
if [ -n "${ADV_TAGS}" ]; then
ADV_TAGS=${ADV_TAGS:-""}
ADV_TAGS=$(echo "$ADV_TAGS" | tr -d '[:space:]')
TAGS="community-script;${ADV_TAGS}"
fi
echo -e "${NETWORK}${BOLD}${DGN}Tags: ${BGN}$TAGS${CL}"
else
exit_script
fi
if [[ "$PW" == -password* ]]; then
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
SSH="yes"
@ -638,6 +650,15 @@ advanced_settings() {
echo -e "${ROOTSSH}${BOLD}${DGN}Root SSH Access: ${BGN}$SSH${CL}"
fi
if [[ "${SSH}" == "yes" ]]; then
SSH_AUTHORIZED_KEY="$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "SSH Authorized key for root (leave empty for none)" 8 58 --title "SSH Key" 3>&1 1>&2 2>&3)"
if [[ -z "${SSH_AUTHORIZED_KEY}" ]]; then
echo "Warning: No SSH key provided."
fi
else
SSH_AUTHORIZED_KEY=""
fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
VERB="yes"
else
@ -686,15 +707,15 @@ install_script() {
header_info
echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}"
VERB="no"
base_settings "$VERB"
base_settings "$VERB"
echo_default
break
;;
2)
header_info
echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (${SEARCH}${BL}Verbose)${CL}"
echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (${SEARCH}Verbose)${CL}"
VERB="yes"
base_settings "$VERB"
base_settings "$VERB"
echo_default
break
;;
@ -718,13 +739,13 @@ install_script() {
check_container_resources() {
# Check actual RAM & Cores
current_ram=$(free -m | awk 'NR==2{print $2}')
current_cpu=$(nproc)
current_cpu=$(nproc)
# Check whether the current RAM is less than the required RAM or the CPU cores are less than required
if [[ "$current_ram" -lt "$var_ram" ]] || [[ "$current_cpu" -lt "$var_cpu" ]]; then
echo -e "\n${INFO}${HOLD} ${GN}Required: ${var_cpu} CPU, ${var_ram}MB RAM ${CL}| ${RD}Current: ${current_cpu} CPU, ${current_ram}MB RAM${CL}"
echo -e "${YWB}Please ensure that the ${APP} LXC is configured with at least ${var_cpu} vCPU and ${var_ram} MB RAM for the build process.${CL}\n"
read -r -p "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? <yes/No> " prompt
read -r -p "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? <yes/No> " prompt
# Check if the input is 'yes', otherwise exit with status 1
if [[ ! ${prompt,,} =~ ^(yes)$ ]]; then
echo -e "${CROSS}${HOLD} ${YWB}Exiting based on user input.${CL}"
@ -743,7 +764,7 @@ check_container_storage() {
if (( usage > 80 )); then
# Prompt the user for confirmation to continue
echo -e "${INFO}${HOLD} ${YWB}Warning: Storage is dangerously low (${usage}%).${CL}"
read -r -p "Continue anyway? <y/N> " prompt
read -r -p "Continue anyway? <y/N> " prompt
# Check if the input is 'y' or 'yes', otherwise exit with status 1
if [[ ! ${prompt,,} =~ ^(y|yes)$ ]]; then
echo -e "${CROSS}${HOLD}${YWB}Exiting based on user input.${CL}"