Now that we’ve setup a Zabbix server and configured some hosts, we need to get notified when there are issues with our hosts. The easiest way to be notified is probably via email (This is my go-to notification option since it is so widely supported).
Configuring the email service is pretty straightforward:
In the Zabbix WebUI navigate to: Administration > Media Types > Email (HTML)
Update the outgoing SMTP settings to match those of your email provider (i.e. Gmail)
Be sure to setup and use an App Password if you have two-factor enabled for your email account.
Click Test to make sure the settings work.
Enable Email Notifications for User
In order for emails to be sent, you need to enable them for your Zabbix user:
In the Zabbix WebUI navigate to: User Settings > Media > Add
In the Type box choose ‘Email (HTML)‘
Add the email address to which you would like to send notifications.
Choose Which Notifications to Receive
Now that we have the email service configured and the user set to receive emails, we need to tell Zabbix which types of emails to send (what severity, which hosts, or which triggers). In general I like to be notified of any triggers that have a severity of Average or above:
In the Zabbix WebUI navigate to: Configuration > Actions > Report problems to Zabbix administrators
Under Conditions click Add
Choose Type:Trigger severity and choose what severity you would like to be notified for (I choose ‘is greater than or equals’ a severity of ‘Average‘
Check the Enabled box.
Now sit back and wait for the notifications to roll in – or instead of waiting, go make some breaking changes to your Hosts! (Just make sure you can roll back your changes easily with something like Proxmox backups/snapshots!)
If you’re not sure what Zabbix is or how to set it up, see my first Zabbix blog post. Once we have a running instance of the Zabbix server we can begin adding hosts that we would like to monitor. Adding a host consists of two primary steps: Configure the Client & Configure the Host (Server).
Configuring a Host
In order for Zabbix to get information from a client machine (Zabbix calls them Hosts) we need to configure some kind of protocol for Zabbix to use when fetching information. Some of the most popular protocols Zabbix uses are:
IPMI <- Good for enterprise gear (HP iLO, DELL DRAC, IBM RSA, Sun SSP, etc)
Below are a few host configurations for some of the above ‘protocols’.
Host Configuration: Zabbix Agent
In order to use the Zabbix agent, we can simply install the agent like any other package:
# Install the agent on Ubuntu/Debian
apt-get install zabbix-agent
# Configure agent with Zabbix server address
# Update `Server=` to the ip/hostname of your Zabbix server
# Start the Zabbix Agent
service zabbix-agent start
Host Configuration: SNMP
Configuring the host with SNMP will be different for each machine, but usually there is some kind of simple GUI that allows you to enable SNMP, and provide a community string (a sort of authentication). Here’s an example that used the term ‘Trap’ to represent the SNMP configuration:
Host Configuration: IPMI
The IPMI configuration also may be different for each machine, but it is generally pretty easy to enable:
Configuring a Host on the Server (Zabbix)
Once we have the hosts configured with at least once source ‘protocol’ we can add them to Zabbix. This is also pretty straightforward:
In the Zabbix WebUI navigate to: Configuration > Hosts > Add Hostand provide a hostname, a group and interface(s). Once finished, click Add. Note: you can also use a hostname in the DNS name field instead of an ip address.
Note: If configuring IPMI, you’ll need to provide the host credentials on the IPMI tab.
Also, be sure to add at least one Template to the host. Templates help Zabbix categorize the data it fetches from the hosts – templates can be used on many machines to standardize the data that is fetched from the hosts.
You can search for existing templates in the Link new templates field and add any relevant templates you think may be useful.
When searching for templates I usually search for the protocol (Agent/SNMP/IPMI/etc)
Monitor your Hosts
Now that we have some hosts added we can monitor them and view any problems or issues that may need to be addressed:
By clicking on the links we can view the Latest Data any Problems or even some nice Graphs for each Host:
There are some pretty slick options for getting notifications when problems happen, reporting, network maps, and more, but we’ll have to save those goodies for a future blog post. For now, get to work adding your hosts!
~ Thought of the Day: Why is it normal in the US for a waiter to take your credit card out of your sight when processing payments? To me this is like having your email password in plain text of the footer of your email!
With a quickly growing HomeLab that contains many servers/services/devices I am starting to see the importance of being able to monitor all these ‘things’ from a central location. My understanding is that the goal of Zabbix is to do exactly this. So lets give it a go!
Initially i figured I would just install Zabbix in Docker like I do for most other services, but i quickly realized that the docker-compose would get messy pretty quick (see here for a sample). After looking over the install options on the Zabbix site, i realized that they offer a virtual appliance that can be run on most hypervisors (I run proxmox which supports the qcow2 KVM disk format). Here’s my steps for installing the virtual appliance in Proxmox (additional installation details can be found on the Zabbix appliance documentation):
Create a Proxmox Virtual Machine
When creating the VM, you can use all the default options, just give it a name and remove the HardDisk after the VM is created (we will add the Zabbix appliance disk later).
Download the Appliance
# From the proxmox shell run the following to download the appliance
# Note: Right click the Zabbix appliance download link to get the latest version
Unzip the Appliance
tar -xvzf zabbix_appliance-5.2.5-qcow2.tar.gz
Import the Appliance Disk to the Virtual Machine
# Note: Change the vm id, the appliance version and the storage type below
# (you may need to use 'local' if you are not using 'zfs')
qm importdisk 105 zabbix_appliance-5.2.5.qcow2 zfs
# Cleanup unneeded files
rm -rf zabbix_appliance-5.2.5-qcow2
Update VM Options
At this point you’ll want to make sure your VM is set to boot from the imported disk and to start on boot.
Assign Static IP Address (Optional)
Note: At this point it may be helpful to assign a DHCP Static mapping so your VM will receive a static IP address from your Router. This is how I did it in OPNSense:
Now that we’ve got the VM setup, go ahead and start it up! The default login credentials were: User: root Pass: zabbix Note: The default front-end web interface default login is shown in the console below: User: Admin Pass: zabbix
Log Into the Web Interface
In your browser navigate to the IP address of your Zabbix VM:
Congratulations. You have have a running Zabbix Instance! Don’t forget to finish configuring and securing your instance. A few items I addressed immediately were:
Changing Web login credentials: WebUI > User Settings > Change Password
For fun: change to the dark theme: WebUI > User Settings > Theme
Now that you’re setup, what are you waiting for, get started monitoring all the things! We won’t cover how to setup monitoring in this post, we’ll save that for a future post which delves deeper into the benefits and use-cases of Zabbix. Enjoy!
I’ve been happily using pfSense for a few years now and have generally been quite happy with it’s performance and feature set, however I learned recently that the installation files that can be downloaded from the pfSense website is not the same code that is open sourced on Github. I try to stay away from the arguments about which software is ‘more’ open source friendly, but I do like to support the projects that are committed to a FOSS (Free and Open Source) model without up-selling additional features. I don’t have anything against up-selling additional features, but IMO up-selling additional features can lead to a neglected core product.
pfSense – Thank You
I am not leaving pfSense because I didn’t like the project, but because I wanted to try something new that is more committed to an Open Source future. pfSense is a great solution for any networking enthusiast, and I would not hesitate to recommend it. However, as you will see below, I would first recommend OPNsense for a few main reasons…
Full-featured email notifications (pfSense had some email notifications but they were severely limited)
I’ve always wondered about OPNsense and if it could offer some of the things I often wanted in pfSense but could not easily achieve, and so far I have been very pleasantly pleased with the installation & configuration.
Installation was straightforward (although I installed it in a Proxmox VM):
Finish the rest of the configuration in the OPNsense web GUI (Default user/password: root/opnsense)
Migrating from pfSense
The most daunting task that I was dreading was figuring out how to migrate to OPNsense from pfSense with minimal downtime. I had heard of a slight possibility that certain sections of pfSense configuration backups could be imported into OPNsense, but I decided to avoid that route in order to start with as clean of an OPNsense installation as possible. My migration path was:
Step through each menu in pfSense and update the corresponding setting in OPNsense
Some configuration items didn’t exist like the awesome pfBlocker (I will miss this)
When I came to the ‘Interfaces’ section, I setup each interface with a different (temporary) static IP
After all configuration items were finished, I began to shut down services on pfSense and enable them on OPNSense one at a time (i.e., disable dhcp on LAN, and enable LAN DHCP on OPNSense with same lease range)
Finally I disabled the interfaces on pfSense and re-configured the static IP addresses on the OPNSense interfaces to match how they were configured in pfSense.
The Features I’ve Always Wanted!
Full-featured Email Notifications, Reporting, Settings Search, Home Assistant Integration…
Zoneminder is a Free Open Source Software (FOSS) Network Video Recorder (NVR). It is claims to be one of the most advanced and scalable video surveillance systems available. It provides an API that can be used via a web interface, a mobile app, or third party software. Out of the box Zoneminder offers a simple camera viewer, motion detection, event notifications, and much more. Since a picture is worth a thousand words, here’s what a ‘montage’ view on Zoneminder looks like (via the iOS app and the web view).
The Mobile App (ZmNinja) is also open source. It can be compiled or purchased on the AppStore for around $6. It offers a very elegant and full-featured interface to mange cameras, view events, and receive push notifications to mention a few.
This screenshot of the web view shows a list of connected cameras, their configurations, and events. A ‘montage’ camera stream view similar to the iOS view is also available.
Why use Zoneminder?
It’s Open Source! If you’ve read any of my other posts, I’m a huge proponent of Free & Open Source Software (FOSS). Open Source means the software can be trusted to not include nasty key loggers and other privacy invasive features (I’ll admit I rarely verify this myself).
It’s Free! Since Zoneminder is free (and always will be) it is worth trying!)
It’s feature rich! It lacks very little (if any) features that commercial NVR systems offer.
It’s relatively easy to install (See below for installation/configuration details)
It’s locally controlled! (No cloud needed – or wanted!
It has an optional Open Source mobile App (Approx. $6 if you buy it on the AppStore)
It’s hardware efficient (IMO – It seems to require less resources than alternatives).
If the above reasons aren’t enough to convince you to give Zoneminder a try, I can tell you from experience that I’ve tried most of the other alternatives to Zoneminder (MotionEye, BlueIris, AgentDVR) and have found Zoneminder to be superior in most respects (although a bit more advanced to setup – see below). I don’t mean to be critical, but below I will list my main complaints about the alternatives I’ve listed. If I’ve forgotten about other good alternatives, pleas let me know in the comments!
Seemed to be quite resource hungry
No mobile app (although web interface is quite reasonable)
Did not seem very scalable (more than 4 cameras seemed to be buggy for me)
Currently Windows Only as of 2021
Not Free ($65 as of 2021)
Not Open Source
Subscription required for advanced features and updated via web GUI
Requires a web account for some features
Requires webRTC (a technology I’m not a huge fan of)
No mobile App (although webGUI is quite reasonable)
I’ll admit that Zoneminder can seem daunting to setup for someone not very tech-savvy, and may not be the best choice for someone with no knowledge of linux or command line experience. For most people that are reading this they probably already have enough tech knowledge or are willing to learn how to setup Zoneminder. There are a variety of ways to setup Zoneminder, but since I already use Docker, it was definitely the easiest path for me and the one I will outline below:
Install Docker Engine
If you don’t already have the docker engine installed, you’ll need to install it via the terminal or via a Docker Desktop application. Once installed you will have access to the docker terminal command.
Although docker-compose isn’t technically required, it does make running docker containers much more manageable and repeatable (if the physical computer you have docker on crashes). Follow the official documentation to install docker-compose.
Create your docker-compose file.
Create a directory somewhere called docker-compose (mine is located at ~/docker-compose). Inside that directory create a file named docker-compose.yaml and in a text editor modify the file to look like the following (If you want to access Zoneminder on a port other than 80, modify the first ’80’ in the ports section, otherwise, leave it as is).
That’s about it, now we should be able to run Zoneminder! A few optional notes before we try it:
The configuration above will automatically start Zoneminder whenever the host machine (your computer, or the Proxmox Virtual Machine in my case – stay tuned for some Proxmox tutorials!) is started.
The configuration above can also be modified to also run a ZoneminderEventNotification, object detection server, and more. Basically you just need to change the 0’s to 1’s (note if you do this it could take hours on the first start of Zoneminder since it will need to compile dependencies).
To start Zoneminder we just need to tell docker to run our docker-compose file which will run any containers defined in it (currently only Zoneminder). To run the docker-compose file simply run:
# Remember this command - you'll need it to restart your docker containers
# if they don't start up automatically for some reason
docker-compose up -d
# If you get a permissions error, you may need to run the command as sudo
sudo docker-compose up -d
Give it a few minutes to configure itself and then try to navigate to http://<your-computer-ip-address>/zm/ or http://localhost/zm/ and you should see Zoneminder!
If you don’t see the Zoneminder web interface, give it some more time because it could still be starting up (it takes a while on the first start). For additional troubleshooting you can also visit the Zoneminder Forums.
Zoneminder System Configuration
I’ll leave all the advanced options up to you, but some Zoneminder options should probably be changed right away by clicking on the Options menu:
I would recommend adding authentication under Options > System > OPT_USE_AUTH
If using authentication, add some random text to Options > System > AUTH_HASH_SECRET
If you want to use Zoneminder with Home Assistant, make sure Options > System > OPT_USE_API is enabled (see below for Home Assistant configuration)
To add a camera, simply click on +Add in the Console view. You will be prompted with a camera configuration – don’t be overwhelmed with the options, you only need to change a few:
Name : the name of your camera
ffmpeg if you have access to an RTSP stream for your camera
Remote if you only have an ip address for your camera and no RTSP stream
If using ffmpeg, enter your RTSP stream in Source Path
If using Remote, enter your camera’s ip address in Host Name and choose the camera’s port and/or path of the camera image files
Choose your camera’s resolution
After saving the camera configuration you should see the camera on the Console view with a green indicator icon. If the indicator is red, you may need to play with the camera configuration some more or consult the Zoneminder documentation for more details about your type of camera.
Home Assistant Integration
If you haven’t heard of Home Assistant, read my post about it here. If you know about Home Assistant you’ll want the integration which is almost too easy to install. Simply navigate to Configuration > Integrations > + and search for Zoneminder. If you don’t find Zoneminder, you may need to set it up via configuration.yaml since the config-flow setup was removed after a bug was found. To set up the integration manually, add the following to your configuration.yaml:
# Be sure to add zoneminder_url, zoneminder_username, and zoneminder_password
# to your secrets.yaml file!
- host: !secret zoneminder_url
username: !secret zoneminder_username
password: !secret zoneminder_password
- platform: zoneminder
First off, I’d like to spend a minute appreciating the craftsmanship and the premium nature of the squeezebox line of products. Almost a decade before the current ‘smart’ speakers that are common today (Echo, HomePod, GoogleHome, etc), the Squeezebox sported much of the same functionality:
Premium Quality Sound
Remote Control (via a handheld remote & web interface)
Streaming radio, podcasts, music, etc
Apps for extensible functionality
Web Interface for local and remote access (most modern speakers don’t offer local control)
Local API for extensibility (I don’t know of any modern speakers that offer this!)
A community of users for great support (still exists today!)
An Orphaned Squeezebox
Recently at my workplace we upgraded the office speaker and had an orphaned Squeezebox Boom. We were ready to recycle the 12 year old speaker, but it still seemed to have so much potential. The speaker hardware worked flawlessly (although the online services have been neglected by Logitech). Naturally, since I knew the Squeezebox had a local API, my instinct was to check if Home Assistant had any support for such a device, and sure enough it has a Logitech Squeezebox integration! After browsing the integration documentation I figured it would be worth an effort to give the Squeezebox a new life.
Prerequisite for Integration: Logitech Media Server
The Home Assistant documentation indicated that I would need to have a Logitech Media Server in order to control the Squeezebox – A slight inconvenience, but a quick search on DockerHub revealed some pre-built docker containers that can provide me with a self-hosted alternative to the Internet reliant interface that Logitech could shut down at any time. Setting up the docker container was as simple as adding the following to my docker-compose file and running: docker-compose up -d. Stay tuned for future posts about Docker & docker-compose. They are great tools for quickly setting up various services!
Everyone likes home automation – if it works! We’ve all been excited about that smart switch or wireless light that we can control from anywhere in the world, but how great is it really? For a few ‘smart’ devices it may seem work well, but once you begin to accumulate more than a handful of devices you will quickly begin to realize that you have as many apps as you do smart devices and you will begin to start asking questions like:
Which app controls which device?
Do I have to download all these apps for each member of my family?
Wouldn’t it be nice if I could control all my smart devices with a single app?
Why can’t I connect my smart devices together?
All of these questions can be answered with a tool called Home Assistant. In the most basic of terms, Home Assistant is a tool that pulls all of your smart devices into a single app. I will save the details of Home Assistant future posts, but it aims to do the following and much more:
Improve your privacy by reducing the need for internet based cloud services
Control all the smart devices in your home from a central location
Connect smart devices in your home in order to trigger perform actions like: When there is motion in the hallway, turn on the light
Provide a single app (web or mobile) to control and manage all your smart devices
Home Assistant may not be the ‘silver bullet’ for every situation, but I am willing to say that it is unequivocally the best home automation solution available today (as of 2020). Anyone interested in taking the next step in home automation should consider Home Assistant. Stay tuned and in the near future we will be discussing how to get started using this great tool, and why it is (in my opinion) superior, but friendly with other alternatives like Hubitat, SmartThings, and HomeKit.
(Full disclosure: I was not paid or in any way incentivized to speak so highly of Home Assistant)
A day after my first blog post and I am already a sensation! Well, to the Parbrize family at least. Although I’d love to agree with the generous comments, it takes less than common sense to realize the comments are spam. Within a day I received 13 comments on my fist blog post – all of them obviously spam.
… And because I wasn’t sure what my next blog post would be, I will explain how we can prevent spam like this in the future.
After a bit of research I found a useful article on Namecheap that breaks down WordPress spam into 3 main categories:
SpamBots (automated comments that may or may not contain links)
Trackbacks/PingBacks (comments that contain links for the sole purpose of improving the Google rank of another site)
Manual (comments manually created that have no relevance to the blog post)
Although the easiest way to avoid comment spam is to disable comments, I’ll investigate some other options first:
Use a plugin like Akismet to auto-block spam comments.
I may try this in the future, but I prefer built in options to reduce my reliance on third parties and the number of ‘things’ to update.
Manually block spam by using built-in WordPress features under: Settings > Discussion
For now i will opt for the second option, if I find that it’s too labor intensive to keep up with all the spam, I may try the Plug-In at a later point. Now for the manual configuration:
Added Parbrize IP addresses to the ‘Disallow’ list:
I’ve also ensured that the following is checked so only approved commenters are displayed.
We’ll see how that works for now, but it may be necessary to add a Re-Captcha to the comment form to prevent and endless flow of spam from other IP addresses.
Until next time, try googling your name or email address!
Welcome to my first blog post! It won’t be impressive, so don’t get your hopes up. I don’t currently have a structured plan for this blog yet, but I need to start somewhere, so basically I will explain how you are able to read this post – note the terms in italics – these may be topics of future blog posts:
You entered or clicked on a link with the URL of homegrowntechie.com
Your device made a DNS query to find out that homegrowntechie.com is located at a specific IP Address
Hopefully you are not using Google DNS or your ISP’s DNS – more on this in a future post
The DNS request returns my Public IP address because I’ve used a Dynamic DNS service to update my Domain Registrar with the public IP address your machine needs to access this website.
Your machine requested this page by sending a GET request, but before you were able to read anything on this page your request was Routed through your home router (or cell tower) to your ISP’s network, and on through the Internet before finally reaching my router,
After reaching my router, my router forwarded your GET request to a Self-HostedNGINX Reverse Proxy which then forwarded your traffic to my Self-Hosted WebServer
My WebServer is running WordPress which then responded to your GET request with this webpage.
The few steps above are a simplified version of what actually happened, but a good opportunity to throw out some terms (Italicized) that may be topics of future blog posts.
Thought of the day: “Why am I still using Gmail when I care about my own privacy?“