mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-24 22:15:56 +01:00
Compare commits
31 Commits
michelroeg
...
ci/check-n
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d9d6ea848 | ||
|
|
72eb8b9575 | ||
|
|
65a67347bd | ||
|
|
25d54ff69a | ||
|
|
5c85c5098e | ||
|
|
7b8080438d | ||
|
|
2041371a04 | ||
|
|
b172301e0f | ||
|
|
4b6cb1601b | ||
|
|
d9f766cca6 | ||
|
|
a4973fa3b7 | ||
|
|
dcbb8490f1 | ||
|
|
3aa5431302 | ||
|
|
2e753578cd | ||
|
|
483ead9a8b | ||
|
|
53ee9403cd | ||
|
|
ed7e71f8c3 | ||
|
|
97d4b3ffc2 | ||
|
|
e226386c9d | ||
|
|
4e7e348322 | ||
|
|
0920d56218 | ||
|
|
071420c39a | ||
|
|
6a7bc481a4 | ||
|
|
11fb4743cc | ||
|
|
b2a710e673 | ||
|
|
49f1f16cba | ||
|
|
8005ddd74f | ||
|
|
2fead98966 | ||
|
|
09de4e9ca9 | ||
|
|
e1815642b2 | ||
|
|
75da6920d5 |
341
.github/workflows/check-node-versions.yml
generated
vendored
Normal file
341
.github/workflows/check-node-versions.yml
generated
vendored
Normal file
@@ -0,0 +1,341 @@
|
||||
name: Check Node.js Version Drift
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# Runs weekly on Monday at 06:00 UTC
|
||||
- cron: "0 6 * * 1"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
check-node-versions:
|
||||
if: github.repository == 'community-scripts/ProxmoxVE'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y -qq jq curl > /dev/null 2>&1
|
||||
|
||||
- name: Check upstream Node.js versions
|
||||
id: check
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "================================================"
|
||||
echo " Checking Node.js version drift in install scripts"
|
||||
echo "================================================"
|
||||
|
||||
# Alpine version -> Node major cache (populated on demand)
|
||||
declare -A ALPINE_NODE_CACHE
|
||||
|
||||
# Resolve Node.js major version from Alpine package registry
|
||||
# Usage: resolve_alpine_node "3.21" => sets REPLY to major version (e.g. "22")
|
||||
resolve_alpine_node() {
|
||||
local alpine_ver="$1"
|
||||
if [[ -n "${ALPINE_NODE_CACHE[$alpine_ver]+x}" ]]; then
|
||||
REPLY="${ALPINE_NODE_CACHE[$alpine_ver]}"
|
||||
return
|
||||
fi
|
||||
|
||||
local url="https://pkgs.alpinelinux.org/package/v${alpine_ver}/main/x86_64/nodejs"
|
||||
local page
|
||||
page=$(curl -sf "$url" 2>/dev/null || echo "")
|
||||
local full_ver=""
|
||||
if [[ -n "$page" ]]; then
|
||||
# Parse: "Version | 24.13.0-r1" or similar table row
|
||||
full_ver=$(echo "$page" | grep -oP 'Version\s*\|\s*\K[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
||||
if [[ -z "$full_ver" ]]; then
|
||||
# Fallback: look for version pattern after "Version"
|
||||
full_ver=$(echo "$page" | grep -oP '(?<=Version</td><td>)[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
|
||||
fi
|
||||
fi
|
||||
|
||||
local major=""
|
||||
if [[ -n "$full_ver" ]]; then
|
||||
major="${full_ver%%.*}"
|
||||
fi
|
||||
|
||||
ALPINE_NODE_CACHE[$alpine_ver]="$major"
|
||||
REPLY="$major"
|
||||
}
|
||||
|
||||
# Extract Node major from a Dockerfile content
|
||||
# Sets: DF_NODE_MAJOR, DF_SOURCE (description of where we found it)
|
||||
extract_dockerfile_node() {
|
||||
local content="$1"
|
||||
DF_NODE_MAJOR=""
|
||||
DF_SOURCE=""
|
||||
|
||||
# 1) FROM node:XX (e.g. node:24-alpine, node:22.9.0-bookworm-slim, node:20)
|
||||
local node_from
|
||||
node_from=$(echo "$content" | grep -oP '(?i)FROM\s+(--platform=[^\s]+\s+)?node:\K[0-9]+' | head -1 || echo "")
|
||||
if [[ -n "$node_from" ]]; then
|
||||
DF_NODE_MAJOR="$node_from"
|
||||
DF_SOURCE="FROM node:${node_from}"
|
||||
return
|
||||
fi
|
||||
|
||||
# 2) nodesource/setup_XX.x
|
||||
local nodesource
|
||||
nodesource=$(echo "$content" | grep -oP 'nodesource/setup_\K[0-9]+' | head -1 || echo "")
|
||||
if [[ -n "$nodesource" ]]; then
|
||||
DF_NODE_MAJOR="$nodesource"
|
||||
DF_SOURCE="nodesource/setup_${nodesource}.x"
|
||||
return
|
||||
fi
|
||||
|
||||
# 3) FROM alpine:X.Y — resolve via Alpine packages
|
||||
local alpine_ver
|
||||
alpine_ver=$(echo "$content" | grep -oP '(?i)FROM\s+(--platform=[^\s]+\s+)?alpine:\K[0-9]+\.[0-9]+' | head -1 || echo "")
|
||||
if [[ -n "$alpine_ver" ]]; then
|
||||
resolve_alpine_node "$alpine_ver"
|
||||
if [[ -n "$REPLY" ]]; then
|
||||
DF_NODE_MAJOR="$REPLY"
|
||||
DF_SOURCE="alpine:${alpine_ver} (pkg: nodejs ${DF_NODE_MAJOR})"
|
||||
return
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Extract Node major from engines.node in package.json
|
||||
# Sets: ENGINES_NODE_RAW (raw string), ENGINES_MIN_MAJOR
|
||||
extract_engines_node() {
|
||||
local content="$1"
|
||||
ENGINES_NODE_RAW=""
|
||||
ENGINES_MIN_MAJOR=""
|
||||
|
||||
ENGINES_NODE_RAW=$(echo "$content" | jq -r '.engines.node // empty' 2>/dev/null || echo "")
|
||||
if [[ -z "$ENGINES_NODE_RAW" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Extract the first number (major) from the constraint
|
||||
# Handles: ">=24.13.1", "^22", ">=18.0.0", ">=18.15.0 <19 || ^20", etc.
|
||||
ENGINES_MIN_MAJOR=$(echo "$ENGINES_NODE_RAW" | grep -oP '\d+' | head -1 || echo "")
|
||||
}
|
||||
|
||||
# Collect results
|
||||
declare -a issue_scripts=()
|
||||
declare -a report_lines=()
|
||||
total=0
|
||||
checked=0
|
||||
drift_count=0
|
||||
|
||||
for script in install/*-install.sh; do
|
||||
[[ ! -f "$script" ]] && continue
|
||||
if ! grep -q 'setup_nodejs' "$script"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
total=$((total + 1))
|
||||
slug=$(basename "$script" | sed 's/-install\.sh$//')
|
||||
|
||||
# Extract Source URL (GitHub only)
|
||||
source_url=$(head -20 "$script" | grep -oP '(?<=# Source: )https://github\.com/[^\s]+' | head -1 || echo "")
|
||||
if [[ -z "$source_url" ]]; then
|
||||
report_lines+=("| \`$slug\` | — | — | — | — | ⏭️ No GitHub source |")
|
||||
continue
|
||||
fi
|
||||
|
||||
repo=$(echo "$source_url" | sed -E 's|https://github\.com/||; s|/$||; s|\.git$||')
|
||||
if [[ -z "$repo" || "$repo" != */* ]]; then
|
||||
report_lines+=("| \`$slug\` | — | — | — | — | ⏭️ Invalid repo |")
|
||||
continue
|
||||
fi
|
||||
|
||||
checked=$((checked + 1))
|
||||
|
||||
# Extract our NODE_VERSION
|
||||
our_version=$(grep -oP 'NODE_VERSION="(\d+)"' "$script" | head -1 | grep -oP '\d+' || echo "")
|
||||
if [[ -z "$our_version" ]]; then
|
||||
if grep -q 'NODE_VERSION=\$(' "$script"; then
|
||||
our_version="dynamic"
|
||||
else
|
||||
our_version="unset"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fetch upstream Dockerfile
|
||||
df_content=""
|
||||
for branch in main master dev; do
|
||||
df_content=$(curl -sf "https://raw.githubusercontent.com/${repo}/${branch}/Dockerfile" 2>/dev/null || echo "")
|
||||
[[ -n "$df_content" ]] && break
|
||||
done
|
||||
|
||||
DF_NODE_MAJOR=""
|
||||
DF_SOURCE=""
|
||||
if [[ -n "$df_content" ]]; then
|
||||
extract_dockerfile_node "$df_content"
|
||||
fi
|
||||
|
||||
# Fetch upstream package.json
|
||||
pkg_content=""
|
||||
for branch in main master dev; do
|
||||
pkg_content=$(curl -sf "https://raw.githubusercontent.com/${repo}/${branch}/package.json" 2>/dev/null || echo "")
|
||||
[[ -n "$pkg_content" ]] && break
|
||||
done
|
||||
|
||||
ENGINES_NODE_RAW=""
|
||||
ENGINES_MIN_MAJOR=""
|
||||
if [[ -n "$pkg_content" ]]; then
|
||||
extract_engines_node "$pkg_content"
|
||||
fi
|
||||
|
||||
# Determine upstream recommended major version
|
||||
upstream_major=""
|
||||
upstream_hint=""
|
||||
|
||||
if [[ -n "$DF_NODE_MAJOR" ]]; then
|
||||
upstream_major="$DF_NODE_MAJOR"
|
||||
upstream_hint="$DF_SOURCE"
|
||||
elif [[ -n "$ENGINES_MIN_MAJOR" ]]; then
|
||||
upstream_major="$ENGINES_MIN_MAJOR"
|
||||
upstream_hint="engines: $ENGINES_NODE_RAW"
|
||||
fi
|
||||
|
||||
# Build display values
|
||||
engines_display="${ENGINES_NODE_RAW:-—}"
|
||||
dockerfile_display="${DF_SOURCE:-—}"
|
||||
|
||||
# Compare
|
||||
status="✅"
|
||||
if [[ "$our_version" == "dynamic" ]]; then
|
||||
status="🔄 Dynamic"
|
||||
elif [[ "$our_version" == "unset" ]]; then
|
||||
status="⚠️ NODE_VERSION not set"
|
||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||
drift_count=$((drift_count + 1))
|
||||
elif [[ -n "$upstream_major" && "$our_version" != "$upstream_major" ]]; then
|
||||
status="🔸 Drift → upstream=$upstream_major ($upstream_hint)"
|
||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||
drift_count=$((drift_count + 1))
|
||||
fi
|
||||
|
||||
report_lines+=("| \`$slug\` | $our_version | $engines_display | $dockerfile_display | [$repo](https://github.com/$repo) | $status |")
|
||||
|
||||
# Rate-limit to avoid GitHub secondary rate limits
|
||||
sleep 0.3
|
||||
|
||||
done
|
||||
|
||||
# Print summary
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo " Total scripts with setup_nodejs: $total"
|
||||
echo " Checked (with GitHub source): $checked"
|
||||
echo " Version drift detected: $drift_count"
|
||||
echo "========================================="
|
||||
|
||||
# Export
|
||||
{
|
||||
echo "drift_count=$drift_count"
|
||||
echo "total=$total"
|
||||
echo "checked=$checked"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Save issue details for next step
|
||||
printf '%s\n' "${issue_scripts[@]}" > /tmp/drift_scripts.txt 2>/dev/null || touch /tmp/drift_scripts.txt
|
||||
|
||||
# Save full report
|
||||
{
|
||||
echo "## Node.js Version Drift Report"
|
||||
echo ""
|
||||
echo "**Generated:** $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||||
echo "**Scripts checked:** $total | **With GitHub source:** $checked | **Drift detected:** $drift_count"
|
||||
echo ""
|
||||
echo "| Script | Our Version | engines.node | Dockerfile | Upstream Repo | Status |"
|
||||
echo "|--------|-------------|-------------|------------|---------------|--------|"
|
||||
printf '%s\n' "${report_lines[@]}" | sort
|
||||
} > /tmp/drift_report.md
|
||||
|
||||
cat /tmp/drift_report.md
|
||||
|
||||
- name: Create or update summary issue
|
||||
if: steps.check.outputs.drift_count != '0'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
TITLE="[Automated] Node.js Version Drift Report"
|
||||
DATE=$(date -u +%Y-%m-%d)
|
||||
DRIFT_COUNT="${{ steps.check.outputs.drift_count }}"
|
||||
TOTAL="${{ steps.check.outputs.total }}"
|
||||
CHECKED="${{ steps.check.outputs.checked }}"
|
||||
|
||||
# Build checklist from drift data
|
||||
CHECKLIST=""
|
||||
while IFS='|' read -r slug our_version upstream_major upstream_hint repo; do
|
||||
[[ -z "$slug" ]] && continue
|
||||
CHECKLIST+="- [ ] **\`${slug}\`** — ours: \`${our_version}\` → upstream: \`${upstream_major}\` (${upstream_hint}) — [repo](https://github.com/${repo})"$'\n'
|
||||
done < /tmp/drift_scripts.txt
|
||||
|
||||
# Build full report table
|
||||
REPORT=$(cat /tmp/drift_report.md)
|
||||
|
||||
BODY=$(cat <<ISSUE_EOF
|
||||
## Node.js Version Drift Report — ${DATE}
|
||||
|
||||
**${DRIFT_COUNT}** script(s) with version drift detected (out of ${CHECKED} checked / ${TOTAL} total).
|
||||
|
||||
### Scripts requiring investigation
|
||||
|
||||
${CHECKLIST}
|
||||
|
||||
### How to resolve
|
||||
|
||||
1. Check upstream Dockerfile / package.json to confirm the required Node.js version
|
||||
2. Test the script with the new Node version
|
||||
3. Update \`NODE_VERSION\` in \`install/<slug>-install.sh\`
|
||||
4. Update \`NODE_VERSION\` in \`ct/<slug>.sh\` (update section) if applicable
|
||||
5. Check off the item above once done
|
||||
|
||||
<details>
|
||||
<summary>Full report</summary>
|
||||
|
||||
${REPORT}
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
*This issue is automatically created/updated weekly by the Node.js version drift check workflow.*
|
||||
*Last updated: ${DATE}*
|
||||
ISSUE_EOF
|
||||
)
|
||||
|
||||
# Check if a matching open issue already exists
|
||||
EXISTING=$(gh issue list --state open --label "automated,dependencies" --search "\"[Automated] Node.js Version Drift Report\"" --json number --jq '.[0].number // empty' 2>/dev/null || echo "")
|
||||
|
||||
if [[ -n "$EXISTING" ]]; then
|
||||
gh issue edit "$EXISTING" --body "$BODY"
|
||||
echo "Updated existing issue #$EXISTING"
|
||||
else
|
||||
gh issue create \
|
||||
--title "$TITLE" \
|
||||
--body "$BODY" \
|
||||
--label "automated,dependencies"
|
||||
echo "Created new summary issue"
|
||||
fi
|
||||
|
||||
- name: Close issue if no drift
|
||||
if: steps.check.outputs.drift_count == '0'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
EXISTING=$(gh issue list --state open --label "automated,dependencies" --search "\"[Automated] Node.js Version Drift Report\"" --json number --jq '.[0].number // empty' 2>/dev/null || echo "")
|
||||
if [[ -n "$EXISTING" ]]; then
|
||||
gh issue close "$EXISTING" --comment "All Node.js versions are in sync with upstream. Closing automatically."
|
||||
echo "Closed issue #$EXISTING"
|
||||
fi
|
||||
111
.github/workflows/stale_pr_close.yml
generated
vendored
Normal file
111
.github/workflows/stale_pr_close.yml
generated
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
name: Stale PR Management
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * *"
|
||||
workflow_dispatch:
|
||||
pull_request_target:
|
||||
types:
|
||||
- labeled
|
||||
|
||||
jobs:
|
||||
stale-prs:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
issues: write
|
||||
contents: read
|
||||
steps:
|
||||
- name: Handle stale PRs
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const now = new Date();
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
|
||||
// --- When stale label is added, comment immediately ---
|
||||
if (context.eventName === "pull_request_target" && context.payload.action === "labeled") {
|
||||
const label = context.payload.label?.name;
|
||||
if (label === "stale") {
|
||||
const author = context.payload.pull_request.user.login;
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: context.payload.pull_request.number,
|
||||
body: `@${author} This PR has been marked as stale. It will be closed if no new commits are added in 7 days.`
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Scheduled run: check all stale PRs ---
|
||||
const { data: prs } = await github.rest.pulls.list({
|
||||
owner,
|
||||
repo,
|
||||
state: "open",
|
||||
per_page: 100
|
||||
});
|
||||
|
||||
for (const pr of prs) {
|
||||
const hasStale = pr.labels.some(l => l.name === "stale");
|
||||
if (!hasStale) continue;
|
||||
|
||||
// Get timeline events to find when stale label was added
|
||||
const { data: events } = await github.rest.issues.listEvents({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: pr.number,
|
||||
per_page: 100
|
||||
});
|
||||
|
||||
// Find the most recent time the stale label was added
|
||||
const staleLabelEvents = events
|
||||
.filter(e => e.event === "labeled" && e.label?.name === "stale")
|
||||
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
|
||||
|
||||
if (staleLabelEvents.length === 0) continue;
|
||||
|
||||
const staleLabelDate = new Date(staleLabelEvents[0].created_at);
|
||||
const daysSinceStale = (now - staleLabelDate) / (1000 * 60 * 60 * 24);
|
||||
|
||||
// Check for new commits since stale label was added
|
||||
const { data: commits } = await github.rest.pulls.listCommits({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pr.number
|
||||
});
|
||||
|
||||
const lastCommitDate = new Date(commits[commits.length - 1].commit.author.date);
|
||||
const author = pr.user.login;
|
||||
|
||||
// If there are new commits after the stale label, remove it
|
||||
if (lastCommitDate > staleLabelDate) {
|
||||
await github.rest.issues.removeLabel({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: pr.number,
|
||||
name: "stale"
|
||||
});
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: pr.number,
|
||||
body: `@${author} Recent activity detected. Removing stale label.`
|
||||
});
|
||||
}
|
||||
// If 7 days have passed since stale label, close the PR
|
||||
else if (daysSinceStale > 7) {
|
||||
await github.rest.pulls.update({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pr.number,
|
||||
state: "closed"
|
||||
});
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: pr.number,
|
||||
body: `@${author} Closing stale PR due to inactivity (no commits for 7 days after stale label).`
|
||||
});
|
||||
}
|
||||
}
|
||||
31
CHANGELOG.md
31
CHANGELOG.md
@@ -407,19 +407,48 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-02-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- adds further documentation during the installation script. [@d12rio](https://github.com/d12rio) ([#12248](https://github.com/community-scripts/ProxmoxVE/pull/12248))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Firefly: PHP bump [@tremor021](https://github.com/tremor021) ([#12247](https://github.com/community-scripts/ProxmoxVE/pull/12247))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- make searxng updateable [@shtefko](https://github.com/shtefko) ([#12207](https://github.com/community-scripts/ProxmoxVE/pull/12207))
|
||||
|
||||
### 📂 Github
|
||||
|
||||
- add: workflow to close stale PRs [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12243](https://github.com/community-scripts/ProxmoxVE/pull/12243))
|
||||
|
||||
## 2026-02-23
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- SparkyFitness ([#12185](https://github.com/community-scripts/ProxmoxVE/pull/12185))
|
||||
- SeaweedFS ([#12220](https://github.com/community-scripts/ProxmoxVE/pull/12220))
|
||||
- Sonobarr ([#12221](https://github.com/community-scripts/ProxmoxVE/pull/12221))
|
||||
- SparkyFitness ([#12185](https://github.com/community-scripts/ProxmoxVE/pull/12185))
|
||||
- Frigate v16.4 [@MickLesk](https://github.com/MickLesk) ([#11887](https://github.com/community-scripts/ProxmoxVE/pull/11887))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- memos: unpin version due new release artifacts [@MickLesk](https://github.com/MickLesk) ([#12224](https://github.com/community-scripts/ProxmoxVE/pull/12224))
|
||||
- core: Enhance signal handling, reported "status" and logs [@MickLesk](https://github.com/MickLesk) ([#12216](https://github.com/community-scripts/ProxmoxVE/pull/12216))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- booklore v2: embed frontend, bump Java to 25, remove nginx [@MickLesk](https://github.com/MickLesk) ([#12223](https://github.com/community-scripts/ProxmoxVE/pull/12223))
|
||||
|
||||
### 🗑️ Deleted Scripts
|
||||
|
||||
- Remove: Huntarr (deprecated & Security) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12226](https://github.com/community-scripts/ProxmoxVE/pull/12226))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
@@ -30,7 +30,7 @@ function update_script() {
|
||||
fi
|
||||
|
||||
if check_for_gh_release "booklore" "booklore-app/BookLore"; then
|
||||
JAVA_VERSION="21" setup_java
|
||||
JAVA_VERSION="25" setup_java
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
setup_mariadb
|
||||
setup_yq
|
||||
@@ -60,11 +60,16 @@ function update_script() {
|
||||
$STD npm run build --configuration=production
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Embedding Frontend into Backend"
|
||||
mkdir -p /opt/booklore/booklore-api/src/main/resources/static
|
||||
cp -r /opt/booklore/booklore-ui/dist/booklore/browser/* /opt/booklore/booklore-api/src/main/resources/static/
|
||||
msg_ok "Embedded Frontend into Backend"
|
||||
|
||||
msg_info "Building Backend"
|
||||
cd /opt/booklore/booklore-api
|
||||
APP_VERSION=$(get_latest_github_release "booklore-app/BookLore")
|
||||
yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
|
||||
$STD ./gradlew clean build --no-daemon
|
||||
$STD ./gradlew clean build -x test --no-daemon
|
||||
mkdir -p /opt/booklore/dist
|
||||
JAR_PATH=$(find /opt/booklore/booklore-api/build/libs -maxdepth 1 -type f -name "booklore-api-*.jar" ! -name "*plain*" | head -n1)
|
||||
if [[ -z "$JAR_PATH" ]]; then
|
||||
@@ -74,9 +79,22 @@ function update_script() {
|
||||
cp "$JAR_PATH" /opt/booklore/dist/app.jar
|
||||
msg_ok "Built Backend"
|
||||
|
||||
if systemctl is-active --quiet nginx 2>/dev/null; then
|
||||
msg_info "Removing Nginx (no longer needed)"
|
||||
systemctl disable --now nginx
|
||||
$STD apt-get purge -y nginx nginx-common
|
||||
msg_ok "Removed Nginx"
|
||||
fi
|
||||
|
||||
if ! grep -q "^SERVER_PORT=" /opt/booklore_storage/.env 2>/dev/null; then
|
||||
echo "SERVER_PORT=6060" >>/opt/booklore_storage/.env
|
||||
fi
|
||||
|
||||
sed -i 's|ExecStart=/usr/bin/java -jar|ExecStart=/usr/bin/java -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompactObjectHeaders -jar|' /etc/systemd/system/booklore.service
|
||||
systemctl daemon-reload
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start booklore
|
||||
systemctl reload nginx
|
||||
rm -rf /opt/booklore_bak
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
|
||||
@@ -28,7 +28,10 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
setup_mariadb
|
||||
PHP_VERSION="8.5" PHP_APACHE="YES" setup_php
|
||||
|
||||
if check_for_gh_release "firefly" "firefly-iii/firefly-iii"; then
|
||||
systemctl stop apache2
|
||||
cp /opt/firefly/.env /opt/.env
|
||||
|
||||
6
ct/headers/seaweedfs
Normal file
6
ct/headers/seaweedfs
Normal file
@@ -0,0 +1,6 @@
|
||||
_____ _____________
|
||||
/ ___/___ ____ __ _____ ___ ____/ / ____/ ___/
|
||||
\__ \/ _ \/ __ `/ | /| / / _ \/ _ \/ __ / /_ \__ \
|
||||
___/ / __/ /_/ /| |/ |/ / __/ __/ /_/ / __/ ___/ /
|
||||
/____/\___/\__,_/ |__/|__/\___/\___/\__,_/_/ /____/
|
||||
|
||||
6
ct/headers/sonobarr
Normal file
6
ct/headers/sonobarr
Normal file
@@ -0,0 +1,6 @@
|
||||
__
|
||||
_________ ____ ____ / /_ ____ ___________
|
||||
/ ___/ __ \/ __ \/ __ \/ __ \/ __ `/ ___/ ___/
|
||||
(__ ) /_/ / / / / /_/ / /_/ / /_/ / / / /
|
||||
/____/\____/_/ /_/\____/_.___/\__,_/_/ /_/
|
||||
|
||||
@@ -27,12 +27,12 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if check_for_gh_release "memos" "usememos/memos" "v0.25.3"; then
|
||||
if check_for_gh_release "memos" "usememos/memos"; then
|
||||
msg_info "Stopping service"
|
||||
systemctl stop memos
|
||||
msg_ok "Service stopped"
|
||||
|
||||
fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "v0.25.3" "/opt/memos" "memos*linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_amd64.tar.gz"
|
||||
|
||||
msg_info "Starting service"
|
||||
systemctl start memos
|
||||
|
||||
@@ -27,12 +27,33 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_ok "There is currently no update available."
|
||||
# sed -i 's/^\([[:space:]]*limiter:\)[[:space:]]*true/\1 false/' /etc/searxng/settings.yml
|
||||
# if cd /usr/local/searxng/searxng-src && git pull | grep -q 'Already up to date'; then
|
||||
# msg_ok "There is currently no update available."
|
||||
# fi
|
||||
exit
|
||||
|
||||
chown -R searxng:searxng /usr/local/searxng/searxng-src
|
||||
if su -s /bin/bash -c "git -C /usr/local/searxng/searxng-src pull" searxng | grep -q 'Already up to date'; then
|
||||
msg_ok "There is currently no update available."
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating SearXNG installation"
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop searxng
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating SearXNG"
|
||||
$STD su -s /bin/bash searxng -c '
|
||||
python3 -m venv /usr/local/searxng/searx-pyenv &&
|
||||
. /usr/local/searxng/searx-pyenv/bin/activate &&
|
||||
pip install -U pip setuptools wheel pyyaml lxml msgspec typing_extensions &&
|
||||
pip install --use-pep517 --no-build-isolation -e /usr/local/searxng/searxng-src
|
||||
'
|
||||
msg_ok "Updated SearXNG"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start searxng
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
start
|
||||
build_container
|
||||
|
||||
55
ct/seaweedfs.sh
Normal file
55
ct/seaweedfs.sh
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/seaweedfs/seaweedfs
|
||||
|
||||
APP="SeaweedFS"
|
||||
var_tags="${var_tags:-storage;s3;filesystem}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-16}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_fuse="${var_fuse:-yes}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -f /opt/seaweedfs/weed ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "seaweedfs" "seaweedfs/seaweedfs"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop seaweedfs
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start seaweedfs
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
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}:9333${CL}"
|
||||
63
ct/sonobarr.sh
Normal file
63
ct/sonobarr.sh
Normal file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: GoldenSpringness
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Dodelidoo-Labs/sonobarr
|
||||
|
||||
APP="sonobarr"
|
||||
var_tags="${var_tags:-music;discovery}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
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/sonobarr" ]]; then
|
||||
msg_error "No sonobarr Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
if check_for_gh_release "sonobarr" "Dodelidoo-Labs/sonobarr"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop sonobarr
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "sonobarr" "Dodelidoo-Labs/sonobarr" "tarball"
|
||||
|
||||
msg_info "Updating sonobarr"
|
||||
$STD uv venv -c /opt/sonobarr/venv
|
||||
$STD source /opt/sonobarr/venv/bin/activate
|
||||
$STD uv pip install --no-cache-dir -r /opt/sonobarr/requirements.txt
|
||||
sed -i "/release_version/s/=.*/=$(cat ~/.sonobarr)/" /etc/sonobarr/.env
|
||||
msg_ok "Updated sonobarr"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start sonobarr
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}sonobarr setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-02-23T12:14:19Z",
|
||||
"generated": "2026-02-24T06:23:39Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -25,9 +25,9 @@
|
||||
{
|
||||
"slug": "adventurelog",
|
||||
"repo": "seanmorley15/adventurelog",
|
||||
"version": "v0.11.0",
|
||||
"version": "v0.12.0",
|
||||
"pinned": false,
|
||||
"date": "2025-09-01T16:19:38Z"
|
||||
"date": "2026-02-23T14:06:45Z"
|
||||
},
|
||||
{
|
||||
"slug": "alpine-redlib",
|
||||
@@ -151,9 +151,9 @@
|
||||
{
|
||||
"slug": "booklore",
|
||||
"repo": "booklore-app/BookLore",
|
||||
"version": "v1.18.5",
|
||||
"version": "v2.0.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-24T17:15:32Z"
|
||||
"date": "2026-02-24T04:15:33Z"
|
||||
},
|
||||
{
|
||||
"slug": "bookstack",
|
||||
@@ -200,9 +200,9 @@
|
||||
{
|
||||
"slug": "cleanuparr",
|
||||
"repo": "Cleanuparr/Cleanuparr",
|
||||
"version": "v2.7.1",
|
||||
"version": "v2.7.4",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T09:58:13Z"
|
||||
"date": "2026-02-23T18:41:16Z"
|
||||
},
|
||||
{
|
||||
"slug": "cloudreve",
|
||||
@@ -228,9 +228,9 @@
|
||||
{
|
||||
"slug": "configarr",
|
||||
"repo": "raydak-labs/configarr",
|
||||
"version": "v1.22.0",
|
||||
"version": "v1.23.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-20T21:55:46Z"
|
||||
"date": "2026-02-23T12:28:13Z"
|
||||
},
|
||||
{
|
||||
"slug": "convertx",
|
||||
@@ -249,9 +249,9 @@
|
||||
{
|
||||
"slug": "cronicle",
|
||||
"repo": "jhuckaby/Cronicle",
|
||||
"version": "v0.9.106",
|
||||
"version": "v0.9.107",
|
||||
"pinned": false,
|
||||
"date": "2026-02-11T17:11:46Z"
|
||||
"date": "2026-02-23T17:48:27Z"
|
||||
},
|
||||
{
|
||||
"slug": "cronmaster",
|
||||
@@ -382,9 +382,9 @@
|
||||
{
|
||||
"slug": "firefly",
|
||||
"repo": "firefly-iii/firefly-iii",
|
||||
"version": "v6.4.23",
|
||||
"version": "v6.5.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-20T07:02:05Z"
|
||||
"date": "2026-02-23T19:19:00Z"
|
||||
},
|
||||
{
|
||||
"slug": "fladder",
|
||||
@@ -438,9 +438,9 @@
|
||||
{
|
||||
"slug": "ghostfolio",
|
||||
"repo": "ghostfolio/ghostfolio",
|
||||
"version": "2.242.0",
|
||||
"version": "2.243.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-22T10:01:44Z"
|
||||
"date": "2026-02-23T19:31:36Z"
|
||||
},
|
||||
{
|
||||
"slug": "gitea",
|
||||
@@ -452,9 +452,9 @@
|
||||
{
|
||||
"slug": "gitea-mirror",
|
||||
"repo": "RayLabsHQ/gitea-mirror",
|
||||
"version": "v3.9.2",
|
||||
"version": "v3.9.4",
|
||||
"pinned": false,
|
||||
"date": "2025-11-08T05:36:48Z"
|
||||
"date": "2026-02-24T06:17:56Z"
|
||||
},
|
||||
{
|
||||
"slug": "glance",
|
||||
@@ -582,13 +582,6 @@
|
||||
"pinned": false,
|
||||
"date": "2025-12-23T14:53:51Z"
|
||||
},
|
||||
{
|
||||
"slug": "huntarr",
|
||||
"repo": "plexguide/Huntarr.io",
|
||||
"version": "9.4.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T08:46:37Z"
|
||||
},
|
||||
{
|
||||
"slug": "immich-public-proxy",
|
||||
"repo": "alangrainger/immich-public-proxy",
|
||||
@@ -620,9 +613,9 @@
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.1184",
|
||||
"version": "v0.24.1193",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T05:55:36Z"
|
||||
"date": "2026-02-24T05:58:04Z"
|
||||
},
|
||||
{
|
||||
"slug": "jellystat",
|
||||
@@ -865,9 +858,9 @@
|
||||
{
|
||||
"slug": "memos",
|
||||
"repo": "usememos/memos",
|
||||
"version": "v0.25.3",
|
||||
"pinned": true,
|
||||
"date": "2025-11-25T15:40:41Z"
|
||||
"version": "v0.26.2",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T13:28:34Z"
|
||||
},
|
||||
{
|
||||
"slug": "metube",
|
||||
@@ -1124,9 +1117,9 @@
|
||||
{
|
||||
"slug": "planka",
|
||||
"repo": "plankanban/planka",
|
||||
"version": "v2.0.1",
|
||||
"version": "v2.0.2",
|
||||
"pinned": false,
|
||||
"date": "2026-02-17T15:26:55Z"
|
||||
"date": "2026-02-23T17:47:15Z"
|
||||
},
|
||||
{
|
||||
"slug": "plant-it",
|
||||
@@ -1145,9 +1138,9 @@
|
||||
{
|
||||
"slug": "pocketid",
|
||||
"repo": "pocket-id/pocket-id",
|
||||
"version": "v2.2.0",
|
||||
"version": "v2.3.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-11T15:01:07Z"
|
||||
"date": "2026-02-23T19:50:48Z"
|
||||
},
|
||||
{
|
||||
"slug": "privatebin",
|
||||
@@ -1250,9 +1243,9 @@
|
||||
{
|
||||
"slug": "qui",
|
||||
"repo": "autobrr/qui",
|
||||
"version": "v1.14.0",
|
||||
"version": "v1.14.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-21T22:23:46Z"
|
||||
"date": "2026-02-23T13:13:31Z"
|
||||
},
|
||||
{
|
||||
"slug": "radarr",
|
||||
@@ -1278,9 +1271,9 @@
|
||||
{
|
||||
"slug": "rdtclient",
|
||||
"repo": "rogerfar/rdt-client",
|
||||
"version": "v2.0.123",
|
||||
"version": "v2.0.124",
|
||||
"pinned": false,
|
||||
"date": "2026-02-21T23:08:13Z"
|
||||
"date": "2026-02-24T03:18:03Z"
|
||||
},
|
||||
{
|
||||
"slug": "reactive-resume",
|
||||
@@ -1352,6 +1345,13 @@
|
||||
"pinned": false,
|
||||
"date": "2026-02-12T14:20:56Z"
|
||||
},
|
||||
{
|
||||
"slug": "seaweedfs",
|
||||
"repo": "seaweedfs/seaweedfs",
|
||||
"version": "4.13",
|
||||
"pinned": false,
|
||||
"date": "2026-02-17T01:09:45Z"
|
||||
},
|
||||
{
|
||||
"slug": "seelf",
|
||||
"repo": "YuukanOO/seelf",
|
||||
@@ -1404,16 +1404,16 @@
|
||||
{
|
||||
"slug": "snipeit",
|
||||
"repo": "grokability/snipe-it",
|
||||
"version": "v8.3.7",
|
||||
"version": "v8.4.0",
|
||||
"pinned": false,
|
||||
"date": "2025-12-12T09:13:40Z"
|
||||
"date": "2026-02-23T20:59:43Z"
|
||||
},
|
||||
{
|
||||
"slug": "snowshare",
|
||||
"repo": "TuroYT/snowshare",
|
||||
"version": "v1.3.6",
|
||||
"version": "v1.3.7",
|
||||
"pinned": false,
|
||||
"date": "2026-02-19T11:06:29Z"
|
||||
"date": "2026-02-23T15:51:39Z"
|
||||
},
|
||||
{
|
||||
"slug": "sonarr",
|
||||
@@ -1422,6 +1422,13 @@
|
||||
"pinned": false,
|
||||
"date": "2025-11-05T01:56:48Z"
|
||||
},
|
||||
{
|
||||
"slug": "sonobarr",
|
||||
"repo": "Dodelidoo-Labs/sonobarr",
|
||||
"version": "0.11.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-21T19:07:21Z"
|
||||
},
|
||||
{
|
||||
"slug": "speedtest-tracker",
|
||||
"repo": "alexjustesen/speedtest-tracker",
|
||||
@@ -1446,9 +1453,9 @@
|
||||
{
|
||||
"slug": "stirling-pdf",
|
||||
"repo": "Stirling-Tools/Stirling-PDF",
|
||||
"version": "v2.5.2",
|
||||
"version": "v2.5.3",
|
||||
"pinned": false,
|
||||
"date": "2026-02-20T23:20:20Z"
|
||||
"date": "2026-02-23T23:23:39Z"
|
||||
},
|
||||
{
|
||||
"slug": "streamlink-webui",
|
||||
@@ -1558,9 +1565,9 @@
|
||||
{
|
||||
"slug": "traefik",
|
||||
"repo": "traefik/traefik",
|
||||
"version": "v3.6.8",
|
||||
"version": "v3.6.9",
|
||||
"pinned": false,
|
||||
"date": "2026-02-11T16:44:37Z"
|
||||
"date": "2026-02-23T17:21:17Z"
|
||||
},
|
||||
{
|
||||
"slug": "trilium",
|
||||
@@ -1572,9 +1579,9 @@
|
||||
{
|
||||
"slug": "trip",
|
||||
"repo": "itskovacs/TRIP",
|
||||
"version": "1.40.0",
|
||||
"version": "1.41.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-10T20:12:53Z"
|
||||
"date": "2026-02-23T17:57:31Z"
|
||||
},
|
||||
{
|
||||
"slug": "tududi",
|
||||
@@ -1586,9 +1593,9 @@
|
||||
{
|
||||
"slug": "tunarr",
|
||||
"repo": "chrisbenincasa/tunarr",
|
||||
"version": "v1.1.15",
|
||||
"version": "v1.1.16",
|
||||
"pinned": false,
|
||||
"date": "2026-02-19T23:51:17Z"
|
||||
"date": "2026-02-23T21:24:47Z"
|
||||
},
|
||||
{
|
||||
"slug": "uhf",
|
||||
@@ -1635,9 +1642,9 @@
|
||||
{
|
||||
"slug": "vaultwarden",
|
||||
"repo": "dani-garcia/vaultwarden",
|
||||
"version": "1.35.3",
|
||||
"version": "1.35.4",
|
||||
"pinned": false,
|
||||
"date": "2026-02-10T20:37:03Z"
|
||||
"date": "2026-02-23T21:43:25Z"
|
||||
},
|
||||
{
|
||||
"slug": "victoriametrics",
|
||||
@@ -1733,16 +1740,16 @@
|
||||
{
|
||||
"slug": "wishlist",
|
||||
"repo": "cmintey/wishlist",
|
||||
"version": "v0.60.0",
|
||||
"version": "v0.60.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-10T04:05:26Z"
|
||||
"date": "2026-02-24T04:01:37Z"
|
||||
},
|
||||
{
|
||||
"slug": "wizarr",
|
||||
"repo": "wizarrrr/wizarr",
|
||||
"version": "v2025.12.0",
|
||||
"version": "v2026.2.0",
|
||||
"pinned": false,
|
||||
"date": "2025-12-09T14:30:23Z"
|
||||
"date": "2026-02-23T19:25:28Z"
|
||||
},
|
||||
{
|
||||
"slug": "writefreely",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
],
|
||||
"date_created": "2025-08-26",
|
||||
"type": "ct",
|
||||
"updateable": false,
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 8888,
|
||||
"documentation": "https://docs.searxng.org/",
|
||||
|
||||
48
frontend/public/json/seaweedfs.json
Normal file
48
frontend/public/json/seaweedfs.json
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "SeaweedFS",
|
||||
"slug": "seaweedfs",
|
||||
"categories": [
|
||||
11
|
||||
],
|
||||
"date_created": "2026-02-23",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 9333,
|
||||
"documentation": "https://github.com/seaweedfs/seaweedfs/wiki",
|
||||
"website": "https://seaweedfs.com/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/seaweedfs.webp",
|
||||
"config_path": "",
|
||||
"description": "SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lakes, with O(1) disk seek, S3 API, FUSE mount, WebDAV, and cloud tiering support.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/seaweedfs.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 16,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Master UI available at port 9333, Filer UI at port 8888, S3 API at port 8333.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Data is stored in /opt/seaweedfs-data.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "FUSE mounting requires fuse3 (pre-installed).",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
40
frontend/public/json/sonobarr.json
Normal file
40
frontend/public/json/sonobarr.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "Sonobarr",
|
||||
"slug": "sonobarr",
|
||||
"categories": [
|
||||
14
|
||||
],
|
||||
"date_created": "2026-02-23",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 5000,
|
||||
"documentation": "https://github.com/Dodelidoo-Labs/sonobarr",
|
||||
"config_path": "/etc/sonobarr/.env",
|
||||
"website": "https://github.com/Dodelidoo-Labs/sonobarr",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/sonobarr.webp",
|
||||
"description": "Sonobarr marries your existing Lidarr library with Last.fm’s discovery graph to surface artists you'll actually like. It runs as a Flask + Socket.IO application, ships with a polished Bootstrap UI, and includes admin tooling so folks can share a single instance safely.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/sonobarr.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 20,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Default generated admin password is in the env file (sonobarr_superadmin_password)",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -13,11 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
JAVA_VERSION="21" setup_java
|
||||
JAVA_VERSION="25" setup_java
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
setup_mariadb
|
||||
setup_yq
|
||||
@@ -30,6 +26,11 @@ $STD npm install --force
|
||||
$STD npm run build --configuration=production
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Embedding Frontend into Backend"
|
||||
mkdir -p /opt/booklore/booklore-api/src/main/resources/static
|
||||
cp -r /opt/booklore/booklore-ui/dist/booklore/browser/* /opt/booklore/booklore-api/src/main/resources/static/
|
||||
msg_ok "Embedded Frontend into Backend"
|
||||
|
||||
msg_info "Creating Environment"
|
||||
mkdir -p /opt/booklore_storage/{data,books,bookdrop}
|
||||
cat <<EOF >/opt/booklore_storage/.env
|
||||
@@ -41,6 +42,7 @@ DATABASE_PASSWORD=${MARIADB_DB_PASS}
|
||||
# App Configuration (Spring Boot mapping from app.* properties)
|
||||
APP_PATH_CONFIG=/opt/booklore_storage/data
|
||||
APP_BOOKDROP_FOLDER=/opt/booklore_storage/bookdrop
|
||||
SERVER_PORT=6060
|
||||
EOF
|
||||
msg_ok "Created Environment"
|
||||
|
||||
@@ -48,7 +50,7 @@ msg_info "Building Backend"
|
||||
cd /opt/booklore/booklore-api
|
||||
APP_VERSION=$(get_latest_github_release "booklore-app/BookLore")
|
||||
yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
|
||||
$STD ./gradlew clean build --no-daemon
|
||||
$STD ./gradlew clean build -x test --no-daemon
|
||||
mkdir -p /opt/booklore/dist
|
||||
JAR_PATH=$(find /opt/booklore/booklore-api/build/libs -maxdepth 1 -type f -name "booklore-api-*.jar" ! -name "*plain*" | head -n1)
|
||||
if [[ -z "$JAR_PATH" ]]; then
|
||||
@@ -58,16 +60,6 @@ fi
|
||||
cp "$JAR_PATH" /opt/booklore/dist/app.jar
|
||||
msg_ok "Built Backend"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
rm -rf /usr/share/nginx/html
|
||||
ln -s /opt/booklore/booklore-ui/dist/booklore/browser /usr/share/nginx/html
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
cp /opt/booklore/nginx.conf /etc/nginx/nginx.conf
|
||||
sed -i 's/listen \${BOOKLORE_PORT};/listen 6060;/' /etc/nginx/nginx.conf
|
||||
sed -i 's/listen \[::\]:${BOOKLORE_PORT};/listen [::]:6060;/' /etc/nginx/nginx.conf
|
||||
systemctl restart nginx
|
||||
msg_ok "Configured Nginx"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/booklore.service
|
||||
[Unit]
|
||||
@@ -78,7 +70,7 @@ After=network.target mariadb.service
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/booklore/dist
|
||||
ExecStart=/usr/bin/java -jar /opt/booklore/dist/app.jar
|
||||
ExecStart=/usr/bin/java -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompactObjectHeaders -jar /opt/booklore/dist/app.jar
|
||||
EnvironmentFile=/opt/booklore_storage/.env
|
||||
SuccessExitStatus=143
|
||||
TimeoutStopSec=10
|
||||
|
||||
@@ -21,6 +21,8 @@ msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||
|
||||
echo "${TAB3}It is important to choose the name for your server before you install Synapse, because it cannot be changed later."
|
||||
echo "${TAB3}The server name determines the “domain” part of user-ids for users on your server: these will all be of the format @user:my.domain.name. It also determines how other matrix servers will reach yours for federation."
|
||||
read -p "${TAB3}Please enter the name for your server: " servername
|
||||
|
||||
msg_info "Installing Element Synapse"
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
PHP_VERSION="8.4" PHP_APACHE="YES" setup_php
|
||||
PHP_VERSION="8.5" PHP_APACHE="YES" setup_php
|
||||
setup_composer
|
||||
setup_mariadb
|
||||
MARIADB_DB_NAME="firefly" MARIADB_DB_USER="firefly" setup_mariadb_db
|
||||
|
||||
@@ -14,7 +14,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "v0.25.3" "/opt/memos" "memos*linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_amd64.tar.gz"
|
||||
mkdir -p /opt/memos_data
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
50
install/seaweedfs-install.sh
Normal file
50
install/seaweedfs-install.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/seaweedfs/seaweedfs
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y fuse3
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
|
||||
|
||||
msg_info "Setting up SeaweedFS"
|
||||
mkdir -p /opt/seaweedfs-data
|
||||
ln -sf /opt/seaweedfs/weed /usr/local/bin/weed
|
||||
msg_ok "Set up SeaweedFS"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/seaweedfs.service
|
||||
[Unit]
|
||||
Description=SeaweedFS Server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/seaweedfs
|
||||
ExecStart=/opt/seaweedfs/weed server -dir=/opt/seaweedfs-data -master.port=9333 -volume.port=8080 -filer -s3
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
LimitNOFILE=65536
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now seaweedfs
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
52
install/sonobarr-install.sh
Normal file
52
install/sonobarr-install.sh
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: GoldenSpringness
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Dodelidoo-Labs/sonobarr
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "sonobarr" "Dodelidoo-Labs/sonobarr" "tarball"
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
|
||||
msg_info "Setting up sonobarr"
|
||||
$STD uv venv -c /opt/sonobarr/venv
|
||||
source /opt/sonobarr/venv/bin/activate
|
||||
$STD uv pip install --no-cache-dir -r /opt/sonobarr/requirements.txt
|
||||
mkdir -p /etc/sonobarr
|
||||
mv /opt/sonobarr/.sample-env /etc/sonobarr/.env
|
||||
sed -i "s/^secret_key=.*/secret_key=$(openssl rand -hex 16)/" /etc/sonobarr/.env
|
||||
sed -i "s/^sonobarr_superadmin_password=.*/sonobarr_superadmin_password=$(openssl rand -hex 16)/" /etc/sonobarr/.env
|
||||
echo "release_version=$(cat ~/.sonobarr)" >>/etc/sonobarr/.env
|
||||
echo "sonobarr_config_dir=/etc/sonobarr" >>/etc/sonobarr.env
|
||||
msg_ok "Set up sonobarr"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/sonobarr.service
|
||||
[Unit]
|
||||
Description=sonobarr Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/sonobarr/src
|
||||
EnvironmentFile=/etc/sonobarr/.env
|
||||
Environment="PATH=/opt/sonobarr/venv/bin"
|
||||
ExecStart=/bin/bash -c 'gunicorn Sonobarr:app -c ../gunicorn_config.py'
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now sonobarr
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
Reference in New Issue
Block a user