Merge branch 'main' into pr-keycloak
This commit is contained in:
commit
7a39397d97
13
.github/workflows/auto-update-app-headers.yml
vendored
13
.github/workflows/auto-update-app-headers.yml
vendored
@ -20,17 +20,22 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
|
||||
- name: Generate a token for PR approval and merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
|
||||
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
# Step 1: Checkout repository
|
||||
- name: Checkout repository
|
||||
|
@ -17,10 +17,12 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
8
.github/workflows/changelog-pr.yaml
vendored
8
.github/workflows/changelog-pr.yaml
vendored
@ -19,17 +19,21 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token for PR creation
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Generate a token for PR approval and merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
|
||||
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
4
.github/workflows/delete-discord-thread.yml
vendored
4
.github/workflows/delete-discord-thread.yml
vendored
@ -9,12 +9,12 @@ jobs:
|
||||
close_discord_thread:
|
||||
if: github.repository == 'community-scripts/ProxmoxVED'
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
ISSUE_TITLE: ${{ github.event.issue.title }}
|
||||
|
||||
steps:
|
||||
- name: Get thread-ID op and close thread
|
||||
run: |
|
||||
ISSUE_TITLE="${{ github.event.issue.title }}"
|
||||
|
||||
THREAD_ID=$(curl -s -X GET "https://discord.com/api/v10/guilds/${{ secrets.DISCORD_GUILD_ID }}/threads/active" \
|
||||
-H "Authorization: Bot ${{ secrets.DISCORD_BOT_TOKEN }}" \
|
||||
-H "Content-Type: application/json" | \
|
||||
|
4
.github/workflows/delete_new_script.yaml
vendored
4
.github/workflows/delete_new_script.yaml
vendored
@ -16,10 +16,12 @@ jobs:
|
||||
|
||||
- name: Generate a token for PR approval and merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
|
||||
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Extract Issue Title (Lowercase & Underscores)
|
||||
id: extract_title
|
||||
|
4
.github/workflows/get-versions-from-gh.yaml
vendored
4
.github/workflows/get-versions-from-gh.yaml
vendored
@ -24,10 +24,12 @@ jobs:
|
||||
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Crawl from Github API
|
||||
env:
|
||||
|
@ -24,17 +24,21 @@ jobs:
|
||||
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Generate a token for PR approval and merge
|
||||
id: generate-token-merge
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
|
||||
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Crawl from newreleases.io
|
||||
env:
|
||||
|
4
.github/workflows/live/changelog-pr.yml
vendored
4
.github/workflows/live/changelog-pr.yml
vendored
@ -18,10 +18,12 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
4
.github/workflows/live/update-json-date.yml
vendored
4
.github/workflows/live/update-json-date.yml
vendored
@ -19,10 +19,12 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: community-scripts
|
||||
repositories: ProxmoxVED
|
||||
|
||||
- name: Generate dynamic branch name
|
||||
id: timestamp
|
||||
|
2
.github/workflows/move-to-main-repo.yaml
vendored
2
.github/workflows/move-to-main-repo.yaml
vendored
@ -18,7 +18,7 @@ jobs:
|
||||
steps:
|
||||
- name: Generate a token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v1
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ vars.PUSH_MAIN_APP_ID }}
|
||||
private-key: ${{ secrets.PUSH_MAIN_APP_SECRET }}
|
||||
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -18,7 +18,7 @@
|
||||
"editor.minimap.enabled": false,
|
||||
"terminal.integrated.scrollback": 10000,
|
||||
"[shellscript]": {
|
||||
"editor.defaultFormatter": "foxundermoon.shell-format",
|
||||
"editor.defaultFormatter": "mads-hartmann.bash-ide-vscode",
|
||||
"editor.tabSize": 4,
|
||||
"editor.insertSpaces": true,
|
||||
},
|
||||
|
16
CHANGELOG.md
16
CHANGELOG.md
@ -11,7 +11,7 @@
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- odoo ([#4477](https://github.com/community-scripts/ProxmoxVE/pull/4477))
|
||||
- odoo ([#4477](https://github.com/community-scripts/ProxmoxVE/pull/4477))
|
||||
- alpine-transmission ([#4277](https://github.com/community-scripts/ProxmoxVE/pull/4277))
|
||||
- alpine-tinyauth ([#4264](https://github.com/community-scripts/ProxmoxVE/pull/4264))
|
||||
- alpine-rclone ([#4265](https://github.com/community-scripts/ProxmoxVE/pull/4265))
|
||||
@ -24,7 +24,7 @@
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- fix: fetch_release_and_deploy function [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4478](https://github.com/community-scripts/ProxmoxVE/pull/4478))
|
||||
- fix: fetch_release_and_deploy function [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4478](https://github.com/community-scripts/ProxmoxVE/pull/4478))
|
||||
- Website: re-add documenso & some little bugfixes [@MickLesk](https://github.com/MickLesk) ([#4456](https://github.com/community-scripts/ProxmoxVE/pull/4456))
|
||||
- update some improvements from dev (tools.func) [@MickLesk](https://github.com/MickLesk) ([#4430](https://github.com/community-scripts/ProxmoxVE/pull/4430))
|
||||
- Alpine: Use onliner for updates [@tremor021](https://github.com/tremor021) ([#4414](https://github.com/community-scripts/ProxmoxVE/pull/4414))
|
||||
@ -56,21 +56,21 @@
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 💾 Core
|
||||
- #### 💾 Core
|
||||
|
||||
- fix: improve bridge detection in all network interface configuration files [@filippolauria](https://github.com/filippolauria) ([#4413](https://github.com/community-scripts/ProxmoxVE/pull/4413))
|
||||
- Config file Function in build.func [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4411](https://github.com/community-scripts/ProxmoxVE/pull/4411))
|
||||
- fix: detect all bridge types, not just vmbr prefix [@filippolauria](https://github.com/filippolauria) ([#4351](https://github.com/community-scripts/ProxmoxVE/pull/4351))
|
||||
|
||||
- #### 📂 Github
|
||||
- #### 📂 Github
|
||||
|
||||
- Add Github app for auto PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4461](https://github.com/community-scripts/ProxmoxVE/pull/4461))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- FAQ: Explanation "updatable" [@tremor021](https://github.com/tremor021) ([#4300](https://github.com/community-scripts/ProxmoxVE/pull/4300))
|
||||
- FAQ: Explanation "updatable" [@tremor021](https://github.com/tremor021) ([#4300](https://github.com/community-scripts/ProxmoxVE/pull/4300))
|
||||
|
||||
- #### 📝 Script Information
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Jellyfin Media Server: Update configuration path [@tremor021](https://github.com/tremor021) ([#4434](https://github.com/community-scripts/ProxmoxVE/pull/4434))
|
||||
- Pingvin Share: Added explanation on how to add/edit environment variables [@tremor021](https://github.com/tremor021) ([#4432](https://github.com/community-scripts/ProxmoxVE/pull/4432))
|
||||
@ -86,6 +86,7 @@
|
||||
- yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364))
|
||||
- Extension/New Script: Redis Alpine Installation [@MickLesk](https://github.com/MickLesk) ([#3367](https://github.com/community-scripts/ProxmoxVE/pull/3367))
|
||||
- Fluid Calendar [@vhsdream](https://github.com/vhsdream) ([#2869](ht
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- License url VED to VE [@bvdberg01](https://github.com/bvdberg01) ([#3258](https://github.com/community-scripts/ProxmoxVE/pull/3258))
|
||||
@ -125,7 +126,6 @@
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
|
||||
- [core] install core deps (debian / ubuntu) [@MickLesk](https://github.com/MickLesk) ([#3366](https://github.com/community-scripts/ProxmoxVE/pull/3366))
|
||||
|
||||
- #### 💾 Core
|
||||
@ -145,7 +145,7 @@
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Better Text for Version Date [@michelroegl-brunner](https:er) ([#3388](https://github.com/community-scripts/ProxmoxVE/pull/3388))
|
||||
- Better Text for Version Date [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3388](https://github.com/community-scripts/ProxmoxVE/pull/3388))
|
||||
- JSON editor note fix [@bvdberg01](https://github.com/bvdberg01) ([#3260](https://github.com/community-scripts/ProxmoxVE/pull/3260))
|
||||
- Move cryptpad files to right folders [@bvdberg01](https://github.com/bvdberg01) ([#3242](https://github.com/community-scripts/ProxmoxVE/pull/3242))
|
||||
|
||||
|
@ -1,45 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://syncthing.net/
|
||||
|
||||
APP="Alpine-Syncthing"
|
||||
var_tags="${var_tags:-alpine;networking}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-256}"
|
||||
var_disk="${var_disk:-1}"
|
||||
var_os="${var_os:-alpine}"
|
||||
var_version="${var_version:-3.21}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
msg_info "Updating Alpine Packages"
|
||||
$STD apk -U upgrade
|
||||
msg_ok "Updated Alpine Packages"
|
||||
|
||||
msg_info "Updating Syncthing"
|
||||
$STD apk upgrade syncthing
|
||||
msg_ok "Updated Syncthing"
|
||||
|
||||
msg_info "Restarting Syncthing"
|
||||
$STD rc-service syncthing restart
|
||||
msg_ok "Restarted Syncthing"
|
||||
|
||||
exit 1
|
||||
}
|
||||
|
||||
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}:8384${CL}"
|
57
ct/alpine-teamspeak-server.sh
Normal file
57
ct/alpine-teamspeak-server.sh
Normal file
@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: tremor021 (Slaviša Arežina)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://teamspeak.com/en/
|
||||
|
||||
APP="Alpine-TeamSpeak-Server"
|
||||
var_tags="${var_tags:-alpine;communication}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-256}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-alpine}"
|
||||
var_version="${var_version:-3.22}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
|
||||
if [[ ! -d /opt/teamspeak-server ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' | head -1)
|
||||
if [ "${RELEASE}" != "$(cat ~/.teamspeak-server)" ] || [ ! -f ~/.teamspeak-server ]; then
|
||||
msg_info "Updating ${APP} LXC"
|
||||
$STD apk -U upgrade
|
||||
$STD service teamspeak stop
|
||||
curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
|
||||
tar -xf ./ts3server.tar.bz2
|
||||
cp -ru teamspeak3-server_linux_amd64/* /opt/teamspeak-server/
|
||||
rm -f ~/ts3server.tar.bz*
|
||||
rm -rf teamspeak3-server_linux_amd64
|
||||
echo "${RELEASE}" >~/.teamspeak-server
|
||||
$STD service teamspeak start
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:9987${CL}"
|
@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-1}"
|
||||
var_os="${var_os:-alpine}"
|
||||
var_version="${var_version:-3.21}"
|
||||
var_version="${var_version:-3.22}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
@ -1,139 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/karlomikus/bar-assistant
|
||||
# Source: https://github.com/karlomikus/vue-salt-rim
|
||||
# Source: https://www.meilisearch.com/
|
||||
|
||||
APP="Bar-Assistant"
|
||||
var_tags="${var_tags:-inventory;drinks}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.10}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/bar-assistant ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE_MEILISEARCH=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
RELEASE_BARASSISTANT=$(curl -s https://api.github.com/repos/karlomikus/bar-assistant/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
RELEASE_SALTRIM=$(curl -s https://api.github.com/repos/karlomikus/vue-salt-rim/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE_BARASSISTANT}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Stopping nginx"
|
||||
systemctl stop nginx
|
||||
msg_ok "Stopped nginx"
|
||||
|
||||
msg_info "Updating ${APP} to v${RELEASE_BARASSISTANT}"
|
||||
cd /opt
|
||||
mv /opt/bar-assistant /opt/bar-assistant-backup
|
||||
curl -fsSL "https://github.com/karlomikus/bar-assistant/archive/refs/tags/v${RELEASE_BARASSISTANT}.zip" -o barassistant.zip
|
||||
unzip -q barassistant.zip
|
||||
mv /opt/bar-assistant-${RELEASE_BARASSISTANT}/ /opt/bar-assistant
|
||||
cp -r /opt/bar-assistant-backup/.env /opt/bar-assistant/.env
|
||||
cp -r /opt/bar-assistant-backup/storage/bar-assistant /opt/bar-assistant/storage/bar-assistant
|
||||
cd /opt/bar-assistant
|
||||
$STD composer install --no-interaction
|
||||
$STD php artisan migrate --force
|
||||
$STD php artisan storage:link
|
||||
$STD php artisan bar:setup-meilisearch
|
||||
$STD php artisan scout:sync-index-settings
|
||||
$STD php artisan config:cache
|
||||
$STD php artisan route:cache
|
||||
$STD php artisan event:cache
|
||||
chown -R www-data:www-data /opt/bar-assistant
|
||||
echo "${RELEASE_BARASSISTANT}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated $APP to v${RELEASE_BARASSISTANT}"
|
||||
|
||||
msg_info "Starting nginx"
|
||||
systemctl start nginx
|
||||
msg_ok "Started nginx"
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf /opt/barassistant.zip
|
||||
rm -rf /opt/bar-assistant-backup
|
||||
msg_ok "Cleaned"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE_BARASSISTANT}"
|
||||
fi
|
||||
|
||||
if [[ ! -f /opt/vue-salt-rim_version.txt ]] || [[ "${RELEASE_SALTRIM}" != "$(cat /opt/vue-salt-rim_version.txt)" ]]; then
|
||||
msg_info "Stopping nginx"
|
||||
systemctl stop nginx
|
||||
msg_ok "Stopped nginx"
|
||||
|
||||
msg_info "Updating Salt Rim to v${RELEASE_SALTRIM}"
|
||||
cd /opt
|
||||
mv /opt/vue-salt-rim /opt/vue-salt-rim-backup
|
||||
curl -fsSL "https://github.com/karlomikus/vue-salt-rim/archive/refs/tags/v${RELEASE_SALTRIM}.zip" -o saltrim.zip
|
||||
unzip -q saltrim.zip
|
||||
mv /opt/vue-salt-rim-${RELEASE_SALTRIM}/ /opt/vue-salt-rim
|
||||
cp /opt/vue-salt-rim-backup/public/config.js /opt/vue-salt-rim/public/config.js
|
||||
cd /opt/vue-salt-rim
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
echo "${RELEASE_SALTRIM}" >/opt/vue-salt-rim_version.txt
|
||||
msg_ok "Updated $APP to v${RELEASE_SALTRIM}"
|
||||
|
||||
msg_info "Starting nginx"
|
||||
systemctl start nginx
|
||||
msg_ok "Started nginx"
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf /opt/saltrim.zip
|
||||
rm -rf /opt/vue-salt-rim-backup
|
||||
msg_ok "Cleaned"
|
||||
msg_ok "Updated"
|
||||
else
|
||||
msg_ok "No update required. Salt Rim is already at v${RELEASE_SALTRIM}"
|
||||
fi
|
||||
|
||||
if [[ ! -f /opt/meilisearch_version.txt ]] || [[ "${RELEASE_MEILISEARCH}" != "$(cat /opt/meilisearch_version.txt)" ]]; then
|
||||
msg_info "Stopping Meilisearch"
|
||||
systemctl stop meilisearch
|
||||
msg_ok "Stopped Meilisearch"
|
||||
|
||||
msg_info "Updating Meilisearch to ${RELEASE_MEILISEARCH}"
|
||||
cd /opt
|
||||
RELEASE=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
curl -fsSL https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb -o meilisearch.deb
|
||||
$STD dpkg -i meilisearch.deb
|
||||
echo "${RELEASE_MEILISEARCH}" >/opt/meilisearch_version.txt
|
||||
msg_ok "Updated Meilisearch to ${RELEASE_MEILISEARCH}"
|
||||
|
||||
msg_info "Starting Meilisearch"
|
||||
systemctl start meilisearch
|
||||
msg_ok "Started Meilisearch"
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf "/opt/meilisearch.deb"
|
||||
msg_ok "Cleaned"
|
||||
msg_ok "Updated Meilisearch"
|
||||
else
|
||||
msg_ok "No update required. Meilisearch is already at ${RELEASE_MEILISEARCH}"
|
||||
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}${CL}"
|
@ -40,5 +40,5 @@ start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
msg_ok "Completed Successfully!"
|
||||
msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
|
||||
|
@ -3,7 +3,7 @@ source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (Canbiz)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source:
|
||||
# Source: https://github.com/community-scripts/ProxmoxVE
|
||||
|
||||
APP="Docspell"
|
||||
var_tags="${var_tags:-document}"
|
||||
|
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/raw/main/garmin-grafana/misc/build.func)
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/raw/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: aliaksei135
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
|
@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/arunavo4/gitea-mirror
|
||||
# Source: https://github.com/RayLabsHQ/gitea-mirror
|
||||
|
||||
APP="gitea-mirror"
|
||||
var_tags="${var_tags:-mirror;gitea}"
|
||||
@ -49,7 +49,7 @@ function update_script() {
|
||||
rm -rf /opt/gitea-mirror
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/arunavo4/gitea-mirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/RayLabsHQ/gitea-mirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ "${RELEASE}" != "$(cat ~/.${APP} 2>/dev/null || cat /opt/${APP}_version.txt 2>/dev/null)" ]]; then
|
||||
|
||||
msg_info "Stopping Services"
|
||||
@ -71,7 +71,7 @@ function update_script() {
|
||||
msg_ok "Installed Bun"
|
||||
|
||||
rm -rf /opt/gitea-mirror
|
||||
fetch_and_deploy_gh_release "gitea-mirror" "arunavo4/gitea-mirror" "tarball" "v3.0.2"
|
||||
fetch_and_deploy_gh_release "gitea-mirror" "RayLabsHQ/gitea-mirror" "tarball" "v3.0.2"
|
||||
|
||||
msg_info "Updating and rebuilding ${APP} to v${RELEASE}"
|
||||
cd /opt/gitea-mirror
|
||||
|
@ -1,6 +0,0 @@
|
||||
___ __ _ _____ __ __ _
|
||||
/ | / /___ (_)___ ___ / ___/__ ______ _____/ /_/ /_ (_)___ ____ _
|
||||
/ /| | / / __ \/ / __ \/ _ \______\__ \/ / / / __ \/ ___/ __/ __ \/ / __ \/ __ `/
|
||||
/ ___ |/ / /_/ / / / / / __/_____/__/ / /_/ / / / / /__/ /_/ / / / / / / / /_/ /
|
||||
/_/ |_/_/ .___/_/_/ /_/\___/ /____/\__, /_/ /_/\___/\__/_/ /_/_/_/ /_/\__, /
|
||||
/_/ /____/ /____/
|
6
ct/headers/alpine-teamspeak-server
Normal file
6
ct/headers/alpine-teamspeak-server
Normal file
@ -0,0 +1,6 @@
|
||||
___ __ _ ______ _____ __ _____
|
||||
/ | / /___ (_)___ ___ /_ __/__ ____ _____ ___ / ___/____ ___ ____ _/ /__ / ___/___ ______ _____ _____
|
||||
/ /| | / / __ \/ / __ \/ _ \______/ / / _ \/ __ `/ __ `__ \\__ \/ __ \/ _ \/ __ `/ //_/_____\__ \/ _ \/ ___/ | / / _ \/ ___/
|
||||
/ ___ |/ / /_/ / / / / / __/_____/ / / __/ /_/ / / / / / /__/ / /_/ / __/ /_/ / ,< /_____/__/ / __/ / | |/ / __/ /
|
||||
/_/ |_/_/ .___/_/_/ /_/\___/ /_/ \___/\__,_/_/ /_/ /_/____/ .___/\___/\__,_/_/|_| /____/\___/_/ |___/\___/_/
|
||||
/_/ /_/
|
@ -1,6 +0,0 @@
|
||||
____ ___ _ __ __
|
||||
/ __ )____ ______ / | __________(_)____/ /_____ _____ / /_
|
||||
/ __ / __ `/ ___/_____/ /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/
|
||||
/ /_/ / /_/ / / /_____/ ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
|
||||
/_____/\__,_/_/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
|
||||
|
@ -1,6 +0,0 @@
|
||||
_ __
|
||||
(_) /__________ ___ ____ ____ _
|
||||
/ / __/ ___/ __ `__ \/ __ \/ __ `/
|
||||
/ / /_(__ ) / / / / / / / / /_/ /
|
||||
/_/\__/____/_/ /_/ /_/_/ /_/\__, /
|
||||
/____/
|
@ -1,6 +0,0 @@
|
||||
__ ____ _____
|
||||
/ /__ / / /_ __/ __(_)___
|
||||
__ / / _ \/ / / / / / /_/ / __ \
|
||||
/ /_/ / __/ / / /_/ / __/ / / / /
|
||||
\____/\___/_/_/\__, /_/ /_/_/ /_/
|
||||
/____/
|
@ -1,6 +0,0 @@
|
||||
__ __
|
||||
/ //_/___ _____ ____ _ ______ ___________
|
||||
/ ,< / __ `/ __ \/ __ \ | /| / / __ `/ ___/ ___/
|
||||
/ /| / /_/ / /_/ / /_/ / |/ |/ / /_/ / / / /
|
||||
/_/ |_\__,_/ .___/\____/|__/|__/\__,_/_/ /_/
|
||||
/_/
|
6
ct/headers/leantime
Normal file
6
ct/headers/leantime
Normal file
@ -0,0 +1,6 @@
|
||||
__ __ _
|
||||
/ / ___ ____ _____ / /_(_)___ ___ ___
|
||||
/ / / _ \/ __ `/ __ \/ __/ / __ `__ \/ _ \
|
||||
/ /___/ __/ /_/ / / / / /_/ / / / / / / __/
|
||||
/_____/\___/\__,_/_/ /_/\__/_/_/ /_/ /_/\___/
|
||||
|
@ -1,6 +0,0 @@
|
||||
__ ___ ___
|
||||
/ |/ /__ ____ _/ (_)__
|
||||
/ /|_/ / _ \/ __ `/ / / _ \
|
||||
/ / / / __/ /_/ / / / __/
|
||||
/_/ /_/\___/\__,_/_/_/\___/
|
||||
|
6
ct/headers/nginxproxymanager
Normal file
6
ct/headers/nginxproxymanager
Normal file
@ -0,0 +1,6 @@
|
||||
_ __ _ ____ __ ___
|
||||
/ | / /___ _(_)___ _ __ / __ \_________ _ ____ __ / |/ /___ _____ ____ _____ ____ _____
|
||||
/ |/ / __ `/ / __ \| |/_/ / /_/ / ___/ __ \| |/_/ / / / / /|_/ / __ `/ __ \/ __ `/ __ `/ _ \/ ___/
|
||||
/ /| / /_/ / / / / /> < / ____/ / / /_/ /> </ /_/ / / / / / /_/ / / / / /_/ / /_/ / __/ /
|
||||
/_/ |_/\__, /_/_/ /_/_/|_| /_/ /_/ \____/_/|_|\__, / /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/
|
||||
/____/ /____/ /____/
|
@ -1,6 +0,0 @@
|
||||
_ ______ __ ___ __
|
||||
/ | / / __ \/ |/ /___ / /_ _______
|
||||
/ |/ / /_/ / /|_/ / __ \/ / / / / ___/
|
||||
/ /| / ____/ / / / /_/ / / /_/ (__ )
|
||||
/_/ |_/_/ /_/ /_/ .___/_/\__,_/____/
|
||||
/_/
|
6
ct/headers/ots
Normal file
6
ct/headers/ots
Normal file
@ -0,0 +1,6 @@
|
||||
____ ___________
|
||||
/ __ \/_ __/ ___/
|
||||
/ / / / / / \__ \
|
||||
/ /_/ / / / ___/ /
|
||||
\____/ /_/ /____/
|
||||
|
6
ct/headers/rybbit
Normal file
6
ct/headers/rybbit
Normal file
@ -0,0 +1,6 @@
|
||||
____ __ __ _ __
|
||||
/ __ \__ __/ /_ / /_ (_) /_
|
||||
/ /_/ / / / / __ \/ __ \/ / __/
|
||||
/ _, _/ /_/ / /_/ / /_/ / / /_
|
||||
/_/ |_|\__, /_.___/_.___/_/\__/
|
||||
/____/
|
@ -1,6 +0,0 @@
|
||||
____ __
|
||||
_________ _/ / /_____ ___ ____ ______/ /____ _____
|
||||
/ ___/ __ `/ / __/ __ `__ \/ __ `/ ___/ __/ _ \/ ___/
|
||||
(__ ) /_/ / / /_/ / / / / / /_/ (__ ) /_/ __/ /
|
||||
/____/\__,_/_/\__/_/ /_/ /_/\__,_/____/\__/\___/_/
|
||||
|
6
ct/headers/scraparr
Normal file
6
ct/headers/scraparr
Normal file
@ -0,0 +1,6 @@
|
||||
_____
|
||||
/ ___/______________ _____ ____ ___________
|
||||
\__ \/ ___/ ___/ __ `/ __ \/ __ `/ ___/ ___/
|
||||
___/ / /__/ / / /_/ / /_/ / /_/ / / / /
|
||||
/____/\___/_/ \__,_/ .___/\__,_/_/ /_/
|
||||
/_/
|
6
ct/headers/tududi
Normal file
6
ct/headers/tududi
Normal file
@ -0,0 +1,6 @@
|
||||
______ __ ___
|
||||
/_ __/_ ______/ /_ ______/ (_)
|
||||
/ / / / / / __ / / / / __ / /
|
||||
/ / / /_/ / /_/ / /_/ / /_/ / /
|
||||
/_/ \__,_/\__,_/\__,_/\__,_/_/
|
||||
|
6
ct/headers/vikunja
Normal file
6
ct/headers/vikunja
Normal file
@ -0,0 +1,6 @@
|
||||
_ ___ __ _
|
||||
| | / (_) /____ ______ (_)___ _
|
||||
| | / / / //_/ / / / __ \ / / __ `/
|
||||
| |/ / / ,< / /_/ / / / / / / /_/ /
|
||||
|___/_/_/|_|\__,_/_/ /_/_/ /\__,_/
|
||||
/___/
|
6
ct/headers/viseron
Normal file
6
ct/headers/viseron
Normal file
@ -0,0 +1,6 @@
|
||||
_ ___
|
||||
| | / (_)_______ _________ ____
|
||||
| | / / / ___/ _ \/ ___/ __ \/ __ \
|
||||
| |/ / (__ ) __/ / / /_/ / / / /
|
||||
|___/_/____/\___/_/ \____/_/ /_/
|
||||
|
@ -1,45 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://jellyfin.org/
|
||||
|
||||
APP="Jellyfin"
|
||||
var_tags="${var_tags:-media}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /usr/lib/jellyfin ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating ${APP} LXC"
|
||||
$STD apt-get update
|
||||
$STD apt-get -y upgrade
|
||||
$STD apt-get -y --with-new-pkgs upgrade jellyfin jellyfin-server
|
||||
msg_ok "Updated ${APP} LXC"
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8096${CL}"
|
@ -1,64 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Casvt/Kapowarr
|
||||
|
||||
APP="Kapowarr"
|
||||
var_tags="${var_tags:-Arr}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-256}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /etc/systemd/system/kapowarr.service ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE=$(curl -s https://api.github.com/repos/Casvt/Kapowarr/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
if [[ "${RELEASE}" != "$(cat $HOME/.kapowarr)" ]] || [[ ! -f $HOME/.kapowarr ]]; then
|
||||
msg_info "Stopping $APP"
|
||||
systemctl stop kapowarr
|
||||
msg_ok "Stopped $APP"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
mv /opt/kapowarr/db /opt/
|
||||
msg_ok "Backup Created"
|
||||
|
||||
msg_info "Updating $APP to ${RELEASE}"
|
||||
fetch_and_deploy_gh_release "kapowarr" "Casvt/Kapowarr"
|
||||
mv /opt/db /opt/kapowarr
|
||||
msg_ok "Updated $APP to ${RELEASE}"
|
||||
|
||||
msg_info "Starting $APP"
|
||||
systemctl start kapowarr
|
||||
msg_ok "Started $APP"
|
||||
|
||||
msg_ok "Update Successful"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5656${CL}"
|
@ -1,15 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Florianb63
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://itsm-ng.com/
|
||||
|
||||
APP="itsmng"
|
||||
var_tags="${var_tags:-asset-management;foss}"
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Stroopwafe1
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://leantime.io
|
||||
|
||||
APP="Leantime"
|
||||
var_tags="${var_tags:-productivity}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
@ -24,16 +25,16 @@ function update_script() {
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /etc/itsm-ng/config_db.php ]]; then
|
||||
if [[ ! -d /opt/${APP} ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit 1
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating ${APP} LXC"
|
||||
$STD apt-get update
|
||||
$STD apt-get -y upgrade
|
||||
msg_ok "Updated Successfully"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
mariadb-dump leantime >"/opt/${APP}_db_backup_$(date +%F).sql"
|
||||
tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" "/opt/${APP}"
|
||||
msg_ok "Backup Created"
|
||||
fetch_and_deploy_gh_release "$APP" "Leantime/leantime" "prebuild" "latest" "/opt/${APP}" Leantime-v[0-9].[0-9].[0-9].tar.gz
|
||||
exit
|
||||
}
|
||||
|
||||
@ -44,4 +45,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}${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/install${CL}"
|
@ -1,15 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Omar Minaya
|
||||
# Author: Omar Minaya | MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://linkstack.org/
|
||||
|
||||
APP="LinkStack"
|
||||
var_tags="${var_tags:-os}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
@ -24,16 +24,12 @@ function update_script() {
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /var ]]; then
|
||||
if [[ ! -f ~/.linkstack ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating $APP LXC"
|
||||
$STD apt-get update
|
||||
$STD apt-get -y upgrade
|
||||
msg_ok "Updated $APP LXC"
|
||||
|
||||
PHP_VERSION="8.3" PHP_MODULE="sqlite3" PHP_APACHE="YES" setup_php
|
||||
msg_error "Adguard Home should be updated via the user interface."
|
||||
exit
|
||||
}
|
||||
|
||||
@ -43,5 +39,5 @@ description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Complete setup at:${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
|
158
ct/nginxproxymanager.sh
Normal file
158
ct/nginxproxymanager.sh
Normal file
@ -0,0 +1,158 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://nginxproxymanager.com/
|
||||
|
||||
APP="Nginx Proxy Manager"
|
||||
var_tags="${var_tags:-proxy}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -f /lib/systemd/system/npm.service ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if ! command -v pnpm &>/dev/null; then
|
||||
msg_info "Installing pnpm"
|
||||
#export NODE_OPTIONS=--openssl-legacy-provider
|
||||
$STD npm install -g pnpm@8.15
|
||||
msg_ok "Installed pnpm"
|
||||
fi
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest |
|
||||
grep "tag_name" |
|
||||
awk '{print substr($2, 3, length($2)-4) }')
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop openresty
|
||||
systemctl stop npm
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Cleaning Old Files"
|
||||
rm -rf /app \
|
||||
/var/www/html \
|
||||
/etc/nginx \
|
||||
/var/log/nginx \
|
||||
/var/lib/nginx \
|
||||
"$STD" /var/cache/nginx
|
||||
msg_ok "Cleaned Old Files"
|
||||
|
||||
msg_info "Downloading NPM v${RELEASE}"
|
||||
curl -fsSL "https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE}" | tar -xz
|
||||
cd nginx-proxy-manager-"${RELEASE}"
|
||||
msg_ok "Downloaded NPM v${RELEASE}"
|
||||
|
||||
msg_info "Setting up Enviroment"
|
||||
ln -sf /usr/bin/python3 /usr/bin/python
|
||||
ln -sf /usr/bin/certbot /opt/certbot/bin/certbot
|
||||
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
|
||||
ln -sf /usr/local/openresty/nginx/ /etc/nginx
|
||||
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json
|
||||
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json
|
||||
sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf
|
||||
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
||||
for NGINX_CONF in $NGINX_CONFS; do
|
||||
sed -i 's+include conf.d+include /etc/nginx/conf.d+g' "$NGINX_CONF"
|
||||
done
|
||||
mkdir -p /var/www/html /etc/nginx/logs
|
||||
cp -r docker/rootfs/var/www/html/* /var/www/html/
|
||||
cp -r docker/rootfs/etc/nginx/* /etc/nginx/
|
||||
cp docker/rootfs/etc/letsencrypt.ini /etc/letsencrypt.ini
|
||||
cp docker/rootfs/etc/logrotate.d/nginx-proxy-manager /etc/logrotate.d/nginx-proxy-manager
|
||||
ln -sf /etc/nginx/nginx.conf /etc/nginx/conf/nginx.conf
|
||||
rm -f /etc/nginx/conf.d/dev.conf
|
||||
mkdir -p /tmp/nginx/body \
|
||||
/run/nginx \
|
||||
/data/nginx \
|
||||
/data/custom_ssl \
|
||||
/data/logs \
|
||||
/data/access \
|
||||
/data/nginx/default_host \
|
||||
/data/nginx/default_www \
|
||||
/data/nginx/proxy_host \
|
||||
/data/nginx/redirection_host \
|
||||
/data/nginx/stream \
|
||||
/data/nginx/dead_host \
|
||||
/data/nginx/temp \
|
||||
/var/lib/nginx/cache/public \
|
||||
/var/lib/nginx/cache/private \
|
||||
/var/cache/nginx/proxy_temp
|
||||
chmod -R 777 /var/cache/nginx
|
||||
chown root /tmp/nginx
|
||||
echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf);" >/etc/nginx/conf.d/include/resolvers.conf
|
||||
if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ]; then
|
||||
$STD openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost" -keyout /data/nginx/dummykey.pem -out /data/nginx/dummycert.pem
|
||||
fi
|
||||
mkdir -p /app/global /app/frontend/images
|
||||
cp -r backend/* /app
|
||||
cp -r global/* /app/global
|
||||
$STD python3 -m pip install --no-cache-dir --break-system-packages certbot-dns-cloudflare
|
||||
msg_ok "Setup Enviroment"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd ./frontend
|
||||
$STD pnpm install
|
||||
$STD pnpm upgrade
|
||||
$STD pnpm run build
|
||||
cp -r dist/* /app/frontend
|
||||
cp -r app-images/* /app/frontend/images
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Initializing Backend"
|
||||
$STD rm -rf /app/config/default.json
|
||||
if [ ! -f /app/config/production.json ]; then
|
||||
cat <<'EOF' >/app/config/production.json
|
||||
{
|
||||
"database": {
|
||||
"engine": "knex-native",
|
||||
"knex": {
|
||||
"client": "sqlite3",
|
||||
"connection": {
|
||||
"filename": "/data/database.sqlite"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
cd /app
|
||||
$STD pnpm install
|
||||
msg_ok "Initialized Backend"
|
||||
|
||||
msg_info "Starting Services"
|
||||
sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf
|
||||
sed -i 's/su npm npm/su root root/g' /etc/logrotate.d/nginx-proxy-manager
|
||||
sed -i 's/include-system-site-packages = false/include-system-site-packages = true/g' /opt/certbot/pyvenv.cfg
|
||||
systemctl enable -q --now openresty
|
||||
systemctl enable -q --now npm
|
||||
msg_ok "Started Services"
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf ~/nginx-proxy-manager-*
|
||||
msg_ok "Cleaned"
|
||||
|
||||
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}:81${CL}"
|
@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/ZoeyVid/NPMplus
|
||||
|
||||
APP="NPMplus"
|
||||
var_tags="${var_tags:-proxy;nginx}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-3}"
|
||||
var_os="${var_os:-alpine}"
|
||||
var_version="${var_version:-3.21}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \
|
||||
"1" "Check for Alpine Updates" OFF \
|
||||
"2" "Update NPMplus Docker Container" ON \
|
||||
3>&1 1>&2 2>&3)
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
case "$UPD" in
|
||||
"1")
|
||||
msg_info "Updating Alpine OS"
|
||||
$STD apk -U upgrade
|
||||
msg_ok "System updated"
|
||||
exit
|
||||
;;
|
||||
"2")
|
||||
msg_info "Updating NPMplus Container"
|
||||
cd /opt
|
||||
msg_info "Pulling latest container image"
|
||||
$STD docker compose pull
|
||||
msg_info "Recreating container"
|
||||
$STD docker compose up -d
|
||||
msg_ok "NPMplus container updated"
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
exit 0
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:81${CL}"
|
59
ct/ots.sh
Normal file
59
ct/ots.sh
Normal file
@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://github.com/Luzifer/ots
|
||||
|
||||
APP="OTS"
|
||||
var_tags="${var_tags:-secrets-sharer}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-3}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/ots ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/Luzifer/ots/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
|
||||
msg_info "Stopping ${APP} Service"
|
||||
systemctl stop ots
|
||||
msg_ok "Stopped ${APP} Service"
|
||||
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
|
||||
msg_ok "Updated ${APP} to v${RELEASE}"
|
||||
|
||||
msg_info "Stopping ${APP} Service"
|
||||
systemctl start ots
|
||||
msg_ok "Stopped ${APP} 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}:3000${CL}"
|
@ -3,13 +3,13 @@ source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://mealie.io
|
||||
# Source: https://github.com/rybbit-io/rybbit
|
||||
|
||||
APP="Mealie"
|
||||
var_tags="${var_tags:-recipes}"
|
||||
var_cpu="${var_cpu:-4}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-10}"
|
||||
APP="Rybbit"
|
||||
var_tags="${var_tags:-analytics}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
@ -38,7 +38,5 @@ 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}:9000${CL}"
|
||||
msg_ok "Completed Successfully!"
|
||||
msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
|
@ -1,50 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/saltstack/salt
|
||||
|
||||
APP="saltmaster"
|
||||
var_tags="${var_tags:-automations}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-3}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /etc/salt ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Updating $APP to ${RELEASE}"
|
||||
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
|
||||
$STD apt-get update
|
||||
$STD apt-get upgrade -y
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
||||
else
|
||||
msg_ok "${APP} is already up to date (${RELEASE})"
|
||||
fi
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
66
ct/scraparr.sh
Normal file
66
ct/scraparr.sh
Normal file
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: JasonGreenC
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/thecfu/scraparr
|
||||
|
||||
APP="Scraparr"
|
||||
var_tags="${var_tags:-arr;monitoring}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/scraparr/ ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/thecfu/scraparr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f "${HOME}/.scrappar" ]] || [[ "${RELEASE}" != "$(cat "${HOME}"/.scrappar)" ]]; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop scraparr
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
fetch_and_deploy_gh_release "scrappar" "thecfu/scraparr" "tarball" "latest" "/opt/scraparr"
|
||||
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
cd /opt/scraparr || exit
|
||||
$STD uv venv /opt/scraparr/.venv
|
||||
$STD /opt/scraparr/.venv/bin/python -m ensurepip --upgrade
|
||||
$STD /opt/scraparr/.venv/bin/python -m pip install --upgrade pip
|
||||
$STD /opt/scraparr/.venv/bin/python -m pip install -r /opt/scraparr/src/scraparr/requirements.txt
|
||||
chmod -R 755 /opt/scraparr
|
||||
msg_ok "Updated ${APP} to v${RELEASE}"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start scraparr
|
||||
msg_ok "Services Started"
|
||||
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}:7100${CL}"
|
71
ct/tududi.sh
Normal file
71
ct/tududi.sh
Normal file
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: vhsdream
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://tududi.com
|
||||
|
||||
APP="Tududi"
|
||||
var_tags="${var_tags:-todo-app}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/tududi ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/chrisvel/tududi/releases/latest | yq '.tag_name' | sed 's/^v//')
|
||||
if [[ "${RELEASE}" != "$(cat ~/.tududi 2>/dev/null)" ]] || [[ ! -f ~/.tududi ]]; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop tududi
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
cp /opt/"$APP"/backend/.env /opt/"$APP".env
|
||||
rm -rf /opt/"$APP"
|
||||
fetch_and_deploy_gh_release "tududi" "chrisvel/tududi"
|
||||
|
||||
cd /opt/"$APP"
|
||||
$STD npm install
|
||||
export NODE_ENV=production
|
||||
$STD npm run frontend:build
|
||||
cp -r ./dist ./backend/dist
|
||||
cp -r ./public/locales ./backend/dist/locales
|
||||
cp ./public/favicon.* ./backend/dist
|
||||
mv /opt/"$APP".env /opt/"$APP"/.env
|
||||
msg_ok "Updated $APP"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start tududi
|
||||
msg_ok "Started Service"
|
||||
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "Already up to date"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${ADVANCED}${BL}Create your initial user in${CL} ${BGN}/opt/${APP}${CL}${BL} in the LXC:${CL} ${RD}npm run user:create <user> <password>${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3002${CL}"
|
78
ct/vikunja.sh
Normal file
78
ct/vikunja.sh
Normal file
@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (Canbiz)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://vikunja.io/
|
||||
|
||||
APP="Vikunja"
|
||||
var_tags="${var_tags:-todo-app}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/vikunja ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if whiptail --backtitle "Vikunja Update" --title "🔄 VERSION SELECTION" --yesno \
|
||||
"Choose the version type to update to:\n\n• STABLE: Recommended for production use\n• UNSTABLE: Latest development version\n\n⚠️ WARNING: Unstable versions may contain bugs,\nbe incomplete, or cause system instability.\nOnly use for testing purposes.\n\nDo you want to use the UNSTABLE version?\n(No = Stable, Yes = Unstable)" 16 70 --defaultno
|
||||
then
|
||||
msg_info "Selecting version"
|
||||
RELEASE="unstable"
|
||||
FILENAME="vikunja-${RELEASE}-x86_64.deb"
|
||||
msg_ok "Selected UNSTABLE version"
|
||||
else
|
||||
msg_info "Selecting version"
|
||||
RELEASE=$(curl -fsSL https://dl.vikunja.io/vikunja/ | grep -oP 'href="/vikunja/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
|
||||
FILENAME="vikunja-${RELEASE}-amd64.deb"
|
||||
msg_ok "Selected STABLE version: ${RELEASE}"
|
||||
fi
|
||||
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Stopping ${APP}"
|
||||
systemctl stop vikunja
|
||||
msg_ok "Stopped ${APP}"
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
cd /opt
|
||||
rm -rf /opt/vikunja/vikunja
|
||||
rm -rf "/opt/$FILENAME"
|
||||
curl -fsSL "https://dl.vikunja.io/vikunja/$RELEASE/$FILENAME" -o $(basename "https://dl.vikunja.io/vikunja/$RELEASE/$FILENAME")
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
$STD dpkg -i $FILENAME
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP}"
|
||||
msg_info "Starting ${APP}"
|
||||
systemctl start vikunja
|
||||
msg_ok "Started ${APP}"
|
||||
msg_info "Cleaning Up"
|
||||
rm -rf /opt/$FILENAME
|
||||
msg_ok "Cleaned"
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3456${CL}"
|
38
ct/viseron.sh
Normal file
38
ct/viseron.sh
Normal file
@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
|
||||
|
||||
APP="Viseron"
|
||||
var_tags="${var_tags:-nvr}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -f /etc/systemd/system/viseron.service ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "To update Viseron, create a new container and transfer your configuration."
|
||||
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}:8888${CL}"
|
120
frontend/package-lock.json
generated
120
frontend/package-lock.json
generated
@ -4082,6 +4082,20 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind-apply-helpers": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
|
||||
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/callsites": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
|
||||
@ -4694,6 +4708,21 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dunder-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind-apply-helpers": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/eastasianwidth": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
|
||||
@ -4804,14 +4833,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
|
||||
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
@ -4860,9 +4886,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/es-object-atoms": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
|
||||
"integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
|
||||
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -4873,15 +4899,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-set-tostringtag": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
|
||||
"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
|
||||
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.6",
|
||||
"has-tostringtag": "^1.0.2",
|
||||
"hasown": "^2.0.1"
|
||||
"hasown": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@ -5728,14 +5755,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
|
||||
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"es-set-tostringtag": "^2.1.0",
|
||||
"hasown": "^2.0.2",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
@ -5851,17 +5880,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
|
||||
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind-apply-helpers": "^1.0.2",
|
||||
"es-define-property": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"es-object-atoms": "^1.1.1",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
"get-proto": "^1.0.1",
|
||||
"gopd": "^1.2.0",
|
||||
"has-symbols": "^1.1.0",
|
||||
"hasown": "^2.0.2",
|
||||
"math-intrinsics": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@ -5879,6 +5913,20 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/get-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"dunder-proto": "^1.0.1",
|
||||
"es-object-atoms": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/get-symbol-description": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
|
||||
@ -5982,13 +6030,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
||||
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.1.3"
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@ -6055,9 +6103,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/has-symbols": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
||||
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
|
||||
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@ -7037,6 +7085,16 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/math-intrinsics": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
||||
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/merge2": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||
|
@ -1,35 +0,0 @@
|
||||
{
|
||||
"name": "Bar-Assistant",
|
||||
"slug": "bar-assistant",
|
||||
"categories": [
|
||||
24
|
||||
],
|
||||
"date_created": "2025-05-25",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://docs.barassistant.app/",
|
||||
"website": "https://barassistant.app/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/bar-assistant.webp",
|
||||
"config_path": "/opt/bar-assistant",
|
||||
"description": "Bar assistant is a all-in-one solution for managing your home bar.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/bar-assistant.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 4,
|
||||
"os": "ubuntu",
|
||||
"version": "24.10"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/docspell.json
Normal file
35
frontend/public/json/docspell.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Docspell",
|
||||
"slug": "docspell",
|
||||
"categories": [
|
||||
12
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/docspell/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docspell.io/",
|
||||
"website": "https://docspell.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/docspell.svg",
|
||||
"description": "Docspell is an open-source self-hosted application.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/docspell.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/frigate.json
Normal file
35
frontend/public/json/frigate.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Frigate",
|
||||
"slug": "frigate",
|
||||
"categories": [
|
||||
15
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/frigate/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://frigate.io/",
|
||||
"website": "https://frigate.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/frigate.svg",
|
||||
"description": "Frigate is an open-source self-hosted application.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/frigate.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/hanko.json
Normal file
35
frontend/public/json/hanko.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Hanko",
|
||||
"slug": "hanko",
|
||||
"categories": [
|
||||
21
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/hanko/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docs.hanko.io/",
|
||||
"website": "https://hanko.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/hanko.svg",
|
||||
"description": "Hanko is an open-source authentication solution providing passkey-first login with support for WebAuthn/FIDO2, biometrics and modern identity flows. Easy to self-host and integrate via API or widget.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/hanko.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/healthchecks.json
Normal file
35
frontend/public/json/healthchecks.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Healthchecks",
|
||||
"slug": "healthchecks",
|
||||
"categories": [
|
||||
9
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/healthchecks/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://healthchecks.io/",
|
||||
"website": "https://healthchecks.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/healthchecks.svg",
|
||||
"description": "Healthchecks is an open-source self-hosted application.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/healthchecks.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
{
|
||||
"name": "ITSMNG",
|
||||
"slug": "itsmng",
|
||||
"categories": [
|
||||
25
|
||||
],
|
||||
"date_created": "2025-06-20",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://wiki.itsm-ng.org/en/home",
|
||||
"website": "https://itsm-ng.com",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/itsm-ng.svg",
|
||||
"config_path": "/etc/itsm-ng",
|
||||
"description": "ITSM-NG 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/itsmng.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 10,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "itsm",
|
||||
"password": "itsm"
|
||||
},
|
||||
"notes": []
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
{
|
||||
"name": "Kapowarr",
|
||||
"slug": "kapowarr",
|
||||
"categories": [
|
||||
14
|
||||
],
|
||||
"date_created": "2025-06-09",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 5656,
|
||||
"documentation": "https://casvt.github.io/Kapowarr/general_info/workings/",
|
||||
"website": "https://casvt.github.io/Kapowarr/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/kapowarr.webp",
|
||||
"config_path": "",
|
||||
"description": "Kapowarr allows you to build a digital library of comics. You can add volumes, map them to a folder and start managing! Download, rename, move and convert issues of the volume (including TPB's, One Shots, Hard Covers, and more). The whole process is automated and can be customised in the settings.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/kapowarr.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 256,
|
||||
"hdd": 2,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/leantime.json
Normal file
35
frontend/public/json/leantime.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Leantime",
|
||||
"slug": "leantime",
|
||||
"categories": [
|
||||
12
|
||||
],
|
||||
"date_created": "2025-06-27",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://docs.leantime.io/",
|
||||
"config_path": "/opt/Leantime/config/.env",
|
||||
"website": "https://leantime.io",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/leantime.webp",
|
||||
"description": "Leantime is a goals focused project management system for non-project managers. Building with ADHD, Autism, and dyslexia in mind. ",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/leantime.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 20,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
@ -4,11 +4,11 @@
|
||||
"categories": [
|
||||
9
|
||||
],
|
||||
"date_created": "2025-05-21",
|
||||
"date_created": "2025-07-22",
|
||||
"type": "ct",
|
||||
"updateable": false,
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/var/www/html/linkstack/linkstack/.env",
|
||||
"config_path": "/var/www/html/linkstack/.env",
|
||||
"interface_port": 80,
|
||||
"documentation": "https://docs.linkstack.org/",
|
||||
"website": "https://linkstack.org/",
|
||||
@ -20,8 +20,8 @@
|
||||
"script": "ct/linkstack.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 2048,
|
||||
"hdd": 10,
|
||||
"ram": 1024,
|
||||
"hdd": 5,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
@ -33,7 +33,7 @@
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "LinkStack can be updated via the user interface.",
|
||||
"text": "LinkStack can be updated via the user interface or with the command `update`.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
|
35
frontend/public/json/maxun.json
Normal file
35
frontend/public/json/maxun.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Maxun",
|
||||
"slug": "maxun",
|
||||
"categories": [
|
||||
0
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/maxun/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://maxun.io/",
|
||||
"website": "https://maxun.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/maxun.svg",
|
||||
"description": "Maxun is an open-source self-hosted application.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/maxun.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/postiz.json
Normal file
35
frontend/public/json/postiz.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Postiz",
|
||||
"slug": "postiz",
|
||||
"categories": [
|
||||
20
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/postiz/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://postiz.io/",
|
||||
"website": "https://postiz.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/postiz.svg",
|
||||
"description": "Postiz is an open-source self-hosted application.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/postiz.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
35
frontend/public/json/salt.json
Normal file
35
frontend/public/json/salt.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Salt",
|
||||
"slug": "salt",
|
||||
"categories": [
|
||||
19
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/salt/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docs.saltproject.io/salt/install-guide/en/latest/",
|
||||
"website": "https://saltproject.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/saltmaster.svg",
|
||||
"description": "SaltStack Salt is a software for automating the management and configuration of IT infrastructure and applications. It is an event-driven automation tool and framework used to deploy, configure, and manage complex IT systems. Its primary functions include configuration management, where it ensures consistent configurations and manages operating system deployment and software installation. It also automates and orchestrates routine IT processes and can create self-aware, self-healing systems.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/salt.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
40
frontend/public/json/scraparr.json
Normal file
40
frontend/public/json/scraparr.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "Scraparr",
|
||||
"slug": "scraparr",
|
||||
"categories": [
|
||||
14
|
||||
],
|
||||
"date_created": "2024-05-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 7100,
|
||||
"documentation": "https://github.com/thecfu/scraparr/blob/main/README.md",
|
||||
"website": "https://github.com/thecfu/scraparr",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/scraparr-dark.svg",
|
||||
"config_path": "/scraparr/config/config.yaml",
|
||||
"description": "Scraparr is a Prometheus exporter for the *arr suite (Sonarr, Radarr, Lidarr, etc.). It provides metrics that can be scraped by Prometheus to monitor and visualize the health and performance of your *arr applications.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/scraparr.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 1024,
|
||||
"hdd": 4,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Edit config file then restart the scraparr service: `systemctl restart scraparr`",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
39
frontend/public/json/teamspeak-server.json
Normal file
39
frontend/public/json/teamspeak-server.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "Teamspeak Server",
|
||||
"slug": "teamspeak-server",
|
||||
"categories": [
|
||||
24
|
||||
],
|
||||
"date_created": "2025-07-21",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 9987,
|
||||
"documentation": "https://support.teamspeak.com/hc/en-us/categories/360000302017-TeamSpeak-3",
|
||||
"website": "https://teamspeak.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/teamspeak-light.svgp",
|
||||
"config_path": "",
|
||||
"description": "TeamSpeak is a voice‑over‑IP (VoIP) application, primarily used by gamers and teams to chat in real‑time on dedicated servers. It delivers crystal‑clear, low‑latency voice communication.""install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/teamspeak-server.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 512,
|
||||
"hdd": 2,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Use `journalctl -u teamspeak-server.service` inside LXC console to check for admin credentials!",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
40
frontend/public/json/tududi.json
Normal file
40
frontend/public/json/tududi.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "Tududi",
|
||||
"slug": "tududi",
|
||||
"categories": [
|
||||
12
|
||||
],
|
||||
"date_created": "2025-07-07",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3002,
|
||||
"documentation": null,
|
||||
"config_path": "/opt/tududi/backend/.env",
|
||||
"website": "https://tududi.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/tududi.webp",
|
||||
"description": "Self-hosted task management with functional programming architecture, hierarchical organization, and multi-language support.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/tududi.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 4,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Create users like this: `cd /opt/tududi` => `npm run user:create <email> <password>`",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
@ -1,108 +1,48 @@
|
||||
[
|
||||
{
|
||||
"name": "Jackett/Jackett",
|
||||
"version": "v0.22.2075",
|
||||
"date": "2025-06-28T10:16:17Z"
|
||||
"name": "theonedev/onedev",
|
||||
"version": "v12.0.0",
|
||||
"date": "2025-07-14T06:19:59Z"
|
||||
},
|
||||
{
|
||||
"name": "wazuh/wazuh",
|
||||
"version": "coverity-w28-4.13.0",
|
||||
"date": "2025-07-08T11:25:24Z"
|
||||
},
|
||||
{
|
||||
"name": "Luligu/matterbridge",
|
||||
"version": "3.1.0",
|
||||
"date": "2025-06-28T09:02:38Z"
|
||||
"version": "3.1.3",
|
||||
"date": "2025-07-14T07:14:31Z"
|
||||
},
|
||||
{
|
||||
"name": "morpheus65535/bazarr",
|
||||
"version": "v1.5.3-beta.9",
|
||||
"date": "2025-07-14T06:07:20Z"
|
||||
},
|
||||
{
|
||||
"name": "Jackett/Jackett",
|
||||
"version": "v0.22.2154",
|
||||
"date": "2025-07-14T06:00:33Z"
|
||||
},
|
||||
{
|
||||
"name": "firefly-iii/firefly-iii",
|
||||
"version": "v6.2.19",
|
||||
"date": "2025-06-28T06:53:45Z"
|
||||
"version": "v6.2.20",
|
||||
"date": "2025-07-02T04:03:37Z"
|
||||
},
|
||||
{
|
||||
"name": "esphome/esphome",
|
||||
"version": "2025.6.2",
|
||||
"date": "2025-06-28T03:47:16Z"
|
||||
"name": "steveiliop56/tinyauth",
|
||||
"version": "v3.6.1",
|
||||
"date": "2025-07-12T13:41:57Z"
|
||||
},
|
||||
{
|
||||
"name": "plexguide/Huntarr.io",
|
||||
"version": "8.1.11",
|
||||
"date": "2025-06-28T03:42:46Z"
|
||||
"name": "homebridge/homebridge",
|
||||
"version": "v1.11.0",
|
||||
"date": "2025-07-13T19:22:47Z"
|
||||
},
|
||||
{
|
||||
"name": "tobychui/zoraxy",
|
||||
"version": "v3.2.4",
|
||||
"date": "2025-06-28T02:47:31Z"
|
||||
},
|
||||
{
|
||||
"name": "pocket-id/pocket-id",
|
||||
"version": "v1.5.0",
|
||||
"date": "2025-06-27T22:04:32Z"
|
||||
},
|
||||
{
|
||||
"name": "linkwarden/linkwarden",
|
||||
"version": "v2.11.1",
|
||||
"date": "2025-06-27T21:21:59Z"
|
||||
},
|
||||
{
|
||||
"name": "homarr-labs/homarr",
|
||||
"version": "v1.26.0",
|
||||
"date": "2025-06-27T19:15:24Z"
|
||||
},
|
||||
{
|
||||
"name": "ollama/ollama",
|
||||
"version": "v0.9.4-rc1",
|
||||
"date": "2025-06-27T18:45:33Z"
|
||||
},
|
||||
{
|
||||
"name": "home-assistant/core",
|
||||
"version": "2025.6.3",
|
||||
"date": "2025-06-24T13:00:12Z"
|
||||
},
|
||||
{
|
||||
"name": "mattermost/mattermost",
|
||||
"version": "preview-v0.1",
|
||||
"date": "2025-06-27T14:35:47Z"
|
||||
},
|
||||
{
|
||||
"name": "goauthentik/authentik",
|
||||
"version": "version/2025.6.3",
|
||||
"date": "2025-06-27T14:01:06Z"
|
||||
},
|
||||
{
|
||||
"name": "keycloak/keycloak",
|
||||
"version": "26.2.5",
|
||||
"date": "2025-05-28T06:49:43Z"
|
||||
},
|
||||
{
|
||||
"name": "rclone/rclone",
|
||||
"version": "v1.70.2",
|
||||
"date": "2025-06-27T13:21:17Z"
|
||||
},
|
||||
{
|
||||
"name": "documenso/documenso",
|
||||
"version": "v1.12.0-rc.7",
|
||||
"date": "2025-06-27T12:17:45Z"
|
||||
},
|
||||
{
|
||||
"name": "sabnzbd/sabnzbd",
|
||||
"version": "4.5.1",
|
||||
"date": "2025-04-11T09:57:47Z"
|
||||
},
|
||||
{
|
||||
"name": "FlowiseAI/Flowise",
|
||||
"version": "flowise@3.0.3",
|
||||
"date": "2025-06-27T09:53:57Z"
|
||||
},
|
||||
{
|
||||
"name": "nzbgetcom/nzbget",
|
||||
"version": "v25.1",
|
||||
"date": "2025-06-27T09:14:14Z"
|
||||
},
|
||||
{
|
||||
"name": "cockpit-project/cockpit",
|
||||
"version": "341.1",
|
||||
"date": "2025-06-27T08:50:16Z"
|
||||
},
|
||||
{
|
||||
"name": "zabbix/zabbix",
|
||||
"version": "7.2.10",
|
||||
"date": "2025-06-27T06:40:00Z"
|
||||
"name": "wavelog/wavelog",
|
||||
"version": "2.0.6",
|
||||
"date": "2025-07-13T19:10:15Z"
|
||||
},
|
||||
{
|
||||
"name": "MediaBrowser/Emby.Releases",
|
||||
@ -110,289 +50,284 @@
|
||||
"date": "2025-06-26T22:08:00Z"
|
||||
},
|
||||
{
|
||||
"name": "prometheus/prometheus",
|
||||
"version": "v3.4.2",
|
||||
"date": "2025-06-26T21:45:21Z"
|
||||
},
|
||||
{
|
||||
"name": "home-assistant/operating-system",
|
||||
"version": "15.2",
|
||||
"date": "2025-04-14T15:37:12Z"
|
||||
},
|
||||
{
|
||||
"name": "netbox-community/netbox",
|
||||
"version": "v4.3.3",
|
||||
"date": "2025-06-26T18:42:56Z"
|
||||
},
|
||||
{
|
||||
"name": "apache/tika",
|
||||
"version": "3.2.1-rc2",
|
||||
"date": "2025-06-26T17:10:25Z"
|
||||
},
|
||||
{
|
||||
"name": "tailscale/tailscale",
|
||||
"version": "v1.84.3",
|
||||
"date": "2025-06-26T16:31:57Z"
|
||||
},
|
||||
{
|
||||
"name": "fuma-nama/fumadocs",
|
||||
"version": "fumadocs-ui@15.5.5",
|
||||
"date": "2025-06-26T15:54:17Z"
|
||||
},
|
||||
{
|
||||
"name": "traefik/traefik",
|
||||
"version": "v3.5.0-rc1",
|
||||
"date": "2025-06-26T15:08:43Z"
|
||||
},
|
||||
{
|
||||
"name": "meilisearch/meilisearch",
|
||||
"version": "prototype-no-simd-x86-arroy-0",
|
||||
"date": "2025-06-26T14:54:18Z"
|
||||
},
|
||||
{
|
||||
"name": "AdguardTeam/AdGuardHome",
|
||||
"version": "v0.107.63",
|
||||
"date": "2025-06-26T14:34:19Z"
|
||||
},
|
||||
{
|
||||
"name": "node-red/node-red",
|
||||
"version": "4.1.0-beta.2",
|
||||
"date": "2025-06-26T14:23:26Z"
|
||||
},
|
||||
{
|
||||
"name": "Dolibarr/dolibarr",
|
||||
"version": "18.0.7",
|
||||
"date": "2025-06-26T09:16:33Z"
|
||||
},
|
||||
{
|
||||
"name": "mongodb/mongo",
|
||||
"version": "r8.1.2-rc1",
|
||||
"date": "2025-06-25T22:42:04Z"
|
||||
},
|
||||
{
|
||||
"name": "rcourtman/Pulse",
|
||||
"version": "v3.32.0",
|
||||
"date": "2025-06-25T22:27:01Z"
|
||||
},
|
||||
{
|
||||
"name": "gristlabs/grist-core",
|
||||
"version": "v1.6.1",
|
||||
"date": "2025-06-25T21:19:25Z"
|
||||
},
|
||||
{
|
||||
"name": "coder/code-server",
|
||||
"version": "v4.101.2",
|
||||
"date": "2025-06-25T21:18:52Z"
|
||||
"name": "openhab/openhab-core",
|
||||
"version": "5.0.0.M4",
|
||||
"date": "2025-07-13T16:04:39Z"
|
||||
},
|
||||
{
|
||||
"name": "msgbyte/tianji",
|
||||
"version": "v1.22.4",
|
||||
"date": "2025-06-25T20:46:20Z"
|
||||
"version": "v1.23.5",
|
||||
"date": "2025-07-13T15:23:02Z"
|
||||
},
|
||||
{
|
||||
"name": "influxdata/influxdb",
|
||||
"version": "v3.2.0",
|
||||
"date": "2025-06-25T17:31:48Z"
|
||||
},
|
||||
{
|
||||
"name": "wavelog/wavelog",
|
||||
"version": "2.0.5",
|
||||
"date": "2025-06-25T14:53:31Z"
|
||||
},
|
||||
{
|
||||
"name": "jenkinsci/jenkins",
|
||||
"version": "jenkins-2.504.3",
|
||||
"date": "2025-06-25T14:43:01Z"
|
||||
},
|
||||
{
|
||||
"name": "bunkerity/bunkerweb",
|
||||
"version": "testing",
|
||||
"date": "2025-06-16T18:10:42Z"
|
||||
},
|
||||
{
|
||||
"name": "n8n-io/n8n",
|
||||
"version": "n8n@1.100.0",
|
||||
"date": "2025-06-23T12:48:35Z"
|
||||
},
|
||||
{
|
||||
"name": "moghtech/komodo",
|
||||
"version": "v1.18.4",
|
||||
"date": "2025-06-25T00:06:56Z"
|
||||
},
|
||||
{
|
||||
"name": "duplicati/duplicati",
|
||||
"version": "v2.1.0.120-2.1.0.120_canary_2025-06-24",
|
||||
"date": "2025-06-24T22:39:50Z"
|
||||
"name": "mayswind/AriaNg",
|
||||
"version": "1.3.11",
|
||||
"date": "2025-07-13T13:33:48Z"
|
||||
},
|
||||
{
|
||||
"name": "evcc-io/evcc",
|
||||
"version": "0.204.5",
|
||||
"date": "2025-06-24T19:17:16Z"
|
||||
"version": "0.205.0",
|
||||
"date": "2025-07-13T12:27:31Z"
|
||||
},
|
||||
{
|
||||
"name": "ErsatzTV/ErsatzTV",
|
||||
"version": "v25.2.0",
|
||||
"date": "2025-06-24T17:06:31Z"
|
||||
"name": "rcourtman/Pulse",
|
||||
"version": "v3.41.1",
|
||||
"date": "2025-07-10T17:10:46Z"
|
||||
},
|
||||
{
|
||||
"name": "arunavo4/gitea-mirror",
|
||||
"version": "v2.18.0",
|
||||
"date": "2025-06-24T08:29:55Z"
|
||||
"name": "authelia/authelia",
|
||||
"version": "v4.39.5",
|
||||
"date": "2025-07-13T06:12:47Z"
|
||||
},
|
||||
{
|
||||
"name": "element-hq/synapse",
|
||||
"version": "v1.132.0",
|
||||
"date": "2025-06-17T13:49:30Z"
|
||||
"name": "henrygd/beszel",
|
||||
"version": "v0.11.1",
|
||||
"date": "2025-04-29T01:14:35Z"
|
||||
},
|
||||
{
|
||||
"name": "docker/compose",
|
||||
"version": "v2.37.3",
|
||||
"date": "2025-06-24T14:05:33Z"
|
||||
},
|
||||
{
|
||||
"name": "Checkmk/checkmk",
|
||||
"version": "v2.4.0p5",
|
||||
"date": "2025-06-24T13:06:53Z"
|
||||
},
|
||||
{
|
||||
"name": "fallenbagel/jellyseerr",
|
||||
"version": "preview-fix-proxy-axios",
|
||||
"date": "2025-06-24T08:50:22Z"
|
||||
},
|
||||
{
|
||||
"name": "wazuh/wazuh",
|
||||
"version": "coverity-w26-4.13.0",
|
||||
"date": "2025-06-24T02:02:34Z"
|
||||
},
|
||||
{
|
||||
"name": "minio/minio",
|
||||
"version": "RELEASE.2025-06-13T11-33-47Z",
|
||||
"date": "2025-06-23T20:58:42Z"
|
||||
},
|
||||
{
|
||||
"name": "runtipi/runtipi",
|
||||
"version": "v4.2.1",
|
||||
"date": "2025-06-03T20:04:28Z"
|
||||
},
|
||||
{
|
||||
"name": "VictoriaMetrics/VictoriaMetrics",
|
||||
"version": "pmm-6401-v1.120.0",
|
||||
"date": "2025-06-23T15:12:12Z"
|
||||
},
|
||||
{
|
||||
"name": "Graylog2/graylog2-server",
|
||||
"version": "6.3.0-rc.2",
|
||||
"date": "2025-06-23T11:31:38Z"
|
||||
},
|
||||
{
|
||||
"name": "gotson/komga",
|
||||
"version": "1.22.0",
|
||||
"date": "2025-06-23T03:11:37Z"
|
||||
"name": "esphome/esphome",
|
||||
"version": "2025.6.3",
|
||||
"date": "2025-07-03T01:07:26Z"
|
||||
},
|
||||
{
|
||||
"name": "OliveTin/OliveTin",
|
||||
"version": "2025.6.22",
|
||||
"date": "2025-06-22T22:41:11Z"
|
||||
"version": "2025.7.13",
|
||||
"date": "2025-07-12T23:32:05Z"
|
||||
},
|
||||
{
|
||||
"name": "qbittorrent/qBittorrent",
|
||||
"version": "release-5.1.1",
|
||||
"date": "2025-06-22T21:41:17Z"
|
||||
"name": "Ombi-app/Ombi",
|
||||
"version": "v4.47.1",
|
||||
"date": "2025-01-05T21:14:23Z"
|
||||
},
|
||||
{
|
||||
"name": "clusterzx/paperless-ai",
|
||||
"version": "v3.0.7",
|
||||
"date": "2025-06-22T17:49:29Z"
|
||||
"name": "dgtlmoon/changedetection.io",
|
||||
"version": "0.50.6",
|
||||
"date": "2025-07-12T19:52:52Z"
|
||||
},
|
||||
{
|
||||
"name": "advplyr/audiobookshelf",
|
||||
"version": "v2.26.0",
|
||||
"date": "2025-07-12T19:31:21Z"
|
||||
},
|
||||
{
|
||||
"name": "jellyfin/jellyfin",
|
||||
"version": "v10.10.7",
|
||||
"date": "2025-04-05T19:14:59Z"
|
||||
},
|
||||
{
|
||||
"name": "cross-seed/cross-seed",
|
||||
"version": "v6.13.0",
|
||||
"date": "2025-07-12T15:52:03Z"
|
||||
},
|
||||
{
|
||||
"name": "blakeblackshear/frigate",
|
||||
"version": "v0.14.1",
|
||||
"date": "2024-08-29T22:32:51Z"
|
||||
},
|
||||
{
|
||||
"name": "homarr-labs/homarr",
|
||||
"version": "v1.28.1",
|
||||
"date": "2025-07-12T08:50:59Z"
|
||||
},
|
||||
{
|
||||
"name": "fallenbagel/jellyseerr",
|
||||
"version": "preview-seerr",
|
||||
"date": "2025-07-12T08:15:55Z"
|
||||
},
|
||||
{
|
||||
"name": "leiweibau/Pi.Alert",
|
||||
"version": "v2025-07-12",
|
||||
"date": "2025-07-12T07:53:52Z"
|
||||
},
|
||||
{
|
||||
"name": "keycloak/keycloak",
|
||||
"version": "26.3.1",
|
||||
"date": "2025-07-09T15:41:43Z"
|
||||
},
|
||||
{
|
||||
"name": "fuma-nama/fumadocs",
|
||||
"version": "fumadocs-openapi@9.1.2",
|
||||
"date": "2025-07-12T03:58:47Z"
|
||||
},
|
||||
{
|
||||
"name": "eclipse-mosquitto/mosquitto",
|
||||
"version": "v2.0.22",
|
||||
"date": "2025-07-11T21:34:20Z"
|
||||
},
|
||||
{
|
||||
"name": "mongodb/mongo",
|
||||
"version": "r8.2.0-alpha0",
|
||||
"date": "2025-07-11T21:06:26Z"
|
||||
},
|
||||
{
|
||||
"name": "duplicati/duplicati",
|
||||
"version": "v2.1.0.124-2.1.0.124_canary_2025-07-11",
|
||||
"date": "2025-07-11T20:09:08Z"
|
||||
},
|
||||
{
|
||||
"name": "TandoorRecipes/recipes",
|
||||
"version": "1.5.35",
|
||||
"date": "2025-06-22T08:30:10Z"
|
||||
},
|
||||
{
|
||||
"name": "inventree/InvenTree",
|
||||
"version": "0.17.14",
|
||||
"date": "2025-06-21T23:43:04Z"
|
||||
},
|
||||
{
|
||||
"name": "HabitRPG/habitica",
|
||||
"version": "v5.37.0",
|
||||
"date": "2025-06-21T14:05:12Z"
|
||||
},
|
||||
{
|
||||
"name": "rogerfar/rdt-client",
|
||||
"version": "v2.0.114",
|
||||
"date": "2025-06-21T11:20:21Z"
|
||||
},
|
||||
{
|
||||
"name": "theonedev/onedev",
|
||||
"version": "v11.11.1",
|
||||
"date": "2025-06-21T09:23:39Z"
|
||||
},
|
||||
{
|
||||
"name": "pocketbase/pocketbase",
|
||||
"version": "v0.28.4",
|
||||
"date": "2025-06-21T08:29:04Z"
|
||||
},
|
||||
{
|
||||
"name": "dgtlmoon/changedetection.io",
|
||||
"version": "0.50.4",
|
||||
"date": "2025-06-21T07:47:02Z"
|
||||
},
|
||||
{
|
||||
"name": "go-gitea/gitea",
|
||||
"version": "v1.24.2",
|
||||
"date": "2025-06-20T20:37:55Z"
|
||||
},
|
||||
{
|
||||
"name": "immich-app/immich",
|
||||
"version": "v1.135.3",
|
||||
"date": "2025-06-20T20:19:20Z"
|
||||
},
|
||||
{
|
||||
"name": "Sonarr/Sonarr",
|
||||
"version": "v4.0.15.2941",
|
||||
"date": "2025-06-20T17:20:54Z"
|
||||
},
|
||||
{
|
||||
"name": "syncthing/syncthing",
|
||||
"version": "2.0.0-rc.19",
|
||||
"date": "2025-06-02T17:56:25Z"
|
||||
},
|
||||
{
|
||||
"name": "benzino77/tasmocompiler",
|
||||
"version": "v12.7.0",
|
||||
"date": "2025-06-20T08:31:16Z"
|
||||
},
|
||||
{
|
||||
"name": "paperless-ngx/paperless-ngx",
|
||||
"version": "v2.17.1",
|
||||
"date": "2025-06-19T19:35:01Z"
|
||||
},
|
||||
{
|
||||
"name": "icereed/paperless-gpt",
|
||||
"version": "v0.21.0",
|
||||
"date": "2025-06-19T11:54:59Z"
|
||||
},
|
||||
{
|
||||
"name": "neo4j/neo4j",
|
||||
"version": "2025.05.1",
|
||||
"date": "2025-06-19T11:28:36Z"
|
||||
"version": "2025.06.2",
|
||||
"date": "2025-07-11T18:03:51Z"
|
||||
},
|
||||
{
|
||||
"name": "redis/redis",
|
||||
"version": "8.2-m01-int2",
|
||||
"date": "2025-06-12T08:52:10Z"
|
||||
"name": "n8n-io/n8n",
|
||||
"version": "n8n@1.101.2",
|
||||
"date": "2025-07-11T12:03:41Z"
|
||||
},
|
||||
{
|
||||
"name": "prometheus-pve/prometheus-pve-exporter",
|
||||
"version": "v3.5.5",
|
||||
"date": "2025-06-19T05:43:47Z"
|
||||
"name": "FlowiseAI/Flowise",
|
||||
"version": "flowise@3.0.4",
|
||||
"date": "2025-07-11T13:26:54Z"
|
||||
},
|
||||
{
|
||||
"name": "docmost/docmost",
|
||||
"version": "v0.21.0",
|
||||
"date": "2025-06-18T21:43:27Z"
|
||||
"name": "zwave-js/zwave-js-ui",
|
||||
"version": "v10.9.0",
|
||||
"date": "2025-07-11T12:57:54Z"
|
||||
},
|
||||
{
|
||||
"name": "zitadel/zitadel",
|
||||
"version": "v3.3.1",
|
||||
"date": "2025-07-11T11:51:48Z"
|
||||
},
|
||||
{
|
||||
"name": "prometheus/prometheus",
|
||||
"version": "v2.53.5",
|
||||
"date": "2025-06-30T11:01:12Z"
|
||||
},
|
||||
{
|
||||
"name": "Paymenter/Paymenter",
|
||||
"version": "v1.2.2",
|
||||
"date": "2025-07-11T10:09:47Z"
|
||||
},
|
||||
{
|
||||
"name": "traefik/traefik",
|
||||
"version": "v3.4.4",
|
||||
"date": "2025-07-11T08:41:34Z"
|
||||
},
|
||||
{
|
||||
"name": "mattermost/mattermost",
|
||||
"version": "preview-v0.1",
|
||||
"date": "2025-06-27T14:35:47Z"
|
||||
},
|
||||
{
|
||||
"name": "documenso/documenso",
|
||||
"version": "v1.12.2-rc.1",
|
||||
"date": "2025-07-11T02:55:56Z"
|
||||
},
|
||||
{
|
||||
"name": "outline/outline",
|
||||
"version": "v0.85.1",
|
||||
"date": "2025-07-11T01:17:53Z"
|
||||
},
|
||||
{
|
||||
"name": "jenkinsci/jenkins",
|
||||
"version": "jenkins-2.518",
|
||||
"date": "2025-07-08T13:52:55Z"
|
||||
},
|
||||
{
|
||||
"name": "LibreTranslate/LibreTranslate",
|
||||
"version": "v1.7.2",
|
||||
"date": "2025-07-10T19:29:26Z"
|
||||
},
|
||||
{
|
||||
"name": "binwiederhier/ntfy",
|
||||
"version": "v2.13.0",
|
||||
"date": "2025-07-10T19:27:54Z"
|
||||
},
|
||||
{
|
||||
"name": "ollama/ollama",
|
||||
"version": "v0.9.6",
|
||||
"date": "2025-07-08T01:26:29Z"
|
||||
},
|
||||
{
|
||||
"name": "forgejo/forgejo",
|
||||
"version": "v11.0.3",
|
||||
"date": "2025-07-10T13:12:00Z"
|
||||
},
|
||||
{
|
||||
"name": "crowdsecurity/crowdsec",
|
||||
"version": "v1.6.10",
|
||||
"date": "2025-07-10T12:04:30Z"
|
||||
},
|
||||
{
|
||||
"name": "meilisearch/meilisearch",
|
||||
"version": "prototype-incremental-vector-store-3",
|
||||
"date": "2025-07-07T10:27:19Z"
|
||||
},
|
||||
{
|
||||
"name": "pocket-id/pocket-id",
|
||||
"version": "v1.6.2",
|
||||
"date": "2025-07-09T22:14:10Z"
|
||||
},
|
||||
{
|
||||
"name": "NginxProxyManager/nginx-proxy-manager",
|
||||
"version": "v2.12.6",
|
||||
"date": "2025-07-09T21:52:15Z"
|
||||
},
|
||||
{
|
||||
"name": "apache/tika",
|
||||
"version": "3.2.1",
|
||||
"date": "2025-07-09T20:47:29Z"
|
||||
},
|
||||
{
|
||||
"name": "sabnzbd/sabnzbd",
|
||||
"version": "4.5.2",
|
||||
"date": "2025-07-09T19:08:28Z"
|
||||
},
|
||||
{
|
||||
"name": "raydak-labs/configarr",
|
||||
"version": "v1.13.6",
|
||||
"date": "2025-07-09T17:23:01Z"
|
||||
},
|
||||
{
|
||||
"name": "hargata/lubelog",
|
||||
"version": "v1.4.9",
|
||||
"date": "2025-07-09T16:27:46Z"
|
||||
},
|
||||
{
|
||||
"name": "nicolargo/glances",
|
||||
"version": "v4.3.3",
|
||||
"date": "2025-07-09T15:35:44Z"
|
||||
},
|
||||
{
|
||||
"name": "rclone/rclone",
|
||||
"version": "v1.70.3",
|
||||
"date": "2025-07-09T15:06:31Z"
|
||||
},
|
||||
{
|
||||
"name": "home-assistant/operating-system",
|
||||
"version": "16.0",
|
||||
"date": "2025-07-09T13:28:43Z"
|
||||
},
|
||||
{
|
||||
"name": "element-hq/synapse",
|
||||
"version": "v1.133.0",
|
||||
"date": "2025-07-01T15:13:42Z"
|
||||
},
|
||||
{
|
||||
"name": "AdguardTeam/AdGuardHome",
|
||||
"version": "v0.107.63",
|
||||
"date": "2025-06-26T14:34:19Z"
|
||||
},
|
||||
{
|
||||
"name": "cockpit-project/cockpit",
|
||||
"version": "342",
|
||||
"date": "2025-07-09T08:48:21Z"
|
||||
},
|
||||
{
|
||||
"name": "Prowlarr/Prowlarr",
|
||||
"version": "v1.37.0.5076",
|
||||
"date": "2025-06-04T11:04:53Z"
|
||||
},
|
||||
{
|
||||
"name": "Radarr/Radarr",
|
||||
"version": "v5.26.2.10099",
|
||||
"date": "2025-06-11T20:10:39Z"
|
||||
},
|
||||
{
|
||||
"name": "ipfs/kubo",
|
||||
@ -400,68 +335,153 @@
|
||||
"date": "2025-05-21T18:00:32Z"
|
||||
},
|
||||
{
|
||||
"name": "pterodactyl/panel",
|
||||
"version": "v1.11.11",
|
||||
"date": "2025-06-18T18:04:50Z"
|
||||
"name": "grokability/snipe-it",
|
||||
"version": "v8.1.18",
|
||||
"date": "2025-07-08T20:36:37Z"
|
||||
},
|
||||
{
|
||||
"name": "NodeBB/NodeBB",
|
||||
"version": "v3.12.7",
|
||||
"date": "2025-06-18T14:22:53Z"
|
||||
"name": "Stirling-Tools/Stirling-PDF",
|
||||
"version": "v1.0.2",
|
||||
"date": "2025-07-08T19:14:31Z"
|
||||
},
|
||||
{
|
||||
"name": "openhab/openhab-core",
|
||||
"version": "5.0.0.M3",
|
||||
"date": "2025-06-18T14:18:12Z"
|
||||
"name": "TwiN/gatus",
|
||||
"version": "v5.20.0",
|
||||
"date": "2025-07-08T16:27:11Z"
|
||||
},
|
||||
{
|
||||
"name": "Bubka/2FAuth",
|
||||
"version": "v5.6.0",
|
||||
"date": "2025-06-18T12:19:54Z"
|
||||
"name": "bunkerity/bunkerweb",
|
||||
"version": "v1.6.2",
|
||||
"date": "2025-07-08T13:52:33Z"
|
||||
},
|
||||
{
|
||||
"name": "zwave-js/zwave-js-ui",
|
||||
"version": "v10.7.0",
|
||||
"date": "2025-06-18T11:57:05Z"
|
||||
"name": "docker/compose",
|
||||
"version": "v2.38.2",
|
||||
"date": "2025-07-08T09:35:14Z"
|
||||
},
|
||||
{
|
||||
"name": "forgejo/forgejo",
|
||||
"version": "v11.0.2",
|
||||
"date": "2025-06-18T09:38:19Z"
|
||||
"name": "Checkmk/checkmk",
|
||||
"version": "v2.4.0p7",
|
||||
"date": "2025-07-08T05:51:08Z"
|
||||
},
|
||||
{
|
||||
"name": "silverbulletmd/silverbullet",
|
||||
"version": "2.0.0-pre3",
|
||||
"date": "2025-06-18T08:01:24Z"
|
||||
"name": "VictoriaMetrics/VictoriaMetrics",
|
||||
"version": "pmm-6401-v1.121.0",
|
||||
"date": "2025-07-07T16:16:13Z"
|
||||
},
|
||||
{
|
||||
"name": "cross-seed/cross-seed",
|
||||
"version": "v6.12.7",
|
||||
"date": "2025-06-18T03:44:24Z"
|
||||
"name": "photoprism/photoprism",
|
||||
"version": "250707-d28b3101e",
|
||||
"date": "2025-07-07T15:15:21Z"
|
||||
},
|
||||
{
|
||||
"name": "grafana/grafana",
|
||||
"version": "v11.5.6",
|
||||
"date": "2025-06-17T22:00:40Z"
|
||||
},
|
||||
{
|
||||
"name": "project-zot/zot",
|
||||
"version": "v2.1.5",
|
||||
"date": "2025-06-17T18:04:11Z"
|
||||
"name": "traccar/traccar",
|
||||
"version": "v6.8.1",
|
||||
"date": "2025-07-07T14:40:11Z"
|
||||
},
|
||||
{
|
||||
"name": "BookStackApp/BookStack",
|
||||
"version": "v25.05.1",
|
||||
"date": "2025-06-17T14:38:04Z"
|
||||
"version": "v25.05.2",
|
||||
"date": "2025-07-07T14:08:25Z"
|
||||
},
|
||||
{
|
||||
"name": "nzbgetcom/nzbget",
|
||||
"version": "v25.2",
|
||||
"date": "2025-07-04T08:21:42Z"
|
||||
},
|
||||
{
|
||||
"name": "slskd/slskd",
|
||||
"version": "0.23.1",
|
||||
"date": "2025-07-06T23:57:52Z"
|
||||
},
|
||||
{
|
||||
"name": "pelican-dev/panel",
|
||||
"version": "v1.0.0-beta22",
|
||||
"date": "2025-07-06T21:16:00Z"
|
||||
},
|
||||
{
|
||||
"name": "pelican-dev/wings",
|
||||
"version": "v1.0.0-beta14",
|
||||
"date": "2025-07-06T21:07:07Z"
|
||||
},
|
||||
{
|
||||
"name": "bluenviron/mediamtx",
|
||||
"version": "v1.13.0",
|
||||
"date": "2025-07-06T19:23:55Z"
|
||||
},
|
||||
{
|
||||
"name": "syncthing/syncthing",
|
||||
"version": "v1.30.0",
|
||||
"date": "2025-07-01T11:29:11Z"
|
||||
},
|
||||
{
|
||||
"name": "Part-DB/Part-DB-server",
|
||||
"version": "v1.17.2",
|
||||
"date": "2025-07-06T12:21:52Z"
|
||||
},
|
||||
{
|
||||
"name": "redis/redis",
|
||||
"version": "8.0.3",
|
||||
"date": "2025-07-06T12:19:24Z"
|
||||
},
|
||||
{
|
||||
"name": "hyperion-project/hyperion.ng",
|
||||
"version": "2.1.1",
|
||||
"date": "2025-06-14T17:45:06Z"
|
||||
},
|
||||
{
|
||||
"name": "Kareadita/Kavita",
|
||||
"version": "v0.8.7",
|
||||
"date": "2025-07-05T20:08:58Z"
|
||||
},
|
||||
{
|
||||
"name": "runtipi/runtipi",
|
||||
"version": "v4.3.0",
|
||||
"date": "2025-07-05T12:14:52Z"
|
||||
},
|
||||
{
|
||||
"name": "linkwarden/linkwarden",
|
||||
"version": "v2.11.3",
|
||||
"date": "2025-07-05T04:34:46Z"
|
||||
},
|
||||
{
|
||||
"name": "home-assistant/core",
|
||||
"version": "2025.7.1",
|
||||
"date": "2025-07-04T20:02:52Z"
|
||||
},
|
||||
{
|
||||
"name": "emqx/emqx",
|
||||
"version": "e6.0.0-M1.202507-alpha.1",
|
||||
"date": "2025-07-04T14:58:23Z"
|
||||
},
|
||||
{
|
||||
"name": "kimai/kimai",
|
||||
"version": "2.37.0",
|
||||
"date": "2025-07-04T14:49:43Z"
|
||||
},
|
||||
{
|
||||
"name": "Graylog2/graylog2-server",
|
||||
"version": "6.3.1",
|
||||
"date": "2025-07-04T11:20:48Z"
|
||||
},
|
||||
{
|
||||
"name": "cloudflare/cloudflared",
|
||||
"version": "2025.6.1",
|
||||
"date": "2025-06-17T12:45:39Z"
|
||||
"version": "2025.7.0",
|
||||
"date": "2025-07-03T17:08:15Z"
|
||||
},
|
||||
{
|
||||
"name": "crowdsecurity/crowdsec",
|
||||
"version": "v1.6.9",
|
||||
"date": "2025-06-17T11:54:50Z"
|
||||
"name": "rabbitmq/rabbitmq-server",
|
||||
"version": "v4.1.2",
|
||||
"date": "2025-07-03T16:59:29Z"
|
||||
},
|
||||
{
|
||||
"name": "influxdata/influxdb",
|
||||
"version": "v3.2.1",
|
||||
"date": "2025-07-03T16:09:19Z"
|
||||
},
|
||||
{
|
||||
"name": "Dolibarr/dolibarr",
|
||||
"version": "18.0.7",
|
||||
"date": "2025-07-03T08:57:21Z"
|
||||
}
|
||||
]
|
||||
|
35
frontend/public/json/vikunja.json
Normal file
35
frontend/public/json/vikunja.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Vikunja",
|
||||
"slug": "vikunja",
|
||||
"categories": [
|
||||
12
|
||||
],
|
||||
"date_created": "2024-11-05",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3456,
|
||||
"documentation": null,
|
||||
"website": "https://vikunja.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/vikunja.webp",
|
||||
"config_path": "/etc/vikunja/config.yml",
|
||||
"description": "Vikunja is a powerful self-hosted todo app. It allows you to create and manage to-do lists. You can plan tasks, set priorities and collaborate with others. The best part is that your data is safe with you and you can customize the app to your liking. It's like a personal assistant that helps you stay organized.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/vikunja.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 4,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
46
frontend/public/json/viseron.json
Normal file
46
frontend/public/json/viseron.json
Normal file
@ -0,0 +1,46 @@
|
||||
{
|
||||
"name": "Viseron",
|
||||
"slug": "viseron",
|
||||
"categories": [15],
|
||||
"date_created": "2025-01-15",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/config/viseron.yaml",
|
||||
"interface_port": 8888,
|
||||
"documentation": "https://github.com/roflcoopter/viseron",
|
||||
"website": "https://github.com/roflcoopter/viseron",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/viseron.svg",
|
||||
"description": "Viseron is an open-source NVR (Network Video Recorder) with object detection capabilities. It can detect objects in video streams and record events when motion is detected.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/viseron.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 10,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Configuration file: /config/viseron.yaml",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Logs: /config/logs/viseron.log",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Recordings: /config/recordings",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
35
frontend/public/json/wallabag.json
Normal file
35
frontend/public/json/wallabag.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Wallabag",
|
||||
"slug": "wallabag",
|
||||
"categories": [
|
||||
12
|
||||
],
|
||||
"date_created": "2025-07-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/opt/wallabag/.env",
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://wallabag.io/",
|
||||
"website": "https://wallabag.io/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/wallabag.svg",
|
||||
"description": "Wallabag is an open-source self-hosted application.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/wallabag.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 2,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://syncthing.net/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Setup Syncthing"
|
||||
$STD apk add --no-cache syncthing
|
||||
msg_ok "Setup Syncthing"
|
||||
|
||||
msg_info "Enabling Syncthing Service"
|
||||
$STD rc-update add syncthing default
|
||||
msg_ok "Enabled Syncthing Service"
|
||||
|
||||
msg_info "Starting Syncthing"
|
||||
$STD rc-service syncthing start
|
||||
msg_ok "Started Syncthing"
|
||||
|
||||
motd_ssh
|
||||
customize
|
69
install/alpine-teamspeak-server-install.sh
Normal file
69
install/alpine-teamspeak-server-install.sh
Normal file
@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: tremor021 (Slaviša Arežina)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://teamspeak.com/en/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing dependencies"
|
||||
$STD apk add --no-cache \
|
||||
ca-certificates \
|
||||
libstdc++ \
|
||||
libc6-compat
|
||||
msg_ok "Installed dependencies"
|
||||
|
||||
RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' | head -1)
|
||||
|
||||
msg_info "Installing Teamspeak Server v${RELEASE}"
|
||||
mkdir -p /opt/teamspeak-server
|
||||
cd /opt/teamspeak-server
|
||||
curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
|
||||
tar xf ts3server.tar.bz2 --strip-components=1
|
||||
mkdir -p logs data lib
|
||||
mv *.so lib
|
||||
touch data/ts3server.sqlitedb data/query_ip_blacklist.txt data/query_ip_whitelist.txt .ts3server_license_accepted
|
||||
echo "${RELEASE}" >~/.teamspeak-server
|
||||
msg_ok "Installed TeamSpeak Server v${RELEASE}"
|
||||
|
||||
msg_info "Enabling TeamSpeak Server Service"
|
||||
cat <<EOF >/etc/init.d/teamspeak
|
||||
#!/sbin/openrc-run
|
||||
|
||||
name="TeamSpeak Server"
|
||||
description="TeamSpeak 3 Server"
|
||||
command="/opt/teamspeak-server/ts3server_startscript.sh"
|
||||
command_args="start"
|
||||
output_log="/var/log/teamspeak.out.log"
|
||||
error_log="/var/log/teamspeak.err.log"
|
||||
command_background=true
|
||||
pidfile="/run/teamspeak-server.pid"
|
||||
directory="/opt/teamspeak-server"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
use dns
|
||||
}
|
||||
EOF
|
||||
chmod +x /etc/init.d/teamspeak
|
||||
$STD rc-update add teamspeak default
|
||||
msg_ok "Enabled TeamSpeak Server Service"
|
||||
|
||||
msg_info "Starting TeamSpeak Server"
|
||||
$STD service teamspeak start
|
||||
msg_ok "Started TeamSpeak Server"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -r ts3server.tar.bz* LICENSE* CHANGELOG doc serverquerydocs tsdns redist
|
||||
$STD apk cache clean
|
||||
msg_ok "Cleaned"
|
@ -1,209 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/karlomikus/bar-assistant
|
||||
# Source: https://github.com/karlomikus/vue-salt-rim
|
||||
# Source: https://www.meilisearch.com/
|
||||
|
||||
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 \
|
||||
composer \
|
||||
redis-server \
|
||||
npm \
|
||||
nginx \
|
||||
lsb-release \
|
||||
libvips \
|
||||
php-{ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm}
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Configuring PHP"
|
||||
PHPVER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION . "\n";')
|
||||
sed -i.bak -E 's/^\s*;?\s*ffi\.enable\s*=.*/ffi.enable=true/' /etc/php/${PHPVER}/fpm/php.ini
|
||||
$STD systemctl reload php${PHPVER}-fpm
|
||||
msg_info "configured PHP"
|
||||
|
||||
msg_info "Installing MeiliSearch"
|
||||
cd /opt
|
||||
RELEASE_MEILISEARCH=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
curl -fsSL https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb -o meilisearch.deb
|
||||
$STD dpkg -i meilisearch.deb
|
||||
curl -fsSL https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml -o /etc/meilisearch.toml
|
||||
MASTER_KEY=$(openssl rand -base64 12)
|
||||
sed -i \
|
||||
-e 's|^env =.*|env = "production"|' \
|
||||
-e "s|^# master_key =.*|master_key = \"$MASTER_KEY\"|" \
|
||||
-e 's|^db_path =.*|db_path = "/var/lib/meilisearch/data"|' \
|
||||
-e 's|^dump_dir =.*|dump_dir = "/var/lib/meilisearch/dumps"|' \
|
||||
-e 's|^snapshot_dir =.*|snapshot_dir = "/var/lib/meilisearch/snapshots"|' \
|
||||
-e 's|^# no_analytics = true|no_analytics = true|' \
|
||||
-e 's|^http_addr =.*|http_addr = "127.0.0.1:7700"|' \
|
||||
/etc/meilisearch.toml
|
||||
echo "${RELEASE_MEILISEARCH}" >/opt/meilisearch_version.txt
|
||||
msg_ok "Installed MeiliSearch"
|
||||
|
||||
msg_info "Creating MeiliSearch service"
|
||||
cat <<EOF >/etc/systemd/system/meilisearch.service
|
||||
[Unit]
|
||||
Description=Meilisearch
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/meilisearch --config-file-path /etc/meilisearch.toml
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now meilisearch
|
||||
msg_ok "Created Service MeiliSearch"
|
||||
|
||||
msg_info "Installing Bar Assistant"
|
||||
RELEASE_BARASSISTANT=$(curl -s https://api.github.com/repos/karlomikus/bar-assistant/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
cd /opt
|
||||
curl -fsSL "https://github.com/karlomikus/bar-assistant/archive/refs/tags/v${RELEASE_BARASSISTANT}.zip" -o barassistant.zip
|
||||
unzip -q barassistant.zip
|
||||
mv /opt/bar-assistant-${RELEASE_BARASSISTANT}/ /opt/bar-assistant
|
||||
cd /opt/bar-assistant
|
||||
cp /opt/bar-assistant/.env.dist /opt/bar-assistant/.env
|
||||
MeiliSearch_API_KEY=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"key":"[^"]*"' | head -n 1 | sed 's/"key":"//;s/"//')
|
||||
MeiliSearch_API_KEY_UID=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"uid":"[^"]*"' | head -n 1 | sed 's/"uid":"//;s/"//')
|
||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||
sed -i -e "s|^APP_URL=|APP_URL=http://${LOCAL_IP}/bar/|" \
|
||||
-e "s|^MEILISEARCH_HOST=|MEILISEARCH_HOST=http://127.0.0.1:7700|" \
|
||||
-e "s|^MEILISEARCH_KEY=|MEILISEARCH_KEY=${MASTER_KEY}|" \
|
||||
-e "s|^MEILISEARCH_API_KEY=|MEILISEARCH_API_KEY=${MeiliSearch_API_KEY}|" \
|
||||
-e "s|^MEILISEARCH_API_KEY_UID=|MEILISEARCH_API_KEY_UID=${MeiliSearch_API_KEY_UID}|" \
|
||||
/opt/bar-assistant/.env
|
||||
$STD composer install --no-interaction
|
||||
$STD php artisan key:generate
|
||||
touch storage/bar-assistant/database.ba3.sqlite
|
||||
$STD php artisan migrate --force
|
||||
$STD php artisan storage:link
|
||||
$STD php artisan bar:setup-meilisearch
|
||||
$STD php artisan scout:sync-index-settings
|
||||
$STD php artisan config:cache
|
||||
$STD php artisan route:cache
|
||||
$STD php artisan event:cache
|
||||
mkdir /opt/bar-assistant/storage/bar-assistant/uploads/temp
|
||||
chown -R www-data:www-data /opt/bar-assistant
|
||||
echo "${RELEASE_BARASSISTANT}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Installed Bar Assistant"
|
||||
|
||||
msg_info "Installing Salt Rim"
|
||||
RELEASE_SALTRIM=$(curl -s https://api.github.com/repos/karlomikus/vue-salt-rim/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
cd /opt
|
||||
curl -fsSL "https://github.com/karlomikus/vue-salt-rim/archive/refs/tags/v${RELEASE_SALTRIM}.zip" -o saltrim.zip
|
||||
unzip -q saltrim.zip
|
||||
mv /opt/vue-salt-rim-${RELEASE_SALTRIM}/ /opt/vue-salt-rim
|
||||
cd /opt/vue-salt-rim
|
||||
cat <<EOF >/opt/vue-salt-rim/public/config.js
|
||||
window.srConfig = {}
|
||||
window.srConfig.API_URL = "http://${LOCAL_IP}/bar"
|
||||
window.srConfig.MEILISEARCH_URL = "http://${LOCAL_IP}/search"
|
||||
EOF
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
echo "${RELEASE_SALTRIM}" >/opt/vue-salt-rim_version.txt
|
||||
msg_ok "Installed Salt Rim"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/nginx/sites-available/barassistant.conf
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
server_name _;
|
||||
|
||||
location = /favicon.ico { access_log off; log_not_found off; }
|
||||
location = /robots.txt { access_log off; log_not_found off; }
|
||||
|
||||
client_max_body_size 100M;
|
||||
|
||||
location /bar/ {
|
||||
proxy_pass http://127.0.0.1:8080/;
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
}
|
||||
|
||||
location /search/ {
|
||||
proxy_pass http://127.0.0.1:7700/;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8081/;
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 127.0.0.1:8080;
|
||||
server_name example.com;
|
||||
root /opt/bar-assistant/public;
|
||||
|
||||
add_header X-Frame-Options "SAMEORIGIN";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
|
||||
index index.php;
|
||||
charset utf-8;
|
||||
|
||||
location / {
|
||||
try_files \$uri \$uri/ /index.php?\$query_string;
|
||||
}
|
||||
|
||||
location = /favicon.ico { access_log off; log_not_found off; }
|
||||
location = /robots.txt { access_log off; log_not_found off; }
|
||||
|
||||
error_page 404 /index.php;
|
||||
|
||||
location ~ ^/index\.php(/|$) {
|
||||
fastcgi_pass unix:/var/run/php/php$PHPVER-fpm.sock;
|
||||
fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
fastcgi_hide_header X-Powered-By;
|
||||
}
|
||||
|
||||
location ~ /\.(?!well-known).* {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 127.0.0.1:8081;
|
||||
server_name _;
|
||||
root /opt/vue-salt-rim/dist;
|
||||
|
||||
location / {
|
||||
try_files \$uri \$uri/ /index.html;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
ln -s /etc/nginx/sites-available/barassistant.conf /etc/nginx/sites-enabled/
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
$STD systemctl reload nginx
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf /opt/meilisearch.deb
|
||||
rm -rf "/opt/barassistant.zip"
|
||||
rm -rf "/opt/saltrim.zip"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -17,21 +17,15 @@ msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y gpg
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
#setup_mariadb
|
||||
|
||||
#FFMPEG_VERSION="n7.1.1" FFMPEG_TYPE="full" setup_ffmpeg
|
||||
|
||||
#fetch_and_deploy_gh_release "argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus-.*linux-amd64"
|
||||
#fetch_and_deploy_gh_release "planka" "plankanban/planka" "prebuild" "latest" "/opt/planka" "planka-prebuild.zip"
|
||||
|
||||
#PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
#echo -e "fetching healthchecks"
|
||||
#fetch_and_deploy_gh_release "healthchecks" "healthchecks/healthchecks" "tarball" "latest" "/opt/healthchecks"
|
||||
# minimal call: fetch_and_deploy_gh_release "healthchecks" "healthchecks/healthchecks" "tarball"
|
||||
#echo -e "healthchecks done"
|
||||
|
||||
#echo -e "fetching defguard"
|
||||
#fetch_and_deploy_gh_release "defguard" "DefGuard/defguard" "binary" "latest" "/opt/defguard"
|
||||
# minimal call: fetch_and_deploy_gh_release "defguard" "DefGuard/defguard" "binary"
|
||||
#echo -e "defguard done"
|
||||
|
||||
#PHP_VERSION=8.2 PHP_FPM=YES setup_php
|
||||
#setup_composer
|
||||
|
||||
@ -39,20 +33,9 @@ msg_ok "Installed Dependencies"
|
||||
#NODE_MODULE="pnpm@10.1,yarn"
|
||||
#RELEASE=$(curl_handler -fsSL https://api.github.com/repos/babybuddy/babybuddy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
#msg_ok "Get Release $RELEASE"
|
||||
#NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||
#NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
|
||||
|
||||
#PG_VERSION="16" setup_postgresql
|
||||
#MARIADB_VERSION="11.8"
|
||||
#MYSQL_VERSION="8.0"
|
||||
|
||||
#install_mongodb
|
||||
#setup_postgresql
|
||||
#setup_mariadb
|
||||
#install_mysql
|
||||
|
||||
# msg_info "Setup DISTRO env"
|
||||
# DISTRO="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
||||
# msg_ok "Setup DISTRO"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
@ -20,27 +20,24 @@ msg_ok "Setup Functions"
|
||||
msg_info "Installing Dependencies (Patience)"
|
||||
$STD apt-get install -y \
|
||||
htop \
|
||||
gnupg2 \
|
||||
ca-certificates \
|
||||
default-jdk \
|
||||
apt-transport-https \
|
||||
ghostscript \
|
||||
tesseract-ocr \
|
||||
tesseract-ocr-deu \
|
||||
tesseract-ocr-eng \
|
||||
unpaper \
|
||||
unoconv \
|
||||
wkhtmltopdf \
|
||||
ocrmypdf
|
||||
tesseract-ocr
|
||||
#tesseract-ocr-deu \
|
||||
#tesseract-ocr-eng \
|
||||
#unpaper \
|
||||
#unoconv \
|
||||
#wkhtmltopdf \
|
||||
#ocrmypdf
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up PostgreSQL Repository"
|
||||
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
|
||||
echo "deb https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" >/etc/apt/sources.list.d/pgdg.list
|
||||
$STD apt-get update
|
||||
msg_ok "Set up PostgreSQL Repository"
|
||||
|
||||
msg_info "Install/Set up PostgreSQL Database"
|
||||
setup_gs
|
||||
JAVA_VERSION="21" setup_java
|
||||
POSTGRES_VERSION="16" setup_postgresql
|
||||
setup_yq
|
||||
|
||||
msg_info "Set up PostgreSQL Database"
|
||||
$STD apt-get install -y postgresql-16
|
||||
DB_NAME=docspell_db
|
||||
DB_USER=docspell_usr
|
||||
@ -58,23 +55,15 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';"
|
||||
} >>~/docspell.creds
|
||||
msg_ok "Set up PostgreSQL Database"
|
||||
|
||||
msg_info "Setup Docspell (Patience)"
|
||||
mkdir -p /opt/docspell
|
||||
Docspell=$(curl -fsSL https://github.com/eikek/docspell/releases/latest -o - | grep "title>Release" | cut -d " " -f 5)
|
||||
DocspellDSC=$(curl -fsSL https://github.com/docspell/dsc/releases/latest -o - | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//')
|
||||
cd /opt
|
||||
curl -fsSL https://github.com/eikek/docspell/releases/download/v${Docspell}/docspell-joex_${Docspell}_all.deb -o docspell-joex_${Docspell}_all.deb
|
||||
curl -fsSL https://github.com/eikek/docspell/releases/download/v${Docspell}/docspell-restserver_${Docspell}_all.deb -o docspell-restserver_${Docspell}_all.deb
|
||||
$STD dpkg -i docspell-*.deb
|
||||
curl -fsSL https://github.com/docspell/dsc/releases/download/v${DocspellDSC}/dsc_amd64-musl-${DocspellDSC} -o dsc_amd64-musl-${DocspellDSC}
|
||||
mv dsc_amd* dsc
|
||||
chmod +x dsc
|
||||
mv dsc /usr/bin
|
||||
|
||||
fetch_and_deploy_gh_release "docspell-joex" "eikek/docspell" "binary" "latest" "/opt/docspell-joex" "docspell-joex_*all.deb"
|
||||
fetch_and_deploy_gh_release "docspell-restserver" "eikek/docspell" "binary" "latest" "/opt/docspell-restserver" "docspell-restserver_*all.deb"
|
||||
fetch_and_deploy_gh_release "docspell-dsc" "docspell/dsc" "singlefile" "latest" "/usr/bin" "dsc"
|
||||
fetch_and_deploy_gh_release "apache-solr" "apache/solr" "tarball" "latest" "/opt/docspell"
|
||||
|
||||
|
||||
msg_info "Setup Docspell"
|
||||
ln -s /etc/docspell-joex /opt/docspell/docspell-joex && ln -s /etc/docspell-restserver /opt/docspell/docspell-restserver && ln -s /usr/bin/dsc /opt/docspell/dsc
|
||||
curl -fsSL https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -o /usr/bin/yq
|
||||
chmod +x /usr/bin/yq
|
||||
#JOEX_CONF="/usr/share/docspell-joex/conf/docspell-joex.conf"
|
||||
#SERVER_CONF="/usr/share/docspell-restserver/conf/docspell-server.conf"
|
||||
sed -i \
|
||||
-e '11s|localhost|'"$LOCAL_IP"'|' \
|
||||
-e '17s|localhost|'"$LOCAL_IP"'|' \
|
||||
@ -94,27 +83,6 @@ sed -i \
|
||||
-e '358s|password = .*|password = "'"$DB_PASS"'"|' \
|
||||
-e '401s|url = .*|url = "jdbc:postgresql://localhost:5432/'"$DB_NAME"'"|' \
|
||||
/usr/share/docspell-restserver/conf/docspell-server.conf
|
||||
|
||||
# sed -i 's|address = "localhost"|address = "0.0.0.0"|' "$JOEX_CONF" "$SERVER_CONF"
|
||||
# sed -i -E '/backend\s*\{/,/\}/ {
|
||||
# /jdbc\s*\{/,/\}/ {
|
||||
# s|(url\s*=\s*).*|\1"jdbc:postgresql://localhost:5432/'"$DB_NAME"'"|;
|
||||
# s|(user\s*=\s*).*|\1"'"$DB_USER"'"|;
|
||||
# s|(password\s*=\s*).*|\1"'"$DB_PASS"'"|;
|
||||
# }
|
||||
# }' "$SERVER_CONF"
|
||||
# sed -i -E '/postgresql\s*\{/,/\}/ {
|
||||
# /jdbc\s*\{/,/\}/ {
|
||||
# s|(url\s*=\s*).*|\1"jdbc:postgresql://localhost:5432/'"$DB_NAME"'"|;
|
||||
# s|(user\s*=\s*).*|\1"'"$DB_USER"'"|;
|
||||
# s|(password\s*=\s*).*|\1"'"$DB_PASS"'"|;
|
||||
# }
|
||||
# }' "$SERVER_CONF"
|
||||
# sed -i -E '/jdbc\s*\{/,/\}/ {
|
||||
# s|(url\s*=\s*).*|\1"jdbc:postgresql://localhost:5432/'"$DB_NAME"'"|;
|
||||
# s|(user\s*=\s*).*|\1"'"$DB_USER"'"|;
|
||||
# s|(password\s*=\s*).*|\1"'"$DB_PASS"'"|;
|
||||
# }' "$JOEX_CONF"
|
||||
msg_ok "Setup Docspell"
|
||||
|
||||
msg_info "Setup Apache Solr"
|
||||
|
@ -134,7 +134,7 @@ msg_info "Installing Coral Object Detection Model (Patience)"
|
||||
cd /opt/frigate
|
||||
export CCACHE_DIR=/root/.ccache
|
||||
export CCACHE_MAXSIZE=2G
|
||||
curl -fsSL https://github.com/libusb/libusb/archive/v1.0.26.zip
|
||||
curl -L -o v1.0.26.zip https://github.com/libusb/libusb/archive/v1.0.26.zip
|
||||
unzip -q v1.0.26.zip
|
||||
rm v1.0.26.zip
|
||||
cd libusb-1.0.26
|
||||
|
@ -3,7 +3,7 @@
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/arunavo4/gitea-mirror
|
||||
# Source: https://github.com/RayLabsHQ/gitea-mirror
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
@ -28,7 +28,7 @@ ln -sf /opt/bun/bin/bun /usr/local/bin/bun
|
||||
ln -sf /opt/bun/bin/bun /usr/local/bin/bunx
|
||||
msg_ok "Installed Bun"
|
||||
|
||||
fetch_and_deploy_gh_release "gitea-mirror" "arunavo4/gitea-mirror" "tarball" "v3.0.2"
|
||||
fetch_and_deploy_gh_release "gitea-mirror" "RayLabsHQ/gitea-mirror" "tarball" "v3.0.2"
|
||||
|
||||
msg_info "Installing gitea-mirror"
|
||||
cd /opt/gitea-mirror
|
||||
|
@ -1,9 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT
|
||||
# https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://hanko.io/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
|
@ -52,13 +52,15 @@ msg_ok "Set up Database"
|
||||
msg_info "Setup healthchecks"
|
||||
fetch_and_deploy_gh_release "healthchecks" "healthchecks/healthchecks" "source"
|
||||
cd /opt/healthchecks
|
||||
mkdir -p /opt/healthchecks/static-collected/
|
||||
$STD uv venv .venv
|
||||
$STD source .venv/bin/activate
|
||||
$STD uv pip install wheel
|
||||
$STD uv pip install gunicorn
|
||||
$STD uv pip install -r requirements.txt
|
||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||
cat <<EOF >/opt/healthchecks/.env
|
||||
ALLOWED_HOSTS=0.0.0.0
|
||||
ALLOWED_HOSTS=localhost,127.0.0.1,${LOCAL_IP},healthchecks
|
||||
DB=postgres
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
@ -68,6 +70,7 @@ DB_PASSWORD=${DB_PASS}
|
||||
DB_CONN_MAX_AGE=0
|
||||
DB_SSLMODE=prefer
|
||||
DB_TARGET_SESSION_ATTRS=read-write
|
||||
DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}?sslmode=prefer
|
||||
|
||||
DEFAULT_FROM_EMAIL=healthchecks@example.org
|
||||
EMAIL_HOST=localhost
|
||||
@ -79,32 +82,25 @@ EMAIL_USE_VERIFICATION=True
|
||||
|
||||
# Django & Healthchecks Konfiguration
|
||||
SECRET_KEY=${SECRET_KEY}
|
||||
DEBUG=False
|
||||
DEBUG=True
|
||||
|
||||
SITE_ROOT=http://${LOCAL_IP}:8000
|
||||
SITE_NAME=MyChecks
|
||||
STATIC_ROOT=/opt/healthchecks/static-collected
|
||||
|
||||
SITE_ROOT=http://0.0.0.0:8000
|
||||
SITE_NAME=Mychecks
|
||||
SITE_ROOT=http://0.0.0.0:8000
|
||||
EOF
|
||||
|
||||
$STD .venv/bin/python3 manage.py makemigrations
|
||||
$STD .venv/bin/python3 manage.py migrate
|
||||
$STD .venv/bin/python3 manage.py migrate --noinput
|
||||
$STD .venv/bin/python3 manage.py collectstatic --noinput
|
||||
|
||||
ADMIN_EMAIL="admin@helper-scripts.local"
|
||||
ADMIN_PASSWORD="$DB_PASS"
|
||||
cat <<EOF | $STD .venv/bin/python3 manage.py shell
|
||||
from django.contrib.auth import get_user_model
|
||||
User = get_user_model()
|
||||
|
||||
if not User.objects.filter(email="${ADMIN_EMAIL}").exists():
|
||||
u = User.objects.create_superuser(
|
||||
username="${ADMIN_EMAIL}",
|
||||
email="${ADMIN_EMAIL}",
|
||||
password="${ADMIN_PASSWORD}"
|
||||
)
|
||||
u.is_active = True
|
||||
u.is_staff = True
|
||||
u.is_superuser = True
|
||||
u.save()
|
||||
User.objects.create_superuser("${ADMIN_EMAIL}", "${ADMIN_EMAIL}", "${ADMIN_PASSWORD}")
|
||||
EOF
|
||||
msg_ok "Installed healthchecks"
|
||||
|
||||
@ -117,7 +113,8 @@ After=network.target postgresql.service
|
||||
[Service]
|
||||
WorkingDirectory=/opt/healthchecks/
|
||||
EnvironmentFile=/opt/healthchecks/.env
|
||||
ExecStart=/opt/healthchecks/.venv/bin/gunicorn hc.wsgi:application --bind 0.0.0.0
|
||||
ExecStart=/opt/healthchecks/.venv/bin/gunicorn hc.wsgi:application --bind 127.0.0.1:8000
|
||||
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
|
@ -1,77 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Florianb63
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://itsm-ng.com/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
setup_mariadb
|
||||
|
||||
msg_info "Installing Repository"
|
||||
curl -fsSL http://deb.itsm-ng.org/pubkey.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/itsm-ng-keyring.gpg
|
||||
echo "deb http://deb.itsm-ng.org/$(. /etc/os-release && echo "$ID")/ $(. /etc/os-release && echo "$VERSION_CODENAME") main" > /etc/apt/sources.list.d/itsm-ng.list
|
||||
$STD apt update
|
||||
msg_ok "Installed Repository"
|
||||
|
||||
msg_info "Installing ITSM-NG"
|
||||
$STD apt install -y itsm-ng
|
||||
msg_ok "Installed ITSM-NG"
|
||||
|
||||
msg_info "Setting up database"
|
||||
DB_NAME=itsmng_db
|
||||
DB_USER=itsmng
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
mariadb-tzinfo-to-sql /usr/share/zoneinfo | mysql mysql
|
||||
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 PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';"
|
||||
mariadb -u root -e "GRANT SELECT ON \`mysql\`.\`time_zone_name\` TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
||||
{
|
||||
echo "ITSM-NG Database Credentials"
|
||||
echo "Database: $DB_NAME"
|
||||
echo "Username: $DB_USER"
|
||||
echo "Password: $DB_PASS"
|
||||
} >>~/itsmng_db.creds
|
||||
msg_ok "Set up database"
|
||||
|
||||
msg_info "Installing ITSM-NG"
|
||||
cd /usr/share/itsm-ng
|
||||
$STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction
|
||||
msg_ok "Installed ITSM-NG"
|
||||
|
||||
msg_info "Configuring webserver"
|
||||
$STD a2dissite 000-default.conf
|
||||
msg_ok "Setup Service"
|
||||
|
||||
msg_info "Setup Cronjob"
|
||||
echo "* * * * * php /usr/share/itsm-ng/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 /usr/share/itsm-ng/install
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -1,64 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://jellyfin.org/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Setting Up Hardware Acceleration"
|
||||
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
|
||||
if [[ "$CTTYPE" == "0" ]]; then
|
||||
chgrp video /dev/dri
|
||||
chmod 755 /dev/dri
|
||||
chmod 660 /dev/dri/*
|
||||
$STD adduser $(id -u -n) video
|
||||
$STD adduser $(id -u -n) render
|
||||
fi
|
||||
msg_ok "Set Up Hardware Acceleration"
|
||||
|
||||
msg_info "Installing Jellyfin"
|
||||
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
||||
# If the keyring directory is absent, create it
|
||||
if [[ ! -d /etc/apt/keyrings ]]; then
|
||||
mkdir -p /etc/apt/keyrings
|
||||
fi
|
||||
# Download the repository signing key and install it to the keyring directory
|
||||
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | gpg --dearmor --yes --output /etc/apt/keyrings/jellyfin.gpg
|
||||
# Install the Deb822 format jellyfin.sources entry
|
||||
cat <<EOF >/etc/apt/sources.list.d/jellyfin.sources
|
||||
Types: deb
|
||||
URIs: https://repo.jellyfin.org/${PCT_OSTYPE}
|
||||
Suites: ${VERSION}
|
||||
Components: main
|
||||
Architectures: amd64
|
||||
Signed-By: /etc/apt/keyrings/jellyfin.gpg
|
||||
EOF
|
||||
# Install Jellyfin using the metapackage (which will fetch jellyfin-server, jellyfin-web, and jellyfin-ffmpeg5)
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y jellyfin
|
||||
sed -i 's/"MinimumLevel": "Information"/"MinimumLevel": "Error"/g' /etc/jellyfin/logging.json
|
||||
chown -R jellyfin:adm /etc/jellyfin
|
||||
sleep 10
|
||||
systemctl restart jellyfin
|
||||
if [[ "$CTTYPE" == "0" ]]; then
|
||||
sed -i -e 's/^ssl-cert:x:104:$/render:x:104:root,jellyfin/' -e 's/^render:x:108:root,jellyfin$/ssl-cert:x:108:/' /etc/group
|
||||
else
|
||||
sed -i -e 's/^ssl-cert:x:104:$/render:x:104:jellyfin/' -e 's/^render:x:108:jellyfin$/ssl-cert:x:108:/' /etc/group
|
||||
fi
|
||||
msg_ok "Installed Jellyfin"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -1,54 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Casvt/Kapowarr
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Setup Python3"
|
||||
$STD apt-get install -y python3-pip
|
||||
msg_ok "Setup Python3"
|
||||
|
||||
setup_uv
|
||||
fetch_and_deploy_gh_release "kapowarr" "Casvt/Kapowarr"
|
||||
|
||||
msg_info "Setup Kapowarr"
|
||||
cd /opt/kapowarr
|
||||
$STD uv venv .venv
|
||||
$STD source .venv/bin/activate
|
||||
$STD uv pip install --upgrade pip
|
||||
$STD uv pip install --no-cache-dir -r requirements.txt
|
||||
msg_ok "Installed Kapowarr"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/kapowarr.service
|
||||
[Unit]
|
||||
Description=Kapowarr Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/kapowarr/
|
||||
ExecStart=/opt/kapowarr/.venv/bin/python3 Kapowarr.py
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now kapowarr
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
85
install/leantime-install.sh
Normal file
85
install/leantime-install.sh
Normal file
@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Stroopwafe1
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://leantime.io
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
PHP_VERSION=8.4 PHP_MODULE="mysql" PHP_APACHE="YES" PHP_FPM="YES" setup_php
|
||||
setup_mariadb
|
||||
|
||||
msg_info "Setting up Database"
|
||||
DB_NAME=leantime
|
||||
DB_USER=leantime
|
||||
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"
|
||||
} >>~/"$APPLICATION".creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
fetch_and_deploy_gh_release "leantime" "Leantime/leantime" "prebuild" "latest" "/opt/leantime" Leantime*.tar.gz
|
||||
|
||||
msg_info "Setup ${APPLICATION}"
|
||||
APACHE_LOG_DIR=/var/log/apache2
|
||||
chown -R www-data:www-data "/opt/leantime"
|
||||
chmod -R 750 "/opt/leantime"
|
||||
|
||||
cat <<EOF >/etc/apache2/sites-enabled/000-default.conf
|
||||
<VirtualHost *:80>
|
||||
ServerAdmin webmaster@localhost
|
||||
DocumentRoot /opt/leantime/public
|
||||
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml
|
||||
Options +ExecCGI
|
||||
|
||||
<Directory /opt/leantime/>
|
||||
Options FollowSymLinks
|
||||
Require all granted
|
||||
AllowOverride All
|
||||
</Directory>
|
||||
|
||||
<Location />
|
||||
Require all granted
|
||||
</Location>
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||
</VirtualHost>
|
||||
EOF
|
||||
|
||||
mv "/opt/leantime/config/sample.env" "/opt/leantime/config/.env"
|
||||
sed -i -e "s|^LEAN_DB_DATABASE.*|LEAN_DB_DATABASE = '$DB_NAME'|" \
|
||||
-e "s|^LEAN_DB_USER.*|LEAN_DB_USER = '$DB_USER'|" \
|
||||
-e "s|^LEAN_DB_PASSWORD.*|LEAN_DB_PASSWORD = '$DB_PASS'|" \
|
||||
-e "s|^LEAN_SESSION_PASSWORD.*|LEAN_SESSION_PASSWORD = '$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)'|" \
|
||||
"/opt/leantime/config/.env"
|
||||
|
||||
a2enmod -q proxy_fcgi setenvif rewrite
|
||||
a2enconf -q "php${PHP_VERSION}-fpm"
|
||||
|
||||
sed -i -e "s/^;extension.\(curl\|fileinfo\|gd\|intl\|ldap\|mbstring\|exif\|mysqli\|odbc\|openssl\|pdo_mysql\)/extension=\1/g" "/etc/php/${PHP_VERSION}/apache2/php.ini"
|
||||
|
||||
systemctl restart apache2
|
||||
|
||||
msg_ok "Setup ${APPLICATION}"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Omar Minaya
|
||||
# Author: Omar Minaya | MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://linkstack.org/
|
||||
|
||||
@ -13,35 +13,21 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing dependencies"
|
||||
$STD apt-get install -y \
|
||||
software-properties-common \
|
||||
ca-certificates \
|
||||
lsb-release \
|
||||
apt-transport-https \
|
||||
apache2
|
||||
unzip
|
||||
msg_ok "Installed dependencies"
|
||||
PHP_VERSION="8.3" PHP_MODULE="sqlite3,mysql,ronny" PHP_APACHE="YES" setup_php
|
||||
fetch_and_deploy_gh_release "linkstack" "linkstackorg/linkstack" "prebuild" "latest" "/var/www/html/linkstack" "linkstack.zip"
|
||||
|
||||
PHP_VERSION="8.2" PHP_MODULE="sqlite3, mysql, fileinfo" PHP_APACHE="YES" install_php
|
||||
|
||||
msg_info "Installing LinkStack"
|
||||
msg_info "Configuring LinkStack"
|
||||
$STD a2enmod rewrite
|
||||
|
||||
ZIP_URL="https://github.com/linkstackorg/linkstack/releases/latest/download/linkstack.zip"
|
||||
ZIP_FILE="/tmp/linkstack.zip"
|
||||
curl -fsSL -o "$ZIP_FILE" "$ZIP_URL"
|
||||
unzip -q "$ZIP_FILE" -d /var/www/html/linkstack
|
||||
chown -R www-data:www-data /var/www/html/linkstack
|
||||
chmod -R 755 /var/www/html/linkstack
|
||||
|
||||
cat <<EOF > /etc/apache2/sites-available/linkstack.conf
|
||||
cat <<EOF >/etc/apache2/sites-available/linkstack.conf
|
||||
<VirtualHost *:80>
|
||||
ServerAdmin webmaster@localhost
|
||||
DocumentRoot /var/www/html/linkstack/linkstack
|
||||
DocumentRoot /var/www/html/linkstack
|
||||
ErrorLog /var/log/apache2/linkstack-error.log
|
||||
CustomLog /var/log/apache2/linkstack-access.log combined
|
||||
<Directory /var/www/html/linkstack/linkstack>
|
||||
<Directory /var/www/html/linkstack/>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
@ -51,13 +37,12 @@ EOF
|
||||
$STD a2dissite 000-default.conf
|
||||
$STD a2ensite linkstack.conf
|
||||
$STD systemctl restart apache2
|
||||
msg_ok "Installed LinkStack"
|
||||
msg_ok "Configured LinkStack"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD rm -f "$ZIP_FILE"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
|
@ -15,7 +15,6 @@ update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
gpg \
|
||||
openssl \
|
||||
redis \
|
||||
libgbm1 \
|
||||
@ -42,10 +41,8 @@ $STD apt-get install -y \
|
||||
nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
#configure_lxc "Semantic Search requires a dedicated GPU and at least 16GB RAM. Would you like to install it?" 100 "memory" "16000"
|
||||
|
||||
PG_VERSION=17 setup_postgresql
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
NODE_VERSION="18" setup_nodejs
|
||||
|
||||
msg_info "Setup Variables"
|
||||
DB_NAME=maxun_db
|
||||
@ -56,6 +53,7 @@ MINIO_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||
JWT_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)
|
||||
ENCRYPTION_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)
|
||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||
SESSION_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)
|
||||
msg_ok "Set up Variables"
|
||||
|
||||
msg_info "Setup Database"
|
||||
@ -71,6 +69,7 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
|
||||
echo "Maxun Database Name: $DB_NAME"
|
||||
echo "Maxun JWT Secret: $JWT_SECRET"
|
||||
echo "Maxun Encryption Key: $ENCRYPTION_KEY"
|
||||
echo "Maxun Session Secret: $SESSION_SECRET"
|
||||
} >>~/maxun.creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
@ -110,8 +109,9 @@ EOF
|
||||
systemctl enable -q --now minio
|
||||
msg_ok "Setup MinIO"
|
||||
|
||||
msg_info "Installing Maxun (Patience)"
|
||||
fetch_and_deploy_gh_release "maxun" "getmaxun/maxun" "source"
|
||||
|
||||
msg_info "Installing Maxun (Patience)"
|
||||
cat <<EOF >/opt/maxun/.env
|
||||
NODE_ENV=development
|
||||
JWT_SECRET=${JWT_SECRET}
|
||||
@ -137,6 +137,7 @@ VITE_BACKEND_URL=http://${LOCAL_IP}:8080
|
||||
VITE_PUBLIC_URL=http://${LOCAL_IP}:5173
|
||||
|
||||
MAXUN_TELEMETRY=false
|
||||
SESSION_SECRET=${SESSION_SECRET}
|
||||
EOF
|
||||
|
||||
cat <<'EOF' >/usr/local/bin/update-env-ip.sh
|
||||
@ -162,19 +163,27 @@ msg_info "Setting up nginx with CORS Proxy"
|
||||
cat <<'EOF' >/etc/nginx/sites-available/maxun
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
location / {
|
||||
# Frontend ausliefern
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location ~ ^/(api|record|workflow|storage|auth|integration|proxy|api-docs) {
|
||||
proxy_pass http://localhost:8080;
|
||||
proxy_set_header Host $host;
|
||||
# Backend Proxy
|
||||
location ~ ^/(auth|storage|record|workflow|robot|proxy|api-docs|api|webhook)(/|$) {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# CORS
|
||||
add_header Access-Control-Allow-Origin "$http_origin" always;
|
||||
add_header Access-Control-Allow-Credentials true always;
|
||||
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always;
|
||||
@ -193,7 +202,6 @@ server {
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
ln -sf /etc/nginx/sites-available/maxun /etc/nginx/sites-enabled/maxun
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
msg_ok "nginx with CORS Proxy set up"
|
||||
|
@ -1,151 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://mealie.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 build-essential libpq-dev libwebp-dev libsasl2-dev libldap2-dev libssl-dev git
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
#fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" "latest" "/opt/mealie" - deactivated for now
|
||||
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
POSTGRES_VERSION="16" setup_postgresql
|
||||
NODE_MODULE="yarn" NODE_VERSION="20" setup_nodejs
|
||||
|
||||
msg_info "Setup Variables"
|
||||
DB_NAME=mealie_db
|
||||
DB_USER=mealie__user
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||
msg_ok "Set up Variables"
|
||||
|
||||
msg_info "Setup Database"
|
||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
|
||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
|
||||
$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;"
|
||||
{
|
||||
echo "Mealie-Credentials"
|
||||
echo "Mealie Database User: $DB_USER"
|
||||
echo "Mealie Database Password: $DB_PASS"
|
||||
echo "Mealie Database Name: $DB_NAME"
|
||||
} >>~/mealie.creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
msg_info "Get Mealie Repository"
|
||||
cd /opt
|
||||
$STD git clone https://github.com/mealie-recipes/mealie
|
||||
msg_ok "Get Mealie Repository"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
export NUXT_TELEMETRY_DISABLED=1
|
||||
cd /opt/mealie/frontend
|
||||
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
||||
$STD yarn generate
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Copying Built Frontend into Backend Package"
|
||||
cp -r /opt/mealie/frontend/dist /opt/mealie/mealie/frontend
|
||||
msg_ok "Copied Frontend"
|
||||
|
||||
msg_info "Preparing Backend (Poetry)"
|
||||
$STD uv venv /opt/mealie/.venv
|
||||
$STD /opt/mealie/.venv/bin/python -m ensurepip --upgrade
|
||||
$STD /opt/mealie/.venv/bin/python -m pip install --upgrade pip
|
||||
$STD /opt/mealie/.venv/bin/pip install uv
|
||||
cd /opt/mealie
|
||||
$STD /opt/mealie/.venv/bin/uv pip install poetry==2.0.1
|
||||
$STD /opt/mealie/.venv/bin/poetry self add "poetry-plugin-export>=1.9"
|
||||
msg_ok "Prepared Poetry"
|
||||
|
||||
msg_info "Writing Environment File"
|
||||
cat <<EOF >/opt/mealie/mealie.env
|
||||
HOST=0.0.0.0
|
||||
PORT=9000
|
||||
DB_ENGINE=postgres
|
||||
POSTGRES_SERVER=localhost
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USER=${DB_USER}
|
||||
POSTGRES_PASSWORD=${DB_PASS}
|
||||
POSTGRES_DB=${DB_NAME}
|
||||
NLTK_DATA=/nltk_data
|
||||
PRODUCTION=true
|
||||
STATIC_FILES=/opt/mealie/frontend/dist
|
||||
EOF
|
||||
msg_ok "Wrote Environment File"
|
||||
|
||||
msg_info "Creating Start Script"
|
||||
cat <<'EOF' >/opt/mealie/start.sh
|
||||
#!/bin/bash
|
||||
set -a
|
||||
source /opt/mealie/mealie.env
|
||||
set +a
|
||||
exec /opt/mealie/.venv/bin/mealie
|
||||
EOF
|
||||
chmod +x /opt/mealie/start.sh
|
||||
msg_ok "Created Start Script"
|
||||
|
||||
msg_info "Building Mealie Backend Wheel"
|
||||
cd /opt/mealie
|
||||
$STD /opt/mealie/.venv/bin/poetry build --output dist
|
||||
|
||||
MEALIE_VERSION=$(/opt/mealie/.venv/bin/poetry version --short)
|
||||
$STD /opt/mealie/.venv/bin/poetry export --only=main --extras=pgsql --output=dist/requirements.txt
|
||||
echo "mealie[pgsql]==$MEALIE_VERSION \\" >>dist/requirements.txt
|
||||
/opt/mealie/.venv/bin/poetry run pip hash dist/mealie-$MEALIE_VERSION*.whl | tail -n1 | tr -d '\n' >>dist/requirements.txt
|
||||
echo " \\" >>dist/requirements.txt
|
||||
/opt/mealie/.venv/bin/poetry run pip hash dist/mealie-$MEALIE_VERSION*.tar.gz | tail -n1 >>dist/requirements.txt
|
||||
msg_ok "Built Wheel + Requirements"
|
||||
|
||||
msg_info "Installing Mealie via uv"
|
||||
cd /opt/mealie
|
||||
/opt/mealie/.venv/bin/uv pip install --require-hashes -r dist/requirements.txt --find-links dist
|
||||
msg_ok "Installed Mealie"
|
||||
|
||||
msg_info "Downloading NLTK Data"
|
||||
mkdir -p /nltk_data/
|
||||
$STD /opt/mealie/.venv/bin/python -m nltk.downloader -d /nltk_data averaged_perceptron_tagger_eng
|
||||
msg_ok "Downloaded NLTK Data"
|
||||
|
||||
msg_info "Set Symbolic Links for Mealie"
|
||||
ln -sf /opt/mealie/.venv/bin/mealie /usr/local/bin/mealie
|
||||
ln -sf /opt/mealie/.venv/bin/poetry /usr/local/bin/poetry
|
||||
msg_ok "Set Symbolic Links"
|
||||
|
||||
msg_info "Creating Systemd Service"
|
||||
cat <<EOF >/etc/systemd/system/mealie.service
|
||||
[Unit]
|
||||
Description=Mealie Backend Server
|
||||
After=network.target postgresql.service
|
||||
|
||||
[Service]
|
||||
User=root
|
||||
WorkingDirectory=/opt/mealie
|
||||
ExecStart=/opt/mealie/start.sh
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now mealie
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
171
install/nginxproxymanager-install.sh
Normal file
171
install/nginxproxymanager-install.sh
Normal file
@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://nginxproxymanager.com/
|
||||
|
||||
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 update
|
||||
$STD apt-get -y install \
|
||||
ca-certificates \
|
||||
apache2-utils \
|
||||
logrotate \
|
||||
build-essential \
|
||||
jq \
|
||||
git
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="16" NODE_MODULE="yarn" setup_nodejs
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
fetch_and_deploy_gh_release "nginxproxymanager" "NginxProxyManager/nginx-proxy-manager" "tarball" "latest" "/tmp/nginxproxymanager"
|
||||
|
||||
msg_info "Installing Python Dependencies"
|
||||
$STD apt-get install -y \
|
||||
python3 \
|
||||
python3-dev \
|
||||
python3-venv
|
||||
msg_ok "Installed Python Dependencies"
|
||||
|
||||
msg_info "Setting up Certbot Environment"
|
||||
$STD uv venv /opt/certbot
|
||||
$STD uv pip install --python \
|
||||
certbot \
|
||||
certbot-dns-cloudflare \
|
||||
certbot-dns-multi
|
||||
msg_ok "Certbot Environment Ready"
|
||||
|
||||
msg_info "Installing Openresty"
|
||||
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
||||
curl -fsSL "https://openresty.org/package/pubkey.gpg" | gpg --dearmor -o /etc/apt/trusted.gpg.d/openresty-archive-keyring.gpg
|
||||
echo -e "deb http://openresty.org/package/debian $VERSION openresty" >/etc/apt/sources.list.d/openresty.list
|
||||
$STD apt-get update
|
||||
$STD apt-get -y install openresty
|
||||
msg_ok "Installed Openresty"
|
||||
|
||||
msg_info "Setting up Environment"
|
||||
ln -sf /usr/bin/python3 /usr/bin/python
|
||||
ln -sf /opt/certbot/bin/certbot /usr/bin/certbot
|
||||
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
|
||||
ln -sf /usr/local/openresty/nginx/ /etc/nginx
|
||||
sed -i 's+^daemon+#daemon+g' /tmp/nginxproxymanager/docker/rootfs/etc/nginx/nginx.conf
|
||||
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
||||
for NGINX_CONF in $NGINX_CONFS; do
|
||||
sed -i 's+include conf.d+include /etc/nginx/conf.d+g' "$NGINX_CONF"
|
||||
done
|
||||
|
||||
mkdir -p /var/www/html /etc/nginx/logs
|
||||
cd /tmp/nginxproxymanager
|
||||
cp -r docker/rootfs/var/www/html/* /var/www/html/
|
||||
cp -r docker/rootfs/etc/nginx/* /etc/nginx/
|
||||
cp docker/rootfs/etc/letsencrypt.ini /etc/letsencrypt.ini
|
||||
cp docker/rootfs/etc/logrotate.d/nginx-proxy-manager /etc/logrotate.d/nginx-proxy-manager
|
||||
ln -sf /etc/nginx/nginx.conf /etc/nginx/conf/nginx.conf
|
||||
rm -f /etc/nginx/conf.d/dev.conf
|
||||
|
||||
mkdir -p /tmp/nginx/body \
|
||||
/run/nginx \
|
||||
/data/nginx \
|
||||
/data/custom_ssl \
|
||||
/data/logs \
|
||||
/data/access \
|
||||
/data/nginx/default_host \
|
||||
/data/nginx/default_www \
|
||||
/data/nginx/proxy_host \
|
||||
/data/nginx/redirection_host \
|
||||
/data/nginx/stream \
|
||||
/data/nginx/dead_host \
|
||||
/data/nginx/temp \
|
||||
/var/lib/nginx/cache/public \
|
||||
/var/lib/nginx/cache/private \
|
||||
/var/cache/nginx/proxy_temp
|
||||
|
||||
chmod -R 777 /var/cache/nginx
|
||||
chown root /tmp/nginx
|
||||
|
||||
echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf);" >/etc/nginx/conf.d/include/resolvers.conf
|
||||
|
||||
if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ]; then
|
||||
openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost" -keyout /data/nginx/dummykey.pem -out /data/nginx/dummycert.pem &>/dev/null
|
||||
fi
|
||||
|
||||
mkdir -p /app/global /app/frontend/images
|
||||
cd /tmp/nginxproxymanager
|
||||
cp -r backend/* /app
|
||||
cp -r global/* /app/global
|
||||
msg_ok "Set up Environment"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /tmp/nginxproxymanager/frontend
|
||||
$STD yarn install --frozen-lockfile
|
||||
$STD yarn build
|
||||
cp -r dist/* /app/frontend
|
||||
cp -r app-images/* /app/frontend/images
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Initializing Backend"
|
||||
rm -rf /app/config/default.json
|
||||
if [ ! -f /app/config/production.json ]; then
|
||||
cat <<'EOF' >/app/config/production.json
|
||||
{
|
||||
"database": {
|
||||
"engine": "knex-native",
|
||||
"knex": {
|
||||
"client": "sqlite3",
|
||||
"connection": {
|
||||
"filename": "/data/database.sqlite"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
cd /app
|
||||
$STD yarn install --production
|
||||
msg_ok "Initialized Backend"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<'EOF' >/lib/systemd/system/npm.service
|
||||
[Unit]
|
||||
Description=Nginx Proxy Manager
|
||||
After=network.target
|
||||
Wants=openresty.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Environment=NODE_ENV=production
|
||||
Environment=NODE_OPTIONS=--openssl-legacy-provider
|
||||
ExecStartPre=-mkdir -p /tmp/nginx/body /data/letsencrypt-acme-challenge
|
||||
ExecStart=/usr/bin/node index.js --abort_on_uncaught_exception --max_old_space_size=1024
|
||||
WorkingDirectory=/app
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Starting Services"
|
||||
sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf
|
||||
sed -r -i 's/^([[:space:]]*)su npm npm/\1#su npm npm/g;' /etc/logrotate.d/nginx-proxy-manager
|
||||
systemctl enable -q --now openresty
|
||||
systemctl enable -q --now npm
|
||||
msg_ok "Started Services"
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf /tmp/*
|
||||
systemctl restart openresty
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -1,114 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/ZoeyVid/NPMplus
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apk add \
|
||||
tzdata \
|
||||
gawk \
|
||||
yq
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Installing Docker & Compose"
|
||||
$STD apk add docker
|
||||
$STD rc-service docker start
|
||||
$STD rc-update add docker default
|
||||
|
||||
get_latest_release() {
|
||||
curl -fsSL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4
|
||||
}
|
||||
DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose")
|
||||
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
|
||||
mkdir -p $DOCKER_CONFIG/cli-plugins
|
||||
curl -fsSL https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_LATEST_VERSION/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
|
||||
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
|
||||
msg_ok "Installed Docker & Compose"
|
||||
|
||||
msg_info "Fetching NPMplus"
|
||||
cd /opt
|
||||
curl -fsSL "https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/compose.yaml" -o compose.yaml
|
||||
msg_ok "Fetched NPMplus"
|
||||
|
||||
attempts=0
|
||||
while true; do
|
||||
read -r -p "${TAB3}Enter your TZ Identifier (e.g., Europe/Berlin): " TZ_INPUT
|
||||
if validate_tz "$TZ_INPUT"; then
|
||||
break
|
||||
fi
|
||||
msg_error "Invalid timezone! Please enter a valid TZ identifier."
|
||||
|
||||
attempts=$((attempts + 1))
|
||||
if [[ "$attempts" -ge 3 ]]; then
|
||||
msg_error "Maximum attempts reached. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
read -r -p "${TAB3}Enter your ACME Email: " ACME_EMAIL_INPUT
|
||||
|
||||
yq -i "
|
||||
.services.npmplus.environment |=
|
||||
(map(select(. != \"TZ=*\" and . != \"ACME_EMAIL=*\")) +
|
||||
[\"TZ=$TZ_INPUT\", \"ACME_EMAIL=$ACME_EMAIL_INPUT\"])
|
||||
" /opt/compose.yaml
|
||||
|
||||
msg_info "Building and Starting NPMplus (Patience)"
|
||||
$STD docker compose up -d
|
||||
CONTAINER_ID=""
|
||||
for i in {1..60}; do
|
||||
CONTAINER_ID=$(docker ps --filter "name=npmplus" --format "{{.ID}}")
|
||||
if [[ -n "$CONTAINER_ID" ]]; then
|
||||
STATUS=$(docker inspect --format '{{.State.Health.Status}}' "$CONTAINER_ID" 2>/dev/null || echo "starting")
|
||||
if [[ "$STATUS" == "healthy" ]]; then
|
||||
msg_ok "NPMplus is running and healthy"
|
||||
break
|
||||
elif [[ "$STATUS" == "unhealthy" ]]; then
|
||||
msg_error "NPMplus container is unhealthy! Check logs."
|
||||
docker logs "$CONTAINER_ID"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
sleep 2
|
||||
[[ $i -eq 60 ]] && msg_error "NPMplus container did not become healthy within 120s." && docker logs "$CONTAINER_ID" && exit 1
|
||||
done
|
||||
msg_ok "Builded and started NPMplus"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Retrieving Default Login (Patience)"
|
||||
LOGFILE="/tmp/npmplus.log"
|
||||
docker logs "$CONTAINER_ID" &>"$LOGFILE" &
|
||||
|
||||
PASSWORD_FOUND=0
|
||||
for i in {1..60}; do
|
||||
if grep -q "Creating a new user:" "$LOGFILE"; then
|
||||
PASSWORD_LINE=$(grep "Creating a new user:" "$LOGFILE" | head -n1)
|
||||
PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}')
|
||||
if [[ -n "$PASSWORD" ]]; then
|
||||
echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd
|
||||
msg_ok "Saved default login to /opt/.npm_pwd"
|
||||
PASSWORD_FOUND=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
if [[ $PASSWORD_FOUND -eq 0 ]]; then
|
||||
msg_error "Could not retrieve default login after 60 seconds."
|
||||
echo -e "\nYou can manually try:\n docker logs $CONTAINER_ID | grep 'Creating a new user:'\n"
|
||||
fi
|
||||
|
||||
rm -f "$LOGFILE"
|
56
install/ots-install.sh
Normal file
56
install/ots-install.sh
Normal file
@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://github.com/Luzifer/ots
|
||||
|
||||
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 \
|
||||
redis-server
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Installing OTS"
|
||||
fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
|
||||
cat <<EOF >/opt/ots/env
|
||||
LISTEN=0.0.0.0:3000
|
||||
REDIS_URL=redis://127.0.0.1:6379
|
||||
SECRET_EXPIRY=604800
|
||||
STORAGE_TYPE=redis
|
||||
EOF
|
||||
msg_ok "Installed OTS"
|
||||
|
||||
msg_info "Creating Services"
|
||||
cat <<EOF >/etc/systemd/system/ots.service
|
||||
[Unit]
|
||||
Description=One-Time-Secret Service
|
||||
After=network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=/opt/ots/env
|
||||
ExecStart=/opt/ots/ots
|
||||
Restart=Always
|
||||
RestartSecs=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now ots
|
||||
msg_ok "Created Services"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
82
install/rybbit-install.sh
Normal file
82
install/rybbit-install.sh
Normal file
@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
# Source: https://github.com/rybbit-io/rybbit
|
||||
|
||||
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 \
|
||||
caddy \
|
||||
apt-transport-https \
|
||||
ca-certificates
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
|
||||
setup_clickhouse
|
||||
PG_VERSION=17 setup_postgresql
|
||||
NODE_VERSION="20" NODE_MODULE="next" setup_nodejs
|
||||
|
||||
#sed -i 's|<default_profile>default</default_profile>|<default_profile>read_only</default_profile>|' /etc/clickhouse-server/users.xml
|
||||
#sed -i 's|<default_password></default_password>|<default_password>DISABLED</default_password>|' /etc/clickhouse-server/users.xml
|
||||
|
||||
msg_info "Setting up PostgreSQL Database"
|
||||
DB_NAME=rybbit_db
|
||||
DB_USER=rybbit
|
||||
DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
|
||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
|
||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
|
||||
{
|
||||
echo "Rybbit-Credentials"
|
||||
echo "Rybbit Database User: $DB_USER"
|
||||
echo "Rybbit Database Password: $DB_PASS"
|
||||
echo "Rybbit Database Name: $DB_NAME"
|
||||
} >>~/rybbit.creds
|
||||
msg_ok "Set up PostgreSQL Database"
|
||||
|
||||
fetch_and_deploy_gh_release "rybbit" "rybbit-io/rybbit" "tarball" "latest" "/opt/rybbit"
|
||||
|
||||
cd /opt/rybbit/shared
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
cd /opt/rybbit/server
|
||||
npm ci
|
||||
npm run build
|
||||
|
||||
cd /opt/rybbit/client
|
||||
npm ci --legacy-peer-deps
|
||||
npm run build
|
||||
|
||||
mv /opt/rybbit/.env.example /opt/rybbit/.env
|
||||
sed -i "s|^POSTGRES_DB=.*|POSTGRES_DB=$DB_NAME|g" /opt/rybbit/.env
|
||||
sed -i "s|^POSTGRES_USER=.*|POSTGRES_USER=$DB_USER|g" /opt/rybbit/.env
|
||||
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$DB_PASS|g" /opt/rybbit/.env
|
||||
sed -i "s|^DOMAIN_NAME=.*|DOMAIN_NAME=localhost|g" /opt/rybbit/.env
|
||||
sed -i "s|^BASE_URL=.*|BASE_URL=\"http://localhost\"|g" /opt/rybbit/.env
|
||||
msg_ok "Rybbit Installed"
|
||||
|
||||
msg_info "Setting up Caddy"
|
||||
mkdir -p /etc/caddy
|
||||
cp /opt/rybbit/Caddyfile /etc/caddy/Caddyfile
|
||||
systemctl enable -q --now caddy
|
||||
msg_ok "Caddy Setup"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -1,45 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/saltstack/salt
|
||||
|
||||
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 \
|
||||
jq
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setup Salt repo"
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public -o /etc/apt/keyrings/salt-archive-keyring.pgp
|
||||
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources -o /etc/apt/sources.list.d/salt.sources
|
||||
$STD apt-get update
|
||||
msg_ok "Setup Salt repo"
|
||||
|
||||
msg_info "Installing Salt Master"
|
||||
RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//')
|
||||
cat <<EOF >/etc/apt/preferences.d/salt-pin-1001
|
||||
Package: salt-*
|
||||
Pin: version ${RELEASE}
|
||||
Pin-Priority: 1001
|
||||
EOF
|
||||
$STD apt-get install -y salt-master
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Installed Salt Master"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
56
install/scraparr-install.sh
Normal file
56
install/scraparr-install.sh
Normal file
@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: JasonGreenC
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/thecfu/scraparr
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Scraparr"
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
fetch_and_deploy_gh_release "scrappar" "thecfu/scraparr" "tarball" "latest" "/opt/scraparr"
|
||||
cd /opt/scraparr || exit
|
||||
$STD uv venv /opt/scraparr/.venv
|
||||
$STD /opt/scraparr/.venv/bin/python -m ensurepip --upgrade
|
||||
$STD /opt/scraparr/.venv/bin/python -m pip install --upgrade pip
|
||||
$STD /opt/scraparr/.venv/bin/python -m pip install -r /opt/scraparr/src/scraparr/requirements.txt
|
||||
chmod -R 755 /opt/scraparr
|
||||
mkdir -p /scraparr/config
|
||||
mv /opt/scraparr/config.yaml /scraparr/config/config.yaml
|
||||
chmod -R 755 /scraparr
|
||||
msg_ok "Installed Scraparr"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/scraparr.service
|
||||
[Unit]
|
||||
Description=Scraparr
|
||||
Wants=network-online.target
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/opt/scraparr/src
|
||||
ExecStart=/opt/scraparr/.venv/bin/python -m scraparr.scraparr
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl daemon-reload
|
||||
systemctl enable -q --now scraparr
|
||||
msg_ok "Configured Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
74
install/tududi-install.sh
Normal file
74
install/tududi-install.sh
Normal file
@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2025 Community Scripts ORG
|
||||
# Author: vhsdream
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://tududi.com/
|
||||
|
||||
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 sqlite3
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="20" setup_nodejs
|
||||
|
||||
msg_info "Installing Tududi"
|
||||
fetch_and_deploy_gh_release "tududi" "chrisvel/tududi"
|
||||
cd /opt/tududi
|
||||
$STD npm install
|
||||
export NODE_ENV=production
|
||||
$STD npm run frontend:build
|
||||
cp -r ./dist ./backend/dist
|
||||
cp -r ./public/locales ./backend/dist/locales
|
||||
cp ./public/favicon.* ./backend/dist
|
||||
msg_ok "Installed Tududi"
|
||||
|
||||
msg_info "Creating config and database"
|
||||
DB_LOCATION="/opt/tududi-db"
|
||||
UPLOAD_DIR="/opt/tududi-uploads"
|
||||
mkdir -p {"$DB_LOCATION","$UPLOAD_DIR"}
|
||||
SECRET="$(openssl rand -hex 64)"
|
||||
sed -e 's/^GOOGLE/# &/' \
|
||||
-e '/TUDUDI_SESSION/s/^# //' \
|
||||
-e '/NODE_ENV/s/^# //' \
|
||||
-e "s/your_session_secret_here/$SECRET/" \
|
||||
-e 's/development/production/' \
|
||||
-e "\$a\DB_FILE=$DB_LOCATION/production.sqlite3" \
|
||||
-e "\$a\UPLOAD_LOCATION=$UPLOAD_DIR" \
|
||||
/opt/tududi/backend/.env.example >/opt/tududi/backend/.env
|
||||
export DB_FILE="$DB_LOCATION/production.sqlite3"
|
||||
$STD npm run db:init
|
||||
msg_ok "Created config and database"
|
||||
|
||||
msg_info "Creating service"
|
||||
cat <<EOF >/etc/systemd/system/tududi.service
|
||||
[Unit]
|
||||
Description=Tududi Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/opt/tududi
|
||||
EnvironmentFile=/opt/tududi/backend/.env
|
||||
ExecStart=/usr/bin/npm run start
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now tududi
|
||||
msg_ok "Created service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
39
install/vikunja-install.sh
Normal file
39
install/vikunja-install.sh
Normal file
@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (Canbiz)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://vikunja.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 make
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setup Vikunja (Patience)"
|
||||
cd /opt
|
||||
RELEASE=$(curl -fsSL https://dl.vikunja.io/vikunja/ | grep -oP 'href="/vikunja/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
|
||||
curl -fsSL "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb" -o vikunja-$RELEASE-amd64.deb
|
||||
$STD dpkg -i vikunja-$RELEASE-amd64.deb
|
||||
sed -i 's|^ timezone: .*| timezone: UTC|' /etc/vikunja/config.yml
|
||||
sed -i 's|"./vikunja.db"|"/etc/vikunja/vikunja.db"|' /etc/vikunja/config.yml
|
||||
sed -i 's|./files|/etc/vikunja/files|' /etc/vikunja/config.yml
|
||||
systemctl start vikunja.service
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Installed Vikunja"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf /opt/vikunja-$RELEASE-amd64.deb
|
||||
$STD apt-get autoremove
|
||||
$STD apt-get autoclean
|
||||
msg_ok "Cleaned"
|
136
install/viseron-install.sh
Normal file
136
install/viseron-install.sh
Normal file
@ -0,0 +1,136 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: jetonr
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/roflcoopter/viseron
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
python3 python3-pip python3-venv \
|
||||
python3-opencv jq \
|
||||
libgl1-mesa-glx libglib2.0-0 \
|
||||
libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 \
|
||||
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-libav
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up Python Environment with uv"
|
||||
cd /opt
|
||||
uv venv viseron
|
||||
source viseron/bin/activate
|
||||
uv pip install --upgrade pip setuptools wheel
|
||||
msg_ok "Python Environment Setup (uv)"
|
||||
|
||||
msg_info "Installing Viseron"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/roflcoopter/viseron/releases/latest | jq -r '.tag_name')
|
||||
uv pip install https://github.com/roflcoopter/viseron/archive/refs/tags/${RELEASE}.tar.gz
|
||||
ln -s /opt/viseron/bin/viseron /usr/local/bin/viseron
|
||||
msg_ok "Installed Viseron $RELEASE"
|
||||
|
||||
msg_info "Creating Configuration Directory"
|
||||
mkdir -p /config
|
||||
mkdir -p /config/recordings
|
||||
mkdir -p /config/logs
|
||||
msg_ok "Created Configuration Directory"
|
||||
|
||||
msg_info "Creating Default Configuration"
|
||||
cat <<EOF >/config/viseron.yaml
|
||||
# Viseron Configuration
|
||||
# https://github.com/roflcoopter/viseron
|
||||
|
||||
# Logging
|
||||
logging:
|
||||
level: INFO
|
||||
file: /config/logs/viseron.log
|
||||
|
||||
# Web Interface
|
||||
web:
|
||||
host: 0.0.0.0
|
||||
port: 8888
|
||||
|
||||
# Cameras
|
||||
cameras:
|
||||
# Example camera configuration
|
||||
# camera_name:
|
||||
# host: 192.168.1.100
|
||||
# port: 554
|
||||
# username: admin
|
||||
# password: password
|
||||
# path: /stream
|
||||
# fps: 5
|
||||
# width: 1920
|
||||
# height: 1080
|
||||
|
||||
# Object Detection
|
||||
object_detection:
|
||||
type: opencv
|
||||
confidence: 0.5
|
||||
labels:
|
||||
- person
|
||||
- car
|
||||
- truck
|
||||
- bus
|
||||
- motorcycle
|
||||
- bicycle
|
||||
|
||||
# Recording
|
||||
recording:
|
||||
enabled: true
|
||||
path: /config/recordings
|
||||
max_size: 10GB
|
||||
max_age: 7d
|
||||
|
||||
# Motion Detection
|
||||
motion_detection:
|
||||
enabled: true
|
||||
threshold: 25
|
||||
sensitivity: 0.8
|
||||
EOF
|
||||
msg_ok "Created Default Configuration"
|
||||
|
||||
msg_info "Creating Systemd Service"
|
||||
cat <<EOF >/etc/systemd/system/viseron.service
|
||||
[Unit]
|
||||
Description=Viseron NVR Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/viseron
|
||||
Environment=PATH=/opt/viseron/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
ExecStart=/opt/viseron/bin/viseron --config /config/viseron.yaml
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now viseron
|
||||
msg_ok "Created Systemd Service"
|
||||
|
||||
msg_info "Setting up Hardware Acceleration"
|
||||
if [[ "$CTTYPE" == "0" ]]; then
|
||||
chgrp video /dev/dri
|
||||
chmod 755 /dev/dri
|
||||
chmod 660 /dev/dri/*
|
||||
fi
|
||||
msg_ok "Hardware Acceleration Configured"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get autoremove
|
||||
$STD apt-get autoclean
|
||||
msg_ok "Cleaned"
|
@ -14,41 +14,35 @@ update_os
|
||||
|
||||
msg_info "Installing Dependencies (Patience)"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
git \
|
||||
unzip \
|
||||
sudo \
|
||||
make \
|
||||
php8.2 \
|
||||
php8.2-{cli,common,bcmath,intl,fpm,tidy,xml,mysql,mbstring,zip,gd,curl} \
|
||||
composer \
|
||||
apache2 \
|
||||
libapache2-mod-php \
|
||||
redis \
|
||||
mariadb-server
|
||||
redis
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
setup_mariadb
|
||||
PHP_VERSION="8.3" PHP_APACHE="YES" PHP_FPM="YES" PHP_MODULE="bcmath,bz2,cli,exif,common,curl,tidy,fpm,gd,intl,mbstring,xml,mysql,zip" setup_php
|
||||
setup_composer
|
||||
|
||||
msg_info "Setting up Database"
|
||||
DB_NAME=wallabag_db
|
||||
DB_USER=wallabag
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
SECRET_KEY="$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)"
|
||||
$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
|
||||
$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
|
||||
$STD mysql -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
||||
$STD mariadb -u root -e "CREATE DATABASE $DB_NAME;"
|
||||
$STD mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
|
||||
$STD mariadb -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
||||
{
|
||||
echo "Wallabag Credentials"
|
||||
echo "Database User: $DB_USER"
|
||||
echo "Database Password: $DB_PASS"
|
||||
echo "Database Name: $DB_NAME"
|
||||
} >> ~/wallabag.creds
|
||||
} >>~/wallabag.creds
|
||||
msg_ok "Set up Database"
|
||||
|
||||
fetch_and_deploy_gh_release "wallabag" "wallabag/wallabag" "prebuild" "latest" "/opt/wallabag" "wallabag-*.tar.gz"
|
||||
|
||||
msg_info "Installing Wallabag (Patience)"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/wallabag/wallabag/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
wget -q "https://github.com/wallabag/wallabag/archive/refs/tags/${RELEASE}.zip"
|
||||
unzip -q ${RELEASE}.zip
|
||||
mv wallabag-${RELEASE} /opt/wallabag
|
||||
cd /opt/wallabag
|
||||
useradd -d /opt/wallabag -s /bin/bash -M wallabag
|
||||
chown -R wallabag:wallabag /opt/wallabag
|
||||
|
@ -1,189 +0,0 @@
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: michelroegl-brunner
|
||||
# License: MIT | https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/LICENSE
|
||||
|
||||
get_error_description() {
|
||||
local exit_code="$1"
|
||||
case "$exit_code" in
|
||||
0) echo " " ;;
|
||||
1) echo "General error: An unspecified error occurred." ;;
|
||||
2) echo "Incorrect shell usage or invalid command arguments." ;;
|
||||
3) echo "Unexecuted function or invalid shell condition." ;;
|
||||
4) echo "Error opening a file or invalid path." ;;
|
||||
5) echo "I/O error: An input/output failure occurred." ;;
|
||||
6) echo "No such device or address." ;;
|
||||
7) echo "Insufficient memory or resource exhaustion." ;;
|
||||
8) echo "Non-executable file or invalid file format." ;;
|
||||
9) echo "Failed child process execution." ;;
|
||||
18) echo "Connection to a remote server failed." ;;
|
||||
22) echo "Invalid argument or faulty network connection." ;;
|
||||
28) echo "No space left on device." ;;
|
||||
35) echo "Timeout while establishing a connection." ;;
|
||||
56) echo "Faulty TLS connection." ;;
|
||||
60) echo "SSL certificate error." ;;
|
||||
100) echo "LXC install error: Unexpected error in create_lxc.sh." ;;
|
||||
101) echo "LXC install error: No network connection detected." ;;
|
||||
200) echo "LXC creation failed." ;;
|
||||
201) echo "LXC error: Invalid Storage class." ;;
|
||||
202) echo "User aborted menu in create_lxc.sh." ;;
|
||||
203) echo "CTID not set in create_lxc.sh." ;;
|
||||
204) echo "PCT_OSTYPE not set in create_lxc.sh." ;;
|
||||
205) echo "CTID cannot be less than 100 in create_lxc.sh." ;;
|
||||
206) echo "CTID already in use in create_lxc.sh." ;;
|
||||
207) echo "Template not found in create_lxc.sh." ;;
|
||||
208) echo "Error downloading template in create_lxc.sh." ;;
|
||||
209) echo "Container creation failed, but template is intact in create_lxc.sh." ;;
|
||||
125) echo "Docker error: Container could not start." ;;
|
||||
126) echo "Command not executable: Incorrect permissions or missing dependencies." ;;
|
||||
127) echo "Command not found: Incorrect path or missing dependency." ;;
|
||||
128) echo "Invalid exit signal, e.g., incorrect Git command." ;;
|
||||
129) echo "Signal 1 (SIGHUP): Process terminated due to hangup." ;;
|
||||
130) echo "Signal 2 (SIGINT): Manual termination via Ctrl+C." ;;
|
||||
132) echo "Signal 4 (SIGILL): Illegal machine instruction." ;;
|
||||
133) echo "Signal 5 (SIGTRAP): Debugging error or invalid breakpoint signal." ;;
|
||||
134) echo "Signal 6 (SIGABRT): Program aborted itself." ;;
|
||||
135) echo "Signal 7 (SIGBUS): Memory error, invalid memory address." ;;
|
||||
137) echo "Signal 9 (SIGKILL): Process forcibly terminated (OOM-killer or 'kill -9')." ;;
|
||||
139) echo "Signal 11 (SIGSEGV): Segmentation fault, possibly due to invalid pointer access." ;;
|
||||
141) echo "Signal 13 (SIGPIPE): Pipe closed unexpectedly." ;;
|
||||
143) echo "Signal 15 (SIGTERM): Process terminated normally." ;;
|
||||
152) echo "Signal 24 (SIGXCPU): CPU time limit exceeded." ;;
|
||||
255) echo "Unknown critical error, often due to missing permissions or broken scripts." ;;
|
||||
*) echo "Unknown error code ($exit_code)." ;;
|
||||
esac
|
||||
}
|
||||
|
||||
post_to_api() {
|
||||
|
||||
if ! command -v curl &>/dev/null; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ "$DIAGNOSTICS" = "no" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -z "$RANDOM_UUID" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
local API_URL="http://api.community-scripts.org/dev/upload"
|
||||
local pve_version="not found"
|
||||
pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
|
||||
|
||||
JSON_PAYLOAD=$(
|
||||
cat <<EOF
|
||||
{
|
||||
"ct_type": $CT_TYPE,
|
||||
"type":"lxc",
|
||||
"disk_size": $DISK_SIZE,
|
||||
"core_count": $CORE_COUNT,
|
||||
"ram_size": $RAM_SIZE,
|
||||
"os_type": "$var_os",
|
||||
"os_version": "$var_version",
|
||||
"disableip6": "$DISABLEIP6",
|
||||
"nsapp": "$NSAPP",
|
||||
"method": "$METHOD",
|
||||
"pve_version": "$pve_version",
|
||||
"status": "installing",
|
||||
"random_id": "$RANDOM_UUID"
|
||||
}
|
||||
EOF
|
||||
)
|
||||
RESPONSE=$(curl -s -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$JSON_PAYLOAD") || true
|
||||
}
|
||||
|
||||
post_to_api_vm() {
|
||||
|
||||
if [[ ! -f /usr/local/community-scripts/diagnostics ]]; then
|
||||
return
|
||||
fi
|
||||
DIAGNOSTICS=$(grep -i "^DIAGNOSTICS=" /usr/local/community-scripts/diagnostics | awk -F'=' '{print $2}')
|
||||
if ! command -v curl &>/dev/null; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ "$DIAGNOSTICS" = "no" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -z "$RANDOM_UUID" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
local API_URL="http://api.community-scripts.org/dev/upload"
|
||||
local pve_version="not found"
|
||||
pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
|
||||
|
||||
DISK_SIZE_API=${DISK_SIZE%G}
|
||||
|
||||
JSON_PAYLOAD=$(
|
||||
cat <<EOF
|
||||
{
|
||||
"ct_type": 2,
|
||||
"type":"vm",
|
||||
"disk_size": $DISK_SIZE_API,
|
||||
"core_count": $CORE_COUNT,
|
||||
"ram_size": $RAM_SIZE,
|
||||
"os_type": "$var_os",
|
||||
"os_version": "$var_version",
|
||||
"disableip6": "",
|
||||
"nsapp": "$NSAPP",
|
||||
"method": "$METHOD",
|
||||
"pve_version": "$pve_version",
|
||||
"status": "installing",
|
||||
"random_id": "$RANDOM_UUID"
|
||||
}
|
||||
EOF
|
||||
)
|
||||
RESPONSE=$(curl -s -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$JSON_PAYLOAD") || true
|
||||
}
|
||||
|
||||
POST_UPDATE_DONE=false
|
||||
post_update_to_api() {
|
||||
|
||||
if ! command -v curl &>/dev/null; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ "$POST_UPDATE_DONE" = true ]; then
|
||||
return 0
|
||||
fi
|
||||
exit_code=${2:-1}
|
||||
local API_URL="http://api.community-scripts.org/dev/upload/updatestatus"
|
||||
local status="${1:-failed}"
|
||||
if [[ "$status" == "failed" ]]; then
|
||||
local exit_code="${2:-1}"
|
||||
elif [[ "$status" == "success" ]]; then
|
||||
local exit_code="${2:-0}"
|
||||
fi
|
||||
|
||||
if [[ -z "$exit_code" ]]; then
|
||||
exit_code=1
|
||||
fi
|
||||
|
||||
error=$(get_error_description "$exit_code")
|
||||
|
||||
if [ -z "$error" ]; then
|
||||
error="Unknown error"
|
||||
fi
|
||||
|
||||
JSON_PAYLOAD=$(
|
||||
cat <<EOF
|
||||
{
|
||||
"status": "$status",
|
||||
"error": "$error",
|
||||
"random_id": "$RANDOM_UUID"
|
||||
}
|
||||
EOF
|
||||
)
|
||||
RESPONSE=$(curl -s -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$JSON_PAYLOAD") || true
|
||||
|
||||
POST_UPDATE_DONE=true
|
||||
}
|
139
misc/backup.func
139
misc/backup.func
@ -1,139 +0,0 @@
|
||||
# backup.func – Snapshot/Backup-Logik mit Rollback via trap + Rotation + flexible Pfaderkennung
|
||||
|
||||
# Globale Variable (automatisch gesetzt)
|
||||
SNAPSHOT_DIR=""
|
||||
|
||||
create_snapshot() {
|
||||
local app_name=$1
|
||||
local base_dir
|
||||
|
||||
# Autodetect base_dir, bevorzugt /opt/<app>, sonst Arbeitsverzeichnis oder APP_DIR gesetzt vom Script
|
||||
base_dir="${APP_DIR:-/opt/$app_name}"
|
||||
if [[ ! -d "$base_dir" ]]; then
|
||||
msg_error "Cannot determine base directory for $app_name"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local snapshot_base="${base_dir}-snapshot"
|
||||
SNAPSHOT_DIR="${snapshot_base}-$(date +%F_%T | tr ':' '-')"
|
||||
|
||||
msg_info "Creating snapshot for $app_name"
|
||||
|
||||
mkdir -p "$SNAPSHOT_DIR"
|
||||
cp -a "$base_dir" "$SNAPSHOT_DIR/base" || {
|
||||
msg_error "Failed to backup base directory"
|
||||
return 1
|
||||
}
|
||||
|
||||
mkdir -p "$SNAPSHOT_DIR/systemd"
|
||||
cp -a /etc/systemd/system/${app_name}-*.service "$SNAPSHOT_DIR/systemd/" 2>/dev/null || true
|
||||
|
||||
[[ -f "/etc/default/$app_name" ]] && cp "/etc/default/$app_name" "$SNAPSHOT_DIR/"
|
||||
[[ -f "$base_dir/${app_name}_version.txt" ]] && cp "$base_dir/${app_name}_version.txt" "$SNAPSHOT_DIR/"
|
||||
|
||||
rotate_snapshots "$snapshot_base"
|
||||
|
||||
msg_ok "Snapshot created at $SNAPSHOT_DIR"
|
||||
return 0
|
||||
}
|
||||
|
||||
rotate_snapshots() {
|
||||
local snapshot_base=$1
|
||||
local snapshots
|
||||
|
||||
# Sortiert nach Datum absteigend, behalte nur die 3 neuesten
|
||||
mapfile -t snapshots < <(ls -dt ${snapshot_base}-* 2>/dev/null)
|
||||
if ((${#snapshots[@]} > 3)); then
|
||||
for ((i = 3; i < ${#snapshots[@]}; i++)); do
|
||||
rm -rf "${snapshots[$i]}"
|
||||
msg_info "Old snapshot removed: ${snapshots[$i]}"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
rollback_snapshot() {
|
||||
local app_name=$1
|
||||
local base_dir
|
||||
|
||||
base_dir="${APP_DIR:-/opt/$app_name}"
|
||||
if [[ -z "$SNAPSHOT_DIR" || ! -d "$SNAPSHOT_DIR" ]]; then
|
||||
msg_error "No snapshot found. Cannot rollback."
|
||||
return 1
|
||||
fi
|
||||
|
||||
msg_info "Rolling back $app_name from snapshot"
|
||||
|
||||
systemctl stop ${app_name}-* 2>/dev/null || true
|
||||
|
||||
rm -rf "$base_dir"
|
||||
cp -a "$SNAPSHOT_DIR/base" "$base_dir" || {
|
||||
msg_error "Failed to restore base directory"
|
||||
return 1
|
||||
}
|
||||
|
||||
if [[ -d "$SNAPSHOT_DIR/systemd" ]]; then
|
||||
cp "$SNAPSHOT_DIR/systemd/"*.service /etc/systemd/system/ 2>/dev/null || true
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
|
||||
[[ -f "$SNAPSHOT_DIR/$app_name" ]] && cp "$SNAPSHOT_DIR/$app_name" "/etc/default/$app_name"
|
||||
[[ -f "$SNAPSHOT_DIR/${app_name}_version.txt" ]] && cp "$SNAPSHOT_DIR/${app_name}_version.txt" "$base_dir/"
|
||||
|
||||
systemctl start ${app_name}-* 2>/dev/null || true
|
||||
|
||||
msg_ok "Rollback for $app_name completed"
|
||||
return 0
|
||||
}
|
||||
|
||||
cleanup_snapshot() {
|
||||
if [[ -n "$SNAPSHOT_DIR" && -d "$SNAPSHOT_DIR" ]]; then
|
||||
rm -rf "$SNAPSHOT_DIR"
|
||||
msg_ok "Cleaned up snapshot at $SNAPSHOT_DIR"
|
||||
fi
|
||||
}
|
||||
|
||||
handle_failure() {
|
||||
local app_name=$1
|
||||
local line=$2
|
||||
msg_error "Update failed at line $line. Rolling back..."
|
||||
rollback_snapshot "$app_name"
|
||||
exit 1
|
||||
}
|
||||
|
||||
safe_run_update_script() {
|
||||
local app_name="${APP:-paperless}"
|
||||
|
||||
if ! create_snapshot "$app_name"; then
|
||||
msg_error "Snapshot creation failed. Aborting update."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
trap 'handle_failure "$app_name" $LINENO' ERR
|
||||
set -eE
|
||||
|
||||
update_script
|
||||
|
||||
cleanup_snapshot
|
||||
}
|
||||
|
||||
wrap_update_script_with_snapshot() {
|
||||
local original_func
|
||||
original_func=$(declare -f update_script) || return 1
|
||||
|
||||
eval "
|
||||
original_update_script() {
|
||||
${original_func#*\{}
|
||||
}
|
||||
update_script() {
|
||||
local app_name=\"\${APP:-paperless}\"
|
||||
if ! create_snapshot \"\$app_name\"; then
|
||||
msg_error \"Snapshot creation failed. Aborting update.\"
|
||||
exit 1
|
||||
fi
|
||||
trap 'handle_failure \"\$app_name\" \$LINENO' ERR
|
||||
set -eE
|
||||
original_update_script
|
||||
cleanup_snapshot
|
||||
}
|
||||
"
|
||||
}
|
@ -1,277 +0,0 @@
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# Co-Author: MickLesk
|
||||
# License: MIT
|
||||
# https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
||||
|
||||
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/core.func)
|
||||
load_functions
|
||||
|
||||
# This function sets color variables for formatting output in the terminal
|
||||
# color() {
|
||||
# # Colors
|
||||
# YW=$(echo "\033[33m")
|
||||
# YWB=$(echo "\033[93m")
|
||||
# BL=$(echo "\033[36m")
|
||||
# RD=$(echo "\033[01;31m")
|
||||
# GN=$(echo "\033[1;92m")
|
||||
|
||||
# # Formatting
|
||||
# CL=$(echo "\033[m")
|
||||
# BFR="\\r\\033[K"
|
||||
# BOLD=$(echo "\033[1m")
|
||||
# TAB=" "
|
||||
|
||||
# # System
|
||||
# RETRY_NUM=10
|
||||
# RETRY_EVERY=3
|
||||
# i=$RETRY_NUM
|
||||
|
||||
# # Icons
|
||||
# CM="${TAB}✔️${TAB}${CL}"
|
||||
# CROSS="${TAB}✖️${TAB}${CL}"
|
||||
# INFO="${TAB}💡${TAB}${CL}"
|
||||
# NETWORK="${TAB}📡${TAB}${CL}"
|
||||
# OS="${TAB}🖥️${TAB}${CL}"
|
||||
# OSVERSION="${TAB}🌟${TAB}${CL}"
|
||||
# HOSTNAME="${TAB}🏠${TAB}${CL}"
|
||||
# GATEWAY="${TAB}🌐${TAB}${CL}"
|
||||
# DEFAULT="${TAB}⚙️${TAB}${CL}"
|
||||
# }
|
||||
|
||||
# Function to set STD mode based on verbosity
|
||||
set_std_mode() {
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
STD=""
|
||||
else
|
||||
STD="silent"
|
||||
fi
|
||||
}
|
||||
|
||||
# Silent execution function
|
||||
silent() {
|
||||
"$@" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# This function enables IPv6 if it's not disabled and sets verbose mode
|
||||
verb_ip6() {
|
||||
set_std_mode # Set STD mode based on VERBOSE
|
||||
|
||||
if [ "$DISABLEIPV6" == "yes" ]; then
|
||||
$STD sysctl -w net.ipv6.conf.all.disable_ipv6=1
|
||||
echo "net.ipv6.conf.all.disable_ipv6 = 1" >>/etc/sysctl.conf
|
||||
$STD rc-update add sysctl default
|
||||
fi
|
||||
}
|
||||
|
||||
# This function catches errors and handles them with the error handler function
|
||||
catch_errors() {
|
||||
unset SPINNER_PID
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||
}
|
||||
|
||||
# This function handles errors
|
||||
error_handler() {
|
||||
local exit_code="$?"
|
||||
local line_number="$1"
|
||||
local command="$2"
|
||||
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||
echo -e "\n$error_message\n"
|
||||
[[ -n "${SPINNER_PID:-}" ]] && kill "$SPINNER_PID" &>/dev/null || true
|
||||
}
|
||||
|
||||
# # This function displays an informational message with logging support.
|
||||
# declare -A MSG_INFO_SHOWN
|
||||
# SPINNER_ACTIVE=0
|
||||
# SPINNER_PID=""
|
||||
# SPINNER_MSG=""
|
||||
|
||||
# trap 'stop_spinner' EXIT INT TERM HUP
|
||||
|
||||
# start_spinner() {
|
||||
# local msg="$1"
|
||||
# local frames=(⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏)
|
||||
# local spin_i=0
|
||||
# local interval=0.1
|
||||
|
||||
# SPINNER_MSG="$msg"
|
||||
# printf "\r\e[2K" >&2
|
||||
|
||||
# {
|
||||
# while [[ "$SPINNER_ACTIVE" -eq 1 ]]; do
|
||||
# printf "\r\e[2K%s %b" "${frames[spin_i]}" "${YW}${SPINNER_MSG}${CL}" >&2
|
||||
# spin_i=$(((spin_i + 1) % ${#frames[@]}))
|
||||
# sleep "$interval"
|
||||
# done
|
||||
# } &
|
||||
|
||||
# SPINNER_PID=$!
|
||||
# disown "$SPINNER_PID"
|
||||
# }
|
||||
|
||||
# stop_spinner() {
|
||||
# if [[ ${SPINNER_PID+v} && -n "$SPINNER_PID" ]] && kill -0 "$SPINNER_PID" 2>/dev/null; then
|
||||
# kill "$SPINNER_PID" 2>/dev/null
|
||||
# sleep 0.1
|
||||
# kill -0 "$SPINNER_PID" 2>/dev/null && kill -9 "$SPINNER_PID" 2>/dev/null
|
||||
# wait "$SPINNER_PID" 2>/dev/null || true
|
||||
# fi
|
||||
# SPINNER_ACTIVE=0
|
||||
# unset SPINNER_PID
|
||||
# }
|
||||
|
||||
# spinner_guard() {
|
||||
# if [[ "$SPINNER_ACTIVE" -eq 1 ]] && [[ -n "$SPINNER_PID" ]]; then
|
||||
# kill "$SPINNER_PID" 2>/dev/null
|
||||
# wait "$SPINNER_PID" 2>/dev/null || true
|
||||
# SPINNER_ACTIVE=0
|
||||
# unset SPINNER_PID
|
||||
# fi
|
||||
# }
|
||||
|
||||
# msg_info() {
|
||||
# local msg="$1"
|
||||
# [[ -n "${MSG_INFO_SHOWN["$msg"]+x}" ]] && return
|
||||
# MSG_INFO_SHOWN["$msg"]=1
|
||||
|
||||
# spinner_guard
|
||||
# SPINNER_ACTIVE=1
|
||||
# start_spinner "$msg"
|
||||
# }
|
||||
|
||||
# msg_ok() {
|
||||
# local msg="$1"
|
||||
# stop_spinner
|
||||
# printf "\r\e[2K%s %b\n" "${CM}" "${GN}${msg}${CL}" >&2
|
||||
# unset MSG_INFO_SHOWN["$msg"]
|
||||
# }
|
||||
|
||||
# msg_error() {
|
||||
# stop_spinner
|
||||
# local msg="$1"
|
||||
# printf "\r\e[2K%s %b\n" "${CROSS}" "${RD}${msg}${CL}" >&2
|
||||
# #log_message "ERROR" "$msg"
|
||||
# }
|
||||
|
||||
# This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection
|
||||
setting_up_container() {
|
||||
msg_info "Setting up Container OS"
|
||||
while [ $i -gt 0 ]; do
|
||||
if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" != "" ]; then
|
||||
break
|
||||
fi
|
||||
echo 1>&2 -en "${CROSS}${RD} No Network! "
|
||||
sleep $RETRY_EVERY
|
||||
i=$((i - 1))
|
||||
done
|
||||
|
||||
if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" = "" ]; then
|
||||
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
||||
echo -e "${NETWORK}Check Network Settings"
|
||||
exit 1
|
||||
fi
|
||||
msg_ok "Set up Container OS"
|
||||
msg_ok "Network Connected: ${BL}$(ip addr show | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | tail -n1)${CL}"
|
||||
}
|
||||
|
||||
# This function checks the network connection by pinging a known IP address and prompts the user to continue if the internet is not connected
|
||||
network_check() {
|
||||
set +e
|
||||
trap - ERR
|
||||
if ping -c 1 -W 1 1.1.1.1 &>/dev/null || ping -c 1 -W 1 8.8.8.8 &>/dev/null || ping -c 1 -W 1 9.9.9.9 &>/dev/null; then
|
||||
msg_ok "Internet Connected"
|
||||
else
|
||||
msg_error "Internet NOT Connected"
|
||||
read -r -p "Would you like to continue anyway? <y/N> " prompt
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
|
||||
else
|
||||
echo -e "${NETWORK}Check Network Settings"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
|
||||
if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to ${BL}$RESOLVEDIP${CL}"; fi
|
||||
set -e
|
||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||
}
|
||||
|
||||
# This function updates the Container OS by running apt-get update and upgrade
|
||||
update_os() {
|
||||
msg_info "Updating Container OS"
|
||||
$STD apk update
|
||||
$STD apk upgrade
|
||||
msg_ok "Updated Container OS"
|
||||
|
||||
msg_info "Installing core dependencies"
|
||||
$STD apk update
|
||||
$STD apk add newt curl openssh nano mc ncurses
|
||||
msg_ok "Core dependencies installed"
|
||||
}
|
||||
|
||||
# This function modifies the message of the day (motd) and SSH settings
|
||||
motd_ssh() {
|
||||
echo "export TERM='xterm-256color'" >>/root/.bashrc
|
||||
IP=$(ip -4 addr show eth0 | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||
|
||||
if [ -f "/etc/os-release" ]; then
|
||||
OS_NAME=$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '"')
|
||||
OS_VERSION=$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | tr -d '"')
|
||||
else
|
||||
OS_NAME="Alpine Linux"
|
||||
OS_VERSION="Unknown"
|
||||
fi
|
||||
|
||||
PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
|
||||
echo "echo -e \"\"" >"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${BOLD}${YW}${APPLICATION} LXC Container - DEV Repository${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${RD}WARNING: This is a DEVELOPMENT version (ProxmoxVED). Do NOT use in production!${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${YW} Hostname: ${GN}\$(hostname)${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${YW} IP Address: ${GN}${IP}${CL}\"" >>"$PROFILE_FILE"
|
||||
echo -e "echo -e \"${YW} Repository: ${GN}https://github.com/community-scripts/ProxmoxVED${CL}\"" >>"$PROFILE_FILE"
|
||||
echo "echo \"\"" >>"$PROFILE_FILE"
|
||||
|
||||
if [[ "${SSH_ROOT}" == "yes" ]]; then
|
||||
$STD rc-update add sshd
|
||||
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
|
||||
$STD /etc/init.d/sshd start
|
||||
fi
|
||||
}
|
||||
|
||||
# Validate Timezone for some LXC's
|
||||
validate_tz() {
|
||||
[[ -f "/usr/share/zoneinfo/$1" ]]
|
||||
}
|
||||
|
||||
# This function customizes the container and enables passwordless login for the root user
|
||||
customize() {
|
||||
if [[ "$PASSWORD" == "" ]]; then
|
||||
msg_info "Customizing Container"
|
||||
passwd -d root >/dev/null 2>&1
|
||||
|
||||
# Ensure agetty is available
|
||||
apk add --no-cache --force-broken-world util-linux >/dev/null 2>&1
|
||||
|
||||
# Create persistent autologin boot script
|
||||
mkdir -p /etc/local.d
|
||||
cat <<'EOF' >/etc/local.d/autologin.start
|
||||
#!/bin/sh
|
||||
sed -i 's|^tty1::respawn:.*|tty1::respawn:/sbin/agetty --autologin root --noclear tty1 38400 linux|' /etc/inittab
|
||||
kill -HUP 1
|
||||
EOF
|
||||
touch /root/.hushlogin
|
||||
|
||||
chmod +x /etc/local.d/autologin.start
|
||||
rc-update add local >/dev/null 2>&1
|
||||
|
||||
# Apply autologin immediately for current session
|
||||
/etc/local.d/autologin.start
|
||||
|
||||
msg_ok "Customized Container"
|
||||
fi
|
||||
|
||||
echo "bash -c \"\$(curl -fsSL https://github.com/community-scripts/ProxmoxVED/raw/main/ct/${app}.sh)\"" >/usr/bin/update
|
||||
chmod +x /usr/bin/update
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user