mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-04 12:23:26 +01:00
Compare commits
70 Commits
fix/versio
...
tremor021-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42cba92275 | ||
|
|
715159895b | ||
|
|
eb5de9173a | ||
|
|
8dc80b2b7e | ||
|
|
e2abb46c86 | ||
|
|
ab5e8cbd7c | ||
|
|
69e563afb5 | ||
|
|
22acb9d728 | ||
|
|
6fc6bab1bf | ||
|
|
c1ad36718e | ||
|
|
e3b796b842 | ||
|
|
d2f02c2ba0 | ||
|
|
94b9190e07 | ||
|
|
09b343d150 | ||
|
|
c464b95fa3 | ||
|
|
24ddcb9d97 | ||
|
|
a5aa55ffad | ||
|
|
2412a45a20 | ||
|
|
1b87ec7bfd | ||
|
|
84966410ed | ||
|
|
cc70f84d27 | ||
|
|
1c4c95723b | ||
|
|
b67a82123e | ||
|
|
33a531960e | ||
|
|
8ab722fb7c | ||
|
|
3294c58713 | ||
|
|
845aebd654 | ||
|
|
dd2def9384 | ||
|
|
82740302bc | ||
|
|
610509e834 | ||
|
|
aed241fdc4 | ||
|
|
e0fb69b6c3 | ||
|
|
c3c8384f69 | ||
|
|
99d13903f3 | ||
|
|
25ecb12060 | ||
|
|
5a5dd8ae87 | ||
|
|
42a3a68ce2 | ||
|
|
44f5656a56 | ||
|
|
27bcc09b0c | ||
|
|
47d63e92bf | ||
|
|
03216e05ac | ||
|
|
5ba96bb3f2 | ||
|
|
8e7dc349ac | ||
|
|
e1f02bfa77 | ||
|
|
b013dcb1e3 | ||
|
|
89645dcd92 | ||
|
|
718219fec3 | ||
|
|
97138713b4 | ||
|
|
620bf7ee66 | ||
|
|
f52c90b26b | ||
|
|
af53a669c7 | ||
|
|
cca0d9e584 | ||
|
|
56e97764ac | ||
|
|
bac7f07a74 | ||
|
|
ce4d2350ef | ||
|
|
90f7020826 | ||
|
|
393bc4a7e4 | ||
|
|
89cbd21e17 | ||
|
|
eb6bd65415 | ||
|
|
5623969bb9 | ||
|
|
a6e7939fce | ||
|
|
fd3e6196cc | ||
|
|
910723c745 | ||
|
|
6267250e49 | ||
|
|
b35437c391 | ||
|
|
032dfacce2 | ||
|
|
0ace1009ad | ||
|
|
2938bb29f5 | ||
|
|
ba9618eabd | ||
|
|
c7669c39c3 |
76
.github/workflows/lock-issue.yaml
generated
vendored
Normal file
76
.github/workflows/lock-issue.yaml
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
name: Lock closed issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *" # Run daily at midnight
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Lock old issues and PRs
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const daysBeforeLock = 3;
|
||||||
|
const cutoffDate = new Date('2026-01-27T00:00:00Z');
|
||||||
|
const lockDate = new Date();
|
||||||
|
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
||||||
|
|
||||||
|
// Exclude patterns (case-insensitive)
|
||||||
|
const excludePatterns = [
|
||||||
|
/automated pr/i,
|
||||||
|
/\[bot\]/i,
|
||||||
|
/dependabot/i
|
||||||
|
];
|
||||||
|
|
||||||
|
// Search for closed, unlocked issues older than 3 days
|
||||||
|
const issues = await github.rest.search.issuesAndPullRequests({
|
||||||
|
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
|
||||||
|
per_page: 50
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Found ${issues.data.items.length} issues/PRs to process`);
|
||||||
|
|
||||||
|
for (const item of issues.data.items) {
|
||||||
|
// Skip excluded items
|
||||||
|
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
|
||||||
|
if (shouldExclude) {
|
||||||
|
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const createdAt = new Date(item.created_at);
|
||||||
|
const isNew = createdAt >= cutoffDate;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Add comment only for new issues (created after 2026-01-27)
|
||||||
|
if (isNew) {
|
||||||
|
const comment = item.pull_request
|
||||||
|
? 'This pull request has been automatically locked. Please open a new issue for related bugs.'
|
||||||
|
: 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.';
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
...context.repo,
|
||||||
|
issue_number: item.number,
|
||||||
|
body: comment
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lock the issue/PR
|
||||||
|
await github.rest.issues.lock({
|
||||||
|
...context.repo,
|
||||||
|
issue_number: item.number,
|
||||||
|
lock_reason: 'resolved'
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`Failed to lock #${item.number}: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
58
CHANGELOG.md
58
CHANGELOG.md
@@ -391,10 +391,60 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 2026-01-28
|
## 2026-01-30
|
||||||
|
|
||||||
|
## 2026-01-29
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Alpine-Valkey [@MickLesk](https://github.com/MickLesk) ([#11320](https://github.com/community-scripts/ProxmoxVE/pull/11320))
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Immich: Pin version to 2.5.2 [@vhsdream](https://github.com/vhsdream) ([#11335](https://github.com/community-scripts/ProxmoxVE/pull/11335))
|
||||||
|
- Kollection: Update to php 8.5 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11315](https://github.com/community-scripts/ProxmoxVE/pull/11315))
|
||||||
|
- Notifiarr: change installation check from apt to systemd service [@MickLesk](https://github.com/MickLesk) ([#11319](https://github.com/community-scripts/ProxmoxVE/pull/11319))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- [FEAT] Immich: Enable Maintenance Mode before update [@vhsdream](https://github.com/vhsdream) ([#11342](https://github.com/community-scripts/ProxmoxVE/pull/11342))
|
||||||
|
- jellyfin: add logrotate instead of reducing log level [@MickLesk](https://github.com/MickLesk) ([#11326](https://github.com/community-scripts/ProxmoxVE/pull/11326))
|
||||||
|
- core: Add config file handling options | Fix Vikunja update with interactive overwrite [@MickLesk](https://github.com/MickLesk) ([#11317](https://github.com/community-scripts/ProxmoxVE/pull/11317))
|
||||||
|
- Immich: v2.5.0 [@vhsdream](https://github.com/vhsdream) ([#11240](https://github.com/community-scripts/ProxmoxVE/pull/11240))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- fix: vikunja v1 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11308](https://github.com/community-scripts/ProxmoxVE/pull/11308))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Byparr [@vhsdream](https://github.com/vhsdream) ([#11338](https://github.com/community-scripts/ProxmoxVE/pull/11338))
|
||||||
|
- cloudflare: Remove deprecated DNS-over-HTTPS proxy option [@MickLesk](https://github.com/MickLesk) ([#11068](https://github.com/community-scripts/ProxmoxVE/pull/11068))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- build.func: Replace storage variable with searchdomain variable [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11322](https://github.com/community-scripts/ProxmoxVE/pull/11322))
|
||||||
|
|
||||||
|
### 📂 Github
|
||||||
|
|
||||||
|
- Add workflow to lock closed issues [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11316](https://github.com/community-scripts/ProxmoxVE/pull/11316))
|
||||||
|
|
||||||
|
## 2026-01-28
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- nodecast-tv ([#11287](https://github.com/community-scripts/ProxmoxVE/pull/11287))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Ubuntu 25.04 VM - Change default start from yes to no [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11292](https://github.com/community-scripts/ProxmoxVE/pull/11292))
|
||||||
|
|
||||||
- #### ✨ New Features
|
- #### ✨ New Features
|
||||||
|
|
||||||
- various scripts: use setup_meilisearch function [@MickLesk](https://github.com/MickLesk) ([#11259](https://github.com/community-scripts/ProxmoxVE/pull/11259))
|
- various scripts: use setup_meilisearch function [@MickLesk](https://github.com/MickLesk) ([#11259](https://github.com/community-scripts/ProxmoxVE/pull/11259))
|
||||||
@@ -407,6 +457,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- core: sed patch for ram [@lavacano](https://github.com/lavacano) ([#11285](https://github.com/community-scripts/ProxmoxVE/pull/11285))
|
||||||
|
- Fix installer loop caused by invalid whiptail menu separator [@Mesteriis](https://github.com/Mesteriis) ([#11237](https://github.com/community-scripts/ProxmoxVE/pull/11237))
|
||||||
- core: fix Debian 13 LXC template root ownership bug [@MickLesk](https://github.com/MickLesk) ([#11277](https://github.com/community-scripts/ProxmoxVE/pull/11277))
|
- core: fix Debian 13 LXC template root ownership bug [@MickLesk](https://github.com/MickLesk) ([#11277](https://github.com/community-scripts/ProxmoxVE/pull/11277))
|
||||||
- tools.func: prevent systemd-tmpfiles failure in unprivileged LXC during deb install [@MickLesk](https://github.com/MickLesk) ([#11271](https://github.com/community-scripts/ProxmoxVE/pull/11271))
|
- tools.func: prevent systemd-tmpfiles failure in unprivileged LXC during deb install [@MickLesk](https://github.com/MickLesk) ([#11271](https://github.com/community-scripts/ProxmoxVE/pull/11271))
|
||||||
- tools.func: fix php "wait_for" hint [@MickLesk](https://github.com/MickLesk) ([#11254](https://github.com/community-scripts/ProxmoxVE/pull/11254))
|
- tools.func: fix php "wait_for" hint [@MickLesk](https://github.com/MickLesk) ([#11254](https://github.com/community-scripts/ProxmoxVE/pull/11254))
|
||||||
@@ -422,6 +474,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
### 🌐 Website
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Frontend: use github-versions.json for version display [@MickLesk](https://github.com/MickLesk) ([#11281](https://github.com/community-scripts/ProxmoxVE/pull/11281))
|
||||||
|
|
||||||
- #### 📝 Script Information
|
- #### 📝 Script Information
|
||||||
|
|
||||||
- fix: homarr: conf location [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11253](https://github.com/community-scripts/ProxmoxVE/pull/11253))
|
- fix: homarr: conf location [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11253](https://github.com/community-scripts/ProxmoxVE/pull/11253))
|
||||||
|
|||||||
73
ct/alpine-valkey.sh
Normal file
73
ct/alpine-valkey.sh
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#!/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: pshankinclarke (lazarillo)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://valkey.io/
|
||||||
|
|
||||||
|
APP="Alpine-Valkey"
|
||||||
|
var_tags="${var_tags:-alpine;database}"
|
||||||
|
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.23}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
if ! apk -e info newt >/dev/null 2>&1; then
|
||||||
|
apk add -q newt
|
||||||
|
fi
|
||||||
|
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
while true; do
|
||||||
|
CHOICE=$(
|
||||||
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Valkey Management" --menu "Select option" 11 58 3 \
|
||||||
|
"1" "Update Valkey" \
|
||||||
|
"2" "Allow 0.0.0.0 for listening" \
|
||||||
|
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
|
||||||
|
)
|
||||||
|
exit_status=$?
|
||||||
|
if [ $exit_status == 1 ]; then
|
||||||
|
clear
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
header_info
|
||||||
|
case $CHOICE in
|
||||||
|
1)
|
||||||
|
msg_info "Updating Valkey"
|
||||||
|
apk update && apk upgrade valkey
|
||||||
|
rc-service valkey restart
|
||||||
|
msg_ok "Updated Valkey"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
msg_info "Setting Valkey to listen on all interfaces"
|
||||||
|
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
|
||||||
|
rc-service valkey restart
|
||||||
|
msg_ok "Valkey now listens on all interfaces!"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
msg_info "Setting Valkey to listen only on ${LXCIP}"
|
||||||
|
sed -i "s/^bind .*/bind ${LXCIP}/" /etc/valkey/valkey.conf
|
||||||
|
rc-service valkey restart
|
||||||
|
msg_ok "Valkey now listens only on ${LXCIP}!"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable on port 6379.
|
||||||
|
${BL}valkey-cli -h ${IP} -p 6379${CL} \n"
|
||||||
48
ct/byparr.sh
48
ct/byparr.sh
@@ -35,6 +35,54 @@ function update_script() {
|
|||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Byparr" "ThePhaseless/Byparr" "tarball" "latest"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Byparr" "ThePhaseless/Byparr" "tarball" "latest"
|
||||||
|
|
||||||
|
if ! dpkg -l | grep -q ffmpeg; then
|
||||||
|
msg_info "Installing dependencies"
|
||||||
|
$STD apt install -y --no-install-recommends \
|
||||||
|
ffmpeg \
|
||||||
|
libatk1.0-0 \
|
||||||
|
libcairo-gobject2 \
|
||||||
|
libcairo2 \
|
||||||
|
libdbus-glib-1-2 \
|
||||||
|
libfontconfig1 \
|
||||||
|
libfreetype6 \
|
||||||
|
libgdk-pixbuf-xlib-2.0-0 \
|
||||||
|
libglib2.0-0 \
|
||||||
|
libgtk-3-0 \
|
||||||
|
libpango-1.0-0 \
|
||||||
|
libpangocairo-1.0-0 \
|
||||||
|
libpangoft2-1.0-0 \
|
||||||
|
libx11-6 \
|
||||||
|
libx11-xcb1 \
|
||||||
|
libxcb-shm0 \
|
||||||
|
libxcb1 \
|
||||||
|
libxcomposite1 \
|
||||||
|
libxcursor1 \
|
||||||
|
libxdamage1 \
|
||||||
|
libxext6 \
|
||||||
|
libxfixes3 \
|
||||||
|
libxi6 \
|
||||||
|
libxrender1 \
|
||||||
|
libxt6 \
|
||||||
|
libxtst6 \
|
||||||
|
xvfb \
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
fonts-unifont \
|
||||||
|
xfonts-cyrillic \
|
||||||
|
xfonts-scalable \
|
||||||
|
fonts-liberation \
|
||||||
|
fonts-ipafont-gothic \
|
||||||
|
fonts-wqy-zenhei \
|
||||||
|
fonts-tlwg-loma-otf
|
||||||
|
$STD apt autoremove -y chromium
|
||||||
|
msg_ok "Installed dependencies"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Configuring Byparr"
|
||||||
|
cd /opt/Byparr
|
||||||
|
$STD uv sync --link-mode copy
|
||||||
|
$STD uv run camoufox fetch
|
||||||
|
msg_ok "Configured Byparr"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start byparr
|
systemctl start byparr
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
6
ct/headers/alpine-valkey
Normal file
6
ct/headers/alpine-valkey
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
___ __ _ _ __ ____
|
||||||
|
/ | / /___ (_)___ ___ | | / /___ _/ / /_____ __ __
|
||||||
|
/ /| | / / __ \/ / __ \/ _ \_____| | / / __ `/ / //_/ _ \/ / / /
|
||||||
|
/ ___ |/ / /_/ / / / / / __/_____/ |/ / /_/ / / ,< / __/ /_/ /
|
||||||
|
/_/ |_/_/ .___/_/_/ /_/\___/ |___/\__,_/_/_/|_|\___/\__, /
|
||||||
|
/_/ /____/
|
||||||
6
ct/headers/nodecast-tv
Normal file
6
ct/headers/nodecast-tv
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ __ __
|
||||||
|
____ ____ ____/ /__ _________ ______/ /_ / /__ __
|
||||||
|
/ __ \/ __ \/ __ / _ \/ ___/ __ `/ ___/ __/_____/ __/ | / /
|
||||||
|
/ / / / /_/ / /_/ / __/ /__/ /_/ (__ ) /_/_____/ /_ | |/ /
|
||||||
|
/_/ /_/\____/\__,_/\___/\___/\__,_/____/\__/ \__/ |___/
|
||||||
|
|
||||||
33
ct/immich.sh
33
ct/immich.sh
@@ -68,7 +68,7 @@ EOF
|
|||||||
if [[ ! -f /etc/apt/sources.list.d/mise.list ]]; then
|
if [[ ! -f /etc/apt/sources.list.d/mise.list ]]; then
|
||||||
msg_info "Installing Mise"
|
msg_info "Installing Mise"
|
||||||
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" | tee /etc/apt/sources.list.d/mise.list
|
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt install -y mise
|
$STD apt install -y mise
|
||||||
msg_ok "Installed Mise"
|
msg_ok "Installed Mise"
|
||||||
@@ -112,8 +112,16 @@ EOF
|
|||||||
msg_ok "Image-processing libraries up to date"
|
msg_ok "Image-processing libraries up to date"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="2.4.1"
|
RELEASE="2.5.2"
|
||||||
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
||||||
|
if [[ $(cat ~/.immich) > "2.5.1" ]]; then
|
||||||
|
msg_info "Enabling Maintenance Mode"
|
||||||
|
cd /opt/immich/app/bin
|
||||||
|
$STD bash ./immich-admin enable-maintenance-mode
|
||||||
|
export MAINT_MODE=1
|
||||||
|
$STD cd -
|
||||||
|
msg_ok "Enabled Maintenance Mode"
|
||||||
|
fi
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop immich-web
|
systemctl stop immich-web
|
||||||
systemctl stop immich-ml
|
systemctl stop immich-ml
|
||||||
@@ -167,7 +175,7 @@ EOF
|
|||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v${RELEASE}" "$SRC_DIR"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v${RELEASE}" "$SRC_DIR"
|
||||||
|
|
||||||
msg_info "Updating ${APP} web and microservices"
|
msg_info "Updating Immich web and microservices"
|
||||||
cd "$SRC_DIR"/server
|
cd "$SRC_DIR"/server
|
||||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
||||||
export CI=1
|
export CI=1
|
||||||
@@ -209,7 +217,7 @@ EOF
|
|||||||
mkdir -p "$PLUGIN_DIR"
|
mkdir -p "$PLUGIN_DIR"
|
||||||
cp -r ./dist "$PLUGIN_DIR"/dist
|
cp -r ./dist "$PLUGIN_DIR"/dist
|
||||||
cp ./manifest.json "$PLUGIN_DIR"
|
cp ./manifest.json "$PLUGIN_DIR"
|
||||||
msg_ok "Updated ${APP} server, web, cli and plugins"
|
msg_ok "Updated Immich server, web, cli and plugins"
|
||||||
|
|
||||||
cd "$SRC_DIR"/machine-learning
|
cd "$SRC_DIR"/machine-learning
|
||||||
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
|
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
|
||||||
@@ -217,12 +225,13 @@ EOF
|
|||||||
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
|
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
|
||||||
if [[ -f ~/.openvino ]]; then
|
if [[ -f ~/.openvino ]]; then
|
||||||
msg_info "Updating HW-accelerated machine-learning"
|
msg_info "Updating HW-accelerated machine-learning"
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --active -n -p python3.11 --managed-python
|
$STD uv add --no-sync --optional openvino onnxruntime-openvino==1.20.0 --active -n -p python3.12 --managed-python
|
||||||
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.11/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-311-x86_64-linux-gnu.so"
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p python3.12 --managed-python
|
||||||
|
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.12/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-312-x86_64-linux-gnu.so"
|
||||||
msg_ok "Updated HW-accelerated machine-learning"
|
msg_ok "Updated HW-accelerated machine-learning"
|
||||||
else
|
else
|
||||||
msg_info "Updating machine-learning"
|
msg_info "Updating machine-learning"
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --active -n -p python3.11 --managed-python
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --no-dev --active --link-mode copy -n -p python3.11 --managed-python
|
||||||
msg_ok "Updated machine-learning"
|
msg_ok "Updated machine-learning"
|
||||||
fi
|
fi
|
||||||
cd "$SRC_DIR"
|
cd "$SRC_DIR"
|
||||||
@@ -241,8 +250,16 @@ EOF
|
|||||||
ln -s "$GEO_DIR" "$APP_DIR"
|
ln -s "$GEO_DIR" "$APP_DIR"
|
||||||
|
|
||||||
chown -R immich:immich "$INSTALL_DIR"
|
chown -R immich:immich "$INSTALL_DIR"
|
||||||
msg_ok "Updated ${APP} to v${RELEASE}"
|
if [[ "$MAINT_MODE" == 1 ]]; then
|
||||||
|
msg_info "Disabling Maintenance Mode"
|
||||||
|
cd /opt/immich/app/bin
|
||||||
|
$STD bash ./immich-admin disable-maintenance-mode
|
||||||
|
unset MAINT_MODE
|
||||||
|
$STD cd -
|
||||||
|
msg_ok "Disabled Maintenance Mode"
|
||||||
|
fi
|
||||||
systemctl restart immich-ml immich-web
|
systemctl restart immich-ml immich-web
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ function update_script() {
|
|||||||
systemctl stop apache2
|
systemctl stop apache2
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
PHP_VERSION="8.5" PHP_APACHE="YES" PHP_MODULE="apcu,ctype,dom,fileinfo,iconv,pgsql" setup_php
|
||||||
|
|
||||||
msg_info "Creating a backup"
|
msg_info "Creating a backup"
|
||||||
mv /opt/koillection/ /opt/koillection-backup
|
mv /opt/koillection/ /opt/koillection-backup
|
||||||
msg_ok "Backup created"
|
msg_ok "Backup created"
|
||||||
|
|||||||
60
ct/nodecast-tv.sh
Normal file
60
ct/nodecast-tv.sh
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/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: luismco
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/technomancer702/nodecast-tv
|
||||||
|
|
||||||
|
APP="nodecast-tv"
|
||||||
|
var_tags="${var_tags:-media}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
var_gpu="${var_gpu:-yes}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/nodecast-tv ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "nodecast-tv" "technomancer702/nodecast-tv"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop nodecast-tv
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
|
||||||
|
|
||||||
|
msg_info "Updating Modules"
|
||||||
|
cd /opt/nodecast-tv
|
||||||
|
$STD npm install
|
||||||
|
msg_ok "Updated Modules"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start nodecast-tv
|
||||||
|
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}:3000${CL}"
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -f /etc/apt/sources.list.d/golift.list ]]; then
|
if [[ ! -f /usr/lib/systemd/system/notifiarr.service ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -28,8 +28,6 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
setup_meilisearch
|
|
||||||
|
|
||||||
if check_for_gh_release "openarchiver" "LogicLabs-OU/OpenArchiver"; then
|
if check_for_gh_release "openarchiver" "LogicLabs-OU/OpenArchiver"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop openarchiver
|
systemctl stop openarchiver
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: MickLesk (Canbiz)
|
# Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://vikunja.io/
|
# Source: https://vikunja.io/
|
||||||
|
|
||||||
@@ -27,30 +27,51 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
RELEASE=$(curl -fsSL https://dl.vikunja.io/vikunja/ | grep -oP 'href="/vikunja/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
|
|
||||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
RELEASE="$( [[ -f "$HOME/.vikunja" ]] && cat "$HOME/.vikunja" 2>/dev/null || [[ -f /opt/Vikunja_version ]] && cat /opt/Vikunja_version 2>/dev/null || true)"
|
||||||
|
if [[ -z "$RELEASE" ]] || [[ "$RELEASE" == "unstable" ]] || dpkg --compare-versions "${RELEASE:-0.0.0}" lt "1.0.0"; then
|
||||||
|
msg_warn "You are upgrading from Vikunja '$RELEASE'."
|
||||||
|
msg_warn "This requires MANUAL config changes in /etc/vikunja/config.yml."
|
||||||
|
msg_warn "See: https://vikunja.io/changelog/whats-new-in-vikunja-1.0.0/#config-changes"
|
||||||
|
|
||||||
|
read -rp "Continue with update? (y to proceed): " -t 30 CONFIRM1 || exit 1
|
||||||
|
[[ "$CONFIRM1" =~ ^[yY]$ ]] || exit 0
|
||||||
|
|
||||||
|
echo
|
||||||
|
msg_warn "Vikunja may not start after the update until you manually adjust the config."
|
||||||
|
msg_warn "Details: https://vikunja.io/changelog/whats-new-in-vikunja-1.0.0/#config-changes"
|
||||||
|
|
||||||
|
read -rp "Acknowledge and continue? (y): " -t 30 CONFIRM2 || exit 1
|
||||||
|
[[ "$CONFIRM2" =~ ^[yY]$ ]] || exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "vikunja" "go-vikunja/vikunja"; then
|
||||||
|
echo
|
||||||
|
msg_warn "The package update may include config file changes."
|
||||||
|
echo -e "${TAB}${YW}How do you want to handle /etc/vikunja/config.yml?${CL}"
|
||||||
|
echo -e "${TAB} 1) Keep your current config"
|
||||||
|
echo -e "${TAB} 2) Install the new package maintainer's config"
|
||||||
|
read -rp " Choose [1/2] (default: 1): " -t 60 CONFIG_CHOICE || CONFIG_CHOICE="1"
|
||||||
|
[[ -z "$CONFIG_CHOICE" ]] && CONFIG_CHOICE="1"
|
||||||
|
|
||||||
|
if [[ "$CONFIG_CHOICE" == "2" ]]; then
|
||||||
|
export DPKG_FORCE_CONFNEW="1"
|
||||||
|
else
|
||||||
|
export DPKG_FORCE_CONFOLD="1"
|
||||||
|
fi
|
||||||
|
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop vikunja
|
systemctl stop vikunja
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating ${APP} to ${RELEASE}"
|
fetch_and_deploy_gh_release "vikunja" "go-vikunja/vikunja" "binary"
|
||||||
cd /opt
|
|
||||||
rm -rf /opt/vikunja/vikunja
|
|
||||||
curl -fsSL "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb" -o $(basename "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb")
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
$STD dpkg -i vikunja-"$RELEASE"-amd64.deb
|
|
||||||
rm -rf /opt/vikunja-"$RELEASE"-amd64.deb
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start vikunja
|
systemctl start vikunja
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
|
||||||
fi
|
fi
|
||||||
exit
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
@@ -33,7 +33,11 @@
|
|||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "With an option to configure cloudflared as a DNS-over-HTTPS (DoH) proxy",
|
"text": "After install, run: cloudflared tunnel login && cloudflared tunnel create <NAME>",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Or create tunnel via Cloudflare Zero Trust Dashboard",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-01-28T12:56:09Z",
|
"generated": "2026-01-30T06:16:23Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -137,9 +137,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "bookstack",
|
"slug": "bookstack",
|
||||||
"repo": "BookStackApp/BookStack",
|
"repo": "BookStackApp/BookStack",
|
||||||
"version": "v25.12.2",
|
"version": "v25.12.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-24T14:01:03Z"
|
"date": "2026-01-29T15:29:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "byparr",
|
"slug": "byparr",
|
||||||
@@ -179,9 +179,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "comfyui",
|
"slug": "comfyui",
|
||||||
"repo": "comfyanonymous/ComfyUI",
|
"repo": "comfyanonymous/ComfyUI",
|
||||||
"version": "v0.11.0",
|
"version": "v0.11.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-27T06:23:53Z"
|
"date": "2026-01-29T07:52:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "commafeed",
|
"slug": "commafeed",
|
||||||
@@ -235,9 +235,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "discopanel",
|
"slug": "discopanel",
|
||||||
"repo": "nickheyer/discopanel",
|
"repo": "nickheyer/discopanel",
|
||||||
"version": "v1.0.27",
|
"version": "v1.0.29",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-28T04:32:34Z"
|
"date": "2026-01-30T04:58:19Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "dispatcharr",
|
"slug": "dispatcharr",
|
||||||
@@ -403,9 +403,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "gokapi",
|
"slug": "gokapi",
|
||||||
"repo": "Forceu/Gokapi",
|
"repo": "Forceu/Gokapi",
|
||||||
"version": "v2.1.0",
|
"version": "v2.2.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-08-29T12:45:42Z"
|
"date": "2026-01-28T23:59:22Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "gotify",
|
"slug": "gotify",
|
||||||
@@ -515,9 +515,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "immich",
|
"slug": "immich",
|
||||||
"repo": "immich-app/immich",
|
"repo": "immich-app/immich",
|
||||||
"version": "v2.4.1",
|
"version": "v2.5.2",
|
||||||
"pinned": true,
|
"pinned": true,
|
||||||
"date": "2025-12-19T15:50:12Z"
|
"date": "2026-01-29T15:24:34Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "inspircd",
|
"slug": "inspircd",
|
||||||
@@ -543,9 +543,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
"repo": "Jackett/Jackett",
|
"repo": "Jackett/Jackett",
|
||||||
"version": "v0.24.955",
|
"version": "v0.24.988",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-27T11:04:42Z"
|
"date": "2026-01-30T05:55:43Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "joplin-server",
|
"slug": "joplin-server",
|
||||||
@@ -641,9 +641,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "leantime",
|
"slug": "leantime",
|
||||||
"repo": "Leantime/leantime",
|
"repo": "Leantime/leantime",
|
||||||
"version": "v3.6.0",
|
"version": "v3.6.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-22T15:16:00Z"
|
"date": "2026-01-29T16:37:00Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "librenms",
|
"slug": "librenms",
|
||||||
@@ -732,9 +732,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "manyfold",
|
"slug": "manyfold",
|
||||||
"repo": "manyfold3d/manyfold",
|
"repo": "manyfold3d/manyfold",
|
||||||
"version": "v0.131.0",
|
"version": "v0.132.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-09T15:00:15Z"
|
"date": "2026-01-29T13:53:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "mealie",
|
"slug": "mealie",
|
||||||
@@ -760,9 +760,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "meilisearch",
|
"slug": "meilisearch",
|
||||||
"repo": "riccox/meilisearch-ui",
|
"repo": "riccox/meilisearch-ui",
|
||||||
"version": "v0.14.1",
|
"version": "v0.15.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-09-22T06:44:33Z"
|
"date": "2026-01-29T03:54:27Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "memos",
|
"slug": "memos",
|
||||||
@@ -774,9 +774,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "metube",
|
"slug": "metube",
|
||||||
"repo": "alexta69/metube",
|
"repo": "alexta69/metube",
|
||||||
"version": "2026.01.11",
|
"version": "2026.01.30",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-11T18:43:56Z"
|
"date": "2026-01-30T00:17:52Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "miniflux",
|
"slug": "miniflux",
|
||||||
@@ -837,9 +837,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "nodebb",
|
"slug": "nodebb",
|
||||||
"repo": "NodeBB/NodeBB",
|
"repo": "NodeBB/NodeBB",
|
||||||
"version": "v4.8.0",
|
"version": "v4.8.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-14T17:54:36Z"
|
"date": "2026-01-28T14:19:11Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "nodecast-tv",
|
||||||
|
"repo": "technomancer702/nodecast-tv",
|
||||||
|
"version": "v2.1.1",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-19T23:30:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "oauth2-proxy",
|
"slug": "oauth2-proxy",
|
||||||
@@ -1089,9 +1096,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pve-scripts-local",
|
"slug": "pve-scripts-local",
|
||||||
"repo": "community-scripts/ProxmoxVE-Local",
|
"repo": "community-scripts/ProxmoxVE-Local",
|
||||||
"version": "v0.5.5",
|
"version": "v0.5.6",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-13T17:03:32Z"
|
"date": "2026-01-29T15:08:44Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "qbittorrent",
|
"slug": "qbittorrent",
|
||||||
@@ -1110,9 +1117,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "qui",
|
"slug": "qui",
|
||||||
"repo": "autobrr/qui",
|
"repo": "autobrr/qui",
|
||||||
"version": "v1.13.0",
|
"version": "v1.13.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-27T20:32:22Z"
|
"date": "2026-01-28T20:12:50Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "radarr",
|
"slug": "radarr",
|
||||||
@@ -1264,9 +1271,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "stirling-pdf",
|
"slug": "stirling-pdf",
|
||||||
"repo": "Stirling-Tools/Stirling-PDF",
|
"repo": "Stirling-Tools/Stirling-PDF",
|
||||||
"version": "v2.4.0",
|
"version": "v2.4.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-24T00:51:05Z"
|
"date": "2026-01-29T23:11:15Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "streamlink-webui",
|
"slug": "streamlink-webui",
|
||||||
@@ -1285,9 +1292,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tandoor",
|
"slug": "tandoor",
|
||||||
"repo": "TandoorRecipes/recipes",
|
"repo": "TandoorRecipes/recipes",
|
||||||
"version": "2.3.6",
|
"version": "2.4.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2025-11-24T19:40:27Z"
|
"date": "2026-01-28T17:07:16Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tasmoadmin",
|
"slug": "tasmoadmin",
|
||||||
@@ -1355,9 +1362,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tracearr",
|
"slug": "tracearr",
|
||||||
"repo": "connorgallopo/Tracearr",
|
"repo": "connorgallopo/Tracearr",
|
||||||
"version": "v1.4.10",
|
"version": "v1.4.12",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-28T06:37:35Z"
|
"date": "2026-01-28T23:29:37Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tracktor",
|
"slug": "tracktor",
|
||||||
@@ -1383,9 +1390,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "trip",
|
"slug": "trip",
|
||||||
"repo": "itskovacs/TRIP",
|
"repo": "itskovacs/TRIP",
|
||||||
"version": "1.36.1",
|
"version": "1.37.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-26T17:41:48Z"
|
"date": "2026-01-28T22:19:14Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tududi",
|
"slug": "tududi",
|
||||||
@@ -1397,9 +1404,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tunarr",
|
"slug": "tunarr",
|
||||||
"repo": "chrisbenincasa/tunarr",
|
"repo": "chrisbenincasa/tunarr",
|
||||||
"version": "v1.1.6",
|
"version": "v1.1.10",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-23T18:09:11Z"
|
"date": "2026-01-30T02:10:02Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "uhf",
|
"slug": "uhf",
|
||||||
@@ -1450,6 +1457,13 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-19T13:29:43Z"
|
"date": "2026-01-19T13:29:43Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"slug": "vikunja",
|
||||||
|
"repo": "go-vikunja/vikunja",
|
||||||
|
"version": "v1.0.0",
|
||||||
|
"pinned": false,
|
||||||
|
"date": "2026-01-28T11:12:59Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"slug": "wallabag",
|
"slug": "wallabag",
|
||||||
"repo": "wallabag/wallabag",
|
"repo": "wallabag/wallabag",
|
||||||
@@ -1467,9 +1481,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "wanderer",
|
"slug": "wanderer",
|
||||||
"repo": "meilisearch/meilisearch",
|
"repo": "meilisearch/meilisearch",
|
||||||
"version": "v1.34.2",
|
"version": "v1.34.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-28T08:20:49Z"
|
"date": "2026-01-28T17:52:24Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "warracker",
|
"slug": "warracker",
|
||||||
@@ -1530,9 +1544,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "yubal",
|
"slug": "yubal",
|
||||||
"repo": "guillevc/yubal",
|
"repo": "guillevc/yubal",
|
||||||
"version": "v0.3.0",
|
"version": "v0.3.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-26T23:05:35Z"
|
"date": "2026-01-29T12:45:35Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "zigbee2mqtt",
|
"slug": "zigbee2mqtt",
|
||||||
@@ -1558,9 +1572,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "zoraxy",
|
"slug": "zoraxy",
|
||||||
"repo": "tobychui/zoraxy",
|
"repo": "tobychui/zoraxy",
|
||||||
"version": "v3.3.1-rc3",
|
"version": "v3.3.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-24T14:31:01Z"
|
"date": "2026-01-28T13:52:02Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "zwave-js-ui",
|
"slug": "zwave-js-ui",
|
||||||
@@ -1569,6 +1583,5 @@
|
|||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-15T15:58:06Z"
|
"date": "2026-01-15T15:58:06Z"
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
"date_created": "2026-01-28"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,10 @@
|
|||||||
{
|
{
|
||||||
"text": "For NVIDIA graphics cards, you'll need to install the same drivers in the container that you did on the host. In the container, run the driver installation script and add the CLI arg --no-kernel-module",
|
"text": "For NVIDIA graphics cards, you'll need to install the same drivers in the container that you did on the host. In the container, run the driver installation script and add the CLI arg --no-kernel-module",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Log rotation is configured in /etc/logrotate.d/jellyfin. To reduce verbosity, change MinimumLevel in /etc/jellyfin/logging.json to Warning or Error (disables fail2ban auth logging).",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
35
frontend/public/json/nodecast-tv.json
Normal file
35
frontend/public/json/nodecast-tv.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "nodecast-tv",
|
||||||
|
"slug": "nodecast-tv",
|
||||||
|
"categories": [
|
||||||
|
13
|
||||||
|
],
|
||||||
|
"date_created": "2026-01-28",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 3000,
|
||||||
|
"documentation": "https://github.com/technomancer702/nodecast-tv/blob/main/README.md",
|
||||||
|
"website": "https://github.com/technomancer702/nodecast-tv",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nodecast-tv.webp",
|
||||||
|
"config_path": "",
|
||||||
|
"description": "nodecast-tv is a modern, web-based IPTV player featuring Live TV, EPG, Movies (VOD), and Series support. Built with performance and user experience in mind.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/nodecast-tv.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@@ -25,6 +25,17 @@
|
|||||||
"os": "Debian",
|
"os": "Debian",
|
||||||
"version": "13"
|
"version": "13"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "alpine",
|
||||||
|
"script": "ct/alpine-valkey.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 256,
|
||||||
|
"hdd": 1,
|
||||||
|
"os": "alpine",
|
||||||
|
"version": "3.23"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
@@ -35,6 +46,10 @@
|
|||||||
{
|
{
|
||||||
"text": "Show Login Credentials, type `cat ~/valkey.creds` in the LXC console",
|
"text": "Show Login Credentials, type `cat ~/valkey.creds` in the LXC console",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Alpines Valkey package is compiled without TLS support. For TLS, use the Debian-based valkey script instead.",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
36
frontend/src/app/api/github-versions/route.ts
Normal file
36
frontend/src/app/api/github-versions/route.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { promises as fs } from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
|
|
||||||
|
import type { GitHubVersionsResponse } from "@/lib/types";
|
||||||
|
|
||||||
|
export const dynamic = "force-static";
|
||||||
|
|
||||||
|
const jsonDir = "public/json";
|
||||||
|
const versionsFileName = "github-versions.json";
|
||||||
|
const encoding = "utf-8";
|
||||||
|
|
||||||
|
async function getVersions(): Promise<GitHubVersionsResponse> {
|
||||||
|
const filePath = path.resolve(jsonDir, versionsFileName);
|
||||||
|
const fileContent = await fs.readFile(filePath, encoding);
|
||||||
|
const data: GitHubVersionsResponse = JSON.parse(fileContent);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function GET() {
|
||||||
|
try {
|
||||||
|
const versions = await getVersions();
|
||||||
|
return NextResponse.json(versions);
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
const err = error as globalThis.Error;
|
||||||
|
return NextResponse.json({
|
||||||
|
generated: "",
|
||||||
|
versions: [],
|
||||||
|
error: err.message || "An unexpected error occurred",
|
||||||
|
}, {
|
||||||
|
status: 500,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,18 +3,22 @@ import { NextResponse } from "next/server";
|
|||||||
import { promises as fs } from "node:fs";
|
import { promises as fs } from "node:fs";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
import type { AppVersion } from "@/lib/types";
|
|
||||||
|
|
||||||
export const dynamic = "force-static";
|
export const dynamic = "force-static";
|
||||||
|
|
||||||
const jsonDir = "public/json";
|
const jsonDir = "public/json";
|
||||||
const versionsFileName = "versions.json";
|
const versionsFileName = "versions.json";
|
||||||
const encoding = "utf-8";
|
const encoding = "utf-8";
|
||||||
|
|
||||||
|
interface LegacyVersion {
|
||||||
|
name: string;
|
||||||
|
version: string;
|
||||||
|
date: string;
|
||||||
|
}
|
||||||
|
|
||||||
async function getVersions() {
|
async function getVersions() {
|
||||||
const filePath = path.resolve(jsonDir, versionsFileName);
|
const filePath = path.resolve(jsonDir, versionsFileName);
|
||||||
const fileContent = await fs.readFile(filePath, encoding);
|
const fileContent = await fs.readFile(filePath, encoding);
|
||||||
const versions: AppVersion[] = JSON.parse(fileContent);
|
const versions: LegacyVersion[] = JSON.parse(fileContent);
|
||||||
|
|
||||||
const modifiedVersions = versions.map((version) => {
|
const modifiedVersions = versions.map((version) => {
|
||||||
let newName = version.name;
|
let newName = version.name;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { X } from "lucide-react";
|
import { X, HelpCircle } from "lucide-react";
|
||||||
import { Suspense } from "react";
|
import { Suspense } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
|
||||||
import type { AppVersion, Script } from "@/lib/types";
|
import type { AppVersion, Script } from "@/lib/types";
|
||||||
|
|
||||||
import { cleanSlug } from "@/lib/utils/resource-utils";
|
|
||||||
import { Separator } from "@/components/ui/separator";
|
import { Separator } from "@/components/ui/separator";
|
||||||
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
|
||||||
import { useVersions } from "@/hooks/use-versions";
|
import { useVersions } from "@/hooks/use-versions";
|
||||||
import { basePath } from "@/config/site-config";
|
import { basePath } from "@/config/site-config";
|
||||||
import { extractDate } from "@/lib/time";
|
import { extractDate } from "@/lib/time";
|
||||||
@@ -108,18 +108,31 @@ function VersionInfo({ item }: { item: Script }) {
|
|||||||
const { data: versions = [], isLoading } = useVersions();
|
const { data: versions = [], isLoading } = useVersions();
|
||||||
|
|
||||||
if (isLoading || versions.length === 0) {
|
if (isLoading || versions.length === 0) {
|
||||||
return <p className="text-sm text-muted-foreground">Loading versions...</p>;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const matchedVersion = versions.find((v: AppVersion) => {
|
const matchedVersion = versions.find((v: AppVersion) => v.slug === item.slug);
|
||||||
const cleanName = v.name.replace(/[^a-z0-9]/gi, "").toLowerCase();
|
|
||||||
return cleanName === cleanSlug(item.slug) || cleanName.includes(cleanSlug(item.slug));
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!matchedVersion)
|
if (!matchedVersion)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return <span className="font-medium text-sm">{matchedVersion.version}</span>;
|
return (
|
||||||
|
<span className="font-medium text-sm flex items-center gap-1">
|
||||||
|
{matchedVersion.version}
|
||||||
|
{matchedVersion.pinned && (
|
||||||
|
<TooltipProvider>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<HelpCircle className="h-3.5 w-3.5 text-muted-foreground cursor-help" />
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent className="max-w-xs">
|
||||||
|
<p>This version is pinned. We test each update for breaking changes before releasing new versions.</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
|
|
||||||
import type { AppVersion } from "@/lib/types";
|
import type { AppVersion, GitHubVersionsResponse } from "@/lib/types";
|
||||||
|
|
||||||
import { fetchVersions } from "@/lib/data";
|
import { fetchVersions } from "@/lib/data";
|
||||||
|
|
||||||
@@ -10,14 +10,8 @@ export function useVersions() {
|
|||||||
return useQuery<AppVersion[]>({
|
return useQuery<AppVersion[]>({
|
||||||
queryKey: ["versions"],
|
queryKey: ["versions"],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const fetchedVersions = await fetchVersions();
|
const response: GitHubVersionsResponse = await fetchVersions();
|
||||||
if (Array.isArray(fetchedVersions)) {
|
return response.versions ?? [];
|
||||||
return fetchedVersions;
|
|
||||||
}
|
|
||||||
if (fetchedVersions && typeof fetchedVersions === "object") {
|
|
||||||
return [fetchedVersions];
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export async function fetchCategories() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchVersions() {
|
export async function fetchVersions() {
|
||||||
const response = await fetch(`/ProxmoxVE/api/versions`);
|
const response = await fetch(`/ProxmoxVE/api/github-versions`);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Failed to fetch versions: ${response.statusText}`);
|
throw new Error(`Failed to fetch versions: ${response.statusText}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,14 @@ export type OperatingSystem = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type AppVersion = {
|
export type AppVersion = {
|
||||||
name: string;
|
slug: string;
|
||||||
|
repo: string;
|
||||||
version: string;
|
version: string;
|
||||||
date: Date;
|
pinned: boolean;
|
||||||
|
date: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type GitHubVersionsResponse = {
|
||||||
|
generated: string;
|
||||||
|
versions: AppVersion[];
|
||||||
};
|
};
|
||||||
|
|||||||
45
install/alpine-valkey-install.sh
Normal file
45
install/alpine-valkey-install.sh
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: pshankinclarke (lazarillo)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://valkey.io/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Valkey"
|
||||||
|
$STD apk add valkey valkey-openrc valkey-cli
|
||||||
|
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
|
||||||
|
|
||||||
|
PASS="$(head -c 100 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c32)"
|
||||||
|
echo "requirepass $PASS" >>/etc/valkey/valkey.conf
|
||||||
|
echo "$PASS" >~/valkey.creds
|
||||||
|
chmod 600 ~/valkey.creds
|
||||||
|
|
||||||
|
MEMTOTAL_MB=$(free -m | grep ^Mem: | awk '{print $2}')
|
||||||
|
MAXMEMORY_MB=$((MEMTOTAL_MB * 75 / 100))
|
||||||
|
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "# Memory-optimized settings for small-scale deployments"
|
||||||
|
echo "maxmemory ${MAXMEMORY_MB}mb"
|
||||||
|
echo "maxmemory-policy allkeys-lru"
|
||||||
|
echo "maxmemory-samples 10"
|
||||||
|
} >>/etc/valkey/valkey.conf
|
||||||
|
msg_ok "Installed Valkey"
|
||||||
|
|
||||||
|
# Note: Alpine's valkey package is compiled without TLS support
|
||||||
|
# For TLS, use the Debian-based valkey script instead
|
||||||
|
|
||||||
|
$STD rc-update add valkey default
|
||||||
|
$STD rc-service valkey start
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -14,17 +14,52 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt -y install \
|
$STD apt -y install --no-install-recommends \
|
||||||
xauth \
|
ffmpeg \
|
||||||
xvfb \
|
libatk1.0-0 \
|
||||||
scrot \
|
libcairo-gobject2 \
|
||||||
chromium \
|
libcairo2 \
|
||||||
chromium-driver \
|
libdbus-glib-1-2 \
|
||||||
ca-certificates
|
libfontconfig1 \
|
||||||
|
libfreetype6 \
|
||||||
|
libgdk-pixbuf-xlib-2.0-0 \
|
||||||
|
libglib2.0-0 \
|
||||||
|
libgtk-3-0 \
|
||||||
|
libpango-1.0-0 \
|
||||||
|
libpangocairo-1.0-0 \
|
||||||
|
libpangoft2-1.0-0 \
|
||||||
|
libx11-6 \
|
||||||
|
libx11-xcb1 \
|
||||||
|
libxcb-shm0 \
|
||||||
|
libxcb1 \
|
||||||
|
libxcomposite1 \
|
||||||
|
libxcursor1 \
|
||||||
|
libxdamage1 \
|
||||||
|
libxext6 \
|
||||||
|
libxfixes3 \
|
||||||
|
libxi6 \
|
||||||
|
libxrender1 \
|
||||||
|
libxt6 \
|
||||||
|
libxtst6 \
|
||||||
|
xvfb \
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
fonts-unifont \
|
||||||
|
xfonts-cyrillic \
|
||||||
|
xfonts-scalable \
|
||||||
|
fonts-liberation \
|
||||||
|
fonts-ipafont-gothic \
|
||||||
|
fonts-wqy-zenhei \
|
||||||
|
fonts-tlwg-loma-otf
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "Byparr" "ThePhaseless/Byparr" "tarball" "latest"
|
|
||||||
setup_uv
|
setup_uv
|
||||||
|
fetch_and_deploy_gh_release "Byparr" "ThePhaseless/Byparr" "tarball" "latest"
|
||||||
|
|
||||||
|
msg_info "Configuring Byparr"
|
||||||
|
cd /opt/Byparr
|
||||||
|
$STD uv sync --link-mode copy
|
||||||
|
$STD uv run camoufox fetch
|
||||||
|
msg_ok "Configured Byparr"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/byparr.service
|
cat <<EOF >/etc/systemd/system/byparr.service
|
||||||
|
|||||||
@@ -23,41 +23,6 @@ setup_deb822_repo \
|
|||||||
$STD apt install -y cloudflared
|
$STD apt install -y cloudflared
|
||||||
msg_ok "Installed Cloudflared"
|
msg_ok "Installed Cloudflared"
|
||||||
|
|
||||||
read -r -p "${TAB3}Would you like to configure cloudflared as a DNS-over-HTTPS (DoH) proxy? <y/N> " prompt
|
|
||||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/usr/local/etc/cloudflared/config.yml
|
|
||||||
proxy-dns: true
|
|
||||||
proxy-dns-address: 0.0.0.0
|
|
||||||
proxy-dns-port: 53
|
|
||||||
proxy-dns-max-upstream-conns: 5
|
|
||||||
proxy-dns-upstream:
|
|
||||||
- https://1.1.1.1/dns-query
|
|
||||||
- https://1.0.0.1/dns-query
|
|
||||||
#- https://8.8.8.8/dns-query
|
|
||||||
#- https://8.8.4.4/dns-query
|
|
||||||
#- https://9.9.9.9/dns-query
|
|
||||||
#- https://149.112.112.112/dns-query
|
|
||||||
EOF
|
|
||||||
cat <<EOF >/etc/systemd/system/cloudflared.service
|
|
||||||
[Unit]
|
|
||||||
Description=cloudflared DNS-over-HTTPS (DoH) proxy
|
|
||||||
After=syslog.target network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/usr/local/bin/cloudflared --config /usr/local/etc/cloudflared/config.yml
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=10
|
|
||||||
KillMode=process
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now cloudflared
|
|
||||||
msg_ok "Created Service"
|
|
||||||
fi
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|||||||
@@ -13,6 +13,42 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo -e "🤖 ${BL}Immich Machine Learning Options${CL}"
|
||||||
|
echo "─────────────────────────────────────────"
|
||||||
|
echo "Please choose your machine-learning type:"
|
||||||
|
echo ""
|
||||||
|
echo " 1) CPU only (default)"
|
||||||
|
echo " 2) Intel OpenVINO (requires GPU passthrough)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE
|
||||||
|
ML_TYPE="${ML_TYPE:-1}"
|
||||||
|
if [[ "$ML_TYPE" == "2" ]]; then
|
||||||
|
msg_info "Installing OpenVINO dependencies"
|
||||||
|
touch ~/.openvino
|
||||||
|
$STD apt install -y --no-install-recommends patchelf
|
||||||
|
tmp_dir=$(mktemp -d)
|
||||||
|
$STD pushd "$tmp_dir"
|
||||||
|
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
||||||
|
readarray -t INTEL_URLS < <(
|
||||||
|
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
||||||
|
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
||||||
|
)
|
||||||
|
for url in "${INTEL_URLS[@]}"; do
|
||||||
|
curl -fsSLO "$url"
|
||||||
|
done
|
||||||
|
$STD apt install -y ./libigdgmm12*.deb
|
||||||
|
rm ./libigdgmm12*.deb
|
||||||
|
$STD apt install -y ./*.deb
|
||||||
|
$STD apt-mark hold libigdgmm12
|
||||||
|
$STD popd
|
||||||
|
rm -rf "$tmp_dir"
|
||||||
|
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
||||||
|
msg_ok "Installed OpenVINO dependencies"
|
||||||
|
fi
|
||||||
|
|
||||||
setup_uv
|
setup_uv
|
||||||
|
|
||||||
msg_info "Installing dependencies"
|
msg_info "Installing dependencies"
|
||||||
@@ -86,36 +122,11 @@ msg_ok "Dependencies Installed"
|
|||||||
|
|
||||||
msg_info "Installing Mise"
|
msg_info "Installing Mise"
|
||||||
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" | tee /etc/apt/sources.list.d/mise.list
|
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt install -y mise
|
$STD apt install -y mise
|
||||||
msg_ok "Installed Mise"
|
msg_ok "Installed Mise"
|
||||||
|
|
||||||
read -r -p "${TAB3}Install OpenVINO dependencies for Intel HW-accelerated machine-learning? y/N " prompt
|
|
||||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
|
||||||
msg_info "Installing OpenVINO dependencies"
|
|
||||||
touch ~/.openvino
|
|
||||||
$STD apt install -y --no-install-recommends patchelf
|
|
||||||
tmp_dir=$(mktemp -d)
|
|
||||||
$STD pushd "$tmp_dir"
|
|
||||||
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
|
||||||
readarray -t INTEL_URLS < <(
|
|
||||||
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
|
||||||
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
|
||||||
)
|
|
||||||
for url in "${INTEL_URLS[@]}"; do
|
|
||||||
curl -fsSLO "$url"
|
|
||||||
done
|
|
||||||
$STD apt install -y ./libigdgmm12*.deb
|
|
||||||
rm ./libigdgmm12*.deb
|
|
||||||
$STD apt install -y ./*.deb
|
|
||||||
$STD apt-mark hold libigdgmm12
|
|
||||||
$STD popd
|
|
||||||
rm -rf "$tmp_dir"
|
|
||||||
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
|
||||||
msg_ok "Installed OpenVINO dependencies"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Configuring Debian Testing Repo"
|
msg_info "Configuring Debian Testing Repo"
|
||||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
||||||
cat <<EOF >/etc/apt/preferences.d/preferences
|
cat <<EOF >/etc/apt/preferences.d/preferences
|
||||||
@@ -137,28 +148,17 @@ PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/
|
|||||||
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
||||||
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
||||||
|
|
||||||
msg_info "Setting up Postgresql Database"
|
|
||||||
VCHORD_RELEASE="0.5.3"
|
VCHORD_RELEASE="0.5.3"
|
||||||
|
msg_info "Installing Vectorchord v${VCHORD_RELEASE}"
|
||||||
curl -fsSL "https://github.com/tensorchord/VectorChord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
curl -fsSL "https://github.com/tensorchord/VectorChord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
||||||
$STD apt install -y ./vchord.deb
|
$STD apt install -y ./vchord.deb
|
||||||
rm vchord.deb
|
rm vchord.deb
|
||||||
echo "$VCHORD_RELEASE" >~/.vchord_version
|
echo "$VCHORD_RELEASE" >~/.vchord_version
|
||||||
DB_NAME="immich"
|
msg_ok "Installed Vectorchord v${VCHORD_RELEASE}"
|
||||||
DB_USER="immich"
|
|
||||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c18)
|
|
||||||
sed -i -e "/^#shared_preload/s/^#//;/^shared_preload/s/''/'vchord.so'/" /etc/postgresql/16/main/postgresql.conf
|
sed -i -e "/^#shared_preload/s/^#//;/^shared_preload/s/''/'vchord.so'/" /etc/postgresql/16/main/postgresql.conf
|
||||||
systemctl restart postgresql.service
|
systemctl restart postgresql.service
|
||||||
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';"
|
PG_DB_NAME="immich" PG_DB_USER="immich" PG_DB_GRANT_SUPERUSER="true" PG_DB_SKIP_ALTER_ROLE="true" setup_postgresql_db
|
||||||
$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} DB Credentials"
|
|
||||||
echo "Database User: $DB_USER"
|
|
||||||
echo "Database Password: $DB_PASS"
|
|
||||||
echo "Database Name: $DB_NAME"
|
|
||||||
} >>~/"$APPLICATION".creds
|
|
||||||
msg_ok "Set up Postgresql Database"
|
|
||||||
|
|
||||||
msg_info "Compiling Custom Photo-processing Library (extreme patience)"
|
msg_info "Compiling Custom Photo-processing Library (extreme patience)"
|
||||||
LD_LIBRARY_PATH=/usr/local/lib
|
LD_LIBRARY_PATH=/usr/local/lib
|
||||||
@@ -296,9 +296,9 @@ GEO_DIR="${INSTALL_DIR}/geodata"
|
|||||||
mkdir -p "$INSTALL_DIR"
|
mkdir -p "$INSTALL_DIR"
|
||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.4.1" "$SRC_DIR"
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.5.2" "$SRC_DIR"
|
||||||
|
|
||||||
msg_info "Installing ${APPLICATION} (patience)"
|
msg_info "Installing Immich (patience)"
|
||||||
|
|
||||||
cd "$SRC_DIR"/server
|
cd "$SRC_DIR"/server
|
||||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
||||||
@@ -347,12 +347,13 @@ mkdir -p "$ML_DIR" && chown -R immich:immich "$INSTALL_DIR"
|
|||||||
export VIRTUAL_ENV="${ML_DIR}/ml-venv"
|
export VIRTUAL_ENV="${ML_DIR}/ml-venv"
|
||||||
if [[ -f ~/.openvino ]]; then
|
if [[ -f ~/.openvino ]]; then
|
||||||
msg_info "Installing HW-accelerated machine-learning"
|
msg_info "Installing HW-accelerated machine-learning"
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --active -n -p python3.11 --managed-python
|
$STD uv add --no-sync --optional openvino onnxruntime-openvino==1.20.0 --active -n -p python3.12 --managed-python
|
||||||
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.11/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-311-x86_64-linux-gnu.so"
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p python3.12 --managed-python
|
||||||
|
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.12/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-312-x86_64-linux-gnu.so"
|
||||||
msg_ok "Installed HW-accelerated machine-learning"
|
msg_ok "Installed HW-accelerated machine-learning"
|
||||||
else
|
else
|
||||||
msg_info "Installing machine-learning"
|
msg_info "Installing machine-learning"
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --active -n -p python3.11 --managed-python
|
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --no-dev --active --link-mode copy -n -p python3.11 --managed-python
|
||||||
msg_ok "Installed machine-learning"
|
msg_ok "Installed machine-learning"
|
||||||
fi
|
fi
|
||||||
cd "$SRC_DIR"
|
cd "$SRC_DIR"
|
||||||
@@ -384,7 +385,7 @@ msg_ok "Installed GeoNames data"
|
|||||||
|
|
||||||
mkdir -p /var/log/immich
|
mkdir -p /var/log/immich
|
||||||
touch /var/log/immich/{web.log,ml.log}
|
touch /var/log/immich/{web.log,ml.log}
|
||||||
msg_ok "Installed ${APPLICATION}"
|
msg_ok "Installed Immich"
|
||||||
|
|
||||||
msg_info "Modifying user, creating env file, scripts & services"
|
msg_info "Modifying user, creating env file, scripts & services"
|
||||||
usermod -aG video,render immich
|
usermod -aG video,render immich
|
||||||
@@ -393,11 +394,12 @@ cat <<EOF >"${INSTALL_DIR}"/.env
|
|||||||
TZ=$(cat /etc/timezone)
|
TZ=$(cat /etc/timezone)
|
||||||
IMMICH_VERSION=release
|
IMMICH_VERSION=release
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
IMMICH_ALLOW_SETUP=true
|
||||||
|
|
||||||
DB_HOSTNAME=127.0.0.1
|
DB_HOSTNAME=127.0.0.1
|
||||||
DB_USERNAME=${DB_USER}
|
DB_USERNAME=${PG_DB_USER}
|
||||||
DB_PASSWORD=${DB_PASS}
|
DB_PASSWORD=${PG_DB_PASS}
|
||||||
DB_DATABASE_NAME=${DB_NAME}
|
DB_DATABASE_NAME=${PG_DB_NAME}
|
||||||
DB_VECTOR_EXTENSION=vectorchord
|
DB_VECTOR_EXTENSION=vectorchord
|
||||||
|
|
||||||
REDIS_HOSTNAME=127.0.0.1
|
REDIS_HOSTNAME=127.0.0.1
|
||||||
|
|||||||
@@ -39,8 +39,19 @@ EOF
|
|||||||
|
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt install -y jellyfin
|
$STD apt install -y jellyfin
|
||||||
sed -i 's/"MinimumLevel": "Information"/"MinimumLevel": "Error"/g' /etc/jellyfin/logging.json
|
# Configure log rotation to prevent disk fill (keeps fail2ban compatibility) (PR: #1690 / Issue: #11224)
|
||||||
|
cat <<EOF >/etc/logrotate.d/jellyfin
|
||||||
|
/var/log/jellyfin/*.log {
|
||||||
|
daily
|
||||||
|
rotate 3
|
||||||
|
maxsize 100M
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
copytruncate
|
||||||
|
}
|
||||||
|
EOF
|
||||||
chown -R jellyfin:adm /etc/jellyfin
|
chown -R jellyfin:adm /etc/jellyfin
|
||||||
sleep 10
|
sleep 10
|
||||||
systemctl restart jellyfin
|
systemctl restart jellyfin
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ update_os
|
|||||||
|
|
||||||
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
|
||||||
PG_VERSION="16" setup_postgresql
|
PG_VERSION="16" setup_postgresql
|
||||||
PHP_VERSION="8.4" PHP_APACHE="YES" PHP_MODULE="apcu,ctype,dom,fileinfo,iconv,pgsql" setup_php
|
PHP_VERSION="8.5" PHP_APACHE="YES" PHP_MODULE="apcu,ctype,dom,fileinfo,iconv,pgsql" setup_php
|
||||||
setup_composer
|
setup_composer
|
||||||
|
|
||||||
msg_info "Setting up PostgreSQL"
|
msg_info "Setting up PostgreSQL"
|
||||||
|
|||||||
50
install/nodecast-tv-install.sh
Normal file
50
install/nodecast-tv-install.sh
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: luismco
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/technomancer702/nodecast-tv
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
|
||||||
|
setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y ffmpeg
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Installing Modules"
|
||||||
|
cd /opt/nodecast-tv
|
||||||
|
$STD npm install
|
||||||
|
msg_ok "Installed Modules"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/nodecast-tv.service
|
||||||
|
[Unit]
|
||||||
|
Description=nodecast-tv
|
||||||
|
After=network.target
|
||||||
|
Wants=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/nodecast-tv
|
||||||
|
ExecStart=/bin/npm run dev
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now nodecast-tv
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
# Author: MickLesk (Canbiz)
|
# Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://vikunja.io/
|
# Source: https://vikunja.io/
|
||||||
|
|
||||||
@@ -13,22 +13,14 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
fetch_and_deploy_gh_release "vikunja" "go-vikunja/vikunja" "binary"
|
||||||
$STD apt install -y make
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Setup Vikunja (Patience)"
|
msg_info "Setting up Vikunja"
|
||||||
cd /opt
|
sed -i 's|^# \(service:\)|\1|' /etc/vikunja/config.yml
|
||||||
RELEASE=$(curl -fsSL https://dl.vikunja.io/vikunja/ | grep -oP 'href="/vikunja/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
|
sed -i "s|^ # \(publicurl: \).*| \1\"http://$LOCAL_IP\"|" /etc/vikunja/config.yml
|
||||||
curl -fsSL "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb" -o vikunja-"$RELEASE"-amd64.deb
|
sed -i "0,/^ # \(timezone: \).*/s|| \1${tz}|" /etc/vikunja/config.yml
|
||||||
$STD dpkg -i vikunja-"$RELEASE"-amd64.deb
|
systemctl enable -q --now vikunja
|
||||||
sed -i 's|^ timezone: .*| timezone: UTC|' /etc/vikunja/config.yml
|
msg_ok "Set up Vikunja"
|
||||||
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
|
|
||||||
rm -rf /opt/vikunja-"$RELEASE"-amd64.deb
|
|
||||||
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
|
|
||||||
msg_ok "Installed Vikunja"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
@@ -990,7 +990,7 @@ base_settings() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
MTU=${var_mtu:-""}
|
MTU=${var_mtu:-""}
|
||||||
SD=${var_storage:-""}
|
SD=${var_searchdomain:-""}
|
||||||
NS=${var_ns:-""}
|
NS=${var_ns:-""}
|
||||||
MAC=${var_mac:-""}
|
MAC=${var_mac:-""}
|
||||||
VLAN=${var_vlan:-""}
|
VLAN=${var_vlan:-""}
|
||||||
@@ -1817,7 +1817,7 @@ advanced_settings() {
|
|||||||
if [[ -n "$BRIDGES" ]]; then
|
if [[ -n "$BRIDGES" ]]; then
|
||||||
while IFS= read -r bridge; do
|
while IFS= read -r bridge; do
|
||||||
if [[ -n "$bridge" ]]; then
|
if [[ -n "$bridge" ]]; then
|
||||||
local description=$(grep -A 10 "iface $bridge" /etc/network/interfaces 2>/dev/null | grep '^#' | head -n1 | sed 's/^#\s*//')
|
local description=$(grep -A 10 "iface $bridge" /etc/network/interfaces 2>/dev/null | grep '^#' | head -n1 | sed 's/^#\s*//;s/^[- ]*//')
|
||||||
BRIDGE_MENU_OPTIONS+=("$bridge" "${description:- }")
|
BRIDGE_MENU_OPTIONS+=("$bridge" "${description:- }")
|
||||||
fi
|
fi
|
||||||
done <<<"$BRIDGES"
|
done <<<"$BRIDGES"
|
||||||
@@ -2049,6 +2049,10 @@ advanced_settings() {
|
|||||||
"${BRIDGE_MENU_OPTIONS[@]}" \
|
"${BRIDGE_MENU_OPTIONS[@]}" \
|
||||||
3>&1 1>&2 2>&3); then
|
3>&1 1>&2 2>&3); then
|
||||||
local bridge_test="${result:-vmbr0}"
|
local bridge_test="${result:-vmbr0}"
|
||||||
|
# Skip separator entries (e.g., __other__) - re-display menu
|
||||||
|
if [[ "$bridge_test" == "__other__" || "$bridge_test" == -* ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
if validate_bridge "$bridge_test"; then
|
if validate_bridge "$bridge_test"; then
|
||||||
_bridge="$bridge_test"
|
_bridge="$bridge_test"
|
||||||
((STEP++))
|
((STEP++))
|
||||||
@@ -3878,6 +3882,17 @@ EOF
|
|||||||
|
|
||||||
fix_gpu_gids
|
fix_gpu_gids
|
||||||
|
|
||||||
|
# Fix Debian 13 LXC template bug where / is owned by nobody:nogroup
|
||||||
|
# This must be done from the host as unprivileged containers cannot chown /
|
||||||
|
local rootfs
|
||||||
|
rootfs=$(pct config "$CTID" | grep -E '^rootfs:' | sed 's/rootfs: //' | cut -d',' -f1)
|
||||||
|
if [[ -n "$rootfs" ]]; then
|
||||||
|
local mount_point="/var/lib/lxc/${CTID}/rootfs"
|
||||||
|
if [[ -d "$mount_point" ]] && [[ "$(stat -c '%U' "$mount_point")" != "root" ]]; then
|
||||||
|
chown root:root "$mount_point" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Continue with standard container setup
|
# Continue with standard container setup
|
||||||
msg_info "Customizing LXC Container"
|
msg_info "Customizing LXC Container"
|
||||||
|
|
||||||
|
|||||||
@@ -81,8 +81,9 @@ setting_up_container() {
|
|||||||
msg_info "Setting up Container OS"
|
msg_info "Setting up Container OS"
|
||||||
|
|
||||||
# Fix Debian 13 LXC template bug where / is owned by nobody
|
# Fix Debian 13 LXC template bug where / is owned by nobody
|
||||||
|
# Only attempt in privileged containers (unprivileged cannot chown /)
|
||||||
if [[ "$(stat -c '%U' /)" != "root" ]]; then
|
if [[ "$(stat -c '%U' /)" != "root" ]]; then
|
||||||
chown root:root /
|
(chown root:root / 2>/dev/null) || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for ((i = RETRY_NUM; i > 0; i--)); do
|
for ((i = RETRY_NUM; i > 0; i--)); do
|
||||||
|
|||||||
@@ -1846,7 +1846,11 @@ function fetch_and_deploy_gh_release() {
|
|||||||
|
|
||||||
chmod 644 "$tmpdir/$filename"
|
chmod 644 "$tmpdir/$filename"
|
||||||
# SYSTEMD_OFFLINE=1 prevents systemd-tmpfiles failures in unprivileged LXC (Debian 13+/systemd 257+)
|
# SYSTEMD_OFFLINE=1 prevents systemd-tmpfiles failures in unprivileged LXC (Debian 13+/systemd 257+)
|
||||||
SYSTEMD_OFFLINE=1 $STD apt install -y "$tmpdir/$filename" || {
|
# Support DPKG_CONFOLD/DPKG_CONFNEW env vars for config file handling during .deb upgrades
|
||||||
|
local dpkg_opts=""
|
||||||
|
[[ "${DPKG_FORCE_CONFOLD:-}" == "1" ]] && dpkg_opts="-o Dpkg::Options::=--force-confold"
|
||||||
|
[[ "${DPKG_FORCE_CONFNEW:-}" == "1" ]] && dpkg_opts="-o Dpkg::Options::=--force-confnew"
|
||||||
|
DEBIAN_FRONTEND=noninteractive SYSTEMD_OFFLINE=1 $STD apt install -y $dpkg_opts "$tmpdir/$filename" || {
|
||||||
SYSTEMD_OFFLINE=1 $STD dpkg -i "$tmpdir/$filename" || {
|
SYSTEMD_OFFLINE=1 $STD dpkg -i "$tmpdir/$filename" || {
|
||||||
msg_error "Both apt and dpkg installation failed"
|
msg_error "Both apt and dpkg installation failed"
|
||||||
rm -rf "$tmpdir"
|
rm -rf "$tmpdir"
|
||||||
|
|||||||
@@ -595,7 +595,7 @@ EOF
|
|||||||
no)
|
no)
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
|
||||||
msg_error "Selected no to Disabling subscription nag"
|
msg_error "Selected no to Disabling subscription nag"
|
||||||
rm /etc/apt/apt.conf.d/no-nag-script 2>/dev/null
|
[[ -f /etc/apt/apt.conf.d/no-nag-script ]] && rm /etc/apt/apt.conf.d/no-nag-script
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
apt --reinstall install proxmox-widget-toolkit &>/dev/null || msg_error "Widget toolkit reinstall failed"
|
apt --reinstall install proxmox-widget-toolkit &>/dev/null || msg_error "Widget toolkit reinstall failed"
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ function default_settings() {
|
|||||||
MAC="$GEN_MAC"
|
MAC="$GEN_MAC"
|
||||||
VLAN=""
|
VLAN=""
|
||||||
MTU=""
|
MTU=""
|
||||||
START_VM="yes"
|
START_VM="no"
|
||||||
METHOD="default"
|
METHOD="default"
|
||||||
echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
|
echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
|
||||||
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
|
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
|
||||||
|
|||||||
Reference in New Issue
Block a user