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.
56 If you get errors about missing zlib,
57 but you know it is available,
58 you have a broken pkg-config.
59 Use this option to allow it continue
60 without checking pkg-config.
62 Netdata will by default be compiled with gcc optimization -O3
63 If you need to pass different CFLAGS, use something like this:
65 CFLAGS="<gcc options>" $ME <installer options>
67 For the installer to complete successfully, you will need
68 these packages installed:
70 gcc make autoconf automake pkg-config zlib1g-dev
72 For the plugins, you will at least need:
81 if [ "$1" = "--install" ]
83 NETDATA_PREFIX="${2}/netdata"
85 elif [ "$1" = "--zlib-is-really-here" ]
89 elif [ "$1" = "--dont-start-it" ]
93 elif [ "$1" = "--dont-wait" ]
97 elif [ "$1" = "--help" -o "$1" = "-h" ]
104 echo >&2 "I cannot understand option '$1'."
113 Nice to see you are giving it a try!
115 You are about to build and install netdata to your system.
117 It will be installed at these locations:
119 - the daemon at ${NETDATA_PREFIX}/usr/sbin/netdata
120 - config files at ${NETDATA_PREFIX}/etc/netdata
121 - web files at ${NETDATA_PREFIX}/usr/share/netdata
122 - plugins at ${NETDATA_PREFIX}/usr/libexec/netdata
123 - cache files at ${NETDATA_PREFIX}/var/cache/netdata
124 - log files at ${NETDATA_PREFIX}/var/log/netdata
125 - pid file at ${NETDATA_PREFIX}/var/run
127 This installer allows you to change the installation path.
128 Press Control-C and run the same command with --help for help.
132 if [ "${UID}" -ne 0 ]
134 if [ -z "${NETDATA_PREFIX}" ]
136 cat <<NONROOTNOPREFIX
138 Sorry! This will fail!
140 You are attempting to install netdata as non-root, but you plan to install it
143 Please set an installation prefix, like this:
145 $0 ${@} --install /tmp
147 or, run the installer as root:
151 We suggest to install it as root, or certain data collectors will not be able
152 to work. Netdata drops root privileges when running. So, if you plan to keep
153 it, install it as root to get the full functionality.
162 You are about to install netdata as a non-root user.
163 Netdata will work, but a few data collection modules that
164 require root access will fail.
166 If you installing permanently on your system, run the
176 if [ "$(type autoreconf 2> /dev/null)" ]
184 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
185 eval $maj=\$1 $min=\$2
187 autoconf_maj_min AMAJ AMIN
192 elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
196 echo "Found autotools $AMAJ.$AMIN"
199 echo "No autotools found"
202 if [ ! "$have_autotools" ]
206 echo "Will skip autoreconf step"
210 -------------------------------------------------------------------------------
211 autotools 2.60 or later is required
213 Sorry, you do not seem to have autotools 2.60 or later, which is
214 required to build from the git sources of netdata.
216 You can either install a suitable version of autotools and automake
217 or download a netdata package which does not have these dependencies.
219 Source packages where autotools have already been run are available
221 https://firehol.org/download/netdata/
223 The unsigned/master folder tracks the head of the git tree and released
224 packages are also available.
230 if [ ${DONOTWAIT} -eq 0 ]
232 if [ ! -z "${NETDATA_PREFIX}" ]
234 read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
236 read -p "Press ENTER to build and install netdata to your system > "
243 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
245 Sorry! NetData failed to build...
247 You many need to check these:
249 1. The package zlib1g-dev has to be installed.
251 2. You need basic build tools installed, like:
253 gcc make autoconf automake pkg-config
255 Autoconf version 2.60 or higher is required
257 3. If your system cannot find ZLIB, although it is installed
258 run me with the option: --zlib-is-really-here
261 If you still cannot get it to build, ask for help at github:
263 https://github.com/firehol/netdata/issues
273 printf >&2 ":-----------------------------------------------------------------------------\n"
274 printf >&2 "Running command:\n"
276 printf >&2 "%q " "${@}"
283 if [ ${ZLIB_IS_HERE} -eq 1 ]
286 echo >&2 "ok, assuming zlib is really installed."
287 export ZLIB_CFLAGS=" "
288 export ZLIB_LIBS="-lz"
291 trap build_error EXIT
293 if [ "$have_autotools" ]
295 run ./autogen.sh || exit 1
299 --prefix="${NETDATA_PREFIX}/usr" \
300 --sysconfdir="${NETDATA_PREFIX}/etc" \
301 --localstatedir="${NETDATA_PREFIX}/var" \
302 --with-zlib --with-math --with-user=netdata \
303 CFLAGS="${CFLAGS}" || exit 1
305 # remove the build_error hook
308 if [ -f src/netdata ]
310 echo >&2 "Cleaning a possibly old compilation ..."
314 echo >&2 "Compiling netdata ..."
317 # backup user configurations
318 for x in apps_groups.conf charts.d.conf
320 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}" ]
322 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}" "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup"
326 echo >&2 "Installing netdata ..."
327 run make install || exit 1
329 # restore user configurations
330 for x in apps_groups.conf charts.d.conf
332 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" ]
334 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" "${NETDATA_PREFIX}/etc/netdata/${x}"
338 NETDATA_ADDED_TO_DOCKER=0
341 getent group netdata > /dev/null
344 echo >&2 "Adding netdata user group ..."
345 run groupadd -r netdata
348 getent passwd netdata > /dev/null
351 echo >&2 "Adding netdata user account ..."
352 run useradd -r -g netdata -c netdata -s /sbin/nologin -d / netdata
355 getent group docker > /dev/null
358 # find the users in the docker group
359 docker=$(getent group docker | cut -d ':' -f 4)
360 if [[ ",${docker}," =~ ,netdata, ]]
362 # netdata is already there
365 # netdata is not in docker group
366 echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
367 run usermod -a -G docker netdata
369 # let the uninstall script know
370 NETDATA_ADDED_TO_DOCKER=1
375 # -----------------------------------------------------------------------------
376 # load options from the configuration file
378 # create an empty config if it does not exist
379 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
381 # function to extract values from the config file
383 local key="${1}" value="${2}" line=
385 if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
387 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
388 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
396 [ ! "${UID}" = "0" ] && defuser="${USER}"
397 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
399 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
400 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
404 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
408 NETDATA_PORT="$( config_option "port" ${defport} )"
411 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
412 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
413 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
414 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
415 NETDATA_BIND="$( config_option "bind socket to IP" "*" )"
416 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
419 # -----------------------------------------------------------------------------
420 # prepare the directories
422 # this is needed if NETDATA_PREFIX is not empty
423 if [ ! -d "${NETDATA_RUN_DIR}" ]
425 mkdir -p "${NETDATA_RUN_DIR}" || exit 1
428 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
429 for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}"
433 echo >&2 "Creating directory '${x}'"
434 run mkdir -p "${x}" || exit 1
439 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
441 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}..."
443 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
447 run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
452 # fix apps.plugin to be setuid to root
453 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
454 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
457 # -----------------------------------------------------------------------------
458 # check if we can re-start netdata
460 if [ ${DONOTSTART} -eq 1 ]
462 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
464 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
465 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
467 if [ "${UID}" -eq 0 ]
469 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
471 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
473 echo >&2 "OK. It is now installed and ready."
477 # -----------------------------------------------------------------------------
478 # stop a running netdata
481 [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
482 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
487 printf >&2 "Stopping a (possibly) running netdata..."
494 echo >&2 "Cannot stop the running netdata."
500 pid=$(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null)
501 # backwards compatibility
502 [ -z "${pid}" ] && pid=$(cat /var/run/netdata.pid 2>/dev/null)
503 [ -z "${pid}" ] && pid=$(cat /var/run/netdata/netdata.pid 2>/dev/null)
505 isnetdata $pid || pid=
508 run kill $pid 2>/dev/null
511 run killall netdata 2>/dev/null
515 test $ret -eq 0 && printf >&2 "." && sleep 2
521 # -----------------------------------------------------------------------------
524 echo >&2 "Starting netdata..."
525 run ${NETDATA_PREFIX}/usr/sbin/netdata -pidfile ${NETDATA_RUN_DIR}/netdata.pid "${@}"
530 echo >&2 "SORRY! FAILED TO START NETDATA!"
533 echo >&2 "OK. NetData Started!"
537 # -----------------------------------------------------------------------------
538 # save a config file, if it is not already there
540 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
542 echo >&2 "Downloading default configuration from netdata..."
545 # remove a possibly obsolete download
546 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
548 # disable a proxy to get data from the local netdata
553 wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
557 if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
559 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
563 if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
565 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
566 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
568 if [ "${UID}" -eq 0 ]
570 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
572 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
574 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
575 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
579 # -----------------------------------------------------------------------------
582 ksm_is_available_but_disabled() {
585 -------------------------------------------------------------------------------
586 Memory de-duplication instructions
588 I see you have kernel memory de-duper (called Kernel Same-page Merging,
589 or KSM) available, but it is not currently enabled.
593 echo 1 >/sys/kernel/mm/ksm/run
594 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
596 If you enable it, you will save 40-60% of netdata memory.
601 ksm_is_not_available() {
604 -------------------------------------------------------------------------------
605 Memory de-duplication not present in your kernel
607 It seems you do not have kernel memory de-duper (called Kernel Same-page
608 Merging, or KSM) available.
610 To enable it, you need a kernel built with CONFIG_KSM=y
612 If you can have it, you will save 40-60% of netdata memory.
617 if [ -f "/sys/kernel/mm/ksm/run" ]
619 if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
621 ksm_is_available_but_disabled
627 # -----------------------------------------------------------------------------
628 # Check for version.txt
630 if [ ! -s web/version.txt ]
634 -------------------------------------------------------------------------------
635 Version update check warning
637 The way you downloaded netdata, we cannot find its version. This means the
638 Update check on the dashboard, will not work.
640 If you want to have version update check, please re-install it
641 following the procedure in:
643 https://github.com/firehol/netdata/wiki/Installation
648 # -----------------------------------------------------------------------------
649 # apps.plugin warning
651 if [ "${UID}" -ne 0 ]
655 -------------------------------------------------------------------------------
656 apps.plugin needs privileges
658 Since you have installed netdata as a normal user, to have apps.plugin collect
659 all the needed data, you have to give it the access rights it needs, by running
662 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
663 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
665 The commands allow apps.plugin to run as root.
667 apps.plugin is performing a hard-coded function of data collection for all
668 running processes. It cannot be instructed from the netdata daemon to perform
669 any task, so it is pretty safe to do this.
674 # -----------------------------------------------------------------------------
675 # Keep un-install info
677 cat >netdata-uninstaller.sh <<UNINSTALL
680 # this script will uninstall netdata
682 if [ "\$1" != "--force" ]
684 echo >&2 "This script will REMOVE netdata from your system."
685 echo >&2 "Run it again with --force to do it."
689 echo >&2 "Stopping a possibly running netdata..."
694 if [ ! -z "\$1" -a -d "\$1" ]
697 echo "Deleting directory '\$1' ..."
702 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
704 # installation prefix was given
706 deletedir "${NETDATA_PREFIX}"
709 # installation prefix was NOT given
711 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
713 echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
714 rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
717 deletedir "${NETDATA_PREFIX}/etc/netdata"
718 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
719 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
720 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
721 deletedir "${NETDATA_PREFIX}/var/log/netdata"
724 getent passwd netdata > /dev/null
728 echo "You may also want to remove the user netdata"
730 echo " userdel netdata"
733 getent group netdata > /dev/null
737 echo "You may also want to remove the group netdata"
739 echo " groupdel netdata"
742 getent group docker > /dev/null
743 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
746 echo "You may also want to remove the netdata user from the docker group"
748 echo " gpasswd -d netdata docker"
752 chmod 750 netdata-uninstaller.sh
754 # -----------------------------------------------------------------------------
756 if [ "${NETDATA_BIND}" = "*" ]
760 access="${NETDATA_BIND}"
766 -------------------------------------------------------------------------------
768 OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}).
770 -------------------------------------------------------------------------------
773 Hit http://${access}:${NETDATA_PORT}/ from your browser.
775 To stop netdata, just kill it, with:
779 To start it, just run it:
781 ${NETDATA_PREFIX}/usr/sbin/netdata
786 Give netdata a Github Star, at:
788 https://github.com/firehol/netdata/wiki
792 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"