Compare commits

...

40 Commits

Author SHA1 Message Date
community-scripts-pr-app[bot]
d314168a37 Update CHANGELOG.md (#7390)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-04 00:12:13 +00:00
community-scripts-pr-app[bot]
d6ad11c5c2 Update versions.json (#7389)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-04 02:11:47 +02:00
community-scripts-pr-app[bot]
534592b44a Update CHANGELOG.md (#7386)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 18:33:13 +00:00
Slaviša Arežina
d9b6b58b36 Increase HDD size (#7384) 2025-09-03 20:32:52 +02:00
community-scripts-pr-app[bot]
298eb7e83d Update CHANGELOG.md (#7380)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 12:56:32 +00:00
Chris
c2dd1e413f Wizarr: fix uv lock issue; use correct output suppression (#7378) 2025-09-03 14:56:04 +02:00
community-scripts-pr-app[bot]
a4f1766408 Update CHANGELOG.md (#7379)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 12:45:49 +00:00
Bram Suurd
a24169e9b8 Fix navigation (#7376)
* Removed double entries from the search to improve navigation

* change input on search field to improve searchability

* added type to search to make sure that LXC and VM's dont get mixed up

* run linting over changes

---------

Co-authored-by: Bram Suurd <bram.suurd@infracom.nl>
2025-09-03 14:45:24 +02:00
community-scripts-pr-app[bot]
45a2163e66 Update CHANGELOG.md (#7377)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 12:43:16 +00:00
Slaviša Arežina
2fc3e62d60 Fix paths (#7374) 2025-09-03 14:42:52 +02:00
community-scripts-pr-app[bot]
210b846d61 Update versions.json (#7375)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 14:06:04 +02:00
community-scripts-pr-app[bot]
b04cfb65f7 Update CHANGELOG.md (#7369)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 07:25:57 +00:00
Desert Gamer
6a2fc4083b Enhanced IP-Tag installation script with interactive configuration, improved VM IP detection, and better visual indicators (#7366)
- **Interactive Configuration**: Added setup wizard for `TAG_FORMAT` (last_two_octets/last_octet/full) and `LOOP_INTERVAL` (30-7200 seconds) during installation/update
- **Unified Installation Menu**: Replaced conditional service detection with unified menu offering install-with-service, install-command-only, and update options
- **Post-Installation Guidance**: Added comprehensive information display about configuration file location (`/opt/iptag/iptag.conf`) and required CIDR_LIST setup
- **Improved VM IP Detection**: Enhanced IP discovery with QM guest agent priority, ARP table validation via ping, and automatic removal of stale ARP entries
- **Visual Indicators**: Replaced emoji symbols with standard ASCII characters (✓/✗) with proper colors for better terminal compatibility
- **Simplified Update Process**: Removed complex service detection logic and provided direct update option in main menu

These changes address user feedback about complex installation requirements, VM IP detection issues, and provide clearer guidance for network subnet configuration.
2025-09-03 09:25:37 +02:00
community-scripts-pr-app[bot]
f7f53943c2 Update CHANGELOG.md (#7365)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 00:12:00 +00:00
community-scripts-pr-app[bot]
31f4d9b16c Update versions.json (#7364)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-03 02:11:34 +02:00
community-scripts-pr-app[bot]
cd4cd5eec1 Update CHANGELOG.md (#7361)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 20:17:14 +00:00
Slaviša Arežina
8a7eeee727 Add max upload size to nginx (#7358) 2025-09-02 22:16:48 +02:00
community-scripts-pr-app[bot]
be5d65f421 Update CHANGELOG.md (#7357)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 16:40:41 +00:00
CanbiZ
591af3f109 Increase default disk size for Apt-Cacher-NG (#7352) 2025-09-02 18:40:22 +02:00
community-scripts-pr-app[bot]
a3e0df9de1 Update CHANGELOG.md (#7356)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 16:39:59 +00:00
CanbiZ
596699d07e booklore: remove folder before update (#7351) 2025-09-02 18:39:39 +02:00
community-scripts-pr-app[bot]
b2275b44c2 Update CHANGELOG.md (#7355)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 16:35:45 +00:00
Chris
737842fb1e Immich: bump version to 1.140.1 (#7349) 2025-09-02 18:35:22 +02:00
community-scripts-pr-app[bot]
646cb2bc30 Update versions.json (#7347)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 14:05:31 +02:00
community-scripts-pr-app[bot]
4599bfe052 Update CHANGELOG.md (#7345)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 07:42:14 +00:00
CanbiZ
bb85b1d4ac pbs: increase note on website for ipv6 (#7339) 2025-09-02 09:41:52 +02:00
community-scripts-pr-app[bot]
57ae4a48a7 Update CHANGELOG.md (#7342)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 00:12:51 +00:00
community-scripts-pr-app[bot]
06e8460851 Update versions.json (#7341)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-02 02:12:31 +02:00
community-scripts-pr-app[bot]
9713c95bf4 Update CHANGELOG.md (#7340)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 17:58:39 +00:00
dependabot[bot]
705748bba5 Bump next from 15.2.4 to 15.5.2 in /frontend (#7309)
Bumps [next](https://github.com/vercel/next.js) from 15.2.4 to 15.5.2.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.2.4...v15.5.2)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 15.5.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 19:58:17 +02:00
community-scripts-pr-app[bot]
022f079821 Update CHANGELOG.md (#7338)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 13:02:32 +00:00
CanbiZ
80d75731a8 Refactor + Feature Bump: HomeAssistant OS (#7336) 2025-09-01 15:02:10 +02:00
community-scripts-pr-app[bot]
227721a72f Update CHANGELOG.md (#7337)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 13:00:47 +00:00
CanbiZ
5572a7a0ab UmbrelOS: Refactor / use q35 / better import (#7329)
* UmbrelOS: Improve VM Import Process

* q35 Feature-Bump

* Update umbrel-os-vm.sh

* Update umbrel-os-vm.sh

* Update umbrel-os-vm.sh

* temp folder for big file

* Update umbrel-os-vm.sh

* update MACH (adv. Settings)

* Update umbrel-os-vm.sh

* Formatting

* Update umbrel-os-vm.sh

* Refactor

* Update umbrel-os-vm.sh

* Update umbrel-os-vm.sh
2025-09-01 15:00:23 +02:00
community-scripts-pr-app[bot]
6a69185a2d Update versions.json (#7334)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 14:06:31 +02:00
community-scripts-pr-app[bot]
77441b6189 Update CHANGELOG.md (#7333)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 10:42:23 +00:00
CanbiZ
4aa337c2f2 booklore: add note for start-up in frontend (#7331) 2025-09-01 12:42:06 +02:00
finkerle
4bd2f6866a Update configarr.sh (#7323) 2025-09-01 12:41:45 +02:00
community-scripts-pr-app[bot]
377de80103 Update CHANGELOG.md (#7330)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 07:38:44 +00:00
CanbiZ
1c62d4614e Harmonize GitHub Release Check (#7328) 2025-09-01 09:38:20 +02:00
25 changed files with 1624 additions and 1278 deletions

View File

@@ -10,8 +10,71 @@
> [!CAUTION] > [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2025-09-04
## 2025-09-03
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Element-Synapse: Increase HDD size [@tremor021](https://github.com/tremor021) ([#7384](https://github.com/community-scripts/ProxmoxVE/pull/7384))
- Wizarr: fix uv lock issue; use correct output suppression [@vhsdream](https://github.com/vhsdream) ([#7378](https://github.com/community-scripts/ProxmoxVE/pull/7378))
- Netbox: Fix missing directory [@tremor021](https://github.com/tremor021) ([#7374](https://github.com/community-scripts/ProxmoxVE/pull/7374))
- #### 🔧 Refactor
- Enhanced IP-Tag installation script with interactive configuration, improved VM IP detection, and better visual indicators [@DesertGamer](https://github.com/DesertGamer) ([#7366](https://github.com/community-scripts/ProxmoxVE/pull/7366))
### 🌐 Website
- #### 🐞 Bug Fixes
- Fix navigation [@BramSuurdje](https://github.com/BramSuurdje) ([#7376](https://github.com/community-scripts/ProxmoxVE/pull/7376))
## 2025-09-02
### 🚀 Updated Scripts
- Increase default disk size for Apt-Cacher-NG [@MickLesk](https://github.com/MickLesk) ([#7352](https://github.com/community-scripts/ProxmoxVE/pull/7352))
- #### 🐞 Bug Fixes
- Snipe-IT: Fix Nginx configuration [@tremor021](https://github.com/tremor021) ([#7358](https://github.com/community-scripts/ProxmoxVE/pull/7358))
- booklore: remove folder before update [@MickLesk](https://github.com/MickLesk) ([#7351](https://github.com/community-scripts/ProxmoxVE/pull/7351))
- #### ✨ New Features
- Immich: bump version to 1.140.1 [@vhsdream](https://github.com/vhsdream) ([#7349](https://github.com/community-scripts/ProxmoxVE/pull/7349))
### 🌐 Website
- #### 📝 Script Information
- pbs: increase note on website for ipv6 [@MickLesk](https://github.com/MickLesk) ([#7339](https://github.com/community-scripts/ProxmoxVE/pull/7339))
## 2025-09-01 ## 2025-09-01
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Update configarr.sh to mv backep up .env correctly [@finkerle](https://github.com/finkerle) ([#7323](https://github.com/community-scripts/ProxmoxVE/pull/7323))
- #### ✨ New Features
- Refactor + Feature Bump: HomeAssistant OS [@MickLesk](https://github.com/MickLesk) ([#7336](https://github.com/community-scripts/ProxmoxVE/pull/7336))
- UmbrelOS: Refactor / use q35 / better import [@MickLesk](https://github.com/MickLesk) ([#7329](https://github.com/community-scripts/ProxmoxVE/pull/7329))
- Harmonize GH Release Check (excl. Pre-Releases & Migrate old "_version.txt" [@MickLesk](https://github.com/MickLesk) ([#7328](https://github.com/community-scripts/ProxmoxVE/pull/7328))
### 🌐 Website
- Bump next from 15.2.4 to 15.5.2 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#7309](https://github.com/community-scripts/ProxmoxVE/pull/7309))
- #### 📝 Script Information
- booklore: add note for start-up in frontend [@MickLesk](https://github.com/MickLesk) ([#7331](https://github.com/community-scripts/ProxmoxVE/pull/7331))
## 2025-08-31 ## 2025-08-31
### 🚀 Updated Scripts ### 🚀 Updated Scripts

View File

@@ -9,7 +9,7 @@ APP="Apt-Cacher-NG"
var_tags="${var_tags:-caching}" var_tags="${var_tags:-caching}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}" var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}" var_disk="${var_disk:-10}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"

View File

@@ -33,6 +33,10 @@ function update_script() {
systemctl stop booklore systemctl stop booklore
msg_ok "Stopped $APP" msg_ok "Stopped $APP"
msg_info "backup old install"
mv /opt/booklore /opt/booklore_bak
msg_ok "backup done"
fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore" fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore"
msg_info "Building Frontend" msg_info "Building Frontend"
@@ -58,6 +62,7 @@ function update_script() {
msg_info "Starting $APP" msg_info "Starting $APP"
systemctl start booklore systemctl start booklore
systemctl reload nginx systemctl reload nginx
rm -rf /opt/booklore_bak
msg_ok "Started $APP" msg_ok "Started $APP"
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
fi fi

View File

@@ -37,7 +37,7 @@ function update_script() {
mv /opt/configarr/{config.yml,secrets.yml,.env} "/opt/backup/" mv /opt/configarr/{config.yml,secrets.yml,.env} "/opt/backup/"
rm -rf /opt/configarr rm -rf /opt/configarr
fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr" fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr"
mv /opt/backup/* /opt/configarr/ mv /opt/backup/{config.yml,secrets.yml,.env} "/opt/configarr/"
cd /opt/configarr cd /opt/configarr
$STD pnpm install $STD pnpm install
$STD pnpm run build $STD pnpm run build

View File

@@ -9,7 +9,7 @@ APP="Element Synapse"
var_tags="${var_tags:-server}" var_tags="${var_tags:-server}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-2048}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}" var_disk="${var_disk:-8}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"

View File

@@ -61,7 +61,7 @@ function update_script() {
done done
msg_ok "Image-processing libraries up to date" msg_ok "Image-processing libraries up to date"
fi fi
RELEASE="1.140.0" RELEASE="1.140.1"
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
msg_info "Stopping Services" msg_info "Stopping Services"
systemctl stop immich-web systemctl stop immich-web

View File

@@ -27,6 +27,9 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
if ! grep -q "client_max_body_size[[:space:]]\+100M;" /etc/nginx/conf.d/snipeit.conf; then
sed -i '/index index.php;/i \ client_max_body_size 100M;' /etc/nginx/conf.d/snipeit.conf
fi
if check_for_gh_release "snipe-it" "snipe/snipe-it"; then if check_for_gh_release "snipe-it" "snipe/snipe-it"; then
msg_info "Stopping Services" msg_info "Stopping Services"

View File

@@ -45,13 +45,14 @@ function update_script() {
msg_info "Updating $APP" msg_info "Updating $APP"
cd /opt/wizarr cd /opt/wizarr
/usr/local/bin/uv -q sync --locked $STD /usr/local/bin/uv lock
$STD /usr/local/bin/uv -q run pybabel compile -d app/translations $STD /usr/local/bin/uv sync --locked
$STD /usr/local/bin/uv run pybabel compile -d app/translations
$STD npm --prefix app/static install $STD npm --prefix app/static install
$STD npm --prefix app/static run build:css $STD npm --prefix app/static run build:css
mkdir -p ./.cache mkdir -p ./.cache
$STD tar -xf "$BACKUP_FILE" --directory=/ $STD tar -xf "$BACKUP_FILE" --directory=/
$STD /usr/local/bin/uv -q run flask db upgrade $STD /usr/local/bin/uv run flask db upgrade
msg_ok "Updated $APP" msg_ok "Updated $APP"
msg_info "Starting $APP" msg_info "Starting $APP"
@@ -61,7 +62,7 @@ function update_script() {
msg_info "Cleaning Up" msg_info "Cleaning Up"
rm -rf "$BACKUP_FILE" rm -rf "$BACKUP_FILE"
msg_ok "Cleanup Completed" msg_ok "Cleanup Completed"
msg_ok "Update Successfully" msg_ok "Updated Successfully"
fi fi
exit exit
} }

View File

@@ -33,7 +33,7 @@
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"lucide-react": "^0.453.0", "lucide-react": "^0.453.0",
"mini-svg-data-uri": "^1.4.4", "mini-svg-data-uri": "^1.4.4",
"next": "15.2.4", "next": "15.5.2",
"next-themes": "^0.4.4", "next-themes": "^0.4.4",
"nuqs": "^2.4.1", "nuqs": "^2.4.1",
"pocketbase": "^0.21.5", "pocketbase": "^0.21.5",
@@ -742,9 +742,9 @@
} }
}, },
"node_modules/@emnapi/runtime": { "node_modules/@emnapi/runtime": {
"version": "1.4.3", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
"integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -1900,6 +1900,22 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
} }
}, },
"node_modules/@img/sharp-libvips-linux-ppc64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
"integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
"cpu": [
"ppc64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-s390x": { "node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
@@ -2008,6 +2024,28 @@
"@img/sharp-libvips-linux-arm64": "1.0.4" "@img/sharp-libvips-linux-arm64": "1.0.4"
} }
}, },
"node_modules/@img/sharp-linux-ppc64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
"integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
"cpu": [
"ppc64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-ppc64": "1.2.0"
}
},
"node_modules/@img/sharp-linux-s390x": { "node_modules/@img/sharp-linux-s390x": {
"version": "0.33.5", "version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
@@ -2115,6 +2153,25 @@
"url": "https://opencollective.com/libvips" "url": "https://opencollective.com/libvips"
} }
}, },
"node_modules/@img/sharp-win32-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
"integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
"cpu": [
"arm64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-ia32": { "node_modules/@img/sharp-win32-ia32": {
"version": "0.33.5", "version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
@@ -2244,9 +2301,9 @@
} }
}, },
"node_modules/@next/env": { "node_modules/@next/env": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz",
"integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==", "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@next/eslint-plugin-next": { "node_modules/@next/eslint-plugin-next": {
@@ -2260,9 +2317,9 @@
} }
}, },
"node_modules/@next/swc-darwin-arm64": { "node_modules/@next/swc-darwin-arm64": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz",
"integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==", "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2276,9 +2333,9 @@
} }
}, },
"node_modules/@next/swc-darwin-x64": { "node_modules/@next/swc-darwin-x64": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz",
"integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==", "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -2292,9 +2349,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-gnu": { "node_modules/@next/swc-linux-arm64-gnu": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz",
"integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==", "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2308,9 +2365,9 @@
} }
}, },
"node_modules/@next/swc-linux-arm64-musl": { "node_modules/@next/swc-linux-arm64-musl": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz",
"integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==", "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2324,9 +2381,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-gnu": { "node_modules/@next/swc-linux-x64-gnu": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz",
"integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==", "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -2340,9 +2397,9 @@
} }
}, },
"node_modules/@next/swc-linux-x64-musl": { "node_modules/@next/swc-linux-x64-musl": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz",
"integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==", "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -2356,9 +2413,9 @@
} }
}, },
"node_modules/@next/swc-win32-arm64-msvc": { "node_modules/@next/swc-win32-arm64-msvc": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz",
"integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==", "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -2372,9 +2429,9 @@
} }
}, },
"node_modules/@next/swc-win32-x64-msvc": { "node_modules/@next/swc-win32-x64-msvc": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz",
"integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==", "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -3739,12 +3796,6 @@
"eslint": ">=9.0.0" "eslint": ">=9.0.0"
} }
}, },
"node_modules/@swc/counter": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
"integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
"license": "Apache-2.0"
},
"node_modules/@swc/helpers": { "node_modules/@swc/helpers": {
"version": "0.5.15", "version": "0.5.15",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
@@ -5091,17 +5142,6 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"dependencies": {
"streamsearch": "^1.1.0"
},
"engines": {
"node": ">=10.16.0"
}
},
"node_modules/cac": { "node_modules/cac": {
"version": "6.7.14", "version": "6.7.14",
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
@@ -10385,15 +10425,13 @@
} }
}, },
"node_modules/next": { "node_modules/next": {
"version": "15.2.4", "version": "15.5.2",
"resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz", "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz",
"integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==", "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@next/env": "15.2.4", "@next/env": "15.5.2",
"@swc/counter": "0.1.3",
"@swc/helpers": "0.5.15", "@swc/helpers": "0.5.15",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579", "caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31", "postcss": "8.4.31",
"styled-jsx": "5.1.6" "styled-jsx": "5.1.6"
@@ -10405,19 +10443,19 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0" "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@next/swc-darwin-arm64": "15.2.4", "@next/swc-darwin-arm64": "15.5.2",
"@next/swc-darwin-x64": "15.2.4", "@next/swc-darwin-x64": "15.5.2",
"@next/swc-linux-arm64-gnu": "15.2.4", "@next/swc-linux-arm64-gnu": "15.5.2",
"@next/swc-linux-arm64-musl": "15.2.4", "@next/swc-linux-arm64-musl": "15.5.2",
"@next/swc-linux-x64-gnu": "15.2.4", "@next/swc-linux-x64-gnu": "15.5.2",
"@next/swc-linux-x64-musl": "15.2.4", "@next/swc-linux-x64-musl": "15.5.2",
"@next/swc-win32-arm64-msvc": "15.2.4", "@next/swc-win32-arm64-msvc": "15.5.2",
"@next/swc-win32-x64-msvc": "15.2.4", "@next/swc-win32-x64-msvc": "15.5.2",
"sharp": "^0.33.5" "sharp": "^0.34.3"
}, },
"peerDependencies": { "peerDependencies": {
"@opentelemetry/api": "^1.1.0", "@opentelemetry/api": "^1.1.0",
"@playwright/test": "^1.41.2", "@playwright/test": "^1.51.1",
"babel-plugin-react-compiler": "*", "babel-plugin-react-compiler": "*",
"react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
"react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
@@ -10448,6 +10486,367 @@
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
} }
}, },
"node_modules/next/node_modules/@img/sharp-darwin-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",
"integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-darwin-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
"integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-darwin-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz",
"integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-darwin-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz",
"integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-linux-arm": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
"integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
"cpu": [
"arm"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-linux-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
"integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
"integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
"cpu": [
"s390x"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-linux-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
"integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
"integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
"cpu": [
"arm64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-x64": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
"integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
"cpu": [
"x64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-linux-arm": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
"integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
"cpu": [
"arm"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-linux-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
"integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-linux-s390x": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
"integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
"cpu": [
"s390x"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-linux-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
"integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-linuxmusl-arm64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
"integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
"cpu": [
"arm64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-linuxmusl-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
"integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
"cpu": [
"x64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.2.0"
}
},
"node_modules/next/node_modules/@img/sharp-wasm32": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
"integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
"@emnapi/runtime": "^1.4.4"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-win32-ia32": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
"integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
"cpu": [
"ia32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/@img/sharp-win32-x64": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
"integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
"cpu": [
"x64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/next/node_modules/postcss": { "node_modules/next/node_modules/postcss": {
"version": "8.4.31", "version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -10476,6 +10875,49 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/next/node_modules/sharp": {
"version": "0.34.3",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz",
"integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"color": "^4.2.3",
"detect-libc": "^2.0.4",
"semver": "^7.7.2"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-darwin-arm64": "0.34.3",
"@img/sharp-darwin-x64": "0.34.3",
"@img/sharp-libvips-darwin-arm64": "1.2.0",
"@img/sharp-libvips-darwin-x64": "1.2.0",
"@img/sharp-libvips-linux-arm": "1.2.0",
"@img/sharp-libvips-linux-arm64": "1.2.0",
"@img/sharp-libvips-linux-ppc64": "1.2.0",
"@img/sharp-libvips-linux-s390x": "1.2.0",
"@img/sharp-libvips-linux-x64": "1.2.0",
"@img/sharp-libvips-linuxmusl-arm64": "1.2.0",
"@img/sharp-libvips-linuxmusl-x64": "1.2.0",
"@img/sharp-linux-arm": "0.34.3",
"@img/sharp-linux-arm64": "0.34.3",
"@img/sharp-linux-ppc64": "0.34.3",
"@img/sharp-linux-s390x": "0.34.3",
"@img/sharp-linux-x64": "0.34.3",
"@img/sharp-linuxmusl-arm64": "0.34.3",
"@img/sharp-linuxmusl-x64": "0.34.3",
"@img/sharp-wasm32": "0.34.3",
"@img/sharp-win32-arm64": "0.34.3",
"@img/sharp-win32-ia32": "0.34.3",
"@img/sharp-win32-x64": "0.34.3"
}
},
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.19", "version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
@@ -12257,14 +12699,6 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/string-ts": { "node_modules/string-ts": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.2.1.tgz", "resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.2.1.tgz",

2
frontend/package.json generated
View File

@@ -40,7 +40,7 @@
"fuse.js": "^7.1.0", "fuse.js": "^7.1.0",
"lucide-react": "^0.453.0", "lucide-react": "^0.453.0",
"mini-svg-data-uri": "^1.4.4", "mini-svg-data-uri": "^1.4.4",
"next": "15.2.4", "next": "15.5.2",
"next-themes": "^0.4.4", "next-themes": "^0.4.4",
"nuqs": "^2.4.1", "nuqs": "^2.4.1",
"pocketbase": "^0.21.5", "pocketbase": "^0.21.5",

View File

@@ -21,7 +21,7 @@
"resources": { "resources": {
"cpu": 1, "cpu": 1,
"ram": 512, "ram": 512,
"hdd": 2, "hdd": 10,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }

View File

@@ -31,5 +31,10 @@
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": [
{
"text": "Starting Booklore (Web UI) may take up to 2 minutes after a restart or fresh installation.",
"type": "info"
}
]
} }

View File

@@ -21,7 +21,7 @@
"resources": { "resources": {
"cpu": 1, "cpu": 1,
"ram": 2048, "ram": 2048,
"hdd": 4, "hdd": 8,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }

View File

@@ -32,6 +32,10 @@
"password": null "password": null
}, },
"notes": [ "notes": [
{
"text": "Please be aware that Immich releases are pinned to specific versions until compatibility has been confirmed by the Community Scripts maintainers; as a result, the version installed by the helper script may not be the most current version of Immich",
"type": "info"
},
{ {
"text": "During installation, you will be prompted with the option to install Intel OpenVINO for hardware-accelerated machine-learning. If you opt in, increase your LXC RAM after installation, as OpenVINO is memory-intensive", "text": "During installation, you will be prompted with the option to install Intel OpenVINO for hardware-accelerated machine-learning. If you opt in, increase your LXC RAM after installation, as OpenVINO is memory-intensive",
"type": "info" "type": "info"

View File

@@ -37,7 +37,7 @@
"type": "warning" "type": "warning"
}, },
{ {
"text": "Advanced Install is only possible without root password and root SSH access, you can configure this after installation.", "text": "Advanced Install is only possible with disabled IPV6! Otherwise the installation sometimes stuck.",
"type": "warning" "type": "warning"
} }
] ]

View File

@@ -1,29 +1,294 @@
[ [
{
"name": "Cleanuparr/Cleanuparr",
"version": "v2.2.2",
"date": "2025-09-03T20:58:13Z"
},
{
"name": "VictoriaMetrics/VictoriaMetrics",
"version": "pmm-6401-v1.125.1",
"date": "2025-09-03T20:17:18Z"
},
{
"name": "homarr-labs/homarr",
"version": "v1.35.1",
"date": "2025-09-03T18:53:36Z"
},
{
"name": "home-assistant/core",
"version": "2025.9.0",
"date": "2025-09-03T17:58:41Z"
},
{
"name": "NodeBB/NodeBB",
"version": "v4.5.0",
"date": "2025-09-03T17:42:18Z"
},
{
"name": "zitadel/zitadel",
"version": "v4.1.1",
"date": "2025-09-03T15:12:56Z"
},
{
"name": "Graylog2/graylog2-server",
"version": "6.1.15",
"date": "2025-09-03T14:51:37Z"
},
{
"name": "emqx/emqx",
"version": "v5.8.8",
"date": "2025-09-03T14:25:26Z"
},
{
"name": "rcourtman/Pulse",
"version": "v4.13.0",
"date": "2025-09-03T13:48:17Z"
},
{
"name": "glpi-project/glpi",
"version": "10.0.19",
"date": "2025-07-16T09:45:14Z"
},
{
"name": "Radarr/Radarr",
"version": "v5.27.5.10198",
"date": "2025-09-03T12:08:43Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.109.2",
"date": "2025-09-03T07:50:21Z"
},
{
"name": "Checkmk/checkmk",
"version": "v2.4.0p11",
"date": "2025-09-03T09:58:14Z"
},
{
"name": "mattermost/mattermost",
"version": "server/public/v0.1.17",
"date": "2025-09-02T21:38:40Z"
},
{
"name": "cockpit-project/cockpit",
"version": "346",
"date": "2025-09-03T09:13:05Z"
},
{
"name": "jenkinsci/jenkins",
"version": "jenkins-2.526",
"date": "2025-09-02T18:44:42Z"
},
{
"name": "apache/cassandra",
"version": "cassandra-4.1.10",
"date": "2025-09-03T08:46:02Z"
},
{
"name": "syncthing/syncthing",
"version": "v2.0.6",
"date": "2025-09-03T07:55:14Z"
},
{
"name": "morpheus65535/bazarr",
"version": "v1.5.3-beta.10",
"date": "2025-07-15T06:07:03Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.2411",
"date": "2025-09-03T05:51:25Z"
},
{
"name": "booklore-app/booklore",
"version": "v1.1.2",
"date": "2025-09-03T03:18:53Z"
},
{
"name": "jeedom/core",
"version": "4.4.19",
"date": "2025-09-03T00:27:10Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.2",
"date": "2025-07-17T12:08:03Z"
},
{ {
"name": "crafty-controller/crafty-4", "name": "crafty-controller/crafty-4",
"version": "v4.5.2", "version": "v4.5.3",
"date": "2025-08-31T22:21:50Z" "date": "2025-09-02T23:52:26Z"
},
{
"name": "mongodb/mongo",
"version": "r8.0.14-rc0",
"date": "2025-09-02T22:46:40Z"
},
{
"name": "keycloak/keycloak",
"version": "26.0.15",
"date": "2025-08-27T12:12:03Z"
},
{
"name": "ollama/ollama",
"version": "v0.11.8",
"date": "2025-08-28T19:27:13Z"
},
{
"name": "runtipi/runtipi",
"version": "nightly",
"date": "2025-09-02T19:26:18Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.2.5",
"date": "2025-09-02T17:25:13Z"
},
{
"name": "netbox-community/netbox",
"version": "v4.4.0",
"date": "2025-09-02T17:04:25Z"
},
{
"name": "element-hq/synapse",
"version": "v1.137.0",
"date": "2025-08-26T09:51:47Z"
},
{
"name": "rabbitmq/rabbitmq-server",
"version": "v4.1.4",
"date": "2025-09-02T14:26:24Z"
},
{
"name": "HabitRPG/habitica",
"version": "v5.40.0",
"date": "2025-09-02T14:09:11Z"
},
{
"name": "apache/tomcat",
"version": "10.1.45",
"date": "2025-09-02T12:46:34Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-ui@15.7.8",
"date": "2025-09-02T11:29:00Z"
},
{
"name": "Dolibarr/dolibarr",
"version": "22.0.1",
"date": "2025-09-02T10:29:08Z"
},
{
"name": "cloudreve/cloudreve",
"version": "4.7.0",
"date": "2025-09-02T06:02:43Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.3.2",
"date": "2025-08-19T04:08:36Z"
},
{
"name": "paperless-ngx/paperless-ngx",
"version": "v2.18.3",
"date": "2025-09-02T01:16:49Z"
},
{
"name": "ErsatzTV/ErsatzTV",
"version": "v25.5.0",
"date": "2025-09-02T01:00:11Z"
},
{
"name": "authelia/authelia",
"version": "v4.39.8",
"date": "2025-09-02T00:44:45Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.1.2",
"date": "2025-06-26T22:08:00Z"
},
{
"name": "postgres/postgres",
"version": "REL_18_RC1",
"date": "2025-09-01T20:03:08Z"
},
{
"name": "project-zot/zot",
"version": "v2.1.8",
"date": "2025-09-01T19:20:42Z"
},
{
"name": "Koenkk/zigbee2mqtt",
"version": "2.6.1",
"date": "2025-09-01T19:05:18Z"
},
{
"name": "outline/outline",
"version": "v0.87.3",
"date": "2025-09-01T16:25:43Z"
},
{
"name": "home-assistant/operating-system",
"version": "16.1",
"date": "2025-08-13T07:58:10Z"
},
{
"name": "seanmorley15/AdventureLog",
"version": "v0.11.0",
"date": "2025-09-01T16:19:38Z"
},
{
"name": "grafana/grafana",
"version": "rrc_steady_12.2.0-17245430286.patch1",
"date": "2025-09-01T14:19:14Z"
},
{
"name": "fallenbagel/jellyseerr",
"version": "preview-issue-description",
"date": "2025-09-01T12:21:58Z"
},
{
"name": "nzbgetcom/nzbget",
"version": "v25.3",
"date": "2025-09-01T09:47:06Z"
},
{
"name": "wazuh/wazuh",
"version": "coverity-w36-4.13.0",
"date": "2025-09-01T11:40:11Z"
},
{
"name": "grokability/snipe-it",
"version": "v8.3.1",
"date": "2025-09-01T11:00:07Z"
},
{
"name": "crowdsecurity/crowdsec",
"version": "v1.7.0",
"date": "2025-09-01T10:10:34Z"
},
{
"name": "readeck/readeck",
"version": "0.20.1",
"date": "2025-09-01T07:35:48Z"
},
{
"name": "moghtech/komodo",
"version": "v1.19.2",
"date": "2025-09-01T02:33:52Z"
}, },
{ {
"name": "YunoHost/yunohost", "name": "YunoHost/yunohost",
"version": "debian/12.1.17.1", "version": "debian/12.1.17.1",
"date": "2025-08-31T21:38:21Z" "date": "2025-08-31T21:38:21Z"
}, },
{
"name": "rcourtman/Pulse",
"version": "v4.12.1",
"date": "2025-08-31T21:33:41Z"
},
{ {
"name": "wizarrrr/wizarr", "name": "wizarrrr/wizarr",
"version": "2025.8.5", "version": "2025.8.5",
"date": "2025-08-31T17:56:37Z" "date": "2025-08-31T17:56:37Z"
}, },
{
"name": "outline/outline",
"version": "v0.87.1",
"date": "2025-08-31T16:45:06Z"
},
{ {
"name": "karakeep-app/karakeep", "name": "karakeep-app/karakeep",
"version": "ios/v1.8.0-1", "version": "ios/v1.8.0-1",
@@ -34,11 +299,6 @@
"version": "v1.7.3", "version": "v1.7.3",
"date": "2025-08-31T15:59:43Z" "date": "2025-08-31T15:59:43Z"
}, },
{
"name": "booklore-app/booklore",
"version": "v1.1.0",
"date": "2025-08-31T15:18:42Z"
},
{ {
"name": "Part-DB/Part-DB-server", "name": "Part-DB/Part-DB-server",
"version": "v2.0.2", "version": "v2.0.2",
@@ -49,41 +309,11 @@
"version": "v12.0.2", "version": "v12.0.2",
"date": "2025-08-31T13:15:47Z" "date": "2025-08-31T13:15:47Z"
}, },
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-openapi@9.3.4",
"date": "2025-08-31T11:48:08Z"
},
{
"name": "syncthing/syncthing",
"version": "v2.0.3",
"date": "2025-08-22T08:12:47Z"
},
{ {
"name": "Lidarr/Lidarr", "name": "Lidarr/Lidarr",
"version": "v2.13.3.4711", "version": "v2.13.3.4711",
"date": "2025-08-28T20:06:24Z" "date": "2025-08-28T20:06:24Z"
}, },
{
"name": "authelia/authelia",
"version": "v4.39.7",
"date": "2025-08-31T06:43:13Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.2384",
"date": "2025-08-31T05:57:46Z"
},
{
"name": "jeedom/core",
"version": "4.4.19",
"date": "2025-08-31T00:27:07Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v3.6.2",
"date": "2025-07-17T12:08:03Z"
},
{ {
"name": "jhuckaby/Cronicle", "name": "jhuckaby/Cronicle",
"version": "v0.9.91", "version": "v0.9.91",
@@ -104,76 +334,31 @@
"version": "v1.6.4", "version": "v1.6.4",
"date": "2025-08-18T20:22:07Z" "date": "2025-08-18T20:22:07Z"
}, },
{
"name": "readeck/readeck",
"version": "0.20.0",
"date": "2025-08-30T08:26:43Z"
},
{ {
"name": "henrygd/beszel", "name": "henrygd/beszel",
"version": "v0.12.6", "version": "v0.12.6",
"date": "2025-08-29T21:40:09Z" "date": "2025-08-29T21:40:09Z"
}, },
{
"name": "HabitRPG/habitica",
"version": "v5.39.1",
"date": "2025-08-29T21:02:00Z"
},
{ {
"name": "msgbyte/tianji", "name": "msgbyte/tianji",
"version": "v1.24.26", "version": "v1.24.26",
"date": "2025-08-29T20:26:08Z" "date": "2025-08-29T20:26:08Z"
}, },
{
"name": "homarr-labs/homarr",
"version": "v1.35.0",
"date": "2025-08-29T19:14:25Z"
},
{
"name": "home-assistant/core",
"version": "2025.8.3",
"date": "2025-08-21T18:23:10Z"
},
{ {
"name": "silverbulletmd/silverbullet", "name": "silverbulletmd/silverbullet",
"version": "2.0.0", "version": "2.0.0",
"date": "2025-08-29T13:38:35Z" "date": "2025-08-29T13:38:35Z"
}, },
{
"name": "nzbgetcom/nzbget",
"version": "v25.2",
"date": "2025-07-04T08:21:42Z"
},
{
"name": "keycloak/keycloak",
"version": "26.0.15",
"date": "2025-08-27T12:12:03Z"
},
{ {
"name": "Forceu/Gokapi", "name": "Forceu/Gokapi",
"version": "v2.1.0", "version": "v2.1.0",
"date": "2025-08-29T12:45:42Z" "date": "2025-08-29T12:56:13Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.2.4",
"date": "2025-08-29T12:19:53Z"
},
{
"name": "Graylog2/graylog2-server",
"version": "7.0.0-alpha.2",
"date": "2025-08-29T10:57:06Z"
}, },
{ {
"name": "semaphoreui/semaphore", "name": "semaphoreui/semaphore",
"version": "v2.16.19", "version": "v2.16.19",
"date": "2025-08-29T05:53:48Z" "date": "2025-08-29T05:53:48Z"
}, },
{
"name": "firefly-iii/firefly-iii",
"version": "v6.3.2",
"date": "2025-08-19T04:08:36Z"
},
{ {
"name": "openobserve/openobserve", "name": "openobserve/openobserve",
"version": "v0.15.0", "version": "v0.15.0",
@@ -189,11 +374,6 @@
"version": "2025.8.2", "version": "2025.8.2",
"date": "2025-08-29T00:38:54Z" "date": "2025-08-29T00:38:54Z"
}, },
{
"name": "Dolibarr/dolibarr",
"version": "21.0.3",
"date": "2025-08-28T21:05:15Z"
},
{ {
"name": "9001/copyparty", "name": "9001/copyparty",
"version": "v1.19.7", "version": "v1.19.7",
@@ -209,26 +389,11 @@
"version": "0.50.11", "version": "0.50.11",
"date": "2025-08-28T20:12:30Z" "date": "2025-08-28T20:12:30Z"
}, },
{
"name": "ollama/ollama",
"version": "v0.11.8",
"date": "2025-08-28T19:27:13Z"
},
{
"name": "mongodb/mongo",
"version": "r7.0.24-rc0",
"date": "2025-08-28T19:08:13Z"
},
{ {
"name": "benjaminjonard/koillection", "name": "benjaminjonard/koillection",
"version": "1.7.0", "version": "1.7.0",
"date": "2025-08-28T18:10:59Z" "date": "2025-08-28T18:10:59Z"
}, },
{
"name": "grokability/snipe-it",
"version": "v8.3.0",
"date": "2025-08-28T17:49:06Z"
},
{ {
"name": "gristlabs/grist-core", "name": "gristlabs/grist-core",
"version": "v1.7.3", "version": "v1.7.3",
@@ -244,21 +409,11 @@
"version": "1.2.37", "version": "1.2.37",
"date": "2025-08-28T16:25:55Z" "date": "2025-08-28T16:25:55Z"
}, },
{
"name": "home-assistant/operating-system",
"version": "16.1",
"date": "2025-08-13T07:58:10Z"
},
{ {
"name": "influxdata/influxdb", "name": "influxdata/influxdb",
"version": "v3.4.1", "version": "v3.4.1",
"date": "2025-08-28T13:56:00Z" "date": "2025-08-28T13:56:00Z"
}, },
{
"name": "zitadel/zitadel",
"version": "v4.0.3",
"date": "2025-08-22T07:43:52Z"
},
{ {
"name": "open-webui/open-webui", "name": "open-webui/open-webui",
"version": "v0.6.26", "version": "v0.6.26",
@@ -269,16 +424,6 @@
"version": "4.4.45", "version": "4.4.45",
"date": "2025-08-28T10:12:16Z" "date": "2025-08-28T10:12:16Z"
}, },
{
"name": "apache/cassandra",
"version": "4.1.10-tentative",
"date": "2025-08-28T10:02:40Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.108.2",
"date": "2025-08-27T13:05:35Z"
},
{ {
"name": "garethgeorge/backrest", "name": "garethgeorge/backrest",
"version": "v1.9.2", "version": "v1.9.2",
@@ -289,11 +434,6 @@
"version": "1.23.3", "version": "1.23.3",
"date": "2025-08-28T02:50:06Z" "date": "2025-08-28T02:50:06Z"
}, },
{
"name": "rabbitmq/rabbitmq-server",
"version": "v4.1.3",
"date": "2025-08-04T12:13:45Z"
},
{ {
"name": "pocket-id/pocket-id", "name": "pocket-id/pocket-id",
"version": "v1.10.0", "version": "v1.10.0",
@@ -334,41 +474,16 @@
"version": "v12.0.8", "version": "v12.0.8",
"date": "2025-08-27T06:22:32Z" "date": "2025-08-27T06:22:32Z"
}, },
{
"name": "netbox-community/netbox",
"version": "v4.3.7",
"date": "2025-08-26T17:54:25Z"
},
{
"name": "jenkinsci/jenkins",
"version": "jenkins-2.525",
"date": "2025-08-26T14:28:44Z"
},
{ {
"name": "meilisearch/meilisearch", "name": "meilisearch/meilisearch",
"version": "latest", "version": "latest",
"date": "2025-08-26T14:14:42Z" "date": "2025-08-26T14:14:42Z"
}, },
{
"name": "element-hq/synapse",
"version": "v1.137.0",
"date": "2025-08-26T09:51:47Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.1.2",
"date": "2025-06-26T22:08:00Z"
},
{ {
"name": "evcc-io/evcc", "name": "evcc-io/evcc",
"version": "0.207.5", "version": "0.207.5",
"date": "2025-08-26T06:57:07Z" "date": "2025-08-26T06:57:07Z"
}, },
{
"name": "morpheus65535/bazarr",
"version": "v1.5.3-beta.10",
"date": "2025-07-15T06:07:03Z"
},
{ {
"name": "documenso/documenso", "name": "documenso/documenso",
"version": "v1.12.2-rc.6", "version": "v1.12.2-rc.6",
@@ -394,21 +509,6 @@
"version": "v3.1.2", "version": "v3.1.2",
"date": "2025-08-25T18:00:52Z" "date": "2025-08-25T18:00:52Z"
}, },
{
"name": "Checkmk/checkmk",
"version": "v2.3.0p36",
"date": "2025-08-25T15:32:14Z"
},
{
"name": "wazuh/wazuh",
"version": "coverity-w35-4.13.0",
"date": "2025-08-25T15:17:33Z"
},
{
"name": "crowdsecurity/crowdsec",
"version": "v1.6.11",
"date": "2025-07-22T12:11:38Z"
},
{ {
"name": "sabnzbd/sabnzbd", "name": "sabnzbd/sabnzbd",
"version": "4.5.3", "version": "4.5.3",
@@ -419,11 +519,6 @@
"version": "7.4.2", "version": "7.4.2",
"date": "2025-08-25T12:38:14Z" "date": "2025-08-25T12:38:14Z"
}, },
{
"name": "emqx/emqx",
"version": "e5.10.1-beta.2",
"date": "2025-08-25T08:51:40Z"
},
{ {
"name": "FlareSolverr/FlareSolverr", "name": "FlareSolverr/FlareSolverr",
"version": "v3.4.0", "version": "v3.4.0",
@@ -439,26 +534,11 @@
"version": "v4.47.1", "version": "v4.47.1",
"date": "2025-01-05T21:14:23Z" "date": "2025-01-05T21:14:23Z"
}, },
{
"name": "moghtech/komodo",
"version": "v1.19.1",
"date": "2025-08-24T20:16:32Z"
},
{
"name": "runtipi/runtipi",
"version": "v4.3.0",
"date": "2025-07-05T12:14:52Z"
},
{ {
"name": "wavelog/wavelog", "name": "wavelog/wavelog",
"version": "2.1", "version": "2.1",
"date": "2025-08-24T15:42:19Z" "date": "2025-08-24T15:42:19Z"
}, },
{
"name": "Radarr/Radarr",
"version": "v5.26.2.10099",
"date": "2025-06-11T20:10:39Z"
},
{ {
"name": "Prowlarr/Prowlarr", "name": "Prowlarr/Prowlarr",
"version": "v2.0.5.5160", "version": "v2.0.5.5160",
@@ -494,11 +574,6 @@
"version": "v2.10.2", "version": "v2.10.2",
"date": "2025-08-23T03:10:31Z" "date": "2025-08-23T03:10:31Z"
}, },
{
"name": "paperless-ngx/paperless-ngx",
"version": "v2.18.2",
"date": "2025-08-22T23:56:41Z"
},
{ {
"name": "tailscale/tailscale", "name": "tailscale/tailscale",
"version": "v1.86.5", "version": "v1.86.5",
@@ -514,11 +589,6 @@
"version": "version/2025.8.1", "version": "version/2025.8.1",
"date": "2025-08-22T14:55:30Z" "date": "2025-08-22T14:55:30Z"
}, },
{
"name": "mattermost/mattermost",
"version": "v10.11.2",
"date": "2025-08-22T06:50:56Z"
},
{ {
"name": "lazy-media/Reactive-Resume", "name": "lazy-media/Reactive-Resume",
"version": "v1.2.4", "version": "v1.2.4",
@@ -534,11 +604,6 @@
"version": "v6.9.1", "version": "v6.9.1",
"date": "2025-08-22T04:04:12Z" "date": "2025-08-22T04:04:12Z"
}, },
{
"name": "cloudreve/cloudreve",
"version": "4.6.0",
"date": "2025-08-22T02:21:40Z"
},
{ {
"name": "hargata/lubelog", "name": "hargata/lubelog",
"version": "v1.5.0", "version": "v1.5.0",
@@ -559,21 +624,11 @@
"version": "v1.4.6", "version": "v1.4.6",
"date": "2025-08-21T14:05:58Z" "date": "2025-08-21T14:05:58Z"
}, },
{
"name": "glpi-project/glpi",
"version": "10.0.19",
"date": "2025-07-16T09:45:14Z"
},
{ {
"name": "AdguardTeam/AdGuardHome", "name": "AdguardTeam/AdGuardHome",
"version": "v0.107.65", "version": "v0.107.65",
"date": "2025-08-20T14:02:28Z" "date": "2025-08-20T14:02:28Z"
}, },
{
"name": "cockpit-project/cockpit",
"version": "345",
"date": "2025-08-20T11:52:24Z"
},
{ {
"name": "openhab/openhab-core", "name": "openhab/openhab-core",
"version": "4.3.7", "version": "4.3.7",
@@ -599,11 +654,6 @@
"version": "v5.8.0", "version": "v5.8.0",
"date": "2025-08-19T16:46:00Z" "date": "2025-08-19T16:46:00Z"
}, },
{
"name": "fallenbagel/jellyseerr",
"version": "preview-dns-cache-manager",
"date": "2025-08-19T11:57:00Z"
},
{ {
"name": "chrisvel/tududi", "name": "chrisvel/tududi",
"version": "v0.80", "version": "v0.80",
@@ -629,11 +679,6 @@
"version": "8.2.1", "version": "8.2.1",
"date": "2025-08-18T15:42:48Z" "date": "2025-08-18T15:42:48Z"
}, },
{
"name": "VictoriaMetrics/VictoriaMetrics",
"version": "pmm-6401-v1.124.0",
"date": "2025-08-18T12:14:50Z"
},
{ {
"name": "jupyter/notebook", "name": "jupyter/notebook",
"version": "@jupyter-notebook/ui-components@7.5.0-alpha.2", "version": "@jupyter-notebook/ui-components@7.5.0-alpha.2",
@@ -684,11 +729,6 @@
"version": "v2.2.1", "version": "v2.2.1",
"date": "2025-08-13T19:49:01Z" "date": "2025-08-13T19:49:01Z"
}, },
{
"name": "grafana/grafana",
"version": "v12.1.1",
"date": "2025-08-13T17:54:07Z"
},
{ {
"name": "go-gitea/gitea", "name": "go-gitea/gitea",
"version": "v1.24.5", "version": "v1.24.5",
@@ -719,21 +759,11 @@
"version": "v1.0.0-beta16", "version": "v1.0.0-beta16",
"date": "2025-08-11T21:19:48Z" "date": "2025-08-11T21:19:48Z"
}, },
{
"name": "postgres/postgres",
"version": "REL_13_22",
"date": "2025-08-11T21:10:58Z"
},
{ {
"name": "FlowiseAI/Flowise", "name": "FlowiseAI/Flowise",
"version": "flowise@3.0.5", "version": "flowise@3.0.5",
"date": "2025-08-11T13:01:45Z" "date": "2025-08-11T13:01:45Z"
}, },
{
"name": "Cleanuparr/Cleanuparr",
"version": "v2.1.6",
"date": "2025-08-11T08:04:09Z"
},
{ {
"name": "slskd/slskd", "name": "slskd/slskd",
"version": "0.23.2", "version": "0.23.2",
@@ -784,11 +814,6 @@
"version": "v25.08.1", "version": "v25.08.1",
"date": "2025-08-06T21:04:07Z" "date": "2025-08-06T21:04:07Z"
}, },
{
"name": "NodeBB/NodeBB",
"version": "v4.4.6",
"date": "2025-08-06T17:48:36Z"
},
{ {
"name": "TryGhost/Ghost-CLI", "name": "TryGhost/Ghost-CLI",
"version": "v1.28.3", "version": "v1.28.3",
@@ -804,11 +829,6 @@
"version": "4.7.30", "version": "4.7.30",
"date": "2025-08-05T17:23:06Z" "date": "2025-08-05T17:23:06Z"
}, },
{
"name": "ErsatzTV/ErsatzTV",
"version": "v25.4.0",
"date": "2025-08-05T17:10:01Z"
},
{ {
"name": "binwiederhier/ntfy", "name": "binwiederhier/ntfy",
"version": "v2.14.0", "version": "v2.14.0",
@@ -819,21 +839,11 @@
"version": "v2.0.116", "version": "v2.0.116",
"date": "2025-08-05T04:45:21Z" "date": "2025-08-05T04:45:21Z"
}, },
{
"name": "apache/tomcat",
"version": "10.1.44",
"date": "2025-08-04T13:17:59Z"
},
{ {
"name": "Tautulli/Tautulli", "name": "Tautulli/Tautulli",
"version": "v2.15.3", "version": "v2.15.3",
"date": "2025-08-03T17:27:16Z" "date": "2025-08-03T17:27:16Z"
}, },
{
"name": "project-zot/zot",
"version": "v2.1.7",
"date": "2025-08-03T16:35:59Z"
},
{ {
"name": "linuxserver/Heimdall", "name": "linuxserver/Heimdall",
"version": "v2.7.4", "version": "v2.7.4",
@@ -859,11 +869,6 @@
"version": "v0.22.2", "version": "v0.22.2",
"date": "2025-08-01T23:27:06Z" "date": "2025-08-01T23:27:06Z"
}, },
{
"name": "Koenkk/zigbee2mqtt",
"version": "2.6.0",
"date": "2025-08-01T15:42:21Z"
},
{ {
"name": "alexta69/metube", "name": "alexta69/metube",
"version": "2025.07.31", "version": "2025.07.31",
@@ -1109,11 +1114,6 @@
"version": "v0.8.4", "version": "v0.8.4",
"date": "2025-06-10T07:57:14Z" "date": "2025-06-10T07:57:14Z"
}, },
{
"name": "seanmorley15/AdventureLog",
"version": "v0.10.0",
"date": "2025-06-09T13:37:07Z"
},
{ {
"name": "jordan-dalby/ByteStash", "name": "jordan-dalby/ByteStash",
"version": "v1.5.8", "version": "v1.5.8",

View File

@@ -36,19 +36,24 @@ export function formattedBadge(type: string) {
return null; return null;
} }
// random Script function getRandomScript(categories: Category[], previouslySelected: Set<string> = new Set()): Script | null {
function getRandomScript(categories: Category[]): Script | null {
const allScripts = categories.flatMap(cat => cat.scripts || []); const allScripts = categories.flatMap(cat => cat.scripts || []);
if (allScripts.length === 0) if (allScripts.length === 0)
return null; return null;
const idx = Math.floor(Math.random() * allScripts.length);
return allScripts[idx]; const availableScripts = allScripts.filter(script => !previouslySelected.has(script.slug));
if (availableScripts.length === 0) {
return allScripts[Math.floor(Math.random() * allScripts.length)];
}
const idx = Math.floor(Math.random() * availableScripts.length);
return availableScripts[idx];
} }
export default function CommandMenu() { function CommandMenu() {
const [open, setOpen] = React.useState(false); const [open, setOpen] = React.useState(false);
const [links, setLinks] = React.useState<Category[]>([]); const [links, setLinks] = React.useState<Category[]>([]);
const [isLoading, setIsLoading] = React.useState(false); const [isLoading, setIsLoading] = React.useState(false);
const [selectedScripts, setSelectedScripts] = React.useState<Set<string>>(new Set());
const router = useRouter(); const router = useRouter();
const fetchSortedCategories = () => { const fetchSortedCategories = () => {
@@ -65,25 +70,26 @@ export default function CommandMenu() {
}; };
React.useEffect(() => { React.useEffect(() => {
const down = (e: KeyboardEvent) => { const handleKeyDown = (e: KeyboardEvent) => {
if (e.key === "k" && (e.metaKey || e.ctrlKey)) { if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
e.preventDefault(); e.preventDefault();
fetchSortedCategories(); fetchSortedCategories();
setOpen(open => !open); setOpen(open => !open);
} }
}; };
document.addEventListener("keydown", down); document.addEventListener("keydown", handleKeyDown);
return () => document.removeEventListener("keydown", down); return () => document.removeEventListener("keydown", handleKeyDown);
}, []); }, []);
const openRandomScript = async () => { const handleOpenRandomScript = async () => {
if (links.length === 0) { if (links.length === 0) {
setIsLoading(true); setIsLoading(true);
try { try {
const categories = await fetchCategories(); const categories = await fetchCategories();
setLinks(categories); setLinks(categories);
const randomScript = getRandomScript(categories); const randomScript = getRandomScript(categories, selectedScripts);
if (randomScript) { if (randomScript) {
setSelectedScripts(prev => new Set([...prev, randomScript.slug]));
router.push(`/scripts?id=${randomScript.slug}`); router.push(`/scripts?id=${randomScript.slug}`);
} }
} }
@@ -92,13 +98,54 @@ export default function CommandMenu() {
} }
} }
else { else {
const randomScript = getRandomScript(links); const randomScript = getRandomScript(links, selectedScripts);
if (randomScript) { if (randomScript) {
setSelectedScripts(prev => new Set([...prev, randomScript.slug]));
router.push(`/scripts?id=${randomScript.slug}`); router.push(`/scripts?id=${randomScript.slug}`);
} }
} }
}; };
const getUniqueScriptsMap = React.useCallback(() => {
const scriptMap = new Map<string, { script: Script; categoryName: string }>();
for (const category of links) {
for (const script of category.scripts) {
if (!scriptMap.has(script.slug)) {
scriptMap.set(script.slug, { script, categoryName: category.name });
}
}
}
return scriptMap;
}, [links]);
const getUniqueScriptsByCategory = React.useCallback(() => {
const scriptMap = getUniqueScriptsMap();
const categoryOrder = links.map(cat => cat.name);
const grouped: Record<string, Script[]> = {};
for (const name of categoryOrder) {
grouped[name] = [];
}
for (const { script, categoryName } of scriptMap.values()) {
if (grouped[categoryName]) {
grouped[categoryName].push(script);
}
else {
grouped[categoryName] = [script];
}
}
Object.keys(grouped).forEach((cat) => {
if (grouped[cat].length === 0)
delete grouped[cat];
});
return grouped;
}, [getUniqueScriptsMap, links]);
const uniqueScriptsByCategory = getUniqueScriptsByCategory();
return ( return (
<> <>
<div className="flex gap-2"> <div className="flex gap-2">
@@ -122,7 +169,20 @@ export default function CommandMenu() {
<TooltipProvider> <TooltipProvider>
<Tooltip delayDuration={100}> <Tooltip delayDuration={100}>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<Button variant="outline" size="icon" onClick={openRandomScript} disabled={isLoading} className="hidden lg:flex"> <Button
variant="outline"
size="icon"
onClick={handleOpenRandomScript}
disabled={isLoading}
className="hidden lg:flex"
aria-label="Open Random Script"
tabIndex={0}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === " ") {
handleOpenRandomScript();
}
}}
>
<Sparkles className="size-4" /> <Sparkles className="size-4" />
<span className="sr-only">Open Random Script</span> <span className="sr-only">Open Random Script</span>
</Button> </Button>
@@ -139,16 +199,24 @@ export default function CommandMenu() {
<CommandInput placeholder="Search for a script..." /> <CommandInput placeholder="Search for a script..." />
<CommandList> <CommandList>
<CommandEmpty>{isLoading ? "Loading..." : "No scripts found."}</CommandEmpty> <CommandEmpty>{isLoading ? "Loading..." : "No scripts found."}</CommandEmpty>
{links.map(category => ( {Object.entries(uniqueScriptsByCategory).map(([categoryName, scripts]) => (
<CommandGroup key={`category:${category.name}`} heading={category.name}> <CommandGroup key={`category:${categoryName}`} heading={categoryName}>
{category.scripts.map(script => ( {scripts.map(script => (
<CommandItem <CommandItem
key={`script:${script.slug}`} key={`script:${script.slug}`}
value={`${script.slug}-${script.name}`} value={`${script.name}-${script.type}`}
onSelect={() => { onSelect={() => {
setOpen(false); setOpen(false);
router.push(`/scripts?id=${script.slug}`); router.push(`/scripts?id=${script.slug}`);
}} }}
tabIndex={0}
aria-label={`Open script ${script.name}`}
onKeyDown={(e) => {
if (e.key === "Enter" || e.key === " ") {
setOpen(false);
router.push(`/scripts?id=${script.slug}`);
}
}}
> >
<div className="flex gap-2" onClick={() => setOpen(false)}> <div className="flex gap-2" onClick={() => setOpen(false)}>
<Image <Image
@@ -172,3 +240,5 @@ export default function CommandMenu() {
</> </>
); );
} }
export default CommandMenu;

View File

@@ -280,7 +280,7 @@ 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" "v1.140.0" "$SRC_DIR" fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.140.1" "$SRC_DIR"
msg_info "Installing ${APPLICATION} (more patience please)" msg_info "Installing ${APPLICATION} (more patience please)"

View File

@@ -56,6 +56,7 @@ RELEASE=$(curl -fsSL https://api.github.com/repos/netbox-community/netbox/releas
curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip" curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip"
$STD unzip "v${RELEASE}.zip" $STD unzip "v${RELEASE}.zip"
mv /opt/netbox-"${RELEASE}"/ /opt/netbox mv /opt/netbox-"${RELEASE}"/ /opt/netbox
mkdir -p /opt/netbox/netbox/media
$STD adduser --system --group netbox $STD adduser --system --group netbox
chown --recursive netbox /opt/netbox/netbox/media/ chown --recursive netbox /opt/netbox/netbox/media/

View File

@@ -62,6 +62,7 @@ server {
listen 80; listen 80;
root /opt/snipe-it/public; root /opt/snipe-it/public;
server_name $IPADDRESS; server_name $IPADDRESS;
client_max_body_size 100M;
index index.php; index index.php;
location / { location / {

View File

@@ -23,12 +23,13 @@ fetch_and_deploy_gh_release "wizarr" "wizarrrr/wizarr"
msg_info "Configure ${APPLICATION}" msg_info "Configure ${APPLICATION}"
cd /opt/wizarr cd /opt/wizarr
/usr/local/bin/uv -q sync --locked $STD /usr/local/bin/uv lock
$STD /usr/local/bin/uv -q run pybabel compile -d app/translations $STD /usr/local/bin/uv sync --locked
$STD /usr/local/bin/uv run pybabel compile -d app/translations
$STD npm --prefix app/static install $STD npm --prefix app/static install
$STD npm --prefix app/static run build:css $STD npm --prefix app/static run build:css
mkdir -p ./.cache mkdir -p ./.cache
$STD /usr/local/bin/uv -q run flask db upgrade $STD /usr/local/bin/uv run flask db upgrade
msg_ok "Configure ${APPLICATION}" msg_ok "Configure ${APPLICATION}"
msg_info "Creating env, start script and service" msg_info "Creating env, start script and service"

View File

@@ -1944,8 +1944,9 @@ function setup_ffmpeg() {
check_for_gh_release() { check_for_gh_release() {
local app="$1" local app="$1"
local source="$2" local source="$2"
local pinned_version="${3:-}" # optional local pinned_version_in="${3:-}" # optional
local current_file="$HOME/.${app,,}" local app_lc="${app,,}"
local current_file="$HOME/.${app_lc}"
msg_info "Checking for update: ${app}" msg_info "Checking for update: ${app}"
@@ -1964,82 +1965,83 @@ check_for_gh_release() {
} }
fi fi
# Fetch releases (newest → oldest) # Fetch releases and exclude drafts/prereleases
local releases local releases_json
releases=$( releases_json=$(curl -fsSL --max-time 20 \
curl -fsSL --max-time 15 \
-H 'Accept: application/vnd.github+json' \ -H 'Accept: application/vnd.github+json' \
-H 'X-GitHub-Api-Version: 2022-11-28' \ -H 'X-GitHub-Api-Version: 2022-11-28' \
"https://api.github.com/repos/${source}/releases" | "https://api.github.com/repos/${source}/releases") || {
jq -r '.[].tag_name' | sed 's/^v//'
) || true
if [[ -z "$releases" ]]; then
msg_error "Unable to fetch releases for ${app}" msg_error "Unable to fetch releases for ${app}"
return 1 return 1
fi
# Define current and latest versions
local latest current
latest=$(echo "$releases" | head -n1)
current=""
[[ -f "$current_file" ]] && current="$(<"$current_file")"
# Helper: get index of a version (lower = newer)
get_index() {
local ver="${1:-}"
[[ -z "$ver" ]] && return 1
nl -ba <<<"$releases" | awk -v v="$ver" '$2==v{print $1; exit}'
} }
# Pinning enabled mapfile -t raw_tags < <(jq -r '.[] | select(.draft==false and .prerelease==false) | .tag_name' <<<"$releases_json")
if [[ -n "$pinned_version" ]]; then if ((${#raw_tags[@]} == 0)); then
if ! grep -qxF "$pinned_version" <<<"$releases"; then msg_error "No stable releases found for ${app}"
msg_error "Pinned version v${pinned_version} not found upstream"
return 1 return 1
fi fi
if [[ -z "$current" ]]; then local clean_tags=()
msg_info "${app} pinned to v${pinned_version}, no local version → install required" for t in "${raw_tags[@]}"; do
CHECK_UPDATE_RELEASE="$pinned_version" clean_tags+=("${t#v}")
return 0 done
fi
if [[ "$current" == "$pinned_version" ]]; then local latest_raw="${raw_tags[0]}"
if [[ "$pinned_version" == "$latest" ]]; then local latest_clean="${clean_tags[0]}"
msg_ok "${app} pinned to v${pinned_version} (up to date)"
# current installed (stored without v)
local current=""
if [[ -f "$current_file" ]]; then
current="$(<"$current_file")"
else else
msg_ok "${app} pinned to v${pinned_version} (already installed, upstream v${latest})" # Migration: search for any /opt/*_version.txt
local legacy_files
mapfile -t legacy_files < <(find /opt -maxdepth 1 -type f -name "*_version.txt" 2>/dev/null)
if ((${#legacy_files[@]} == 1)); then
current="$(<"${legacy_files[0]}")"
echo "${current#v}" >"$current_file"
rm -f "${legacy_files[0]}"
fi
fi
current="${current#v}"
# Pinned version handling
if [[ -n "$pinned_version_in" ]]; then
local pin_clean="${pinned_version_in#v}"
local match_raw=""
for i in "${!clean_tags[@]}"; do
if [[ "${clean_tags[$i]}" == "$pin_clean" ]]; then
match_raw="${raw_tags[$i]}"
break
fi
done
if [[ -z "$match_raw" ]]; then
msg_error "Pinned version ${pinned_version_in} not found upstream"
return 1
fi
if [[ "$current" != "$pin_clean" ]]; then
msg_info "${app} pinned to ${pinned_version_in} (installed ${current:-none}) → update required"
CHECK_UPDATE_RELEASE="$match_raw"
return 0
fi
if [[ "$pin_clean" == "$latest_clean" ]]; then
msg_ok "${app} pinned to ${pinned_version_in} (up to date)"
else
msg_ok "${app} pinned to ${pinned_version_in} (already installed, upstream ${latest_raw})"
fi fi
return 1 return 1
fi fi
local pinned_index current_index # No pinning → use latest
pinned_index="$(get_index "$pinned_version" || true)" if [[ -z "$current" || "$current" != "$latest_clean" ]]; then
current_index="$(get_index "$current" || true)" CHECK_UPDATE_RELEASE="$latest_raw"
msg_info "New release available: ${latest_raw} (current: v${current:-none})"
if [[ -z "$current_index" ]] || [[ "$current_index" -gt "$pinned_index" ]]; then
msg_info "${app} pinned to v${pinned_version} (installed v${current:-none}) → update required"
CHECK_UPDATE_RELEASE="$pinned_version"
return 0 return 0
fi fi
if [[ "$current_index" -lt "$pinned_index" ]]; then msg_ok "${app} is up to date (${latest_raw})"
msg_info "${app} pinned to v${pinned_version} (installed newer v${current}) → downgrade required"
CHECK_UPDATE_RELEASE="$pinned_version"
return 0
fi
return 1
fi
# No pinning → compare against latest
if [[ -z "$current" || "$current" != "$latest" ]]; then
CHECK_UPDATE_RELEASE="$latest"
msg_info "New release available: v${latest} (current: v${current:-none})"
return 0
fi
msg_ok "${app} is up to date (v${latest})"
return 1 return 1
} }

File diff suppressed because it is too large Load Diff

View File

@@ -208,11 +208,11 @@ function exit-script() {
function default_settings() { function default_settings() {
BRANCH="$stable" BRANCH="$stable"
VMID=$(get_valid_nextid) VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" MACHINE="q35"
MACHINE="" FORMAT=""
DISK_CACHE="cache=writethrough," DISK_SIZE="32G"
HN="haos$stable" HN="haos-${BRANCH}"
CPU_TYPE=" -cpu host" CPU_TYPE=""
CORE_COUNT="2" CORE_COUNT="2"
RAM_SIZE="4096" RAM_SIZE="4096"
BRG="vmbr0" BRG="vmbr0"
@@ -222,9 +222,8 @@ function default_settings() {
START_VM="yes" START_VM="yes"
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}q35${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
@@ -268,16 +267,16 @@ function advanced_settings() {
fi fi
done done
if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Machine Type" 10 58 2 \
"i440fx" "Machine i440fx" ON \ "q35" "Modern (PCIe, UEFI, default)" ON \
"q35" "Machine q35" OFF \ "i440fx" "Legacy (older compatibility)" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ $MACH = q35 ]; then if [ "$MACH" = "q35" ]; then
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}"
FORMAT="" FORMAT=""
MACHINE=" -machine q35" MACHINE=" -machine q35"
else else
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
fi fi
@@ -327,17 +326,20 @@ function advanced_settings() {
exit-script exit-script
fi fi
if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \
"0" "KVM64" OFF \ "KVM64" "Default safe for migration/compatibility" ON \
"1" "Host (Default)" ON \ "Host" "Use host CPU features (faster, no migration)" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ $CPU_TYPE1 = "1" ]; then case "$CPU_TYPE1" in
Host)
echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
CPU_TYPE=" -cpu host" CPU_TYPE=" -cpu host"
else ;;
*)
echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
CPU_TYPE="" CPU_TYPE=""
fi ;;
esac
else else
exit-script exit-script
fi fi
@@ -484,51 +486,70 @@ msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
var_version="${BRANCH}" var_version="${BRANCH}"
msg_info "Retrieving the URL for Home Assistant ${BRANCH} Disk Image" msg_info "Retrieving the URL for Home Assistant ${BRANCH} Disk Image"
if [ "$BRANCH" == "$dev" ]; then if [ "$BRANCH" == "$dev" ]; then
URL=https://os-artifacts.home-assistant.io/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz URL="https://os-artifacts.home-assistant.io/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz"
else else
URL=https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz URL="https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz"
fi fi
sleep 2
CACHE_DIR="/var/lib/vz/template/cache"
CACHE_FILE="$CACHE_DIR/$(basename "$URL")"
FILE_IMG="/var/lib/vz/template/tmp/${CACHE_FILE##*/%.xz}" # .qcow2
mkdir -p "$CACHE_DIR" "$(dirname "$FILE_IMG")"
msg_ok "${CL}${BL}${URL}${CL}" msg_ok "${CL}${BL}${URL}${CL}"
curl -f#SL -o "$(basename "$URL")" "$URL"
echo -en "\e[1A\e[0K"
FILE=$(basename $URL)
msg_ok "Downloaded ${CL}${BL}haos_ova-${BRANCH}.qcow2.xz${CL}"
msg_info "Extracting KVM Disk Image" if [[ ! -s "$CACHE_FILE" ]]; then
unxz $FILE curl -f#SL -o "$CACHE_FILE" "$URL"
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') msg_ok "Downloaded ${CL}${BL}$(basename "$CACHE_FILE")${CL}"
case $STORAGE_TYPE in else
nfs | dir) msg_ok "Using cached image ${CL}${BL}$(basename "$CACHE_FILE")${CL}"
DISK_EXT=".raw" fi
DISK_REF="$VMID/"
DISK_IMPORT="-format raw"
THIN=""
;;
btrfs | local-zfs)
DISK_EXT=".raw"
DISK_REF="$VMID/"
DISK_IMPORT="-format raw"
FORMAT=",efitype=4m"
THIN=""
;;
esac
for i in {0,1}; do
disk="DISK$i"
eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
done
msg_ok "Extracted KVM Disk Image"
msg_info "Creating Homeassistant OS VM" if ! command -v pv &>/dev/null; then
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ apt-get update -qq &>/dev/null && apt-get install -y pv &>/dev/null
-name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci fi
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
qm importdisk $VMID ${FILE%.*} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null set -o pipefail
qm set $VMID \ msg_info "Creating Home Assistant OS VM shell"
-efidisk0 ${DISK0_REF}${FORMAT} \ qm create "$VMID" -machine q35 -bios ovmf -agent 1 -tablet 0 -localtime 1 ${CPU_TYPE} \
-scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=32G \ -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" -tags community-script \
-boot order=scsi0 >/dev/null -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null
msg_ok "Created VM shell"
msg_info "Decompressing $(basename "$CACHE_FILE") to $FILE_IMG"
xz -dc "$CACHE_FILE" | pv -N "Extracting" >"$FILE_IMG"
msg_ok "Decompressed to $FILE_IMG"
msg_info "Importing disk into storage ($STORAGE)"
if qm disk import --help >/dev/null 2>&1; then
IMPORT_CMD=(qm disk import)
else
IMPORT_CMD=(qm importdisk)
fi
IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$FILE_IMG" "$STORAGE" --format raw 2>&1 || true)"
DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")"
[[ -z "$DISK_REF" ]] && DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)"
[[ -z "$DISK_REF" ]] && {
msg_error "Unable to determine imported disk reference."
echo "$IMPORT_OUT"
exit 1
}
msg_ok "Imported disk (${CL}${BL}${DISK_REF}${CL})"
rm -f "$FILE_IMG"
msg_info "Attaching EFI and root disk"
qm set "$VMID" \
--efidisk0 "${STORAGE}:0,efitype=4m" \
--scsi0 "${DISK_REF},ssd=1,discard=on" \
--boot order=scsi0 \
--serial0 socket >/dev/null
qm set "$VMID" --agent enabled=1 >/dev/null
msg_ok "Attached EFI and root disk"
msg_info "Resizing disk to $DISK_SIZE"
qm resize "$VMID" scsi0 "${DISK_SIZE}" >/dev/null
msg_ok "Resized disk"
DESCRIPTION=$( DESCRIPTION=$(
cat <<EOF cat <<EOF
@@ -560,17 +581,17 @@ DESCRIPTION=$(
</div> </div>
EOF EOF
) )
qm set "$VMID" -description "$DESCRIPTION" >/dev/null qm set "$VMID" -description "$DESCRIPTION" >/dev/null
if [ -n "$DISK_SIZE" ]; then msg_ok "Created Homeassistant OS VM ${CL}${BL}(${HN})"
msg_info "Resizing disk to $DISK_SIZE GB"
qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Image Cache" \
--yesno "Keep downloaded Home Assistant OS image for future VMs?\n\nFile: $CACHE_FILE" 10 70; then
msg_ok "Keeping cached image"
else else
msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" rm -f "$CACHE_FILE"
qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null msg_ok "Deleted cached image"
fi fi
msg_ok "Created Homeassistant OS VM ${CL}${BL}(${HN})"
if [ "$START_VM" == "yes" ]; then if [ "$START_VM" == "yes" ]; then
msg_info "Starting Home Assistant OS VM" msg_info "Starting Home Assistant OS VM"
qm start $VMID qm start $VMID

View File

@@ -203,10 +203,9 @@ function exit-script() {
function default_settings() { function default_settings() {
VMID=$(get_valid_nextid) VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" MACHINE="q35"
MACHINE="" FORMAT=""
DISK_SIZE="32G" DISK_SIZE="32G"
DISK_CACHE=""
HN="umbrelos" HN="umbrelos"
CPU_TYPE="" CPU_TYPE=""
CORE_COUNT="2" CORE_COUNT="2"
@@ -218,9 +217,8 @@ function default_settings() {
START_VM="yes" START_VM="yes"
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}q35${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
@@ -253,16 +251,16 @@ function advanced_settings() {
fi fi
done done
if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Machine Type" 10 58 2 \
"i440fx" "Machine i440fx" ON \ "q35" "Modern (PCIe, UEFI, default)" ON \
"q35" "Machine q35" OFF \ "i440fx" "Legacy (older compatibility)" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ $MACH = q35 ]; then if [ "$MACH" = "q35" ]; then
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}"
FORMAT="" FORMAT=""
MACHINE=" -machine q35" MACHINE=" -machine q35"
else else
echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
fi fi
@@ -312,17 +310,20 @@ function advanced_settings() {
exit-script exit-script
fi fi
if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \
"0" "KVM64 (Default)" ON \ "KVM64" "Default safe for migration/compatibility" ON \
"1" "Host" OFF \ "Host" "Use host CPU features (faster, no migration)" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ $CPU_TYPE1 = "1" ]; then case "$CPU_TYPE1" in
"Host")
echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
CPU_TYPE=" -cpu host" CPU_TYPE=" -cpu host"
else ;;
*)
echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
CPU_TYPE="" CPU_TYPE=""
fi ;;
esac
else else
exit-script exit-script
fi fi
@@ -433,86 +434,71 @@ pve_check
ssh_check ssh_check
start_script start_script
post_to_api_vm
msg_info "Validating Storage" msg_info "Validating Storage"
while read -r line; do STORAGE_MENU=()
TAG=$(echo $line | awk '{print $1}') while read -r tag type free; do
TYPE=$(echo $line | awk '{printf "%-10s", $2}') ITEM="Type: $type Free: $free"
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') STORAGE_MENU+=("$tag" "$ITEM" "OFF")
ITEM=" Type: $TYPE Free: $FREE " done < <(pvesm status -content images | awk 'NR>1 {printf "%s %s %s\n", $1, $2, $6}')
OFFSET=2
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then if [ ${#STORAGE_MENU[@]} -eq 0 ]; then
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
fi
STORAGE_MENU+=("$TAG" "$ITEM" "OFF")
done < <(pvesm status -content images | awk 'NR>1')
VALID=$(pvesm status -content images | awk 'NR>1')
if [ -z "$VALID" ]; then
msg_error "Unable to detect a valid storage location." msg_error "Unable to detect a valid storage location."
exit exit 1
elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then
STORAGE=${STORAGE_MENU[0]} STORAGE=${STORAGE_MENU[0]}
else else
while [ -z "${STORAGE:+x}" ]; do while [ -z "${STORAGE:+x}" ]; do
STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
"Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \
16 $(($MSG_MAX_LENGTH + 23)) 6 \ 16 70 6 \
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3)
done done
fi fi
msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."
msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
msg_info "Retrieving the URL for $APP"
URL="https://download.umbrel.com/release/latest/umbrelos-amd64.img.xz"
FILE="$(basename "$URL")"
sleep 2
msg_ok "${CL}${BL}${URL}${CL}"
curl -f#SL -o "$FILE" "$URL"
msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
if ! command -v pv &>/dev/null; then msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
apt-get update &>/dev/null && apt-get install -y pv &>/dev/null
URL="https://download.umbrel.com/release/latest/umbrelos-amd64.img.xz"
CACHE_DIR="/var/lib/vz/template/cache"
CACHE_FILE="$CACHE_DIR/$(basename "$URL")"
FILE_IMG="/var/lib/vz/template/tmp/${CACHE_FILE##*/%.xz}"
mkdir -p "$CACHE_DIR" "$(dirname "$FILE_IMG")"
if [[ ! -s "$CACHE_FILE" ]]; then
msg_ok "Downloading Umbrel OS image"
curl -f#SL -o "$CACHE_FILE" "$URL"
else
msg_ok "Using cached Umbrel OS image"
fi fi
msg_info "Decompressing $FILE with progress${CL}\n" if ! command -v pv &>/dev/null; then
FILE_IMG="${FILE%.xz}" apt-get update -qq &>/dev/null && apt-get install -y pv &>/dev/null
SIZE=$(xz --robot -l "$FILE" | awk -F '\t' '/^totals/ { print $5 }') &>/dev/null fi
xz -dc "$FILE" | pv -s "$SIZE" -N "Extracting" >"$FILE_IMG"
msg_ok "Decompressed to ${CL}${BL}${FILE%.xz}${CL}"
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') set -o pipefail
case $STORAGE_TYPE in qm create "$VMID" -machine q35 -bios ovmf -agent 1 -tablet 0 -localtime 1 ${CPU_TYPE} \
nfs | dir) -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" -tags community-script \
DISK_EXT=".raw" -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null
DISK_REF="$VMID/"
DISK_IMPORT="-format raw"
THIN=""
;;
btrfs)
DISK_EXT=".raw"
DISK_REF="$VMID/"
DISK_IMPORT="-format raw"
FORMAT=",efitype=4m"
THIN=""
;;
esac
for i in {0,1,2}; do
disk="DISK$i"
eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
done
msg_info "Creating a Umbrel OS VM" xz -dc "$CACHE_FILE" | pv -N "Extracting" >"$FILE_IMG"
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
-name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null if qm disk import --help >/dev/null 2>&1; then
pvesm alloc $STORAGE $VMID $DISK0 4M >/dev/null IMPORT_CMD=(qm disk import)
qm importdisk $VMID ${FILE_IMG} $STORAGE ${DISK_IMPORT:-} >/dev/null else
qm set $VMID \ IMPORT_CMD=(qm importdisk)
-efidisk0 ${DISK0_REF}${FORMAT} \ fi
-scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$FILE_IMG" "$STORAGE" --format raw 2>&1 || true)"
-boot order=scsi0 \ DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")"
-serial0 socket >/dev/null [[ -z "$DISK_REF" ]] && DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)"
qm set $VMID --agent enabled=1 >/dev/null
qm set "$VMID" \
--efidisk0 "${STORAGE}:0,efitype=4m" \
--scsi0 "${DISK_REF},ssd=1,discard=on" \
--boot order=scsi0 \
--serial0 socket >/dev/null
qm set "$VMID" --agent enabled=1 >/dev/null
qm resize "$VMID" scsi0 "${DISK_SIZE}" >/dev/null
DESCRIPTION=$( DESCRIPTION=$(
cat <<EOF cat <<EOF
@@ -546,13 +532,14 @@ EOF
) )
qm set "$VMID" -description "$DESCRIPTION" >/dev/null qm set "$VMID" -description "$DESCRIPTION" >/dev/null
if [ -n "$DISK_SIZE" ]; then if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Image Cache" \
msg_info "Resizing disk to $DISK_SIZE GB" --yesno "Keep downloaded Umbrel OS image for future VMs?\n\nFile: $CACHE_FILE" 10 70; then
qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null msg_ok "Keeping cached image"
else else
msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" rm -f "$CACHE_FILE"
qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null msg_ok "Deleted cached image"
fi fi
rm -f "$FILE_IMG"
msg_ok "Created a Umbrel OS VM ${CL}${BL}(${HN})" msg_ok "Created a Umbrel OS VM ${CL}${BL}(${HN})"
if [ "$START_VM" == "yes" ]; then if [ "$START_VM" == "yes" ]; then