mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-06-22 15:31:19 +02:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0bde2caba6 | |||
| 0783cefae2 | |||
| c218deddd1 | |||
| ca6eacdd92 | |||
| 9996ed71ba | |||
| a3794d2eb6 | |||
| 92c22b40d7 | |||
| cf2252f548 | |||
| 6345455031 | |||
| 73c55bed9f | |||
| f7210f3a66 | |||
| 8b877f1c9f | |||
| 6192225be7 | |||
| 6665a5bf5d | |||
| 53efcadfa9 |
+23
-1
@@ -486,12 +486,26 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-06-21
|
||||
## 2026-06-22
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [arm64] Port scripts between thingsboard & wanderer to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15286](https://github.com/community-scripts/ProxmoxVE/pull/15286))
|
||||
- [arm64] Port scripts between snowshare & thelounge to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15280](https://github.com/community-scripts/ProxmoxVE/pull/15280))
|
||||
|
||||
## 2026-06-21
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Matomo: flatten nested deploy layout after update [@MickLesk](https://github.com/MickLesk) ([#15267](https://github.com/community-scripts/ProxmoxVE/pull/15267))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [arm64] Port scripts between qdrant & snipeit to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15274](https://github.com/community-scripts/ProxmoxVE/pull/15274))
|
||||
- [arm64] Port scripts between nodered & paperlessngx to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15255](https://github.com/community-scripts/ProxmoxVE/pull/15255))
|
||||
- [arm64] port scripts titled between papra and qbittorrent to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15258](https://github.com/community-scripts/ProxmoxVE/pull/15258))
|
||||
- [arm64] Port scripts between mediamtx-nocodb to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15254](https://github.com/community-scripts/ProxmoxVE/pull/15254))
|
||||
@@ -500,6 +514,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- tools.func: centralize Node.js corepack and npm handling in `setup_nodejs()` [@MickLesk](https://github.com/MickLesk) ([#15268](https://github.com/community-scripts/ProxmoxVE/pull/15268))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- tools.func: APT install and deb822 repo reliability [@MickLesk](https://github.com/MickLesk) ([#15272](https://github.com/community-scripts/ProxmoxVE/pull/15272))
|
||||
- tools.func: prevent MySQL data loss and fix repo version matching [@MickLesk](https://github.com/MickLesk) ([#15271](https://github.com/community-scripts/ProxmoxVE/pull/15271))
|
||||
- tools.func: runtime hardening for API helpers and Docker/MeiliSearch [@MickLesk](https://github.com/MickLesk) ([#15273](https://github.com/community-scripts/ProxmoxVE/pull/15273))
|
||||
|
||||
## 2026-06-20
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
+68
-3
@@ -32,11 +32,76 @@ function update_script() {
|
||||
|
||||
setup_uv
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
if [[ -f "/etc/nginx/sites-available/dispatcharr.conf" ]] && ! grep -q "real_forwarded_proto" "/etc/nginx/sites-available/dispatcharr.conf"; then
|
||||
msg_info "Migrating Nginx Configuration"
|
||||
cat <<EOF >"/etc/nginx/sites-available/dispatcharr.conf"
|
||||
map \$http_x_forwarded_proto \$real_forwarded_proto {
|
||||
"" \$scheme;
|
||||
default \$http_x_forwarded_proto;
|
||||
}
|
||||
|
||||
# Fix for nginx not allowing large files
|
||||
if ! grep -q "client_max_body_size 100M;" /etc/nginx/sites-available/dispatcharr.conf; then
|
||||
sed -i '/server_name _;/a \ client_max_body_size 100M;' /etc/nginx/sites-available/dispatcharr.conf
|
||||
map \$http_x_forwarded_port \$real_forwarded_port {
|
||||
"" \$server_port;
|
||||
default \$http_x_forwarded_port;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 9191;
|
||||
server_name _;
|
||||
client_max_body_size 100M;
|
||||
|
||||
# Serve static assets with correct MIME types
|
||||
location /assets/ {
|
||||
alias /opt/dispatcharr/frontend/dist/assets/;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
|
||||
# Explicitly set MIME types for webpack-built assets
|
||||
types {
|
||||
text/javascript js;
|
||||
text/css css;
|
||||
image/png png;
|
||||
image/svg+xml svg svgz;
|
||||
font/woff2 woff2;
|
||||
font/woff woff;
|
||||
font/ttf ttf;
|
||||
}
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
alias /opt/dispatcharr/static/;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
location /media/ {
|
||||
alias /opt/dispatcharr/media/;
|
||||
}
|
||||
|
||||
location /ws/ {
|
||||
proxy_pass http://127.0.0.1:8001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$real_forwarded_proto;
|
||||
}
|
||||
|
||||
# All other requests proxy to uWSGI
|
||||
location / {
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$real_forwarded_proto;
|
||||
proxy_set_header X-Forwarded-Port \$real_forwarded_port;
|
||||
proxy_pass http://127.0.0.1:5656;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
systemctl reload nginx
|
||||
msg_ok "Migrated Nginx Configuration"
|
||||
fi
|
||||
|
||||
ensure_dependencies vlc-bin vlc-plugin-base
|
||||
|
||||
@@ -43,6 +43,16 @@ function update_script() {
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "matomo" "matomo-org/matomo" "prebuild" "latest" "/opt/matomo" "matomo-*.zip"
|
||||
|
||||
msg_info "Setting up Matomo"
|
||||
if [[ -d /opt/matomo/matomo ]]; then
|
||||
rm -rf /opt/matomo/tmp "/opt/matomo/How to install Matomo.html"
|
||||
find /opt/matomo/matomo -mindepth 1 -maxdepth 1 -exec mv -t /opt/matomo {} +
|
||||
rm -rf /opt/matomo/matomo
|
||||
fi
|
||||
mkdir -p /opt/matomo/tmp
|
||||
chmod -R 755 /opt/matomo/tmp
|
||||
msg_ok "Set up Matomo"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
if [[ -f /opt/matomo_config.bak ]]; then
|
||||
mkdir -p /opt/matomo/config
|
||||
@@ -58,7 +68,16 @@ function update_script() {
|
||||
chown -R www-data:www-data /opt/matomo
|
||||
msg_ok "Restored Data"
|
||||
|
||||
if [[ -f /opt/matomo/console ]]; then
|
||||
msg_info "Running Matomo database upgrade"
|
||||
cd /opt/matomo
|
||||
$STD runuser -u www-data -- php console core:update --no-interaction
|
||||
msg_ok "Ran Matomo database upgrade"
|
||||
fi
|
||||
|
||||
msg_info "Starting Services"
|
||||
PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;')
|
||||
systemctl restart "php${PHP_VER}-fpm"
|
||||
systemctl start caddy
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -12,7 +12,7 @@ var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -33,7 +33,7 @@ function update_script() {
|
||||
systemctl stop qui
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/tmp/qui" "qui_*_linux_x86_64.tar.gz"
|
||||
fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/tmp/qui" "qui_*_linux_$(arch_resolve "x86_64" "arm64").tar.gz"
|
||||
|
||||
msg_info "Updating qui"
|
||||
mv /tmp/qui/qui /usr/local/bin/qui
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -36,7 +36,7 @@ function update_script() {
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
rm -rf /opt/Radarr
|
||||
fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-x64.tar.gz"
|
||||
fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
|
||||
chmod 775 /opt/Radarr
|
||||
|
||||
msg_info "Starting Service"
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_fuse="${var_fuse:-yes}"
|
||||
|
||||
@@ -34,7 +34,7 @@ function update_script() {
|
||||
systemctl stop rclone-web
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-amd64.zip"
|
||||
fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-$(arch_resolve).zip"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start rclone-web
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -33,7 +33,7 @@ function update_script() {
|
||||
systemctl stop readeck
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
|
||||
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-$(arch_resolve)"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start readeck
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -32,7 +32,7 @@ function update_script() {
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
|
||||
fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-x64.tar.xz"
|
||||
fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-$(arch_resolve "x64" "arm64").tar.xz"
|
||||
|
||||
# Migrate includes from configs/ to includes/ (recyclarr v8)
|
||||
RECYCLARR_DIR="/root/.config/recyclarr"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-15}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -39,10 +39,10 @@ function update_script() {
|
||||
fi
|
||||
msg_info "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*$(arch_resolve).deb"
|
||||
|
||||
msg_info "Starting services"
|
||||
systemctl start -q rustdesk-*
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -26,7 +26,7 @@ function update_script() {
|
||||
check_container_resources
|
||||
|
||||
if par2 --version | grep -q "par2cmdline-turbo"; then
|
||||
fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-amd64.zip"
|
||||
fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-$(arch_resolve).zip"
|
||||
fi
|
||||
|
||||
if [[ ! -d /opt/sabnzbd ]]; then
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -70,7 +70,7 @@ function update_script() {
|
||||
msg_ok "Created frontend UI"
|
||||
|
||||
if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then
|
||||
fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64"
|
||||
fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-$(arch_resolve)"
|
||||
mv "/usr/local/bin/Scanopy Daemon" /usr/local/bin/scanopy-daemon
|
||||
rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh
|
||||
sed -i -e 's|usr/bin|usr/local/bin|' \
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-16}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_fuse="${var_fuse:-yes}"
|
||||
|
||||
@@ -36,7 +36,7 @@ function update_script() {
|
||||
systemctl stop seaweedfs
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start seaweedfs
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-12}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -55,7 +55,7 @@ function update_script() {
|
||||
systemctl stop semaphore
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
|
||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_$(arch_resolve).deb"
|
||||
|
||||
if [[ -f /opt/semaphore/semaphore_db.bolt ]]; then
|
||||
$STD semaphore migrate --from-boltdb /opt/semaphore/semaphore_db.bolt --config /opt/semaphore/config.json
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+4
-4
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -35,9 +35,9 @@ function update_script() {
|
||||
systemctl stop signoz-otel-collector
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_$(arch_resolve).tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_$(arch_resolve).tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Updating SigNoz"
|
||||
cd /opt/signoz-schema-migrator/bin
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_disk="${var_disk:-2}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
|
||||
header_info "${APP}"
|
||||
variables
|
||||
@@ -33,7 +33,7 @@ function update_script() {
|
||||
systemctl stop silverbullet
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-x86_64.zip"
|
||||
fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-$(arch_resolve "x86_64" "aarch64").zip"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start silverbullet
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -40,7 +40,7 @@ function update_script() {
|
||||
cp /opt/slskd/config/slskd.yml /opt/slskd.yml.bak
|
||||
msg_ok "Backed up config"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-x64.zip"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-$(arch_resolve "x64" "arm64").zip"
|
||||
|
||||
msg_info "Restoring config"
|
||||
mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-12}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-8192}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-16}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-6144}"
|
||||
var_disk="${var_disk:-30}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ var_ram="${var_ram:-10240}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
var_tun="${var_tun:-yes}"
|
||||
var_nesting="${var_nesting:-1}"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-2}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-16}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-0}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -12,7 +12,7 @@ var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-16}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-5}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
|
||||
@@ -74,6 +74,16 @@ msg_ok "Configured Dispatcharr"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
cat <<EOF >/etc/nginx/sites-available/dispatcharr.conf
|
||||
map \$http_x_forwarded_proto \$real_forwarded_proto {
|
||||
"" \$scheme;
|
||||
default \$http_x_forwarded_proto;
|
||||
}
|
||||
|
||||
map \$http_x_forwarded_port \$real_forwarded_port {
|
||||
"" \$server_port;
|
||||
default \$http_x_forwarded_port;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 9191;
|
||||
server_name _;
|
||||
@@ -115,13 +125,16 @@ server {
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
proxy_set_header X-Forwarded-Proto \$real_forwarded_proto;
|
||||
}
|
||||
|
||||
# All other requests proxy to uWSGI
|
||||
location / {
|
||||
include proxy_params;
|
||||
proxy_set_header X-Forwarded-Port \$server_port;
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$real_forwarded_proto;
|
||||
proxy_set_header X-Forwarded-Port \$real_forwarded_port;
|
||||
proxy_pass http://127.0.0.1:5656;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,11 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
||||
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "prebuild" "latest" "/usr/bin" "qdrant-aarch64-unknown-linux-musl.tar.gz"
|
||||
else
|
||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
||||
fi
|
||||
|
||||
msg_info "Creating Qdrant Configuration"
|
||||
mkdir -p /etc/qdrant
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/usr/local/bin" "qui_*_linux_x86_64.tar.gz"
|
||||
fetch_and_deploy_gh_release "qui" "autobrr/qui" "prebuild" "latest" "/usr/local/bin" "qui_*_linux_$(arch_resolve "x86_64" "arm64").tar.gz"
|
||||
chmod +x /usr/local/bin/qui
|
||||
ln -sf /usr/local/bin/qui /usr/bin/qui
|
||||
ln -sf /usr/local/bin/qui /opt/qui
|
||||
|
||||
@@ -14,10 +14,10 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y sqlite3
|
||||
$STD apt install -y sqlite3 libicu-dev
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-x64.tar.gz"
|
||||
fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-$(arch_resolve "x64" "arm64").tar.gz"
|
||||
|
||||
msg_info "Configuring Radarr"
|
||||
mkdir -p /var/lib/radarr/
|
||||
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y apache2-utils fuse3
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-amd64.zip"
|
||||
fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-$(arch_resolve).zip"
|
||||
|
||||
msg_info "Installing rclone"
|
||||
cd /opt/rclone
|
||||
|
||||
@@ -14,14 +14,14 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y sqlite3
|
||||
$STD apt install -y sqlite3 libicu-dev
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Installing Readarr"
|
||||
mkdir -p /var/lib/readarr/
|
||||
chmod 775 /var/lib/readarr/
|
||||
cd /var/lib/readarr/
|
||||
$STD curl -fsSL 'https://readarr.servarr.com/v1/update/develop/updatefile?os=linux&runtime=netcore&arch=x64' -o readarr.tar.gz
|
||||
$STD curl -fsSL "https://readarr.servarr.com/v1/update/develop/updatefile?os=linux&runtime=netcore&arch=$(arch_resolve "x64" "arm64")" -o readarr.tar.gz
|
||||
$STD tar -xvzf readarr.tar.gz
|
||||
mv Readarr /opt
|
||||
chmod 775 /opt/Readarr
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-amd64"
|
||||
fetch_and_deploy_codeberg_release "readeck" "readeck/readeck" "singlefile" "latest" "/opt/readeck" "readeck-*-linux-$(arch_resolve)"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/readeck.service
|
||||
|
||||
@@ -14,10 +14,10 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y git
|
||||
$STD apt install -y git libicu-dev cron
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-x64.tar.xz"
|
||||
fetch_and_deploy_gh_release "recyclarr" "recyclarr/recyclarr" "prebuild" "latest" "/usr/local/bin" "recyclarr-linux-$(arch_resolve "x64" "arm64").tar.xz"
|
||||
|
||||
msg_info "Configuring Recyclarr"
|
||||
mkdir -p /root/.config/recyclarr/{configs,includes}
|
||||
|
||||
@@ -126,9 +126,13 @@ EOF
|
||||
chmod 644 /var/lib/romm/config/config.yml
|
||||
msg_ok "Created configuration file"
|
||||
|
||||
fetch_and_deploy_gh_release "RAHasher" "RetroAchievements/RALibretro" "prebuild" "latest" "/opt/RALibretro" "RAHasher-x64-Linux-*.zip"
|
||||
cp /opt/RALibretro/RAHasher /usr/bin/RAHasher
|
||||
chmod +x /usr/bin/RAHasher
|
||||
if [[ "$(arch_resolve)" != "arm64" ]]; then
|
||||
fetch_and_deploy_gh_release "RAHasher" "RetroAchievements/RALibretro" "prebuild" "latest" "/opt/RALibretro" "RAHasher-x64-Linux-*.zip"
|
||||
cp /opt/RALibretro/RAHasher /usr/bin/RAHasher
|
||||
chmod +x /usr/bin/RAHasher
|
||||
else
|
||||
msg_warn "RAHasher (RetroAchievements hashing) has no arm64 build; skipping. RA hash features will be unavailable."
|
||||
fi
|
||||
|
||||
fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball"
|
||||
|
||||
|
||||
@@ -13,10 +13,10 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*amd64.deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*$(arch_resolve).deb"
|
||||
systemctl enable -q --now rustdesk-hbbr
|
||||
systemctl enable -q --now rustdesk-hbbs
|
||||
systemctl enable -q --now rustdesk-api
|
||||
|
||||
@@ -43,7 +43,7 @@ msg_ok "Installed SABnzbd"
|
||||
read -r -p "Would you like to install par2cmdline-turbo? <y/N> " prompt
|
||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||
mv /usr/bin/par2 /usr/bin/par2.old
|
||||
fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-amd64.zip"
|
||||
fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-$(arch_resolve).zip"
|
||||
fi
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y fuse3
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Setting up SeaweedFS"
|
||||
mkdir -p /opt/seaweedfs-data
|
||||
|
||||
@@ -19,7 +19,7 @@ $STD apt install -y \
|
||||
ansible
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
|
||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_$(arch_resolve).deb"
|
||||
|
||||
msg_info "Configuring Semaphore"
|
||||
mkdir -p /opt/semaphore
|
||||
|
||||
@@ -49,6 +49,10 @@ echo ""
|
||||
|
||||
read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE
|
||||
DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}"
|
||||
if [[ "$(arch_resolve)" == "arm64" && "$DEPLOYMENT_TYPE" == "2" ]]; then
|
||||
msg_warn "FlareSolverr has no arm64 build; using Shelfmark's internal bypasser instead"
|
||||
DEPLOYMENT_TYPE="1"
|
||||
fi
|
||||
|
||||
case "$DEPLOYMENT_TYPE" in
|
||||
1)
|
||||
|
||||
@@ -28,7 +28,7 @@ Types: deb
|
||||
URIs: https://packages.clickhouse.com/deb
|
||||
Suites: stable
|
||||
Components: main
|
||||
Architectures: amd64
|
||||
Architectures: $(arch_resolve)
|
||||
Signed-By: /usr/share/keyrings/clickhouse-keyring.gpg
|
||||
EOF
|
||||
$STD apt update
|
||||
@@ -108,7 +108,7 @@ EOF
|
||||
systemctl enable -q --now clickhouse-server
|
||||
msg_ok "Configured ClickHouse"
|
||||
|
||||
fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz-schema-migrator" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-schema-migrator" "signoz-schema-migrator_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Running ClickHouse migrations"
|
||||
cd /opt/signoz-schema-migrator/bin
|
||||
@@ -116,7 +116,7 @@ $STD ./signoz-schema-migrator sync --dsn="tcp://localhost:9000?password=" --repl
|
||||
$STD ./signoz-schema-migrator async --dsn="tcp://localhost:9000?password=" --replication=true --up=
|
||||
msg_ok "ClickHouse Migrations Completed"
|
||||
|
||||
fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz" "SigNoz/signoz" "prebuild" "latest" "/opt/signoz" "signoz-community_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Setting up SigNoz"
|
||||
mkdir -p /var/lib/signoz
|
||||
@@ -153,7 +153,7 @@ EOF
|
||||
systemctl enable -q --now signoz
|
||||
msg_ok "Setup Signoz"
|
||||
|
||||
fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "signoz-otel-collector" "SigNoz/signoz-otel-collector" "prebuild" "latest" "/opt/signoz-otel-collector" "signoz-otel-collector_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Setting up SigNoz OTel Collector"
|
||||
mkdir -p /var/lib/signoz-otel-collector
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-x86_64.zip"
|
||||
fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-$(arch_resolve "x86_64" "aarch64").zip"
|
||||
mkdir -p /opt/silverbullet/space
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -13,7 +13,11 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-x64.zip"
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y libicu-dev
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-$(arch_resolve "x64" "arm64").zip"
|
||||
|
||||
msg_info "Configuring Slskd"
|
||||
JWT_KEY=$(openssl rand -base64 44)
|
||||
|
||||
@@ -20,7 +20,7 @@ $STD apt install -y \
|
||||
vlc
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "threadfin-app" "threadfin/threadfin" "singlefile" "latest" "/opt/threadfin" "Threadfin_linux_amd64"
|
||||
fetch_and_deploy_gh_release "threadfin-app" "threadfin/threadfin" "singlefile" "latest" "/opt/threadfin" "Threadfin_linux_$(arch_resolve)"
|
||||
mv /opt/threadfin/threadfin-app /opt/threadfin/threadfin
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -19,7 +19,7 @@ $STD apt install -y \
|
||||
apache2-utils
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "tinyauth" "steveiliop56/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-amd64"
|
||||
fetch_and_deploy_gh_release "tinyauth" "steveiliop56/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-$(arch_resolve)"
|
||||
|
||||
msg_info "Setting up Tinyauth"
|
||||
PASS=$(openssl rand -base64 8 | tr -dc 'a-zA-Z0-9' | head -c 8)
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-64*.zip"
|
||||
fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-$(arch_resolve "64*" "arm-*").zip"
|
||||
|
||||
msg_info "Configuring Traccar"
|
||||
cd /opt/traccar
|
||||
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y apt-transport-https
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
|
||||
mkdir -p /etc/traefik/{conf.d,ssl}
|
||||
|
||||
msg_info "Creating Traefik configuration"
|
||||
|
||||
@@ -42,11 +42,11 @@ $STD apt install -y \
|
||||
python3-cssselect
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
|
||||
fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
|
||||
fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-$(arch_resolve).deb"
|
||||
fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-$(arch_resolve "x86_64" "arm64").txz"
|
||||
ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
|
||||
ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg
|
||||
fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
|
||||
fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-$(arch_resolve)-*.deb"
|
||||
fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball"
|
||||
|
||||
msg_info "Setting up Python Backend"
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "Trilium" "TriliumNext/Trilium" "prebuild" "latest" "/opt/trilium" "TriliumNotes-Server-*linux-x64.tar.xz"
|
||||
fetch_and_deploy_gh_release "Trilium" "TriliumNext/Trilium" "prebuild" "latest" "/opt/trilium" "TriliumNotes-Server-*linux-$(arch_resolve "x64" "arm64").tar.xz"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/trilium.service
|
||||
|
||||
@@ -31,7 +31,7 @@ msg_ok "Installed Dependencies"
|
||||
UV_PYTHON="3.13" setup_uv
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-x86_64-unknown-linux-gnu.zip"
|
||||
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
|
||||
|
||||
msg_info "Installing ElasticSearch"
|
||||
setup_deb822_repo \
|
||||
|
||||
@@ -15,10 +15,10 @@ update_os
|
||||
|
||||
setup_hwaccel
|
||||
|
||||
fetch_and_deploy_gh_release "tunarr" "chrisbenincasa/tunarr" "prebuild" "latest" "/opt/tunarr" "*linux-x64.tar.gz"
|
||||
fetch_and_deploy_gh_release "tunarr" "chrisbenincasa/tunarr" "prebuild" "latest" "/opt/tunarr" "*linux-$(arch_resolve "x64" "arm64").tar.gz"
|
||||
cd /opt/tunarr
|
||||
mv tunarr* tunarr
|
||||
fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
|
||||
fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux$(arch_resolve "64" "arm64")-gpl-7.1.tar.xz"
|
||||
|
||||
msg_info "Set ErsatzTV-ffmpeg links"
|
||||
chmod +x /opt/ErsatzTV-ffmpeg/bin/*
|
||||
|
||||
@@ -31,8 +31,8 @@ LOG_LEVEL=INFO
|
||||
EOF
|
||||
msg_ok "Set Up UHF Server Environment"
|
||||
|
||||
fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-x64-*.zip"
|
||||
fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-x64-*.zip"
|
||||
fetch_and_deploy_gh_release "comskip" "swapplications/comskip" "prebuild" "latest" "/opt/comskip" "comskip-$(arch_resolve "x64" "arm64")-*.zip"
|
||||
fetch_and_deploy_gh_release "uhf-server" "swapplications/uhf-server-dist" "prebuild" "latest" "/opt/uhf-server" "UHF.Server-linux-$(arch_resolve "x64" "arm64")-*.zip"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/uhf-server.service
|
||||
|
||||
@@ -50,10 +50,11 @@ if ! curl -fsSL "$API_URL" -o "$TEMP_JSON"; then
|
||||
msg_error "Failed to fetch data from Ubiquiti API"
|
||||
exit 250
|
||||
fi
|
||||
LATEST=$(jq -r '
|
||||
PLATFORM="linux-$(arch_resolve "x64" "arm64")"
|
||||
LATEST=$(jq -r --arg platform "$PLATFORM" '
|
||||
._embedded.firmware
|
||||
| map(select(.product == "unifi-os-server"))
|
||||
| map(select(.platform == "linux-x64"))
|
||||
| map(select(.platform == $platform))
|
||||
| sort_by(.version_major, .version_minor, .version_patch)
|
||||
| last
|
||||
' "$TEMP_JSON")
|
||||
|
||||
@@ -22,7 +22,7 @@ msg_ok "Installed Dependencies"
|
||||
setup_hwaccel
|
||||
|
||||
msg_info "Installing Unmanic"
|
||||
$STD pip3 install unmanic
|
||||
$STD pip3 install --break-system-packages unmanic
|
||||
msg_ok "Installed Unmanic"
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "upgopher" "wanetty/upgopher" "prebuild" "latest" "/opt/upgopher" "upgopher_*_linux_amd64.tar.gz"
|
||||
fetch_and_deploy_gh_release "upgopher" "wanetty/upgopher" "prebuild" "latest" "/opt/upgopher" "upgopher_*_linux_$(arch_resolve).tar.gz"
|
||||
|
||||
msg_info "Installing Upgopher"
|
||||
chmod +x /opt/upgopher/upgopher
|
||||
|
||||
@@ -23,7 +23,7 @@ $STD apt install -y \
|
||||
sshpass
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "upsnap" "seriousm4x/UpSnap" "prebuild" "latest" "/opt/upsnap" "UpSnap_*_linux_amd64.zip"
|
||||
fetch_and_deploy_gh_release "upsnap" "seriousm4x/UpSnap" "prebuild" "latest" "/opt/upsnap" "UpSnap_*_linux_$(arch_resolve).zip"
|
||||
setcap 'cap_net_raw=+ep' /opt/upsnap/upsnap
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -16,10 +16,10 @@ update_os
|
||||
msg_info "Getting latest version of VictoriaMetrics"
|
||||
|
||||
victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" |
|
||||
jq -r '.[] | select(.assets[].name | match("^victoria-metrics-linux-amd64-v[0-9.]+.tar.gz$")) | .tag_name' |
|
||||
jq -r --arg a "$arch_resolve" '.[] | select(.assets[].name | match("^victoria-metrics-linux-" + $a + "-v[0-9.]+.tar.gz$")) | .tag_name' |
|
||||
head -n 1)
|
||||
victoriametrics_filename="victoria-metrics-linux-amd64-${victoriametrics_release}.tar.gz"
|
||||
vmutils_filename="vmutils-linux-amd64-${victoriametrics_release}.tar.gz"
|
||||
victoriametrics_filename="victoria-metrics-linux-${arch_resolve}-${victoriametrics_release}.tar.gz"
|
||||
vmutils_filename="vmutils-linux-${arch_resolve}-${victoriametrics_release}.tar.gz"
|
||||
msg_ok "Got version $victoriametrics_release of VictoriaMetrics"
|
||||
|
||||
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "$victoriametrics_release" "/opt/victoriametrics" "$victoriametrics_filename"
|
||||
@@ -30,10 +30,10 @@ read -r -p "${TAB3}Would you like to add VictoriaLogs? <y/N> " prompt
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
vmlogs_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
|
||||
jq -r '.assets[].name' |
|
||||
grep -E '^victoria-logs-linux-amd64-v[0-9.]+\.tar\.gz$')
|
||||
grep -E "^victoria-logs-linux-${arch_resolve}-v[0-9.]+\.tar\.gz$")
|
||||
vlutils_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
|
||||
jq -r '.assets[].name' |
|
||||
grep -E '^vlutils-linux-amd64-v[0-9.]+\.tar\.gz$')
|
||||
grep -E "^vlutils-linux-${arch_resolve}-v[0-9.]+\.tar\.gz$")
|
||||
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vmlogs_filename"
|
||||
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vlutils_filename"
|
||||
fi
|
||||
|
||||
@@ -39,11 +39,12 @@ cat <<EOF >/etc/apache2/sites-available/wallos.conf
|
||||
EOF
|
||||
$STD a2ensite wallos.conf
|
||||
$STD a2dissite 000-default.conf
|
||||
$STD systemctl reload apache2
|
||||
$STD systemctl restart apache2
|
||||
$STD curl http://localhost/endpoints/db/migrate.php
|
||||
msg_ok "Installed Wallos"
|
||||
|
||||
msg_info "Setting up Crontabs"
|
||||
$STD apt-get install -y cron
|
||||
mkdir -p /var/log/cron
|
||||
cat <<EOF >/opt/wallos.cron
|
||||
0 1 * * * php /opt/wallos/endpoints/cronjobs/updatenextpayment.php >> /var/log/cron/updatenextpayment.log 2>&1
|
||||
|
||||
@@ -15,7 +15,11 @@ update_os
|
||||
|
||||
setup_go
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
|
||||
if [[ "$(arch_resolve)" == "arm64" ]]; then
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "singlefile" "latest" "/usr/local/bin" "meilisearch-linux-aarch64"
|
||||
else
|
||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
|
||||
fi
|
||||
mkdir -p /opt/wanderer/{source,data/pb_data,data/meili_data}
|
||||
fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source"
|
||||
|
||||
|
||||
+220
-97
@@ -24,6 +24,7 @@
|
||||
# cleanup_tool_keyrings() - Remove keyrings from all 3 locations
|
||||
# stop_all_services() - Stop services by pattern (e.g. "php*-fpm")
|
||||
# verify_tool_version() - Validate installed version matches expected
|
||||
# version_matches_spec() - Compare installed semver against spec (8.0 matches 8.0.40)
|
||||
# cleanup_legacy_install() - Remove nvm, rbenv, rustup, etc.
|
||||
# prepare_repository_setup() - Cleanup repos + keyrings + validate APT
|
||||
# install_packages_with_retry() - Install with 3 retries and APT refresh
|
||||
@@ -282,7 +283,7 @@ get_cached_version() {
|
||||
cat "/var/cache/app-versions/${app}_version.txt"
|
||||
return 0
|
||||
fi
|
||||
return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
@@ -344,6 +345,37 @@ verify_tool_version() {
|
||||
return 0
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Compare installed semver against a version spec at the spec's precision.
|
||||
# Returns: 0 if match (e.g. spec 8.0 matches installed 8.0.40), 1 otherwise
|
||||
# Usage: version_matches_spec "8.0.40" "8.0"
|
||||
# ------------------------------------------------------------------------------
|
||||
version_matches_spec() {
|
||||
local installed="$1"
|
||||
local spec="$2"
|
||||
local spec_depth prefix i
|
||||
local -a spec_parts installed_parts
|
||||
|
||||
[[ -n "$installed" && -n "$spec" ]] || return 1
|
||||
|
||||
IFS='.' read -ra spec_parts <<<"$spec"
|
||||
spec_depth=${#spec_parts[@]}
|
||||
((spec_depth > 0)) || return 1
|
||||
|
||||
if ((spec_depth == 1)); then
|
||||
[[ "${installed%%.*}" == "$spec" ]] && return 0
|
||||
return 1
|
||||
fi
|
||||
|
||||
IFS='.' read -ra installed_parts <<<"$installed"
|
||||
prefix=""
|
||||
for ((i = 0; i < spec_depth && i < ${#installed_parts[@]}; i++)); do
|
||||
[[ -n "$prefix" ]] && prefix+="."
|
||||
prefix+="${installed_parts[i]}"
|
||||
done
|
||||
[[ "$prefix" == "$spec" ]]
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Clean up legacy installation methods (nvm, rbenv, rustup, etc.)
|
||||
# Usage: cleanup_legacy_install "nodejs" -> removes nvm
|
||||
@@ -462,10 +494,10 @@ install_packages_with_retry() {
|
||||
fi
|
||||
fi
|
||||
done
|
||||
# If some packages installed, consider partial success
|
||||
if [[ ${#failed[@]} -lt ${#packages[@]} ]]; then
|
||||
if [[ ${#failed[@]} -gt 0 ]]; then
|
||||
msg_warn "Partially installed. Failed packages: ${failed[*]}"
|
||||
msg_error "Partial install — failed packages: ${failed[*]}"
|
||||
return 100
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
@@ -620,13 +652,15 @@ remove_old_tool_version() {
|
||||
mysql)
|
||||
stop_all_services "mysql"
|
||||
$STD apt purge -y 'mysql*' >/dev/null 2>&1 || true
|
||||
rm -rf /var/lib/mysql 2>/dev/null || true
|
||||
# Keep data directory for safety (remove manually if needed)
|
||||
# rm -rf /var/lib/mysql 2>/dev/null || true
|
||||
cleanup_tool_keyrings "mysql"
|
||||
;;
|
||||
mongodb)
|
||||
stop_all_services "mongod"
|
||||
$STD apt purge -y 'mongodb*' >/dev/null 2>&1 || true
|
||||
rm -rf /var/lib/mongodb 2>/dev/null || true
|
||||
# Keep data directory for safety (remove manually if needed)
|
||||
# rm -rf /var/lib/mongodb 2>/dev/null || true
|
||||
cleanup_tool_keyrings "mongodb"
|
||||
;;
|
||||
node | nodejs)
|
||||
@@ -671,7 +705,8 @@ remove_old_tool_version() {
|
||||
clickhouse)
|
||||
stop_all_services "clickhouse-server"
|
||||
$STD apt purge -y 'clickhouse*' >/dev/null 2>&1 || true
|
||||
rm -rf /var/lib/clickhouse 2>/dev/null || true
|
||||
# Keep data directory for safety (remove manually if needed)
|
||||
# rm -rf /var/lib/clickhouse 2>/dev/null || true
|
||||
cleanup_tool_keyrings "clickhouse"
|
||||
;;
|
||||
esac
|
||||
@@ -695,8 +730,8 @@ should_update_tool() {
|
||||
# Get currently installed version
|
||||
current_version=$(is_tool_installed "$tool_name" 2>/dev/null) || return 0 # Not installed = needs install
|
||||
|
||||
# If versions are identical, no update needed
|
||||
if [[ "$current_version" == "$target_version" ]]; then
|
||||
# If versions match at the requested precision, no update needed
|
||||
if version_matches_spec "$current_version" "$target_version"; then
|
||||
return 1 # No update needed
|
||||
fi
|
||||
|
||||
@@ -891,6 +926,49 @@ Suites: $distro_codename
|
||||
Components: main
|
||||
Architectures: $(dpkg --print-architecture)
|
||||
Signed-By: /usr/share/keyrings/deb.sury.org-php.gpg
|
||||
EOF
|
||||
return 0
|
||||
;;
|
||||
|
||||
mysql)
|
||||
if [[ -z "$gpg_key_url" ]]; then
|
||||
msg_error "MySQL repository requires gpg_key_url"
|
||||
return 65
|
||||
fi
|
||||
|
||||
cleanup_old_repo_files "mysql"
|
||||
|
||||
if ! download_gpg_key "$gpg_key_url" "/etc/apt/keyrings/mysql.gpg" "dearmor"; then
|
||||
msg_error "Failed to import MySQL GPG key"
|
||||
return 7
|
||||
fi
|
||||
|
||||
local distro_codename suite component
|
||||
distro_codename=$(get_os_info codename)
|
||||
|
||||
if [[ "$distro_id" == "debian" ]]; then
|
||||
case "$distro_codename" in
|
||||
trixie | forky | sid) suite="bookworm" ;;
|
||||
bookworm | bullseye) suite="$distro_codename" ;;
|
||||
*) suite="bookworm" ;;
|
||||
esac
|
||||
else
|
||||
suite=$(get_fallback_suite "$distro_id" "$distro_codename" "$repo_url")
|
||||
fi
|
||||
|
||||
case "$version" in
|
||||
8.4 | 8.4.*) component="mysql-8.4-lts" ;;
|
||||
8.0 | 8.0.*) component="mysql-8.0" ;;
|
||||
*) component="mysql-${version}" ;;
|
||||
esac
|
||||
|
||||
cat <<EOF >/etc/apt/sources.list.d/mysql.sources
|
||||
Types: deb
|
||||
URIs: ${repo_url}/
|
||||
Suites: ${suite}
|
||||
Components: ${component}
|
||||
Architectures: $(dpkg --print-architecture)
|
||||
Signed-By: /etc/apt/keyrings/mysql.gpg
|
||||
EOF
|
||||
return 0
|
||||
;;
|
||||
@@ -1122,11 +1200,34 @@ get_system_arch() {
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Create temporary directory with automatic cleanup
|
||||
# Appends to a shared list so existing EXIT traps are preserved.
|
||||
# ------------------------------------------------------------------------------
|
||||
_tools_temp_dirs=()
|
||||
|
||||
_tools_cleanup_temp_dirs() {
|
||||
local d
|
||||
for d in "${_tools_temp_dirs[@]}"; do
|
||||
rm -rf "$d" 2>/dev/null || true
|
||||
done
|
||||
}
|
||||
|
||||
_tools_register_temp_cleanup() {
|
||||
[[ "${_TOOLS_TEMP_TRAP_SET:-}" == "1" ]] && return 0
|
||||
_TOOLS_TEMP_TRAP_SET=1
|
||||
local existing
|
||||
existing=$(trap -p EXIT 2>/dev/null | sed -n "s/^trap -- '\\(.*\\)' EXIT/\1/p" || true)
|
||||
if [[ -n "$existing" && "$existing" != "_tools_cleanup_temp_dirs" ]]; then
|
||||
trap "_tools_cleanup_temp_dirs; ${existing}" EXIT ERR INT TERM
|
||||
else
|
||||
trap _tools_cleanup_temp_dirs EXIT ERR INT TERM
|
||||
fi
|
||||
}
|
||||
|
||||
create_temp_dir() {
|
||||
local tmp_dir=$(mktemp -d)
|
||||
# Set trap to cleanup on EXIT, ERR, INT, TERM
|
||||
trap "rm -rf '$tmp_dir'" EXIT ERR INT TERM
|
||||
local tmp_dir
|
||||
tmp_dir=$(mktemp -d) || return 1
|
||||
_tools_temp_dirs+=("$tmp_dir")
|
||||
_tools_register_temp_cleanup
|
||||
echo "$tmp_dir"
|
||||
}
|
||||
|
||||
@@ -2049,9 +2150,11 @@ setup_deb822_repo() {
|
||||
[[ -n "$enabled" ]] && echo "Enabled: $enabled"
|
||||
} >/etc/apt/sources.list.d/${name}.sources
|
||||
|
||||
$STD apt update || {
|
||||
msg_warn "apt update failed after adding repository: ${name}"
|
||||
}
|
||||
if ! $STD apt update; then
|
||||
msg_error "apt update failed after adding repository: ${name}"
|
||||
msg_error "Hint: Verify suite '${suite}' and URI '${repo_url}' are valid for this distribution."
|
||||
return 100
|
||||
fi
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
@@ -2482,6 +2585,8 @@ check_for_gh_tag() {
|
||||
# - Does not modify anything, only checks version state
|
||||
# - Does not support pre-releases
|
||||
# ------------------------------------------------------------------------------
|
||||
TOOLS_GH_REL_JSON=""
|
||||
|
||||
check_for_gh_release() {
|
||||
local app="$1"
|
||||
local source="$2"
|
||||
@@ -2501,6 +2606,10 @@ check_for_gh_release() {
|
||||
|
||||
ensure_dependencies jq
|
||||
|
||||
local gh_check_json
|
||||
gh_check_json=$(mktemp /tmp/tools-gh-check-XXXXXX.json) || return 7
|
||||
trap 'rm -f "$gh_check_json"' RETURN
|
||||
|
||||
# Build auth header if token is available
|
||||
local header_args=()
|
||||
[[ -n "${GITHUB_TOKEN:-}" ]] && header_args=(-H "Authorization: Bearer $GITHUB_TOKEN")
|
||||
@@ -2511,14 +2620,14 @@ check_for_gh_release() {
|
||||
# For pinned versions, query the specific release tag directly
|
||||
if [[ -n "$pinned_version_in" ]]; then
|
||||
local pinned_version_encoded="${pinned_version_in//\//%2F}"
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gh_check.json \
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gh_check_json" \
|
||||
-H 'Accept: application/vnd.github+json' \
|
||||
-H 'X-GitHub-Api-Version: 2022-11-28' \
|
||||
"${header_args[@]}" \
|
||||
"https://api.github.com/repos/${source}/releases/tags/${pinned_version_encoded}" 2>/dev/null) || true
|
||||
|
||||
if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then
|
||||
releases_json="[$(</tmp/gh_check.json)]"
|
||||
if [[ "$http_code" == "200" ]] && [[ -s "$gh_check_json" ]]; then
|
||||
releases_json="[$(<"$gh_check_json")]"
|
||||
elif [[ "$http_code" == "401" ]]; then
|
||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||
@@ -2526,27 +2635,27 @@ check_for_gh_release() {
|
||||
else
|
||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
||||
fi
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "403" ]]; then
|
||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
fi
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
fi
|
||||
|
||||
if [[ -z "$pinned_version_in" ]]; then
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gh_check.json \
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gh_check_json" \
|
||||
-H 'Accept: application/vnd.github+json' \
|
||||
-H 'X-GitHub-Api-Version: 2022-11-28' \
|
||||
"${header_args[@]}" \
|
||||
"https://api.github.com/repos/${source}/releases/latest" 2>/dev/null) || true
|
||||
|
||||
if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then
|
||||
releases_json="[$(</tmp/gh_check.json)]"
|
||||
if [[ "$http_code" == "200" ]] && [[ -s "$gh_check_json" ]]; then
|
||||
releases_json="[$(<"$gh_check_json")]"
|
||||
elif [[ "$http_code" == "401" ]]; then
|
||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||
@@ -2554,28 +2663,28 @@ check_for_gh_release() {
|
||||
else
|
||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
||||
fi
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "403" ]]; then
|
||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
fi
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
fi
|
||||
|
||||
# If no releases yet (pinned version OR /latest failed), fetch up to 100
|
||||
if [[ -z "$releases_json" ]]; then
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gh_check.json \
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gh_check_json" \
|
||||
-H 'Accept: application/vnd.github+json' \
|
||||
-H 'X-GitHub-Api-Version: 2022-11-28' \
|
||||
"${header_args[@]}" \
|
||||
"https://api.github.com/repos/${source}/releases?per_page=100" 2>/dev/null) || true
|
||||
|
||||
if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then
|
||||
releases_json=$(</tmp/gh_check.json)
|
||||
if [[ "$http_code" == "200" ]] && [[ -s "$gh_check_json" ]]; then
|
||||
releases_json=$(<"$gh_check_json")
|
||||
elif [[ "$http_code" == "401" ]]; then
|
||||
msg_error "GitHub API authentication failed (HTTP 401)."
|
||||
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
||||
@@ -2583,25 +2692,25 @@ check_for_gh_release() {
|
||||
else
|
||||
msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\""
|
||||
fi
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "403" ]]; then
|
||||
msg_error "GitHub API rate limit exceeded (HTTP 403)."
|
||||
msg_error "To increase the limit, export a GitHub token before running the script:"
|
||||
msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\""
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
||||
msg_error "GitHub API connection failed (no response)."
|
||||
msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit"
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 7
|
||||
else
|
||||
msg_error "Unable to fetch releases for ${app} (HTTP ${http_code})"
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
return 22
|
||||
fi
|
||||
rm -f /tmp/gh_check.json
|
||||
rm -f "$gh_check_json"
|
||||
fi
|
||||
|
||||
mapfile -t raw_tags < <(jq -r '.[] | select(.draft==false and .prerelease==false) | .tag_name' <<<"$releases_json")
|
||||
@@ -3147,10 +3256,14 @@ fetch_and_deploy_codeberg_release() {
|
||||
return 6
|
||||
fi
|
||||
|
||||
local codeberg_rel_json
|
||||
codeberg_rel_json=$(mktemp /tmp/tools-codeberg-rel-XXXXXX.json) || return 7
|
||||
trap 'rm -f "$codeberg_rel_json"' RETURN
|
||||
|
||||
local attempt=0 success=false resp http_code
|
||||
|
||||
while ((attempt < ${#api_timeouts[@]})); do
|
||||
resp=$(curl --connect-timeout 10 --max-time "${api_timeouts[$attempt]}" -fsSL -w "%{http_code}" -o /tmp/codeberg_rel.json "$api_url") && success=true && break
|
||||
resp=$(curl --connect-timeout 10 --max-time "${api_timeouts[$attempt]}" -fsSL -w "%{http_code}" -o "$codeberg_rel_json" "$api_url") && success=true && break
|
||||
attempt=$((attempt + 1))
|
||||
if ((attempt < ${#api_timeouts[@]})); then
|
||||
msg_warn "API request timed out after ${api_timeouts[$((attempt - 1))]}s, retrying... (attempt $((attempt + 1))/${#api_timeouts[@]})"
|
||||
@@ -3169,7 +3282,7 @@ fetch_and_deploy_codeberg_release() {
|
||||
}
|
||||
|
||||
local json tag_name
|
||||
json=$(</tmp/codeberg_rel.json)
|
||||
json=$(<"$codeberg_rel_json")
|
||||
|
||||
# For "latest", the API returns an array - take the first (most recent) release
|
||||
if [[ "$version" == "latest" ]]; then
|
||||
@@ -3627,6 +3740,13 @@ fetch_and_deploy_gh_release() {
|
||||
|
||||
ensure_dependencies jq
|
||||
|
||||
if [[ -n "${TOOLS_GH_REL_JSON:-}" && -f "$TOOLS_GH_REL_JSON" ]]; then
|
||||
rm -f "$TOOLS_GH_REL_JSON"
|
||||
fi
|
||||
local gh_rel_json
|
||||
gh_rel_json=$(mktemp /tmp/tools-gh-rel-XXXXXX.json) || return 7
|
||||
TOOLS_GH_REL_JSON="$gh_rel_json"
|
||||
|
||||
local api_url="https://api.github.com/repos/$repo/releases"
|
||||
[[ "$version" != "latest" ]] && api_url="$api_url/tags/$version" || api_url="$api_url/latest"
|
||||
local header=()
|
||||
@@ -3643,7 +3763,7 @@ fetch_and_deploy_gh_release() {
|
||||
local max_retries=${#api_timeouts[@]} retry_delay=2 attempt=1 success=false http_code
|
||||
|
||||
while ((attempt <= max_retries)); do
|
||||
http_code=$(curl --connect-timeout 10 --max-time "${api_timeouts[$((attempt - 1))]:-240}" -sSL -w "%{http_code}" -o /tmp/gh_rel.json "${header[@]}" "$api_url" 2>/dev/null) || true
|
||||
http_code=$(curl --connect-timeout 10 --max-time "${api_timeouts[$((attempt - 1))]:-240}" -sSL -w "%{http_code}" -o "$gh_rel_json" "${header[@]}" "$api_url" 2>/dev/null) || true
|
||||
if [[ "$http_code" == "200" ]]; then
|
||||
success=true
|
||||
break
|
||||
@@ -3690,7 +3810,7 @@ fetch_and_deploy_gh_release() {
|
||||
fi
|
||||
|
||||
local json tag_name
|
||||
json=$(</tmp/gh_rel.json)
|
||||
json=$(<"$gh_rel_json")
|
||||
tag_name=$(echo "$json" | jq -r '.tag_name // .name // empty')
|
||||
# Only strip leading 'v' when followed by a digit (e.g. v1.2.3), not words like "version/..."
|
||||
[[ "$tag_name" =~ ^v[0-9] ]] && version="${tag_name:1}" || version="$tag_name"
|
||||
@@ -4295,7 +4415,12 @@ setup_composer() {
|
||||
# - Updates Docker Engine if newer version available
|
||||
# - Interactive container update with multi-select
|
||||
# - Portainer installation and update support
|
||||
# - Set DOCKER_NONINTERACTIVE=1 to skip interactive prompts (CI/unattended)
|
||||
# ------------------------------------------------------------------------------
|
||||
_docker_is_noninteractive() {
|
||||
[[ "${DOCKER_NONINTERACTIVE:-}" == "1" || "${DOCKER_NONINTERACTIVE:-}" == "true" || "${DOCKER_NONINTERACTIVE:-}" == "TRUE" ]] || [[ ! -t 0 ]]
|
||||
}
|
||||
|
||||
setup_docker() {
|
||||
local docker_installed=false
|
||||
local portainer_installed=false
|
||||
@@ -4435,21 +4560,25 @@ EOF
|
||||
PORTAINER_LATEST=$(curl -fsSL https://registry.hub.docker.com/v2/repositories/portainer/portainer-ce/tags?page_size=100 | grep -oP '"name":"\K[0-9]+\.[0-9]+\.[0-9]+"' | head -1 | tr -d '"')
|
||||
|
||||
if [ "$PORTAINER_CURRENT" != "$PORTAINER_LATEST" ]; then
|
||||
read -r -p "${TAB3}Update Portainer $PORTAINER_CURRENT → $PORTAINER_LATEST? <y/N> " prompt
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Updating Portainer"
|
||||
docker stop portainer
|
||||
docker rm portainer
|
||||
docker pull portainer/portainer-ce:latest
|
||||
docker run -d \
|
||||
-p 9000:9000 \
|
||||
-p 9443:9443 \
|
||||
--name=portainer \
|
||||
--restart=always \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v portainer_data:/data \
|
||||
portainer/portainer-ce:latest
|
||||
msg_ok "Updated Portainer to $PORTAINER_LATEST"
|
||||
if _docker_is_noninteractive; then
|
||||
msg_info "Skipping Portainer update prompt (non-interactive)"
|
||||
else
|
||||
read -r -p "${TAB3}Update Portainer $PORTAINER_CURRENT → $PORTAINER_LATEST? <y/N> " prompt
|
||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||
msg_info "Updating Portainer"
|
||||
docker stop portainer
|
||||
docker rm portainer
|
||||
docker pull portainer/portainer-ce:latest
|
||||
docker run -d \
|
||||
-p 9000:9000 \
|
||||
-p 9443:9443 \
|
||||
--name=portainer \
|
||||
--restart=always \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v portainer_data:/data \
|
||||
portainer/portainer-ce:latest
|
||||
msg_ok "Updated Portainer to $PORTAINER_LATEST"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
msg_ok "Portainer is up-to-date ($PORTAINER_CURRENT)"
|
||||
@@ -4472,7 +4601,7 @@ EOF
|
||||
fi
|
||||
|
||||
# Interactive Container Update Check
|
||||
if [[ "${DOCKER_SKIP_UPDATES:-}" != "true" ]] && [ "$docker_installed" = true ]; then
|
||||
if [[ "${DOCKER_SKIP_UPDATES:-}" != "true" ]] && [ "$docker_installed" = true ] && ! _docker_is_noninteractive; then
|
||||
msg_info "Checking for container updates"
|
||||
|
||||
# Get list of running containers with update status
|
||||
@@ -5246,15 +5375,15 @@ setup_hwaccel() {
|
||||
# ══════════════════════════════════════════════════════════════════════════════
|
||||
# Resolve the IGC tag that the latest compute-runtime was built against.
|
||||
# Must be called AFTER a fetch_and_deploy_gh_release for intel/compute-runtime
|
||||
# so that /tmp/gh_rel.json contains the compute-runtime release metadata.
|
||||
# so that TOOLS_GH_REL_JSON contains the compute-runtime release metadata.
|
||||
# Sets the variable named by $1 (default: igc_tag) to the discovered tag.
|
||||
# ══════════════════════════════════════════════════════════════════════════════
|
||||
_resolve_igc_tag() {
|
||||
local -n _out_ref="${1:-igc_tag}"
|
||||
_out_ref="latest"
|
||||
if [[ -f /tmp/gh_rel.json ]]; then
|
||||
if [[ -n "${TOOLS_GH_REL_JSON:-}" && -f "$TOOLS_GH_REL_JSON" ]]; then
|
||||
local _body _parsed
|
||||
_body=$(jq -r '.body // empty' /tmp/gh_rel.json 2>/dev/null) || return 0
|
||||
_body=$(jq -r '.body // empty' "$TOOLS_GH_REL_JSON" 2>/dev/null) || return 0
|
||||
_parsed=$(grep -oP 'intel-graphics-compiler/releases/tag/\K[^\s\)]+' <<<"$_body" | head -1)
|
||||
[[ -n "$_parsed" ]] && _out_ref="$_parsed"
|
||||
fi
|
||||
@@ -5288,7 +5417,7 @@ _setup_intel_arc() {
|
||||
if [[ "$os_codename" == "trixie" || "$os_codename" == "sid" ]]; then
|
||||
msg_info "Fetching Intel compute-runtime from GitHub for Arc support"
|
||||
|
||||
# Fetch a compute-runtime package first so /tmp/gh_rel.json is populated,
|
||||
# Fetch a compute-runtime package first so TOOLS_GH_REL_JSON is populated,
|
||||
# then resolve the matching IGC tag from the release notes.
|
||||
# libigdgmm - bundled in compute-runtime releases
|
||||
fetch_and_deploy_gh_release "libigdgmm12" "intel/compute-runtime" "binary" "latest" "" "libigdgmm12_*_amd64.deb" || true
|
||||
@@ -5352,7 +5481,7 @@ _setup_intel_modern() {
|
||||
if [[ "$os_codename" == "trixie" || "$os_codename" == "sid" ]]; then
|
||||
msg_info "Fetching Intel compute-runtime from GitHub"
|
||||
|
||||
# Fetch a compute-runtime package first so /tmp/gh_rel.json is populated,
|
||||
# Fetch a compute-runtime package first so TOOLS_GH_REL_JSON is populated,
|
||||
# then resolve the matching IGC tag from the release notes.
|
||||
# libigdgmm first (bundled in compute-runtime releases)
|
||||
fetch_and_deploy_gh_release "libigdgmm12" "intel/compute-runtime" "binary" "latest" "" "libigdgmm12_*_amd64.deb" || true
|
||||
@@ -6406,7 +6535,7 @@ EOF
|
||||
fi
|
||||
|
||||
# Scenario 1: Already installed at target version - just update packages
|
||||
if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" == "$MARIADB_VERSION" ]]; then
|
||||
if [[ -n "$CURRENT_VERSION" ]] && version_matches_spec "$CURRENT_VERSION" "$MARIADB_VERSION"; then
|
||||
msg_info "Update MariaDB $MARIADB_VERSION"
|
||||
|
||||
# Ensure APT is working
|
||||
@@ -6438,7 +6567,7 @@ EOF
|
||||
fi
|
||||
|
||||
# Scenario 2b: Different version installed - clean upgrade
|
||||
if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" != "$MARIADB_VERSION" ]]; then
|
||||
if [[ -n "$CURRENT_VERSION" ]] && ! version_matches_spec "$CURRENT_VERSION" "$MARIADB_VERSION"; then
|
||||
msg_info "Upgrade MariaDB from $CURRENT_VERSION to $MARIADB_VERSION"
|
||||
remove_old_tool_version "mariadb"
|
||||
fi
|
||||
@@ -6727,24 +6856,13 @@ setup_meilisearch() {
|
||||
fi
|
||||
fi
|
||||
|
||||
# If migration is needed but dump failed, we have options:
|
||||
# 1. Abort the update (safest, but annoying)
|
||||
# 2. Backup data directory and proceed (allows manual recovery)
|
||||
# 3. Just proceed and hope for the best (dangerous)
|
||||
# We choose option 2: backup and proceed with warning
|
||||
if [[ "$NEEDS_MIGRATION" == "true" ]] && [[ -z "$DUMP_UID" ]]; then
|
||||
local MEILI_DB_PATH
|
||||
MEILI_DB_PATH=$(grep -E "^db_path\s*=" /etc/meilisearch.toml 2>/dev/null | sed 's/.*=\s*"\(.*\)"/\1/' | tr -d ' ' || true)
|
||||
MEILI_DB_PATH="${MEILI_DB_PATH:-/var/lib/meilisearch/data}"
|
||||
|
||||
if [[ -d "$MEILI_DB_PATH" ]] && [[ -n "$(ls -A "$MEILI_DB_PATH" 2>/dev/null)" ]]; then
|
||||
local BACKUP_PATH="${MEILI_DB_PATH}.backup.$(date +%Y%m%d%H%M%S)"
|
||||
msg_warn "Backing up MeiliSearch data to ${BACKUP_PATH}"
|
||||
mv "$MEILI_DB_PATH" "$BACKUP_PATH"
|
||||
mkdir -p "$MEILI_DB_PATH"
|
||||
msg_info "Data backed up. After update, you may need to reindex your data."
|
||||
msg_info "Old data is preserved at: ${BACKUP_PATH}"
|
||||
msg_error "MeiliSearch migration requires a successful dump before upgrade"
|
||||
msg_error "Ensure the service is running and master_key is configured, or set MEILISEARCH_SKIP_MIGRATION=1 to force (data loss risk)"
|
||||
if [[ "${MEILISEARCH_SKIP_MIGRATION:-}" != "1" ]]; then
|
||||
return 100
|
||||
fi
|
||||
msg_warn "MEILISEARCH_SKIP_MIGRATION=1 — proceeding without dump (manual reindex may be required)"
|
||||
fi
|
||||
|
||||
# Stop service and update binary
|
||||
@@ -7153,7 +7271,7 @@ setup_mysql() {
|
||||
|
||||
# Scenario 2: Use official MySQL repository (USE_MYSQL_REPO=true)
|
||||
# Scenario 2a: Already at target version - just update packages
|
||||
if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" == "$MYSQL_VERSION" ]]; then
|
||||
if [[ -n "$CURRENT_VERSION" ]] && version_matches_spec "$CURRENT_VERSION" "$MYSQL_VERSION"; then
|
||||
msg_info "Update MySQL $MYSQL_VERSION"
|
||||
|
||||
ensure_apt_working || return 100
|
||||
@@ -7169,7 +7287,7 @@ setup_mysql() {
|
||||
fi
|
||||
|
||||
# Scenario 2: Different version installed - clean upgrade
|
||||
if [[ -n "$CURRENT_VERSION" && "$CURRENT_VERSION" != "$MYSQL_VERSION" ]]; then
|
||||
if [[ -n "$CURRENT_VERSION" ]] && ! version_matches_spec "$CURRENT_VERSION" "$MYSQL_VERSION"; then
|
||||
msg_info "Upgrade MySQL from $CURRENT_VERSION to $MYSQL_VERSION"
|
||||
remove_old_tool_version "mysql"
|
||||
else
|
||||
@@ -8559,13 +8677,10 @@ setup_uv() {
|
||||
local UV_BIN="/usr/local/bin/uv"
|
||||
local UVX_BIN="/usr/local/bin/uvx"
|
||||
local TMP_DIR=$(mktemp -d)
|
||||
local CACHED_VERSION
|
||||
|
||||
# trap for TMP Cleanup
|
||||
trap "rm -rf '$TMP_DIR'" EXIT
|
||||
|
||||
CACHED_VERSION=$(get_cached_version "uv")
|
||||
|
||||
# Architecture Detection
|
||||
local ARCH=$(uname -m)
|
||||
local OS_TYPE=""
|
||||
@@ -9041,6 +9156,10 @@ check_for_gl_release() {
|
||||
|
||||
ensure_dependencies jq
|
||||
|
||||
local gl_check_json
|
||||
gl_check_json=$(mktemp /tmp/tools-gl-check-XXXXXX.json) || return 7
|
||||
trap 'rm -f "$gl_check_json"' RETURN
|
||||
|
||||
local repo_encoded
|
||||
repo_encoded=$(printf '%s' "$source" | sed 's|/|%2F|g')
|
||||
|
||||
@@ -9052,23 +9171,23 @@ check_for_gl_release() {
|
||||
# For pinned versions, try to fetch the specific release tag first
|
||||
if [[ -n "$pinned_version_in" ]]; then
|
||||
local pinned_encoded="${pinned_version_in//\//%2F}"
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gl_check.json \
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gl_check_json" \
|
||||
"${header[@]}" \
|
||||
"https://gitlab.com/api/v4/projects/$repo_encoded/releases/$pinned_encoded" 2>/dev/null) || true
|
||||
if [[ "$http_code" == "200" ]] && [[ -s /tmp/gl_check.json ]]; then
|
||||
releases_json="[$(</tmp/gl_check.json)]"
|
||||
if [[ "$http_code" == "200" ]] && [[ -s "$gl_check_json" ]]; then
|
||||
releases_json="[$(<"$gl_check_json")]"
|
||||
fi
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
fi
|
||||
|
||||
# Fetch full releases list if needed
|
||||
if [[ -z "$releases_json" ]]; then
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o /tmp/gl_check.json \
|
||||
http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gl_check_json" \
|
||||
"${header[@]}" \
|
||||
"https://gitlab.com/api/v4/projects/$repo_encoded/releases?per_page=100&order_by=released_at&sort=desc" 2>/dev/null) || true
|
||||
|
||||
if [[ "$http_code" == "200" ]] && [[ -s /tmp/gl_check.json ]]; then
|
||||
releases_json=$(</tmp/gl_check.json)
|
||||
if [[ "$http_code" == "200" ]] && [[ -s "$gl_check_json" ]]; then
|
||||
releases_json=$(<"$gl_check_json")
|
||||
elif [[ "$http_code" == "401" ]]; then
|
||||
msg_error "GitLab API authentication failed (HTTP 401)."
|
||||
if [[ -n "${GITLAB_TOKEN:-}" ]]; then
|
||||
@@ -9076,28 +9195,28 @@ check_for_gl_release() {
|
||||
else
|
||||
msg_error "The repository may require authentication. Try: export GITLAB_TOKEN=\"glpat-your_token\""
|
||||
fi
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "404" ]]; then
|
||||
msg_error "GitLab project not found (HTTP 404). Ensure '${source}' is correct and publicly accessible."
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "429" ]]; then
|
||||
msg_error "GitLab API rate limit exceeded (HTTP 429)."
|
||||
msg_error "To increase the limit, export a GitLab token: export GITLAB_TOKEN=\"glpat-your_token_here\""
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
return 22
|
||||
elif [[ "$http_code" == "000" || -z "$http_code" ]]; then
|
||||
msg_error "GitLab API connection failed (no response)."
|
||||
msg_error "Check your network/DNS: curl -sSL https://gitlab.com/api/v4/version"
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
return 7
|
||||
else
|
||||
msg_error "Unable to fetch releases for ${app} (HTTP ${http_code})"
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
return 22
|
||||
fi
|
||||
rm -f /tmp/gl_check.json
|
||||
rm -f "$gl_check_json"
|
||||
fi
|
||||
|
||||
mapfile -t raw_tags < <(jq -r '.[] | .tag_name' <<<"$releases_json")
|
||||
@@ -9317,6 +9436,10 @@ fetch_and_deploy_gl_release() {
|
||||
|
||||
ensure_dependencies jq
|
||||
|
||||
local gl_rel_json
|
||||
gl_rel_json=$(mktemp /tmp/tools-gl-rel-XXXXXX.json) || return 7
|
||||
trap 'rm -f "$gl_rel_json"' RETURN
|
||||
|
||||
local repo_encoded
|
||||
repo_encoded=$(printf '%s' "$repo" | sed 's|/|%2F|g')
|
||||
|
||||
@@ -9334,7 +9457,7 @@ fetch_and_deploy_gl_release() {
|
||||
local max_retries=3 retry_delay=2 attempt=1 success=false http_code
|
||||
|
||||
while ((attempt <= max_retries)); do
|
||||
http_code=$(curl $api_timeout -sSL -w "%{http_code}" -o /tmp/gl_rel.json "${header[@]}" "$api_url" 2>/dev/null) || true
|
||||
http_code=$(curl $api_timeout -sSL -w "%{http_code}" -o "$gl_rel_json" "${header[@]}" "$api_url" 2>/dev/null) || true
|
||||
if [[ "$http_code" == "200" ]]; then
|
||||
success=true
|
||||
break
|
||||
@@ -9375,7 +9498,7 @@ fetch_and_deploy_gl_release() {
|
||||
fi
|
||||
|
||||
local json tag_name
|
||||
json=$(</tmp/gl_rel.json)
|
||||
json=$(<"$gl_rel_json")
|
||||
|
||||
if [[ "$version" == "latest" ]]; then
|
||||
json=$(echo "$json" | jq '.[0] // empty')
|
||||
|
||||
Reference in New Issue
Block a user