2021-02-16 11:02:57 +05:30
#!/bin/bash
set -o errexit
is_command_present( ) {
type " $1 " >/dev/null 2>& 1
}
# Check whether 'wget' command exists.
has_wget( ) {
has_cmd wget
}
# Check whether 'curl' command exists.
has_curl( ) {
has_cmd curl
}
# Check whether the given command exists.
has_cmd( ) {
command -v " $1 " > /dev/null 2>& 1
}
is_mac( ) {
[ [ $OSTYPE = = darwin* ] ]
}
check_os( ) {
if is_mac; then
package_manager = "brew"
desired_os = 1
os = "Mac"
return
fi
os_name = " $( cat /etc/*-release | awk -F= '$1 == "NAME" { gsub(/"/, ""); print $2; exit }' ) "
case " $os_name " in
Ubuntu*)
desired_os = 1
os = "ubuntu"
package_manager = "apt-get"
; ;
2021-04-01 21:41:25 +05:30
Amazon\ Linux*)
desired_os = 1
os = "amazon linux"
package_manager = "yum"
; ;
2021-02-16 11:02:57 +05:30
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 = "red hat"
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
2021-04-01 21:41:25 +05:30
os = " Not Found: $os_name "
2021-02-16 11:02:57 +05:30
esac
}
2021-02-16 12:27:44 +05:30
# This function checks if the relevant ports required by SigNoz are available or not
2021-02-16 11:02:57 +05:30
# 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
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Error", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "error": "port not available" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
echo "+++++++++++ ERROR ++++++++++++++++++++++"
2021-02-16 12:27:44 +05:30
echo "SigNoz 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 SigNoz on another port following this guide https://signoz.io/docs/deployment/docker#troubleshooting"
2021-02-16 11:02:57 +05:30
echo "++++++++++++++++++++++++++++++++++++++++"
echo ""
exit 1
fi
}
install_docker( ) {
echo "++++++++++++++++++++++++"
echo "Setting up docker repos"
2021-04-01 21:56:03 +05:30
2021-02-16 11:02:57 +05:30
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
2021-04-01 21:56:03 +05:30
elif [ [ $package_manager = = yum && $os = = 'amazon linux' ] ] ; then
2021-04-01 22:04:39 +05:30
echo
echo "Amazon Linux detected ... "
echo
2021-04-01 22:12:50 +05:30
sudo yum --disablerepo= download.docker.com_linux_amazon install docker
2021-04-01 21:56:03 +05:30
sudo service docker start
2021-02-16 11:02:57 +05:30
else
2021-04-01 22:12:50 +05:30
2021-02-16 11:02:57 +05:30
yum_cmd = "sudo yum --assumeyes --quiet"
$yum_cmd install yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/$os /docker-ce.repo
echo "Installing docker"
$yum_cmd install docker-ce docker-ce-cli containerd.io
fi
}
install_docker_machine( ) {
echo "\nInstalling docker machine ..."
if [ [ $os = = "Mac" ] ] ; then
curl -sL https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-` uname -s` -` uname -m` >/usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine
else
curl -sL https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-` uname -s` -` uname -m` >/tmp/docker-machine
chmod +x /tmp/docker-machine
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
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
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Error", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "error": "Docker Compose not found" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
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( ) {
echo "Starting Docker ..."
if [ $os = = "Mac" ]
then
open --background -a Docker && while ! docker system info > /dev/null 2>& 1; do sleep 1; done
else
if ! sudo systemctl is-active docker.service > /dev/null; then
echo "Starting docker service"
sudo systemctl start docker.service
fi
fi
}
wait_for_containers_start( ) {
local timeout = $1
# The while loop is important because for-loops don't work for dynamic values
while [ [ $timeout -gt 0 ] ] ; do
2021-02-16 11:53:39 +05:30
status_code = " $( curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/api/v1/services/list || true ) "
2021-02-16 11:02:57 +05:30
if [ [ status_code -eq 200 ] ] ; then
break
else
SUPERVISORS = " $( curl -so - http://localhost:8888/druid/indexer/v1/supervisor) "
LEN_SUPERVISORS = " ${# SUPERVISORS } "
if [ [ LEN_SUPERVISORS -ne 19 && $timeout -eq 50 ] ] ; then
2021-02-16 11:53:39 +05:30
echo "No Supervisors found... Re-applying docker compose\n"
2021-02-16 11:02:57 +05:30
sudo docker-compose -f ./docker/docker-compose-tiny.yaml up -d
fi
2021-02-16 23:10:36 +05:30
2021-02-16 11:02:57 +05:30
echo -ne " Waiting for all containers to start. This check will timeout in $timeout seconds...\r\c "
fi
( ( timeout--) )
sleep 1
done
echo ""
}
bye( ) { # Prints a friendly good bye message and exits the script.
if [ " $? " -ne 0 ] ; then
set +o errexit
2021-02-17 01:19:51 +05:30
echo "The containers didn't seem to start correctly. Please run the following command to check containers that may have errored out:"
echo ""
echo -e "sudo docker-compose -f docker/docker-compose-tiny.yaml ps -a"
# echo "Please read our troubleshooting guide https://signoz.io/docs/deployment/docker#troubleshooting"
echo "or reach us on SigNoz for support https://join.slack.com/t/signoz-community/shared_invite/zt-lrjknbbp-J_mI13rlw8pGF4EWBnorJA"
echo "++++++++++++++++++++++++++++++++++++++++"
2021-02-16 23:10:36 +05:30
echo "Please share your email to receive support with the installation"
2021-02-16 11:02:57 +05:30
read -rp 'Email: ' email
2021-02-18 01:03:50 +05:30
while [ [ $email = = "" ] ]
do
read -rp 'Email: ' email
done
2021-02-16 11:02:57 +05:30
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Support", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "email": "' " $email " '" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
echo ""
echo -e "\nWe will reach out to you at the email provided shortly, Exiting for now. Bye! 👋 \n"
exit 0
fi
}
echo -e "👋 Thank you for trying out SigNoz! "
echo ""
# Checking OS and assigning package manager
desired_os = 0
os = ""
echo -e "🕵️ Detecting your OS"
check_os
SIGNOZ_INSTALLATION_ID = $( curl -s 'https://api64.ipify.org' )
# Run bye if failure happens
trap bye EXIT
2021-02-16 12:23:32 +05:30
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Started", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
2021-02-16 11:02:57 +05:30
if [ [ $desired_os -eq 0 ] ] ; then
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Error", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "error": "OS Not Supported" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
fi
2021-02-16 12:23:32 +05:30
# check_ports_occupied
2021-02-16 11:02:57 +05:30
# 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 "+++++++++++ IMPORTANT READ ++++++++++++++++++++++"
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 "++++++++++++++++++++++++++++++++++++++++++++++++"
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Error", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "error": "Docker not installed" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
exit 1
fi
fi
# Install docker-compose
if ! is_command_present docker-compose; then
install_docker_compose
fi
# if ! is_command_present docker-compose; then
# install_docker_machine
# docker-machine create -d virtualbox --virtualbox-memory 3584 signoz
# fi
start_docker
echo ""
2021-02-17 01:19:51 +05:30
echo "Pulling the latest container images for SigNoz. To run as sudo it will ask for system password."
2021-02-16 11:02:57 +05:30
sudo docker-compose -f ./docker/docker-compose-tiny.yaml pull
echo ""
2021-04-01 22:04:39 +05:30
echo "Starting the SigNoz containers. It may take a few minute ..."
echo
2021-02-16 11:02:57 +05:30
# The docker-compose command does some nasty stuff for the `--detach` functionality. So we add a `|| true` so that the
# script doesn't exit because this command looks like it failed to do it's thing.
sudo docker-compose -f ./docker/docker-compose-tiny.yaml up --detach --remove-orphans || true
wait_for_containers_start 60
echo ""
if [ [ $status_code -ne 200 ] ] ; then
echo "+++++++++++ ERROR ++++++++++++++++++++++"
2021-02-16 12:23:32 +05:30
echo "The containers didn't seem to start correctly. Please run the following command to check containers that may have errored out:"
echo ""
2021-02-16 23:10:36 +05:30
echo -e "sudo docker-compose -f docker/docker-compose-tiny.yaml ps -a"
2021-02-16 12:23:32 +05:30
echo "Please read our troubleshooting guide https://signoz.io/docs/deployment/docker#troubleshooting"
echo "or reach us on SigNoz for support https://join.slack.com/t/signoz-community/shared_invite/zt-lrjknbbp-J_mI13rlw8pGF4EWBnorJA"
echo "++++++++++++++++++++++++++++++++++++++++"
2021-02-16 23:10:36 +05:30
SUPERVISORS = " $( curl -so - http://localhost:8888/druid/indexer/v1/supervisor) "
DATASOURCES = " $( curl -so - http://localhost:8888/druid/coordinator/v1/datasources) "
2021-02-16 23:30:51 +05:30
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Error - Checks", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "error": "Containers not started", "SUPERVISORS": ' " $SUPERVISORS " ', "DATASOURCES": ' " $DATASOURCES " ' } }'
2021-02-16 23:10:36 +05:30
2021-02-16 12:23:32 +05:30
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
exit 1
2021-02-16 11:02:57 +05:30
else
2021-02-16 12:23:32 +05:30
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Installation Success", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '"} }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
2021-02-16 11:02:57 +05:30
echo "++++++++++++++++++ SUCCESS ++++++++++++++++++++++"
echo "Your installation is complete!"
echo ""
2021-02-16 12:23:32 +05:30
echo "Your frontend is running on 'http://localhost:3000'."
echo ""
echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
echo ""
echo "Need help Getting Started?"
2021-02-16 12:27:44 +05:30
echo "Join us on Slack https://join.slack.com/t/signoz-community/shared_invite/zt-lrjknbbp-J_mI13rlw8pGF4EWBnorJA"
2021-02-16 12:23:32 +05:30
echo ""
2021-02-16 12:27:44 +05:30
echo "Please share your email to receive support & updates about SigNoz!"
2021-02-16 12:23:32 +05:30
read -rp 'Email: ' email
2021-02-18 01:03:50 +05:30
while [ [ $email = = "" ] ]
do
read -rp 'Email: ' email
done
2021-02-16 12:23:32 +05:30
DATA = '{ "api_key": "H-htDCae7CR3RV57gUzmol6IAKtm5IMCvbcm_fwnL-w", "type": "capture", "event": "Identify Successful Installation", "distinct_id": "' " $SIGNOZ_INSTALLATION_ID " '", "properties": { "os": "' " $os " '", "email": "' " $email " '" } }'
URL = "https://app.posthog.com/capture"
HEADER = "Content-Type: application/json"
if has_curl; then
curl -sfL -d " $DATA " --header " $HEADER " " $URL " > /dev/null 2>& 1
elif has_wget; then
wget -q --post-data= " $DATA " --header= " $HEADER " " $URL " > /dev/null 2>& 1
fi
2021-02-16 11:02:57 +05:30
fi
2021-02-16 12:25:21 +05:30
echo -e "\nThank you!\n"
2021-02-16 12:23:32 +05:30
2021-02-16 11:02:57 +05:30
##### Changing default memory limit of docker ############
# # Check if memory is less and Confirm to increase size of docker machine
# # https://github.com/docker/machine/releases
# # On OS X
# $ curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
# chmod +x /usr/local/bin/docker-machine
# # On Linux
# $ curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
# chmod +x /tmp/docker-machine &&
# sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
# VBoxManage list vms
# docker-machine stop
# VBoxManage modifyvm default --cpus 2
# VBoxManage modifyvm default --memory 4096
# docker-machine start
# VBoxManage showvminfo default | grep Memory
# VBoxManage showvminfo default | grep CPU