Compare commits

..

1 Commits

Author SHA1 Message Date
2211561872 [Fix] Zabbix: Add version-specific SQL script path for 7.0 LTS
Fixes installation failure for Zabbix 7.0 LTS caused by incorrect SQL script path.

Issue: Zabbix 7.0 LTS uses a different directory structure than 7.4 and 8.0:
- Zabbix 7.0 LTS: /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz
- Zabbix 7.4+:    /usr/share/zabbix/sql-scripts/postgresql/server.sql.gz

The installer was hardcoded to use the newer path, causing 7.0 installations
to fail with: 'gzip: /usr/share/zabbix/sql-scripts/postgresql/server.sql.gz:
No such file or directory'

Solution:
Added version detection to use the correct SQL script path based on selected
Zabbix version. This ensures all supported versions (7.0 LTS, 7.4, 8.0) can
initialize their PostgreSQL database correctly.

Tested versions:
- 7.0 LTS: Now uses correct path and installs successfully
- 7.4: Continues to work with existing path
- 8.0: Continues to work with existing path

Fixes issue reported by @zjjiao in discussion with @MickLesk
2025-12-19 13:37:56 +01:00
41 changed files with 550 additions and 1821 deletions

View File

@ -10,87 +10,14 @@
> [!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 ## 2025-12-19
### 🚀 Updated Scripts ### 🚀 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
- 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)) - 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 ### ❔ Uncategorized
- Update paymenter.json(#10133) [@DragoQC](https://github.com/DragoQC) ([#10134](https://github.com/community-scripts/ProxmoxVE/pull/10134)) - Update paymenter.json(#10133) [@DragoQC](https://github.com/DragoQC) ([#10134](https://github.com/community-scripts/ProxmoxVE/pull/10134))

View File

@ -27,18 +27,28 @@ 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 check_for_gh_release "backrest" "garethgeorge/backrest"; then if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop backrest systemctl stop backrest
msg_ok "Stopped Service" msg_ok "Stopped Service"
fetch_and_deploy_gh_release "backrest" "garethgeorge/backrest" "prebuild" "latest" "/opt/backrest/bin" "backrest_Linux_x86_64.tar.gz" msg_info "Updating ${APP} to ${RELEASE}"
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
} }

View File

@ -34,8 +34,6 @@ 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"

View File

@ -5,15 +5,14 @@ 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:-cloud;docker}" var_tags="${var_tags:-os,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:-13}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
var_fuse="${var_fuse:-yes}"
header_info "$APP" header_info "$APP"
variables variables

View File

@ -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:-13}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
var_gpu="${var_gpu:-yes}" var_gpu="${var_gpu:-yes}"

View File

@ -1,6 +1,6 @@
______
/ ____/___ _________ ___ ____ _____ _________ _________ ___ ____ _____
/ / / __ \/ ___/ __ `__ \/ __ \/ ___/ / ___/ __ \/ ___/ __ `__ \/ __ \/ ___/
/ /___/ /_/ (__ ) / / / / / /_/ (__ ) / /__/ /_/ (__ ) / / / / / /_/ (__ )
\____/\____/____/_/ /_/ /_/\____/____/ \___/\____/____/_/ /_/ /_/\____/____/

View File

@ -35,11 +35,22 @@ 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"
systemctl disable -q --now nginx # fix musl issues because homarr compiles on alpine not debian soure: https://github.com/alexander-akhmetov/python-telegram/issues/3
$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
@ -61,7 +72,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-debian-amd64.tar.gz" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-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

View File

@ -108,7 +108,7 @@ EOF
msg_ok "Image-processing libraries up to date" msg_ok "Image-processing libraries up to date"
fi fi
RELEASE="2.4.1" RELEASE="2.4.0"
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

View File

