/var/www/html/index.html
-
-
-
- Caddy works!
-
-
- Hello Caddy!
- For more information, refer to the Caddy documentation
-
-
-EOF
-msg_ok "Installed Caddy"
-
-read -r -p "${TAB3}Would you like to install xCaddy Addon? " prompt
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- GO_VERSION="$(curl -fsSL https://go.dev/VERSION?m=text | head -1 | cut -c3-)" setup_go
- msg_info "Setup xCaddy"
- cd /opt
- RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
- curl -fsSL "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.tar.gz" -o "xcaddy_${RELEASE:1}_linux_amd64.tar.gz"
- $STD tar xzf xcaddy_"${RELEASE:1}"_linux_amd64.tar.gz -C /usr/local/bin xcaddy
- rm -rf /opt/xcaddy*
- $STD xcaddy build
- msg_ok "Setup xCaddy"
-fi
-
-msg_info "Enabling Caddy Service"
-$STD rc-update add caddy default
-msg_ok "Enabled Caddy Service"
-
-msg_info "Starting Caddy"
-$STD service caddy start
-msg_ok "Started Caddy"
-
-motd_ssh
-customize
diff --git a/install/alpine-docker-install.sh b/install/alpine-docker-install.sh
deleted file mode 100644
index 91a07a770..000000000
--- a/install/alpine-docker-install.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 tteck
-# Author: tteck (tteckster)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://www.docker.com/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add tzdata openssl
-msg_ok "Installed Dependencies"
-
-msg_info "Installing Docker"
-$STD apk add docker
-$STD rc-service docker start
-$STD rc-update add docker default
-msg_ok "Installed Docker"
-
-get_latest_release() {
- curl -fsSL https://api.github.com/repos/"$1"/releases/latest | grep '"tag_name":' | cut -d'"' -f4
-}
-DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose")
-PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent")
-
-read -r -p "${TAB3}Would you like to add Docker Compose? " prompt
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
- DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
- mkdir -p "$DOCKER_CONFIG"/cli-plugins
- curl -fsSL https://github.com/docker/compose/releases/download/"$DOCKER_COMPOSE_LATEST_VERSION"/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose
- chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose
- msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
-fi
-
-if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then
- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
-else
- read -r -p "${TAB3}Would you like to add the Portainer Agent? " prompt
- if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- msg_info "Installing Portainer agent $PORTAINER_AGENT_LATEST_VERSION"
- $STD docker run -d \
- -p 9001:9001 \
- --name portainer_agent \
- --restart=always \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v /var/lib/docker/volumes:/var/lib/docker/volumes \
- portainer/agent
- msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
- fi
-fi
-
-read -r -p "${TAB3}Would you like to expose the Docker TCP socket? " prompt
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- msg_info "Exposing Docker TCP socket"
- $STD mkdir -p /etc/docker
- $STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' >/etc/docker/daemon.json
- $STD rc-service docker restart
- msg_ok "Exposed Docker TCP socket at tcp://+:2375"
-fi
-
-motd_ssh
-customize
diff --git a/install/alpine-forgejo-install.sh b/install/alpine-forgejo-install.sh
deleted file mode 100644
index b09a6414f..000000000
--- a/install/alpine-forgejo-install.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: Johann3s-H (An!ma)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://forgejo.org/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Forgejo"
-$STD apk add --no-cache forgejo
-msg_ok "Installed Forgejo"
-
-msg_info "Enabling Forgejo Service"
-$STD rc-update add forgejo default
-msg_ok "Enabled Forgejo Service"
-
-msg_info "Starting Forgejo"
-$STD service forgejo start
-msg_ok "Started Forgejo"
-
-motd_ssh
-customize
diff --git a/install/alpine-garage-install.sh b/install/alpine-garage-install.sh
deleted file mode 100644
index 476f98dd7..000000000
--- a/install/alpine-garage-install.sh
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://garagehq.deuxfleurs.fr/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add --no-cache openssl
-msg_ok "Installed Dependencies"
-
-GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name')
-curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
-chmod +x /usr/local/bin/garage
-mkdir -p /var/lib/garage/{data,meta,snapshots}
-mkdir -p /etc/garage
-RPC_SECRET=$(openssl rand -hex 64 | cut -c1-64)
-ADMIN_TOKEN=$(openssl rand -base64 32)
-METRICS_TOKEN=$(openssl rand -base64 32)
-cat <~/garage.creds
-Garage Tokens and Secrets
-RPC Secret: $RPC_SECRET
-Admin Token: $ADMIN_TOKEN
-Metrics Token: $METRICS_TOKEN
-EOF
-echo $GITEA_RELEASE >>~/.garage
-cat </etc/garage.toml
-metadata_dir = "/var/lib/garage/meta"
-data_dir = "/var/lib/garage/data"
-db_engine = "sqlite"
-replication_factor = 1
-
-rpc_bind_addr = "0.0.0.0:3901"
-rpc_public_addr = "127.0.0.1:3901"
-rpc_secret = "${RPC_SECRET}"
-
-[s3_api]
-s3_region = "garage"
-api_bind_addr = "0.0.0.0:3900"
-root_domain = ".s3.garage"
-
-[s3_web]
-bind_addr = "0.0.0.0:3902"
-root_domain = ".web.garage"
-index = "index.html"
-
-[k2v_api]
-api_bind_addr = "0.0.0.0:3904"
-
-[admin]
-api_bind_addr = "0.0.0.0:3903"
-admin_token = "${ADMIN_TOKEN}"
-metrics_token = "${METRICS_TOKEN}"
-EOF
-msg_ok "Configured Garage"
-
-msg_info "Creating Service"
-cat <<'EOF' >/etc/init.d/garage
-#!/sbin/openrc-run
-name="Garage Object Storage"
-command="/usr/local/bin/garage"
-command_args="server"
-command_background="yes"
-pidfile="/run/garage.pid"
-depend() {
- need net
-}
-EOF
-
-chmod +x /etc/init.d/garage
-$STD rc-update add garage default
-$STD rc-service garage restart || rc-service garage start
-msg_ok "Service active"
-
-motd_ssh
-customize
diff --git a/install/alpine-gatus-install.sh b/install/alpine-gatus-install.sh
deleted file mode 100644
index 6bab8a41c..000000000
--- a/install/alpine-gatus-install.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: SlaviΕ‘a AreΕΎina (tremor021)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/TwiN/gatus
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing dependencies"
-$STD apk add --no-cache \
- ca-certificates \
- libcap-setcap
-$STD apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community go
-msg_ok "Installed dependencies"
-
-RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-msg_info "Installing gatus v${RELEASE}"
-temp_file=$(mktemp)
-mkdir -p /opt/gatus
-curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
-tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
-cd /opt/gatus
-$STD go mod tidy
-CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
-setcap CAP_NET_RAW+ep gatus
-mv config.yaml config
-echo "${RELEASE}" >/opt/gatus_version.txt
-msg_ok "Installed gatus v${RELEASE}"
-
-msg_info "Enabling gatus Service"
-cat </etc/init.d/gatus
-#!/sbin/openrc-run
-description="gatus Service"
-directory="/opt/gatus"
-command="/opt/gatus/gatus"
-command_args=""
-command_background="true"
-command_user="root"
-pidfile="/var/run/gatus.pid"
-
-export GATUS_CONFIG_PATH=""
-export GATUS_LOG_LEVEL="INFO"
-export PORT="8080"
-
-depend() {
- use net
-}
-EOF
-chmod +x /etc/init.d/gatus
-$STD rc-update add gatus default
-msg_ok "Enabled gatus Service"
-
-msg_info "Starting gatus"
-$STD service gatus start
-msg_ok "Started gatus"
-
-motd_ssh
-customize
-
-msg_info "Cleaning up"
-rm -f "$temp_file"
-$STD apk cache clean
-msg_ok "Cleaned"
diff --git a/install/alpine-gitea-install.sh b/install/alpine-gitea-install.sh
deleted file mode 100644
index dc7b8225b..000000000
--- a/install/alpine-gitea-install.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://gitea.io/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Gitea"
-$STD apk add --no-cache gitea
-msg_ok "Installed Gitea"
-
-msg_info "Enabling Gitea Service"
-$STD rc-update add gitea default
-msg_ok "Enabled Gitea Service"
-
-msg_info "Starting Gitea"
-$STD service gitea start
-msg_ok "Started Gitea"
-
-motd_ssh
-customize
diff --git a/install/alpine-grafana-install.sh b/install/alpine-grafana-install.sh
deleted file mode 100644
index 6920bceb2..000000000
--- a/install/alpine-grafana-install.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 tteck
-# Author: tteck (tteckster)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://grafana.com/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Grafana"
-$STD apk add grafana
-$STD sed -i '/http_addr/s/127.0.0.1/0.0.0.0/g' /etc/conf.d/grafana
-$STD rc-service grafana start
-$STD rc-update add grafana default
-msg_ok "Installed Grafana"
-
-motd_ssh
-customize
diff --git a/install/alpine-ironclaw-install.sh b/install/alpine-ironclaw-install.sh
deleted file mode 100644
index 84936637a..000000000
--- a/install/alpine-ironclaw-install.sh
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/nearai/ironclaw
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add openssl dbus gnome-keyring
-msg_ok "Installed Dependencies"
-
-msg_info "Installing PostgreSQL"
-$STD apk add postgresql17 postgresql17-openrc postgresql-pgvector postgresql-common
-$STD rc-service postgresql setup
-$STD rc-update add postgresql default
-$STD rc-service postgresql start
-msg_ok "Installed PostgreSQL"
-
-msg_info "Setting up Database"
-PG_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
-$STD su -s /bin/sh postgres -c "psql -c \"CREATE ROLE ironclaw WITH LOGIN PASSWORD '${PG_PASS}';\""
-$STD su -s /bin/sh postgres -c "psql -c \"CREATE DATABASE ironclaw WITH OWNER ironclaw;\""
-$STD su -s /bin/sh postgres -c "psql -d ironclaw -c \"CREATE EXTENSION IF NOT EXISTS vector;\""
-msg_ok "Set up Database"
-
-fetch_and_deploy_gh_release "ironclaw-bin" "nearai/ironclaw" "prebuild" "ironclaw-v0.29.1" "/usr/local/bin" \
- "ironclaw-$(uname -m)-unknown-linux-musl.tar.gz"
-chmod +x /usr/local/bin/ironclaw
-
-msg_info "Configuring Environment"
-GATEWAY_TOKEN=$(openssl rand -hex 32)
-mkdir -p /root/.ironclaw
-cat </root/.ironclaw/gateway.creds
-Gateway-Token
-Token: $GATEWAY_TOKEN
-EOF
-
-mkdir -p /root/.ironclaw
-cat </root/.ironclaw/.env
-DATABASE_BACKEND=postgres
-DATABASE_URL=postgresql://ironclaw:${PG_PASS}@localhost:5432/ironclaw?sslmode=disable
-GATEWAY_ENABLED=true
-GATEWAY_HOST=0.0.0.0
-GATEWAY_PORT=3000
-GATEWAY_AUTH_TOKEN=${GATEWAY_TOKEN}
-CLI_ENABLED=false
-RUST_LOG=ironclaw=info,tower_http=info
-EOF
-chmod 600 /root/.ironclaw/.env
-msg_ok "Configured Environment"
-
-msg_info "Configuring IronClaw"
-# Set values in the database since it is typically the true source of truth and ensures values are set correctly on first run before the service starts.
-/usr/local/bin/ironclaw --no-onboard config set database_backend postgres >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set database_url "postgresql://ironclaw:${PG_PASS}@localhost:5432/ironclaw?sslmode=disable" >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_enabled true >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_host 0.0.0.0 >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_port 3000 >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_auth_token "${GATEWAY_TOKEN}" >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.cli_enabled false >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set secrets_master_key_source none >/dev/null
-# Running ironclaw defaults to use env for secrets and creates this entry, but we want to set that during onboard.
-sleep 5
-sed -i '/SECRETS_MASTER_KEY/d' /root/.ironclaw/.env
-msg_ok "Configured IronClaw"
-
-msg_info "Creating Service"
-cat </etc/init.d/ironclaw
-#!/sbin/openrc-run
-
-name="IronClaw"
-description="IronClaw AI Agent"
-command="/usr/bin/dbus-run-session"
-command_args="/usr/local/bin/ironclaw"
-command_background=true
-pidfile="/run/ironclaw.pid"
-directory="/root"
-supervise_daemon_args="--env-file /root/.ironclaw/.env"
-
-depend() {
- need net postgresql
-}
-EOF
-chmod +x /etc/init.d/ironclaw
-$STD rc-update add ironclaw default
-msg_ok "Created Service"
-
-motd_ssh
-customize
diff --git a/install/alpine-loki-install.sh b/install/alpine-loki-install.sh
deleted file mode 100644
index 738d3b8d1..000000000
--- a/install/alpine-loki-install.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2025 community-scripts ORG
-# Author: hoholms
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/grafana/loki
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Loki"
-$STD apk add loki
-$STD sed -i '/http_addr/s/127.0.0.1/0.0.0.0/g' /etc/conf.d/loki
-mkdir -p /var/lib/loki/{chunks,boltdb-shipper-active,boltdb-shipper-cache}
-chown -R loki:grafana /var/lib/loki
-mkdir -p /var/log/loki
-chown -R loki:grafana /var/log/loki
-cat </etc/loki/loki-local-config.yaml
-auth_enabled: false
-
-server:
- http_listen_port: 3100
- log_level: info
-
-common:
- instance_addr: 127.0.0.1
- path_prefix: /var/lib/loki
- storage:
- filesystem:
- chunks_directory: /var/lib/loki/chunks
- rules_directory: /var/lib/loki/rules
- replication_factor: 1
- ring:
- kvstore:
- store: inmemory
-
-schema_config:
- configs:
- - from: 2020-10-24
- store: tsdb
- object_store: filesystem
- schema: v13
- index:
- prefix: index_
- period: 24h
-
-query_range:
- results_cache:
- cache:
- embedded_cache:
- enabled: true
- max_size_mb: 100
-
-limits_config:
- metric_aggregation_enabled: true
-
-ruler:
- alertmanager_url: http://localhost:9093
-EOF
-chown loki:grafana /etc/loki/loki-local-config.yaml
-chmod 644 /etc/loki/loki-local-config.yaml
-echo "output_log=\"\${output_log:-/var/log/loki/output.log}\"" >> /etc/init.d/loki
-echo "error_log=\"\${error_log:-/var/log/loki/error.log}\"" >> /etc/init.d/loki
-echo "start_stop_daemon_args=\"\${SSD_OPTS} -1 \${output_log} -2 \${error_log}\"" >> /etc/init.d/loki
-$STD rc-update add loki default
-$STD rc-service loki start
-msg_ok "Installed Loki"
-
-motd_ssh
-customize
-cleanup_lxc
diff --git a/install/alpine-mariadb-install.sh b/install/alpine-mariadb-install.sh
deleted file mode 100644
index fb3142efa..000000000
--- a/install/alpine-mariadb-install.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://mariadb.org/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing MariaDB"
-$STD apk add --no-cache mariadb mariadb-client
-$STD rc-update add mariadb default
-msg_ok "Installed MariaDB"
-
-msg_info "Configuring MariaDB"
-mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql >/dev/null 2>&1
-$STD rc-service mariadb start
-msg_ok "MariaDB Configured"
-
-read -r -p "${TAB3}Would you like to install Adminer with lighttpd? : " prompt
-if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- msg_info "Installing Adminer and dependencies"
- $STD apk add --no-cache \
- lighttpd \
- lighttpd-openrc \
- php83 \
- php83-cgi \
- php83-common \
- php83-curl \
- php83-gd \
- php83-mbstring \
- php83-mysqli \
- php83-mysqlnd \
- php83-openssl \
- php83-zip \
- php83-session \
- jq
-
- sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
- sed -i 's|/usr/bin/php-cgi|/usr/bin/php-cgi83|g' /etc/lighttpd/mod_fastcgi.conf
- mkdir -p /var/www/localhost/htdocs
- ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
- curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
- chown lighttpd:lighttpd /var/www/localhost/htdocs/adminer.php
- chmod 755 /var/www/localhost/htdocs/adminer.php
- msg_ok "Adminer Installed"
-
- msg_info "Starting Lighttpd"
- $STD rc-update add lighttpd default
- $STD rc-service lighttpd restart
- msg_ok "Lighttpd Started"
-fi
-
-motd_ssh
-customize
-
-msg_info "Cleaning up"
-msg_ok "Cleaned"
diff --git a/install/alpine-node-red-install.sh b/install/alpine-node-red-install.sh
deleted file mode 100644
index 07cd3ecdd..000000000
--- a/install/alpine-node-red-install.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://nodered.org/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add --no-cache \
- git \
- nodejs \
- npm
-msg_ok "Installed Dependencies"
-
-msg_info "Creating Node-RED User"
-adduser -D -H -s /sbin/nologin -G users nodered
-msg_ok "Created Node-RED User"
-
-msg_info "Installing Node-RED"
-$STD npm install -g --unsafe-perm node-red
-msg_ok "Installed Node-RED"
-
-msg_info "Creating /home/nodered"
-mkdir -p /home/nodered
-chown -R nodered:users /home/nodered
-chmod 750 /home/nodered
-msg_ok "Created /home/nodered"
-
-msg_info "Creating Node-RED Service"
-service_path="/etc/init.d/nodered"
-
-echo '#!/sbin/openrc-run
-description="Node-RED Service"
-
-command="/usr/local/bin/node-red"
-command_args="--max-old-space-size=128 -v"
-command_user="nodered"
-pidfile="/var/run/nodered.pid"
-command_background="yes"
-
-depend() {
- use net
-}' >$service_path
-
-chmod +x $service_path
-msg_ok "Created Node-RED Service"
-
-msg_info "Starting Node-RED"
-$STD rc-update add nodered
-$STD rc-service nodered start
-msg_ok "Started Node-RED"
-
-motd_ssh
-customize
diff --git a/install/alpine-ntfy-install.sh b/install/alpine-ntfy-install.sh
deleted file mode 100644
index 4f14c79e0..000000000
--- a/install/alpine-ntfy-install.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: cobalt (cobaltgit)
-# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
-# Source: https://ntfy.sh/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing ntfy"
-$STD apk add --no-cache ntfy ntfy-openrc libcap
-sed -i '/^listen-http/s/^\(.*\)$/#\1\n/' /etc/ntfy/server.yml
-setcap 'cap_net_bind_service=+ep' /usr/bin/ntfy
-$STD rc-update add ntfy default
-$STD service ntfy start
-msg_ok "Installed ntfy"
-
-motd_ssh
-customize
diff --git a/install/alpine-postgresql-install.sh b/install/alpine-postgresql-install.sh
deleted file mode 100644
index 0156237fd..000000000
--- a/install/alpine-postgresql-install.sh
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://www.postgresql.org/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-read -r -p "${TAB3}Enter PostgreSQL version (15/16/17): " ver
-[[ $ver =~ ^(15|16|17)$ ]] || { echo "Invalid version"; exit 64; }
-
-msg_info "Installing PostgreSQL ${ver}"
-$STD apk add --no-cache postgresql${ver} postgresql${ver}-contrib postgresql${ver}-openrc sudo
-msg_ok "Installed PostgreSQL ${ver}"
-
-msg_info "Enabling PostgreSQL Service"
-$STD rc-update add postgresql default
-msg_ok "Enabled PostgreSQL Service"
-
-msg_info "Starting PostgreSQL"
-$STD rc-service postgresql start
-msg_ok "Started PostgreSQL"
-
-msg_info "Configuring PostgreSQL for External Access"
-conf_file="/etc/postgresql${ver}/postgresql.conf"
-hba_file="/etc/postgresql${ver}/pg_hba.conf"
-sed -i 's/^#listen_addresses =.*/listen_addresses = '\''*'\''/' "$conf_file"
-sed -i '/^host\s\+all\s\+all\s\+127.0.0.1\/32\s\+md5/ s/.*/host all all 0.0.0.0\/0 md5/' "$hba_file"
-$STD rc-service postgresql restart
-msg_ok "Configured and Restarted PostgreSQL"
-
-read -r -p "${TAB3}Would you like to install Adminer with lighttpd? : " prompt
-if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- msg_info "Installing Adminer and dependencies"
- $STD apk add --no-cache \
- lighttpd \
- lighttpd-openrc \
- php83 \
- php83-cgi \
- php83-common \
- php83-curl \
- php83-gd \
- php83-mbstring \
- php83-pdo \
- php83-pgsql \
- php83-openssl \
- php83-zip \
- php83-session \
- jq
-
- sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
- sed -i 's|/usr/bin/php-cgi|/usr/bin/php-cgi83|g' /etc/lighttpd/mod_fastcgi.conf
- mkdir -p /var/www/localhost/htdocs
- ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
- curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
- chown lighttpd:lighttpd /var/www/localhost/htdocs/adminer.php
- chmod 755 /var/www/localhost/htdocs/adminer.php
- msg_ok "Adminer Installed"
-
- msg_info "Starting Lighttpd"
- $STD rc-update add lighttpd default
- $STD rc-service lighttpd restart
- msg_ok "Lighttpd Started"
-fi
-
-motd_ssh
-customize
diff --git a/install/alpine-prometheus-install.sh b/install/alpine-prometheus-install.sh
deleted file mode 100644
index d374abfb9..000000000
--- a/install/alpine-prometheus-install.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://prometheus.io/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Prometheus"
-$STD apk add --no-cache prometheus
-msg_ok "Installed Prometheus"
-
-msg_info "Enabling Prometheus Service"
-$STD rc-update add prometheus default
-msg_ok "Enabled Prometheus Service"
-
-msg_info "Starting Prometheus"
-$STD service prometheus start
-msg_ok "Started Prometheus"
-
-motd_ssh
-customize
diff --git a/install/alpine-rclone-install.sh b/install/alpine-rclone-install.sh
deleted file mode 100644
index 40b345763..000000000
--- a/install/alpine-rclone-install.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: SlaviΕ‘a AreΕΎina (tremor021)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/rclone/rclone
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing dependencies"
-$STD apk add --no-cache \
- apache2-utils fuse3
-msg_ok "Installed dependencies"
-
-msg_info "Installing rclone"
-temp_file=$(mktemp)
-mkdir -p /opt/rclone
-RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclone-v${RELEASE}-linux-$(arch_resolve).zip" -o "$temp_file"
-$STD unzip -j "$temp_file" '*/**' -d /opt/rclone
-cd /opt/rclone
-RCLONE_PASSWORD=$(head -c 16 /dev/urandom | xxd -p -c 16)
-$STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD"
-cat <~/rclone.creds
-rclone-Credentials
-rclone User Name: admin
-rclone Password: $RCLONE_PASSWORD
-EOF
-echo "${RELEASE}" >/opt/rclone_version.txt
-rm -f "$temp_file"
-msg_ok "Installed rclone"
-
-msg_info "Enabling rclone Service"
-cat </etc/init.d/rclone
-#!/sbin/openrc-run
-description="rclone Service"
-command="/opt/rclone/rclone"
-command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/login.pwd"
-command_background="true"
-command_user="root"
-pidfile="/var/run/rclone.pid"
-
-depend() {
- use net
-}
-EOF
-chmod +x /etc/init.d/rclone
-$STD rc-update add rclone default
-msg_ok "Enabled rclone Service"
-
-msg_info "Starting rclone"
-$STD service rclone start
-msg_ok "Started rclone"
-
-motd_ssh
-customize
-
-msg_info "Cleaning up"
-rm -rf "$temp_file"
-$STD apk cache clean
-msg_ok "Cleaned"
diff --git a/install/alpine-redis-install.sh b/install/alpine-redis-install.sh
deleted file mode 100644
index 5b0e4e824..000000000
--- a/install/alpine-redis-install.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://redis.io/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Redis"
-$STD apk add redis
-$STD sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf
-$STD rc-update add redis default
-$STD rc-service redis start
-msg_ok "Installed Redis"
-
-motd_ssh
-customize
diff --git a/install/alpine-rustdeskserver-install.sh b/install/alpine-rustdeskserver-install.sh
deleted file mode 100644
index 99d3fae4e..000000000
--- a/install/alpine-rustdeskserver-install.sh
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: SlaviΕ‘a AreΕΎina (tremor021)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/rustdesk/rustdesk-server
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-RELEASE=$(curl -s https://api.github.com/repos/lejianwen/rustdesk-server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-msg_info "Installing RustDesk Server v${RELEASE}"
-temp_file1=$(mktemp)
-ARCH=$(arch_resolve "amd64" "arm64v8")
-curl -fsSL "https://github.com/lejianwen/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-linux-${ARCH}.zip" -o "$temp_file1"
-$STD unzip "$temp_file1"
-mv "$ARCH" /opt/rustdesk-server
-mkdir -p /root/.config/rustdesk
-cd /opt/rustdesk-server
-./rustdesk-utils genkeypair >/tmp/rustdesk_keys.txt
-grep "Public Key" /tmp/rustdesk_keys.txt | awk '{print $3}' >/root/.config/rustdesk/id_ed25519.pub
-grep "Secret Key" /tmp/rustdesk_keys.txt | awk '{print $3}' >/root/.config/rustdesk/id_ed25519
-chmod 600 /root/.config/rustdesk/id_ed25519
-chmod 644 /root/.config/rustdesk/id_ed25519.pub
-rm /tmp/rustdesk_keys.txt
-echo "${RELEASE}" >~/.rustdesk-server
-msg_ok "Installed RustDesk Server v${RELEASE}"
-
-APIRELEASE=$(curl -s https://api.github.com/repos/lejianwen/rustdesk-api/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-msg_info "Installing RustDesk API v${APIRELEASE}"
-temp_file2=$(mktemp)
-curl -fsSL "https://github.com/lejianwen/rustdesk-api/releases/download/v${APIRELEASE}/linux-$(arch_resolve).tar.gz" -o "$temp_file2"
-$STD tar zxvf "$temp_file2"
-mv release /opt/rustdesk-api
-cd /opt/rustdesk-api
-ADMINPASS=$(head -c 16 /dev/urandom | xxd -p -c 16)
-$STD ./apimain reset-admin-pwd "$ADMINPASS"
-cat <~/rustdesk.creds
-RustDesk WebUI
-
-Username: admin
-Password: $ADMINPASS
-EOF
-echo "${APIRELEASE}" >~/.rustdesk-api
-msg_ok "Installed RustDesk API v${APIRELEASE}"
-
-msg_info "Enabling RustDesk Server Services"
-cat </etc/init.d/rustdesk-server-hbbs
-#!/sbin/openrc-run
-description="RustDesk HBBS Service"
-directory="/opt/rustdesk-server"
-command="/opt/rustdesk-server/hbbs"
-command_args=""
-command_background="true"
-command_user="root"
-pidfile="/var/run/rustdesk-server-hbbs.pid"
-output_log="/var/log/rustdesk-hbbs.log"
-error_log="/var/log/rustdesk-hbbs.err"
-
-depend() {
- use net
-}
-EOF
-
-cat </etc/init.d/rustdesk-server-hbbr
-#!/sbin/openrc-run
-description="RustDesk HBBR Service"
-directory="/opt/rustdesk-server"
-command="/opt/rustdesk-server/hbbr"
-command_args=""
-command_background="true"
-command_user="root"
-pidfile="/var/run/rustdesk-server-hbbr.pid"
-output_log="/var/log/rustdesk-hbbr.log"
-error_log="/var/log/rustdesk-hbbr.err"
-
-depend() {
- use net
-}
-EOF
-
-cat </etc/init.d/rustdesk-api
-#!/sbin/openrc-run
-description="RustDesk API Service"
-directory="/opt/rustdesk-api"
-command="/opt/rustdesk-api/apimain"
-command_args=""
-command_background="true"
-command_user="root"
-pidfile="/var/run/rustdesk-api.pid"
-output_log="/var/log/rustdesk-api.log"
-error_log="/var/log/rustdesk-api.err"
-
-depend() {
- use net
-}
-EOF
-chmod +x /etc/init.d/rustdesk-server-hbbs
-chmod +x /etc/init.d/rustdesk-server-hbbr
-chmod +x /etc/init.d/rustdesk-api
-$STD rc-update add rustdesk-server-hbbs default
-$STD rc-update add rustdesk-server-hbbr default
-$STD rc-update add rustdesk-api default
-msg_ok "Enabled RustDesk Server Services"
-
-msg_info "Starting RustDesk Server"
-$STD service rustdesk-server-hbbs start
-$STD service rustdesk-server-hbbr start
-$STD service rustdesk-api start
-msg_ok "Started RustDesk Server"
-
-motd_ssh
-customize
-
-msg_info "Cleaning up"
-rm -f "$temp_file1" "$temp_file2"
-$STD apk cache clean
-msg_ok "Cleaned"
diff --git a/install/alpine-rustypaste-install.sh b/install/alpine-rustypaste-install.sh
deleted file mode 100644
index f45707aba..000000000
--- a/install/alpine-rustypaste-install.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/orhun/rustypaste
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing RustyPaste"
-$STD apk add --no-cache rustypaste --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
-msg_ok "Installed RustyPaste"
-
-msg_info "Configuring RustyPaste"
-mkdir -p /var/lib/rustypaste
-sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' /etc/rustypaste/config.toml
-msg_ok "Configured RustyPaste"
-
-msg_info "Creating Service"
-cat <<'EOF' >/etc/init.d/rustypaste
-#!/sbin/openrc-run
-
-name="rustypaste"
-description="RustyPaste - A minimal file upload/pastebin service"
-command="/usr/bin/rustypaste"
-command_args=""
-command_user="root"
-command_background=true
-pidfile="/run/${RC_SVCNAME}.pid"
-directory="/var/lib/rustypaste"
-
-depend() {
- need net
- after firewall
-}
-
-start_pre() {
- export CONFIG=/etc/rustypaste/config.toml
- checkpath --directory --owner root:root --mode 0755 /var/lib/rustypaste
-}
-EOF
-chmod +x /etc/init.d/rustypaste
-$STD rc-update add rustypaste default
-$STD rc-service rustypaste start
-msg_ok "Created Service"
-
-motd_ssh
-customize
-cleanup_lxc
diff --git a/install/alpine-syncthing-install.sh b/install/alpine-syncthing-install.sh
deleted file mode 100644
index 2dd468c7b..000000000
--- a/install/alpine-syncthing-install.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://syncthing.net/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Setup Syncthing"
-$STD apk add --no-cache syncthing
-rc-service syncthing start
-sleep 3
-rc-service syncthing stop
-sed -i "{s/127.0.0.1:8384/0.0.0.0:8384/g}" /var/lib/syncthing/.local/state/syncthing/config.xml
-msg_ok "Setup Syncthing"
-
-msg_info "Enabling Syncthing Service"
-$STD rc-update add syncthing default
-msg_ok "Enabled Syncthing Service"
-
-msg_info "Starting Syncthing"
-$STD rc-service syncthing start
-msg_ok "Started Syncthing"
-
-motd_ssh
-customize
diff --git a/install/alpine-teamspeak-server-install.sh b/install/alpine-teamspeak-server-install.sh
deleted file mode 100644
index 63ef8a063..000000000
--- a/install/alpine-teamspeak-server-install.sh
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: tremor021 (SlaviΕ‘a AreΕΎina)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://teamspeak.com/en/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing dependencies"
-$STD apk add --no-cache \
- ca-certificates \
- libstdc++ \
- libc6-compat
-msg_ok "Installed dependencies"
-
-RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | awk 'NR==1')
-msg_info "Installing Teamspeak Server v${RELEASE}"
-mkdir -p /opt/teamspeak-server
-cd /opt/teamspeak-server
-curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
-tar xf ts3server.tar.bz2 --strip-components=1
-mkdir -p logs data lib
-mv *.so lib
-touch data/ts3server.sqlitedb data/query_ip_blacklist.txt data/query_ip_whitelist.txt .ts3server_license_accepted
-echo "${RELEASE}" >~/.teamspeak-server
-msg_ok "Installed TeamSpeak Server v${RELEASE}"
-
-msg_info "Enabling TeamSpeak Server Service"
-cat </etc/init.d/teamspeak
-#!/sbin/openrc-run
-
-name="TeamSpeak Server"
-description="TeamSpeak 3 Server"
-command="/opt/teamspeak-server/ts3server_startscript.sh"
-command_args="start"
-output_log="/var/log/teamspeak.out.log"
-error_log="/var/log/teamspeak.err.log"
-command_background=true
-pidfile="/run/teamspeak-server.pid"
-directory="/opt/teamspeak-server"
-
-depend() {
- need net
- use dns
-}
-EOF
-chmod +x /etc/init.d/teamspeak
-$STD rc-update add teamspeak default
-msg_ok "Enabled TeamSpeak Server Service"
-
-msg_info "Starting TeamSpeak Server"
-$STD service teamspeak start
-msg_ok "Started TeamSpeak Server"
-
-motd_ssh
-customize
-
-msg_info "Cleaning up"
-rm -r ts3server.tar.bz* LICENSE* CHANGELOG doc serverquerydocs tsdns redist
-$STD apk cache clean
-msg_ok "Cleaned"
diff --git a/install/alpine-tinyauth-install.sh b/install/alpine-tinyauth-install.sh
deleted file mode 100644
index e9d26a1fa..000000000
--- a/install/alpine-tinyauth-install.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: SlaviΕ‘a AreΕΎina (tremor021) | Co-Author: Stavros (steveiliop56)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/tinyauthapp/tinyauth
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add --no-cache openssl apache2-utils
-msg_ok "Installed Dependencies"
-
-msg_info "Installing Tinyauth"
-mkdir -p /opt/tinyauth
-RELEASE=$(curl -s https://api.github.com/repos/tinyauthapp/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-curl -fsSL "https://github.com/tinyauthapp/tinyauth/releases/download/v${RELEASE}/tinyauth-$(arch_resolve)" -o /opt/tinyauth/tinyauth
-chmod +x /opt/tinyauth/tinyauth
-PASS=$(openssl rand -base64 8 | tr -dc 'a-zA-Z0-9' | head -c 8)
-USER=$(htpasswd -Bbn "tinyauth" "${PASS}")
-
-cat </opt/tinyauth/credentials.txt
-Tinyauth Credentials
-Username: tinyauth
-Password: ${PASS}
-EOF
-echo "${RELEASE}" >~/.tinyauth
-msg_ok "Installed Tinyauth"
-
-read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url
-
-cat </opt/tinyauth/.env
-TINYAUTH_DATABASE_PATH=/opt/tinyauth/database.db
-TINYAUTH_AUTH_USERS='${USER}'
-TINYAUTH_APPURL=${app_url}
-EOF
-
-msg_info "Creating Service"
-cat <<'EOF' >/etc/init.d/tinyauth
-#!/sbin/openrc-run
-description="Tinyauth Service"
-
-set -a
-ENV_FILE="/opt/tinyauth/.env"
-[ -f "$ENV_FILE" ] && . "$ENV_FILE"
-set +a
-
-command="/opt/tinyauth/tinyauth"
-directory="/opt/tinyauth"
-command_user="root"
-command_background="true"
-pidfile="/var/run/tinyauth.pid"
-
-depend() {
- use net
-}
-EOF
-chmod +x /etc/init.d/tinyauth
-$STD rc-update add tinyauth default
-msg_ok "Enabled Tinyauth Service"
-
-msg_info "Starting Tinyauth"
-$STD service tinyauth start
-msg_ok "Started Tinyauth"
-
-motd_ssh
-customize
diff --git a/install/alpine-traefik-install.sh b/install/alpine-traefik-install.sh
deleted file mode 100644
index 652e9658b..000000000
--- a/install/alpine-traefik-install.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add ca-certificates
-$STD update-ca-certificates
-msg_ok "Installed Dependencies"
-
-msg_info "Installing Traefik"
-$STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
-msg_ok "Installed Traefik"
-
-read -p "${TAB3}Enable Traefik WebUI (Port 8080)? [y/N]: " enable_webui
-if [[ "$enable_webui" =~ ^[Yy]$ ]]; then
- msg_info "Configuring Traefik WebUI"
- sed -i 's/localhost//g' /etc/traefik/traefik.yaml
- msg_ok "Configured Traefik WebUI"
-fi
-
-msg_info "Enabling and starting Traefik service"
-$STD rc-update add traefik default
-sed -i '/^command=.*/i directory="/etc/traefik"' /etc/init.d/traefik
-$STD rc-service traefik start
-msg_ok "Traefik service started"
-
-motd_ssh
-customize
diff --git a/install/alpine-transmission-install.sh b/install/alpine-transmission-install.sh
deleted file mode 100644
index d7cc76e1f..000000000
--- a/install/alpine-transmission-install.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: SlaviΕ‘a AreΕΎina (tremor021)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://transmissionbt.com/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Transmission"
-$STD apk add --no-cache transmission-cli transmission-daemon
-$STD rc-service transmission-daemon start
-sleep 5
-$STD rc-service transmission-daemon stop
-sed -i '{s/"rpc-whitelist-enabled": true/"rpc-whitelist-enabled": false/g; s/"rpc-host-whitelist-enabled": true,/"rpc-host-whitelist-enabled": false,/g}' /var/lib/transmission/config/settings.json
-msg_ok "Installed Transmission"
-
-msg_info "Enabling Transmission Service"
-$STD rc-update add transmission-daemon default
-msg_ok "Enabled Transmission Service"
-
-msg_info "Starting Transmission"
-$STD rc-service transmission-daemon start
-msg_ok "Started Transmission"
-
-motd_ssh
-customize
diff --git a/install/alpine-valkey-install.sh b/install/alpine-valkey-install.sh
deleted file mode 100644
index 02d80865e..000000000
--- a/install/alpine-valkey-install.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: pshankinclarke (lazarillo)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://valkey.io/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Valkey"
-$STD apk add valkey valkey-openrc valkey-cli
-sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
-
-PASS="$(head -c 100 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c32)"
-echo "requirepass $PASS" >>/etc/valkey/valkey.conf
-echo "$PASS" >~/valkey.creds
-chmod 600 ~/valkey.creds
-
-MEMTOTAL_MB=$(free -m | grep ^Mem: | awk '{print $2}')
-MAXMEMORY_MB=$((MEMTOTAL_MB * 75 / 100))
-
-cat </etc/valkey/valkey.conf
-# Memory-optimized settings for small-scale deployments
-maxmemory ${MAXMEMORY_MB}mb
-maxmemory-policy allkeys-lru
-maxmemory-samples 10
-EOF
-msg_ok "Installed Valkey"
-
-# Note: Alpine's valkey package is compiled without TLS support
-# For TLS, use the Debian-based valkey script instead
-
-$STD rc-update add valkey default
-$STD rc-service valkey start
-
-motd_ssh
-customize
-cleanup_lxc
diff --git a/install/alpine-vaultwarden-install.sh b/install/alpine-vaultwarden-install.sh
deleted file mode 100644
index 729ef050b..000000000
--- a/install/alpine-vaultwarden-install.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 tteck
-# Author: tteck (tteckster) | Co-Author: SlaviΕ‘a AreΕΎina (tremor021)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://github.com/dani-garcia/vaultwarden
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add --no-cache \
- openssl \
- argon2
-msg_ok "Installed Dependencies"
-
-msg_info "Installing Alpine-Vaultwarden"
-$STD apk add --no-cache vaultwarden
-sed -i 's|export WEB_VAULT_ENABLED=.*|export WEB_VAULT_ENABLED=true|' /etc/conf.d/vaultwarden
-echo -e "export ADMIN_TOKEN=''" >>/etc/conf.d/vaultwarden
-echo -e "export ROCKET_ADDRESS=0.0.0.0" >>/etc/conf.d/vaultwarden
-echo -e "export ROCKET_TLS='{certs=\"/etc/ssl/certs/vaultwarden-selfsigned.crt\",key=\"/etc/ssl/private/vaultwarden-selfsigned.key\"}'" >>/etc/conf.d/vaultwarden
-$STD openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/vaultwarden-selfsigned.key -out /etc/ssl/certs/vaultwarden-selfsigned.crt -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost"
-chown vaultwarden:vaultwarden /etc/ssl/certs/vaultwarden-selfsigned.crt
-chown vaultwarden:vaultwarden /etc/ssl/private/vaultwarden-selfsigned.key
-msg_ok "Installed Alpine-Vaultwarden"
-
-msg_info "Installing Web-Vault"
-$STD apk add --no-cache vaultwarden-web-vault
-msg_ok "Installed Web-Vault"
-
-msg_info "Starting Alpine-Vaultwarden"
-$STD rc-service vaultwarden start
-$STD rc-update add vaultwarden default
-msg_ok "Started Alpine-Vaultwarden"
-
-motd_ssh
-customize
diff --git a/install/alpine-wireguard-install.sh b/install/alpine-wireguard-install.sh
deleted file mode 100644
index 8456f0365..000000000
--- a/install/alpine-wireguard-install.sh
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: MickLesk (CanbiZ)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://www.wireguard.com/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Dependencies"
-$STD apk add \
- iptables \
- openrc
-msg_ok "Installed Dependencies"
-
-msg_info "Installing WireGuard"
-$STD apk add --no-cache wireguard-tools
-if [[ ! -L /etc/init.d/wg-quick.wg0 ]]; then
- ln -s /etc/init.d/wg-quick /etc/init.d/wg-quick.wg0
-fi
-
-private_key=$(wg genkey)
-cat </etc/wireguard/wg0.conf
-[Interface]
-PrivateKey = ${private_key}
-Address = 10.0.0.1/24
-SaveConfig = true
-PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
-PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;
-ListenPort = 51820
-EOF
-echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
-$STD rc-update add sysctl
-$STD sysctl -p /etc/sysctl.conf
-msg_ok "Installed WireGuard"
-
-read -rp "${TAB3}Do you want to install WGDashboard? (y/N): " INSTALL_WGD
-if [[ "$INSTALL_WGD" =~ ^[Yy]$ ]]; then
- msg_info "Installing additional dependencies for WGDashboard"
- $STD apk add --no-cache \
- python3 \
- py3-pip \
- git \
- sudo \
- musl-dev \
- linux-headers \
- gcc \
- python3-dev
- msg_ok "Installed additional dependencies for WGDashboard"
- msg_info "Installing WGDashboard"
- git clone -q https://github.com/WGDashboard/WGDashboard.git /etc/wgdashboard
- cd /etc/wgdashboard/src
- chmod u+x wgd.sh
- $STD ./wgd.sh install
- msg_ok "Installed WGDashboard"
-
- msg_info "Creating Service for WGDashboard"
- cat </etc/init.d/wg-dashboard
-#!/sbin/openrc-run
-
-description="WireGuard Dashboard Service"
-
-depend() {
- need net
- after firewall
-}
-
-start() {
- ebegin "Starting WGDashboard"
- cd /etc/wgdashboard/src/
- ./wgd.sh start &
- eend $?
-}
-
-stop() {
- ebegin "Stopping WGDashboard"
- pkill -f "wgd.sh"
- eend $?
-}
-EOF
- chmod +x /etc/init.d/wg-dashboard
- $STD rc-update add wg-dashboard default
- $STD rc-service wg-dashboard start
- msg_ok "Created Service for WGDashboard"
-
-fi
-
-msg_info "Starting Services"
-$STD rc-update add wg-quick.wg0 default
-$STD rc-service wg-quick.wg0 start
-msg_ok "Started Services"
-
-motd_ssh
-customize
diff --git a/install/alpine-zigbee2mqtt-install.sh b/install/alpine-zigbee2mqtt-install.sh
deleted file mode 100644
index bb0c1816c..000000000
--- a/install/alpine-zigbee2mqtt-install.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 tteck
-# Author: tteck (tteckster)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://www.zigbee2mqtt.io/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_info "Installing Alpine-Zigbee2MQTT"
-mkdir -p /root/.z2m /etc/zigbee2mqtt
-$STD apk add zigbee2mqtt
-ln -s /etc/zigbee2mqtt/ /root/.z2m
-chown -R root:root /etc/zigbee2mqtt /root/.z2m
-sed -i -e 's/#datadir="\/var\/lib\/zigbee2mqtt"/datadir="\/etc\/zigbee2mqtt"/' -e 's/#command_user="zigbee2mqtt"/command_user="root"/' /etc/conf.d/zigbee2mqtt
-$STD rc-update add zigbee2mqtt
-$STD rc-service zigbee2mqtt restart
-msg_ok "Installed Alpine-Zigbee2MQTT"
-
-motd_ssh
-customize
diff --git a/install/bitmagnet-install.sh b/install/bitmagnet-install.sh
index de33f083e..6a10f33e6 100644
--- a/install/bitmagnet-install.sh
+++ b/install/bitmagnet-install.sh
@@ -13,43 +13,44 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- iproute2 \
- gcc \
- musl-dev
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ iproute2 \
+ gcc \
+ musl-dev
+ msg_ok "Installed Dependencies"
-PG_VERSION="16" setup_postgresql
-PG_DB_NAME="bitmagnet" PG_DB_USER="bitmagnet" setup_postgresql_db
-setup_go
+ PG_VERSION="16" setup_postgresql
+ PG_DB_NAME="bitmagnet" PG_DB_USER="bitmagnet" setup_postgresql_db
+ setup_go
-fetch_and_deploy_gh_release "bitmagnet" "bitmagnet-io/bitmagnet" "tarball"
-RELEASE=$(cat ~/.bitmagnet)
+ fetch_and_deploy_gh_release "bitmagnet" "bitmagnet-io/bitmagnet" "tarball"
+ RELEASE=$(cat ~/.bitmagnet)
-msg_info "Configuring bitmagnet"
-cd /opt/bitmagnet
-$STD go build -ldflags "-s -w -X github.com/bitmagnet-io/bitmagnet/internal/version.GitTag=v${RELEASE}"
-chmod +x bitmagnet
-msg_ok "Configured bitmagnet"
+ msg_info "Configuring bitmagnet"
+ cd /opt/bitmagnet
+ $STD go build -ldflags "-s -w -X github.com/bitmagnet-io/bitmagnet/internal/version.GitTag=v${RELEASE}"
+ chmod +x bitmagnet
+ msg_ok "Configured bitmagnet"
-read -r -p "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey
+ read -r -p "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey
-cat </etc/bitmagnet.env
+ cat </etc/bitmagnet.env
POSTGRES_HOST=localhost
POSTGRES_USER=${PG_DB_USER}
POSTGRES_NAME=${PG_DB_NAME}
POSTGRES_PASSWORD=${PG_DB_PASS}
EOF
-if [ -z "$tmdbapikey" ]; then
- echo "TMDB_ENABLED=false" >>/etc/bitmagnet.env
-else
- echo "TMDB_API_KEY=$tmdbapikey" >>/etc/bitmagnet.env
-fi
+ if [ -z "$tmdbapikey" ]; then
+ echo "TMDB_ENABLED=false" >>/etc/bitmagnet.env
+ else
+ echo "TMDB_API_KEY=$tmdbapikey" >>/etc/bitmagnet.env
+ fi
-msg_info "Creating Service"
-cat </etc/systemd/system/bitmagnet-web.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/bitmagnet-web.service
[Unit]
Description=bitmagnet Web GUI
After=network-online.target
@@ -65,8 +66,78 @@ Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now bitmagnet-web
-msg_ok "Created Service"
+ systemctl enable -q --now bitmagnet-web
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing dependencies"
+ $STD apk add --no-cache \
+ gcc \
+ musl-dev \
+ git \
+ iproute2-ss \
+ sudo
+ $STD apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community go
+ msg_ok "Installed dependencies"
+
+ msg_info "Installing PostgreSQL"
+ $STD apk add --no-cache \
+ postgresql16 \
+ postgresql16-contrib \
+ postgresql16-openrc
+ $STD rc-update add postgresql
+ $STD rc-service postgresql start
+ msg_ok "Installed PostreSQL"
+
+ RELEASE=$(curl -fsSL https://api.github.com/repos/bitmagnet-io/bitmagnet/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+
+ msg_info "Installing bitmagnet v${RELEASE}"
+ mkdir -p /opt/bitmagnet
+ temp_file=$(mktemp)
+ curl -fsSL "https://github.com/bitmagnet-io/bitmagnet/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
+ tar zxf "$temp_file" --strip-components=1 -C /opt/bitmagnet
+ cd /opt/bitmagnet
+ VREL=v$RELEASE
+ $STD go build -ldflags "-s -w -X github.com/bitmagnet-io/bitmagnet/internal/version.GitTag=$VREL"
+ chmod +x bitmagnet
+ $STD su - postgres -c "psql -c 'CREATE DATABASE bitmagnet;'"
+ echo "${RELEASE}" >/opt/bitmagnet_version.txt
+ msg_ok "Installed bitmagnet v${RELEASE}"
+
+ read -rp "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey
+
+ msg_info "Enabling bitmagnet Service"
+ cat </etc/init.d/bitmagnet
+#!/sbin/openrc-run
+description="bitmagnet Service"
+directory="/opt/bitmagnet"
+command="/opt/bitmagnet/bitmagnet"
+command_args="worker run --all"
+command_background="true"
+command_user="root"
+pidfile="/var/run/bitmagnet.pid"
+
+depend() {
+ use net
+}
+
+start_pre() {
+ export TMDB_API_KEY="$tmdbapikey"
+}
+EOF
+ chmod +x /etc/init.d/bitmagnet
+ $STD rc-update add bitmagnet default
+ msg_ok "Enabled bitmagnet Service"
+
+ msg_info "Starting bitmagnet"
+ $STD service bitmagnet start
+ msg_ok "Started bitmagnet"
+
+ rm -f "$temp_file"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/caddy-install.sh b/install/caddy-install.sh
index 6591d4fd0..75e511ad0 100644
--- a/install/caddy-install.sh
+++ b/install/caddy-install.sh
@@ -13,32 +13,91 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- debian-keyring \
- debian-archive-keyring \
- apt-transport-https
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ debian-keyring \
+ debian-archive-keyring \
+ apt-transport-https
+ msg_ok "Installed Dependencies"
-msg_info "Installing Caddy"
-setup_deb822_repo \
- "caddy" \
- "https://dl.cloudsmith.io/public/caddy/stable/gpg.key" \
- "https://dl.cloudsmith.io/public/caddy/stable/deb/debian" \
- "any-version"
-$STD apt install -y caddy
-msg_ok "Installed Caddy"
+ msg_info "Installing Caddy"
+ setup_deb822_repo \
+ "caddy" \
+ "https://dl.cloudsmith.io/public/caddy/stable/gpg.key" \
+ "https://dl.cloudsmith.io/public/caddy/stable/deb/debian" \
+ "any-version"
+ $STD apt install -y caddy
+ msg_ok "Installed Caddy"
-read -r -p "${TAB3}Would you like to install xCaddy Addon? " prompt
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- setup_go
- fetch_and_deploy_gh_release "xcaddy" "caddyserver/xcaddy" "binary"
+ read -r -p "${TAB3}Would you like to install xCaddy Addon? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ setup_go
+ fetch_and_deploy_gh_release "xcaddy" "caddyserver/xcaddy" "binary"
- msg_info "Setup xCaddy"
- $STD apt install -y git
- $STD xcaddy build
- msg_ok "Setup xCaddy"
-fi
+ msg_info "Setup xCaddy"
+ $STD apt install -y git
+ $STD xcaddy build
+ msg_ok "Setup xCaddy"
+ fi
+}
+
+setup_alpine() {
+ msg_info "Installing Caddy"
+ $STD apk add --no-cache caddy caddy-openrc
+ cat </etc/caddy/Caddyfile
+:80 {
+ # Set this path to your site's directory.
+ root * /var/www/html
+
+ # Enable the static file server.
+ file_server
+
+ # Another common task is to set up a reverse proxy:
+ # reverse_proxy localhost:8080
+
+ # Or serve a PHP site through php-fpm:
+ # php_fastcgi localhost:9000
+}
+EOF
+ mkdir -p /var/www/html
+ cat </var/www/html/index.html
+
+
+
+ Caddy works!
+
+
+ Hello Caddy!
+ For more information, refer to the Caddy documentation
+
+
+EOF
+ msg_ok "Installed Caddy"
+
+ read -r -p "${TAB3}Would you like to install xCaddy Addon? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ GO_VERSION="$(curl -fsSL https://go.dev/VERSION?m=text | head -1 | cut -c3-)" setup_go
+ msg_info "Setup xCaddy"
+ cd /opt
+ RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ curl -fsSL "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.tar.gz" -o "xcaddy_${RELEASE:1}_linux_amd64.tar.gz"
+ $STD tar xzf xcaddy_"${RELEASE:1}"_linux_amd64.tar.gz -C /usr/local/bin xcaddy
+ rm -rf /opt/xcaddy*
+ $STD xcaddy build
+ msg_ok "Setup xCaddy"
+ fi
+
+ msg_info "Enabling Caddy Service"
+ $STD rc-update add caddy default
+ msg_ok "Enabled Caddy Service"
+
+ msg_info "Starting Caddy"
+ $STD service caddy start
+ msg_ok "Started Caddy"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/docker-install.sh b/install/docker-install.sh
index 904a65938..e042d85f5 100644
--- a/install/docker-install.sh
+++ b/install/docker-install.sh
@@ -13,64 +13,122 @@ setting_up_container
network_check
update_os
-PORTAINER_AGENT_LATEST_VERSION=$(get_latest_github_release "portainer/agent")
+setup_deb_based() {
+ PORTAINER_AGENT_LATEST_VERSION=$(get_latest_github_release "portainer/agent")
-setup_docker
+ setup_docker
-if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then
- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
-else
- read -r -p "${TAB3}Would you like to install the Portainer Agent (for remote management)? " prompt_agent
- if [[ ${prompt_agent,,} =~ ^(y|yes)$ ]]; then
- msg_info "Installing Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
- $STD docker run -d \
- -p 9001:9001 \
- --name portainer_agent \
- --restart=always \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v /var/lib/docker/volumes:/var/lib/docker/volumes \
- portainer/agent
- msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
+ if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then
+ bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
+ else
+ read -r -p "${TAB3}Would you like to install the Portainer Agent (for remote management)? " prompt_agent
+ if [[ ${prompt_agent,,} =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
+ $STD docker run -d \
+ -p 9001:9001 \
+ --name portainer_agent \
+ --restart=always \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ -v /var/lib/docker/volumes:/var/lib/docker/volumes \
+ portainer/agent
+ msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
+ fi
fi
-fi
-read -r -p "${TAB3}Expose Docker TCP socket (insecure) ? [n = No, l = Local only (127.0.0.1), a = All interfaces (0.0.0.0)] : " socket_choice
-case "${socket_choice,,}" in
-l)
- socket="tcp://127.0.0.1:2375"
- ;;
-a)
- socket="tcp://0.0.0.0:2375"
- ;;
-*)
- socket=""
- ;;
-esac
+ read -r -p "${TAB3}Expose Docker TCP socket (insecure) ? [n = No, l = Local only (127.0.0.1), a = All interfaces (0.0.0.0)] : " socket_choice
+ case "${socket_choice,,}" in
+ l)
+ socket="tcp://127.0.0.1:2375"
+ ;;
+ a)
+ socket="tcp://0.0.0.0:2375"
+ ;;
+ *)
+ socket=""
+ ;;
+ esac
-if [[ -n "$socket" ]]; then
- msg_info "Enabling Docker TCP socket on $socket"
- $STD apt-get install -y jq
+ if [[ -n "$socket" ]]; then
+ msg_info "Enabling Docker TCP socket on $socket"
+ $STD apt-get install -y jq
- tmpfile=$(mktemp)
- jq --arg sock "$socket" '. + { "hosts": ["unix:///var/run/docker.sock", $sock] }' /etc/docker/daemon.json >"$tmpfile" && mv "$tmpfile" /etc/docker/daemon.json
+ tmpfile=$(mktemp)
+ jq --arg sock "$socket" '. + { "hosts": ["unix:///var/run/docker.sock", $sock] }' /etc/docker/daemon.json >"$tmpfile" && mv "$tmpfile" /etc/docker/daemon.json
- mkdir -p /etc/systemd/system/docker.service.d
- cat </etc/systemd/system/docker.service.d/override.conf
+ mkdir -p /etc/systemd/system/docker.service.d
+ cat </etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=$(command -v dockerd || echo /usr/sbin/dockerd)
EOF
- $STD systemctl daemon-reexec
- $STD systemctl daemon-reload
+ $STD systemctl daemon-reexec
+ $STD systemctl daemon-reload
- if systemctl restart docker; then
- msg_ok "Docker TCP socket available on $socket"
- else
- msg_error "Docker failed to restart. Check journalctl -xeu docker.service"
- exit 150
+ if systemctl restart docker; then
+ msg_ok "Docker TCP socket available on $socket"
+ else
+ msg_error "Docker failed to restart. Check journalctl -xeu docker.service"
+ exit 150
+ fi
fi
-fi
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add tzdata openssl
+ msg_ok "Installed Dependencies"
+
+ msg_info "Installing Docker"
+ $STD apk add docker
+ $STD rc-service docker start
+ $STD rc-update add docker default
+ msg_ok "Installed Docker"
+
+ get_latest_release() {
+ curl -fsSL https://api.github.com/repos/"$1"/releases/latest | grep '"tag_name":' | cut -d'"' -f4
+ }
+ DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose")
+ PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent")
+
+ read -r -p "${TAB3}Would you like to add Docker Compose? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
+ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
+ mkdir -p "$DOCKER_CONFIG"/cli-plugins
+ curl -fsSL https://github.com/docker/compose/releases/download/"$DOCKER_COMPOSE_LATEST_VERSION"/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose
+ chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose
+ msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION"
+ fi
+
+ if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then
+ bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y"
+ else
+ read -r -p "${TAB3}Would you like to add the Portainer Agent? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Portainer agent $PORTAINER_AGENT_LATEST_VERSION"
+ $STD docker run -d \
+ -p 9001:9001 \
+ --name portainer_agent \
+ --restart=always \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ -v /var/lib/docker/volumes:/var/lib/docker/volumes \
+ portainer/agent
+ msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION"
+ fi
+ fi
+
+ read -r -p "${TAB3}Would you like to expose the Docker TCP socket? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Exposing Docker TCP socket"
+ $STD mkdir -p /etc/docker
+ $STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' >/etc/docker/daemon.json
+ $STD rc-service docker restart
+ msg_ok "Exposed Docker TCP socket at tcp://+:2375"
+ fi
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/forgejo-install.sh b/install/forgejo-install.sh
index 38fa16813..8ab802d25 100644
--- a/install/forgejo-install.sh
+++ b/install/forgejo-install.sh
@@ -13,27 +13,28 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- git \
- git-lfs
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ git \
+ git-lfs
+ msg_ok "Installed Dependencies"
-fetch_and_deploy_codeberg_release "forgejo" "forgejo/forgejo" "singlefile" "latest" "/opt/forgejo" "forgejo-*-linux-$(arch_resolve)"
-ln -sf /opt/forgejo/forgejo /usr/local/bin/forgejo
+ fetch_and_deploy_codeberg_release "forgejo" "forgejo/forgejo" "singlefile" "latest" "/opt/forgejo" "forgejo-*-linux-$(arch_resolve)"
+ ln -sf /opt/forgejo/forgejo /usr/local/bin/forgejo
-msg_info "Setting up Forgejo"
-$STD adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
-mkdir /var/lib/forgejo
-chown git:git /var/lib/forgejo
-chmod 750 /var/lib/forgejo
-mkdir /etc/forgejo
-chown root:git /etc/forgejo
-chmod 770 /etc/forgejo
-msg_ok "Setup Forgejo"
+ msg_info "Setting up Forgejo"
+ $STD adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
+ mkdir /var/lib/forgejo
+ chown git:git /var/lib/forgejo
+ chmod 750 /var/lib/forgejo
+ mkdir /etc/forgejo
+ chown root:git /etc/forgejo
+ chmod 770 /etc/forgejo
+ msg_ok "Setup Forgejo"
-msg_info "Creating Service"
-cat </etc/systemd/system/forgejo.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/forgejo.service
[Unit]
Description=Forgejo
After=syslog.target
@@ -50,8 +51,25 @@ Environment=USER=git HOME=/home/git FORGEJO_WORK_DIR=/var/lib/forgejo
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now forgejo
-msg_ok "Created Service"
+ systemctl enable -q --now forgejo
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Forgejo"
+ $STD apk add --no-cache forgejo
+ msg_ok "Installed Forgejo"
+
+ msg_info "Enabling Forgejo Service"
+ $STD rc-update add forgejo default
+ msg_ok "Enabled Forgejo Service"
+
+ msg_info "Starting Forgejo"
+ $STD service forgejo start
+ msg_ok "Started Forgejo"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/garage-install.sh b/install/garage-install.sh
index 469f5c123..4aff53c7b 100644
--- a/install/garage-install.sh
+++ b/install/garage-install.sh
@@ -13,23 +13,24 @@ setting_up_container
network_check
update_os
-msg_info "Setup Garage"
-GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name')
-curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
-chmod +x /usr/local/bin/garage
-mkdir -p /var/lib/garage/{data,meta,snapshots}
-mkdir -p /etc/garage
-RPC_SECRET=$(openssl rand -hex 32)
-ADMIN_TOKEN=$(openssl rand -base64 32)
-METRICS_TOKEN=$(openssl rand -base64 32)
-cat <~/garage.creds
+setup_deb_based() {
+ msg_info "Setup Garage"
+ GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name')
+ curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
+ chmod +x /usr/local/bin/garage
+ mkdir -p /var/lib/garage/{data,meta,snapshots}
+ mkdir -p /etc/garage
+ RPC_SECRET=$(openssl rand -hex 32)
+ ADMIN_TOKEN=$(openssl rand -base64 32)
+ METRICS_TOKEN=$(openssl rand -base64 32)
+ cat <~/garage.creds
Garage Tokens and Secrets
RPC Secret: $RPC_SECRET
Admin Token: $ADMIN_TOKEN
Metrics Token: $METRICS_TOKEN
EOF
-echo $GITEA_RELEASE >>~/.garage
-cat </etc/garage.toml
+ echo $GITEA_RELEASE >>~/.garage
+ cat </etc/garage.toml
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"
@@ -57,10 +58,10 @@ api_bind_addr = "[::]:3903"
admin_token = "${ADMIN_TOKEN}"
metrics_token = "${METRICS_TOKEN}"
EOF
-msg_ok "Set up Garage"
+ msg_ok "Set up Garage"
-msg_info "Creating service"
-cat <<'EOF' >/etc/systemd/system/garage.service
+ msg_info "Creating service"
+ cat <<'EOF' >/etc/systemd/system/garage.service
[Unit]
Description=Garage Object Storage (Deuxfleurs)
After=network-online.target
@@ -81,8 +82,80 @@ LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
-$STD systemctl enable -q --now garage
-msg_ok "Created Service"
+ $STD systemctl enable -q --now garage
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add --no-cache openssl
+ msg_ok "Installed Dependencies"
+
+ GITEA_RELEASE=$(curl -s https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name')
+ curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GITEA_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
+ chmod +x /usr/local/bin/garage
+ mkdir -p /var/lib/garage/{data,meta,snapshots}
+ mkdir -p /etc/garage
+ RPC_SECRET=$(openssl rand -hex 64 | cut -c1-64)
+ ADMIN_TOKEN=$(openssl rand -base64 32)
+ METRICS_TOKEN=$(openssl rand -base64 32)
+ cat <~/garage.creds
+Garage Tokens and Secrets
+RPC Secret: $RPC_SECRET
+Admin Token: $ADMIN_TOKEN
+Metrics Token: $METRICS_TOKEN
+EOF
+ echo $GITEA_RELEASE >>~/.garage
+ cat </etc/garage.toml
+metadata_dir = "/var/lib/garage/meta"
+data_dir = "/var/lib/garage/data"
+db_engine = "sqlite"
+replication_factor = 1
+
+rpc_bind_addr = "0.0.0.0:3901"
+rpc_public_addr = "127.0.0.1:3901"
+rpc_secret = "${RPC_SECRET}"
+
+[s3_api]
+s3_region = "garage"
+api_bind_addr = "0.0.0.0:3900"
+root_domain = ".s3.garage"
+
+[s3_web]
+bind_addr = "0.0.0.0:3902"
+root_domain = ".web.garage"
+index = "index.html"
+
+[k2v_api]
+api_bind_addr = "0.0.0.0:3904"
+
+[admin]
+api_bind_addr = "0.0.0.0:3903"
+admin_token = "${ADMIN_TOKEN}"
+metrics_token = "${METRICS_TOKEN}"
+EOF
+ msg_ok "Configured Garage"
+
+ msg_info "Creating Service"
+ cat <<'EOF' >/etc/init.d/garage
+#!/sbin/openrc-run
+name="Garage Object Storage"
+command="/usr/local/bin/garage"
+command_args="server"
+command_background="yes"
+pidfile="/run/garage.pid"
+depend() {
+ need net
+}
+EOF
+
+ chmod +x /etc/init.d/garage
+ $STD rc-update add garage default
+ $STD rc-service garage restart || rc-service garage start
+ msg_ok "Service active"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/gatus-install.sh b/install/gatus-install.sh
index 2da993fe1..90b4c33e4 100644
--- a/install/gatus-install.sh
+++ b/install/gatus-install.sh
@@ -13,25 +13,26 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- ca-certificates \
- libcap2-bin
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ ca-certificates \
+ libcap2-bin
+ msg_ok "Installed Dependencies"
-setup_go
-fetch_and_deploy_gh_release "gatus" "TwiN/gatus" "tarball"
+ setup_go
+ fetch_and_deploy_gh_release "gatus" "TwiN/gatus" "tarball"
-msg_info "Configuring gatus"
-cd /opt/gatus
-$STD go mod tidy
-CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
-setcap CAP_NET_RAW+ep gatus
-mv config.yaml config
-msg_ok "Configured gatus"
+ msg_info "Configuring gatus"
+ cd /opt/gatus
+ $STD go mod tidy
+ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
+ setcap CAP_NET_RAW+ep gatus
+ mv config.yaml config
+ msg_ok "Configured gatus"
-msg_info "Creating Service"
-cat </etc/systemd/system/gatus.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/gatus.service
[Unit]
Description=gatus Service
After=network.target
@@ -46,8 +47,63 @@ Restart=always
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now gatus
-msg_ok "Created Service"
+ systemctl enable -q --now gatus
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing dependencies"
+ $STD apk add --no-cache \
+ ca-certificates \
+ libcap-setcap
+ $STD apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community go
+ msg_ok "Installed dependencies"
+
+ RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ msg_info "Installing gatus v${RELEASE}"
+ temp_file=$(mktemp)
+ mkdir -p /opt/gatus
+ curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
+ tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
+ cd /opt/gatus
+ $STD go mod tidy
+ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
+ setcap CAP_NET_RAW+ep gatus
+ mv config.yaml config
+ echo "${RELEASE}" >/opt/gatus_version.txt
+ msg_ok "Installed gatus v${RELEASE}"
+
+ msg_info "Enabling gatus Service"
+ cat </etc/init.d/gatus
+#!/sbin/openrc-run
+description="gatus Service"
+directory="/opt/gatus"
+command="/opt/gatus/gatus"
+command_args=""
+command_background="true"
+command_user="root"
+pidfile="/var/run/gatus.pid"
+
+export GATUS_CONFIG_PATH=""
+export GATUS_LOG_LEVEL="INFO"
+export PORT="8080"
+
+depend() {
+ use net
+}
+EOF
+ chmod +x /etc/init.d/gatus
+ $STD rc-update add gatus default
+ msg_ok "Enabled gatus Service"
+
+ msg_info "Starting gatus"
+ $STD service gatus start
+ msg_ok "Started gatus"
+
+ rm -f "$temp_file"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/gitea-install.sh b/install/gitea-install.sh
index 83da30c41..4e0da848b 100644
--- a/install/gitea-install.sh
+++ b/install/gitea-install.sh
@@ -14,27 +14,28 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- git \
- sqlite3
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ git \
+ sqlite3
+ msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-$(arch_resolve)"
+ fetch_and_deploy_gh_release "gitea" "go-gitea/gitea" "singlefile" "latest" "/usr/local/bin" "gitea-*-linux-$(arch_resolve)"
-msg_info "Configuring Gitea"
-chmod +x /usr/local/bin/gitea
-$STD adduser --system --group --disabled-password --shell /bin/bash --home /etc/gitea gitea
-mkdir -p /var/lib/gitea/{custom,data,log}
-chown -R gitea:gitea /var/lib/gitea/
-chmod -R 750 /var/lib/gitea/
-chown root:gitea /etc/gitea
-chmod 770 /etc/gitea
-sudo -u gitea ln -s /var/lib/gitea/data/.ssh/ /etc/gitea/.ssh
-msg_ok "Configured Gitea"
+ msg_info "Configuring Gitea"
+ chmod +x /usr/local/bin/gitea
+ $STD adduser --system --group --disabled-password --shell /bin/bash --home /etc/gitea gitea
+ mkdir -p /var/lib/gitea/{custom,data,log}
+ chown -R gitea:gitea /var/lib/gitea/
+ chmod -R 750 /var/lib/gitea/
+ chown root:gitea /etc/gitea
+ chmod 770 /etc/gitea
+ sudo -u gitea ln -s /var/lib/gitea/data/.ssh/ /etc/gitea/.ssh
+ msg_ok "Configured Gitea"
-msg_info "Creating Service"
-cat </etc/systemd/system/gitea.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
@@ -64,8 +65,25 @@ Environment=USER=gitea HOME=/var/lib/gitea/data GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now gitea
-msg_ok "Created Service"
+ systemctl enable -q --now gitea
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Gitea"
+ $STD apk add --no-cache gitea
+ msg_ok "Installed Gitea"
+
+ msg_info "Enabling Gitea Service"
+ $STD rc-update add gitea default
+ msg_ok "Enabled Gitea Service"
+
+ msg_info "Starting Gitea"
+ $STD service gitea start
+ msg_ok "Started Gitea"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/grafana-install.sh b/install/grafana-install.sh
index 964c75f67..b33c750f1 100644
--- a/install/grafana-install.sh
+++ b/install/grafana-install.sh
@@ -13,23 +13,36 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y apt-transport-https
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y apt-transport-https
+ msg_ok "Installed Dependencies"
-msg_info "Setting up Grafana Repository"
-setup_deb822_repo \
- "grafana" \
- "https://apt.grafana.com/gpg.key" \
- "https://apt.grafana.com" \
- "stable" \
- "main"
-msg_ok "Grafana Repository setup sucessfully"
+ msg_info "Setting up Grafana Repository"
+ setup_deb822_repo \
+ "grafana" \
+ "https://apt.grafana.com/gpg.key" \
+ "https://apt.grafana.com" \
+ "stable" \
+ "main"
+ msg_ok "Grafana Repository setup sucessfully"
-msg_info "Installing Grafana"
-$STD apt install -y grafana
-systemctl enable -q --now grafana-server
-msg_ok "Installed Grafana"
+ msg_info "Installing Grafana"
+ $STD apt install -y grafana
+ systemctl enable -q --now grafana-server
+ msg_ok "Installed Grafana"
+}
+
+setup_alpine() {
+ msg_info "Installing Grafana"
+ $STD apk add grafana
+ $STD sed -i '/http_addr/s/127.0.0.1/0.0.0.0/g' /etc/conf.d/grafana
+ $STD rc-service grafana start
+ $STD rc-update add grafana default
+ msg_ok "Installed Grafana"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/ironclaw-install.sh b/install/ironclaw-install.sh
index b1ba733bf..f88875e5e 100644
--- a/install/ironclaw-install.sh
+++ b/install/ironclaw-install.sh
@@ -13,30 +13,31 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- dbus-user-session \
- gnome-keyring \
- libsecret-tools
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ dbus-user-session \
+ gnome-keyring \
+ libsecret-tools
+ msg_ok "Installed Dependencies"
-PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
-PG_DB_NAME="ironclaw" PG_DB_USER="ironclaw" PG_DB_EXTENSIONS="vector" setup_postgresql_db
+ PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
+ PG_DB_NAME="ironclaw" PG_DB_USER="ironclaw" PG_DB_EXTENSIONS="vector" setup_postgresql_db
-fetch_and_deploy_gh_release "ironclaw-bin" "nearai/ironclaw" "prebuild" "ironclaw-v0.29.1" "/usr/local/bin" \
- "ironclaw-$(uname -m)-unknown-linux-gnu.tar.gz"
-chmod +x /usr/local/bin/ironclaw
+ fetch_and_deploy_gh_release "ironclaw-bin" "nearai/ironclaw" "prebuild" "ironclaw-v0.29.1" "/usr/local/bin" \
+ "ironclaw-$(uname -m)-unknown-linux-gnu.tar.gz"
+ chmod +x /usr/local/bin/ironclaw
-msg_info "Configuring Environment"
-GATEWAY_TOKEN=$(openssl rand -hex 32)
-mkdir -p /root/.ironclaw
-cat </root/.ironclaw/gateway.creds
+ msg_info "Configuring Environment"
+ GATEWAY_TOKEN=$(openssl rand -hex 32)
+ mkdir -p /root/.ironclaw
+ cat </root/.ironclaw/gateway.creds
Gateway-Token
Token: $GATEWAY_TOKEN
EOF
-mkdir -p /root/.ironclaw
-cat </root/.ironclaw/.env
+ mkdir -p /root/.ironclaw
+ cat </root/.ironclaw/.env
DATABASE_BACKEND=postgres
DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}?sslmode=disable
GATEWAY_ENABLED=true
@@ -46,26 +47,26 @@ GATEWAY_AUTH_TOKEN=${GATEWAY_TOKEN}
CLI_ENABLED=false
RUST_LOG=ironclaw=info,tower_http=info
EOF
-chmod 600 /root/.ironclaw/.env
-msg_ok "Configured Environment"
+ chmod 600 /root/.ironclaw/.env
+ msg_ok "Configured Environment"
-msg_info "Configuring IronClaw"
-# Set values in the database since it is typically the true source of truth and ensures values are set correctly on first run before the service starts.
-/usr/local/bin/ironclaw --no-onboard config set database_backend postgres >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set database_url "postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}?sslmode=disable" >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_enabled true >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_host 0.0.0.0 >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_port 3000 >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.gateway_auth_token "${GATEWAY_TOKEN}" >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set channels.cli_enabled false >/dev/null
-/usr/local/bin/ironclaw --no-onboard config set secrets_master_key_source none >/dev/null
-# Running ironclaw defaults to use env for secrets and creates this entry, but we want to set that during onboard.
-sleep 5
-sed -i '/SECRETS_MASTER_KEY/d' /root/.ironclaw/.env
-msg_ok "Configured IronClaw"
+ msg_info "Configuring IronClaw"
+ # Set values in the database since it is typically the true source of truth and ensures values are set correctly on first run before the service starts.
+ /usr/local/bin/ironclaw --no-onboard config set database_backend postgres >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set database_url "postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}?sslmode=disable" >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_enabled true >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_host 0.0.0.0 >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_port 3000 >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_auth_token "${GATEWAY_TOKEN}" >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.cli_enabled false >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set secrets_master_key_source none >/dev/null
+ # Running ironclaw defaults to use env for secrets and creates this entry, but we want to set that during onboard.
+ sleep 5
+ sed -i '/SECRETS_MASTER_KEY/d' /root/.ironclaw/.env
+ msg_ok "Configured IronClaw"
-msg_info "Creating Service"
-cat </etc/systemd/system/ironclaw.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/ironclaw.service
[Unit]
Description=IronClaw AI Agent
After=network.target postgresql.service
@@ -79,8 +80,93 @@ RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q ironclaw
-msg_ok "Created Service"
+ systemctl enable -q ironclaw
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add openssl dbus gnome-keyring
+ msg_ok "Installed Dependencies"
+
+ msg_info "Installing PostgreSQL"
+ $STD apk add postgresql17 postgresql17-openrc postgresql-pgvector postgresql-common
+ $STD rc-service postgresql setup
+ $STD rc-update add postgresql default
+ $STD rc-service postgresql start
+ msg_ok "Installed PostgreSQL"
+
+ msg_info "Setting up Database"
+ PG_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
+ $STD su -s /bin/sh postgres -c "psql -c \"CREATE ROLE ironclaw WITH LOGIN PASSWORD '${PG_PASS}';\""
+ $STD su -s /bin/sh postgres -c "psql -c \"CREATE DATABASE ironclaw WITH OWNER ironclaw;\""
+ $STD su -s /bin/sh postgres -c "psql -d ironclaw -c \"CREATE EXTENSION IF NOT EXISTS vector;\""
+ msg_ok "Set up Database"
+
+ fetch_and_deploy_gh_release "ironclaw-bin" "nearai/ironclaw" "prebuild" "ironclaw-v0.29.1" "/usr/local/bin" \
+ "ironclaw-$(uname -m)-unknown-linux-musl.tar.gz"
+ chmod +x /usr/local/bin/ironclaw
+
+ msg_info "Configuring Environment"
+ GATEWAY_TOKEN=$(openssl rand -hex 32)
+ mkdir -p /root/.ironclaw
+ cat </root/.ironclaw/gateway.creds
+Gateway-Token
+Token: $GATEWAY_TOKEN
+EOF
+
+ mkdir -p /root/.ironclaw
+ cat </root/.ironclaw/.env
+DATABASE_BACKEND=postgres
+DATABASE_URL=postgresql://ironclaw:${PG_PASS}@localhost:5432/ironclaw?sslmode=disable
+GATEWAY_ENABLED=true
+GATEWAY_HOST=0.0.0.0
+GATEWAY_PORT=3000
+GATEWAY_AUTH_TOKEN=${GATEWAY_TOKEN}
+CLI_ENABLED=false
+RUST_LOG=ironclaw=info,tower_http=info
+EOF
+ chmod 600 /root/.ironclaw/.env
+ msg_ok "Configured Environment"
+
+ msg_info "Configuring IronClaw"
+ # Set values in the database since it is typically the true source of truth and ensures values are set correctly on first run before the service starts.
+ /usr/local/bin/ironclaw --no-onboard config set database_backend postgres >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set database_url "postgresql://ironclaw:${PG_PASS}@localhost:5432/ironclaw?sslmode=disable" >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_enabled true >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_host 0.0.0.0 >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_port 3000 >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.gateway_auth_token "${GATEWAY_TOKEN}" >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set channels.cli_enabled false >/dev/null
+ /usr/local/bin/ironclaw --no-onboard config set secrets_master_key_source none >/dev/null
+ # Running ironclaw defaults to use env for secrets and creates this entry, but we want to set that during onboard.
+ sleep 5
+ sed -i '/SECRETS_MASTER_KEY/d' /root/.ironclaw/.env
+ msg_ok "Configured IronClaw"
+
+ msg_info "Creating Service"
+ cat </etc/init.d/ironclaw
+#!/sbin/openrc-run
+
+name="IronClaw"
+description="IronClaw AI Agent"
+command="/usr/bin/dbus-run-session"
+command_args="/usr/local/bin/ironclaw"
+command_background=true
+pidfile="/run/ironclaw.pid"
+directory="/root"
+supervise_daemon_args="--env-file /root/.ironclaw/.env"
+
+depend() {
+ need net postgresql
+}
+EOF
+ chmod +x /etc/init.d/ironclaw
+ $STD rc-update add ironclaw default
+ msg_ok "Created Service"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/jeedom-install.sh b/install/jeedom-install.sh
deleted file mode 100644
index e4f307444..000000000
--- a/install/jeedom-install.sh
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: Mips2648
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://jeedom.com/
-
-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 \
- lsb-release \
- git
-msg_ok "Dependencies installed"
-
-msg_warn "WARNING: This script will run an external installer from a third-party source (https://github.com/jeedom/)."
-msg_warn "The following code is NOT maintained or audited by our repository."
-msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:"
-msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "β https://raw.githubusercontent.com/jeedom/core/master/install/install.sh"
-echo
-read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM
-if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
- msg_error "Aborted by user. No changes have been made."
- exit 10
-fi
-
-DEFAULT_BRANCH="master"
-REPO_URL="https://github.com/jeedom/core.git"
-
-echo
-while true; do
- read -rp "${TAB3}Enter branch to use (master, beta, alpha...) (Default: ${DEFAULT_BRANCH}): " BRANCH
- BRANCH="${BRANCH:-$DEFAULT_BRANCH}"
-
- if git ls-remote --heads "$REPO_URL" "refs/heads/$BRANCH" | grep -q .; then
- break
- else
- msg_error "Branch '$BRANCH' does not exist on remote. Please try again."
- fi
-done
-
-msg_info "Downloading Jeedom installation script"
-cd /tmp
-wget -q https://raw.githubusercontent.com/jeedom/core/"${BRANCH}"/install/install.sh
-chmod +x install.sh
-msg_ok "Installation script downloaded"
-
-msg_info "Install Jeedom main dependencies, please wait"
-$STD ./install.sh -v "$BRANCH" -s 2
-msg_ok "Installed Jeedom main dependencies"
-
-msg_info "Install Database"
-$STD ./install.sh -v "$BRANCH" -s 3
-msg_ok "Database installed"
-
-msg_info "Install Apache"
-$STD ./install.sh -v "$BRANCH" -s 4
-msg_ok "Apache installed"
-
-msg_info "Install PHP and dependencies"
-$STD ./install.sh -v "$BRANCH" -s 5
-msg_ok "PHP installed"
-
-msg_info "Download Jeedom core"
-$STD ./install.sh -v "$BRANCH" -s 6
-msg_ok "Download done"
-
-msg_info "Database customisation"
-$STD ./install.sh -v "$BRANCH" -s 7
-msg_ok "Database customisation done"
-
-msg_info "Jeedom customisation"
-$STD ./install.sh -v "$BRANCH" -s 8
-msg_ok "Jeedom customisation done"
-
-msg_info "Configuring Jeedom"
-$STD ./install.sh -v "$BRANCH" -s 9
-msg_ok "Jeedom configured"
-
-msg_info "Installing Jeedom"
-$STD ./install.sh -v "$BRANCH" -s 10
-msg_ok "Jeedom installed"
-
-msg_info "Post installation"
-$STD ./install.sh -v "$BRANCH" -s 11
-msg_ok "Post installation done"
-
-msg_info "Check installation"
-$STD ./install.sh -v "$BRANCH" -s 12
-msg_ok "Installation checked, everything is successfuly installed. A reboot is recommended."
-
-motd_ssh
-customize
-
-rm -rf /tmp/install.sh
-cleanup_lxc
diff --git a/install/keycloak-install.sh b/install/keycloak-install.sh
index b36a62c3f..ce0a1cfd4 100644
--- a/install/keycloak-install.sh
+++ b/install/keycloak-install.sh
@@ -39,7 +39,6 @@ Type=idle
User=root
WorkingDirectory=/opt/keycloak
ExecStart=/opt/keycloak/bin/kc.sh start
-ExecStop=/opt/keycloak/bin/kc.sh stop
Restart=always
RestartSec=3
Environment="JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-$(arch_resolve)"
diff --git a/install/kometa-install.sh b/install/kometa-install.sh
index b0b2e2e96..0b2e90578 100644
--- a/install/kometa-install.sh
+++ b/install/kometa-install.sh
@@ -13,6 +13,10 @@ setting_up_container
network_check
update_os
+msg_info "Installing Dependencies"
+$STD apt install -y git
+msg_ok "Installed Dependencies"
+
PYTHON_VERSION="3.13" setup_uv
fetch_and_deploy_gh_release "kometa" "Kometa-Team/Kometa" "tarball"
diff --git a/install/loki-install.sh b/install/loki-install.sh
index a47a5c4e3..6066620a0 100644
--- a/install/loki-install.sh
+++ b/install/loki-install.sh
@@ -13,18 +13,19 @@ setting_up_container
network_check
update_os
-setup_deb822_repo \
- "grafana" \
- "https://apt.grafana.com/gpg.key" \
- "https://apt.grafana.com" \
- "stable" \
- "main"
+setup_deb_based() {
+ setup_deb822_repo \
+ "grafana" \
+ "https://apt.grafana.com/gpg.key" \
+ "https://apt.grafana.com" \
+ "stable" \
+ "main"
-msg_info "Installing Loki"
-$STD apt install -y loki
-mkdir -p /var/lib/loki/{chunks,boltdb-shipper-active,boltdb-shipper-cache}
-chown -R loki /var/lib/loki
-cat </etc/loki/config.yml
+ msg_info "Installing Loki"
+ $STD apt install -y loki
+ mkdir -p /var/lib/loki/{chunks,boltdb-shipper-active,boltdb-shipper-cache}
+ chown -R loki /var/lib/loki
+ cat </etc/loki/config.yml
auth_enabled: false
server:
@@ -66,9 +67,72 @@ limits_config:
ruler:
alertmanager_url: http://localhost:9093
EOF
-chown loki /etc/loki/config.yml
-systemctl enable -q --now loki
-msg_ok "Installed Loki"
+ chown loki /etc/loki/config.yml
+ systemctl enable -q --now loki
+ msg_ok "Installed Loki"
+}
+
+setup_alpine() {
+ msg_info "Installing Loki"
+ $STD apk add loki
+ $STD sed -i '/http_addr/s/127.0.0.1/0.0.0.0/g' /etc/conf.d/loki
+ mkdir -p /var/lib/loki/{chunks,boltdb-shipper-active,boltdb-shipper-cache}
+ chown -R loki:grafana /var/lib/loki
+ mkdir -p /var/log/loki
+ chown -R loki:grafana /var/log/loki
+ cat </etc/loki/loki-local-config.yaml
+auth_enabled: false
+
+server:
+ http_listen_port: 3100
+ log_level: info
+
+common:
+ instance_addr: 127.0.0.1
+ path_prefix: /var/lib/loki
+ storage:
+ filesystem:
+ chunks_directory: /var/lib/loki/chunks
+ rules_directory: /var/lib/loki/rules
+ replication_factor: 1
+ ring:
+ kvstore:
+ store: inmemory
+
+schema_config:
+ configs:
+ - from: 2020-10-24
+ store: tsdb
+ object_store: filesystem
+ schema: v13
+ index:
+ prefix: index_
+ period: 24h
+
+query_range:
+ results_cache:
+ cache:
+ embedded_cache:
+ enabled: true
+ max_size_mb: 100
+
+limits_config:
+ metric_aggregation_enabled: true
+
+ruler:
+ alertmanager_url: http://localhost:9093
+EOF
+ chown loki:grafana /etc/loki/loki-local-config.yaml
+ chmod 644 /etc/loki/loki-local-config.yaml
+ echo "output_log=\"\${output_log:-/var/log/loki/output.log}\"" >> /etc/init.d/loki
+ echo "error_log=\"\${error_log:-/var/log/loki/error.log}\"" >> /etc/init.d/loki
+ echo "start_stop_daemon_args=\"\${SSD_OPTS} -1 \${output_log} -2 \${error_log}\"" >> /etc/init.d/loki
+ $STD rc-update add loki default
+ $STD rc-service loki start
+ msg_ok "Installed Loki"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/mariadb-install.sh b/install/mariadb-install.sh
index 242611ebf..8a5d200fc 100644
--- a/install/mariadb-install.sh
+++ b/install/mariadb-install.sh
@@ -13,37 +13,87 @@ setting_up_container
network_check
update_os
-setup_mariadb
+setup_deb_based() {
+ setup_mariadb
-msg_info "Setup MariaDB"
-sed -i 's/^# *\(port *=.*\)/\1/' /etc/mysql/my.cnf
-sed -i 's/^bind-address/#bind-address/g' /etc/mysql/mariadb.conf.d/50-server.cnf
-msg_ok "Setup MariaDB"
+ msg_info "Setup MariaDB"
+ sed -i 's/^# *\(port *=.*\)/\1/' /etc/mysql/my.cnf
+ sed -i 's/^bind-address/#bind-address/g' /etc/mysql/mariadb.conf.d/50-server.cnf
+ msg_ok "Setup MariaDB"
-read -r -p "${TAB3}Would you like to add PhpMyAdmin? " prompt
-if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- msg_info "Installing phpMyAdmin"
- $STD apt install -y \
- apache2 \
- php \
- php-mysqli \
- php-mbstring \
- php-zip \
- php-gd \
- php-json \
- php-curl
+ read -r -p "${TAB3}Would you like to add PhpMyAdmin? " prompt
+ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
+ msg_info "Installing phpMyAdmin"
+ $STD apt install -y \
+ apache2 \
+ php \
+ php-mysqli \
+ php-mbstring \
+ php-zip \
+ php-gd \
+ php-json \
+ php-curl
- curl -fsSL "https://files.phpmyadmin.net/phpMyAdmin/5.2.2/phpMyAdmin-5.2.2-all-languages.tar.gz" -o "phpMyAdmin-5.2.2-all-languages.tar.gz"
- mkdir -p /var/www/html/phpMyAdmin
- tar xf phpMyAdmin-5.2.2-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpMyAdmin
- cp /var/www/html/phpMyAdmin/config.sample.inc.php /var/www/html/phpMyAdmin/config.inc.php
- SECRET=$(openssl rand -base64 24)
- sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" /var/www/html/phpMyAdmin/config.inc.php
- chmod 660 /var/www/html/phpMyAdmin/config.inc.php
- chown -R www-data:www-data /var/www/html/phpMyAdmin
- systemctl restart apache2
- msg_ok "Installed phpMyAdmin"
-fi
+ curl -fsSL "https://files.phpmyadmin.net/phpMyAdmin/5.2.2/phpMyAdmin-5.2.2-all-languages.tar.gz" -o "phpMyAdmin-5.2.2-all-languages.tar.gz"
+ mkdir -p /var/www/html/phpMyAdmin
+ tar xf phpMyAdmin-5.2.2-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpMyAdmin
+ cp /var/www/html/phpMyAdmin/config.sample.inc.php /var/www/html/phpMyAdmin/config.inc.php
+ SECRET=$(openssl rand -base64 24)
+ sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" /var/www/html/phpMyAdmin/config.inc.php
+ chmod 660 /var/www/html/phpMyAdmin/config.inc.php
+ chown -R www-data:www-data /var/www/html/phpMyAdmin
+ systemctl restart apache2
+ msg_ok "Installed phpMyAdmin"
+ fi
+}
+
+setup_alpine() {
+ msg_info "Installing MariaDB"
+ $STD apk add --no-cache mariadb mariadb-client
+ $STD rc-update add mariadb default
+ msg_ok "Installed MariaDB"
+
+ msg_info "Configuring MariaDB"
+ mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql >/dev/null 2>&1
+ $STD rc-service mariadb start
+ msg_ok "MariaDB Configured"
+
+ read -r -p "${TAB3}Would you like to install Adminer with lighttpd? : " prompt
+ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Adminer and dependencies"
+ $STD apk add --no-cache \
+ lighttpd \
+ lighttpd-openrc \
+ php83 \
+ php83-cgi \
+ php83-common \
+ php83-curl \
+ php83-gd \
+ php83-mbstring \
+ php83-mysqli \
+ php83-mysqlnd \
+ php83-openssl \
+ php83-zip \
+ php83-session \
+ jq
+
+ sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
+ sed -i 's|/usr/bin/php-cgi|/usr/bin/php-cgi83|g' /etc/lighttpd/mod_fastcgi.conf
+ mkdir -p /var/www/localhost/htdocs
+ ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
+ curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
+ chown lighttpd:lighttpd /var/www/localhost/htdocs/adminer.php
+ chmod 755 /var/www/localhost/htdocs/adminer.php
+ msg_ok "Adminer Installed"
+
+ msg_info "Starting Lighttpd"
+ $STD rc-update add lighttpd default
+ $STD rc-service lighttpd restart
+ msg_ok "Lighttpd Started"
+ fi
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/mealie-install.sh b/install/mealie-install.sh
index f29ea36b4..137b38622 100644
--- a/install/mealie-install.sh
+++ b/install/mealie-install.sh
@@ -48,6 +48,7 @@ $STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" "$SITE_SET
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" "$SITE_SETTINGS"
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
$STD yarn generate
+$STD yarn cache clean
msg_ok "Built Frontend"
msg_info "Copying Built Frontend"
diff --git a/install/networkoptimizer-install.sh b/install/networkoptimizer-install.sh
index 8f98c672e..88905f29a 100644
--- a/install/networkoptimizer-install.sh
+++ b/install/networkoptimizer-install.sh
@@ -42,11 +42,12 @@ $STD dotnet publish src/NetworkOptimizer.Web -c Release -r "$RID" --self-contain
chmod +x /opt/networkoptimizer/publish/NetworkOptimizer.Web
msg_ok "Built NetworkOptimizer"
-msg_info "Building Gateway Speed Test Binary"
+msg_info "Building Speed Test Binaries"
mkdir -p /opt/networkoptimizer/publish/tools
cd /opt/networkoptimizer/src/uwnspeedtest
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $STD go build -trimpath -ldflags "-s -w" -o /opt/networkoptimizer/publish/tools/uwnspeedtest-linux-arm64 .
-msg_ok "Built Gateway Speed Test Binary"
+[[ "$(arch_resolve)" != "arm64" ]] && CGO_ENABLED=0 GOOS=linux GOARCH="$(arch_resolve)" $STD go build -trimpath -ldflags "-s -w" -o "/opt/networkoptimizer/publish/tools/uwnspeedtest-linux-$(arch_resolve)" .
+msg_ok "Built Speed Test Binaries"
msg_info "Configuring NetworkOptimizer"
cat </opt/networkoptimizer/networkoptimizer.env
diff --git a/install/nocodb-install.sh b/install/nocodb-install.sh
deleted file mode 100644
index 7ac0a98ce..000000000
--- a/install/nocodb-install.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 tteck
-# Author: tteck (tteckster)
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://www.nocodb.com/ | Github: https://github.com/nocodb/nocodb
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-$(arch_resolve "x64" "arm64")"
-
-msg_info "Creating Service"
-cat </etc/systemd/system/nocodb.service
-[Unit]
-Description=nocodb
-
-[Service]
-Type=simple
-Restart=always
-User=root
-WorkingDirectory=/opt/nocodb
-ExecStart=/opt/nocodb/./nocodb
-
-[Install]
-WantedBy=multi-user.target
-EOF
-systemctl enable -q --now nocodb
-msg_ok "Created Service"
-
-motd_ssh
-customize
-cleanup_lxc
diff --git a/install/node-red-install.sh b/install/node-red-install.sh
index 5f8f25fe5..b9266d5ac 100644
--- a/install/node-red-install.sh
+++ b/install/node-red-install.sh
@@ -13,48 +13,99 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- git \
- ca-certificates
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ git \
+ ca-certificates
+ msg_ok "Installed Dependencies"
-NODE_VERSION="22" setup_nodejs
+ NODE_VERSION="22" setup_nodejs
-msg_info "Installing Node-Red"
-$STD npm install -g --unsafe-perm node-red
-echo "journalctl -f -n 100 -u nodered -o cat" >/usr/bin/node-red-log
-chmod +x /usr/bin/node-red-log
-echo "systemctl stop nodered" >/usr/bin/node-red-stop
-chmod +x /usr/bin/node-red-stop
-echo "systemctl start nodered" >/usr/bin/node-red-start
-chmod +x /usr/bin/node-red-start
-echo "systemctl restart nodered" >/usr/bin/node-red-restart
-chmod +x /usr/bin/node-red-restart
-msg_ok "Installed Node-Red"
+ msg_info "Installing Node-Red"
+ $STD npm install -g --unsafe-perm node-red
+ echo "journalctl -f -n 100 -u nodered -o cat" >/usr/bin/node-red-log
+ chmod +x /usr/bin/node-red-log
+ echo "systemctl stop nodered" >/usr/bin/node-red-stop
+ chmod +x /usr/bin/node-red-stop
+ echo "systemctl start nodered" >/usr/bin/node-red-start
+ chmod +x /usr/bin/node-red-start
+ echo "systemctl restart nodered" >/usr/bin/node-red-restart
+ chmod +x /usr/bin/node-red-restart
+ msg_ok "Installed Node-Red"
-msg_info "Creating Service"
-service_path="/etc/systemd/system/nodered.service"
-echo "[Unit]
-Description=Node-RED
-After=syslog.target network.target
+ msg_info "Creating Service"
+ service_path="/etc/systemd/system/nodered.service"
+ echo "[Unit]
+ Description=Node-RED
+ After=syslog.target network.target
-[Service]
-ExecStart=/usr/bin/node-red --max-old-space-size=128 -v
-Restart=on-failure
-KillSignal=SIGINT
+ [Service]
+ ExecStart=/usr/bin/node-red --max-old-space-size=128 -v
+ Restart=on-failure
+ KillSignal=SIGINT
-SyslogIdentifier=node-red
-StandardOutput=syslog
+ SyslogIdentifier=node-red
+ StandardOutput=syslog
-WorkingDirectory=/root/
-User=root
-Group=root
+ WorkingDirectory=/root/
+ User=root
+ Group=root
-[Install]
-WantedBy=multi-user.target" >$service_path
-systemctl enable -q --now nodered
-msg_ok "Created Service"
+ [Install]
+ WantedBy=multi-user.target" >$service_path
+ systemctl enable -q --now nodered
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add --no-cache \
+ git \
+ nodejs \
+ npm
+ msg_ok "Installed Dependencies"
+
+ msg_info "Creating Node-RED User"
+ adduser -D -H -s /sbin/nologin -G users nodered
+ msg_ok "Created Node-RED User"
+
+ msg_info "Installing Node-RED"
+ $STD npm install -g --unsafe-perm node-red
+ msg_ok "Installed Node-RED"
+
+ msg_info "Creating /home/nodered"
+ mkdir -p /home/nodered
+ chown -R nodered:users /home/nodered
+ chmod 750 /home/nodered
+ msg_ok "Created /home/nodered"
+
+ msg_info "Creating Node-RED Service"
+ service_path="/etc/init.d/nodered"
+
+ echo '#!/sbin/openrc-run
+ description="Node-RED Service"
+
+ command="/usr/local/bin/node-red"
+ command_args="--max-old-space-size=128 -v"
+ command_user="nodered"
+ pidfile="/var/run/nodered.pid"
+ command_background="yes"
+
+ depend() {
+ use net
+ }' >$service_path
+
+ chmod +x $service_path
+ msg_ok "Created Node-RED Service"
+
+ msg_info "Starting Node-RED"
+ $STD rc-update add nodered
+ $STD rc-service nodered start
+ msg_ok "Started Node-RED"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/ntfy-install.sh b/install/ntfy-install.sh
index dbbac4af6..18b55e0d2 100644
--- a/install/ntfy-install.sh
+++ b/install/ntfy-install.sh
@@ -13,15 +13,29 @@ setting_up_container
network_check
update_os
-msg_info "Setting up ntfy"
-setup_deb822_repo \
- "ntfy" \
- "https://archive.ntfy.sh/apt/keyring.gpg" \
- "https://archive.ntfy.sh/apt/" \
- "stable"
-$STD apt install -y ntfy
-systemctl enable -q --now ntfy
-msg_ok "Setup ntfy"
+setup_deb_based() {
+ msg_info "Setting up ntfy"
+ setup_deb822_repo \
+ "ntfy" \
+ "https://archive.ntfy.sh/apt/keyring.gpg" \
+ "https://archive.ntfy.sh/apt/" \
+ "stable"
+ $STD apt install -y ntfy
+ systemctl enable -q --now ntfy
+ msg_ok "Setup ntfy"
+}
+
+setup_alpine() {
+ msg_info "Installing ntfy"
+ $STD apk add --no-cache ntfy ntfy-openrc libcap
+ sed -i '/^listen-http/s/^\(.*\)$/#\1\n/' /etc/ntfy/server.yml
+ setcap 'cap_net_bind_service=+ep' /usr/bin/ntfy
+ $STD rc-update add ntfy default
+ $STD service ntfy start
+ msg_ok "Installed ntfy"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/ntopng-install.sh b/install/ntopng-install.sh
new file mode 100644
index 000000000..6538e004e
--- /dev/null
+++ b/install/ntopng-install.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://www.ntop.org/products/traffic-analysis/ntop/
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+fetch_and_deploy_from_url "https://packages.ntop.org/apt-stable/$(get_os_info codename)/all/apt-ntop-stable.deb" ""
+
+msg_info "Installing ntopng"
+$STD apt update
+$STD apt install -y ntopng
+msg_ok "Installed ntopng"
+
+msg_info "Configuring ntopng"
+cat </etc/ntopng/ntopng.conf
+-i=$(ip -4 route | awk '/default/ {print $5; exit}')
+-w=3000
+-d=/var/lib/ntopng
+--community
+EOF
+systemctl restart ntopng
+msg_ok "Configured ntopng"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/odoo-install.sh b/install/odoo-install.sh
index 8955a4baf..621084483 100644
--- a/install/odoo-install.sh
+++ b/install/odoo-install.sh
@@ -14,11 +14,13 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y python3-lxml wkhtmltopdf
+$STD apt install -y python3-lxml
curl -fsSL --proto '=https' "https://archive.ubuntu.com/ubuntu/pool/universe/l/lxml-html-clean/python3-lxml-html-clean_0.1.1-1_all.deb" -o /opt/python3-lxml-html-clean.deb
$STD dpkg -i /opt/python3-lxml-html-clean.deb
msg_ok "Installed Dependencies"
+fetch_and_deploy_gh_release "wkhtmltopdf" "wkhtmltopdf/packaging" "binary" "latest" "" "wkhtmltox_*.bookworm_$(arch_resolve).deb"
+
PG_VERSION="18" setup_postgresql
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
diff --git a/install/ownfoil-install.sh b/install/ownfoil-install.sh
index 6717cfbe4..202c1f174 100644
--- a/install/ownfoil-install.sh
+++ b/install/ownfoil-install.sh
@@ -18,7 +18,7 @@ $STD apt install -y git
msg_ok "Installed Dependencies"
setup_uv
-fetch_and_deploy_gh_release "ownfoil" "a1ex4/ownfoil" "tarball"
+fetch_and_deploy_gh_release "ownfoil" "a1ex4/ownfoil" "tarball" "2.3.0"
msg_info "Setting up Ownfoil"
cd /opt/ownfoil
diff --git a/install/patchmon-install.sh b/install/patchmon-install.sh
index 68bf8a82d..b3627274d 100644
--- a/install/patchmon-install.sh
+++ b/install/patchmon-install.sh
@@ -86,7 +86,13 @@ for arch in "${AGENT_NAME[@]}"; do
done
msg_ok "Fetched PatchMon agent binaries"
-fetch_and_deploy_gh_release "ssg-content" "ComplianceAsCode/content" "prebuild" "latest" "/opt/patchmon/ssg-content" "scap-security-guide-*.tar.gz"
+msg_info "Fetching SCAP Content"
+RELEASE=$(get_latest_github_release "ComplianceAsCode/content")
+curl_with_retry "https://github.com/ComplianceAsCode/content/releases/download/v${RELEASE}/scap-security-guide-${RELEASE}.tar.gz" "/tmp/ssg.tar.gz"
+mkdir -p /opt/patchmon/ssg-content
+tar -xzf /tmp/ssg.tar.gz -C /opt/patchmon/ssg-content --strip-components=1 --wildcards '*/ssg-*-ds.xml'
+rm -f /tmp/ssg.tar.gz
+msg_ok "Fetched SCAP Content"
msg_info "Creating service"
cat </etc/systemd/system/patchmon-server.service
diff --git a/install/postgresql-install.sh b/install/postgresql-install.sh
index bc4e094a3..d6b6cd11a 100644
--- a/install/postgresql-install.sh
+++ b/install/postgresql-install.sh
@@ -13,14 +13,15 @@ setting_up_container
network_check
update_os
-read -r -p "${TAB3}Enter PostgreSQL version (15/16/17/18): " ver
-[[ $ver =~ ^(15|16|17|18)$ ]] || {
- echo "Invalid version"
- exit 64
-}
-PG_VERSION=$ver setup_postgresql
+setup_deb_based() {
+ read -r -p "${TAB3}Enter PostgreSQL version (15/16/17/18): " ver
+ [[ $ver =~ ^(15|16|17|18)$ ]] || {
+ echo "Invalid version"
+ exit 64
+ }
+ PG_VERSION=$ver setup_postgresql
-cat </etc/postgresql/$ver/main/pg_hba.conf
+ cat </etc/postgresql/$ver/main/pg_hba.conf
# PostgreSQL Client Authentication Configuration File
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
@@ -39,7 +40,7 @@ host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
EOF
-cat </etc/postgresql/$ver/main/postgresql.conf
+ cat </etc/postgresql/$ver/main/postgresql.conf
# -----------------------------
# PostgreSQL configuration file
# -----------------------------
@@ -120,17 +121,79 @@ default_text_search_config = 'pg_catalog.english'
include_dir = 'conf.d'
EOF
-systemctl restart postgresql
-msg_ok "Installed PostgreSQL"
+ systemctl restart postgresql
+ msg_ok "Installed PostgreSQL"
-read -r -p "${TAB3}Would you like to add Adminer? " prompt
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- msg_info "Installing Adminer"
- $STD apt install -y adminer
- $STD a2enconf adminer
- systemctl reload apache2
- msg_ok "Installed Adminer"
-fi
+ read -r -p "${TAB3}Would you like to add Adminer? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Adminer"
+ $STD apt install -y adminer
+ $STD a2enconf adminer
+ systemctl reload apache2
+ msg_ok "Installed Adminer"
+ fi
+}
+
+setup_alpine() {
+ read -r -p "${TAB3}Enter PostgreSQL version (15/16/17): " ver
+ [[ $ver =~ ^(15|16|17)$ ]] || { echo "Invalid version"; exit 64; }
+
+ msg_info "Installing PostgreSQL ${ver}"
+ $STD apk add --no-cache postgresql${ver} postgresql${ver}-contrib postgresql${ver}-openrc sudo
+ msg_ok "Installed PostgreSQL ${ver}"
+
+ msg_info "Enabling PostgreSQL Service"
+ $STD rc-update add postgresql default
+ msg_ok "Enabled PostgreSQL Service"
+
+ msg_info "Starting PostgreSQL"
+ $STD rc-service postgresql start
+ msg_ok "Started PostgreSQL"
+
+ msg_info "Configuring PostgreSQL for External Access"
+ conf_file="/etc/postgresql${ver}/postgresql.conf"
+ hba_file="/etc/postgresql${ver}/pg_hba.conf"
+ sed -i 's/^#listen_addresses =.*/listen_addresses = '\''*'\''/' "$conf_file"
+ sed -i '/^host\s\+all\s\+all\s\+127.0.0.1\/32\s\+md5/ s/.*/host all all 0.0.0.0\/0 md5/' "$hba_file"
+ $STD rc-service postgresql restart
+ msg_ok "Configured and Restarted PostgreSQL"
+
+ read -r -p "${TAB3}Would you like to install Adminer with lighttpd? : " prompt
+ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Adminer and dependencies"
+ $STD apk add --no-cache \
+ lighttpd \
+ lighttpd-openrc \
+ php83 \
+ php83-cgi \
+ php83-common \
+ php83-curl \
+ php83-gd \
+ php83-mbstring \
+ php83-pdo \
+ php83-pgsql \
+ php83-openssl \
+ php83-zip \
+ php83-session \
+ jq
+
+ sed -i 's|# *include "mod_fastcgi.conf"|include "mod_fastcgi.conf"|' /etc/lighttpd/lighttpd.conf
+ sed -i 's|/usr/bin/php-cgi|/usr/bin/php-cgi83|g' /etc/lighttpd/mod_fastcgi.conf
+ mkdir -p /var/www/localhost/htdocs
+ ADMINER_VERSION=$(curl -fsSL https://api.github.com/repos/vrana/adminer/releases/latest | jq -r '.tag_name' | sed 's/^v//')
+ curl -fsSL "https://github.com/vrana/adminer/releases/download/v${ADMINER_VERSION}/adminer-${ADMINER_VERSION}.php" -o /var/www/localhost/htdocs/adminer.php
+ chown lighttpd:lighttpd /var/www/localhost/htdocs/adminer.php
+ chmod 755 /var/www/localhost/htdocs/adminer.php
+ msg_ok "Adminer Installed"
+
+ msg_info "Starting Lighttpd"
+ $STD rc-update add lighttpd default
+ $STD rc-service lighttpd restart
+ msg_ok "Lighttpd Started"
+ fi
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/prometheus-install.sh b/install/prometheus-install.sh
index 3dee5990c..95ff2b694 100644
--- a/install/prometheus-install.sh
+++ b/install/prometheus-install.sh
@@ -13,16 +13,17 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "prometheus" "prometheus/prometheus" "prebuild" "latest" "/usr/local/bin" "*linux-$(arch_resolve).tar.gz"
+setup_deb_based() {
+ fetch_and_deploy_gh_release "prometheus" "prometheus/prometheus" "prebuild" "latest" "/usr/local/bin" "*linux-$(arch_resolve).tar.gz"
-msg_info "Installing Prometheus"
-mkdir -p /etc/prometheus
-mkdir -p /var/lib/prometheus
-mv /usr/local/bin/prometheus.yml /etc/prometheus/prometheus.yml
-msg_ok "Installed Prometheus"
+ msg_info "Installing Prometheus"
+ mkdir -p /etc/prometheus
+ mkdir -p /var/lib/prometheus
+ mv /usr/local/bin/prometheus.yml /etc/prometheus/prometheus.yml
+ msg_ok "Installed Prometheus"
-msg_info "Creating Service"
-cat <<'EOF' >/etc/systemd/system/prometheus.service
+ msg_info "Creating Service"
+ cat <<'EOF' >/etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
@@ -41,8 +42,25 @@ ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now prometheus
-msg_ok "Created Service"
+ systemctl enable -q --now prometheus
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Prometheus"
+ $STD apk add --no-cache prometheus
+ msg_ok "Installed Prometheus"
+
+ msg_info "Enabling Prometheus Service"
+ $STD rc-update add prometheus default
+ msg_ok "Enabled Prometheus Service"
+
+ msg_info "Starting Prometheus"
+ $STD service prometheus start
+ msg_ok "Started Prometheus"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/rclone-install.sh b/install/rclone-install.sh
index af3305a4c..a845760b5 100644
--- a/install/rclone-install.sh
+++ b/install/rclone-install.sh
@@ -13,25 +13,26 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y apache2-utils fuse3
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y apache2-utils fuse3
+ msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-$(arch_resolve).zip"
+ fetch_and_deploy_gh_release "rclone" "rclone/rclone" "prebuild" "latest" "/opt/rclone" "rclone*linux-$(arch_resolve).zip"
-msg_info "Installing rclone"
-cd /opt/rclone
-RCLONE_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
-$STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD"
-cat <~/rclone.creds
+ msg_info "Installing rclone"
+ cd /opt/rclone
+ RCLONE_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+ $STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD"
+ cat <~/rclone.creds
rclone-Credentials
rclone User Name: admin
rclone Password: $RCLONE_PASSWORD
EOF
-msg_ok "Installed rclone"
+ msg_ok "Installed rclone"
-msg_info "Creating Service"
-cat </etc/systemd/system/rclone-web.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/rclone-web.service
[Unit]
Description=Rclone Web GUI
After=network-online.target
@@ -46,8 +47,60 @@ Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now rclone-web
-msg_ok "Created Service"
+ systemctl enable -q --now rclone-web
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing dependencies"
+ $STD apk add --no-cache \
+ apache2-utils fuse3
+ msg_ok "Installed dependencies"
+
+ msg_info "Installing rclone"
+ temp_file=$(mktemp)
+ mkdir -p /opt/rclone
+ RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclone-v${RELEASE}-linux-$(arch_resolve).zip" -o "$temp_file"
+ $STD unzip -j "$temp_file" '*/**' -d /opt/rclone
+ cd /opt/rclone
+ RCLONE_PASSWORD=$(head -c 16 /dev/urandom | xxd -p -c 16)
+ $STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD"
+ cat <~/rclone.creds
+rclone-Credentials
+rclone User Name: admin
+rclone Password: $RCLONE_PASSWORD
+EOF
+ echo "${RELEASE}" >/opt/rclone_version.txt
+ rm -f "$temp_file"
+ msg_ok "Installed rclone"
+
+ msg_info "Enabling rclone Service"
+ cat </etc/init.d/rclone
+#!/sbin/openrc-run
+description="rclone Service"
+command="/opt/rclone/rclone"
+command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/login.pwd"
+command_background="true"
+command_user="root"
+pidfile="/var/run/rclone.pid"
+
+depend() {
+ use net
+}
+EOF
+ chmod +x /etc/init.d/rclone
+ $STD rc-update add rclone default
+ msg_ok "Enabled rclone Service"
+
+ msg_info "Starting rclone"
+ $STD service rclone start
+ msg_ok "Started rclone"
+
+ rm -rf "$temp_file"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/redis-install.sh b/install/redis-install.sh
index 09b02db67..0ba452994 100644
--- a/install/redis-install.sh
+++ b/install/redis-install.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 tteck
-# Author: tteck (tteckster)
+# Author: tteck (tteckster) | MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://redis.io/
@@ -13,23 +13,36 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y apt-transport-https
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y apt-transport-https
+ msg_ok "Installed Dependencies"
-msg_info "Setting up Redis Repository"
-setup_deb822_repo \
- "redis" \
- "https://packages.redis.io/gpg" \
- "https://packages.redis.io/deb" \
- "trixie"
-msg_ok "Setup Redis Repository"
+ msg_info "Setting up Redis Repository"
+ setup_deb822_repo \
+ "redis" \
+ "https://packages.redis.io/gpg" \
+ "https://packages.redis.io/deb" \
+ "trixie"
+ msg_ok "Setup Redis Repository"
-msg_info "Setting up Redis"
-$STD apt install -y redis
-sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis/redis.conf
-systemctl enable -q --now redis-server
-msg_ok "Setup Redis"
+ msg_info "Setting up Redis"
+ $STD apt install -y redis
+ sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis/redis.conf
+ systemctl enable -q --now redis-server
+ msg_ok "Setup Redis"
+}
+
+setup_alpine() {
+ msg_info "Installing Redis"
+ $STD apk add redis
+ $STD sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf
+ $STD rc-update add redis default
+ $STD rc-service redis start
+ msg_ok "Installed Redis"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/romm-install.sh b/install/romm-install.sh
index a9ba78ccd..a9f46eec1 100644
--- a/install/romm-install.sh
+++ b/install/romm-install.sh
@@ -42,16 +42,40 @@ $STD apt install -y \
tzdata
msg_ok "Installed Dependencies"
-msg_info "Installing Angie with mod_zip module"
+msg_info "Installing Angie with mod_zip and njs modules"
setup_deb822_repo \
"angie" \
"https://angie.software/keys/angie-signing.gpg" \
"https://download.angie.software/angie/debian/$(get_os_info version_id)" \
"$(get_os_info codename)" \
"main"
-$STD apt-get install -y angie angie-module-zip
-sed -i '1i load_module modules/ngx_http_zip_module.so;' /etc/angie/angie.conf
-msg_ok "Installed Angie with mod_zip module"
+$STD apt-get install -y angie angie-module-zip angie-module-njs
+sed -i '1i load_module modules/ngx_http_zip_module.so;\nload_module modules/ngx_http_js_module.so;' /etc/angie/angie.conf
+mkdir -p /etc/angie/js
+cat <<'EOF' >/etc/angie/js/decode.js
+// Decode a Base64 encoded string received as a query parameter named 'value',
+// and return the decoded value in the response body.
+function decodeBase64(r) {
+ var encodedValue = r.args.value;
+
+ if (!encodedValue) {
+ r.return(400, "Missing 'value' query parameter");
+ return;
+ }
+
+ try {
+ // Use Buffer to return raw bytes β atob() returns a JS string which r.return()
+ // would re-encode as UTF-8, corrupting any non-ASCII bytes (e.g. in filenames
+ // like "PokΓ©mon") and causing CRC mismatches in the mod_zip manifest.
+ r.return(200, Buffer.from(encodedValue, 'base64'));
+ } catch (e) {
+ r.return(400, "Invalid Base64 encoding");
+ }
+}
+
+export default { decodeBase64 };
+EOF
+msg_ok "Installed Angie with mod_zip and njs modules"
PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="24" setup_nodejs
setup_mariadb
@@ -63,7 +87,8 @@ mkdir -p /opt/romm \
/var/lib/romm/resources \
/var/lib/romm/assets/{saves,states,screenshots} \
/var/lib/romm/library/roms \
- /var/lib/romm/library/bios
+ /var/lib/romm/library/bios \
+ /var/lib/romm/cache
msg_ok "Created directories"
msg_info "Creating configuration file"
@@ -136,8 +161,6 @@ else
fi
fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball"
-fetch_and_deploy_gh_release "ruffle" "ruffle-rs/ruffle" "prebuild" "latest" "/opt/romm/frontend/dist/assets/ruffle" "ruffle-*-web-selfhosted.zip"
-fetch_and_deploy_gh_release "EmulatorJS" "EmulatorJS/EmulatorJS" "prebuild" "v4.2.3" "/opt/romm/frontend/dist/assets/emulatorjs" "4.2.3.7z"
msg_info "Creating environment file"
sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf
@@ -214,8 +237,13 @@ ln -sfn "$ROMM_BASE"/resources /opt/romm/frontend/dist/assets/romm/resources
ln -sfn "$ROMM_BASE"/assets /opt/romm/frontend/dist/assets/romm/assets
msg_ok "Set up RomM Frontend"
+fetch_and_deploy_gh_release "ruffle" "ruffle-rs/ruffle" "prebuild" "latest" "/opt/romm/frontend/dist/assets/ruffle" "ruffle-*-web-selfhosted.zip"
+fetch_and_deploy_gh_release "EmulatorJS" "EmulatorJS/EmulatorJS" "prebuild" "v4.2.3" "/opt/romm/frontend/dist/assets/emulatorjs" "4.2.3.7z"
+
msg_info "Configuring Angie"
cat <<'EOF' >/etc/angie/http.d/romm.conf
+js_import /etc/angie/js/decode.js;
+
upstream romm_backend {
server 127.0.0.1:5000;
}
@@ -282,10 +310,24 @@ server {
internal;
alias /var/lib/romm/library/;
}
+
+ # Internally redirect cached zip file requests (Range-resumable downloads)
+ location /cache/ {
+ internal;
+ alias /var/lib/romm/cache/;
+ }
+
+ # Internal decoding endpoint, used by mod_zip to decode base64-encoded
+ # multi-file manifest entries (e.g. the generated .m3u for multi-disc games)
+ location /decode {
+ internal;
+ js_content decode.decodeBase64;
+ }
}
EOF
-sed -i "s|alias /var/lib/romm/library/;|alias ${ROMM_BASE}/library/;|" /etc/angie/http.d/romm.conf
+sed -i -e "s|alias /var/lib/romm/library/;|alias ${ROMM_BASE}/library/;|" \
+ -e "s|alias /var/lib/romm/cache/;|alias ${ROMM_BASE}/cache/;|" /etc/angie/http.d/romm.conf
rm -f /etc/angie/http.d/default.conf
systemctl restart angie
systemctl enable -q --now angie
diff --git a/install/rustdeskserver-install.sh b/install/rustdeskserver-install.sh
index 56b301cf6..11b9d5cf8 100644
--- a/install/rustdeskserver-install.sh
+++ b/install/rustdeskserver-install.sh
@@ -13,13 +13,122 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*$(arch_resolve).deb"
-fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*$(arch_resolve).deb"
-fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*$(arch_resolve).deb"
-fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*$(arch_resolve).deb"
-systemctl enable -q --now rustdesk-hbbr
-systemctl enable -q --now rustdesk-hbbs
-systemctl enable -q --now rustdesk-api
+setup_deb_based() {
+ fetch_and_deploy_gh_release "rustdesk-hbbr" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*$(arch_resolve).deb"
+ fetch_and_deploy_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*$(arch_resolve).deb"
+ fetch_and_deploy_gh_release "rustdesk-utils" "lejianwen/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*$(arch_resolve).deb"
+ fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*$(arch_resolve).deb"
+ systemctl enable -q --now rustdesk-hbbr
+ systemctl enable -q --now rustdesk-hbbs
+ systemctl enable -q --now rustdesk-api
+}
+
+setup_alpine() {
+ RELEASE=$(curl -s https://api.github.com/repos/lejianwen/rustdesk-server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ msg_info "Installing RustDesk Server v${RELEASE}"
+ temp_file1=$(mktemp)
+ ARCH=$(arch_resolve "amd64" "arm64v8")
+ curl -fsSL "https://github.com/lejianwen/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-linux-${ARCH}.zip" -o "$temp_file1"
+ $STD unzip "$temp_file1"
+ mv "$ARCH" /opt/rustdesk-server
+ mkdir -p /root/.config/rustdesk
+ cd /opt/rustdesk-server
+ ./rustdesk-utils genkeypair >/tmp/rustdesk_keys.txt
+ grep "Public Key" /tmp/rustdesk_keys.txt | awk '{print $3}' >/root/.config/rustdesk/id_ed25519.pub
+ grep "Secret Key" /tmp/rustdesk_keys.txt | awk '{print $3}' >/root/.config/rustdesk/id_ed25519
+ chmod 600 /root/.config/rustdesk/id_ed25519
+ chmod 644 /root/.config/rustdesk/id_ed25519.pub
+ rm /tmp/rustdesk_keys.txt
+ echo "${RELEASE}" >~/.rustdesk-server
+ msg_ok "Installed RustDesk Server v${RELEASE}"
+
+ APIRELEASE=$(curl -s https://api.github.com/repos/lejianwen/rustdesk-api/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ msg_info "Installing RustDesk API v${APIRELEASE}"
+ temp_file2=$(mktemp)
+ curl -fsSL "https://github.com/lejianwen/rustdesk-api/releases/download/v${APIRELEASE}/linux-$(arch_resolve).tar.gz" -o "$temp_file2"
+ $STD tar zxvf "$temp_file2"
+ mv release /opt/rustdesk-api
+ cd /opt/rustdesk-api
+ ADMINPASS=$(head -c 16 /dev/urandom | xxd -p -c 16)
+ $STD ./apimain reset-admin-pwd "$ADMINPASS"
+ cat <~/rustdesk.creds
+RustDesk WebUI
+
+Username: admin
+Password: $ADMINPASS
+EOF
+ echo "${APIRELEASE}" >~/.rustdesk-api
+ msg_ok "Installed RustDesk API v${APIRELEASE}"
+
+ msg_info "Enabling RustDesk Server Services"
+ cat </etc/init.d/rustdesk-server-hbbs
+#!/sbin/openrc-run
+description="RustDesk HBBS Service"
+directory="/opt/rustdesk-server"
+command="/opt/rustdesk-server/hbbs"
+command_args=""
+command_background="true"
+command_user="root"
+pidfile="/var/run/rustdesk-server-hbbs.pid"
+output_log="/var/log/rustdesk-hbbs.log"
+error_log="/var/log/rustdesk-hbbs.err"
+
+depend() {
+ use net
+}
+EOF
+
+ cat </etc/init.d/rustdesk-server-hbbr
+#!/sbin/openrc-run
+description="RustDesk HBBR Service"
+directory="/opt/rustdesk-server"
+command="/opt/rustdesk-server/hbbr"
+command_args=""
+command_background="true"
+command_user="root"
+pidfile="/var/run/rustdesk-server-hbbr.pid"
+output_log="/var/log/rustdesk-hbbr.log"
+error_log="/var/log/rustdesk-hbbr.err"
+
+depend() {
+ use net
+}
+EOF
+
+ cat </etc/init.d/rustdesk-api
+#!/sbin/openrc-run
+description="RustDesk API Service"
+directory="/opt/rustdesk-api"
+command="/opt/rustdesk-api/apimain"
+command_args=""
+command_background="true"
+command_user="root"
+pidfile="/var/run/rustdesk-api.pid"
+output_log="/var/log/rustdesk-api.log"
+error_log="/var/log/rustdesk-api.err"
+
+depend() {
+ use net
+}
+EOF
+ chmod +x /etc/init.d/rustdesk-server-hbbs
+ chmod +x /etc/init.d/rustdesk-server-hbbr
+ chmod +x /etc/init.d/rustdesk-api
+ $STD rc-update add rustdesk-server-hbbs default
+ $STD rc-update add rustdesk-server-hbbr default
+ $STD rc-update add rustdesk-api default
+ msg_ok "Enabled RustDesk Server Services"
+
+ msg_info "Starting RustDesk Server"
+ $STD service rustdesk-server-hbbs start
+ $STD service rustdesk-server-hbbr start
+ $STD service rustdesk-api start
+ msg_ok "Started RustDesk Server"
+
+ rm -f "$temp_file1" "$temp_file2"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/rustypaste-install.sh b/install/rustypaste-install.sh
index 67c495058..6d6def0fc 100644
--- a/install/rustypaste-install.sh
+++ b/install/rustypaste-install.sh
@@ -13,16 +13,17 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
-fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
+setup_deb_based() {
+ fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
+ fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
-msg_info "Setting up RustyPaste"
-cd /opt/rustypaste
-sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' config.toml
-msg_ok "Set up RustyPaste"
+ msg_info "Setting up RustyPaste"
+ cd /opt/rustypaste
+ sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' config.toml
+ msg_ok "Set up RustyPaste"
-msg_info "Creating Service"
-cat </etc/systemd/system/rustypaste.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/rustypaste.service
[Unit]
Description=rustypaste Service
After=network.target
@@ -35,8 +36,50 @@ Restart=always
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now rustypaste
-msg_ok "Created Service"
+ systemctl enable -q --now rustypaste
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing RustyPaste"
+ $STD apk add --no-cache rustypaste --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
+ msg_ok "Installed RustyPaste"
+
+ msg_info "Configuring RustyPaste"
+ mkdir -p /var/lib/rustypaste
+ sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' /etc/rustypaste/config.toml
+ msg_ok "Configured RustyPaste"
+
+ msg_info "Creating Service"
+ cat <<'EOF' >/etc/init.d/rustypaste
+#!/sbin/openrc-run
+
+name="rustypaste"
+description="RustyPaste - A minimal file upload/pastebin service"
+command="/usr/bin/rustypaste"
+command_args=""
+command_user="root"
+command_background=true
+pidfile="/run/${RC_SVCNAME}.pid"
+directory="/var/lib/rustypaste"
+
+depend() {
+ need net
+ after firewall
+}
+
+start_pre() {
+ export CONFIG=/etc/rustypaste/config.toml
+ checkpath --directory --owner root:root --mode 0755 /var/lib/rustypaste
+}
+EOF
+ chmod +x /etc/init.d/rustypaste
+ $STD rc-update add rustypaste default
+ $STD rc-service rustypaste start
+ msg_ok "Created Service"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/securo-install.sh b/install/securo-install.sh
new file mode 100644
index 000000000..f24ae935b
--- /dev/null
+++ b/install/securo-install.sh
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/securo-finance/securo
+
+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 \
+ redis-server \
+ build-essential
+systemctl enable -q --now redis-server
+msg_ok "Installed Dependencies"
+
+PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
+PG_DB_NAME="securo" PG_DB_USER="securo" PG_DB_EXTENSIONS="vector" setup_postgresql_db
+NODE_VERSION="22" setup_nodejs
+UV_PYTHON="3.12" setup_uv
+
+fetch_and_deploy_gh_release "securo" "securo-finance/securo" "tarball"
+
+msg_info "Setting up Backend"
+cd /opt/securo/backend
+$STD uv venv --python 3.12 /opt/securo/backend/.venv
+$STD uv pip install --python /opt/securo/backend/.venv -e .
+msg_ok "Set up Backend"
+
+msg_info "Configuring Securo"
+mkdir -p /opt/securo_data
+SECRET_KEY=$(openssl rand -hex 32)
+cat </opt/securo_data/.env
+DATABASE_URL=postgresql+asyncpg://securo:${PG_DB_PASS}@127.0.0.1:5432/securo
+REDIS_URL=redis://127.0.0.1:6379/0
+SECRET_KEY=${SECRET_KEY}
+DEBUG=false
+FRONTEND_URL=https://${LOCAL_IP}
+EOF
+ln -sf /opt/securo_data/.env /opt/securo/backend/.env
+set -a
+source /opt/securo_data/.env
+set +a
+$STD /opt/securo/backend/.venv/bin/alembic upgrade head
+msg_ok "Configured Securo"
+
+msg_info "Building Frontend (Patience)"
+cd /opt/securo/frontend
+export NODE_OPTIONS="--max-old-space-size=4096"
+$STD npm install
+$STD npm run build
+msg_ok "Built Frontend"
+
+msg_info "Generating Self-Signed Certificate"
+create_self_signed_cert "securo"
+msg_ok "Generated Self-Signed Certificate"
+
+msg_info "Creating Services"
+cat </etc/systemd/system/securo.service
+[Unit]
+Description=Securo Backend (FastAPI)
+After=network-online.target postgresql.service redis-server.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/securo/backend
+EnvironmentFile=/opt/securo_data/.env
+ExecStart=/opt/securo/backend/.venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000
+Restart=always
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/securo-worker.service
+[Unit]
+Description=Securo Celery Worker
+After=network-online.target postgresql.service redis-server.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/securo/backend
+EnvironmentFile=/opt/securo_data/.env
+ExecStart=/opt/securo/backend/.venv/bin/celery -A app.worker worker --loglevel=info --concurrency=2
+Restart=always
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/securo-beat.service
+[Unit]
+Description=Securo Celery Beat
+After=network-online.target postgresql.service redis-server.service
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/securo/backend
+EnvironmentFile=/opt/securo_data/.env
+ExecStart=/opt/securo/backend/.venv/bin/celery -A app.worker beat --loglevel=info
+Restart=always
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now securo securo-worker securo-beat
+msg_ok "Created Services"
+
+msg_info "Configuring Nginx"
+cat <<'EOF' >/etc/nginx/sites-available/securo.conf
+server {
+ listen 80 default_server;
+ server_name _;
+ return 301 https://$host$request_uri;
+}
+
+server {
+ listen 443 ssl default_server;
+ http2 on;
+ server_name _;
+
+ ssl_certificate /etc/ssl/securo/securo.crt;
+ ssl_certificate_key /etc/ssl/securo/securo.key;
+
+ client_max_body_size 25m;
+
+ root /opt/securo/frontend/dist;
+ index index.html;
+
+ location /api/ {
+ proxy_pass http://127.0.0.1:8000;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+}
+EOF
+nginx_enable_site securo.conf
+msg_ok "Configured Nginx"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/shelfmark-install.sh b/install/shelfmark-install.sh
index c477caca3..308f97946 100644
--- a/install/shelfmark-install.sh
+++ b/install/shelfmark-install.sh
@@ -116,6 +116,7 @@ else
chromium-common \
chromium \
python3-tk
+ sed -i '/DOCKERMODE=/s/false/true/' /etc/shelfmark/.env
msg_ok "Installed internal bypasser dependencies"
fi
@@ -165,22 +166,6 @@ KillMode=mixed
WantedBy=multi-user.target
EOF
-if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then
- cat </etc/systemd/system/chromium.service
-[Unit]
-Description=Chromium Headless Browser
-After=network.target
-
-[Service]
-User=root
-ExecStart=/usr/bin/chromium --headless --no-sandbox --disable-gpu --disable-dev-shm-usage --remote-debugging-address=127.0.0.1 --remote-debugging-port=9222 --hide-scrollbars
-Restart=always
-
-[Install]
-WantedBy=multi-user.target
-EOF
- systemctl enable -q --now chromium
-fi
if [[ "$DEPLOYMENT_TYPE" == "2" ]]; then
cat </etc/systemd/system/flaresolverr.service
[Unit]
diff --git a/install/swizzin-install.sh b/install/swizzin-install.sh
deleted file mode 100644
index 85804f80c..000000000
--- a/install/swizzin-install.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (c) 2021-2026 community-scripts ORG
-# Author: EEJoshua
-# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
-# Source: https://swizzin.ltd/
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-msg_warn "WARNING: This script will run an external installer from a third-party source (https://swizzin.ltd/)."
-msg_warn "The following code is NOT maintained or audited by our repository."
-msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:"
-msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "β https://s5n.sh"
-echo
-read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM
-if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
- msg_error "Aborted by user. No changes have been made."
- exit 10
-fi
-bash <(curl -fsSL https://s5n.sh)
-
-motd_ssh
-customize
-cleanup_lxc
diff --git a/install/syncthing-install.sh b/install/syncthing-install.sh
index f4a347e52..332f6e368 100644
--- a/install/syncthing-install.sh
+++ b/install/syncthing-install.sh
@@ -13,20 +13,42 @@ setting_up_container
network_check
update_os
-setup_deb822_repo \
- "syncthing" \
- "https://syncthing.net/release-key.gpg" \
- "https://apt.syncthing.net/" \
- "syncthing" \
- "stable-v2"
+setup_deb_based() {
+ setup_deb822_repo \
+ "syncthing" \
+ "https://syncthing.net/release-key.gpg" \
+ "https://apt.syncthing.net/" \
+ "syncthing" \
+ "stable-v2"
-msg_info "Setting up Syncthing"
-$STD apt install -y syncthing
-systemctl enable -q --now syncthing@root
-sleep 5
-sed -i "{s/127.0.0.1:8384/0.0.0.0:8384/g}" /root/.local/state/syncthing/config.xml
-systemctl restart syncthing@root
-msg_ok "Setup Syncthing"
+ msg_info "Setting up Syncthing"
+ $STD apt install -y syncthing
+ systemctl enable -q --now syncthing@root
+ sleep 5
+ sed -i "{s/127.0.0.1:8384/0.0.0.0:8384/g}" /root/.local/state/syncthing/config.xml
+ systemctl restart syncthing@root
+ msg_ok "Setup Syncthing"
+}
+
+setup_alpine() {
+ msg_info "Setup Syncthing"
+ $STD apk add --no-cache syncthing
+ rc-service syncthing start
+ sleep 3
+ rc-service syncthing stop
+ sed -i "{s/127.0.0.1:8384/0.0.0.0:8384/g}" /var/lib/syncthing/.local/state/syncthing/config.xml
+ msg_ok "Setup Syncthing"
+
+ msg_info "Enabling Syncthing Service"
+ $STD rc-update add syncthing default
+ msg_ok "Enabled Syncthing Service"
+
+ msg_info "Starting Syncthing"
+ $STD rc-service syncthing start
+ msg_ok "Started Syncthing"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/teamspeak-server-install.sh b/install/teamspeak-server-install.sh
index 110b4f3c5..31a5d691d 100644
--- a/install/teamspeak-server-install.sh
+++ b/install/teamspeak-server-install.sh
@@ -13,19 +13,20 @@ setting_up_container
network_check
update_os
-RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | grep -oP 'teamspeak3-server_linux_amd64-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
+setup_deb_based() {
+ RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | grep -oP 'teamspeak3-server_linux_amd64-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
-msg_info "Setting up Teamspeak Server"
-curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
-tar -xf ./ts3server.tar.bz2
-mv teamspeak3-server_linux_amd64/ /opt/teamspeak-server/
-touch /opt/teamspeak-server/.ts3server_license_accepted
-rm -f ~/ts3server.tar.bz*
-echo "${RELEASE}" >~/.teamspeak-server
-msg_ok "Setup Teamspeak Server"
+ msg_info "Setting up Teamspeak Server"
+ curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
+ tar -xf ./ts3server.tar.bz2
+ mv teamspeak3-server_linux_amd64/ /opt/teamspeak-server/
+ touch /opt/teamspeak-server/.ts3server_license_accepted
+ rm -f ~/ts3server.tar.bz*
+ echo "${RELEASE}" >~/.teamspeak-server
+ msg_ok "Setup Teamspeak Server"
-msg_info "Creating service"
-cat </etc/systemd/system/teamspeak-server.service
+ msg_info "Creating service"
+ cat </etc/systemd/system/teamspeak-server.service
[Unit]
Description=TeamSpeak3 Server
Wants=network-online.target
@@ -44,8 +45,61 @@ RestartSec=15
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now teamspeak-server
-msg_ok "Created service"
+ systemctl enable -q --now teamspeak-server
+ msg_ok "Created service"
+}
+
+setup_alpine() {
+ msg_info "Installing dependencies"
+ $STD apk add --no-cache \
+ ca-certificates \
+ libstdc++ \
+ libc6-compat
+ msg_ok "Installed dependencies"
+
+ RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | awk 'NR==1')
+ msg_info "Installing Teamspeak Server v${RELEASE}"
+ mkdir -p /opt/teamspeak-server
+ cd /opt/teamspeak-server
+ curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2
+ tar xf ts3server.tar.bz2 --strip-components=1
+ mkdir -p logs data lib
+ mv *.so lib
+ touch data/ts3server.sqlitedb data/query_ip_blacklist.txt data/query_ip_whitelist.txt .ts3server_license_accepted
+ echo "${RELEASE}" >~/.teamspeak-server
+ msg_ok "Installed TeamSpeak Server v${RELEASE}"
+
+ msg_info "Enabling TeamSpeak Server Service"
+ cat </etc/init.d/teamspeak
+#!/sbin/openrc-run
+
+name="TeamSpeak Server"
+description="TeamSpeak 3 Server"
+command="/opt/teamspeak-server/ts3server_startscript.sh"
+command_args="start"
+output_log="/var/log/teamspeak.out.log"
+error_log="/var/log/teamspeak.err.log"
+command_background=true
+pidfile="/run/teamspeak-server.pid"
+directory="/opt/teamspeak-server"
+
+depend() {
+ need net
+ use dns
+}
+EOF
+ chmod +x /etc/init.d/teamspeak
+ $STD rc-update add teamspeak default
+ msg_ok "Enabled TeamSpeak Server Service"
+
+ msg_info "Starting TeamSpeak Server"
+ $STD service teamspeak start
+ msg_ok "Started TeamSpeak Server"
+
+ rm -r ts3server.tar.bz* LICENSE* CHANGELOG doc serverquerydocs tsdns redist
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/teslamate-install.sh b/install/teslamate-install.sh
index 6a7e4b84d..bc5f221e0 100644
--- a/install/teslamate-install.sh
+++ b/install/teslamate-install.sh
@@ -19,7 +19,6 @@ $STD apt install -y \
erlang \
erlang-dev \
erlang-syntax-tools \
- elixir \
mosquitto \
locales
sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen
@@ -27,6 +26,11 @@ $STD locale-gen
systemctl enable -q --now mosquitto
msg_ok "Installed Dependencies"
+fetch_and_deploy_gh_release "elixir" "elixir-lang/elixir" "prebuild" "latest" "/opt/elixir" "elixir-otp-27.zip"
+for bin in elixir elixirc iex mix; do
+ ln -sf "/opt/elixir/bin/$bin" "/usr/local/bin/$bin"
+done
+
PG_VERSION="17" setup_postgresql
PG_DB_NAME="teslamate" PG_DB_USER="teslamate" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
NODE_VERSION="22" setup_nodejs
diff --git a/install/tinyauth-install.sh b/install/tinyauth-install.sh
index 85db46eb7..7ec13281a 100644
--- a/install/tinyauth-install.sh
+++ b/install/tinyauth-install.sh
@@ -13,33 +13,34 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- openssl \
- apache2-utils
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ openssl \
+ apache2-utils
+ msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "tinyauth" "steveiliop56/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-$(arch_resolve)"
+ fetch_and_deploy_gh_release "tinyauth" "steveiliop56/tinyauth" "singlefile" "latest" "/opt/tinyauth" "tinyauth-$(arch_resolve)"
-msg_info "Setting up Tinyauth"
-PASS=$(openssl rand -base64 8 | tr -dc 'a-zA-Z0-9' | head -c 8)
-USER=$(htpasswd -Bbn "tinyauth" "${PASS}")
-cat </opt/tinyauth/credentials.txt
+ msg_info "Setting up Tinyauth"
+ PASS=$(openssl rand -base64 8 | tr -dc 'a-zA-Z0-9' | head -c 8)
+ USER=$(htpasswd -Bbn "tinyauth" "${PASS}")
+ cat </opt/tinyauth/credentials.txt
Tinyauth Credentials
Username: tinyauth
Password: ${PASS}
EOF
-msg_ok "Set up Tinyauth"
+ msg_ok "Set up Tinyauth"
-read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url
+ read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url
-msg_info "Creating Service"
-cat </opt/tinyauth/.env
+ msg_info "Creating Service"
+ cat </opt/tinyauth/.env
TINYAUTH_DATABASE_PATH=/opt/tinyauth/database.db
TINYAUTH_AUTH_USERS='${USER}'
TINYAUTH_APPURL=${app_url}
EOF
-cat </etc/systemd/system/tinyauth.service
+ cat </etc/systemd/system/tinyauth.service
[Unit]
Description=Tinyauth Service
After=network.target
@@ -54,8 +55,69 @@ Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now tinyauth
-msg_ok "Created Service"
+ systemctl enable -q --now tinyauth
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add --no-cache openssl apache2-utils
+ msg_ok "Installed Dependencies"
+
+ msg_info "Installing Tinyauth"
+ mkdir -p /opt/tinyauth
+ RELEASE=$(curl -s https://api.github.com/repos/tinyauthapp/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ curl -fsSL "https://github.com/tinyauthapp/tinyauth/releases/download/v${RELEASE}/tinyauth-$(arch_resolve)" -o /opt/tinyauth/tinyauth
+ chmod +x /opt/tinyauth/tinyauth
+ PASS=$(openssl rand -base64 8 | tr -dc 'a-zA-Z0-9' | head -c 8)
+ USER=$(htpasswd -Bbn "tinyauth" "${PASS}")
+
+ cat </opt/tinyauth/credentials.txt
+Tinyauth Credentials
+Username: tinyauth
+Password: ${PASS}
+EOF
+ echo "${RELEASE}" >~/.tinyauth
+ msg_ok "Installed Tinyauth"
+
+ read -r -p "${TAB3}Enter your Tinyauth subdomain (e.g. https://tinyauth.example.com): " app_url
+
+ cat </opt/tinyauth/.env
+TINYAUTH_DATABASE_PATH=/opt/tinyauth/database.db
+TINYAUTH_AUTH_USERS='${USER}'
+TINYAUTH_APPURL=${app_url}
+EOF
+
+ msg_info "Creating Service"
+ cat <<'EOF' >/etc/init.d/tinyauth
+#!/sbin/openrc-run
+description="Tinyauth Service"
+
+set -a
+ENV_FILE="/opt/tinyauth/.env"
+[ -f "$ENV_FILE" ] && . "$ENV_FILE"
+set +a
+
+command="/opt/tinyauth/tinyauth"
+directory="/opt/tinyauth"
+command_user="root"
+command_background="true"
+pidfile="/var/run/tinyauth.pid"
+
+depend() {
+ use net
+}
+EOF
+ chmod +x /etc/init.d/tinyauth
+ $STD rc-update add tinyauth default
+ msg_ok "Enabled Tinyauth Service"
+
+ msg_info "Starting Tinyauth"
+ $STD service tinyauth start
+ msg_ok "Started Tinyauth"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/tracktor-install.sh b/install/tracktor-install.sh
index e0fdf274c..9096812fa 100644
--- a/install/tracktor-install.sh
+++ b/install/tracktor-install.sh
@@ -13,13 +13,13 @@ setting_up_container
network_check
update_os
-NODE_VERSION="24" setup_nodejs
+NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs
fetch_and_deploy_gh_release "tracktor" "javedh-dev/tracktor" "tarball" "latest" "/opt/tracktor"
msg_info "Configuring Tracktor"
cd /opt/tracktor
-$STD npm install
-$STD npm run build
+$STD pnpm install --frozen-lockfile
+$STD pnpm run build
mkdir -p /opt/tracktor-data/{uploads,logs}
cat </opt/tracktor.env
NODE_ENV=production
diff --git a/install/traefik-install.sh b/install/traefik-install.sh
index 950fb8b79..f051a3f99 100644
--- a/install/traefik-install.sh
+++ b/install/traefik-install.sh
@@ -13,15 +13,16 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y apt-transport-https
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y apt-transport-https
+ msg_ok "Installed Dependencies"
-fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
-mkdir -p /etc/traefik/{conf.d,ssl}
+ fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"
+ mkdir -p /etc/traefik/{conf.d,ssl}
-msg_info "Creating Traefik configuration"
-cat </etc/traefik/traefik.yaml
+ msg_info "Creating Traefik configuration"
+ cat </etc/traefik/traefik.yaml
providers:
file:
directory: /etc/traefik/conf.d/
@@ -74,10 +75,10 @@ accessLog:
names:
User-Agent: keep
EOF
-msg_ok "Created Traefik configuration"
+ msg_ok "Created Traefik configuration"
-msg_info "Creating Service"
-cat <<'EOF' >/etc/systemd/system/traefik.service
+ msg_info "Creating Service"
+ cat <<'EOF' >/etc/systemd/system/traefik.service
[Unit]
Description=Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience
@@ -90,8 +91,35 @@ ExecReload=/bin/kill -USR1 \$MAINPID
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now traefik
-msg_ok "Created Service"
+ systemctl enable -q --now traefik
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add ca-certificates
+ $STD update-ca-certificates
+ msg_ok "Installed Dependencies"
+
+ msg_info "Installing Traefik"
+ $STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
+ msg_ok "Installed Traefik"
+
+ read -p "${TAB3}Enable Traefik WebUI (Port 8080)? [y/N]: " enable_webui
+ if [[ "$enable_webui" =~ ^[Yy]$ ]]; then
+ msg_info "Configuring Traefik WebUI"
+ sed -i 's/localhost//g' /etc/traefik/traefik.yaml
+ msg_ok "Configured Traefik WebUI"
+ fi
+
+ msg_info "Enabling and starting Traefik service"
+ $STD rc-update add traefik default
+ sed -i '/^command=.*/i directory="/etc/traefik"' /etc/init.d/traefik
+ $STD rc-service traefik start
+ msg_ok "Traefik service started"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/transmission-install.sh b/install/transmission-install.sh
index 5d0018c86..1523358c1 100644
--- a/install/transmission-install.sh
+++ b/install/transmission-install.sh
@@ -13,12 +13,34 @@ setting_up_container
network_check
update_os
-msg_info "Installing Transmission"
-$STD apt install -y transmission-daemon
-systemctl stop transmission-daemon
-sed -i '{s/"rpc-whitelist-enabled": true/"rpc-whitelist-enabled": false/g; s/"rpc-host-whitelist-enabled": true,/"rpc-host-whitelist-enabled": false,/g}' /etc/transmission-daemon/settings.json
-systemctl start transmission-daemon
-msg_ok "Installed Transmission"
+setup_deb_based() {
+ msg_info "Installing Transmission"
+ $STD apt install -y transmission-daemon
+ systemctl stop transmission-daemon
+ sed -i '{s/"rpc-whitelist-enabled": true/"rpc-whitelist-enabled": false/g; s/"rpc-host-whitelist-enabled": true,/"rpc-host-whitelist-enabled": false,/g}' /etc/transmission-daemon/settings.json
+ systemctl start transmission-daemon
+ msg_ok "Installed Transmission"
+}
+
+setup_alpine() {
+ msg_info "Installing Transmission"
+ $STD apk add --no-cache transmission-cli transmission-daemon
+ $STD rc-service transmission-daemon start
+ sleep 5
+ $STD rc-service transmission-daemon stop
+ sed -i '{s/"rpc-whitelist-enabled": true/"rpc-whitelist-enabled": false/g; s/"rpc-host-whitelist-enabled": true,/"rpc-host-whitelist-enabled": false,/g}' /var/lib/transmission/config/settings.json
+ msg_ok "Installed Transmission"
+
+ msg_info "Enabling Transmission Service"
+ $STD rc-update add transmission-daemon default
+ msg_ok "Enabled Transmission Service"
+
+ msg_info "Starting Transmission"
+ $STD rc-service transmission-daemon start
+ msg_ok "Started Transmission"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/valkey-install.sh b/install/valkey-install.sh
index e6aa2904b..872044960 100644
--- a/install/valkey-install.sh
+++ b/install/valkey-install.sh
@@ -13,41 +13,42 @@ setting_up_container
network_check
update_os
-msg_info "Installing Valkey"
-$STD apt update
-$STD apt install -y valkey openssl
-sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
+setup_deb_based() {
+ msg_info "Installing Valkey"
+ $STD apt update
+ $STD apt install -y valkey openssl
+ sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
-PASS="$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | head -c32)"
-echo "requirepass $PASS" >>/etc/valkey/valkey.conf
-echo "$PASS" >~/valkey.creds
-chmod 600 ~/valkey.creds
+ PASS="$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | head -c32)"
+ echo "requirepass $PASS" >>/etc/valkey/valkey.conf
+ echo "$PASS" >~/valkey.creds
+ chmod 600 ~/valkey.creds
-MEMTOTAL_MB=$(free -m | grep ^Mem: | awk '{print $2}')
-# reserve 25% of a node type's maxmemory value for system use
-MAXMEMORY_MB=$((MEMTOTAL_MB * 75 / 100))
+ MEMTOTAL_MB=$(free -m | grep ^Mem: | awk '{print $2}')
+ # reserve 25% of a node type's maxmemory value for system use
+ MAXMEMORY_MB=$((MEMTOTAL_MB * 75 / 100))
-echo "" >>/etc/valkey/valkey.conf
-echo "# Memory-optimized settings for small-scale deployments" >>/etc/valkey/valkey.conf
-echo "maxmemory ${MAXMEMORY_MB}mb" >>/etc/valkey/valkey.conf
-echo "maxmemory-policy allkeys-lru" >>/etc/valkey/valkey.conf
-echo "maxmemory-samples 10" >>/etc/valkey/valkey.conf
-msg_ok "Installed Valkey"
+ echo "" >>/etc/valkey/valkey.conf
+ echo "# Memory-optimized settings for small-scale deployments" >>/etc/valkey/valkey.conf
+ echo "maxmemory ${MAXMEMORY_MB}mb" >>/etc/valkey/valkey.conf
+ echo "maxmemory-policy allkeys-lru" >>/etc/valkey/valkey.conf
+ echo "maxmemory-samples 10" >>/etc/valkey/valkey.conf
+ msg_ok "Installed Valkey"
-echo
-read -r -p "${TAB3}Enable TLS for Valkey (Sentinel mode does not supported)? [y/N]: " prompt
-if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- read -r -p "${TAB3}Use TLS-only mode (disable TCP port 6379)? [y/N]: " tls_only
- msg_info "Configuring TLS for Valkey..."
+ echo
+ read -r -p "${TAB3}Enable TLS for Valkey (Sentinel mode does not supported)? [y/N]: " prompt
+ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
+ read -r -p "${TAB3}Use TLS-only mode (disable TCP port 6379)? [y/N]: " tls_only
+ msg_info "Configuring TLS for Valkey..."
- create_self_signed_cert "Valkey"
- TLS_DIR="/etc/ssl/valkey"
- TLS_CERT="$TLS_DIR/valkey.crt"
- TLS_KEY="$TLS_DIR/valkey.key"
- chown valkey:valkey "$TLS_CERT" "$TLS_KEY"
+ create_self_signed_cert "Valkey"
+ TLS_DIR="/etc/ssl/valkey"
+ TLS_CERT="$TLS_DIR/valkey.crt"
+ TLS_KEY="$TLS_DIR/valkey.key"
+ chown valkey:valkey "$TLS_CERT" "$TLS_KEY"
- if [[ ${tls_only,,} =~ ^(y|yes)$ ]]; then
- cat </etc/valkey/valkey.conf
+ if [[ ${tls_only,,} =~ ^(y|yes)$ ]]; then
+ cat </etc/valkey/valkey.conf
# TLS configuration generated by Proxmox VE Valkey helper-script
port 0
@@ -56,9 +57,9 @@ tls-cert-file $TLS_DIR/valkey.crt
tls-key-file $TLS_DIR/valkey.key
tls-auth-clients no
EOF
- msg_ok "Enabled TLS-only mode on port 6379"
- else
- cat </etc/valkey/valkey.conf
+ msg_ok "Enabled TLS-only mode on port 6379"
+ else
+ cat </etc/valkey/valkey.conf
# TLS configuration generated by Proxmox VE Valkey helper-script
tls-port 6380
@@ -66,12 +67,43 @@ tls-cert-file $TLS_DIR/valkey.crt
tls-key-file $TLS_DIR/valkey.key
tls-auth-clients no
EOF
- msg_ok "Enabled TLS on port 6380 and TCP on 6379"
- fi
-fi
+ msg_ok "Enabled TLS on port 6380 and TCP on 6379"
+ fi
+ fi
-systemctl enable -q --now valkey-server
-systemctl restart valkey-server
+ systemctl enable -q --now valkey-server
+ systemctl restart valkey-server
+}
+
+setup_alpine() {
+ msg_info "Installing Valkey"
+ $STD apk add valkey valkey-openrc valkey-cli
+ sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
+
+ PASS="$(head -c 100 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c32)"
+ echo "requirepass $PASS" >>/etc/valkey/valkey.conf
+ echo "$PASS" >~/valkey.creds
+ chmod 600 ~/valkey.creds
+
+ MEMTOTAL_MB=$(free -m | grep ^Mem: | awk '{print $2}')
+ MAXMEMORY_MB=$((MEMTOTAL_MB * 75 / 100))
+
+ cat </etc/valkey/valkey.conf
+# Memory-optimized settings for small-scale deployments
+maxmemory ${MAXMEMORY_MB}mb
+maxmemory-policy allkeys-lru
+maxmemory-samples 10
+EOF
+ msg_ok "Installed Valkey"
+
+ # Note: Alpine's valkey package is compiled without TLS support
+ # For TLS, use the Debian-based valkey script instead
+
+ $STD rc-update add valkey default
+ $STD rc-service valkey start
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/vaultwarden-install.sh b/install/vaultwarden-install.sh
index 9c2858148..92946acea 100644
--- a/install/vaultwarden-install.sh
+++ b/install/vaultwarden-install.sh
@@ -13,39 +13,40 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- build-essential \
- pkgconf \
- libssl-dev \
- libmariadb-dev-compat \
- libpq-dev \
- argon2 \
- ssl-cert
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ build-essential \
+ pkgconf \
+ libssl-dev \
+ libmariadb-dev-compat \
+ libpq-dev \
+ argon2 \
+ ssl-cert
+ msg_ok "Installed Dependencies"
-setup_rust
-fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
+ setup_rust
+ fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
-msg_info "Building Vaultwarden (Patience)"
-cd /tmp/vaultwarden-src
-VW_VERSION=$(get_latest_github_release "dani-garcia/vaultwarden")
-export VW_VERSION
-$STD cargo build --features "sqlite,mysql,postgresql" --release
-msg_ok "Built Vaultwarden"
+ msg_info "Building Vaultwarden (Patience)"
+ cd /tmp/vaultwarden-src
+ VW_VERSION=$(get_latest_github_release "dani-garcia/vaultwarden")
+ export VW_VERSION
+ $STD cargo build --features "sqlite,mysql,postgresql" --release
+ msg_ok "Built Vaultwarden"
-msg_info "Setting up Vaultwarden"
-$STD addgroup --system vaultwarden
-$STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden
-mkdir -p /opt/vaultwarden/{bin,data,web-vault}
-cp target/release/vaultwarden /opt/vaultwarden/bin/
-cd ~ && rm -rf /tmp/vaultwarden-src
-msg_ok "Set up Vaultwarden"
+ msg_info "Setting up Vaultwarden"
+ $STD addgroup --system vaultwarden
+ $STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden
+ mkdir -p /opt/vaultwarden/{bin,data,web-vault}
+ cp target/release/vaultwarden /opt/vaultwarden/bin/
+ cd ~ && rm -rf /tmp/vaultwarden-src
+ msg_ok "Set up Vaultwarden"
-fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
+ fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
-msg_info "Configuring Vaultwarden"
-cat </opt/vaultwarden/.env
+ msg_info "Configuring Vaultwarden"
+ cat </opt/vaultwarden/.env
ADMIN_TOKEN=''
ROCKET_ADDRESS=0.0.0.0
ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}'
@@ -54,18 +55,18 @@ DATABASE_MAX_CONNS=10
WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
WEB_VAULT_ENABLED=true
EOF
-mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
-mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
+ mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
+ mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
-chown -R vaultwarden:vaultwarden /opt/vaultwarden/
-chown root:root /opt/vaultwarden/bin/vaultwarden
-chmod +x /opt/vaultwarden/bin/vaultwarden
-chown -R root:root /opt/vaultwarden/web-vault/
-chmod +r /opt/vaultwarden/.env
-msg_ok "Configured Vaultwarden"
+ chown -R vaultwarden:vaultwarden /opt/vaultwarden/
+ chown root:root /opt/vaultwarden/bin/vaultwarden
+ chmod +x /opt/vaultwarden/bin/vaultwarden
+ chown -R root:root /opt/vaultwarden/web-vault/
+ chmod +r /opt/vaultwarden/.env
+ msg_ok "Configured Vaultwarden"
-msg_info "Creating Service"
-cat </etc/systemd/system/vaultwarden.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/vaultwarden.service
[Unit]
Description=Bitwarden Server (Powered by Vaultwarden)
Documentation=https://github.com/dani-garcia/vaultwarden
@@ -97,8 +98,39 @@ AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now vaultwarden
-msg_ok "Created Service"
+ systemctl enable -q --now vaultwarden
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add --no-cache \
+ openssl \
+ argon2
+ msg_ok "Installed Dependencies"
+
+ msg_info "Installing Alpine-Vaultwarden"
+ $STD apk add --no-cache vaultwarden
+ sed -i 's|export WEB_VAULT_ENABLED=.*|export WEB_VAULT_ENABLED=true|' /etc/conf.d/vaultwarden
+ echo -e "export ADMIN_TOKEN=''" >>/etc/conf.d/vaultwarden
+ echo -e "export ROCKET_ADDRESS=0.0.0.0" >>/etc/conf.d/vaultwarden
+ echo -e "export ROCKET_TLS='{certs=\"/etc/ssl/certs/vaultwarden-selfsigned.crt\",key=\"/etc/ssl/private/vaultwarden-selfsigned.key\"}'" >>/etc/conf.d/vaultwarden
+ $STD openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/vaultwarden-selfsigned.key -out /etc/ssl/certs/vaultwarden-selfsigned.crt -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost"
+ chown vaultwarden:vaultwarden /etc/ssl/certs/vaultwarden-selfsigned.crt
+ chown vaultwarden:vaultwarden /etc/ssl/private/vaultwarden-selfsigned.key
+ msg_ok "Installed Alpine-Vaultwarden"
+
+ msg_info "Installing Web-Vault"
+ $STD apk add --no-cache vaultwarden-web-vault
+ msg_ok "Installed Web-Vault"
+
+ msg_info "Starting Alpine-Vaultwarden"
+ $STD rc-service vaultwarden start
+ $STD rc-update add vaultwarden default
+ msg_ok "Started Alpine-Vaultwarden"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/victoriametrics-install.sh b/install/victoriametrics-install.sh
index 6768211bc..fefe732ca 100644
--- a/install/victoriametrics-install.sh
+++ b/install/victoriametrics-install.sh
@@ -15,9 +15,11 @@ update_os
msg_info "Getting latest version of VictoriaMetrics"
-victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" |
- jq -r --arg a "$(arch_resolve)" '.[] | select(.assets[].name | match("^victoria-metrics-linux-" + $a + "-v[0-9.]+.tar.gz$")) | .tag_name' |
+vm_releases_json="$(mktemp)"
+github_api_call "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" "$vm_releases_json"
+victoriametrics_release=$(jq -r --arg a "$(arch_resolve)" '.[] | select(.assets[].name | match("^victoria-metrics-linux-" + $a + "-v[0-9.]+.tar.gz$")) | .tag_name' "$vm_releases_json" |
head -n 1)
+rm -f "$vm_releases_json"
victoriametrics_filename="victoria-metrics-linux-$(arch_resolve)-${victoriametrics_release}.tar.gz"
vmutils_filename="vmutils-linux-$(arch_resolve)-${victoriametrics_release}.tar.gz"
msg_ok "Got version $victoriametrics_release of VictoriaMetrics"
@@ -28,12 +30,13 @@ fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuil
read -r -p "${TAB3}Would you like to add VictoriaLogs? " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
- vmlogs_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
- jq -r '.assets[].name' |
+ vl_release_json="$(mktemp)"
+ github_api_call "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" "$vl_release_json"
+ vmlogs_filename=$(jq -r '.assets[].name' "$vl_release_json" |
grep -E "^victoria-logs-linux-$(arch_resolve)-v[0-9.]+\.tar\.gz$")
- vlutils_filename=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaLogs/releases/latest" |
- jq -r '.assets[].name' |
+ vlutils_filename=$(jq -r '.assets[].name' "$vl_release_json" |
grep -E "^vlutils-linux-$(arch_resolve)-v[0-9.]+\.tar\.gz$")
+ rm -f "$vl_release_json"
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vmlogs_filename"
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "$vlutils_filename"
fi
diff --git a/install/wireguard-install.sh b/install/wireguard-install.sh
index b14d7e15f..93a2d7ffd 100644
--- a/install/wireguard-install.sh
+++ b/install/wireguard-install.sh
@@ -13,37 +13,38 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y git
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y git
+ msg_ok "Installed Dependencies"
-msg_info "Installing WireGuard"
-$STD apt install -y wireguard wireguard-tools net-tools iptables
-DEBIAN_FRONTEND=noninteractive apt -o Dpkg::Options::="--force-confnew" install -y iptables-persistent &>/dev/null
-$STD netfilter-persistent reload
-msg_ok "Installed WireGuard"
+ msg_info "Installing WireGuard"
+ $STD apt install -y wireguard wireguard-tools net-tools iptables
+ DEBIAN_FRONTEND=noninteractive apt -o Dpkg::Options::="--force-confnew" install -y iptables-persistent &>/dev/null
+ $STD netfilter-persistent reload
+ msg_ok "Installed WireGuard"
-read -r -p "${TAB3}Would you like to add WGDashboard? " prompt
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- git clone -q https://github.com/WGDashboard/WGDashboard.git /etc/wgdashboard
+ read -r -p "${TAB3}Would you like to add WGDashboard? " prompt
+ if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ git clone -q https://github.com/WGDashboard/WGDashboard.git /etc/wgdashboard
- msg_info "Installing WGDashboard"
- cd /etc/wgdashboard/src
- chmod u+x wgd.sh
- $STD ./wgd.sh install
- . /etc/os-release
- if [ "$VERSION_CODENAME" = "trixie" ]; then
- echo "net.ipv4.ip_forward=1" >>/etc/sysctl.d/sysctl.conf
- $STD sysctl -p /etc/sysctl.d/sysctl.conf
- else
- echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
- $STD sysctl -p /etc/sysctl.conf
- fi
- msg_ok "Installed WGDashboard"
+ msg_info "Installing WGDashboard"
+ cd /etc/wgdashboard/src
+ chmod u+x wgd.sh
+ $STD ./wgd.sh install
+ . /etc/os-release
+ if [ "$VERSION_CODENAME" = "trixie" ]; then
+ echo "net.ipv4.ip_forward=1" >>/etc/sysctl.d/sysctl.conf
+ $STD sysctl -p /etc/sysctl.d/sysctl.conf
+ else
+ echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
+ $STD sysctl -p /etc/sysctl.conf
+ fi
+ msg_ok "Installed WGDashboard"
- msg_info "Create Example Config for WGDashboard"
- private_key=$(wg genkey)
- cat </etc/wireguard/wg0.conf
+ msg_info "Create Example Config for WGDashboard"
+ private_key=$(wg genkey)
+ cat </etc/wireguard/wg0.conf
[Interface]
PrivateKey = ${private_key}
Address = 10.0.0.1/24
@@ -52,10 +53,10 @@ PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACC
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;
ListenPort = 51820
EOF
- msg_ok "Created Example Config for WGDashboard"
+ msg_ok "Created Example Config for WGDashboard"
- msg_info "Creating Service"
- cat </etc/systemd/system/wg-dashboard.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/wg-dashboard.service
[Unit]
After=syslog.target network-online.target
Wants=wg-quick.target
@@ -75,9 +76,97 @@ Restart=always
[Install]
WantedBy=multi-user.target
EOF
- systemctl enable -q --now wg-dashboard
- msg_ok "Created Service"
-fi
+ systemctl enable -q --now wg-dashboard
+ msg_ok "Created Service"
+ fi
+}
+
+setup_alpine() {
+ msg_info "Installing Dependencies"
+ $STD apk add \
+ iptables \
+ openrc
+ msg_ok "Installed Dependencies"
+
+ msg_info "Installing WireGuard"
+ $STD apk add --no-cache wireguard-tools
+ if [[ ! -L /etc/init.d/wg-quick.wg0 ]]; then
+ ln -s /etc/init.d/wg-quick /etc/init.d/wg-quick.wg0
+ fi
+
+ private_key=$(wg genkey)
+ cat </etc/wireguard/wg0.conf
+[Interface]
+PrivateKey = ${private_key}
+Address = 10.0.0.1/24
+SaveConfig = true
+PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
+PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;
+ListenPort = 51820
+EOF
+ echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
+ $STD rc-update add sysctl
+ $STD sysctl -p /etc/sysctl.conf
+ msg_ok "Installed WireGuard"
+
+ read -rp "${TAB3}Do you want to install WGDashboard? (y/N): " INSTALL_WGD
+ if [[ "$INSTALL_WGD" =~ ^[Yy]$ ]]; then
+ msg_info "Installing additional dependencies for WGDashboard"
+ $STD apk add --no-cache \
+ python3 \
+ py3-pip \
+ git \
+ sudo \
+ musl-dev \
+ linux-headers \
+ gcc \
+ python3-dev
+ msg_ok "Installed additional dependencies for WGDashboard"
+ msg_info "Installing WGDashboard"
+ git clone -q https://github.com/WGDashboard/WGDashboard.git /etc/wgdashboard
+ cd /etc/wgdashboard/src
+ chmod u+x wgd.sh
+ $STD ./wgd.sh install
+ msg_ok "Installed WGDashboard"
+
+ msg_info "Creating Service for WGDashboard"
+ cat </etc/init.d/wg-dashboard
+#!/sbin/openrc-run
+
+description="WireGuard Dashboard Service"
+
+depend() {
+ need net
+ after firewall
+}
+
+start() {
+ ebegin "Starting WGDashboard"
+ cd /etc/wgdashboard/src/
+ ./wgd.sh start &
+ eend $?
+}
+
+stop() {
+ ebegin "Stopping WGDashboard"
+ pkill -f "wgd.sh"
+ eend $?
+}
+EOF
+ chmod +x /etc/init.d/wg-dashboard
+ $STD rc-update add wg-dashboard default
+ $STD rc-service wg-dashboard start
+ msg_ok "Created Service for WGDashboard"
+
+ fi
+
+ msg_info "Starting Services"
+ $STD rc-update add wg-quick.wg0 default
+ $STD rc-service wg-quick.wg0 start
+ msg_ok "Started Services"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/install/zigbee2mqtt-install.sh b/install/zigbee2mqtt-install.sh
index 4674bdc1d..4aef0688a 100644
--- a/install/zigbee2mqtt-install.sh
+++ b/install/zigbee2mqtt-install.sh
@@ -13,25 +13,26 @@ setting_up_container
network_check
update_os
-msg_info "Installing Dependencies"
-$STD apt install -y \
- git \
- build-essential
-msg_ok "Installed Dependencies"
+setup_deb_based() {
+ msg_info "Installing Dependencies"
+ $STD apt install -y \
+ git \
+ build-essential
+ msg_ok "Installed Dependencies"
-NODE_VERSION="24" NODE_MODULE="pnpm@$(curl -fsSL https://raw.githubusercontent.com/Koenkk/zigbee2mqtt/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs
-fetch_and_deploy_gh_release "Zigbee2MQTT" "Koenkk/zigbee2mqtt" "tarball" "latest" "/opt/zigbee2mqtt"
+ NODE_VERSION="24" NODE_MODULE="pnpm@$(curl -fsSL https://raw.githubusercontent.com/Koenkk/zigbee2mqtt/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs
+ fetch_and_deploy_gh_release "Zigbee2MQTT" "Koenkk/zigbee2mqtt" "tarball" "latest" "/opt/zigbee2mqtt"
-msg_info "Setting up Zigbee2MQTT"
-mv /opt/zigbee2mqtt/data/configuration.example.yaml /opt/zigbee2mqtt/data/configuration.yaml
-cd /opt/zigbee2mqtt
-echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
-$STD pnpm install --no-frozen-lockfile
-$STD pnpm build
-msg_ok "Setup Zigbee2MQTT"
+ msg_info "Setting up Zigbee2MQTT"
+ mv /opt/zigbee2mqtt/data/configuration.example.yaml /opt/zigbee2mqtt/data/configuration.yaml
+ cd /opt/zigbee2mqtt
+ echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
+ $STD pnpm install --no-frozen-lockfile
+ $STD pnpm build
+ msg_ok "Setup Zigbee2MQTT"
-msg_info "Creating Service"
-cat </etc/systemd/system/zigbee2mqtt.service
+ msg_info "Creating Service"
+ cat </etc/systemd/system/zigbee2mqtt.service
[Unit]
Description=zigbee2mqtt
After=network.target
@@ -48,8 +49,23 @@ User=root
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now zigbee2mqtt
-msg_ok "Created Service"
+ systemctl enable -q --now zigbee2mqtt
+ msg_ok "Created Service"
+}
+
+setup_alpine() {
+ msg_info "Installing Alpine-Zigbee2MQTT"
+ mkdir -p /root/.z2m /etc/zigbee2mqtt
+ $STD apk add zigbee2mqtt
+ ln -s /etc/zigbee2mqtt/ /root/.z2m
+ chown -R root:root /etc/zigbee2mqtt /root/.z2m
+ sed -i -e 's/#datadir="\/var\/lib\/zigbee2mqtt"/datadir="\/etc\/zigbee2mqtt"/' -e 's/#command_user="zigbee2mqtt"/command_user="root"/' /etc/conf.d/zigbee2mqtt
+ $STD rc-update add zigbee2mqtt
+ $STD rc-service zigbee2mqtt restart
+ msg_ok "Installed Alpine-Zigbee2MQTT"
+}
+
+run_os_setup
motd_ssh
customize
diff --git a/misc/tools.func b/misc/tools.func
index e16a37ad3..bfe6cba96 100644
--- a/misc/tools.func
+++ b/misc/tools.func
@@ -1336,6 +1336,10 @@ create_backup() {
msg_warn "Skipping backup of '${path}' (not found)"
continue
fi
+ if mountpoint -q "$path" 2>/dev/null; then
+ msg_warn "Skipping backup of '${path}' (is a mount point)"
+ continue
+ fi
dest="${store}/files${path}"
if ! mkdir -p "$(dirname "$dest")" || ! cp -a "$path" "$dest"; then
msg_error "Backup of '${path}' failed - aborting update"
@@ -2524,9 +2528,9 @@ _download_source_tarball() {
# directory). Extracts into , then copies the contents
# of that top-level directory into .
#
-# - Honors CLEAN_INSTALL=1 (wipes first, dotfiles included β back
-# up config dotfiles like .env via create_backup and call restore_backup
-# BEFORE any build step that sources them).
+# - Honors CLEAN_INSTALL=1 (wipes first, dotfiles included, mount
+# points preserved β back up config dotfiles like .env via create_backup
+# and call restore_backup BEFORE any build step that sources them).
# - Does NOT own : the caller creates it and is responsible for its
# cleanup (typically via a RETURN trap on its tmpdir).
# - cp failures are non-fatal here, matching the previous inline behavior.
@@ -2538,7 +2542,7 @@ _deploy_source_tarball() {
mkdir -p "$target"
if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then
- find "${target:?}" -mindepth 1 -delete
+ find "${target:?}" -mindepth 1 \( -type d -exec mountpoint -q {} \; -prune \) -o -print0 | xargs -0 rm -rf --
fi
tar --no-same-owner -xzf "$tarball" -C "$workdir" || {
@@ -2564,9 +2568,9 @@ _deploy_source_tarball() {
# a single top-level directory, that directory is stripped (its contents land
# directly in ); otherwise the archive contents are copied as-is.
#
-# - Honors CLEAN_INSTALL=1 (wipes first, dotfiles included β back
-# up config dotfiles like .env via create_backup and call restore_backup
-# BEFORE any build step that sources them).
+# - Honors CLEAN_INSTALL=1 (wipes first, dotfiles included, mount
+# points preserved β back up config dotfiles like .env via create_backup
+# and call restore_backup BEFORE any build step that sources them).
# - Does NOT own : the caller creates it and cleans it up.
#
# Returns: 0 on success, 65 on unsupported format, 251 on extraction failure,
@@ -2627,7 +2631,7 @@ _deploy_unpacked_archive() {
# was truncated, the archive was unreadable, or it unpacked to nothing.
mkdir -p "$target"
if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then
- find "${target:?}" -mindepth 1 -delete
+ find "${target:?}" -mindepth 1 \( -type d -exec mountpoint -q {} \; -prune \) -o -print0 | xargs -0 rm -rf --
fi
if ! cp -r "$source_dir"/* "$target/"; then
@@ -9368,7 +9372,7 @@ fetch_and_deploy_from_url() {
mkdir -p "$directory"
if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then
- find "${directory:?}" -mindepth 1 -delete
+ find "${directory:?}" -mindepth 1 \( -type d -exec mountpoint -q {} \; -prune \) -o -print0 | xargs -0 rm -rf --
fi
local unpack_tmp
diff --git a/tools/addon/cronmaster.sh b/tools/addon/cronmaster.sh
index 2ab4cbb1a..7d8e30747 100644
--- a/tools/addon/cronmaster.sh
+++ b/tools/addon/cronmaster.sh
@@ -61,7 +61,7 @@ function update() {
msg_ok "Stopped service"
BACKUP_DIR="/opt/cronmaster_backup"
- create_backup "$CONFIG_PATH"
+ create_backup "$CONFIG_PATH" "$INSTALL_PATH/scripts" "$INSTALL_PATH/data" "$INSTALL_PATH/snippets"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cronmaster" "fccview/cronmaster" "prebuild" "latest" "$INSTALL_PATH" "cronmaster_*_prebuild.tar.gz"