diff --git a/.github/workflows/validate-filenames.yml b/.github/workflows/validate-filenames.yml index 704715f5..909c669d 100644 --- a/.github/workflows/validate-filenames.yml +++ b/.github/workflows/validate-filenames.yml @@ -1,29 +1,43 @@ name: Validate filenames on: - pull_request: + pull_request_target: paths: - "ct/*.sh" - "install/*.sh" - "json/*.json" - - ".github/workflows/validate-filenames.yml" jobs: check-files: 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: + script: | + const { data: pullRequest } = await github.rest.pulls.get({ + ...context.repo, + pull_number: context.payload.pull_request.number, + }); + return pullRequest; + - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # Ensure the full history is fetched for accurate diffing + 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 @@ -75,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: | diff --git a/.github/workflows/validate-formatting.yaml b/.github/workflows/validate-formatting.yaml.bak similarity index 80% rename from .github/workflows/validate-formatting.yaml rename to .github/workflows/validate-formatting.yaml.bak index 760ab277..8eadd0ac 100644 --- a/.github/workflows/validate-formatting.yaml +++ b/.github/workflows/validate-formatting.yaml.bak @@ -4,30 +4,43 @@ on: push: branches: - main - pull_request: + pull_request_target: paths: - "**/*.sh" - "**/*.func" - - ".github/workflows/validate-formatting.yaml" jobs: shfmt: 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: + script: | + const { data: pullRequest } = await github.rest.pulls.get({ + ...context.repo, + pull_number: context.payload.pull_request.number, + }); + return pullRequest; + - name: Checkout code uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 0 # Ensure the full history is fetched for accurate diffing + 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 @@ -48,6 +61,7 @@ jobs: run: | set +e + shfmt_output=$(shfmt -d ${{ steps.changed-files.outputs.files }}) if [[ $? -eq 0 ]]; then exit 0 @@ -58,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: | @@ -90,6 +104,7 @@ jobs: const existingComment = comments.find( (comment) => comment.user.login === "github-actions[bot]", + ); if (existingComment) { diff --git a/.github/workflows/validate-scripts.yml b/.github/workflows/validate-scripts.yml.bak similarity index 76% rename from .github/workflows/validate-scripts.yml rename to .github/workflows/validate-scripts.yml.bak index 10d6182d..84b69706 100644 --- a/.github/workflows/validate-scripts.yml +++ b/.github/workflows/validate-scripts.yml.bak @@ -3,11 +3,10 @@ on: push: branches: - main - pull_request: + pull_request_target: paths: - "ct/*.sh" - "install/*.sh" - - ".github/workflows/validate-scripts.yml" jobs: check-scripts: @@ -17,18 +16,36 @@ 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: + script: | + const { data: pullRequest } = await github.rest.pulls.get({ + ...context.repo, + pull_number: context.payload.pull_request.number, + }); + return pullRequest; + - name: Checkout code uses: actions/checkout@v4 with: - fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }} + 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 @@ -152,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; @@ -174,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 { @@ -189,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(``) && + comment.user.login === 'github-actions[bot]' + ); if (existingComment) { - if (existingComment.body.includes(commentIdentifier)) { - const re = new RegExp(String.raw`[\s\S]*?`, ""); - newCommentBody = existingComment.body.replace(re, newCommentBody); - } else { - newCommentBody = existingComment.body + '\n\n---\n\n' + newCommentBody; - } + const re = new RegExp(String.raw`[\\s\\S]*?`, "m"); + newCommentBody = existingComment.body.replace(re, newCommentBody); await github.rest.issues.updateComment({ ...context.repo, diff --git a/CHANGELOG.md b/CHANGELOG.md index 728042d4..b28297be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,21 +16,74 @@ 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-06 +## 2025-01-09 + +### Changed + +### ✨ 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)) +- New Script: calibre-server [@ThisIsJeron](https://github.com/ThisIsJeron) ([#960](https://github.com/community-scripts/ProxmoxVE/pull/960)) + +### 🚀 Updated Scripts + +- 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 ### 🚀 Updated Scripts -- fix: buffer from base64 in formatting pipeline [@se-bastiaan](https://github.com/se-bastiaan) ([#1285](https://github.com/community-scripts/ProxmoxVE/pull/1285)) -- Fix: Homebox Update Script [@MickLesk](https://github.com/MickLesk) ([#1284](https://github.com/community-scripts/ProxmoxVE/pull/1284)) -- Add ca-certificates for Install (Frigate) [@MickLesk](https://github.com/MickLesk) ([#1282](https://github.com/community-scripts/ProxmoxVE/pull/1282)) +- Fix: Folder-Check for Updatescript Zammad [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1309](https://github.com/community-scripts/ProxmoxVE/pull/1309)) ### 🧰 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 + +### Changed + +### ✨ New Scripts + +- New Script: Typesense [@tlissak](https://github.com/tlissak) ([#1291](https://github.com/community-scripts/ProxmoxVE/pull/1291)) +- New script: GLPI [@opastorello](https://github.com/opastorello) ([#1201](https://github.com/community-scripts/ProxmoxVE/pull/1201)) + +### 🚀 Updated Scripts + +- Fix Tag in HyperHDR Script [@MickLesk](https://github.com/MickLesk) ([#1299](https://github.com/community-scripts/ProxmoxVE/pull/1299)) +- [Fix]: Fixed rm Bug in pf2etools [@MickLesk](https://github.com/MickLesk) ([#1292](https://github.com/community-scripts/ProxmoxVE/pull/1292)) +- Fix: Homebox Update Script [@MickLesk](https://github.com/MickLesk) ([#1284](https://github.com/community-scripts/ProxmoxVE/pull/1284)) +- Add ca-certificates for Install (Frigate) [@MickLesk](https://github.com/MickLesk) ([#1282](https://github.com/community-scripts/ProxmoxVE/pull/1282)) +- fix: buffer from base64 in formatting pipeline [@se-bastiaan](https://github.com/se-bastiaan) ([#1285](https://github.com/community-scripts/ProxmoxVE/pull/1285)) + +### 🧰 Maintenance + +- Add reapproval of Changelog-PR [@MickLesk](https://github.com/MickLesk) ([#1279](https://github.com/community-scripts/ProxmoxVE/pull/1279)) - ci: combine header checks into workflow with PR comment [@se-bastiaan](https://github.com/se-bastiaan) ([#1257](https://github.com/community-scripts/ProxmoxVE/pull/1257)) - ci: change filename checks into steps with PR comment [@se-bastiaan](https://github.com/se-bastiaan) ([#1255](https://github.com/community-scripts/ProxmoxVE/pull/1255)) -- Add reapproval of Changelog-PR [@MickLesk](https://github.com/MickLesk) ([#1279](https://github.com/community-scripts/ProxmoxVE/pull/1279)) - ci: add pipeline for code formatting checks [@se-bastiaan](https://github.com/se-bastiaan) ([#1239](https://github.com/community-scripts/ProxmoxVE/pull/1239)) ## 2025-01-05 diff --git a/ct/actualbudget.sh b/ct/actualbudget.sh index 8bad74dc..75dcdb19 100644 --- a/ct/actualbudget.sh +++ b/ct/actualbudget.sh @@ -32,13 +32,26 @@ 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 + mv actualbudget-actual-server-*/* /opt/actualbudget/ 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 +62,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}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5006${CL}" diff --git a/ct/adventurelog.sh b/ct/adventurelog.sh index 5c168ce4..a9c80542 100644 --- a/ct/adventurelog.sh +++ b/ct/adventurelog.sh @@ -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 + 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}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/calibre-server.sh b/ct/calibre-server.sh new file mode 100644 index 00000000..e05dd2e7 --- /dev/null +++ b/ct/calibre-server.sh @@ -0,0 +1,63 @@ +#!/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: thisisjeron +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://calibre-ebook.com + +# App Default Values +APP="Calibre-Server" +var_tags="eBook" +var_cpu="2" +var_ram="1024" +var_disk="4" +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/calibre-server.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Stopping ${APP}" + systemctl stop calibre-server + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP} Packages" + apt-get update &>/dev/null + apt-get -y upgrade &>/dev/null + msg_ok "Packages updated" + + msg_info "Updating Calibre (latest)" + wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sh /dev/stdin &>/dev/null + msg_ok "Updated Calibre" + + msg_info "Starting ${APP}" + systemctl start calibre-server + msg_ok "Started ${APP}" + msg_ok "Updated Successfully" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8180${CL}" diff --git a/ct/checkmk.sh b/ct/checkmk.sh index 7822d135..f1f930b8 100644 --- a/ct/checkmk.sh +++ b/ct/checkmk.sh @@ -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 diff --git a/ct/glpi.sh b/ct/glpi.sh new file mode 100644 index 00000000..a485061b --- /dev/null +++ b/ct/glpi.sh @@ -0,0 +1,52 @@ +#!/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: Nícolas Pastorello (opastorello) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +# App Default Values +APP="GLPI" +var_tags="asset-management;foss" +var_cpu="2" +var_ram="2048" +var_disk="10" +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/glpi ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_error "Ther is currently no automatic update function for ${APP}." + 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}:80${CL}" diff --git a/ct/hyperhdr.sh b/ct/hyperhdr.sh index 150864a4..bbdc82d3 100644 --- a/ct/hyperhdr.sh +++ b/ct/hyperhdr.sh @@ -7,7 +7,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m # App Default Values APP="HyperHDR" -var_tags="ambient lightning" +var_tags="ambient-lightning" var_cpu="2" var_ram="2048" var_disk="4" diff --git a/ct/pf2etools.sh b/ct/pf2etools.sh index 4d2205e8..967c407d 100644 --- a/ct/pf2etools.sh +++ b/ct/pf2etools.sh @@ -45,15 +45,14 @@ function update_script() { # Execute Update msg_info "Updating ${APP}" - cd "/opt/${APP}" + cd /opt wget -q "https://github.com/Pf2eToolsOrg/Pf2eTools/archive/refs/tags/${RELEASE}.zip" - unzip -q "${RELEASE}.zip" + unzip -q ${RELEASE}.zip rm -rf "/opt/${APP}" - mv "${APP}-${RELEASE:1}" "/opt/${APP}" + mv ${APP}-${RELEASE:1} /opt/${APP} cd /opt/Pf2eTools $STD npm install $STD npm run build - cd ~ echo "${RELEASE}" >"/opt/${APP}_version.txt" msg_ok "Updated ${APP}" @@ -62,7 +61,7 @@ function update_script() { # Cleaning up msg_info "Cleaning Up" - rm -rf /opt/${APP}/${RELEASE}.zip + rm -rf /opt/${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleanup Completed" diff --git a/ct/prometheus-alertmanager.sh b/ct/prometheus-alertmanager.sh new file mode 100755 index 00000000..90858dac --- /dev/null +++ b/ct/prometheus-alertmanager.sh @@ -0,0 +1,68 @@ +#!/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 + cd alertmanager-${RELEASE}.linux-amd64 + cp -rf alertmanager 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 ${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 ${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}" \ No newline at end of file diff --git a/ct/ps5-mqtt.sh b/ct/ps5-mqtt.sh new file mode 100644 index 00000000..98e751e4 --- /dev/null +++ b/ct/ps5-mqtt.sh @@ -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}" diff --git a/ct/typesense.sh b/ct/typesense.sh new file mode 100644 index 00000000..f4e5aa9b --- /dev/null +++ b/ct/typesense.sh @@ -0,0 +1,54 @@ +#!/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: tlissak | Co-Author MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://typesense.org/ + +# App Default Values +APP="TypeSense" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +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/typesense/typesense-server.ini ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/typesense/typesense/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} LXC" + apt-get update &>/dev/null + apt-get -y upgrade &>/dev/null + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:8108${CL}" diff --git a/ct/zammad.sh b/ct/zammad.sh index 43360bd0..e96d4f6c 100644 --- a/ct/zammad.sh +++ b/ct/zammad.sh @@ -28,7 +28,7 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -d /opt/zamad ]]; then + if [[ ! -d /opt/zammad ]]; then msg_error "No ${APP} Installation Found!" exit fi diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh index 64995d5a..3a62fb5e 100644 --- a/install/actualbudget-install.sh +++ b/install/actualbudget-install.sh @@ -35,8 +35,10 @@ $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 chown -R root:root /opt/actualbudget/server-files chmod 755 /opt/actualbudget/server-files diff --git a/install/calibre-server-install.sh b/install/calibre-server-install.sh new file mode 100644 index 00000000..0efbcab1 --- /dev/null +++ b/install/calibre-server-install.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2024 +# Author: thisisjeron +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +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 \ + sudo \ + curl \ + mc \ + imagemagick \ + xvfb \ + libxcomposite1 \ + libegl1 \ + libopengl0 +msg_ok "Installed Dependencies" + +msg_info "Installing Calibre" +wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sh /dev/stdin +useradd -c "Calibre Server" -d /opt/calibre -s /bin/bash -m calibre +mkdir -p /opt/calibre/calibre-library +chown -R calibre:calibre /opt/calibre +msg_ok "Installed Calibre" + +msg_info "Creating Service" +cat </etc/systemd/system/calibre-server.service +[Unit] +Description=Calibre Content Server +After=network.target + +[Service] +Type=simple +User=calibre +Group=calibre +ExecStart=/opt/calibre/calibre-server --port=8180 --enable-local-write /opt/calibre/calibre-library +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now calibre-server.service +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" + diff --git a/install/checkmk-install.sh b/install/checkmk-install.sh index 892c057d..e94f90c5 100644 --- a/install/checkmk-install.sh +++ b/install/checkmk-install.sh @@ -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) }') 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" diff --git a/install/glpi-install.sh b/install/glpi-install.sh new file mode 100644 index 00000000..61fc6f29 --- /dev/null +++ b/install/glpi-install.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Nícolas Pastorello (opastorello) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +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 \ + git \ + sudo \ + mc \ + apache2 \ + php8.2-{apcu,cli,common,curl,gd,imap,ldap,mysql,xmlrpc,xml,mbstring,bcmath,intl,zip,redis,bz2,soap} \ + php-cas \ + libapache2-mod-php \ + mariadb-server +msg_ok "Installed Dependencies" + +msg_info "Setting up database" +DB_NAME=glpi_db +DB_USER=glpi +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) +mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql +mysql -u root -e "CREATE DATABASE $DB_NAME;" +mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" +mysql -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';" +mysql -u root -e "GRANT SELECT ON \`mysql\`.\`time_zone_name\` TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" +{ + echo "GLPI Database Credentials" + echo "Database: $DB_NAME" + echo "Username: $DB_USER" + echo "Password: $DB_PASS" +} >> ~/glpi_db.creds +msg_ok "Set up database" + +msg_info "Installing GLPi" +cd /opt +RELEASE=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/') +wget -q "https://github.com/glpi-project/glpi/releases/download/${RELEASE}/glpi-${RELEASE}.tgz" +$STD tar -xzvf glpi-${RELEASE}.tgz +cd /opt/glpi +$STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Installed GLPi" + +msg_info "Setting Downstream file" +cat < /opt/glpi/inc/downstream.php + /etc/glpi/local_define.php +/etc/apache2/sites-available/glpi.conf + + ServerName localhost + DocumentRoot /opt/glpi/public + + + Require all granted + RewriteEngine On + RewriteCond %{HTTP:Authorization} ^(.+)$ + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php [QSA,L] + + + ErrorLog \${APACHE_LOG_DIR}/glpi_error.log + CustomLog \${APACHE_LOG_DIR}/glpi_access.log combined + +EOF +$STD a2dissite 000-default.conf +$STD a2enmod rewrite +$STD a2ensite glpi.conf +msg_ok "Setup Service" + +msg_info "Setup Cronjob" +echo "* * * * * php /opt/glpi/front/cron.php" | crontab - +msg_ok "Setup Cronjob" + +msg_info "Update PHP Params" +PHP_VERSION=$(ls /etc/php/ | grep -E '^[0-9]+\.[0-9]+$' | head -n 1) +PHP_INI="/etc/php/$PHP_VERSION/apache2/php.ini" +sed -i 's/^upload_max_filesize = .*/upload_max_filesize = 20M/' $PHP_INI +sed -i 's/^post_max_size = .*/post_max_size = 20M/' $PHP_INI +sed -i 's/^max_execution_time = .*/max_execution_time = 60/' $PHP_INI +sed -i 's/^max_input_vars = .*/max_input_vars = 5000/' $PHP_INI +sed -i 's/^memory_limit = .*/memory_limit = 256M/' $PHP_INI +sed -i 's/^;\?\s*session.cookie_httponly\s*=.*/session.cookie_httponly = On/' $PHP_INI +systemctl restart apache2 +msg_ok "Update PHP Params" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf /opt/glpi/install +rm -rf /opt/glpi-${RELEASE}.tgz +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/pf2etools-install.sh b/install/pf2etools-install.sh index fda5e8f0..d7e7c312 100644 --- a/install/pf2etools-install.sh +++ b/install/pf2etools-install.sh @@ -38,6 +38,7 @@ msg_ok "Installed Node.js" # Setup App msg_info "Setup Pf2eTools" +cd /opt RELEASE=$(curl -s https://api.github.com/repos/Pf2eToolsOrg/Pf2eTools/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') wget -q "https://github.com/Pf2eToolsOrg/Pf2eTools/archive/refs/tags/${RELEASE}.zip" unzip -q "${RELEASE}.zip" @@ -65,7 +66,7 @@ msg_ok "Created Service" # Cleanup msg_info "Cleaning up" -rm "${RELEASE}.zip" +rm -rf /opt/${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/prometheus-alertmanager-install.sh b/install/prometheus-alertmanager-install.sh new file mode 100755 index 00000000..3ce9dc0a --- /dev/null +++ b/install/prometheus-alertmanager-install.sh @@ -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 </etc/systemd/system/prometheus-alertmanager.service +echo "[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" diff --git a/install/ps5-mqtt-install.sh b/install/ps5-mqtt-install.sh new file mode 100644 index 00000000..be880e46 --- /dev/null +++ b/install/ps5-mqtt-install.sh @@ -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 < /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 </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" diff --git a/install/typesense-install.sh b/install/typesense-install.sh new file mode 100644 index 00000000..897eda5c --- /dev/null +++ b/install/typesense-install.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tlissak +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://typesense.org/ + +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 \ + mc \ + sudo +msg_ok "Installed Dependencies" + +msg_info "Installing TypeSense" +RELEASE=$(curl -s https://api.github.com/repos/typesense/typesense/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +cd /opt +wget -q https://dl.typesense.org/releases/${RELEASE}/typesense-server-${RELEASE}-amd64.deb +$STD apt install -y /opt/typesense-server-${RELEASE}-amd64.deb +echo 'enable-cors = true' >> /etc/typesense/typesense-server.ini +echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" +msg_ok "Installed TypeSense" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf /opt/typesense-server-${RELEASE}-amd64.deb +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/json/calibre-server.json b/json/calibre-server.json new file mode 100644 index 00000000..2fec344d --- /dev/null +++ b/json/calibre-server.json @@ -0,0 +1,43 @@ +{ + "name": "Calibre-Server", + "slug": "calibre-server", + "categories": [ + 12 + ], + "date_created": "2025-01-09", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8180, + "documentation": null, + "website": "https://calibre-ebook.com", + "logo": "https://calibre-ebook.com/resources/icons/calibre_icon.png", + "description": "Calibre content server is used to manage and serve eBooks over the network.", + "install_methods": [ + { + "type": "default", + "script": "ct/calibre-server.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "By default, the Calibre Server runs on port 8180 with no username/password.", + "type": "info" + }, + { + "text": "Use 'calibredb add' from the calibre user or run 'xvfb-run calibredb add ...' if you need to add books while the server is running.", + "type": "info" + } + ] + } diff --git a/json/glpi.json b/json/glpi.json new file mode 100644 index 00000000..6d652bdd --- /dev/null +++ b/json/glpi.json @@ -0,0 +1,34 @@ +{ + "name": "GLPI", + "slug": "glpi", + "categories": [ + 0 + ], + "date_created": "2025-01-06", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": "https://glpi-project.org/documentation/", + "website": "https://glpi-project.org/", + "logo": "https://raw.githubusercontent.com/glpi-project/glpi/refs/heads/main/public/pics/login_logo_glpi.png", + "description": "GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.", + "install_methods": [ + { + "type": "default", + "script": "ct/glpi.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "glpi", + "password": "glpi" + }, + "notes": [] +} diff --git a/json/postgresql.json b/json/postgresql.json index c60465c7..6fe236d1 100644 --- a/json/postgresql.json +++ b/json/postgresql.json @@ -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" + } + ] } \ No newline at end of file diff --git a/json/prometheus-alertmanager.json b/json/prometheus-alertmanager.json new file mode 100644 index 00000000..d6b0cda5 --- /dev/null +++ b/json/prometheus-alertmanager.json @@ -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": [] +} diff --git a/json/ps5-mqtt.json b/json/ps5-mqtt.json new file mode 100644 index 00000000..6151a748 --- /dev/null +++ b/json/ps5-mqtt.json @@ -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" + } + ] +} diff --git a/json/typesense.json b/json/typesense.json new file mode 100644 index 00000000..53f596c9 --- /dev/null +++ b/json/typesense.json @@ -0,0 +1,39 @@ +{ + "name": "TypeSense", + "slug": "typesense", + "categories": [ + 5 + ], + "date_created": "2025-01-06", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://typesense.org/docs/", + "website": "https://typesense.org/", + "logo": "https://typesense.org/_nuxt/img/typesense_logo_white.0f9fb0a.svg", + "description": "Typesense is an open-source, fast, and lightweight search engine optimized for delivering instant, relevant, and typo-tolerant search results. Designed for ease of use and high performance, it offers features like real-time indexing, fuzzy matching, customizable relevance ranking, and a simple API for integration. Typesense is particularly well-suited for applications requiring instant search capabilities, such as e-commerce, documentation, or any content-rich websites. It is often compared to tools like Elasticsearch but is more developer-friendly and less resource-intensive.", + "install_methods": [ + { + "type": "default", + "script": "ct/typesense.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This script requires some extra steps after the installation, Please checkout the 'documentation' Button", + "type": "info" + } + ] +}