3 # reload the user profile
4 [ -f /etc/profile ] && . /etc/profile
6 # fix PKG_CHECK_MODULES error
7 if [ -d /usr/share/aclocal ]
9 ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal}
16 # you can set CFLAGS before running installer
17 CFLAGS="${CFLAGS--O3}"
19 # keep a log of this command
20 printf "\n# " >>netdata-installer.log
21 date >>netdata-installer.log
22 printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log
23 printf "%q " "$0" "${@}" >>netdata-installer.log
24 printf "\n" >>netdata-installer.log
35 ${ME} <installer options>
37 Valid <installer options> are:
39 --install /PATH/TO/INSTALL
41 If your give: --install /opt
42 netdata will be installed in /opt/netdata
46 Do not (re)start netdata.
51 Do not wait for the user to press ENTER.
52 Start immediately building it.
55 --libs-are-really-here
57 If you get errors about missing zlib,
58 or libuuid but you know it is available,
59 you have a broken pkg-config.
60 Use this option to allow it continue
61 without checking pkg-config.
63 Netdata will by default be compiled with gcc optimization -O3
64 If you need to pass different CFLAGS, use something like this:
66 CFLAGS="<gcc options>" ${ME} <installer options>
68 For the installer to complete successfully, you will need
69 these packages installed:
71 gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel)
72 uuid-dev (or libuuid-devel)
74 For the plugins, you will at least need:
83 if [ "$1" = "--install" ]
85 NETDATA_PREFIX="${2}/netdata"
87 elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ]
91 elif [ "$1" = "--dont-start-it" ]
95 elif [ "$1" = "--dont-wait" ]
99 elif [ "$1" = "--help" -o "$1" = "-h" ]
106 echo >&2 "I cannot understand option '$1'."
115 Nice to see you are giving it a try!
117 You are about to build and install netdata to your system.
119 It will be installed at these locations:
121 - the daemon at ${NETDATA_PREFIX}/usr/sbin/netdata
122 - config files at ${NETDATA_PREFIX}/etc/netdata
123 - web files at ${NETDATA_PREFIX}/usr/share/netdata
124 - plugins at ${NETDATA_PREFIX}/usr/libexec/netdata
125 - cache files at ${NETDATA_PREFIX}/var/cache/netdata
126 - db files at ${NETDATA_PREFIX}/var/lib/netdata
127 - log files at ${NETDATA_PREFIX}/var/log/netdata
128 - pid file at ${NETDATA_PREFIX}/var/run
130 This installer allows you to change the installation path.
131 Press Control-C and run the same command with --help for help.
135 if [ "${UID}" -ne 0 ]
137 if [ -z "${NETDATA_PREFIX}" ]
139 cat <<-NONROOTNOPREFIX
141 Sorry! This will fail!
143 You are attempting to install netdata as non-root, but you plan to install it
146 Please set an installation prefix, like this:
148 $0 ${@} --install /tmp
150 or, run the installer as root:
154 We suggest to install it as root, or certain data collectors will not be able
155 to work. Netdata drops root privileges when running. So, if you plan to keep
156 it, install it as root to get the full functionality.
165 You are about to install netdata as a non-root user.
166 Netdata will work, but a few data collection modules that
167 require root access will fail.
169 If you installing permanently on your system, run the
179 if [ "$(type autoreconf 2> /dev/null)" ]
187 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
188 eval $maj=\$1 $min=\$2
190 autoconf_maj_min AMAJ AMIN
195 elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
199 echo "Found autotools $AMAJ.$AMIN"
202 echo "No autotools found"
205 if [ ! "$have_autotools" ]
209 echo "Will skip autoreconf step"
213 -------------------------------------------------------------------------------
214 autotools 2.60 or later is required
216 Sorry, you do not seem to have autotools 2.60 or later, which is
217 required to build from the git sources of netdata.
219 You can either install a suitable version of autotools and automake
220 or download a netdata package which does not have these dependencies.
222 Source packages where autotools have already been run are available
224 https://firehol.org/download/netdata/
226 The unsigned/master folder tracks the head of the git tree and released
227 packages are also available.
233 if [ ${DONOTWAIT} -eq 0 ]
235 if [ ! -z "${NETDATA_PREFIX}" ]
237 read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
239 read -p "Press ENTER to build and install netdata to your system > "
246 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
248 Sorry! NetData failed to build...
250 You many need to check these:
252 1. The package uuid-dev (or libuuid-devel) has to be installed.
254 If your system cannot find libuuid, although it is installed
255 run me with the option: --libs-are-really-here
257 2. The package zlib1g-dev (or zlib-devel) has to be installed.
259 If your system cannot find zlib, although it is installed
260 run me with the option: --libs-are-really-here
262 3. You need basic build tools installed, like:
264 gcc make autoconf automake pkg-config
266 Autoconf version 2.60 or higher is required.
268 If you still cannot get it to build, ask for help at github:
270 https://github.com/firehol/netdata/issues
279 printf >>netdata-installer.log "# "
280 printf >>netdata-installer.log "%q " "${@}"
281 printf >>netdata-installer.log " ... "
284 printf >&2 ":-----------------------------------------------------------------------------\n"
285 printf >&2 "Running command:\n"
287 printf >&2 "%q " "${@}"
295 printf >>netdata-installer.log "FAILED!\n"
297 printf >>netdata-installer.log "OK\n"
303 if [ ${LIBS_ARE_HERE} -eq 1 ]
306 echo >&2 "ok, assuming libs are really installed."
307 export ZLIB_CFLAGS=" "
308 export ZLIB_LIBS="-lz"
309 export UUID_CFLAGS=" "
310 export UUID_LIBS="-luuid"
313 trap build_error EXIT
315 if [ "$have_autotools" ]
317 run ./autogen.sh || exit 1
321 --prefix="${NETDATA_PREFIX}/usr" \
322 --sysconfdir="${NETDATA_PREFIX}/etc" \
323 --localstatedir="${NETDATA_PREFIX}/var" \
324 --with-zlib --with-math --with-user=netdata \
325 CFLAGS="${CFLAGS}" || exit 1
327 # remove the build_error hook
330 if [ -f src/netdata ]
332 echo >&2 "Cleaning a possibly old compilation ..."
336 echo >&2 "Compiling netdata ..."
339 # backup user configurations
340 installer_backup_suffix="${PID}.${RANDOM}"
341 for x in apps_groups.conf charts.d.conf
343 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}" ]
345 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}" "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup.${installer_backup_suffix}"
347 elif [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup.${installer_backup_suffix}" ]
349 rm -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup.${installer_backup_suffix}"
353 echo >&2 "Installing netdata ..."
354 run make install || exit 1
356 # restore user configurations
357 for x in apps_groups.conf charts.d.conf
359 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup.${installer_backup_suffix}" ]
361 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup.${installer_backup_suffix}" "${NETDATA_PREFIX}/etc/netdata/${x}"
365 NETDATA_ADDED_TO_DOCKER=0
368 getent group netdata > /dev/null
371 echo >&2 "Adding netdata user group ..."
372 run groupadd -r netdata
375 getent passwd netdata > /dev/null
378 echo >&2 "Adding netdata user account ..."
379 run useradd -r -g netdata -c netdata -s $(which nologin || echo '/bin/false') -d / netdata
382 getent group docker > /dev/null
385 # find the users in the docker group
386 docker=$(getent group docker | cut -d ':' -f 4)
387 if [[ ",${docker}," =~ ,netdata, ]]
389 # netdata is already there
392 # netdata is not in docker group
393 echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
394 run usermod -a -G docker netdata
396 # let the uninstall script know
397 NETDATA_ADDED_TO_DOCKER=1
400 if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
402 echo >&2 "Adding netdata logrotate configuration ..."
403 run cp system/netdata.logrotate /etc/logrotate.d/netdata
408 # -----------------------------------------------------------------------------
409 # load options from the configuration file
411 # create an empty config if it does not exist
412 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
414 # function to extract values from the config file
416 local key="${1}" value="${2}" line=
418 if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
420 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
421 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
429 [ ! "${UID}" = "0" ] && defuser="${USER}"
430 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
432 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
433 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
437 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
441 NETDATA_PORT="$( config_option "port" ${defport} )"
444 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
445 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
446 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
447 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
448 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
449 NETDATA_BIND="$( config_option "bind socket to IP" "*" )"
450 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
453 # -----------------------------------------------------------------------------
454 # prepare the directories
456 # this is needed if NETDATA_PREFIX is not empty
457 if [ ! -d "${NETDATA_RUN_DIR}" ]
459 mkdir -p "${NETDATA_RUN_DIR}" || exit 1
463 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
464 for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}" "${NETDATA_LIB_DIR}"
468 echo >&2 "Creating directory '${x}'"
469 run mkdir -p "${x}" || exit 1
474 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
476 run chown -R "${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}..."
478 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
482 run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
487 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
488 run chmod 0755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
489 run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
492 # fix apps.plugin to be setuid to root
493 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
494 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
498 # -----------------------------------------------------------------------------
499 # check if we can re-start netdata
501 if [ ${DONOTSTART} -eq 1 ]
503 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
505 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
506 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
508 if [ "${UID}" -eq 0 ]
510 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
512 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
514 echo >&2 "OK. It is now installed and ready."
518 # -----------------------------------------------------------------------------
519 # stop a running netdata
522 [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
523 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
527 stop_netdata_on_pid() {
528 local pid="$1" ret=0 count=0
530 isnetdata $pid || return 0
532 printf >&2 "Stopping netdata on pid $pid ..."
533 while [ ! -z "$pid" -a $ret -eq 0 ]
537 echo >&2 "Cannot stop the running netdata on pid $pid."
541 count=$(( count + 1 ))
543 run kill $pid 2>/dev/null
546 test $ret -eq 0 && printf >&2 "." && sleep 2
552 echo >&2 "SORRY! CANNOT STOP netdata ON PID $pid !"
556 echo >&2 "netdata on pid $pid stopped."
563 echo >&2 "Stopping a (possibly) running netdata..."
565 for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
566 $(cat /var/run/netdata.pid 2>/dev/null) \
567 $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
568 $(pidof netdata 2>/dev/null)
570 stop_netdata_on_pid $p
574 # -----------------------------------------------------------------------------
575 # check netdata for systemd
578 # if the directory /etc/systemd/system does not exit, it is not systemd
579 [ ! -d /etc/systemd/system ] && return 1
581 # if pid 1 is systemd, it is systemd
582 [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0
584 # if systemd is running, it is systemd
585 pidof systemd >/dev/null 2>&1 && return 0
587 # else, it is not systemd
592 if [ "${UID}" -eq 0 ]
597 # systemd is running on this system
599 if [ ! -f /etc/systemd/system/netdata.service ]
601 echo >&2 "Installing systemd service..."
602 run cp system/netdata.service /etc/systemd/system/netdata.service && \
603 run systemctl daemon-reload && \
604 run systemctl enable netdata
606 run service netdata stop
610 run service netdata restart && started=1
613 if [ ${started} -eq 0 ]
615 # check if we can use the system service
616 run service netdata stop
618 run service netdata restart && started=1
619 if [ ${started} -eq 0 ]
621 run service netdata start && started=1
626 if [ ${started} -eq 0 ]
628 # still not started...
632 echo >&2 "Starting netdata..."
633 run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
637 echo >&2 "SORRY! FAILED TO START NETDATA!"
640 echo >&2 "OK. NetData Started!"
646 # -----------------------------------------------------------------------------
647 # save a config file, if it is not already there
649 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
652 echo >&2 "-------------------------------------------------------------------------------"
654 echo >&2 "Downloading default configuration from netdata..."
657 # remove a possibly obsolete download
658 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
660 # disable a proxy to get data from the local netdata
665 wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
669 if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
671 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
675 if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
677 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
678 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
680 if [ "${UID}" -eq 0 ]
682 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
684 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
686 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
687 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
691 # -----------------------------------------------------------------------------
694 ksm_is_available_but_disabled() {
697 -------------------------------------------------------------------------------
698 Memory de-duplication instructions
700 You have kernel memory de-duper (called Kernel Same-page Merging,
701 or KSM) available, but it is not currently enabled.
705 echo 1 >/sys/kernel/mm/ksm/run
706 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
708 If you enable it, you will save 40-60% of netdata memory.
713 ksm_is_not_available() {
716 -------------------------------------------------------------------------------
717 Memory de-duplication not present in your kernel
719 It seems you do not have kernel memory de-duper (called Kernel Same-page
720 Merging, or KSM) available.
722 To enable it, you need a kernel built with CONFIG_KSM=y
724 If you can have it, you will save 40-60% of netdata memory.
729 if [ -f "/sys/kernel/mm/ksm/run" ]
731 if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
733 ksm_is_available_but_disabled
739 # -----------------------------------------------------------------------------
740 # Check for version.txt
742 if [ ! -s web/version.txt ]
746 -------------------------------------------------------------------------------
747 Version update check warning
749 The way you downloaded netdata, we cannot find its version. This means the
750 Update check on the dashboard, will not work.
752 If you want to have version update check, please re-install it
753 following the procedure in:
755 https://github.com/firehol/netdata/wiki/Installation
760 # -----------------------------------------------------------------------------
761 # apps.plugin warning
763 if [ "${UID}" -ne 0 ]
765 cat <<-SETUID_WARNING
767 -------------------------------------------------------------------------------
768 apps.plugin needs privileges
770 Since you have installed netdata as a normal user, to have apps.plugin collect
771 all the needed data, you have to give it the access rights it needs, by running
772 either of the following sets of commands:
774 To run apps.plugin with escalated capabilities:
776 sudo chown root:${NETDATA_USER} "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
777 sudo chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
778 sudo setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
780 or, to run apps.plugin as root:
782 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
783 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
785 apps.plugin is performing a hard-coded function of data collection for all
786 running processes. It cannot be instructed from the netdata daemon to perform
787 any task, so it is pretty safe to do this.
792 # -----------------------------------------------------------------------------
793 # Keep un-install info
795 cat >netdata-uninstaller.sh <<-UNINSTALL
798 # this script will uninstall netdata
800 if [ "\$1" != "--force" ]
802 echo >&2 "This script will REMOVE netdata from your system."
803 echo >&2 "Run it again with --force to do it."
807 echo >&2 "Stopping a possibly running netdata..."
808 for p in \$(pidof netdata); do kill \$x; done
812 if [ ! -z "\$1" -a -d "\$1" ]
815 echo "Deleting directory '\$1' ..."
820 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
822 # installation prefix was given
824 deletedir "${NETDATA_PREFIX}"
827 # installation prefix was NOT given
829 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
831 echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
832 rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
835 deletedir "${NETDATA_PREFIX}/etc/netdata"
836 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
837 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
838 deletedir "${NETDATA_PREFIX}/var/lib/netdata"
839 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
840 deletedir "${NETDATA_PREFIX}/var/log/netdata"
843 if [ -f /etc/logrotate.d/netdata ]
845 echo "Deleting /etc/logrotate.d/netdata ..."
846 rm -i /etc/logrotate.d/netdata
849 if [ -f /etc/systemd/system/netdata.service ]
851 echo "Deleting /etc/systemd/system/netdata.service ..."
852 rm -i /etc/systemd/system/netdata.service
855 getent passwd netdata > /dev/null
859 echo "You may also want to remove the user netdata"
861 echo " userdel netdata"
864 getent group netdata > /dev/null
868 echo "You may also want to remove the group netdata"
870 echo " groupdel netdata"
873 getent group docker > /dev/null
874 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
877 echo "You may also want to remove the netdata user from the docker group"
879 echo " gpasswd -d netdata docker"
883 chmod 750 netdata-uninstaller.sh
885 # -----------------------------------------------------------------------------
887 if [ "${NETDATA_BIND}" = "*" ]
891 access="${NETDATA_BIND}"
897 -------------------------------------------------------------------------------
899 OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}).
901 -------------------------------------------------------------------------------
903 INFO: Command line options changed. -pidfile, -nd and -ch are deprecated.
904 If you use custom startup scripts, please run netdata -h to see the
905 corresponding options and update your scripts.
907 Hit http://${access}:${NETDATA_PORT}/ from your browser.
909 To stop netdata, just kill it, with:
913 To start it, just run it:
915 ${NETDATA_PREFIX}/usr/sbin/netdata
921 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"