@ -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 /usr/bin/influxd ]]; then if [[ ! -f /etc/apt/sources.list.d/influxdata.list ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi

View File

@ -48,17 +48,6 @@ 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"
@ -66,24 +55,6 @@ 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"

View File

@ -41,7 +41,6 @@ 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

View File

@ -32,8 +32,6 @@ 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
@ -67,4 +65,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}"

View File

@ -47,8 +47,6 @@ 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

View File

@ -28,8 +28,6 @@ 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

View File

@ -1,690 +0,0 @@
# 🛠️ 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
```

View File

@ -65,7 +65,6 @@ 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
@ -98,8 +97,6 @@ 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
@ -124,7 +121,6 @@ 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
@ -149,7 +145,6 @@ 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
@ -161,24 +156,16 @@ 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 template # Container script
cp docs/contribution/templates_ct/AppName.sh ct/my-app.sh cp ct/example.sh ct/my-app.sh
# Installation script template # Installation script
cp docs/contribution/templates_install/AppName-install.sh install/my-app-install.sh cp install/example-install.sh install/my-app-install.sh
# JSON configuration template # JSON configuration (if needed)
cp docs/contribution/templates_json/AppName.json frontend/public/json/my-app.json cp json/example.json 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
@ -215,21 +202,18 @@ 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)

View File

@ -1,31 +1,27 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) source <(curl -s 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: [YourGitHubUsername] # Author: [YourUserName]
# 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 e.g. https://github.com/example/app] # Source: [SOURCE_URL]
# App Default Values # App Default Values
APP="[AppName]" APP="[APP_NAME]"
var_tags="${var_tags:-[category]}" # Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
var_cpu="${var_cpu:-2}" var_tags="[TAGS]"
var_ram="${var_ram:-2048}" # Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp)
var_disk="${var_disk:-4}" var_cpu="[CPU]"
var_os="${var_os:-debian}" # Number of cores (1-X) (e.g. 4) - default are 2
var_version="${var_version:-12}" var_ram="[RAM]"
var_unprivileged="${var_unprivileged:-1}" # Amount of used RAM in MB (e.g. 2048 or 4096)
var_disk="[DISK]"
# ============================================================================= # Amount of used disk space in GB (e.g. 4 or 10)
# CONFIGURATION GUIDE var_os="[OS]"
# ============================================================================= # Default OS (e.g. debian, ubuntu, alpine)
# APP - Display name, title case (e.g. "Koel", "Wallabag", "Actual Budget") var_version="[VERSION]"
# var_tags - Max 2 tags, semicolon separated (e.g. "music;streaming", "finance") # Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine)
# var_cpu - CPU cores: 1-4 typical var_unprivileged="[UNPRIVILEGED]"
# var_ram - RAM in MB: 512, 1024, 2048, 4096 typical # 1 = unprivileged container, 0 = privileged container
# 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
@ -33,55 +29,51 @@ 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 exists # Check if installation is present | -f for file, -d for folder
if [[ ! -d /opt/[appname] ]]; then if [[ ! -f [INSTALLATION_CHECK_PATH] ]]; 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

View File

@ -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: [YourGitHubUsername] # Author: [YourUserName]
# 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 e.g. https://github.com/example/app] # Source: [SOURCE_URL]
# Import Functions and Setup # Import Functions und Setup
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color color
verb_ip6 verb_ip6
@ -14,177 +14,70 @@ 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 install -y \ $STD apt-get install -y \
nginx \ curl \
build-essential sudo \
mc \
[PACKAGE_1] \
[PACKAGE_2] \
[PACKAGE_3]
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
# ============================================================================= # Template: MySQL Database
# HELPER FUNCTIONS FROM tools.func msg_info "Setting up Database"
# ============================================================================= DB_NAME=[DB_NAME]
# These functions are available via $FUNCTIONS_FILE_PATH (tools.func) DB_USER=[DB_USER]
# Call them with optional environment variables for configuration DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
$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
# #
# --- GitHub Release (PREFERRED METHOD) --- echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
# fetch_and_deploy_gh_release "appname" "owner/repo" # Downloads, extracts, tracks version msg_ok "Setup ${APPLICATION}"
# 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/[appname].service cat <<EOF >/etc/systemd/system/${APPLICATION}.service
[Unit] [Unit]
Description=[AppName] Service Description=${APPLICATION} Service
After=network.target After=network.target
[Service] [Service]
Type=simple ExecStart=[START_COMMAND]
User=root Restart=always
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 [appname] systemctl enable -q --now ${APPLICATION}.service
msg_ok "Created Service" msg_ok "Created Service"
# =============================================================================
# CLEANUP & FINALIZATION
# =============================================================================
motd_ssh motd_ssh
customize customize
# cleanup_lxc handles: apt autoremove, autoclean, temp files, bash history # Cleanup
cleanup_lxc msg_info "Cleaning up"
rm -f ${RELEASE}.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@ -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": []
} }

View File

@ -24,7 +24,7 @@
"ram": 2048, "ram": 2048,
"hdd": 8, "hdd": 8,
"os": "debian", "os": "debian",
"version": "13" "version": "12"
} }
} }
], ],
@ -36,10 +36,6 @@
{ {
"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."
} }
] ]
} }

View File

@ -23,7 +23,7 @@
"ram": 1024, "ram": 1024,
"hdd": 5, "hdd": 5,
"os": "debian", "os": "debian",
"version": "13" "version": "12"
} }
} }
], ],

View File

@ -2,7 +2,7 @@
"name": "InvoiceNinja", "name": "InvoiceNinja",
"slug": "invoiceninja", "slug": "invoiceninja",
"categories": [ "categories": [
25 3
], ],
"date_created": "2025-12-12", "date_created": "2025-12-12",
"type": "ct", "type": "ct",

View File

@ -1,46 +0,0 @@
{
"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": []
}

View File

@ -31,14 +31,5 @@
"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`."
}
]
} }

View File

