Compare commits

...

9 Commits

Author SHA1 Message Date
push-app-to-main[bot]
81f82b92e7 'Add new script' 2025-11-10 16:33:20 +00:00
CanbiZ
ef9a008d2a Improve service stopping logic in stop_all_services
Refactored stop_all_services to handle empty service lists and avoid pipeline failures. Now checks for found services before attempting to stop and disable them, improving robustness and error handling.
2025-11-10 13:58:04 +01:00
community-scripts-pr-app[bot]
de07b62cff Update CHANGELOG.md (#9024)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-10 12:23:26 +00:00
CanbiZ
8b30ed74df core: update message for no available updates scenario (if pinned) (#9021) 2025-11-10 13:22:59 +01:00
community-scripts-pr-app[bot]
53e6422ee3 Update versions.json (#9023)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-10 13:08:03 +01:00
community-scripts-pr-app[bot]
257e89cc5c Update CHANGELOG.md (#9022)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-11-10 12:07:09 +00:00
CanbiZ
26090bad32 Migrate Open WebUI to uv-based installation (#9019)
* Migrate Open WebUI to uv-based installation

Added migration logic to detect and upgrade legacy Open WebUI installations to a uv-based setup, including data backup and service recreation. Updated install and update scripts to use uv for installing Open WebUI and adjusted service configuration and cleanup steps accordingly.

* english

---------

Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2025-11-10 13:06:44 +01:00
CanbiZ
787a99fc27 Fix consumption directory retrieval in script 2025-11-10 11:53:55 +01:00
Slaviša Arežina
0b122749b7 Update website (#8971) 2025-11-10 08:39:56 +01:00
11 changed files with 323 additions and 70 deletions

View File

@@ -12,6 +12,13 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
## 2025-11-10
### 🚀 Updated Scripts
- #### ✨ New Features
- core: update message for no available updates scenario (if pinned) [@MickLesk](https://github.com/MickLesk) ([#9021](https://github.com/community-scripts/ProxmoxVE/pull/9021))
- Migrate Open WebUI to uv-based installation [@MickLesk](https://github.com/MickLesk) ([#9019](https://github.com/community-scripts/ProxmoxVE/pull/9019))
## 2025-11-09
### 🚀 Updated Scripts

67
ct/domain-monitor.sh Normal file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Hosteroid/domain-monitor
APP="Domain-Monitor"
var_tags="${var_tags:-proxy}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/domain-monitor ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "domain-monitor" "Hosteroid/domain-monitor"; then
msg_info "Stopping Service"
systemctl stop apache2
msg_info "Service stopped"
msg_info "Creating backup"
mv /opt/domain-monitor/.env /opt
msg_ok "Created backup"
setup_composer
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-monitor" "Hosteroid/domain-monitor" "prebuild" "latest" "/opt/domain-monitor" "domain-monitor-v*.zip"
msg_info "Updating Domain Monitor"
cd /opt/domain-monitor
$STD composer install
msg_ok "Updated Domain Monitor"
msg_info "Restoring backup"
mv /opt/.env /opt/domain-monitor
msg_ok "Restored backup"
msg_info "Restarting Services"
systemctl reload apache2
msg_ok "Restarted Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"

View File

@@ -0,0 +1,6 @@
____ _ __ ___ _ __
/ __ \____ ____ ___ ____ _(_)___ / |/ /___ ____ (_) /_____ _____
/ / / / __ \/ __ `__ \/ __ `/ / __ \______/ /|_/ / __ \/ __ \/ / __/ __ \/ ___/
/ /_/ / /_/ / / / / / / /_/ / / / / /_____/ / / / /_/ / / / / / /_/ /_/ / /
/_____/\____/_/ /_/ /_/\__,_/_/_/ /_/ /_/ /_/\____/_/ /_/_/\__/\____/_/

View File

@@ -23,6 +23,62 @@ function update_script() {
header_info
check_container_storage
check_container_resources
if [[ -d /opt/open-webui ]]; then
msg_warn "Legacy installation detected — migrating to uv based install..."
msg_info "Stopping Service"
systemctl stop open-webui
msg_ok "Stopped Service"
msg_info "Creating Backup"
mkdir -p /opt/open-webui-backup
cp -a /opt/open-webui/backend/data /opt/open-webui-backup/data || true
msg_ok "Created Backup"
msg_info "Removing legacy installation"
rm -rf /opt/open-webui
rm -rf /root/.open-webui || true
msg_ok "Removed legacy installation"
msg_info "Installing uv-based Open-WebUI"
PYTHON_VERSION="3.12" setup_uv
$STD uv tool install --python $PYTHON_VERSION open-webui[all]
msg_ok "Installed uv-based Open-WebUI"
msg_info "Restoring data"
mkdir -p /root/.open-webui
cp -a /opt/open-webui-backup/data/* /root/.open-webui/ || true
rm -rf /opt/open-webui-backup || true
msg_ok "Restored data"
msg_info "Recreating Service"
cat <<EOF >/etc/systemd/system/open-webui.service
[Unit]
Description=Open WebUI Service
After=network.target
[Service]
Type=simple
Environment=DATA_DIR=/root/.open-webui
EnvironmentFile=-/root/.env
ExecStart=/root/.local/bin/open-webui serve
WorkingDirectory=/root
Restart=on-failure
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
EOF
$STD systemctl daemon-reload
systemctl enable -q --now open-webui
msg_ok "Recreated Service"
msg_ok "Migration completed"
exit 0
fi
if [[ ! -d /root/.open-webui ]]; then
msg_error "No ${APP} Installation Found!"
exit
@@ -50,8 +106,11 @@ function update_script() {
fi
fi
msg_info "Restarting Open WebUI to initiate update"
msg_info "Updating Open WebUI via uv"
PYTHON_VERSION="3.12" setup_uv
$STD uv tool install --python 3.12 open-webui[all]
systemctl restart open-webui
msg_ok "Updated Open WebUI"
msg_ok "Updated successfully!"
exit
}

View File

@@ -54,8 +54,11 @@ function update_script() {
msg_info "Updating Paperless-ngx"
cp -r /opt/paperless_backup/* /opt/paperless/
CONSUME_DIR="$(sed -n '/^PAPERLESS_CONSUMPTION/s/[^=]=*//p' /opt/paperless/paperless.conf)"
mkdir -p "${CONSUME_DIR:-/opt/paperless/consume}"
CONSUME_DIR="$(sed -n 's/^PAPERLESS_CONSUMPTION_DIR=//p' /opt/paperless/paperless.conf)"
if [[ -z "$CONSUME_DIR" ]]; then
CONSUME_DIR="/opt/paperless/consume"
fi
mkdir -p "$CONSUME_DIR"
cd /opt/paperless
$STD uv sync --all-extras
cd /opt/paperless/src

View File

@@ -33,8 +33,12 @@
},
"notes": [
{
"text": "Set a root password if using autologin. This will be the Cockpit password.`sudo passwd root`",
"text": "Set a root password if using autologin. This will be the Cockpit password. To set root password run `sudo passwd root`",
"type": "info"
},
{
"text": "If you plan on using 45Drives extension with NFS, you must setup LXC as privileged. Some features of 45Drives don't work on Debian 13, so Debian 12 must be used.",
"type": "warning"
}
]
}

View File

@@ -0,0 +1,35 @@
{
"name": "Domain Monitor",
"slug": "domain-monitor",
"categories": [
9
],
"date_created": "2025-09-04",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 80,
"documentation": "https://github.com/Hosteroid/domain-monitor/blob/main/README.md",
"config_path": "/opt/domain-monitor/.env",
"website": "https://github.com/Hosteroid/domain-monitor",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/domain-monitor.png",
"description": "A self-hosted PHP domain expiration monitoring tool that tracks domain expiry dates, RDAP/WHOIS data, and SSL certificate validity. Supports alerts, multi-user setup, and cron automation. Built for developers, hosting providers, and IT admins who want full control without third-party services.",
"install_methods": [
{
"type": "default",
"script": "ct/domain-monitor.sh",
"resources": {
"cpu": 2,
"ram": 512,
"hdd": 2,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -1,4 +1,49 @@
[
{
"name": "dgtlmoon/changedetection.io",
"version": "0.50.41",
"date": "2025-11-10T11:00:46Z"
},
{
"name": "emqx/emqx",
"version": "e5.10.2",
"date": "2025-11-10T10:58:21Z"
},
{
"name": "autobrr/autobrr",
"version": "v1.69.0",
"date": "2025-11-10T10:57:40Z"
},
{
"name": "documenso/documenso",
"version": "v2.0.6",
"date": "2025-11-10T08:08:43Z"
},
{
"name": "mattermost/mattermost",
"version": "v10.11.6",
"date": "2025-11-04T09:43:16Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.270",
"date": "2025-11-10T05:57:22Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.6",
"date": "2025-11-08T22:45:35Z"
},
{
"name": "jeedom/core",
"version": "4.4.20",
"date": "2025-11-10T00:27:05Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.0.1",
"date": "2025-10-15T16:53:55Z"
},
{
"name": "navidrome/navidrome",
"version": "v0.58.5",
@@ -55,20 +100,15 @@
"date": "2025-11-09T11:56:25Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.6",
"date": "2025-11-08T22:45:35Z"
"name": "keycloak/keycloak",
"version": "26.4.4",
"date": "2025-11-07T08:55:27Z"
},
{
"name": "authelia/authelia",
"version": "v4.39.14",
"date": "2025-11-09T07:18:40Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.268",
"date": "2025-11-09T05:56:26Z"
},
{
"name": "apache/couchdb",
"version": "3.5.1",
@@ -84,16 +124,6 @@
"version": "1.1.3",
"date": "2025-11-09T00:28:21Z"
},
{
"name": "jeedom/core",
"version": "4.4.20",
"date": "2025-11-09T00:27:05Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.0.1",
"date": "2025-10-15T16:53:55Z"
},
{
"name": "raydak-labs/configarr",
"version": "v1.17.2",
@@ -149,16 +179,6 @@
"version": "v0.85.1",
"date": "2025-10-31T10:45:26Z"
},
{
"name": "documenso/documenso",
"version": "v2.0.5",
"date": "2025-11-08T05:03:59Z"
},
{
"name": "keycloak/keycloak",
"version": "26.4.4",
"date": "2025-11-07T08:55:27Z"
},
{
"name": "home-assistant/core",
"version": "2025.11.1",
@@ -204,11 +224,6 @@
"version": "v1.0.0",
"date": "2025-11-07T12:52:42Z"
},
{
"name": "dgtlmoon/changedetection.io",
"version": "0.50.40",
"date": "2025-11-07T12:22:58Z"
},
{
"name": "element-hq/synapse",
"version": "v1.142.0rc2",
@@ -224,11 +239,6 @@
"version": "coverity-w45-4.14.1",
"date": "2025-11-05T16:56:57Z"
},
{
"name": "mattermost/mattermost",
"version": "v10.11.6",
"date": "2025-11-04T09:43:16Z"
},
{
"name": "umami-software/umami",
"version": "v3.0.0",
@@ -337,7 +347,7 @@
{
"name": "javedh-dev/tracktor",
"version": "0.5.1",
"date": "2025-11-05T16:14:37Z"
"date": "2025-11-05T15:51:02Z"
},
{
"name": "zitadel/zitadel",
@@ -364,11 +374,6 @@
"version": "1.5.0",
"date": "2025-11-05T11:10:20Z"
},
{
"name": "emqx/emqx",
"version": "e5.10.2-alpha.1",
"date": "2025-11-05T09:55:26Z"
},
{
"name": "glpi-project/glpi",
"version": "11.0.2",
@@ -934,11 +939,6 @@
"version": "r1945",
"date": "2025-10-10T02:30:05Z"
},
{
"name": "autobrr/autobrr",
"version": "v1.68.0",
"date": "2025-10-08T18:33:12Z"
},
{
"name": "advplyr/audiobookshelf",
"version": "v2.30.0",

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Hosteroid/domain-monitor
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y --no-install-recommends \
libicu-dev \
libzip-dev \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
libxml2-dev \
libcurl4-openssl-dev \
libonig-dev \
pkg-config
msg_ok "Installed Dependencies"
PHP_VERSION="8.4" PHP_APACHE="YES" PHP_FPM="YES" PHP_MODULE="mysql" setup_php
setup_composer
setup_mariadb
MARIADB_DB_NAME="domain_monitor" MARIADB_DB_USER="domainmonitor" setup_mariadb_db
fetch_and_deploy_gh_release "domain-monitor" "Hosteroid/domain-monitor" "prebuild" "latest" "/opt/domain-monitor" "domain-monitor-v*.zip"
msg_info "Setting up Domain Monitor"
ENC_KEY=$(openssl rand -base64 48 | tr -dc 'A-Za-z0-9' | head -c 32)
cd /opt/domain-monitor
$STD composer install
cp env.example.txt .env
sed -i -e "s|^APP_ENV=.*|APP_ENV=production|" \
-e "s|^APP_ENCRYPTION_KEY=.*|APP_ENCRYPTION_KEY=$ENC_KEY|" \
-e "s|^SESSION_COOKIE_HTTPONLY=.*|SESSION_COOKIE_HTTPONLY=0|" \
-e "s|^DB_USERNAME=.*|DB_USERNAME=$MARIADB_DB_USER|" \
-e "s|^DB_PASSWORD=.*|DB_PASSWORD=$MARIADB_DB_PASS|" \
-e "s|^DB_DATABASE=.*|DB_DATABASE=$MARIADB_DB_NAME|" .env
cat <<EOF >/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
ServerName domainmonitor.local
DocumentRoot "/opt/domain-monitor/public"
<Directory "/opt/domain-monitor/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
chown -R www-data:www-data /opt/domain-monitor
$STD a2enmod rewrite headers
$STD systemctl reload apache2
msg_ok "Setup Domain Monitor"
motd_ssh
customize
cleanup_lxc

View File

@@ -17,7 +17,11 @@ msg_info "Installing Dependencies"
$STD apt install -y ffmpeg
msg_ok "Installed Dependencies"
USE_UVX="YES" PYTHON_VERSION="3.12" setup_uv
PYTHON_VERSION="3.12" setup_uv
msg_info "Installing Open WebUI"
$STD uv tool install --python 3.12 open-webui[all]
msg_ok "Installed Open WebUI"
read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
@@ -56,7 +60,7 @@ After=network.target
Type=simple
EnvironmentFile=-/root/.env
Environment=DATA_DIR=/root/.open-webui
ExecStart=/usr/local/bin/uvx --python 3.12 open-webui@latest serve
ExecStart=/root/.local/bin/open-webui serve
WorkingDirectory=/root
Restart=on-failure
RestartSec=5
@@ -70,9 +74,4 @@ msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt -y autoremove
$STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleaned"
cleanup_lxc

View File

@@ -72,15 +72,23 @@ stop_all_services() {
local service_patterns=("$@")
for pattern in "${service_patterns[@]}"; do
# Find all matching services
systemctl list-units --type=service --all 2>/dev/null |
grep -oE "${pattern}[^ ]*\.service" |
sort -u |
while read -r service; do
# Find all matching services (use || true to avoid pipeline failures)
local services
services=$(systemctl list-units --type=service --all 2>/dev/null |
grep -oE "${pattern}[^ ]*\.service" 2>/dev/null |
sort -u 2>/dev/null || true)
# Only process if we found any services
if [[ -n "$services" ]]; then
while IFS= read -r service; do
[[ -z "$service" ]] && continue
$STD systemctl stop "$service" 2>/dev/null || true
$STD systemctl disable "$service" 2>/dev/null || true
done
done <<<"$services"
fi
done
return 0
}
# ------------------------------------------------------------------------------
@@ -1207,7 +1215,7 @@ setup_deb822_repo() {
local repo_url="$3"
local suite="$4"
local component="${5:-main}"
local architectures="${6-}" # optional
local architectures="${6-}" # optional
# Validate required parameters
if [[ -z "$name" || -z "$gpg_url" || -z "$repo_url" || -z "$suite" ]]; then
@@ -1399,7 +1407,7 @@ verify_gpg_fingerprint() {
}
# ==============================================================================
# EXISTING FUNCTIONS
# INSTALL FUNCTIONS
# ==============================================================================
# ------------------------------------------------------------------------------
@@ -1501,7 +1509,7 @@ check_for_gh_release() {
return 0
fi
msg_error "No update available: ${app} is not installed!"
msg_ok "No update available: ${app} is already on pinned version (${current})"
return 1
fi