mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-12-15 19:53:31 +01:00
Compare commits
71 Commits
2025-11-22
...
2025-11-27
| Author | SHA1 | Date | |
|---|---|---|---|
| dc3736146a | |||
| 40edc3e908 | |||
| 92bc24d1e5 | |||
| bdef4cbfef | |||
| 7d47eb81e9 | |||
| 276ce230f3 | |||
| 5f911164e3 | |||
| 8c6843f180 | |||
| 5004477246 | |||
| 8e15e0a524 | |||
| 54b634cea4 | |||
| d4e1b8f354 | |||
| 1a4f9ff815 | |||
| ee3d4874d1 | |||
| 01442d08ec | |||
| e1bf05ad69 | |||
| 7d435a1a5e | |||
| 7184755a0f | |||
| f0a23be999 | |||
| 93a764676f | |||
| 21e9030946 | |||
| 01774b1967 | |||
| 63c5b922de | |||
| 789cd3e187 | |||
| 282e8ef186 | |||
| 8a0b1d864b | |||
| d2a103c230 | |||
| 949ecc39ad | |||
| a9c08a611e | |||
| e13119250d | |||
| 87f71f75b1 | |||
| 3b6e5aae5f | |||
| f90fdadbb2 | |||
| 120affbcc5 | |||
| ae81cafa10 | |||
| f60493a862 | |||
| 0cbce2287d | |||
| edfeda61ad | |||
| 1815fee99b | |||
| 4bf830c6bf | |||
| d0cced9a1d | |||
| a56f7cfd45 | |||
| 79f7852777 | |||
| e54f372079 | |||
| cf89b17b0d | |||
| bb40a3fdd3 | |||
| 4ffa571a34 | |||
| 48f1f07892 | |||
| e5e587aa37 | |||
| b4bce4964c | |||
| c8ed59b148 | |||
| ce9323ab17 | |||
| 279ed5325c | |||
| b66fb43fff | |||
| ff7b321065 | |||
| 6a5ad42279 | |||
| 4631f1c09e | |||
| 6bcf8b3097 | |||
| 7ac9023a57 | |||
| 07e46a4585 | |||
| 4003aad7d5 | |||
| b9809d6768 | |||
| 70d59b825c | |||
| 72a39012b6 | |||
| 4134f68fb4 | |||
| c9e7662c5c | |||
| 4d6fa0a73d | |||
| 84412d9d9c | |||
| 581fed294f | |||
| c72a810179 | |||
| a335779c5f |
99
CHANGELOG.md
99
CHANGELOG.md
@ -10,8 +10,107 @@
|
||||
> [!CAUTION]
|
||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||
|
||||
## 2025-11-28
|
||||
|
||||
## 2025-11-27
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Qdrant ([#9465](https://github.com/community-scripts/ProxmoxVE/pull/9465))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Upgrade pve-scripts-local to node 24 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#9457](https://github.com/community-scripts/ProxmoxVE/pull/9457))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- PBS: fix typo [@joshuaharmsen845](https://github.com/joshuaharmsen845) ([#9482](https://github.com/community-scripts/ProxmoxVE/pull/9482))
|
||||
|
||||
## 2025-11-26
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- Joplin Server: Increase RAM for LXC [@tremor021](https://github.com/tremor021) ([#9460](https://github.com/community-scripts/ProxmoxVE/pull/9460))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix Open WebUI update logic (swap upgrade/install) [@camcop](https://github.com/camcop) ([#9461](https://github.com/community-scripts/ProxmoxVE/pull/9461))
|
||||
|
||||
## 2025-11-25
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Open WebUI: Change install command to upgrade for Open-WebUI [@tremor021](https://github.com/tremor021) ([#9448](https://github.com/community-scripts/ProxmoxVE/pull/9448))
|
||||
- core: set default LANG in locale configuration [@MickLesk](https://github.com/MickLesk) ([#9440](https://github.com/community-scripts/ProxmoxVE/pull/9440))
|
||||
- documenso: switch to npm peer-.deps to get build running [@MickLesk](https://github.com/MickLesk) ([#9441](https://github.com/community-scripts/ProxmoxVE/pull/9441))
|
||||
- Refactor Asterisk installation process [@MickLesk](https://github.com/MickLesk) ([#9429](https://github.com/community-scripts/ProxmoxVE/pull/9429))
|
||||
- Fix the mikrotik VM installer after they reformatted their downloads page [@paul-ridgway](https://github.com/paul-ridgway) ([#9434](https://github.com/community-scripts/ProxmoxVE/pull/9434))
|
||||
- paperless: patch consume to uv [@MickLesk](https://github.com/MickLesk) ([#9425](https://github.com/community-scripts/ProxmoxVE/pull/9425))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- add Zabbix version selection to install and update scripts [@MickLesk](https://github.com/MickLesk) ([#9430](https://github.com/community-scripts/ProxmoxVE/pull/9430))
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 📂 Github
|
||||
|
||||
- gh: update supported PVE Version [@MickLesk](https://github.com/MickLesk) ([#9422](https://github.com/community-scripts/ProxmoxVE/pull/9422))
|
||||
|
||||
## 2025-11-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: remove uv cache clean command [@MickLesk](https://github.com/MickLesk) ([#9413](https://github.com/community-scripts/ProxmoxVE/pull/9413))
|
||||
- Joplin-Server: Bump Node.js version from 22 to 24 [@tremor021](https://github.com/tremor021) ([#9405](https://github.com/community-scripts/ProxmoxVE/pull/9405))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- [Fix]: Wizarr DB error during install [@vhsdream](https://github.com/vhsdream) ([#9415](https://github.com/community-scripts/ProxmoxVE/pull/9415))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Gitea: Update website [@tremor021](https://github.com/tremor021) ([#9406](https://github.com/community-scripts/ProxmoxVE/pull/9406))
|
||||
- huntarr: disable on website during install issues [@MickLesk](https://github.com/MickLesk) ([#9403](https://github.com/community-scripts/ProxmoxVE/pull/9403))
|
||||
|
||||
## 2025-11-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: remove journal log rotation [@MickLesk](https://github.com/MickLesk) ([#9392](https://github.com/community-scripts/ProxmoxVE/pull/9392))
|
||||
- [LibreNMS] Correcting mariadb sed string for Debian 13 default in install/librenms-install.sh, website config for Debian 13 #9369 [@htmlspinnr](https://github.com/htmlspinnr) ([#9370](https://github.com/community-scripts/ProxmoxVE/pull/9370))
|
||||
- fix: Snipe-IT update check failure [@ruanmed](https://github.com/ruanmed) ([#9371](https://github.com/community-scripts/ProxmoxVE/pull/9371))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- PVE Kernel Clean: Add info about currently running kernel [@tremor021](https://github.com/tremor021) ([#9388](https://github.com/community-scripts/ProxmoxVE/pull/9388))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Update glpi-install.sh to remove install.php [@CrazyWolf13](https://github.com/CrazyWolf13) ([#9378](https://github.com/community-scripts/ProxmoxVE/pull/9378))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix: enhance back navigation in NotFoundPage component and remove unused deps [@BramSuurdje](https://github.com/BramSuurdje) ([#9341](https://github.com/community-scripts/ProxmoxVE/pull/9341))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(frontend): add script disable functionality with visual indicators [@AlphaLawless](https://github.com/AlphaLawless) ([#9374](https://github.com/community-scripts/ProxmoxVE/pull/9374))
|
||||
|
||||
## 2025-11-22
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
@ -105,7 +105,7 @@
|
||||
<tr>
|
||||
<td align="center" width="33%">
|
||||
<h3>🖥️ Proxmox VE</h3>
|
||||
<p>Version 8.4.x or 9.0.x</p>
|
||||
<p>Version: 8.4.x | 9.0.x | 9.1.x</p>
|
||||
</td>
|
||||
<td align="center" width="33%">
|
||||
<h3>🐧 Operating System</h3>
|
||||
|
||||
@ -6,6 +6,7 @@ This project currently supports the following versions of Proxmox VE (PVE):
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 9.1.x | :white_check_mark: |
|
||||
| 9.0.x | :white_check_mark: |
|
||||
| 8.4.x | :white_check_mark: |
|
||||
| 8.3.x | Limited support* ❕ |
|
||||
|
||||
@ -46,7 +46,13 @@ function update_script() {
|
||||
export NEXT_TELEMETRY_DISABLED=1
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||
$STD npm ci
|
||||
$STD turbo prune --scope=@documenso/remix --docker
|
||||
cd out
|
||||
$STD cp ../lingui.config.ts .
|
||||
$STD cp ../turbo.json .
|
||||
$STD cp -r json/* .
|
||||
$STD npm install --legacy-peer-deps
|
||||
$STD cp -r full/* .
|
||||
$STD turbo run build --filter=@documenso/remix
|
||||
$STD npm run prisma:migrate-deploy
|
||||
$STD turbo daemon stop
|
||||
|
||||
6
ct/headers/qdrant
Normal file
6
ct/headers/qdrant
Normal file
@ -0,0 +1,6 @@
|
||||
____ __ __
|
||||
/ __ \____/ /________ _____ / /_
|
||||
/ / / / __ / ___/ __ `/ __ \/ __/
|
||||
/ /_/ / /_/ / / / /_/ / / / / /_
|
||||
\___\_\__,_/_/ \__,_/_/ /_/\__/
|
||||
|
||||
@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
||||
APP="Joplin-Server"
|
||||
var_tags="${var_tags:-notes}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_ram="${var_ram:-6144}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
@ -28,6 +28,8 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION=24 NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
|
||||
if check_for_gh_release "joplin-server" "laurent22/joplin"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop joplin-server
|
||||
|
||||
@ -30,7 +30,7 @@ function update_script() {
|
||||
|
||||
msg_info "Updating MongoDB"
|
||||
if lscpu | grep -q 'avx'; then
|
||||
MONGO_VERSION="8.0" setup_mongodb
|
||||
MONGO_VERSION="8.0"
|
||||
else
|
||||
msg_error "No AVX detected (CPU-Flag)! We have discontinued support for this. You are welcome to try it manually with a Debian LXC, but due to the many issues with Omada, we currently only support AVX CPUs."
|
||||
exit 10
|
||||
|
||||
@ -108,7 +108,7 @@ EOF
|
||||
|
||||
msg_info "Updating Open WebUI via uv"
|
||||
PYTHON_VERSION="3.12" setup_uv
|
||||
$STD uv tool install --python 3.12 open-webui[all]
|
||||
$STD uv tool upgrade --python 3.12 open-webui[all]
|
||||
systemctl restart open-webui
|
||||
msg_ok "Updated Open WebUI"
|
||||
msg_ok "Updated successfully!"
|
||||
|
||||
@ -105,6 +105,7 @@ function update_script() {
|
||||
msg_ok "Backup completed to $BACKUP_DIR"
|
||||
|
||||
declare -A PATCHES=(
|
||||
["paperless-consumer.service"]="ExecStart=uv run -- python manage.py document_consumer"
|
||||
["paperless-scheduler.service"]="ExecStart=uv run -- celery --app paperless beat --loglevel INFO"
|
||||
["paperless-task-queue.service"]="ExecStart=uv run -- celery --app paperless worker --loglevel INFO"
|
||||
["paperless-webserver.service"]="ExecStart=uv run -- granian --interface asgi --ws \"paperless.asgi:application\""
|
||||
|
||||
@ -27,42 +27,9 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop pvescriptslocal
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Backup Data"
|
||||
cp /opt/ProxmoxVE-Local/.env /opt/.env.bak
|
||||
cp -r /opt/ProxmoxVE-Local/data /opt/data.bak
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
if [[ -f /opt/.env.bak ]]; then
|
||||
mv /opt/.env.bak /opt/ProxmoxVE-Local/.env
|
||||
fi
|
||||
if [[ -d /opt/data.bak ]]; then
|
||||
rm -rf /opt/ProxmoxVE-Local/data
|
||||
mv /opt/data.bak /opt/ProxmoxVE-Local/data
|
||||
fi
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Updating PVE Scripts local"
|
||||
cd /opt/ProxmoxVE-Local
|
||||
chmod 755 data
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
msg_ok "Updated PVE Scripts local"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start pvescriptslocal
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
|
||||
msg_custom "🚀" "${GN}" "The app offers a built-in updater. Please use it."
|
||||
|
||||
}
|
||||
|
||||
start
|
||||
|
||||
45
ct/qdrant.sh
Normal file
45
ct/qdrant.sh
Normal file
@ -0,0 +1,45 @@
|
||||
#!/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: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/qdrant/qdrant
|
||||
|
||||
APP="Qdrant"
|
||||
var_tags="${var_tags:-database;vector}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-5}"
|
||||
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 /var/lib/qdrant ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
if check_for_gh_release "qdrant" "qdrant/qdrant"; then
|
||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
||||
chown -R root:root /var/lib/qdrant
|
||||
chmod -R 755 /var/lib/qdrant
|
||||
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}:6333/dashboard${CL}"
|
||||
@ -31,7 +31,7 @@ function update_script() {
|
||||
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" "grokability/snipe-it"; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop nginx
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
16
ct/wizarr.sh
16
ct/wizarr.sh
@ -52,11 +52,21 @@ function update_script() {
|
||||
$STD npm --prefix app/static run build:css
|
||||
mkdir -p ./.cache
|
||||
$STD tar -xf "$BACKUP_FILE" --directory=/
|
||||
$STD /usr/local/bin/uv run --frozen flask db upgrade
|
||||
if ! grep -q 'frozen' /opt/wizarr/start.sh; then
|
||||
sed -i 's/run/& --frozen/' /opt/wizarr/start.sh
|
||||
if grep -q 'workers' /opt/wizarr/start.sh; then
|
||||
sed -i 's/--workers 4//' /opt/wizarr/start.sh
|
||||
fi
|
||||
if ! grep -qE 'FLASK|WORKERS|VERSION' /opt/wizarr/.env; then
|
||||
{
|
||||
echo "FLASK_ENV=production"
|
||||
echo "GUNICORN_WORKERS=4"
|
||||
echo "APP_VERSION=$(sed 's/^20/v&/' ~/.wizarr)"
|
||||
} >>/opt/wizarr/.env
|
||||
else
|
||||
sed -i "s/_VERSION=v.*$/_VERSION=v$(cat ~/.wizarr)/" /opt/wizarr/.env
|
||||
fi
|
||||
rm -rf "$BACKUP_FILE"
|
||||
export FLASK_SKIP_SCHEDULER=true
|
||||
$STD /usr/local/bin/uv run --frozen flask db upgrade
|
||||
msg_ok "Updated Wizarr"
|
||||
|
||||
msg_info "Starting Service"
|
||||
|
||||
21
ct/zabbix.sh
21
ct/zabbix.sh
@ -46,7 +46,20 @@ function update_script() {
|
||||
systemctl stop "$AGENT_SERVICE"
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Updating Zabbix"
|
||||
read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE
|
||||
ZABBIX_CHOICE=${ZABBIX_CHOICE:-2}
|
||||
case "$ZABBIX_CHOICE" in
|
||||
1) ZABBIX_VERSION="7.0" ;;
|
||||
2) ZABBIX_VERSION="7.4" ;;
|
||||
3) ZABBIX_VERSION=$(curl -fsSL https://repo.zabbix.com/zabbix/ |
|
||||
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1) ;;
|
||||
*)
|
||||
ZABBIX_VERSION="7.4"
|
||||
echo "Invalid choice. Defaulting to 7.4."
|
||||
;;
|
||||
esac
|
||||
|
||||
msg_info "Updating Zabbix to $ZABBIX_VERSION"
|
||||
mkdir -p /opt/zabbix-backup/
|
||||
cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/
|
||||
cp /etc/apache2/conf-enabled/zabbix.conf /opt/zabbix-backup/
|
||||
@ -54,10 +67,8 @@ function update_script() {
|
||||
|
||||
rm -Rf /etc/apt/sources.list.d/zabbix.list
|
||||
cd /tmp
|
||||
curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ |
|
||||
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 |
|
||||
xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb")" \
|
||||
-o /tmp/zabbix-release_latest+debian13_all.deb
|
||||
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
||||
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
|
||||
$STD dpkg -i zabbix-release_latest+debian13_all.deb
|
||||
rm -rf /tmp/zabbix-release_latest+debian13_all.deb
|
||||
$STD apt update
|
||||
|
||||
850
frontend/bun.lock
generated
850
frontend/bun.lock
generated
File diff suppressed because it is too large
Load Diff
6
frontend/package.json
generated
6
frontend/package.json
generated
@ -37,6 +37,7 @@
|
||||
"clsx": "^2.1.1",
|
||||
"cmdk": "^1.1.1",
|
||||
"date-fns": "^4.1.0",
|
||||
|
||||
"framer-motion": "^11.18.2",
|
||||
"fuse.js": "^7.1.0",
|
||||
"lucide-react": "^0.554.0",
|
||||
@ -45,20 +46,15 @@
|
||||
"next": "15.5.2",
|
||||
"next-themes": "^0.4.4",
|
||||
"nuqs": "^2.4.1",
|
||||
"pocketbase": "^0.21.5",
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"react": "19.0.0",
|
||||
"react-chartjs-2": "^5.3.0",
|
||||
"react-code-blocks": "^0.1.6",
|
||||
"react-datepicker": "^7.6.0",
|
||||
"react-day-picker": "^9.4.3",
|
||||
"react-dom": "19.0.0",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-simple-typewriter": "^5.0.1",
|
||||
"react-use-measure": "^2.1.7",
|
||||
"recharts": "2.15.4",
|
||||
"sharp": "^0.33.5",
|
||||
"simple-icons": "^13.21.0",
|
||||
"sonner": "^1.7.4",
|
||||
"tailwind-merge": "^2.6.0",
|
||||
"zod": "^3.24.2"
|
||||
|
||||
@ -42,5 +42,10 @@
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
"notes": [
|
||||
{
|
||||
"text": "The script installs SQLite3 as default database provider. You will be asked to select database type when you initially open the application URL. Select SQLite3 or provide your own database.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -14,6 +14,8 @@
|
||||
"website": "https://github.com/plexguide/Huntarr.io",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/huntarr.webp",
|
||||
"description": "Huntarr is a tool that automates the search for missing or low-quality media content in your collection. It works seamlessly with applications like Sonarr, Radarr, Lidarr, Readarr, and Whisparr, enhancing their functionality with continuous background scans to identify and update missed or outdated content. Through a user-friendly web interface accessible on port 9705, Huntarr provides real-time statistics, log views, and extensive configuration options. The software is especially useful for users who want to keep their media library up to date by automatically searching for missing episodes or higher-quality versions. Huntarr is well-suited for self-hosted environments and can easily run in LXC containers or Docker setups.",
|
||||
"disable": true,
|
||||
"disable_description": "This script has been temporarily disabled due to ongoing installation failures caused by incompatible Python and build dependencies. PyYAML 6.0 fails to build on Debian 13 and under Python 3.12/3.13, making Huntarr currently non-installable in a reliable way. This issue originates upstream and is under investigation. The script will be re-enabled once a stable solution is available. For details, see: https://github.com/community-scripts/ProxmoxVE/issues/9196 or https://github.com/plexguide/Huntarr.io/issues/747",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
"script": "ct/joplin-server.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 4096,
|
||||
"ram": 6144,
|
||||
"hdd": 20,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
@ -35,6 +35,10 @@
|
||||
{
|
||||
"text": "Application can take some time to build, depending on your host speed. Please be patient.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Default RAM size for LXC is set to 6GB because of Node.js building process. You can lower it after application installs",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
"ram": 2048,
|
||||
"hdd": 4,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
43
frontend/public/json/opnsense-vm.json
Normal file
43
frontend/public/json/opnsense-vm.json
Normal file
@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "OPNsense",
|
||||
"slug": "opnsense-vm",
|
||||
"categories": [
|
||||
4,
|
||||
2
|
||||
],
|
||||
"date_created": "2025-11-23",
|
||||
"type": "vm",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 443,
|
||||
"documentation": "https://docs.opnsense.org/",
|
||||
"website": "https://opnsense.org/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/opnsense.webp",
|
||||
"config_path": "",
|
||||
"description": "OPNsense is an open-source firewall and routing platform based on FreeBSD. It provides advanced security features, including intrusion detection, VPN support, traffic shaping, and web filtering, with an intuitive web interface for easy management. Known for its reliability and regular updates, OPNsense is a popular choice for both businesses and home networks.",
|
||||
"disable": true,
|
||||
"disable_description": "This script has been temporarily disabled due to installation failures. The OPNsense bootstrap process was not completing successfully, resulting in a plain FreeBSD VM instead of a functional OPNsense installation. The issue is being investigated and the script will be re-enabled once resolved. For more details, see: https://github.com/community-scripts/ProxmoxVE/issues/6183",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "vm/opnsense-vm.sh",
|
||||
"resources": {
|
||||
"cpu": 4,
|
||||
"ram": 8192,
|
||||
"hdd": 10,
|
||||
"os": "FreeBSD",
|
||||
"version": "latest"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "root",
|
||||
"password": "opnsense"
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "It will fail with default settings if there is no vmbr0 and vmbr1 on your node. Use advanced settings in this case.",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -37,7 +37,7 @@
|
||||
"type": "warning"
|
||||
},
|
||||
{
|
||||
"text": "Advanced Install is only possible with disabled IPV6! Otherwise the installation sometimes stuck.",
|
||||
"text": "Advanced Install is only possible with IPv6 disabled! Otherwise, the installation may get stuck.",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
|
||||
35
frontend/public/json/qdrant.json
Normal file
35
frontend/public/json/qdrant.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Qdrant",
|
||||
"slug": "qdrant",
|
||||
"categories": [
|
||||
8
|
||||
],
|
||||
"date_created": "2025-11-27",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"config_path": "/etc/qdrant/config.yaml",
|
||||
"interface_port": 6333,
|
||||
"documentation": "https://github.com/qdrant/qdrant",
|
||||
"website": "https://qdrant.tech/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/qdrant.webp",
|
||||
"description": "Qdrant is a vector search engine and vector database that allows you to store, search, and manage high-dimensional vectors efficiently.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/qdrant.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 5,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -35,12 +35,22 @@ export const ScriptSchema = z.object({
|
||||
logo: z.string().url().nullable(),
|
||||
config_path: z.string(),
|
||||
description: z.string().min(1, "Description is required"),
|
||||
disable: z.boolean().optional(),
|
||||
disable_description: z.string().optional(),
|
||||
install_methods: z.array(InstallMethodSchema).min(1, "At least one install method is required"),
|
||||
default_credentials: z.object({
|
||||
username: z.string().nullable(),
|
||||
password: z.string().nullable(),
|
||||
}),
|
||||
notes: z.array(NoteSchema),
|
||||
}).refine((data) => {
|
||||
if (data.disable === true && !data.disable_description) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}, {
|
||||
message: "disable_description is required when disable is true",
|
||||
path: ["disable_description"],
|
||||
});
|
||||
|
||||
export type Script = z.infer<typeof ScriptSchema>;
|
||||
|
||||
@ -42,6 +42,8 @@ const initialScript: Script = {
|
||||
website: null,
|
||||
logo: null,
|
||||
description: "",
|
||||
disable: undefined,
|
||||
disable_description: undefined,
|
||||
install_methods: [],
|
||||
default_credentials: {
|
||||
username: null,
|
||||
@ -261,7 +263,25 @@ export default function JSONGenerator() {
|
||||
<Switch checked={script.privileged} onCheckedChange={checked => updateScript("privileged", checked)} />
|
||||
<label>Privileged</label>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<Switch checked={script.disable || false} onCheckedChange={checked => updateScript("disable", checked)} />
|
||||
<label>Disabled</label>
|
||||
</div>
|
||||
</div>
|
||||
{script.disable && (
|
||||
<div>
|
||||
<Label>
|
||||
Disable Description
|
||||
{" "}
|
||||
<span className="text-red-500">*</span>
|
||||
</Label>
|
||||
<Textarea
|
||||
placeholder="Explain why this script is disabled..."
|
||||
value={script.disable_description || ""}
|
||||
onChange={e => updateScript("disable_description", e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<Input
|
||||
placeholder="Interface Port"
|
||||
type="number"
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
"use client";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { basePath } from "@/config/site-config";
|
||||
|
||||
export default function NotFoundPage() {
|
||||
return (
|
||||
@ -12,7 +13,17 @@ export default function NotFoundPage() {
|
||||
Oops, the page you are looking for could not be found.
|
||||
</p>
|
||||
</div>
|
||||
<Button onClick={() => window.history.back()} variant="secondary">
|
||||
<Button
|
||||
onClick={() => {
|
||||
if (window.history.length > 1) {
|
||||
window.history.back();
|
||||
}
|
||||
else {
|
||||
window.location.href = `/${basePath}`;
|
||||
}
|
||||
}}
|
||||
variant="secondary"
|
||||
>
|
||||
Go Back
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@ -123,7 +123,7 @@ export default function ScriptAccordion({
|
||||
className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 hover:dark:bg-accent/20 ${selectedScript === script.slug
|
||||
? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white"
|
||||
: ""
|
||||
}`}
|
||||
} ${script.disable ? "opacity-60" : ""}`}
|
||||
onClick={() => {
|
||||
handleSelected(script.slug);
|
||||
setSelectedCategory(category.name);
|
||||
@ -143,7 +143,9 @@ export default function ScriptAccordion({
|
||||
alt={script.name}
|
||||
className="mr-1 w-4 h-4 rounded-full"
|
||||
/>
|
||||
<span className="flex items-center gap-2">{script.name}</span>
|
||||
<span className="flex items-center gap-2">
|
||||
{script.name}
|
||||
</span>
|
||||
</div>
|
||||
{formattedBadge(script.type)}
|
||||
</Link>
|
||||
|
||||
@ -12,6 +12,7 @@ import { useVersions } from "@/hooks/use-versions";
|
||||
import { basePath } from "@/config/site-config";
|
||||
import { extractDate } from "@/lib/time";
|
||||
|
||||
import DisableDescription from "./script-items/disable-description";
|
||||
import { getDisplayValueFromType } from "./script-info-blocks";
|
||||
import DefaultPassword from "./script-items/default-password";
|
||||
import InstallCommand from "./script-items/install-command";
|
||||
@ -146,37 +147,45 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
||||
<ScriptHeader item={item} />
|
||||
</Suspense>
|
||||
|
||||
<Description item={item} />
|
||||
<Alerts item={item} />
|
||||
{item.disable && item.disable_description && (
|
||||
<DisableDescription item={item} />
|
||||
) }
|
||||
|
||||
<div className="mt-4 rounded-lg border shadow-sm">
|
||||
<div className="flex gap-3 px-4 py-2 bg-accent/25">
|
||||
<h2 className="text-lg font-semibold">
|
||||
How to
|
||||
{" "}
|
||||
{item.type === "pve" ? "use" : item.type === "addon" ? "apply" : "install"}
|
||||
</h2>
|
||||
<Tooltips item={item} />
|
||||
</div>
|
||||
<Separator />
|
||||
<div className="">
|
||||
<InstallCommand item={item} />
|
||||
</div>
|
||||
{item.config_path && (
|
||||
<>
|
||||
<Separator />
|
||||
{!item.disable && (
|
||||
<>
|
||||
<Description item={item} />
|
||||
|
||||
<Alerts item={item} />
|
||||
<div className="mt-4 rounded-lg border shadow-sm">
|
||||
<div className="flex gap-3 px-4 py-2 bg-accent/25">
|
||||
<h2 className="text-lg font-semibold">Location of config file</h2>
|
||||
<h2 className="text-lg font-semibold">
|
||||
How to
|
||||
{" "}
|
||||
{item.type === "pve" ? "use" : item.type === "addon" ? "apply" : "install"}
|
||||
</h2>
|
||||
<Tooltips item={item} />
|
||||
</div>
|
||||
<Separator />
|
||||
<div className="">
|
||||
<ConfigFile configPath={item.config_path} />
|
||||
<InstallCommand item={item} />
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
{item.config_path && (
|
||||
<>
|
||||
<Separator />
|
||||
<div className="flex gap-3 px-4 py-2 bg-accent/25">
|
||||
<h2 className="text-lg font-semibold">Location of config file</h2>
|
||||
</div>
|
||||
<Separator />
|
||||
<div className="">
|
||||
<ConfigFile configPath={item.config_path} />
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<DefaultPassword item={item} />
|
||||
<DefaultPassword item={item} />
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
import { AlertCircle } from "lucide-react";
|
||||
|
||||
import type { Script } from "@/lib/types";
|
||||
|
||||
import TextParseLinks from "@/components/text-parse-links";
|
||||
import { AlertColors } from "@/config/site-config";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
export default function DisableDescription({ item }: { item: Script }) {
|
||||
return (
|
||||
<div className="mt-4 flex flex-col shadow-sm gap-2">
|
||||
<div
|
||||
className={cn(
|
||||
"flex items-start gap-3 rounded-lg border p-4 text-sm",
|
||||
AlertColors.warning,
|
||||
)}
|
||||
>
|
||||
<AlertCircle className="h-5 min-h-5 w-5 min-w-5 mt-0.5" />
|
||||
<div className="flex flex-col gap-2">
|
||||
<h3 className="font-semibold text-base">Script Disabled</h3>
|
||||
<p>{TextParseLinks(item.disable_description!)}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
52
frontend/src/components/text-parse-links.tsx
Normal file
52
frontend/src/components/text-parse-links.tsx
Normal file
@ -0,0 +1,52 @@
|
||||
import { ClipboardIcon, ExternalLink } from "lucide-react";
|
||||
import { Fragment } from "react";
|
||||
|
||||
import handleCopy from "./handle-copy";
|
||||
|
||||
const URL_PATTERN = /(https?:\/\/[^\s,]+)/;
|
||||
const CODE_PATTERN = /`([^`]*)`/;
|
||||
|
||||
export default function TextParseLinks(text: string) {
|
||||
const codeParts = text.split(CODE_PATTERN);
|
||||
|
||||
return codeParts.map((part: string, codeIndex: number) => {
|
||||
if (codeIndex % 2 === 1) {
|
||||
return (
|
||||
<span
|
||||
key={`code-${codeIndex}`}
|
||||
className="bg-secondary py-1 px-2 rounded-lg inline-flex items-center gap-2"
|
||||
>
|
||||
{part}
|
||||
<ClipboardIcon
|
||||
className="size-3 cursor-pointer"
|
||||
onClick={() => handleCopy("command", part)}
|
||||
/>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
const urlParts = part.split(URL_PATTERN);
|
||||
|
||||
return (
|
||||
<Fragment key={`text-${codeIndex}`}>
|
||||
{urlParts.map((urlPart: string, urlIndex: number) => {
|
||||
if (urlIndex % 2 === 1) {
|
||||
return (
|
||||
<a
|
||||
key={`url-${codeIndex}-${urlIndex}`}
|
||||
href={urlPart}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline font-medium transition-colors"
|
||||
>
|
||||
{urlPart}
|
||||
<ExternalLink className="size-3" />
|
||||
</a>
|
||||
);
|
||||
}
|
||||
return <Fragment key={`plain-${codeIndex}-${urlIndex}`}>{urlPart}</Fragment>;
|
||||
})}
|
||||
</Fragment>
|
||||
);
|
||||
});
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { useInView, useMotionValue, useSpring } from "framer-motion";
|
||||
import { useInView, useMotionValue, useSpring } from "motion/react";
|
||||
import { useEffect, useRef } from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
@ -5,7 +5,7 @@ import React from "react";
|
||||
import type { OperatingSystem } from "@/lib/types";
|
||||
|
||||
// eslint-disable-next-line node/no-process-env
|
||||
export const basePath = process.env.BASE_PATH || "";
|
||||
export const basePath = process.env.BASE_PATH || "ProxmoxVE";
|
||||
|
||||
export const navbarLinks = [
|
||||
{
|
||||
|
||||
@ -14,6 +14,8 @@ export type Script = {
|
||||
logo: string | null;
|
||||
config_path: string;
|
||||
description: string;
|
||||
disable?: boolean;
|
||||
disable_description?: string;
|
||||
install_methods: {
|
||||
type: "default" | "alpine";
|
||||
script: string;
|
||||
|
||||
@ -13,64 +13,6 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
ASTERISK_VERSIONS_URL="https://www.asterisk.org/downloads/asterisk/all-asterisk-versions/"
|
||||
html=$(curl -fsSL "$ASTERISK_VERSIONS_URL")
|
||||
|
||||
LTS_VERSION=""
|
||||
for major in 20 22 24 26; do
|
||||
block=$(echo "$html" | awk "/Asterisk $major - LTS/,/<ul>/" || true)
|
||||
ver=$(echo "$block" | grep -oE 'Download Latest - [0-9]+\.[0-9]+(\.[0-9]+)?' | head -n1 | sed -E 's/.* - //' || true)
|
||||
if [ -n "$ver" ]; then
|
||||
LTS_VERSION="$LTS_VERSION $ver"
|
||||
fi
|
||||
unset ver block
|
||||
done
|
||||
LTS_VERSION=$(echo "$LTS_VERSION" | xargs | tr ' ' '\n' | sort -V | tail -n1)
|
||||
|
||||
STD_VERSION=""
|
||||
for major in 21 23 25 27; do
|
||||
block=$(echo "$html" | grep -A 20 "Asterisk $major</h3>" | head -n 20 || true)
|
||||
ver=$(echo "$block" | grep -oE 'Download (Latest - )?'"$major"'\.[0-9]+\.[0-9]+' | head -n1 | sed -E 's/Download (Latest - )?//' || true)
|
||||
if [ -n "$ver" ]; then
|
||||
STD_VERSION="$STD_VERSION $ver"
|
||||
fi
|
||||
unset ver block
|
||||
done
|
||||
STD_VERSION=$(echo "$STD_VERSION" | xargs | tr ' ' '\n' | sort -V | tail -n1)
|
||||
|
||||
cert_block=$(echo "$html" | awk '/Certified Asterisk/,/<ul>/')
|
||||
CERT_VERSION=$(echo "$cert_block" | grep -oE 'Download Latest - [0-9]+\.[0-9]+-cert[0-9]+' | head -n1 | sed -E 's/.* - //' || true)
|
||||
|
||||
cat <<EOF
|
||||
Choose Asterisk version to install:
|
||||
1) Latest Standard ($STD_VERSION)
|
||||
2) Latest LTS ($LTS_VERSION)
|
||||
3) Latest Certified ($CERT_VERSION)
|
||||
EOF
|
||||
read -rp "Enter choice [1-3]: " ASTERISK_CHOICE
|
||||
|
||||
CERTIFIED=0
|
||||
case "$ASTERISK_CHOICE" in
|
||||
2)
|
||||
ASTERISK_VERSION="$LTS_VERSION"
|
||||
;;
|
||||
3)
|
||||
ASTERISK_VERSION="$CERT_VERSION"
|
||||
CERTIFIED=1
|
||||
;;
|
||||
*)
|
||||
ASTERISK_VERSION="$STD_VERSION"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ "$CERTIFIED" == "1" ]]; then
|
||||
RELEASE="certified-asterisk-${ASTERISK_VERSION}.tar.gz"
|
||||
DOWNLOAD_URL="https://downloads.asterisk.org/pub/telephony/certified-asterisk/$RELEASE"
|
||||
else
|
||||
RELEASE="asterisk-${ASTERISK_VERSION}.tar.gz"
|
||||
DOWNLOAD_URL="https://downloads.asterisk.org/pub/telephony/asterisk/$RELEASE"
|
||||
fi
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
libsrtp2-dev \
|
||||
@ -82,7 +24,54 @@ $STD apt install -y \
|
||||
libsqlite3-dev
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Downloading Asterisk"
|
||||
msg_info "Fetching Asterisk Versions"
|
||||
ASTERISK_LIST=$(curl -fsSL https://downloads.asterisk.org/pub/telephony/asterisk/ \
|
||||
| grep -oE 'asterisk-[0-9]+\.[0-9]+\.[0-9]+\.tar\.gz' \
|
||||
| sed 's/asterisk-//' \
|
||||
| sed 's/\.tar\.gz//' \
|
||||
| sort -V)
|
||||
# LTS: Major 20, 22, 24, 26
|
||||
LTS_VERSION=$(echo "$ASTERISK_LIST" | grep -E '^2(0|2|4|6)\.' | tail -n1 || true)
|
||||
# Standard: Major 21, 23, 25, 27
|
||||
STD_VERSION=$(echo "$ASTERISK_LIST" | grep -E '^2(1|3|5|7)\.' | tail -n1 || true)
|
||||
CERT_VERSION=$(curl -fsSL https://downloads.asterisk.org/pub/telephony/certified-asterisk/ \
|
||||
| grep -oE 'asterisk-certified-[0-9]+\.[0-9]+-cert[0-9]+\.tar\.gz' \
|
||||
| sed -E 's/asterisk-certified-//' \
|
||||
| sed -E 's/\.tar\.gz//' \
|
||||
| sort -V | tail -n1 || true)
|
||||
msg_ok "Fetched Versions"
|
||||
|
||||
cat <<EOF
|
||||
Choose Asterisk version to install:
|
||||
1) Latest Standard ($STD_VERSION)
|
||||
2) Latest LTS ($LTS_VERSION)
|
||||
3) Latest Certified ($CERT_VERSION)
|
||||
EOF
|
||||
read -rp "Enter choice [1-3]: " ASTERISK_CHOICE
|
||||
|
||||
CERTIFIED=0
|
||||
case "$ASTERISK_CHOICE" in
|
||||
2)
|
||||
ASTERISK_VERSION="$LTS_VERSION"
|
||||
;;
|
||||
3)
|
||||
ASTERISK_VERSION="$CERT_VERSION"
|
||||
CERTIFIED=1
|
||||
;;
|
||||
*)
|
||||
ASTERISK_VERSION="$STD_VERSION"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ "$CERTIFIED" == "1" ]]; then
|
||||
RELEASE="asterisk-certified-${ASTERISK_VERSION}.tar.gz"
|
||||
DOWNLOAD_URL="https://downloads.asterisk.org/pub/telephony/certified-asterisk/$RELEASE"
|
||||
else
|
||||
RELEASE="asterisk-${ASTERISK_VERSION}.tar.gz"
|
||||
DOWNLOAD_URL="https://downloads.asterisk.org/pub/telephony/asterisk/$RELEASE"
|
||||
fi
|
||||
|
||||
msg_info "Downloading Asterisk ($RELEASE)"
|
||||
temp_file=$(mktemp)
|
||||
curl -fsSL "$DOWNLOAD_URL" -o "$temp_file"
|
||||
mkdir -p /opt/asterisk
|
||||
@ -107,4 +96,3 @@ msg_ok "Installed Asterisk"
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
|
||||
|
||||
@ -73,9 +73,11 @@ export CYPRESS_INSTALL_BINARY=0
|
||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||
$STD turbo prune --scope=@documenso/remix --docker
|
||||
cd out
|
||||
cp -r json/* .
|
||||
$STD npm ci
|
||||
cp -r full/* .
|
||||
$STD cp ../lingui.config.ts .
|
||||
$STD cp ../turbo.json .
|
||||
$STD cp -r json/* .
|
||||
$STD npm install --legacy-peer-deps
|
||||
$STD cp -r full/* .
|
||||
$STD turbo run build --filter=@documenso/remix
|
||||
$STD npm run prisma:migrate-deploy
|
||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/CrazyWolf13/domain-locker
|
||||
# Source: https://github.com/Lissy93/domain-locker
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
|
||||
@ -132,7 +132,7 @@ EOF
|
||||
$STD a2dissite 000-default.conf
|
||||
$STD a2enmod rewrite
|
||||
$STD a2ensite glpi.conf
|
||||
rm -rf /opt/glpi/install
|
||||
rm -rf /opt/glpi/install/install.php
|
||||
rm -rf /opt/glpi-${RELEASE}.tgz
|
||||
msg_ok "Setup Service"
|
||||
|
||||
|
||||
@ -20,7 +20,7 @@ $STD apt install -y \
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
NODE_VERSION=22 NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
NODE_VERSION=24 NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
mkdir -p /opt/pm2
|
||||
export PM2_HOME=/opt/pm2
|
||||
$STD pm2 install pm2-logrotate
|
||||
|
||||
@ -65,7 +65,7 @@ chmod -R ug=rwX /opt/librenms/bootstrap/cache /opt/librenms/storage /opt/librenm
|
||||
msg_ok "Configured LibreNMS"
|
||||
|
||||
msg_info "Configure MariaDB"
|
||||
sed -i "/\[mysqld\]/a innodb_file_per_table=1\nlower_case_table_names=0" /etc/mysql/mariadb.conf.d/50-server.cnf
|
||||
sed -i "/\[mariadb\]/a innodb_file_per_table=1\nlower_case_table_names=0" /etc/mysql/mariadb.conf.d/50-server.cnf
|
||||
systemctl enable -q --now mariadb
|
||||
msg_ok "Configured MariaDB"
|
||||
|
||||
|
||||
@ -20,7 +20,7 @@ $STD apt install -y \
|
||||
expect
|
||||
msg_ok "Dependencies installed."
|
||||
|
||||
NODE_VERSION=22 setup_nodejs
|
||||
NODE_VERSION=24 setup_nodejs
|
||||
fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"
|
||||
|
||||
msg_info "Installing PVE Scripts local"
|
||||
|
||||
64
install/qdrant-install.sh
Normal file
64
install/qdrant-install.sh
Normal file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/qdrant/qdrant
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
||||
|
||||
msg_info "Creating Qdrant Configuration"
|
||||
mkdir -p /var/lib/qdrant/storage
|
||||
mkdir -p /var/lib/qdrant/snapshots
|
||||
mkdir -p /etc/qdrant
|
||||
chown -R root:root /var/lib/qdrant
|
||||
chmod -R 755 /var/lib/qdrant
|
||||
|
||||
cat >/etc/qdrant/config.yaml <<EOF
|
||||
log_level: INFO
|
||||
|
||||
storage:
|
||||
storage_path: /var/lib/qdrant/storage
|
||||
snapshots_path: /var/lib/qdrant/snapshots
|
||||
|
||||
service:
|
||||
host: 0.0.0.0
|
||||
http_port: 6333
|
||||
grpc_port: 6334
|
||||
enable_cors: true
|
||||
EOF
|
||||
msg_ok "Created Qdrant Configuration"
|
||||
|
||||
msg_info "Creating Qdrant Service"
|
||||
cat >/etc/systemd/system/qdrant.service <<EOF
|
||||
[Unit]
|
||||
Description=Qdrant Vector Search Engine
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/qdrant --config-path /etc/qdrant/config.yaml
|
||||
WorkingDirectory=/var/lib/qdrant
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
User=root
|
||||
LimitNOFILE=1048576
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now qdrant
|
||||
msg_ok "Created Qdrant Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@ -28,13 +28,16 @@ $STD /usr/local/bin/uv run --frozen pybabel compile -d app/translations
|
||||
$STD npm --prefix app/static install
|
||||
$STD npm --prefix app/static run build:css
|
||||
mkdir -p ./.cache
|
||||
$STD /usr/local/bin/uv run --frozen flask db upgrade
|
||||
|
||||
LOCAL_IP="$(hostname -I | awk '{print $1}')"
|
||||
VERSION="$(sed 's/^20/v&/' ~/.wizarr)"
|
||||
cat <<EOF >/opt/wizarr/.env
|
||||
FLASK_ENV=production
|
||||
GUNICORN_WORKERS=4
|
||||
APP_URL=http://${LOCAL_IP}
|
||||
DISABLE_BUILTIN_AUTH=false
|
||||
LOG_LEVEL=INFO
|
||||
APP_VERSION=${VERSION}
|
||||
EOF
|
||||
|
||||
cat <<EOF >/opt/wizarr/start.sh
|
||||
@ -43,7 +46,6 @@ cat <<EOF >/opt/wizarr/start.sh
|
||||
uv run --frozen gunicorn \
|
||||
--config gunicorn.conf.py \
|
||||
--preload \
|
||||
--workers 4 \
|
||||
--bind 0.0.0.0:5690 \
|
||||
--umask 007 \
|
||||
run:app
|
||||
@ -67,9 +69,15 @@ Restart=on-abnormal
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now wizarr
|
||||
msg_ok "Created Service"
|
||||
|
||||
msg_info "Running DB upgrade"
|
||||
export FLASK_SKIP_SCHEDULER=true
|
||||
$STD /usr/local/bin/uv run --frozen flask db upgrade
|
||||
msg_ok "DB upgrade complete"
|
||||
|
||||
systemctl enable -q --now wizarr
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
|
||||
@ -15,16 +15,27 @@ update_os
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
|
||||
msg_info "Installing Zabbix"
|
||||
read -rp "Choose Zabbix version [1] 7.0 LTS [2] 7.4 (Latest Stable) [3] Latest available (default: 2): " ZABBIX_CHOICE
|
||||
ZABBIX_CHOICE=${ZABBIX_CHOICE:-2}
|
||||
case "$ZABBIX_CHOICE" in
|
||||
1) ZABBIX_VERSION="7.0" ;;
|
||||
2) ZABBIX_VERSION="7.4" ;;
|
||||
3) ZABBIX_VERSION=$(curl -fsSL https://repo.zabbix.com/zabbix/ |
|
||||
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1) ;;
|
||||
*)
|
||||
ZABBIX_VERSION="7.4"
|
||||
echo "Invalid choice. Defaulting to 7.4."
|
||||
;;
|
||||
esac
|
||||
|
||||
msg_info "Installing Zabbix $ZABBIX_VERSION"
|
||||
cd /tmp
|
||||
curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ |
|
||||
grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 |
|
||||
xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb")" \
|
||||
-o /tmp/zabbix-release_latest+debian13_all.deb
|
||||
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
||||
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
|
||||
$STD dpkg -i /tmp/zabbix-release_latest+debian13_all.deb
|
||||
$STD apt update
|
||||
$STD apt install -y zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql zabbix-apache-conf zabbix-sql-scripts
|
||||
msg_ok "Installed Zabbix"
|
||||
msg_ok "Installed Zabbix $ZABBIX_VERSION"
|
||||
|
||||
while true; do
|
||||
read -rp "Which agent do you want to install? [1=agent (classic), 2=agent2 (modern), default=1]: " AGENT_CHOICE
|
||||
|
||||
@ -1338,7 +1338,8 @@ EOF'
|
||||
pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses jq >/dev/null"
|
||||
else
|
||||
sleep 3
|
||||
pct exec "$CTID" -- bash -c "sed -i '/$LANG/ s/^# //' /etc/locale.gen"
|
||||
LANG=${LANG:-en_US.UTF-8}
|
||||
pct exec "$CTID" -- bash -c "sed -i \"/$LANG/ s/^# //\" /etc/locale.gen"
|
||||
pct exec "$CTID" -- bash -c "locale_line=\$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print \$1}' | head -n 1) && \
|
||||
echo LANG=\$locale_line >/etc/default/locale && \
|
||||
locale-gen >/dev/null && \
|
||||
|
||||
@ -390,10 +390,6 @@ cleanup_lxc() {
|
||||
xargs -0 -n1 truncate -s 0 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Python pip
|
||||
if command -v pip &>/dev/null; then $STD pip cache purge || true; fi
|
||||
# Python uv
|
||||
if command -v uv &>/dev/null; then $STD uv cache clean || true; fi
|
||||
# Node.js npm
|
||||
if command -v npm &>/dev/null; then $STD npm cache clean --force || true; fi
|
||||
# Node.js yarn
|
||||
@ -410,7 +406,6 @@ cleanup_lxc() {
|
||||
if command -v composer &>/dev/null; then $STD composer clear-cache || true; fi
|
||||
|
||||
if command -v journalctl &>/dev/null; then
|
||||
$STD journalctl --rotate || true
|
||||
$STD journalctl --vacuum-time=10m || true
|
||||
fi
|
||||
msg_ok "Cleaned"
|
||||
|
||||
@ -33,6 +33,7 @@ if [ -z "$available_kernels" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${GN}Currently running kernel: ${current_kernel}${CL}"
|
||||
echo -e "${YW}Available kernels for removal:${CL}"
|
||||
echo "$available_kernels" | nl -w 2 -s '. '
|
||||
|
||||
|
||||
@ -237,31 +237,62 @@ function default_settings() {
|
||||
|
||||
function get_mikrotik_version() {
|
||||
local mode="$1"
|
||||
local rss_url
|
||||
local tree_name
|
||||
|
||||
case "$mode" in
|
||||
s) rss_url="https://cdn.mikrotik.com/routeros/latest-stable.rss" ;;
|
||||
d) rss_url="https://cdn.mikrotik.com/routeros/latest-development.rss" ;;
|
||||
l) rss_url="https://cdn.mikrotik.com/routeros/latest-long-term.rss" ;;
|
||||
t) rss_url="https://cdn.mikrotik.com/routeros/latest-testing.rss" ;;
|
||||
*) return 0 ;;
|
||||
esac
|
||||
|
||||
local rss_content
|
||||
rss_content=$(curl -fsSL $rss_url 2>/dev/null)
|
||||
if [ -n "$rss_content" ]; then
|
||||
local version
|
||||
version=$(echo "$rss_content" | grep -oP '<title>RouterOS \K[0-9.]+(?= \[)' 2>/dev/null || echo "$rss_content" | sed -n 's/.*<title>RouterOS \([0-9.]\+\) \[.*/\1/p' 2>/dev/null)
|
||||
if [[ "$version" =~ ^[0-9]+\.[0-9]+ ]]; then
|
||||
echo "$version"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
case "$mode" in
|
||||
s) tree_name="Stable release tree" ;;
|
||||
d) tree_name="Development release tree" ;;
|
||||
l) tree_name="Long-term release tree" ;;
|
||||
t) tree_name="Testing release tree" ;;
|
||||
*) return 0 ;; # not an error, just no-op
|
||||
esac
|
||||
|
||||
local html
|
||||
html=$(curl -fsSL "https://mikrotik.com/download/changelogs") || return 0
|
||||
[ -z "$html" ] && return 0
|
||||
html=$(curl -fsSL "https://mikrotik.com/download/changelogs" 2>/dev/null)
|
||||
if [ -n "$html" ]; then
|
||||
local start_line
|
||||
start_line=$(echo "$html" | grep -n "$tree_name" | cut -d: -f1 | head -n1)
|
||||
if [[ "$start_line" =~ ^[0-9]+$ ]]; then
|
||||
local line
|
||||
line=$(echo "$html" | tail -n +"$start_line" | grep -m 1 -E "c-(stable|longTerm|testing|development)-v|RouterOS [0-9]+\.[0-9]+" 2>/dev/null)
|
||||
|
||||
local version
|
||||
version=$(echo "$line" | sed -n 's/.*c-[^"]*-v\([0-9_.a-zA-Z-]\+\).*/\1/p' | tr '_' '.' 2>/dev/null)
|
||||
[ -z "$version" ] && version=$(echo "$line" | grep -oP 'RouterOS \K[0-9]+\.[0-9]+(\.[0-9]+)?' 2>/dev/null)
|
||||
|
||||
if [[ "$version" =~ ^[0-9]+\.[0-9]+ ]]; then
|
||||
echo "$version"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
local start_line
|
||||
start_line=$(echo "$html" | grep -n "$tree_name$" | cut -d: -f1 | head -n1)
|
||||
[[ "$start_line" =~ ^[0-9]+$ ]] || return 0
|
||||
|
||||
local line
|
||||
line=$( (echo "$html" | tail -n +"$start_line" | grep -m 1 "c-\(stable\|longTerm\|testing\|development\)-v") 2>/dev/null || true)
|
||||
|
||||
local version
|
||||
version=$(echo "$line" | sed -n 's/.*c-[^"]*-v\([0-9_.a-zA-Z-]\+\).*/\1/p' | tr '_' '.')
|
||||
|
||||
[[ "$version" =~ ^[0-9]+\.[0-9]+.*$ ]] && echo "$version"
|
||||
for minor in $(seq 50 -1 15); do
|
||||
local test_version="7.${minor}"
|
||||
if curl -fsSL -I "https://download.mikrotik.com/routeros/${test_version}/chr-${test_version}.img.zip" 2>/dev/null | grep -q "200 OK"; then
|
||||
echo "$test_version"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
@ -504,8 +535,8 @@ if [ -n "$MIK_VER" ]; then
|
||||
msg_ok "Latest stable version: ${CL}${BL}$MIK_VER${CL}."
|
||||
else
|
||||
msg_error "Could not get latest version"
|
||||
msg_ok "Defaulting to version 7.19"
|
||||
ver="7.19"
|
||||
msg_ok "Defaulting to version 7.20"
|
||||
MIK_VER="7.20"
|
||||
fi
|
||||
|
||||
URL=https://download.mikrotik.com/routeros/$MIK_VER/chr-$MIK_VER.img.zip
|
||||
|
||||
Reference in New Issue
Block a user