observability.svc.plus/bin/install
2026-02-01 20:53:55 +08:00

161 lines
6.0 KiB
Bash
Executable File

#!/bin/bash
#set -uo pipefail
#==============================================================#
# File : install
# Desc : download & install pigsty src
# Ctime : 2022-10-30
# Mtime : 2026-01-27
# Path : https://repo.pigsty.io/get (global, default)
# Usage : curl -fsSL https://repo.pigsty.io/get | bash
# Docs : https://pigsty.io/docs/setup/install
# Deps : curl
# Author : Ruohang Feng (rh@vonng.com)
# License : Apache-2.0 @ https://pigsty.io/docs/about/license/
#==============================================================#
DEFAULT_VERSION=v4.0.0
# To install the latest version of pigsty (v4.0.0):
# curl -fsSL https://repo.pigsty.io/get | bash; cd ~/pigsty;
# curl -fsSL https://repo.pigsty.cc/get | bash; cd ~/pigsty;
# To install a specific version of pigsty (e.g. v4.0.0)
# curl -fsSL https://repo.pigsty.io/get | bash -s v4.0.0
# curl -fsSL https://repo.pigsty.cc/get | bash -s v4.0.0
#--------------------------------------------------------------#
# Log Util
#--------------------------------------------------------------#
# if output is a terminal, setup color alias, else use empty str
if [[ -t 1 ]]; then
__CN='\033[0m';__CK='\033[0;30m';__CR='\033[0;31m';__CG='\033[0;32m';
__CY='\033[0;33m';__CB='\033[0;34m';__CM='\033[0;35m';__CC='\033[0;36m';__CW='\033[0;37m';
else
__CN='';__CB='';__CR='';__CG='';__CY='';__CB='';__CM='';__CC='';__CW='';
fi
function log_info() { printf "[${__CG} OK ${__CN}] ${__CG}$*${__CN}\n"; }
function log_warn() { printf "[${__CY}WARN${__CN}] ${__CY}$*${__CN}\n"; }
function log_error() { printf "[${__CR}FAIL${__CN}] ${__CR}$*${__CN}\n"; }
function log_red() { printf "[${__CR}WARN${__CN}] ${__CR}$*${__CN}\n"; }
function log_debug() { printf "[${__CB}HINT${__CN}] ${__CB}$*${__CN}\n"; }
function log_title() { printf "[${__CG}$1${__CN}] ${__CG}$2${__CN}\n"; }
function log_hint() { printf "${__CB}$*${__CN}\n"; }
function log_line() { printf "${__CM}[$*] ===========================================${__CN}\n"; }
#--------------------------------------------------------------#
# Version
#--------------------------------------------------------------#
# arg1 > env > default
if [[ -n "$1" ]]; then
VERSION="$1"
VERSION_FROM="arg"
elif [[ -n "${PIGSTY_VERSION}" ]]; then
VERSION="${PIGSTY_VERSION}"
VERSION_FROM="env"
else
VERSION=${DEFAULT_VERSION}
VERSION_FROM="default"
fi
#--------------------------------------------------------------#
# Reference
#--------------------------------------------------------------#
log_line "${VERSION}"
log_hint "$ curl -fsSL https://repo.pigsty.io/get | bash"
log_title "Docs" "https://pigsty.io/docs"
log_title "Demo" "https://demo.pigsty.io"
log_title "Repo" "https://github.com/pgsty/pigsty"
log_line "Download"
log_info "version = ${VERSION} (from ${VERSION_FROM})"
#--------------------------------------------------------------#
# Download
#--------------------------------------------------------------#
SRC_FILENAME="pigsty-${VERSION}.tgz"
DOWNLOAD_TO="/tmp/${SRC_FILENAME}"
DOWNLOAD_URL="https://repo.pigsty.io/src/${SRC_FILENAME}"
# download file from url, if file already exists with same size, skip download
function download_file(){
local data_url=$1
local data_file=$2
log_hint "curl -fSL ${data_url} -o ${data_file}"
# if file exists and have the exact same size, just use it and skip downloading
if [[ -f ${data_file} ]]; then
if [[ "$(uname)" == "Darwin" ]]; then
size=$(stat -f %z "${data_file}")
else
size=$(stat -c %s "${data_file}")
fi
curl_size=$(curl -fsLI ${data_url} | grep -i 'Content-Length' | awk '{print $2}' | tr -d '\r')
if [[ ${size} -eq ${curl_size} ]]; then
log_warn "tarball = ${data_file} exists, size = ${size}, use it"
#log_hint "rm -rf ${data_file}; # remove it to redownload source tarball"
return 0
fi
fi
curl -# -fSL ${data_url} -o ${data_file}
return $?
}
download_file "${DOWNLOAD_URL}" "${DOWNLOAD_TO}"
if [[ $? -ne 0 ]]; then
log_error "fail to download pigsty source from ${DOWNLOAD_URL}"
log_hint "check: https://pigsty.io/docs/setup"
log_hint "alternative url: ${SECONDARY_SRC_URL}"
exit 2
fi
log_info "md5sums = $(md5sum ${DOWNLOAD_TO})"
#--------------------------------------------------------------#
# Install
#--------------------------------------------------------------#
INSTALL_TO="${HOME}/pigsty"
INSTALL_DIR=$(dirname ${INSTALL_TO})
log_line "Install"
if [[ $(whoami) == "root" ]]; then
log_warn "os user = root , it's recommended to use a non-root sudo-able admin"
fi
# extract to home dir if ~/pigsty not exists
if [[ ! -d ${INSTALL_TO} ]]; then
log_info "install = ${INSTALL_TO}, from ${DOWNLOAD_TO}"
tar -xf "${DOWNLOAD_TO}" -C "${INSTALL_DIR}";
else
log_warn "pigsty already installed on '${INSTALL_TO}', if you wish to overwrite:"
log_hint "sudo rm -rf /tmp/pigsty_bk; cp -r ${INSTALL_TO} /tmp/pigsty_bk; # backup old"
log_hint "sudo rm -rf /tmp/pigsty; tar -xf ${DOWNLOAD_TO} -C /tmp/; # extract new"
log_hint "rsync -av --exclude='/pigsty.yml' --exclude='/files/pki/***' /tmp/pigsty/ ${INSTALL_TO}/; # rsync src"
fi
#--------------------------------------------------------------#
# Bootstrap
#--------------------------------------------------------------#
# check ansible is installed
log_line "Bootstrap"
if command -v ansible-playbook >/dev/null ; then
log_info "ansible = ready"
log_info "bootstrap = skip"
log_hint "you can run ./bootstrap to extrac offline package and install ansible"
else
log_warn "ansible = not found, bootstrap"
cd "${INSTALL_TO}"
./bootstrap
fi
#--------------------------------------------------------------#
# Next Hint
#--------------------------------------------------------------#
log_line "What's Next"
log_hint "cd ${INSTALL_TO}"
log_hint './configure # [OPTIONAL] preflight-check and config generation'
log_hint './deploy.yml # deployment everything described by your config'