Merge branch 'main' into lxc-fileflows

This commit is contained in:
Kyle Kroboth 2025-03-13 22:29:54 -04:00
commit 44ae4b06ec
21 changed files with 2256 additions and 1370 deletions

View File

@ -0,0 +1,88 @@
name: Delete Files on Issue Close
on:
issues:
types: [closed]
jobs:
delete-files:
runs-on: ubuntu-latest
if: contains(github.event.issue.labels.*.name, 'Migration To ProxmoxVE')
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Extract Issue Title (Lowercase & Underscores)
id: extract_title
run: echo "TITLE=$(echo '${{ github.event.issue.title }}' | tr '[:upper:]' '[:lower:]' | sed 's/ /_/g')" >> $GITHUB_ENV
- name: Check if Files Exist in community-scripts/ProxmoxVE
id: check_files
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
REPO="community-scripts/ProxmoxVE"
API_URL="https://api.github.com/repos/$REPO/contents"
FILES=(
"ct/${TITLE}.sh"
"install/${TITLE}-install.sh"
"json/${TITLE}.json"
)
EXISTS=false
for FILE in "${FILES[@]}"; do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token $GH_TOKEN" "$API_URL/$FILE")
if [ "$STATUS" -eq 200 ]; then
EXISTS=true
echo "$FILE exists in $REPO"
else
echo "$FILE does NOT exist in $REPO"
fi
done
if [ "$EXISTS" = false ]; then
echo "No matching files found in $REPO. Exiting..."
exit 0
fi
- name: Commit and Push Changes
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
branch=$(echo "delete-files_${{ github.event.issue.number }}_${TITLE}" | tr '[:upper:]' '[:lower:]' | sed 's/ /_/g')
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git checkout -b $branch
rm -f ct/${TITLE}.sh
rm -f install/${TITLE}-install.sh
rm -f json/${TITLE}.json
git add .
if git diff --staged --quiet; then
echo "No files to delete. Exiting..."
exit 0
fi
git commit -m "Deleted files for issue: ${{ github.event.issue.title }}"
git push origin $branch
gh pr create --title "Delete Files for ${{ github.event.issue.title }} after Merge to Main" --body "Delete files after merge in main repo." --base main --head $branch
pr_number=$(gh pr list | grep -m 1 $branch | awk '{print $1}')
#gh pr merge $pr_number --squash
echo pr_number=$pr_number >> $GITHUB_ENV
- name: Comment on Issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue_number = context.payload.issue.number;
const message = `Files deleted with PR #${process.env.pr_number}`;
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: message
});

View File

@ -0,0 +1,74 @@
name: Crawl Versions from newreleases.io
on:
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
move-to-main-repo:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
with:
repository: community-scripts/ProxmoxVED
ref: main
- name: Crawl from newreleases.io
env:
token: ${{ secrets.NEWRELEASES_TOKEN }}
run: |
page=1
projects_file="project_json"
output_file="json/versions.json"
echo "[]" > $output_file
while true; do
echo "Start loop on page: $page"
projects=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects?page=$page")
total_pages=$(echo "$projects" | jq -r '.total_pages')
if [ -z "$total_pages" ] || [ "$total_pages" -eq 0 ]; then
echo "No pages available. Exiting."
exit 1
fi
if [ $page == $total_pages ]; then
break
fi
if [ -z "$projects" ] || ! echo "$projects" | jq -e '.projects' > /dev/null; then
echo "No more projects or invalid response. Exiting."
break
fi
echo "$projects" > "$projects_file"
jq -r '.projects[] | "\(.id) \(.name)"' "$projects_file" | while read -r id name; do
version=$(curl -s -H "X-Key: $token" "https://api.newreleases.io/v1/projects/$id/latest-release")
version_data=$(echo "$version" | jq -r '.version // empty')
if [ -n "$version_data" ]; then
jq --arg name "$name" --arg version "$version_data" \
'. += [{"name": $name, "version": $version}]' "$output_file" > "$output_file.tmp" && mv "$output_file.tmp" "$output_file"
fi
done
((page++))
done
- name: Commit JSON
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "GitHub Actions[bot]"
git checkout -b update_versions || git checkout update_versions
git add json/versions.json
git commit -m "Update versions.json"
git push origin update_versions --force
gh pr create --title "[AUTOMATIC PR]Update versions.json" --body "Update versions.json, crawled from newreleases.io" --base main --head update_versions

View File

@ -26,8 +26,6 @@
"--rcfile",
".vscode/.shellcheckrc"
],
"workbench.colorTheme": "Default Dark+",
"workbench.iconTheme": "vscode-icons",
"git.autofetch": true,
"git.confirmSync": false,
"git.enableSmartCommit": true,

