mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-05 12:53:27 +01:00
Compare commits
41 Commits
MickLesk-p
...
fix/php-mo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb8691493b | ||
|
|
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 |
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}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
30
CHANGELOG.md
30
CHANGELOG.md
@@ -391,18 +391,48 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-01-30
|
||||||
|
|
||||||
## 2026-01-29
|
## 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
|
- #### ✨ 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))
|
- 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
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
- fix: vikunja v1 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11308](https://github.com/community-scripts/ProxmoxVE/pull/11308))
|
- 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
|
## 2026-01-28
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
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 @@
|
|||||||
|
___ __ _ _ __ ____
|
||||||
|
/ | / /___ (_)___ ___ | | / /___ _/ / /_____ __ __
|
||||||
|
/ /| | / / __ \/ / __ \/ _ \_____| | / / __ `/ / //_/ _ \/ / / /
|
||||||
|
/ ___ |/ / /_/ / / / / / __/_____/ |/ / /_/ / / ,< / __/ /_/ /
|
||||||
|
/_/ |_/_/ .___/_/_/ /_/\___/ |___/\__,_/_/_/|_|\___/\__, /
|
||||||
|
/_/ /____/
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ function update_script() {
|
|||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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-29T06:16:13Z",
|
"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",
|
||||||
@@ -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.980",
|
"version": "v0.24.988",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T05:04:22Z"
|
"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.1",
|
"version": "v3.6.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T02:53:11Z"
|
"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",
|
||||||
@@ -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",
|
||||||
@@ -1096,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",
|
||||||
@@ -1271,9 +1271,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "stirling-pdf",
|
"slug": "stirling-pdf",
|
||||||
"repo": "Stirling-Tools/Stirling-PDF",
|
"repo": "Stirling-Tools/Stirling-PDF",
|
||||||
"version": "v2.4.1",
|
"version": "v2.4.2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-29T00:04:47Z"
|
"date": "2026-01-29T23:11:15Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "streamlink-webui",
|
"slug": "streamlink-webui",
|
||||||
@@ -1404,9 +1404,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tunarr",
|
"slug": "tunarr",
|
||||||
"repo": "chrisbenincasa/tunarr",
|
"repo": "chrisbenincasa/tunarr",
|
||||||
"version": "v1.1.8",
|
"version": "v1.1.10",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-01-28T23:21:21Z"
|
"date": "2026-01-30T02:10:02Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "uhf",
|
"slug": "uhf",
|
||||||
@@ -1457,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",
|
||||||
@@ -1537,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",
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
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"
|
||||||
|
|||||||
@@ -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:-""}
|
||||||
|
|||||||
137
misc/tools.func
137
misc/tools.func
@@ -4460,6 +4460,8 @@ function setup_nodejs() {
|
|||||||
# - Adds Sury PHP repo if needed
|
# - Adds Sury PHP repo if needed
|
||||||
# - Installs default and user-defined modules
|
# - Installs default and user-defined modules
|
||||||
# - Patches php.ini for CLI, Apache, and FPM as needed
|
# - Patches php.ini for CLI, Apache, and FPM as needed
|
||||||
|
# - Handles built-in modules gracefully (e.g., opcache in PHP 8.5+)
|
||||||
|
# - Skips unavailable packages without failing
|
||||||
#
|
#
|
||||||
# Variables:
|
# Variables:
|
||||||
# PHP_VERSION - PHP version to install (default: 8.4)
|
# PHP_VERSION - PHP version to install (default: 8.4)
|
||||||
@@ -4470,6 +4472,17 @@ function setup_nodejs() {
|
|||||||
# PHP_UPLOAD_MAX_FILESIZE - (default: 128M)
|
# PHP_UPLOAD_MAX_FILESIZE - (default: 128M)
|
||||||
# PHP_POST_MAX_SIZE - (default: 128M)
|
# PHP_POST_MAX_SIZE - (default: 128M)
|
||||||
# PHP_MAX_EXECUTION_TIME - (default: 300)
|
# PHP_MAX_EXECUTION_TIME - (default: 300)
|
||||||
|
#
|
||||||
|
# Notes on modules:
|
||||||
|
# - Base modules (always installed): bcmath, cli, curl, gd, intl, mbstring,
|
||||||
|
# readline, xml, zip, common
|
||||||
|
# - Extended modules (commonly needed): mysql, sqlite3, pgsql, redis,
|
||||||
|
# imagick, bz2, ldap, soap, imap, gmp, apcu
|
||||||
|
# - Some modules are built-in depending on PHP version:
|
||||||
|
# * PHP 8.5+: opcache is built-in (no separate package)
|
||||||
|
# * All versions: ctype, fileinfo, iconv, tokenizer, phar, posix, etc.
|
||||||
|
# are part of php-common
|
||||||
|
# - Unavailable modules are skipped with a warning, not an error
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
function setup_php() {
|
function setup_php() {
|
||||||
@@ -4481,23 +4494,69 @@ function setup_php() {
|
|||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
||||||
|
|
||||||
local DEFAULT_MODULES="bcmath,cli,curl,gd,intl,mbstring,opcache,readline,xml,zip"
|
# Parse version for compatibility checks
|
||||||
local COMBINED_MODULES
|
local PHP_MAJOR="${PHP_VERSION%%.*}"
|
||||||
|
local PHP_MINOR="${PHP_VERSION#*.}"
|
||||||
|
PHP_MINOR="${PHP_MINOR%%.*}"
|
||||||
|
|
||||||
|
# Modules that are ALWAYS part of php-common (no separate package needed)
|
||||||
|
# These are either built-in or virtual packages provided by php-common
|
||||||
|
local BUILTIN_MODULES="calendar,ctype,exif,ffi,fileinfo,ftp,gettext,iconv,pdo,phar,posix,shmop,sockets,sysvmsg,sysvsem,sysvshm,tokenizer"
|
||||||
|
|
||||||
|
# Modules that became built-in in specific PHP versions
|
||||||
|
# PHP 8.5+: opcache is now part of the core
|
||||||
|
local BUILTIN_85=""
|
||||||
|
if [[ "$PHP_MAJOR" -gt 8 ]] || [[ "$PHP_MAJOR" -eq 8 && "$PHP_MINOR" -ge 5 ]]; then
|
||||||
|
BUILTIN_85="opcache"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Base modules - essential for most PHP applications
|
||||||
|
# Note: 'common' provides many built-in extensions
|
||||||
|
local BASE_MODULES="cli,common,bcmath,curl,gd,intl,mbstring,readline,xml,zip"
|
||||||
|
|
||||||
|
# Add opcache only for PHP < 8.5 (it's built-in starting from 8.5)
|
||||||
|
if [[ "$PHP_MAJOR" -lt 8 ]] || [[ "$PHP_MAJOR" -eq 8 && "$PHP_MINOR" -lt 5 ]]; then
|
||||||
|
BASE_MODULES="${BASE_MODULES},opcache"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extended default modules - commonly needed by web applications
|
||||||
|
# These cover ~90% of typical use cases without bloat
|
||||||
|
local EXTENDED_MODULES="mysql,sqlite3,pgsql,redis,imagick,bz2,apcu"
|
||||||
|
|
||||||
|
local COMBINED_MODULES="${BASE_MODULES},${EXTENDED_MODULES}"
|
||||||
|
|
||||||
local PHP_MEMORY_LIMIT="${PHP_MEMORY_LIMIT:-512M}"
|
local PHP_MEMORY_LIMIT="${PHP_MEMORY_LIMIT:-512M}"
|
||||||
local PHP_UPLOAD_MAX_FILESIZE="${PHP_UPLOAD_MAX_FILESIZE:-128M}"
|
local PHP_UPLOAD_MAX_FILESIZE="${PHP_UPLOAD_MAX_FILESIZE:-128M}"
|
||||||
local PHP_POST_MAX_SIZE="${PHP_POST_MAX_SIZE:-128M}"
|
local PHP_POST_MAX_SIZE="${PHP_POST_MAX_SIZE:-128M}"
|
||||||
local PHP_MAX_EXECUTION_TIME="${PHP_MAX_EXECUTION_TIME:-300}"
|
local PHP_MAX_EXECUTION_TIME="${PHP_MAX_EXECUTION_TIME:-300}"
|
||||||
|
|
||||||
# Merge default + user-defined modules
|
# Merge with user-defined modules
|
||||||
if [[ -n "$PHP_MODULE" ]]; then
|
if [[ -n "$PHP_MODULE" ]]; then
|
||||||
COMBINED_MODULES="${DEFAULT_MODULES},${PHP_MODULE}"
|
COMBINED_MODULES="${COMBINED_MODULES},${PHP_MODULE}"
|
||||||
else
|
|
||||||
COMBINED_MODULES="${DEFAULT_MODULES}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Filter out built-in modules (they don't have separate packages)
|
||||||
|
local FILTERED_MODULES=""
|
||||||
|
IFS=',' read -ra ALL_MODULES <<<"$COMBINED_MODULES"
|
||||||
|
for mod in "${ALL_MODULES[@]}"; do
|
||||||
|
mod=$(echo "$mod" | tr -d '[:space:]')
|
||||||
|
[[ -z "$mod" ]] && continue
|
||||||
|
|
||||||
|
# Skip if it's a known built-in module
|
||||||
|
if echo ",$BUILTIN_MODULES,$BUILTIN_85," | grep -qi ",$mod,"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add to filtered list
|
||||||
|
if [[ -z "$FILTERED_MODULES" ]]; then
|
||||||
|
FILTERED_MODULES="$mod"
|
||||||
|
else
|
||||||
|
FILTERED_MODULES="${FILTERED_MODULES},$mod"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# Deduplicate
|
# Deduplicate
|
||||||
COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
|
COMBINED_MODULES=$(echo "$FILTERED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
|
||||||
|
|
||||||
# Get current PHP-CLI version
|
# Get current PHP-CLI version
|
||||||
local CURRENT_PHP=""
|
local CURRENT_PHP=""
|
||||||
@@ -4555,16 +4614,41 @@ EOF
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Build module list - without version pinning (preferences.d handles it)
|
# Build module list - verify each package exists before adding
|
||||||
local MODULE_LIST="php${PHP_VERSION}"
|
local MODULE_LIST="php${PHP_VERSION}"
|
||||||
|
local SKIPPED_MODULES=""
|
||||||
|
|
||||||
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
|
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
|
||||||
for mod in "${MODULES[@]}"; do
|
for mod in "${MODULES[@]}"; do
|
||||||
MODULE_LIST+=" php${PHP_VERSION}-${mod}"
|
mod=$(echo "$mod" | tr -d '[:space:]')
|
||||||
|
[[ -z "$mod" ]] && continue
|
||||||
|
|
||||||
|
local pkg_name="php${PHP_VERSION}-${mod}"
|
||||||
|
|
||||||
|
# Check if package exists in repository
|
||||||
|
if apt-cache show "$pkg_name" &>/dev/null; then
|
||||||
|
MODULE_LIST+=" $pkg_name"
|
||||||
|
else
|
||||||
|
# Package doesn't exist - could be built-in or renamed
|
||||||
|
if [[ -z "$SKIPPED_MODULES" ]]; then
|
||||||
|
SKIPPED_MODULES="$mod"
|
||||||
|
else
|
||||||
|
SKIPPED_MODULES="${SKIPPED_MODULES}, $mod"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Log skipped modules (informational, not an error)
|
||||||
|
if [[ -n "$SKIPPED_MODULES" ]]; then
|
||||||
|
msg_info "Skipping unavailable/built-in modules: $SKIPPED_MODULES"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$PHP_FPM" == "YES" ]]; then
|
if [[ "$PHP_FPM" == "YES" ]]; then
|
||||||
MODULE_LIST+=" php${PHP_VERSION}-fpm"
|
if apt-cache show "php${PHP_VERSION}-fpm" &>/dev/null; then
|
||||||
|
MODULE_LIST+=" php${PHP_VERSION}-fpm"
|
||||||
|
else
|
||||||
|
msg_warn "php${PHP_VERSION}-fpm not available"
|
||||||
|
fi
|
||||||
# Create systemd override for PHP-FPM to fix runtime directory issues in LXC containers
|
# Create systemd override for PHP-FPM to fix runtime directory issues in LXC containers
|
||||||
mkdir -p /etc/systemd/system/php${PHP_VERSION}-fpm.service.d/
|
mkdir -p /etc/systemd/system/php${PHP_VERSION}-fpm.service.d/
|
||||||
cat <<EOF >/etc/systemd/system/php${PHP_VERSION}-fpm.service.d/override.conf
|
cat <<EOF >/etc/systemd/system/php${PHP_VERSION}-fpm.service.d/override.conf
|
||||||
@@ -4591,38 +4675,31 @@ EOF
|
|||||||
|
|
||||||
# Install PHP packages (pinning via preferences.d ensures correct version)
|
# Install PHP packages (pinning via preferences.d ensures correct version)
|
||||||
msg_info "Installing PHP ${PHP_VERSION} packages"
|
msg_info "Installing PHP ${PHP_VERSION} packages"
|
||||||
if ! install_packages_with_retry $MODULE_LIST; then
|
|
||||||
msg_warn "Failed to install PHP packages, attempting individual installation"
|
# First attempt: Install all verified packages at once
|
||||||
|
if ! $STD apt install -y $MODULE_LIST 2>/dev/null; then
|
||||||
|
msg_warn "Bulk installation failed, attempting individual installation"
|
||||||
|
|
||||||
# Install main package first (critical)
|
# Install main package first (critical)
|
||||||
install_packages_with_retry "php${PHP_VERSION}" || {
|
if ! $STD apt install -y "php${PHP_VERSION}" 2>/dev/null; then
|
||||||
msg_error "Failed to install php${PHP_VERSION}"
|
msg_error "Failed to install php${PHP_VERSION}"
|
||||||
return 1
|
return 1
|
||||||
}
|
fi
|
||||||
|
|
||||||
# Try to install Apache module individually if requested
|
# Try to install Apache module individually if requested
|
||||||
if [[ "$PHP_APACHE" == "YES" ]]; then
|
if [[ "$PHP_APACHE" == "YES" ]]; then
|
||||||
install_packages_with_retry "libapache2-mod-php${PHP_VERSION}" || {
|
$STD apt install -y "libapache2-mod-php${PHP_VERSION}" 2>/dev/null || {
|
||||||
msg_warn "Could not install libapache2-mod-php${PHP_VERSION}"
|
msg_warn "Could not install libapache2-mod-php${PHP_VERSION}"
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Try to install modules individually - skip those that don't exist
|
# Try to install each package individually
|
||||||
for pkg in "${MODULES[@]}"; do
|
for pkg in $MODULE_LIST; do
|
||||||
if apt-cache search "^php${PHP_VERSION}-${pkg}\$" 2>/dev/null | grep -q "^php${PHP_VERSION}-${pkg}"; then
|
[[ "$pkg" == "php${PHP_VERSION}" ]] && continue # Already installed
|
||||||
install_packages_with_retry "php${PHP_VERSION}-${pkg}" || {
|
$STD apt install -y "$pkg" 2>/dev/null || {
|
||||||
msg_warn "Could not install php${PHP_VERSION}-${pkg}"
|
msg_warn "Could not install $pkg - continuing without it"
|
||||||
}
|
}
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ "$PHP_FPM" == "YES" ]]; then
|
|
||||||
if apt-cache search "^php${PHP_VERSION}-fpm\$" 2>/dev/null | grep -q "^php${PHP_VERSION}-fpm"; then
|
|
||||||
install_packages_with_retry "php${PHP_VERSION}-fpm" || {
|
|
||||||
msg_warn "Could not install php${PHP_VERSION}-fpm"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
cache_installed_version "php" "$PHP_VERSION"
|
cache_installed_version "php" "$PHP_VERSION"
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user