mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-12-23 07:26:24 +01:00
Compare commits
107 Commits
MickLesk-p
...
docs/updat
| Author | SHA1 | Date | |
|---|---|---|---|
| 53d505ce89 | |||
| d9425a1169 | |||
| a21066ac74 | |||
| c0231a08c2 | |||
| cfe518adce | |||
| 5ca27931a2 | |||
| 869a9f4ac3 | |||
| 4ddf86b9cd | |||
| 4e57145621 | |||
| ef2a511217 | |||
| 18bb7ae6c7 | |||
| 28d34e9169 | |||
| ddf8843b7b | |||
| 8212a44e5f | |||
| 134e7c1ae1 | |||
| 72f9ca70dc | |||
| 6dab7728df | |||
| abfe97a9c9 | |||
| 174721bc14 | |||
| 8c1f42f6c1 | |||
| 245578a2a3 | |||
| 4c9baeb755 | |||
| b9640c4211 | |||
| b7ef0f8f01 | |||
| 8f3fa0c88a | |||
| 867f3347c7 | |||
| 379515fcbc | |||
| 76dde80497 | |||
| 30625b38df | |||
| 741e4dbe6e | |||
| d7f9fe27c5 | |||
| d5531ad445 | |||
| 3cdf4ed664 | |||
| db2301d056 | |||
| 25afd9224c | |||
| 468f6bddf9 | |||
| 021297b2ce | |||
| 0c76ed793b | |||
| 47e65c71f6 | |||
| 83678f83c8 | |||
| 7dd547bde2 | |||
| ad18ca0ff7 | |||
| cb2d4c0051 | |||
| b9fa152253 | |||
| 2202d34eed | |||
| 2f8fbf1e3f | |||
| e027446b2c | |||
| 8a67635651 | |||
| 94744dadcf | |||
| 0a36329235 | |||
| cf8082c1f5 | |||
| c225692979 | |||
| 0863e2b991 | |||
| 621d4b4d5c | |||
| 00137d4441 | |||
| 159b5ee22e | |||
| 5beb983b7f | |||
| 13c29e5c51 | |||
| 69d17046aa | |||
| 04f4727de3 | |||
| c1445f30bf | |||
| 891caa7c94 | |||
| 17ff4078bb | |||
| 9022ab0e5f | |||
| e646522095 | |||
| 1a567facfa | |||
| 2c2a062b6a | |||
| 8b767ec68a | |||
| f334fda317 | |||
| 510278960b | |||
| 0a276749d7 | |||
| c1ef6d7c51 | |||
| e0e7aa94e8 | |||
| b829dcc849 | |||
| ab4a4709a1 | |||
| 503fc0e6e2 | |||
| bd3a5c98cf | |||
| 0e8d053ba0 | |||
| f0f0a63f6c | |||
| 7d865172ae | |||
| 21e0a8fced | |||
| fdb722fae3 | |||
| d86815d01d | |||
| 84d9a2957b | |||
| 5e3eca2832 | |||
| bc479d7ffe | |||
| 610ec3d157 | |||
| 6d26dc2043 | |||
| 6bdeddee37 | |||
| 25baf6c809 | |||
| f42a7becf5 | |||
| acdb3b5908 | |||
| cb13f5de3c | |||
| c4afe3349b | |||
| dcc4b316a9 | |||
| 7a7c9f9a22 | |||
| c1c223ea45 | |||
| b3629b47da | |||
| 82cdcf7bfe | |||
| a823241d96 | |||
| e64c07e44c | |||
| 21f7914294 | |||
| 30056854c9 | |||
| 15a061f976 | |||
| b279888e96 | |||
| c9dd003445 | |||
| 39821677f0 |
128
CHANGELOG.md
128
CHANGELOG.md
@ -10,6 +10,120 @@
|
|||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||||
|
|
||||||
|
## 2025-12-22
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Kometa: Fix update procedure [@tremor021](https://github.com/tremor021) ([#10217](https://github.com/community-scripts/ProxmoxVE/pull/10217))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- Invoice ninja [@DragoQC](https://github.com/DragoQC) ([#10223](https://github.com/community-scripts/ProxmoxVE/pull/10223))
|
||||||
|
|
||||||
|
## 2025-12-21
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Typo fix in Heimdall install script [@Turcid-uwu](https://github.com/Turcid-uwu) ([#10187](https://github.com/community-scripts/ProxmoxVE/pull/10187))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- recyclarr: add default daily cron job for recyclarr sync [@MickLesk](https://github.com/MickLesk) ([#10208](https://github.com/community-scripts/ProxmoxVE/pull/10208))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Optimize Jotty installation with standalone mode [@MickLesk](https://github.com/MickLesk) ([#10207](https://github.com/community-scripts/ProxmoxVE/pull/10207))
|
||||||
|
- unifi: remove mongodb 4.4 support | bump to java 21 [@MickLesk](https://github.com/MickLesk) ([#10206](https://github.com/community-scripts/ProxmoxVE/pull/10206))
|
||||||
|
- Refactor: Backrest [@tremor021](https://github.com/tremor021) ([#10193](https://github.com/community-scripts/ProxmoxVE/pull/10193))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Fix AMD GPU firmware installation by adding non-free repositories [@MickLesk](https://github.com/MickLesk) ([#10205](https://github.com/community-scripts/ProxmoxVE/pull/10205))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- pihole-exporter ([#10091](https://github.com/community-scripts/ProxmoxVE/pull/10091))
|
||||||
|
|
||||||
|
## 2025-12-20
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Update Technitium DNS and Restart Service [@DrEVILish](https://github.com/DrEVILish) ([#10181](https://github.com/community-scripts/ProxmoxVE/pull/10181))
|
||||||
|
- bump: ersatztv: deb13 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10174](https://github.com/community-scripts/ProxmoxVE/pull/10174))
|
||||||
|
|
||||||
|
## 2025-12-19
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Update Reitti to Java 25 for 3.0.0 compatibility [@Copilot](https://github.com/Copilot) ([#10164](https://github.com/community-scripts/ProxmoxVE/pull/10164))
|
||||||
|
- Bump Bar-Assistant to php 8.4 [@MickLesk](https://github.com/MickLesk) ([#10138](https://github.com/community-scripts/ProxmoxVE/pull/10138))
|
||||||
|
- Zabbix: Add version-specific SQL script path for 7.0 LTS [@MickLesk](https://github.com/MickLesk) ([#10142](https://github.com/community-scripts/ProxmoxVE/pull/10142))
|
||||||
|
- InfluxDB: Fix update function [@Liganic](https://github.com/Liganic) ([#10151](https://github.com/community-scripts/ProxmoxVE/pull/10151))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Bump Immich to v2.4.1 [@vhsdream](https://github.com/vhsdream) ([#10154](https://github.com/community-scripts/ProxmoxVE/pull/10154))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Cosmos: + Upgrade to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#10147](https://github.com/community-scripts/ProxmoxVE/pull/10147))
|
||||||
|
- Refactor: Proxmox-Mail-Gateway [@tremor021](https://github.com/tremor021) ([#10070](https://github.com/community-scripts/ProxmoxVE/pull/10070))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- core: Auto-cleanup after all update_script executions [@MickLesk](https://github.com/MickLesk) ([#10141](https://github.com/community-scripts/ProxmoxVE/pull/10141))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- fix: removed verbose option to avoid unnecessary output [@wolle604](https://github.com/wolle604) ([#10144](https://github.com/community-scripts/ProxmoxVE/pull/10144))
|
||||||
|
|
||||||
|
### ❔ Uncategorized
|
||||||
|
|
||||||
|
- Update paymenter.json(#10133) [@DragoQC](https://github.com/DragoQC) ([#10134](https://github.com/community-scripts/ProxmoxVE/pull/10134))
|
||||||
|
|
||||||
|
## 2025-12-18
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- [HOTFIX] Fix Scanopy release check [@vhsdream](https://github.com/vhsdream) ([#10097](https://github.com/community-scripts/ProxmoxVE/pull/10097))
|
||||||
|
- Fix cleanup issues in npm cache and rustup toolchain [@MickLesk](https://github.com/MickLesk) ([#10107](https://github.com/community-scripts/ProxmoxVE/pull/10107))
|
||||||
|
- Fix Zabbix 7.0 repository URL structure [@MickLesk](https://github.com/MickLesk) ([#10106](https://github.com/community-scripts/ProxmoxVE/pull/10106))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- bump pihole to debian 13 [@mschabhuettl](https://github.com/mschabhuettl) ([#10118](https://github.com/community-scripts/ProxmoxVE/pull/10118))
|
||||||
|
- Immich: v2.4.0 [@vhsdream](https://github.com/vhsdream) ([#10095](https://github.com/community-scripts/ProxmoxVE/pull/10095))
|
||||||
|
|
||||||
|
### 💾 Core
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- tools.func: hardening/Improve error handling and cleanup in shell functions [@MickLesk](https://github.com/MickLesk) ([#10116](https://github.com/community-scripts/ProxmoxVE/pull/10116))
|
||||||
|
|
||||||
|
### 🧰 Tools
|
||||||
|
|
||||||
|
- qbittorrent-exporter ([#10090](https://github.com/community-scripts/ProxmoxVE/pull/10090))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Improved error handling when a command does not exist [@wolle604](https://github.com/wolle604) ([#10089](https://github.com/community-scripts/ProxmoxVE/pull/10089))
|
||||||
|
|
||||||
## 2025-12-17
|
## 2025-12-17
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
@ -18,6 +132,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Semaphore: Fix release binary package fetching [@tremor021](https://github.com/tremor021) ([#10055](https://github.com/community-scripts/ProxmoxVE/pull/10055))
|
||||||
- update github repo for endurain [@johanngrobe](https://github.com/johanngrobe) ([#10074](https://github.com/community-scripts/ProxmoxVE/pull/10074))
|
- update github repo for endurain [@johanngrobe](https://github.com/johanngrobe) ([#10074](https://github.com/community-scripts/ProxmoxVE/pull/10074))
|
||||||
|
|
||||||
- #### ✨ New Features
|
- #### ✨ New Features
|
||||||
@ -25,6 +140,19 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
- use setup_hwaccel for robust hardware acceleration [@MickLesk](https://github.com/MickLesk) ([#10054](https://github.com/community-scripts/ProxmoxVE/pull/10054))
|
- use setup_hwaccel for robust hardware acceleration [@MickLesk](https://github.com/MickLesk) ([#10054](https://github.com/community-scripts/ProxmoxVE/pull/10054))
|
||||||
- add hardware acceleration support for 17 additional apps [@MickLesk](https://github.com/MickLesk) ([#10061](https://github.com/community-scripts/ProxmoxVE/pull/10061))
|
- add hardware acceleration support for 17 additional apps [@MickLesk](https://github.com/MickLesk) ([#10061](https://github.com/community-scripts/ProxmoxVE/pull/10061))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Telegraf: Small refactor [@tremor021](https://github.com/tremor021) ([#10056](https://github.com/community-scripts/ProxmoxVE/pull/10056))
|
||||||
|
- Refactor: Salt [@tremor021](https://github.com/tremor021) ([#10057](https://github.com/community-scripts/ProxmoxVE/pull/10057))
|
||||||
|
- Refactor: Resilio Sync [@tremor021](https://github.com/tremor021) ([#10058](https://github.com/community-scripts/ProxmoxVE/pull/10058))
|
||||||
|
- Refactor: Reitti [@tremor021](https://github.com/tremor021) ([#10059](https://github.com/community-scripts/ProxmoxVE/pull/10059))
|
||||||
|
- Refactor: Redis [@tremor021](https://github.com/tremor021) ([#10060](https://github.com/community-scripts/ProxmoxVE/pull/10060))
|
||||||
|
- Refactor: Reactive-Resume [@tremor021](https://github.com/tremor021) ([#10062](https://github.com/community-scripts/ProxmoxVE/pull/10062))
|
||||||
|
- Refactor: RDTClient [@tremor021](https://github.com/tremor021) ([#10064](https://github.com/community-scripts/ProxmoxVE/pull/10064))
|
||||||
|
- Refactor: RabbitMQ [@tremor021](https://github.com/tremor021) ([#10065](https://github.com/community-scripts/ProxmoxVE/pull/10065))
|
||||||
|
- Qdrant: Code cleanup [@tremor021](https://github.com/tremor021) ([#10066](https://github.com/community-scripts/ProxmoxVE/pull/10066))
|
||||||
|
- Refactor: Pterodactyl Wings [@tremor021](https://github.com/tremor021) ([#10069](https://github.com/community-scripts/ProxmoxVE/pull/10069))
|
||||||
|
|
||||||
## 2025-12-16
|
## 2025-12-16
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
@ -27,28 +27,18 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/garethgeorge/backrest/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
if check_for_gh_release "backrest" "garethgeorge/backrest"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop backrest
|
systemctl stop backrest
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating ${APP} to ${RELEASE}"
|
fetch_and_deploy_gh_release "backrest" "garethgeorge/backrest" "prebuild" "latest" "/opt/backrest/bin" "backrest_Linux_x86_64.tar.gz"
|
||||||
temp_file=$(mktemp)
|
|
||||||
rm -f /opt/backrest/bin/backrest
|
|
||||||
curl -fsSL "https://github.com/garethgeorge/backrest/releases/download/v${RELEASE}/backrest_Linux_x86_64.tar.gz" -o "$temp_file"
|
|
||||||
tar xzf $temp_file -C /opt/backrest/bin
|
|
||||||
chmod +x /opt/backrest/bin/backrest
|
|
||||||
rm -f "$temp_file"
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start backrest
|
systemctl start backrest
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,6 +34,8 @@ function update_script() {
|
|||||||
systemctl stop nginx
|
systemctl stop nginx
|
||||||
msg_ok "Stopped nginx"
|
msg_ok "Stopped nginx"
|
||||||
|
|
||||||
|
PHP_VERSION="8.4" PHP_FPM=YES PHP_MODULE="ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm" setup_php
|
||||||
|
|
||||||
msg_info "Backing up Bar Assistant"
|
msg_info "Backing up Bar Assistant"
|
||||||
mv /opt/bar-assistant /opt/bar-assistant-backup
|
mv /opt/bar-assistant /opt/bar-assistant-backup
|
||||||
msg_ok "Backed up Bar Assistant"
|
msg_ok "Backed up Bar Assistant"
|
||||||
|
|||||||
@ -5,14 +5,15 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://https://cosmos-cloud.io/
|
# Source: https://https://cosmos-cloud.io/
|
||||||
|
|
||||||
APP="cosmos"
|
APP="Cosmos"
|
||||||
var_tags="${var_tags:-os,docker}"
|
var_tags="${var_tags:-cloud;docker}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_disk="${var_disk:-8}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
var_fuse="${var_fuse:-yes}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
variables
|
variables
|
||||||
|
|||||||
@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
|
|||||||
var_ram="${var_ram:-1024}"
|
var_ram="${var_ram:-1024}"
|
||||||
var_disk="${var_disk:-5}"
|
var_disk="${var_disk:-5}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
var_gpu="${var_gpu:-yes}"
|
var_gpu="${var_gpu:-yes}"
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
|
______
|
||||||
_________ _________ ___ ____ _____
|
/ ____/___ _________ ___ ____ _____
|
||||||
/ ___/ __ \/ ___/ __ `__ \/ __ \/ ___/
|
/ / / __ \/ ___/ __ `__ \/ __ \/ ___/
|
||||||
/ /__/ /_/ (__ ) / / / / / /_/ (__ )
|
/ /___/ /_/ (__ ) / / / / / /_/ (__ )
|
||||||
\___/\____/____/_/ /_/ /_/\____/____/
|
\____/\____/____/_/ /_/ /_/\____/____/
|
||||||
|
|
||||||
|
|||||||
17
ct/homarr.sh
17
ct/homarr.sh
@ -35,22 +35,11 @@ function update_script() {
|
|||||||
msg_ok "Services Stopped"
|
msg_ok "Services Stopped"
|
||||||
|
|
||||||
if ! { grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr/.env 2>/dev/null || grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr.env 2>/dev/null; }; then
|
if ! { grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr/.env 2>/dev/null || grep -q '^REDIS_IS_EXTERNAL=' /opt/homarr.env 2>/dev/null; }; then
|
||||||
DEBIAN_VERSION=$(cat /etc/debian_version 2>/dev/null | cut -d'.' -f1)
|
|
||||||
if [[ -n "$DEBIAN_VERSION" ]] && [[ "$DEBIAN_VERSION" -lt 13 ]]; then
|
|
||||||
msg_warn "⚠️ COMPATIBILITY WARNING ⚠️"
|
|
||||||
msg_warn "You are running Debian ${DEBIAN_VERSION}. Homarr's requires Debian 13"
|
|
||||||
msg_warn ""
|
|
||||||
msg_warn "Please Upgrade to Debian 13:"
|
|
||||||
msg_warn "See: https://github.com/community-scripts/ProxmoxVE/discussions/7489"
|
|
||||||
msg_warn ""
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
msg_info "Fixing old structure"
|
msg_info "Fixing old structure"
|
||||||
# fix musl issues because homarr compiles on alpine not debian soure: https://github.com/alexander-akhmetov/python-telegram/issues/3
|
systemctl disable -q --now nginx
|
||||||
$STD apt install -y musl-dev
|
|
||||||
ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1
|
|
||||||
cp /opt/homarr/.env /opt/homarr.env
|
cp /opt/homarr/.env /opt/homarr.env
|
||||||
echo "REDIS_IS_EXTERNAL='true'" >> /opt/homarr.env
|
echo "REDIS_IS_EXTERNAL='true'" >> /opt/homarr.env
|
||||||
|
sed -i '/^\[Unit\]/a Requires=redis-server.service\nAfter=redis-server.service' /etc/systemd/system/homarr.service
|
||||||
sed -i 's|^ExecStart=.*|ExecStart=/opt/homarr/run.sh|' /etc/systemd/system/homarr.service
|
sed -i 's|^ExecStart=.*|ExecStart=/opt/homarr/run.sh|' /etc/systemd/system/homarr.service
|
||||||
sed -i 's|^EnvironmentFile=.*|EnvironmentFile=-/opt/homarr.env|' /etc/systemd/system/homarr.service
|
sed -i 's|^EnvironmentFile=.*|EnvironmentFile=-/opt/homarr.env|' /etc/systemd/system/homarr.service
|
||||||
chown -R redis:redis /appdata/redis
|
chown -R redis:redis /appdata/redis
|
||||||
@ -72,7 +61,7 @@ EOF
|
|||||||
|
|
||||||
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
|
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
|
||||||
setup_nodejs
|
setup_nodejs
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-amd64.tar.gz"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-debian-amd64.tar.gz"
|
||||||
|
|
||||||
msg_info "Updating Homarr"
|
msg_info "Updating Homarr"
|
||||||
cp /opt/homarr/redis.conf /etc/redis/redis.conf
|
cp /opt/homarr/redis.conf /etc/redis/redis.conf
|
||||||
|
|||||||
17
ct/immich.sh
17
ct/immich.sh
@ -74,23 +74,28 @@ EOF
|
|||||||
STAGING_DIR=/opt/staging
|
STAGING_DIR=/opt/staging
|
||||||
BASE_DIR=${STAGING_DIR}/base-images
|
BASE_DIR=${STAGING_DIR}/base-images
|
||||||
SOURCE_DIR=${STAGING_DIR}/image-source
|
SOURCE_DIR=${STAGING_DIR}/image-source
|
||||||
cd /root
|
cd /tmp
|
||||||
if [[ -f ~/.intel_version ]]; then
|
if [[ -f ~/.intel_version ]]; then
|
||||||
curl -fsSLO https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/machine-learning/Dockerfile
|
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
||||||
readarray -t INTEL_URLS < <(sed -n "/intel/p" ./Dockerfile | awk '{print $3}')
|
readarray -t INTEL_URLS < <(
|
||||||
INTEL_RELEASE="$(grep "intel-opencl-icd" ./Dockerfile | awk -F '_' '{print $2}')"
|
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
||||||
|
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
||||||
|
)
|
||||||
|
INTEL_RELEASE="$(grep "intel-opencl-icd_" ./Dockerfile | awk -F '_' '{print $2}')"
|
||||||
if [[ "$INTEL_RELEASE" != "$(cat ~/.intel_version)" ]]; then
|
if [[ "$INTEL_RELEASE" != "$(cat ~/.intel_version)" ]]; then
|
||||||
msg_info "Updating Intel iGPU dependencies"
|
msg_info "Updating Intel iGPU dependencies"
|
||||||
for url in "${INTEL_URLS[@]}"; do
|
for url in "${INTEL_URLS[@]}"; do
|
||||||
curl -fsSLO "$url"
|
curl -fsSLO "$url"
|
||||||
done
|
done
|
||||||
$STD apt-mark unhold libigdgmm12
|
$STD apt-mark unhold libigdgmm12
|
||||||
|
$STD apt install -y ./libigdgmm12*.deb
|
||||||
|
rm ./libigdgmm12*.deb
|
||||||
$STD apt install -y ./*.deb
|
$STD apt install -y ./*.deb
|
||||||
rm ./*.deb
|
rm ./*.deb
|
||||||
$STD apt-mark hold libigdgmm12
|
$STD apt-mark hold libigdgmm12
|
||||||
msg_ok "Intel iGPU dependencies updated"
|
msg_ok "Intel iGPU dependencies updated"
|
||||||
fi
|
fi
|
||||||
rm ~/Dockerfile
|
rm ./Dockerfile
|
||||||
fi
|
fi
|
||||||
if [[ -f ~/.immich_library_revisions ]]; then
|
if [[ -f ~/.immich_library_revisions ]]; then
|
||||||
libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
|
libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
|
||||||
@ -103,7 +108,7 @@ EOF
|
|||||||
msg_ok "Image-processing libraries up to date"
|
msg_ok "Image-processing libraries up to date"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="2.3.1"
|
RELEASE="2.4.1"
|
||||||
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop immich-web
|
systemctl stop immich-web
|
||||||
|
|||||||
@ -23,7 +23,7 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -f /etc/apt/sources.list.d/influxdata.list ]]; then
|
if [[ ! -f /usr/bin/influxd ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|||||||
29
ct/jotty.sh
29
ct/jotty.sh
@ -48,6 +48,17 @@ function update_script() {
|
|||||||
$STD yarn --frozen-lockfile
|
$STD yarn --frozen-lockfile
|
||||||
$STD yarn next telemetry disable
|
$STD yarn next telemetry disable
|
||||||
$STD yarn build
|
$STD yarn build
|
||||||
|
|
||||||
|
[ -d "public" ] && cp -r public .next/standalone/
|
||||||
|
[ -d "howto" ] && cp -r howto .next/standalone/
|
||||||
|
mkdir -p .next/standalone/.next
|
||||||
|
cp -r .next/static .next/standalone/.next/
|
||||||
|
|
||||||
|
mv .next/standalone /tmp/jotty_standalone
|
||||||
|
rm -rf * .next .git .gitignore .yarn
|
||||||
|
mv /tmp/jotty_standalone/* .
|
||||||
|
mv /tmp/jotty_standalone/.[!.]* . 2>/dev/null || true
|
||||||
|
rm -rf /tmp/jotty_standalone
|
||||||
msg_ok "Updated jotty"
|
msg_ok "Updated jotty"
|
||||||
|
|
||||||
msg_info "Restoring configuration & data"
|
msg_info "Restoring configuration & data"
|
||||||
@ -55,6 +66,24 @@ function update_script() {
|
|||||||
$STD tar -xf /opt/data_config.tar
|
$STD tar -xf /opt/data_config.tar
|
||||||
msg_ok "Restored configuration & data"
|
msg_ok "Restored configuration & data"
|
||||||
|
|
||||||
|
msg_info "Updating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/jotty.service
|
||||||
|
[Unit]
|
||||||
|
Description=jotty server
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/jotty
|
||||||
|
EnvironmentFile=/opt/jotty/.env
|
||||||
|
ExecStart=/usr/bin/node server.js
|
||||||
|
Restart=on-abnormal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
msg_ok "Updated Service"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start jotty
|
systemctl start jotty
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
|
|||||||
@ -41,6 +41,7 @@ function update_script() {
|
|||||||
fetch_and_deploy_gh_release "kometa" "Kometa-Team/Kometa"
|
fetch_and_deploy_gh_release "kometa" "Kometa-Team/Kometa"
|
||||||
|
|
||||||
msg_info "Updating Kometa"
|
msg_info "Updating Kometa"
|
||||||
|
cd /opt/kometa
|
||||||
$STD uv pip install -r requirements.txt --system
|
$STD uv pip install -r requirements.txt --system
|
||||||
mkdir -p config/assets
|
mkdir -p config/assets
|
||||||
cp /opt/config.yml config/config.yml
|
cp /opt/config.yml config/config.yml
|
||||||
|
|||||||
@ -52,7 +52,7 @@ function update_script() {
|
|||||||
$STD yarn web:build
|
$STD yarn web:build
|
||||||
$STD yarn prisma:deploy
|
$STD yarn prisma:deploy
|
||||||
[ -d /opt/data.bak ] && mv /opt/data.bak /opt/linkwarden/data
|
[ -d /opt/data.bak ] && mv /opt/data.bak /opt/linkwarden/data
|
||||||
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache ~/.rustup
|
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache
|
||||||
rm -rf /root/.cache/yarn
|
rm -rf /root/.cache/yarn
|
||||||
rm -rf /opt/linkwarden/.next/cache
|
rm -rf /opt/linkwarden/.next/cache
|
||||||
msg_ok "Updated ${APP}"
|
msg_ok "Updated ${APP}"
|
||||||
|
|||||||
@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
|
|||||||
var_ram="${var_ram:-512}"
|
var_ram="${var_ram:-512}"
|
||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@ -27,10 +27,11 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
|
msg_info "Updating Proxmox-Mail-Gateway"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt -y upgrade
|
$STD apt upgrade -y
|
||||||
msg_ok "Updated ${APP}"
|
msg_ok "Updated Proxmox-Mail-Gateway"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,29 +23,23 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -f /usr/local/bin/wings ]]; then
|
if [[ ! -x /usr/local/bin/wings ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/wings/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
if check_for_gh_release "wings" "pterodactyl/wings"; then
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
systemctl stop wings
|
systemctl stop wings
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Updating ${APP} to v${RELEASE}"
|
|
||||||
rm /usr/local/bin/wings
|
rm /usr/local/bin/wings
|
||||||
curl -fsSL "https://github.com/pterodactyl/wings/releases/download/v${RELEASE}/wings_linux_amd64" -o "/usr/local/bin/wings"
|
fetch_and_deploy_gh_release "wings" "pterodactyl/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_amd64"
|
||||||
chmod u+x /usr/local/bin/wings
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start wings
|
systemctl start wings
|
||||||
msg_ok "Started Service"
|
msg_ok "Started Service"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
|
||||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,16 +29,11 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
if grep -q "dl.cloudsmith.io" /etc/apt/sources.list.d/rabbitmq.list; then
|
if grep -q "dl.cloudsmith.io" /etc/apt/sources.list.d/rabbitmq.list; then
|
||||||
rm -f /etc/apt/sources.list.d/rabbitmq.list
|
rm -f /etc/apt/sources.list.d/rabbitmq.list
|
||||||
cat <<EOF >/etc/apt/sources.list.d/rabbitmq.list
|
setup_deb822_repo \
|
||||||
## Modern Erlang/OTP releases
|
"rabbitmq" \
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-erlang/debian/trixie trixie main
|
"https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" \
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-erlang/debian/trixie trixie main
|
"https://deb1.rabbitmq.com/rabbitmq-server/debian/trixie" \
|
||||||
|
"trixie"
|
||||||
## Provides modern RabbitMQ releases
|
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-server/debian/trixie trixie main
|
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-server/debian/trixie trixie main
|
|
||||||
EOF
|
|
||||||
$STD apt update
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Stopping Service"
|
msg_info "Stopping Service"
|
||||||
|
|||||||
@ -41,7 +41,7 @@ function update_script() {
|
|||||||
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/
|
||||||
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
|
||||||
$STD apt remove --purge -y dotnet-sdk-8.0
|
$STD apt remove --purge -y dotnet-sdk-8.0
|
||||||
$STD apt install -y dotnet-sdk-9.0
|
$STD apt install -y aspnetcore-runtime-9.0
|
||||||
fi
|
fi
|
||||||
rm -rf /opt/rdtc-backup
|
rm -rf /opt/rdtc-backup
|
||||||
|
|
||||||
|
|||||||
@ -33,12 +33,11 @@ function update_script() {
|
|||||||
systemctl stop Reactive-Resume
|
systemctl stop Reactive-Resume
|
||||||
msg_ok "Stopped services"
|
msg_ok "Stopped services"
|
||||||
|
|
||||||
cp /opt/"$APP"/.env /opt/rxresume.env
|
cp /opt/Reactive-Resume/.env /opt/rxresume.env
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "Reactive-Resume" "lazy-media/Reactive-Resume" "tarball" "latest" "/opt/Reactive-Resume"
|
fetch_and_deploy_gh_release "Reactive-Resume" "lazy-media/Reactive-Resume" "tarball" "latest" "/opt/Reactive-Resume"
|
||||||
|
|
||||||
msg_info "Updating $APP"
|
msg_info "Updating Reactive-Resume"
|
||||||
cd /opt/"$APP"
|
cd /opt/Reactive-Resume
|
||||||
export PUPPETEER_SKIP_DOWNLOAD="true"
|
export PUPPETEER_SKIP_DOWNLOAD="true"
|
||||||
export NEXT_TELEMETRY_DISABLED=1
|
export NEXT_TELEMETRY_DISABLED=1
|
||||||
export CI="true"
|
export CI="true"
|
||||||
@ -46,8 +45,8 @@ function update_script() {
|
|||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm run build
|
$STD pnpm run build
|
||||||
$STD pnpm run prisma:generate
|
$STD pnpm run prisma:generate
|
||||||
mv /opt/rxresume.env /opt/"$APP"/.env
|
mv /opt/rxresume.env /opt/Reactive-Resume/.env
|
||||||
msg_ok "Updated $APP"
|
msg_ok "Updated Reactive-Resume"
|
||||||
|
|
||||||
msg_info "Updating Minio"
|
msg_info "Updating Minio"
|
||||||
systemctl stop minio
|
systemctl stop minio
|
||||||
|
|||||||
@ -27,9 +27,10 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Updating $APP LXC"
|
msg_info "Updating $APP LXC"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt -y upgrade
|
$STD apt upgrade -y
|
||||||
msg_ok "Updated $APP LXC"
|
msg_ok "Updated $APP LXC"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
exit
|
exit
|
||||||
|
|||||||
@ -32,6 +32,8 @@ function update_script() {
|
|||||||
systemctl stop reitti
|
systemctl stop reitti
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
JAVA_VERSION="25" setup_java
|
||||||
|
|
||||||
rm -f /opt/reitti/reitti.jar
|
rm -f /opt/reitti/reitti.jar
|
||||||
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "reitti" "dedicatedcode/reitti" "singlefile" "latest" "/opt/reitti" "reitti-app.jar"
|
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "reitti" "dedicatedcode/reitti" "singlefile" "latest" "/opt/reitti" "reitti-app.jar"
|
||||||
mv /opt/reitti/reitti-*.jar /opt/reitti/reitti.jar
|
mv /opt/reitti/reitti-*.jar /opt/reitti/reitti.jar
|
||||||
@ -65,4 +67,4 @@ description
|
|||||||
msg_ok "Completed Successfully!\n"
|
msg_ok "Completed Successfully!\n"
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||||
@ -20,18 +20,18 @@ color
|
|||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -d /var/lib/resilio-sync ]]; then
|
if [[ ! -d /var/lib/resilio-sync ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
|
||||||
fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
$STD apt update
|
|
||||||
$STD apt -y upgrade
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
exit
|
||||||
|
fi
|
||||||
|
msg_info "Updating Resilio Sync"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt upgrade -y
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
@ -29,16 +29,14 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//')
|
RELEASE=$(get_latest_github_release "saltstack/salt")
|
||||||
if [[ ! -f /~.salt ]] || [[ "${RELEASE}" != "$(cat /~.salt)" ]]; then
|
if check_for_gh_release "salt" "saltstack/salt"; then
|
||||||
msg_info "Updating $APP to ${RELEASE}"
|
msg_info "Updating Salt"
|
||||||
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
|
sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt upgrade -y
|
$STD apt upgrade -y
|
||||||
echo "${RELEASE}" >/~.salt
|
echo "${RELEASE}" >/~.salt
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
|
||||||
msg_ok "${APP} is already up to date (${RELEASE})"
|
|
||||||
fi
|
fi
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_for_gh_release "scanopy" "scanopy-io/scanopy"; then
|
if check_for_gh_release "scanopy" "scanopy/scanopy"; then
|
||||||
msg_info "Stopping services"
|
msg_info "Stopping services"
|
||||||
systemctl stop scanopy-daemon scanopy-server
|
systemctl stop scanopy-daemon scanopy-server
|
||||||
msg_ok "Stopped services"
|
msg_ok "Stopped services"
|
||||||
|
|||||||
@ -33,7 +33,7 @@ function update_script() {
|
|||||||
systemctl stop semaphore
|
systemctl stop semaphore
|
||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary"
|
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
systemctl start semaphore
|
systemctl start semaphore
|
||||||
|
|||||||
@ -47,6 +47,8 @@ function update_script() {
|
|||||||
curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz
|
curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz
|
||||||
$STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
|
$STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
|
||||||
rm -f /opt/DnsServerPortable.tar.gz
|
rm -f /opt/DnsServerPortable.tar.gz
|
||||||
|
echo "${RELEASE}" >~/.technitium
|
||||||
|
systemctl restart technitium
|
||||||
msg_ok "Updated Technitium DNS"
|
msg_ok "Updated Technitium DNS"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
else
|
||||||
|
|||||||
@ -34,7 +34,7 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Updating Telegraf"
|
msg_info "Updating Telegraf"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt upgrade telegraf -y
|
$STD apt upgrade -y telegraf
|
||||||
msg_ok "Updated Telegraf"
|
msg_ok "Updated Telegraf"
|
||||||
|
|
||||||
msg_info "Starting Service"
|
msg_info "Starting Service"
|
||||||
|
|||||||
@ -28,6 +28,8 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
JAVA_VERSION="21" setup_java
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD apt update --allow-releaseinfo-change
|
$STD apt update --allow-releaseinfo-change
|
||||||
$STD apt install -y unifi
|
$STD apt install -y unifi
|
||||||
|
|||||||
16
ct/zabbix.sh
16
ct/zabbix.sh
@ -67,10 +67,18 @@ function update_script() {
|
|||||||
|
|
||||||
rm -Rf /etc/apt/sources.list.d/zabbix.list
|
rm -Rf /etc/apt/sources.list.d/zabbix.list
|
||||||
cd /tmp
|
cd /tmp
|
||||||
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
|
||||||
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
|
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then
|
||||||
$STD dpkg -i zabbix-release_latest+debian13_all.deb
|
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
|
||||||
rm -rf /tmp/zabbix-release_latest+debian13_all.deb
|
ZABBIX_DEB_FILE="zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
|
||||||
|
else
|
||||||
|
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
||||||
|
ZABBIX_DEB_FILE="zabbix-release_latest+debian13_all.deb"
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/"$ZABBIX_DEB_FILE"
|
||||||
|
$STD dpkg -i /tmp/"$ZABBIX_DEB_FILE"
|
||||||
|
rm -rf /tmp/zabbix-release_*.deb
|
||||||
$STD apt update
|
$STD apt update
|
||||||
|
|
||||||
$STD apt install --only-upgrade zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql
|
$STD apt install --only-upgrade zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql
|
||||||
|
|||||||
690
docs/contribution/HELPER_FUNCTIONS.md
Normal file
690
docs/contribution/HELPER_FUNCTIONS.md
Normal file
@ -0,0 +1,690 @@
|
|||||||
|
# 🛠️ Helper Functions Reference
|
||||||
|
|
||||||
|
**Quick reference for all helper functions available in `tools.func`**
|
||||||
|
|
||||||
|
> These functions are automatically available in install scripts via `$FUNCTIONS_FILE_PATH`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Table of Contents
|
||||||
|
|
||||||
|
- [Scripts to Watch](#scripts-to-watch)
|
||||||
|
- [Runtime & Language Setup](#runtime--language-setup)
|
||||||
|
- [Database Setup](#database-setup)
|
||||||
|
- [GitHub Release Helpers](#github-release-helpers)
|
||||||
|
- [Tools & Utilities](#tools--utilities)
|
||||||
|
- [SSL/TLS](#ssltls)
|
||||||
|
- [Utility Functions](#utility-functions)
|
||||||
|
- [Package Management](#package-management)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Scripts to Watch
|
||||||
|
|
||||||
|
**Learn from real, well-implemented scripts. Each app requires TWO files that work together:**
|
||||||
|
|
||||||
|
| File | Location | Purpose |
|
||||||
|
| ------------------ | ---------------------------- | ------------------------------------------------------------------------ |
|
||||||
|
| **CT Script** | `ct/appname.sh` | Runs on **Proxmox host** - creates container, contains `update_script()` |
|
||||||
|
| **Install Script** | `install/appname-install.sh` | Runs **inside container** - installs and configures the app |
|
||||||
|
|
||||||
|
> ⚠️ **Both files are ALWAYS required!** The CT script calls the install script automatically during container creation.
|
||||||
|
|
||||||
|
### Node.js + PostgreSQL
|
||||||
|
|
||||||
|
**Koel** - Music streaming with PHP + Node.js + PostgreSQL
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/koel.sh](../../ct/koel.sh) |
|
||||||
|
| Install | [install/koel-install.sh](../../install/koel-install.sh) |
|
||||||
|
|
||||||
|
**Actual Budget** - Finance app with npm global install
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/actualbudget.sh](../../ct/actualbudget.sh) |
|
||||||
|
| Install | [install/actualbudget-install.sh](../../install/actualbudget-install.sh) |
|
||||||
|
|
||||||
|
### Python + uv
|
||||||
|
|
||||||
|
**MeTube** - YouTube downloader with Python uv + Node.js + Deno
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/metube.sh](../../ct/metube.sh) |
|
||||||
|
| Install | [install/metube-install.sh](../../install/metube-install.sh) |
|
||||||
|
|
||||||
|
**Endurain** - Fitness tracker with Python uv + PostgreSQL/PostGIS
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/endurain.sh](../../ct/endurain.sh) |
|
||||||
|
| Install | [install/endurain-install.sh](../../install/endurain-install.sh) |
|
||||||
|
|
||||||
|
### PHP + MariaDB/MySQL
|
||||||
|
|
||||||
|
**Wallabag** - Read-it-later with PHP + MariaDB + Redis + Nginx
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/wallabag.sh](../../ct/wallabag.sh) |
|
||||||
|
| Install | [install/wallabag-install.sh](../../install/wallabag-install.sh) |
|
||||||
|
|
||||||
|
**InvoiceNinja** - Invoicing with PHP + MariaDB + Supervisor
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/invoiceninja.sh](../../ct/invoiceninja.sh) |
|
||||||
|
| Install | [install/invoiceninja-install.sh](../../install/invoiceninja-install.sh) |
|
||||||
|
|
||||||
|
**BookStack** - Wiki/Docs with PHP + MariaDB + Apache
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/bookstack.sh](../../ct/bookstack.sh) |
|
||||||
|
| Install | [install/bookstack-install.sh](../../install/bookstack-install.sh) |
|
||||||
|
|
||||||
|
### PHP + SQLite (Simple)
|
||||||
|
|
||||||
|
**Speedtest Tracker** - Speedtest with PHP + SQLite + Nginx
|
||||||
|
| File | Link |
|
||||||
|
|------|------|
|
||||||
|
| CT (update logic) | [ct/speedtest-tracker.sh](../../ct/speedtest-tracker.sh) |
|
||||||
|
| Install | [install/speedtest-tracker-install.sh](../../install/speedtest-tracker-install.sh) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Runtime & Language Setup
|
||||||
|
|
||||||
|
### `setup_nodejs`
|
||||||
|
|
||||||
|
Install Node.js from NodeSource repository.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Default (Node.js 22)
|
||||||
|
setup_nodejs
|
||||||
|
|
||||||
|
# Specific version
|
||||||
|
NODE_VERSION="20" setup_nodejs
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_go`
|
||||||
|
|
||||||
|
Install Go programming language (latest stable).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_go
|
||||||
|
|
||||||
|
# Use in script
|
||||||
|
setup_go
|
||||||
|
cd /opt/myapp
|
||||||
|
$STD go build -o myapp .
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_rust`
|
||||||
|
|
||||||
|
Install Rust via rustup.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_rust
|
||||||
|
|
||||||
|
# Use in script
|
||||||
|
setup_rust
|
||||||
|
source "$HOME/.cargo/env"
|
||||||
|
$STD cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_uv`
|
||||||
|
|
||||||
|
Install Python uv package manager (fast pip/venv replacement).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_uv
|
||||||
|
|
||||||
|
# Use in script
|
||||||
|
setup_uv
|
||||||
|
cd /opt/myapp
|
||||||
|
$STD uv sync --locked
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_ruby`
|
||||||
|
|
||||||
|
Install Ruby from official repositories.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_ruby
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_php`
|
||||||
|
|
||||||
|
Install PHP with configurable modules and FPM/Apache support.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Basic PHP
|
||||||
|
setup_php
|
||||||
|
|
||||||
|
# Full configuration
|
||||||
|
PHP_VERSION="8.3" \
|
||||||
|
PHP_MODULE="mysqli,gd,curl,mbstring,xml,zip,ldap" \
|
||||||
|
PHP_FPM="YES" \
|
||||||
|
PHP_APACHE="YES" \
|
||||||
|
setup_php
|
||||||
|
```
|
||||||
|
|
||||||
|
**Environment Variables:**
|
||||||
|
| Variable | Default | Description |
|
||||||
|
|----------|---------|-------------|
|
||||||
|
| `PHP_VERSION` | `8.3` | PHP version to install |
|
||||||
|
| `PHP_MODULE` | `""` | Comma-separated list of modules |
|
||||||
|
| `PHP_FPM` | `NO` | Install PHP-FPM |
|
||||||
|
| `PHP_APACHE` | `NO` | Install Apache module |
|
||||||
|
|
||||||
|
### `setup_composer`
|
||||||
|
|
||||||
|
Install PHP Composer package manager.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_php
|
||||||
|
setup_composer
|
||||||
|
|
||||||
|
# Use in script
|
||||||
|
$STD composer install --no-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_java`
|
||||||
|
|
||||||
|
Install Java (OpenJDK).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Default (Java 21)
|
||||||
|
setup_java
|
||||||
|
|
||||||
|
# Specific version
|
||||||
|
JAVA_VERSION="17" setup_java
|
||||||
|
JAVA_VERSION="21" setup_java
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Database Setup
|
||||||
|
|
||||||
|
### `setup_mariadb`
|
||||||
|
|
||||||
|
Install MariaDB server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_mariadb
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_mariadb_db`
|
||||||
|
|
||||||
|
Create a MariaDB database and user. Sets `$MARIADB_DB_PASS` with the generated password.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="myapp_db" MARIADB_DB_USER="myapp_user" setup_mariadb_db
|
||||||
|
|
||||||
|
# After calling, these variables are available:
|
||||||
|
# $MARIADB_DB_NAME - Database name
|
||||||
|
# $MARIADB_DB_USER - Database user
|
||||||
|
# $MARIADB_DB_PASS - Generated password (saved to ~/[appname].creds)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_mysql`
|
||||||
|
|
||||||
|
Install MySQL server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_postgresql`
|
||||||
|
|
||||||
|
Install PostgreSQL server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Default (PostgreSQL 17)
|
||||||
|
setup_postgresql
|
||||||
|
|
||||||
|
# Specific version
|
||||||
|
PG_VERSION="16" setup_postgresql
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_postgresql_db`
|
||||||
|
|
||||||
|
Create a PostgreSQL database and user. Sets `$PG_DB_PASS` with the generated password.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
PG_DB_NAME="myapp_db" PG_DB_USER="myapp_user" setup_postgresql_db
|
||||||
|
|
||||||
|
# After calling, these variables are available:
|
||||||
|
# $PG_DB_NAME - Database name
|
||||||
|
# $PG_DB_USER - Database user
|
||||||
|
# $PG_DB_PASS - Generated password (saved to ~/[appname].creds)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_mongodb`
|
||||||
|
|
||||||
|
Install MongoDB server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_mongodb
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_clickhouse`
|
||||||
|
|
||||||
|
Install ClickHouse analytics database.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_clickhouse
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## GitHub Release Helpers
|
||||||
|
|
||||||
|
> **Note**: `fetch_and_deploy_gh_release` is the **preferred method** for downloading GitHub releases. It handles version tracking automatically. Only use `get_latest_github_release` if you need the version number separately.
|
||||||
|
|
||||||
|
### `fetch_and_deploy_gh_release`
|
||||||
|
|
||||||
|
**Primary method** for downloading and extracting GitHub releases. Handles version tracking automatically.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Basic usage - downloads tarball to /opt/appname
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo"
|
||||||
|
|
||||||
|
# With explicit parameters
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
|
||||||
|
# Pre-built release with specific asset pattern
|
||||||
|
fetch_and_deploy_gh_release "koel" "koel/koel" "prebuild" "latest" "/opt/koel" "koel-*.tar.gz"
|
||||||
|
|
||||||
|
# Clean install (removes old directory first) - used in update_script
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
| Parameter | Default | Description |
|
||||||
|
|-----------|---------|-------------|
|
||||||
|
| `name` | required | App name (for version tracking) |
|
||||||
|
| `repo` | required | GitHub repo (`owner/repo`) |
|
||||||
|
| `type` | `tarball` | Release type: `tarball`, `zipball`, `prebuild`, `binary` |
|
||||||
|
| `version` | `latest` | Version tag or `latest` |
|
||||||
|
| `dest` | `/opt/[name]` | Destination directory |
|
||||||
|
| `asset_pattern` | `""` | For `prebuild`: glob pattern to match asset (e.g. `app-*.tar.gz`) |
|
||||||
|
|
||||||
|
**Environment Variables:**
|
||||||
|
| Variable | Description |
|
||||||
|
|----------|-------------|
|
||||||
|
| `CLEAN_INSTALL=1` | Remove destination directory before extracting (for updates) |
|
||||||
|
|
||||||
|
### `check_for_gh_release`
|
||||||
|
|
||||||
|
Check if a newer version is available. Returns 0 if update needed, 1 if already at latest. **Use in `update_script()` function.**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In update_script() function in ct/appname.sh
|
||||||
|
if check_for_gh_release "appname" "owner/repo"; then
|
||||||
|
msg_info "Updating..."
|
||||||
|
# Stop services, backup, update, restore, start
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "appname" "owner/repo"
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### `get_latest_github_release`
|
||||||
|
|
||||||
|
Get the latest release version from a GitHub repository. **Only use if you need the version number separately** (e.g., for manual download or display).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
RELEASE=$(get_latest_github_release "owner/repo")
|
||||||
|
echo "Latest version: $RELEASE"
|
||||||
|
```
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "bookstack" "BookStackApp/BookStack"
|
||||||
|
fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/myapp"
|
||||||
|
|
||||||
|
````
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
| Parameter | Default | Description |
|
||||||
|
|-----------|---------|-------------|
|
||||||
|
| `name` | required | App name (for version tracking) |
|
||||||
|
| `repo` | required | GitHub repo (`owner/repo`) |
|
||||||
|
| `type` | `tarball` | Release type: `tarball`, `zipball`, `binary` |
|
||||||
|
| `version` | `latest` | Version tag or `latest` |
|
||||||
|
| `dest` | `/opt/[name]` | Destination directory |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tools & Utilities
|
||||||
|
|
||||||
|
### `setup_yq`
|
||||||
|
|
||||||
|
Install yq YAML processor.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_yq
|
||||||
|
|
||||||
|
# Use in script
|
||||||
|
yq '.server.port = 8080' -i config.yaml
|
||||||
|
````
|
||||||
|
|
||||||
|
### `setup_ffmpeg`
|
||||||
|
|
||||||
|
Install FFmpeg with common codecs.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_ffmpeg
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_hwaccel`
|
||||||
|
|
||||||
|
Setup GPU hardware acceleration (Intel/AMD/NVIDIA).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Only runs if GPU passthrough is detected (/dev/dri, /dev/nvidia0, /dev/kfd)
|
||||||
|
setup_hwaccel
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_imagemagick`
|
||||||
|
|
||||||
|
Install ImageMagick 7 from source.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_imagemagick
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_docker`
|
||||||
|
|
||||||
|
Install Docker Engine.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setup_adminer`
|
||||||
|
|
||||||
|
Install Adminer for database management.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
setup_mariadb
|
||||||
|
setup_adminer
|
||||||
|
|
||||||
|
# Access at http://IP/adminer
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SSL/TLS
|
||||||
|
|
||||||
|
### `create_self_signed_cert`
|
||||||
|
|
||||||
|
Create a self-signed SSL certificate.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
create_self_signed_cert
|
||||||
|
|
||||||
|
# Creates files at:
|
||||||
|
# /etc/ssl/[appname]/[appname].key
|
||||||
|
# /etc/ssl/[appname]/[appname].crt
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Utility Functions
|
||||||
|
|
||||||
|
### `import_local_ip`
|
||||||
|
|
||||||
|
Set the `$LOCAL_IP` variable with the container's IP address.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
import_local_ip
|
||||||
|
echo "Container IP: $LOCAL_IP"
|
||||||
|
|
||||||
|
# Use in config files
|
||||||
|
sed -i "s/localhost/$LOCAL_IP/g" /opt/myapp/config.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ensure_dependencies`
|
||||||
|
|
||||||
|
Ensure packages are installed (installs if missing).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ensure_dependencies "jq" "unzip" "curl"
|
||||||
|
```
|
||||||
|
|
||||||
|
### `msg_info` / `msg_ok` / `msg_error` / `msg_warn`
|
||||||
|
|
||||||
|
Display formatted messages.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
msg_info "Installing application..."
|
||||||
|
# ... do work ...
|
||||||
|
msg_ok "Installation complete"
|
||||||
|
|
||||||
|
msg_warn "Optional feature not available"
|
||||||
|
msg_error "Installation failed"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Package Management
|
||||||
|
|
||||||
|
### `cleanup_lxc`
|
||||||
|
|
||||||
|
Final cleanup function - call at end of install script.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# At the end of your install script
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc # Handles autoremove, autoclean, cache cleanup
|
||||||
|
```
|
||||||
|
|
||||||
|
### `install_packages_with_retry`
|
||||||
|
|
||||||
|
Install packages with automatic retry on failure.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
install_packages_with_retry "package1" "package2" "package3"
|
||||||
|
```
|
||||||
|
|
||||||
|
### `prepare_repository_setup`
|
||||||
|
|
||||||
|
Prepare system for adding new repositories (cleanup old repos, keyrings).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
prepare_repository_setup "mariadb" "mysql"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Complete Examples
|
||||||
|
|
||||||
|
### Example 1: Node.js App with PostgreSQL (install script)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: YourUsername
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/example/myapp
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
# Setup runtimes and databases FIRST
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
PG_DB_NAME="myapp" PG_DB_USER="myapp" setup_postgresql_db
|
||||||
|
import_local_ip
|
||||||
|
|
||||||
|
# Download app using fetch_and_deploy (handles version tracking)
|
||||||
|
fetch_and_deploy_gh_release "myapp" "example/myapp" "tarball" "latest" "/opt/myapp"
|
||||||
|
|
||||||
|
msg_info "Setting up MyApp"
|
||||||
|
cd /opt/myapp
|
||||||
|
$STD npm ci --production
|
||||||
|
msg_ok "Setup MyApp"
|
||||||
|
|
||||||
|
msg_info "Configuring MyApp"
|
||||||
|
cat <<EOF >/opt/myapp/.env
|
||||||
|
DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost/${PG_DB_NAME}
|
||||||
|
HOST=${LOCAL_IP}
|
||||||
|
PORT=3000
|
||||||
|
EOF
|
||||||
|
msg_ok "Configured MyApp"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/myapp.service
|
||||||
|
[Unit]
|
||||||
|
Description=MyApp
|
||||||
|
After=network.target postgresql.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/myapp
|
||||||
|
ExecStart=/usr/bin/node /opt/myapp/server.js
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now myapp
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 2: Matching Container Script (ct script)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: YourUsername
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/example/myapp
|
||||||
|
|
||||||
|
APP="MyApp"
|
||||||
|
var_tags="${var_tags:-webapp}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-6}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-12}"
|
||||||
|
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/myapp ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check_for_gh_release returns true if update available
|
||||||
|
if check_for_gh_release "myapp" "example/myapp"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop myapp
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Creating Backup"
|
||||||
|
cp /opt/myapp/.env /tmp/myapp_env.bak
|
||||||
|
msg_ok "Created Backup"
|
||||||
|
|
||||||
|
# CLEAN_INSTALL=1 removes old dir before extracting
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "myapp" "example/myapp" "tarball" "latest" "/opt/myapp"
|
||||||
|
|
||||||
|
msg_info "Restoring Config & Rebuilding"
|
||||||
|
cp /tmp/myapp_env.bak /opt/myapp/.env
|
||||||
|
rm /tmp/myapp_env.bak
|
||||||
|
cd /opt/myapp
|
||||||
|
$STD npm ci --production
|
||||||
|
msg_ok "Restored Config & Rebuilt"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start myapp
|
||||||
|
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 "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 3: PHP App with MariaDB (install script)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
# PHP with FPM and common modules
|
||||||
|
PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,curl,gd,intl,mbstring,mysql,xml,zip" setup_php
|
||||||
|
setup_composer
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="myapp" MARIADB_DB_USER="myapp" setup_mariadb_db
|
||||||
|
import_local_ip
|
||||||
|
|
||||||
|
# Download pre-built release (with asset pattern)
|
||||||
|
fetch_and_deploy_gh_release "myapp" "example/myapp" "prebuild" "latest" "/opt/myapp" "myapp-*.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Configuring MyApp"
|
||||||
|
cd /opt/myapp
|
||||||
|
cp .env.example .env
|
||||||
|
sed -i "s|APP_URL=.*|APP_URL=http://${LOCAL_IP}|" .env
|
||||||
|
sed -i "s|DB_DATABASE=.*|DB_DATABASE=${MARIADB_DB_NAME}|" .env
|
||||||
|
sed -i "s|DB_USERNAME=.*|DB_USERNAME=${MARIADB_DB_USER}|" .env
|
||||||
|
sed -i "s|DB_PASSWORD=.*|DB_PASSWORD=${MARIADB_DB_PASS}|" .env
|
||||||
|
$STD composer install --no-dev --no-interaction
|
||||||
|
$STD php artisan key:generate --force
|
||||||
|
$STD php artisan migrate --force
|
||||||
|
chown -R www-data:www-data /opt/myapp
|
||||||
|
msg_ok "Configured MyApp"
|
||||||
|
|
||||||
|
# ... nginx config, service creation ...
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
|
```
|
||||||
@ -65,6 +65,7 @@ bash docs/contribution/setup-fork.sh
|
|||||||
```
|
```
|
||||||
|
|
||||||
This will:
|
This will:
|
||||||
|
|
||||||
- Auto-detect your GitHub username
|
- Auto-detect your GitHub username
|
||||||
- Update all documentation links to point to your fork
|
- Update all documentation links to point to your fork
|
||||||
- Create `.git-setup-info` with recommended git workflows
|
- Create `.git-setup-info` with recommended git workflows
|
||||||
@ -97,6 +98,8 @@ All scripts and configurations must follow our coding standards to ensure consis
|
|||||||
|
|
||||||
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Essential coding standards and best practices
|
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Essential coding standards and best practices
|
||||||
- **[CODE_AUDIT.md](CODE_AUDIT.md)** - Code review checklist and audit procedures
|
- **[CODE_AUDIT.md](CODE_AUDIT.md)** - Code review checklist and audit procedures
|
||||||
|
- **[GUIDE.md](GUIDE.md)** - Comprehensive contribution guide
|
||||||
|
- **[HELPER_FUNCTIONS.md](HELPER_FUNCTIONS.md)** - Reference for all tools.func helper functions
|
||||||
- **Container Scripts** - `/ct/` templates and guidelines
|
- **Container Scripts** - `/ct/` templates and guidelines
|
||||||
- **Install Scripts** - `/install/` templates and guidelines
|
- **Install Scripts** - `/install/` templates and guidelines
|
||||||
- **JSON Configurations** - `/json/` structure and format
|
- **JSON Configurations** - `/json/` structure and format
|
||||||
@ -121,6 +124,7 @@ Before submitting a pull request, ensure your code passes our audit:
|
|||||||
**See**: [CODE_AUDIT.md](CODE_AUDIT.md) for complete audit checklist
|
**See**: [CODE_AUDIT.md](CODE_AUDIT.md) for complete audit checklist
|
||||||
|
|
||||||
Key points:
|
Key points:
|
||||||
|
|
||||||
- Code consistency with existing scripts
|
- Code consistency with existing scripts
|
||||||
- Proper error handling
|
- Proper error handling
|
||||||
- Correct variable naming
|
- Correct variable naming
|
||||||
@ -145,6 +149,7 @@ Key points:
|
|||||||
### Community Guides
|
### Community Guides
|
||||||
|
|
||||||
See [USER_SUBMITTED_GUIDES.md](USER_SUBMITTED_GUIDES.md) for excellent community-written guides:
|
See [USER_SUBMITTED_GUIDES.md](USER_SUBMITTED_GUIDES.md) for excellent community-written guides:
|
||||||
|
|
||||||
- Home Assistant installation and configuration
|
- Home Assistant installation and configuration
|
||||||
- Frigate setup on Proxmox
|
- Frigate setup on Proxmox
|
||||||
- Docker and Portainer installation
|
- Docker and Portainer installation
|
||||||
@ -156,16 +161,24 @@ See [USER_SUBMITTED_GUIDES.md](USER_SUBMITTED_GUIDES.md) for excellent community
|
|||||||
Use these templates when creating new scripts:
|
Use these templates when creating new scripts:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Container script
|
# Container script template
|
||||||
cp ct/example.sh ct/my-app.sh
|
cp docs/contribution/templates_ct/AppName.sh ct/my-app.sh
|
||||||
|
|
||||||
# Installation script
|
# Installation script template
|
||||||
cp install/example-install.sh install/my-app-install.sh
|
cp docs/contribution/templates_install/AppName-install.sh install/my-app-install.sh
|
||||||
|
|
||||||
# JSON configuration (if needed)
|
# JSON configuration template
|
||||||
cp json/example.json json/my-app.json
|
cp docs/contribution/templates_json/AppName.json frontend/public/json/my-app.json
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Template Features:**
|
||||||
|
|
||||||
|
- Updated to match current codebase patterns
|
||||||
|
- Includes all available helper functions from `tools.func`
|
||||||
|
- Examples for Node.js, Python, PHP, Go applications
|
||||||
|
- Database setup examples (MariaDB, PostgreSQL)
|
||||||
|
- Proper service creation and cleanup
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔄 Git Workflow
|
## 🔄 Git Workflow
|
||||||
@ -202,18 +215,21 @@ git push origin feature/my-feature
|
|||||||
### Before Submitting PR
|
### Before Submitting PR
|
||||||
|
|
||||||
1. **Sync with upstream**
|
1. **Sync with upstream**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git fetch upstream
|
git fetch upstream
|
||||||
git rebase upstream/main
|
git rebase upstream/main
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Test your changes**
|
2. **Test your changes**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash ct/my-app.sh
|
bash ct/my-app.sh
|
||||||
# Follow prompts and test the container
|
# Follow prompts and test the container
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Check code standards**
|
3. **Check code standards**
|
||||||
|
|
||||||
- [ ] Follows template structure
|
- [ ] Follows template structure
|
||||||
- [ ] Proper error handling
|
- [ ] Proper error handling
|
||||||
- [ ] Documentation updated (if needed)
|
- [ ] Documentation updated (if needed)
|
||||||
|
|||||||
@ -1,27 +1,31 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
# Author: [YourUserName]
|
# Author: [YourGitHubUsername]
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: [SOURCE_URL]
|
# Source: [SOURCE_URL e.g. https://github.com/example/app]
|
||||||
|
|
||||||
# App Default Values
|
# App Default Values
|
||||||
APP="[APP_NAME]"
|
APP="[AppName]"
|
||||||
# Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
|
var_tags="${var_tags:-[category]}"
|
||||||
var_tags="[TAGS]"
|
var_cpu="${var_cpu:-2}"
|
||||||
# Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp)
|
var_ram="${var_ram:-2048}"
|
||||||
var_cpu="[CPU]"
|
var_disk="${var_disk:-4}"
|
||||||
# Number of cores (1-X) (e.g. 4) - default are 2
|
var_os="${var_os:-debian}"
|
||||||
var_ram="[RAM]"
|
var_version="${var_version:-12}"
|
||||||
# Amount of used RAM in MB (e.g. 2048 or 4096)
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
var_disk="[DISK]"
|
|
||||||
# Amount of used disk space in GB (e.g. 4 or 10)
|
# =============================================================================
|
||||||
var_os="[OS]"
|
# CONFIGURATION GUIDE
|
||||||
# Default OS (e.g. debian, ubuntu, alpine)
|
# =============================================================================
|
||||||
var_version="[VERSION]"
|
# APP - Display name, title case (e.g. "Koel", "Wallabag", "Actual Budget")
|
||||||
# Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine)
|
# var_tags - Max 2 tags, semicolon separated (e.g. "music;streaming", "finance")
|
||||||
var_unprivileged="[UNPRIVILEGED]"
|
# var_cpu - CPU cores: 1-4 typical
|
||||||
# 1 = unprivileged container, 0 = privileged container
|
# var_ram - RAM in MB: 512, 1024, 2048, 4096 typical
|
||||||
|
# var_disk - Disk in GB: 4, 6, 8, 10, 20 typical
|
||||||
|
# var_os - OS: debian, ubuntu, alpine
|
||||||
|
# var_version - OS version: 12/13 (debian), 22.04/24.04 (ubuntu), 3.20/3.21 (alpine)
|
||||||
|
# var_unprivileged - 1 = unprivileged (secure, default), 0 = privileged (for docker etc.)
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
variables
|
variables
|
||||||
@ -29,51 +33,55 @@ color
|
|||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
|
|
||||||
# Check if installation is present | -f for file, -d for folder
|
# Check if installation exists
|
||||||
if [[ ! -f [INSTALLATION_CHECK_PATH] ]]; then
|
if [[ ! -d /opt/[appname] ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Crawling the new version and checking whether an update is required
|
|
||||||
RELEASE=$(curl -fsSL [RELEASE_URL] | [PARSE_RELEASE_COMMAND])
|
|
||||||
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
|
|
||||||
# Stopping Services
|
|
||||||
msg_info "Stopping $APP"
|
|
||||||
systemctl stop [SERVICE_NAME]
|
|
||||||
msg_ok "Stopped $APP"
|
|
||||||
|
|
||||||
# Creating Backup
|
|
||||||
msg_info "Creating Backup"
|
|
||||||
tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" [IMPORTANT_PATHS]
|
|
||||||
msg_ok "Backup Created"
|
|
||||||
|
|
||||||
# Execute Update
|
|
||||||
msg_info "Updating $APP to v${RELEASE}"
|
|
||||||
[UPDATE_COMMANDS]
|
|
||||||
msg_ok "Updated $APP to v${RELEASE}"
|
|
||||||
|
|
||||||
# Starting Services
|
|
||||||
msg_info "Starting $APP"
|
|
||||||
systemctl start [SERVICE_NAME]
|
|
||||||
msg_ok "Started $APP"
|
|
||||||
|
|
||||||
# Cleaning up
|
|
||||||
msg_info "Cleaning Up"
|
|
||||||
rm -rf [TEMP_FILES]
|
|
||||||
msg_ok "Cleanup Completed"
|
|
||||||
|
|
||||||
# Last Action
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Update Successful"
|
|
||||||
else
|
|
||||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
|
||||||
fi
|
|
||||||
exit
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check_for_gh_release returns 0 (true) if update available, 1 (false) if not
|
||||||
|
if check_for_gh_release "[appname]" "[owner/repo]"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop [appname]
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
# Optional: Backup important data before update
|
||||||
|
msg_info "Creating Backup"
|
||||||
|
mkdir -p /tmp/[appname]_backup
|
||||||
|
cp /opt/[appname]/.env /tmp/[appname]_backup/ 2>/dev/null || true
|
||||||
|
cp -r /opt/[appname]/data /tmp/[appname]_backup/ 2>/dev/null || true
|
||||||
|
msg_ok "Created Backup"
|
||||||
|
|
||||||
|
# CLEAN_INSTALL=1 removes old directory before extracting new version
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "[appname]" "[owner/repo]" "tarball" "latest" "/opt/[appname]"
|
||||||
|
|
||||||
|
# Restore configuration and data
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp /tmp/[appname]_backup/.env /opt/[appname]/ 2>/dev/null || true
|
||||||
|
cp -r /tmp/[appname]_backup/data/* /opt/[appname]/data/ 2>/dev/null || true
|
||||||
|
rm -rf /tmp/[appname]_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
# Optional: Run any post-update commands
|
||||||
|
msg_info "Running Post-Update Tasks"
|
||||||
|
cd /opt/[appname]
|
||||||
|
# Examples:
|
||||||
|
# $STD npm ci --production
|
||||||
|
# $STD php artisan migrate --force
|
||||||
|
# $STD composer install --no-dev
|
||||||
|
msg_ok "Ran Post-Update Tasks"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start [appname]
|
||||||
|
msg_ok "Started Services"
|
||||||
|
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Copyright (c) 2021-2025 community-scripts ORG
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
# Author: [YourUserName]
|
# Author: [YourGitHubUsername]
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: [SOURCE_URL]
|
# Source: [SOURCE_URL e.g. https://github.com/example/app]
|
||||||
|
|
||||||
# Import Functions und Setup
|
# Import Functions and Setup
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
color
|
color
|
||||||
verb_ip6
|
verb_ip6
|
||||||
@ -14,70 +14,177 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
# Installing Dependencies with the 3 core dependencies (curl;sudo;mc)
|
# =============================================================================
|
||||||
|
# DEPENDENCIES
|
||||||
|
# =============================================================================
|
||||||
|
# Only install what's actually needed - curl/sudo/mc are already in the base image
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
curl \
|
nginx \
|
||||||
sudo \
|
build-essential
|
||||||
mc \
|
|
||||||
[PACKAGE_1] \
|
|
||||||
[PACKAGE_2] \
|
|
||||||
[PACKAGE_3]
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
# Template: MySQL Database
|
# =============================================================================
|
||||||
msg_info "Setting up Database"
|
# HELPER FUNCTIONS FROM tools.func
|
||||||
DB_NAME=[DB_NAME]
|
# =============================================================================
|
||||||
DB_USER=[DB_USER]
|
# These functions are available via $FUNCTIONS_FILE_PATH (tools.func)
|
||||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
# Call them with optional environment variables for configuration
|
||||||
$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
|
|
||||||
$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
|
|
||||||
$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
|
||||||
{
|
|
||||||
echo "${APPLICATION} Credentials"
|
|
||||||
echo "Database User: $DB_USER"
|
|
||||||
echo "Database Password: $DB_PASS"
|
|
||||||
echo "Database Name: $DB_NAME"
|
|
||||||
} >>~/$APP_NAME.creds
|
|
||||||
msg_ok "Set up Database"
|
|
||||||
|
|
||||||
# Temp
|
|
||||||
|
|
||||||
# Setup App
|
|
||||||
msg_info "Setup ${APPLICATION}"
|
|
||||||
RELEASE=$(curl -s https://api.github.com/repos/[REPO]/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
|
||||||
curl -fsSL "https://github.com/[REPO]/archive/refs/tags/${RELEASE}.zip"
|
|
||||||
unzip -q ${RELEASE}.zip
|
|
||||||
mv ${APPLICATION}-${RELEASE}/ /opt/${APPLICATION}
|
|
||||||
#
|
#
|
||||||
|
# --- Runtime & Language Setup ---
|
||||||
|
# NODE_VERSION="22" setup_nodejs # Install Node.js (22, 24)
|
||||||
|
# NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs # With pnpm
|
||||||
|
# PYTHON_VERSION="3.13" setup_uv # Python with uv package manager
|
||||||
|
# setup_go # Install Go (latest)
|
||||||
|
# setup_rust # Install Rust via rustup
|
||||||
|
# setup_ruby # Install Ruby
|
||||||
|
# PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="mysqli,gd" setup_php
|
||||||
|
# PHP_VERSION="8.3" PHP_FPM="YES" PHP_APACHE="YES" PHP_MODULE="bcmath,curl,gd,intl,mbstring,mysql,xml,zip" setup_php
|
||||||
|
# setup_composer # Install PHP Composer
|
||||||
|
# JAVA_VERSION="21" setup_java # Install Java (17, 21)
|
||||||
#
|
#
|
||||||
|
# --- Database Setup ---
|
||||||
|
# setup_mariadb # Install MariaDB server
|
||||||
|
# MARIADB_DB_NAME="mydb" MARIADB_DB_USER="myuser" setup_mariadb_db
|
||||||
|
# setup_mysql # Install MySQL server
|
||||||
|
# PG_VERSION="17" setup_postgresql # Install PostgreSQL (16, 17)
|
||||||
|
# PG_VERSION="17" PG_MODULES="postgis" setup_postgresql # With extensions
|
||||||
|
# PG_DB_NAME="mydb" PG_DB_USER="myuser" setup_postgresql_db
|
||||||
|
# setup_mongodb # Install MongoDB
|
||||||
#
|
#
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
# --- GitHub Release (PREFERRED METHOD) ---
|
||||||
msg_ok "Setup ${APPLICATION}"
|
# fetch_and_deploy_gh_release "appname" "owner/repo" # Downloads, extracts, tracks version
|
||||||
|
# fetch_and_deploy_gh_release "appname" "owner/repo" "tarball" "latest" "/opt/appname"
|
||||||
|
# fetch_and_deploy_gh_release "appname" "owner/repo" "prebuild" "latest" "/opt/appname" "app-*.tar.gz"
|
||||||
|
#
|
||||||
|
# --- Tools & Utilities ---
|
||||||
|
# import_local_ip # Sets $LOCAL_IP variable (call early!)
|
||||||
|
# setup_ffmpeg # Install FFmpeg with codecs
|
||||||
|
# setup_hwaccel # Setup GPU hardware acceleration
|
||||||
|
# setup_imagemagick # Install ImageMagick 7
|
||||||
|
# setup_docker # Install Docker Engine
|
||||||
|
# setup_adminer # Install Adminer for DB management
|
||||||
|
# create_self_signed_cert # Creates cert in /etc/ssl/[appname]/
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# EXAMPLE 1: Node.js Application with PostgreSQL
|
||||||
|
# =============================================================================
|
||||||
|
# NODE_VERSION="22" setup_nodejs
|
||||||
|
# PG_VERSION="17" setup_postgresql
|
||||||
|
# PG_DB_NAME="myapp" PG_DB_USER="myapp" setup_postgresql_db
|
||||||
|
# import_local_ip
|
||||||
|
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "tarball" "latest" "/opt/myapp"
|
||||||
|
#
|
||||||
|
# msg_info "Configuring MyApp"
|
||||||
|
# cd /opt/myapp
|
||||||
|
# $STD npm ci
|
||||||
|
# cat <<EOF >/opt/myapp/.env
|
||||||
|
# DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost/${PG_DB_NAME}
|
||||||
|
# HOST=${LOCAL_IP}
|
||||||
|
# PORT=3000
|
||||||
|
# EOF
|
||||||
|
# msg_ok "Configured MyApp"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# EXAMPLE 2: Python Application with uv
|
||||||
|
# =============================================================================
|
||||||
|
# PYTHON_VERSION="3.13" setup_uv
|
||||||
|
# import_local_ip
|
||||||
|
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "tarball" "latest" "/opt/myapp"
|
||||||
|
#
|
||||||
|
# msg_info "Setting up MyApp"
|
||||||
|
# cd /opt/myapp
|
||||||
|
# $STD uv sync
|
||||||
|
# cat <<EOF >/opt/myapp/.env
|
||||||
|
# HOST=${LOCAL_IP}
|
||||||
|
# PORT=8000
|
||||||
|
# EOF
|
||||||
|
# msg_ok "Setup MyApp"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# EXAMPLE 3: PHP Application with MariaDB + Nginx
|
||||||
|
# =============================================================================
|
||||||
|
# PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,curl,gd,intl,mbstring,mysql,xml,zip" setup_php
|
||||||
|
# setup_composer
|
||||||
|
# setup_mariadb
|
||||||
|
# MARIADB_DB_NAME="myapp" MARIADB_DB_USER="myapp" setup_mariadb_db
|
||||||
|
# import_local_ip
|
||||||
|
# fetch_and_deploy_gh_release "myapp" "owner/myapp" "prebuild" "latest" "/opt/myapp" "myapp-*.tar.gz"
|
||||||
|
#
|
||||||
|
# msg_info "Configuring MyApp"
|
||||||
|
# cd /opt/myapp
|
||||||
|
# cp .env.example .env
|
||||||
|
# sed -i "s|APP_URL=.*|APP_URL=http://${LOCAL_IP}|" .env
|
||||||
|
# sed -i "s|DB_DATABASE=.*|DB_DATABASE=${MARIADB_DB_NAME}|" .env
|
||||||
|
# sed -i "s|DB_USERNAME=.*|DB_USERNAME=${MARIADB_DB_USER}|" .env
|
||||||
|
# sed -i "s|DB_PASSWORD=.*|DB_PASSWORD=${MARIADB_DB_PASS}|" .env
|
||||||
|
# $STD composer install --no-dev --no-interaction
|
||||||
|
# chown -R www-data:www-data /opt/myapp
|
||||||
|
# msg_ok "Configured MyApp"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# YOUR APPLICATION INSTALLATION
|
||||||
|
# =============================================================================
|
||||||
|
# 1. Setup runtimes and databases FIRST
|
||||||
|
# 2. Call import_local_ip if you need the container IP
|
||||||
|
# 3. Use fetch_and_deploy_gh_release to download the app (handles version tracking)
|
||||||
|
# 4. Configure the application
|
||||||
|
# 5. Create systemd service
|
||||||
|
# 6. Finalize with motd_ssh, customize, cleanup_lxc
|
||||||
|
|
||||||
|
# --- Setup runtimes/databases ---
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
import_local_ip
|
||||||
|
|
||||||
|
# --- Download and install app ---
|
||||||
|
fetch_and_deploy_gh_release "[appname]" "[owner/repo]" "tarball" "latest" "/opt/[appname]"
|
||||||
|
|
||||||
|
msg_info "Setting up [AppName]"
|
||||||
|
cd /opt/[appname]
|
||||||
|
$STD npm ci
|
||||||
|
msg_ok "Setup [AppName]"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
msg_info "Configuring [AppName]"
|
||||||
|
cat <<EOF >/opt/[appname]/.env
|
||||||
|
HOST=${LOCAL_IP}
|
||||||
|
PORT=8080
|
||||||
|
EOF
|
||||||
|
msg_ok "Configured [AppName]"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# SERVICE CREATION
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
# Creating Service (if needed)
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/${APPLICATION}.service
|
cat <<EOF >/etc/systemd/system/[appname].service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=${APPLICATION} Service
|
Description=[AppName] Service
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart=[START_COMMAND]
|
Type=simple
|
||||||
Restart=always
|
User=root
|
||||||
|
WorkingDirectory=/opt/[appname]
|
||||||
|
ExecStart=/usr/bin/node /opt/[appname]/server.js
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now ${APPLICATION}.service
|
systemctl enable -q --now [appname]
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CLEANUP & FINALIZATION
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|
||||||
# Cleanup
|
# cleanup_lxc handles: apt autoremove, autoclean, temp files, bash history
|
||||||
msg_info "Cleaning up"
|
cleanup_lxc
|
||||||
rm -f ${RELEASE}.zip
|
|
||||||
$STD apt-get -y autoremove
|
|
||||||
$STD apt-get -y autoclean
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
|
|||||||
66
docs/contribution/templates_json/AppName.json
generated
66
docs/contribution/templates_json/AppName.json
generated
@ -1,34 +1,34 @@
|
|||||||
{
|
{
|
||||||
"name": "AppName",
|
"name": "AppName",
|
||||||
"slug": "appname",
|
"slug": "appname",
|
||||||
"categories": [
|
"categories": [
|
||||||
0
|
0
|
||||||
],
|
],
|
||||||
"date_created": "DATE CREATED",
|
"date_created": "DATE CREATED",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": true,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": DEFAULT-PORT,
|
"interface_port": "DEFAULT-PORT",
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
"website": "LINK TO WEBSITE",
|
"website": "LINK TO WEBSITE",
|
||||||
"logo": "LINK TO LOGO",
|
"logo": "LINK TO LOGO",
|
||||||
"description": "Description of the app",
|
"description": "Description of the app",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/AppName.sh",
|
"script": "ct/AppName.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": 2,
|
||||||
"ram": 2048,
|
"ram": 2048,
|
||||||
"hdd": 4,
|
"hdd": 4,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "12"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": []
|
"notes": []
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
"ram": 2048,
|
"ram": 2048,
|
||||||
"hdd": 8,
|
"hdd": 8,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -36,6 +36,10 @@
|
|||||||
{
|
{
|
||||||
"type": "info",
|
"type": "info",
|
||||||
"text": "The file `/etc/sysconfig/CosmosCloud` is optional. If you need custom settings, you can create it yourself."
|
"text": "The file `/etc/sysconfig/CosmosCloud` is optional. If you need custom settings, you can create it yourself."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "warning",
|
||||||
|
"text": "Requires FUSE support for mergerfs functionality. FUSE is enabled by default during installation."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
"ram": 1024,
|
"ram": 1024,
|
||||||
"hdd": 5,
|
"hdd": 5,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"name": "InvoiceNinja",
|
"name": "InvoiceNinja",
|
||||||
"slug": "invoiceninja",
|
"slug": "invoiceninja",
|
||||||
"categories": [
|
"categories": [
|
||||||
3
|
25
|
||||||
],
|
],
|
||||||
"date_created": "2025-12-12",
|
"date_created": "2025-12-12",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
"interface_port": 80,
|
"interface_port": 80,
|
||||||
"documentation": "https://paymenter.org/docs",
|
"documentation": "https://paymenter.org/docs",
|
||||||
"website": "https://paymenter.org/",
|
"website": "https://paymenter.org/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/paymeter.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/paymenter.webp",
|
||||||
"config_path": "/opt/paymenter/.env",
|
"config_path": "/opt/paymenter/.env",
|
||||||
"description": "Paymenter is an open source webshop solution for hosting companies. It's developed to provide an more easy way to manage your hosting company.",
|
"description": "Paymenter is an open source webshop solution for hosting companies. It's developed to provide an more easy way to manage your hosting company.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
|
|||||||
46
frontend/public/json/pihole-exporter.json
Normal file
46
frontend/public/json/pihole-exporter.json
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"name": "Pi-Hole Exporter",
|
||||||
|
"slug": "pihole-exporter",
|
||||||
|
"categories": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"date_created": "2025-12-21",
|
||||||
|
"type": "addon",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 9617,
|
||||||
|
"documentation": "https://github.com/eko/pihole-exporter",
|
||||||
|
"website": "https://github.com/eko/pihole-exporter",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pi-hole.webp",
|
||||||
|
"config_path": "/opt/pihole-exporter.env",
|
||||||
|
"description": "A Prometheus exporter for PI-Hole's Raspberry PI ad blocker",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "tools/addon/pihole-exporter.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": null,
|
||||||
|
"ram": null,
|
||||||
|
"hdd": null,
|
||||||
|
"os": null,
|
||||||
|
"version": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "alpine",
|
||||||
|
"script": "tools/addon/pihole-exporter.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": null,
|
||||||
|
"ram": null,
|
||||||
|
"hdd": null,
|
||||||
|
"os": null,
|
||||||
|
"version": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@ -23,7 +23,7 @@
|
|||||||
"ram": 512,
|
"ram": 512,
|
||||||
"hdd": 2,
|
"hdd": 2,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
"documentation": "https://pterodactyl.io/wings/1.0/installing.html",
|
"documentation": "https://pterodactyl.io/wings/1.0/installing.html",
|
||||||
"website": "https://pterodactyl.io",
|
"website": "https://pterodactyl.io",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pterodactyl.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pterodactyl.webp",
|
||||||
"config_path": "",
|
"config_path": "/etc/pterodactyl/config.yml",
|
||||||
"description": "Pterodactyl Wings is Pterodactyl's server control plane, built for the rapidly changing gaming industry and designed to be highly performant and secure. Wings provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle.",
|
"description": "Pterodactyl Wings is Pterodactyl's server control plane, built for the rapidly changing gaming industry and designed to be highly performant and secure. Wings provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
|
|||||||
46
frontend/public/json/qbittorrent-exporter.json
Normal file
46
frontend/public/json/qbittorrent-exporter.json
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"name": "qbittorrent Exporter",
|
||||||
|
"slug": "qbittorrent-exporter",
|
||||||
|
"categories": [
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"date_created": "2025-12-18",
|
||||||
|
"type": "addon",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 8090,
|
||||||
|
"documentation": "https://github.com/martabal/qbittorrent-exporter",
|
||||||
|
"website": "https://github.com/martabal/qbittorrent-exporter",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qbittorrent.webp",
|
||||||
|
"config_path": "/opt/qbittorrent-exporter.env",
|
||||||
|
"description": "A fast and lightweight prometheus exporter for qBittorrent ",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "tools/addon/qbittorrent-exporter.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": null,
|
||||||
|
"ram": null,
|
||||||
|
"hdd": null,
|
||||||
|
"os": null,
|
||||||
|
"version": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "alpine",
|
||||||
|
"script": "tools/addon/qbittorrent-exporter.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": null,
|
||||||
|
"ram": null,
|
||||||
|
"hdd": null,
|
||||||
|
"os": null,
|
||||||
|
"version": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@ -31,5 +31,14 @@
|
|||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": []
|
"notes": [
|
||||||
|
{
|
||||||
|
"type": "warning",
|
||||||
|
"content": "Configure your Radarr/Sonarr instances in `/root/.config/recyclarr/recyclarr.yml` before the first sync."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "info",
|
||||||
|
"content": "Automatic daily sync is configured via `/etc/cron.d/recyclarr`. Sync logs are saved to `/root/.config/recyclarr/sync.log`."
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -13,16 +13,7 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Backrest"
|
fetch_and_deploy_gh_release "backrest" "garethgeorge/backrest" "prebuild" "latest" "/opt/backrest/bin" "backrest_Linux_x86_64.tar.gz"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/garethgeorge/backrest/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
temp_file=$(mktemp)
|
|
||||||
mkdir -p /opt/backrest/{bin,config,data}
|
|
||||||
curl -fsSL "https://github.com/garethgeorge/backrest/releases/download/v${RELEASE}/backrest_Linux_x86_64.tar.gz" -o "$temp_file"
|
|
||||||
tar xzf $temp_file -C /opt/backrest/bin
|
|
||||||
chmod +x /opt/backrest/bin/backrest
|
|
||||||
rm -f "$temp_file"
|
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
|
||||||
msg_ok "Installed Backrest"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/backrest.service
|
cat <<EOF >/etc/systemd/system/backrest.service
|
||||||
@ -32,7 +23,6 @@ After=network.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=root
|
|
||||||
ExecStart=/opt/backrest/bin/backrest
|
ExecStart=/opt/backrest/bin/backrest
|
||||||
Environment="BACKREST_PORT=9898"
|
Environment="BACKREST_PORT=9898"
|
||||||
Environment="BACKREST_CONFIG=/opt/backrest/config/config.json"
|
Environment="BACKREST_CONFIG=/opt/backrest/config/config.json"
|
||||||
@ -48,4 +38,3 @@ msg_ok "Created Service"
|
|||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|
||||||
|
|||||||
@ -17,14 +17,14 @@ update_os
|
|||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt-get install -y \
|
||||||
redis-server \
|
redis-server \
|
||||||
nginx \
|
nginx \
|
||||||
lsb-release \
|
lsb-release \
|
||||||
libvips
|
libvips
|
||||||
#php-{ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm}
|
#php-{ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm}
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
PHP_VERSION="8.3" PHP_FPM=YES PHP_MODULE="ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm" setup_php
|
PHP_VERSION="8.4" PHP_FPM=YES PHP_MODULE="ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm" setup_php
|
||||||
setup_composer
|
setup_composer
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary"
|
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary"
|
||||||
@ -41,14 +41,14 @@ msg_info "Configure MeiliSearch"
|
|||||||
curl -fsSL https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml -o /etc/meilisearch.toml
|
curl -fsSL https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml -o /etc/meilisearch.toml
|
||||||
MASTER_KEY=$(openssl rand -base64 12)
|
MASTER_KEY=$(openssl rand -base64 12)
|
||||||
sed -i \
|
sed -i \
|
||||||
-e 's|^env =.*|env = "production"|' \
|
-e 's|^env =.*|env = "production"|' \
|
||||||
-e "s|^# master_key =.*|master_key = \"$MASTER_KEY\"|" \
|
-e "s|^# master_key =.*|master_key = \"$MASTER_KEY\"|" \
|
||||||
-e 's|^db_path =.*|db_path = "/var/lib/meilisearch/data"|' \
|
-e 's|^db_path =.*|db_path = "/var/lib/meilisearch/data"|' \
|
||||||
-e 's|^dump_dir =.*|dump_dir = "/var/lib/meilisearch/dumps"|' \
|
-e 's|^dump_dir =.*|dump_dir = "/var/lib/meilisearch/dumps"|' \
|
||||||
-e 's|^snapshot_dir =.*|snapshot_dir = "/var/lib/meilisearch/snapshots"|' \
|
-e 's|^snapshot_dir =.*|snapshot_dir = "/var/lib/meilisearch/snapshots"|' \
|
||||||
-e 's|^# no_analytics = true|no_analytics = true|' \
|
-e 's|^# no_analytics = true|no_analytics = true|' \
|
||||||
-e 's|^http_addr =.*|http_addr = "127.0.0.1:7700"|' \
|
-e 's|^http_addr =.*|http_addr = "127.0.0.1:7700"|' \
|
||||||
/etc/meilisearch.toml
|
/etc/meilisearch.toml
|
||||||
msg_ok "Configured MeiliSearch"
|
msg_ok "Configured MeiliSearch"
|
||||||
|
|
||||||
msg_info "Creating MeiliSearch service"
|
msg_info "Creating MeiliSearch service"
|
||||||
@ -77,11 +77,11 @@ MeiliSearch_API_KEY=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorizat
|
|||||||
MeiliSearch_API_KEY_UID=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"uid":"[^"]*"' | head -n 1 | sed 's/"uid":"//;s/"//')
|
MeiliSearch_API_KEY_UID=$(curl -s -X GET 'http://127.0.0.1:7700/keys' -H "Authorization: Bearer $MASTER_KEY" | grep -o '"uid":"[^"]*"' | head -n 1 | sed 's/"uid":"//;s/"//')
|
||||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
sed -i -e "s|^APP_URL=|APP_URL=http://${LOCAL_IP}/bar/|" \
|
sed -i -e "s|^APP_URL=|APP_URL=http://${LOCAL_IP}/bar/|" \
|
||||||
-e "s|^MEILISEARCH_HOST=|MEILISEARCH_HOST=http://127.0.0.1:7700|" \
|
-e "s|^MEILISEARCH_HOST=|MEILISEARCH_HOST=http://127.0.0.1:7700|" \
|
||||||
-e "s|^MEILISEARCH_KEY=|MEILISEARCH_KEY=${MASTER_KEY}|" \
|
-e "s|^MEILISEARCH_KEY=|MEILISEARCH_KEY=${MASTER_KEY}|" \
|
||||||
-e "s|^MEILISEARCH_API_KEY=|MEILISEARCH_API_KEY=${MeiliSearch_API_KEY}|" \
|
-e "s|^MEILISEARCH_API_KEY=|MEILISEARCH_API_KEY=${MeiliSearch_API_KEY}|" \
|
||||||
-e "s|^MEILISEARCH_API_KEY_UID=|MEILISEARCH_API_KEY_UID=${MeiliSearch_API_KEY_UID}|" \
|
-e "s|^MEILISEARCH_API_KEY_UID=|MEILISEARCH_API_KEY_UID=${MeiliSearch_API_KEY_UID}|" \
|
||||||
/opt/bar-assistant/.env
|
/opt/bar-assistant/.env
|
||||||
$STD composer install --no-interaction
|
$STD composer install --no-interaction
|
||||||
$STD php artisan key:generate
|
$STD php artisan key:generate
|
||||||
touch storage/bar-assistant/database.ba3.sqlite
|
touch storage/bar-assistant/database.ba3.sqlite
|
||||||
|
|||||||
@ -14,38 +14,23 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
|
ca-certificates \
|
||||||
|
openssl \
|
||||||
snapraid \
|
snapraid \
|
||||||
avahi-daemon \
|
avahi-daemon \
|
||||||
fdisk
|
fdisk \
|
||||||
|
mergerfs \
|
||||||
|
unzip
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Install mergerfs"
|
setup_docker
|
||||||
MERGERFS_VERSION="2.40.2"
|
fetch_and_deploy_gh_release "cosmos" "azukaar/Cosmos-Server" "prebuild" "latest" "/opt/cosmos" "cosmos-cloud-*-amd64.zip"
|
||||||
curl -fsSL "https://github.com/trapexit/mergerfs/releases/download/${MERGERFS_VERSION}/mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb" -o "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb"
|
|
||||||
$STD dpkg -i "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb" || $STD apt-get install -f -y
|
|
||||||
rm "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb"
|
|
||||||
msg_ok "Installed mergerfs"
|
|
||||||
|
|
||||||
msg_info "Install Docker"
|
msg_info "Setting up Cosmos"
|
||||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
||||||
$STD sh get-docker.sh
|
|
||||||
rm get-docker.sh
|
|
||||||
msg_ok "Installed Docker"
|
|
||||||
|
|
||||||
msg_info "Install Cosmos"
|
|
||||||
mkdir -p /opt/cosmos
|
|
||||||
LATEST_RELEASE=$(curl -fsSL https://api.github.com/repos/azukaar/Cosmos-Server/releases/latest | grep "tag_name" | cut -d '"' -f 4)
|
|
||||||
ZIP_FILE="cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip"
|
|
||||||
curl -fsSL "https://github.com/azukaar/Cosmos-Server/releases/download/${LATEST_RELEASE}/${ZIP_FILE}" -o "/opt/cosmos/${ZIP_FILE}"
|
|
||||||
cd /opt/cosmos
|
cd /opt/cosmos
|
||||||
$STD unzip -o -q "${ZIP_FILE}"
|
|
||||||
LATEST_RELEASE_NO_V=${LATEST_RELEASE#v}
|
|
||||||
mv /opt/cosmos/cosmos-cloud-${LATEST_RELEASE_NO_V}/* /opt/cosmos/
|
|
||||||
rmdir /opt/cosmos/cosmos-cloud-${LATEST_RELEASE_NO_V}
|
|
||||||
chmod +x /opt/cosmos/cosmos
|
chmod +x /opt/cosmos/cosmos
|
||||||
rm -f "/opt/cosmos/cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip"
|
msg_ok "Set up Cosmos"
|
||||||
msg_ok "Installed Cosmos"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/cosmos.service
|
cat <<EOF >/etc/systemd/system/cosmos.service
|
||||||
|
|||||||
@ -14,7 +14,6 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
setup_hwaccel
|
setup_hwaccel
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "ersatztv" "ErsatzTV/ErsatzTV" "prebuild" "latest" "/opt/ErsatzTV" "*linux-x64.tar.gz"
|
fetch_and_deploy_gh_release "ersatztv" "ErsatzTV/ErsatzTV" "prebuild" "latest" "/opt/ErsatzTV" "*linux-x64.tar.gz"
|
||||||
fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
|
fetch_and_deploy_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg" "prebuild" "latest" "/opt/ErsatzTV-ffmpeg" "*-linux64-gpl-7.1.tar.xz"
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,7 @@ ExecStart=/usr/bin/php artisan serve --port 7990 --host 0.0.0.0
|
|||||||
TimeoutStopSec=30
|
TimeoutStopSec=30
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target"
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now heimdall
|
systemctl enable -q --now heimdall
|
||||||
cd /opt/Heimdall
|
cd /opt/Heimdall
|
||||||
|
|||||||
@ -18,17 +18,14 @@ $STD apt install -y \
|
|||||||
redis-server \
|
redis-server \
|
||||||
nginx \
|
nginx \
|
||||||
gettext \
|
gettext \
|
||||||
openssl \
|
openssl
|
||||||
musl-dev
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
|
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
|
||||||
setup_nodejs
|
setup_nodejs
|
||||||
fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-amd64.tar.gz"
|
fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-debian-amd64.tar.gz"
|
||||||
|
|
||||||
msg_info "Installing Homarr"
|
msg_info "Installing Homarr"
|
||||||
# fix musl issues because homarr compiles on alpine not debian soure: https://github.com/alexander-akhmetov/python-telegram/issues/3
|
|
||||||
ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1
|
|
||||||
mkdir -p /opt/homarr_db
|
mkdir -p /opt/homarr_db
|
||||||
touch /opt/homarr_db/db.sqlite
|
touch /opt/homarr_db/db.sqlite
|
||||||
SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)"
|
SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)"
|
||||||
@ -65,6 +62,8 @@ ReadWritePaths=-/appdata/redis -/var/lib/redis -/var/log/redis -/var/run/redis -
|
|||||||
EOF
|
EOF
|
||||||
cat <<EOF >/etc/systemd/system/homarr.service
|
cat <<EOF >/etc/systemd/system/homarr.service
|
||||||
[Unit]
|
[Unit]
|
||||||
|
Requires=redis-server.service
|
||||||
|
After=redis-server.service
|
||||||
Description=Homarr Service
|
Description=Homarr Service
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
@ -79,8 +78,9 @@ WantedBy=multi-user.target
|
|||||||
EOF
|
EOF
|
||||||
chmod +x /opt/homarr/run.sh
|
chmod +x /opt/homarr/run.sh
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable -q --now redis-server && sleep 5
|
systemctl enable -q --now redis-server
|
||||||
systemctl enable -q --now homarr
|
systemctl enable -q --now homarr
|
||||||
|
systemctl disable -q --now nginx
|
||||||
msg_ok "Created Services"
|
msg_ok "Created Services"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@ -99,10 +99,15 @@ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
|||||||
$STD apt install -y --no-install-recommends patchelf
|
$STD apt install -y --no-install-recommends patchelf
|
||||||
tmp_dir=$(mktemp -d)
|
tmp_dir=$(mktemp -d)
|
||||||
$STD pushd "$tmp_dir"
|
$STD pushd "$tmp_dir"
|
||||||
curl -fsSLO https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17384.11/intel-igc-core_1.0.17384.11_amd64.deb
|
curl -fsSLZ -O "https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.24/intel-igc-core_1.0.17537.24_amd64.deb" \
|
||||||
curl -fsSLO https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17384.11/intel-igc-opencl_1.0.17384.11_amd64.deb
|
-O "https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.24/intel-igc-opencl_1.0.17537.24_amd64.deb" \
|
||||||
curl -fsSLO https://github.com/intel/compute-runtime/releases/download/24.31.30508.7/intel-opencl-icd_24.31.30508.7_amd64.deb
|
-O "https://github.com/intel/compute-runtime/releases/download/24.35.30872.36/intel-opencl-icd-legacy1_24.35.30872.36_amd64.deb" \
|
||||||
curl -fsSLO https://github.com/intel/compute-runtime/releases/download/24.31.30508.7/libigdgmm12_22.4.1_amd64.deb
|
-O "https://github.com/intel/intel-graphics-compiler/releases/download/v2.22.2/intel-igc-core-2_2.22.2+20121_amd64.deb" \
|
||||||
|
-O "https://github.com/intel/intel-graphics-compiler/releases/download/v2.22.2/intel-igc-opencl-2_2.22.2+20121_amd64.deb" \
|
||||||
|
-O "https://github.com/intel/compute-runtime/releases/download/25.44.36015.5/intel-opencl-icd_25.44.36015.5-0_amd64.deb" \
|
||||||
|
-O "https://github.com/intel/compute-runtime/releases/download/25.44.36015.5/libigdgmm12_22.8.2_amd64.deb"
|
||||||
|
$STD apt install -y ./libigdgmm12*.deb
|
||||||
|
rm ./libigdgmm12*.deb
|
||||||
$STD apt install -y ./*.deb
|
$STD apt install -y ./*.deb
|
||||||
$STD apt-mark hold libigdgmm12
|
$STD apt-mark hold libigdgmm12
|
||||||
$STD popd
|
$STD popd
|
||||||
@ -291,7 +296,7 @@ GEO_DIR="${INSTALL_DIR}/geodata"
|
|||||||
mkdir -p "$INSTALL_DIR"
|
mkdir -p "$INSTALL_DIR"
|
||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.3.1" "$SRC_DIR"
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.4.1" "$SRC_DIR"
|
||||||
|
|
||||||
msg_info "Installing ${APPLICATION} (patience)"
|
msg_info "Installing ${APPLICATION} (patience)"
|
||||||
|
|
||||||
|
|||||||
@ -21,6 +21,18 @@ cd /opt/jotty
|
|||||||
$STD yarn --frozen-lockfile
|
$STD yarn --frozen-lockfile
|
||||||
$STD yarn next telemetry disable
|
$STD yarn next telemetry disable
|
||||||
$STD yarn build
|
$STD yarn build
|
||||||
|
|
||||||
|
[ -d "public" ] && cp -r public .next/standalone/
|
||||||
|
[ -d "howto" ] && cp -r howto .next/standalone/
|
||||||
|
mkdir -p .next/standalone/.next
|
||||||
|
cp -r .next/static .next/standalone/.next/
|
||||||
|
|
||||||
|
mv .next/standalone /tmp/jotty_standalone
|
||||||
|
rm -rf * .next .git .gitignore .yarn
|
||||||
|
mv /tmp/jotty_standalone/* .
|
||||||
|
mv /tmp/jotty_standalone/.[!.]* . 2>/dev/null || true
|
||||||
|
rm -rf /tmp/jotty_standalone
|
||||||
|
|
||||||
mkdir -p data/{users,checklists,notes}
|
mkdir -p data/{users,checklists,notes}
|
||||||
|
|
||||||
cat <<EOF >/opt/jotty/.env
|
cat <<EOF >/opt/jotty/.env
|
||||||
@ -55,7 +67,7 @@ After=network.target
|
|||||||
[Service]
|
[Service]
|
||||||
WorkingDirectory=/opt/jotty
|
WorkingDirectory=/opt/jotty
|
||||||
EnvironmentFile=/opt/jotty/.env
|
EnvironmentFile=/opt/jotty/.env
|
||||||
ExecStart=yarn start
|
ExecStart=/usr/bin/node server.js
|
||||||
Restart=on-abnormal
|
Restart=on-abnormal
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
|||||||
@ -62,7 +62,7 @@ EOF
|
|||||||
$STD yarn prisma:generate
|
$STD yarn prisma:generate
|
||||||
$STD yarn web:build
|
$STD yarn web:build
|
||||||
$STD yarn prisma:deploy
|
$STD yarn prisma:deploy
|
||||||
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache ~/.rustup
|
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache
|
||||||
rm -rf /root/.cache/yarn
|
rm -rf /root/.cache/yarn
|
||||||
rm -rf /opt/linkwarden/.next/cache
|
rm -rf /opt/linkwarden/.next/cache
|
||||||
msg_ok "Installed Linkwarden"
|
msg_ok "Installed Linkwarden"
|
||||||
|
|||||||
@ -14,16 +14,13 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Proxmox Mail Gateway"
|
msg_info "Installing Proxmox Mail Gateway"
|
||||||
curl -fsSL "https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg" -o "/usr/share/keyrings/proxmox-release-trixie.gpg"
|
setup_deb822_repo \
|
||||||
cat <<EOF >/etc/apt/sources.list.d/pmg.sources
|
"pmg" \
|
||||||
Types: deb
|
"https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg" \
|
||||||
URIs: http://download.proxmox.com/debian/pmg
|
"http://download.proxmox.com/debian/pmg" \
|
||||||
Suites: trixie
|
"trixie" \
|
||||||
Components: pmg-no-subscription
|
"pmg-no-subscription"
|
||||||
Signed-By: /usr/share/keyrings/proxmox-release-trixie.gpg
|
$STD apt install -y proxmox-mailgateway-container
|
||||||
EOF
|
|
||||||
$STD apt update
|
|
||||||
$STD apt -y install proxmox-mailgateway-container
|
|
||||||
msg_ok "Installed Proxmox Mail Gateway"
|
msg_ok "Installed Proxmox Mail Gateway"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@ -21,13 +21,8 @@ $STD sh <(curl -fsSL https://get.docker.com)
|
|||||||
systemctl enable -q --now docker
|
systemctl enable -q --now docker
|
||||||
msg_ok "Installed Docker"
|
msg_ok "Installed Docker"
|
||||||
|
|
||||||
msg_info "Installing Pterodactyl Wings"
|
fetch_and_deploy_gh_release "wings" "pterodactyl/wings" "singlefile" "latest" "/usr/local/bin" "wings_linux_amd64"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/wings/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
curl -fsSL "https://github.com/pterodactyl/wings/releases/download/v${RELEASE}/wings_linux_amd64" -o "/usr/local/bin/wings"
|
|
||||||
chmod u+x /usr/local/bin/wings
|
|
||||||
mkdir -p /etc/pterodactyl
|
mkdir -p /etc/pterodactyl
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
|
||||||
msg_ok "Installed Pterodactyl Wings"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
cat <<EOF >/etc/systemd/system/wings.service
|
cat <<EOF >/etc/systemd/system/wings.service
|
||||||
|
|||||||
@ -16,13 +16,12 @@ update_os
|
|||||||
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
fetch_and_deploy_gh_release "qdrant" "qdrant/qdrant" "binary" "latest" "/usr/bin/qdrant"
|
||||||
|
|
||||||
msg_info "Creating Qdrant Configuration"
|
msg_info "Creating Qdrant Configuration"
|
||||||
mkdir -p /var/lib/qdrant/storage
|
|
||||||
mkdir -p /var/lib/qdrant/snapshots
|
|
||||||
mkdir -p /etc/qdrant
|
mkdir -p /etc/qdrant
|
||||||
|
mkdir -p /var/lib/qdrant/{storage,snapshots}
|
||||||
chown -R root:root /var/lib/qdrant
|
chown -R root:root /var/lib/qdrant
|
||||||
chmod -R 755 /var/lib/qdrant
|
chmod -R 755 /var/lib/qdrant
|
||||||
|
|
||||||
cat >/etc/qdrant/config.yaml <<EOF
|
cat <<EOF >/etc/qdrant/config.yaml
|
||||||
log_level: INFO
|
log_level: INFO
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
@ -38,7 +37,7 @@ EOF
|
|||||||
msg_ok "Created Qdrant Configuration"
|
msg_ok "Created Qdrant Configuration"
|
||||||
|
|
||||||
msg_info "Creating Qdrant Service"
|
msg_info "Creating Qdrant Service"
|
||||||
cat >/etc/systemd/system/qdrant.service <<EOF
|
cat <<EOF >/etc/systemd/system/qdrant.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Qdrant Vector Search Engine
|
Description=Qdrant Vector Search Engine
|
||||||
After=network-online.target
|
After=network-online.target
|
||||||
|
|||||||
@ -15,51 +15,34 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y \
|
$STD apt install -y apt-transport-https
|
||||||
lsb-release \
|
|
||||||
apt-transport-https \
|
|
||||||
make
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Adding RabbitMQ signing key"
|
setup_deb822_repo \
|
||||||
curl -fsSL "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | gpg --dearmor >/usr/share/keyrings/com.rabbitmq.team.gpg
|
"rabbitmq" \
|
||||||
msg_ok "Signing keys added"
|
"https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" \
|
||||||
|
"https://deb1.rabbitmq.com/rabbitmq-server/debian/trixie" \
|
||||||
|
"trixie"
|
||||||
|
|
||||||
msg_info "Adding RabbitMQ repository"
|
msg_info "Setting up RabbitMQ"
|
||||||
cat <<EOF >/etc/apt/sources.list.d/rabbitmq.list
|
$STD apt install -y \
|
||||||
## Modern Erlang/OTP releases
|
erlang-base erlang-asn1 erlang-crypto erlang-eldap erlang-ftp \
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-erlang/debian/bookworm bookworm main
|
erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools \
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-erlang/debian/bookworm bookworm main
|
erlang-public-key erlang-runtime-tools erlang-snmp erlang-ssl \
|
||||||
|
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
|
||||||
|
$STD apt install -y --fix-missing rabbitmq-server
|
||||||
|
msg_ok "Setup RabbitMQ "
|
||||||
|
|
||||||
## Provides modern RabbitMQ releases
|
msg_info "Starting Service"
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-server/debian/bookworm bookworm main
|
|
||||||
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-server/debian/bookworm bookworm main
|
|
||||||
EOF
|
|
||||||
msg_ok "RabbitMQ repository added"
|
|
||||||
|
|
||||||
msg_info "Updating package list"
|
|
||||||
$STD apt update -y
|
|
||||||
msg_ok "Package list updated"
|
|
||||||
|
|
||||||
msg_info "Installing Erlang & RabbitMQ server"
|
|
||||||
$STD apt install -y erlang-base \
|
|
||||||
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
|
|
||||||
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
|
|
||||||
erlang-runtime-tools erlang-snmp erlang-ssl \
|
|
||||||
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl \
|
|
||||||
rabbitmq-server
|
|
||||||
msg_ok "RabbitMQ server installed"
|
|
||||||
|
|
||||||
msg_info "Starting RabbitMQ service"
|
|
||||||
systemctl enable -q --now rabbitmq-server
|
systemctl enable -q --now rabbitmq-server
|
||||||
msg_ok "RabbitMQ service started"
|
msg_ok "Started Service"
|
||||||
|
|
||||||
msg_info "Enabling RabbitMQ management plugin"
|
msg_info "Enabling RabbitMQ Management Plugin"
|
||||||
$STD rabbitmq-plugins enable rabbitmq_management
|
$STD rabbitmq-plugins enable rabbitmq_management
|
||||||
$STD rabbitmqctl enable_feature_flag all
|
$STD rabbitmqctl enable_feature_flag all
|
||||||
msg_ok "RabbitMQ management plugin enabled"
|
msg_ok "Enabled RabbitMQ Management Plugin"
|
||||||
|
|
||||||
msg_info "Create User"
|
msg_info "Creating User"
|
||||||
$STD rabbitmqctl add_user proxmox proxmox
|
$STD rabbitmqctl add_user proxmox proxmox
|
||||||
$STD rabbitmqctl set_user_tags proxmox administrator
|
$STD rabbitmqctl set_user_tags proxmox administrator
|
||||||
$STD rabbitmqctl set_permissions -p / proxmox ".*" ".*" ".*"
|
$STD rabbitmqctl set_permissions -p / proxmox ".*" ".*" ".*"
|
||||||
|
|||||||
@ -13,20 +13,21 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing ASP.NET Core Runtime"
|
msg_info "Installing Dependencies"
|
||||||
curl -fsSL "https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb" -o packages-microsoft-prod.deb
|
setup_deb822_repo \
|
||||||
$STD dpkg -i packages-microsoft-prod.deb
|
"microsoft" \
|
||||||
$STD apt update
|
"https://packages.microsoft.com/keys/microsoft-2025.asc" \
|
||||||
$STD apt install -y dotnet-sdk-9.0
|
"https://packages.microsoft.com/debian/13/prod/" \
|
||||||
msg_ok "Installed ASP.NET Core Runtime"
|
"trixie"
|
||||||
|
$STD apt install -y aspnetcore-runtime-9.0
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip"
|
||||||
|
|
||||||
msg_info "Configuring rdtclient"
|
msg_info "Setting up rdtclient"
|
||||||
cd /opt/rdtc
|
cd /opt/rdtc
|
||||||
mkdir -p data/{db,downloads}
|
mkdir -p data/{db,downloads}
|
||||||
sed -i 's#/data/db/#/opt/rdtc&#g' /opt/rdtc/appsettings.json
|
sed -i 's#/data/db/#/opt/rdtc&#g' /opt/rdtc/appsettings.json
|
||||||
rm -f ~/packages-microsoft-prod.deb
|
|
||||||
msg_ok "Configured rdtclient"
|
msg_ok "Configured rdtclient"
|
||||||
|
|
||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
@ -43,7 +44,7 @@ User=root
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
$STD systemctl enable -q --now rdtc
|
systemctl enable -q --now rdtc
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@ -19,30 +19,19 @@ curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio.deb -o minio
|
|||||||
$STD dpkg -i minio.deb
|
$STD dpkg -i minio.deb
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
import_local_ip
|
||||||
PG_VERSION="16" setup_postgresql
|
PG_VERSION="16" setup_postgresql
|
||||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
PG_DB_NAME="rxresume" PG_DB_USER="rxresume" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
|
||||||
|
NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||||
msg_info "Setting up Database"
|
fetch_and_deploy_gh_release "Reactive-Resume" "lazy-media/Reactive-Resume"
|
||||||
DB_USER="rxresume"
|
|
||||||
DB_NAME="rxresume"
|
|
||||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
|
||||||
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';"
|
|
||||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
|
||||||
$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME to $DB_USER;"
|
|
||||||
$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;"
|
|
||||||
msg_ok "Set up Database"
|
|
||||||
|
|
||||||
|
msg_info "Setting up Reactive-Resume"
|
||||||
MINIO_PASS=$(openssl rand -base64 48)
|
MINIO_PASS=$(openssl rand -base64 48)
|
||||||
ACCESS_TOKEN=$(openssl rand -base64 48)
|
ACCESS_TOKEN=$(openssl rand -base64 48)
|
||||||
REFRESH_TOKEN=$(openssl rand -base64 48)
|
REFRESH_TOKEN=$(openssl rand -base64 48)
|
||||||
CHROME_TOKEN=$(openssl rand -hex 32)
|
CHROME_TOKEN=$(openssl rand -hex 32)
|
||||||
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
|
||||||
TAG=$(curl -fsSL https://api.github.com/repos/browserless/browserless/tags?per_page=1 | grep "name" | awk '{print substr($2, 3, length($2)-4) }')
|
TAG=$(curl -fsSL https://api.github.com/repos/browserless/browserless/tags?per_page=1 | grep "name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
|
cd /opt/Reactive-Resume
|
||||||
fetch_and_deploy_gh_release "Reactive-Resume" "lazy-media/Reactive-Resume"
|
|
||||||
|
|
||||||
msg_info "Installing $APPLICATION"
|
|
||||||
cd /opt/"$APPLICATION"
|
|
||||||
export CI="true"
|
export CI="true"
|
||||||
export PUPPETEER_SKIP_DOWNLOAD="true"
|
export PUPPETEER_SKIP_DOWNLOAD="true"
|
||||||
export NODE_ENV="production"
|
export NODE_ENV="production"
|
||||||
@ -50,7 +39,7 @@ export NEXT_TELEMETRY_DISABLED=1
|
|||||||
$STD pnpm install --frozen-lockfile
|
$STD pnpm install --frozen-lockfile
|
||||||
$STD pnpm run build
|
$STD pnpm run build
|
||||||
$STD pnpm run prisma:generate
|
$STD pnpm run prisma:generate
|
||||||
msg_ok "Installed $APPLICATION"
|
msg_ok "Setup Reactive-Resume"
|
||||||
|
|
||||||
msg_info "Installing Browserless (Patience)"
|
msg_info "Installing Browserless (Patience)"
|
||||||
cd /tmp
|
cd /tmp
|
||||||
@ -76,13 +65,14 @@ MINIO_ROOT_PASSWORD="${MINIO_PASS}"
|
|||||||
MINIO_VOLUMES=/opt/minio
|
MINIO_VOLUMES=/opt/minio
|
||||||
MINIO_OPTS="--address :9000 --console-address 127.0.0.1:9001"
|
MINIO_OPTS="--address :9000 --console-address 127.0.0.1:9001"
|
||||||
EOF
|
EOF
|
||||||
cat <<EOF >/opt/"$APPLICATION"/.env
|
|
||||||
|
cat <<EOF >/opt/Reactive-Resume/.env
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
PORT=3000
|
PORT=3000
|
||||||
# for use behind a reverse proxy, use your FQDN for PUBLIC_URL and STORAGE_URL
|
# for use behind a reverse proxy, use your FQDN for PUBLIC_URL and STORAGE_URL
|
||||||
PUBLIC_URL=http://${LOCAL_IP}:3000
|
PUBLIC_URL=http://${LOCAL_IP}:3000
|
||||||
STORAGE_URL=http://${LOCAL_IP}:9000/rxresume
|
STORAGE_URL=http://${LOCAL_IP}:9000/rxresume
|
||||||
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}?schema=public
|
DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}?schema=public
|
||||||
ACCESS_TOKEN_SECRET=${ACCESS_TOKEN}
|
ACCESS_TOKEN_SECRET=${ACCESS_TOKEN}
|
||||||
REFRESH_TOKEN_SECRET=${REFRESH_TOKEN}
|
REFRESH_TOKEN_SECRET=${REFRESH_TOKEN}
|
||||||
CHROME_PORT=8080
|
CHROME_PORT=8080
|
||||||
@ -110,19 +100,13 @@ STORAGE_SKIP_BUCKET_CHECK=false
|
|||||||
# GOOGLE_CLIENT_SECRET=
|
# GOOGLE_CLIENT_SECRET=
|
||||||
# GOOGLE_CALLBACK_URL=http://localhost:5173/api/auth/google/callback
|
# GOOGLE_CALLBACK_URL=http://localhost:5173/api/auth/google/callback
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<EOF >/opt/browserless/.env
|
cat <<EOF >/opt/browserless/.env
|
||||||
DEBUG=browserless*,-**:verbose
|
DEBUG=browserless*,-**:verbose
|
||||||
HOST=localhost
|
HOST=localhost
|
||||||
PORT=8080
|
PORT=8080
|
||||||
TOKEN=${CHROME_TOKEN}
|
TOKEN=${CHROME_TOKEN}
|
||||||
EOF
|
EOF
|
||||||
{
|
|
||||||
echo "${APPLICATION} Credentials"
|
|
||||||
echo "Database User: $DB_USER"
|
|
||||||
echo "Database Password: $DB_PASS"
|
|
||||||
echo "Database Name: $DB_NAME"
|
|
||||||
echo "Minio Root Password: ${MINIO_PASS}"
|
|
||||||
} >>~/"$APPLICATION".creds
|
|
||||||
rm -f /tmp/v"$TAG".zip
|
rm -f /tmp/v"$TAG".zip
|
||||||
rm -f /tmp/minio.deb
|
rm -f /tmp/minio.deb
|
||||||
msg_ok "Configured applications"
|
msg_ok "Configured applications"
|
||||||
@ -137,15 +121,15 @@ WorkingDirectory=/usr/local/bin
|
|||||||
EnvironmentFile=/opt/minio/.env
|
EnvironmentFile=/opt/minio/.env
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/"$APPLICATION".service
|
cat <<EOF >/etc/systemd/system/Reactive-Resume.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=${APPLICATION} Service
|
Description=Reactive-Resume Service
|
||||||
After=network.target postgresql.service minio.service
|
After=network.target postgresql.service minio.service
|
||||||
Wants=postgresql.service minio.service
|
Wants=postgresql.service minio.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
WorkingDirectory=/opt/${APPLICATION}
|
WorkingDirectory=/opt/Reactive-Resume
|
||||||
EnvironmentFile=/opt/${APPLICATION}/.env
|
EnvironmentFile=/opt/Reactive-Resume/.env
|
||||||
ExecStart=/usr/bin/pnpm run start
|
ExecStart=/usr/bin/pnpm run start
|
||||||
Restart=always
|
Restart=always
|
||||||
|
|
||||||
@ -156,7 +140,7 @@ EOF
|
|||||||
cat <<EOF >/etc/systemd/system/browserless.service
|
cat <<EOF >/etc/systemd/system/browserless.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Browserless service
|
Description=Browserless service
|
||||||
After=network.target ${APPLICATION}.service
|
After=network.target Reactive-Resume.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
WorkingDirectory=/opt/browserless
|
WorkingDirectory=/opt/browserless
|
||||||
@ -168,7 +152,7 @@ Restart=unless-stopped
|
|||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable -q --now minio.service "$APPLICATION".service browserless.service
|
systemctl enable -q --now minio.service Reactive-Resume.service browserless.service
|
||||||
msg_ok "Created Services"
|
msg_ok "Created Services"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@ -24,6 +24,14 @@ mkdir -p /root/.config/recyclarr
|
|||||||
$STD recyclarr config create
|
$STD recyclarr config create
|
||||||
msg_ok "Configured Recyclarr"
|
msg_ok "Configured Recyclarr"
|
||||||
|
|
||||||
|
msg_info "Setting up Daily Sync Cron"
|
||||||
|
cat <<EOF >/etc/cron.d/recyclarr
|
||||||
|
# Run recyclarr sync daily
|
||||||
|
@daily root recyclarr sync >> /root/.config/recyclarr/sync.log 2>&1
|
||||||
|
EOF
|
||||||
|
chmod 644 /etc/cron.d/recyclarr
|
||||||
|
msg_ok "Setup Daily Sync Cron"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
cleanup_lxc
|
cleanup_lxc
|
||||||
|
|||||||
@ -14,25 +14,22 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y \
|
$STD apt install -y apt-transport-https
|
||||||
apt-transport-https \
|
|
||||||
lsb-release
|
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Installing Redis"
|
msg_info "Setting up Redis Repository"
|
||||||
curl -fsSL "https://packages.redis.io/gpg" | gpg --dearmor >/usr/share/keyrings/redis-archive-keyring.gpg
|
setup_deb822_repo \
|
||||||
cat <<EOF >/etc/apt/sources.list.d/redis.sources
|
"redis" \
|
||||||
Types: deb
|
"https://packages.redis.io/gpg" \
|
||||||
URIs: https://packages.redis.io/deb
|
"https://packages.redis.io/deb" \
|
||||||
Suites: $(lsb_release -cs)
|
"trixie"
|
||||||
Components: main
|
msg_ok "Setup Redis Repository"
|
||||||
Signed-By: /usr/share/keyrings/redis-archive-keyring.gpg
|
|
||||||
EOF
|
msg_info "Setting up Redis"
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y redis
|
$STD apt install -y redis
|
||||||
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis/redis.conf
|
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis/redis.conf
|
||||||
systemctl enable -q --now redis-server
|
systemctl enable -q --now redis-server
|
||||||
msg_ok "Installed Redis"
|
msg_ok "Setup Redis"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
@ -21,27 +21,9 @@ $STD apt install -y \
|
|||||||
zstd
|
zstd
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
JAVA_VERSION="24" setup_java
|
JAVA_VERSION="25" setup_java
|
||||||
PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
|
PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
|
||||||
|
PG_DB_NAME="reitti_db" PG_DB_USER="reitti" setup_postgresql_db
|
||||||
msg_info "Setting up PostgreSQL"
|
|
||||||
DB_NAME="reitti_db"
|
|
||||||
DB_USER="reitti"
|
|
||||||
DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
|
|
||||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
|
|
||||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
|
||||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';"
|
|
||||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
|
|
||||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';"
|
|
||||||
$STD sudo -u postgres psql -d "$DB_NAME" -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
|
||||||
$STD sudo -u postgres psql -d "$DB_NAME" -c "CREATE EXTENSION IF NOT EXISTS postgis_topology;"
|
|
||||||
{
|
|
||||||
echo "Reitti Credentials"
|
|
||||||
echo "Database Name: $DB_NAME"
|
|
||||||
echo "Database User: $DB_USER"
|
|
||||||
echo "Database Password: $DB_PASS"
|
|
||||||
} >>~/reitti.creds
|
|
||||||
msg_ok "PostgreSQL Setup Completed"
|
|
||||||
|
|
||||||
msg_info "Configuring RabbitMQ"
|
msg_info "Configuring RabbitMQ"
|
||||||
RABBIT_USER="reitti"
|
RABBIT_USER="reitti"
|
||||||
@ -71,9 +53,9 @@ cat <<EOF >/opt/reitti/application.properties
|
|||||||
reitti.server.advertise-uri=http://127.0.0.1:8080
|
reitti.server.advertise-uri=http://127.0.0.1:8080
|
||||||
|
|
||||||
# PostgreSQL Database Connection
|
# PostgreSQL Database Connection
|
||||||
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/$DB_NAME
|
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/$PG_DB_NAME
|
||||||
spring.datasource.username=$DB_USER
|
spring.datasource.username=$PG_DB_USER
|
||||||
spring.datasource.password=$DB_PASS
|
spring.datasource.password=$PG_DB_PASS
|
||||||
spring.datasource.driver-class-name=org.postgresql.Driver
|
spring.datasource.driver-class-name=org.postgresql.Driver
|
||||||
|
|
||||||
# Flyway Database Migrations
|
# Flyway Database Migrations
|
||||||
@ -132,7 +114,7 @@ Restart=on-failure
|
|||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<'EOF' >/etc/systemd/system/photon.service
|
cat <<EOF >/etc/systemd/system/photon.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Photon Geocoding Service (Germany, OpenSearch)
|
Description=Photon Geocoding Service (Germany, OpenSearch)
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|||||||
@ -14,16 +14,13 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Setting up Resilio Sync Repository"
|
msg_info "Setting up Resilio Sync Repository"
|
||||||
curl -fsSL "https://linux-packages.resilio.com/resilio-sync/key.asc" >/usr/share/keyrings/resilio-sync-archive-keyring.asc
|
setup_deb822_repo \
|
||||||
cat <<EOF >/etc/apt/sources.list.d/resilio-sync.sources
|
"resilio" \
|
||||||
Types: deb
|
"https://linux-packages.resilio.com/resilio-sync/key.asc" \
|
||||||
URIs: http://linux-packages.resilio.com/resilio-sync/deb
|
"http://linux-packages.resilio.com/resilio-sync/deb" \
|
||||||
Suites: resilio-sync
|
"resilio-sync" \
|
||||||
Components: non-free
|
"non-free"
|
||||||
Signed-By: /usr/share/keyrings/resilio-sync-archive-keyring.asc
|
msg_ok "Setup Resilio Sync Repository"
|
||||||
EOF
|
|
||||||
$STD apt update
|
|
||||||
msg_ok "Resilio Sync Repository Setup"
|
|
||||||
|
|
||||||
msg_info "Installing Resilio Sync"
|
msg_info "Installing Resilio Sync"
|
||||||
$STD apt install -y resilio-sync
|
$STD apt install -y resilio-sync
|
||||||
|
|||||||
@ -13,19 +13,16 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Setting up Salt Repo"
|
||||||
$STD apt install -y jq
|
setup_deb822_repo \
|
||||||
msg_ok "Installed Dependencies"
|
"salt" \
|
||||||
|
"https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public" \
|
||||||
msg_info "Setup Salt Repo"
|
"https://packages.broadcom.com/artifactory/saltproject-deb" \
|
||||||
mkdir -p /etc/apt/keyrings
|
"stable"
|
||||||
curl -fsSL https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public -o /etc/apt/keyrings/salt-archive-keyring.pgp
|
|
||||||
curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources -o /etc/apt/sources.list.d/salt.sources
|
|
||||||
$STD apt update
|
|
||||||
msg_ok "Setup Salt Repo"
|
msg_ok "Setup Salt Repo"
|
||||||
|
|
||||||
msg_info "Installing Salt"
|
msg_info "Installing Salt"
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//')
|
RELEASE=$(get_latest_github_release "saltstack/salt")
|
||||||
cat <<EOF >/etc/apt/preferences.d/salt-pin-1001
|
cat <<EOF >/etc/apt/preferences.d/salt-pin-1001
|
||||||
Package: salt-*
|
Package: salt-*
|
||||||
Pin: version ${RELEASE}
|
Pin: version ${RELEASE}
|
||||||
|
|||||||
@ -15,22 +15,15 @@ update_os
|
|||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt install -y git
|
$STD apt install -y git
|
||||||
|
setup_deb822_repo \
|
||||||
|
"ansible" \
|
||||||
|
"https://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=get&search=0x6125E2A8C77F2818FB7BD15B93C4A3FD7BB9C367" \
|
||||||
|
"http://ppa.launchpad.net/ansible/ansible/ubuntu" \
|
||||||
|
"jammy"
|
||||||
|
$STD apt install -y ansible
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
msg_info "Setting up Ansible"
|
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary" "latest" "/opt/semaphore" "semaphore_*_linux_amd64.deb"
|
||||||
curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=get&search=0x6125E2A8C77F2818FB7BD15B93C4A3FD7BB9C367" | gpg --dearmor -o /usr/share/keyrings/ansible-archive-keyring.gpg
|
|
||||||
cat <<EOF >/etc/apt/sources.list.d/ansible.sources
|
|
||||||
Types: deb
|
|
||||||
URIs: http://ppa.launchpad.net/ansible/ansible/ubuntu
|
|
||||||
Suites: jammy
|
|
||||||
Components: main
|
|
||||||
Signed-By: /usr/share/keyrings/ansible-archive-keyring.gpg
|
|
||||||
EOF
|
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y ansible
|
|
||||||
msg_ok "Set up Ansible"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "semaphore" "semaphoreui/semaphore" "binary"
|
|
||||||
|
|
||||||
msg_info "Configuring Semaphore"
|
msg_info "Configuring Semaphore"
|
||||||
mkdir -p /opt/semaphore
|
mkdir -p /opt/semaphore
|
||||||
@ -70,7 +63,6 @@ RestartSec=10s
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
systemctl enable -q --now semaphore
|
systemctl enable -q --now semaphore
|
||||||
msg_ok "Created Service"
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
|||||||
@ -71,8 +71,6 @@ SESSION_LIFETIME=120
|
|||||||
|
|
||||||
SPEEDTEST_SCHEDULE="0 */6 * * *"
|
SPEEDTEST_SCHEDULE="0 */6 * * *"
|
||||||
SPEEDTEST_SERVERS=
|
SPEEDTEST_SERVERS=
|
||||||
SPEEDTEST_EXTERNAL_IP_URL=https://ipecho.net/plain
|
|
||||||
SPEEDTEST_INTERNET_CHECK_HOSTNAME=1.1.1.1
|
|
||||||
PRUNE_RESULTS_OLDER_THAN=0
|
PRUNE_RESULTS_OLDER_THAN=0
|
||||||
|
|
||||||
DISPLAY_TIMEZONE=${TIMEZONE}
|
DISPLAY_TIMEZONE=${TIMEZONE}
|
||||||
|
|||||||
@ -13,27 +13,17 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Adding Telegraf key and repository"
|
msg_info "Setting up Telegraf repository"
|
||||||
curl -fsSL -O https://repos.influxdata.com/influxdata-archive.key
|
setup_deb822_repo \
|
||||||
gpg --show-keys --with-fingerprint --with-colons ./influxdata-archive.key 2>&1 |
|
"telegraf" \
|
||||||
grep -q '^fpr:\+24C975CBA61A024EE1B631787C3D57159FC2F927:$' &&
|
"https://repos.influxdata.com/influxdata-archive.key" \
|
||||||
cat influxdata-archive.key |
|
"https://repos.influxdata.com/debian" \
|
||||||
gpg --dearmor |
|
"stable"
|
||||||
tee /etc/apt/keyrings/influxdata-archive.gpg >/dev/null
|
msg_ok "Setup Telegraf Repository"
|
||||||
cat <<EOF | sudo tee /etc/apt/sources.list.d/influxdata.sources >/dev/null
|
|
||||||
Types: deb
|
|
||||||
URIs: https://repos.influxdata.com/debian
|
|
||||||
Suites: stable
|
|
||||||
Components: main
|
|
||||||
Signed-By: /etc/apt/keyrings/influxdata-archive.gpg
|
|
||||||
EOF
|
|
||||||
msg_ok "Added Telegraf Repository"
|
|
||||||
|
|
||||||
msg_info "Installing Telegraf"
|
msg_info "Setting up Telegraf"
|
||||||
$STD apt update
|
$STD apt install -y telegraf
|
||||||
$STD apt install telegraf -y
|
msg_ok "Setup Telegraf"
|
||||||
rm /influxdata-archive.key
|
|
||||||
msg_ok "Installed Telegraf"
|
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
customize
|
customize
|
||||||
|
|||||||
@ -17,7 +17,6 @@ msg_info "Installing Dependencies"
|
|||||||
$STD apt install -y apt-transport-https
|
$STD apt install -y apt-transport-https
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
JAVA_VERION="17" setup_java
|
|
||||||
setup_deb822_repo \
|
setup_deb822_repo \
|
||||||
"unifi" \
|
"unifi" \
|
||||||
"https://dl.ui.com/unifi/unifi-repo.gpg" \
|
"https://dl.ui.com/unifi/unifi-repo.gpg" \
|
||||||
@ -26,17 +25,22 @@ setup_deb822_repo \
|
|||||||
"ubiquiti" \
|
"ubiquiti" \
|
||||||
"amd64"
|
"amd64"
|
||||||
|
|
||||||
if ! grep -q -m1 'avx[^ ]*' /proc/cpuinfo; then
|
JAVA_VERSION="21" setup_java
|
||||||
msg_warn "No AVX Support Detected. MongoDB v4.4 will be installed"
|
|
||||||
if ! dpkg -l | grep -q "libssl1.1"; then
|
if lscpu | grep -q 'avx'; then
|
||||||
curl -fsSL "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u4_amd64.deb" -o "libssl1.1_1.1.1w-0+deb11u4_amd64.deb"
|
MONGO_VERSION="8.0" setup_mongodb
|
||||||
$STD dpkg -i libssl1.1_1.1.1w-0+deb11u4_amd64.deb
|
|
||||||
fi
|
|
||||||
MONGO_VERSION="4.4" setup_mongodb
|
|
||||||
else
|
else
|
||||||
MONGO_VERSION="7.0" setup_mongodb
|
msg_error "No AVX detected (CPU-Flag)! We have discontinued support for this. You are welcome to try it manually with a Debian LXC, but due to the many issues with Unifi, we currently only support AVX CPUs."
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! dpkg -l | grep -q 'libssl1.1'; then
|
||||||
|
msg_info "Installing libssl (if needed)"
|
||||||
|
curl -fsSL "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u4_amd64.deb" -o "/tmp/libssl.deb"
|
||||||
|
$STD dpkg -i /tmp/libssl.deb
|
||||||
|
rm -f /tmp/libssl.deb
|
||||||
|
msg_ok "Installed libssl1.1"
|
||||||
fi
|
fi
|
||||||
msg_ok "Installed MongoDB"
|
|
||||||
|
|
||||||
msg_info "Installing UniFi Network Server"
|
msg_info "Installing UniFi Network Server"
|
||||||
$STD apt install -y unifi
|
$STD apt install -y unifi
|
||||||
|
|||||||
@ -31,12 +31,27 @@ esac
|
|||||||
|
|
||||||
msg_info "Installing Zabbix $ZABBIX_VERSION"
|
msg_info "Installing Zabbix $ZABBIX_VERSION"
|
||||||
cd /tmp
|
cd /tmp
|
||||||
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
|
||||||
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
|
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then
|
||||||
$STD dpkg -i /tmp/zabbix-release_latest+debian13_all.deb
|
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
|
||||||
|
ZABBIX_DEB_FILE="zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
|
||||||
|
else
|
||||||
|
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
|
||||||
|
ZABBIX_DEB_FILE="zabbix-release_latest+debian13_all.deb"
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/"$ZABBIX_DEB_FILE"
|
||||||
|
$STD dpkg -i /tmp/"$ZABBIX_DEB_FILE"
|
||||||
$STD apt update
|
$STD apt update
|
||||||
$STD apt install -y zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql zabbix-apache-conf zabbix-sql-scripts
|
$STD apt install -y zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql zabbix-apache-conf zabbix-sql-scripts
|
||||||
zcat /usr/share/zabbix/sql-scripts/postgresql/server.sql.gz | sudo -u "$PG_DB_USER" psql "$PG_DB_NAME" &>/dev/null
|
|
||||||
|
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then
|
||||||
|
ZABBIX_SQL="/usr/share/zabbix-sql-scripts/postgresql/server.sql.gz"
|
||||||
|
else
|
||||||
|
ZABBIX_SQL="/usr/share/zabbix/sql-scripts/postgresql/server.sql.gz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
zcat "$ZABBIX_SQL" | sudo -u "$PG_DB_USER" psql "$PG_DB_NAME" &>/dev/null
|
||||||
sed -i "s/^DBName=.*/DBName=$PG_DB_NAME/" /etc/zabbix/zabbix_server.conf
|
sed -i "s/^DBName=.*/DBName=$PG_DB_NAME/" /etc/zabbix/zabbix_server.conf
|
||||||
sed -i "s/^DBUser=.*/DBUser=$PG_DB_USER/" /etc/zabbix/zabbix_server.conf
|
sed -i "s/^DBUser=.*/DBUser=$PG_DB_USER/" /etc/zabbix/zabbix_server.conf
|
||||||
sed -i "s/^# DBPassword=.*/DBPassword=$PG_DB_PASS/" /etc/zabbix/zabbix_server.conf
|
sed -i "s/^# DBPassword=.*/DBPassword=$PG_DB_PASS/" /etc/zabbix/zabbix_server.conf
|
||||||
@ -104,7 +119,7 @@ fi
|
|||||||
|
|
||||||
systemctl restart zabbix-server apache2
|
systemctl restart zabbix-server apache2
|
||||||
systemctl enable -q --now zabbix-server $AGENT_SERVICE apache2
|
systemctl enable -q --now zabbix-server $AGENT_SERVICE apache2
|
||||||
rm -rf /tmp/zabbix-release_latest+debian13_all.deb
|
rm -rf /tmp/zabbix-release_*.deb
|
||||||
msg_ok "Started Services"
|
msg_ok "Started Services"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@ -2626,8 +2626,8 @@ configure_ssh_settings() {
|
|||||||
#
|
#
|
||||||
# - Entry point of script
|
# - Entry point of script
|
||||||
# - On Proxmox host: calls install_script
|
# - On Proxmox host: calls install_script
|
||||||
# - In silent mode: runs update_script
|
# - In silent mode: runs update_script with automatic cleanup
|
||||||
# - Otherwise: shows update/setting menu
|
# - Otherwise: shows update/setting menu and runs update_script with cleanup
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
start() {
|
start() {
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
@ -2638,6 +2638,7 @@ start() {
|
|||||||
VERBOSE="no"
|
VERBOSE="no"
|
||||||
set_std_mode
|
set_std_mode
|
||||||
update_script
|
update_script
|
||||||
|
cleanup_lxc
|
||||||
else
|
else
|
||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC Update/Setting" --menu \
|
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC Update/Setting" --menu \
|
||||||
"Support/Update functions for ${APP} LXC. Choose an option:" \
|
"Support/Update functions for ${APP} LXC. Choose an option:" \
|
||||||
@ -2662,6 +2663,7 @@ start() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
update_script
|
update_script
|
||||||
|
cleanup_lxc
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -815,8 +815,11 @@ cleanup_lxc() {
|
|||||||
xargs -0 -n1 truncate -s 0 2>/dev/null || true
|
xargs -0 -n1 truncate -s 0 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Node.js npm
|
# Node.js npm - directly remove cache directory
|
||||||
if command -v npm &>/dev/null; then $STD npm cache clean --force || true; fi
|
# npm cache clean/verify can fail with ENOTEMPTY errors, so we skip them
|
||||||
|
if command -v npm &>/dev/null; then
|
||||||
|
rm -rf /root/.npm/_cacache /root/.npm/_logs 2>/dev/null || true
|
||||||
|
fi
|
||||||
# Node.js yarn
|
# Node.js yarn
|
||||||
if command -v yarn &>/dev/null; then $STD yarn cache clean || true; fi
|
if command -v yarn &>/dev/null; then $STD yarn cache clean || true; fi
|
||||||
# Node.js pnpm
|
# Node.js pnpm
|
||||||
|
|||||||
@ -334,9 +334,9 @@ remove_old_tool_version() {
|
|||||||
$STD apt purge -y nodejs npm >/dev/null 2>&1 || true
|
$STD apt purge -y nodejs npm >/dev/null 2>&1 || true
|
||||||
# Clean up npm global modules
|
# Clean up npm global modules
|
||||||
if command -v npm >/dev/null 2>&1; then
|
if command -v npm >/dev/null 2>&1; then
|
||||||
npm list -g 2>/dev/null | grep -oE '^ \S+' | awk '{print $1}' | while read -r module; do
|
npm list -g 2>/dev/null | grep -oE '^ \S+' | awk '{print $1}' 2>/dev/null | while read -r module; do
|
||||||
npm uninstall -g "$module" >/dev/null 2>&1 || true
|
npm uninstall -g "$module" >/dev/null 2>&1 || true
|
||||||
done
|
done || true
|
||||||
fi
|
fi
|
||||||
cleanup_legacy_install "nodejs"
|
cleanup_legacy_install "nodejs"
|
||||||
cleanup_tool_keyrings "nodesource"
|
cleanup_tool_keyrings "nodesource"
|
||||||
@ -1167,7 +1167,7 @@ cleanup_orphaned_sources() {
|
|||||||
|
|
||||||
# Extract Signed-By path from .sources file
|
# Extract Signed-By path from .sources file
|
||||||
local keyring_path
|
local keyring_path
|
||||||
keyring_path=$(grep -E '^Signed-By:' "$sources_file" 2>/dev/null | awk '{print $2}')
|
keyring_path=$(grep -E '^Signed-By:' "$sources_file" 2>/dev/null | awk '{print $2}' 2>/dev/null || true)
|
||||||
|
|
||||||
# If keyring doesn't exist, remove the .sources file
|
# If keyring doesn't exist, remove the .sources file
|
||||||
if [[ -n "$keyring_path" ]] && [[ ! -f "$keyring_path" ]]; then
|
if [[ -n "$keyring_path" ]] && [[ ! -f "$keyring_path" ]]; then
|
||||||
@ -2073,7 +2073,7 @@ function setup_adminer() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
local VERSION
|
local VERSION
|
||||||
VERSION=$(dpkg -s adminer 2>/dev/null | grep '^Version:' | awk '{print $2}')
|
VERSION=$(dpkg -s adminer 2>/dev/null | grep '^Version:' | awk '{print $2}' 2>/dev/null || echo 'unknown')
|
||||||
cache_installed_version "adminer" "${VERSION:-unknown}"
|
cache_installed_version "adminer" "${VERSION:-unknown}"
|
||||||
msg_ok "Setup Adminer (Debian/Ubuntu)"
|
msg_ok "Setup Adminer (Debian/Ubuntu)"
|
||||||
fi
|
fi
|
||||||
@ -2591,7 +2591,7 @@ function setup_hwaccel() {
|
|||||||
|
|
||||||
# Detect CPU vendor (relevant for AMD APUs)
|
# Detect CPU vendor (relevant for AMD APUs)
|
||||||
local cpu_vendor
|
local cpu_vendor
|
||||||
cpu_vendor=$(lscpu 2>/dev/null | grep -i 'Vendor ID' | awk '{print $3}' || echo "")
|
cpu_vendor=$(lscpu 2>/dev/null | grep -i 'Vendor ID' | awk '{print $3}' 2>/dev/null || echo "")
|
||||||
|
|
||||||
if [[ -z "$gpu_vendor" && -z "$cpu_vendor" ]]; then
|
if [[ -z "$gpu_vendor" && -z "$cpu_vendor" ]]; then
|
||||||
msg_warn "No GPU or CPU vendor detected - skipping hardware acceleration setup"
|
msg_warn "No GPU or CPU vendor detected - skipping hardware acceleration setup"
|
||||||
@ -2734,11 +2734,57 @@ EOF
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# AMD firmware for better GPU support
|
# For AMD GPUs, firmware-amd-graphics requires non-free repositories
|
||||||
if [[ "$os_id" == "debian" ]]; then
|
if [[ "$os_id" == "debian" ]]; then
|
||||||
$STD apt -y install firmware-amd-graphics 2>/dev/null || true
|
# Add non-free-firmware repository if not already present
|
||||||
|
if [[ ! -f /etc/apt/sources.list.d/non-free-firmware.sources ]]; then
|
||||||
|
if [[ "$os_codename" == "bookworm" ]]; then
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/non-free-firmware.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: http://deb.debian.org/debian
|
||||||
|
Suites: bookworm bookworm-updates
|
||||||
|
Components: non-free-firmware
|
||||||
|
|
||||||
|
Types: deb
|
||||||
|
URIs: http://deb.debian.org/debian-security
|
||||||
|
Suites: bookworm-security
|
||||||
|
Components: non-free-firmware
|
||||||
|
EOF
|
||||||
|
elif [[ "$os_codename" == "trixie" || "$os_codename" == "sid" ]]; then
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/non-free-firmware.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: http://deb.debian.org/debian
|
||||||
|
Suites: trixie trixie-updates
|
||||||
|
Components: non-free-firmware
|
||||||
|
|
||||||
|
Types: deb
|
||||||
|
URIs: http://deb.debian.org/debian-security
|
||||||
|
Suites: trixie-security
|
||||||
|
Components: non-free-firmware
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
$STD apt update
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install AMD firmware and libdrm
|
||||||
|
$STD apt -y install libdrm-amdgpu1 firmware-amd-graphics 2>/dev/null || {
|
||||||
|
msg_warn "Failed to install AMD firmware - may need manual installation"
|
||||||
|
}
|
||||||
|
elif [[ "$os_id" == "ubuntu" ]]; then
|
||||||
|
# For Ubuntu, ensure multiverse is enabled (firmware-amd-graphics is in multiverse)
|
||||||
|
if ! grep -qE '^deb.*multiverse' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null; then
|
||||||
|
$STD add-apt-repository -y multiverse
|
||||||
|
$STD apt update
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install AMD firmware and libdrm
|
||||||
|
$STD apt -y install libdrm-amdgpu1 firmware-amd-graphics 2>/dev/null || {
|
||||||
|
msg_warn "Failed to install AMD firmware - may need manual installation"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# For other distributions, try without adding repositories
|
||||||
|
$STD apt -y install libdrm-amdgpu1 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
$STD apt -y install libdrm-amdgpu1 2>/dev/null || true
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
NVIDIA)
|
NVIDIA)
|
||||||
@ -3699,7 +3745,7 @@ function setup_nodejs() {
|
|||||||
|
|
||||||
# Check if the module is already installed
|
# Check if the module is already installed
|
||||||
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then
|
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then
|
||||||
MODULE_INSTALLED_VERSION="$($STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
|
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' 2>/dev/null | tr -d '[:space:]' || echo '')"
|
||||||
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
||||||
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
||||||
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
|
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
|
||||||
@ -3818,7 +3864,7 @@ EOF
|
|||||||
|
|
||||||
# Get available PHP version from repository
|
# Get available PHP version from repository
|
||||||
local AVAILABLE_PHP_VERSION=""
|
local AVAILABLE_PHP_VERSION=""
|
||||||
AVAILABLE_PHP_VERSION=$(apt-cache show "php${PHP_VERSION}" 2>/dev/null | grep -m1 "^Version:" | awk '{print $2}' | cut -d- -f1) || true
|
AVAILABLE_PHP_VERSION=$(apt-cache show "php${PHP_VERSION}" 2>/dev/null | grep -m1 "^Version:" | awk '{print $2}' 2>/dev/null | cut -d- -f1 || true)
|
||||||
|
|
||||||
if [[ -z "$AVAILABLE_PHP_VERSION" ]]; then
|
if [[ -z "$AVAILABLE_PHP_VERSION" ]]; then
|
||||||
msg_error "PHP ${PHP_VERSION} not found in configured repositories"
|
msg_error "PHP ${PHP_VERSION} not found in configured repositories"
|
||||||
@ -4620,7 +4666,7 @@ function setup_rust() {
|
|||||||
|
|
||||||
# Check if already installed
|
# Check if already installed
|
||||||
if echo "$CRATE_LIST" | grep -q "^${NAME} "; then
|
if echo "$CRATE_LIST" | grep -q "^${NAME} "; then
|
||||||
INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
|
INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo '')
|
||||||
|
|
||||||
if [[ -n "$VER" && "$VER" != "$INSTALLED_VER" ]]; then
|
if [[ -n "$VER" && "$VER" != "$INSTALLED_VER" ]]; then
|
||||||
msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER"
|
msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER"
|
||||||
@ -4635,7 +4681,7 @@ function setup_rust() {
|
|||||||
msg_error "Failed to upgrade $NAME"
|
msg_error "Failed to upgrade $NAME"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
|
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo 'unknown')
|
||||||
msg_ok "Upgraded $NAME to v$NEW_VER"
|
msg_ok "Upgraded $NAME to v$NEW_VER"
|
||||||
else
|
else
|
||||||
msg_ok "$NAME v$INSTALLED_VER already installed"
|
msg_ok "$NAME v$INSTALLED_VER already installed"
|
||||||
@ -4653,7 +4699,7 @@ function setup_rust() {
|
|||||||
msg_error "Failed to install $NAME"
|
msg_error "Failed to install $NAME"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
|
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo 'unknown')
|
||||||
msg_ok "Installed $NAME v$NEW_VER"
|
msg_ok "Installed $NAME v$NEW_VER"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -4975,7 +5021,7 @@ function setup_docker() {
|
|||||||
# Install or upgrade Docker
|
# Install or upgrade Docker
|
||||||
if [ "$docker_installed" = true ]; then
|
if [ "$docker_installed" = true ]; then
|
||||||
msg_info "Checking for Docker updates"
|
msg_info "Checking for Docker updates"
|
||||||
DOCKER_LATEST_VERSION=$(apt-cache policy docker-ce | grep Candidate | awk '{print $2}' | cut -d':' -f2 | cut -d'-' -f1)
|
DOCKER_LATEST_VERSION=$(apt-cache policy docker-ce | grep Candidate | awk '{print $2}' 2>/dev/null | cut -d':' -f2 | cut -d'-' -f1 || echo '')
|
||||||
|
|
||||||
if [ "$DOCKER_CURRENT_VERSION" != "$DOCKER_LATEST_VERSION" ]; then
|
if [ "$DOCKER_CURRENT_VERSION" != "$DOCKER_LATEST_VERSION" ]; then
|
||||||
msg_info "Updating Docker $DOCKER_CURRENT_VERSION → $DOCKER_LATEST_VERSION"
|
msg_info "Updating Docker $DOCKER_CURRENT_VERSION → $DOCKER_LATEST_VERSION"
|
||||||
|
|||||||
249
tools/addon/pihole-exporter.sh
Normal file
249
tools/addon/pihole-exporter.sh
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/eko/pihole-exporter/
|
||||||
|
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
load_functions
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
VERBOSE=${var_verbose:-no}
|
||||||
|
APP="pihole-exporter"
|
||||||
|
APP_TYPE="tools"
|
||||||
|
INSTALL_PATH="/opt/pihole-exporter"
|
||||||
|
CONFIG_PATH="/opt/pihole-exporter.env"
|
||||||
|
header_info
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
get_current_ip &>/dev/null
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# OS DETECTION
|
||||||
|
# ==============================================================================
|
||||||
|
if [[ -f "/etc/alpine-release" ]]; then
|
||||||
|
OS="Alpine"
|
||||||
|
SERVICE_PATH="/etc/init.d/pihole-exporter"
|
||||||
|
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
|
||||||
|
OS="Debian"
|
||||||
|
SERVICE_PATH="/etc/systemd/system/pihole-exporter.service"
|
||||||
|
else
|
||||||
|
echo -e "${CROSS} Unsupported OS detected. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling Pihole-Exporter"
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
rc-service pihole-exporter stop &>/dev/null
|
||||||
|
rc-update del pihole-exporter &>/dev/null
|
||||||
|
rm -f "$SERVICE_PATH"
|
||||||
|
else
|
||||||
|
systemctl disable -q --now pihole-exporter
|
||||||
|
rm -f "$SERVICE_PATH"
|
||||||
|
fi
|
||||||
|
rm -rf "$INSTALL_PATH" "$CONFIG_PATH"
|
||||||
|
rm -f "/usr/local/bin/update_pihole-exporter"
|
||||||
|
rm -f "$HOME/.pihole-exporter"
|
||||||
|
msg_ok "Pihole-Exporter has been uninstalled"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
if check_for_gh_release "pihole-exporter" "eko/pihole-exporter"; then
|
||||||
|
msg_info "Stopping service"
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
rc-service pihole-exporter stop &>/dev/null
|
||||||
|
else
|
||||||
|
systemctl stop pihole-exporter
|
||||||
|
fi
|
||||||
|
msg_ok "Stopped service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest"
|
||||||
|
setup_go
|
||||||
|
|
||||||
|
msg_info "Building Pihole-Exporter"
|
||||||
|
cd /opt/pihole-exporter/
|
||||||
|
$STD /usr/local/bin/go build -o ./pihole-exporter
|
||||||
|
msg_ok "Built Pihole-Exporter"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
rc-service pihole-exporter start &>/dev/null
|
||||||
|
else
|
||||||
|
systemctl start pihole-exporter
|
||||||
|
fi
|
||||||
|
msg_ok "Started service"
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
read -erp "Enter the protocol to use (http/https), default https: " pihole_PROTOCOL
|
||||||
|
read -erp "Enter the hostname of Pihole, example: (127.0.0.1): " pihole_HOSTNAME
|
||||||
|
read -erp "Enter the port of Pihole, default 443: " pihole_PORT
|
||||||
|
read -rsp "Enter Pihole password: " pihole_PASSWORD
|
||||||
|
printf "\n"
|
||||||
|
read -erp "Do you want to skip TLS-Verification (if using a self-signed Certificate on Pi-Hole) [y/N]: " SKIP_TLS
|
||||||
|
if [[ "${SKIP_TLS,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
pihole_SKIP_TLS="true"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest"
|
||||||
|
setup_go
|
||||||
|
msg_info "Building Pihole-Exporter on ${OS}"
|
||||||
|
cd /opt/pihole-exporter/
|
||||||
|
$STD /usr/local/bin/go build -o ./pihole-exporter
|
||||||
|
msg_ok "Built Pihole-Exporter"
|
||||||
|
|
||||||
|
msg_info "Creating configuration"
|
||||||
|
cat <<EOF >"$CONFIG_PATH"
|
||||||
|
# https://github.com/eko/pihole-exporter/?tab=readme-ov-file#available-cli-options
|
||||||
|
PIHOLE_PASSWORD="${pihole_PASSWORD}"
|
||||||
|
PIHOLE_HOSTNAME="${pihole_HOSTNAME:-127.0.0.1}"
|
||||||
|
PIHOLE_PORT="${pihole_PORT:-443}"
|
||||||
|
SKIP_TLS_VERIFICATION="${pihole_SKIP_TLS:-false}"
|
||||||
|
PIHOLE_PROTOCOL="${pihole_PROTOCOL:-https}"
|
||||||
|
EOF
|
||||||
|
msg_ok "Created configuration"
|
||||||
|
|
||||||
|
msg_info "Creating service"
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
cat <<EOF >"$SERVICE_PATH"
|
||||||
|
[Unit]
|
||||||
|
Description=pihole-exporter
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/pihole-exporter
|
||||||
|
EnvironmentFile=$CONFIG_PATH
|
||||||
|
ExecStart=/opt/pihole-exporter/pihole-exporter
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable -q --now pihole-exporter
|
||||||
|
else
|
||||||
|
cat <<EOF >"$SERVICE_PATH"
|
||||||
|
#!/sbin/openrc-run
|
||||||
|
|
||||||
|
name="pihole-exporter"
|
||||||
|
description="Pi-hole Exporter for Prometheus"
|
||||||
|
command="${INSTALL_PATH}/pihole-exporter"
|
||||||
|
command_background=true
|
||||||
|
directory="/opt/pihole-exporter"
|
||||||
|
pidfile="/run/\${RC_SVCNAME}.pid"
|
||||||
|
output_log="/var/log/pihole-exporter.log"
|
||||||
|
error_log="/var/log/pihole-exporter.log"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
need net
|
||||||
|
after firewall
|
||||||
|
}
|
||||||
|
|
||||||
|
start_pre() {
|
||||||
|
if [ -f "$CONFIG_PATH" ]; then
|
||||||
|
export \$(grep -v '^#' $CONFIG_PATH | xargs)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod +x "$SERVICE_PATH"
|
||||||
|
$STD rc-update add pihole-exporter default
|
||||||
|
$STD rc-service pihole-exporter start
|
||||||
|
fi
|
||||||
|
msg_ok "Created and started service"
|
||||||
|
|
||||||
|
# Create update script
|
||||||
|
msg_info "Creating update script"
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
cat <<'UPDATEEOF' >/usr/local/bin/update_pihole-exporter
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# pihole-exporter Update Script
|
||||||
|
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/pihole-exporter.sh)"
|
||||||
|
UPDATEEOF
|
||||||
|
chmod +x /usr/local/bin/update_pihole-exporter
|
||||||
|
msg_ok "Created update script (/usr/local/bin/update_pihole-exporter)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "Pihole-Exporter installed successfully"
|
||||||
|
msg_ok "Metrics: ${BL}http://${CURRENT_IP}:9617/metrics${CL}"
|
||||||
|
msg_ok "Config: ${BL}${CONFIG_PATH}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
header_info
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
get_current_ip &>/dev/null
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "Pihole-Exporter is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then
|
||||||
|
msg_warn "Pihole-Exporter is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall Pihole-Exporter? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update Pihole-Exporter? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "Pihole-Exporter is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - Pi-hole Exporter (Go binary)"
|
||||||
|
echo -e "${TAB} - Systemd/OpenRC service"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install Pihole-Exporter? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
241
tools/addon/qbittorrent-exporter.sh
Normal file
241
tools/addon/qbittorrent-exporter.sh
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/martabal/qbittorrent-exporter
|
||||||
|
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
|
||||||
|
|
||||||
|
# Enable error handling
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler' ERR
|
||||||
|
|
||||||
|
load_functions
|
||||||
|
# ==============================================================================
|
||||||
|
# CONFIGURATION
|
||||||
|
# ==============================================================================
|
||||||
|
VERBOSE=${var_verbose:-no}
|
||||||
|
APP="qbittorrent-exporter"
|
||||||
|
APP_TYPE="tools"
|
||||||
|
INSTALL_PATH="/opt/qbittorrent-exporter"
|
||||||
|
CONFIG_PATH="/opt/qbittorrent-exporter.env"
|
||||||
|
header_info
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# OS DETECTION
|
||||||
|
# ==============================================================================
|
||||||
|
if [[ -f "/etc/alpine-release" ]]; then
|
||||||
|
OS="Alpine"
|
||||||
|
SERVICE_PATH="/etc/init.d/qbittorrent-exporter"
|
||||||
|
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
|
||||||
|
OS="Debian"
|
||||||
|
SERVICE_PATH="/etc/systemd/system/qbittorrent-exporter.service"
|
||||||
|
else
|
||||||
|
echo -e "${CROSS} Unsupported OS detected. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UNINSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function uninstall() {
|
||||||
|
msg_info "Uninstalling qBittorrent-Exporter"
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
rc-service qbittorrent-exporter stop &>/dev/null
|
||||||
|
rc-update del qbittorrent-exporter &>/dev/null
|
||||||
|
rm -f "$SERVICE_PATH"
|
||||||
|
else
|
||||||
|
systemctl disable -q --now qbittorrent-exporter
|
||||||
|
rm -f "$SERVICE_PATH"
|
||||||
|
fi
|
||||||
|
rm -rf "$INSTALL_PATH" "$CONFIG_PATH"
|
||||||
|
rm -f "/usr/local/bin/update_qbittorrent-exporter"
|
||||||
|
rm -f "$HOME/.qbittorrent-exporter"
|
||||||
|
msg_ok "qBittorrent-Exporter has been uninstalled"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# UPDATE
|
||||||
|
# ==============================================================================
|
||||||
|
function update() {
|
||||||
|
if check_for_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter"; then
|
||||||
|
msg_info "Stopping service"
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
rc-service qbittorrent-exporter stop &>/dev/null
|
||||||
|
else
|
||||||
|
systemctl stop qbittorrent-exporter
|
||||||
|
fi
|
||||||
|
msg_ok "Stopped service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter" "tarball" "latest"
|
||||||
|
setup_go
|
||||||
|
|
||||||
|
msg_info "Building qBittorrent-Exporter"
|
||||||
|
cd /opt/qbittorrent-exporter
|
||||||
|
$STD /usr/local/bin/go build -o ./qbittorrent-exporter
|
||||||
|
msg_ok "Built qBittorrent-Exporter"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
rc-service qbittorrent-exporter start &>/dev/null
|
||||||
|
else
|
||||||
|
systemctl start qbittorrent-exporter
|
||||||
|
fi
|
||||||
|
msg_ok "Started service"
|
||||||
|
msg_ok "Updated successfully"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# INSTALL
|
||||||
|
# ==============================================================================
|
||||||
|
function install() {
|
||||||
|
read -erp "Enter URL of qBittorrent, example: (http://127.0.0.1:8080): " QBITTORRENT_BASE_URL
|
||||||
|
read -erp "Enter qBittorrent username: " QBITTORRENT_USERNAME
|
||||||
|
read -rsp "Enter qBittorrent password: " QBITTORRENT_PASSWORD
|
||||||
|
printf "\n"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter" "tarball" "latest"
|
||||||
|
setup_go
|
||||||
|
msg_info "Building qBittorrent-Exporter on ${OS}"
|
||||||
|
cd /opt/qbittorrent-exporter
|
||||||
|
$STD /usr/local/bin/go build -o ./qbittorrent-exporter
|
||||||
|
msg_ok "Built qBittorrent-Exporter"
|
||||||
|
|
||||||
|
msg_info "Creating configuration"
|
||||||
|
cat <<EOF >"$CONFIG_PATH"
|
||||||
|
# https://github.com/martabal/qbittorrent-exporter?tab=readme-ov-file#parameters
|
||||||
|
QBITTORRENT_BASE_URL="${QBITTORRENT_BASE_URL}"
|
||||||
|
QBITTORRENT_USERNAME="${QBITTORRENT_USERNAME}"
|
||||||
|
QBITTORRENT_PASSWORD="${QBITTORRENT_PASSWORD}"
|
||||||
|
EOF
|
||||||
|
msg_ok "Created configuration"
|
||||||
|
|
||||||
|
msg_info "Creating service"
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
cat <<EOF >"$SERVICE_PATH"
|
||||||
|
[Unit]
|
||||||
|
Description=qbittorrent-exporter
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/qbittorrent-exporter
|
||||||
|
EnvironmentFile=$CONFIG_PATH
|
||||||
|
ExecStart=/opt/qbittorrent-exporter/qbittorrent-exporter
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable -q --now qbittorrent-exporter
|
||||||
|
else
|
||||||
|
cat <<EOF >"$SERVICE_PATH"
|
||||||
|
#!/sbin/openrc-run
|
||||||
|
|
||||||
|
name="qbittorrent-exporter"
|
||||||
|
description="qBittorrent Exporter for Prometheus"
|
||||||
|
command="${INSTALL_PATH}/qbittorrent-exporter"
|
||||||
|
command_background=true
|
||||||
|
directory="/opt/qbittorrent-exporter"
|
||||||
|
pidfile="/run/\${RC_SVCNAME}.pid"
|
||||||
|
output_log="/var/log/qbittorrent-exporter.log"
|
||||||
|
error_log="/var/log/qbittorrent-exporter.log"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
need net
|
||||||
|
after firewall
|
||||||
|
}
|
||||||
|
|
||||||
|
start_pre() {
|
||||||
|
if [ -f "$CONFIG_PATH" ]; then
|
||||||
|
export \$(grep -v '^#' $CONFIG_PATH | xargs)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod +x "$SERVICE_PATH"
|
||||||
|
$STD rc-update add qbittorrent-exporter default
|
||||||
|
$STD rc-service qbittorrent-exporter start
|
||||||
|
fi
|
||||||
|
msg_ok "Created and started service"
|
||||||
|
|
||||||
|
# Create update script
|
||||||
|
msg_info "Creating update script"
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
cat <<'UPDATEEOF' >/usr/local/bin/update_qbittorrent-exporter
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# qbittorrent-exporter Update Script
|
||||||
|
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/qbittorrent-exporter.sh)"
|
||||||
|
UPDATEEOF
|
||||||
|
chmod +x /usr/local/bin/update_qbittorrent-exporter
|
||||||
|
msg_ok "Created update script (/usr/local/bin/update_qbittorrent-exporter)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
msg_ok "qBittorrent-Exporter installed successfully"
|
||||||
|
msg_ok "Metrics: ${BL}http://${LOCAL_IP}:8090/metrics${CL}"
|
||||||
|
msg_ok "Config: ${BL}${CONFIG_PATH}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# MAIN
|
||||||
|
# ==============================================================================
|
||||||
|
header_info
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
import_local_ip
|
||||||
|
|
||||||
|
# Handle type=update (called from update script)
|
||||||
|
if [[ "${type:-}" == "update" ]]; then
|
||||||
|
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then
|
||||||
|
update
|
||||||
|
else
|
||||||
|
msg_error "qBittorrent-Exporter is not installed. Nothing to update."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then
|
||||||
|
msg_warn "qBittorrent-Exporter is already installed."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Uninstall qBittorrent-Exporter? (y/N): "
|
||||||
|
read -r uninstall_prompt
|
||||||
|
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
uninstall
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "${TAB}Update qBittorrent-Exporter? (y/N): "
|
||||||
|
read -r update_prompt
|
||||||
|
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
update
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_warn "No action selected. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fresh installation
|
||||||
|
msg_warn "qBittorrent-Exporter is not installed."
|
||||||
|
echo ""
|
||||||
|
echo -e "${TAB}${INFO} This will install:"
|
||||||
|
echo -e "${TAB} - qBittorrent Exporter (Go binary)"
|
||||||
|
echo -e "${TAB} - Systemd/OpenRC service"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -n "${TAB}Install qBittorrent-Exporter? (y/N): "
|
||||||
|
read -r install_prompt
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
install
|
||||||
|
else
|
||||||
|
msg_warn "Installation cancelled. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
6
tools/headers/pihole-exporter
Normal file
6
tools/headers/pihole-exporter
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
_ __ __ __
|
||||||
|
____ (_) /_ ____ / /__ ___ _ ______ ____ _____/ /____ _____
|
||||||
|
/ __ \/ / __ \/ __ \/ / _ \______/ _ \| |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
|
||||||
|
/ /_/ / / / / / /_/ / / __/_____/ __/> </ /_/ / /_/ / / / /_/ __/ /
|
||||||
|
/ .___/_/_/ /_/\____/_/\___/ \___/_/|_/ .___/\____/_/ \__/\___/_/
|
||||||
|
/_/ /_/
|
||||||
6
tools/headers/qbittorrent-exporter
Normal file
6
tools/headers/qbittorrent-exporter
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
__ _ __ __ __ __
|
||||||
|
____ _/ /_ (_) /_/ /_____ _____________ ____ / /_ ___ _ ______ ____ _____/ /____ _____
|
||||||
|
/ __ `/ __ \/ / __/ __/ __ \/ ___/ ___/ _ \/ __ \/ __/_____/ _ \| |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
|
||||||
|
/ /_/ / /_/ / / /_/ /_/ /_/ / / / / / __/ / / / /_/_____/ __/> </ /_/ / /_/ / / / /_/ __/ /
|
||||||
|
\__, /_.___/_/\__/\__/\____/_/ /_/ \___/_/ /_/\__/ \___/_/|_/ .___/\____/_/ \__/\___/_/
|
||||||
|
/_/ /_/
|
||||||
@ -50,7 +50,12 @@ function execute_in() {
|
|||||||
container=$1
|
container=$1
|
||||||
name=$(pct exec "$container" hostname)
|
name=$(pct exec "$container" hostname)
|
||||||
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
|
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
|
||||||
pct exec "$container" -- bash -c "${custom_command}" | tee
|
if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1"
|
||||||
|
then
|
||||||
|
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
|
||||||
|
else
|
||||||
|
pct exec "$container" -- bash -c "${custom_command}" | tee
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
for container in $(pct list | awk '{if(NR>1) print $1}'); do
|
for container in $(pct list | awk '{if(NR>1) print $1}'); do
|
||||||
|
|||||||
Reference in New Issue
Block a user