Deploying a Prometheus and node exporter monitoring stack gives a Linux host its first host-metric scrape path without adding Grafana or Alertmanager. Node exporter serves CPU, memory, filesystem, network, and kernel metrics on port 9100, and Prometheus stores those samples so they can be queried from the local monitoring server.

Ubuntu and Debian packages provide managed prometheus and prometheus-node-exporter services. The package-managed layout keeps both daemons under systemd and uses /etc/prometheus/prometheus.yml as the active configuration file.

A single-host layout is enough for a first monitoring baseline or lab stack. Keep 9100 reachable only from Prometheus or a trusted monitoring network, then confirm success by querying up{job=“node”} and a node_ metric from Prometheus.

Steps to deploy a Prometheus and node exporter monitoring stack:

  1. Open a terminal with sudo privileges.
  2. Refresh the package index.
    $ sudo apt update
  3. Install Prometheus and node exporter.
    $ sudo apt install prometheus prometheus-node-exporter

    Ubuntu and Debian package node exporter as prometheus-node-exporter, with a service unit named prometheus-node-exporter.service.

  4. Enable and start both services.
    $ sudo systemctl enable --now prometheus prometheus-node-exporter
  5. Check the Prometheus readiness endpoint.
    $ curl --silent --show-error http://127.0.0.1:9090/-/ready
    Prometheus Server is Ready.
  6. Check the local node exporter metrics endpoint.
    $ curl --silent --show-error http://127.0.0.1:9100/metrics
    # HELP node_load1 1m load average.
    # TYPE node_load1 gauge
    node_load1 1.45
    # HELP node_load15 15m load average.
    # TYPE node_load15 gauge
    node_load15 1.04
    node_uname_info{domainname="(none)",machine="x86_64",nodename="linux-host",release="6.12.76",sysname="Linux",version="#1 SMP Wed May 13 14:27:36 UTC 2026"} 1
    ##### snipped #####

    A local response with node_ metrics confirms node exporter is ready for a Prometheus scrape job. Use the monitored host name or IP address instead of 127.0.0.1 when node exporter runs on another server.

  7. Open the active Prometheus configuration file.
    $ sudo vi /etc/prometheus/prometheus.yml

    Use the path from the running --config.file flag when Prometheus was installed outside the distro package layout.

  8. Add the node exporter scrape job under scrape_configs.
    scrape_configs:
      - job_name: prometheus
        static_configs:
          - targets:
              - 127.0.0.1:9090
    
      - job_name: node
        static_configs:
          - targets:
              - 127.0.0.1:9100

    Keep existing scrape jobs in place. Write targets as host and port only, without http:// or https:// prefixes.
    Related: How to add a Prometheus scrape config
    Related: How to configure Prometheus to scrape node exporter
    Tool: Prometheus Scrape Config Generator

  9. Check the updated configuration with promtool.
    $ promtool check config /etc/prometheus/prometheus.yml
    Checking /etc/prometheus/prometheus.yml
     SUCCESS: /etc/prometheus/prometheus.yml is valid prometheus config file syntax
  10. Reload Prometheus with systemd.
    $ sudo systemctl reload prometheus

    The package service reloads by sending SIGHUP. Use the lifecycle endpoint only when Prometheus was started with --web.enable-lifecycle.
    Related: How to reload Prometheus configuration
    Related: How to manage the Prometheus service with systemctl

  11. Check the node exporter target state from Prometheus.
    $ promtool query instant http://127.0.0.1:9090 'up{job="node"}'
    up{instance="127.0.0.1:9100", job="node"} => 1 @[1781952016.36]

    Value 1 means the latest scrape succeeded. Value 0 means the job exists, but the latest scrape failed.

  12. Query a host metric from the new stack.
    $ promtool query instant http://127.0.0.1:9090 'node_uname_info{job="node"}'
    node_uname_info{domainname="(none)", instance="127.0.0.1:9100", job="node", machine="x86_64", nodename="linux-host", release="6.12.76", sysname="Linux", version="#1 SMP Wed May 13 14:27:36 UTC 2026"} => 1 @[1781952016.374]

    A returned node_ metric proves Prometheus is not only listing the target, but also storing host metrics from node exporter.
    Related: How to run a PromQL query in Prometheus