2021-12-17 05:09:20 +00:00
#!/bin/bash
set -o errexit
is_command_present( ) {
type " $1 " >/dev/null 2>& 1
}
is_mac( ) {
[ [ $OSTYPE = = darwin* ] ]
}
# This function checks if the relevant ports required by Appsmith are available or not
# The script should error out in case they aren't available
check_ports_occupied( ) {
local port_check_output
local ports_pattern = "80|443"
if is_mac; then
port_check_output = " $( netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /^.*\.(' " $ports_pattern " ')$/' ) "
elif is_command_present ss; then
# The `ss` command seems to be a better/faster version of `netstat`, but is not available on all Linux
# distributions by default. Other distributions have `ss` but no `netstat`. So, we try for `ss` first, then
# fallback to `netstat`.
port_check_output = " $( ss --all --numeric --tcp | awk '$1 == "LISTEN" && $4 ~ /^.*:(' " $ports_pattern " ')$/' ) "
elif is_command_present netstat; then
port_check_output = " $( netstat --all --numeric --tcp | awk '$6 == "LISTEN" && $4 ~ /^.*:(' " $ports_pattern " ')$/' ) "
fi
if [ [ -n $port_check_output ] ] ; then
echo "***************** ERROR *****************"
echo "Appsmith requires ports 80 & 443 to be open. Please shut down any other service(s) that may be running on these ports."
2023-10-05 06:37:18 +00:00
echo "You can run appsmith on another port following this guide https://docs.appsmith.com/help-and-support/troubleshooting-guide/deployment-errors"
2021-12-17 05:09:20 +00:00
echo "*****************************************"
echo ""
exit 1
fi
}
install_docker( ) {
echo "*****************************************"
echo "Setting up docker repos"
if [ [ $package_manager = = apt-get ] ] ; then
apt_cmd = "sudo apt-get --yes --quiet"
$apt_cmd update
$apt_cmd install software-properties-common gnupg-agent
curl -fsSL " https://download.docker.com/linux/ $os /gpg " | sudo apt-key add -
sudo add-apt-repository \
" deb [arch=amd64] https://download.docker.com/linux/ $os $( lsb_release -cs) stable "
$apt_cmd update
echo "Installing docker"
$apt_cmd install docker-ce docker-ce-cli containerd.io
elif [ [ $package_manager = = zypper ] ] ; then
zypper_cmd = "sudo zypper --quiet --no-gpg-checks --non-interactive"
echo "Installing docker"
if [ [ $os = = sles ] ] ; then
os_sp = " $( cat /etc/*-release | awk -F= '$1 == "VERSION_ID" { gsub(/"/, ""); print $2; exit }' ) "
os_arch = " $( uname -i) "
sudo SUSEConnect -p " sle-module-containers/ $os_sp / $os_arch " -r ''
fi
$zypper_cmd install docker docker-runc containerd
sudo systemctl enable docker.service
else
yum_cmd = "sudo yum --assumeyes --quiet"
$yum_cmd install yum-utils
os_in_repo_link = " $os "
if [ [ $os = = rhel ] ] ; then
# For RHEL, there's no separate repo link. We can use the CentOS one though.
os_in_repo_link = centos
fi
sudo yum-config-manager --add-repo " https://download.docker.com/linux/ $os_in_repo_link /docker-ce.repo "
echo "Installing docker"
$yum_cmd install docker-ce docker-ce-cli containerd.io
fi
}
install_docker_compose( ) {
if [ [ $package_manager = = "apt-get" || $package_manager = = "zypper" || $package_manager = = "yum" ] ] ; then
if [ [ ! -f /usr/bin/docker-compose ] ] ; then
echo "*****************************************"
echo "Installing docker-compose"
sudo curl -L " https://github.com/docker/compose/releases/download/1.26.0/docker-compose- $( uname -s) - $( uname -m) " -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
echo "docker-compose installed!"
echo ""
fi
else
echo "************* IMPORTANT READ *************"
echo "docker-compose not found! Please install docker-compose first and then continue with this installation."
echo "Refer https://docs.docker.com/compose/install/ for installing docker-compose."
echo "******************************************"
exit 1
fi
}
start_docker( ) {
if ! sudo systemctl is-active docker.service > /dev/null; then
echo "Starting docker service"
sudo systemctl start docker.service
fi
}
check_os( ) {
if is_mac; then
package_manager = "brew"
desired_os = 1
os = "mac"
return
fi
local os_name = " $(
cat /etc/*-release \
| awk -F= '$1 == "NAME" { gsub(/"/, ""); print $2; exit }' \
| tr '[:upper:]' '[:lower:]'
) "
case " $os_name " in
ubuntu*)
desired_os = 1
os = "ubuntu"
package_manager = "apt-get"
; ;
debian*)
desired_os = 1
os = "debian"
package_manager = "apt-get"
; ;
linux\ mint*)
desired_os = 1
os = "linux mint"
package_manager = "apt-get"
; ;
red\ hat*)
desired_os = 1
os = "rhel"
package_manager = "yum"
; ;
centos*)
desired_os = 1
os = "centos"
package_manager = "yum"
; ;
sles*)
desired_os = 1
os = "sles"
package_manager = "zypper"
; ;
opensuse*)
desired_os = 1
os = "opensuse"
package_manager = "zypper"
; ;
*)
desired_os = 0
os = " Not Found: $os_name "
esac
}
confirm( ) {
local default = " $1 " # Should be `y` or `n`.
local prompt = " $2 "
local options = "y/N"
if [ [ $default = = y || $default = = Y ] ] ; then
options = "Y/n"
fi
local answer
read -rp " $prompt [ $options ] " answer
if [ [ -z $answer ] ] ; then
# No answer given, the user just hit the Enter key. Take the default value as the answer.
answer = " $default "
else
# An answer was given. This means the user didn't get to hit Enter so the cursor on the same line. Do an empty
# echo so the cursor moves to a new line.
echo
fi
[ [ yY = ~ $answer ] ]
}
echo_contact_support( ) {
echo " Please contact <support@appsmith.com> with your OS details and version ${ 1 :- . } "
}
bye( ) {
if [ " $? " -ne 0 ] ; then
set +o errexit
exit 1
fi
}
# Checking OS and assigning package manager
desired_os = 0
os = ""
echo -e "🕵️ Detecting your OS"
check_os
# Run bye if failure happens
trap bye EXIT
if [ [ $desired_os -eq 0 ] ] ; then
echo ""
echo "This script is currently meant to install Appsmith on Mac OS X, Ubuntu, Debian, Linux Mint, Red Hat, CentOS, SLES or openSUSE machines."
echo_contact_support " if you wish to extend this support."
exit 1
fi
check_ports_occupied
install_dir = " $1 "
if [ [ -e " $install_dir " && -n " $( ls -A " $install_dir " ) " ] ] ; then
echo " The path ' $install_dir ' is already present and is non-empty. Please run the script again with a different path to install new. "
echo_contact_support " if you're facing problems with the auto-updates."
exit 1
fi
# Check is Docker daemon is installed and available. If not, the install & start Docker for Linux machines. We cannot automatically install Docker Desktop on Mac OS
if ! is_command_present docker; then
if [ [ $package_manager = = "apt-get" || $package_manager = = "zypper" || $package_manager = = "yum" ] ] ; then
install_docker
else
echo ""
echo "***************** ERROR *****************"
echo "Docker Desktop must be installed manually on Mac OS to proceed. Docker can only be installed automatically on Ubuntu / openSUSE / SLES / Redhat / Cent OS"
echo "https://docs.docker.com/docker-for-mac/install/"
echo "*****************************************"
exit 1
fi
fi
# Install docker-compose
if ! is_command_present docker-compose; then
install_docker_compose
fi
# Starting docker service
if [ [ $package_manager = = "yum" || $package_manager = = "zypper" || $package_manager = = "apt-get" ] ] ; then
start_docker
fi
# Add usergroup docker
sudo usermod -aG docker ${ USER }