mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-10-26 11:47:39 -04:00
Compare commits
3 Commits
main
...
add-script
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e57bf245bf | ||
|
|
93cd2113a4 | ||
|
|
d3d317127e |
60
CHANGELOG.md
60
CHANGELOG.md
@@ -568,62 +568,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-10-26
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- HomeTube ([#18172](https://github.com/community-scripts/ProxmoxVE/pull/18172))
|
||||
- Honcho ([#18169](https://github.com/community-scripts/ProxmoxVE/pull/18169))
|
||||
- YTPTube ([#18174](https://github.com/community-scripts/ProxmoxVE/pull/18174))
|
||||
- Stump ([#18173](https://github.com/community-scripts/ProxmoxVE/pull/18173))
|
||||
- Casdoor ([#18170](https://github.com/community-scripts/ProxmoxVE/pull/18170))
|
||||
- Streamystats ([#18171](https://github.com/community-scripts/ProxmoxVE/pull/18171))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Immich: lock only this platform when mise installs the plugin tools [@MickLesk](https://github.com/MickLesk) ([#18241](https://github.com/community-scripts/ProxmoxVE/pull/18241))
|
||||
- Fix service name case for Splunkd [@CerberusStyle](https://github.com/CerberusStyle) ([#18238](https://github.com/community-scripts/ProxmoxVE/pull/18238))
|
||||
- VMs: pass the machine type, CPU, disk cache and discard settings to qm [@MickLesk](https://github.com/MickLesk) ([#18232](https://github.com/community-scripts/ProxmoxVE/pull/18232))
|
||||
- excalidash: bump Node.js from 20 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18213](https://github.com/community-scripts/ProxmoxVE/pull/18213))
|
||||
- readmeabook: bump Node.js from 20 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18217](https://github.com/community-scripts/ProxmoxVE/pull/18217))
|
||||
- homepage: bump Node.js from 22 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18214](https://github.com/community-scripts/ProxmoxVE/pull/18214))
|
||||
- remove old -install.sh (verdaccio) [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18218](https://github.com/community-scripts/ProxmoxVE/pull/18218))
|
||||
- meshcentral: bump Node.js from 22 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#18215](https://github.com/community-scripts/ProxmoxVE/pull/18215))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- MeshCentral: update the npm package, not just the OS [@MickLesk](https://github.com/MickLesk) ([#18243](https://github.com/community-scripts/ProxmoxVE/pull/18243))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- feat: create containers from the linuxcontainers.org catalog when Proxmox has no template [@MickLesk](https://github.com/MickLesk) ([core#25](https://github.com/community-scripts/core/pull/25))
|
||||
|
||||
## 2026-10-25
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Dreeve ([#18167](https://github.com/community-scripts/ProxmoxVE/pull/18167))
|
||||
- TaskView ([#18166](https://github.com/community-scripts/ProxmoxVE/pull/18166))
|
||||
- EmDash ([#18165](https://github.com/community-scripts/ProxmoxVE/pull/18165))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(mealie): install ffmpeg for video recipe import [@clartek](https://github.com/clartek) ([#18210](https://github.com/community-scripts/ProxmoxVE/pull/18210))
|
||||
- Termix: step through 2.9.2 when updating from 2.8 or older [@MickLesk](https://github.com/MickLesk) ([#18158](https://github.com/community-scripts/ProxmoxVE/pull/18158))
|
||||
- Element Synapse: remove the registration line by its text, not line 34 [@MickLesk](https://github.com/MickLesk) ([#18201](https://github.com/community-scripts/ProxmoxVE/pull/18201))
|
||||
- Element Synapse: drop the ::1 listener so a container without IPv6 starts [@MickLesk](https://github.com/MickLesk) ([#18180](https://github.com/community-scripts/ProxmoxVE/pull/18180))
|
||||
- Heimdall: generate the app key without the production prompt [@MickLesk](https://github.com/MickLesk) ([#18156](https://github.com/community-scripts/ProxmoxVE/pull/18156))
|
||||
- Frigate: fetch the Intel graphics key with retries before building the media driver [@MickLesk](https://github.com/MickLesk) ([#18192](https://github.com/community-scripts/ProxmoxVE/pull/18192))
|
||||
- Pterodactyl Panel: default the admin's first and last name when left empty [@MickLesk](https://github.com/MickLesk) ([#18177](https://github.com/community-scripts/ProxmoxVE/pull/18177))
|
||||
- Jellyseerr: point fresh installs to Seerr instead of a missing install script [@MickLesk](https://github.com/MickLesk) ([#18183](https://github.com/community-scripts/ProxmoxVE/pull/18183))
|
||||
- Pi-hole: download the installer before running it [@MickLesk](https://github.com/MickLesk) ([#18182](https://github.com/community-scripts/ProxmoxVE/pull/18182))
|
||||
- OmniTools: give the build a git commit to read [@MickLesk](https://github.com/MickLesk) ([#18181](https://github.com/community-scripts/ProxmoxVE/pull/18181))
|
||||
- iVentoy: stop early in an unprivileged container [@MickLesk](https://github.com/MickLesk) ([#18179](https://github.com/community-scripts/ProxmoxVE/pull/18179))
|
||||
- Immich: stop early on Debian 12 instead of failing at apt [@MickLesk](https://github.com/MickLesk) ([#18178](https://github.com/community-scripts/ProxmoxVE/pull/18178))
|
||||
- paperless-ngx: fix missing index folder [@Segelzwerg](https://github.com/Segelzwerg) ([#18142](https://github.com/community-scripts/ProxmoxVE/pull/18142))
|
||||
- Anytype Server: keep the .env across updates and recreate a lost one [@MickLesk](https://github.com/MickLesk) ([#18155](https://github.com/community-scripts/ProxmoxVE/pull/18155))
|
||||
- changedetection: build Browserless from its lockfile on update [@MickLesk](https://github.com/MickLesk) ([#18157](https://github.com/community-scripts/ProxmoxVE/pull/18157))
|
||||
@@ -634,15 +584,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- Gramps-Web: run the Celery task queue with Redis [@MickLesk](https://github.com/MickLesk) ([#18141](https://github.com/community-scripts/ProxmoxVE/pull/18141))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- Hermes Agent: install, update and run everything as the hermes user [@MickLesk](https://github.com/MickLesk) ([#18203](https://github.com/community-scripts/ProxmoxVE/pull/18203))
|
||||
- tubearchivist: fix: prepare tubearchivist for v0.6.0 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#17867](https://github.com/community-scripts/ProxmoxVE/pull/17867))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- TREK: build 5.0 with 4 GB RAM and without dependency install scripts [@MickLesk](https://github.com/MickLesk) ([#18194](https://github.com/community-scripts/ProxmoxVE/pull/18194))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- alpine: fix uv release url [@mfelipe](https://github.com/mfelipe) ([core#168](https://github.com/community-scripts/core/pull/168))
|
||||
@@ -653,7 +594,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- post-pmg-install: hide the subscription nag in the PMG 9 mobile quarantine [@MickLesk](https://github.com/MickLesk) ([#18140](https://github.com/community-scripts/ProxmoxVE/pull/18140))
|
||||
- post-pve-install: hide the mobile subscription nag in every UI language [@MickLesk](https://github.com/MickLesk) ([#18143](https://github.com/community-scripts/ProxmoxVE/pull/18143))
|
||||
|
||||
## 2026-10-24
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/casdoor/casdoor
|
||||
|
||||
APP="Casdoor"
|
||||
var_tags="${var_tags:-auth;sso;iam}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-1024}"
|
||||
var_disk="${var_disk:-4}"
|
||||
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 [[ ! -d /opt/casdoor ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "casdoor" "casdoor/casdoor"; then
|
||||
msg_info "Stopping Casdoor"
|
||||
systemctl stop casdoor
|
||||
msg_ok "Stopped Casdoor"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "casdoor" "casdoor/casdoor" "prebuild" "latest" "/opt/casdoor" "casdoor_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
|
||||
|
||||
msg_info "Starting Casdoor"
|
||||
systemctl start casdoor
|
||||
msg_ok "Started Casdoor"
|
||||
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}:8000${CL}"
|
||||
80
ct/dreeve.sh
80
ct/dreeve.sh
@@ -1,80 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/dreeveapp/dreeve
|
||||
|
||||
APP="Dreeve"
|
||||
var_tags="${var_tags:-fitness;dashboard}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
#var_arm64="${var_arm64:-no}" # unset = ask the user; set yes/no only when verified
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/dreeve ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "dreeve" "dreeveapp/dreeve"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop dreeve
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
create_backup /opt/dreeve/.env.local /opt/dreeve/Caddyfile
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dreeve" "dreeveapp/dreeve" "tarball"
|
||||
|
||||
restore_backup
|
||||
|
||||
msg_info "Installing PHP Dependencies (Patience)"
|
||||
cd /opt/dreeve
|
||||
export COMPOSER_ALLOW_SUPERUSER=1
|
||||
export APP_ENV=prod
|
||||
$STD /opt/frankenphp/frankenphp php-cli /usr/local/bin/composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
|
||||
msg_ok "Installed PHP Dependencies"
|
||||
|
||||
msg_info "Running Migrations"
|
||||
mkdir -p /opt/dreeve/var/{cache,log}
|
||||
set -a
|
||||
source /opt/dreeve/.env.local
|
||||
set +a
|
||||
$STD /opt/frankenphp/frankenphp php-cli bin/console app:db:migrate --no-interaction
|
||||
$STD /opt/frankenphp/frankenphp php-cli bin/console assets:install public --no-interaction
|
||||
rm -rf /opt/dreeve/var/cache/prod
|
||||
$STD /opt/frankenphp/frankenphp php-cli bin/console cache:warmup --env=prod
|
||||
msg_ok "Ran Migrations"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start dreeve
|
||||
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}:8080${CL}"
|
||||
echo -e "${INFO}${YW}Admin credentials: ~/dreeve.creds (inside the container)${CL}"
|
||||
echo -e "${INFO}${YW}Add your Strava API credentials to /opt/dreeve/.env.local first${CL}"
|
||||
72
ct/emdash.sh
72
ct/emdash.sh
@@ -1,72 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/emdash-cms/emdash
|
||||
|
||||
APP="EmDash"
|
||||
var_tags="${var_tags:-cms;blog}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-3072}"
|
||||
var_disk="${var_disk:-6}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
export var_emdash_url="${var_emdash_url:-}"
|
||||
export var_emdash_template="${var_emdash_template:-}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/emdash ]]; then
|
||||
msg_error "No EmDash Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "emdash" "emdash-cms/emdash" "" "" "emdash@"; then
|
||||
msg_info "Stopping EmDash"
|
||||
systemctl stop emdash
|
||||
msg_ok "Stopped EmDash"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
|
||||
|
||||
msg_info "Updating EmDash"
|
||||
cd /opt/emdash
|
||||
set -a && source /opt/emdash_data/.env && set +a
|
||||
$STD pnpm add "${CHECK_UPDATE_RELEASE}"
|
||||
$STD pnpm build
|
||||
$STD pnpm store prune
|
||||
cat <<EOF >~/.emdash
|
||||
${CHECK_UPDATE_RELEASE}
|
||||
EOF
|
||||
msg_ok "Updated EmDash"
|
||||
|
||||
msg_info "Starting EmDash"
|
||||
systemctl start emdash
|
||||
msg_ok "Started EmDash"
|
||||
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}:4321${CL}"
|
||||
echo -e "${INFO}${YW}The admin at /_emdash/admin signs in with passkeys only, and browsers allow those on HTTPS with a domain or on localhost, never on an IP address.${CL}"
|
||||
echo -e "${INFO}${YW}Put EmDash behind a reverse proxy with a trusted certificate, set EMDASH_SITE_URL in /opt/emdash_data/.env to that address and rebuild (see the notes), then create the admin there.${CL}"
|
||||
@@ -35,8 +35,7 @@ function update_script() {
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop excalidash
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "excalidash" "ZimengXiong/ExcaliDash" "tarball"
|
||||
ln -sf /opt/excalidash_data/.env /opt/excalidash/backend/.env
|
||||
set -a && source /opt/excalidash_data/.env && set +a
|
||||
|
||||
@@ -33,60 +33,36 @@ function update_script() {
|
||||
|
||||
confirm_external_installer "https://hermes-agent.nousresearch.com/" "hermes update (https://hermes-agent.nousresearch.com/)"
|
||||
|
||||
if [[ -f /etc/systemd/system/hermes-dashboard.service ]]; then
|
||||
msg_info "Moving Hermes to its own user"
|
||||
systemctl disable -q --now hermes-dashboard
|
||||
rm -f /etc/systemd/system/hermes-dashboard.service
|
||||
systemctl daemon-reload
|
||||
mapfile -t root_hermes_pids < <(ps -eo user=,pid=,args= | awk '$1 == "root" && /\/home\/hermes\/\.hermes\// && /hermes_cli[.]main/ { print $2 }')
|
||||
if ((${#root_hermes_pids[@]})); then
|
||||
kill -TERM "${root_hermes_pids[@]}" 2>/dev/null || true
|
||||
for pid in "${root_hermes_pids[@]}"; do
|
||||
while kill -0 "$pid" 2>/dev/null; do
|
||||
sleep 0.1
|
||||
done
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop hermes-dashboard
|
||||
msg_ok "Stopped Services"
|
||||
|
||||
msg_info "Updating Hermes Agent"
|
||||
$STD setsid --wait bash -c '
|
||||
set -a; source /etc/default/hermes; set +a
|
||||
/home/hermes/.local/bin/hermes update --yes
|
||||
'
|
||||
mapfile -t root_gateway_pids < <(ps -eo user=,pid=,args= | awk '$1 == "root" && /\/home\/hermes\/\.hermes\// && /hermes_cli[.]main/ && / gateway run --replace$/ { print $2 }')
|
||||
if ((${#root_gateway_pids[@]})); then
|
||||
kill -TERM "${root_gateway_pids[@]}"
|
||||
for pid in "${root_gateway_pids[@]}"; do
|
||||
while kill -0 "$pid" 2>/dev/null; do
|
||||
sleep 0.1
|
||||
done
|
||||
fi
|
||||
ensure_dependencies libatomic1
|
||||
sed -i '/^HOME=/d' /etc/default/hermes
|
||||
grep -q '^GATEWAY_HEALTH_URL=' /etc/default/hermes || echo "GATEWAY_HEALTH_URL=http://127.0.0.1:8642/health" >>/etc/default/hermes
|
||||
mkdir -p /home/hermes/.config/systemd/user
|
||||
cat <<EOF >/home/hermes/.config/systemd/user/hermes-dashboard.service
|
||||
[Unit]
|
||||
Description=Hermes Agent Web Dashboard
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
UMask=0077
|
||||
WorkingDirectory=%h
|
||||
EnvironmentFile=/etc/default/hermes
|
||||
ExecStart=%h/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
EOF
|
||||
msg_ok "Moved Hermes to its own user"
|
||||
done
|
||||
fi
|
||||
if ps -eo user=,args= | awk '$1 == "root" && /\/home\/hermes\/\.hermes\// { found = 1 } END { exit !found }'; then
|
||||
msg_warn "A root-owned Hermes process is still running; it may keep writing root-owned files"
|
||||
fi
|
||||
|
||||
# A writer racing chown makes files vanish between readdir and chown; one retry covers it.
|
||||
if ! chown -R hermes:hermes /home/hermes 2>/dev/null; then
|
||||
sleep 1
|
||||
chown -R hermes:hermes /home/hermes || msg_warn "Could not take ownership of everything under /home/hermes"
|
||||
fi
|
||||
$STD runuser -l hermes -c 'systemctl --user daemon-reload && systemctl --user enable hermes-dashboard'
|
||||
|
||||
msg_info "Updating Hermes Agent"
|
||||
$STD setsid --wait runuser -l hermes -c '
|
||||
set -a; source /etc/default/hermes; set +a
|
||||
hermes update --yes
|
||||
'
|
||||
msg_ok "Updated Hermes Agent"
|
||||
|
||||
msg_info "Starting Services"
|
||||
$STD runuser -l hermes -c 'systemctl --user start hermes-dashboard'
|
||||
systemctl start hermes-dashboard
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
|
||||
@@ -30,7 +30,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
ensure_dependencies jq
|
||||
|
||||
if check_for_gh_release "homepage" "gethomepage/homepage"; then
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/EgalitarianMonkey/hometube
|
||||
|
||||
APP="HomeTube"
|
||||
var_tags="${var_tags:-media;youtube;downloader}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
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 [[ ! -d /opt/hometube ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating yt-dlp"
|
||||
$STD yt-dlp -U
|
||||
msg_ok "Updated yt-dlp"
|
||||
|
||||
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
|
||||
|
||||
if check_for_gh_release "hometube" "EgalitarianMonkey/hometube"; then
|
||||
msg_info "Stopping HomeTube"
|
||||
systemctl stop hometube
|
||||
msg_ok "Stopped HomeTube"
|
||||
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "hometube" "EgalitarianMonkey/hometube" "tarball"
|
||||
|
||||
msg_info "Updating HomeTube"
|
||||
cd /opt/hometube
|
||||
$STD uv sync --locked --no-dev --no-install-project --no-install-package pyarrow
|
||||
msg_ok "Updated HomeTube"
|
||||
|
||||
msg_info "Starting HomeTube"
|
||||
systemctl start hometube
|
||||
msg_ok "Started HomeTube"
|
||||
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}:8501${CL}"
|
||||
80
ct/honcho.sh
80
ct/honcho.sh
@@ -1,80 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/plastic-labs/honcho
|
||||
|
||||
APP="Honcho"
|
||||
var_tags="${var_tags:-ai;memory;agents}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-6}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
export var_honcho_provider="${var_honcho_provider:-}"
|
||||
export var_honcho_api_key="${var_honcho_api_key:-}"
|
||||
export var_honcho_base_url="${var_honcho_base_url:-}"
|
||||
export var_honcho_model="${var_honcho_model:-}"
|
||||
export var_honcho_embedding_key="${var_honcho_embedding_key:-}"
|
||||
export var_honcho_embedding_model="${var_honcho_embedding_model:-}"
|
||||
export var_honcho_embedding_dims="${var_honcho_embedding_dims:-}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
if [[ -n "${var_honcho_provider}" && ! "${var_honcho_provider}" =~ ^(openai|anthropic|gemini)$ ]]; then
|
||||
msg_error "var_honcho_provider must be openai, anthropic or gemini"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/honcho ]]; then
|
||||
msg_error "No Honcho Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "honcho" "plastic-labs/honcho" "" "" "v"; then
|
||||
msg_info "Stopping Honcho"
|
||||
systemctl stop honcho-deriver honcho
|
||||
msg_ok "Stopped Honcho"
|
||||
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
CLEAN_INSTALL=1 CLEAN_INSTALL_KEEP=".env" fetch_and_deploy_gh_release "honcho" "plastic-labs/honcho" "tarball" "latest" "/opt/honcho" "" "v"
|
||||
|
||||
msg_info "Updating Honcho"
|
||||
cd /opt/honcho
|
||||
$STD uv sync --frozen --no-dev
|
||||
$STD .venv/bin/python scripts/provision_db.py
|
||||
msg_ok "Updated Honcho"
|
||||
|
||||
if systemctl is-enabled -q honcho; then
|
||||
msg_info "Starting Honcho"
|
||||
systemctl start honcho honcho-deriver
|
||||
msg_ok "Started Honcho"
|
||||
fi
|
||||
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 the API (interactive docs at /docs) using the following URL:${CL}"
|
||||
echo -e "${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
||||
echo -e "${INFO}${YW}Admin key, sent as Authorization: Bearer <key> (more with: cd /opt/honcho && .venv/bin/python scripts/generate_jwt.py --admin):${CL}"
|
||||
echo -e "${INFO}${YW}Without an LLM provider key Honcho stays stopped: set one in /opt/honcho_data/.env, then run: systemctl enable --now honcho honcho-deriver${CL}"
|
||||
@@ -233,7 +233,6 @@ EOF
|
||||
cd "$SRC_DIR"
|
||||
export MISE_TRUSTED_CONFIG_PATHS="$SRC_DIR"/mise.toml
|
||||
export MISE_DISABLE_TOOLS=github:jellyfin/jellyfin-ffmpeg
|
||||
export MISE_LOCKFILE_MODE=merge MISE_LOCKFILE_PLATFORMS="linux-$(arch_resolve x64 arm64)"
|
||||
mise_ok=0
|
||||
for i in 1 2 3; do
|
||||
$STD mise install && {
|
||||
|
||||
@@ -96,12 +96,6 @@ EOF
|
||||
exit
|
||||
}
|
||||
|
||||
if [[ ! -d /opt/jellyseerr ]]; then
|
||||
msg_error "Jellyseerr is now Seerr and can no longer be installed with this script."
|
||||
msg_warn "Install Seerr instead: https://community-scripts.org/scripts/seerr"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
@@ -30,9 +30,6 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
ensure_dependencies ffmpeg
|
||||
|
||||
if check_for_gh_release "mealie" "mealie-recipes/mealie"; then
|
||||
|
||||
msg_info "Stopping Service"
|
||||
|
||||
@@ -22,40 +22,18 @@ color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/meshcentral ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
CURRENT=$(node -p "require('/opt/meshcentral/node_modules/meshcentral/package.json').version" 2>/dev/null)
|
||||
LATEST=$(npm view meshcentral version 2>/dev/null)
|
||||
if [[ -z "$LATEST" ]]; then
|
||||
msg_error "Could not determine the latest MeshCentral version from npm"
|
||||
exit 250
|
||||
fi
|
||||
if [[ "$CURRENT" != "$LATEST" ]]; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop meshcentral
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP} from v${CURRENT} to v${LATEST}"
|
||||
cd /opt/meshcentral
|
||||
$STD npm install "meshcentral@${LATEST}"
|
||||
msg_ok "Updated ${APP} to v${LATEST}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start meshcentral
|
||||
msg_ok "Started Service"
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/meshcentral ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating ${APP} LXC"
|
||||
apt_update_safe
|
||||
$STD apt -y upgrade
|
||||
msg_ok "Updated successfully!"
|
||||
else
|
||||
msg_ok "${APP} is already at v${CURRENT}"
|
||||
fi
|
||||
exit
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
|
||||
@@ -34,15 +34,12 @@ function update_script() {
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
if check_for_gh_release "omnitools" "iib0011/omni-tools"; then
|
||||
ensure_dependencies git
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "omnitools" "iib0011/omni-tools" "tarball"
|
||||
|
||||
msg_info "Building OmniTools"
|
||||
cd /opt/omnitools
|
||||
export HUSKY=0
|
||||
$STD npm ci --allow-remote=all
|
||||
$STD git init -q
|
||||
$STD git -c user.name=build -c user.email=build@localhost commit -q --allow-empty -m build
|
||||
$STD npm run build
|
||||
msg_ok "Built OmniTools"
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/fredrikburmester/streamystats
|
||||
|
||||
APP="Streamystats"
|
||||
var_tags="${var_tags:-analytics;jellyfin}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-3072}"
|
||||
var_disk="${var_disk:-10}"
|
||||
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 [[ ! -d /opt/streamystats ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "streamystats" "fredrikburmester/streamystats"; then
|
||||
msg_info "Stopping Streamystats"
|
||||
systemctl stop streamystats-nextjs-app streamystats-job-server
|
||||
msg_ok "Stopped Streamystats"
|
||||
|
||||
msg_info "Updating Bun"
|
||||
$STD bun upgrade
|
||||
msg_ok "Updated Bun"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "streamystats" "fredrikburmester/streamystats" "tarball"
|
||||
|
||||
msg_info "Building Streamystats"
|
||||
cd /opt/streamystats
|
||||
$STD bun install --frozen-lockfile
|
||||
NEXT_TELEMETRY_DISABLED=1 NEXT_PUBLIC_VERSION="v$(cat ~/.streamystats)" $STD bun run build
|
||||
msg_ok "Built Streamystats"
|
||||
|
||||
msg_info "Migrating Streamystats Database"
|
||||
$STD bun --env-file=/opt/streamystats_data/.env run db:migrate
|
||||
msg_ok "Migrated Streamystats Database"
|
||||
|
||||
msg_info "Starting Streamystats"
|
||||
systemctl start streamystats-job-server streamystats-nextjs-app
|
||||
msg_ok "Started Streamystats"
|
||||
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}:3000${CL}"
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/Gimanh/taskview-community
|
||||
|
||||
APP="TaskView"
|
||||
var_tags="${var_tags:-project-management;tasks;kanban}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-6144}"
|
||||
var_disk="${var_disk:-10}"
|
||||
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 [[ ! -d /opt/taskview ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "taskview" "Gimanh/taskview-community"; then
|
||||
msg_info "Stopping TaskView"
|
||||
systemctl stop taskview
|
||||
msg_ok "Stopped TaskView"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "taskview" "Gimanh/taskview-community" "tarball"
|
||||
|
||||
msg_info "Building TaskView"
|
||||
cd /opt/taskview
|
||||
$STD pnpm install --frozen-lockfile
|
||||
cd /opt/taskview/api
|
||||
$STD pnpm run build:docker
|
||||
$STD pnpm run build:migration
|
||||
cp -r src/migrations/taskview dist-migration/
|
||||
cd /opt/taskview/web
|
||||
$STD pnpm run build:packages
|
||||
$STD pnpm run build-only
|
||||
msg_ok "Built TaskView"
|
||||
|
||||
msg_info "Migrating TaskView Database"
|
||||
cd /opt/taskview_data
|
||||
$STD node /opt/taskview/api/dist-migration/taskview-db-migration.js
|
||||
msg_ok "Migrated TaskView Database"
|
||||
|
||||
msg_info "Starting TaskView"
|
||||
systemctl start taskview
|
||||
msg_ok "Started TaskView"
|
||||
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}${CL}"
|
||||
20
ct/termix.sh
20
ct/termix.sh
@@ -108,12 +108,6 @@ EOF
|
||||
fi
|
||||
|
||||
if check_for_gh_release "termix" "Termix-SSH/Termix"; then
|
||||
TERMIX_RELEASE="latest"
|
||||
if [[ "$CS_PREVIOUS_VERSION" =~ ^(release-)?([0-9]+)\.([0-9]+)\. ]] && ((BASH_REMATCH[2] * 100 + BASH_REMATCH[3] < 209)); then
|
||||
TERMIX_RELEASE="release-2.9.2-tag"
|
||||
msg_warn "Termix ${CS_PREVIOUS_VERSION} has to run 2.9.2 once before newer releases accept its database"
|
||||
fi
|
||||
|
||||
msg_info "Stopping Termix"
|
||||
systemctl stop termix
|
||||
msg_ok "Stopped Termix"
|
||||
@@ -171,7 +165,7 @@ EOF
|
||||
|
||||
create_backup /opt/termix/.env
|
||||
|
||||
CLEAN_INSTALL=1 CLEAN_INSTALL_KEEP="db/data data uploads" fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball" "$TERMIX_RELEASE"
|
||||
CLEAN_INSTALL=1 CLEAN_INSTALL_KEEP="db/data data uploads" fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
|
||||
|
||||
restore_backup
|
||||
|
||||
@@ -264,24 +258,12 @@ EOF
|
||||
|
||||
msg_info "Starting Termix"
|
||||
systemctl daemon-reload
|
||||
TERMIX_START=$(date +%s)
|
||||
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"
|
||||
if [[ "$TERMIX_RELEASE" != "latest" ]]; then
|
||||
msg_info "Waiting for Termix 2.9.2 to migrate the database"
|
||||
if ! timeout 300 bash -c "until journalctl -u termix --since @${TERMIX_START} --no-pager | grep -q 'Termix backend started successfully'; do sleep 2; done"; then
|
||||
msg_error "Termix 2.9.2 did not finish starting, so the database was not migrated"
|
||||
journalctl -u termix -n 30 --no-pager || true
|
||||
exit 1
|
||||
fi
|
||||
msg_ok "Migrated the database with Termix 2.9.2"
|
||||
msg_warn "Run update again to continue to the current Termix release"
|
||||
exit
|
||||
fi
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
|
||||
@@ -9,7 +9,7 @@ source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_
|
||||
APP="TREK"
|
||||
var_tags="${var_tags:-travel;planning;collaboration}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
@@ -43,7 +43,6 @@ function update_script() {
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
ensure_dependencies "libkitinerary-bin"
|
||||
ln -sf "$(find /usr/lib -name kitinerary-extractor -type f | head -1)" /usr/local/bin/kitinerary-extractor
|
||||
|
||||
create_backup /opt/trek/server/.env \
|
||||
/opt/trek/data \
|
||||
@@ -53,7 +52,7 @@ function update_script() {
|
||||
|
||||
msg_info "Building TREK"
|
||||
cd /opt/trek
|
||||
$STD npm ci --ignore-scripts
|
||||
$STD npm ci
|
||||
$STD npm run build --workspace=shared
|
||||
$STD npm run build --workspace=client
|
||||
$STD npm run build --workspace=server
|
||||
@@ -73,7 +72,7 @@ function update_script() {
|
||||
|
||||
rm -rf /opt/trek/node_modules
|
||||
cd /opt/trek
|
||||
$STD npm ci --workspace=server --omit=dev --ignore-scripts
|
||||
$STD npm ci --workspace=server --omit=dev
|
||||
msg_ok "Set up TREK Workspace"
|
||||
|
||||
if [[ "$MIGRATION" == "1" ]]; then
|
||||
|
||||
@@ -71,41 +71,6 @@ EOF
|
||||
|
||||
restore_backup
|
||||
|
||||
if grep -q '^TA_BACKEND_PORT=' /opt/tubearchivist/.env 2>/dev/null; then
|
||||
msg_info "Migrating to v0.6.0 (dropping Nginx)"
|
||||
systemctl disable -q --now nginx
|
||||
$STD apt autoremove --purge -y nginx
|
||||
sed -i 's/^TA_BACKEND_PORT=.*/TA_PORT=8000/' /opt/tubearchivist/.env
|
||||
cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh
|
||||
#!/bin/bash
|
||||
set -e
|
||||
cd /opt/tubearchivist/backend
|
||||
set -a
|
||||
source /opt/tubearchivist/.env
|
||||
set +a
|
||||
PYTHON=/opt/tubearchivist/.venv/bin/python
|
||||
|
||||
echo "Waiting for ElasticSearch..."
|
||||
for i in $(seq 1 30); do
|
||||
if curl -sf http://localhost:9200/_cluster/health >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
$PYTHON manage.py ta_stop_on_error
|
||||
$PYTHON manage.py migrate
|
||||
$PYTHON manage.py collectstatic --noinput -c
|
||||
$PYTHON manage.py ta_envcheck
|
||||
$PYTHON manage.py ta_connection
|
||||
$PYTHON manage.py ta_startup
|
||||
|
||||
exec $PYTHON backend_start.py
|
||||
RUNEOF
|
||||
chmod +x /opt/tubearchivist/backend/run.sh
|
||||
msg_ok "Migrated to v0.6.0 (dropping Nginx)"
|
||||
fi
|
||||
|
||||
msg_info "Rebuilding Tube Archivist"
|
||||
cd /opt/tubearchivist/frontend
|
||||
$STD npm install
|
||||
@@ -148,6 +113,7 @@ RUNEOF
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start bgutil-provider tubearchivist tubearchivist-celery tubearchivist-beat
|
||||
systemctl reload nginx
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
@@ -162,5 +128,3 @@ 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}:8000${CL}"
|
||||
echo -e "${INFO}${YW}Admin credentials saved to ~/tubearchivist.creds${CL}"
|
||||
echo -e "${INFO}${YW}The WebUI may take a couple of minutes to become available on first start, while Elasticsearch and the backend initialize.${CL}"
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/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/arabcoders/ytptube
|
||||
|
||||
APP="YTPTube"
|
||||
var_tags="${var_tags:-media;youtube;downloader}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-3072}"
|
||||
var_disk="${var_disk:-20}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_gpu="${var_gpu:-yes}"
|
||||
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 [[ ! -d /opt/ytptube ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
|
||||
|
||||
if check_for_gh_release "ytptube" "arabcoders/ytptube"; then
|
||||
msg_info "Stopping YTPTube"
|
||||
systemctl stop ytptube
|
||||
msg_ok "Stopped YTPTube"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="bun" setup_nodejs
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ytptube" "arabcoders/ytptube" "tarball"
|
||||
|
||||
msg_info "Building YTPTube"
|
||||
cd /opt/ytptube/ui
|
||||
$STD bun install --frozen-lockfile --production
|
||||
NODE_ENV=production $STD bun run generate
|
||||
rm -rf /opt/ytptube/ui/node_modules
|
||||
cd /opt/ytptube
|
||||
sed -i "s/^APP_VERSION = .*/APP_VERSION = \"v$(cat ~/.ytptube)\"/" app/library/version.py
|
||||
$STD uv sync --locked --no-dev
|
||||
$STD uv pip install --python .venv/bin/python pip
|
||||
msg_ok "Built YTPTube"
|
||||
|
||||
msg_info "Starting YTPTube"
|
||||
systemctl start ytptube
|
||||
msg_ok "Started YTPTube"
|
||||
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}:8081${CL}"
|
||||
echo -e "${INFO}${YW}The first visitor creates the admin account - open the URL right away${CL}"
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/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/casdoor/casdoor
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_DB_NAME="casdoor" PG_DB_USER="casdoor" setup_postgresql_db
|
||||
|
||||
fetch_and_deploy_gh_release "casdoor" "casdoor/casdoor" "prebuild" "latest" "/opt/casdoor" "casdoor_Linux_$(arch_resolve "x86_64" "arm64").tar.gz"
|
||||
|
||||
msg_info "Configuring Casdoor"
|
||||
mkdir -p /opt/casdoor_data/conf
|
||||
cat <<EOF >/opt/casdoor_data/conf/app.conf
|
||||
appname = casdoor
|
||||
httpport = 8000
|
||||
runmode = prod
|
||||
copyrequestbody = true
|
||||
driverName = postgres
|
||||
dataSourceName = user=casdoor password=${PG_DB_PASS} host=localhost port=5432 sslmode=disable dbname=casdoor
|
||||
dbName = casdoor
|
||||
tableNamePrefix =
|
||||
showSql = false
|
||||
redisEndpoint =
|
||||
defaultStorageProvider =
|
||||
isCloudIntranet = false
|
||||
authState = "casdoor"
|
||||
socks5Proxy =
|
||||
verificationCodeTimeout = 10
|
||||
initScore = 0
|
||||
logPostOnly = true
|
||||
isUsernameLowered = false
|
||||
origin = http://${LOCAL_IP}:8000
|
||||
originFrontend =
|
||||
staticBaseUrl = "https://cdn.casbin.org"
|
||||
isDemoMode = false
|
||||
batchSize = 100
|
||||
showGithubCorner = false
|
||||
forceLanguage = ""
|
||||
defaultLanguage = "en"
|
||||
defaultApplication = "app-built-in"
|
||||
maxItemsForFlatMenu = 7
|
||||
enableErrorMask = false
|
||||
enableGzip = true
|
||||
inactiveTimeoutMinutes =
|
||||
ldapServerPort = 389
|
||||
ldapsCertId = ""
|
||||
ldapsServerPort = 636
|
||||
radiusServerPort = 1812
|
||||
radiusDefaultOrganization = "built-in"
|
||||
radiusSecret = "$(random_password)"
|
||||
quota = {"organization": -1, "user": -1, "application": -1, "provider": -1}
|
||||
logConfig = {"adapter":"console", "color":false}
|
||||
initDataNewOnly = false
|
||||
initDataFile = "./init_data.json"
|
||||
frontendBaseDir = "/opt/casdoor/web/build"
|
||||
EOF
|
||||
chmod 600 /opt/casdoor_data/conf/app.conf
|
||||
msg_ok "Configured Casdoor"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/casdoor.service
|
||||
[Unit]
|
||||
Description=Casdoor
|
||||
After=network.target postgresql.service
|
||||
Requires=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/casdoor_data
|
||||
ExecStart=/opt/casdoor/casdoor
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now casdoor
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -1,136 +0,0 @@
|
||||
#!/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/dreeveapp/dreeve
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
libsqlite3-0 \
|
||||
libcap2-bin \
|
||||
ca-certificates
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
# 1.13.0's php-cli shifts the script into argv[1], which breaks composer and bin/console (php/frankenphp#2690); unpin once 1.13.1 is out
|
||||
fetch_and_deploy_gh_release "frankenphp" "php/frankenphp" "singlefile" "v1.12.7" "/opt/frankenphp" "frankenphp-linux-$(arch_resolve x86_64 aarch64)-gnu"
|
||||
fetch_and_deploy_gh_release "dreeve" "dreeveapp/dreeve" "tarball"
|
||||
|
||||
msg_info "Providing php CLI"
|
||||
cat <<'EOF' >/usr/local/bin/php
|
||||
#!/usr/bin/env bash
|
||||
exec /opt/frankenphp/frankenphp php-cli "$@"
|
||||
EOF
|
||||
chmod +x /usr/local/bin/php
|
||||
msg_ok "Provided php CLI"
|
||||
|
||||
msg_info "Installing Composer"
|
||||
curl -fsSL https://getcomposer.org/installer -o /tmp/composer-setup.php
|
||||
$STD /opt/frankenphp/frankenphp php-cli /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
|
||||
rm -f /tmp/composer-setup.php
|
||||
msg_ok "Installed Composer"
|
||||
|
||||
msg_info "Installing PHP Dependencies (Patience)"
|
||||
cd /opt/dreeve
|
||||
export COMPOSER_ALLOW_SUPERUSER=1
|
||||
export APP_ENV=prod
|
||||
$STD /opt/frankenphp/frankenphp php-cli /usr/local/bin/composer install --no-dev --optimize-autoloader --no-interaction --no-scripts
|
||||
msg_ok "Installed PHP Dependencies"
|
||||
|
||||
msg_info "Configuring Dreeve"
|
||||
mkdir -p /opt/dreeve_data /opt/dreeve/var/{cache,log}
|
||||
DREEVE_PASSWORD=$(openssl rand -base64 18)
|
||||
DREEVE_HASH=$(DREEVE_PASSWORD="$DREEVE_PASSWORD" /opt/frankenphp/frankenphp php-cli -r 'echo password_hash(getenv("DREEVE_PASSWORD"), PASSWORD_BCRYPT, ["cost" => 13]);')
|
||||
[[ "$DREEVE_HASH" =~ ^\$2y\$ ]] || {
|
||||
msg_error "Could not generate the admin password hash"
|
||||
exit 1
|
||||
}
|
||||
cat <<EOF >/opt/dreeve/.env.local
|
||||
APP_ENV=prod
|
||||
APP_DEBUG=0
|
||||
APP_SECRET=$(openssl rand -hex 32)
|
||||
APP_URL=http://${LOCAL_IP}:8080
|
||||
DATABASE_DIRECTORY=/opt/dreeve_data
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD_HASH='${DREEVE_HASH}'
|
||||
TZ=UTC
|
||||
|
||||
# Create an API application at https://www.strava.com/settings/api
|
||||
STRAVA_CLIENT_ID=replace-me
|
||||
STRAVA_CLIENT_SECRET=replace-me
|
||||
STRAVA_REFRESH_TOKEN=replace-me
|
||||
EOF
|
||||
chmod 600 /opt/dreeve/.env.local
|
||||
|
||||
cat <<EOF >~/dreeve.creds
|
||||
Dreeve Admin
|
||||
Username: admin
|
||||
Password: ${DREEVE_PASSWORD}
|
||||
EOF
|
||||
chmod 600 ~/dreeve.creds
|
||||
|
||||
cat <<EOF >/opt/dreeve/Caddyfile
|
||||
{
|
||||
http_port 8080
|
||||
auto_https off
|
||||
|
||||
frankenphp {
|
||||
num_threads 3
|
||||
worker {
|
||||
num 2
|
||||
file /opt/dreeve/public/index.php
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:8080 {
|
||||
root /opt/dreeve/public
|
||||
encode zstd br gzip
|
||||
php_server
|
||||
}
|
||||
EOF
|
||||
msg_ok "Configured Dreeve"
|
||||
|
||||
msg_info "Initializing Database"
|
||||
cd /opt/dreeve
|
||||
set -a
|
||||
source /opt/dreeve/.env.local
|
||||
set +a
|
||||
$STD /opt/frankenphp/frankenphp php-cli bin/console app:db:migrate --no-interaction
|
||||
$STD /opt/frankenphp/frankenphp php-cli bin/console assets:install public --no-interaction
|
||||
$STD /opt/frankenphp/frankenphp php-cli bin/console cache:warmup --env=prod
|
||||
msg_ok "Initialized Database"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/dreeve.service
|
||||
[Unit]
|
||||
Description=Dreeve
|
||||
Wants=network-online.target
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/dreeve
|
||||
EnvironmentFile=/opt/dreeve/.env.local
|
||||
ExecStart=/opt/frankenphp/frankenphp run --config /opt/dreeve/Caddyfile
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now dreeve
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -40,7 +40,7 @@ chmod +x /usr/sbin/policy-rc.d
|
||||
$STD apt install matrix-synapse-py3 -y
|
||||
rm -f /usr/sbin/policy-rc.d
|
||||
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/matrix-synapse/homeserver.yaml
|
||||
sed -i '/^ *- ::1$/d' /etc/matrix-synapse/homeserver.yaml
|
||||
sed -i 's/'\''::1'\'', //g' /etc/matrix-synapse/homeserver.yaml
|
||||
SECRET=$(openssl rand -hex 32)
|
||||
ADMIN_PASS="$(random_password 13)"
|
||||
echo "enable_registration_without_verification: true" >>/etc/matrix-synapse/homeserver.yaml
|
||||
@@ -71,7 +71,7 @@ Admin username: admin
|
||||
Admin password: $ADMIN_PASS
|
||||
EOF
|
||||
systemctl stop matrix-synapse
|
||||
sed -i '/^enable_registration_without_verification: true$/d' /etc/matrix-synapse/homeserver.yaml
|
||||
sed -i '34d' /etc/matrix-synapse/homeserver.yaml
|
||||
systemctl start matrix-synapse
|
||||
msg_ok "Installed Element Synapse"
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/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/emdash-cms/emdash
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
|
||||
|
||||
msg_info "Creating EmDash Site"
|
||||
cd /opt
|
||||
$STD pnpm dlx create-emdash@latest emdash --platform node --template "${var_emdash_template:-blog}" --pm pnpm --no-install --yes
|
||||
mkdir -p /opt/emdash_data/uploads
|
||||
mv /opt/emdash/.env /opt/emdash_data/.env
|
||||
sed -i -e 's|file:./data.db|file:/opt/emdash_data/data.db|' -e 's|"./uploads"|"/opt/emdash_data/uploads"|' /opt/emdash/astro.config.mjs
|
||||
cat <<EOF >>/opt/emdash_data/.env
|
||||
HOST=0.0.0.0
|
||||
PORT=4321
|
||||
# The address in the browser bar. Passkeys are bound to its hostname, and the build bakes it in for image optimization:
|
||||
# after a change run cd /opt/emdash && set -a && . /opt/emdash_data/.env && set +a && pnpm build && systemctl restart emdash
|
||||
EMDASH_SITE_URL=${var_emdash_url:-http://${LOCAL_IP}:4321}
|
||||
EOF
|
||||
chmod 600 /opt/emdash_data/.env
|
||||
msg_ok "Created EmDash Site"
|
||||
|
||||
msg_info "Building EmDash"
|
||||
cd /opt/emdash
|
||||
# pnpm keeps Astro's sharp out of the site's reach, and every /_image request then fails with MissingSharp
|
||||
$STD pnpm add sharp
|
||||
set -a && source /opt/emdash_data/.env && set +a
|
||||
$STD pnpm build
|
||||
cat <<EOF >~/.emdash
|
||||
emdash@$(node -p 'require("/opt/emdash/node_modules/emdash/package.json").version')
|
||||
EOF
|
||||
msg_ok "Built EmDash"
|
||||
|
||||
msg_info "Creating EmDash Service"
|
||||
cat <<EOF >/etc/systemd/system/emdash.service
|
||||
[Unit]
|
||||
Description=EmDash
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/emdash
|
||||
EnvironmentFile=/opt/emdash_data/.env
|
||||
Environment=NODE_ENV=production
|
||||
ExecStart=/usr/bin/node /opt/emdash/dist/server/entry.mjs
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now emdash
|
||||
msg_ok "Created EmDash Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -19,7 +19,7 @@ $STD apt install -y \
|
||||
nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
NODE_VERSION="20" setup_nodejs
|
||||
PG_VERSION="18" setup_postgresql
|
||||
PG_DB_NAME="excalidash" PG_DB_USER="excalidash" setup_postgresql_db
|
||||
|
||||
|
||||
@@ -124,8 +124,6 @@ msg_ok "Built SQLite Extensions"
|
||||
|
||||
if [[ "$(arch_resolve)" == "amd64" ]]; then
|
||||
msg_info "Building Intel Media Driver (Patience)"
|
||||
download_gpg_key "https://repositories.intel.com/gpu/intel-graphics.key" "/usr/share/keyrings/intel-graphics.gpg" "dearmor"
|
||||
sed -i '/intel-graphics.key/d' /opt/frigate/docker/main/build_intel_media_driver.sh
|
||||
$STD bash /opt/frigate/docker/main/build_intel_media_driver.sh
|
||||
cp -a /rootfs/. /
|
||||
rm -rf /rootfs
|
||||
|
||||
@@ -25,7 +25,7 @@ msg_info "Setting up Heimdall-Dashboard"
|
||||
cd /opt/Heimdall
|
||||
cp .env.example .env
|
||||
sed -i 's/^APP_ENV=.*/APP_ENV=production/' .env
|
||||
$STD php artisan key:generate --force
|
||||
$STD php artisan key:generate
|
||||
msg_ok "Setup Heimdall-Dashboard"
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -14,9 +14,7 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
git \
|
||||
libatomic1
|
||||
$STD apt install -y git
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
@@ -29,9 +27,9 @@ msg_ok "Created Hermes User"
|
||||
|
||||
msg_info "Configuring Service Environment"
|
||||
cat <<EOF >/etc/default/hermes
|
||||
HOME=/home/hermes
|
||||
PATH=/home/hermes/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
NODE_OPTIONS=${NODE_OPTIONS}
|
||||
GATEWAY_HEALTH_URL=http://127.0.0.1:8642/health
|
||||
EOF
|
||||
msg_ok "Configured Service Environment"
|
||||
|
||||
@@ -40,60 +38,68 @@ confirm_external_installer "https://hermes-agent.nousresearch.com/" "https://her
|
||||
msg_info "Installing Hermes Agent"
|
||||
curl_with_retry "https://hermes-agent.nousresearch.com/install.sh" /tmp/hermes-install.sh ||
|
||||
curl_with_retry "https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh" /tmp/hermes-install.sh
|
||||
chmod 644 /tmp/hermes-install.sh
|
||||
$STD setsid --wait runuser -l hermes -c '
|
||||
$STD setsid --wait bash -c '
|
||||
set -a; source /etc/default/hermes; set +a
|
||||
export npm_config_yes=true
|
||||
bash /tmp/hermes-install.sh --skip-setup --hermes-home ~/.hermes --dir ~/.hermes/hermes-agent
|
||||
bash /tmp/hermes-install.sh --skip-setup --hermes-home /home/hermes/.hermes --dir /home/hermes/.hermes/hermes-agent
|
||||
'
|
||||
rm -f /tmp/hermes-install.sh
|
||||
chown -R hermes:hermes /home/hermes
|
||||
chmod 750 /home/hermes
|
||||
chmod 700 /home/hermes/.hermes
|
||||
git config --system --add safe.directory /home/hermes/.hermes/hermes-agent 2>/dev/null || true
|
||||
msg_ok "Installed Hermes Agent"
|
||||
|
||||
msg_info "Configuring API Server"
|
||||
API_SERVER_KEY=$(random_password 32)
|
||||
mkdir -p /home/hermes/.hermes
|
||||
cat <<EOF >/home/hermes/.hermes/.env
|
||||
API_SERVER_ENABLED=true
|
||||
API_SERVER_HOST=0.0.0.0
|
||||
API_SERVER_PORT=8642
|
||||
API_SERVER_KEY=${API_SERVER_KEY}
|
||||
EOF
|
||||
chown hermes:hermes /home/hermes/.hermes/.env
|
||||
chmod 600 /home/hermes/.hermes/.env
|
||||
msg_ok "Configured API Server"
|
||||
|
||||
msg_info "Creating Dashboard Service"
|
||||
mkdir -p /home/hermes/.config/systemd/user
|
||||
cat <<EOF >/home/hermes/.config/systemd/user/hermes-dashboard.service
|
||||
cat <<EOF >/etc/systemd/system/hermes-dashboard.service
|
||||
[Unit]
|
||||
Description=Hermes Agent Web Dashboard
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=hermes
|
||||
Group=hermes
|
||||
UMask=0077
|
||||
WorkingDirectory=%h
|
||||
WorkingDirectory=/home/hermes
|
||||
ExecStart=/home/hermes/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
|
||||
EnvironmentFile=/etc/default/hermes
|
||||
ExecStart=%h/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
ProtectProc=invisible
|
||||
ProcSubset=pid
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
chown -R hermes:hermes /home/hermes/.config
|
||||
$STD runuser -l hermes -c 'systemctl --user daemon-reload && systemctl --user enable --now hermes-dashboard'
|
||||
systemctl enable -q --now hermes-dashboard
|
||||
msg_ok "Created Dashboard Service"
|
||||
|
||||
msg_info "Creating Setup Helper"
|
||||
cat <<'SETUP' >/usr/bin/hermes-setup
|
||||
#!/usr/bin/env bash
|
||||
su - hermes -c 'set -a; source /etc/default/hermes; set +a; hermes setup'
|
||||
set -a; source /etc/default/hermes; set +a
|
||||
/home/hermes/.local/bin/hermes setup
|
||||
chown -R hermes:hermes /home/hermes
|
||||
chmod 750 /home/hermes
|
||||
chmod 700 /home/hermes/.hermes
|
||||
if [[ -f /home/hermes/.config/systemd/user/hermes-gateway.service ]]; then
|
||||
su - hermes -c 'systemctl --user enable --now hermes-gateway'
|
||||
fi
|
||||
echo "Hermes setup complete."
|
||||
echo "Hermes setup complete. File permissions restored."
|
||||
SETUP
|
||||
chmod +x /usr/bin/hermes-setup
|
||||
msg_ok "Created Setup Helper"
|
||||
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y jq
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||
fetch_and_deploy_gh_release "homepage" "gethomepage/homepage" "tarball"
|
||||
RELEASE=$(get_latest_github_release "gethomepage/homepage")
|
||||
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#!/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/EgalitarianMonkey/hometube
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
setup_ffmpeg
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
|
||||
fetch_and_deploy_gh_release "yt-dlp" "yt-dlp/yt-dlp" "singlefile" "latest" "/usr/local/bin" "yt-dlp_$(arch_resolve "linux" "linux_aarch64")"
|
||||
fetch_and_deploy_gh_release "hometube" "EgalitarianMonkey/hometube" "tarball"
|
||||
|
||||
msg_info "Installing HomeTube"
|
||||
cd /opt/hometube
|
||||
$STD uv sync --locked --no-dev --no-install-project --no-install-package pyarrow
|
||||
mkdir -p /opt/hometube_data/{videos,tmp,cookies}
|
||||
cat <<EOF >/opt/hometube_data/.env
|
||||
VIDEOS_FOLDER=/opt/hometube_data/videos
|
||||
TMP_DOWNLOAD_FOLDER=/opt/hometube_data/tmp
|
||||
YOUTUBE_COOKIES_FILE_PATH=/opt/hometube_data/cookies/youtube_cookies.txt
|
||||
REMOVE_TMP_FILES_AFTER_DOWNLOAD=true
|
||||
EOF
|
||||
msg_ok "Installed HomeTube"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/hometube.service
|
||||
[Unit]
|
||||
Description=HomeTube
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/hometube
|
||||
EnvironmentFile=/opt/hometube_data/.env
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
ExecStartPre=-/usr/local/bin/yt-dlp -U
|
||||
ExecStart=/opt/hometube/.venv/bin/python -m streamlit run app/main.py --server.port=8501 --server.address=0.0.0.0 --server.headless=true --server.enableCORS=false --server.enableXsrfProtection=false
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now hometube
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -1,168 +0,0 @@
|
||||
#!/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/plastic-labs/honcho
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y redis-server
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
|
||||
PG_DB_NAME="honcho" PG_DB_USER="honcho" PG_DB_EXTENSIONS="vector,pg_trgm" setup_postgresql_db
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
fetch_and_deploy_gh_release "honcho" "plastic-labs/honcho" "tarball" "latest" "/opt/honcho" "" "v"
|
||||
|
||||
msg_info "Installing Honcho"
|
||||
cd /opt/honcho
|
||||
$STD uv sync --frozen --no-dev
|
||||
msg_ok "Installed Honcho"
|
||||
|
||||
if [[ -t 0 && -z "${var_honcho_provider:-}${var_honcho_api_key:-}${var_honcho_base_url:-}" ]]; then
|
||||
echo -e "${INFO}${YW} Honcho needs an LLM provider for memory, embeddings and chat; without a key it is installed but not started.${CL}"
|
||||
read -t 300 -rsp "${TAB3}OpenAI API key (Enter to set up a provider later): " var_honcho_api_key || true
|
||||
echo
|
||||
fi
|
||||
|
||||
declare -A HONCHO_KEY=([openai]="" [anthropic]="" [gemini]="")
|
||||
case "${var_honcho_provider:-openai}" in
|
||||
anthropic)
|
||||
HONCHO_TRANSPORT="anthropic" HONCHO_MODEL="${var_honcho_model:-claude-haiku-4-5}"
|
||||
HONCHO_EMBEDDING="openai" HONCHO_EMBEDDING_MODEL="${var_honcho_embedding_model:-text-embedding-3-small}"
|
||||
HONCHO_KEY[anthropic]="${var_honcho_api_key:-}"
|
||||
HONCHO_KEY[openai]="${var_honcho_embedding_key:-}"
|
||||
;;
|
||||
gemini)
|
||||
HONCHO_TRANSPORT="gemini" HONCHO_MODEL="${var_honcho_model:-gemini-2.5-flash}"
|
||||
HONCHO_EMBEDDING="gemini" HONCHO_EMBEDDING_MODEL="${var_honcho_embedding_model:-gemini-embedding-001}"
|
||||
HONCHO_KEY[gemini]="${var_honcho_api_key:-}"
|
||||
;;
|
||||
*)
|
||||
HONCHO_TRANSPORT="openai" HONCHO_MODEL="${var_honcho_model:-gpt-5.4-mini}"
|
||||
HONCHO_EMBEDDING="openai" HONCHO_EMBEDDING_MODEL="${var_honcho_embedding_model:-text-embedding-3-small}"
|
||||
HONCHO_KEY[openai]="${var_honcho_api_key:-${var_honcho_base_url:+not-needed}}"
|
||||
;;
|
||||
esac
|
||||
|
||||
msg_info "Configuring Honcho"
|
||||
mkdir -p /opt/honcho_data
|
||||
cat <<EOF >/opt/honcho_data/.env
|
||||
DB_CONNECTION_URI=postgresql+psycopg://honcho:${PG_DB_PASS}@localhost:5432/honcho
|
||||
CACHE_ENABLED=true
|
||||
CACHE_URL=redis://localhost:6379/0?suppress=true
|
||||
|
||||
# Every /v3 API request needs a JWT signed with this secret. Mint one with:
|
||||
# cd /opt/honcho && .venv/bin/python scripts/generate_jwt.py --admin
|
||||
AUTH_USE_AUTH=true
|
||||
AUTH_JWT_SECRET=$(openssl rand -hex 32)
|
||||
WEBHOOK_SECRET=$(openssl rand -hex 32)
|
||||
|
||||
# Transports: openai (OpenAI or any OpenAI-compatible endpoint), anthropic, gemini.
|
||||
# Embeddings run on openai or gemini only. Apply changes with: systemctl restart honcho honcho-deriver
|
||||
LLM_OPENAI_API_KEY=${HONCHO_KEY[openai]}
|
||||
LLM_ANTHROPIC_API_KEY=${HONCHO_KEY[anthropic]}
|
||||
LLM_GEMINI_API_KEY=${HONCHO_KEY[gemini]}
|
||||
|
||||
# An OpenAI-compatible endpoint (OpenRouter, Ollama, vLLM, LiteLLM) replaces api.openai.com through both lines:
|
||||
#LLM_OPENAI_BASE_URL=http://192.168.1.50:11434/v1
|
||||
#EMBEDDING_MODEL_CONFIG__OVERRIDES__BASE_URL=http://192.168.1.50:11434/v1
|
||||
# Endpoints without OpenAI Structured Outputs need:
|
||||
#DERIVER_MODEL_CONFIG__STRUCTURED_OUTPUT_MODE=json_object
|
||||
|
||||
EMBEDDING_MODEL_CONFIG__TRANSPORT=${HONCHO_EMBEDDING}
|
||||
EMBEDDING_MODEL_CONFIG__MODEL=${HONCHO_EMBEDDING_MODEL}
|
||||
# A model with another vector size works only while nothing is embedded yet: set it here, then run
|
||||
# cd /opt/honcho && .venv/bin/python scripts/configure_embeddings.py --yes
|
||||
#EMBEDDING_VECTOR_DIMENSIONS=1536
|
||||
|
||||
# The deriver waits for about 512 new tokens per peer, or 30 minutes, before it calls the LLM
|
||||
#DERIVER_FLUSH_ENABLED=true
|
||||
|
||||
# Models for the deriver, summaries, dreams and dialectic chat; they must support tool calling
|
||||
EOF
|
||||
for prefix in DERIVER SUMMARY DREAM_DEDUCTION DREAM_INDUCTION DIALECTIC_LEVELS__{minimal,low,medium,high,max}_; do
|
||||
cat <<EOF >>/opt/honcho_data/.env
|
||||
${prefix}_MODEL_CONFIG__TRANSPORT=${HONCHO_TRANSPORT}
|
||||
${prefix}_MODEL_CONFIG__MODEL=${HONCHO_MODEL}
|
||||
EOF
|
||||
done
|
||||
if [[ -n "${var_honcho_base_url:-}" ]]; then
|
||||
cat <<EOF >>/opt/honcho_data/.env
|
||||
|
||||
LLM_OPENAI_BASE_URL=${var_honcho_base_url}
|
||||
EMBEDDING_MODEL_CONFIG__OVERRIDES__BASE_URL=${var_honcho_base_url}
|
||||
EOF
|
||||
fi
|
||||
if [[ -n "${var_honcho_embedding_dims:-}" ]]; then
|
||||
cat <<EOF >>/opt/honcho_data/.env
|
||||
EMBEDDING_VECTOR_DIMENSIONS=${var_honcho_embedding_dims}
|
||||
EOF
|
||||
fi
|
||||
chmod 600 /opt/honcho_data/.env
|
||||
ln -sf /opt/honcho_data/.env /opt/honcho/.env
|
||||
msg_ok "Configured Honcho"
|
||||
|
||||
msg_info "Migrating Honcho Database"
|
||||
$STD .venv/bin/python scripts/provision_db.py
|
||||
$STD .venv/bin/python scripts/configure_embeddings.py --yes
|
||||
msg_ok "Migrated Honcho Database"
|
||||
|
||||
msg_info "Creating Honcho Services"
|
||||
cat <<EOF >/etc/systemd/system/honcho.service
|
||||
[Unit]
|
||||
Description=Honcho API
|
||||
After=network.target postgresql.service redis-server.service
|
||||
Requires=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/honcho
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
ExecStart=/opt/honcho/.venv/bin/fastapi run --host 0.0.0.0 --port 8000 src/main.py
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
cat <<EOF >/etc/systemd/system/honcho-deriver.service
|
||||
[Unit]
|
||||
Description=Honcho Deriver
|
||||
After=network.target postgresql.service redis-server.service honcho.service
|
||||
Requires=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/honcho
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
ExecStart=/opt/honcho/.venv/bin/python -m src.deriver
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
msg_ok "Created Honcho Services"
|
||||
|
||||
if [[ -n "${HONCHO_KEY[$HONCHO_TRANSPORT]}" && -n "${HONCHO_KEY[$HONCHO_EMBEDDING]}" ]]; then
|
||||
msg_info "Starting Honcho"
|
||||
systemctl enable -q --now honcho honcho-deriver
|
||||
msg_ok "Started Honcho"
|
||||
else
|
||||
msg_warn "No LLM provider key (with Anthropic also an OpenAI key for embeddings): Honcho stays stopped until it is set in /opt/honcho_data/.env"
|
||||
fi
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -13,11 +13,6 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
if is_debian && [[ "$(get_os_version_major)" -lt 13 ]]; then
|
||||
msg_error "Immich needs Debian 13: its build dependencies and Intel runtime packages are not available on Debian 12."
|
||||
exit 238
|
||||
fi
|
||||
|
||||
RELEASE="v3.3.5"
|
||||
if lscpu | grep -q 'GenuineIntel'; then
|
||||
echo ""
|
||||
@@ -397,7 +392,6 @@ cp LICENSE "$APP_DIR"
|
||||
cd "$SRC_DIR"
|
||||
export MISE_TRUSTED_CONFIG_PATHS="$SRC_DIR"/mise.toml
|
||||
export MISE_DISABLE_TOOLS=github:jellyfin/jellyfin-ffmpeg
|
||||
export MISE_LOCKFILE_MODE=merge MISE_LOCKFILE_PLATFORMS="linux-$(arch_resolve x64 arm64)"
|
||||
mise_ok=0
|
||||
for i in 1 2 3; do
|
||||
$STD mise install && {
|
||||
|
||||
@@ -13,12 +13,6 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
if [[ "${CTTYPE:-1}" != "0" ]]; then
|
||||
msg_error "iVentoy requires a privileged LXC container."
|
||||
msg_error "Recreate the container with unprivileged=0."
|
||||
exit 10
|
||||
fi
|
||||
|
||||
fetch_and_deploy_gh_release "iventoy" "ventoy/PXE" "prebuild" "latest" "/opt/iventoy" "iventoy-*-linux-$(arch_resolve x86_64-free arm64-trial).tar.gz"
|
||||
mkdir -p /opt/iventoy/{data,iso}
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ $STD apt install -y \
|
||||
libldap-common \
|
||||
libssl-dev \
|
||||
libldap2 \
|
||||
ffmpeg \
|
||||
gosu \
|
||||
iproute2
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y ca-certificates
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
|
||||
msg_info "Installing MeshCentral"
|
||||
mkdir /opt/meshcentral
|
||||
|
||||
@@ -14,9 +14,7 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
git \
|
||||
nginx
|
||||
$STD apt install -y nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
@@ -26,8 +24,6 @@ msg_info "Building OmniTools"
|
||||
cd /opt/omnitools
|
||||
export HUSKY=0
|
||||
$STD npm ci --allow-remote=all
|
||||
$STD git init -q
|
||||
$STD git -c user.name=build -c user.email=build@localhost commit -q --allow-empty -m build
|
||||
$STD npm run build
|
||||
msg_ok "Built OmniTools"
|
||||
|
||||
|
||||
@@ -80,6 +80,7 @@ set -a
|
||||
. /opt/paperless/paperless.conf
|
||||
set +a
|
||||
$STD uv run -- python manage.py migrate
|
||||
$STD uv run -- python manage.py reindex
|
||||
msg_ok "Setup Paperless-ngx"
|
||||
|
||||
msg_info "Setting up admin Paperless-ngx User & Password"
|
||||
|
||||
@@ -22,9 +22,7 @@ msg_ok "Installed Dependencies"
|
||||
msg_info "Installing Pi-hole"
|
||||
mkdir -p /etc/pihole
|
||||
touch /etc/pihole/pihole.toml
|
||||
curl_with_retry "https://install.pi-hole.net" /tmp/pihole-install.sh
|
||||
$STD bash /tmp/pihole-install.sh --unattended
|
||||
rm -f /tmp/pihole-install.sh
|
||||
$STD bash <(curl -fsSL https://install.pi-hole.net) --unattended
|
||||
sed -i -E '
|
||||
/^\s*upstreams =/ s|=.*|= ["8.8.8.8", "8.8.4.4"]|
|
||||
/^\s*interface =/ s|=.*|= "eth0"|
|
||||
|
||||
@@ -51,11 +51,11 @@ ADMIN_EMAIL="${var_pterodactyl_panel_admin_email:-}"
|
||||
[[ -n "$ADMIN_EMAIL" ]] || read -r -p "${TAB3}Provide an email address for admin login, this should be a valid email address: " ADMIN_EMAIL || true
|
||||
[[ -n "$ADMIN_EMAIL" ]] || { msg_error "No admin email given; set var_pterodactyl_panel_admin_email or answer the prompt"; exit 64; }
|
||||
NAME_FIRST="${var_pterodactyl_panel_first_name:-}"
|
||||
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name [Admin]: " NAME_FIRST || true
|
||||
NAME_FIRST="${NAME_FIRST:-Admin}"
|
||||
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name: " NAME_FIRST || true
|
||||
[[ -n "$NAME_FIRST" ]] || { msg_error "No first name given; set var_pterodactyl_panel_first_name or answer the prompt"; exit 64; }
|
||||
NAME_LAST="${var_pterodactyl_panel_last_name:-}"
|
||||
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name [User]: " NAME_LAST || true
|
||||
NAME_LAST="${NAME_LAST:-User}"
|
||||
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name: " NAME_LAST || true
|
||||
[[ -n "$NAME_LAST" ]] || { msg_error "No last name given; set var_pterodactyl_panel_last_name or answer the prompt"; exit 64; }
|
||||
|
||||
fetch_and_deploy_gh_release "pterodactyl-panel" "pterodactyl/panel" "prebuild" "latest" "/opt/pterodactyl-panel" "panel.tar.gz"
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
|
||||
setup_ffmpeg
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_DB_NAME="readmeabook" PG_DB_USER="readmeabook" setup_postgresql_db
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
NODE_VERSION="20" setup_nodejs
|
||||
|
||||
fetch_and_deploy_gh_release "readmeabook" "kikootwo/ReadMeABook" "tarball"
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ $STD /opt/splunk/bin/splunk enable boot-start \
|
||||
--no-prompt
|
||||
chown -R splunk:splunk /opt/splunk
|
||||
$STD systemctl daemon-reload
|
||||
$STD systemctl enable --now splunkd
|
||||
$STD systemctl enable --now Splunkd
|
||||
msg_ok "Started Service"
|
||||
|
||||
motd_ssh
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
#!/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/fredrikburmester/streamystats
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y unzip
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
|
||||
PG_DB_NAME="streamystats" PG_DB_USER="streamystats" PG_DB_EXTENSIONS="vector,pg_trgm,uuid-ossp" setup_postgresql_db
|
||||
|
||||
msg_info "Installing Bun"
|
||||
export BUN_INSTALL="/root/.bun"
|
||||
curl -fsSL https://bun.sh/install | $STD bash
|
||||
ln -sf /root/.bun/bin/bun /usr/local/bin/bun
|
||||
ln -sf /root/.bun/bin/bunx /usr/local/bin/bunx
|
||||
msg_ok "Installed Bun"
|
||||
|
||||
fetch_and_deploy_gh_release "streamystats" "fredrikburmester/streamystats" "tarball"
|
||||
|
||||
msg_info "Building Streamystats"
|
||||
cd /opt/streamystats
|
||||
$STD bun install --frozen-lockfile
|
||||
NEXT_TELEMETRY_DISABLED=1 NEXT_PUBLIC_VERSION="v$(cat ~/.streamystats)" $STD bun run build
|
||||
msg_ok "Built Streamystats"
|
||||
|
||||
msg_info "Configuring Streamystats"
|
||||
mkdir -p /opt/streamystats_data
|
||||
cat <<EOF >/opt/streamystats_data/.env
|
||||
NODE_ENV=production
|
||||
NEXT_TELEMETRY_DISABLED=1
|
||||
DATABASE_URL=postgresql://streamystats:${PG_DB_PASS}@127.0.0.1:5432/streamystats
|
||||
JOB_SERVER_URL=http://127.0.0.1:3005
|
||||
NEXTJS_URL=http://127.0.0.1:3000
|
||||
SESSION_SECRET=$(openssl rand -hex 64)
|
||||
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY=$(openssl rand -base64 32)
|
||||
EOF
|
||||
chmod 600 /opt/streamystats_data/.env
|
||||
msg_ok "Configured Streamystats"
|
||||
|
||||
msg_info "Migrating Streamystats Database"
|
||||
$STD bun --env-file=/opt/streamystats_data/.env run db:migrate
|
||||
msg_ok "Migrated Streamystats Database"
|
||||
|
||||
msg_info "Creating Services"
|
||||
cat <<EOF >/etc/systemd/system/streamystats-job-server.service
|
||||
[Unit]
|
||||
Description=Streamystats Job Server
|
||||
After=network.target postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/streamystats/apps/job-server
|
||||
EnvironmentFile=/opt/streamystats_data/.env
|
||||
Environment=HOST=127.0.0.1
|
||||
Environment=PORT=3005
|
||||
ExecStart=/usr/local/bin/bun run start
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
cat <<EOF >/etc/systemd/system/streamystats-nextjs-app.service
|
||||
[Unit]
|
||||
Description=Streamystats Web
|
||||
After=network.target streamystats-job-server.service
|
||||
Wants=streamystats-job-server.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/streamystats/apps/nextjs-app
|
||||
EnvironmentFile=/opt/streamystats_data/.env
|
||||
Environment=PORT=3000
|
||||
ExecStart=/usr/local/bin/bun run start
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now streamystats-job-server streamystats-nextjs-app
|
||||
msg_ok "Created Services"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -1,135 +0,0 @@
|
||||
#!/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/Gimanh/taskview-community
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
PG_VERSION="18" setup_postgresql
|
||||
PG_DB_NAME="taskview" PG_DB_USER="taskview" setup_postgresql_db
|
||||
|
||||
msg_info "Configuring PostgreSQL for TaskView"
|
||||
# Every migration run terminates all other sessions on the database, autovacuum workers included
|
||||
$STD sudo -u postgres psql -c "GRANT pg_signal_autovacuum_worker TO taskview;"
|
||||
msg_ok "Configured PostgreSQL for TaskView"
|
||||
|
||||
fetch_and_deploy_gh_release "taskview" "Gimanh/taskview-community" "tarball"
|
||||
|
||||
msg_info "Building TaskView"
|
||||
cd /opt/taskview
|
||||
$STD pnpm install --frozen-lockfile
|
||||
cd /opt/taskview/api
|
||||
$STD pnpm run build:docker
|
||||
$STD pnpm run build:migration
|
||||
cp -r src/migrations/taskview dist-migration/
|
||||
cd /opt/taskview/web
|
||||
# upstream's build script type-checks before Vite has generated the auto-import types, which fails on a fresh checkout
|
||||
$STD pnpm run build:packages
|
||||
$STD pnpm run build-only
|
||||
msg_ok "Built TaskView"
|
||||
|
||||
msg_info "Configuring TaskView"
|
||||
mkdir -p /opt/taskview_data
|
||||
cat <<EOF >/opt/taskview_data/.env
|
||||
NODE_ENV=production
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_NAME=taskview
|
||||
DB_USER=taskview
|
||||
DB_PASSWORD=${PG_DB_PASS}
|
||||
APP_PORT=1401
|
||||
APP_URL=http://${LOCAL_IP}
|
||||
CORS_ALLOWED_ORIGINS=http://${LOCAL_IP}
|
||||
TRUST_PROXY=1
|
||||
JWT_ALG=HS256
|
||||
JWT_SIGN=$(openssl rand -hex 64)
|
||||
ACCESS_LIFE_TIME=3d
|
||||
REFRESH_LIFE_TIME=9d
|
||||
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||
PASSWORD_CHANGE_CONFIRMATION=password
|
||||
EOF
|
||||
chmod 600 /opt/taskview_data/.env
|
||||
msg_ok "Configured TaskView"
|
||||
|
||||
msg_info "Creating TaskView Database Schema"
|
||||
# The migration reads DB_* from the .env in its working directory
|
||||
cd /opt/taskview_data
|
||||
$STD node /opt/taskview/api/dist-migration/taskview-db-migration.js --create
|
||||
msg_ok "Created TaskView Database Schema"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
cat <<'EOF' >/etc/nginx/sites-available/taskview
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /opt/taskview/web/dist;
|
||||
index index.html;
|
||||
|
||||
gzip_types text/css application/javascript application/json image/svg+xml;
|
||||
|
||||
location ~ ^/(module|scim|\.well-known)/ {
|
||||
proxy_pass http://127.0.0.1:1401;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Pins the web client to the API behind this same origin and hides the server selector
|
||||
location = /config.js {
|
||||
default_type application/javascript;
|
||||
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||
return 200 'window.__TASKVIEW_CONFIG__ = { apiUrl: window.location.origin };';
|
||||
}
|
||||
|
||||
location = /index.html {
|
||||
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
nginx_enable_site "taskview"
|
||||
msg_ok "Configured Nginx"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/taskview.service
|
||||
[Unit]
|
||||
Description=TaskView API
|
||||
After=network.target postgresql.service
|
||||
Requires=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/taskview_data
|
||||
EnvironmentFile=/opt/taskview_data/.env
|
||||
ExecStart=/usr/bin/node /opt/taskview/api/dist/taskview-server.js
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now taskview
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -17,7 +17,6 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
build-essential \
|
||||
libkitinerary-bin
|
||||
ln -sf "$(find /usr/lib -name kitinerary-extractor -type f | head -1)" /usr/local/bin/kitinerary-extractor
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
@@ -25,7 +24,7 @@ fetch_and_deploy_gh_release "trek" "liketrek/TREK" "tarball"
|
||||
|
||||
msg_info "Setup TREK"
|
||||
cd /opt/trek
|
||||
$STD npm ci --ignore-scripts
|
||||
$STD npm ci
|
||||
$STD npm run build --workspace=shared
|
||||
$STD npm run build --workspace=client
|
||||
$STD npm run build --workspace=server
|
||||
@@ -44,16 +43,13 @@ mkdir -p \
|
||||
/opt/trek/uploads/files \
|
||||
/opt/trek/uploads/covers \
|
||||
/opt/trek/uploads/avatars \
|
||||
/opt/trek/uploads/photos \
|
||||
/opt/trek/uploads/journey \
|
||||
/opt/trek/uploads/places
|
||||
/opt/trek/uploads/photos
|
||||
rm -rf /opt/trek/server/data
|
||||
rm -rf /opt/trek/server/uploads
|
||||
ln -s /opt/trek/data /opt/trek/server/data
|
||||
ln -s /opt/trek/uploads /opt/trek/server/uploads
|
||||
rm -rf /opt/trek/node_modules
|
||||
cd /opt/trek
|
||||
$STD npm ci --workspace=server --omit=dev --ignore-scripts
|
||||
$STD npm prune --omit=dev
|
||||
msg_ok "Set up TREK Workspace"
|
||||
|
||||
msg_info "Configuring TREK"
|
||||
|
||||
@@ -17,6 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
build-essential \
|
||||
git \
|
||||
nginx \
|
||||
redis-server \
|
||||
atomicparsley \
|
||||
python3-dev \
|
||||
@@ -106,7 +107,7 @@ cat <<EOF >/opt/tubearchivist/.env
|
||||
TA_HOST=http://${LOCAL_IP}:8000
|
||||
TA_USERNAME=admin
|
||||
TA_PASSWORD=${TA_PASSWORD}
|
||||
TA_PORT=8000
|
||||
TA_BACKEND_PORT=8080
|
||||
TA_APP_DIR=/opt/tubearchivist/backend
|
||||
TA_CACHE_DIR=/cache
|
||||
TA_MEDIA_DIR=/youtube
|
||||
@@ -132,6 +133,92 @@ msg_info "Installing yt-dlp Nightly"
|
||||
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python -U --prerelease allow "yt-dlp[default]"
|
||||
msg_ok "Installed yt-dlp Nightly"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
sed -i 's/^user www-data;$/user root;/' /etc/nginx/nginx.conf
|
||||
cat <<'EOF' >/etc/nginx/sites-available/default
|
||||
server {
|
||||
listen 8000;
|
||||
|
||||
location = /_auth {
|
||||
internal;
|
||||
proxy_pass http://localhost:8080/api/ping/;
|
||||
proxy_pass_request_body off;
|
||||
proxy_set_header Content-Length "";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header Cookie $http_cookie;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /cache/videos/ {
|
||||
auth_request /_auth;
|
||||
alias /cache/videos/;
|
||||
}
|
||||
|
||||
location /cache/channels/ {
|
||||
auth_request /_auth;
|
||||
alias /cache/channels/;
|
||||
}
|
||||
|
||||
location /cache/playlists/ {
|
||||
auth_request /_auth;
|
||||
alias /cache/playlists/;
|
||||
}
|
||||
|
||||
location /media/ {
|
||||
auth_request /_auth;
|
||||
alias /youtube/;
|
||||
types {
|
||||
text/vtt vtt;
|
||||
}
|
||||
}
|
||||
|
||||
location /youtube/ {
|
||||
auth_request /_auth;
|
||||
alias /youtube/;
|
||||
types {
|
||||
video/mp4 mp4;
|
||||
}
|
||||
}
|
||||
|
||||
location /api {
|
||||
include proxy_params;
|
||||
proxy_pass http://localhost:8080;
|
||||
}
|
||||
|
||||
location /admin {
|
||||
include proxy_params;
|
||||
proxy_pass http://localhost:8080;
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
alias /opt/tubearchivist/backend/staticfiles/;
|
||||
}
|
||||
|
||||
root /opt/tubearchivist/backend/static;
|
||||
index index.html;
|
||||
|
||||
location ~* ^/(?!static/|cache/).*\.(?:css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
|
||||
location = /index.html {
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate";
|
||||
add_header Pragma "no-cache";
|
||||
expires 0;
|
||||
}
|
||||
|
||||
location / {
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate";
|
||||
add_header Pragma "no-cache";
|
||||
expires 0;
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
systemctl enable -q nginx
|
||||
systemctl restart nginx
|
||||
msg_ok "Configured Nginx"
|
||||
|
||||
msg_info "Creating Services"
|
||||
cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh
|
||||
#!/bin/bash
|
||||
@@ -150,7 +237,6 @@ for i in $(seq 1 30); do
|
||||
sleep 2
|
||||
done
|
||||
|
||||
$PYTHON manage.py ta_stop_on_error
|
||||
$PYTHON manage.py migrate
|
||||
$PYTHON manage.py collectstatic --noinput -c
|
||||
$PYTHON manage.py ta_envcheck
|
||||
|
||||
85
install/verdaccio-install.sh
Normal file
85
install/verdaccio-install.sh
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: BrynnJKnight
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://verdaccio.org/ | Github: https://github.com/verdaccio/verdaccio
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y build-essential
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="verdaccio" setup_nodejs
|
||||
|
||||
msg_info "Configuring Verdaccio"
|
||||
mkdir -p /opt/verdaccio/config
|
||||
mkdir -p /opt/verdaccio/storage
|
||||
cat <<EOF >/opt/verdaccio/config/config.yaml
|
||||
# Verdaccio configuration
|
||||
storage: /opt/verdaccio/storage
|
||||
auth:
|
||||
htpasswd:
|
||||
file: /opt/verdaccio/storage/htpasswd
|
||||
max_users: 1000
|
||||
uplinks:
|
||||
npmjs:
|
||||
url: https://registry.npmjs.org/
|
||||
packages:
|
||||
'@*/*':
|
||||
access: \$all
|
||||
publish: \$authenticated
|
||||
proxy: npmjs
|
||||
'**':
|
||||
access: \$all
|
||||
publish: \$authenticated
|
||||
proxy: npmjs
|
||||
middlewares:
|
||||
audit:
|
||||
enabled: true
|
||||
logs:
|
||||
- {type: stdout, format: pretty, level: http}
|
||||
listen:
|
||||
- 0.0.0.0:4873
|
||||
web:
|
||||
enable: true
|
||||
title: Verdaccio
|
||||
gravatar: true
|
||||
sort_packages: asc
|
||||
login: true
|
||||
EOF
|
||||
chown -R root:root /opt/verdaccio
|
||||
chmod -R 755 /opt/verdaccio
|
||||
msg_ok "Configured Verdaccio"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/verdaccio.service
|
||||
[Unit]
|
||||
Description=Verdaccio lightweight private npm proxy registry
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/verdaccio --config /opt/verdaccio/config/config.yaml
|
||||
Restart=on-failure
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=verdaccio
|
||||
KillMode=control-group
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now verdaccio
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -1,73 +0,0 @@
|
||||
#!/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/arabcoders/ytptube
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y libmagic1
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
setup_ffmpeg
|
||||
setup_hwaccel
|
||||
NODE_VERSION="24" NODE_MODULE="bun" setup_nodejs
|
||||
PYTHON_VERSION="3.13" setup_uv
|
||||
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-$(arch_resolve "x86_64" "aarch64")-unknown-linux-gnu.zip"
|
||||
fetch_and_deploy_gh_release "ytptube" "arabcoders/ytptube" "tarball"
|
||||
|
||||
msg_info "Building YTPTube"
|
||||
cd /opt/ytptube/ui
|
||||
$STD bun install --frozen-lockfile --production
|
||||
NODE_ENV=production $STD bun run generate
|
||||
rm -rf /opt/ytptube/ui/node_modules
|
||||
cd /opt/ytptube
|
||||
sed -i "s/^APP_VERSION = .*/APP_VERSION = \"v$(cat ~/.ytptube)\"/" app/library/version.py
|
||||
$STD uv sync --locked --no-dev
|
||||
$STD uv pip install --python .venv/bin/python pip
|
||||
msg_ok "Built YTPTube"
|
||||
|
||||
msg_info "Configuring YTPTube"
|
||||
mkdir -p /opt/ytptube_data/{config,downloads,tmp}
|
||||
cat <<EOF >/opt/ytptube_data/config/.env
|
||||
YTP_PORT=8081
|
||||
YTP_CONFIG_PATH=/opt/ytptube_data/config
|
||||
YTP_DOWNLOAD_PATH=/opt/ytptube_data/downloads
|
||||
YTP_TEMP_PATH=/opt/ytptube_data/tmp
|
||||
EOF
|
||||
msg_ok "Configured YTPTube"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/ytptube.service
|
||||
[Unit]
|
||||
Description=YTPTube
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/ytptube
|
||||
EnvironmentFile=/opt/ytptube_data/config/.env
|
||||
Environment=PATH=/opt/ytptube/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
|
||||
ExecStartPre=-/opt/ytptube/.venv/bin/python /opt/ytptube/app/upgrader.py
|
||||
ExecStart=/opt/ytptube/.venv/bin/python /opt/ytptube/app/main.py
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now ytptube
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -314,54 +314,21 @@ EOF
|
||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" \
|
||||
"Supporting the software's development team is essential.\nPlease consider buying a subscription." 10 58
|
||||
msg_info "Disabling subscription nag"
|
||||
mkdir -p /usr/local/bin
|
||||
cat >/usr/local/bin/pmg-remove-nag.sh <<'EOF'
|
||||
#!/bin/sh
|
||||
WEB_JS=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
|
||||
if [ -s "$WEB_JS" ] && ! grep -q NoMoreNagging "$WEB_JS"; then
|
||||
sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' "$WEB_JS"
|
||||
fi
|
||||
|
||||
MOBILE_JS=/usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js
|
||||
if [ -s "$MOBILE_JS" ] && ! grep -q NoMoreNagging "$MOBILE_JS"; then
|
||||
sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' "$MOBILE_JS"
|
||||
fi
|
||||
|
||||
MOBILE_TPL=/usr/share/pmg-mobile-quarantine-ui/pmg-mobile-index.html.tt
|
||||
if [ -s "$MOBILE_TPL" ] && ! grep -q NoMoreNagging "$MOBILE_TPL"; then
|
||||
sed -i '/<head>/r /dev/stdin' "$MOBILE_TPL" <<'HTML'
|
||||
<script>
|
||||
// NoMoreNagging
|
||||
const nativeFetch = window.fetch.bind(window);
|
||||
window.fetch = async (...args) => {
|
||||
const res = await nativeFetch(...args);
|
||||
if (!String(args[0]?.url ?? args[0]).includes('/nodes/localhost/subscription')) return res;
|
||||
const body = await res.clone().json().catch(() => null);
|
||||
if (!body?.data) return res;
|
||||
body.data.status = 'active';
|
||||
return new Response(JSON.stringify(body), { status: res.status, headers: res.headers });
|
||||
};
|
||||
</script>
|
||||
HTML
|
||||
fi
|
||||
EOF
|
||||
chmod 755 /usr/local/bin/pmg-remove-nag.sh
|
||||
|
||||
cat >/etc/apt/apt.conf.d/no-nag-script <<'EOF'
|
||||
DPkg::Post-Invoke { "/usr/local/bin/pmg-remove-nag.sh"; };
|
||||
DPkg::Post-Invoke { "if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi"; };
|
||||
EOF
|
||||
|
||||
cat >/etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile <<'EOF'
|
||||
DPkg::Post-Invoke { "if [ -s /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; then sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; fi"; };
|
||||
EOF
|
||||
rm -f /etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile
|
||||
msg_ok "Disabled subscription nag (clear browser cache!)"
|
||||
;;
|
||||
no)
|
||||
msg_error "Selected no to Disabling subscription nag"
|
||||
rm -f /etc/apt/apt.conf.d/no-nag-script /etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile /usr/local/bin/pmg-remove-nag.sh
|
||||
rm -f /etc/apt/apt.conf.d/no-nag-script 2>/dev/null
|
||||
;;
|
||||
esac
|
||||
apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null || msg_error "Widget toolkit reinstall failed"
|
||||
if dpkg -s pmg-mobile-quarantine-ui &>/dev/null; then
|
||||
apt --reinstall install pmg-mobile-quarantine-ui &>/dev/null || msg_error "Mobile quarantine UI reinstall failed"
|
||||
fi
|
||||
|
||||
# ---- UPDATE ----
|
||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu \
|
||||
|
||||
@@ -149,7 +149,7 @@ rm -f "$FILE_IMG"
|
||||
msg_info "Attaching EFI and root disk"
|
||||
qm set $VMID \
|
||||
--efidisk0 ${STORAGE}:0,efitype=4m \
|
||||
--scsi0 ${DISK_REF},${DISK_CACHE}ssd=1,discard=on \
|
||||
--scsi0 ${DISK_REF},ssd=1,discard=on \
|
||||
--boot order=scsi0 \
|
||||
--serial0 socket >/dev/null
|
||||
qm set $VMID --agent enabled=1 >/dev/null
|
||||
|
||||
@@ -201,12 +201,12 @@ DISK_REF="${STORAGE}:${DISK_REF:-}${DISK_VAR:-}"
|
||||
|
||||
msg_ok "Extracted Mikrotik RouterOS CHR Disk Image"
|
||||
msg_info "Creating Mikrotik RouterOS CHR VM"
|
||||
qm create $VMID${MACHINE} -tablet 0 -localtime 1${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE -name $HN \
|
||||
qm create $VMID -tablet 0 -localtime 1 -cores $CORE_COUNT -memory $RAM_SIZE -name $HN \
|
||||
-tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU \
|
||||
-onboot 1 -ostype l26 -scsihw virtio-scsi-pci
|
||||
qm importdisk $VMID "$FILE" $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
|
||||
qm set $VMID \
|
||||
-scsi0 "${DISK_REF},${DISK_CACHE}${THIN%,}" \
|
||||
-scsi0 "$DISK_REF" \
|
||||
-boot order=scsi0 >/dev/null
|
||||
|
||||
set_description
|
||||
|
||||
@@ -161,7 +161,7 @@ msg_info "Creating TrueNAS VM shell"
|
||||
qm create "$VMID"${MACHINE} -bios ovmf -agent enabled=1 -tablet 0 -localtime 1${CPU_TYPE} \
|
||||
-cores "$CORE_COUNT" -memory "$RAM_SIZE" -balloon 0 -name "$HN" -tags community-script \
|
||||
-net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 \
|
||||
-efidisk0 $STORAGE:1,efitype=4m,pre-enrolled-keys=0 -sata0 ${STORAGE}:${DISK_SIZE%G},${DISK_CACHE}ssd=1 \
|
||||
-efidisk0 $STORAGE:1,efitype=4m,pre-enrolled-keys=0 -sata0 ${STORAGE}:${DISK_SIZE%G},ssd=1 \
|
||||
-scsihw virtio-scsi-single -cdrom "$ISO_VOLUME" -boot order='sata0;ide2' -vga virtio >/dev/null
|
||||
msg_ok "Created VM shell"
|
||||
|
||||
|
||||
@@ -374,7 +374,7 @@ vm_import_disk "$VMID" "$FILE" "$STORAGE" "$DISK_IMPORT_FORMAT"
|
||||
|
||||
qm set "$VMID" \
|
||||
-efidisk0 "${STORAGE}:0,efitype=4m" \
|
||||
-scsi0 "${VM_IMPORTED_DISK},${DISK_CACHE}${THIN}size=${DISK_SIZE}" \
|
||||
-scsi0 "${VM_IMPORTED_DISK},${DISK_CACHE}size=${DISK_SIZE}" \
|
||||
-boot order=scsi0 -serial0 socket >/dev/null
|
||||
vm_resize_disk
|
||||
qm set "$VMID" --agent enabled=1 >/dev/null
|
||||
|
||||
Reference in New Issue
Block a user