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 uuid-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 - db files at ${NETDATA_PREFIX}/var/lib/netdata
125 - log files at ${NETDATA_PREFIX}/var/log/netdata
126 - pid file at ${NETDATA_PREFIX}/var/run
128 This installer allows you to change the installation path.
129 Press Control-C and run the same command with --help for help.
133 if [ "${UID}" -ne 0 ]
135 if [ -z "${NETDATA_PREFIX}" ]
137 cat <<NONROOTNOPREFIX
139 Sorry! This will fail!
141 You are attempting to install netdata as non-root, but you plan to install it
144 Please set an installation prefix, like this:
146 $0 ${@} --install /tmp
148 or, run the installer as root:
152 We suggest to install it as root, or certain data collectors will not be able
153 to work. Netdata drops root privileges when running. So, if you plan to keep
154 it, install it as root to get the full functionality.
163 You are about to install netdata as a non-root user.
164 Netdata will work, but a few data collection modules that
165 require root access will fail.
167 If you installing permanently on your system, run the
177 if [ "$(type autoreconf 2> /dev/null)" ]
185 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
186 eval $maj=\$1 $min=\$2
188 autoconf_maj_min AMAJ AMIN
193 elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
197 echo "Found autotools $AMAJ.$AMIN"
200 echo "No autotools found"
203 if [ ! "$have_autotools" ]
207 echo "Will skip autoreconf step"
211 -------------------------------------------------------------------------------
212 autotools 2.60 or later is required
214 Sorry, you do not seem to have autotools 2.60 or later, which is
215 required to build from the git sources of netdata.
217 You can either install a suitable version of autotools and automake
218 or download a netdata package which does not have these dependencies.
220 Source packages where autotools have already been run are available
222 https://firehol.org/download/netdata/
224 The unsigned/master folder tracks the head of the git tree and released
225 packages are also available.
231 if [ ${DONOTWAIT} -eq 0 ]
233 if [ ! -z "${NETDATA_PREFIX}" ]
235 read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
237 read -p "Press ENTER to build and install netdata to your system > "
244 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
246 Sorry! NetData failed to build...
248 You many need to check these:
250 1. The package zlib1g-dev has to be installed.
252 If your system cannot find ZLIB, although it is installed
253 run me with the option: --zlib-is-really-here
255 2. The package uuid-dev has to be installed.
257 3. You need basic build tools installed, like:
259 gcc make autoconf automake pkg-config
261 Autoconf version 2.60 or higher is required.
263 If you still cannot get it to build, ask for help at github:
265 https://github.com/firehol/netdata/issues
275 printf >&2 ":-----------------------------------------------------------------------------\n"
276 printf >&2 "Running command:\n"
278 printf >&2 "%q " "${@}"
285 if [ ${ZLIB_IS_HERE} -eq 1 ]
288 echo >&2 "ok, assuming zlib is really installed."
289 export ZLIB_CFLAGS=" "
290 export ZLIB_LIBS="-lz"
293 trap build_error EXIT
295 if [ "$have_autotools" ]
297 run ./autogen.sh || exit 1
301 --prefix="${NETDATA_PREFIX}/usr" \
302 --sysconfdir="${NETDATA_PREFIX}/etc" \
303 --localstatedir="${NETDATA_PREFIX}/var" \
304 --with-zlib --with-math --with-user=netdata \
305 CFLAGS="${CFLAGS}" || exit 1
307 # remove the build_error hook
310 if [ -f src/netdata ]
312 echo >&2 "Cleaning a possibly old compilation ..."
316 echo >&2 "Compiling netdata ..."
319 # backup user configurations
320 for x in apps_groups.conf charts.d.conf
322 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}" ]
324 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}" "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup"
328 echo >&2 "Installing netdata ..."
329 run make install || exit 1
331 # restore user configurations
332 for x in apps_groups.conf charts.d.conf
334 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" ]
336 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" "${NETDATA_PREFIX}/etc/netdata/${x}"
340 NETDATA_ADDED_TO_DOCKER=0
343 getent group netdata > /dev/null
346 echo >&2 "Adding netdata user group ..."
347 run groupadd -r netdata
350 getent passwd netdata > /dev/null
353 echo >&2 "Adding netdata user account ..."
354 run useradd -r -g netdata -c netdata -s /sbin/nologin -d / netdata
357 getent group docker > /dev/null
360 # find the users in the docker group
361 docker=$(getent group docker | cut -d ':' -f 4)
362 if [[ ",${docker}," =~ ,netdata, ]]
364 # netdata is already there
367 # netdata is not in docker group
368 echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
369 run usermod -a -G docker netdata
371 # let the uninstall script know
372 NETDATA_ADDED_TO_DOCKER=1
377 # -----------------------------------------------------------------------------
378 # load options from the configuration file
380 # create an empty config if it does not exist
381 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
383 # function to extract values from the config file
385 local key="${1}" value="${2}" line=
387 if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
389 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
390 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
398 [ ! "${UID}" = "0" ] && defuser="${USER}"
399 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
401 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
402 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
406 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
410 NETDATA_PORT="$( config_option "port" ${defport} )"
413 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
414 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
415 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
416 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
417 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
418 NETDATA_BIND="$( config_option "bind socket to IP" "*" )"
419 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
422 # -----------------------------------------------------------------------------
423 # prepare the directories
425 # this is needed if NETDATA_PREFIX is not empty
426 if [ ! -d "${NETDATA_RUN_DIR}" ]
428 mkdir -p "${NETDATA_RUN_DIR}" || exit 1
431 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
432 for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}" "${NETDATA_LIB_DIR}"
436 echo >&2 "Creating directory '${x}'"
437 run mkdir -p "${x}" || exit 1
442 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
444 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}..."
446 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
450 run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
455 # fix apps.plugin to be setuid to root
456 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
457 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
460 # -----------------------------------------------------------------------------
461 # check if we can re-start netdata
463 if [ ${DONOTSTART} -eq 1 ]
465 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
467 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
468 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
470 if [ "${UID}" -eq 0 ]
472 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
474 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
476 echo >&2 "OK. It is now installed and ready."
480 # -----------------------------------------------------------------------------
481 # stop a running netdata
484 [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
485 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
490 printf >&2 "Stopping a (possibly) running netdata..."
497 echo >&2 "Cannot stop the running netdata."
503 pid=$(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null)
504 # backwards compatibility
505 [ -z "${pid}" ] && pid=$(cat /var/run/netdata.pid 2>/dev/null)
506 [ -z "${pid}" ] && pid=$(cat /var/run/netdata/netdata.pid 2>/dev/null)
508 isnetdata $pid || pid=
511 run kill $pid 2>/dev/null
514 run killall netdata 2>/dev/null
518 test $ret -eq 0 && printf >&2 "." && sleep 2
524 # -----------------------------------------------------------------------------
527 echo >&2 "Starting netdata..."
528 run ${NETDATA_PREFIX}/usr/sbin/netdata -pidfile ${NETDATA_RUN_DIR}/netdata.pid "${@}"
533 echo >&2 "SORRY! FAILED TO START NETDATA!"
536 echo >&2 "OK. NetData Started!"
540 # -----------------------------------------------------------------------------
541 # save a config file, if it is not already there
543 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
545 echo >&2 "Downloading default configuration from netdata..."
548 # remove a possibly obsolete download
549 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
551 # disable a proxy to get data from the local netdata
556 wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
560 if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
562 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
566 if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
568 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
569 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
571 if [ "${UID}" -eq 0 ]
573 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
575 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
577 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
578 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
582 # -----------------------------------------------------------------------------
585 ksm_is_available_but_disabled() {
588 -------------------------------------------------------------------------------
589 Memory de-duplication instructions
591 I see you have kernel memory de-duper (called Kernel Same-page Merging,
592 or KSM) available, but it is not currently enabled.
596 echo 1 >/sys/kernel/mm/ksm/run
597 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
599 If you enable it, you will save 40-60% of netdata memory.
604 ksm_is_not_available() {
607 -------------------------------------------------------------------------------
608 Memory de-duplication not present in your kernel
610 It seems you do not have kernel memory de-duper (called Kernel Same-page
611 Merging, or KSM) available.
613 To enable it, you need a kernel built with CONFIG_KSM=y
615 If you can have it, you will save 40-60% of netdata memory.
620 if [ -f "/sys/kernel/mm/ksm/run" ]
622 if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
624 ksm_is_available_but_disabled
630 # -----------------------------------------------------------------------------
631 # Check for version.txt
633 if [ ! -s web/version.txt ]
637 -------------------------------------------------------------------------------
638 Version update check warning
640 The way you downloaded netdata, we cannot find its version. This means the
641 Update check on the dashboard, will not work.
643 If you want to have version update check, please re-install it
644 following the procedure in:
646 https://github.com/firehol/netdata/wiki/Installation
651 # -----------------------------------------------------------------------------
652 # apps.plugin warning
654 if [ "${UID}" -ne 0 ]
658 -------------------------------------------------------------------------------
659 apps.plugin needs privileges
661 Since you have installed netdata as a normal user, to have apps.plugin collect
662 all the needed data, you have to give it the access rights it needs, by running
665 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
666 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
668 The commands allow apps.plugin to run as root.
670 apps.plugin is performing a hard-coded function of data collection for all
671 running processes. It cannot be instructed from the netdata daemon to perform
672 any task, so it is pretty safe to do this.
677 # -----------------------------------------------------------------------------
678 # Keep un-install info
680 cat >netdata-uninstaller.sh <<UNINSTALL
683 # this script will uninstall netdata
685 if [ "\$1" != "--force" ]
687 echo >&2 "This script will REMOVE netdata from your system."
688 echo >&2 "Run it again with --force to do it."
692 echo >&2 "Stopping a possibly running netdata..."
697 if [ ! -z "\$1" -a -d "\$1" ]
700 echo "Deleting directory '\$1' ..."
705 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
707 # installation prefix was given
709 deletedir "${NETDATA_PREFIX}"
712 # installation prefix was NOT given
714 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
716 echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
717 rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
720 deletedir "${NETDATA_PREFIX}/etc/netdata"
721 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
722 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
723 deletedir "${NETDATA_PREFIX}/var/lib/netdata"
724 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
725 deletedir "${NETDATA_PREFIX}/var/log/netdata"
728 getent passwd netdata > /dev/null
732 echo "You may also want to remove the user netdata"
734 echo " userdel netdata"
737 getent group netdata > /dev/null
741 echo "You may also want to remove the group netdata"
743 echo " groupdel netdata"
746 getent group docker > /dev/null
747 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
750 echo "You may also want to remove the netdata user from the docker group"
752 echo " gpasswd -d netdata docker"
756 chmod 750 netdata-uninstaller.sh
758 # -----------------------------------------------------------------------------
760 if [ "${NETDATA_BIND}" = "*" ]
764 access="${NETDATA_BIND}"
770 -------------------------------------------------------------------------------
772 OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}).
774 -------------------------------------------------------------------------------
777 Hit http://${access}:${NETDATA_PORT}/ from your browser.
779 To stop netdata, just kill it, with:
783 To start it, just run it:
785 ${NETDATA_PREFIX}/usr/sbin/netdata
790 Give netdata a Github Star, at:
792 https://github.com/firehol/netdata/wiki
796 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"