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}
15 # you can set CFLAGS before running installer
16 CFLAGS="${CFLAGS--O3}"
18 # keep a log of this command
19 printf "\n# " >>netdata-installer.log
20 date >>netdata-installer.log
21 printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log
22 printf "%q " "$0" "${@}" >>netdata-installer.log
23 printf "\n" >>netdata-installer.log
34 ${ME} <installer options>
36 Valid <installer options> are:
38 --install /PATH/TO/INSTALL
40 If your give: --install /opt
41 netdata will be installed in /opt/netdata
45 Do not (re)start netdata.
50 Do not wait for the user to press ENTER.
51 Start immediately building it.
55 If you get errors about missing zlib,
56 but you know it is available,
57 you have a broken pkg-config.
58 Use this option to allow it continue
59 without checking pkg-config.
61 Netdata will by default be compiled with gcc optimization -O3
62 If you need to pass different CFLAGS, use something like this:
64 CFLAGS="<gcc options>" $ME <installer options>
66 For the installer to complete successfully, you will need
67 these packages installed:
69 gcc make autoconf automake pkg-config zlib1g-dev
71 For the plugins, you will at least need:
80 if [ "$1" = "--install" ]
82 NETDATA_PREFIX="${2}/netdata"
84 elif [ "$1" = "--zlib-is-really-here" ]
88 elif [ "$1" = "--dont-start-it" ]
92 elif [ "$1" = "--dont-wait" ]
96 elif [ "$1" = "--help" -o "$1" = "-h" ]
103 echo >&2 "I cannot understand option '$1'."
112 Nice to see you are giving it a try!
114 You are about to build and install netdata to your system.
116 It will be installed at these locations:
118 - the daemon at ${NETDATA_PREFIX}/usr/sbin/netdata
119 - config files at ${NETDATA_PREFIX}/etc/netdata
120 - web files at ${NETDATA_PREFIX}/usr/share/netdata
121 - plugins at ${NETDATA_PREFIX}/usr/libexec/netdata
122 - cache files at ${NETDATA_PREFIX}/var/cache/netdata
123 - log files at ${NETDATA_PREFIX}/var/log/netdata
124 - pid file at ${NETDATA_PREFIX}/var/run
126 This installer allows you to change the installation path.
127 Press Control-C and run the same command with --help for help.
131 if [ "${UID}" -ne 0 ]
133 if [ -z "${NETDATA_PREFIX}" ]
135 cat <<NONROOTNOPREFIX
137 Sorry! This will fail!
139 You are attempting to install netdata as non-root, but you plan to install it
142 Please set an installation prefix, like this:
144 $0 ${@} --install /tmp
146 or, run the installer as root:
150 We suggest to install it as root, or certain data collectors will not be able
151 to work. Netdata drops root privileges when running. So, if you plan to keep
152 it, install it as root to get the full functionality.
161 You are about to install netdata as a non-root user.
162 Netdata will work, but a few data collection modules that
163 require root access will fail.
165 If you installing permanently on your system, run the
175 if [ "$(type autoreconf 2> /dev/null)" ]
183 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
184 eval $maj=\$1 $min=\$2
186 autoconf_maj_min AMAJ AMIN
191 elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
195 echo "Found autotools $AMAJ.$AMIN"
198 echo "No autotools found"
201 if [ ! "$have_autotools" ]
205 echo "Will skip autoreconf step"
209 -------------------------------------------------------------------------------
210 autotools 2.60 or later is required
212 Sorry, you do not seem to have autotools 2.60 or later, which is
213 required to build from the git sources of netdata.
215 You can either install a suitable version of autotools and automake
216 or download a netdata package which does not have these dependencies.
218 Source packages where autotools have already been run are available
220 https://firehol.org/download/netdata/
222 The unsigned/master folder tracks the head of the git tree and released
223 packages are also available.
229 if [ ${DONOTWAIT} -eq 0 ]
231 if [ ! -z "${NETDATA_PREFIX}" ]
233 read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
235 read -p "Press ENTER to build and install netdata to your system > "
242 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
244 Sorry! NetData failed to build...
246 You many need to check these:
248 1. The package zlib1g-dev has to be installed.
250 2. You need basic build tools installed, like:
252 gcc make autoconf automake pkg-config
254 Autoconf version 2.60 or higher is required
256 3. If your system cannot find ZLIB, although it is installed
257 run me with the option: --zlib-is-really-here
260 If you still cannot get it to build, ask for help at github:
262 https://github.com/firehol/netdata/issues
272 printf >&2 ":-----------------------------------------------------------------------------\n"
273 printf >&2 "Running command:\n"
275 printf >&2 "%q " "${@}"
282 if [ ${ZLIB_IS_HERE} -eq 1 ]
285 echo >&2 "ok, assuming zlib is really installed."
286 export ZLIB_CFLAGS=" "
287 export ZLIB_LIBS="-lz"
290 trap build_error EXIT
292 if [ "$have_autotools" ]
294 run ./autogen.sh || exit 1
298 --prefix="${NETDATA_PREFIX}/usr" \
299 --sysconfdir="${NETDATA_PREFIX}/etc" \
300 --localstatedir="${NETDATA_PREFIX}/var" \
301 --with-zlib --with-math --with-user=netdata \
302 CFLAGS="${CFLAGS}" || exit 1
304 # remove the build_error hook
307 if [ -f src/netdata ]
309 echo >&2 "Cleaning a possibly old compilation ..."
313 echo >&2 "Compiling netdata ..."
316 # backup user configurations
317 for x in apps_groups.conf charts.d.conf
319 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}" ]
321 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}" "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup"
325 echo >&2 "Installing netdata ..."
326 run make install || exit 1
328 # restore user configurations
329 for x in apps_groups.conf charts.d.conf
331 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" ]
333 cp -p "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" "${NETDATA_PREFIX}/etc/netdata/${x}"
337 NETDATA_ADDED_TO_DOCKER=0
340 getent group netdata > /dev/null
343 echo >&2 "Adding netdata user group ..."
344 run groupadd -r netdata
347 getent passwd netdata > /dev/null
350 echo >&2 "Adding netdata user account ..."
351 run useradd -r -g netdata -c netdata -s /sbin/nologin -d / netdata
354 getent group docker > /dev/null
357 # find the users in the docker group
358 docker=$(getent group docker | cut -d ':' -f 4)
359 if [[ ",${docker}," =~ ,netdata, ]]
361 # netdata is already there
364 # netdata is not in docker group
365 echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
366 run usermod -a -G docker netdata
368 # let the uninstall script know
369 NETDATA_ADDED_TO_DOCKER=1
374 # -----------------------------------------------------------------------------
375 # load options from the configuration file
377 # create an empty config if it does not exist
378 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
380 # function to extract values from the config file
382 local key="${1}" value="${2}" line=
384 if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
386 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
387 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
395 [ ! "${UID}" = "0" ] && defuser="${USER}"
396 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
398 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
399 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
403 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
407 NETDATA_PORT="$( config_option "port" ${defport} )"
410 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
411 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
412 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
413 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
414 NETDATA_BIND="$( config_option "bind socket to IP" "*" )"
415 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
418 # -----------------------------------------------------------------------------
419 # prepare the directories
421 # this is needed if NETDATA_PREFIX is not empty
422 if [ ! -d "${NETDATA_RUN_DIR}" ]
424 mkdir -p "${NETDATA_RUN_DIR}" || exit 1
427 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
428 for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}"
432 echo >&2 "Creating directory '${x}'"
433 run mkdir -p "${x}" || exit 1
438 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
440 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}..."
442 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
446 run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
451 # fix apps.plugin to be setuid to root
452 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
453 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
456 # -----------------------------------------------------------------------------
457 # check if we can re-start netdata
459 if [ ${DONOTSTART} -eq 1 ]
461 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
463 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
464 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
466 if [ "${UID}" -eq 0 ]
468 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
470 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
472 echo >&2 "OK. It is now installed and ready."
476 # -----------------------------------------------------------------------------
477 # stop a running netdata
480 [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
481 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
486 printf >&2 "Stopping a (possibly) running netdata..."
493 echo >&2 "Cannot stop the running netdata."
499 pid=$(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null)
500 # backwards compatibility
501 [ -z "${pid}" ] && pid=$(cat /var/run/netdata.pid 2>/dev/null)
502 [ -z "${pid}" ] && pid=$(cat /var/run/netdata/netdata.pid 2>/dev/null)
504 isnetdata $pid || pid=
507 run kill $pid 2>/dev/null
510 run killall netdata 2>/dev/null
514 test $ret -eq 0 && printf >&2 "." && sleep 2
520 # -----------------------------------------------------------------------------
523 echo >&2 "Starting netdata..."
524 run ${NETDATA_PREFIX}/usr/sbin/netdata -pidfile ${NETDATA_RUN_DIR}/netdata.pid "${@}"
529 echo >&2 "SORRY! FAILED TO START NETDATA!"
532 echo >&2 "OK. NetData Started!"
536 # -----------------------------------------------------------------------------
537 # save a config file, if it is not already there
539 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
541 echo >&2 "Downloading default configuration from netdata..."
544 # remove a possibly obsolete download
545 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
547 # disable a proxy to get data from the local netdata
552 wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
556 if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
558 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
562 if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
564 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
565 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
567 if [ "${UID}" -eq 0 ]
569 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
571 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
573 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
574 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
578 # -----------------------------------------------------------------------------
581 ksm_is_available_but_disabled() {
584 -------------------------------------------------------------------------------
585 Memory de-duplication instructions
587 I see you have kernel memory de-duper (called Kernel Same-page Merging,
588 or KSM) available, but it is not currently enabled.
592 echo 1 >/sys/kernel/mm/ksm/run
593 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
595 If you enable it, you will save 40-60% of netdata memory.
600 ksm_is_not_available() {
603 -------------------------------------------------------------------------------
604 Memory de-duplication not present in your kernel
606 It seems you do not have kernel memory de-duper (called Kernel Same-page
607 Merging, or KSM) available.
609 To enable it, you need a kernel built with CONFIG_KSM=y
611 If you can have it, you will save 40-60% of netdata memory.
616 if [ -f "/sys/kernel/mm/ksm/run" ]
618 if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
620 ksm_is_available_but_disabled
626 # -----------------------------------------------------------------------------
627 # Check for version.txt
629 if [ ! -s web/version.txt ]
633 -------------------------------------------------------------------------------
634 Version update check warning
636 The way you downloaded netdata, we cannot find its version. This means the
637 Update check on the dashboard, will not work.
639 If you want to have version update check, please re-install it
640 following the procedure in:
642 https://github.com/firehol/netdata/wiki/Installation
647 # -----------------------------------------------------------------------------
648 # apps.plugin warning
650 if [ "${UID}" -ne 0 ]
654 -------------------------------------------------------------------------------
655 apps.plugin needs privileges
657 Since you have installed netdata as a normal user, to have apps.plugin collect
658 all the needed data, you have to give it the access rights it needs, by running
661 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
662 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
664 The commands allow apps.plugin to run as root.
666 apps.plugin is performing a hard-coded function of data collection for all
667 running processes. It cannot be instructed from the netdata daemon to perform
668 any task, so it is pretty safe to do this.
673 # -----------------------------------------------------------------------------
674 # Keep un-install info
676 cat >netdata-uninstaller.sh <<UNINSTALL
679 # this script will uninstall netdata
681 if [ "\$1" != "--force" ]
683 echo >&2 "This script will REMOVE netdata from your system."
684 echo >&2 "Run it again with --force to do it."
688 echo >&2 "Stopping a possibly running netdata..."
693 if [ ! -z "\$1" -a -d "\$1" ]
696 echo "Deleting directory '\$1' ..."
701 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
703 # installation prefix was given
705 deletedir "${NETDATA_PREFIX}"
708 # installation prefix was NOT given
710 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
712 echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
713 rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
716 deletedir "${NETDATA_PREFIX}/etc/netdata"
717 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
718 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
719 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
720 deletedir "${NETDATA_PREFIX}/var/log/netdata"
723 getent passwd netdata > /dev/null
727 echo "You may also want to remove the user netdata"
729 echo " userdel netdata"
732 getent group netdata > /dev/null
736 echo "You may also want to remove the group netdata"
738 echo " groupdel netdata"
741 getent group docker > /dev/null
742 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
745 echo "You may also want to remove the netdata user from the docker group"
747 echo " gpasswd -d netdata docker"
751 chmod 750 netdata-uninstaller.sh
753 # -----------------------------------------------------------------------------
755 if [ "${NETDATA_BIND}" = "*" ]
759 access="${NETDATA_BIND}"
765 -------------------------------------------------------------------------------
767 OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}).
769 -------------------------------------------------------------------------------
772 Hit http://${access}:${NETDATA_PORT}/ from your browser.
774 To stop netdata, just kill it, with:
778 To start it, just run it:
780 ${NETDATA_PREFIX}/usr/sbin/netdata
785 Give netdata a Github Star, at:
787 https://github.com/firehol/netdata/wiki
791 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"