65
ct/cryptpad.sh Normal file
View File

@ -0,0 +1,65 @@
#!/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: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/cryptpad/cryptpad
APP="CryptPad"
var_tags="docs;office"
var_cpu="1"
var_ram="1024"
var_disk="8"
var_os="debian"
var_version="12"
var_unprivileged="1"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d "/opt/cryptpad" ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/cryptpad/cryptpad/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP"
systemctl stop cryptpad
msg_ok "Stopped $APP"
msg_info "Updating $APP to ${RELEASE}"
cd /opt/cryptpad
$STD git fetch origin --tags
$STD git checkout $RELEASE
$STD npm ci
$STD npm run install:components
$STD npm run build
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to ${RELEASE}"
msg_info "Starting $APP"
systemctl start cryptpad
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}:3000${CL}"

View File

@ -1,78 +0,0 @@
#!/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://fluidcalendar.com
APP="fluid-calendar"
var_tags="calendar,tasks"
var_cpu="3"
var_ram="4096"
var_disk="7"
var_os="debian"
var_version="12"
var_unprivileged="1"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/fluid-calendar ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/dotnetfactory/fluid-calendar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP"
systemctl stop fluid-calendar.service
msg_ok "Stopped $APP"
msg_info "Creating Backup"
$STD tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" /opt/fluid-calendar
msg_ok "Backup Created"
msg_info "Updating $APP to v${RELEASE}"
tmp_file=$(mktemp)
wget -q "https://github.com/dotnetfactory/fluid-calendar/archive/refs/tags/v${RELEASE}.zip" -O $tmp_file
unzip -q $tmp_file
cp -rf ${APP}-${RELEASE}/* /opt/fluid-calendar
cd /opt/fluid-calendar
export NEXT_TELEMETRY_DISABLED=1
$STD npm run setup
$STD npm run build
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting $APP"
systemctl start fluid-calendar.service
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -rf $tmp_file
rm -rf "/opt/${APP}_backup_$(date +%F).tar.gz"
rm -rf /tmp/${APP}-${RELEASE}
msg_ok "Cleanup Completed"
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

70
ct/gomft.sh Normal file
View File

@ -0,0 +1,70 @@
#!/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: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/StarFleetCPTN/GoMFT
APP="GoMFT"
var_tags="backup"
var_cpu="1"
var_ram="1024"
var_disk="8"
var_os="debian"
var_version="12"
var_unprivileged="1"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d "/opt/gomft" ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP"
systemctl stop gomft
msg_ok "Stopped $APP"
msg_info "Updating $APP to ${RELEASE}"
rm -f /opt/gomft/gomft
temp_file=$(mktemp)
wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
tar -xzf $temp_file
cp -rf GoMFT-${RELEASE}/* /opt/gomft
wget -q "https://github.com/StarFleetCPTN/GoMFT/releases/download/v${RELEASE}/gomft-v${RELEASE}-linux-amd64" -O /opt/gomft/gomft
chmod +x /opt/gomft/gomft
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to ${RELEASE}"
msg_info "Cleaning Up"
rm -f $temp_file
msg_ok "Cleanup Complete"
msg_info "Starting $APP"
systemctl start gomft
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}:8080${CL}"

View File

@ -1,41 +0,0 @@
#!/usr/bin/env bash
source <(curl -s 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/ProxmoxVED/raw/main/LICENSE
# Source: https://alpinelinux.org/
APP="NPMplus"
var_tags="proxy;nginx"
var_cpu="1"
var_ram="512"
var_disk="3"
var_os="alpine"
var_version="3.21"
var_unprivileged="1"
header_info "$APP"
variables
color
catch_errors
function update_script() {
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
"1" "Check for Alpine Updates" ON \
3>&1 1>&2 2>&3)
header_info
if [ "$UPD" == "1" ]; then
apk update && apk upgrade
exit
fi
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:81${CL}"

View File

@ -1,43 +0,0 @@
#!/usr/bin/env bash
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
# Copyright (c) 2021-2025 tteck
# Author: dave-yap (dave-yap)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://seafile.com/
APP="Seafile"
var_tags="documents"
var_cpu="2"
var_ram="2048"
var_disk="20"
var_os="debian"
var_version="12"
var_unprivileged="1"
header_info "$APP"
base_settings
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/systemd/system/seafile.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_ok "No upgrade path available now."
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}:8000${CL}"

82
ct/slskd.sh Normal file
View File

@ -0,0 +1,82 @@
#!/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/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/slskd/slskd, https://soularr.net
APP="slskd"
var_tags="arr,p2p"
var_cpu="1"
var_ram="512"
var_disk="4"
var_os="debian"
var_version="12"
var_unprivileged="1"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/slskd ]] || [[ ! -d /opt/soularr ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/slskd/slskd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping $APP and Soularr"
systemctl stop slskd soularr.timer soularr.service
msg_ok "Stopped $APP and Soularr"
msg_info "Updating $APP to v${RELEASE}"
tmp_file=$(mktemp)
wget -q "https://github.com/slskd/slskd/releases/download/${RELEASE}/slskd-${RELEASE}-linux-x64.zip" -O $tmp_file
unzip -q -oj $tmp_file slskd -d /opt/${APP}
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Cleaning Up"
rm -rf $tmp_file
msg_ok "Cleanup Completed"
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "$APP updated"
msg_info "Updating Soularr"
cp /opt/soularr/config.ini /opt/soularrconfig.ini
cp /opt/soularr/run.sh /opt/soularrscript.sh
cd /tmp
rm -rf /opt/soularr
wget -q https://github.com/mrusse/soularr/archive/refs/heads/main.zip
unzip -q main.zip
mv soularr-main /opt/soularr
cd /opt/soularr
$STD pip install -r requirements.txt
mv /opt/soularrconfig.ini /opt/soularr/config.ini
mv /opt/soularrscript.sh /opt/soularr/run.sh
msg_ok "Soularr updated"
msg_info "Starting $APP and Soularr"
systemctl start slskd soularr.timer
msg_ok "Started $APP and Soularr"
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}:5030${CL}"
echo -e "${RAMSIZE}${BL} ${BOLD}Finish configuring Soularr at /opt/soularr/config.ini${CL}"
echo -e "${ADVANCED}${DGN} Then start with${CL} ${BOLD}${UL}systemctl start soularr.timer${CL}"

1
ct/snipeit.sh Normal file
View File

@ -0,0 +1 @@

View File

@ -6,10 +6,11 @@ import { Metadata } from "@/lib/types";
console.log('Current directory: ' + process.cwd());
const jsonDir = "../json";
const metadataFileName = "metadata.json";
const versionsFileName = "versions.json";
const encoding = "utf-8";
const fileNames = (await fs.readdir(jsonDir))
.filter((fileName) => fileName !== metadataFileName)
.filter((fileName) => fileName !== metadataFileName && fileName !== versionsFileName);
describe.each(fileNames)("%s", async (fileName) => {
let script: Script;
@ -20,6 +21,7 @@ describe.each(fileNames)("%s", async (fileName) => {
script = JSON.parse(fileContent);
})
it("should have valid json according to script schema", () => {
ScriptSchema.parse(script);
});
@ -40,7 +42,6 @@ describe(`${metadataFileName}`, async () => {
const fileContent = await fs.readFile(filePath, encoding)
metadata = JSON.parse(fileContent);
})
it("should have valid json according to metadata schema", () => {
// TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts
assert(metadata.categories.length > 0);

View File

@ -0,0 +1,86 @@
#!/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/cryptpad/cryptpad
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
curl \
sudo \
mc \
gnupg \
git
msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
msg_info "Setup Node.js"
$STD apt-get update
$STD apt-get install -y nodejs
msg_ok "Setup Node.js"
read -p "Do you want to install OnlyOffice components? (Y/N): " onlyoffice
msg_info "Setup ${APPLICATION}"
RELEASE=$(curl -s https://api.github.com/repos/cryptpad/cryptpad/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
cd /opt
$STD git clone https://github.com/cryptpad/cryptpad.git cryptpad
cd cryptpad
$STD git checkout $RELEASE
$STD npm ci
$STD npm run install:components
$STD npm run build
cp config/config.example.js config/config.js
IP=$(hostname -I | awk '{print $1}')
sed -i "51s/localhost/${IP}/g" /opt/cryptpad/config/config.js
sed -i "80s#//httpAddress: 'localhost'#httpAddress: '0.0.0.0'#g" /opt/cryptpad/config/config.js
if [[ "$onlyoffice" =~ ^[Yy]$ ]]; then
$STD bash -c "./install-onlyoffice.sh --accept-license"
fi
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Setup ${APPLICATION}"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/cryptpad.service
[Unit]
Description=CryptPad Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/cryptpad
ExecStart=/usr/bin/node server
Environment='PWD="/opt/cryptpad"'
StandardOutput=journal
StandardError=journal+console
LimitNOFILE=1000000
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now cryptpad
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -1,112 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: vhsdream
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/dotnetfactory/fluid-calendar
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
curl \
sudo \
mc \
zip \
gnupg \
postgresql-common
msg_ok "Installed Dependencies"
msg_info "Installing Additional Dependencies"
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
echo "YES" | /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh &>/dev/null
$STD apt-get install -y postgresql-17 nodejs
msg_ok "Installed Additional Dependencies"
msg_info "Setting up Postgresql Database"
DB_NAME="fluiddb"
DB_USER="fluiduser"
DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)"
NEXTAUTH_SECRET="$(openssl rand -base64 44 | tr -dc 'a-zA-Z0-9' | cut -c1-32)"
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED 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 "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME to $DB_USER;"
$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;"
{
echo "${APPLICATION} Credentials"
echo "Database User: $DB_USER"
echo "Database Password: $DB_PASS"
echo "Database Name: $DB_NAME"
echo "NextAuth Secret: $NEXTAUTH_SECRET"
} >> ~/$APPLICATION.creds
msg_ok "Set up Postgresql Database"
msg_info "Setup ${APPLICATION}"
tmp_file=$(mktemp)
RELEASE=$(curl -s https://api.github.com/repos/dotnetfactory/fluid-calendar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q "https://github.com/dotnetfactory/fluid-calendar/archive/refs/tags/v${RELEASE}.zip" -O $tmp_file
unzip -q $tmp_file
mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION}
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
cat <<EOF >/opt/fluid-calendar/.env
DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}"
# For OAuth integration with Google Calendar
# See https://console.cloud.google.com
GOOGLE_CLIENT_ID=""
GOOGLE_CLIENT_SECRET=""
# Change the URL below to your external URL
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="${NEXTAUTH_SECRET}"
# For optional Outlook Calendar Integration
# Create at https://portal.azure.com
AZURE_AD_CLIENT_ID=""
AZURE_AD_CLIENT_SECRET=""
AZURE_AD_TENANT_ID=""
# Logging configuration
# Options: debug, none (check logger.js for more details)
LOG_LEVEL="none"
DEBUG_ENABLED=0
EOF
export NEXT_TELEMETRY_DISABLED=1
cd /opt/fluid-calendar
$STD npm run setup
$STD npm run build
msg_ok "Setup ${APPLICATION}"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/fluid-calendar.service
[Unit]
Description=Fluid Calendar Application
After=network.target postgresql.service
[Service]
Restart=always
WorkingDirectory=/opt/fluid-calendar
ExecStart=/usr/bin/npm run start
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now fluid-calendar.service
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
rm -f $tmp_file
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

103
install/gomft-install.sh Normal file
View File

@ -0,0 +1,103 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: tremor021
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/StarFleetCPTN/GoMFT
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
curl \
sudo \
mc \
sqlite3 \
rclone \
tzdata \
ca-certificates
msg_ok "Installed Dependencies"
msg_info "Setting up Golang"
set +o pipefail
temp_file=$(mktemp)
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
tar -C /usr/local -xzf "$temp_file"
ln -sf /usr/local/go/bin/go /usr/local/bin/go
set -o pipefail
msg_ok "Setup Golang"
msg_info "Setup ${APPLICATION}"
temp_file2=$(mktemp)
RELEASE=$(curl -s https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
wget -q "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file2
tar -xzf $temp_file2
mv GoMFT-${RELEASE}/ /opt/gomft
cd /opt/gomft
$STD go install github.com/a-h/templ/cmd/templ@latest
wget -q "https://github.com/StarFleetCPTN/GoMFT/releases/download/v${RELEASE}/gomft-v${RELEASE}-linux-amd64" -O gomft
$STD $HOME/go/bin/templ generate
chmod +x gomft
JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=')
cat <<EOF >/opt/gomft/.env
SERVER_ADDRESS=:8080
DATA_DIR=/opt/gomft/data/gomft
BACKUP_DIR=/opt/gomft/data/gomft/backups
JWT_SECRET=$JWT_SECRET_KEY
BASE_URL=http://localhost:8080
# Email configuration
EMAIL_ENABLED=false
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_FROM_EMAIL=gomft@example.com
EMAIL_FROM_NAME=GoMFT
EMAIL_REPLY_TO=
EMAIL_ENABLE_TLS=true
EMAIL_REQUIRE_AUTH=true
EMAIL_USERNAME=smtp_username
EMAIL_PASSWORD=smtp_password
EOF
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Setup ${APPLICATION}"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/gomft.service
[Unit]
Description=GoMFT Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/gomft
ExecStart=/opt/gomft/./gomft
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now gomft
msg_ok "Created Service"
motd_ssh
customize
# Cleanup
msg_info "Cleaning up"
rm -f $temp_file $temp_file2
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
motd_ssh
customize

View File

@ -1,111 +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 \
newt \
curl \
openssh \
tzdata \
nano \
gawk \
yq \
mc
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 -sL 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 -sSL 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 "Get NPMplus"
cd /opt
wget -q https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/compose.yaml
msg_ok "Get NPMplus"
attempts=0
while true; do
read -r -p "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 "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 "Starting NPMplus"
$STD docker compose up -d
CONTAINER_ID=$(docker ps --format "{{.ID}}" --filter "name=npmplus")
if [[ -z "$CONTAINER_ID" ]]; then
msg_error "NPMplus container not found."
fi
TIMEOUT=60
while [[ $TIMEOUT -gt 0 ]]; do
STATUS=$(docker inspect --format '{{.State.Health.Status}}' "$CONTAINER_ID" 2>/dev/null)
sleep 2
((TIMEOUT--))
done
if [[ "$STATUS" != "healthy" ]]; then
msg_error "NPMplus container did not reach a healthy state."
fi
msg_ok "Started NPMplus"
motd_ssh
customize
msg_info "Get Default Login (Patience)"
TIMEOUT=60
while [[ $TIMEOUT -gt 0 ]]; do
PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | awk '/Creating a new user:/ {print; exit}')
if [[ -n "$PASSWORD_LINE" ]]; then
PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}')
echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd
msg_ok "Saved default login to /opt/.npm_pwd"
break
fi
sleep 2
((TIMEOUT--))
done
if [[ $TIMEOUT -eq 0 ]]; then
msg_error "Failed to retrieve default login credentials."
fi

122
install/slskd-install.sh Normal file
View File

@ -0,0 +1,122 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: vhsdream
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
# Source: https://github.com/slskd/slskd/, https://soularr.net
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
curl \
sudo \
mc \
unzip \
python3-pip
msg_ok "Installed Dependencies"
msg_info "Setup ${APPLICATION}"
tmp_file=$(mktemp)
RELEASE=$(curl -s https://api.github.com/repos/slskd/slskd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
wget -q "https://github.com/slskd/slskd/releases/download/${RELEASE}/slskd-${RELEASE}-linux-x64.zip" -O $tmp_file
unzip -q $tmp_file -d /opt/${APPLICATION}
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
JWT_KEY=$(openssl rand -base64 44)
SLSKD_API_KEY=$(openssl rand -base64 44)
cp /opt/${APPLICATION}/config/slskd.example.yml /opt/${APPLICATION}/config/slskd.yml
sed -i \
-e "\|web:|,\|cidr|s|^#||" \
-e "\|https:|,\|5031|s|false|true|" \
-e "\|api_keys|,\|cidr|s|<some.*$|$SLSKD_API_KEY|; \
s|role: readonly|role: readwrite|; \
s|0.0.0.0/0,::/0|& # Replace this with your subnet|" \
-e "\|soulseek|,\|write_queue|s|^#||" \
-e "\|jwt:|,\|ttl|s|key: ~|key: $JWT_KEY|" \
/opt/${APPLICATION}/config/slskd.yml
msg_ok "Setup ${APPLICATION}"
msg_info "Installing Soularr"
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
cd /tmp
wget -q https://github.com/mrusse/soularr/archive/refs/heads/main.zip
unzip -q main.zip
mv soularr-main /opt/soularr
cd /opt/soularr
$STD pip install -r requirements.txt
sed -i \
-e "\|[Slskd]|,\|host_url|s|yourslskdapikeygoeshere|$SLSKD_API_KEY|" \
-e "/host_url/s/slskd/localhost/" \
/opt/soularr/config.ini
sed -i \
-e "/^#This\|^#Default\|^INTERVAL/{N;d;}" \
-e "\|python|s|app|opt/soularr|; s|python|python3|" \
-e "/dt/,+2d" \
/opt/soularr/run.sh
chmod +x /opt/soularr/run.sh
msg_ok "Installed Soularr"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/${APPLICATION}.service
[Unit]
Description=${APPLICATION} Service
After=network.target
Wants=network.target
[Service]
WorkingDirectory=/opt/${APPLICATION}
ExecStart=/opt/${APPLICATION}/slskd --config /opt/${APPLICATION}/config/slskd.yml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/soularr.timer
[Unit]
Description=Soularr service timer
RefuseManualStart=no
RefuseManualStop=no
[Timer]
Persistent=true
# run every 5 minutes
OnCalendar=*-*-* *:0/5:00
Unit=soularr.service
[Install]
WantedBy=timers.target
EOF
cat <<EOF >/etc/systemd/system/soularr.service
[Unit]
Description=Soularr service
After=network.target slskd.service
[Service]
Type=simple
WorkingDirectory=/opt/soularr
ExecStart=/bin/bash -c /opt/soularr/run.sh
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now ${APPLICATION}.service
systemctl enable -q soularr.timer
msg_ok "Created Services"
motd_ssh
customize
msg_info "Cleaning up"
rm -rf $tmp_file
rm -rf /tmp/main.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -0,0 +1 @@

View File

@ -1,40 +0,0 @@
{
"name": "Fluid-Calendar",
"slug": "fluid-calendar",
"categories": [
19,
0
],
"date_created": "2025-03-04",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": "https://github.com/dotnetfactory/fluid-calendar/tree/main/docs",
"website": "https://github.com/dotnetfactory/fluid-calendar",
"logo": "https://raw.githubusercontent.com/dotnetfactory/fluid-calendar/refs/heads/main/src/app/favicon.ico",
"description": "The open-source intelligent calendar that adapts to your workflow. Experience seamless task scheduling powered by AI, designed to make your time management effortless.",
"install_methods": [
{
"type": "default",
"script": "ct/fluid-calendar.sh",
"resources": {
"cpu": 3,
"ram": 4096,
"hdd": 7,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Creds: cat ~/fluid-calendar.creds",
"type": "info"
}
]
}

43
json/slskd.json Normal file
View File

@ -0,0 +1,43 @@
{
"name": "slskd",
"slug": "slskd",
"categories": [
11
],
"date_created": "2025-03-11",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 5030,
"documentation": "https://github.com/slskd/slskd/tree/master/docs",
"website": "https://github.com/slskd/slskd",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/slskd.png",
"description": "A modern client-server application for the Soulseek file sharing network. ",
"install_methods": [
{
"type": "default",
"script": "ct/slskd.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 4,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": "slskd",
"password": "slskd"
},
"notes": [
{
"text": "See /opt/slskd/config/sksld.yml to add your Soulseek credentials",
"type": "info"
},
{
"text": "This LXC includes Soularr; it needs to be configured (/opt/soularr/config.ini) before it will work",
"type": "info"
}
]
}

558
json/versions.json Normal file
View File

@ -0,0 +1,558 @@
[
{
"name": "msgbyte/tianji",
"version": "v1.18.21"
},
{
"name": "semaphoreui/semaphore",
"version": "v2.13.0-beta3"
},
{
"name": "usememos/memos",
"version": "v0.24.1"
},
{
"name": "morpheus65535/bazarr",
"version": "v1.5.1"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.1595"
},
{
"name": "openobserve/openobserve",
"version": "v0.14.5-rc3"
},
{
"name": "NodeBB/NodeBB",
"version": "v4.1.1"
},
{
"name": "VictoriaMetrics/VictoriaMetrics",
"version": "v1.16.0-victorialogs"
},
{
"name": "diced/zipline",
"version": "v4.0.1"
},
{
"name": "Threadfin/Threadfin",
"version": "1.2.30"
},
{
"name": "minio/minio",
"version": "RELEASE.2025-03-12T18-04-18Z"
},
{
"name": "glanceapp/glance",
"version": "v0.7.4"
},
{
"name": "keycloak/keycloak",
"version": "26.1.3"
},
{
"name": "zwave-js/zwave-js-ui",
"version": "v9.33.0"
},
{
"name": "zitadel/zitadel",
"version": "v2.71.2"
},
{
"name": "cockpit-project/cockpit",
"version": "335"
},
{
"name": "gotson/komga",
"version": "1.21.2"
},
{
"name": "ollama/ollama",
"version": "v0.6.0"
},
{
"name": "fallenbagel/jellyseerr",
"version": "preview-fix-proxy-undici-v7"
},
{
"name": "pocket-id/pocket-id",
"version": "v0.39.0"
},
{
"name": "benjaminjonard/koillection",
"version": "1.6.12"
},
{
"name": "excalidraw/excalidraw",
"version": "v0.18.0"
},
{
"name": "Ombi-app/Ombi",
"version": "v4.47.1"
},
{
"name": "mylar3/mylar3",
"version": "v0.8.2"
},
{
"name": "Stirling-Tools/Stirling-PDF",
"version": "v0.44.1"
},
{
"name": "stonith404/pingvin-share",
"version": "v1.10.3"
},
{
"name": "AdguardTeam/AdGuardHome",
"version": "v0.107.57"
},
{
"name": "Luligu/matterbridge",
"version": "2.2.4"
},
{
"name": "evcc-io/evcc",
"version": "0.200.9"
},
{
"name": "AlexxIT/go2rtc",
"version": "v1.9.9"
},
{
"name": "navidrome/navidrome",
"version": "v0.55.0"
},
{
"name": "clusterzx/paperless-ai",
"version": "v2.7.4"
},
{
"name": "Kareadita/Kavita",
"version": "v0.8.5.3"
},
{
"name": "YuukanOO/seelf",
"version": "v2.4.2"
},
{
"name": "umami-software/umami",
"version": "v2.17.0"
},
{
"name": "documenso/documenso",
"version": "v1.9.1-rc.9"
},
{
"name": "TriliumNext/Notes",
"version": "v0.91.6"
},
{
"name": "rogerfar/rdt-client",
"version": "v2.0.102"
},
{
"name": "homarr-labs/homarr",
"version": "v1.10.0"
},
{
"name": "prometheus/alertmanager",
"version": "v0.28.1"
},
{
"name": "hargata/lubelog",
"version": "v1.4.5"
},
{
"name": "ellite/Wallos",
"version": "v2.46.1"
},
{
"name": "Dolibarr/dolibarr",
"version": "21.0.0"
},
{
"name": "netbox-community/netbox",
"version": "v4.2.5"
},
{
"name": "henrygd/beszel",
"version": "v0.10.1"
},
{
"name": "open-webui/open-webui",
"version": "v0.5.20"
},
{
"name": "ipfs/kubo",
"version": "v0.33.2"
},
{
"name": "pocketbase/pocketbase",
"version": "v0.25.9"
},
{
"name": "matze/wastebin",
"version": "3.0.0"
},
{
"name": "immich-app/immich",
"version": "v1.129.0"
},
{
"name": "snipe/snipe-it",
"version": "v8.0.4"
},
{
"name": "toniebox-reverse-engineering/teddycloud",
"version": "tc_v0.6.4"
},
{
"name": "firefly-iii/firefly-iii",
"version": "develop-20250222.4"
},
{
"name": "go-gitea/gitea",
"version": "v1.23.5"
},
{
"name": "duplicati/duplicati",
"version": "v2.1.0.5_stable_2025-03-04"
},
{
"name": "bastienwirtz/homer",
"version": "v25.03.2"
},
{
"name": "sysadminsmedia/homebox",
"version": "v0.18.0"
},
{
"name": "Koenkk/zigbee2mqtt",
"version": "2.1.3"
},
{
"name": "heiher/hev-socks5-server",
"version": "2.8.0"
},
{
"name": "inspircd/inspircd",
"version": "v4.6.0"
},
{
"name": "tobychui/zoraxy",
"version": "v3.1.9"
},
{
"name": "grocy/grocy",
"version": "v4.4.2"
},
{
"name": "jhuckaby/Cronicle",
"version": "v0.9.76"
},
{
"name": "docmost/docmost",
"version": "v0.8.4"
},
{
"name": "BookStackApp/BookStack",
"version": "v25.02"
},
{
"name": "Part-DB/Part-DB-server",
"version": "v1.16.1"
},
{
"name": "prometheus/prometheus",
"version": "v3.2.1"
},
{
"name": "silverbulletmd/silverbullet",
"version": "0.10.4"
},
{
"name": "juanfont/headscale",
"version": "v0.25.1"
},
{
"name": "benzino77/tasmocompiler",
"version": "v12.5.0"
},
{
"name": "traefik/traefik",
"version": "v3.3.4"
},
{
"name": "schlagmichdoch/PairDrop",
"version": "v1.11.2"
},
{
"name": "advplyr/audiobookshelf",
"version": "v2.19.5"
},
{
"name": "Athou/commafeed",
"version": "5.6.1"
},
{
"name": "FreshRSS/FreshRSS",
"version": "1.26.0"
},
{
"name": "kimai/kimai",
"version": "2.30.0"
},
{
"name": "azukaar/Cosmos-Server",
"version": "v0.18.3"
},
{
"name": "wavelog/wavelog",
"version": "2.0.1"
},
{
"name": "docker/compose",
"version": "v2.33.1"
},
{
"name": "sabnzbd/sabnzbd",
"version": "4.4.1"
},
{
"name": "grafana/grafana",
"version": "v11.5.2"
},
{
"name": "gristlabs/grist-core",
"version": "v1.4.2"
},
{
"name": "prometheus-pve/prometheus-pve-exporter",
"version": "v3.5.2"
},
{
"name": "sbondCo/Watcharr",
"version": "v2.0.2"
},
{
"name": "authelia/authelia",
"version": "v4.38.19"
},
{
"name": "glpi-project/glpi",
"version": "10.0.18"
},
{
"name": "TasmoAdmin/TasmoAdmin",
"version": "v4.2.3"
},
{
"name": "dani-garcia/vaultwarden",
"version": "1.33.2"
},
{
"name": "blakeblackshear/frigate",
"version": "v0.15.0"
},
{
"name": "bluenviron/mediamtx",
"version": "v1.11.3"
},
{
"name": "actualbudget/actual-server",
"version": "v25.2.1"
},
{
"name": "NginxProxyManager/nginx-proxy-manager",
"version": "v2.12.3"
},
{
"name": "thomiceli/opengist",
"version": "v1.9.1"
},
{
"name": "Forceu/Gokapi",
"version": "v1.9.6"
},
{
"name": "hoarder-app/hoarder",
"version": "sdk/v0.22.0"
},
{
"name": "PrivateBin/PrivateBin",
"version": "1.7.6"
},
{
"name": "paperless-ngx/paperless-ngx",
"version": "v2.14.7"
},
{
"name": "hivemq/hivemq-community-edition",
"version": "2025.1"
},
{
"name": "Kozea/Radicale",
"version": "v3.4.1"
},
{
"name": "rustdesk/rustdesk-server",
"version": "1.1.14"
},
{
"name": "hansmi/prometheus-paperless-exporter",
"version": "v0.0.6"
},
{
"name": "donaldzou/WGDashboard",
"version": "v4.1.4"
},
{
"name": "0xERR0R/blocky",
"version": "v0.25"
},
{
"name": "linkwarden/linkwarden",
"version": "v2.9.3"
},
{
"name": "Tautulli/Tautulli",
"version": "v2.15.1"
},
{
"name": "traccar/traccar",
"version": "v6.6"
},
{
"name": "ErsatzTV/ErsatzTV",
"version": "v25.1.0"
},
{
"name": "seanmorley15/AdventureLog",
"version": "v0.8.0"
},
{
"name": "gethomepage/homepage",
"version": "v0.10.9"
},
{
"name": "MagicMirrorOrg/MagicMirror",
"version": "v2.30.0"
},
{
"name": "louislam/uptime-kuma",
"version": "2.0.0-beta.1"
},
{
"name": "pymedusa/Medusa",
"version": "v1.0.22"
},
{
"name": "Donkie/Spoolman",
"version": "v0.21.0"
},
{
"name": "phpipam/phpipam",
"version": "v1.7.3"
},
{
"name": "Bubka/2FAuth",
"version": "v5.4.3"
},
{
"name": "gotify/server",
"version": "v2.6.1"
},
{
"name": "janeczku/calibre-web",
"version": "0.6.24"
},
{
"name": "sabre-io/Baikal",
"version": "0.10.1"
},
{
"name": "caddyserver/xcaddy",
"version": "v0.4.4"
},
{
"name": "linuxserver/Heimdall",
"version": "v2.6.3"
},
{
"name": "aceberg/WatchYourLAN",
"version": "2.0.4"
},
{
"name": "Kometa-Team/Kometa",
"version": "v2.1.0"
},
{
"name": "FunkeyFlo/ps5-mqtt",
"version": "v1.4.0"
},
{
"name": "projectsend/projectsend",
"version": "r1720"
},
{
"name": "Pf2eToolsOrg/Pf2eTools",
"version": "v0.8.13"
},
{
"name": "Paymenter/Paymenter",
"version": "v0.9.5"
},
{
"name": "hywax/mafl",
"version": "v0.15.4"
},
{
"name": "FlareSolverr/FlareSolverr",
"version": "v3.3.21"
},
{
"name": "Suwayomi/Suwayomi-Server",
"version": "v1.1.1"
},
{
"name": "Forceu/barcodebuddy",
"version": "v1.8.1.8"
},
{
"name": "Lissy93/dashy",
"version": "3.1.1"
},
{
"name": "gnmyt/myspeed",
"version": "v1.0.9"
},
{
"name": "monicahq/monica",
"version": "v4.1.2"
},
{
"name": "thelounge/thelounge-deb",
"version": "v4.4.3"
},
{
"name": "wger-project/wger",
"version": "2.2"
},
{
"name": "sct/overseerr",
"version": "preview-test-node-18"
},
{
"name": "deepch/RTSPtoWeb",
"version": "v2.4.3"
},
{
"name": "searxng/searxng",
"version": "v1.0.0"
},
{
"name": "MediaBrowser/Emby",
"version": "3.5.2.0"
}
]

File diff suppressed because it is too large Load Diff