#!/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." echo "You can run appsmith on another port following this guide https://docs.appsmith.com/v/v1.2.1/troubleshooting-guide/deployment-errors" 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 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}