mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 04:04:55 +08:00
265 lines
7.5 KiB
Bash
Executable File
265 lines
7.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Description: One click install for hyperswitch router
|
|
#
|
|
#
|
|
# Global config
|
|
|
|
if [[ "${TRACE-0}" == "1" ]]; then
|
|
set -o xtrace
|
|
fi
|
|
|
|
RUST_MSRV="1.78.0"
|
|
_DB_NAME="hyperswitch_db"
|
|
_DB_USER="db_user"
|
|
_DB_PASS="db_password"
|
|
|
|
OSTYPE=${OSTYPE:-}
|
|
|
|
PRE_INSTALL_MSG="Dependency install script.\n
|
|
The script assumes 'curl' and build essentials like gcc/clang are already installed.\n
|
|
\n
|
|
The script will\n
|
|
1. Install or update RUST using RUSTUP\n
|
|
2. Install Postgresql server and redis server, if found missing\n
|
|
3. Install diesel_cli program to setup database\n
|
|
4. Setup database and create necessary schema\n
|
|
"
|
|
|
|
POST_INSTALL_MSG="\n
|
|
Install was successful.\n
|
|
If rust was installed, restart the shell or configure current shell using 'SOURCE $HOME/.cargo/env'\n
|
|
"
|
|
|
|
|
|
# Used variables must be initialized
|
|
set -o nounset
|
|
|
|
# utilities
|
|
# convert semver to comparable integer
|
|
if [[ "$(id -u)" -ne 0 ]]; then
|
|
print_info "requires sudo"
|
|
SUDO=sudo
|
|
else
|
|
SUDO=""
|
|
fi
|
|
|
|
ver () {
|
|
printf "%03d%03d%03d%03d" "$(echo "$1" | tr '.' ' ')";
|
|
}
|
|
|
|
PROGNAME="$(basename $0)"
|
|
print_info () {
|
|
echo -e "$PROGNAME: $*"
|
|
}
|
|
|
|
err () {
|
|
print_info "*ERROR*:" $*
|
|
exit 1
|
|
}
|
|
|
|
need_cmd () {
|
|
if ! command -v $1 > /dev/null
|
|
then
|
|
err "Command \"${1}\" not found. Bailing out"
|
|
fi
|
|
|
|
}
|
|
|
|
prompt () {
|
|
read -p "$*? [y/N] :" ANSWER
|
|
case $ANSWER in
|
|
[Yy]*) return 1;;
|
|
*) return 0;;
|
|
esac
|
|
}
|
|
|
|
init_start_postgres () {
|
|
|
|
if [[ "${OSTYPE}" == "darwin"* ]]; then
|
|
initdb -U postgres -D /var/lib/postgres/data
|
|
elif command -v su > /dev/null; then
|
|
$SUDO su -c "initdb -D /var/lib/postgres/data" postgres
|
|
elif command -v sudo > /dev/null; then
|
|
sudo -u postgres "initdb -D /var/lib/postgres/data"
|
|
else
|
|
err "Don't know how to switch to postgres user to run commands"
|
|
fi
|
|
|
|
if command -v brew > /dev/null; then
|
|
brew services start postgresql
|
|
elif command -v service > /dev/null; then
|
|
service postgresql start
|
|
elif command -v systemctl > /dev/null; then
|
|
$SUDO systemctl start postgresql.service
|
|
else
|
|
print_info "Unable to start postgres. Please start manually"
|
|
fi
|
|
}
|
|
|
|
init_start_redis () {
|
|
|
|
if command -v brew > /dev/null; then
|
|
brew services start redis
|
|
elif command -v service > /dev/null; then
|
|
service redis-server start
|
|
service redis start
|
|
elif command -v systemctl > /dev/null; then
|
|
$SUDO systemctl start redis.service
|
|
$SUDO systemctl start redis-server.service
|
|
else
|
|
print_info "Unable to start redis. Please start manually"
|
|
fi
|
|
}
|
|
|
|
print_info ${PRE_INSTALL_MSG}
|
|
|
|
if prompt "Would you like to continue"; then
|
|
err "Aborted by user"
|
|
fi
|
|
|
|
# verify rust installation and version
|
|
if command -v cargo > /dev/null; then
|
|
|
|
print_info "\"cargo\" found. Verifying rustc version"
|
|
|
|
need_cmd rustc
|
|
|
|
RUST_VERSION="$(rustc -V | cut -d " " -f 2)"
|
|
|
|
_HAVE_VERSION="$(ver ${RUST_VERSION})"
|
|
_NEED_VERSION="$(ver ${RUST_MSRV})"
|
|
|
|
print_info "Found rust version \"${RUST_VERSION}\". MSRV is \"${RUST_MSRV}\""
|
|
|
|
if [[ ${_HAVE_VERSION} -lt ${_NEED_VERSION} ]] ; then
|
|
|
|
if command -v rustup > /dev/null; then
|
|
print_info "found rustup. Trying to install ${RUST_MSRV} version..."
|
|
rustup install "${RUST_MSRV}"
|
|
else
|
|
print_info "Couldn't find \"rustup\". ***needs upgrade***, but skipping..."
|
|
fi
|
|
else
|
|
print_info "Skipping update"
|
|
fi
|
|
else
|
|
print_info "\"cargo\" command not found..."
|
|
if ! prompt "Would you like to install \"rust\" using \"rustup\""
|
|
then
|
|
print_info "Installing \"rust\" through \"rustup\""
|
|
need_cmd curl
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
|
# add to path
|
|
. "$HOME/.cargo/env"
|
|
need_cmd rustc
|
|
else
|
|
print_info "Rust installation was aborted"
|
|
err "This application needs \"rust\""
|
|
fi
|
|
fi
|
|
|
|
# Dependency checks
|
|
print_info "checking for dependencies"
|
|
|
|
install_dep () {
|
|
$INSTALL_CMD $*
|
|
}
|
|
|
|
if [[ ! -x "$(command -v psql)" ]] || [[ ! -x "$(command -v redis-server)" ]] ; then
|
|
print_info "Missing dependencies. Trying to install"
|
|
|
|
# java has an apt which seems to mess up when we look for apt
|
|
if command -v apt-get > /dev/null; then
|
|
INSTALL_CMD="$SUDO apt-get install -y"
|
|
elif command -v yum > /dev/null; then
|
|
INSTALL_CMD="$SUDO yum -y install"
|
|
elif command -v pacman > /dev/null; then
|
|
INSTALL_CMD="$SUDO pacman -S"
|
|
elif command -v brew > /dev/null; then
|
|
INSTALL_CMD="brew install"
|
|
else
|
|
err "Unable to identify the package manager"
|
|
fi
|
|
|
|
if ! command -v psql > /dev/null
|
|
then
|
|
install_dep postgresql
|
|
install_dep postgresql-contrib # not needed for macos?
|
|
install_dep postgresql-devel # needed for diesel_cli in some linux distributions
|
|
install_dep postgresql-libs # needed for diesel_cli in some linux distributions
|
|
init_start_postgres # installing libpq messes with initdb creating two copies. better to run it better libpq.
|
|
install_dep libpq-dev || install_dep libpq
|
|
else
|
|
print_info "Postgres found. skipping..."
|
|
fi
|
|
|
|
if ! command -v redis-server > /dev/null
|
|
then
|
|
# the package names differ. Need better way to identify correct package name
|
|
install_dep redis || install_dep redis
|
|
init_start_redis
|
|
else
|
|
print_info "Redis found. skipping..."
|
|
fi
|
|
|
|
else
|
|
print_info "No missing dependency."
|
|
fi
|
|
|
|
print_info "Proceeding to setup Database"
|
|
# install diesel cli
|
|
need_cmd cargo
|
|
if ! command -v diesel > /dev/null; then
|
|
print_info "diesel_cli not found. Installing..."
|
|
cargo install diesel_cli --no-default-features --features "postgres"
|
|
else
|
|
print_info "diesel_cli found."
|
|
fi
|
|
|
|
# DB setup
|
|
need_cmd psql
|
|
need_cmd diesel
|
|
read -p "Enter name for database [default: ${_DB_NAME}]: " DB_NAME
|
|
DB_NAME=${DB_NAME:-$_DB_NAME}
|
|
|
|
read -p "Enter username for ${DB_NAME} [default: ${_DB_USER}]: " DB_USER
|
|
DB_USER=${DB_USER:-$_DB_USER}
|
|
|
|
read -sp "Enter password for ${DB_USER} [default: ${_DB_PASS}]: " DB_PASS
|
|
DB_PASS=${DB_PASS:-$_DB_PASS}
|
|
|
|
print_info ""
|
|
|
|
print_info "Creating DB \"${DB_NAME}\" and user \"${DB_USER}\" with provided password"
|
|
|
|
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
psql -e -U postgres -c "CREATE DATABASE ${DB_NAME};"
|
|
psql -e -U postgres -c "CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASS}';"
|
|
psql -e -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} to ${DB_USER};"
|
|
elif command -v su > /dev/null; then
|
|
$SUDO su -c "psql -e -c \"CREATE DATABASE ${DB_NAME};\"" postgres
|
|
$SUDO su -c "psql -e -c \"CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASS}';\"" postgres
|
|
$SUDO su -c "psql -e -c \"GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} to ${DB_USER};\"" postgres
|
|
elif command -v sudo > /dev/null; then
|
|
sudo -u postgres psql -e -c "CREATE DATABASE ${DB_NAME};"
|
|
sudo -u postgres psql -e -U postgres -c "CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASS}';"
|
|
sudo -u postgres psql -e -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} to ${DB_USER};"
|
|
else
|
|
err "Don't know how to switch to postgres user to run commands"
|
|
fi
|
|
|
|
# run migrations
|
|
print_info "Running migrations"
|
|
MIGRATION_CMD="diesel migration --database-url=postgres://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME} run"
|
|
|
|
if [[ -d "migrations" ]]; then
|
|
$MIGRATION_CMD
|
|
else
|
|
print_info "\"migrations\" directory not found. Please clone the repo/run the below command in the application directory"
|
|
print_info "CMD \"${MIGRATION_CMD}\""
|
|
fi
|
|
|
|
print_info "${POST_INSTALL_MSG}"
|