Skip to main content

Install Nagios Core with Docker Compose

Using 3rd party image:

tag during my setup: tag 4.5.7

Prerequisites​

1. OS​

Mine for this doc:

hostnamectl
# Virtualization: kvm
# Operating System: Ubuntu 24.04.2 LTS
# Kernel: Linux 6.8.0-60-generic
# Architecture: x86-64
# Hardware Model: Compute Instance

Update system and change hostname​

sudo apt update && sudo apt upgrade -y
sudo hostnamectl set-hostname edith
sudo vi /etc/hosts

# confirm
hostnamectl

Add user​

sudo adduser aris
sudo usermod -aG sudo aris

sudo mkdir -p /home/aris/.ssh
sudo vi /home/aris/.ssh/authorized_keys

sudo chown -R aris:aris /home/aris/.ssh
sudo chmod 700 /home/aris/.ssh
sudo chmod 600 /home/aris/.ssh/authorized_keys

Check sshd config​

sudo vi /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
sudo service ssh restart
sudo systemctl status ssh

Update UFW default​

sudo ufw allow OpenSSH
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
sudo ufw status

2. Docker​

👉 https://docs.docker.com/engine/install/

sudo apt update && sudo apt upgrade -y

Set up Docker's apt repository

sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Install the Docker packages​

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

permissions to user, skip sudo​

sudo usermod -aG docker aris

# (Log out and back in, or run `newgrp docker` to apply immediately)

check​

docker run --rm hello-world
docker compose version

3. Nginx​

Install nginx​

sudo apt install -y nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx

Update UFW for Nginx​

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

Initial Nagios​

Define docker compose​

cd ~
mkdir nagios
cd nagios
vi docker-compose.yml
docker-compose.yml
services:
nagios:
image: jasonrivers/nagios:latest
container_name: nagios
restart: unless-stopped
ports:
- "8080:80"
volumes:
- nagios-etc:/opt/nagios/etc
- nagios-var:/opt/nagios/var
- nagios-plugins:/opt/nagios/libexec

volumes:
nagios-etc:
nagios-var:
nagios-plugins:
note

not exposing volumes to host directory for now, too much trouble with the permissions using jasonrivers/nagios.

Launch container​

docker compose up -d

check status and log

docker ps --filter "name=nagios"
docker logs nagios | tail -n 20

Auth and Access Control​

Will configure inside the container

docker compose exec nagios bash

Add/update user pw​

Once jumped into the container, add/update user with:

htpasswd /opt/nagios/etc/htpasswd.users newuser

Delete unwanted user in /opt/nagios/etc/htpasswd.users

Contacts and Contact Groups​

Define contacts and groupes​

/opt/nagios/etc/objects/contacts.cfg
define contact {

contact_name newuser ; Short name of user
use generic-contact ; Inherit default values from generic-contact template (defined above)
alias Name_newuser Admin ; Full name of user
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
email newuser@example.com ;
}

define contactgroup {

contactgroup_name admins
alias Nagios Administrators
members newuser
}

Update permissions​

for d in \
authorized_for_system_information \
authorized_for_configuration_information \
authorized_for_system_commands \
authorized_for_all_hosts \
authorized_for_all_services; do
sed -i "s/^${d}=.*/${d}=nagiosadmin,newuser/" /opt/nagios/etc/cgi.cfg
done

Restart Nagios to apply permissions​

Always verify before apply changes

nagios -v /opt/nagios/etc/nagios.cfg

On the host, restart nagios container

docker compose restart nagios

Add Nginx server for Nagios​

/etc/nginx/sites-available/nagios.conf:

server {
listen 80;
listen [::]:80;
server_name change.domain.name;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name change.domain.name;

ssl_certificate /etc/ssl/file.to.cert.pem;
ssl_certificate_key /etc/ssl/file.to.cert.key;

# Currently using auth_basic in the container
# auth_basic "Nagios Login";
# auth_basic_user_file /etc/nginx/.htpasswd;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

Enable site​

sudo ln -s /etc/nginx/sites-available/nagios.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Defining Monitoring​

Hosts​

Create host config file

/opt/nagios/etc/objects/host1.cfg
##
## Host and basic services for Host 1
##

define host {
use linux-server
host_name hostname1 ; ← replace
alias Host 1 ; ← replace
address 10.0.0.10 ; ← replace
max_check_attempts 5
check_interval 5
retry_interval 1
}

define service {
use generic-service
host_name hostname1
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}

define service {
use generic-service
host_name hostname1
service_description SSH
check_command check_ssh
}

Services​

Example of defining websites on host1.

Create config file:

/opt/nagios/etc/objects/host1-websites.cfg
##
## HTTPS checks for all your websites on host1
##

define service {
use generic-service
host_name hostname1
service_description website1
check_command check_http!-H website1.your.domain -u / -S -p 443
}

define service {
use generic-service
host_name hostname1
service_description website2
check_command check_http!-H website2.your.domain -u / -S -p 443
}

#####
# for service in subdirectory
#####
define service {
use generic-service
host_name hostname1
service_description service desc
check_command check_http!-H website1.your.domain -u /dirname/ -S --sni -p 443
contact_groups admins # to define particular groups
}

Apply configs​

Add configs to Nagios​

Add newly created config files host1.cfg and host1-websites.cfg to nagios.cfg

/opt/nagios/etc/nagios.cfg
# Definitions for monitoring
cfg_file=/opt/nagios/etc/objects/localhost.cfg
cfg_file=/opt/nagios/etc/objects/host1.cfg
cfg_file=/opt/nagios/etc/objects/host1-websites.cfg

Verify the and restart Nagios​

nagios -v /opt/nagios/etc/nagios.cfg
docker compose restart nagios