refactor whole tools.func
This commit is contained in:
475
misc/tools.func
475
misc/tools.func
@@ -37,8 +37,8 @@ check_for_gh_release() {
|
|||||||
|
|
||||||
# jq check
|
# jq check
|
||||||
if ! command -v jq &>/dev/null; then
|
if ! command -v jq &>/dev/null; then
|
||||||
$STD apt-get update -qq
|
$STD apt update -qq
|
||||||
$STD apt-get install -y jq || {
|
$STD apt install -y jq || {
|
||||||
msg_error "Failed to install jq"
|
msg_error "Failed to install jq"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
@@ -134,12 +134,27 @@ check_for_gh_release() {
|
|||||||
# Variables:
|
# Variables:
|
||||||
# APP - Application name (default: $APPLICATION variable)
|
# APP - Application name (default: $APPLICATION variable)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
function create_selfsigned_certs() {
|
create_self_signed_cert() {
|
||||||
local app=${APP:-$(echo "${APPLICATION,,}" | tr -d ' ')}
|
local APP_NAME="${1:-${APPLICATION}}"
|
||||||
$STD openssl req -x509 -nodes -days 365 -newkey rsa:4096 \
|
local CERT_DIR="/etc/ssl/${APP_NAME}"
|
||||||
-keyout /etc/ssl/private/"$app"-selfsigned.key \
|
local CERT_KEY="${CERT_DIR}/${APP_NAME}.key"
|
||||||
-out /etc/ssl/certs/"$app"-selfsigned.crt \
|
local CERT_CRT="${CERT_DIR}/${APP_NAME}.crt"
|
||||||
-subj "/C=US/O=$app/OU=Domain Control Validated/CN=localhost"
|
|
||||||
|
if [[ -f "$CERT_CRT" && -f "$CERT_KEY" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y openssl
|
||||||
|
|
||||||
|
mkdir -p "$CERT_DIR"
|
||||||
|
$STD openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
|
||||||
|
-subj "/C=US/ST=State/L=City/O=Organization/CN=${APP_NAME}" \
|
||||||
|
-keyout "$CERT_KEY" \
|
||||||
|
-out "$CERT_CRT"
|
||||||
|
|
||||||
|
chmod 600 "$CERT_KEY"
|
||||||
|
chmod 644 "$CERT_CRT"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -156,7 +171,7 @@ function download_with_progress() {
|
|||||||
if [ -n "$SPINNER_PID" ] && ps -p "$SPINNER_PID" >/dev/null; then kill "$SPINNER_PID" >/dev/null; fi
|
if [ -n "$SPINNER_PID" ] && ps -p "$SPINNER_PID" >/dev/null; then kill "$SPINNER_PID" >/dev/null; fi
|
||||||
|
|
||||||
if ! command -v pv &>/dev/null; then
|
if ! command -v pv &>/dev/null; then
|
||||||
$STD apt-get install -y pv
|
$STD apt install -y pv
|
||||||
fi
|
fi
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
@@ -255,7 +270,7 @@ function fetch_and_deploy_gh_release() {
|
|||||||
[[ -f "$version_file" ]] && current_version=$(<"$version_file")
|
[[ -f "$version_file" ]] && current_version=$(<"$version_file")
|
||||||
|
|
||||||
if ! command -v jq &>/dev/null; then
|
if ! command -v jq &>/dev/null; then
|
||||||
$STD apt-get install -y jq &>/dev/null
|
$STD apt install -y jq &>/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local api_url="https://api.github.com/repos/$repo/releases"
|
local api_url="https://api.github.com/repos/$repo/releases"
|
||||||
@@ -387,7 +402,7 @@ function fetch_and_deploy_gh_release() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
chmod 644 "$tmpdir/$filename"
|
chmod 644 "$tmpdir/$filename"
|
||||||
$STD apt-get install -y "$tmpdir/$filename" || {
|
$STD apt install -y "$tmpdir/$filename" || {
|
||||||
$STD dpkg -i "$tmpdir/$filename" || {
|
$STD dpkg -i "$tmpdir/$filename" || {
|
||||||
msg_error "Both apt and dpkg installation failed"
|
msg_error "Both apt and dpkg installation failed"
|
||||||
rm -rf "$tmpdir"
|
rm -rf "$tmpdir"
|
||||||
@@ -438,7 +453,7 @@ function fetch_and_deploy_gh_release() {
|
|||||||
|
|
||||||
if [[ "$filename" == *.zip ]]; then
|
if [[ "$filename" == *.zip ]]; then
|
||||||
if ! command -v unzip &>/dev/null; then
|
if ! command -v unzip &>/dev/null; then
|
||||||
$STD apt-get install -y unzip
|
$STD apt install -y unzip
|
||||||
fi
|
fi
|
||||||
unzip -q "$tmpdir/$filename" -d "$unpack_tmp"
|
unzip -q "$tmpdir/$filename" -d "$unpack_tmp"
|
||||||
elif [[ "$filename" == *.tar.* || "$filename" == *.tgz ]]; then
|
elif [[ "$filename" == *.tar.* || "$filename" == *.tgz ]]; then
|
||||||
@@ -605,7 +620,7 @@ function setup_adminer() {
|
|||||||
msg_ok "Adminer available at /adminer (Alpine)"
|
msg_ok "Adminer available at /adminer (Alpine)"
|
||||||
else
|
else
|
||||||
msg_info "Setup Adminer (Debian/Ubuntu)"
|
msg_info "Setup Adminer (Debian/Ubuntu)"
|
||||||
$STD apt-get install -y adminer
|
$STD apt install -y adminer
|
||||||
$STD a2enconf adminer
|
$STD a2enconf adminer
|
||||||
$STD systemctl reload apache2
|
$STD systemctl reload apache2
|
||||||
msg_ok "Adminer available at /adminer (Debian/Ubuntu)"
|
msg_ok "Adminer available at /adminer (Debian/Ubuntu)"
|
||||||
@@ -699,8 +714,8 @@ function setup_ffmpeg() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v jq &>/dev/null; then
|
if ! command -v jq &>/dev/null; then
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y jq
|
$STD apt install -y jq
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Auto-detect latest stable version if none specified
|
# Auto-detect latest stable version if none specified
|
||||||
@@ -744,8 +759,8 @@ function setup_ffmpeg() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y "${DEPS[@]}"
|
$STD apt install -y "${DEPS[@]}"
|
||||||
|
|
||||||
curl -fsSL "https://github.com/${GITHUB_REPO}/archive/refs/tags/${VERSION}.tar.gz" -o "$TMP_DIR/ffmpeg.tar.gz"
|
curl -fsSL "https://github.com/${GITHUB_REPO}/archive/refs/tags/${VERSION}.tar.gz" -o "$TMP_DIR/ffmpeg.tar.gz"
|
||||||
tar -xzf "$TMP_DIR/ffmpeg.tar.gz" -C "$TMP_DIR"
|
tar -xzf "$TMP_DIR/ffmpeg.tar.gz" -C "$TMP_DIR"
|
||||||
@@ -915,7 +930,7 @@ function setup_gs() {
|
|||||||
msg_error "Failed to enter Ghostscript source directory."
|
msg_error "Failed to enter Ghostscript source directory."
|
||||||
rm -rf "$TMP_DIR"
|
rm -rf "$TMP_DIR"
|
||||||
}
|
}
|
||||||
$STD apt-get install -y build-essential libpng-dev zlib1g-dev
|
$STD apt install -y build-essential libpng-dev zlib1g-dev
|
||||||
$STD ./configure >/dev/null
|
$STD ./configure >/dev/null
|
||||||
$STD make
|
$STD make
|
||||||
$STD sudo make install
|
$STD sudo make install
|
||||||
@@ -960,8 +975,8 @@ function setup_imagemagick() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Setup ImageMagick (Patience)"
|
msg_info "Setup ImageMagick (Patience)"
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
build-essential \
|
build-essential \
|
||||||
libtool \
|
libtool \
|
||||||
libjpeg-dev \
|
libjpeg-dev \
|
||||||
@@ -1019,41 +1034,57 @@ function setup_imagemagick() {
|
|||||||
|
|
||||||
function setup_java() {
|
function setup_java() {
|
||||||
local JAVA_VERSION="${JAVA_VERSION:-21}"
|
local JAVA_VERSION="${JAVA_VERSION:-21}"
|
||||||
local DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
DISTRO_CODENAME=$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)
|
DISTRO_CODENAME=$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)
|
||||||
local DESIRED_PACKAGE="temurin-${JAVA_VERSION}-jdk"
|
local DESIRED_PACKAGE="temurin-${JAVA_VERSION}-jdk"
|
||||||
|
|
||||||
# Add Adoptium repo if missing
|
# Add repo nur wenn nötig
|
||||||
if [[ ! -f /etc/apt/sources.list.d/adoptium.list ]]; then
|
if [[ ! -f /etc/apt/sources.list.d/adoptium.sources ]]; then
|
||||||
$STD msg_info "Setting up Adoptium Repository"
|
msg_info "Setting up Adoptium Repository"
|
||||||
mkdir -p /etc/apt/keyrings
|
mkdir -p /etc/apt/keyrings
|
||||||
curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | gpg --dearmor -o /etc/apt/trusted.gpg.d/adoptium.gpg
|
curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | gpg --dearmor -o /etc/apt/keyrings/adoptium.gpg
|
||||||
echo "deb [signed-by=/etc/apt/trusted.gpg.d/adoptium.gpg] https://packages.adoptium.net/artifactory/deb ${DISTRO_CODENAME} main" \
|
|
||||||
>/etc/apt/sources.list.d/adoptium.list
|
local SUITE="$DISTRO_CODENAME"
|
||||||
$STD apt-get update
|
if ! curl -fsSL "https://packages.adoptium.net/artifactory/deb/dists/$DISTRO_CODENAME/Release" &>/dev/null; then
|
||||||
$STD msg_ok "Set up Adoptium Repository"
|
case "$DISTRO_ID" in
|
||||||
|
debian) SUITE="bookworm" ;;
|
||||||
|
ubuntu) SUITE="jammy" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/adoptium.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: https://packages.adoptium.net/artifactory/deb
|
||||||
|
Suites: $SUITE
|
||||||
|
Components: main
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /etc/apt/keyrings/adoptium.gpg
|
||||||
|
EOF
|
||||||
|
$STD apt update
|
||||||
|
msg_ok "Set up Adoptium Repository"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Detect currently installed temurin version
|
|
||||||
local INSTALLED_VERSION=""
|
local INSTALLED_VERSION=""
|
||||||
if dpkg -l | grep -q "temurin-.*-jdk"; then
|
if dpkg -l | grep -q "temurin-.*-jdk"; then
|
||||||
INSTALLED_VERSION=$(dpkg -l | awk '/temurin-.*-jdk/{print $2}' | grep -oP 'temurin-\K[0-9]+')
|
INSTALLED_VERSION=$(dpkg -l | awk '/temurin-.*-jdk/{print $2}' | grep -oP 'temurin-\K[0-9]+')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$INSTALLED_VERSION" == "$JAVA_VERSION" ]]; then
|
if [[ "$INSTALLED_VERSION" == "$JAVA_VERSION" ]]; then
|
||||||
$STD msg_info "Upgrading Temurin JDK $JAVA_VERSION"
|
msg_info "Upgrading Temurin JDK $JAVA_VERSION"
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install --only-upgrade -y "$DESIRED_PACKAGE"
|
$STD apt install --only-upgrade -y "$DESIRED_PACKAGE"
|
||||||
$STD msg_ok "Upgraded Temurin JDK $JAVA_VERSION"
|
msg_ok "Upgraded Temurin JDK $JAVA_VERSION"
|
||||||
else
|
else
|
||||||
if [[ -n "$INSTALLED_VERSION" ]]; then
|
if [[ -n "$INSTALLED_VERSION" ]]; then
|
||||||
$STD msg_info "Removing Temurin JDK $INSTALLED_VERSION"
|
msg_info "Removing old Temurin JDK $INSTALLED_VERSION"
|
||||||
$STD apt-get purge -y "temurin-${INSTALLED_VERSION}-jdk"
|
$STD apt purge -y "temurin-${INSTALLED_VERSION}-jdk"
|
||||||
|
msg_ok "Removed old Temurin JDK"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Setup Temurin JDK $JAVA_VERSION"
|
msg_info "Installing Temurin JDK $JAVA_VERSION"
|
||||||
$STD apt-get install -y "$DESIRED_PACKAGE"
|
$STD apt install -y "$DESIRED_PACKAGE"
|
||||||
msg_ok "Setup Temurin JDK $JAVA_VERSION"
|
msg_ok "Installed Temurin JDK $JAVA_VERSION"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1075,8 +1106,8 @@ function setup_local_ip_helper() {
|
|||||||
|
|
||||||
# Install networkd-dispatcher if not present
|
# Install networkd-dispatcher if not present
|
||||||
if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
|
if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y networkd-dispatcher
|
$STD apt install -y networkd-dispatcher
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Write update_local_ip.sh
|
# Write update_local_ip.sh
|
||||||
@@ -1149,17 +1180,15 @@ EOF
|
|||||||
|
|
||||||
setup_mariadb() {
|
setup_mariadb() {
|
||||||
local MARIADB_VERSION="${MARIADB_VERSION:-latest}"
|
local MARIADB_VERSION="${MARIADB_VERSION:-latest}"
|
||||||
local DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_CODENAME="$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)"
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
CURRENT_OS="$(awk -F= '/^ID=/{print $2}' /etc/os-release)"
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
||||||
|
|
||||||
if ! curl -fsI http://mirror.mariadb.org/repo/ >/dev/null; then
|
if ! curl -fsI http://mirror.mariadb.org/repo/ >/dev/null; then
|
||||||
msg_error "MariaDB mirror not reachable"
|
msg_error "MariaDB mirror not reachable"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_info "Setting up MariaDB $MARIADB_VERSION"
|
|
||||||
# Grab dynamic latest LTS version
|
|
||||||
if [[ "$MARIADB_VERSION" == "latest" ]]; then
|
if [[ "$MARIADB_VERSION" == "latest" ]]; then
|
||||||
MARIADB_VERSION=$(curl -fsSL http://mirror.mariadb.org/repo/ |
|
MARIADB_VERSION=$(curl -fsSL http://mirror.mariadb.org/repo/ |
|
||||||
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+/' |
|
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+/' |
|
||||||
@@ -1179,54 +1208,56 @@ setup_mariadb() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$CURRENT_VERSION" == "$MARIADB_VERSION" ]]; then
|
if [[ "$CURRENT_VERSION" == "$MARIADB_VERSION" ]]; then
|
||||||
$STD msg_info "MariaDB $MARIADB_VERSION, upgrading"
|
msg_info "Upgrading MariaDB $MARIADB_VERSION"
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install --only-upgrade -y mariadb-server mariadb-client
|
$STD apt install --only-upgrade -y mariadb-server mariadb-client
|
||||||
$STD msg_ok "MariaDB upgraded to $MARIADB_VERSION"
|
msg_ok "Upgraded MariaDB $MARIADB_VERSION"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
msg_info "Installing MariaDB $MARIADB_VERSION"
|
||||||
|
|
||||||
if [[ -n "$CURRENT_VERSION" ]]; then
|
if [[ -n "$CURRENT_VERSION" ]]; then
|
||||||
$STD msg_info "Upgrading MariaDB $CURRENT_VERSION to $MARIADB_VERSION"
|
|
||||||
$STD systemctl stop mariadb >/dev/null 2>&1 || true
|
$STD systemctl stop mariadb >/dev/null 2>&1 || true
|
||||||
$STD apt-get purge -y 'mariadb*' || true
|
$STD apt purge -y 'mariadb*' || true
|
||||||
rm -f /etc/apt/sources.list.d/mariadb.list /etc/apt/trusted.gpg.d/mariadb.gpg
|
rm -f /etc/apt/sources.list.d/mariadb.* /etc/apt/keyrings/mariadb.gpg
|
||||||
else
|
|
||||||
$STD msg_info "Setup MariaDB $MARIADB_VERSION"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
curl -fsSL "https://mariadb.org/mariadb_release_signing_key.asc" |
|
curl -fsSL "https://mariadb.org/mariadb_release_signing_key.asc" |
|
||||||
gpg --dearmor -o /etc/apt/trusted.gpg.d/mariadb.gpg
|
gpg --dearmor -o /etc/apt/keyrings/mariadb.gpg
|
||||||
|
|
||||||
echo "deb [signed-by=/etc/apt/trusted.gpg.d/mariadb.gpg] http://mirror.mariadb.org/repo/${MARIADB_VERSION}/${CURRENT_OS} ${DISTRO_CODENAME} main" \
|
local SUITE="$DISTRO_CODENAME"
|
||||||
>/etc/apt/sources.list.d/mariadb.list
|
if ! curl -fsSL "http://mirror.mariadb.org/repo/${MARIADB_VERSION}/${DISTRO_ID}/dists/$DISTRO_CODENAME/Release" &>/dev/null; then
|
||||||
|
case "$DISTRO_ID" in
|
||||||
|
debian) SUITE="bookworm" ;;
|
||||||
|
ubuntu) SUITE="jammy" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
$STD apt-get update
|
cat <<EOF >/etc/apt/sources.list.d/mariadb.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: http://mirror.mariadb.org/repo/${MARIADB_VERSION}/${DISTRO_ID}
|
||||||
|
Suites: $SUITE
|
||||||
|
Components: main
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /etc/apt/keyrings/mariadb.gpg
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$STD apt update
|
||||||
|
|
||||||
local MARIADB_MAJOR_MINOR
|
local MARIADB_MAJOR_MINOR
|
||||||
MARIADB_MAJOR_MINOR=$(echo "$MARIADB_VERSION" | awk -F. '{print $1"."$2}')
|
MARIADB_MAJOR_MINOR=$(echo "$MARIADB_VERSION" | awk -F. '{print $1"."$2}')
|
||||||
if [[ -n "$MARIADB_MAJOR_MINOR" ]]; then
|
if [[ -n "$MARIADB_MAJOR_MINOR" ]]; then
|
||||||
echo "mariadb-server-$MARIADB_MAJOR_MINOR mariadb-server/feedback boolean false" | debconf-set-selections
|
echo "mariadb-server-$MARIADB_MAJOR_MINOR mariadb-server/feedback boolean false" | debconf-set-selections
|
||||||
else
|
|
||||||
for ver in 12.1 12.0 11.4 11.3 11.2 11.1 11.0 10.11 10.6 10.5 10.4 10.3; do
|
|
||||||
echo "mariadb-server-$ver mariadb-server/feedback boolean false" | debconf-set-selections
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
DEBIAN_FRONTEND=noninteractive $STD apt-get install -y mariadb-server mariadb-client || {
|
|
||||||
msg_warn "Failed to install MariaDB ${MARIADB_VERSION} from upstream repo – trying distro package as fallback..."
|
DEBIAN_FRONTEND=noninteractive $STD apt install -y mariadb-server mariadb-client || {
|
||||||
# Cleanup, remove upstream repo to avoid conflicts
|
rm -f /etc/apt/sources.list.d/mariadb.sources /etc/apt/keyrings/mariadb.gpg
|
||||||
rm -f /etc/apt/sources.list.d/mariadb.list /etc/apt/trusted.gpg.d/mariadb.gpg
|
$STD apt update
|
||||||
$STD apt-get update
|
DEBIAN_FRONTEND=noninteractive $STD apt install -y mariadb-server mariadb-client
|
||||||
# Final fallback: distro package
|
|
||||||
DEBIAN_FRONTEND=noninteractive $STD apt-get install -y mariadb-server mariadb-client || {
|
|
||||||
msg_error "MariaDB installation failed even with distro fallback!"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
msg_ok "Setup MariaDB (distro fallback)"
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ok "Setup MariaDB $MARIADB_VERSION"
|
msg_ok "Installed MariaDB $MARIADB_VERSION"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -1242,7 +1273,7 @@ setup_mariadb() {
|
|||||||
|
|
||||||
function setup_mongodb() {
|
function setup_mongodb() {
|
||||||
local MONGO_VERSION="${MONGO_VERSION:-8.0}"
|
local MONGO_VERSION="${MONGO_VERSION:-8.0}"
|
||||||
local DISTRO_ID DISTRO_CODENAME MONGO_BASE_URL
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{ gsub(/"/,"",$2); print $2 }' /etc/os-release)
|
DISTRO_ID=$(awk -F= '/^ID=/{ gsub(/"/,"",$2); print $2 }' /etc/os-release)
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{ print $2 }' /etc/os-release)
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{ print $2 }' /etc/os-release)
|
||||||
|
|
||||||
@@ -1270,40 +1301,64 @@ function setup_mongodb() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
local REPO_LIST="/etc/apt/sources.list.d/mongodb-org-${MONGO_VERSION}.list"
|
|
||||||
|
|
||||||
local INSTALLED_VERSION=""
|
local INSTALLED_VERSION=""
|
||||||
if command -v mongod >/dev/null; then
|
if command -v mongod >/dev/null; then
|
||||||
INSTALLED_VERSION=$(mongod --version | awk '/db version/{print $3}' | cut -d. -f1,2)
|
INSTALLED_VERSION=$(mongod --version | awk '/db version/{print $3}' | cut -d. -f1,2)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$INSTALLED_VERSION" == "$MONGO_VERSION" ]]; then
|
if [[ "$INSTALLED_VERSION" == "$MONGO_VERSION" ]]; then
|
||||||
$STD msg_info "Upgrading MongoDB $MONGO_VERSION"
|
msg_info "Upgrading MongoDB $MONGO_VERSION"
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install --only-upgrade -y mongodb-org
|
$STD apt install --only-upgrade -y mongodb-org
|
||||||
$STD msg_ok "Upgraded MongoDB $MONGO_VERSION"
|
msg_ok "Upgraded MongoDB $MONGO_VERSION"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "$INSTALLED_VERSION" ]]; then
|
if [[ -n "$INSTALLED_VERSION" ]]; then
|
||||||
$STD systemctl stop mongod || true
|
$STD systemctl stop mongod || true
|
||||||
$STD apt-get purge -y mongodb-org || true
|
$STD apt purge -y mongodb-org || true
|
||||||
rm -f /etc/apt/sources.list.d/mongodb-org-*.list
|
rm -f /etc/apt/sources.list.d/mongodb-org-*.* /etc/apt/keyrings/mongodb-*.gpg
|
||||||
rm -f /etc/apt/trusted.gpg.d/mongodb-*.gpg
|
|
||||||
else
|
else
|
||||||
msg_info "Setup MongoDB $MONGO_VERSION"
|
msg_info "Setup MongoDB $MONGO_VERSION"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
curl -fsSL "https://pgp.mongodb.com/server-${MONGO_VERSION}.asc" | gpg --dearmor -o "/etc/apt/trusted.gpg.d/mongodb-${MONGO_VERSION}.gpg"
|
curl -fsSL "https://pgp.mongodb.com/server-${MONGO_VERSION}.asc" | gpg --dearmor -o "/etc/apt/keyrings/mongodb-${MONGO_VERSION}.gpg"
|
||||||
echo "deb [signed-by=/etc/apt/trusted.gpg.d/mongodb-${MONGO_VERSION}.gpg] ${MONGO_BASE_URL} ${DISTRO_CODENAME}/mongodb-org/${MONGO_VERSION} ${REPO_COMPONENT}" \
|
|
||||||
>"$REPO_LIST"
|
|
||||||
|
|
||||||
$STD apt-get update || {
|
# Fallback logic for MongoDB repos
|
||||||
|
local SUITE="$DISTRO_CODENAME"
|
||||||
|
if ! curl -fsSL "${MONGO_BASE_URL}/dists/${DISTRO_CODENAME}/Release" &>/dev/null; then
|
||||||
|
case "$DISTRO_ID" in
|
||||||
|
debian)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
trixie) SUITE="bookworm" ;;
|
||||||
|
*) SUITE="bookworm" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
ubuntu)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
oracular | noble) SUITE="jammy" ;;
|
||||||
|
*) SUITE="jammy" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
msg_info "Using fallback suite: $SUITE (original: $DISTRO_CODENAME)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/mongodb-org-${MONGO_VERSION}.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: ${MONGO_BASE_URL}
|
||||||
|
Suites: ${SUITE}/mongodb-org/${MONGO_VERSION}
|
||||||
|
Components: ${REPO_COMPONENT}
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /etc/apt/keyrings/mongodb-${MONGO_VERSION}.gpg
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$STD apt update || {
|
||||||
msg_error "APT update failed — invalid MongoDB repo for ${DISTRO_ID}-${DISTRO_CODENAME}?"
|
msg_error "APT update failed — invalid MongoDB repo for ${DISTRO_ID}-${DISTRO_CODENAME}?"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
$STD apt-get install -y mongodb-org
|
$STD apt install -y mongodb-org
|
||||||
|
|
||||||
mkdir -p /var/lib/mongodb
|
mkdir -p /var/lib/mongodb
|
||||||
chown -R mongodb:mongodb /var/lib/mongodb
|
chown -R mongodb:mongodb /var/lib/mongodb
|
||||||
@@ -1329,20 +1384,21 @@ function setup_mysql() {
|
|||||||
local MYSQL_VERSION="${MYSQL_VERSION:-8.0}"
|
local MYSQL_VERSION="${MYSQL_VERSION:-8.0}"
|
||||||
local CURRENT_VERSION=""
|
local CURRENT_VERSION=""
|
||||||
local NEED_INSTALL=false
|
local NEED_INSTALL=false
|
||||||
CURRENT_OS="$(awk -F= '/^ID=/{print $2}' /etc/os-release)"
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
||||||
|
|
||||||
if command -v mysql >/dev/null; then
|
if command -v mysql >/dev/null; then
|
||||||
CURRENT_VERSION="$(mysql --version | grep -oP '[0-9]+\.[0-9]+' | head -n1)"
|
CURRENT_VERSION="$(mysql --version | grep -oP '[0-9]+\.[0-9]+' | head -n1)"
|
||||||
if [[ "$CURRENT_VERSION" != "$MYSQL_VERSION" ]]; then
|
if [[ "$CURRENT_VERSION" != "$MYSQL_VERSION" ]]; then
|
||||||
$STD msg_info "MySQL $CURRENT_VERSION will be upgraded to $MYSQL_VERSION"
|
msg_info "MySQL $CURRENT_VERSION will be upgraded to $MYSQL_VERSION"
|
||||||
NEED_INSTALL=true
|
NEED_INSTALL=true
|
||||||
else
|
else
|
||||||
# Check for patch-level updates
|
|
||||||
if apt list --upgradable 2>/dev/null | grep -q '^mysql-server/'; then
|
if apt list --upgradable 2>/dev/null | grep -q '^mysql-server/'; then
|
||||||
$STD msg_info "MySQL $CURRENT_VERSION available for upgrade"
|
msg_info "MySQL $CURRENT_VERSION available for upgrade"
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install --only-upgrade -y mysql-server
|
$STD apt install --only-upgrade -y mysql-server
|
||||||
$STD msg_ok "MySQL upgraded"
|
msg_ok "MySQL upgraded"
|
||||||
fi
|
fi
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -1353,18 +1409,43 @@ function setup_mysql() {
|
|||||||
|
|
||||||
if [[ "$NEED_INSTALL" == true ]]; then
|
if [[ "$NEED_INSTALL" == true ]]; then
|
||||||
$STD systemctl stop mysql || true
|
$STD systemctl stop mysql || true
|
||||||
$STD apt-get purge -y "^mysql-server.*" "^mysql-client.*" "^mysql-common.*" || true
|
$STD apt purge -y "^mysql-server.*" "^mysql-client.*" "^mysql-common.*" || true
|
||||||
rm -f /etc/apt/sources.list.d/mysql.list /etc/apt/trusted.gpg.d/mysql.gpg
|
rm -f /etc/apt/sources.list.d/mysql.* /etc/apt/keyrings/mysql.gpg
|
||||||
|
|
||||||
local DISTRO_CODENAME
|
# Fallback logic for MySQL repos
|
||||||
DISTRO_CODENAME="$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)"
|
local SUITE="$DISTRO_CODENAME"
|
||||||
curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | gpg --dearmor -o /etc/apt/trusted.gpg.d/mysql.gpg
|
if ! curl -fsSL "https://repo.mysql.com/apt/${DISTRO_ID}/dists/$DISTRO_CODENAME/Release" &>/dev/null; then
|
||||||
echo "deb [signed-by=/etc/apt/trusted.gpg.d/mysql.gpg] https://repo.mysql.com/apt/${CURRENT_OS}/ ${DISTRO_CODENAME} mysql-${MYSQL_VERSION}" \
|
case "$DISTRO_ID" in
|
||||||
>/etc/apt/sources.list.d/mysql.list
|
debian)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
trixie) SUITE="bookworm" ;;
|
||||||
|
*) SUITE="bookworm" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
ubuntu)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
oracular | noble) SUITE="jammy" ;;
|
||||||
|
*) SUITE="jammy" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
msg_info "Using fallback suite: $SUITE (original: $DISTRO_CODENAME)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | gpg --dearmor -o /etc/apt/keyrings/mysql.gpg
|
||||||
|
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/mysql.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: https://repo.mysql.com/apt/${DISTRO_ID}
|
||||||
|
Suites: ${SUITE}
|
||||||
|
Components: mysql-${MYSQL_VERSION}
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /etc/apt/keyrings/mysql.gpg
|
||||||
|
EOF
|
||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y mysql-server
|
$STD apt install -y mysql-server
|
||||||
msg_ok "Setup MySQL $MYSQL_VERSION"
|
msg_ok "Setup MySQL $MYSQL_VERSION"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -1386,8 +1467,10 @@ function setup_nodejs() {
|
|||||||
local NODE_MODULE="${NODE_MODULE:-}"
|
local NODE_MODULE="${NODE_MODULE:-}"
|
||||||
local CURRENT_NODE_VERSION=""
|
local CURRENT_NODE_VERSION=""
|
||||||
local NEED_NODE_INSTALL=false
|
local NEED_NODE_INSTALL=false
|
||||||
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
||||||
|
|
||||||
# Check if Node.js is already installed
|
|
||||||
if command -v node >/dev/null; then
|
if command -v node >/dev/null; then
|
||||||
CURRENT_NODE_VERSION="$(node -v | grep -oP '^v\K[0-9]+')"
|
CURRENT_NODE_VERSION="$(node -v | grep -oP '^v\K[0-9]+')"
|
||||||
if [[ "$CURRENT_NODE_VERSION" != "$NODE_VERSION" ]]; then
|
if [[ "$CURRENT_NODE_VERSION" != "$NODE_VERSION" ]]; then
|
||||||
@@ -1400,102 +1483,101 @@ function setup_nodejs() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v jq &>/dev/null; then
|
if ! command -v jq &>/dev/null; then
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y jq || {
|
$STD apt install -y jq || {
|
||||||
msg_error "Failed to install jq"
|
msg_error "Failed to install jq"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install Node.js if required
|
|
||||||
if [[ "$NEED_NODE_INSTALL" == true ]]; then
|
if [[ "$NEED_NODE_INSTALL" == true ]]; then
|
||||||
$STD apt-get purge -y nodejs
|
$STD apt purge -y nodejs
|
||||||
rm -f /etc/apt/sources.list.d/nodesource.list /etc/apt/keyrings/nodesource.gpg
|
rm -f /etc/apt/sources.list.d/nodesource.* /etc/apt/keyrings/nodesource.gpg
|
||||||
|
|
||||||
mkdir -p /etc/apt/keyrings
|
mkdir -p /etc/apt/keyrings
|
||||||
|
|
||||||
if ! curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key |
|
if ! curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key |
|
||||||
gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; then
|
gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; then
|
||||||
msg_error "Failed to download or import NodeSource GPG key"
|
msg_error "Failed to download or import NodeSource GPG key"
|
||||||
exit 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_VERSION}.x nodistro main" \
|
# NodeSource uses 'nodistro' for all distributions
|
||||||
>/etc/apt/sources.list.d/nodesource.list
|
cat <<EOF >/etc/apt/sources.list.d/nodesource.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: https://deb.nodesource.com/node_${NODE_VERSION}.x
|
||||||
|
Suites: nodistro
|
||||||
|
Components: main
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /etc/apt/keyrings/nodesource.gpg
|
||||||
|
EOF
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
if ! apt-get update >/dev/null 2>&1; then
|
if ! $STD apt update; then
|
||||||
msg_warn "APT update failed – retrying in 5s"
|
msg_warn "APT update failed – retrying in 5s"
|
||||||
sleep 5
|
sleep 5
|
||||||
if ! apt-get update >/dev/null 2>&1; then
|
if ! $STD apt update; then
|
||||||
msg_error "Failed to update APT repositories after adding NodeSource"
|
msg_error "Failed to update APT repositories after adding NodeSource"
|
||||||
exit 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! apt-get install -y nodejs >/dev/null 2>&1; then
|
if ! $STD apt install -y nodejs; then
|
||||||
msg_error "Failed to install Node.js ${NODE_VERSION} from NodeSource"
|
msg_error "Failed to install Node.js ${NODE_VERSION} from NodeSource"
|
||||||
exit 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Update to latest npm
|
|
||||||
$STD npm install -g npm@latest || {
|
$STD npm install -g npm@latest || {
|
||||||
msg_error "Failed to update npm to latest version"
|
msg_warn "Failed to update npm to latest version"
|
||||||
}
|
}
|
||||||
msg_ok "Setup Node.js ${NODE_VERSION}"
|
msg_ok "Setup Node.js ${NODE_VERSION}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||||
|
|
||||||
# Ensure valid working directory for npm (avoids uv_cwd error)
|
|
||||||
if [[ ! -d /opt ]]; then
|
if [[ ! -d /opt ]]; then
|
||||||
mkdir -p /opt
|
mkdir -p /opt
|
||||||
fi
|
fi
|
||||||
cd /opt || {
|
cd /opt || {
|
||||||
msg_error "Failed to set safe working directory before npm install"
|
msg_error "Failed to set safe working directory before npm install"
|
||||||
exit 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Install global Node modules
|
|
||||||
if [[ -n "$NODE_MODULE" ]]; then
|
if [[ -n "$NODE_MODULE" ]]; then
|
||||||
IFS=',' read -ra MODULES <<<"$NODE_MODULE"
|
IFS=',' read -ra MODULES <<<"$NODE_MODULE"
|
||||||
for mod in "${MODULES[@]}"; do
|
for mod in "${MODULES[@]}"; do
|
||||||
local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION
|
local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION
|
||||||
if [[ "$mod" == @*/*@* ]]; then
|
if [[ "$mod" == @*/*@* ]]; then
|
||||||
# Scoped package with version, e.g. @vue/cli-service@latest
|
|
||||||
MODULE_NAME="${mod%@*}"
|
MODULE_NAME="${mod%@*}"
|
||||||
MODULE_REQ_VERSION="${mod##*@}"
|
MODULE_REQ_VERSION="${mod##*@}"
|
||||||
elif [[ "$mod" == *"@"* ]]; then
|
elif [[ "$mod" == *"@"* ]]; then
|
||||||
# Unscoped package with version, e.g. yarn@latest
|
|
||||||
MODULE_NAME="${mod%@*}"
|
MODULE_NAME="${mod%@*}"
|
||||||
MODULE_REQ_VERSION="${mod##*@}"
|
MODULE_REQ_VERSION="${mod##*@}"
|
||||||
else
|
else
|
||||||
# No version specified
|
|
||||||
MODULE_NAME="$mod"
|
MODULE_NAME="$mod"
|
||||||
MODULE_REQ_VERSION="latest"
|
MODULE_REQ_VERSION="latest"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if the module is already installed
|
|
||||||
if npm list -g --depth=0 "$MODULE_NAME" >/dev/null 2>&1; then
|
if npm list -g --depth=0 "$MODULE_NAME" >/dev/null 2>&1; then
|
||||||
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
|
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
|
||||||
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
||||||
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
||||||
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}"; then
|
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}"; then
|
||||||
msg_error "Failed to update $MODULE_NAME to version $MODULE_REQ_VERSION"
|
msg_error "Failed to update $MODULE_NAME to version $MODULE_REQ_VERSION"
|
||||||
exit 1
|
return 1
|
||||||
fi
|
fi
|
||||||
elif [[ "$MODULE_REQ_VERSION" == "latest" ]]; then
|
elif [[ "$MODULE_REQ_VERSION" == "latest" ]]; then
|
||||||
msg_info "Updating $MODULE_NAME to latest version"
|
msg_info "Updating $MODULE_NAME to latest version"
|
||||||
if ! $STD npm install -g "${MODULE_NAME}@latest"; then
|
if ! $STD npm install -g "${MODULE_NAME}@latest"; then
|
||||||
msg_error "Failed to update $MODULE_NAME to latest version"
|
msg_error "Failed to update $MODULE_NAME to latest version"
|
||||||
exit 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
msg_info "Installing $MODULE_NAME@$MODULE_REQ_VERSION"
|
msg_info "Installing $MODULE_NAME@$MODULE_REQ_VERSION"
|
||||||
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}"; then
|
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}"; then
|
||||||
msg_error "Failed to install $MODULE_NAME@$MODULE_REQ_VERSION"
|
msg_error "Failed to install $MODULE_NAME@$MODULE_REQ_VERSION"
|
||||||
exit 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -1527,8 +1609,9 @@ function setup_php() {
|
|||||||
local PHP_MODULE="${PHP_MODULE:-}"
|
local PHP_MODULE="${PHP_MODULE:-}"
|
||||||
local PHP_APACHE="${PHP_APACHE:-NO}"
|
local PHP_APACHE="${PHP_APACHE:-NO}"
|
||||||
local PHP_FPM="${PHP_FPM:-NO}"
|
local PHP_FPM="${PHP_FPM:-NO}"
|
||||||
local DISTRO_CODENAME
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
DISTRO_CODENAME=$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
||||||
|
|
||||||
local DEFAULT_MODULES="bcmath,cli,curl,gd,intl,mbstring,opcache,readline,xml,zip"
|
local DEFAULT_MODULES="bcmath,cli,curl,gd,intl,mbstring,opcache,readline,xml,zip"
|
||||||
local COMBINED_MODULES
|
local COMBINED_MODULES
|
||||||
@@ -1558,16 +1641,43 @@ function setup_php() {
|
|||||||
msg_info "Setup PHP $PHP_VERSION"
|
msg_info "Setup PHP $PHP_VERSION"
|
||||||
elif [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
|
elif [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
|
||||||
msg_info "Old PHP $CURRENT_PHP detected, Setup new PHP $PHP_VERSION"
|
msg_info "Old PHP $CURRENT_PHP detected, Setup new PHP $PHP_VERSION"
|
||||||
$STD apt-get purge -y "php${CURRENT_PHP//./}"* || true
|
$STD apt purge -y "php${CURRENT_PHP//./}"* || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Ensure Sury repo is available
|
# Ensure Sury repo is available
|
||||||
if [[ ! -f /etc/apt/sources.list.d/php.list ]]; then
|
if [[ ! -f /etc/apt/sources.list.d/php.sources ]]; then
|
||||||
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
|
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
|
||||||
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
|
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
|
||||||
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ ${DISTRO_CODENAME} main" \
|
|
||||||
>/etc/apt/sources.list.d/php.list
|
# Fallback logic for PHP repos
|
||||||
$STD apt-get update
|
local SUITE="$DISTRO_CODENAME"
|
||||||
|
if ! curl -fsSL "https://packages.sury.org/php/dists/$DISTRO_CODENAME/Release" &>/dev/null; then
|
||||||
|
case "$DISTRO_ID" in
|
||||||
|
debian)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
trixie) SUITE="bookworm" ;;
|
||||||
|
*) SUITE="bookworm" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
ubuntu)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
oracular | noble) SUITE="jammy" ;;
|
||||||
|
*) SUITE="jammy" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
msg_info "Using fallback suite: $SUITE (original: $DISTRO_CODENAME)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF >/etc/apt/sources.list.d/php.sources
|
||||||
|
Types: deb
|
||||||
|
URIs: https://packages.sury.org/php/
|
||||||
|
Suites: $SUITE
|
||||||
|
Components: main
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /usr/share/keyrings/deb.sury.org-php.gpg
|
||||||
|
EOF
|
||||||
|
$STD apt update
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Build module list
|
# Build module list
|
||||||
@@ -1588,14 +1698,14 @@ function setup_php() {
|
|||||||
if [[ "$PHP_APACHE" == "YES" ]]; then
|
if [[ "$PHP_APACHE" == "YES" ]]; then
|
||||||
if ! dpkg -l | grep -q "libapache2-mod-php${PHP_VERSION}"; then
|
if ! dpkg -l | grep -q "libapache2-mod-php${PHP_VERSION}"; then
|
||||||
msg_info "Installing Apache with PHP${PHP_VERSION} support"
|
msg_info "Installing Apache with PHP${PHP_VERSION} support"
|
||||||
$STD apt-get install -y apache2 libapache2-mod-php${PHP_VERSION}
|
$STD apt install -y apache2 libapache2-mod-php${PHP_VERSION}
|
||||||
else
|
else
|
||||||
msg_info "Apache with PHP${PHP_VERSION} already installed – skipping install"
|
msg_info "Apache with PHP${PHP_VERSION} already installed – skipping install"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# setup / update PHP modules
|
# setup / update PHP modules
|
||||||
$STD apt-get install -y $MODULE_LIST
|
$STD apt install -y $MODULE_LIST
|
||||||
msg_ok "Setup PHP $PHP_VERSION"
|
msg_ok "Setup PHP $PHP_VERSION"
|
||||||
|
|
||||||
# optional stop old PHP-FPM service
|
# optional stop old PHP-FPM service
|
||||||
@@ -1610,12 +1720,12 @@ function setup_php() {
|
|||||||
[[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini")
|
[[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini")
|
||||||
for ini in "${PHP_INI_PATHS[@]}"; do
|
for ini in "${PHP_INI_PATHS[@]}"; do
|
||||||
if [[ -f "$ini" ]]; then
|
if [[ -f "$ini" ]]; then
|
||||||
$STD msg_info "Patching $ini"
|
msg_info "Patching $ini"
|
||||||
sed -i "s|^memory_limit = .*|memory_limit = ${PHP_MEMORY_LIMIT}|" "$ini"
|
sed -i "s|^memory_limit = .*|memory_limit = ${PHP_MEMORY_LIMIT}|" "$ini"
|
||||||
sed -i "s|^upload_max_filesize = .*|upload_max_filesize = ${PHP_UPLOAD_MAX_FILESIZE}|" "$ini"
|
sed -i "s|^upload_max_filesize = .*|upload_max_filesize = ${PHP_UPLOAD_MAX_FILESIZE}|" "$ini"
|
||||||
sed -i "s|^post_max_size = .*|post_max_size = ${PHP_POST_MAX_SIZE}|" "$ini"
|
sed -i "s|^post_max_size = .*|post_max_size = ${PHP_POST_MAX_SIZE}|" "$ini"
|
||||||
sed -i "s|^max_execution_time = .*|max_execution_time = ${PHP_MAX_EXECUTION_TIME}|" "$ini"
|
sed -i "s|^max_execution_time = .*|max_execution_time = ${PHP_MAX_EXECUTION_TIME}|" "$ini"
|
||||||
$STD msg_ok "Patched $ini"
|
msg_ok "Patched $ini"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -1660,60 +1770,85 @@ function setup_postgresql() {
|
|||||||
local PG_VERSION="${PG_VERSION:-16}"
|
local PG_VERSION="${PG_VERSION:-16}"
|
||||||
local PG_MODULES="${PG_MODULES:-}"
|
local PG_MODULES="${PG_MODULES:-}"
|
||||||
local CURRENT_PG_VERSION=""
|
local CURRENT_PG_VERSION=""
|
||||||
local DISTRO
|
local DISTRO_ID DISTRO_CODENAME
|
||||||
local NEED_PG_INSTALL=false
|
local NEED_PG_INSTALL=false
|
||||||
DISTRO="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
|
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
||||||
|
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
||||||
|
|
||||||
if command -v psql >/dev/null; then
|
if command -v psql >/dev/null; then
|
||||||
CURRENT_PG_VERSION="$(psql -V | awk '{print $3}' | cut -d. -f1)"
|
CURRENT_PG_VERSION="$(psql -V | awk '{print $3}' | cut -d. -f1)"
|
||||||
if [[ "$CURRENT_PG_VERSION" == "$PG_VERSION" ]]; then
|
if [[ "$CURRENT_PG_VERSION" == "$PG_VERSION" ]]; then
|
||||||
: # PostgreSQL is already at the desired version – no action needed
|
: # PostgreSQL is already at the desired version
|
||||||
else
|
else
|
||||||
$STD msg_info "Detected PostgreSQL $CURRENT_PG_VERSION, preparing upgrade to $PG_VERSION"
|
msg_info "Detected PostgreSQL $CURRENT_PG_VERSION, preparing upgrade to $PG_VERSION"
|
||||||
NEED_PG_INSTALL=true
|
NEED_PG_INSTALL=true
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
|
||||||
NEED_PG_INSTALL=true
|
NEED_PG_INSTALL=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$NEED_PG_INSTALL" == true ]]; then
|
if [[ "$NEED_PG_INSTALL" == true ]]; then
|
||||||
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
||||||
$STD msg_info "Dumping PostgreSQL $CURRENT_PG_VERSION data"
|
msg_info "Dumping PostgreSQL $CURRENT_PG_VERSION data"
|
||||||
su - postgres -c "pg_dumpall > /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
|
su - postgres -c "pg_dumpall > /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
|
||||||
$STD msg_ok "Data dump completed"
|
msg_ok "Data dump completed"
|
||||||
|
|
||||||
systemctl stop postgresql
|
systemctl stop postgresql
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f /etc/apt/sources.list.d/pgdg.list /etc/apt/trusted.gpg.d/postgresql.gpg
|
rm -f /etc/apt/sources.list.d/pgdg.* /etc/apt/keyrings/postgresql.gpg
|
||||||
|
|
||||||
$STD msg_info "Adding PostgreSQL PGDG repository"
|
msg_info "Adding PostgreSQL PGDG repository"
|
||||||
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc |
|
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc |
|
||||||
gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
|
gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
|
||||||
|
|
||||||
echo "deb https://apt.postgresql.org/pub/repos/apt ${DISTRO}-pgdg main" \
|
# Fallback logic for PostgreSQL repos
|
||||||
>/etc/apt/sources.list.d/pgdg.list
|
local SUITE="$DISTRO_CODENAME"
|
||||||
|
if ! curl -fsSL "https://apt.postgresql.org/pub/repos/apt/dists/${DISTRO_CODENAME}-pgdg/Release" &>/dev/null; then
|
||||||
|
case "$DISTRO_ID" in
|
||||||
|
debian)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
trixie) SUITE="bookworm" ;;
|
||||||
|
*) SUITE="bookworm" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
ubuntu)
|
||||||
|
case "$DISTRO_CODENAME" in
|
||||||
|
oracular | noble) SUITE="jammy" ;;
|
||||||
|
*) SUITE="jammy" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
msg_info "Using fallback suite: $SUITE (original: $DISTRO_CODENAME)"
|
||||||
|
fi
|
||||||
|
|
||||||
$STD apt-get update
|
cat <<EOF >/etc/apt/sources.list.d/pgdg.sources
|
||||||
$STD msg_ok "Repository added"
|
Types: deb
|
||||||
|
URIs: https://apt.postgresql.org/pub/repos/apt
|
||||||
|
Suites: ${SUITE}-pgdg
|
||||||
|
Components: main
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Signed-By: /etc/apt/keyrings/postgresql.gpg
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$STD apt update
|
||||||
|
msg_ok "Repository added"
|
||||||
|
|
||||||
msg_info "Setup PostgreSQL $PG_VERSION"
|
msg_info "Setup PostgreSQL $PG_VERSION"
|
||||||
$STD apt-get install -y "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}"
|
$STD apt install -y "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}"
|
||||||
|
|
||||||
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
||||||
$STD apt-get purge -y "postgresql-${CURRENT_PG_VERSION}" "postgresql-client-${CURRENT_PG_VERSION}" || true
|
$STD apt purge -y "postgresql-${CURRENT_PG_VERSION}" "postgresql-client-${CURRENT_PG_VERSION}" || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
systemctl enable -q --now postgresql
|
systemctl enable -q --now postgresql
|
||||||
|
|
||||||
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
||||||
$STD msg_info "Restoring dumped data"
|
msg_info "Restoring dumped data"
|
||||||
su - postgres -c "psql < /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
|
su - postgres -c "psql < /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
|
||||||
$STD msg_ok "Data restored"
|
msg_ok "Data restored"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$STD msg_ok "PostgreSQL $PG_VERSION installed"
|
msg_ok "PostgreSQL $PG_VERSION installed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install optional PostgreSQL modules
|
# Install optional PostgreSQL modules
|
||||||
@@ -1721,13 +1856,13 @@ function setup_postgresql() {
|
|||||||
IFS=',' read -ra MODULES <<<"$PG_MODULES"
|
IFS=',' read -ra MODULES <<<"$PG_MODULES"
|
||||||
for module in "${MODULES[@]}"; do
|
for module in "${MODULES[@]}"; do
|
||||||
local pkg="postgresql-${PG_VERSION}-${module}"
|
local pkg="postgresql-${PG_VERSION}-${module}"
|
||||||
$STD msg_info "Setup PostgreSQL module/s: $pkg"
|
msg_info "Setup PostgreSQL module/s: $pkg"
|
||||||
$STD apt-get install -y "$pkg" || {
|
$STD apt install -y "$pkg" || {
|
||||||
msg_error "Failed to install $pkg"
|
msg_error "Failed to install $pkg"
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
done
|
done
|
||||||
$STD msg_ok "Setup PostgreSQL modules"
|
msg_ok "Setup PostgreSQL modules"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1801,7 +1936,7 @@ function setup_ruby() {
|
|||||||
|
|
||||||
if [[ "$RUBY_INSTALL_RAILS" == "true" ]]; then
|
if [[ "$RUBY_INSTALL_RAILS" == "true" ]]; then
|
||||||
msg_info "Setup Rails via gem"
|
msg_info "Setup Rails via gem"
|
||||||
gem install rails
|
$STD gem install rails
|
||||||
msg_ok "Setup Rails $(rails -v)"
|
msg_ok "Setup Rails $(rails -v)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2013,8 +2148,8 @@ function setup_yq() {
|
|||||||
local GITHUB_REPO="mikefarah/yq"
|
local GITHUB_REPO="mikefarah/yq"
|
||||||
|
|
||||||
if ! command -v jq &>/dev/null; then
|
if ! command -v jq &>/dev/null; then
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y jq || {
|
$STD apt install -y jq || {
|
||||||
msg_error "Failed to install jq"
|
msg_error "Failed to install jq"
|
||||||
rm -rf "$TMP_DIR"
|
rm -rf "$TMP_DIR"
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
Reference in New Issue
Block a user