Compare commits

...

33 Commits

Author SHA1 Message Date
github-actions[bot] 93f9ceb93d Update CHANGELOG.md 2026-08-04 22:27:04 +00:00
CanbiZ (MickLesk) e3e29667c6 Actual Budget: allow native module install scripts under npm 11 (Node 24) (#16277) 2026-08-05 00:26:46 +02:00
community-scripts-pr-app[bot] 3921f03b73 Update CHANGELOG.md (#16284)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 22:26:30 +00:00
CanbiZ (MickLesk) 1336b44a26 Heimdall-Dashboard: run full composer install on update, force production env (#16278) 2026-08-05 00:26:12 +02:00
community-scripts-pr-app[bot] 419f9e397e Update CHANGELOG.md (#16283)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 22:25:59 +00:00
CanbiZ (MickLesk) fcbaedf7d8 xyOps: rebuild xySat satellite during update (#16279) 2026-08-05 00:25:29 +02:00
community-scripts-pr-app[bot] 4eb022fceb Update CHANGELOG.md (#16282)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 22:25:24 +00:00
CanbiZ (MickLesk) 6f4d3b4841 HAOS: remove non-ASCII dash from CPU model dialog text (#16276) 2026-08-05 00:24:56 +02:00
community-scripts-pr-app[bot] a4f893eb7c Update CHANGELOG.md (#16281)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 22:01:31 +00:00
Luke Gustafson 44589819d1 fix: back up Termix db/data so the update stops destroying encryption keys (#16275) 2026-08-05 00:01:02 +02:00
community-scripts-pr-app[bot] 33bfae30e0 Update CHANGELOG.md (#16274)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 21:03:00 +00:00
push-app-to-main[bot] 3fa516f94b Hister (#16259)
* Add hister (ct)

* Update source command in hister.sh

Replace local source with direct curl command for build.func.

* Update ct/hister.sh

* Update install/hister-install.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Sam Heinz <sam@samheinz.com>
2026-08-04 23:02:28 +02:00
community-scripts-pr-app[bot] 26abc114fd Update .app files (#16269)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-08-04 21:06:45 +02:00
community-scripts-pr-app[bot] 5202ffcea2 Update CHANGELOG.md (#16270)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 19:02:39 +00:00
CanbiZ (MickLesk) 86d67affa3 Refactor: harmonize tools/addon and move boilerplate into core.func (#16202) 2026-08-04 21:02:03 +02:00
community-scripts-pr-app[bot] e489c7f00b Update CHANGELOG.md (#16268)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 18:51:34 +00:00
community-scripts-pr-app[bot] 9df4cca7e8 Update CHANGELOG.md (#16267)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 18:51:11 +00:00
CanbiZ (MickLesk) f219707efd Bump NodeJS Versions of several scripts (#16230) 2026-08-04 20:51:02 +02:00
Copilot 77eece6f40 passwordpusher: dynamically read Ruby version from .ruby-version file (#16242)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-08-04 20:50:40 +02:00
community-scripts-pr-app[bot] 7b168d4986 Update CHANGELOG.md (#16266)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 18:50:12 +00:00
TowyTowy 64ae6241eb fix(salt): write version cache to ~/.salt, not /~.salt (#16265)
Co-authored-by: Claude <noreply@anthropic.com>
2026-08-04 20:49:50 +02:00
community-scripts-pr-app[bot] 3ef8dc8312 Update CHANGELOG.md (#16264)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 14:56:12 +00:00
community-scripts-pr-app[bot] 53df629af3 Update CHANGELOG.md (#16263)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 14:55:50 +00:00
community-scripts-pr-app[bot] 5271863a59 Update CHANGELOG.md (#16262)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 14:55:40 +00:00
push-app-to-main[bot] 468dba3f24 Obsidian-LiveSync (#16233)
* Add obsidian-livesync (ct)

* Update ct/obsidian-livesync.sh

Co-authored-by: Sam Heinz <sam@samheinz.com>

* Fix source line for build.func in obsidian-livesync.sh

Updated the source line to always fetch build.func from the specified URL.

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Sam Heinz <sam@samheinz.com>
2026-08-04 16:55:37 +02:00
community-scripts-pr-app[bot] 09e9918b8a Update CHANGELOG.md (#16261)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 14:55:18 +00:00
CanbiZ (MickLesk) 64cd328363 tools.func: never delete ubuntu.sources (or other distro base sources) as orphaned (#16250) 2026-08-04 16:55:08 +02:00
CanbiZ (MickLesk) 6d63e3e476 AFFiNE: fix version and build type reported by the app itself (#16251) 2026-08-04 16:54:46 +02:00
community-scripts-pr-app[bot] 3a846721ec Update CHANGELOG.md (#16260)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 14:54:35 +00:00
Chris ac866bf816 Opencloud: Pin version to 7.4.0 (#16257) 2026-08-04 16:54:31 +02:00
CanbiZ (MickLesk) 5d202e2a4a tools.func: complete a stale/partial backup manifest instead of trusting it as-is (#16252) 2026-08-04 16:54:05 +02:00
community-scripts-pr-app[bot] 888dfae126 Update CHANGELOG.md (#16253)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 10:14:20 +00:00
CanbiZ (MickLesk) 60e8ed77c4 Passbolt: fetch GPG key from Passbolt's own host instead of the flaky keyserver (#16248) 2026-08-04 12:13:49 +02:00
79 changed files with 1618 additions and 1430 deletions
+2
View File
@@ -6,6 +6,8 @@ on:
- main - main
paths: paths:
- "ct/**.sh" - "ct/**.sh"
- "tools/**.sh"
- "vm/**.sh"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
+3 -1
View File
@@ -24,7 +24,9 @@ generate_headers() {
app_name=$(grep -oP '^APP="\K[^"]+' "$script" 2>/dev/null) app_name=$(grep -oP '^APP="\K[^"]+' "$script" 2>/dev/null)
if [[ -n "$app_name" ]]; then if [[ -n "$app_name" ]]; then
output_file="${headers_dir}/$(basename "${script%.*}")" # core.func/vm-core.func look the header up as "${APP,,}" without spaces,
# so the generated file has to be named after APP - not after the script.
output_file="${headers_dir}/$(echo "${app_name,,}" | tr -d ' ')"
figlet_output=$(figlet -w 500 -f slant "$app_name") figlet_output=$(figlet -w 500 -f slant "$app_name")
if [[ -n "$figlet_output" ]]; then if [[ -n "$figlet_output" ]]; then
echo "$figlet_output" >"$output_file" echo "$figlet_output" >"$output_file"
+40
View File
@@ -518,6 +518,46 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-08-04
### 🆕 New Scripts
- Hister ([#16259](https://github.com/community-scripts/ProxmoxVE/pull/16259))
- Obsidian-LiveSync ([#16233](https://github.com/community-scripts/ProxmoxVE/pull/16233))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Actual Budget: allow native module install scripts under npm 11 (Node24) [@MickLesk](https://github.com/MickLesk) ([#16277](https://github.com/community-scripts/ProxmoxVE/pull/16277))
- Heimdall-Dashboard: run full composer install on update, force production env [@MickLesk](https://github.com/MickLesk) ([#16278](https://github.com/community-scripts/ProxmoxVE/pull/16278))
- xyOps: rebuild xySat satellite during update [@MickLesk](https://github.com/MickLesk) ([#16279](https://github.com/community-scripts/ProxmoxVE/pull/16279))
- HAOS: remove non-ASCII dash from CPU model dialog text [@MickLesk](https://github.com/MickLesk) ([#16276](https://github.com/community-scripts/ProxmoxVE/pull/16276))
- fix: back up Termix db/data so the update stops destroying encryption keys [@LukeGus](https://github.com/LukeGus) ([#16275](https://github.com/community-scripts/ProxmoxVE/pull/16275))
- passwordpusher: dynamically read Ruby version from .ruby-version file [@Copilot](https://github.com/Copilot) ([#16242](https://github.com/community-scripts/ProxmoxVE/pull/16242))
- fix(salt): write version cache to ~/.salt, not /~.salt [@TowyTowy](https://github.com/TowyTowy) ([#16265](https://github.com/community-scripts/ProxmoxVE/pull/16265))
- AFFiNE: fix version and build type reported by the app itself [@MickLesk](https://github.com/MickLesk) ([#16251](https://github.com/community-scripts/ProxmoxVE/pull/16251))
- Passbolt: fetch GPG key from Passbolt's own host instead of the flaky keyserver [@MickLesk](https://github.com/MickLesk) ([#16248](https://github.com/community-scripts/ProxmoxVE/pull/16248))
- #### ✨ New Features
- Opencloud: Pin version to 7.4.0 [@vhsdream](https://github.com/vhsdream) ([#16257](https://github.com/community-scripts/ProxmoxVE/pull/16257))
- #### 🔧 Refactor
- Bump NodeJS Versions of several scripts [@MickLesk](https://github.com/MickLesk) ([#16230](https://github.com/community-scripts/ProxmoxVE/pull/16230))
### 💾 Core
- #### 🐞 Bug Fixes
- tools.func: never delete ubuntu.sources (or other distro base sources) as orphaned [@MickLesk](https://github.com/MickLesk) ([#16250](https://github.com/community-scripts/ProxmoxVE/pull/16250))
- tools.func: complete a stale/partial backup manifest instead of trusting it as-is [@MickLesk](https://github.com/MickLesk) ([#16252](https://github.com/community-scripts/ProxmoxVE/pull/16252))
- #### 🔧 Refactor
- Refactor: harmonize tools/addon and move boilerplate into core.func [@MickLesk](https://github.com/MickLesk) ([#16202](https://github.com/community-scripts/ProxmoxVE/pull/16202))
## 2026-08-03 ## 2026-08-03
### 🚀 Updated Scripts ### 🚀 Updated Scripts
+3 -1
View File
@@ -30,7 +30,7 @@ function update_script() {
exit exit
fi fi
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
RELEASE=$(get_latest_github_release "actualbudget/actual") RELEASE=$(get_latest_github_release "actualbudget/actual")
if [[ -f /opt/actualbudget-data/config.json ]]; then if [[ -f /opt/actualbudget-data/config.json ]]; then
if check_for_gh_release "actualbudget" "actualbudget/actual"; then if check_for_gh_release "actualbudget" "actualbudget/actual"; then
@@ -39,7 +39,9 @@ function update_script() {
msg_ok "Stopped Service" msg_ok "Stopped Service"
msg_info "Updating Actual Budget to ${RELEASE}" msg_info "Updating Actual Budget to ${RELEASE}"
$STD npm config set allow-scripts=bcrypt,better-sqlite3,argon2 --location=global
$STD npm update -g @actual-app/sync-server $STD npm update -g @actual-app/sync-server
$STD npm rebuild -g
echo "${RELEASE}" >~/.actualbudget echo "${RELEASE}" >~/.actualbudget
msg_ok "Updated Actual Budget to ${RELEASE}" msg_ok "Updated Actual Budget to ${RELEASE}"
+2
View File
@@ -81,6 +81,8 @@ TURBO
export NODE_OPTIONS="--max-old-space-size=2048" export NODE_OPTIONS="--max-old-space-size=2048"
$STD yarn install $STD yarn install
$STD bash ./scripts/set-version.sh "$(cat ~/.affine_app)"
export BUILD_TYPE=stable
$STD npm install -g typescript $STD npm install -g typescript
$STD yarn affine @affine/native build $STD yarn affine @affine/native build
+6
View File
@@ -0,0 +1,6 @@
__ ___ __
/ / / (_)____/ /____ _____
/ /_/ / / ___/ __/ _ \/ ___/
/ __ / (__ ) /_/ __/ /
/_/ /_/_/____/\__/\___/_/
-6
View File
@@ -1,6 +0,0 @@
_____
/ ___/_________ _____ ____ ____ __ __
\__ \/ ___/ __ `/ __ \/ __ \/ __ \/ / / /
___/ / /__/ /_/ / / / / /_/ / /_/ / /_/ /
/____/\___/\__,_/_/ /_/\____/ .___/\__, /
/_/ /____/
+6
View File
@@ -0,0 +1,6 @@
____ __ _ ___ __ _ _____
/ __ \/ /_ _____(_)___/ (_)___ _____ / / (_) _____ / ___/__ ______ _____
/ / / / __ \/ ___/ / __ / / __ `/ __ \______/ / / / | / / _ \\__ \/ / / / __ \/ ___/
/ /_/ / /_/ (__ ) / /_/ / / /_/ / / / /_____/ /___/ /| |/ / __/__/ / /_/ / / / / /__
\____/_.___/____/_/\__,_/_/\__,_/_/ /_/ /_____/_/ |___/\___/____/\__, /_/ /_/\___/
/____/
+4 -1
View File
@@ -46,8 +46,11 @@ function update_script() {
msg_info "Updating Heimdall-Dashboard" msg_info "Updating Heimdall-Dashboard"
cd /opt/Heimdall cd /opt/Heimdall
sed -i 's/^APP_ENV=.*/APP_ENV=production/' .env
rm -f bootstrap/cache/*.php
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer dump-autoload $STD composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
$STD php artisan optimize:clear
msg_ok "Updated Heimdall-Dashboard" msg_ok "Updated Heimdall-Dashboard"
msg_info "Restoring Data" msg_info "Restoring Data"
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/asciimoo/hister
APP="Hister"
var_tags="${var_tags:-search;browser-history;personal}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /usr/local/bin/hister ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "hister" "asciimoo/hister"; then
msg_info "Stopping Service"
systemctl stop hister
msg_ok "Stopped Service"
fetch_and_deploy_gh_release "hister" "asciimoo/hister" "singlefile" "latest" "/usr/local/bin" "hister_*_linux_$(arch_resolve)"
msg_info "Starting Service"
systemctl start hister
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:4433${CL}"
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/vrtmrz/obsidian-livesync | https://couchdb.apache.org/
APP="Obsidian-LiveSync"
var_tags="${var_tags:-documents;notes}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /opt/couchdb/etc/local.d/obsidian-livesync.ini ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Stopping CouchDB"
systemctl stop couchdb
msg_ok "Stopped CouchDB"
create_backup /var/lib/couchdb /opt/couchdb/etc/local.d/obsidian-livesync.ini /opt/obsidian-livesync/.env
msg_info "Updating Container OS"
$STD apt update
$STD apt upgrade -y
msg_ok "Updated Container OS"
systemctl stop couchdb
restore_backup
msg_info "Starting CouchDB"
systemctl start couchdb
msg_ok "Started CouchDB"
msg_ok "Updated successfully!"
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}Configure the Self-hosted LiveSync plugin with the credentials in /opt/obsidian-livesync/.env${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:5984/_utils/${CL}"
+2
View File
@@ -43,6 +43,8 @@ function update_script() {
fi fi
msg_ok "New version available: ${LATEST}" msg_ok "New version available: ${LATEST}"
NODE_VERSION="26" setup_nodejs
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop omniroute systemctl stop omniroute
msg_ok "Stopped Service" msg_ok "Stopped Service"
+1 -1
View File
@@ -30,7 +30,7 @@ function update_script() {
exit exit
fi fi
RELEASE="v7.3.0" RELEASE="v7.4.0"
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
msg_info "Stopping services" msg_info "Stopping services"
systemctl stop opencloud opencloud-wopi systemctl stop opencloud opencloud-wopi
+1
View File
@@ -38,6 +38,7 @@ function update_script() {
create_backup /opt/passwordpusher/storage /opt/passwordpusher/.env.production create_backup /opt/passwordpusher/storage /opt/passwordpusher/.env.production
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
RUBY_VERSION="$(cat /opt/passwordpusher/.ruby-version)" RUBY_INSTALL_RAILS="false" setup_ruby
msg_info "Installing Gem Dependencies" msg_info "Installing Gem Dependencies"
cd /opt/passwordpusher cd /opt/passwordpusher
+1 -1
View File
@@ -36,7 +36,7 @@ function update_script() {
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001 sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
$STD apt update $STD apt update
$STD apt upgrade -y $STD apt upgrade -y
echo "${RELEASE}" >/~.salt echo "${RELEASE}" >~/.salt
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi
exit exit
+38 -10
View File
@@ -112,14 +112,33 @@ EOF
msg_ok "Stopped Termix" msg_ok "Stopped Termix"
msg_info "Migrating Configuration" msg_info "Migrating Configuration"
if [[ ! -f /opt/termix/.env ]]; then mkdir -p /opt/termix/db/data
cat <<EOF >/opt/termix/.env
if [[ -f /opt/termix/data/db.sqlite.encrypted && ! -f /opt/termix/db/data/db.sqlite.encrypted ]]; then
cp -a /opt/termix/data/db.sqlite.encrypted /opt/termix/db/data/db.sqlite.encrypted
[[ -f /opt/termix/data/db.sqlite.encrypted.meta ]] &&
cp -a /opt/termix/data/db.sqlite.encrypted.meta /opt/termix/db/data/db.sqlite.encrypted.meta
[[ -f /opt/termix/data/db.sqlite ]] &&
cp -a /opt/termix/data/db.sqlite /opt/termix/db/data/db.sqlite
fi
if [[ -f /opt/termix/data/.env && ! -f /opt/termix/db/data/.env ]]; then
cp -a /opt/termix/data/.env /opt/termix/db/data/.env
fi
for sub in ssl session_logs session_recordings acme-webroot certbot uploads; do
if [[ -d /opt/termix/data/$sub && ! -d /opt/termix/db/data/$sub ]]; then
cp -a "/opt/termix/data/$sub" "/opt/termix/db/data/$sub"
fi
done
cat <<EOF >/opt/termix/.env
NODE_ENV=production NODE_ENV=production
DATA_DIR=/opt/termix/data DATA_DIR=/opt/termix/db/data
GUACD_HOST=127.0.0.1 GUACD_HOST=127.0.0.1
GUACD_PORT=4822 GUACD_PORT=4822
EOF EOF
fi
if ! grep -q "EnvironmentFile" /etc/systemd/system/termix.service 2>/dev/null; then if ! grep -q "EnvironmentFile" /etc/systemd/system/termix.service 2>/dev/null; then
cat <<EOF >/etc/systemd/system/termix.service cat <<EOF >/etc/systemd/system/termix.service
[Unit] [Unit]
@@ -143,7 +162,11 @@ EOF
fi fi
msg_ok "Migrated Configuration" msg_ok "Migrated Configuration"
create_backup /opt/termix/data /opt/termix/uploads /opt/termix/.env create_backup \
/opt/termix/db/data \
/opt/termix/data \
/opt/termix/uploads \
/opt/termix/.env
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
@@ -158,10 +181,10 @@ EOF
/opt/termix/db/data /opt/termix/db/data
msg_ok "Recreated Directories" msg_ok "Recreated Directories"
if [[ -f /opt/termix/data/db.sqlite.encrypted && ! -f /opt/termix/db/data/db.sqlite.encrypted ]]; then if [[ -f /opt/termix/db/data/db.sqlite.encrypted && ! -f /opt/termix/db/data/.env ]]; then
msg_info "Migrating Database to new layout" msg_error "Encrypted database restored without its keys (/opt/termix/db/data/.env is missing)"
cp -a /opt/termix/data/db.sqlite.encrypted /opt/termix/db/data/db.sqlite.encrypted msg_custom "🛟" "Restore the container from a backup and report this at https://github.com/community-scripts/ProxmoxVE/issues"
msg_ok "Migrated Database to new layout" exit 1
fi fi
msg_info "Building Frontend" msg_info "Building Frontend"
@@ -237,7 +260,12 @@ EOF
fi fi
msg_info "Starting Termix" msg_info "Starting Termix"
systemctl start termix systemctl daemon-reload
if ! systemctl start termix; then
msg_error "Termix failed to start"
journalctl -u termix -n 30 --no-pager || true
exit 1
fi
msg_ok "Started Termix" msg_ok "Started Termix"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi
+2
View File
@@ -34,6 +34,8 @@ function update_script() {
systemctl stop watcharr systemctl stop watcharr
msg_ok "Stopped Service" msg_ok "Stopped Service"
NODE_VERSION="24" setup_nodejs
create_backup /opt/watcharr/server/data create_backup /opt/watcharr/server/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
restore_backup restore_backup
+7
View File
@@ -48,6 +48,13 @@ function update_script() {
chmod 644 /opt/xyops/node_modules/useragent-ng/lib/regexps.js chmod 644 /opt/xyops/node_modules/useragent-ng/lib/regexps.js
msg_ok "Rebuilt Application" msg_ok "Rebuilt Application"
fetch_and_deploy_gh_release "xysat" "pixlcore/xysat" "tarball" "latest" "/opt/xyops/satellite"
msg_info "Building xySat Satellite"
cd /opt/xyops/satellite
$STD npm install
msg_ok "Built xySat Satellite"
msg_info "Starting Service" msg_info "Starting Service"
systemctl start xyops systemctl start xyops
msg_ok "Started Service" msg_ok "Started Service"
+2 -1
View File
@@ -19,7 +19,7 @@ $STD apt install -y \
g++ g++
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
create_self_signed_cert create_self_signed_cert
msg_info "Installing Actual Budget" msg_info "Installing Actual Budget"
@@ -51,6 +51,7 @@ cat <<EOF >/opt/actualbudget-data/config.json
EOF EOF
mkdir -p /opt/actualbudget mkdir -p /opt/actualbudget
cd /opt/actualbudget cd /opt/actualbudget
$STD npm config set allow-scripts=bcrypt,better-sqlite3,argon2 --location=global
$STD npm install --location=global @actual-app/sync-server $STD npm install --location=global @actual-app/sync-server
echo "${RELEASE}" >~/.actualbudget echo "${RELEASE}" >~/.actualbudget
msg_ok "Installed Actual Budget" msg_ok "Installed Actual Budget"
+2
View File
@@ -78,6 +78,8 @@ $STD yarn config set enableTelemetry 0
export NODE_OPTIONS="--max-old-space-size=4096" export NODE_OPTIONS="--max-old-space-size=4096"
export TSC_COMPILE_ON_ERROR=true export TSC_COMPILE_ON_ERROR=true
$STD yarn install $STD yarn install
$STD bash ./scripts/set-version.sh "$(cat ~/.affine_app)"
export BUILD_TYPE=stable
$STD npm install -g typescript $STD npm install -g typescript
$STD yarn affine @affine/native build $STD yarn affine @affine/native build
$STD yarn affine @affine/server-native build $STD yarn affine @affine/server-native build
+1
View File
@@ -24,6 +24,7 @@ fetch_and_deploy_gh_release "Heimdall" "linuxserver/Heimdall" "tarball"
msg_info "Setting up Heimdall-Dashboard" msg_info "Setting up Heimdall-Dashboard"
cd /opt/Heimdall cd /opt/Heimdall
cp .env.example .env cp .env.example .env
sed -i 's/^APP_ENV=.*/APP_ENV=production/' .env
$STD php artisan key:generate $STD php artisan key:generate
msg_ok "Setup Heimdall-Dashboard" msg_ok "Setup Heimdall-Dashboard"
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/asciimoo/hister
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "hister" "asciimoo/hister" "singlefile" "latest" "/usr/local/bin" "hister_*_linux_$(arch_resolve)"
msg_info "Configuring Hister"
mkdir -p /opt/hister/data /etc/hister
LOCAL_IP=$(hostname -I | awk '{print $1}')
cat <<EOF >/etc/hister/config.yaml
app:
directory: '/opt/hister/data'
server:
address: '0.0.0.0:4433'
base_url: 'http://${LOCAL_IP}:4433'
EOF
msg_ok "Configured Hister"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/hister.service
[Unit]
Description=Hister Search Engine
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/hister listen --config /etc/hister/config.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now hister
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+98
View File
@@ -0,0 +1,98 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/vrtmrz/obsidian-livesync | https://couchdb.apache.org/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
setup_deb822_repo \
"couchdb" \
"https://couchdb.apache.org/repo/keys.asc" \
"https://apache.jfrog.io/artifactory/couchdb-deb/" \
"$(get_os_info codename)" \
"main"
msg_info "Installing CouchDB"
COUCHDB_ADMIN_USER="admin"
COUCHDB_PASSWORD="$(openssl rand -hex 24)"
COUCHDB_COOKIE="$(openssl rand -hex 16)"
cat <<EOF | debconf-set-selections
couchdb couchdb/mode select standalone
couchdb couchdb/mode seen true
couchdb couchdb/bindaddress string 0.0.0.0
couchdb couchdb/bindaddress seen true
couchdb couchdb/cookie string ${COUCHDB_COOKIE}
couchdb couchdb/cookie seen true
couchdb couchdb/adminpass password ${COUCHDB_PASSWORD}
couchdb couchdb/adminpass seen true
couchdb couchdb/adminpass_again password ${COUCHDB_PASSWORD}
couchdb couchdb/adminpass_again seen true
EOF
DEBIAN_FRONTEND=noninteractive $STD apt-get install -y couchdb
cat <<EOF >/root/.couchdb.credentials
COUCHDB_ADMIN_USER="${COUCHDB_ADMIN_USER}"
COUCHDB_ADMIN_PASSWORD="${COUCHDB_PASSWORD}"
COUCHDB_COOKIE="${COUCHDB_COOKIE}"
EOF
msg_ok "Installed CouchDB"
msg_info "Configuring CouchDB"
mkdir -p /opt/couchdb/etc/local.d /opt/obsidian-livesync
cat <<EOF >/opt/couchdb/etc/local.d/obsidian-livesync.ini
[couchdb]
single_node = true
max_document_size = 50000000
[admins]
admin = ${COUCHDB_PASSWORD}
[chttpd]
bind_address = 0.0.0.0
port = 5984
max_http_request_size = 4294967296
[chttpd_auth]
require_valid_user = true
[httpd]
enable_cors = true
WWW-Authenticate = Basic realm="couchdb"
[cors]
credentials = true
origins = app://obsidian.md,capacitor://localhost,http://localhost
headers = accept, authorization, content-type, origin, referer
methods = GET, PUT, POST, HEAD, DELETE
max_age = 3600
EOF
cat <<EOF >/opt/obsidian-livesync/.env
COUCHDB_URL=http://${LOCAL_IP}:5984
COUCHDB_USER=admin
COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
COUCHDB_DATABASE=obsidiannotes
EOF
chmod 600 /opt/obsidian-livesync/.env
msg_ok "Configured CouchDB"
msg_info "Creating LiveSync Database"
systemctl enable -q couchdb
systemctl restart couchdb
for _ in {1..30}; do
curl -fsS -u "admin:${COUCHDB_PASSWORD}" -X PUT http://127.0.0.1:5984/obsidiannotes >/dev/null 2>&1 && break
sleep 1
done
msg_ok "Created LiveSync Database"
motd_ssh
customize
cleanup_lxc
+1 -1
View File
@@ -13,7 +13,7 @@ setting_up_container
network_check network_check
update_os update_os
NODE_VERSION="24" setup_nodejs NODE_VERSION="26" setup_nodejs
msg_info "Installing OmniRoute" msg_info "Installing OmniRoute"
$STD npm install -g omniroute@latest $STD npm install -g omniroute@latest
+1 -1
View File
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
echo "$COOLPASS" >~/.coolpass echo "$COOLPASS" >~/.coolpass
msg_ok "Installed Collabora Online" msg_ok "Installed Collabora Online"
fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.3.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.4.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)"
mv /usr/bin/OpenCloud /usr/bin/opencloud mv /usr/bin/OpenCloud /usr/bin/opencloud
msg_info "Configuring OpenCloud" msg_info "Configuring OpenCloud"
+1 -1
View File
@@ -26,7 +26,7 @@ create_self_signed_cert
setup_deb822_repo \ setup_deb822_repo \
"passbolt" \ "passbolt" \
"https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=0x3D1A0346C8E1802F774AEF21DE8B853FC155581D" \ "https://download.passbolt.com/pub.key" \
"https://download.passbolt.com/ce/debian" \ "https://download.passbolt.com/ce/debian" \
"buster" \ "buster" \
"stable" "stable"
+3 -2
View File
@@ -22,12 +22,13 @@ $STD apt install -y \
pkg-config pkg-config
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
RUBY_VERSION="4.0.5" RUBY_INSTALL_RAILS="false" setup_ruby
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball" fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
RUBY_VERSION="$(cat /opt/passwordpusher/.ruby-version)" RUBY_INSTALL_RAILS="false" setup_ruby
export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
msg_info "Installing Gem Dependencies" msg_info "Installing Gem Dependencies"
cd /opt/passwordpusher cd /opt/passwordpusher
$STD bundle config set --local without 'development test' $STD bundle config set --local without 'development test'
+1 -1
View File
@@ -29,7 +29,7 @@ Pin: version ${RELEASE}
Pin-Priority: 1001 Pin-Priority: 1001
EOF EOF
$STD apt install -y salt-master $STD apt install -y salt-master
echo "${RELEASE}" >/~.salt echo "${RELEASE}" >~/.salt
msg_ok "Installed Salt" msg_ok "Installed Salt"
motd_ssh motd_ssh
+1 -1
View File
@@ -125,7 +125,7 @@ EOF
cat <<EOF >/opt/termix/.env cat <<EOF >/opt/termix/.env
NODE_ENV=production NODE_ENV=production
DATA_DIR=/opt/termix/data DATA_DIR=/opt/termix/db/data
GUACD_HOST=127.0.0.1 GUACD_HOST=127.0.0.1
GUACD_PORT=4822 GUACD_PORT=4822
EOF EOF
+1 -1
View File
@@ -18,7 +18,7 @@ $STD apt install -y gcc
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
setup_go setup_go
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball" fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
msg_info "Setup Watcharr" msg_info "Setup Watcharr"
+70
View File
@@ -299,6 +299,72 @@ root_check() {
fi fi
} }
# ------------------------------------------------------------------------------
# on_pve_host()
#
# - Returns 0 when executed on a Proxmox VE node, 1 otherwise
# - Cheap probe used by the guards below; never exits on its own
# ------------------------------------------------------------------------------
on_pve_host() {
command -v pveversion &>/dev/null
}
# ------------------------------------------------------------------------------
# require_pve_host()
#
# - Guard for tools that drive the node itself (pct/pveam/pvesm/pvesh/qm)
# - Aborts when not on a PVE node, then validates the PVE version
# ------------------------------------------------------------------------------
require_pve_host() {
if ! on_pve_host; then
msg_error "${APP:-This script} must be run on the Proxmox VE host."
msg_error "Proxmox tooling (pct/pveam/pvesm/qm) is not available here."
exit 232
fi
pve_check
}
# ------------------------------------------------------------------------------
# confirm_not_pve_host()
#
# - Guard for tools that belong inside an LXC/VM but would technically run
# on the node as well
# - Warns and asks for confirmation instead of hard-failing
# ------------------------------------------------------------------------------
confirm_not_pve_host() {
on_pve_host || return 0
msg_error "Running on the Proxmox VE host is NOT recommended!"
msg_error "${APP:-This script} is meant to be executed inside an LXC container."
echo ""
echo -n "${TAB:- }Continue anyway? (y/N): "
local confirm
read -r confirm
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
msg_warn "Aborted. Please run this inside an LXC container."
exit 0
fi
msg_warn "Proceeding on the Proxmox VE host at your own risk!"
}
# ------------------------------------------------------------------------------
# require_debian_like()
#
# - Guard for addons that have no Alpine code path
# - Aborts early instead of failing halfway through with apt/systemd errors
# ------------------------------------------------------------------------------
require_debian_like() {
if is_alpine; then
msg_error "${APP:-This script} does not support Alpine Linux."
msg_error "Please use a Debian or Ubuntu based LXC container."
exit 238
fi
if ! command -v apt-get &>/dev/null; then
msg_error "${APP:-This script} requires a Debian or Ubuntu based system."
exit 238
fi
}
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# pve_check() # pve_check()
# #
@@ -308,6 +374,10 @@ root_check() {
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
pve_check() { pve_check() {
local PVE_VER local PVE_VER
if ! on_pve_host; then
msg_error "${APP:-This script} must be run on the Proxmox VE host."
exit 232
fi
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
# Check for Proxmox VE 8.x: allow 8.08.9 # Check for Proxmox VE 8.x: allow 8.08.9
+66 -18
View File
@@ -1292,14 +1292,17 @@ create_temp_dir() {
# - Copies each given file/directory into a persistent store at # - Copies each given file/directory into a persistent store at
# /opt/<NSAPP>.backup, mirroring its absolute path inside the store, and # /opt/<NSAPP>.backup, mirroring its absolute path inside the store, and
# records it in a manifest so restore_backup needs no arguments. # records it in a manifest so restore_backup needs no arguments.
# - Idempotent: if a store from a previous (failed) run already exists, it is # - Idempotent per path: a path already recorded in the manifest (from this
# left untouched and no new backup is taken. This keeps the last-known-good # run or a previous failed one) is left untouched, keeping the
# data instead of overwriting it with now-partially-updated data on retry. # last-known-good copy instead of overwriting it with now-partially-updated
# data on retry. Any requested path NOT yet in the manifest is backed up
# now and appended - so a manifest left incomplete by an interrupted prior
# run gets completed instead of silently missing paths on restore.
# - Missing source paths are skipped with a warning (not fatal). # - Missing source paths are skipped with a warning (not fatal).
# - Aborts the update on copy failure: if any file/dir cannot be backed up, # - Aborts the update on copy failure: if any file/dir cannot be backed up,
# the half-written store is removed and the script exits, so the update # the script exits before the update runs against unprotected data (the
# never runs against unprotected data (and a retry re-attempts a clean # paths already recorded are left in place, so a retry only redoes the one
# backup rather than skipping it). # that failed).
# #
# restore_backup # restore_backup
# - Copies every path recorded in the manifest back to its origin (replacing # - Copies every path recorded in the manifest back to its origin (replacing
@@ -1318,19 +1321,17 @@ create_backup() {
return 0 return 0
} }
if [[ -f "$manifest" ]]; then if ! mkdir -p "$store" || ! touch "$manifest"; then
msg_ok "Existing backup found at ${store}, skipping backup" msg_error "Backup failed: could not create store at ${store} - aborting update"
return 0 exit 1
fi fi
msg_info "Backing up data" msg_info "Backing up data"
if ! mkdir -p "$store" || ! : >"$manifest"; then
msg_error "Backup failed: could not create store at ${store} - aborting update"
rm -rf "$store"
exit 1
fi
for path in "$@"; do for path in "$@"; do
path="${path%/}" path="${path%/}"
if grep -qxF "$path" "$manifest" 2>/dev/null; then
continue
fi
if [[ ! -e "$path" ]]; then if [[ ! -e "$path" ]]; then
msg_warn "Skipping backup of '${path}' (not found)" msg_warn "Skipping backup of '${path}' (not found)"
continue continue
@@ -1338,7 +1339,6 @@ create_backup() {
dest="${store}/files${path}" dest="${store}/files${path}"
if ! mkdir -p "$(dirname "$dest")" || ! cp -a "$path" "$dest"; then if ! mkdir -p "$(dirname "$dest")" || ! cp -a "$path" "$dest"; then
msg_error "Backup of '${path}' failed - aborting update" msg_error "Backup of '${path}' failed - aborting update"
rm -rf "$store"
exit 1 exit 1
fi fi
echo "$path" >>"$manifest" echo "$path" >>"$manifest"
@@ -2040,8 +2040,9 @@ cleanup_orphaned_sources() {
local basename_file local basename_file
basename_file=$(basename "$sources_file") basename_file=$(basename "$sources_file")
# NEVER remove debian.sources - this is the standard Debian repository # NEVER remove the distro's own base sources file (debian.sources,
if [[ "$basename_file" == "debian.sources" ]]; then # ubuntu.sources, ...)
if [[ "$basename_file" == "$(get_os_info id).sources" ]]; then
continue continue
fi fi
@@ -2113,7 +2114,7 @@ ensure_apt_working() {
# Step 4: More aggressive - remove all third-party sources # Step 4: More aggressive - remove all third-party sources
msg_warn "APT update still failing, removing third-party sources" msg_warn "APT update still failing, removing third-party sources"
find /etc/apt/sources.list.d/ -type f \( -name "*.sources" -o -name "*.list" \) \ find /etc/apt/sources.list.d/ -type f \( -name "*.sources" -o -name "*.list" \) \
! -name "debian.sources" -delete 2>/dev/null || true ! -name "$(get_os_info id).sources" -delete 2>/dev/null || true
# Final attempt # Final attempt
if ! $STD apt update; then if ! $STD apt update; then
@@ -4627,6 +4628,53 @@ _docker_is_noninteractive() {
[[ "${DOCKER_NONINTERACTIVE:-}" == "1" || "${DOCKER_NONINTERACTIVE:-}" == "true" || "${DOCKER_NONINTERACTIVE:-}" == "TRUE" ]] || [[ ! -t 0 ]] [[ "${DOCKER_NONINTERACTIVE:-}" == "1" || "${DOCKER_NONINTERACTIVE:-}" == "true" || "${DOCKER_NONINTERACTIVE:-}" == "TRUE" ]] || [[ ! -t 0 ]]
} }
# ------------------------------------------------------------------------------
# ensure_docker()
#
# - Docker precondition for addon scripts that ship a compose stack
# - Reuses an existing installation, otherwise offers to install Docker
# (Debian/Ubuntu via setup_docker, Alpine via apk)
# - Aborts when the user declines or Compose is unavailable afterwards
# ------------------------------------------------------------------------------
ensure_docker() {
if command -v docker &>/dev/null; then
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
if docker compose version &>/dev/null; then
msg_ok "Docker Compose is available"
return 0
fi
msg_error "Docker Compose plugin is not available. Please install it."
exit 237
fi
msg_warn "Docker is not installed."
echo -n "${TAB:- }Install Docker now? (y/N): "
local install_docker_prompt
read -r install_docker_prompt
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_error "Docker is required for ${APP:-this script}. Exiting."
exit 254
fi
if is_alpine; then
msg_info "Installing Docker"
$STD apk add --no-cache docker docker-cli-compose
$STD rc-update add docker default
$STD rc-service docker start
msg_ok "Installed Docker"
else
setup_docker || {
msg_error "Docker installation failed."
exit 237
}
fi
if ! command -v docker &>/dev/null || ! docker compose version &>/dev/null; then
msg_error "Docker or the Compose plugin is still unavailable after installation."
exit 237
fi
}
setup_docker() { setup_docker() {
local docker_installed=false local docker_installed=false
local USE_DOCKER_REPO="${USE_DOCKER_REPO:-true}" local USE_DOCKER_REPO="${USE_DOCKER_REPO:-true}"
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -20,6 +25,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "actual-budget
set -Eeuo pipefail set -Eeuo pipefail
trap 'error_handler' ERR trap 'error_handler' ERR
load_functions load_functions
require_debian_like
# ============================================================================== # ==============================================================================
# CONFIGURATION # CONFIGURATION
@@ -31,14 +37,6 @@ INSTALL_PATH="/opt/actual-budget-prometheus-exporter"
CONFIG_PATH="/opt/actual-budget-prometheus-exporter.env" CONFIG_PATH="/opt/actual-budget-prometheus-exporter.env"
SERVICE_PATH="/etc/systemd/system/actual-budget-prometheus-exporter.service" SERVICE_PATH="/etc/systemd/system/actual-budget-prometheus-exporter.service"
# ==============================================================================
# OS DETECTION
# ==============================================================================
if ! grep -qE 'ID=debian|ID=ubuntu' /etc/os-release 2>/dev/null; then
echo -e "${CROSS} Unsupported OS detected. This script only supports Debian and Ubuntu."
exit 238
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
+56 -37
View File
@@ -6,39 +6,45 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://netbird.io/ | Github: https://github.com/netbirdio/netbird # Source: https://netbird.io/ | Github: https://github.com/netbirdio/netbird
function header_info { APP="add-netbird-lxc"
clear APP_TYPE="addon"
cat <<"EOF"
_ __ __ ____ _ __
/ | / /__ / /_/ __ )(_)________/ /
/ |/ / _ \/ __/ __ / / ___/ __ /
/ /| / __/ /_/ /_/ / / / / /_/ /
/_/ |_/\___/\__/_____/_/_/ \__,_/
EOF if ! command -v curl &>/dev/null; then
} printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
header_info if [[ -f /etc/alpine-release ]]; then
set -e apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
# Telemetry else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-netbird-lxc" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-netbird-lxc" "addon"
# Enable error handling
set -Eeuo pipefail
trap 'error_handler' ERR
# Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
header_info
require_pve_host
while true; do while true; do
read -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)?" yn read -r -p "This will add NetBird to an existing LXC Container ONLY. Proceed(y/n)? " yn
case $yn in case $yn in
[Yy]*) break ;; [Yy]*) break ;;
[Nn]*) exit ;; [Nn]*) exit 0 ;;
*) echo "Please answer yes or no." ;; *) echo "Please answer yes or no." ;;
esac esac
done done
header_info
echo "Loading..."
function msg() { echo -e "Loading container list..."
local TEXT="$1"
echo -e "$TEXT"
}
NODE=$(hostname) NODE=$(hostname)
MSG_MAX_LENGTH=0 MSG_MAX_LENGTH=0
@@ -61,37 +67,51 @@ done
LXC_STATUS=$(pct status "$CTID" | awk '{print $2}') LXC_STATUS=$(pct status "$CTID" | awk '{print $2}')
if [[ "$LXC_STATUS" != "running" ]]; then if [[ "$LXC_STATUS" != "running" ]]; then
msg "\e[1;33m The container $CTID is not running. Starting it now...\e[0m" msg_info "Container $CTID is not running. Starting it now..."
pct start "$CTID" pct start "$CTID"
while [[ "$(pct status "$CTID" | awk '{print $2}')" != "running" ]]; do while [[ "$(pct status "$CTID" | awk '{print $2}')" != "running" ]]; do
msg "\e[1;33m Waiting for the container to start...\e[0m" msg_info "Waiting for the container to start..."
sleep 2 sleep 2
done done
msg "\e[1;32m Container $CTID is now running.\e[0m" msg_ok "Container $CTID is now running."
fi fi
DISTRO=$(pct exec "$CTID" -- cat /etc/os-release | grep -w "ID" | cut -d'=' -f2 | tr -d '"') DISTRO=$(pct exec "$CTID" -- cat /etc/os-release | grep -w "ID" | cut -d'=' -f2 | tr -d '"')
if [[ "$DISTRO" != "debian" && "$DISTRO" != "ubuntu" ]]; then if [[ "$DISTRO" != "debian" && "$DISTRO" != "ubuntu" ]]; then
msg "\e[1;31m Error: This script only supports Debian or Ubuntu LXC containers. Detected: $DISTRO. Aborting...\e[0m" msg_error "This script only supports Debian or Ubuntu LXC containers. Detected: $DISTRO. Aborting..."
exit 238 exit 238
fi fi
CTID_CONFIG_PATH=/etc/pve/lxc/${CTID}.conf CTID_CONFIG_PATH="/etc/pve/lxc/${CTID}.conf"
cat <<EOF >>$CTID_CONFIG_PATH cat <<EOF >>"$CTID_CONFIG_PATH"
lxc.cgroup2.devices.allow: c 10:200 rwm lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
EOF EOF
header_info
msg "Installing NetBird..." msg_info "Installing NetBird"
pct exec "$CTID" -- bash -c ' pct exec "$CTID" -- bash -c '
set -e
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
apt-get update -qq apt-get update -qq
apt-get install -y curl >/dev/null apt-get install -y curl >/dev/null
fi fi
apt install -y ca-certificates gpg &>/dev/null apt-get install -y ca-certificates gpg &>/dev/null
curl -fsSL "https://pkgs.netbird.io/debian/public.key" | gpg --dearmor >/usr/share/keyrings/netbird-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main" >/etc/apt/sources.list.d/netbird.list # Reuse the shared repository helper instead of hand-rolling the sources entry
apt-get update &>/dev/null source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
load_functions
# Drop the legacy keyring from the pre-deb822 layout
rm -f /usr/share/keyrings/netbird-archive-keyring.gpg
setup_deb822_repo \
"netbird" \
"https://pkgs.netbird.io/debian/public.key" \
"https://pkgs.netbird.io/debian" \
"stable" \
"main"
apt-get install -y netbird-ui &>/dev/null apt-get install -y netbird-ui &>/dev/null
if systemctl list-unit-files docker.service &>/dev/null; then if systemctl list-unit-files docker.service &>/dev/null; then
mkdir -p /etc/systemd/system/netbird.service.d mkdir -p /etc/systemd/system/netbird.service.d
@@ -103,6 +123,5 @@ OVERRIDE
systemctl daemon-reload systemctl daemon-reload
fi fi
' '
msg "\e[1;32m ✔ Installed NetBird.\e[0m" msg_ok "Installed NetBird."
sleep 2 echo -e "${YW}Reboot ${CTID} LXC${CL} to apply the changes, then run 'netbird up' in the LXC console"
msg "\e[1;31m Reboot ${CTID} LXC to apply the changes, then run netbird up in the LXC console\e[0m"
+37 -35
View File
@@ -5,35 +5,34 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://tailscale.com/ | Github: https://github.com/tailscale/tailscale # Source: https://tailscale.com/ | Github: https://github.com/tailscale/tailscale
set -Eeuo pipefail APP="add-tailscale-lxc"
trap 'echo -e "\n[ERROR] in line $LINENO: exit code $?"' ERR APP_TYPE="addon"
function header_info() { if ! command -v curl &>/dev/null; then
clear printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
cat <<"EOF" if [[ -f /etc/alpine-release ]]; then
______ _ __ __ apk update >/dev/null 2>&1
/_ __/___ _(_) /_____________ _/ /__ apk add --no-cache curl >/dev/null 2>&1
/ / / __ `/ / / ___/ ___/ __ `/ / _ \ else
/ / / /_/ / / (__ ) /__/ /_/ / / __/ apt-get update >/dev/null 2>&1
/_/ \__,_/_/_/____/\___/\__,_/_/\___/ apt-get install -y curl >/dev/null 2>&1
fi
EOF fi
} source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
function msg_info() { echo -e " \e[1;36m➤\e[0m $1"; } source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; }
function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; }
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-tailscale-lxc" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-tailscale-lxc" "addon"
header_info # Enable error handling
set -Eeuo pipefail
trap 'error_handler' ERR
if ! command -v pveversion &>/dev/null; then # Initialize all core functions (colors, formatting, icons, STD mode)
msg_error "This script must be run on the Proxmox VE host (not inside an LXC container)" load_functions
exit 232
fi header_info
require_pve_host
while true; do while true; do
read -rp "This will add Tailscale to an existing LXC Container ONLY. Proceed (y/n)? " yn read -rp "This will add Tailscale to an existing LXC Container ONLY. Proceed (y/n)? " yn
@@ -44,7 +43,6 @@ while true; do
esac esac
done done
header_info
msg_info "Loading container list..." msg_info "Loading container list..."
NODE=$(hostname) NODE=$(hostname)
@@ -73,10 +71,9 @@ CTID_CONFIG_PATH="/etc/pve/lxc/${CTID}.conf"
grep -q "lxc.cgroup2.devices.allow: c 10:200 rwm" "$CTID_CONFIG_PATH" || echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >>"$CTID_CONFIG_PATH" grep -q "lxc.cgroup2.devices.allow: c 10:200 rwm" "$CTID_CONFIG_PATH" || echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >>"$CTID_CONFIG_PATH"
grep -q "lxc.mount.entry: /dev/net/tun" "$CTID_CONFIG_PATH" || echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file" >>"$CTID_CONFIG_PATH" grep -q "lxc.mount.entry: /dev/net/tun" "$CTID_CONFIG_PATH" || echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file" >>"$CTID_CONFIG_PATH"
header_info
msg_info "Installing Tailscale in CT $CTID" msg_info "Installing Tailscale in CT $CTID"
pct exec "$CTID" -- sh -c ' pct exec "$CTID" -- bash -c '
set -e set -e
# Detect OS inside container # Detect OS inside container
@@ -144,16 +141,21 @@ else
apt-get install -y curl >/dev/null apt-get install -y curl >/dev/null
fi fi
# Ensure keyrings directory exists # Reuse the shared repository helper instead of hand-rolling the sources entry
mkdir -p /usr/share/keyrings source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
load_functions
curl -fsSL "https://pkgs.tailscale.com/stable/${ID}/${VERSION_CODENAME}.noarmor.gpg" \ # Drop the legacy keyring from the pre-deb822 layout
| tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null rm -f /usr/share/keyrings/tailscale-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://pkgs.tailscale.com/stable/${ID} ${VERSION_CODENAME} main" \ setup_deb822_repo \
>/etc/apt/sources.list.d/tailscale.list "tailscale" \
"https://pkgs.tailscale.com/stable/${ID}/${VERSION_CODENAME}.noarmor.gpg" \
"https://pkgs.tailscale.com/stable/${ID}" \
"${VERSION_CODENAME}" \
"main"
apt-get update -qq
apt-get install -y tailscale >/dev/null apt-get install -y tailscale >/dev/null
if [ -f /tmp/resolv.conf.backup ]; then if [ -f /tmp/resolv.conf.backup ]; then
@@ -168,4 +170,4 @@ TAGS="${TAGS:+$TAGS; }tailscale"
pct set "$CTID" -tags "$TAGS" pct set "$CTID" -tags "$TAGS"
msg_ok "Tailscale installed on CT $CTID" msg_ok "Tailscale installed on CT $CTID"
msg_info "Reboot the container, then run 'tailscale up' inside the container to activate." echo -e "${YW}Reboot the container${CL}, then run 'tailscale up' inside the container to activate."
+13 -40
View File
@@ -7,8 +7,9 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f "/etc/alpine-release" ]]; then if [[ -f /etc/alpine-release ]]; then
apk -U add curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else else
apt-get update >/dev/null 2>&1 apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1 apt-get install -y curl >/dev/null 2>&1
@@ -36,28 +37,6 @@ DEFAULT_PORT=8080
# Initialize all core functions (colors, formatting, icons, STD mode) # Initialize all core functions (colors, formatting, icons, STD mode)
load_functions load_functions
# ==============================================================================
# HEADER
# ==============================================================================
function header_info {
clear
cat <<"EOF"
___ __ ____ __ _____
/ | ____/ /___ ___ ______ __________/ / / / /___ ____ ___ ___ / ___/__ ______ _____
/ /| |/ __ / __ `/ / / / __ `/ ___/ __ / /_/ / __ \/ __ `__ \/ _ \ \__ \/ / / / __ \/ ___/
/ ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ / __ / /_/ / / / / / / __/ ___/ / /_/ / / / / /__
/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/_/ /_/\____/_/ /_/ /_/\___/ /____/\__, /_/ /_/\___/
/____/ /____/
EOF
}
# ==============================================================================
# HELPER FUNCTIONS
# ==============================================================================
get_ip() {
hostname -I 2>/dev/null | awk '{print $1}' || ip -4 addr show scope global 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1 || echo "127.0.0.1"
}
# ============================================================================== # ==============================================================================
# OS DETECTION # OS DETECTION
# ============================================================================== # ==============================================================================
@@ -114,16 +93,12 @@ function update() {
fi fi
msg_ok "Stopped service" msg_ok "Stopped service"
msg_info "Backing up configuration" BACKUP_DIR="/opt/adguardhome-sync_backup"
cp "$CONFIG_PATH" /tmp/adguardhome-sync.yaml.bak 2>/dev/null || true create_backup "$CONFIG_PATH"
msg_ok "Backed up configuration"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_amd64.tar.gz" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_$(arch_resolve).tar.gz"
msg_info "Restoring configuration" restore_backup
cp /tmp/adguardhome-sync.yaml.bak "$CONFIG_PATH" 2>/dev/null || true
rm -f /tmp/adguardhome-sync.yaml.bak
msg_ok "Restored configuration"
msg_info "Starting service" msg_info "Starting service"
if [[ "$OS" == "Alpine" ]]; then if [[ "$OS" == "Alpine" ]]; then
@@ -141,10 +116,7 @@ function update() {
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
local ip fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_$(arch_resolve).tar.gz"
ip=$(get_ip)
fetch_and_deploy_gh_release "adguardhome-sync" "bakito/adguardhome-sync" "prebuild" "latest" "$INSTALL_PATH" "adguardhome-sync_*_linux_amd64.tar.gz"
# Gather configuration from user # Gather configuration from user
echo "" echo ""
@@ -153,7 +125,7 @@ function install() {
echo "" echo ""
# Origin instance # Origin instance
echo -e "${YW}── Origin (Primary) Instance ──${CL}" echo -e "${YW}── Origin (Primary) Instance ──${CL}"
local origin_url origin_user origin_pass local origin_url origin_user origin_pass
read -rp " Origin URL (e.g., http://192.168.1.1): " origin_url read -rp " Origin URL (e.g., http://192.168.1.1): " origin_url
origin_url="${origin_url:-http://192.168.1.1}" origin_url="${origin_url:-http://192.168.1.1}"
@@ -167,7 +139,7 @@ function install() {
# Replica instance # Replica instance
echo "" echo ""
echo -e "${YW}── Replica Instance ──${CL}" echo -e "${YW}── Replica Instance ──${CL}"
local replica_url replica_user replica_pass local replica_url replica_user replica_pass
read -rp " Replica URL (e.g., http://192.168.1.2): " replica_url read -rp " Replica URL (e.g., http://192.168.1.2): " replica_url
replica_url="${replica_url:-http://192.168.1.2}" replica_url="${replica_url:-http://192.168.1.2}"
@@ -293,7 +265,7 @@ UPDATEEOF
echo "" echo ""
msg_ok "${APP} installed successfully" msg_ok "${APP} installed successfully"
msg_ok "Web UI: ${BL}http://${ip}:${DEFAULT_PORT}${CL}" msg_ok "Web UI: ${BL}http://${IP}:${DEFAULT_PORT}${CL}"
msg_ok "Config: ${BL}${CONFIG_PATH}${CL}" msg_ok "Config: ${BL}${CONFIG_PATH}${CL}"
echo "" echo ""
msg_warn "Edit the config file to add your AdGuardHome instances!" msg_warn "Edit the config file to add your AdGuardHome instances!"
@@ -319,7 +291,8 @@ fi
header_info header_info
IP=$(get_ip) get_lxc_ip
IP="$LOCAL_IP"
# Check if already installed # Check if already installed
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/adguardhome-sync" ]]; then if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/adguardhome-sync" ]]; then
+74 -70
View File
@@ -1,52 +1,40 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Copyright (c) 2021-2026 tteck # Copyright (c) 2021-2026 tteck
# Author: tteck (tteckster) # Author: tteck (tteckster)
# License: MIT # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info { APP="all-templates"
clear APP_TYPE="addon"
cat <<"EOF"
___ ____ ______ __ __
/ _ | / / / /_ __/__ __ _ ___ / /__ _/ /____ ___
/ __ |/ / / / / / -_) ' \/ _ \/ / _ `/ __/ -_|_-<
/_/ |_/_/_/ /_/ \__/_/_/_/ .__/_/\_,_/\__/\__/___/
/_/
EOF
}
set -eEuo pipefail if ! command -v curl &>/dev/null; then
shopt -s expand_aliases printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
alias die='EXIT=$? LINE=$LINENO error_exit' if [[ -f /etc/alpine-release ]]; then
trap die ERR apk update >/dev/null 2>&1
function error_exit() { apk add --no-cache curl >/dev/null 2>&1
trap - ERR else
local DEFAULT='Unknown failure occured.' apt-get update >/dev/null 2>&1
local REASON="\e[97m${1:-$DEFAULT}\e[39m" apt-get install -y curl >/dev/null 2>&1
local FLAG="\e[91m[ERROR] \e[93m$EXIT@$LINE" fi
msg "$FLAG $REASON" 1>&2 fi
[ ! -z ${CTID-} ] && cleanup_ctid source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
exit $EXIT source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
} source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
function warn() {
local REASON="\e[97m$1\e[39m"
local FLAG="\e[93m[WARNING]\e[39m"
msg "$FLAG $REASON"
}
function info() {
local REASON="$1"
local FLAG="\e[36m[INFO]\e[39m"
msg "$FLAG $REASON"
}
function msg() {
local TEXT="$1"
echo -e "$TEXT"
}
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "all-templates" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "all-templates" "addon"
# Enable error handling; destroy any partially-created container before reporting the error
set -Eeuo pipefail
function _cleanup_on_error() {
local ec=$? cmd="$BASH_COMMAND"
[[ -n "${CTID:-}" ]] && cleanup_ctid
error_handler "$ec" "$cmd"
}
trap '_cleanup_on_error' ERR
# Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
function validate_container_id() { function validate_container_id() {
local ctid="$1" local ctid="$1"
# Check if ID is numeric # Check if ID is numeric
@@ -79,12 +67,14 @@ function cleanup_ctid() {
fi fi
} }
header_info
require_pve_host
# Stop Proxmox VE Monitor-All if running # Stop Proxmox VE Monitor-All if running
if systemctl is-active -q ping-instances.service; then if systemctl is-active -q ping-instances.service; then
systemctl stop ping-instances.service systemctl stop ping-instances.service
fi fi
header_info msg_info "Loading"
echo "Loading..."
pveam update >/dev/null 2>&1 pveam update >/dev/null 2>&1
whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Templates" --yesno "This will allow for the creation of one of the many Template LXC Containers. Proceed?" 10 68 whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Templates" --yesno "This will allow for the creation of one of the many Template LXC Containers. Proceed?" 10 68
TEMPLATE_MENU=() TEMPLATE_MENU=()
@@ -97,8 +87,8 @@ done < <(pveam available)
TEMPLATE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Template LXCs" --radiolist "\nSelect a Template LXC to create:\n" 16 $((MSG_MAX_LENGTH + 58)) 10 "${TEMPLATE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') TEMPLATE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Template LXCs" --radiolist "\nSelect a Template LXC to create:\n" 16 $((MSG_MAX_LENGTH + 58)) 10 "${TEMPLATE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"')
[ -z "$TEMPLATE" ] && { [ -z "$TEMPLATE" ] && {
whiptail --backtitle "Proxmox VE Helper Scripts" --title "No Template LXC Selected" --msgbox "It appears that no Template LXC container was selected" 10 68 whiptail --backtitle "Proxmox VE Helper Scripts" --title "No Template LXC Selected" --msgbox "It appears that no Template LXC container was selected" 10 68
msg "Done" echo "Done"
exit exit 0
} }
# Setup script environment # Setup script environment
@@ -108,9 +98,9 @@ PASS="$(openssl rand -base64 8)"
# Get valid Container ID # Get valid Container ID
CTID=$(pvesh get /cluster/nextid) CTID=$(pvesh get /cluster/nextid)
if ! validate_container_id "$CTID"; then if ! validate_container_id "$CTID"; then
warn "Container ID $CTID is already in use." msg_warn "Container ID $CTID is already in use."
CTID=$(get_valid_container_id "$CTID") CTID=$(get_valid_container_id "$CTID")
info "Using next available ID: $CTID" msg_info "Using next available ID: $CTID"
fi fi
PCT_OPTIONS=" PCT_OPTIONS="
@@ -142,7 +132,10 @@ function select_storage() {
CONTENT='vztmpl' CONTENT='vztmpl'
CONTENT_LABEL='Container template' CONTENT_LABEL='Container template'
;; ;;
*) false || die "Invalid storage class." ;; *)
msg_error "Invalid storage class."
exit 112
;;
esac esac
# Query all storage locations # Query all storage locations
@@ -161,8 +154,9 @@ function select_storage() {
# Select storage location # Select storage location
if [ $((${#MENU[@]} / 3)) -eq 0 ]; then if [ $((${#MENU[@]} / 3)) -eq 0 ]; then
warn "'$CONTENT_LABEL' needs to be selected for at least one storage location." msg_warn "'$CONTENT_LABEL' needs to be selected for at least one storage location."
die "Unable to detect valid storage location." msg_error "Unable to detect valid storage location."
if [[ "$CONTENT" == "rootdir" ]]; then exit 119; else exit 120; fi
elif [ $((${#MENU[@]} / 3)) -eq 1 ]; then elif [ $((${#MENU[@]} / 3)) -eq 1 ]; then
printf ${MENU[0]} printf ${MENU[0]}
else else
@@ -171,43 +165,54 @@ function select_storage() {
STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
"Which storage pool would you like to use for the ${CONTENT_LABEL,,}?\n\n" \ "Which storage pool would you like to use for the ${CONTENT_LABEL,,}?\n\n" \
16 $(($MSG_MAX_LENGTH + 23)) 6 \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \
"${MENU[@]}" 3>&1 1>&2 2>&3) || die "Menu aborted." "${MENU[@]}" 3>&1 1>&2 2>&3) || {
msg_error "Menu aborted."
exit 254
}
done done
printf $STORAGE printf $STORAGE
fi fi
} }
header_info
# Get template storage # Get template storage
TEMPLATE_STORAGE=$(select_storage template) TEMPLATE_STORAGE=$(select_storage template)
info "Using '$TEMPLATE_STORAGE' for template storage." msg_info "Using '$TEMPLATE_STORAGE' for template storage."
# Get container storage # Get container storage
CONTAINER_STORAGE=$(select_storage container) CONTAINER_STORAGE=$(select_storage container)
info "Using '$CONTAINER_STORAGE' for container storage." msg_info "Using '$CONTAINER_STORAGE' for container storage."
# Download template # Download template
msg "Downloading LXC template (Patience)..." msg_info "Downloading LXC template (Patience)"
pveam download $TEMPLATE_STORAGE $TEMPLATE >/dev/null || die "A problem occured while downloading the LXC template." pveam download $TEMPLATE_STORAGE $TEMPLATE >/dev/null || {
msg_error "A problem occured while downloading the LXC template."
exit 222
}
msg_ok "Downloaded LXC template"
# Create variable for 'pct' options # Create variable for 'pct' options
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}}) PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs $CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}) [[ " ${PCT_OPTIONS[*]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs $CONTAINER_STORAGE:${PCT_DISK_SIZE:-8})
# Create LXC # Create LXC
msg "Creating LXC container..." msg_info "Creating LXC container"
pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} ${PCT_OPTIONS[@]} >/dev/null || pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} "${PCT_OPTIONS[@]}" >/dev/null || {
die "A problem occured while trying to create container." msg_error "A problem occured while trying to create container."
exit 209
}
msg_ok "Created LXC container"
# Save password # Save password
echo "$NAME password: ${PASS}" >>~/$NAME.creds # file is located in the Proxmox root directory echo "$NAME password: ${PASS}" >>~/$NAME.creds # file is located in the Proxmox root directory
# Start container # Start container
msg "Starting LXC Container..." msg_info "Starting LXC Container"
pct start "$CTID" pct start "$CTID"
sleep 5 sleep 5
msg_ok "Started LXC Container"
# Get container IP # Get container IP
set +eEuo pipefail set +Eeuo pipefail
max_attempts=5 max_attempts=5
attempt=1 attempt=1
IP="" IP=""
@@ -216,30 +221,29 @@ while [[ $attempt -le $max_attempts ]]; do
if [[ -n $IP ]]; then if [[ -n $IP ]]; then
break break
else else
warn "Attempt $attempt: IP address not found. Pausing for 5 seconds..." msg_warn "Attempt $attempt: IP address not found. Pausing for 5 seconds..."
sleep 5 sleep 5
((attempt++)) ((attempt++))
fi fi
done done
if [[ -z $IP ]]; then if [[ -z $IP ]]; then
warn "Maximum number of attempts reached. IP address not found." msg_warn "Maximum number of attempts reached. IP address not found."
IP="NOT FOUND" IP="NOT FOUND"
fi fi
set -eEuo pipefail set -Eeuo pipefail
# Start Proxmox VE Monitor-All if available # Start Proxmox VE Monitor-All if available
if [[ -f /etc/systemd/system/ping-instances.service ]]; then if [[ -f /etc/systemd/system/ping-instances.service ]]; then
systemctl start ping-instances.service systemctl start ping-instances.service
fi fi
# Success message # Success message
header_info
echo echo
info "LXC container '$CTID' was successfully created, and its IP address is ${IP}." msg_ok "LXC container '$CTID' was successfully created, and its IP address is ${IP}."
echo echo
info "Proceed to the LXC console to complete the setup." echo -e "${YW}Proceed to the LXC console to complete the setup.${CL}"
echo echo
info "login: root" echo -e "${YW}login: root${CL}"
info "password: $PASS" echo -e "${YW}password: $PASS${CL}"
echo echo
+9 -33
View File
@@ -6,8 +6,13 @@
# Source: https://github.com/getarcaneapp/arcane # Source: https://github.com/getarcaneapp/arcane
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -32,21 +37,6 @@ DEFAULT_PORT=3552
# Initialize all core functions (colors, formatting, icons, STD mode) # Initialize all core functions (colors, formatting, icons, STD mode)
load_functions load_functions
# ==============================================================================
# HEADER
# ==============================================================================
function header_info {
clear
cat <<"EOF"
___ ____ _________ _ ________
/ | / __ \/ ____/ | / | / / ____/
/ /| | / /_/ / / / /| | / |/ / __/
/ ___ |/ _, _/ /___/ ___ |/ /| / /___
/_/ |_/_/ |_|\____/_/ |_/_/ |_/_____/
EOF
}
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
@@ -82,26 +72,11 @@ function update() {
exit exit
} }
# ==============================================================================
# CHECK DOCKER
# ==============================================================================
function check_docker() {
if ! command -v docker &>/dev/null; then
msg_error "Docker is not installed. This script requires an existing Docker LXC. Exiting."
exit 10
fi
if ! docker compose version &>/dev/null; then
msg_error "Docker Compose plugin is not available. Please install it before running this script. Exiting."
exit 10
fi
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') and Docker Compose are available"
}
# ============================================================================== # ==============================================================================
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
check_docker ensure_docker
msg_info "Creating install directory" msg_info "Creating install directory"
mkdir -p "$INSTALL_PATH" mkdir -p "$INSTALL_PATH"
@@ -178,6 +153,7 @@ if [[ "${type:-}" == "update" ]]; then
fi fi
header_info header_info
confirm_not_pve_host
get_lxc_ip get_lxc_ip
# Check if already installed # Check if already installed
+140 -98
View File
@@ -5,62 +5,153 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://coder.com/ | Github: https://github.com/coder/code-server # Source: https://coder.com/ | Github: https://github.com/coder/code-server
function header_info { if ! command -v curl &>/dev/null; then
cat <<"EOF" printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
______ __ _____ if [[ -f /etc/alpine-release ]]; then
/ ____/___ ____/ /__ / ___/___ ______ _____ _____ apk update >/dev/null 2>&1
/ / / __ \/ __ / _ \ \__ \/ _ \/ ___/ | / / _ \/ ___/ apk add --no-cache curl >/dev/null 2>&1
/ /___/ /_/ / /_/ / __/ ___/ / __/ / | |/ / __/ / else
\____/\____/\__,_/\___/ /____/\___/_/ |___/\___/_/ apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
EOF fi
} fi
IP=$(hostname -I | awk '{print $1}') source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
YW=$(echo "\033[33m") source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
BL=$(echo "\033[36m") source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m")
CL=$(echo "\033[m")
BFR="\\r\\033[K"
HOLD="-"
CM="${GN}${CL}"
APP="Coder Code Server"
hostname="$(hostname)"
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "coder-code-server" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "coder-code-server" "addon"
set -o errexit # Enable error handling
set -o errtrace set -Eeuo pipefail
set -o nounset trap 'error_handler' ERR
set -o pipefail
shopt -s expand_aliases APP="Coder Code Server"
alias die='EXIT=$? LINE=$LINENO error_exit' APP_TYPE="addon"
trap die ERR
# Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
function error_exit() {
trap - ERR
local reason="Unknown failure occured."
local msg="${1:-$reason}"
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE"
echo -e "$flag $msg" 1>&2
exit "$EXIT"
}
clear
header_info header_info
if command -v pveversion >/dev/null 2>&1; then ensure_usr_local_bin_persist
echo -e "⚠️ Can't Install on Proxmox " get_lxc_ip
exit IP="$LOCAL_IP"
confirm_not_pve_host
require_debian_like
# ==============================================================================
# UNINSTALL
# ==============================================================================
function uninstall() {
msg_info "Uninstalling ${APP}"
systemctl disable --now code-server@"$USER" &>/dev/null || true
$STD apt remove -y code-server
rm -f "$HOME/.coder-code-server"
msg_ok "${APP} has been uninstalled"
}
# ==============================================================================
# UPDATE
# ==============================================================================
function update() {
if check_for_gh_release "coder-code-server" "coder/code-server"; then
msg_info "Updating ${APP}"
fetch_and_deploy_gh_release "coder-code-server" "coder/code-server" "binary" "latest" "/opt/coder-code-server" "code-server_*_$(arch_resolve).deb"
systemctl restart code-server@"$USER"
msg_ok "Updated successfully!"
exit
fi
}
# ==============================================================================
# INSTALL
# ==============================================================================
function install() {
msg_info "Installing Dependencies"
$STD apt update
$STD apt install -y \
curl \
git
msg_ok "Installed Dependencies"
msg_info "Installing ${APP}"
config_path="${HOME}/.config/code-server/config.yaml"
preexisting_config=false
if [ -f "$config_path" ]; then
preexisting_config=true
fi
fetch_and_deploy_gh_release "coder-code-server" "coder/code-server" "binary" "latest" "/opt/coder-code-server" "code-server_*_$(arch_resolve).deb"
mkdir -p "${HOME}/.config/code-server/"
if [ "$preexisting_config" = false ]; then
cat <<EOF >"$config_path"
bind-addr: 0.0.0.0:8680
auth: none
password:
cert: false
EOF
fi
systemctl enable -q --now code-server@"$USER"
systemctl restart code-server@"$USER"
if ! systemctl is-active --quiet code-server@"$USER"; then
msg_error "code-server service failed to start."
exit 150
fi
msg_ok "Installed ${APP}"
msg_info "Creating update script"
ensure_usr_local_bin_persist
cat <<'EOF' >/usr/local/bin/update_coder-code-server
#!/usr/bin/env bash
# Coder Code Server Update Script
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/coder-code-server.sh)"
EOF
chmod +x /usr/local/bin/update_coder-code-server
msg_ok "Created update script (/usr/local/bin/update_coder-code-server)"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:8680${CL} \n"
}
# ==============================================================================
# MAIN
# ==============================================================================
# Handle type=update (called from update script)
if [[ "${type:-}" == "update" ]]; then
if command -v code-server &>/dev/null; then
update
else
msg_error "${APP} is not installed. Nothing to update."
exit 233
fi
exit 0
fi fi
if [ -e /etc/alpine-release ]; then
echo -e "⚠️ Can't Install on Alpine" if [[ -d "$HOME" && -f "$HOME/.coder-code-server" ]] || command -v code-server &>/dev/null; then
exit msg_warn "${APP} is already installed."
echo -n "${TAB}Uninstall ${APP}? (y/N): "
read -r uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
uninstall
exit 0
fi
echo -n "${TAB}Update ${APP}? (y/N): "
read -r update_prompt
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
update
exit 0
fi
msg_warn "No action selected. Exiting."
exit 0
fi fi
while true; do while true; do
read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn echo -n "${TAB}This will Install ${APP}. Proceed (y/n)? "
read -r yn
case $yn in case $yn in
[Yy]*) break ;; [Yy]*) break ;;
[Nn]*) exit ;; [Nn]*) exit ;;
@@ -68,53 +159,4 @@ while true; do
esac esac
done done
function msg_info() { install
local msg="$1"
echo -ne " ${HOLD} ${YW}${msg}..."
}
function msg_ok() {
local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
}
msg_info "Installing Dependencies"
apt-get update &>/dev/null
apt-get install -y curl &>/dev/null
apt-get install -y git &>/dev/null
msg_ok "Installed Dependencies"
VERSION=$(curl -fsSL https://api.github.com/repos/coder/code-server/releases/latest |
grep "tag_name" |
awk '{print substr($2, 3, length($2)-4) }')
msg_info "Installing Code-Server v${VERSION}"
config_path="${HOME}/.config/code-server/config.yaml"
preexisting_config=false
if [ -f "$config_path" ]; then
preexisting_config=true
fi
curl -fOL https://github.com/coder/code-server/releases/download/v"$VERSION"/code-server_"${VERSION}"_amd64.deb &>/dev/null
dpkg -i code-server_"${VERSION}"_amd64.deb &>/dev/null
rm -rf code-server_"${VERSION}"_amd64.deb
mkdir -p "${HOME}/.config/code-server/"
if [ "$preexisting_config" = false ]; then
cat <<EOF >"$config_path"
bind-addr: 0.0.0.0:8680
auth: none
password:
cert: false
EOF
fi
systemctl enable -q --now code-server@"$USER"
systemctl restart code-server@"$USER"
if ! systemctl is-active --quiet code-server@"$USER"; then
error_exit "code-server service failed to start."
fi
msg_ok "Installed Code-Server v${VERSION} on $hostname"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://$IP:8680${CL} \n"
+2 -57
View File
@@ -66,66 +66,11 @@ function update() {
exit exit
} }
# ==============================================================================
# PROXMOX HOST CHECK
# ==============================================================================
function check_proxmox_host() {
if command -v pveversion &>/dev/null; then
msg_error "Running on the Proxmox host is NOT recommended!"
msg_error "This should be executed inside an LXC container."
echo ""
echo -n "${TAB}Continue anyway? (y/N): "
read -r confirm
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
msg_warn "Aborted. Please run this inside an LXC container."
exit 0
fi
msg_warn "Proceeding on Proxmox host at your own risk!"
fi
}
# ==============================================================================
# CHECK / INSTALL DOCKER
# ==============================================================================
function check_or_install_docker() {
if command -v docker &>/dev/null; then
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
if docker compose version &>/dev/null; then
msg_ok "Docker Compose is available"
else
msg_error "Docker Compose plugin is not available. Please install it."
exit 10
fi
return
fi
msg_warn "Docker is not installed."
echo -n "${TAB}Install Docker now? (y/N): "
read -r install_docker_prompt
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_error "Docker is required for ${APP}. Exiting."
exit 10
fi
msg_info "Installing Docker"
if [[ -f /etc/alpine-release ]]; then
$STD apk add docker docker-cli-compose
$STD rc-service docker start
$STD rc-update add docker default
else
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
$STD sh <(curl -fsSL https://get.docker.com)
fi
msg_ok "Installed Docker"
}
# ============================================================================== # ==============================================================================
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
check_or_install_docker ensure_docker
msg_info "Installing dependencies" msg_info "Installing dependencies"
if [[ -f /etc/alpine-release ]]; then if [[ -f /etc/alpine-release ]]; then
@@ -172,7 +117,7 @@ if [[ "${type:-}" == "update" ]]; then
fi fi
header_info header_info
check_proxmox_host confirm_not_pve_host
get_lxc_ip get_lxc_ip
# Check if already installed # Check if already installed
+18 -20
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -45,28 +50,13 @@ if [[ -f "/etc/alpine-release" ]]; then
SERVICE_PATH="/etc/init.d/copyparty" SERVICE_PATH="/etc/init.d/copyparty"
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
OS="Debian" OS="Debian"
PKG_MANAGER="apt-get install -y" PKG_MANAGER="apt install -y"
SERVICE_PATH="/etc/systemd/system/copyparty.service" SERVICE_PATH="/etc/systemd/system/copyparty.service"
else else
msg_error "Unsupported OS detected. Exiting." msg_error "Unsupported OS detected. Exiting."
exit 238 exit 238
fi fi
# ==============================================================================
# HEADER
# ==============================================================================
function header_info() {
clear
cat <<"EOF"
______ ____ __
/ ____/___ ____ __ __/ __ \____ ______/ /___ __
/ / / __ \/ __ \/ / / / /_/ / __ `/ ___/ __/ / / /
/ /___/ /_/ / /_/ / /_/ / ____/ /_/ / / / /_/ /_/ /
\____/\____/ .___/\__, /_/ \__,_/_/ \__/\__, /
/_/ /____/ /____/
EOF
}
# ============================================================================== # ==============================================================================
# HELPER FUNCTIONS # HELPER FUNCTIONS
# ============================================================================== # ==============================================================================
@@ -173,9 +163,17 @@ function install() {
msg_info "Installing dependencies" msg_info "Installing dependencies"
if [[ "$OS" == "Debian" ]]; then if [[ "$OS" == "Debian" ]]; then
$STD $PKG_MANAGER python3 python3-pil ffmpeg curl $STD $PKG_MANAGER \
python3 \
python3-pil \
ffmpeg \
curl
else else
$STD $PKG_MANAGER python3 py3-pillow ffmpeg curl $STD $PKG_MANAGER \
python3 \
py3-pillow \
ffmpeg \
curl
fi fi
msg_ok "Dependencies installed (with thumbnail support)" msg_ok "Dependencies installed (with thumbnail support)"
+11 -32
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -20,6 +25,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "cronmaster" "
set -Eeuo pipefail set -Eeuo pipefail
trap 'error_handler' ERR trap 'error_handler' ERR
load_functions load_functions
require_debian_like
# ============================================================================== # ==============================================================================
# CONFIGURATION # CONFIGURATION
@@ -31,29 +37,6 @@ CONFIG_PATH="/opt/cronmaster/.env"
SERVICE_PATH="/etc/systemd/system/cronmaster.service" SERVICE_PATH="/etc/systemd/system/cronmaster.service"
DEFAULT_PORT=3000 DEFAULT_PORT=3000
# ==============================================================================
# HEADER
# ==============================================================================
function header_info {
clear
cat <<"EOF"
______ __ ___ __
/ ____/________ ____ / |/ /___ ______/ /____ _____
/ / / ___/ __ \/ __ \/ /|_/ / __ `/ ___/ __/ _ \/ ___/
/ /___/ / / /_/ / / / / / / / /_/ (__ ) /_/ __/ /
\____/_/ \____/_/ /_/_/ /_/\__,_/____/\__/\___/_/
EOF
}
# ==============================================================================
# OS DETECTION
# ==============================================================================
if ! grep -qE 'ID=debian|ID=ubuntu' /etc/os-release 2>/dev/null; then
echo -e "${CROSS} Unsupported OS detected. This script only supports Debian and Ubuntu."
exit 238
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
@@ -77,16 +60,12 @@ function update() {
systemctl stop cronmaster.service &>/dev/null || true systemctl stop cronmaster.service &>/dev/null || true
msg_ok "Stopped service" msg_ok "Stopped service"
msg_info "Backing up configuration" BACKUP_DIR="/opt/cronmaster_backup"
cp "$CONFIG_PATH" /tmp/cronmaster.env.bak 2>/dev/null || true create_backup "$CONFIG_PATH"
msg_ok "Backed up configuration"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cronmaster" "fccview/cronmaster" "prebuild" "latest" "$INSTALL_PATH" "cronmaster_*_prebuild.tar.gz" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cronmaster" "fccview/cronmaster" "prebuild" "latest" "$INSTALL_PATH" "cronmaster_*_prebuild.tar.gz"
msg_info "Restoring configuration" restore_backup
cp /tmp/cronmaster.env.bak "$CONFIG_PATH" 2>/dev/null || true
rm -f /tmp/cronmaster.env.bak
msg_ok "Restored configuration"
msg_info "Starting service" msg_info "Starting service"
systemctl start cronmaster systemctl start cronmaster
+35 -63
View File
@@ -5,89 +5,61 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.crowdsec.net/ | Github: https://github.com/crowdsecurity/crowdsec # Source: https://www.crowdsec.net/ | Github: https://github.com/crowdsecurity/crowdsec
YW=$(echo "\033[33m")
BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m")
CL=$(echo "\033[m")
BFR="\\r\\033[K"
HOLD="-"
CM="${GN}${CL}"
APP="CrowdSec" APP="CrowdSec"
hostname="$(hostname)" APP_TYPE="addon"
# Telemetry if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "crowdsec" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "crowdsec" "addon"
set -o errexit # Enable error handling
set -o errtrace set -Eeuo pipefail
set -o nounset trap 'error_handler' ERR
set -o pipefail
shopt -s expand_aliases # Initialize all core functions (colors, formatting, icons, STD mode)
alias die='EXIT=$? LINE=$LINENO error_exit' load_functions
trap die ERR require_debian_like
header_info
confirm_not_pve_host
function error_exit() {
trap - ERR
local reason="Unknown failure occured."
local msg="${1:-$reason}"
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE"
echo -e "$flag $msg" 1>&2
exit "$EXIT"
}
if command -v pveversion >/dev/null 2>&1; then
echo -e "⚠️ Can't Install on Proxmox "
exit
fi
while true; do while true; do
read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn echo -n "${TAB}This will Install ${APP}. Proceed (y/n)? "
read -r yn
case $yn in case $yn in
[Yy]*) break ;; [Yy]*) break ;;
[Nn]*) exit ;; [Nn]*) exit ;;
*) echo "Please answer yes or no." ;; *) echo "Please answer yes or no." ;;
esac esac
done done
clear
function header_info() {
echo -e "${BL}
_____ _ _____
/ ____| | |/ ____|
| | _ __ _____ ____| | (___ ___ ___
| | | __/ _ \ \ /\ / / _ |\___ \ / _ \/ __|
| |____| | | (_) \ V V / (_| |____) | __/ (__
\_____|_| \___/ \_/\_/ \__ _|_____/ \___|\___|
${CL}"
}
header_info
function msg_info() {
local msg="$1"
echo -ne " ${HOLD} ${YW}${msg}..."
}
function msg_ok() {
local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
}
msg_info "Setting up ${APP} Repository" msg_info "Setting up ${APP} Repository"
apt-get update &>/dev/null $STD apt update
apt-get install -y curl &>/dev/null $STD apt install -y \
apt-get install -y gnupg &>/dev/null curl \
curl -fsSL "https://install.crowdsec.net" | bash &>/dev/null gnupg
$STD bash -c "curl -fsSL https://install.crowdsec.net | bash"
msg_ok "Setup ${APP} Repository" msg_ok "Setup ${APP} Repository"
msg_info "Installing ${APP}" msg_info "Installing ${APP}"
apt-get update &>/dev/null $STD apt update
apt-get install -y crowdsec &>/dev/null $STD apt install -y crowdsec
msg_ok "Installed ${APP} on $hostname" msg_ok "Installed ${APP}"
msg_info "Installing ${APP} Common Bouncer" msg_info "Installing ${APP} Common Bouncer"
apt-get install -y crowdsec-firewall-bouncer-iptables &>/dev/null $STD apt install -y crowdsec-firewall-bouncer-iptables
msg_ok "Installed ${APP} Common Bouncer" msg_ok "Installed ${APP} Common Bouncer"
msg_ok "Completed successfully!\n" msg_ok "Completed successfully!\n"
+2 -57
View File
@@ -72,66 +72,11 @@ function update() {
exit exit
} }
# ==============================================================================
# PROXMOX HOST CHECK
# ==============================================================================
function check_proxmox_host() {
if command -v pveversion &>/dev/null; then
msg_error "Running on the Proxmox host is NOT recommended!"
msg_error "This should be executed inside an LXC container."
echo ""
echo -n "${TAB}Continue anyway? (y/N): "
read -r confirm
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
msg_warn "Aborted. Please run this inside an LXC container."
exit 0
fi
msg_warn "Proceeding on Proxmox host at your own risk!"
fi
}
# ==============================================================================
# CHECK / INSTALL DOCKER
# ==============================================================================
function check_or_install_docker() {
if command -v docker &>/dev/null; then
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
if docker compose version &>/dev/null; then
msg_ok "Docker Compose is available"
else
msg_error "Docker Compose plugin is not available. Please install it."
exit 10
fi
return
fi
msg_warn "Docker is not installed."
echo -n "${TAB}Install Docker now? (y/N): "
read -r install_docker_prompt
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_error "Docker is required for ${APP}. Exiting."
exit 10
fi
msg_info "Installing Docker"
if [[ -f /etc/alpine-release ]]; then
$STD apk add docker docker-cli-compose
$STD rc-service docker start
$STD rc-update add docker default
else
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
$STD sh <(curl -fsSL https://get.docker.com)
fi
msg_ok "Installed Docker"
}
# ============================================================================== # ==============================================================================
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
check_or_install_docker ensure_docker
msg_info "Creating install directories" msg_info "Creating install directories"
mkdir -p "$INSTALL_PATH" "$STACKS_PATH" mkdir -p "$INSTALL_PATH" "$STACKS_PATH"
@@ -167,7 +112,7 @@ if [[ "${type:-}" == "update" ]]; then
fi fi
header_info header_info
check_proxmox_host confirm_not_pve_host
get_lxc_ip get_lxc_ip
# Check if already installed # Check if already installed
+2 -57
View File
@@ -65,66 +65,11 @@ function update() {
exit exit
} }
# ==============================================================================
# PROXMOX HOST CHECK
# ==============================================================================
function check_proxmox_host() {
if command -v pveversion &>/dev/null; then
msg_error "Running on the Proxmox host is NOT recommended!"
msg_error "This should be executed inside an LXC container."
echo ""
echo -n "${TAB}Continue anyway? (y/N): "
read -r confirm
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
msg_warn "Aborted. Please run this inside an LXC container."
exit 0
fi
msg_warn "Proceeding on Proxmox host at your own risk!"
fi
}
# ==============================================================================
# CHECK / INSTALL DOCKER
# ==============================================================================
function check_or_install_docker() {
if command -v docker &>/dev/null; then
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
if docker compose version &>/dev/null; then
msg_ok "Docker Compose is available"
else
msg_error "Docker Compose plugin is not available. Please install it."
exit 10
fi
return
fi
msg_warn "Docker is not installed."
echo -n "${TAB}Install Docker now? (y/N): "
read -r install_docker_prompt
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_error "Docker is required for ${APP}. Exiting."
exit 10
fi
msg_info "Installing Docker"
if [[ -f /etc/alpine-release ]]; then
$STD apk add docker docker-cli-compose
$STD rc-service docker start
$STD rc-update add docker default
else
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
$STD sh <(curl -fsSL https://get.docker.com)
fi
msg_ok "Installed Docker"
}
# ============================================================================== # ==============================================================================
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
check_or_install_docker ensure_docker
msg_info "Installing dependencies" msg_info "Installing dependencies"
if [[ -f /etc/alpine-release ]]; then if [[ -f /etc/alpine-release ]]; then
@@ -170,7 +115,7 @@ if [[ "${type:-}" == "update" ]]; then
fi fi
header_info header_info
check_proxmox_host confirm_not_pve_host
get_lxc_ip get_lxc_ip
# Check if already installed # Check if already installed
+66 -74
View File
@@ -5,55 +5,51 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/filebrowserspace/quantum # Source: https://github.com/filebrowserspace/quantum
function header_info() {
clear
cat <<"EOF"
_______ __ ____ ____ __
/ ____(_) /__ / __ )_________ _ __________ _____ / __ \__ ______ _____ / /___ ______ ___
/ /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/ / / / / / / / __ `/ __ \/ __/ / / / __ `__ \
/ __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / / /_/ / /_/ / /_/ / / / / /_/ /_/ / / / / / /
/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ \___\_\__,_/\__,_/_/ /_/\__/\__,_/_/ /_/ /_/
EOF
}
YW=$(echo "\033[33m")
GN=$(echo "\033[1;92m")
RD=$(echo "\033[01;31m")
BL=$(echo "\033[36m")
CL=$(echo "\033[m")
CM="${GN}✔️${CL}"
CROSS="${RD}✖️${CL}"
INFO="${BL}${CL}"
APP="FileBrowser Quantum" APP="FileBrowser Quantum"
APP_TYPE="addon"
INSTALL_PATH="/usr/local/bin/filebrowser" INSTALL_PATH="/usr/local/bin/filebrowser"
CONFIG_PATH="/usr/local/community-scripts/fq-config.yaml" CONFIG_PATH="/usr/local/community-scripts/fq-config.yaml"
DEFAULT_PORT=8080 DEFAULT_PORT=8080
SRC_DIR="/" SRC_DIR="/"
TMP_BIN="/tmp/filebrowser.$$"
# Telemetry if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser-quantum" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser-quantum" "addon"
# Get primary IP # Enable error handling
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}') set -Eeuo pipefail
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) trap 'error_handler' ERR
[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}')
[[ -z "$IP" ]] && IP="127.0.0.1" # Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
header_info
get_lxc_ip
IP="$LOCAL_IP"
# Proxmox Host Warning # Proxmox Host Warning
if [[ -d "/etc/pve" ]]; then if [[ -d "/etc/pve" ]]; then
echo -e "${RD}⚠️ Warning: Running this addon directly on the Proxmox host is not recommended!${CL}" msg_warn "Running this addon directly on the Proxmox host is not recommended!"
echo -e "${YW} Only the boot disk will be visible passthrough drives will not be indexed.${CL}" msg_warn "Only the boot disk will be visible — passthrough drives will not be indexed."
echo -e "${YW} This causes incorrect disk usage stats and incomplete file browsing.${CL}" msg_warn "This causes incorrect disk usage stats and incomplete file browsing."
echo -e "${YW} Run this addon inside an LXC or VM instead and mount your drives there.${CL}" msg_warn "Run this addon inside an LXC or VM instead and mount your drives there."
echo "" echo ""
echo -n "Continue anyway on the Proxmox host? (y/N): " echo -n "${TAB}Continue anyway on the Proxmox host? (y/N): "
read -r host_confirm read -r host_confirm
if [[ ! "${host_confirm,,}" =~ ^(y|yes)$ ]]; then if [[ ! "${host_confirm,,}" =~ ^(y|yes)$ ]]; then
echo -e "${YW}Aborted.${CL}" msg_error "Aborted."
exit 0 exit 0
fi fi
fi fi
@@ -66,18 +62,12 @@ if [[ -f "/etc/alpine-release" ]]; then
elif [[ -f "/etc/debian_version" ]]; then elif [[ -f "/etc/debian_version" ]]; then
OS="Debian" OS="Debian"
SERVICE_PATH="/etc/systemd/system/filebrowser.service" SERVICE_PATH="/etc/systemd/system/filebrowser.service"
PKG_MANAGER="apt-get install -y" PKG_MANAGER="apt install -y"
else else
echo -e "${CROSS} Unsupported OS detected. Exiting." msg_error "Unsupported OS detected. Exiting."
exit 238 exit 238
fi fi
header_info
function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; }
function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
# Detect legacy FileBrowser installation # Detect legacy FileBrowser installation
LEGACY_DB="/usr/local/community-scripts/filebrowser.db" LEGACY_DB="/usr/local/community-scripts/filebrowser.db"
LEGACY_BIN="/usr/local/bin/filebrowser" LEGACY_BIN="/usr/local/bin/filebrowser"
@@ -85,80 +75,82 @@ LEGACY_SERVICE_DEB="/etc/systemd/system/filebrowser.service"
LEGACY_SERVICE_ALP="/etc/init.d/filebrowser" LEGACY_SERVICE_ALP="/etc/init.d/filebrowser"
if [[ -f "$LEGACY_DB" || -f "$LEGACY_BIN" && ! -f "$CONFIG_PATH" ]]; then if [[ -f "$LEGACY_DB" || -f "$LEGACY_BIN" && ! -f "$CONFIG_PATH" ]]; then
echo -e "${YW}⚠️ Detected legacy FileBrowser installation.${CL}" msg_warn "Detected legacy FileBrowser installation."
echo -n "Uninstall legacy FileBrowser and continue with Quantum install? (y/n): " echo -n "${TAB}Uninstall legacy FileBrowser and continue with Quantum install? (y/n): "
read -r remove_legacy read -r remove_legacy
if [[ "${remove_legacy,,}" =~ ^(y|yes)$ ]]; then if [[ "${remove_legacy,,}" =~ ^(y|yes)$ ]]; then
msg_info "Uninstalling legacy FileBrowser" msg_info "Uninstalling legacy FileBrowser"
if [[ -f "$LEGACY_SERVICE_DEB" ]]; then if [[ -f "$LEGACY_SERVICE_DEB" ]]; then
systemctl disable --now filebrowser.service &>/dev/null systemctl disable --now filebrowser.service &>/dev/null || true
rm -f "$LEGACY_SERVICE_DEB" rm -f "$LEGACY_SERVICE_DEB"
elif [[ -f "$LEGACY_SERVICE_ALP" ]]; then elif [[ -f "$LEGACY_SERVICE_ALP" ]]; then
rc-service filebrowser stop &>/dev/null rc-service filebrowser stop &>/dev/null || true
rc-update del filebrowser &>/dev/null rc-update del filebrowser &>/dev/null || true
rm -f "$LEGACY_SERVICE_ALP" rm -f "$LEGACY_SERVICE_ALP"
fi fi
rm -f "$LEGACY_BIN" "$LEGACY_DB" rm -f "$LEGACY_BIN" "$LEGACY_DB"
msg_ok "Legacy FileBrowser removed" msg_ok "Legacy FileBrowser removed"
else else
echo -e "${YW}Installation aborted by user.${CL}" msg_error "Installation aborted by user."
exit 0 exit 0
fi fi
fi fi
# Existing installation # Existing installation
if [[ -f "$INSTALL_PATH" ]]; then if [[ -f "$INSTALL_PATH" ]]; then
echo -e "${YW}⚠️ ${APP} is already installed.${CL}" msg_warn "${APP} is already installed."
echo -n "Uninstall ${APP}? (y/N): " echo -n "${TAB}Uninstall ${APP}? (y/N): "
read -r uninstall_prompt read -r uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Uninstalling ${APP}" msg_info "Uninstalling ${APP}"
if [[ "$OS" == "Debian" ]]; then if [[ "$OS" == "Debian" ]]; then
systemctl disable --now filebrowser.service &>/dev/null systemctl disable --now filebrowser.service &>/dev/null || true
rm -f "$SERVICE_PATH" rm -f "$SERVICE_PATH"
else else
rc-service filebrowser stop &>/dev/null rc-service filebrowser stop &>/dev/null || true
rc-update del filebrowser &>/dev/null rc-update del filebrowser &>/dev/null || true
rm -f "$SERVICE_PATH" rm -f "$SERVICE_PATH"
fi fi
rm -f "$INSTALL_PATH" "$CONFIG_PATH" rm -f "$INSTALL_PATH" "$CONFIG_PATH" "$HOME/.filebrowser-quantum"
msg_ok "${APP} has been uninstalled." msg_ok "${APP} has been uninstalled."
exit 0 exit 0
fi fi
echo -n "Update ${APP}? (y/N): " echo -n "${TAB}Update ${APP}? (y/N): "
read -r update_prompt read -r update_prompt
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Updating ${APP}" if check_for_gh_release "filebrowser-quantum" "gtsteffaniak/filebrowser"; then
if ! command -v curl &>/dev/null; then $PKG_MANAGER curl &>/dev/null; fi msg_info "Updating ${APP}"
curl -fsSL https://github.com/gtsteffaniak/filebrowser/releases/latest/download/linux-amd64-filebrowser -o "$TMP_BIN" if ! command -v curl &>/dev/null; then $STD $PKG_MANAGER curl; fi
chmod +x "$TMP_BIN" fetch_and_deploy_gh_release "filebrowser-quantum" "gtsteffaniak/filebrowser" "singlefile" "latest" "/usr/local/bin" "linux-$(arch_resolve)-filebrowser"
mv -f "$TMP_BIN" /usr/local/bin/filebrowser mv -f /usr/local/bin/filebrowser-quantum "$INSTALL_PATH"
msg_ok "Updated ${APP}" msg_ok "Updated ${APP}"
fi
exit 0 exit 0
else else
echo -e "${YW}⚠️ Update skipped. Exiting.${CL}" msg_warn "Update skipped. Exiting."
exit 0 exit 0
fi fi
fi fi
echo -e "${YW}⚠️ ${APP} is not installed.${CL}" msg_warn "${APP} is not installed."
echo -n "Enter port number (Default: ${DEFAULT_PORT}): " echo -n "${TAB}Enter port number (Default: ${DEFAULT_PORT}): "
read -r PORT read -r PORT
PORT=${PORT:-$DEFAULT_PORT} PORT=${PORT:-$DEFAULT_PORT}
echo -n "Install ${APP}? (y/n): " echo -n "${TAB}Install ${APP}? (y/n): "
read -r install_prompt read -r install_prompt
if ! [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then if ! [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" msg_warn "Installation skipped. Exiting."
exit 0 exit 0
fi fi
msg_info "Installing ${APP} on ${OS}" msg_info "Installing ${APP} on ${OS}"
$PKG_MANAGER curl ffmpeg &>/dev/null $STD $PKG_MANAGER \
curl -fsSL https://github.com/gtsteffaniak/filebrowser/releases/latest/download/linux-amd64-filebrowser -o "$TMP_BIN" curl \
chmod +x "$TMP_BIN" ffmpeg
mv -f "$TMP_BIN" /usr/local/bin/filebrowser fetch_and_deploy_gh_release "filebrowser-quantum" "gtsteffaniak/filebrowser" "singlefile" "latest" "/usr/local/bin" "linux-$(arch_resolve)-filebrowser"
mv -f /usr/local/bin/filebrowser-quantum "$INSTALL_PATH"
msg_ok "Installed ${APP}" msg_ok "Installed ${APP}"
msg_info "Preparing configuration directory" msg_info "Preparing configuration directory"
@@ -167,7 +159,7 @@ chown root:root /usr/local/community-scripts
chmod 755 /usr/local/community-scripts chmod 755 /usr/local/community-scripts
msg_ok "Directory prepared" msg_ok "Directory prepared"
echo -n "Use No Authentication? (y/N): " echo -n "${TAB}Use No Authentication? (y/N): "
read -r noauth_prompt read -r noauth_prompt
# === YAML CONFIG GENERATION === # === YAML CONFIG GENERATION ===
@@ -251,9 +243,9 @@ depend() {
} }
EOF EOF
chmod +x "$SERVICE_PATH" chmod +x "$SERVICE_PATH"
rc-update add filebrowser default &>/dev/null $STD rc-update add filebrowser default
rc-service filebrowser start &>/dev/null $STD rc-service filebrowser start
fi fi
msg_ok "Service created successfully" msg_ok "Service created successfully"
echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" msg_ok "${APP} is reachable at: ${BL}http://${IP}:${PORT}${CL}"
+62 -77
View File
@@ -5,53 +5,50 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://filebrowser.org/ | Github: https://github.com/filebrowser/filebrowser # Source: https://filebrowser.org/ | Github: https://github.com/filebrowser/filebrowser
function header_info {
clear
cat <<"EOF"
_______ __ ____
/ ____(_) /__ / __ )_________ _ __________ _____
/ /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/
/ __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ /
/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/
EOF
}
YW=$(echo "\033[33m")
GN=$(echo "\033[1;92m")
RD=$(echo "\033[01;31m")
BL=$(echo "\033[36m")
CL=$(echo "\033[m")
CM="${GN}✔️${CL}"
CROSS="${RD}✖️${CL}"
INFO="${BL}${CL}"
APP="FileBrowser" APP="FileBrowser"
APP_TYPE="addon"
INSTALL_PATH="/usr/local/bin/filebrowser" INSTALL_PATH="/usr/local/bin/filebrowser"
DB_PATH="/usr/local/community-scripts/filebrowser.db" DB_PATH="/usr/local/community-scripts/filebrowser.db"
DEFAULT_PORT=8080 DEFAULT_PORT=8080
# Telemetry if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "filebrowser" "addon"
# Get first non-loopback IP & Detect primary network interface dynamically # Enable error handling
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}') set -Eeuo pipefail
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) trap 'error_handler' ERR
[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}') # Initialize all core functions (colors, formatting, icons, STD mode)
[[ -z "$IP" ]] && IP="127.0.0.1" load_functions
header_info
get_lxc_ip
IP="$LOCAL_IP"
# Proxmox Host Warning # Proxmox Host Warning
if [[ -d "/etc/pve" ]]; then if [[ -d "/etc/pve" ]]; then
echo -e "${RD}⚠️ Warning: Running this addon directly on the Proxmox host is not recommended!${CL}" msg_warn "Running this addon directly on the Proxmox host is not recommended!"
echo -e "${YW} Only the boot disk will be visible — passthrough drives will not be indexed.${CL}" msg_warn "Only the boot disk will be visible — passthrough drives will not be indexed."
echo -e "${YW} This causes incorrect disk usage stats and incomplete file browsing.${CL}" msg_warn "This causes incorrect disk usage stats and incomplete file browsing."
echo -e "${YW} Run this addon inside an LXC or VM instead and mount your drives there.${CL}" msg_warn "Run this addon inside an LXC or VM instead and mount your drives there."
echo "" echo ""
echo -n "Continue anyway on the Proxmox host? (y/N): " echo -n "${TAB}Continue anyway on the Proxmox host? (y/N): "
read -r host_confirm read -r host_confirm
if [[ ! "${host_confirm,,}" =~ ^(y|yes)$ ]]; then if [[ ! "${host_confirm,,}" =~ ^(y|yes)$ ]]; then
echo -e "${YW}Aborted.${CL}" msg_error "Aborted."
exit 0 exit 0
fi fi
fi fi
@@ -64,71 +61,59 @@ if [[ -f "/etc/alpine-release" ]]; then
elif [[ -f "/etc/debian_version" ]]; then elif [[ -f "/etc/debian_version" ]]; then
OS="Debian" OS="Debian"
SERVICE_PATH="/etc/systemd/system/filebrowser.service" SERVICE_PATH="/etc/systemd/system/filebrowser.service"
PKG_MANAGER="apt-get install -y" PKG_MANAGER="apt install -y"
else else
echo -e "${CROSS} Unsupported OS detected. Exiting." msg_error "Unsupported OS detected. Exiting."
exit 238 exit 238
fi fi
header_info
function msg_info() {
local msg="$1"
echo -e "${INFO} ${YW}${msg}...${CL}"
}
function msg_ok() {
local msg="$1"
echo -e "${CM} ${GN}${msg}${CL}"
}
function msg_error() {
local msg="$1"
echo -e "${CROSS} ${RD}${msg}${CL}"
}
if [ -f "$INSTALL_PATH" ]; then if [ -f "$INSTALL_PATH" ]; then
echo -e "${YW}⚠️ ${APP} is already installed.${CL}" msg_warn "${APP} is already installed."
read -r -p "Would you like to uninstall ${APP}? (y/N): " uninstall_prompt read -r -p "Would you like to uninstall ${APP}? (y/N): " uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Uninstalling ${APP}" msg_info "Uninstalling ${APP}"
if [[ "$OS" == "Debian" ]]; then if [[ "$OS" == "Debian" ]]; then
systemctl disable --now filebrowser.service &>/dev/null systemctl disable --now filebrowser.service &>/dev/null || true
rm -f "$SERVICE_PATH" rm -f "$SERVICE_PATH"
else else
rc-service filebrowser stop &>/dev/null rc-service filebrowser stop &>/dev/null || true
rc-update del filebrowser &>/dev/null rc-update del filebrowser &>/dev/null || true
rm -f "$SERVICE_PATH" rm -f "$SERVICE_PATH"
fi fi
rm -f "$INSTALL_PATH" "$DB_PATH" rm -f "$INSTALL_PATH" "$DB_PATH" "$HOME/.filebrowser"
msg_ok "${APP} has been uninstalled." msg_ok "${APP} has been uninstalled."
exit 0 exit 0
fi fi
read -r -p "Would you like to update ${APP}? (y/N): " update_prompt read -r -p "Would you like to update ${APP}? (y/N): " update_prompt
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Updating ${APP}" if check_for_gh_release "filebrowser" "filebrowser/filebrowser"; then
if ! command -v curl &>/dev/null; then $PKG_MANAGER curl &>/dev/null; fi msg_info "Updating ${APP}"
curl -fsSL "https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz" | tar -xzv -C /usr/local/bin &>/dev/null fetch_and_deploy_gh_release "filebrowser" "filebrowser/filebrowser" "prebuild" "latest" "/opt/filebrowser-dist" "linux-$(arch_resolve)-filebrowser.tar.gz"
chmod +x "$INSTALL_PATH" install -m 755 /opt/filebrowser-dist/filebrowser "$INSTALL_PATH"
msg_ok "Updated ${APP}" rm -rf /opt/filebrowser-dist
msg_ok "Updated ${APP}"
fi
exit 0 exit 0
else else
echo -e "${YW}⚠️ Update skipped. Exiting.${CL}" msg_warn "Update skipped. Exiting."
exit 0 exit 0
fi fi
fi fi
echo -e "${YW}⚠️ ${APP} is not installed.${CL}" msg_warn "${APP} is not installed."
read -r -p "Enter port number (Default: ${DEFAULT_PORT}): " PORT read -r -p "Enter port number (Default: ${DEFAULT_PORT}): " PORT
PORT=${PORT:-$DEFAULT_PORT} PORT=${PORT:-$DEFAULT_PORT}
read -r -p "Would you like to install ${APP}? (y/n): " install_prompt read -r -p "Would you like to install ${APP}? (y/n): " install_prompt
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Installing ${APP} on ${OS}" msg_info "Installing ${APP} on ${OS}"
$PKG_MANAGER wget tar curl &>/dev/null $STD $PKG_MANAGER \
curl -fsSL "https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz" | tar -xzv -C /usr/local/bin &>/dev/null tar \
chmod +x "$INSTALL_PATH" curl
fetch_and_deploy_gh_release "filebrowser" "filebrowser/filebrowser" "prebuild" "latest" "/opt/filebrowser-dist" "linux-$(arch_resolve)-filebrowser.tar.gz"
install -m 755 /opt/filebrowser-dist/filebrowser "$INSTALL_PATH"
rm -rf /opt/filebrowser-dist
msg_ok "Installed ${APP}" msg_ok "Installed ${APP}"
msg_info "Creating FileBrowser directory" msg_info "Creating FileBrowser directory"
@@ -144,19 +129,19 @@ if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Configuring No Authentication" msg_info "Configuring No Authentication"
cd /usr/local/community-scripts cd /usr/local/community-scripts
filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null $STD filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH"
filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null $STD filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH"
filebrowser config set --auth.method=noauth --database "$DB_PATH" &>/dev/null $STD filebrowser config set --auth.method=noauth --database "$DB_PATH"
if ! filebrowser users update 1 --perm.admin --database "$DB_PATH" &>/dev/null; then if ! filebrowser users update 1 --perm.admin --database "$DB_PATH" &>/dev/null; then
filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH" &>/dev/null $STD filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH"
fi fi
msg_ok "No Authentication configured" msg_ok "No Authentication configured"
else else
msg_info "Setting up default authentication" msg_info "Setting up default authentication"
cd /usr/local/community-scripts cd /usr/local/community-scripts
filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null $STD filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH"
filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null $STD filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH"
filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH" &>/dev/null $STD filebrowser users add admin community-scripts.org --perm.admin --database "$DB_PATH"
msg_ok "Default authentication configured (admin:community-scripts.org)" msg_ok "Default authentication configured (admin:community-scripts.org)"
fi fi
@@ -194,13 +179,13 @@ depend() {
} }
EOF EOF
chmod +x "$SERVICE_PATH" chmod +x "$SERVICE_PATH"
rc-update add filebrowser default &>/dev/null $STD rc-update add filebrowser default
rc-service filebrowser start &>/dev/null $STD rc-service filebrowser start
fi fi
msg_ok "Service created successfully" msg_ok "Service created successfully"
echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}" msg_ok "${APP} is reachable at: ${BL}http://${IP}:${PORT}${CL}"
else else
echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" msg_warn "Installation skipped. Exiting."
exit 0 exit 0
fi fi
+41 -50
View File
@@ -5,55 +5,47 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://nicolargo.github.io/glances/ | Github: https://github.com/nicolargo/glances # Source: https://nicolargo.github.io/glances/ | Github: https://github.com/nicolargo/glances
function header_info {
clear
cat <<"EOF"
________
/ ____/ /___ _____ ________ _____
/ / __/ / __ `/ __ \/ ___/ _ \/ ___/
/ /_/ / / /_/ / / / / /__/ __(__ )
\____/_/\__,_/_/ /_/\___/\___/____/
EOF
}
APP="Glances" APP="Glances"
YW=$(echo "\033[33m") APP_TYPE="addon"
GN=$(echo "\033[1;92m")
RD=$(echo "\033[01;31m")
BL=$(echo "\033[36m")
CL=$(echo "\033[m")
CM="${GN}✔️${CL}"
CROSS="${RD}✖️${CL}"
INFO="${BL}${CL}"
function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; } if ! command -v curl &>/dev/null; then
function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; } printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; } if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
# Telemetry apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "glances" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "glances" "addon"
get_lxc_ip() { # Enable error handling
if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then set -Eeuo pipefail
hostname -I | awk '{print $1}' trap 'error_handler' ERR
elif command -v ip >/dev/null 2>&1; then
ip -4 addr show scope global | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1 # Initialize all core functions (colors, formatting, icons, STD mode)
else load_functions
echo "127.0.0.1"
fi header_info
} get_lxc_ip
IP=$(get_lxc_ip) IP="$LOCAL_IP"
install_glances_debian() { install_glances_debian() {
msg_info "Installing dependencies" msg_info "Installing dependencies"
apt-get update >/dev/null 2>&1 $STD apt update
apt-get install -y gcc lm-sensors wireless-tools curl >/dev/null 2>&1 $STD apt install -y \
gcc \
lm-sensors \
wireless-tools \
curl
msg_ok "Installed dependencies" msg_ok "Installed dependencies"
msg_info "Setting up Python + uv" msg_info "Setting up Python + uv"
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
setup_uv PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12"
msg_ok "Setup Python + uv" msg_ok "Setup Python + uv"
@@ -61,10 +53,10 @@ install_glances_debian() {
cd /opt cd /opt
mkdir -p glances mkdir -p glances
cd glances cd glances
uv venv --clear $STD uv venv --clear
source .venv/bin/activate >/dev/null 2>&1 source .venv/bin/activate >/dev/null 2>&1
uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1 $STD uv pip install --upgrade pip wheel setuptools
uv pip install "glances[web]" >/dev/null 2>&1 $STD uv pip install "glances[web]"
deactivate deactivate
msg_ok "Installed $APP" msg_ok "Installed $APP"
@@ -86,7 +78,7 @@ EOF
systemctl enable -q --now glances systemctl enable -q --now glances
msg_ok "Created systemd service" msg_ok "Created systemd service"
echo -e "\n$APP is now running at: http://$IP:61208\n" msg_ok "$APP is now running at: http://${IP}:61208"
} }
# update on Debian/Ubuntu # update on Debian/Ubuntu
@@ -98,7 +90,7 @@ update_glances_debian() {
msg_info "Updating $APP" msg_info "Updating $APP"
cd /opt/glances cd /opt/glances
source .venv/bin/activate source .venv/bin/activate
uv pip install --upgrade "glances[web]" >/dev/null 2>&1 $STD uv pip install --upgrade "glances[web]"
deactivate deactivate
systemctl restart glances systemctl restart glances
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
@@ -116,14 +108,13 @@ uninstall_glances_debian() {
# install on Alpine # install on Alpine
install_glances_alpine() { install_glances_alpine() {
msg_info "Installing dependencies" msg_info "Installing dependencies"
apk update >/dev/null 2>&1 $STD apk update
$STD apk add --no-cache \ $STD apk add --no-cache \
gcc musl-dev linux-headers python3-dev \ gcc musl-dev linux-headers python3-dev \
python3 py3-pip py3-virtualenv lm-sensors wireless-tools curl >/dev/null 2>&1 python3 py3-pip py3-virtualenv lm-sensors wireless-tools curl
msg_ok "Installed dependencies" msg_ok "Installed dependencies"
msg_info "Setting up Python + uv" msg_info "Setting up Python + uv"
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
setup_uv PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12"
msg_ok "Setup Python + uv" msg_ok "Setup Python + uv"
@@ -131,10 +122,10 @@ install_glances_alpine() {
cd /opt cd /opt
mkdir -p glances mkdir -p glances
cd glances cd glances
uv venv --clear $STD uv venv --clear
source .venv/bin/activate source .venv/bin/activate
uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1 $STD uv pip install --upgrade pip wheel setuptools
uv pip install "glances[web]" >/dev/null 2>&1 $STD uv pip install "glances[web]"
deactivate deactivate
msg_ok "Installed $APP" msg_ok "Installed $APP"
@@ -165,7 +156,7 @@ update_glances_alpine() {
msg_info "Updating $APP" msg_info "Updating $APP"
cd /opt/glances cd /opt/glances
source .venv/bin/activate source .venv/bin/activate
uv pip install --upgrade "glances[web]" >/dev/null 2>&1 $STD uv pip install --upgrade "glances[web]"
deactivate deactivate
rc-service glances restart rc-service glances restart
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
+10 -16
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -19,7 +24,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
set -Eeuo pipefail set -Eeuo pipefail
trap 'error_handler' ERR trap 'error_handler' ERR
load_functions load_functions
init_tool_telemetry "" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "homebrew" "addon"
# ============================================================================== # ==============================================================================
# CONFIGURATION # CONFIGURATION
@@ -29,18 +34,7 @@ APP="homebrew"
APP_TYPE="tools" APP_TYPE="tools"
INSTALL_PATH="/home/linuxbrew/.linuxbrew" INSTALL_PATH="/home/linuxbrew/.linuxbrew"
# ============================================================================== require_debian_like
# OS DETECTION
# ==============================================================================
if [[ -f "/etc/alpine-release" ]]; then
echo -e "${CROSS} Alpine is not supported by Homebrew. Exiting."
exit 1
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
OS="Debian"
else
echo -e "${CROSS} Unsupported OS detected. Exiting."
exit 1
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
@@ -81,7 +75,7 @@ function install() {
msg_ok "Created user 'brew'" msg_ok "Created user 'brew'"
else else
msg_error "Cannot install Homebrew without a non-root user. Exiting." msg_error "Cannot install Homebrew without a non-root user. Exiting."
exit 1 exit 254
fi fi
fi fi
msg_ok "Detected User: $BREW_USER" msg_ok "Detected User: $BREW_USER"
+12 -40
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -27,39 +32,12 @@ APP="Immich Public Proxy"
APP_TYPE="addon" APP_TYPE="addon"
INSTALL_PATH="/opt/immich-proxy" INSTALL_PATH="/opt/immich-proxy"
CONFIG_PATH="/opt/immich-proxy/app" CONFIG_PATH="/opt/immich-proxy/app"
SERVICE_PATH="/etc/systemd/system/immich-proxy.service"
DEFAULT_PORT=3000 DEFAULT_PORT=3000
# Initialize all core functions (colors, formatting, icons, $STD mode) # Initialize all core functions (colors, formatting, icons, $STD mode)
load_functions load_functions
require_debian_like
# ==============================================================================
# HEADER
# ==============================================================================
function header_info {
clear
cat <<"EOF"
____ _ __ ____
/ _/___ ___ ____ ___ (_)____/ /_ / __ \_________ _ ____ __
/ // __ `__ \/ __ `__ \/ / ___/ __ \______/ /_/ / ___/ __ \| |/_/ / / /
_/ // / / / / / / / / / / / /__/ / / /_____/ ____/ / / /_/ /> </ /_/ /
/___/_/ /_/ /_/_/ /_/ /_/_/\___/_/ /_/ /_/ /_/ \____/_/|_|\__, /
/____/
EOF
}
# ==============================================================================
# OS DETECTION
# ==============================================================================
if [[ -f "/etc/alpine-release" ]]; then
msg_error "Alpine is not supported for ${APP}. Use Debian."
exit 238
elif [[ -f "/etc/debian_version" ]]; then
OS="Debian"
SERVICE_PATH="/etc/systemd/system/immich-proxy.service"
else
echo -e "${CROSS} Unsupported OS detected. Exiting."
exit 238
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
@@ -83,19 +61,13 @@ function update() {
systemctl stop immich-proxy.service &>/dev/null || true systemctl stop immich-proxy.service &>/dev/null || true
msg_ok "Stopped service" msg_ok "Stopped service"
msg_info "Backing up configuration" BACKUP_DIR="/opt/immich-public-proxy_backup"
cp "$CONFIG_PATH"/.env /tmp/ipp.env.bak 2>/dev/null || true create_backup "$CONFIG_PATH"/.env "$CONFIG_PATH"/config.json
cp "$CONFIG_PATH"/config.json /tmp/ipp.config.json.bak 2>/dev/null || true
msg_ok "Backed up configuration"
NODE_VERSION="24" setup_nodejs NODE_VERSION="24" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Immich Public Proxy" "alangrainger/immich-public-proxy" "tarball" "latest" "$INSTALL_PATH" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Immich Public Proxy" "alangrainger/immich-public-proxy" "tarball" "latest" "$INSTALL_PATH"
msg_info "Restoring configuration" restore_backup
cp /tmp/ipp.env.bak "$CONFIG_PATH"/.env 2>/dev/null || true
cp /tmp/ipp.config.json.bak "$CONFIG_PATH"/config.json 2>/dev/null || true
rm -f /tmp/ipp.*.bak
msg_ok "Restored configuration"
msg_info "Installing dependencies" msg_info "Installing dependencies"
cd "$CONFIG_PATH" cd "$CONFIG_PATH"
+12 -38
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -27,39 +32,12 @@ APP="Jellystat"
APP_TYPE="addon" APP_TYPE="addon"
INSTALL_PATH="/opt/jellystat" INSTALL_PATH="/opt/jellystat"
CONFIG_PATH="/opt/jellystat/.env" CONFIG_PATH="/opt/jellystat/.env"
SERVICE_PATH="/etc/systemd/system/jellystat.service"
DEFAULT_PORT=3000 DEFAULT_PORT=3000
# Initialize all core functions (colors, formatting, icons, STD mode) # Initialize all core functions (colors, formatting, icons, STD mode)
load_functions load_functions
require_debian_like
# ==============================================================================
# HEADER
# ==============================================================================
function header_info {
clear
cat <<"EOF"
__ ____ __ __
/ /__ / / /_ _______/ /_____ _/ /_
__ / / _ \/ / / / / / ___/ __/ __ `/ __/
/ /_/ / __/ / / /_/ (__ ) /_/ /_/ / /_
\____/\___/_/_/\__, /____/\__/\__,_/\__/
/____/
EOF
}
# ==============================================================================
# OS DETECTION
# ==============================================================================
if [[ -f "/etc/alpine-release" ]]; then
msg_error "Alpine is not supported for ${APP}. Use Debian/Ubuntu."
exit 238
elif [[ -f "/etc/debian_version" ]]; then
OS="Debian"
SERVICE_PATH="/etc/systemd/system/jellystat.service"
else
echo -e "${CROSS} Unsupported OS detected. Exiting."
exit 238
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
@@ -102,16 +80,12 @@ function update() {
systemctl stop jellystat.service &>/dev/null || true systemctl stop jellystat.service &>/dev/null || true
msg_ok "Stopped service" msg_ok "Stopped service"
msg_info "Backing up configuration" BACKUP_DIR="/opt/jellystat_backup"
cp "$CONFIG_PATH" /tmp/jellystat.env.bak 2>/dev/null || true create_backup "$CONFIG_PATH"
msg_ok "Backed up configuration"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jellystat" "CyferShepard/Jellystat" "tarball" "latest" "$INSTALL_PATH" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jellystat" "CyferShepard/Jellystat" "tarball" "latest" "$INSTALL_PATH"
msg_info "Restoring configuration" restore_backup
cp /tmp/jellystat.env.bak "$CONFIG_PATH" 2>/dev/null || true
rm -f /tmp/jellystat.env.bak
msg_ok "Restored configuration"
msg_info "Installing dependencies" msg_info "Installing dependencies"
cd "$INSTALL_PATH" cd "$INSTALL_PATH"
+12 -61
View File
@@ -6,8 +6,13 @@
# Source: https://komo.do/ | Github: https://github.com/moghtech/komodo # Source: https://komo.do/ | Github: https://github.com/moghtech/komodo
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 || apk update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 || apk add --no-cache curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -131,25 +136,7 @@ function update() {
} }
# ============================================================================== # ==============================================================================
# PROXMOX HOST CHECK # DEPENDENCIES
# ==============================================================================
function check_proxmox_host() {
if command -v pveversion &>/dev/null; then
msg_error "Running on the Proxmox host is NOT recommended!"
msg_error "This should be executed inside an LXC container."
echo ""
echo -n "${TAB}Continue anyway? (y/N): "
read -r confirm
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
msg_warn "Aborted. Please run this inside an LXC container."
exit 0
fi
msg_warn "Proceeding on Proxmox host at your own risk!"
fi
}
# ==============================================================================
# CHECK / INSTALL DOCKER
# ============================================================================== # ==============================================================================
function ensure_openssl() { function ensure_openssl() {
if command -v openssl &>/dev/null; then if command -v openssl &>/dev/null; then
@@ -163,53 +150,17 @@ function ensure_openssl() {
$STD apt-get install -y openssl $STD apt-get install -y openssl
else else
msg_error "openssl is required but could not be installed automatically." msg_error "openssl is required but could not be installed automatically."
exit 10 exit 237
fi fi
msg_ok "Installed openssl" msg_ok "Installed openssl"
} }
function check_or_install_docker() {
if command -v docker &>/dev/null; then
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
if docker compose version &>/dev/null; then
msg_ok "Docker Compose is available"
else
msg_error "Docker Compose plugin is not available. Please install it."
exit 10
fi
ensure_openssl
return
fi
msg_warn "Docker is not installed."
echo -n "${TAB}Install Docker now? (y/N): "
read -r install_docker_prompt
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_error "Docker is required for ${APP}. Exiting."
exit 10
fi
msg_info "Installing Docker"
if [[ -f /etc/alpine-release ]]; then
$STD apk add docker docker-cli-compose
$STD rc-service docker start
$STD rc-update add docker default
else
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
$STD sh <(curl -fsSL https://get.docker.com)
fi
msg_ok "Installed Docker"
ensure_openssl
}
# ============================================================================== # ==============================================================================
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
check_or_install_docker ensure_docker
ensure_openssl
echo -e "${TAB}Choose the database for Komodo:" echo -e "${TAB}Choose the database for Komodo:"
echo -e "${TAB} 1) MongoDB (recommended)" echo -e "${TAB} 1) MongoDB (recommended)"
@@ -292,7 +243,7 @@ if [[ "${type:-}" == "update" ]]; then
fi fi
header_info header_info
check_proxmox_host confirm_not_pve_host
get_lxc_ip get_lxc_ip
# Declare variables used by find_compose_file # Declare variables used by find_compose_file
+40 -89
View File
@@ -5,74 +5,31 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.netdata.cloud/ | Github: https://github.com/netdata/netdata # Source: https://www.netdata.cloud/ | Github: https://github.com/netdata/netdata
function header_info { APP="Netdata"
clear APP_TYPE="addon"
cat <<"EOF"
_ __ __ ____ __
/ | / /__ / /_/ __ \____ _/ /_____ _
/ |/ / _ \/ __/ / / / __ `/ __/ __ `/
/ /| / __/ /_/ /_/ / /_/ / /_/ /_/ /
/_/ |_/\___/\__/_____/\__,_/\__/\__,_/
EOF if ! command -v curl &>/dev/null; then
} printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
YW=$(echo "\033[33m") apk update >/dev/null 2>&1
BL=$(echo "\033[36m") apk add --no-cache curl >/dev/null 2>&1
RD=$(echo "\033[01;31m") else
GN=$(echo "\033[1;92m") apt-get update >/dev/null 2>&1
CL=$(echo "\033[m") apt-get install -y curl >/dev/null 2>&1
BFR="\\r\\033[K" fi
HOLD="-" fi
CM="${GN}${CL}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
silent() { "$@" >/dev/null 2>&1; } source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "netdata" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "netdata" "addon"
set -e # Enable error handling
header_info set -Eeuo pipefail
echo "Loading..." trap 'error_handler' ERR
function msg_info() {
local msg="$1"
echo -ne " ${HOLD} ${YW}${msg}..."
}
function msg_ok() { # Initialize all core functions (colors, formatting, icons, STD mode)
local msg="$1" load_functions
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
}
function msg_error() { echo -e "${RD}$1${CL}"; }
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
# Supported: Proxmox VE 8.0.x 8.9.x and 9.09.x
pve_check() {
local PVE_VER
PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
# Check for Proxmox VE 8.x: allow 8.08.9
if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
local MINOR="${BASH_REMATCH[1]}"
if ((MINOR < 0 || MINOR > 9)); then
msg_error "This version of Proxmox VE is not supported."
msg_error "Supported: Proxmox VE version 8.0 8.9"
exit 105
fi
return 0
fi
# Check for Proxmox VE 9.x: allow 9.09.x
if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
return 0
fi
# All other unsupported versions
msg_error "This version of Proxmox VE is not supported."
msg_error "Supported versions: Proxmox VE 8.0 8.9 or 9.09.x"
exit 105
}
detect_codename() { detect_codename() {
source /etc/os-release source /etc/os-release
@@ -83,7 +40,7 @@ detect_codename() {
CODENAME="${VERSION_CODENAME:-}" CODENAME="${VERSION_CODENAME:-}"
if [[ -z "$CODENAME" ]]; then if [[ -z "$CODENAME" ]]; then
msg_error "Could not detect Debian codename." msg_error "Could not detect Debian codename."
exit 71 exit 238
fi fi
echo "$CODENAME" echo "$CODENAME"
} }
@@ -97,9 +54,8 @@ get_latest_repo_pkg() {
} }
install() { install() {
header_info
while true; do while true; do
read -p "Are you sure you want to install NetData on Proxmox VE host. Proceed(y/n)? " yn read -r -p "Are you sure you want to install ${APP} on Proxmox VE host. Proceed(y/n)? " yn
case $yn in case $yn in
[Yy]*) break ;; [Yy]*) break ;;
[Nn]*) exit ;; [Nn]*) exit ;;
@@ -107,56 +63,51 @@ install() {
esac esac
done done
read -r -p "Verbose mode? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] && STD="" || STD="silent"
CODENAME=$(detect_codename) CODENAME=$(detect_codename)
REPO_URL="https://repo.netdata.cloud/repos/repoconfig/debian/${CODENAME}/" REPO_URL="https://repo.netdata.cloud/repos/repoconfig/debian/${CODENAME}/"
msg_info "Setting up repository" msg_info "Setting up repository"
$STD apt-get install -y debian-keyring $STD apt install -y debian-keyring
PKG=$(get_latest_repo_pkg "$REPO_URL") PKG=$(get_latest_repo_pkg "$REPO_URL")
if [[ -z "$PKG" ]]; then if [[ -z "$PKG" ]]; then
msg_error "Could not find netdata-repo package for Debian $CODENAME" msg_error "Could not find netdata-repo package for Debian $CODENAME"
exit 237 exit 237
fi fi
curl -fsSL "${REPO_URL}${PKG}" -o "$PKG" TMP_DEB=$(mktemp --suffix=.deb)
$STD dpkg -i "$PKG" curl -fsSL "${REPO_URL}${PKG}" -o "$TMP_DEB"
rm -f "$PKG" $STD dpkg -i "$TMP_DEB"
rm -f "$TMP_DEB"
msg_ok "Set up repository" msg_ok "Set up repository"
msg_info "Installing Netdata" msg_info "Installing ${APP}"
$STD apt-get update $STD apt update
$STD apt-get install -y netdata $STD apt install -y netdata
msg_ok "Installed Netdata" msg_ok "Installed ${APP}"
msg_ok "Completed successfully!\n" msg_ok "Completed successfully!\n"
echo -e "\n Netdata should be reachable at${BL} http://$(hostname -I | awk '{print $1}'):19999 ${CL}\n" get_lxc_ip
echo -e "\n${APP} should be reachable at${BL} http://${LOCAL_IP}:19999 ${CL}\n"
} }
uninstall() { uninstall() {
header_info msg_info "Uninstalling ${APP}"
read -r -p "Verbose mode? <y/N> " prompt
[[ ${prompt,,} =~ ^(y|yes)$ ]] && STD="" || STD="silent"
msg_info "Uninstalling Netdata"
systemctl stop netdata || true systemctl stop netdata || true
rm -rf /var/log/netdata /var/lib/netdata /var/cache/netdata /etc/netdata/go.d rm -rf /var/log/netdata /var/lib/netdata /var/cache/netdata /etc/netdata/go.d
rm -rf /etc/apt/trusted.gpg.d/netdata-archive-keyring.gpg /etc/apt/sources.list.d/netdata.list rm -rf /etc/apt/trusted.gpg.d/netdata-archive-keyring.gpg /etc/apt/sources.list.d/netdata.list
$STD apt-get remove --purge -y netdata netdata-repo $STD apt remove --purge -y netdata netdata-repo
systemctl daemon-reload systemctl daemon-reload
$STD apt autoremove -y $STD apt autoremove -y
$STD userdel netdata || true $STD userdel netdata || true
msg_ok "Uninstalled Netdata" msg_ok "Uninstalled ${APP}"
msg_ok "Completed successfully!\n" msg_ok "Completed successfully!\n"
} }
header_info header_info
pve_check require_pve_host
OPTIONS=(Install "Install NetData on Proxmox VE" OPTIONS=(Install "Install ${APP} on Proxmox VE"
Uninstall "Uninstall NetData from Proxmox VE") Uninstall "Uninstall ${APP} from Proxmox VE")
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NetData" \ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP}" \
--menu "Select an option:" 10 58 2 "${OPTIONS[@]}" 3>&1 1>&2 2>&3) --menu "Select an option:" 10 58 2 "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
case $CHOICE in case $CHOICE in
+8 -10
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -20,6 +25,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "nextcloud-exp
set -Eeuo pipefail set -Eeuo pipefail
trap 'error_handler' ERR trap 'error_handler' ERR
load_functions load_functions
require_debian_like
# ============================================================================== # ==============================================================================
# CONFIGURATION # CONFIGURATION
@@ -31,14 +37,6 @@ BINARY_PATH="/usr/bin/nextcloud-exporter"
CONFIG_PATH="/etc/nextcloud-exporter.env" CONFIG_PATH="/etc/nextcloud-exporter.env"
SERVICE_PATH="/etc/systemd/system/nextcloud-exporter.service" SERVICE_PATH="/etc/systemd/system/nextcloud-exporter.service"
# ==============================================================================
# OS DETECTION
# ==============================================================================
if ! grep -qE 'ID=debian|ID=ubuntu' /etc/os-release 2>/dev/null; then
echo -e "${CROSS} Unsupported OS detected. This script only supports Debian and Ubuntu."
exit 238
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
+112 -48
View File
@@ -5,67 +5,131 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://docs.olivetin.app/ | Github: https://github.com/OliveTin/OliveTin # Source: https://docs.olivetin.app/ | Github: https://github.com/OliveTin/OliveTin
function header_info {
clear
cat <<"EOF"
____ ___ _______
/ __ \/ (_) _____/_ __(_)___
/ / / / / / | / / _ \/ / / / __ \
/ /_/ / / /| |/ / __/ / / / / / /
\____/_/_/ |___/\___/_/ /_/_/ /_/
EOF
}
IP=$(hostname -I | awk '{print $1}')
YW=$(echo "\033[33m")
BL=$(echo "\033[36m")
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
BFR="\\r\\033[K"
HOLD="-"
CM="${GN}${CL}"
APP="OliveTin" APP="OliveTin"
hostname="$(hostname)" APP_TYPE="addon"
# Telemetry if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "olivetin" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "olivetin" "addon"
set-e # Enable error handling
set -Eeuo pipefail
trap 'error_handler' ERR
# Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
require_debian_like
header_info header_info
ensure_usr_local_bin_persist
get_lxc_ip
IP="$LOCAL_IP"
# ==============================================================================
# UNINSTALL
# ==============================================================================
function uninstall() {
msg_info "Uninstalling ${APP}"
systemctl disable --now OliveTin &>/dev/null || true
$STD apt remove -y olivetin
rm -f "$HOME/.olivetin"
msg_ok "${APP} has been uninstalled"
}
# ==============================================================================
# UPDATE
# ==============================================================================
function update() {
if check_for_gh_release "olivetin" "OliveTin/OliveTin"; then
msg_info "Updating ${APP}"
fetch_and_deploy_gh_release "olivetin" "OliveTin/OliveTin" "binary"
systemctl restart OliveTin
msg_ok "Updated successfully!"
exit
fi
}
# ==============================================================================
# INSTALL
# ==============================================================================
function install() {
msg_info "Installing ${APP}"
fetch_and_deploy_gh_release "olivetin" "OliveTin/OliveTin" "binary"
systemctl enable --now OliveTin &>/dev/null
msg_ok "Installed ${APP}"
msg_info "Creating update script"
ensure_usr_local_bin_persist
cat <<'EOF' >/usr/local/bin/update_olivetin
#!/usr/bin/env bash
# OliveTin Update Script
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/olivetin.sh)"
EOF
chmod +x /usr/local/bin/update_olivetin
msg_ok "Created update script (/usr/local/bin/update_olivetin)"
msg_ok "Completed successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:1337${CL} \n"
}
# ==============================================================================
# MAIN
# ==============================================================================
# Handle type=update (called from update script)
if [[ "${type:-}" == "update" ]]; then
if command -v olivetin &>/dev/null; then
update
else
msg_error "${APP} is not installed. Nothing to update."
exit 233
fi
exit 0
fi
if [[ -d "$HOME" && -f "$HOME/.olivetin" ]] || command -v olivetin &>/dev/null; then
msg_warn "${APP} is already installed."
echo -n "${TAB}Uninstall ${APP}? (y/N): "
read -r uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
uninstall
exit 0
fi
echo -n "${TAB}Update ${APP}? (y/N): "
read -r update_prompt
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
update
exit 0
fi
msg_warn "No action selected. Exiting."
exit 0
fi
while true; do while true; do
read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn echo -n "${TAB}This will Install ${APP}. Proceed (y/n)? "
read -r yn
case $yn in case $yn in
[Yy]*) break ;; [Yy]*) break ;;
[Nn]*) exit ;; [Nn]*) exit ;;
*) echo "Please answer yes or no." ;; *) echo "Please answer yes or no." ;;
esac esac
done done
unset _HEADER_SHOWN
header_info header_info
function msg_info() { install
local msg="$1"
echo -ne " ${HOLD} ${YW}${msg}..."
}
function msg_ok() {
local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
}
msg_info "Installing ${APP}"
if ! command -v curl &>/dev/null; then
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
curl -fsSL "https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.deb" -o $(basename "https://github.com/OliveTin/OliveTin/releases/latest/download/OliveTin_linux_amd64.deb")
dpkg -i OliveTin_linux_amd64.deb &>/dev/null
systemctl enable --now OliveTin &>/dev/null
rm OliveTin_linux_amd64.deb
msg_ok "Installed ${APP} on $hostname"
msg_ok "Completed successfully!\n"
echo -e "${APP} should be reachable by going to the following URL.
${BL}http://$IP:1337${CL} \n"
+65 -65
View File
@@ -5,39 +5,36 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.phpmyadmin.net/ | Github: https://github.com/phpmyadmin/phpmyadmin # Source: https://www.phpmyadmin.net/ | Github: https://github.com/phpmyadmin/phpmyadmin
function header_info {
clear
cat <<"EOF"
____ __ __ ___ ___ __ _
/ __ \/ /_ ____ / |/ /_ __/ | ____/ /___ ___ (_)___
/ /_/ / __ \/ __ \/ /|_/ / / / / /| |/ __ / __ `__ \/ / __ \
/ ____/ / / / /_/ / / / / /_/ / ___ / /_/ / / / / / / / / / /
/_/ /_/ /_/ .___/_/ /_/\__, /_/ |_\__,_/_/ /_/ /_/_/_/ /_/
/_/ /____/
EOF
}
YW=$(echo "\033[33m")
GN=$(echo "\033[1;92m")
RD=$(echo "\033[01;31m")
BL=$(echo "\033[36m")
CL=$(echo "\033[m")
CM="${GN}✔️${CL}"
CROSS="${RD}✖️${CL}"
INFO="${BL}${CL}"
APP="phpMyAdmin" APP="phpMyAdmin"
APP_TYPE="addon"
INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin" INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin"
INSTALL_DIR_ALPINE="/usr/share/phpmyadmin" INSTALL_DIR_ALPINE="/usr/share/phpmyadmin"
# Telemetry if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "phpmyadmin" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "phpmyadmin" "addon"
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}') # Enable error handling
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1) set -Eeuo pipefail
[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}') trap 'error_handler' ERR
[[ -z "$IP" ]] && IP="127.0.0.1"
# Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
get_lxc_ip
IP="$LOCAL_IP"
# Detect OS # Detect OS
if [[ -f "/etc/alpine-release" ]]; then if [[ -f "/etc/alpine-release" ]]; then
@@ -47,24 +44,20 @@ if [[ -f "/etc/alpine-release" ]]; then
INSTALL_DIR="$INSTALL_DIR_ALPINE" INSTALL_DIR="$INSTALL_DIR_ALPINE"
elif [[ -f "/etc/debian_version" ]]; then elif [[ -f "/etc/debian_version" ]]; then
OS="Debian" OS="Debian"
PKG_MANAGER_INSTALL="apt-get install -y" PKG_MANAGER_INSTALL="apt install -y"
PKG_QUERY="dpkg -l" PKG_QUERY="dpkg -l"
INSTALL_DIR="$INSTALL_DIR_DEBIAN" INSTALL_DIR="$INSTALL_DIR_DEBIAN"
else else
echo -e "${CROSS} Unsupported OS detected. Exiting." msg_error "Unsupported OS detected. Exiting."
exit 238 exit 238
fi fi
header_info header_info
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
function msg_ok() { echo -e "${CM} ${GN}${1}${CL}"; }
function msg_error() { echo -e "${CROSS} ${RD}${1}${CL}"; }
function check_internet() { function check_internet() {
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
apt-get update >/dev/null 2>&1 $STD apt update
apt-get install -y curl >/dev/null 2>&1 $STD apt install -y curl
fi fi
msg_info "Checking Internet connectivity to GitHub" msg_info "Checking Internet connectivity to GitHub"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://github.com) HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://github.com)
@@ -103,7 +96,7 @@ function install_php_and_modules() {
done done
if [[ ${#MISSING_PACKAGES[@]} -gt 0 ]]; then if [[ ${#MISSING_PACKAGES[@]} -gt 0 ]]; then
msg_info "Installing missing PHP packages: ${MISSING_PACKAGES[*]}" msg_info "Installing missing PHP packages: ${MISSING_PACKAGES[*]}"
if ! apt-get update &>/dev/null || ! apt-get install -y "${MISSING_PACKAGES[@]}" &>/dev/null; then if ! $STD apt update || ! $STD apt install -y "${MISSING_PACKAGES[@]}"; then
msg_error "Failed to install required PHP modules. Exiting." msg_error "Failed to install required PHP modules. Exiting."
exit 237 exit 237
fi fi
@@ -113,30 +106,41 @@ function install_php_and_modules() {
fi fi
else else
msg_info "Installing Lighttpd and PHP for Alpine" msg_info "Installing Lighttpd and PHP for Alpine"
$PKG_MANAGER_INSTALL lighttpd php php-fpm php-session php-json php-mysqli curl tar openssl &>/dev/null $STD $PKG_MANAGER_INSTALL \
lighttpd \
php \
php-fpm \
php-session \
php-json \
php-mysqli \
curl \
tar \
openssl
msg_ok "Installed Lighttpd and PHP" msg_ok "Installed Lighttpd and PHP"
fi fi
} }
function install_phpmyadmin() { function install_phpmyadmin() {
msg_info "Fetching latest phpMyAdmin release from GitHub" msg_info "Fetching latest phpMyAdmin release from GitHub"
LATEST_VERSION_RAW=$(curl -s https://api.github.com/repos/phpmyadmin/phpmyadmin/releases/latest | grep tag_name | cut -d '"' -f4) LATEST_VERSION_RAW=$(get_latest_github_release "phpmyadmin/phpmyadmin" false) || true
LATEST_VERSION=$(echo "$LATEST_VERSION_RAW" | sed -e 's/^RELEASE_//' -e 's/_/./g') LATEST_VERSION=$(echo "$LATEST_VERSION_RAW" | sed -e 's/^RELEASE_//' -e 's/_/./g')
if [[ -z "$LATEST_VERSION" ]]; then if [[ -z "$LATEST_VERSION" ]]; then
msg_error "Could not determine latest phpMyAdmin version from GitHub falling back to 5.2.2" msg_error "Could not determine latest phpMyAdmin version from GitHub – falling back to 5.2.2"
LATEST_VERSION="RELEASE_5_2_2" LATEST_VERSION="5.2.2"
fi fi
msg_ok "Latest version: $LATEST_VERSION" msg_ok "Latest version: $LATEST_VERSION"
TARBALL_URL="https://files.phpmyadmin.net/phpMyAdmin/${LATEST_VERSION}/phpMyAdmin-${LATEST_VERSION}-all-languages.tar.gz" TARBALL_URL="https://files.phpmyadmin.net/phpMyAdmin/${LATEST_VERSION}/phpMyAdmin-${LATEST_VERSION}-all-languages.tar.gz"
msg_info "Downloading ${TARBALL_URL}" msg_info "Downloading ${TARBALL_URL}"
if ! curl -fsSL "$TARBALL_URL" -o /tmp/phpmyadmin.tar.gz; then tarball=$(mktemp)
if ! curl -fsSL "$TARBALL_URL" -o "$tarball"; then
msg_error "Download failed: $TARBALL_URL" msg_error "Download failed: $TARBALL_URL"
exit 115 exit 115
fi fi
mkdir -p "$INSTALL_DIR" mkdir -p "$INSTALL_DIR"
tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$INSTALL_DIR" tar xf "$tarball" --strip-components=1 -C "$INSTALL_DIR"
rm -f "$tarball"
} }
function configure_phpmyadmin() { function configure_phpmyadmin() {
@@ -223,47 +227,43 @@ function uninstall_phpmyadmin() {
function update_phpmyadmin() { function update_phpmyadmin() {
msg_info "Fetching latest phpMyAdmin release from GitHub" msg_info "Fetching latest phpMyAdmin release from GitHub"
LATEST_VERSION_RAW=$(curl -s https://api.github.com/repos/phpmyadmin/phpmyadmin/releases/latest | grep tag_name | cut -d '"' -f4) LATEST_VERSION_RAW=$(get_latest_github_release "phpmyadmin/phpmyadmin" false) || true
LATEST_VERSION=$(echo "$LATEST_VERSION_RAW" | sed -e 's/^RELEASE_//' -e 's/_/./g') LATEST_VERSION=$(echo "$LATEST_VERSION_RAW" | sed -e 's/^RELEASE_//' -e 's/_/./g')
if [[ -z "$LATEST_VERSION" ]]; then if [[ -z "$LATEST_VERSION" ]]; then
msg_error "Could not determine latest phpMyAdmin version from GitHub falling back to 5.2.2" msg_error "Could not determine latest phpMyAdmin version from GitHub – falling back to 5.2.2"
LATEST_VERSION="5.2.2" LATEST_VERSION="5.2.2"
fi fi
msg_ok "Latest version: $LATEST_VERSION" msg_ok "Latest version: $LATEST_VERSION"
TARBALL_URL="https://files.phpmyadmin.net/phpMyAdmin/${LATEST_VERSION}/phpMyAdmin-${LATEST_VERSION}-all-languages.tar.gz" TARBALL_URL="https://files.phpmyadmin.net/phpMyAdmin/${LATEST_VERSION}/phpMyAdmin-${LATEST_VERSION}-all-languages.tar.gz"
msg_info "Downloading ${TARBALL_URL}" msg_info "Downloading ${TARBALL_URL}"
tarball=$(mktemp)
if ! curl -fsSL "$TARBALL_URL" -o /tmp/phpmyadmin.tar.gz; then if ! curl -fsSL "$TARBALL_URL" -o "$tarball"; then
msg_error "Download failed: $TARBALL_URL" msg_error "Download failed: $TARBALL_URL"
exit 115 exit 115
fi fi
BACKUP_DIR="/tmp/phpmyadmin-backup-$(date +%Y%m%d-%H%M%S)" BACKUP_DIR="/opt/phpmyadmin_backup"
mkdir -p "$BACKUP_DIR" create_backup \
BACKUP_ITEMS=("config.inc.php" "upload" "save" "tmp" "themes") "$INSTALL_DIR/config.inc.php" \
"$INSTALL_DIR/upload" \
"$INSTALL_DIR/save" \
"$INSTALL_DIR/tmp" \
"$INSTALL_DIR/themes"
msg_info "Backing up existing phpMyAdmin data" tar xf "$tarball" --strip-components=1 -C "$INSTALL_DIR"
for item in "${BACKUP_ITEMS[@]}"; do rm -f "$tarball"
[[ -e "$INSTALL_DIR/$item" ]] && cp -a "$INSTALL_DIR/$item" "$BACKUP_DIR/" && echo " ↪︎ $item"
done
msg_ok "Backup completed: $BACKUP_DIR"
tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$INSTALL_DIR"
msg_ok "Extracted phpMyAdmin $LATEST_VERSION" msg_ok "Extracted phpMyAdmin $LATEST_VERSION"
msg_info "Restoring preserved files" restore_backup
for item in "${BACKUP_ITEMS[@]}"; do
[[ -e "$BACKUP_DIR/$item" ]] && cp -a "$BACKUP_DIR/$item" "$INSTALL_DIR/" && echo " ↪︎ $item restored"
done
msg_ok "Restoration completed"
configure_phpmyadmin configure_phpmyadmin
} }
if is_phpmyadmin_installed; then if is_phpmyadmin_installed; then
echo -e "${YW}⚠️ ${APP} is already installed at ${INSTALL_DIR}.${CL}" msg_warn "${APP} is already installed at ${INSTALL_DIR}."
read -r -p "Would you like to Update (1), Uninstall (2) or Cancel (3)? [1/2/3]: " action read -r -p "Would you like to Update (1), Uninstall (2) or Cancel (3)? [1/2/3]: " action
action="${action//[[:space:]]/}" action="${action//[[:space:]]/}"
case "$action" in case "$action" in
@@ -275,11 +275,11 @@ if is_phpmyadmin_installed; then
uninstall_phpmyadmin uninstall_phpmyadmin
;; ;;
3) 3)
echo -e "${YW}⚠️ Action cancelled. Exiting.${CL}" msg_warn "Action cancelled. Exiting."
exit 0 exit 0
;; ;;
*) *)
echo -e "${YW}⚠️ Invalid input. Exiting.${CL}" msg_warn "Invalid input. Exiting."
exit 112 exit 112
;; ;;
esac esac
@@ -292,12 +292,12 @@ else
install_phpmyadmin install_phpmyadmin
configure_phpmyadmin configure_phpmyadmin
if [[ "$OS" == "Debian" ]]; then if [[ "$OS" == "Debian" ]]; then
echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://${IP}/phpMyAdmin${CL}" msg_ok "${APP} is reachable at: ${BL}http://${IP}/phpMyAdmin${CL}"
else else
echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://${IP}/${CL}" msg_ok "${APP} is reachable at: ${BL}http://${IP}/${CL}"
fi fi
else else
echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" msg_warn "Installation skipped. Exiting."
exit 0 exit 0
fi fi
fi fi
+7 -2
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -5,6 +5,16 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/hansmi/prometheus-paperless-exporter # Source: https://github.com/hansmi/prometheus-paperless-exporter
if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
if [[ -f /etc/alpine-release ]]; then
apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
@@ -15,6 +25,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "prometheus-pa
set -Eeuo pipefail set -Eeuo pipefail
trap 'error_handler' ERR trap 'error_handler' ERR
load_functions load_functions
require_debian_like
# ============================================================================== # ==============================================================================
# CONFIGURATION # CONFIGURATION
@@ -27,14 +38,6 @@ CONFIG_PATH="/etc/prometheus-paperless-ngx-exporter/config.env"
SERVICE_PATH="/etc/systemd/system/prometheus-paperless-ngx-exporter.service" SERVICE_PATH="/etc/systemd/system/prometheus-paperless-ngx-exporter.service"
AUTH_TOKEN_FILE="/etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file" AUTH_TOKEN_FILE="/etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file"
# ==============================================================================
# OS DETECTION
# ==============================================================================
if ! grep -qE 'ID=debian|ID=ubuntu' /etc/os-release 2>/dev/null; then
echo -e "${CROSS} Unsupported OS detected. This script only supports Debian and Ubuntu."
exit 238
fi
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
+127 -80
View File
@@ -5,77 +5,123 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://pyenv.run/ | Github: https://github.com/pyenv/pyenv # Source: https://pyenv.run/ | Github: https://github.com/pyenv/pyenv
set -e APP="pyenv"
YW=$(echo "\033[33m") APP_TYPE="addon"
RD=$(echo "\033[01;31m")
BL=$(echo "\033[36m")
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
CM="${GN}${CL}"
CROSS="${RD}${CL}"
BFR="\\r\\033[K"
HOLD="-"
function msg_info() {
local msg="$1"
echo -ne " ${HOLD} ${YW}${msg}..."
}
function msg_ok() { if ! command -v curl &>/dev/null; then
local msg="$1" printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" if [[ -f /etc/alpine-release ]]; then
} apk update >/dev/null 2>&1
function msg_error() { apk add --no-cache curl >/dev/null 2>&1
local msg="$1" else
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" apt-get update >/dev/null 2>&1
} apt-get install -y curl >/dev/null 2>&1
fi
# Telemetry fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pyenv" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pyenv" "addon"
if command -v pveversion >/dev/null 2>&1; then # Enable error handling
msg_error "Can't Install on Proxmox " set -Eeuo pipefail
exit trap 'error_handler' ERR
fi
msg_info "Installing pyenv"
apt-get install -y \
make \
build-essential \
libjpeg-dev \
libpcap-dev \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
autoconf \
git \
curl \
sudo \
llvm \
libncursesw5-dev \
xz-utils \
tk-dev \
libxml2-dev \
libxmlsec1-dev \
libffi-dev \
libopenjp2-7 \
libtiff5 \
libturbojpeg0-dev \
liblzma-dev &>/dev/null
git clone https://github.com/pyenv/pyenv.git ~/.pyenv &>/dev/null # Initialize all core functions (colors, formatting, icons, STD mode)
set +e load_functions
echo 'export PYENV_ROOT="$HOME/.pyenv"' >>~/.bashrc require_debian_like
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >>~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\nfi' >>~/.bashrc header_info
msg_ok "Installed pyenv" confirm_not_pve_host
. ~/.bashrc get_lxc_ip
set -e export PYENV_ROOT="${HOME}/.pyenv"
msg_info "Installing Python 3.11.1"
pyenv install 3.11.1 &>/dev/null msg_info "Installing dependencies"
pyenv global 3.11.1 $STD apt update
msg_ok "Installed Python 3.11.1"
# Official Python build dependencies for Debian/Ubuntu
# https://github.com/pyenv/pyenv/wiki#suggested-build-environment
PYENV_DEPS=(
build-essential
libssl-dev
zlib1g-dev
libbz2-dev
libreadline-dev
libsqlite3-dev
curl
git
xz-utils
tk-dev
libxml2-dev
libxmlsec1-dev
libffi-dev
liblzma-dev
)
# Extras for the optional Home Assistant / ESPHome installs below (Pillow et al.)
PYENV_DEPS+=(make llvm libjpeg-dev libpcap-dev libopenjp2-7)
# These were renamed between releases (libtiff5 is gone on Debian 13 / Ubuntu 24.04),
# so take whichever variant the distro actually ships
for candidates in "libncurses-dev libncursesw5-dev" "libtiff-dev libtiff5-dev" "libturbojpeg0-dev libturbojpeg-dev"; do
for pkg in $candidates; do
if apt-cache show "$pkg" &>/dev/null; then
PYENV_DEPS+=("$pkg")
break
fi
done
done
install_packages_with_retry "${PYENV_DEPS[@]}"
msg_ok "Installed dependencies"
# The upstream installer refuses to run when PYENV_ROOT already exists
if [[ -d "$PYENV_ROOT" ]]; then
msg_ok "${APP} is already installed at ${PYENV_ROOT}"
else
msg_info "Installing ${APP}"
# Official installer - also sets up the pyenv-doctor/update/virtualenv plugins
$STD bash <(curl -fsSL https://pyenv.run)
msg_ok "Installed ${APP}"
fi
# Shell setup per upstream docs. On Debian-based systems ~/.profile prepends the
# per-user bin dirs *after* sourcing ~/.bashrc, so both files need the init call.
msg_info "Configuring shell environment"
for rc in "${HOME}/.bashrc" "${HOME}/.profile"; do
[[ -f "$rc" ]] || touch "$rc"
if ! grep -q 'PYENV_ROOT' "$rc"; then
cat >>"$rc" <<'EOF'
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"
EOF
fi
done
msg_ok "Configured shell environment"
# Activate pyenv for the remainder of this script
export PATH="${PYENV_ROOT}/bin:$PATH"
set +Eeuo pipefail
eval "$(pyenv init - bash)"
set -Eeuo pipefail
# pyenv resolves a version prefix to the latest release in that line, so pinning
# a patch level (the old 3.11.1) is neither needed nor portable across distros.
#
# 3.14 is the only series all three optional payloads below agree on:
# Home Assistant Core >= 3.14.2
# ESPHome >= 3.12.0, < 3.15
# python-matter-server >= 3.12
# (3.11 has been security-fix-only since 2024 and is EOL in 10/2027.)
PYTHON_SERIES="3.14"
msg_info "Installing Python ${PYTHON_SERIES} (latest patch release)"
$STD pyenv install -s "$PYTHON_SERIES"
pyenv global "$PYTHON_SERIES"
msg_ok "Installed Python $(pyenv version-name)"
read -r -p "Would you like to install Home Assistant Beta? <y/N> " prompt read -r -p "Would you like to install Home Assistant Beta? <y/N> " prompt
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Installing Home Assistant Beta" msg_info "Installing Home Assistant Beta"
@@ -95,13 +141,13 @@ EOF
cd /srv/homeassistant cd /srv/homeassistant
python3 -m venv . python3 -m venv .
source bin/activate source bin/activate
python3 -m pip install wheel &>/dev/null $STD python3 -m pip install wheel
pip3 install --upgrade pip &>/dev/null $STD pip3 install --upgrade pip
pip3 install psycopg2-binary &>/dev/null $STD pip3 install psycopg2-binary
pip3 install --pre homeassistant &>/dev/null $STD pip3 install --pre homeassistant
systemctl enable homeassistant &>/dev/null systemctl enable homeassistant &>/dev/null
msg_ok "Installed Home Assistant Beta" msg_ok "Installed Home Assistant Beta"
echo -e " Go to $(hostname -I | awk '{print $1}'):8123" echo -e " Go to ${LOCAL_IP}:8123"
hass hass
fi fi
@@ -112,9 +158,9 @@ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
cd /srv/esphome cd /srv/esphome
python3 -m venv . python3 -m venv .
source bin/activate source bin/activate
python3 -m pip install wheel &>/dev/null $STD python3 -m pip install wheel
pip3 install --upgrade pip &>/dev/null $STD pip3 install --upgrade pip
pip3 install --pre esphome &>/dev/null $STD pip3 install --pre esphome
cat <<EOF >/srv/esphome/start.sh cat <<EOF >/srv/esphome/start.sh
#!/usr/bin/env bash #!/usr/bin/env bash
@@ -143,25 +189,26 @@ WantedBy=multi-user.target
EOF EOF
systemctl enable --now esphomedashboard &>/dev/null systemctl enable --now esphomedashboard &>/dev/null
msg_ok "Installed ESPHome Beta" msg_ok "Installed ESPHome Beta"
echo -e " Go to $(hostname -I | awk '{print $1}'):6052" echo -e " Go to ${LOCAL_IP}:6052"
exec $SHELL exec $SHELL
fi fi
read -r -p "Would you like to install Matter-Server (Beta)? <y/N> " prompt read -r -p "Would you like to install Matter-Server (Beta)? <y/N> " prompt
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
msg_info "Installing Matter Server" msg_info "Installing Matter Server"
apt-get install -y \ $STD apt install -y \
libcairo2-dev \ libcairo2-dev \
libjpeg62-turbo-dev \ libjpeg62-turbo-dev \
libgirepository1.0-dev \ libgirepository1.0-dev \
libpango1.0-dev \ libpango1.0-dev \
libgif-dev \ libgif-dev \
g++ &>/dev/null g++
python3 -m pip install wheel $STD python3 -m pip install wheel
pip3 install --upgrade pip $STD pip3 install --upgrade pip
pip install python-matter-server[server] $STD pip install python-matter-server[server]
msg_ok "Installed Matter Server" msg_ok "Installed Matter Server"
echo -e "Start server > python -m matter_server.server" echo -e "Start server > python -m matter_server.server"
fi fi
msg_ok "\nFinished\n" msg_ok "\nFinished\n"
exec $SHELL exec $SHELL
+7 -2
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
+3 -56
View File
@@ -35,55 +35,6 @@ DEFAULT_PORT=80
# Initialize all core functions (colors, formatting, icons, STD mode) # Initialize all core functions (colors, formatting, icons, STD mode)
load_functions load_functions
# ==============================================================================
# PROXMOX HOST CHECK
# ==============================================================================
function check_proxmox_host() {
if command -v pveversion &>/dev/null; then
msg_error "Running on the Proxmox host is NOT recommended!"
msg_error "This should be executed inside an LXC container."
echo ""
echo -n "${TAB}Continue anyway? (y/N): "
read -r confirm
if [[ ! "${confirm,,}" =~ ^(y|yes)$ ]]; then
msg_warn "Aborted. Please run this inside an LXC container."
exit 0
fi
msg_warn "Proceeding on Proxmox host at your own risk!"
fi
}
# ==============================================================================
# CHECK / INSTALL DOCKER
# ==============================================================================
function check_or_install_docker() {
if command -v docker &>/dev/null; then
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') is available"
if docker compose version &>/dev/null; then
msg_ok "Docker Compose is available"
else
msg_error "Docker Compose plugin is not available. Please install it."
exit 10
fi
return
fi
msg_warn "Docker is not installed."
echo -n "${TAB}Install Docker now? (y/N): "
read -r install_docker_prompt
if [[ ! "${install_docker_prompt,,}" =~ ^(y|yes)$ ]]; then
msg_error "Docker is required for ${APP}. Exiting."
exit 10
fi
msg_info "Installing Docker"
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
mkdir -p "$(dirname "$DOCKER_CONFIG_PATH")"
echo -e '{\n "log-driver": "journald"\n}' >"$DOCKER_CONFIG_PATH"
$STD sh <(curl -fsSL https://get.docker.com)
msg_ok "Installed Docker"
}
# ============================================================================== # ==============================================================================
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
@@ -124,7 +75,7 @@ function update() {
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
check_or_install_docker ensure_docker
msg_info "Installing dependencies" msg_info "Installing dependencies"
$STD apt-get update $STD apt-get update
@@ -174,13 +125,9 @@ if [[ "${type:-}" == "update" ]]; then
exit 0 exit 0
fi fi
if [[ -f /etc/alpine-release ]]; then
msg_error "${APP} does not support Alpine Linux. Please use a Debian or Ubuntu based LXC."
exit 238
fi
header_info header_info
check_proxmox_host require_debian_like
confirm_not_pve_host
get_lxc_ip get_lxc_ip
# Check if already installed # Check if already installed
+8 -10
View File
@@ -7,8 +7,13 @@
if ! command -v curl &>/dev/null; then if ! command -v curl &>/dev/null; then
printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2 printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
apt-get update >/dev/null 2>&1 if [[ -f /etc/alpine-release ]]; then
apt-get install -y curl >/dev/null 2>&1 apk update >/dev/null 2>&1
apk add --no-cache curl >/dev/null 2>&1
else
apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1
fi
fi fi
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
@@ -20,6 +25,7 @@ declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "sparkyfitness
set -Eeuo pipefail set -Eeuo pipefail
trap 'error_handler' ERR trap 'error_handler' ERR
load_functions load_functions
require_debian_like
# ============================================================================== # ==============================================================================
# CONFIGURATION # CONFIGURATION
@@ -31,14 +37,6 @@ CONFIG_PATH="/etc/sparkyfitness-garmin/.env"
SERVICE_PATH="/etc/systemd/system/sparkyfitness-garmin.service" SERVICE_PATH="/etc/systemd/system/sparkyfitness-garmin.service"
DEFAULT_PORT=8000 DEFAULT_PORT=8000
# ==============================================================================
# OS DETECTION
# ==============================================================================
if ! grep -qE 'ID=debian|ID=ubuntu' /etc/os-release 2>/dev/null; then
echo -e "${CROSS} Unsupported OS detected. This script only supports Debian and Ubuntu."
exit 238
fi
# ============================================================================== # ==============================================================================
# SparkyFitness LXC DETECTION # SparkyFitness LXC DETECTION
# ============================================================================== # ==============================================================================
+38 -46
View File
@@ -5,61 +5,53 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.webmin.com/ | Github: https://github.com/webmin/webmin # Source: https://www.webmin.com/ | Github: https://github.com/webmin/webmin
function header_info { APP="Webmin"
clear APP_TYPE="addon"
cat <<"EOF"
_ __ __ _
| | /| / /__ / / __ _ (_)__
| |/ |/ / -_) _ \/ ' \/ / _ \
|__/|__/\__/_.__/_/_/_/_/_//_/
EOF if ! command -v curl &>/dev/null; then
} printf "\r\e[2K%b" '\033[93m Setup Source \033[m' >&2
set -eEuo pipefail if [[ -f /etc/alpine-release ]]; then
YW=$(echo "\033[33m") apk update >/dev/null 2>&1
BL=$(echo "\033[36m") apk add --no-cache curl >/dev/null 2>&1
BGN=$(echo "\033[4;92m") else
GN=$(echo "\033[1;92m") apt-get update >/dev/null 2>&1
DGN=$(echo "\033[32m") apt-get install -y curl >/dev/null 2>&1
CL=$(echo "\033[m") fi
CM="${GN}✓${CL}" fi
BFR="\\r\\033[K" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
HOLD="-" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
msg_info() {
local msg="$1"
echo -ne " ${HOLD} ${YW}${msg}..."
}
msg_ok() {
local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
}
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "webmin" "addon" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "webmin" "addon"
# Enable error handling
set -Eeuo pipefail
trap 'error_handler' ERR
# Initialize all core functions (colors, formatting, icons, STD mode)
load_functions
require_debian_like
header_info header_info
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58 whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} Installer" --yesno "This Will Install ${APP} on this LXC Container. Proceed?" 10 58
msg_info "Installing Prerequisites" msg_info "Installing Prerequisites"
apt update &>/dev/null $STD apt update
apt-get -y install libnet-ssleay-perl libauthen-pam-perl libio-pty-perl unzip shared-mime-info curl &>/dev/null $STD apt install -y \
libnet-ssleay-perl \
libauthen-pam-perl \
libio-pty-perl \
unzip \
shared-mime-info \
curl
msg_ok "Installed Prerequisites" msg_ok "Installed Prerequisites"
LATEST=$(curl -fsSL https://api.github.com/repos/webmin/webmin/releases/latest | grep '"tag_name":' | cut -d'"' -f4) msg_info "Installing ${APP}"
fetch_and_deploy_gh_release "webmin" "webmin/webmin" "binary" "latest" "/opt/webmin" "webmin_*_all.deb"
msg_info "Downloading Webmin"
curl -fsSL "https://github.com/webmin/webmin/releases/download/$LATEST/webmin_${LATEST}_all.deb" -o $(basename "https://github.com/webmin/webmin/releases/download/$LATEST/webmin_${LATEST}_all.deb")
msg_ok "Downloaded Webmin"
msg_info "Installing Webmin"
dpkg -i webmin_${LATEST}_all.deb &>/dev/null
/usr/share/webmin/changepass.pl /etc/webmin root root &>/dev/null /usr/share/webmin/changepass.pl /etc/webmin root root &>/dev/null
rm -rf /root/webmin_${LATEST}_all.deb msg_ok "Installed ${APP}"
msg_ok "Installed Webmin"
get_lxc_ip
echo -e "Successfully Installed!! ${APP} should be reachable by going to ${BL}https://${LOCAL_IP}:10000${CL}"
IP=$(hostname -I | cut -f1 -d ' ')
echo -e "Successfully Installed!! Webmin should be reachable by going to ${BL}https://${IP}:10000${CL}"
+6
View File
@@ -0,0 +1,6 @@
__ __ __ __ _ __ __
____ _____/ /___/ / ____ ___ / /_/ /_ (_)________/ / / / _______
/ __ `/ __ / __ /_____/ __ \/ _ \/ __/ __ \/ / ___/ __ /_____/ / |/_/ ___/
/ /_/ / /_/ / /_/ /_____/ / / / __/ /_/ /_/ / / / / /_/ /_____/ /> </ /__
\__,_/\__,_/\__,_/ /_/ /_/\___/\__/_.___/_/_/ \__,_/ /_/_/|_|\___/
+6
View File
@@ -0,0 +1,6 @@
__ __ __ _ __ __ __
____ _____/ /___/ / / /_____ _(_) /_____________ _/ /__ / / _______
/ __ `/ __ / __ /_____/ __/ __ `/ / / ___/ ___/ __ `/ / _ \______/ / |/_/ ___/
/ /_/ / /_/ / /_/ /_____/ /_/ /_/ / / (__ ) /__/ /_/ / / __/_____/ /> </ /__
\__,_/\__,_/\__,_/ \__/\__,_/_/_/____/\___/\__,_/_/\___/ /_/_/|_|\___/
+6
View File
@@ -0,0 +1,6 @@
____ __ __ __
____ _/ / / / /____ ____ ___ ____ / /___ _/ /____ _____
/ __ `/ / /_____/ __/ _ \/ __ `__ \/ __ \/ / __ `/ __/ _ \/ ___/
/ /_/ / / /_____/ /_/ __/ / / / / / /_/ / / /_/ / /_/ __(__ )
\__,_/_/_/ \__/\___/_/ /_/ /_/ .___/_/\__,_/\__/\___/____/
/_/
+6
View File
@@ -0,0 +1,6 @@
_ __ __ __ __
/ | / /__ / /_____/ /___ _/ /_____ _
/ |/ / _ \/ __/ __ / __ `/ __/ __ `/
/ /| / __/ /_/ /_/ / /_/ / /_/ /_/ /
/_/ |_/\___/\__/\__,_/\__,_/\__/\__,_/
+6
View File
@@ -0,0 +1,6 @@
____ __ _____ ____ _ __
/ __ \/ / / / _ \/ __ \ | / /
/ /_/ / /_/ / __/ / / / |/ /
/ .___/\__, /\___/_/ /_/|___/
/_/ /____/
+6
View File
@@ -0,0 +1,6 @@
_ __ __ _
| | / /__ / /_ ____ ___ (_)___
| | /| / / _ \/ __ \/ __ `__ \/ / __ \
| |/ |/ / __/ /_/ / / / / / / / / / /
|__/|__/\___/_.___/_/ /_/ /_/_/_/ /_/
+1 -1
View File
@@ -402,7 +402,7 @@ function advanced_settings() {
fi fi
if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \ if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \
"KVM64" "Default safe for migration/compatibility" ON \ "KVM64" "Default - safe for migration/compatibility" ON \
"Host" "Use host CPU features (faster, no migration)" OFF \ "Host" "Use host CPU features (faster, no migration)" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
case "$CPU_TYPE1" in case "$CPU_TYPE1" in