@ -1,284 +1,29 @@
[ [
{
"name": "passbolt/passbolt_api",
"version": "v5.8.0",
"date": "2025-12-22T10:12:48Z"
},
{
"name": "itsmng/itsm-ng",
"version": "v1.6.11",
"date": "2025-12-22T09:14:20Z"
},
{
"name": "morpheus65535/bazarr",
"version": "v1.5.3",
"date": "2025-09-20T12:12:33Z"
},
{
"name": "open-webui/open-webui",
"version": "v0.6.43",
"date": "2025-12-22T06:03:45Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.504",
"date": "2025-12-22T05:55:56Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.14",
"date": "2025-12-16T05:42:34Z"
},
{
"name": "fosrl/pangolin",
"version": "1.14.0-rc.0",
"date": "2025-12-22T02:49:19Z"
},
{
"name": "pommee/goaway",
"version": "v0.63.0",
"date": "2025-12-22T02:24:44Z"
},
{
"name": "jeedom/core",
"version": "4.5.1",
"date": "2025-12-22T00:27:05Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
},
{
"name": "advplyr/audiobookshelf",
"version": "v2.32.0",
"date": "2025-12-21T22:27:29Z"
},
{
"name": "keycloak/keycloak",
"version": "26.4.7",
"date": "2025-12-01T08:14:11Z"
},
{
"name": "project-zot/zot",
"version": "v2.1.12",
"date": "2025-12-21T20:45:14Z"
},
{
"name": "openhab/openhab-core",
"version": "5.1.0.RC3",
"date": "2025-12-21T20:04:16Z"
},
{
"name": "maxdorninger/MediaManager",
"version": "v1.11.0",
"date": "2025-12-21T19:58:49Z"
},
{
"name": "scanopy/scanopy",
"version": "v0.12.5",
"date": "2025-12-21T19:24:42Z"
},
{
"name": "benjaminjonard/koillection",
"version": "1.7.1",
"date": "2025-12-21T17:06:17Z"
},
{
"name": "ventoy/Ventoy",
"version": "v1.1.10",
"date": "2025-12-21T13:13:01Z"
},
{
"name": "jason5ng32/MyIP",
"version": "v5.1.1",
"date": "2025-12-21T12:59:32Z"
},
{
"name": "msgbyte/tianji",
"version": "v1.30.24",
"date": "2025-12-21T10:26:35Z"
},
{
"name": "hyperion-project/hyperion.ng",
"version": "2.1.1",
"date": "2025-06-14T17:45:06Z"
},
{
"name": "pocketbase/pocketbase",
"version": "v0.35.0",
"date": "2025-12-21T07:44:15Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-ui@16.3.2",
"date": "2025-12-21T05:23:55Z"
},
{
"name": "dedicatedcode/reitti",
"version": "v3.0.1",
"date": "2025-12-21T04:35:21Z"
},
{
"name": "intri-in/manage-my-damn-life-nextjs",
"version": "v0.8.2",
"date": "2025-12-21T03:53:53Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.4.4",
"date": "2025-12-20T22:12:02Z"
},
{
"name": "gtsteffaniak/filebrowser",
"version": "v1.2.0-experimental-sql-indexing-v3",
"date": "2025-12-20T21:57:53Z"
},
{
"name": "CyferShepard/Jellystat",
"version": "1.1.7",
"date": "2025-12-20T17:13:34Z"
},
{
"name": "ghostfolio/ghostfolio",
"version": "2.224.2",
"date": "2025-12-20T16:39:52Z"
},
{
"name": "ellite/Wallos",
"version": "v4.6.0",
"date": "2025-12-20T15:57:51Z"
},
{
"name": "TechnitiumSoftware/DnsServer",
"version": "v14.3.0",
"date": "2025-12-20T13:16:37Z"
},
{
"name": "zwave-js/zwave-js-ui",
"version": "v11.9.1",
"date": "2025-12-20T09:14:25Z"
},
{
"name": "louislam/uptime-kuma",
"version": "2.0.2",
"date": "2025-10-22T17:03:54Z"
},
{
"name": "Dispatcharr/Dispatcharr",
"version": "v0.15.0",
"date": "2025-12-20T00:12:04Z"
},
{
"name": "pelican-dev/panel",
"version": "v1.0.0-beta30",
"date": "2025-12-19T23:37:07Z"
},
{
"name": "pelican-dev/wings",
"version": "v1.0.0-beta21",
"date": "2025-12-19T23:04:27Z"
},
{
"name": "laurent22/joplin",
"version": "server-v3.5.2",
"date": "2025-12-19T21:28:55Z"
},
{
"name": "emqx/emqx",
"version": "e5.10.3-alpha.1",
"date": "2025-12-19T21:08:48Z"
},
{
"name": "metabase/metabase",
"version": "v0.58.x",
"date": "2025-12-19T20:05:58Z"
},
{
"name": "homarr-labs/homarr",
"version": "v1.47.0",
"date": "2025-12-19T19:42:50Z"
},
{
"name": "BerriAI/litellm",
"version": "v1.80.10.dev.1",
"date": "2025-12-19T19:16:21Z"
},
{
"name": "booklore-app/booklore",
"version": "v1.15.0",
"date": "2025-12-19T18:57:42Z"
},
{
"name": "YunoHost/yunohost",
"version": "debian/12.1.37",
"date": "2025-12-18T16:43:23Z"
},
{
"name": "home-assistant/core",
"version": "2025.12.4",
"date": "2025-12-19T17:55:13Z"
},
{
"name": "qdrant/qdrant",
"version": "v1.16.3",
"date": "2025-12-19T17:45:42Z"
},
{
"name": "esphome/esphome",
"version": "2025.12.1",
"date": "2025-12-19T15:53:08Z"
},
{
"name": "immich-app/immich",
"version": "v2.4.1",
"date": "2025-12-19T15:50:12Z"
},
{
"name": "openobserve/openobserve",
"version": "v0.30.2",
"date": "2025-12-19T15:18:53Z"
},
{
"name": "nzbgetcom/nzbget",
"version": "v25.4",
"date": "2025-10-09T10:27:01Z"
},
{
"name": "raydak-labs/configarr",
"version": "v1.19.0",
"date": "2025-12-19T13:37:00Z"
},
{
"name": "wazuh/wazuh",
"version": "coverity-w51-4.14.2",
"date": "2025-12-15T12:34:36Z"
},
{
"name": "fccview/jotty",
"version": "1.14.4",
"date": "2025-12-19T13:17:26Z"
},
{
"name": "readeck/readeck",
"version": "0.21.5",
"date": "2025-12-19T11:51:05Z"
},
{ {
"name": "forgejo/forgejo", "name": "forgejo/forgejo",
"version": "v15.0.0-dev", "version": "v15.0.0-dev",
"date": "2025-12-19T11:43:47Z" "date": "2025-12-19T11:43:47Z"
}, },
{ {
"name": "meilisearch/meilisearch", "name": "fccview/jotty",
"version": "prototype-v1.30.1-rebuild-hannoy-graph.1", "version": "1.14.2",
"date": "2025-12-19T11:14:05Z" "date": "2025-12-19T11:25:29Z"
},
{
"name": "readeck/readeck",
"version": "0.21.5",
"date": "2025-12-19T11:22:20Z"
}, },
{ {
"name": "release-argus/Argus", "name": "release-argus/Argus",
"version": "0.28.3", "version": "0.28.3",
"date": "2025-12-19T11:05:10Z" "date": "2025-12-19T11:05:10Z"
}, },
{
"name": "wazuh/wazuh",
"version": "coverity-w51-4.14.2",
"date": "2025-12-15T12:34:36Z"
},
{ {
"name": "TuroYT/snowshare", "name": "TuroYT/snowshare",
"version": "v1.2.5", "version": "v1.2.5",
@ -289,11 +34,26 @@
"version": "v11.1.2", "version": "v11.1.2",
"date": "2025-12-17T09:26:24Z" "date": "2025-12-17T09:26:24Z"
}, },
{
"name": "morpheus65535/bazarr",
"version": "v1.5.3",
"date": "2025-09-20T12:12:33Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.487",
"date": "2025-12-19T05:55:55Z"
},
{ {
"name": "jhuckaby/Cronicle", "name": "jhuckaby/Cronicle",
"version": "v0.9.102", "version": "v0.9.102",
"date": "2025-12-19T03:45:13Z" "date": "2025-12-19T03:45:13Z"
}, },
{
"name": "BerriAI/litellm",
"version": "v1.80.10.rc.5",
"date": "2025-12-19T03:38:23Z"
},
{ {
"name": "javedh-dev/tracktor", "name": "javedh-dev/tracktor",
"version": "1.0.1", "version": "1.0.1",
@ -302,13 +62,28 @@
{ {
"name": "mealie-recipes/mealie", "name": "mealie-recipes/mealie",
"version": "v3.8.0", "version": "v3.8.0",
"date": "2025-12-19T01:37:04Z" "date": "2025-12-19T01:37:16Z"
},
{
"name": "jeedom/core",
"version": "4.5.1",
"date": "2025-12-19T00:27:05Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
}, },
{ {
"name": "moghtech/komodo", "name": "moghtech/komodo",
"version": "v1.19.5", "version": "v1.19.5",
"date": "2025-09-27T20:59:46Z" "date": "2025-09-27T20:59:46Z"
}, },
{
"name": "metabase/metabase",
"version": "v0.57.x",
"date": "2025-12-18T22:02:32Z"
},
{ {
"name": "chrisbenincasa/tunarr", "name": "chrisbenincasa/tunarr",
"version": "v1.0.7", "version": "v1.0.7",
@ -319,6 +94,11 @@
"version": "v2.1.5", "version": "v2.1.5",
"date": "2025-12-18T20:48:01Z" "date": "2025-12-18T20:48:01Z"
}, },
{
"name": "scanopy/scanopy",
"version": "v0.12.4",
"date": "2025-12-18T19:25:47Z"
},
{ {
"name": "rcourtman/Pulse", "name": "rcourtman/Pulse",
"version": "v4.36.2", "version": "v4.36.2",
@ -340,15 +120,30 @@
"date": "2025-12-18T18:06:05Z" "date": "2025-12-18T18:06:05Z"
}, },
{ {
"name": "neo4j/neo4j", "name": "msgbyte/tianji",
"version": "2025.11.2", "version": "v1.30.23",
"date": "2025-12-18T17:08:34Z" "date": "2025-12-18T16:55:01Z"
},
{
"name": "YunoHost/yunohost",
"version": "debian/12.1.37",
"date": "2025-12-18T16:43:23Z"
}, },
{ {
"name": "ollama/ollama", "name": "ollama/ollama",
"version": "v0.13.5", "version": "v0.13.5",
"date": "2025-12-18T16:39:08Z" "date": "2025-12-18T16:39:08Z"
}, },
{
"name": "meilisearch/meilisearch",
"version": "latest",
"date": "2025-12-18T16:38:45Z"
},
{
"name": "keycloak/keycloak",
"version": "26.4.7",
"date": "2025-12-01T08:14:11Z"
},
{ {
"name": "paperless-ngx/paperless-ngx", "name": "paperless-ngx/paperless-ngx",
"version": "v2.20.3", "version": "v2.20.3",
@ -359,6 +154,11 @@
"version": "n8n@1.123.7", "version": "n8n@1.123.7",
"date": "2025-12-17T14:01:25Z" "date": "2025-12-17T14:01:25Z"
}, },
{
"name": "immich-app/immich",
"version": "v2.4.0",
"date": "2025-12-18T14:51:33Z"
},
{ {
"name": "docker/compose", "name": "docker/compose",
"version": "v5.0.1", "version": "v5.0.1",
@ -399,11 +199,21 @@
"version": "v0.5.1", "version": "v0.5.1",
"date": "2025-12-18T03:08:43Z" "date": "2025-12-18T03:08:43Z"
}, },
{
"name": "openobserve/openobserve",
"version": "v0.30.1",
"date": "2025-12-18T02:41:34Z"
},
{ {
"name": "goauthentik/authentik", "name": "goauthentik/authentik",
"version": "version/2025.10.3", "version": "version/2025.10.3",
"date": "2025-12-16T18:00:53Z" "date": "2025-12-16T18:00:53Z"
}, },
{
"name": "emqx/emqx",
"version": "6.1.0-alpha.2",
"date": "2025-12-17T20:15:23Z"
},
{ {
"name": "influxdata/influxdb", "name": "influxdata/influxdb",
"version": "v2.8.0", "version": "v2.8.0",
@ -419,6 +229,11 @@
"version": "v4.107.0", "version": "v4.107.0",
"date": "2025-12-17T18:59:21Z" "date": "2025-12-17T18:59:21Z"
}, },
{
"name": "neo4j/neo4j",
"version": "5.26.19",
"date": "2025-12-17T18:17:55Z"
},
{ {
"name": "semaphoreui/semaphore", "name": "semaphoreui/semaphore",
"version": "v2.16.47", "version": "v2.16.47",
@ -431,8 +246,8 @@
}, },
{ {
"name": "bunkerity/bunkerweb", "name": "bunkerity/bunkerweb",
"version": "v1.6.6", "version": "testing",
"date": "2025-11-24T15:30:21Z" "date": "2025-12-16T11:13:20Z"
}, },
{ {
"name": "traefik/traefik", "name": "traefik/traefik",
@ -449,11 +264,31 @@
"version": "v0.105.1", "version": "v0.105.1",
"date": "2025-12-17T08:48:52Z" "date": "2025-12-17T08:48:52Z"
}, },
{
"name": "passbolt/passbolt_api",
"version": "v5.8.0-test.3",
"date": "2025-12-17T08:38:11Z"
},
{ {
"name": "jupyter/notebook", "name": "jupyter/notebook",
"version": "@jupyter-notebook/ui-components@7.6.0-alpha.0", "version": "@jupyter-notebook/ui-components@7.6.0-alpha.0",
"date": "2025-12-17T08:35:55Z" "date": "2025-12-17T08:35:55Z"
}, },
{
"name": "zwave-js/zwave-js-ui",
"version": "v11.9.0",
"date": "2025-12-17T08:26:50Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.14",
"date": "2025-12-16T05:42:34Z"
},
{
"name": "nzbgetcom/nzbget",
"version": "v25.4",
"date": "2025-10-09T10:27:01Z"
},
{ {
"name": "nickheyer/discopanel", "name": "nickheyer/discopanel",
"version": "v1.0.16", "version": "v1.0.16",
@ -464,6 +299,11 @@
"version": "v1.19.23", "version": "v1.19.23",
"date": "2025-12-17T00:51:11Z" "date": "2025-12-17T00:51:11Z"
}, },
{
"name": "esphome/esphome",
"version": "2025.12.0",
"date": "2025-12-16T23:57:23Z"
},
{ {
"name": "grafana/grafana", "name": "grafana/grafana",
"version": "v12.3.1", "version": "v12.3.1",
@ -489,6 +329,11 @@
"version": "v4.6.2", "version": "v4.6.2",
"date": "2025-12-16T17:54:19Z" "date": "2025-12-16T17:54:19Z"
}, },
{
"name": "fuma-nama/fumadocs",
"version": "fumadocs-mdx@14.1.1",
"date": "2025-12-16T15:32:59Z"
},
{ {
"name": "jenkinsci/jenkins", "name": "jenkinsci/jenkins",
"version": "jenkins-2.542", "version": "jenkins-2.542",
@ -594,6 +439,11 @@
"version": "2025.12.14", "version": "2025.12.14",
"date": "2025-12-14T18:24:33Z" "date": "2025-12-14T18:24:33Z"
}, },
{
"name": "openhab/openhab-core",
"version": "5.1.0.M4",
"date": "2025-12-14T18:12:04Z"
},
{ {
"name": "blakeblackshear/frigate", "name": "blakeblackshear/frigate",
"version": "v0.14.1", "version": "v0.14.1",
@ -604,6 +454,11 @@
"version": "v0.24.1", "version": "v0.24.1",
"date": "2025-12-14T13:49:16Z" "date": "2025-12-14T13:49:16Z"
}, },
{
"name": "laurent22/joplin",
"version": "server-v3.5.1",
"date": "2025-12-03T11:56:50Z"
},
{ {
"name": "C4illin/ConvertX", "name": "C4illin/ConvertX",
"version": "v0.16.1", "version": "v0.16.1",
@ -614,6 +469,11 @@
"version": "v5.0.87", "version": "v5.0.87",
"date": "2025-12-14T08:35:11Z" "date": "2025-12-14T08:35:11Z"
}, },
{
"name": "ghostfolio/ghostfolio",
"version": "2.223.0",
"date": "2025-12-14T08:16:54Z"
},
{ {
"name": "mayswind/AriaNg", "name": "mayswind/AriaNg",
"version": "1.3.12", "version": "1.3.12",
@ -629,11 +489,21 @@
"version": "v4.4.0", "version": "v4.4.0",
"date": "2025-12-13T22:49:07Z" "date": "2025-12-13T22:49:07Z"
}, },
{
"name": "fosrl/pangolin",
"version": "1.13.1",
"date": "2025-12-13T18:00:27Z"
},
{ {
"name": "leiweibau/Pi.Alert", "name": "leiweibau/Pi.Alert",
"version": "v2025-12-14", "version": "v2025-12-14",
"date": "2025-12-13T16:39:17Z" "date": "2025-12-13T16:39:17Z"
}, },
{
"name": "gtsteffaniak/filebrowser",
"version": "v1.1.4-beta",
"date": "2025-12-13T15:59:06Z"
},
{ {
"name": "WGDashboard/WGDashboard", "name": "WGDashboard/WGDashboard",
"version": "v4.3.1", "version": "v4.3.1",
@ -664,16 +534,41 @@
"version": "r7.0.27", "version": "r7.0.27",
"date": "2025-12-12T20:54:32Z" "date": "2025-12-12T20:54:32Z"
}, },
{
"name": "homarr-labs/homarr",
"version": "v1.46.0",
"date": "2025-12-12T19:23:36Z"
},
{
"name": "home-assistant/core",
"version": "2025.12.3",
"date": "2025-12-12T18:12:39Z"
},
{
"name": "booklore-app/booklore",
"version": "v1.14.1",
"date": "2025-12-12T17:37:58Z"
},
{ {
"name": "node-red/node-red", "name": "node-red/node-red",
"version": "4.1.2", "version": "4.1.2",
"date": "2025-12-03T16:12:05Z" "date": "2025-12-03T16:12:05Z"
}, },
{
"name": "ventoy/Ventoy",
"version": "v1.1.09",
"date": "2025-12-12T13:06:36Z"
},
{ {
"name": "duplicati/duplicati", "name": "duplicati/duplicati",
"version": "v2.2.0.102-2.2.0.102_canary_2025-12-12", "version": "v2.2.0.102-2.2.0.102_canary_2025-12-12",
"date": "2025-12-12T12:03:15Z" "date": "2025-12-12T12:03:15Z"
}, },
{
"name": "Luligu/matterbridge",
"version": "3.4.3",
"date": "2025-12-12T11:35:00Z"
},
{ {
"name": "grokability/snipe-it", "name": "grokability/snipe-it",
"version": "v8.3.7", "version": "v8.3.7",
@ -694,6 +589,11 @@
"version": "0.43.1", "version": "0.43.1",
"date": "2025-12-11T22:45:52Z" "date": "2025-12-11T22:45:52Z"
}, },
{
"name": "pommee/goaway",
"version": "v0.62.24",
"date": "2025-12-11T09:54:59Z"
},
{ {
"name": "linkwarden/linkwarden", "name": "linkwarden/linkwarden",
"version": "v2.13.2", "version": "v2.13.2",
@ -729,6 +629,16 @@
"version": "2.2.15", "version": "2.2.15",
"date": "2025-12-10T01:52:14Z" "date": "2025-12-10T01:52:14Z"
}, },
{
"name": "pelican-dev/panel",
"version": "v1.0.0-beta29",
"date": "2025-12-09T23:07:15Z"
},
{
"name": "pelican-dev/wings",
"version": "v1.0.0-beta20",
"date": "2025-12-09T22:59:09Z"
},
{ {
"name": "BookStackApp/BookStack", "name": "BookStackApp/BookStack",
"version": "v25.11.6", "version": "v25.11.6",
@ -769,6 +679,11 @@
"version": "v1.4.7", "version": "v1.4.7",
"date": "2025-12-09T11:44:49Z" "date": "2025-12-09T11:44:49Z"
}, },
{
"name": "Dispatcharr/Dispatcharr",
"version": "v0.14.0",
"date": "2025-12-09T00:04:09Z"
},
{ {
"name": "seerr-team/seerr", "name": "seerr-team/seerr",
"version": "preview-test-fix-subscriptions", "version": "preview-test-fix-subscriptions",
@ -794,6 +709,11 @@
"version": "2.2.1", "version": "2.2.1",
"date": "2025-12-08T12:01:34Z" "date": "2025-12-08T12:01:34Z"
}, },
{
"name": "maxdorninger/MediaManager",
"version": "v1.10.0",
"date": "2025-12-07T23:41:51Z"
},
{ {
"name": "Part-DB/Part-DB-server", "name": "Part-DB/Part-DB-server",
"version": "v2.3.0", "version": "v2.3.0",
@ -879,6 +799,16 @@
"version": "v1.7.4", "version": "v1.7.4",
"date": "2025-12-04T13:56:39Z" "date": "2025-12-04T13:56:39Z"
}, },
{
"name": "pocketbase/pocketbase",
"version": "v0.34.2",
"date": "2025-12-04T13:08:18Z"
},
{
"name": "qdrant/qdrant",
"version": "v1.16.2",
"date": "2025-12-04T11:03:49Z"
},
{ {
"name": "glpi-project/glpi", "name": "glpi-project/glpi",
"version": "11.0.4", "version": "11.0.4",
@ -894,6 +824,11 @@
"version": "6.2.10", "version": "6.2.10",
"date": "2025-12-03T13:58:32Z" "date": "2025-12-03T13:58:32Z"
}, },
{
"name": "hyperion-project/hyperion.ng",
"version": "2.1.1",
"date": "2025-06-14T17:45:06Z"
},
{ {
"name": "henrygd/beszel", "name": "henrygd/beszel",
"version": "v0.17.0", "version": "v0.17.0",
@ -904,6 +839,11 @@
"version": "10.1.50", "version": "10.1.50",
"date": "2025-12-02T22:59:59Z" "date": "2025-12-02T22:59:59Z"
}, },
{
"name": "open-webui/open-webui",
"version": "v0.6.41",
"date": "2025-12-02T22:28:58Z"
},
{ {
"name": "WordPress/WordPress", "name": "WordPress/WordPress",
"version": "6.9", "version": "6.9",
@ -919,6 +859,11 @@
"version": "v2.0.12", "version": "v2.0.12",
"date": "2025-12-02T08:11:24Z" "date": "2025-12-02T08:11:24Z"
}, },
{
"name": "advplyr/audiobookshelf",
"version": "v2.31.0",
"date": "2025-12-01T23:49:11Z"
},
{ {
"name": "OliveTin/OliveTin", "name": "OliveTin/OliveTin",
"version": "3000.7.0", "version": "3000.7.0",
@ -1049,6 +994,21 @@
"version": "2.610", "version": "2.610",
"date": "2025-11-24T04:28:30Z" "date": "2025-11-24T04:28:30Z"
}, },
{
"name": "raydak-labs/configarr",
"version": "v1.18.0",
"date": "2025-11-23T17:42:53Z"
},
{
"name": "dedicatedcode/reitti",
"version": "v2.5.0",
"date": "2025-11-23T12:49:50Z"
},
{
"name": "TechnitiumSoftware/DnsServer",
"version": "v14.2.0",
"date": "2025-11-22T12:54:08Z"
},
{ {
"name": "Bubka/2FAuth", "name": "Bubka/2FAuth",
"version": "v5.6.1", "version": "v5.6.1",
@ -1069,11 +1029,21 @@
"version": "v4.3.2", "version": "v4.3.2",
"date": "2025-10-18T12:11:00Z" "date": "2025-10-18T12:11:00Z"
}, },
{
"name": "project-zot/zot",
"version": "v2.1.11",
"date": "2025-11-20T20:14:44Z"
},
{ {
"name": "kimai/kimai", "name": "kimai/kimai",
"version": "2.44.0", "version": "2.44.0",
"date": "2025-11-20T11:01:01Z" "date": "2025-11-20T11:01:01Z"
}, },
{
"name": "itsmng/itsm-ng",
"version": "v2.1.1",
"date": "2025-11-20T10:54:07Z"
},
{ {
"name": "Athou/commafeed", "name": "Athou/commafeed",
"version": "5.12.0", "version": "5.12.0",
@ -1164,6 +1134,11 @@
"version": "v1.0.25", "version": "v1.0.25",
"date": "2025-11-12T16:57:54Z" "date": "2025-11-12T16:57:54Z"
}, },
{
"name": "jason5ng32/MyIP",
"version": "v5.1.0",
"date": "2025-11-12T10:44:24Z"
},
{ {
"name": "CrazyWolf13/web-check", "name": "CrazyWolf13/web-check",
"version": "1.1.0", "version": "1.1.0",
@ -1299,11 +1274,21 @@
"version": "v0.8.8.3", "version": "v0.8.8.3",
"date": "2025-10-23T12:31:49Z" "date": "2025-10-23T12:31:49Z"
}, },
{
"name": "louislam/uptime-kuma",
"version": "2.0.2",
"date": "2025-10-22T17:03:54Z"
},
{ {
"name": "benzino77/tasmocompiler", "name": "benzino77/tasmocompiler",
"version": "v13.0.0", "version": "v13.0.0",
"date": "2025-10-19T10:03:18Z" "date": "2025-10-19T10:03:18Z"
}, },
{
"name": "ellite/Wallos",
"version": "v4.5.0",
"date": "2025-10-18T22:00:50Z"
},
{ {
"name": "minio/minio", "name": "minio/minio",
"version": "RELEASE.2025-10-15T17-29-55Z", "version": "RELEASE.2025-10-15T17-29-55Z",
@ -1414,6 +1399,11 @@
"version": "v2.7.6", "version": "v2.7.6",
"date": "2025-09-15T15:50:44Z" "date": "2025-09-15T15:50:44Z"
}, },
{
"name": "intri-in/manage-my-damn-life-nextjs",
"version": "v0.8.1",
"date": "2025-09-14T06:45:23Z"
},
{ {
"name": "ThePhaseless/Byparr", "name": "ThePhaseless/Byparr",
"version": "v2.0.1", "version": "v2.0.1",
@ -1449,6 +1439,11 @@
"version": "v2.1.0", "version": "v2.1.0",
"date": "2025-08-29T12:56:13Z" "date": "2025-08-29T12:56:13Z"
}, },
{
"name": "benjaminjonard/koillection",
"version": "1.7.0",
"date": "2025-08-28T18:10:59Z"
},
{ {
"name": "plexguide/Huntarr.io", "name": "plexguide/Huntarr.io",
"version": "8.2.10", "version": "8.2.10",
@ -1579,6 +1574,11 @@
"version": "2025-05-07-r1", "version": "2025-05-07-r1",
"date": "2025-05-07T12:18:42Z" "date": "2025-05-07T12:18:42Z"
}, },
{
"name": "CyferShepard/Jellystat",
"version": "1.1.6",
"date": "2025-05-01T17:11:00Z"
},
{ {
"name": "dotnetfactory/fluid-calendar", "name": "dotnetfactory/fluid-calendar",
"version": "v1.4.0", "version": "v1.4.0",

View File

@ -13,7 +13,16 @@ setting_up_container
network_check network_check
update_os update_os
fetch_and_deploy_gh_release "backrest" "garethgeorge/backrest" "prebuild" "latest" "/opt/backrest/bin" "backrest_Linux_x86_64.tar.gz" msg_info "Installing Backrest"
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
@ -23,6 +32,7 @@ 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"
@ -38,3 +48,4 @@ msg_ok "Created Service"
motd_ssh motd_ssh
customize customize
cleanup_lxc cleanup_lxc

View File

@ -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.4" PHP_FPM=YES PHP_MODULE="ffi,opcache,redis,zip,pdo-sqlite,bcmath,pdo,curl,dom,fpm" setup_php PHP_VERSION="8.3" 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

View File

@ -14,23 +14,38 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt install -y \ $STD apt-get install -y \
ca-certificates \
openssl \
snapraid \ snapraid \
avahi-daemon \ avahi-daemon \
fdisk \ fdisk
mergerfs \
unzip
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
setup_docker msg_info "Install mergerfs"
fetch_and_deploy_gh_release "cosmos" "azukaar/Cosmos-Server" "prebuild" "latest" "/opt/cosmos" "cosmos-cloud-*-amd64.zip" MERGERFS_VERSION="2.40.2"
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 "Setting up Cosmos" msg_info "Install Docker"
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
msg_ok "Set up Cosmos" rm -f "/opt/cosmos/cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip"
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

View File

@ -14,6 +14,7 @@ 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"

View File

@ -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

View File

@ -18,14 +18,17 @@ $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-debian-amd64.tar.gz" fetch_and_deploy_gh_release "homarr" "homarr-labs/homarr" "prebuild" "latest" "/opt/homarr" "build-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)"
@ -62,8 +65,6 @@ 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
@ -78,9 +79,8 @@ 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 systemctl enable -q --now redis-server && sleep 5
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

View File

@ -296,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.4.1" "$SRC_DIR" fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.4.0" "$SRC_DIR"
msg_info "Installing ${APPLICATION} (patience)" msg_info "Installing ${APPLICATION} (patience)"

View File

@ -21,18 +21,6 @@ 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
@ -67,7 +55,7 @@ After=network.target
[Service] [Service]
WorkingDirectory=/opt/jotty WorkingDirectory=/opt/jotty
EnvironmentFile=/opt/jotty/.env EnvironmentFile=/opt/jotty/.env
ExecStart=/usr/bin/node server.js ExecStart=yarn start
Restart=on-abnormal Restart=on-abnormal
[Install] [Install]

View File

@ -24,14 +24,6 @@ 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

View File

@ -21,7 +21,7 @@ $STD apt install -y \
zstd zstd
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
JAVA_VERSION="25" setup_java JAVA_VERSION="24" 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 PG_DB_NAME="reitti_db" PG_DB_USER="reitti" setup_postgresql_db

View File

@ -17,6 +17,7 @@ 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" \
@ -25,22 +26,17 @@ setup_deb822_repo \
"ubiquiti" \ "ubiquiti" \
"amd64" "amd64"
JAVA_VERSION="21" setup_java if ! grep -q -m1 'avx[^ ]*' /proc/cpuinfo; then
msg_warn "No AVX Support Detected. MongoDB v4.4 will be installed"
if lscpu | grep -q 'avx'; then if ! dpkg -l | grep -q "libssl1.1"; then
MONGO_VERSION="8.0" setup_mongodb 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"
$STD dpkg -i libssl1.1_1.1.1w-0+deb11u4_amd64.deb
fi
MONGO_VERSION="4.4" setup_mongodb
else else
msg_error "No AVX detected (CPU-Flag)! We have discontinued support for this. You are welcome to try it manually with a Debian LXC, but due to the many issues with Unifi, we currently only support AVX CPUs." MONGO_VERSION="7.0" setup_mongodb
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

View File

@ -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 with automatic cleanup # - In silent mode: runs update_script
# - Otherwise: shows update/setting menu and runs update_script with cleanup # - Otherwise: shows update/setting menu
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
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,7 +2638,6 @@ 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:" \
@ -2663,7 +2662,6 @@ start() {
;; ;;
esac esac
update_script update_script
cleanup_lxc
fi fi
} }

View File

@ -2734,57 +2734,11 @@ EOF
return 1 return 1
} }
# For AMD GPUs, firmware-amd-graphics requires non-free repositories # AMD firmware for better GPU support
if [[ "$os_id" == "debian" ]]; then if [[ "$os_id" == "debian" ]]; then
# Add non-free-firmware repository if not already present $STD apt -y install firmware-amd-graphics 2>/dev/null || true
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)

View File

@ -1,249 +0,0 @@
#!/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

View File

@ -1,6 +0,0 @@
_ __ __ __
____ (_) /_ ____ / /__ ___ _ ______ ____ _____/ /____ _____
/ __ \/ / __ \/ __ \/ / _ \______/ _ \| |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
/ /_/ / / / / / /_/ / / __/_____/ __/> </ /_/ / /_/ / / / /_/ __/ /
/ .___/_/_/ /_/\____/_/\___/ \___/_/|_/ .___/\____/_/ \__/\___/_/
/_/ /_/

View File

@ -50,7 +50,7 @@ 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}"
if ! pct exec "$container" -- bash -c "command ${custom_command} >/dev/null 2>&1" if ! pct exec "$container" -- bash -c "command -v ${custom_command} >/dev/null 2>&1"
then then
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}" echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
else else